X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=ftepp.c;h=84c17199e104bb840496829d461e8a6ca1089853;hb=37ccf1976968c83c47ee0dfd958a453913cf1b1e;hp=449dcd51e0b0c3ea3540d9f6f9c2dda713caa4e2;hpb=41cb923c0c2aaebd535751900af4b8be75808aae;p=xonotic%2Fgmqcc.git diff --git a/ftepp.c b/ftepp.c index 449dcd5..84c1719 100644 --- a/ftepp.c +++ b/ftepp.c @@ -1,6 +1,7 @@ /* * Copyright (C) 2012 * Wolfgang Bumiller + * Dale Weiler * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in @@ -55,7 +56,6 @@ typedef struct { typedef struct { lex_file *lex; int token; - bool newline; unsigned int errors; bool output_on; @@ -1214,8 +1214,13 @@ static bool ftepp_hash(ftepp_t *ftepp) break; } else { - ftepp_error(ftepp, "unrecognized preprocessor directive: `%s`", ftepp_tokval(ftepp)); - return false; + if (ftepp->output_on) { + ftepp_error(ftepp, "unrecognized preprocessor directive: `%s`", ftepp_tokval(ftepp)); + return false; + } else { + ftepp_next(ftepp); + break; + } } /* break; never reached */ default: @@ -1254,11 +1259,7 @@ static bool ftepp_preprocess(ftepp_t *ftepp) if (ftepp->token >= TOKEN_EOF) break; #if 0 - ftepp->newline = newline; - newline = false; -#else - /* For the sake of FTE compatibility... FU, really */ - ftepp->newline = newline = true; + newline = true; #endif switch (ftepp->token) { @@ -1278,7 +1279,7 @@ static bool ftepp_preprocess(ftepp_t *ftepp) ftepp->token = TOKEN_ERROR; break; case '#': - if (!ftepp->newline) { + if (!newline) { ftepp_out(ftepp, ftepp_tokval(ftepp), false); ftepp_next(ftepp); break; @@ -1298,7 +1299,13 @@ static bool ftepp_preprocess(ftepp_t *ftepp) ftepp_out(ftepp, "\n", true); ftepp_next(ftepp); break; + case TOKEN_WHITE: + /* same as default but don't set newline=false */ + ftepp_out(ftepp, ftepp_tokval(ftepp), false); + ftepp_next(ftepp); + break; default: + newline = false; ftepp_out(ftepp, ftepp_tokval(ftepp), false); ftepp_next(ftepp); break; @@ -1309,8 +1316,7 @@ static bool ftepp_preprocess(ftepp_t *ftepp) vec_push(ftepp->output_string, 0); vec_shrinkby(ftepp->output_string, 1); - newline = ftepp->token == TOKEN_EOF; - return newline; + return (ftepp->token == TOKEN_EOF); } /* Like in parser.c - files keep the previous state so we have one global @@ -1362,19 +1368,48 @@ bool ftepp_preprocess_string(const char *name, const char *str) bool ftepp_init() { + char minor[32]; + char major[32]; + char *verminor = NULL; + char *vermajor = NULL; + ftepp = ftepp_new(); if (!ftepp) return false; + memset(minor, 0, sizeof(minor)); + memset(major, 0, sizeof(major)); + /* set the right macro based on the selected standard */ ftepp_add_define(NULL, "GMQCC"); - if (opts_standard == COMPILER_FTEQCC) + if (opts_standard == COMPILER_FTEQCC) { ftepp_add_define(NULL, "__STD_FTEQCC__"); - else if (opts_standard == COMPILER_GMQCC) + /* 1.00 */ + major[0] = '1'; + minor[0] = '0'; + } else if (opts_standard == COMPILER_GMQCC) { ftepp_add_define(NULL, "__STD_GMQCC__"); - else if (opts_standard == COMPILER_QCC) + sprintf(major, "%d", GMQCC_VERSION_MAJOR); + sprintf(minor, "%d", GMQCC_VERSION_MINOR); + } else if (opts_standard == COMPILER_QCC) { ftepp_add_define(NULL, "__STD_QCC__"); + /* 1.0 */ + major[0] = '1'; + minor[0] = '0'; + } + + vec_upload(verminor, "#define __STD_VERSION_MINOR__ \"", 31); + vec_upload(vermajor, "#define __STD_VERSION_MAJOR__ \"", 31); + vec_upload(verminor, minor, strlen(minor)); + vec_upload(vermajor, major, strlen(major)); + vec_push (verminor, '"'); + vec_push (vermajor, '"'); + + ftepp_preprocess_string("__builtin__", verminor); + ftepp_preprocess_string("__builtin__", vermajor); + vec_free(verminor); + vec_free(vermajor); return true; }