⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 c.c

📁 <B>Digital的Unix操作系统VAX 4.2源码</B>
💻 C
📖 第 1 页 / 共 2 页
字号:
	    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 + -