diff --git a/sh.c b/sh.c index c384c2c..ea7f312 100644 --- a/sh.c +++ b/sh.c @@ -10,58 +10,42 @@ int get_type_by_name(struct context* ctx, const char* name); +static void print_string(struct context* ctx, const struct elem string) { + int i; + const struct ink_array* name = ink_get_value(ctx, string); + for (i = 0; i < name->top; ++i) { + const struct elem a = name->elements[i]; + if(a.value <= 0x7F) { + ctx->putchar(ctx, a.value); + } else if(a.value <= 0x7FF) { + ctx->putchar(ctx, ((a.value & 0xFC0) >> 6) | 192); + ctx->putchar(ctx, (a.value & 0x3F) | 128); + } else if(a.value <= 0xFFFF) { + ctx->putchar(ctx, ((a.value & 0x3F000) >> 12) | 224); + ctx->putchar(ctx, ((a.value & 0xFC0) >> 6) | 128); + ctx->putchar(ctx, (a.value & 0x3F) | 128); + } else if(a.value <= 0x10FFFF) { + ctx->putchar(ctx, ((a.value & 0x3C0000) >> 18) | 240); + ctx->putchar(ctx, ((a.value & 0x3F000) >> 12) | 128); + ctx->putchar(ctx, ((a.value & 0xFC0) >> 6) | 128); + ctx->putchar(ctx, (a.value & 0x3F) | 128); + } else { + ctx->panic = -9472; + return; + } + } +} + static void list_words(struct context* ctx) { struct native_fn* nit; struct fn* dit; int i; for(nit = ctx->native_words; nit != ctx->native_words + ctx->native_words_top; ++nit) { - const struct ink_array* name = ink_get_value(ctx, nit->name); - for (i = 0; i < name->top; ++i) { - const struct elem a = name->elements[i]; - if(a.value <= 0x7F) { - ctx->putchar(ctx, a.value); - } else if(a.value <= 0x7FF) { - ctx->putchar(ctx, ((a.value & 0xFC0) >> 6) | 192); - ctx->putchar(ctx, (a.value & 0x3F) | 128); - } else if(a.value <= 0xFFFF) { - ctx->putchar(ctx, ((a.value & 0x3F000) >> 12) | 224); - ctx->putchar(ctx, ((a.value & 0xFC0) >> 6) | 128); - ctx->putchar(ctx, (a.value & 0x3F) | 128); - } else if(a.value <= 0x10FFFF) { - ctx->putchar(ctx, ((a.value & 0x3C0000) >> 18) | 240); - ctx->putchar(ctx, ((a.value & 0x3F000) >> 12) | 128); - ctx->putchar(ctx, ((a.value & 0xFC0) >> 6) | 128); - ctx->putchar(ctx, (a.value & 0x3F) | 128); - } else { - ctx->panic = -9472; - return; - } - } + print_string(ctx, nit->name); ctx->putchar(ctx, '\n'); } for(dit = ctx->words; dit != ctx->words + ctx->words_top; ++dit) { - const struct ink_array* name = ink_get_value(ctx, dit->name); - for (i = 0; i < name->top; ++i) { - const struct elem a = name->elements[i]; - if(a.value <= 0x7F) { - ctx->putchar(ctx, a.value); - } else if(a.value <= 0x7FF) { - ctx->putchar(ctx, ((a.value & 0xFC0) >> 6) | 192); - ctx->putchar(ctx, (a.value & 0x3F) | 128); - } else if(a.value <= 0xFFFF) { - ctx->putchar(ctx, ((a.value & 0x3F000) >> 12) | 224); - ctx->putchar(ctx, ((a.value & 0xFC0) >> 6) | 128); - ctx->putchar(ctx, (a.value & 0x3F) | 128); - } else if(a.value <= 0x10FFFF) { - ctx->putchar(ctx, ((a.value & 0x3C0000) >> 18) | 240); - ctx->putchar(ctx, ((a.value & 0x3F000) >> 12) | 128); - ctx->putchar(ctx, ((a.value & 0xFC0) >> 6) | 128); - ctx->putchar(ctx, (a.value & 0x3F) | 128); - } else { - ctx->panic = -9472; - return; - } - } + print_string(ctx, dit->name); ctx->putchar(ctx, '\n'); } } @@ -232,9 +216,7 @@ int main(int argc, char** argv) { } if(print_as_string) { - for (ary_it = ary->elements; ary_it != ary->elements + ary->top; ++ary_it) { - fputc(ary_it->value, stdout); - } + print_string(ctx, rt->stack[rt->top - 1]); fputc('\n', stdout); } else { fputc('[', stdout);