Change growable string object to null terminate

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.
This commit is contained in:
Ray Satiro 2012-10-08 01:08:49 -04:00 committed by Giuseppe Scrivano
parent 13c6e7832a
commit 242ddfc74e
2 changed files with 59 additions and 22 deletions

View File

@ -1,3 +1,12 @@
2012-10-07 Ray Satiro <raysatiro@yahoo.com>
* 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 <kim.roader@gmail.com>
* ftp.c (ftp_loop_internal): Ignore --no-clobber option when

View File

@ -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,28 +1272,55 @@ 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_null (struct growable *dest)
{
GROW (dest, 1);
*TAIL (dest) = 0;
}
/* 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)
{
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);
GROW (dest, l);
memcpy (TAIL (dest), str, l);
TAIL_INCR (dest, l);
if (l)
{
GROW (dest, l);
memcpy (TAIL (dest), str, l);
TAIL_INCR (dest, l);
}
append_null (dest);
}
/* Append CH to DEST. For example, append_char (0, DEST)
zero-terminates DEST. */
static void
append_char (char ch, struct growable *dest)
{
GROW (dest, 1);
*TAIL (dest) = ch;
TAIL_INCR (dest, 1);
}
enum {
filechr_not_unix = 1, /* unusable on Unix, / and \0 */
@ -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);