diff --git a/gb.db.odbc/src/main.c b/gb.db.odbc/src/main.c index 29203dfbc..81c3ee7ee 100644 --- a/gb.db.odbc/src/main.c +++ b/gb.db.odbc/src/main.c @@ -134,7 +134,7 @@ void reportODBCError(char *fn, ret = SQLGetDiagRecW(type, handle, ++i, state, &native, text, sizeof(text), &len); if (SQL_SUCCEEDED(ret)) - fprintf(stderr, "gb.db.odbc: %s:%d:%d:%s\n", (char *)state, i, native, (char *)text); + fprintf(stderr, "gb.db.odbc: %s:%d:%d:%s\n", (char *)state, (int)i, (int)native, (char *)text); } while (ret == SQL_SUCCESS); } diff --git a/gb.image.io/src/c_image.c b/gb.image.io/src/c_image.c index b612b7b87..012358552 100644 --- a/gb.image.io/src/c_image.c +++ b/gb.image.io/src/c_image.c @@ -64,7 +64,7 @@ BEGIN_METHOD(CIMAGE_load, GB_STRING path) size = llen > LOAD_INC ? LOAD_INC : llen; if (!gdk_pixbuf_loader_write(loader, (guchar*)laddr, size, &error)) { - fprintf(stderr, "error write: %ld\n", size); + fprintf(stderr, "error write: %" PRId64 "\n", size); GB.Error(error->message); goto __END; } diff --git a/gb.xml/src/utils.cpp b/gb.xml/src/utils.cpp index 46e9458c8..94e7a00ff 100644 --- a/gb.xml/src/utils.cpp +++ b/gb.xml/src/utils.cpp @@ -251,7 +251,7 @@ void XML_Format(GB_VALUE *value, char* &dst, size_t &lenDst) break; case GB_T_LONG: - lenDst = sprintf(buffer, "%ld", VALUE((GB_LONG *)value)); + lenDst = sprintf(buffer, "%" PRId64, VALUE((GB_LONG *)value)); break; case GB_T_STRING: diff --git a/main/gbc/gbc_trans_expr.c b/main/gbc/gbc_trans_expr.c index c1a39d589..98c9854e5 100644 --- a/main/gbc/gbc_trans_expr.c +++ b/main/gbc/gbc_trans_expr.c @@ -43,6 +43,9 @@ static bool _must_drop_vargs = FALSE; static TYPE _type[MAX_EXPR_LEVEL]; static int _type_level = 0; +static TYPE _last_type; + +static void trans_expression(bool check_statement); #if DEBUG @@ -51,14 +54,23 @@ static void _push_type(TYPE type) if (_type_level >= MAX_EXPR_LEVEL) // should have been detected by TRANS_tree() THROW("Expression too complex"); + fprintf(stderr, "level = %d / %d\n", _type_level, MAX_EXPR_LEVEL); _type[_type_level++] = type; } +static void _drop_type(int n) +{ + _type_level -= n; + if (_type_level < 0) + ERROR_panic("Incorrect type analyze"); +} + #define push_type(_type) fprintf(stderr, "push_type: %d in %s.%d\n", (_type).t.id, __func__, __LINE__), _push_type(_type) #define push_type_id(_id) fprintf(stderr, "push_type_id: %d in %s.%d\n", (_id), __func__, __LINE__), _push_type(TYPE_make_simple(_id)) -#define pop_type() fprintf(stderr, "pop type: in %s.%d\n", __func__, __LINE__),(_type[--_type_level]) -#define drop_type(_n) fprintf(stderr, "drop type: %d in %s.%d\n", (_n), __func__, __LINE__),(_type_level -= (_n)) -#define get_type(_i, _nparam) (fprintf(stderr, "get type(%d,%d): %d in %s.%d\n", (_i), (_nparam), (_type[_type_level + (_i) - (_nparam)].t.id), __func__, __LINE__),(_type[_type_level + (_i) - (_nparam)].t.id)) +#define pop_type() (fprintf(stderr, "pop_type: in %s.%d\n", __func__, __LINE__),(_type[--_type_level])) +#define drop_type(_n) fprintf(stderr, "drop_type: %d in %s.%d\n", (_n), __func__, __LINE__),_drop_type(_n) +#define get_type(_i, _nparam) (fprintf(stderr, "get_type(%d,%d): %d in %s.%d\n", (_i), (_nparam), (_type[_type_level + (_i) - (_nparam)].t.id), __func__, __LINE__),(_type[_type_level + (_i) - (_nparam)].t.id)) +#define dup_type() fprintf(stderr, "dup_type: in %s.%d\n", __func__, __LINE__),push_type(_type[_type_level - 1]) #else @@ -70,10 +82,17 @@ static void push_type(TYPE type) _type[_type_level++] = type; } +static void drop_type(int n) +{ + _type_level -= n; + if (_type_level < 0) + ERROR_panic("Incorrect type analyze"); +} + #define push_type_id(_id) push_type(TYPE_make_simple(_id)) #define pop_type() (_type[--_type_level]) -#define drop_type(_n) (_type_level -= (_n)) #define get_type(_i, _nparam) (_type[_type_level + (_i) - (_nparam)].t.id) +#define dup_type() push_type(_type[_type_level - 1]) #endif @@ -409,10 +428,14 @@ static void trans_operation(short op, short nparam, PATTERN previous) case OP_RSQR: TRANS_subr(TS_SUBR_ARRAY, nparam); + if (nparam > MAX_PARAM_OP) + nparam--; break; case OP_COLON: TRANS_subr(TS_SUBR_COLLECTION, nparam); + if (nparam > MAX_PARAM_OP) + nparam -= 2; break; case OP_MINUS: @@ -500,10 +523,9 @@ static void trans_expr_from_tree(TRANS_TREE *tree, int count) uint64_t byref = 0; pattern = NULL_PATTERN; - _type_level = 0; #if DEBUG - fprintf(stderr, "-----------------------\n"); + fprintf(stderr, "-------------------------------------------- %d\n", _type_level); #endif i = 0; @@ -598,6 +620,7 @@ static void trans_expr_from_tree(TRANS_TREE *tree, int count) else if (PATTERN_is(pattern, RS_ERROR)) { TRANS_subr(TS_SUBR_ERROR, 0); + push_type_id(T_BOOLEAN); } else if (PATTERN_is(pattern, RS_OPTIONAL)) { @@ -638,6 +661,8 @@ static void trans_expr_from_tree(TRANS_TREE *tree, int count) __CONTINUE: ; } + + _last_type = pop_type(); } @@ -760,7 +785,7 @@ void TRANS_new(void) } -void TRANS_expression(bool check_statement) +static void trans_expression(bool check_statement) { TRANS_TREE *tree; int tree_length; @@ -867,7 +892,7 @@ bool TRANS_affectation(bool dup) bool stat = FALSE; int op = RS_NONE; int id = RS_NONE; - + for(;;) { if (PATTERN_is_newline(*look)) // || PATTERN_is_end(*look)) @@ -939,21 +964,25 @@ bool TRANS_affectation(bool dup) if (!stat) { + TYPE type; + if (op != RS_NONE) { JOB->current = left; - TRANS_expression(FALSE); + trans_expression(FALSE); + type = _last_type; } JOB->current = expr; - TRANS_expression(FALSE); + trans_expression(FALSE); after = JOB->current; if (op != RS_NONE) { - /*if (op == RS_AMP) - CODE_string_add();*/ + push_type(_last_type); + push_type(type); trans_operation(op, 2, NULL_PATTERN); + pop_type(); } } @@ -989,3 +1018,9 @@ bool TRANS_affectation(bool dup) } +void TRANS_expression(bool check_statement) +{ + _type_level = 0; + trans_expression(check_statement); +} +