#include "libtcc.h" #ifdef HAVE_CONFIG_H # include "config.h" #endif /* HAVE_CONFIG_H */ #include #include #include #include "utils/string.h" #include "cc/cc.h" void tcc_open_bf(TCCState *s1, const char *filename, int initlen) { BufferedFile *bf; int buflen; buflen = initlen ? initlen : IO_BUF_SIZE; bf = tcc_mallocz(sizeof(BufferedFile) + buflen); bf->buf_ptr = bf->buffer; bf->buf_end = bf->buffer + initlen; bf->buf_end[0] = CH_EOB; /* put eob symbol */ pstrcpy(bf->filename, sizeof(bf->filename), filename); bf->true_filename = bf->filename; bf->line_num = 1; bf->ifdef_stack_ptr = s1->ifdef_stack_ptr; bf->fd = -1; bf->prev = file; bf->prev_tok_flags = tok_flags; file = bf; tok_flags = TOK_FLAG_BOL | TOK_FLAG_BOF; } void tcc_close(void) { TCCState *s1 = tcc_state; BufferedFile *bf = file; if (bf->fd > 0) { close(bf->fd); total_lines += bf->line_num - 1; } if (bf->true_filename != bf->filename) { tcc_free(bf->true_filename); } file = bf->prev; tok_flags = bf->prev_tok_flags; tcc_free(bf); } ssize_t full_read(int fd, void *buf, size_t count) { char *cbuf; size_t rnum; ssize_t num; cbuf = buf; rnum = 0; while (1) { num = read(fd, cbuf, count-rnum); if (num < 0) { return num; } if (num == 0) { return rnum; } rnum += num; cbuf += num; } } void * load_data(int fd, unsigned long file_offset, unsigned long size) { void *data; data = tcc_malloc(size); lseek(fd, file_offset, SEEK_SET); full_read(fd, data, size); return data; }