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 format_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 |
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 |
|
|
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; } |