static char *slurp_file(const char *dirname, const char *filename, off_t *r_size)
{
char cwd[MAX_CWD_SIZE];
- int fd;
char *buf;
off_t size, progress;
ssize_t result;
- struct stat stats;
+ FILE* file;
if (!filename) {
*r_size = 0;
die("cwd buffer to small");
}
xchdir(dirname);
- fd = open(filename, O_RDONLY);
+ file = fopen(filename, "rb");
xchdir(cwd);
- if (fd < 0) {
+ if (file == NULL) {
die("Cannot open '%s' : %s\n",
filename, strerror(errno));
}
- result = fstat(fd, &stats);
- if (result < 0) {
- die("Cannot stat: %s: %s\n",
- filename, strerror(errno));
- }
- size = stats.st_size;
+ fseek(file, 0, SEEK_END);
+ size = ftell(file);
+ fseek(file, 0, SEEK_SET);
*r_size = size +1;
buf = xmalloc(size +2, filename);
buf[size] = '\n'; /* Make certain the file is newline terminated */
buf[size+1] = '\0'; /* Null terminate the file for good measure */
progress = 0;
while(progress < size) {
- result = read(fd, buf + progress, size - progress);
+ result = fread(buf + progress, 1, size - progress, file);
if (result < 0) {
if ((errno == EINTR) || (errno == EAGAIN))
continue;
}
progress += result;
}
- result = close(fd);
- if (result < 0) {
- die("Close of %s failed: %s\n",
- filename, strerror(errno));
- }
+ fclose(file);
return buf;
}
typedef int32_t int_t;
typedef uint32_t uint_t;
typedef int32_t long_t;
-typedef uint32_t ulong_t;
+#define ulong_t uint32_t
#define SCHAR_T_MIN (-128)
#define SCHAR_T_MAX 127
state->file->report_name, state->file->report_line, col);
}
-static void internal_error(struct compile_state *state, struct triple *ptr,
+static void __attribute__ ((noreturn)) internal_error(struct compile_state *state, struct triple *ptr,
const char *fmt, ...)
{
FILE *fp = state->errout;
-static void error(struct compile_state *state, struct triple *ptr,
+static void __attribute__ ((noreturn)) error(struct compile_state *state, struct triple *ptr,
const char *fmt, ...)
{
FILE *fp = state->errout;
tm = localtime(&now);
register_builtin_macro(state, "__ROMCC__", VERSION_MAJOR);
+ register_builtin_macro(state, "__PRE_RAM__", VERSION_MAJOR);
register_builtin_macro(state, "__ROMCC_MINOR__", VERSION_MINOR);
register_builtin_macro(state, "__FILE__", "\"This should be the filename\"");
register_builtin_macro(state, "__LINE__", "54321");
}
/* Is this an escaped newline? */
if (file->join_lines &&
- (c == '\\') && (pos + size < end) && (pos[1] == '\n'))
+ (c == '\\') && (pos + size < end) && ((pos[1] == '\n') || ((pos[1] == '\r') && (pos[2] == '\n'))))
{
+ int cr_offset = ((pos[1] == '\r') && (pos[2] == '\n'))?1:0;
/* At the start of a line just eat it */
if (pos == file->pos) {
file->line++;
file->report_line++;
- file->line_start = pos + size + 1;
+ file->line_start = pos + size + 1 + cr_offset;
}
- pos += size + 1;
+ pos += size + 1 + cr_offset;
}
/* Do I need to ga any farther? */
else if (index == 0) {
if (getcwd(cwd, sizeof(cwd)) == 0) {
die("cwd buffer to small");
}
- if (subdir[0] == '/') {
+ if ((subdir[0] == '/') || ((subdir[1] == ':') && ((subdir[2] == '/') || (subdir[2] == '\\')))) {
file->dirname = xmalloc(subdir_len + 1, "dirname");
memcpy(file->dirname, subdir, subdir_len);
file->dirname[subdir_len] = '\0';
name = 0;
pp_eat(state, TOK_MINCLUDE);
+ if (if_eat(state)) {
+ /* Find the end of the line */
+ while((tok = raw_peek(state)) != TOK_EOL) {
+ raw_eat(state, tok);
+ }
+ break;
+ }
tok = peek(state);
if (tok == TOK_LIT_STRING) {
struct token *tk;
}
}
memset(block, -1, sizeof(*block));
+#ifndef WIN32
xfree(block);
+#endif
}
static void free_basic_blocks(struct compile_state *state,
fblock = lnode->fblock;
if (state->compiler->debug & DEBUG_SCC_TRANSFORM) {
- fprintf(state->errout, "sedge: %5d (%5d -> %5d)\n",
+ fprintf(state->errout, "sedge: %5ld (%5d -> %5d)\n",
sedge - scc.ssa_edges,
sedge->src->def->id,
sedge->dst->def->id);
long ref;
ref = next_label(state);
fprintf(fp, ".section \"" DATA_SECTION "\"\n");
- fprintf(fp, ".balign %ld\n", align_of_in_bytes(state, ins->type));
+ fprintf(fp, ".balign %ld\n", (long int)align_of_in_bytes(state, ins->type));
fprintf(fp, "L%s%lu:\n", state->compiler->label_prefix, ref);
print_const(state, ins, fp);
fill_bytes = bits_to_bytes(size - size_of(state, ins->type));
if (fill_bytes) {
- fprintf(fp, ".fill %ld, 1, 0\n", fill_bytes);
+ fprintf(fp, ".fill %ld, 1, 0\n", (long int)fill_bytes);
}
fprintf(fp, ".section \"" TEXT_SECTION "\"\n");
return ref;
struct triple *ins, FILE *fp)
{
fprintf(fp, ".section \"" DATA_SECTION "\"\n");
- fprintf(fp, ".balign %ld\n", align_of_in_bytes(state, ins->type));
+ fprintf(fp, ".balign %ld\n", (long int)align_of_in_bytes(state, ins->type));
fprintf(fp, "L%s%lu:\n",
state->compiler->label_prefix, (unsigned long)(ins->u.cval));
print_const(state, MISC(ins, 0), fp);
last_occurance != ins->occurance) {
if (!ins->occurance->parent) {
fprintf(fp, "\t/* %s,%s:%d.%d */\n",
- ins->occurance->function,
- ins->occurance->filename,
+ ins->occurance->function?ins->occurance->function:"(null)",
+ ins->occurance->filename?ins->occurance->filename:"(null)",
ins->occurance->line,
ins->occurance->col);
}