X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flibpspp%2Fstr.c;h=7e722c17e6b92602798725e3bdd618327a46691f;hb=ed38ada34331b3b1e0167c350b375a3fb38099a2;hp=08a85ad790f20fe625de485b6c22058226910e2e;hpb=03bfb72314e434ddaa2ff2b770d1d9df2ea1927a;p=pspp diff --git a/src/libpspp/str.c b/src/libpspp/str.c index 08a85ad790..7e722c17e6 100644 --- a/src/libpspp/str.c +++ b/src/libpspp/str.c @@ -270,17 +270,22 @@ str_format_26adic (unsigned long int number, char buffer[], size_t size) while (number-- > 0) { if (length >= size) - return false; + goto overflow; buffer[length++] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"[number % 26]; number /= 26; } if (length >= size) - return false; + goto overflow; buffer[length] = '\0'; buf_reverse (buffer, length); return true; + +overflow: + if (length > 0) + buffer[0] = '\0'; + return false; } /* Sets the SIZE bytes starting at BLOCK to C, @@ -1455,6 +1460,30 @@ ds_put_uninit (struct string *st, size_t incr) return end; } +/* Moves the bytes in ST following offset OFS + OLD_LEN in ST to offset OFS + + NEW_LEN and returns the byte at offset OFS. The first min(OLD_LEN, NEW_LEN) + bytes at the returned position are unchanged; if NEW_LEN > OLD_LEN then the + following NEW_LEN - OLD_LEN bytes are initially indeterminate. + + The intention is that the caller should write NEW_LEN bytes at the returned + position, to effectively replace the OLD_LEN bytes previously at that + position. */ +char * +ds_splice_uninit (struct string *st, + size_t ofs, size_t old_len, size_t new_len) +{ + if (new_len != old_len) + { + if (new_len > old_len) + ds_extend (st, ds_length (st) + (new_len - old_len)); + memmove (ds_data (st) + (ofs + new_len), + ds_data (st) + (ofs + old_len), + ds_length (st) - (ofs + old_len)); + st->ss.length += new_len - old_len; + } + return ds_data (st) + ofs; +} + /* Formats FORMAT as a printf string and appends the result to ST. */ void ds_put_format (struct string *st, const char *format, ...)