Tests for obstack functions.
[kopensolaris-gnu/glibc.git] / malloc / tst-obstack.c
1 /* Test case by Alexandre Duret-Lutz <duret_g@epita.fr>.  */
2 #include <obstack.h>
3 #include <stdint.h>
4 #include <stdio.h>
5 #include <stdlib.h>
6
7 #define obstack_chunk_alloc verbose_malloc
8 #define obstack_chunk_free verbose_free
9 #define ALIGN_BOUNDARY 64
10 #define ALIGN_MASK (ALIGN_BOUNDARY - 1)
11 #define OBJECT_SIZE 1000
12
13 static void *
14 verbose_malloc (size_t size)
15 {
16   void *buf = malloc (size);
17   printf ("malloc (%u) => %p\n", size, buf);
18   return buf;
19 }
20
21 static void
22 verbose_free (void *buf)
23 {
24   free (buf);
25   printf ("free (%p)\n", buf);
26 }
27
28 int
29 main (void)
30 {
31   struct obstack obs;
32   int i;
33   int result = 0;
34
35   obstack_init (&obs);
36   obstack_alignment_mask (&obs) = ALIGN_MASK;
37   /* finish an empty object to take alignment into account */
38   obstack_finish (&obs);
39
40   /* let's allocate some objects and print their addresses */
41   for (i = 15; i > 0; --i)
42     {
43       void *obj = obstack_alloc (&obs, OBJECT_SIZE);
44
45       printf ("obstack_alloc (%u) => %p \t%s\n", OBJECT_SIZE, obj,
46               ((uintptr_t) obj & ALIGN_MASK) ? "(not aligned)" : "");
47       result |= ((uintptr_t) obj & ALIGN_MASK) != 0;
48   }
49
50   /* clean up */
51   obstack_free (&obs, 0);
52
53   return result;
54 }