Exemple #1
0
/* 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);
}
Exemple #2
0
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);
}
Exemple #3
0
/* 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);
    }
}