/* compile.c */
/* This file contains the functions to compile CI-C into an easily
interpreted form */
#include "config.h"
#include "object.h"
#include "instr.h"
#include "construct.h"
#include "file.h"
#include "token.h"
#include "globals.h"
unsigned int parse_code(char *filename, struct object *caller_obj,
struct code **result)
{
struct code *the_code;
sym_tab_t glob_sym;
unsigned int line_num;
filptr file_info;
char *buf;
c_err_msg=NULL;
buf=(char *) MALLOC(strlen(filename)+3);
strcpy(buf,filename);
strcat(buf,".c");
if (!(file_info.curr_file=open_file(buf,"r",NULL))) {
FREE(buf);
return (unsigned int) -1;
}
FREE(buf);
ungetc('\n',file_info.curr_file);
file_info.previous=NULL;
file_info.is_put_back=0;
file_info.expanded=NULL;
file_info.curr_code=(struct code *) MALLOC(sizeof(struct code));
file_info.curr_code->num_refs=0;
file_info.curr_code->num_globals=0;
file_info.curr_code->func_list=NULL;
file_info.curr_code->gst=NULL;
file_info.depth=0;
glob_sym.num=0;
glob_sym.varlist=NULL;
file_info.glob_sym=&glob_sym;
file_info.phys_line=0;
file_info.defs=NULL;
line_num=top_level_parse(&file_info);
close_file(file_info.curr_file);
file_info.curr_code->gst=glob_sym.varlist;
file_info.curr_code->num_globals=glob_sym.num;
free_file_stack(&file_info);
free_define(&file_info);
if (line_num) {
free_code(file_info.curr_code);
return line_num;
} else {
*result=file_info.curr_code;
return 0;
}
}