X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=src%2Fstr.c;h=eaa9cdff9fd6f6eac8871ffaa964899900e67fee;hb=92fb12eb06716d14c05b781f5d9dcde956d77c30;hp=56b0491eec793656b4bddd6438414ca0d7ad49dd;hpb=2e02472cf15ddb64c33a1477cf4cfbf3be2d0c95;p=pspp diff --git a/src/str.c b/src/str.c index 56b0491eec..eaa9cdff9f 100644 --- a/src/str.c +++ b/src/str.c @@ -1,5 +1,5 @@ /* PSPP - computes sample statistics. - Copyright (C) 1997-9, 2000 Free Software Foundation, Inc. + Copyright (C) 1997-9, 2000, 2006 Free Software Foundation, Inc. Written by Ben Pfaff . This program is free software; you can redistribute it and/or @@ -25,7 +25,6 @@ #include #include "alloc.h" #include "error.h" -#include "pool.h" /* sprintf() wrapper functions for convenience. */ @@ -79,8 +78,8 @@ nvsprintf (char *buf, const char *format, va_list args) void buf_reverse (char *p, size_t nbytes) { - unsigned char *h = p, *t = &h[nbytes - 1]; - unsigned char temp; + char *h = p, *t = &h[nbytes - 1]; + char temp; nbytes /= 2; while (nbytes--) @@ -249,6 +248,21 @@ str_copy_trunc (char *dst, size_t dst_size, const char *src) } } +/* Copies buffer SRC, of SRC_LEN bytes, + to DST, which is in a buffer DST_SIZE bytes long. + Truncates DST to DST_SIZE - 1 characters, if necessary. */ +void +str_copy_buf_trunc (char *dst, size_t dst_size, + const char *src, size_t src_size) +{ + size_t dst_len; + assert (dst_size > 0); + + dst_len = src_size < dst_size ? src_size : dst_size - 1; + memcpy (dst, src, dst_len); + dst[dst_len] = '\0'; +} + /* Converts each character in S to uppercase. */ void str_uppercase (char *s) @@ -256,6 +270,14 @@ str_uppercase (char *s) for (; *s != '\0'; s++) *s = toupper ((unsigned char) *s); } + +/* Converts each character in S to lowercase. */ +void +str_lowercase (char *s) +{ + for (; *s != '\0'; s++) + *s = tolower ((unsigned char) *s); +} /* Initializes ST with initial contents S. */ void @@ -306,7 +328,7 @@ void ds_destroy (struct string *st) { free (st->string); - st->string = NULL;x + st->string = NULL; } /* Truncates ST to zero length. */ @@ -453,7 +475,9 @@ ds_vprintf (struct string *st, const char *format, va_list args) been written. */ int avail, needed; + va_list a1; + va_copy(a1, args); avail = st->capacity - st->length + 1; needed = vsnprintf (st->string + st->length, avail, format, args); @@ -462,17 +486,22 @@ ds_vprintf (struct string *st, const char *format, va_list args) { ds_extend (st, st->length + needed); - vsprintf (st->string + st->length, format, args); + vsprintf (st->string + st->length, format, a1); } else while (needed == -1) { + va_list a2; + va_copy(a2, a1); + ds_extend (st, (st->capacity + 1) * 2); avail = st->capacity - st->length + 1; - needed = vsnprintf (st->string + st->length, avail, format, args); + needed = vsnprintf (st->string + st->length, avail, format, a2); + va_end(a2); } + va_end(a1); st->length += needed; }