- switch(s->class) {
- case ARRAY:
- t = rtype(s->type);
- if (t==t_char || (t->class==RANGE && t->type==t_char)) {
- len = size(s);
- sp -= len;
- printf("'%.*s'", len, sp);
- break;
- } else {
- printarray(s);
- }
- break;
-
- case RECORD:
- printrecord(s);
- break;
-
- case VARNT:
- error("can't print out variant records");
- break;
-
- case RANGE:
- if (s == t_real) {
- printf("%g", pop(double));
- } else if (s == t_char) {
- printf("'%c'", pop(long));
- } else if (s == t_boolean) {
- printf(pop(BOOLEAN)==TRUE ? "true" : "false");
- } else {
- printf("%ld", pop(long));
- }
- break;
-
- case FILET:
- case PTR: {
- ADDRESS addr;
-
- addr = pop(ADDRESS);
- if (addr == 0) {
- printf("nil");
- } else {
- printf("0%o", addr);
- }
- break;
- }
-
- case FIELD:
- error("missing record specification");
- break;
-
- case SCAL: {
- int scalar;
- BOOLEAN found;
-
- scalar = pop(long);
- found = FALSE;
- for (t = s->chain; t != NIL; t = t->chain) {
- if (t->symvalue.iconval == scalar) {
- printf("%s", t->symbol);
- found = TRUE;
- break;
- }
- }
- if (!found) {
- printf("(scalar = %d)", scalar);
- }
- break;
- }