X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=tests%2Ftest-obstack-printf.c;h=1081921600778e593c168738a2f6024bd7c0b1fa;hb=5176540362f4c81561d5c8ba83a01796996b9bbe;hp=fba7887c703fd3b193d347f957321c27de3781be;hpb=7a8101a246b1c7aa64cd2f95ad2a43a2bf2ee891;p=gnulib.git diff --git a/tests/test-obstack-printf.c b/tests/test-obstack-printf.c index fba7887c7..108192160 100644 --- a/tests/test-obstack-printf.c +++ b/tests/test-obstack-printf.c @@ -1,5 +1,5 @@ /* Test of obstack_printf() and obstack_vprintf() functions. - Copyright (C) 2008 Free Software Foundation, Inc. + Copyright (C) 2008-2011 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -20,6 +20,11 @@ #include +#include "signature.h" +SIGNATURE_CHECK (obstack_printf, int, (struct obstack *, char const *, ...)); +SIGNATURE_CHECK (obstack_vprintf, int, (struct obstack *, char const *, + va_list)); + #include "obstack.h" #include "xalloc.h" @@ -27,17 +32,8 @@ #include #include -#define ASSERT(expr) \ - do \ - { \ - if (!(expr)) \ - { \ - fprintf (stderr, "%s:%d: assertion failed\n", __FILE__, __LINE__); \ - fflush (stderr); \ - abort (); \ - } \ - } \ - while (0) +#include "progname.h" +#include "macros.h" #define obstack_chunk_alloc xmalloc #define obstack_chunk_free free @@ -47,23 +43,22 @@ test_function (int (*my_obstack_printf) (struct obstack *, const char *, ...)) { struct obstack obs; obstack_init (&obs); - /* In general, don't invoke obstack_* functions inside ASSERT, as - not all compilers can avoid multiple side effects. */ + /* In general, be careful that arguments to obstack_* don't have + side effects, as not all compilers evaluate macro arguments only + once. */ - /* Grow the obstack to near its boundary, then check that output - longer than the obstack free space grows the obstack. */ + /* Grow the obstack to near its boundary, then check that short + output longer than the obstack free space grows the obstack. */ { char *base = obstack_base (&obs); char *new_base; int result; - int size; int room = obstack_room (&obs) - 4; obstack_blank_fast (&obs, room); result = my_obstack_printf (&obs, "%d %s", 123, "456"); ASSERT (result == 7); - size = obstack_object_size (&obs); - ASSERT (result + room == size); + ASSERT (result + room == obstack_object_size (&obs)); obstack_1grow (&obs, 0); new_base = obstack_finish (&obs); ASSERT (base != new_base); @@ -76,17 +71,33 @@ test_function (int (*my_obstack_printf) (struct obstack *, const char *, ...)) char *base = obstack_base (&obs); char *new_base; int result; - int size; int room = obstack_room (&obs); ASSERT (8 < room); result = my_obstack_printf (&obs, "%d %s", 123, "456"); ASSERT (result == 7); - size = obstack_object_size (&obs); - ASSERT (result == size); + ASSERT (result == obstack_object_size (&obs)); new_base = obstack_base (&obs); ASSERT (base == new_base); ASSERT (strncmp (base, "123 456", result) == 0); + obstack_finish (&obs); + } + + /* Check for generating much more output than a chunk size. */ + { + char *base = obstack_base (&obs); + char *new_base; + int result; + int i; + + ASSERT (obstack_chunk_size (&obs) < 10000); + result = my_obstack_printf (&obs, "%010000d", 0); + ASSERT (result == 10000); + ASSERT (result == obstack_object_size (&obs)); + new_base = obstack_base (&obs); + ASSERT (base != new_base); + for (i = 0; i < 10000; i++) + ASSERT (new_base[i] == '0'); } obstack_free (&obs, NULL); @@ -119,6 +130,8 @@ test_obstack_printf () int main (int argc, char *argv[]) { + set_program_name (argv[0]); + test_obstack_vprintf (); test_obstack_printf (); return 0;