Add scratch file handles.
[pspp-builds.git] / src / str.c
index 2a766520b135f8d01b01b7ca0a638c589fe459de..eaa9cdff9fd6f6eac8871ffaa964899900e67fee 100644 (file)
--- 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 <blp@gnu.org>.
 
    This program is free software; you can redistribute it and/or
@@ -25,7 +25,6 @@
 #include <stdlib.h>
 #include "alloc.h"
 #include "error.h"
-#include "pool.h"
 \f
 /* 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);
+}
 \f
 /* Initializes ST with initial contents S. */
 void
@@ -306,6 +328,7 @@ void
 ds_destroy (struct string *st)
 {
   free (st->string);
+  st->string = NULL;
 }
 
 /* Truncates ST to zero length. */
@@ -452,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);
 
@@ -461,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;
 }