comparison debug.c @ 2191:d87a76afbd8a

Add '>', '<', '>=' and '<=' operators to debugger expression engine
author Michael Pavone <pavone@retrodev.com>
date Sat, 20 Aug 2022 12:45:33 -0700
parents 59e0dcc01b2c
children d00fb9c6a6a2
comparison
equal deleted inserted replaced
2190:59e0dcc01b2c 2191:d87a76afbd8a
114 case '|': 114 case '|':
115 case '^': 115 case '^':
116 case '~': 116 case '~':
117 case '=': 117 case '=':
118 case '!': 118 case '!':
119 if (*start == '!' && start[1] == '=') { 119 case '>':
120 case '<':
121 if ((*start == '!' || *start == '>' || *start == '<') && start[1] == '=') {
120 *end = start + 2; 122 *end = start + 2;
121 return (token) { 123 return (token) {
122 .type = TOKEN_OPER, 124 .type = TOKEN_OPER,
123 .v = { 125 .v = {
124 .op = {*start, start[1], 0} 126 .op = {*start, start[1], 0}
175 case '|': 177 case '|':
176 case '^': 178 case '^':
177 case '~': 179 case '~':
178 case '=': 180 case '=':
179 case '!': 181 case '!':
182 case '>':
183 case '<':
180 case '.': 184 case '.':
181 done = 1; 185 done = 1;
182 break; 186 break;
183 } 187 }
184 if (done) { 188 if (done) {
321 case '-': 325 case '-':
322 bin->right = parse_scalar_or_muldiv(after_first, end); 326 bin->right = parse_scalar_or_muldiv(after_first, end);
323 return maybe_binary(bin, *end, end); 327 return maybe_binary(bin, *end, end);
324 case '=': 328 case '=':
325 case '!': 329 case '!':
330 case '>':
331 case '<':
326 bin->right = parse_expression(after_first, end); 332 bin->right = parse_expression(after_first, end);
327 return bin; 333 return bin;
328 default: 334 default:
329 bin->left = NULL; 335 bin->left = NULL;
330 free(bin); 336 free(bin);
445 return maybe_muldiv(bin, *end, end); 451 return maybe_muldiv(bin, *end, end);
446 case '+': 452 case '+':
447 case '-': 453 case '-':
448 case '=': 454 case '=':
449 case '!': 455 case '!':
456 case '>':
457 case '<':
450 ret = bin->left; 458 ret = bin->left;
451 bin->left = NULL; 459 bin->left = NULL;
452 free_expr(bin); 460 free_expr(bin);
453 return ret; 461 return ret;
454 default: 462 default:
570 return NULL; 578 return NULL;
571 } 579 }
572 return maybe_binary(bin, *end, end); 580 return maybe_binary(bin, *end, end);
573 case '=': 581 case '=':
574 case '!': 582 case '!':
583 case '>':
584 case '<':
575 bin->right = parse_expression(after_second, end); 585 bin->right = parse_expression(after_second, end);
576 if (!bin->right) { 586 if (!bin->right) {
577 fprintf(stderr, "Expected expression to the right of %s\n", second.v.op); 587 fprintf(stderr, "Expected expression to the right of %s\n", second.v.op);
578 free_expr(bin); 588 free_expr(bin);
579 return NULL; 589 return NULL;
666 case '=': 676 case '=':
667 *out = *out == right; 677 *out = *out == right;
668 break; 678 break;
669 case '!': 679 case '!':
670 *out = *out != right; 680 *out = *out != right;
681 break;
682 case '>':
683 *out = e->op.v.op[1] ? *out >= right : *out > right;
684 break;
685 case '<':
686 *out = e->op.v.op[1] ? *out <= right : *out < right;
671 break; 687 break;
672 default: 688 default:
673 return 0; 689 return 0;
674 } 690 }
675 return 1; 691 return 1;