Thanks for the diffs. I'll try to process them this week starting with the
more simple ones,
-Otto
On Sun, Nov 26, 2017 at 07:23:24PM +0000, kshe wrote:
> Hi,
>
> The jump table used in dc/bcode.c is technically off by one, which leads
> to the following harmless inconsistency:
>
> $ printf '\376' | dc
> dc: \xfe (0376) is unimplemented
>
> $ printf '\377' | dc
> dc: internal error: opcode 255
>
> This could be fixed by making it hold 256 entries instead of 255;
> however, since all commands are ASCII characters, it actually could
> instead be reduced to 128 entries, with a small adjustment of the
> relevant check in the eval() function.
>
> Index: bcode.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/dc/bcode.c,v
> retrieving revision 1.51
> diff -u -p -r1.51 bcode.c
> --- bcode.c 26 Feb 2017 11:29:55 -0000 1.51
> +++ bcode.c 17 Nov 2017 02:38:12 -0000
> @@ -137,7 +133,7 @@ struct jump_entry {
> opcode_function f;
> };
>
> -static opcode_function jump_table[UCHAR_MAX];
> +static opcode_function jump_table[128];
>
> static const struct jump_entry jump_table_data[] = {
> { ' ', nop },
> @@ -238,7 +234,7 @@ init_bmachine(bool extended_registers)
> if (bmachine.reg == NULL)
> err(1, NULL);
>
> - for (i = 0; i < UCHAR_MAX; i++)
> + for (i = 0; i < 128; i++)
> jump_table[i] = unknown;
> for (i = 0; i < JUMP_TABLE_DATA_SIZE; i++)
> jump_table[jump_table_data[i].ch] = jump_table_data[i].f;
> @@ -1746,10 +1716,10 @@ eval(void)
> (void)fprintf(stderr, "%zd =>\n", bmachine.readsp);
> #endif
>
> - if (0 <= ch && ch < UCHAR_MAX)
> + if (0 <= ch && ch < 128)
> (*jump_table[ch])();
> else
> - warnx("internal error: opcode %d", ch);
> + unknown();
>
> #ifdef DEBUGGING
> stack_print(stderr, &bmachine.stack, "* ",
>
> Regards,
>
> kshe