📄 c.c
字号:
printtype(t, t->type, indent); if (t->type->class != PTR) { printf(" "); } printf("*"); break; case FUNC: case FFUNC: printtype(t, t->type, indent); printf("()"); break; case TYPE: if (t->name != nil) { printname(stdout, t); } else { printtype(t, t->type, indent); } break; case TYPEREF: printf("@%s", symname(t)); break; case SCAL: printf("enum "); if (s->name != nil and s->class == TAG) { printf("%s ", symname(s)); } printf("{ "); i = t->chain; if (i != nil) { for (;;) { printf("%s", symname(i)); i = i->chain; if (i == nil) break; printf(", "); } } printf(" }"); break; case TAG: if (t->type == nil) { printf("unresolved tag %s", symname(t)); } else { i = rtype(t->type); printf("%s %s", c_classname(i), symname(t)); } break; default: printf("(class %d)", t->class); break; }}/* * List the parameters of a procedure or function. * No attempt is made to combine like types. */public c_listparams(s)Symbol s;{ register Symbol t; putchar('('); for (t = s->chain; t != nil; t = t->chain) { printf("%s", symname(t)); if (t->chain != nil) { printf(", "); } } putchar(')'); if (s->chain != nil) { printf("\n"); for (t = s->chain; t != nil; t = t->chain) { if (t->class != VAR) { panic("unexpected class %d for parameter", t->class); } printdecl(t, 0); } } else { putchar('\n'); }}/* * Print out the value on the top of the expression stack * in the format for the type of the given symbol. */public c_printval(s)Symbol s;{ register Symbol t; register Address a; integer i, len; switch (s->class) { case CONST: case TYPE: case VAR: case REF: case FVAR: case TAG: c_printval(s->type); break; case FIELD: if (isbitfield(s)) { i = 0; popn(size(s), &i); i >>= (s->symvalue.field.offset mod BITSPERBYTE); i &= ((1 << s->symvalue.field.length) - 1); t = rtype(s->type); if (t->class == SCAL) { printEnum(i, t); } else { printRangeVal(i, t); } } else { c_printval(s->type); } break; case ARRAY: t = rtype(s->type); if ((t->class == RANGE and istypename(t->type, "char")) or t == t_char->type ) { len = size(s); sp -= len; if (s->language == primlang) { printf("%.*s", len, sp); } else { printf("\"%.*s\"", len, sp); } } else { printarray(s); } break; case RECORD: c_printstruct(s); break; case RANGE: if (s == t_boolean->type or istypename(s->type, "boolean")) { printRangeVal(popsmall(s), s); } else if (s == t_char->type or istypename(s->type, "char")) { printRangeVal(pop(char), s); } else if (s == t_real->type or isdouble(s)) { switch (s->symvalue.rangev.lower) { case sizeof(float): prtreal(pop(float)); break; case sizeof(double): prtreal(pop(double)); break; default: panic("bad real size %d", t->symvalue.rangev.lower); break; } } else { printRangeVal(popsmall(s), s); } break; case PTR: t = rtype(s->type); a = pop(Address); if (a == 0) { printf("(nil)"); } else { if (t->class == RANGE and istypename(t->type, "char")) { printString(a, (boolean) (s->language != primlang)); } else { printf("0x%x", a); } } break; case SCAL: i = pop(Integer); printEnum(i, s); break; /* * Unresolved structure pointers? */ case BADUSE: a = pop(Address); printf("@%x", a); break; default: if (ord(s->class) > ord(TYPEREF)) { panic("printval: bad class %d", ord(s->class)); } sp -= size(s); printf("[%s]", c_classname(s)); break; }}/* * Print out a C structure. */private c_printstruct (s)Symbol s;{ Symbol f; Stack *savesp; integer n, off, len; sp -= size(s); savesp = sp; printf("("); f = s->chain; for (;;) { off = f->symvalue.field.offset; len = f->symvalue.field.length; n = (off + len + BITSPERBYTE - 1) div BITSPERBYTE; sp += n; printf("%s = ", symname(f)); c_printval(f); sp = savesp; f = f->chain; if (f == nil) break; printf(", "); } printf(")");}#define MAXSTRLENGTH 10000public Node c_printf(p, argv)Node p;char **argv;{ char str[MAXSTRLENGTH]; char *fmt; va_list ap = (va_list)&argv[1]; fmt = argv[0]; if (!fmt) return; while (*fmt) { if (strncmp(fmt,"%s",2) == 0) error("percent-s format not implemented for printf"); fmt++; } /* while */ vsprintf(str, argv[0], ap); fputs(str, stdout);}/* * Return the C name for the particular class of a symbol. */public String c_classname(s)Symbol s;{ String str; switch (s->class) { case RECORD: str = "struct"; break; case VARNT: str = "union"; break; case SCAL: str = "enum"; break; default: str = classname(s); } return str;}public Node c_buildaref(a, slist)Node a, slist;{ register Symbol t; register Node p; Symbol etype, atype, eltype; Node r, esub; t = rtype(a->nodetype); eltype = t->type; if (t->class == PTR) { p = slist->value.arg[0]; if (not compatible(p->nodetype, t_int)) { beginerrmsg(); fprintf(stderr, "subscript must be integer-compatible"); enderrmsg(); } r = build(O_MUL, p, build(O_LCON, (long) size(eltype))); r = build(O_ADD, build(O_RVAL, a), r); r->nodetype = eltype; } else if (t->class != ARRAY) { beginerrmsg(); fprintf(stderr, "\""); prtree(stderr, a); fprintf(stderr, "\" is not an array"); enderrmsg(); } else { r = a; p = slist; t = t->chain; for (; p != nil and t != nil; p = p->value.arg[1], t = t->chain) { esub = p->value.arg[0]; etype = rtype(esub->nodetype); atype = rtype(t); if (not compatible(atype, etype)) { beginerrmsg(); fprintf(stderr, "subscript \""); prtree(stderr, esub); fprintf(stderr, "\" is the wrong type"); enderrmsg(); } r = build(O_INDEX, r, esub); r->nodetype = eltype; } if (p != nil or t != nil) { beginerrmsg(); if (p != nil) { fprintf(stderr, "too many subscripts for \""); } else { fprintf(stderr, "not enough subscripts for \""); } prtree(stderr, a); fprintf(stderr, "\""); enderrmsg(); } } return r;}/* * Evaluate a subscript index. */public c_evalaref(s, base, i)Symbol s;Address base;long i;{ Symbol t; long lb, ub; t = rtype(s); s = t->chain; lb = s->symvalue.rangev.lower; ub = s->symvalue.rangev.upper; if (i < lb or i > ub) { error("subscript out of range"); } push(long, base + (i - lb) * size(t->type));}/* * Initialize typetable information. */public c_modinit (typetable)Symbol typetable[];{ /* nothing right now */}public boolean c_hasmodules (){ return false;}public boolean c_passaddr (param, exprtype)Symbol param, exprtype;{ boolean b; Symbol t; t = rtype(exprtype); b = (boolean) (t->class == ARRAY); return b;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -