char * get_number() { if (!isdigit(g_current_char)) { char unexpected_token[2]; unexpected_token[0] = g_current_char; unexpected_token[1] = '\0'; unexpected_token_received("0-9", unexpected_token); } else { char * rtn = (char *) calloc(MAX_NUMBER_SIZE, sizeof(char)); int i = 0; while(isdigit(g_current_char)) { rtn[i++] = g_current_char; read_char(); if (i == MAX_NUMBER_SIZE && isalnum(g_current_char)) { printf("Number %s was too large, must be no longer than %d digits", rtn, MAX_NUMBER_SIZE - 1); abort_compile("Compilation aborted"); } } skip_white_space(); return rtn; } }
void unexpected_token_received(const char * expected_token, const char * unexpected_token) { //this can buffer overflow, but yeah, not caring at this point.... char msg[1024]; strcpy(msg, expected_token); strcat(msg, " was expected but "); strcat(msg, unexpected_token); strcat(msg, " was given"); abort_compile(msg); }
void abort_compile(status_t err, const char *format, ...) { va_list ap; rdef_err = err; rdef_err_line = yylineno; strcpy(rdef_err_file, lexfile); va_start(ap, format); vsprintf(rdef_err_msg, format, ap); va_end(ap); abort_compile(); }
void * alloc_mem(size_t size) { void *ptr = malloc(size); // can be 0 if (ptr == NULL) abort_compile(B_NO_MEMORY, "out of memory"); #ifdef DEBUG mem_t mem; mem.ptr = ptr; mem.file = strdup(lexfile); mem.line = yylineno; mem_list.push_front(mem); #else mem_list.push_front(ptr); #endif return ptr; }