diff --git a/lib/irv/lccrt_irreader.c b/lib/irv/lccrt_irreader.c index 08aaadc..ab85892 100644 --- a/lib/irv/lccrt_irreader.c +++ b/lib/irv/lccrt_irreader.c @@ -901,16 +901,14 @@ lccrt_irreader_read_int( lccrt_irreader_t *irr, int64_t *value, int is_hex) } if ( is_dig0 - || (i > 2) ) + || (i >= 2) ) { char *p1 = 0; char *p0 = b->data + b->ind; - if ( is_hex ) - { + if ( is_hex ) { (*value) = strtoull( p0, &p1, 16); - } else - { + } else { (*value) = strtoll( p0, &p1, 10); } @@ -960,7 +958,7 @@ lccrt_irreader_read_lexem( lccrt_irreader_t *irr) * Проверяем, что в начале буфера находится заданная лексема. */ static int -lccrt_irreader_is_lexem( lccrt_irreader_t *irr, const char *lexem, int is_skip) +lccrt_irreader_is_lexem( lccrt_irreader_t *irr, const char *lexem, int is_skip_space) { int r = 0; lccrt_irreader_buffer_t *b = irr->b; @@ -977,7 +975,7 @@ lccrt_irreader_is_lexem( lccrt_irreader_t *irr, const char *lexem, int is_skip) && (strncmp( lexem, b->data + b->ind, lexem_len) == 0) ) { r = 1; - lccrt_irreader_skip( irr, strlen( lexem), is_skip); + lccrt_irreader_skip( irr, strlen( lexem), is_skip_space); } return (r); @@ -2122,7 +2120,7 @@ lccrt_irreader_read_einfocat( lccrt_irreader_t *irr) || (lccrt_module_find_einfo_category( m, cname).id >= 0) ) { lccrt_irreader_error( irr, "duplicate definition einfo-category '%%c%jd = %s', [%s]", - cident, cname, lccrt_irreader_print_head( irr, 64, s)); + cident, lccrt_irreader_print_head( irr, 64, s)); } else { lccrt_eic_t ecat = lccrt_module_new_einfo_category( m, cname); @@ -2786,7 +2784,8 @@ lccrt_irreader_read_varinit( lccrt_irreader_t *irr, lccrt_varinit_ptr *vinit) int64_t shift = 0; if ( lccrt_irreader_read_ident( irr, &aname) - && lccrt_irreader_is_lexem( irr, "+", 0) + && (lccrt_irreader_is_char( irr, 0, '+') + || lccrt_irreader_is_char( irr, 0, '-')) && lccrt_irreader_read_int( irr, &shift, 0) ) { vi = lccrt_varinit_new_addr_var( irr->addr0, shift); @@ -3086,7 +3085,7 @@ lccrt_irreader_get_label( lccrt_irreader_t *irr, const char *name) if ( !r ) { lccrt_irreader_error( irr, "unknown label [%s] in function [%s], [%s ...]", - name, fi->f->name, lccrt_function_get_name( fi->f)); + name, lccrt_function_get_name( fi->f)); } return (r); diff --git a/lib/irv/lccrt_irwriter.c b/lib/irv/lccrt_irwriter.c index 9c0d363..2a830dc 100644 --- a/lib/irv/lccrt_irwriter.c +++ b/lib/irv/lccrt_irwriter.c @@ -647,13 +647,13 @@ lccrt_irwriter_print_varinit( lccrt_irwriter_t *irw, lccrt_varinit_ptr vi) { int64_t i; int fd = irw->fd; - lccrt_var_ptr va = 0; - lccrt_function_ptr fa = 0; + const char *vn = 0; lccrt_type_ptr t = lccrt_varinit_get_type( vi); int64_t num_elems = lccrt_varinit_get_num_elems( vi); + lccrt_varinit_inittype_t vitype = lccrt_varinit_get_inittype( vi); lccrt_printf( irw, "%s ", lccrt_irwriter_get_type_ident( irw, t)); - switch ( lccrt_varinit_get_inittype( vi) ) + switch ( vitype ) { case LCCRT_VARINIT_ZERO: lccrt_printf( irw, "zeroinit"); @@ -665,14 +665,17 @@ lccrt_irwriter_print_varinit( lccrt_irwriter_t *irw, lccrt_varinit_ptr vi) lccrt_print_escaped_bytearray( irw, num_elems, lccrt_varinit_get_str( vi)); break; case LCCRT_VARINIT_ADDR_VAR: - va = lccrt_varinit_get_addr_var( vi); - lccrt_printf( irw, "&%s+%jd", lccrt_irwriter_get_name_ident( irw, va), - lccrt_varinit_get_num_elems( vi)); - break; case LCCRT_VARINIT_ADDR_FUNC: - fa = lccrt_varinit_get_addr_func( vi); - lccrt_printf( irw, "&%s+%jd", lccrt_irwriter_get_name_ident( irw, fa), - lccrt_varinit_get_num_elems( vi)); + if ( vitype == LCCRT_VARINIT_ADDR_VAR ) { + vn = lccrt_irwriter_get_name_ident( irw, lccrt_varinit_get_addr_var( vi)); + } else { + vn = lccrt_irwriter_get_name_ident( irw, lccrt_varinit_get_addr_func( vi)); + } + if ( num_elems >= 0 ) { + lccrt_printf( irw, "&%s+%jd", vn, num_elems); + } else { + lccrt_printf( irw, "&%s%jd", vn, num_elems); + } break; case LCCRT_VARINIT_ARR: lccrt_printf( irw, "{"); diff --git a/lib/irv/lccrt_var.c b/lib/irv/lccrt_var.c index 0de792e..5961c29 100644 --- a/lib/irv/lccrt_var.c +++ b/lib/irv/lccrt_var.c @@ -237,7 +237,8 @@ lccrt_varinit_get_num_elems( lccrt_varinit_ptr vi) if ( lccrt_varinit_is_array( vi) || lccrt_varinit_is_str( vi) - || lccrt_varinit_is_addr_var( vi) ) + || lccrt_varinit_is_addr_var( vi) + || lccrt_varinit_is_addr_func( vi) ) { r = vi->num_elems; }