bug-wget
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Bug-wget] [PATCH] Change growable string object to null terminate


From: Ray Satiro
Subject: [Bug-wget] [PATCH] Change growable string object to null terminate
Date: Mon, 08 Oct 2012 01:08:49 -0400

src/ChangeLog
src/url.c

@ src/url.c:

Any function directly writing to the members of a growable string
object must call append_null(). Functions that already do this I've
changed to call append_null(): shorten_length(), append_char(),
append_string(), append_uri_pathel().

- (append_null)
New function to null terminate a growable string object.

- (shorten_length)
New function to shorten the length of a growable string object.
---
 src/ChangeLog |  9 ++++++++
 src/url.c     | 66 ++++++++++++++++++++++++++++++++++++++++++-----------------
 2 files changed, 56 insertions(+), 19 deletions(-)

diff --git a/src/ChangeLog b/src/ChangeLog
index b1bcff4..2ccfe6f 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,12 @@
+2012-10-07  Ray Satiro <address@hidden>
+
+       * url.c: Change the functions of a growable string object to null
+       terminate the string.
+       * url.c (append_null): New function to null terminate a growable
+       string object.
+       * url.c (shorten_length): New function to shorten the length of a
+       growable string object.
+
 2012-10-03 Merinov Nikolay <address@hidden>
 
        * ftp.c (ftp_loop_internal): Ignore --no-clobber option when
diff --git a/src/url.c b/src/url.c
index 4a1c9f1..87d6290 100644
--- a/src/url.c
+++ b/src/url.c
@@ -1245,12 +1245,16 @@ mkalldirs (const char *path)
    The idea is to have a convenient and efficient way to construct a
    string by having various functions append data to it.  Instead of
    passing the obligatory BASEVAR, SIZEVAR and TAILPOS to all the
-   functions in questions, we pass the pointer to this struct.  */
+   functions in questions, we pass the pointer to this struct.
+
+   Functions that write to the members in this struct must make sure
+   that base remains null terminated by calling append_null().
+   */
 
 struct growable {
   char *base;
-  int size;
-  int tail;
+  int size;   /* memory allocated */
+  int tail;   /* string length */
 };
 
 /* Ensure that the string can accept APPEND_COUNT more characters past
@@ -1268,29 +1272,56 @@ struct growable {
 /* Move the tail position by APPEND_COUNT characters. */
 #define TAIL_INCR(r, append_count) ((r)->tail += append_count)
 
-/* Append the string STR to DEST.  NOTICE: the string in DEST is not
-   terminated.  */
 
+/* Append NULL to DEST. */
 static void
-append_string (const char *str, struct growable *dest)
+append_null (struct growable *dest)
 {
-  int l = strlen (str);
-  GROW (dest, l);
-  memcpy (TAIL (dest), str, l);
-  TAIL_INCR (dest, l);
+  GROW (dest, 1);
+  *TAIL (dest) = 0;
 }
 
-/* Append CH to DEST.  For example, append_char (0, DEST)
-   zero-terminates DEST.  */
+/* Shorten DEST to LENGTH. */
+static void
+shorten_length (size_t length, struct growable *dest)
+{
+  if (length < dest->tail)
+    dest->tail = length;
 
+  append_null (dest);
+}
+
+/* Append CH to DEST. */
 static void
 append_char (char ch, struct growable *dest)
 {
-  GROW (dest, 1);
-  *TAIL (dest) = ch;
-  TAIL_INCR (dest, 1);
+  if (ch)
+    {
+      GROW (dest, 1);
+      *TAIL (dest) = ch;
+      TAIL_INCR (dest, 1);
+    }
+
+  append_null (dest);
 }
 
+/* Append the string STR to DEST. */
+static void
+append_string (const char *str, struct growable *dest)
+{
+  int l = strlen (str);
+
+  if (l)
+    {
+      GROW (dest, l);
+      memcpy (TAIL (dest), str, l);
+      TAIL_INCR (dest, l);
+    }
+
+  append_null (dest);
+}
+
+
 enum {
   filechr_not_unix    = 1,      /* unusable on Unix, / and \0 */
   filechr_not_windows = 2,      /* unusable on Windows, one of \|/<>?:*" */
@@ -1455,6 +1486,7 @@ append_uri_pathel (const char *b, const char *e, bool 
escaped,
     }
 
   TAIL_INCR (dest, outlen);
+  append_null (dest);
 }
 
 /* Append to DEST the directory structure that corresponds the
@@ -1606,9 +1638,6 @@ url_file_name (const struct url *u, char 
*replaced_filename)
     append_char ('/', &fnres);
   append_string (temp_fnres.base, &fnres);
 
-  /* Zero-terminate the file name. */
-  append_char ('\0', &fnres);
-
   fname = fnres.base;
 
   /* Make a final check that the path length is acceptable? */
@@ -2262,7 +2291,6 @@ test_append_uri_pathel()
 
       append_string (test_array[i].original_url, &dest);
       append_uri_pathel (p, p + strlen(p), test_array[i].escaped, &dest);
-      append_char ('\0', &dest);
 
       mu_assert ("test_append_uri_pathel: wrong result",
                  strcmp (dest.base, test_array[i].expected_result) == 0);
-- 
1.7.11.msysgit.1




reply via email to

[Prev in Thread] Current Thread [Next in Thread]