diff options
-rw-r--r-- | gas/sb.c | 16 |
1 files changed, 14 insertions, 2 deletions
@@ -111,8 +111,20 @@ sb_scrub_and_add_sb (sb *ptr, sb *s) sb_to_scrub = s; scrub_position = s->ptr; - sb_check (ptr, s->len); - ptr->len += do_scrub_chars (scrub_from_sb, ptr->ptr + ptr->len, s->len); + /* do_scrub_chars can expand text, for example when replacing + # 123 "filename" + with + \t.linefile 123 "filename" + or when replacing a 'c with the decimal ascii number for c. + So we loop until the input S is consumed. */ + while (1) + { + size_t copy = s->len - (scrub_position - s->ptr); + if (copy == 0) + break; + sb_check (ptr, copy); + ptr->len += do_scrub_chars (scrub_from_sb, ptr->ptr + ptr->len, copy); + } sb_to_scrub = 0; scrub_position = 0; |