-/*
- * Copyright (C) 2012, 2013, 2014
- * 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
- * the Software without restriction, including without limitation the rights to
- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
- * of the Software, and to permit persons to whom the Software is furnished to do
- * so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
#include <string.h>
#include <math.h>
return false;
}
out = (ast_expression*)ast_array_index_new(ctx, exprs[0], exprs[1]);
- if (rotate_entfield_array_index_nodes(&out))
- {
-#if 0
- /* This is not broken in fteqcc anymore */
- if (OPTS_OPTION_U32(OPTION_STANDARD) != COMPILER_GMQCC) {
- /* this error doesn't need to make us bail out */
- (void)!parsewarning(parser, WARN_EXTENSIONS,
- "accessing array-field members of an entity without parenthesis\n"
- " -> this is an extension from -std=gmqcc");
- }
-#endif
- }
+ rotate_entfield_array_index_nodes(&out);
break;
case opid1(','):
if (!var) {
- char *correct = NULL;
- size_t i;
-
/*
* sometimes people use preprocessing predefs without enabling them
* i've done this thousands of times already myself. Lets check for
return false;
}
- /*
- * TODO: determine the best score for the identifier: be it
- * a variable, a field.
- *
- * We should also consider adding correction tables for
- * other things as well.
- */
- if (OPTS_OPTION_BOOL(OPTION_CORRECTION) && strlen(parser_tokval(parser)) <= 16) {
- correction_t corr;
- correct_init(&corr);
-
- for (i = 0; i < vec_size(parser->correct_variables); i++) {
- correct = correct_str(&corr, parser->correct_variables[i], parser_tokval(parser));
- if (strcmp(correct, parser_tokval(parser))) {
- break;
- } else {
- mem_d(correct);
- correct = NULL;
- }
- }
- correct_free(&corr);
-
- if (correct) {
- parseerror(parser, "unexpected identifier: %s (did you mean %s?)", parser_tokval(parser), correct);
- mem_d(correct);
- return false;
- }
- }
parseerror(parser, "unexpected identifier: %s", parser_tokval(parser));
return false;
}
else if (!wantop) {
if (!parse_sya_operand(parser, &sy, with_labels))
goto onerr;
-#if 0
- if (vec_size(sy.paren) && vec_last(sy.ops).isparen && vec_last(sy.paren) == PAREN_FUNC)
- vec_last(sy.argc)++;
-#endif
wantop = true;
}
else {
vec_push(parser->typedefs, util_htnew(TYPEDEF_HT_SIZE));
vec_push(parser->_blocktypedefs, vec_size(parser->_typedefs));
vec_push(parser->_block_ctx, parser_ctx(parser));
-
- /* corrector */
- vec_push(parser->correct_variables, correct_trie_new());
- vec_push(parser->correct_variables_score, NULL);
}
static bool parser_leaveblock(parser_t *parser)
}
util_htdel(vec_last(parser->variables));
- correct_del(vec_last(parser->correct_variables), vec_last(parser->correct_variables_score));
vec_pop(parser->variables);
- vec_pop(parser->correct_variables);
- vec_pop(parser->correct_variables_score);
if (!vec_size(parser->_blocklocals)) {
parseerror(parser, "internal error: parser_leaveblock with no block (2)");
return false;
{
vec_push(parser->_locals, e);
util_htset(vec_last(parser->variables), name, (void*)e);
-
- /* corrector */
- correct_add (
- vec_last(parser->correct_variables),
- &vec_last(parser->correct_variables_score),
- name
- );
}
static void parser_addglobal(parser_t *parser, const char *name, ast_expression *e)
{
vec_push(parser->globals, e);
util_htset(parser->htglobals, name, e);
-
- /* corrector */
- correct_add (
- parser->correct_variables[0],
- &parser->correct_variables_score[0],
- name
- );
}
static ast_expression* process_condition(parser_t *parser, ast_expression *cond, bool *_ifnot)
typevar = parser_find_typedef(parser, parser_tokval(parser), 0);
if (typevar || parser->tok == TOKEN_TYPENAME) {
-#if 0
- if (OPTS_OPTION_U32(OPTION_STANDARD) != COMPILER_GMQCC) {
- if (parsewarning(parser, WARN_EXTENSIONS,
- "current standard does not allow variable declarations in for-loop initializers"))
- goto onerr;
- }
-#endif
if (!parse_variable(parser, block, true, CV_VAR, typevar, false, false, 0, NULL))
goto onerr;
}
initexpr = parse_expression_leave(parser, false, false, false);
if (!initexpr)
goto onerr;
- }
- /* move on to condition */
- if (parser->tok != ';') {
- parseerror(parser, "expected semicolon after for-loop initializer");
- goto onerr;
- }
- if (!parser_next(parser)) {
- parseerror(parser, "expected for-loop condition");
- goto onerr;
+ /* move on to condition */
+ if (parser->tok != ';') {
+ parseerror(parser, "expected semicolon after for-loop initializer");
+ goto onerr;
+ }
+
+ if (!parser_next(parser)) {
+ parseerror(parser, "expected for-loop condition");
+ goto onerr;
+ }
}
/* parse the condition */
return false;
}
- /*
- * add alias to aliases table and to corrector
- * so corrections can apply for aliases as well.
- */
util_htset(parser->aliases, var->name, find);
- /*
- * add to corrector so corrections can work
- * even for aliases too.
- */
- correct_add (
- vec_last(parser->correct_variables),
- &vec_last(parser->correct_variables_score),
- var->name
- );
-
/* generate aliases for vector components */
if (isvector) {
char *buffer[3];
mem_d(buffer[0]);
mem_d(buffer[1]);
mem_d(buffer[2]);
-
- /*
- * add to corrector so corrections can work
- * even for aliases too.
- */
- correct_add (
- vec_last(parser->correct_variables),
- &vec_last(parser->correct_variables_score),
- me[0]->name
- );
- correct_add (
- vec_last(parser->correct_variables),
- &vec_last(parser->correct_variables_score),
- me[1]->name
- );
- correct_add (
- vec_last(parser->correct_variables),
- &vec_last(parser->correct_variables_score),
- me[2]->name
- );
}
}
}
/* Add it to the local scope */
util_htset(vec_last(parser->variables), var->name, (void*)var);
- /* corrector */
- correct_add (
- vec_last(parser->correct_variables),
- &vec_last(parser->correct_variables_score),
- var->name
- );
-
/* now rename the global */
ln = strlen(var->name);
vec_append(defname, ln, var->name);
for (i = 0; i < 3; ++i) {
util_htset(vec_last(parser->variables), me[i]->name, (void*)(me[i]));
- /* corrector */
- correct_add(
- vec_last(parser->correct_variables),
- &vec_last(parser->correct_variables_score),
- me[i]->name
- );
-
vec_shrinkto(defname, prefix_len);
ln = strlen(me[i]->name);
vec_append(defname, ln, me[i]->name);
parser->aliases = util_htnew(PARSER_HT_SIZE);
- /* corrector */
- vec_push(parser->correct_variables, correct_trie_new());
- vec_push(parser->correct_variables_score, NULL);
-
empty_ctx.file = "<internal>";
empty_ctx.line = 0;
empty_ctx.column = 0;
vec_free(parser->_blocklocals);
vec_free(parser->_locals);
- /* corrector */
- for (i = 0; i < vec_size(parser->correct_variables); ++i) {
- correct_del(parser->correct_variables[i], parser->correct_variables_score[i]);
- }
- vec_free(parser->correct_variables);
- vec_free(parser->correct_variables_score);
-
for (i = 0; i < vec_size(parser->_typedefs); ++i)
ast_delete(parser->_typedefs[i]);
vec_free(parser->_typedefs);