/* printtree1 - recursively print tree p */ static void printtree1(Tree p, int fd, int lev) { FILE *f = fd == 1 ? stdout : stderr; int i; static char blanks[] = " "; if (p == 0 || *printed(i = nodeid(p))) return; fprint(f, "#%d%S%S", i, blanks, i < 10 ? 2 : i < 100 ? 1 : 0, blanks, lev); fprint(f, "%s %t", opname(p->op), p->type); *printed(i) = 1; for (i = 0; i < NELEMS(p->kids); i++) if (p->kids[i]) fprint(f, " #%d", nodeid(p->kids[i])); if (p->op == FIELD && p->u.field) fprint(f, " %s %d..%d", p->u.field->name, fieldsize(p->u.field) + fieldright(p->u.field), fieldright(p->u.field)); else if (generic(p->op) == CNST) fprint(f, " %s", vtoa(p->type, p->u.v)); else if (p->u.sym) fprint(f, " %s", p->u.sym->name); if (p->node) fprint(f, " node=%p", p->node); fprint(f, "\n"); for (i = 0; i < NELEMS(p->kids); i++) printtree1(p->kids[i], fd, lev + 1); }
static void fields(node_t * sym) { int follow[] = {INT, CONST, '}', IF, 0}; node_t *sty = SYM_TYPE(sym); if (!first_decl(token)) { error("expect type name or qualifiers"); return; } struct vector *v = vec_new(); do { node_t *basety = specifiers(NULL, NULL); for (;;) { node_t *field = new_field(); if (token->id == ':') { bitfield(field); FIELD_TYPE(field) = basety; } else { node_t *ty = NULL; struct token *id = NULL; declarator(&ty, &id, NULL); attach_type(&ty, basety); if (token->id == ':') bitfield(field); FIELD_TYPE(field) = ty; if (id) { for (int i = 0; i < vec_len(v); i++) { node_t *f = vec_at(v, i); if (FIELD_NAME(f) && !strcmp(FIELD_NAME(f), id->name)) { errorf(id->src, "redefinition of '%s'", id->name); break; } } FIELD_NAME(field) = id->name; AST_SRC(field) = id->src; } } vec_push(v, field); if (token->id != ',') break; expect(','); ensure_field(field, vec_len(v), false); } match(';', follow); ensure_field(vec_tail(v), vec_len(v), isstruct(sty) && !first_decl(token)); } while (first_decl(token)); TYPE_FIELDS(sty) = (node_t **) vtoa(v); set_typesize(sty); }
/* printtoken - print current token preceeded by a space */ static void printtoken(void) { switch (t) { case ID: fprint(stderr, " `%s'", token); break; case ICON: fprint(stderr, " `%s'", vtoa(tsym->type, tsym->u.c.v)); break; case SCON: { int i, n; if (ischar(tsym->type->type)) { char *s = tsym->u.c.v.p; n = tsym->type->size; fprint(stderr, " \""); for (i = 0; i < 20 && i < n && *s; s++, i++) if (*s < ' ' || *s >= 0177) fprint(stderr, "\\%o", *s); else fprint(stderr, "%c", *s); } else { /* wchar_t string */ unsigned int *s = tsym->u.c.v.p; assert(tsym->type->type->size == widechar->size); n = tsym->type->size/widechar->size; fprint(stderr, " L\""); for (i = 0; i < 20 && i < n && *s; s++, i++) if (*s < ' ' || *s >= 0177) fprint(stderr, "\\x%x", *s); else fprint(stderr, "%c", *s); } if (i < n) fprint(stderr, " ..."); else fprint(stderr, "\""); break; } case FCON: fprint(stderr, " `%S'", token, (char*)cp - token); break; case '`': case '\'': fprint(stderr, " \"%k\"", t); break; default: fprint(stderr, " `%k'", t); } }