mescc: Tinycc support: fixes for foo.bar[baz].
[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 typedef struct file {
50   char name[4];
51 } file_struct;
52
53 struct state {
54   int bla;
55   char **paths;
56   int path_count;
57   struct file **files;
58   //file_struct **files;
59   int file_count;
60 };
61
62 struct state g_s;
63
64 int
65 test ()
66 {
67   struct state *s = &g_s;
68
69   char* file_name = "file-name";
70   struct file *file;
71
72   file = malloc (sizeof (struct file) + strlen (file_name));
73   strcpy (file->name, file_name);
74   add (&s->files, &s->file_count, file);
75
76   char *path_name = "foo:bar:baz";
77   add (&s->paths, &s->path_count, path_name);
78
79   if (strcmp (*s->paths, path_name)) return 1;
80
81   eputs ("&PATHS="); eputs (itoa (&s->paths)); eputs ("\n");
82   eputs ("&FILES="); eputs (itoa (&s->files)); eputs ("\n");
83
84   struct file *fs;
85   eputs ("foo\n");
86   fs = s->files[0];
87   eputs ("add s=   "); eputs (itoa (s)); eputs ("\n");
88   eputs ("add fs=  "); eputs (itoa (fs)); eputs ("\n");
89   eputs ("&fs->[0]="); eputs (itoa (fs->name)); eputs ("\n");
90   eputs ("fs->name="); eputs (fs->name); eputs ("\n");
91
92   eputs ("ps=      "); eputs (itoa (s->paths)); eputs ("\n");
93   eputs ("*ps      "); eputs (*s->paths); eputs ("\n");
94
95   if (strcmp (fs->name, file_name)) return 2;
96
97   eputs ("&fs->[0]="); eputs (itoa (fs->name)); eputs ("\n");
98   eputs ("fs->name="); eputs (fs->name); eputs ("\n");
99
100   eputs ("ps=      "); eputs (itoa (s->paths)); eputs ("\n");
101   eputs ("*ps      "); eputs (*s->paths); eputs ("\n");
102
103
104   file = malloc (sizeof (struct file) + strlen (file_name));
105   file_name = "hallo";
106   strcpy (file->name, file_name);
107   add (&s->files, &s->file_count, file);
108
109   struct file **pf = s->files;
110   fs = pf[0];
111   eputs ("\n");
112   eputs ("&fs0*=    "); eputs (itoa (&pf[0])); eputs ("\n");
113
114   eputs ("fs0*=     "); eputs (itoa (fs)); eputs ("\n");
115   fs = s->files[0];
116   eputs ("fs0*=     "); eputs (itoa (fs)); eputs ("\n");
117   eputs ("\n");
118
119   pf = s->files;
120   fs = pf[1];
121   eputs ("&fs1*=    "); eputs (itoa (&pf[1])); eputs ("\n");
122   eputs ("fs1*=     "); eputs (itoa (fs)); eputs ("\n");
123   fs = s->files[1];
124   eputs ("fs1*=     "); eputs (itoa (fs)); eputs ("\n");
125   eputs ("\n");
126   if (strcmp (fs->name, file_name)) return 3;
127
128   fs = g_s.files[0];
129   eputs ("gfs0*=    "); eputs (itoa (fs)); eputs ("\n");
130   fs = g_s.files[1];
131   eputs ("gfs1*=    "); eputs (itoa (fs)); eputs ("\n");
132   eputs ("\n");
133   if (strcmp (fs->name, file_name)) return 3;
134
135
136   return 0;
137 }