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);
}
Ejemplo n.º 3
0
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();
}
Ejemplo n.º 4
0
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;
}