Mercurial > repos > blastem
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; |