mescc: Tinycc support: support foo.bar[baz], foo->bar[baz] for struct bar.
[mes.git] / scaffold / tests / 7c-dynarray.c
1 /* -*-comment-start: "//";comment-end:""-*-
2  * Mes --- Maxwell Equations of Software
3  * Copyright © 2017 Jan Nieuwenhuizen <janneke@gnu.org>
4  *
5  * This file is part of Mes.
6  *
7  * Mes is free software; you can redistribute it and/or modify it
8  * under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 3 of the License, or (at
10  * your option) any later version.
11  *
12  * Mes is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with Mes.  If not, see <http://www.gnu.org/licenses/>.
19  */
20
21 #include "30-test.i"
22
23 #include <mlibc.h>
24 #include <stdlib.h>
25 #include <stdio.h>
26 #include <string.h>
27
28 void
29 add (void *ptab, int *nb_ptr, void *data)
30 {
31     int nb, nb_alloc;
32     int **pp;
33
34     nb = *nb_ptr;
35     pp = *(void ***)ptab;
36     /* every power of two we double array size */
37     if ((nb & (nb - 1)) == 0) {
38         if (!nb)
39             nb_alloc = 1;
40         else
41             nb_alloc = nb * 2;
42           pp = realloc (pp, nb_alloc * sizeof(void *));
43         *(void***)ptab = pp;
44     }
45     pp[nb++] = data;
46     *nb_ptr = nb;
47 }
48
49 struct file {
50   char name[4];
51 };
52
53 struct state {
54   char **paths;
55   int path_count;
56   struct file **files;
57   int file_count;
58 };
59
60 struct state g_s;
61
62 int
63 test ()
64 {
65   struct state *s = &g_s;
66
67   char* file_name = "file-name";
68   struct file *file;
69
70   file = malloc (sizeof (struct file) + strlen (file_name));
71   strcpy (file->name, file_name);
72   add (&s->files, &s->file_count, file);
73
74   char *path_name = "foo:bar:baz";
75   add (&s->paths, &s->path_count, path_name);
76
77   if (strcmp (*s->paths, path_name)) return 1;
78
79   eputs ("&PATHS="); eputs (itoa (&s->paths)); eputs ("\n");
80   eputs ("&FILES="); eputs (itoa (&s->files)); eputs ("\n");
81
82   struct file *fs = s->files[0];
83   eputs ("add s=   "); eputs (itoa (s)); eputs ("\n");
84   eputs ("add fs=  "); eputs (itoa (fs)); eputs ("\n");
85   eputs ("&fs->[0]="); eputs (itoa (fs->name)); eputs ("\n");
86   eputs ("fs->name="); eputs (fs->name); eputs ("\n");
87
88   eputs ("ps=      "); eputs (itoa (s->paths)); eputs ("\n");
89   eputs ("*ps      "); eputs (*s->paths); eputs ("\n");
90
91   if (strcmp (fs->name, file_name)) return 1;
92   
93   eputs ("&fs->[0]="); eputs (itoa (fs->name)); eputs ("\n");
94   eputs ("fs->name="); eputs (fs->name); eputs ("\n");
95
96   eputs ("ps=      "); eputs (itoa (s->paths)); eputs ("\n");
97   eputs ("*ps      "); eputs (*s->paths); eputs ("\n");
98
99   return 0;
100 }