101 |
return atoi(d2)*8*8 + atoi(d1)*8 + atoi(d0); |
return atoi(d2)*8*8 + atoi(d1)*8 + atoi(d0); |
102 |
} |
} |
103 |
|
|
|
int hexToNumber(char hex_digit) { |
|
|
switch (hex_digit) { |
|
|
case '0': return 0; |
|
|
case '1': return 1; |
|
|
case '2': return 2; |
|
|
case '3': return 3; |
|
|
case '4': return 4; |
|
|
case '5': return 5; |
|
|
case '6': return 6; |
|
|
case '7': return 7; |
|
|
case '8': return 8; |
|
|
case '9': return 9; |
|
|
// grammar rule 'digit_hex' already forced lower case |
|
|
case 'a': return 10; |
|
|
case 'b': return 11; |
|
|
case 'c': return 12; |
|
|
case 'd': return 13; |
|
|
case 'e': return 14; |
|
|
case 'f': return 15; |
|
|
default: return 0; |
|
|
} |
|
|
} |
|
|
|
|
|
int hexsToNumber(char hex_digit0, char hex_digit1 = '0') { |
|
|
return hexToNumber(hex_digit1)*16 + hexToNumber(hex_digit0); |
|
|
} |
|
|
|
|
104 |
%} |
%} |
105 |
|
|
106 |
// reentrant parser |
// reentrant parser |
114 |
%type <Char> char char_base digit digit_oct digit_hex escape_seq escape_seq_octal escape_seq_hex |
%type <Char> char char_base digit digit_oct digit_hex escape_seq escape_seq_octal escape_seq_hex |
115 |
%type <Dotnum> dotnum volume_value boolean |
%type <Dotnum> dotnum volume_value boolean |
116 |
%type <Number> number sampler_channel instrument_index fx_send_id audio_channel_index device_index midi_input_channel_index midi_input_port_index midi_map midi_bank midi_prog midi_ctrl |
%type <Number> number sampler_channel instrument_index fx_send_id audio_channel_index device_index midi_input_channel_index midi_input_port_index midi_map midi_bank midi_prog midi_ctrl |
117 |
%type <String> string string_escaped text text_escaped textval_escaped stringval stringval_escaped digits param_val_list param_val query_val filename db_path map_name entry_name fx_send_name engine_name command add_instruction create_instruction destroy_instruction get_instruction list_instruction load_instruction set_chan_instruction load_instr_args load_engine_args audio_output_type_name midi_input_type_name remove_instruction unmap_instruction set_instruction subscribe_event unsubscribe_event map_instruction reset_instruction clear_instruction find_instruction move_instruction copy_instruction scan_mode edit_instruction |
%type <String> string string_escaped text text_escaped text_escaped_base stringval stringval_escaped digits param_val_list param_val query_val filename db_path map_name entry_name fx_send_name engine_name command add_instruction create_instruction destroy_instruction get_instruction list_instruction load_instruction set_chan_instruction load_instr_args load_engine_args audio_output_type_name midi_input_type_name remove_instruction unmap_instruction set_instruction subscribe_event unsubscribe_event map_instruction reset_instruction clear_instruction find_instruction move_instruction copy_instruction scan_mode edit_instruction format_instruction |
118 |
%type <FillResponse> buffer_size_type |
%type <FillResponse> buffer_size_type |
119 |
%type <KeyValList> key_val_list query_val_list |
%type <KeyValList> key_val_list query_val_list |
120 |
%type <LoadMode> instr_load_mode |
%type <LoadMode> instr_load_mode |
171 |
| MOVE SP move_instruction { $$ = $3; } |
| MOVE SP move_instruction { $$ = $3; } |
172 |
| COPY SP copy_instruction { $$ = $3; } |
| COPY SP copy_instruction { $$ = $3; } |
173 |
| EDIT SP edit_instruction { $$ = $3; } |
| EDIT SP edit_instruction { $$ = $3; } |
174 |
|
| FORMAT SP format_instruction { $$ = $3; } |
175 |
| RESET { $$ = LSCPSERVER->ResetSampler(); } |
| RESET { $$ = LSCPSERVER->ResetSampler(); } |
176 |
| QUIT { LSCPSERVER->AnswerClient("Bye!\r\n"); return LSCP_QUIT; } |
| QUIT { LSCPSERVER->AnswerClient("Bye!\r\n"); return LSCP_QUIT; } |
177 |
; |
; |
371 |
| MIDI_INSTRUMENT_MAP SP sampler_channel SP DEFAULT { $$ = LSCPSERVER->SetChannelMap($3, -2); } |
| MIDI_INSTRUMENT_MAP SP sampler_channel SP DEFAULT { $$ = LSCPSERVER->SetChannelMap($3, -2); } |
372 |
; |
; |
373 |
|
|
374 |
edit_instruction : INSTRUMENT SP sampler_channel { $$ = LSCPSERVER->EditSamplerChannelInstrument($3); } |
edit_instruction : CHANNEL SP INSTRUMENT SP sampler_channel { $$ = LSCPSERVER->EditSamplerChannelInstrument($5); } |
375 |
|
; |
376 |
|
|
377 |
|
format_instruction : INSTRUMENTS_DB { $$ = LSCPSERVER->FormatInstrumentsDb(); } |
378 |
; |
; |
379 |
|
|
380 |
modal_arg : /* epsilon (empty argument) */ { $$ = true; } |
modal_arg : /* epsilon (empty argument) */ { $$ = true; } |
470 |
db_path : path { $$ = $1.toDbPath(); } |
db_path : path { $$ = $1.toDbPath(); } |
471 |
; |
; |
472 |
|
|
473 |
map_name : stringval |
map_name : stringval_escaped |
474 |
; |
; |
475 |
|
|
476 |
entry_name : stringval |
entry_name : stringval_escaped |
477 |
; |
; |
478 |
|
|
479 |
fx_send_name : stringval |
fx_send_name : stringval_escaped |
480 |
; |
; |
481 |
|
|
482 |
param_val_list : param_val |
param_val_list : param_val |
483 |
| param_val_list','param_val { $$ = $1 + "," + $3; } |
| param_val_list','param_val { $$ = $1 + "," + $3; } |
484 |
; |
; |
485 |
|
|
486 |
param_val : string |
//TODO: the re-encapsulation into apostrophes for string and strinval here is a hack, since we need a way for __parse_strings() (DeviceParameters.cpp) to distinguish a comma separated list of strings and a string which contains commas. A clean solution would be to move those parser jobs over here to lscp.y |
487 |
| stringval |
param_val : string { $$ = "\'" + $1 + "\'"; } |
488 |
|
| stringval { $$ = "\'" + $1 + "\'"; } |
489 |
| number { std::stringstream ss; ss << "\'" << $1 << "\'"; $$ = ss.str(); } |
| number { std::stringstream ss; ss << "\'" << $1 << "\'"; $$ = ss.str(); } |
490 |
| dotnum { std::stringstream ss; ss << "\'" << $1 << "\'"; $$ = ss.str(); } |
| dotnum { std::stringstream ss; ss << "\'" << $1 << "\'"; $$ = ss.str(); } |
491 |
; |
; |
494 |
| query_val_list SP string '=' query_val { $$ = $1; $$[$3] = $5; } |
| query_val_list SP string '=' query_val { $$ = $1; $$[$3] = $5; } |
495 |
; |
; |
496 |
|
|
497 |
query_val : textval_escaped |
query_val : text_escaped |
498 |
| stringval_escaped |
| stringval_escaped |
499 |
; |
; |
500 |
|
|
512 |
| string { $$ = -1; } |
| string { $$ = -1; } |
513 |
; |
; |
514 |
|
|
515 |
dotnum : digits '.' digits { $$ = atof(String($1 + "." + $3).c_str()); } |
dotnum : digits '.' digits { std::stringstream ss($1 + "." + $3); ss.imbue(std::locale::classic()); ss >> $$; } |
516 |
| '+' digits '.' digits { String s = "+"; s += $2; s += "."; s += $4; $$ = atof(s.c_str()); } |
| '+' digits '.' digits { std::stringstream ss($2 + "." + $4); ss.imbue(std::locale::classic()); ss >> $$; } |
517 |
| '-' digits '.' digits { $$ = atof(String("-" + $2 + "." + $4).c_str()); } |
| '-' digits '.' digits { std::stringstream ss("-" + $2 + "." + $4); ss.imbue(std::locale::classic()); ss >> $$; } |
518 |
; |
; |
519 |
|
|
520 |
|
|
584 |
| '\"' path_base '\"' { $$ = $2; } |
| '\"' path_base '\"' { $$ = $2; } |
585 |
; |
; |
586 |
|
|
587 |
path_base : '/' { $$ = Path(); } |
path_base : '/' { $$ = Path(); } |
588 |
| path_base '/' { $$ = $1; } |
| path_base '/' { $$ = $1; } |
589 |
| path_base text_escaped { Path p; p.appendNode($2); $$ = $1 + p; } |
| path_base text_escaped_base { Path p; p.appendNode($2); $$ = $1 + p; } |
590 |
; |
; |
591 |
|
|
592 |
stringval : '\'' text '\'' { $$ = $2; } |
stringval : '\'' text '\'' { $$ = $2; } |
593 |
| '\"' text '\"' { $$ = $2; } |
| '\"' text '\"' { $$ = $2; } |
594 |
; |
; |
595 |
|
|
596 |
stringval_escaped : '\'' textval_escaped '\'' { $$ = $2; } |
stringval_escaped : '\'' text_escaped '\'' { $$ = $2; } |
597 |
| '\"' textval_escaped '\"' { $$ = $2; } |
| '\"' text_escaped '\"' { $$ = $2; } |
598 |
; |
; |
599 |
|
|
600 |
text : SP { $$ = " "; } |
text : SP { $$ = " "; } |
603 |
| text string { $$ = $1 + $2; } |
| text string { $$ = $1 + $2; } |
604 |
; |
; |
605 |
|
|
606 |
text_escaped : SP { $$ = " "; } |
// like text_escaped, but missing the slash ('/') character |
607 |
|
text_escaped_base : SP { $$ = " "; } |
608 |
| string_escaped |
| string_escaped |
609 |
| text_escaped SP { $$ = $1 + " "; } |
| text_escaped_base SP { $$ = $1 + " "; } |
610 |
| text_escaped string_escaped { $$ = $1 + $2; } |
| text_escaped_base string_escaped { $$ = $1 + $2; } |
611 |
; |
; |
612 |
|
|
613 |
textval_escaped : '/' { $$ = "/"; } |
text_escaped : '/' { $$ = "/"; } |
614 |
| text_escaped |
| text_escaped_base |
615 |
| textval_escaped '/' { $$ = $1 + "/"; } |
| text_escaped '/' { $$ = $1 + "/"; } |
616 |
| textval_escaped text_escaped { $$ = $1 + $2; } |
| text_escaped text_escaped_base { $$ = $1 + $2; } |
617 |
; |
; |
618 |
|
|
619 |
string : char { std::string s; s = $1; $$ = s; } |
string : char { std::string s; s = $1; $$ = s; } |
928 |
DB_INSTRUMENTS_JOB : 'D''B''_''I''N''S''T''R''U''M''E''N''T''S''_''J''O''B' |
DB_INSTRUMENTS_JOB : 'D''B''_''I''N''S''T''R''U''M''E''N''T''S''_''J''O''B' |
929 |
; |
; |
930 |
|
|
931 |
|
INSTRUMENTS_DB : 'I''N''S''T''R''U''M''E''N''T''S''_''D''B' |
932 |
|
; |
933 |
|
|
934 |
DESCRIPTION : 'D''E''S''C''R''I''P''T''I''O''N' |
DESCRIPTION : 'D''E''S''C''R''I''P''T''I''O''N' |
935 |
; |
; |
936 |
|
|
970 |
EDIT : 'E''D''I''T' |
EDIT : 'E''D''I''T' |
971 |
; |
; |
972 |
|
|
973 |
|
FORMAT : 'F''O''R''M''A''T' |
974 |
|
; |
975 |
|
|
976 |
RESET : 'R''E''S''E''T' |
RESET : 'R''E''S''E''T' |
977 |
; |
; |
978 |
|
|