mlibc: Cleanup.
[mes.git] / scaffold / tests / 7c-dynarray.c
1 /* -*-comment-start: "//";comment-end:""-*-
2  * Mes --- Maxwell Equations of Software
3  * Copyright © 2017 Jan (janneke) 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 <libmes.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 file4 {
50   char name[4];
51 } file4_struct;
52
53 typedef struct file12 {
54   int foo;
55   int bar;
56   char name[4];
57 } file12_struct;
58
59 //#define file file4
60 #define file file12
61
62 struct state {
63   int bla;
64   char **paths;
65   int path_count;
66   struct file **files;
67   //file_struct **files;
68   int file_count;
69 };
70
71 struct state g_s;
72
73 int
74 test ()
75 {
76   struct state *s = &g_s;
77
78   char* file_name = "file-name";
79   struct file *file;
80
81   file = malloc (sizeof (struct file) + strlen (file_name));
82   strcpy (file->name, file_name);
83   add (&s->files, &s->file_count, file);
84
85   char *path_name = "foo:bar:baz";
86   add (&s->paths, &s->path_count, path_name);
87
88   if (strcmp (*s->paths, path_name)) return 1;
89
90   eputs ("&PATHS="); eputs (itoa (&s->paths)); eputs ("\n");
91   eputs ("&FILES="); eputs (itoa (&s->files)); eputs ("\n");
92
93   // struct file *fs;
94   // eputs ("foo\n");
95   // fs = s->files[0];
96   struct file *fs = s->files[0];
97   eputs ("add s=   "); eputs (itoa (s)); eputs ("\n");
98   eputs ("add fs=  "); eputs (itoa (fs)); eputs ("\n");
99   eputs ("&fs->[0]="); eputs (itoa (fs->name)); eputs ("\n");
100   eputs ("fs->name="); eputs (fs->name); eputs ("\n");
101
102   eputs ("ps=      "); eputs (itoa (s->paths)); eputs ("\n");
103   eputs ("*ps      "); eputs (*s->paths); eputs ("\n");
104
105   if (strcmp (fs->name, file_name)) return 2;
106
107   eputs ("&fs->[0]="); eputs (itoa (fs->name)); eputs ("\n");
108   eputs ("fs->name="); eputs (fs->name); eputs ("\n");
109
110   eputs ("ps=      "); eputs (itoa (s->paths)); eputs ("\n");
111   eputs ("*ps      "); eputs (*s->paths); eputs ("\n");
112
113
114   file = malloc (sizeof (struct file) + strlen (file_name));
115   file_name = "hallo";
116   strcpy (file->name, file_name);
117   add (&s->files, &s->file_count, file);
118
119   struct file **pf = s->files;
120   fs = pf[0];
121   eputs ("\n");
122   eputs ("&fs0*=    "); eputs (itoa (&pf[0])); eputs ("\n");
123
124   eputs ("fs0*=     "); eputs (itoa (fs)); eputs ("\n");
125   fs = s->files[0];
126   eputs ("fs0*=     "); eputs (itoa (fs)); eputs ("\n");
127   eputs ("\n");
128
129   pf = s->files;
130   fs = pf[1];
131   eputs ("&fs1*=    "); eputs (itoa (&pf[1])); eputs ("\n");
132   eputs ("fs1*=     "); eputs (itoa (fs)); eputs ("\n");
133   fs = s->files[1];
134   eputs ("fs1*=     "); eputs (itoa (fs)); eputs ("\n");
135   eputs ("\n");
136   if (strcmp (fs->name, file_name)) return 3;
137
138   fs = g_s.files[0];
139   eputs ("gfs0*=    "); eputs (itoa (fs)); eputs ("\n");
140   fs = g_s.files[1];
141   eputs ("gfs1*=    "); eputs (itoa (fs)); eputs ("\n");
142   eputs ("\n");
143   if (strcmp (fs->name, file_name)) return 3;
144
145
146   return 0;
147 }