object *read_character(FILE *in){ int c; c = getc(in); /* / */ if(c != '\\'){ fprintf(stderr, "Invalid character, expected '\\', got %c\n", c); } c = getc(in); /* <character> */ switch(c){ case EOF: fprintf(stderr, "Incomplete character literal\n"); exit(1); case 's': if(peek(in) == 'p'){ eat_expected_string(in, "pace"); peek_expected_delimiter(in); return make_character(' '); } break; case 'n': if(peek(in) == 'e'){ eat_expected_string(in, "ewline"); peek_expected_delimiter(in); return make_character(' '); } break; } /* make sure the character is followed by a delimiter */ peek_expected_delimiter(in); return make_character(c); }
static scheme_object* read_character(vm* context, FILE* in) { int c = getc(in); switch(c) { case EOF: fprintf(stderr, "incomplete character literal\n"); exit(1); case 's': if(peek(in) == 'p') { eat_expected_string(in, "pace"); peek_expected_delimiter(in); return make_character(context, ' '); } break; case 'n': if(peek(in) == 'e') { eat_expected_string(in, "ewline"); peek_expected_delimiter(in); return make_character(context, '\n'); } break; case 't': if(peek(in) == 'a') { eat_expected_string(in, "ab"); peek_expected_delimiter(in); return make_character(context, '\t'); } break; } peek_expected_delimiter(in); return make_character(context, c); }