diff options
Diffstat (limited to 'gas/read.c')
-rw-r--r-- | gas/read.c | 22 |
1 files changed, 17 insertions, 5 deletions
@@ -3106,9 +3106,9 @@ s_bad_end (int endr) void s_rept (int ignore ATTRIBUTE_UNUSED) { - int count; + size_t count; - count = get_absolute_expression (); + count = (size_t) get_absolute_expression (); do_repeat (count, "REPT", "ENDR"); } @@ -3117,11 +3117,17 @@ s_rept (int ignore ATTRIBUTE_UNUSED) different directives to be used as the start/end keys. */ void -do_repeat (int count, const char *start, const char *end) +do_repeat (size_t count, const char *start, const char *end) { sb one; sb many; + if (((ssize_t) count) < 0) + { + as_bad (_("negative count for %s - ignored"), start); + count = 0; + } + sb_new (&one); if (!buffer_and_nest (start, end, &one, get_non_macro_line_sb)) { @@ -3144,7 +3150,7 @@ do_repeat (int count, const char *start, const char *end) block is replaced by the iteration count. */ void -do_repeat_with_expander (int count, +do_repeat_with_expander (size_t count, const char * start, const char * end, const char * expander) @@ -3152,6 +3158,12 @@ do_repeat_with_expander (int count, sb one; sb many; + if (((ssize_t) count) < 0) + { + as_bad (_("negative count for %s - ignored"), start); + count = 0; + } + sb_new (&one); if (!buffer_and_nest (start, end, &one, get_non_macro_line_sb)) { @@ -3172,7 +3184,7 @@ do_repeat_with_expander (int count, sb_build (& processed, one.len); sb_add_sb (& processed, & one); sub = strstr (processed.ptr, expander); - len = sprintf (sub, "%d", count); + len = sprintf (sub, "%lu", (unsigned long) count); gas_assert (len < 8); strcpy (sub + len, sub + 8); processed.len -= (8 - len); |