struct cstring str;
cstr_new (&str);
+again:
+
while (!is_end_of_line[(int) *line]) {
- again:
if (line[0] == '#' && line[1] == '#') {
- if (str.size && ((char *) str.data)[str.size - 1] == ' ') { str.size--; }
+ while (str.size && ((char *) str.data)[str.size - 1] == ' ') {
+ str.size--;
+ }
- line += 2;
+ line = skip_whitespace (line + 2);
continue;
}
cstr_cat (&str, arg, strlen (arg));
} else {
- cstr_ccat (&str, *line++);
+
+ cstr_ccat (&str, *line);
+ line++;
+
}
}
#include "symbol.h"
#include "vector.h"
+static struct hashtab hashtab_seen_macros = { 0 };
+
static char *preprocess_line (char *src, int in_macro) {
struct cstring cstr;
sname = symname (&caret);
- if ((key = find_macro (sname))) {
+ if (!(key = hashtab_get_key (&hashtab_seen_macros, sname))) {
- if ((m = get_macro (key))) {
+ if ((key = find_macro (sname))) {
char *pm;
- int spaces = 0;
-
- if (*caret == ' ' || *caret == '\t') {
-
- cstr_ccat (&cstr, ' ');
-
- while (*caret == ' ' || *caret == '\t') {
-
- spaces++;
- caret++;
-
- }
- }
+ caret = skip_whitespace (caret);
+ hashtab_put (&hashtab_seen_macros, key, sname);
- if ((pm = process_macro (start, &caret, m))) {
+ if ((m = get_macro (key))) {
- char *temp = preprocess_line (pm, 1);
- cstr_cat (&cstr, temp, strlen (temp));
+ if ((pm = process_macro (start, &caret, m))) {
- if (!is_end_of_line[(int) *pm]) {
-
- while (spaces--) {
- cstr_ccat (&cstr, ' ');
- }
+ char *temp = preprocess_line (pm, 1);
+ cstr_cat (&cstr, temp, strlen (temp));
}
}
+
+ hashtab_remove (&hashtab_seen_macros, key);
+ continue;
}
-
- free (sname);
- continue;
}
}
- cstr_cat (&cstr, start, caret - start);
-
free (sname);
+
+ cstr_cat (&cstr, start, caret - start);
continue;
}