]> git.xonotic.org Git - xonotic/gmqcc.git/commitdiff
Merge branch 'master' into cooking
authorDale Weiler <killfieldengine@gmail.com>
Mon, 17 Jun 2013 20:14:26 +0000 (20:14 +0000)
committerDale Weiler <killfieldengine@gmail.com>
Mon, 17 Jun 2013 20:14:26 +0000 (20:14 +0000)
Conflicts:
opts.def

main.c
opts.def
parser.c

diff --git a/main.c b/main.c
index 37638e92ae4fb8b0202116f596d48e3d1d27e127..98de0e9176b4e9924e07757b536b41a6bee2446b 100644 (file)
--- a/main.c
+++ b/main.c
@@ -176,6 +176,7 @@ static bool options_parse(int argc, char **argv) {
                     opts_set(opts.werror, WARN_INVALID_PARAMETER_COUNT, true);
                     opts_set(opts.werror, WARN_MISSING_RETURN_VALUES,   true);
                     opts_set(opts.flags,  EXPRESSIONS_FOR_BUILTINS,     true);
+                    opts_set(opts.warn,   WARN_BREAKDEF,                true);
 
 
                     OPTS_OPTION_U32(OPTION_STANDARD) = COMPILER_GMQCC;
@@ -196,6 +197,7 @@ static bool options_parse(int argc, char **argv) {
                     opts_set(opts.flags, ASSIGN_FUNCTION_TYPES,    true);
                     opts_set(opts.flags, CORRECT_TERNARY,          false);
                     opts_set(opts.warn, WARN_TERNARY_PRECEDENCE,   true);
+                    opts_set(opts.warn, WARN_BREAKDEF,             true);
 
                     OPTS_OPTION_U32(OPTION_STANDARD) = COMPILER_FTEQCC;
 
@@ -662,9 +664,10 @@ int main(int argc, char **argv) {
     }
 
     if (!vec_size(items)) {
-        FILE *src;
-        char *line;
+        FILE  *src;
+        char  *line    = NULL;
         size_t linelen = 0;
+        bool   hasline = false;
 
         progs_src = true;
 
@@ -675,28 +678,23 @@ int main(int argc, char **argv) {
             goto cleanup;
         }
 
-        line = NULL;
-        if (!progs_nextline(&line, &linelen, src) || !line[0]) {
-            con_err("illformatted progs.src file: expected output filename in first line\n");
-            retval = 1;
-            goto srcdone;
-        }
-
-        if (!opts_output_wasset) {
-            OPTS_OPTION_STR(OPTION_OUTPUT) = util_strdup(line);
-            opts_output_free = true;
-        }
-
         while (progs_nextline(&line, &linelen, src)) {
             argitem item;
+
             if (!line[0] || (line[0] == '/' && line[1] == '/'))
                 continue;
-            item.filename = util_strdup(line);
-            item.type     = TYPE_QC;
-            vec_push(items, item);
+                
+            if (hasline) {
+                item.filename = util_strdup(line);
+                item.type     = TYPE_QC;
+                vec_push(items, item);
+            } else if (!opts_output_wasset) {
+                OPTS_OPTION_STR(OPTION_OUTPUT) = util_strdup(line);
+                opts_output_free               = true;
+                hasline                        = true;
+            }
         }
 
-srcdone:
         fs_file_close(src);
         mem_d(line);
     }
index 4e1aa18883075a73eaf631b58b942ebbce266c5a..61226ae3719a52d7bbc2dbe3d2890b86322f26bb 100644 (file)
--- a/opts.def
+++ b/opts.def
@@ -91,6 +91,7 @@
     GMQCC_DEFINE_FLAG(DEPRECATED)
     GMQCC_DEFINE_FLAG(PARENTHESIS)
     GMQCC_DEFINE_FLAG(UNSAFE_TYPES)
+    GMQCC_DEFINE_FLAG(BREAKDEF)
 #endif
 
 #ifdef GMQCC_TYPE_OPTIMIZATIONS
index 71242ac79a81850d57209a2f7234323e478d390f..38ec85e37b46ee5f8531d63c271e10e7946b3b93 100644 (file)
--- a/parser.c
+++ b/parser.c
@@ -5887,8 +5887,16 @@ skipvar:
 
         if (parser->tok != '{' || var->expression.vtype != TYPE_FUNCTION) {
             if (parser->tok != '=') {
-                parseerror(parser, "missing semicolon or initializer, got: `%s`", parser_tokval(parser));
-                break;
+                if (!strcmp(parser_tokval(parser), "break")) {
+                    if (!parser_next(parser)) {
+                        parseerror(parser, "error parsing break definition");
+                        break;
+                    }
+                    (void)!!parsewarning(parser, WARN_BREAKDEF, "break definition ignored (suggest removing it)");
+                } else {
+                    parseerror(parser, "missing semicolon or initializer, got: `%s`", parser_tokval(parser));
+                    break;
+                }
             }
 
             if (!parser_next(parser)) {