3 NormPtr
skip_brackets (NormPtr p
)
7 while (CODE
[p
] != -1 && po
)
10 ncase RESERVED_oper_array
:
14 parse_error (perr
, "Unclosed '[' :[");
18 NormPtr
skip_braces (NormPtr p
)
22 while (CODE
[p
] != -1 && po
)
28 parse_error (perr
, "Unclosed '{' :{");
32 /* Start RIGHT AFTER the parenthesis. (never remember that) */
33 NormPtr
skip_parenthesis (NormPtr p
)
37 while (CODE
[p
] != -1 && po
)
43 parse_error (perr
, "Unclosed '(' :(");
47 NormPtr
skip_buffer_parenthesis (Token
*C
, NormPtr p
)
50 while (C
[p
] != -1 && po
)
56 parse_error_ll ("Unclosed '(' :(");
60 NormPtr
skip_buffer_brackets (Token
*C
, NormPtr p
)
63 while (C
[p
] != -1 && po
)
69 parse_error_ll ("Unclosed '[' :[");
73 NormPtr
skip_buffer_braces (Token
*C
, NormPtr p
)
76 while (C
[p
] != -1 && po
)
82 parse_error_ll ("Unclosed '{' :{");
86 NormPtr
skip_declaration (NormPtr p
)
88 bool obj_after_brace
= isaggrspc (CODE
[p
]) || CODE
[p
] == RESERVED_specialize
89 || CODE
[p
] == RESERVED_typedef
90 && (isaggrspc (CODE
[p
+ 1]) || CODE
[p
+1] == RESERVED_specialize
);
92 if (CODE
[p
+ 1] == ':'
93 && (CODE
[p
] == RESERVED_private
|| CODE
[p
] == RESERVED_public
))
95 for (;;) switch (CODE
[p
]) {
96 case ';': return p
+ 1;
97 case '{': p
= skip_braces (p
+ 1);
98 if (!obj_after_brace
) return p
;
99 ncase
'(': p
= skip_parenthesis (p
+ 1);
100 ncase
'[': p
= skip_brackets (p
+ 1);
105 bool intchr (int *s
, int t
)
108 if (*s
++ == t
) return true;
112 void intsubst (int *str
, int t1
, int t2
)
115 for (i
= 0; str
[i
] != -1; i
++)
120 void intsubst1 (int *str
, int t1
, int t2
)
123 for (i
= 0; str
[i
] != -1; i
++)
130 Token
*intcpy (int *dest
, int *src
)
134 while (*src
++ != -1);
138 void intextract (int *dest
, int *src
, int len
)
148 for (i
= 0; *t
!= -1; t
++, i
++);
152 int *argtdup (typeID
*src
)
157 for (len
= 0; src
[len
] != INTERNAL_ARGEND
; len
++)
159 r
= dest
= (int*) malloc ((len
+ 1) * sizeof (int));
161 while (*src
++ != INTERNAL_ARGEND
);
166 int *intdup1 (int *src
)
171 for (len
= 0; src
[len
] != -1; len
++)
173 dest
= (int*) malloc ((len
+ 2) * sizeof (int));
178 int *intdup (int *src
)
183 for (len
= 0; src
[len
] != -1; len
++)
185 dest
= (int*) malloc ((len
+ 1) * sizeof (int));
190 int *intndup (int *src
, int len
)
192 int *dest
= (int*) malloc ((len
+ 1) * sizeof (int));
193 intextract (dest
, src
, len
);
197 int intcmp (int *p1
, int *p2
)
199 while (*p1
== *p2
&& *p1
!= -1)
201 return *p1
== *p2
? 0 : *p1
< *p2
? -1 : 1;
204 void intcat (int *dest
, int *src
)
206 while (*dest
!= -1) dest
++;
210 void intncat (int *dest
, int *src
, int len
)
212 while (*dest
!= -1) dest
++;
213 intextract (dest
, src
, len
);
216 void intcatc (int *dest
, int t
)
218 while (*dest
!= -1) dest
++;
223 void fintprint (FILE *f
, int *s
)
226 fprintf (f
, "%s ", expand (*s
++));
229 /* escape double quotes */
230 char *escape_q_string (char *str
, int len
)
235 for (i
= 0, slen
= 4; i
< len
; i
++, slen
++)
239 ret
= (char*) malloc (slen
);
242 for (i
= 0, slen
= 1; i
< len
; i
++) {
243 if (str
[i
] == '"') ret
[slen
++] = '\\';
244 ret
[slen
++] = str
[i
];
252 /* load an entire text file into a string literal */
253 char *loadtext (char *file
)
256 ctor_load_file_ (&L
, file
);
257 if (!L
.success
) return 0;
258 file
= escape_c_string (L
.data
, L
.len
);
259 dtor_load_file_ (&L
);
263 /* load a file with mmap */
264 /* How did this got here ??? bootstrap?? */
266 void ctor_load_file_(struct load_file
*const this, char *file
)
273 if (stat(file
, &statbuf
) == -1)
275 if ((this->len
= statbuf
.st_size
) == -1)
277 if ((this->fd
= open(file
, O_RDONLY
)) == -1)
280 this->data
= (char *) mmap(0, this->len
, PROT_READ
, MAP_PRIVATE
, this->fd
, 0);
281 this->success
= this->data
!= MAP_FAILED
;
283 this->data
= (char*) malloc(this->len
);
284 this->success
= read(this->fd
, this->data
, this->len
) == this->len
;
289 void dtor_load_file_(struct load_file
*const this)
293 munmap(this->data
, this->len
);
301 /* integer trees in C */
302 intnode
*intfind (intnode
*n
, int key
)
308 for (cbit
= 1;; cbit
<<= 1)
309 if (n
->key
== key
) return n
;
310 else if ((cbit
& key
))
311 if (n
->less
) n
= n
->less
;
314 if (n
->more
) n
= n
->more
;
319 void intadd (intnode
**r
, int key
, union ival v
)
322 intnode
*n
, *m
= (intnode
*) malloc (sizeof * m
);
323 m
->less
= m
->more
= NULL
;
332 for (cbit
= 1;; cbit
<<= 1)
334 if (n
->less
) n
= n
->less
;
340 if (n
->more
) n
= n
->more
;
347 void intremove (intnode
**root
, intnode
*i
)
349 unsigned int isroot
, bt
= 0;
350 unsigned int key
= i
->key
;
353 if (!(isroot
= n
== i
))
354 for (bt
= 1; bt
; bt
*= 2)
355 if (key
& bt
) // avoid braces like hell
356 if (n
->less
!= i
) n
= n
->less
;
359 if (n
->more
!= i
) n
= n
->more
;
362 if (!i
->less
&& !i
->more
)
363 if (isroot
) *root
= 0;
365 if (key
& bt
) n
->less
= 0;
368 intnode
*r
= i
, *rp
= 0;
369 while (r
->more
|| r
->less
) {
371 r
= (r
->more
) ? r
->more
: r
->less
;
373 if (isroot
) *root
= r
;
375 if (key
& bt
) n
->less
= r
;
377 if (rp
->more
== r
) rp
->more
= 0;