X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flibpspp%2Fstr.c;h=c630cf9ada761aa89b260197ca0718b1e9ff4344;hb=0d70eff1e5dcd89a73f09ce6bc999ccbec8234b5;hp=ba4a26f1426ac51552dd31885d5cdfff5fea321d;hpb=530906aaa19f6c209ca008c8187f7f750a0b1283;p=pspp diff --git a/src/libpspp/str.c b/src/libpspp/str.c index ba4a26f142..c630cf9ada 100644 --- a/src/libpspp/str.c +++ b/src/libpspp/str.c @@ -347,15 +347,16 @@ ss_realloc (struct substring *ss, size_t size) ss->string = xrealloc (ss->string, size); } -/* Makes a pool_alloc_unaligned()'d copy of the contents of OLD - in POOL, and stores it in NEW. */ +/* Makes a pool_alloc_unaligned()'d, null-terminated copy of the contents of + OLD in POOL, and stores it in NEW. */ void ss_alloc_substring_pool (struct substring *new, struct substring old, struct pool *pool) { - new->string = pool_alloc_unaligned (pool, old.length); + new->string = pool_alloc_unaligned (pool, old.length + 1); new->length = old.length; memcpy (new->string, old.string, old.length); + new->string[old.length] = '\0'; } /* Allocates room for a CNT-byte string in NEW in POOL. */ @@ -1454,6 +1455,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, ...)