static void parse_sym(char **pscan) { char rbuf[50]; char *rbufp = rbuf; *rbufp++ = **pscan; ++*pscan; while (!is_delimiter(**pscan) && **pscan != '\0'){ *rbufp++ = **pscan; if (!is_subsequent(**pscan)){ printf("Error: %s is a illegal symbol. -- READ\n", rbuf); do_input_error(pscan); } ++*pscan; } *rbufp = '\0'; reg = make_symbol(rbuf); current_state = stack_pop(&state_stack); if (current_state == STATE_QUOTE){ reg = cons(reg, NIL); reg = cons(make_symbol("quote"), reg); current_state = stack_pop(&state_stack); } stack_push(&parser_stack, reg); }
/* this doesn't read the peculiar identifiers, they are scanned in the * main reader body */ static object read_identifier(FILE *in) { object o; int str_len = 0; int str_size = STRING_MIN_BUFFER; char *buffer; int c; buffer = xmalloc(str_size); c = tolower(fgetc(in)); assert(is_initial(c)); buffer[str_len++] = c; while (1) { c = fgetc(in); if (is_delimiter(c)) { ungetc(c, in); break; } if (!is_subsequent(c)) error("Symbol has bad name -- read", nil); /* we're a lower case scheme */ buffer[str_len++] = tolower(c); } o = make_symbol(buffer, str_len); xfree(buffer); return o; }