Annotation of researchv10dc/cmd/icon/src/iconx/rmisc.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * File: rmisc.c
        !             3:  *  Contents: deref, hash, outimage, qtos, trace, tvkeys
        !             4:  */
        !             5: 
        !             6: #include "../h/rt.h"
        !             7: /*
        !             8:  * deref - dereference a descriptor.
        !             9:  */
        !            10: 
        !            11: /* >deref1 */
        !            12: deref(dp)
        !            13: struct descrip *dp;
        !            14:    {
        !            15:    register word i, j;
        !            16:    register union block *bp;
        !            17:    struct descrip v, tbl, tref;
        !            18:    char sbuf[MaxCvtLen];
        !            19:    extern char *alcstr();
        !            20: 
        !            21:    if (!Qual(*dp) && Var(*dp)) {
        !            22:       /*
        !            23:        * dp points to a variable and must be dereferenced.
        !            24:        */
        !            25: /* <deref1 */
        !            26: /* >deref2 */
        !            27:       if (!Tvar(*dp))
        !            28:          /*
        !            29:           * An ordinary variable is being dereferenced, just replace
        !            30:           *  *dp with the the descriptor *dp is pointing to.
        !            31:           */
        !            32:          *dp = *VarLoc(*dp);
        !            33: /* <deref2 */
        !            34: /* >deref3 */
        !            35:       else switch (Type(*dp)) {
        !            36: 
        !            37:             case T_Tvsubs:
        !            38:                Inc(ev_n_tsderef);
        !            39:                /*
        !            40:                 * A substring trapped variable is being dereferenced.
        !            41:                 *  Point bp to the trapped variable block and v to
        !            42:                 *  the string.
        !            43:                 */
        !            44:                bp = TvarLoc(*dp);
        !            45:                v = bp->tvsubs.ssvar;
        !            46:                DeRef(v);
        !            47:                if (!Qual(v))
        !            48:                   runerr(103, &v);
        !            49:                if (bp->tvsubs.sspos + bp->tvsubs.sslen - 1 > StrLen(v))
        !            50:                   runerr(205, NULL);
        !            51:                /*
        !            52:                 * Make a descriptor for the substring by getting the
        !            53:                 *  length and pointing into the string.
        !            54:                 */
        !            55:                StrLen(*dp) = bp->tvsubs.sslen;
        !            56:                StrLoc(*dp) = StrLoc(v) + bp->tvsubs.sspos - 1;
        !            57:                break;
        !            58: /* <deref3 */
        !            59: 
        !            60: /* >deref4 */
        !            61:             case T_Tvtbl:
        !            62:                Inc(ev_n_ttderef);
        !            63:                if (BlkLoc(*dp)->tvtbl.title == T_Telem) {
        !            64:                   /*
        !            65:                    * The tvtbl has been converted to a telem and is in
        !            66:                    *  the table.  Replace the descriptor pointed to by dp
        !            67:                    *  with the value of the element.
        !            68:                    */
        !            69:                    *dp = BlkLoc(*dp)->telem.tval;
        !            70:                    break;
        !            71:                    }
        !            72: 
        !            73:                /*
        !            74:                 *  Point tbl to the table header block, tref to the
        !            75:                 *  subscripting value, and bp to the appropriate element
        !            76:                 *  chain.  Point dp to a descriptor for the default
        !            77:                 *  value in case the value referenced by the subscript
        !            78:                 *  is not in the table.
        !            79:                 */
        !            80:                tbl = BlkLoc(*dp)->tvtbl.clink;
        !            81:                tref = BlkLoc(*dp)->tvtbl.tref;
        !            82:                i = BlkLoc(*dp)->tvtbl.hashnum;
        !            83:                *dp = BlkLoc(tbl)->table.defvalue;
        !            84:                bp = BlkLoc(BlkLoc(tbl)->table.buckets[SlotNum(i,TSlots)]);
        !            85: 
        !            86:                /*
        !            87:                 * Traverse the element chain looking for the subscript value.
        !            88:                 *  If found, replace the descriptor pointed to by dp with
        !            89:                 *  the value of the element.
        !            90:                 */
        !            91:                while (bp != NULL && bp->telem.hashnum <= i) {
        !            92:                   if ((bp->telem.hashnum == i) &&
        !            93:                      (equiv(&bp->telem.tref, &tref))) {
        !            94:                         *dp = bp->telem.tval;
        !            95:                         break;
        !            96:                         }
        !            97:                   bp = BlkLoc(bp->telem.clink);
        !            98:                   }
        !            99:                break;
        !           100: /* <deref4 */
        !           101: 
        !           102: /* >deref5 */
        !           103:             case T_Tvkywd:
        !           104:                bp = TvarLoc(*dp);
        !           105:                *dp = bp->tvkywd.kyval;
        !           106:                break;
        !           107: /* <deref5 */
        !           108: 
        !           109:             default:
        !           110:                syserr("deref: illegal trapped variable");
        !           111:             }
        !           112:       }
        !           113: #ifdef Debug
        !           114:    if (!Qual(*d) && Var(*d))
        !           115:       syserr("deref: didn't get dereferenced");
        !           116: #endif Debug
        !           117:    return 1;
        !           118:    }
        !           119: /* <deref */
        !           120: 
        !           121: 
        !           122: /*
        !           123:  * hash - compute hash value of arbitrary object for table and set accessing.
        !           124:  */
        !           125: 
        !           126: /* >hash */
        !           127: word hash(dp)
        !           128: struct descrip *dp;
        !           129:    {
        !           130:    word i;
        !           131:    double r;
        !           132:    register word j;
        !           133:    register char *s;
        !           134: 
        !           135:    if (Qual(*dp)) {
        !           136: 
        !           137:       /*
        !           138:        * Compute the hash value for the string by summing the value
        !           139:        *  of all the characters (up to a maximum of 10) plus the length.
        !           140:        */
        !           141:       i = 0;
        !           142:       s = StrLoc(*dp);
        !           143:       j = StrLen(*dp);
        !           144:       for (j = (j <= 10) ? j : 10 ; j > 0; j--)
        !           145:          i += *s++ & 0377;
        !           146:       i += StrLen(*dp) & 0377;
        !           147:       }
        !           148:    else {
        !           149:       switch (Type(*dp)) {
        !           150:          /*
        !           151:           * The hash value for numeric types is the bitstring
        !           152:           *  representation of the value.
        !           153:           */
        !           154: 
        !           155:          case T_Integer:
        !           156:             i = IntVal(*dp);
        !           157:             break;
        !           158: 
        !           159:          case T_Longint:
        !           160:             i = BlkLoc(*dp)->longint.intval;
        !           161:             break;
        !           162: 
        !           163:          case T_Real:
        !           164:             GetReal(dp,r);
        !           165:             i = r;
        !           166:             break;
        !           167: 
        !           168:          case T_Cset:
        !           169:             /*
        !           170:              * Compute the hash value for a cset by exclusive or-ing
        !           171:              *  the words in the bit array.
        !           172:              */
        !           173:             i = 0;
        !           174:             for (j = 0; j < CsetSize; j++)
        !           175:                i ^= BlkLoc(*dp)->cset.bits[j];
        !           176:             break;
        !           177: 
        !           178:          default:
        !           179:             /*
        !           180:              * For other types, use the type code as the hash
        !           181:              *  value.
        !           182:              */
        !           183:             i = Type(*dp);
        !           184:             break;
        !           185:          }
        !           186:       }
        !           187: 
        !           188:    return i;
        !           189:    }
        !           190: /* <hash */
        !           191: 
        !           192: 
        !           193: #define StringLimit    16              /* limit on length of imaged string */
        !           194: #define ListLimit       6              /* limit on list items in image */
        !           195: 
        !           196: /*
        !           197:  * outimage - print image of d on file f.  If restrict is non-zero,
        !           198:  *  fields of records will not be imaged.
        !           199:  */
        !           200: 
        !           201: outimage(f, d, restrict)
        !           202: FILE *f;
        !           203: struct descrip *d;
        !           204: int restrict;
        !           205:    {
        !           206:    register word i, j;
        !           207:    register char *s;
        !           208:    register union block *bp, *vp;
        !           209:    char *type;
        !           210:    FILE *fd;
        !           211:    struct descrip q;
        !           212:    extern char *blkname[];
        !           213:    double rresult;
        !           214: 
        !           215: outimg:
        !           216: 
        !           217:    if (Qual(*d)) {
        !           218:       /*
        !           219:        * *d is a string qualifier.  Print StringLimit characters of it
        !           220:        *  using printimage and denote the presence of additional characters
        !           221:        *  by terminating the string with "...".
        !           222:        */
        !           223:       i = StrLen(*d);
        !           224:       s = StrLoc(*d);
        !           225:       j = Min(i, StringLimit);
        !           226:       putc('"', f);
        !           227:       while (j-- > 0)
        !           228:          printimage(f, *s++, '"');
        !           229:       if (i > StringLimit)
        !           230:          fprintf(f, "...");
        !           231:       putc('"', f);
        !           232:       return;
        !           233:       }
        !           234: 
        !           235:    if (Var(*d) && !Tvar(*d)) {
        !           236:       /*
        !           237:        * *d is a variable.  Print "variable =", dereference it and loop
        !           238:        *  back to the top to cause the value of the variable to be imaged.
        !           239:        */
        !           240:       fprintf(f, "variable = ");
        !           241:       d = VarLoc(*d);
        !           242:       goto outimg;
        !           243:       }
        !           244: 
        !           245:    switch (Type(*d)) {
        !           246: 
        !           247:       case T_Null:
        !           248:          if (restrict == 0)
        !           249:             fprintf(f, "&null");
        !           250:          return;
        !           251: 
        !           252:       case T_Integer:
        !           253:          fprintf(f, "%d", (int)IntVal(*d));
        !           254:          return;
        !           255: 
        !           256:       case T_Longint:
        !           257:          fprintf(f, "%ld", BlkLoc(*d)->longint.intval);
        !           258:          return;
        !           259: 
        !           260:       case T_Real:
        !           261:          {
        !           262:          char s[30];
        !           263:          struct descrip junk;
        !           264:          double rresult;
        !           265: 
        !           266:          GetReal(d,rresult);
        !           267:          rtos(rresult, &junk, s);
        !           268:          fprintf(f, "%s", s);
        !           269:          return;
        !           270:          }
        !           271: 
        !           272:       case T_Cset:
        !           273:          /*
        !           274:           * Check for distinguished csets by looking at the address of
        !           275:           *  of the object to image.  If one is found, print its name.
        !           276:           */
        !           277:          if (BlkLoc(*d) == (union block *) &k_ascii) {
        !           278:             fprintf(f, "&ascii");
        !           279:             return;
        !           280:             }
        !           281:          else if (BlkLoc(*d) == (union block *) &k_cset) {
        !           282:             fprintf(f, "&cset");
        !           283:             return;
        !           284:             }
        !           285:          else if (BlkLoc(*d) == (union block *) &k_lcase) {
        !           286:             fprintf(f, "&lcase");
        !           287:             return;
        !           288:             }
        !           289:          else if (BlkLoc(*d) == (union block *) &k_ucase) {
        !           290:             fprintf(f, "&ucase");
        !           291:             return;
        !           292:             }
        !           293:          /*
        !           294:           * Use printimage to print each character in the cset.  Follow
        !           295:           *  with "..." if the cset contains more than StringLimit
        !           296:           *  characters.
        !           297:           */
        !           298:          putc('\'', f);
        !           299:          j = StringLimit;
        !           300:          for (i = 0; i < 256; i++) {
        !           301:             if (Testb(i, BlkLoc(*d)->cset.bits)) {
        !           302:                if (j-- <= 0) {
        !           303:                   fprintf(f, "...");
        !           304:                   break;
        !           305:                   }
        !           306:                printimage(f, (int)i, '\'');
        !           307:                }
        !           308:             }
        !           309:          putc('\'', f);
        !           310:          return;
        !           311: 
        !           312:       case T_File:
        !           313:          /*
        !           314:           * Check for distinguished files by looking at the address of
        !           315:           *  of the object to image.  If one is found, print its name.
        !           316:           */
        !           317:          if ((fd = BlkLoc(*d)->file.fd) == stdin)
        !           318:             fprintf(f, "&input");
        !           319:          else if (fd == stdout)
        !           320:             fprintf(f, "&output");
        !           321:          else if (fd == stderr)
        !           322:             fprintf(f, "&output");
        !           323:          else {
        !           324:             /*
        !           325:              * The file isn't a special one, just print "file(name)".
        !           326:              */
        !           327:             i = StrLen(BlkLoc(*d)->file.fname);
        !           328:             s = StrLoc(BlkLoc(*d)->file.fname);
        !           329:             fprintf(f, "file(");
        !           330:             while (i-- > 0)
        !           331:                printimage(f, *s++, '\0');
        !           332:             putc(')', f);
        !           333:             }
        !           334:          return;
        !           335: 
        !           336:       case T_Proc:
        !           337:          /*
        !           338:           * Produce one of:
        !           339:           *  "procedure name"
        !           340:           *  "function name"
        !           341:           *  "record constructor name"
        !           342:           *
        !           343:           * Note that the number of dynamic locals is used to determine
        !           344:           *  what type of "procedure" is at hand.
        !           345:           */
        !           346:          i = StrLen(BlkLoc(*d)->proc.pname);
        !           347:          s = StrLoc(BlkLoc(*d)->proc.pname);
        !           348:          switch (BlkLoc(*d)->proc.ndynam) {
        !           349:             default:  type = "procedure"; break;
        !           350:             case -1:  type = "function"; break;
        !           351:             case -2:  type = "record constructor"; break;
        !           352:             }
        !           353:          fprintf(f, "%s ", type);
        !           354:          while (i-- > 0)
        !           355:             printimage(f, *s++, '\0');
        !           356:          return;
        !           357: 
        !           358:       case T_List:
        !           359:          /*
        !           360:           * listimage does the work for lists.
        !           361:           */
        !           362:          listimage(f, (struct b_list *)BlkLoc(*d), restrict);
        !           363:          return;
        !           364: 
        !           365:       case T_Table:
        !           366:          /*
        !           367:           * Print "table(n)" where n is the size of the table.
        !           368:           */
        !           369:          fprintf(f, "table(%ld)", (long)BlkLoc(*d)->table.size);
        !           370:          return;
        !           371:       case T_Set:
        !           372:        /*
        !           373:          * print "set(n)" where n is the cardinality of the set
        !           374:          */
        !           375:        fprintf(f,"set(%ld)",(long)BlkLoc(*d)->set.size);
        !           376:        return;
        !           377: 
        !           378:       case T_Record:
        !           379:          /*
        !           380:           * If restrict is non-zero, print "record(n)" where n is the
        !           381:           *  number of fields in the record.  If restrict is zero, print
        !           382:           *  the image of each field instead of the number of fields.
        !           383:           */
        !           384:          bp = BlkLoc(*d);
        !           385:          i = StrLen(BlkLoc(bp->record.recdesc)->proc.recname);
        !           386:          s = StrLoc(BlkLoc(bp->record.recdesc)->proc.recname);
        !           387:          fprintf(f, "record ");
        !           388:          while (i-- > 0)
        !           389:             printimage(f, *s++, '\0');
        !           390:          j = BlkLoc(bp->record.recdesc)->proc.nfields;
        !           391:          if (j <= 0)
        !           392:             fprintf(f, "()");
        !           393:          else if (restrict > 0)
        !           394:             fprintf(f, "(%ld)", (long)j);
        !           395:          else {
        !           396:             putc('(', f);
        !           397:             i = 0;
        !           398:             for (;;) {
        !           399:                outimage(f, &bp->record.fields[i], restrict+1);
        !           400:                if (++i >= j)
        !           401:                   break;
        !           402:                putc(',', f);
        !           403:                }
        !           404:             putc(')', f);
        !           405:             }
        !           406:          return;
        !           407: 
        !           408:       case T_Tvsubs:
        !           409:          /*
        !           410:           * Produce "v[i+:j] = value" where v is the image of the variable
        !           411:           *  containing the substring, i is starting position of the substring
        !           412:           *  j is the length, and value is the string v[i+:j]. If the length
        !           413:           *  (j) is one, just produce "v[i] = value".
        !           414:           */
        !           415:          bp = BlkLoc(*d);
        !           416:          d = VarLoc(bp->tvsubs.ssvar);
        !           417:          if ((word)d == (word)&tvky_sub)
        !           418:             fprintf(f, "&subject");
        !           419:          else outimage(f, d, restrict);
        !           420:          if (bp->tvsubs.sslen == 1)
        !           421:             fprintf(f, "[%ld]", (long)bp->tvsubs.sspos);
        !           422:          else
        !           423:             fprintf(f, "[%ld+:%ld]", (long)bp->tvsubs.sspos, (long)bp->tvsubs.sslen);
        !           424:          if ((word)d == (word)&tvky_sub) {
        !           425:             fprintf(f, " = ");
        !           426:             vp = BlkLoc(bp->tvsubs.ssvar);
        !           427:             StrLen(q) = bp->tvsubs.sslen;
        !           428:             StrLoc(q) = StrLoc(vp->tvkywd.kyval) + bp->tvsubs.sspos-1;
        !           429:             d = &q;
        !           430:             goto outimg;
        !           431:             }
        !           432:          else if (Qual(*d)) {
        !           433:             StrLen(q) = bp->tvsubs.sslen;
        !           434:             StrLoc(q) = StrLoc(*VarLoc(bp->tvsubs.ssvar)) + bp->tvsubs.sspos-1;
        !           435:             fprintf(f, " = ");
        !           436:             d = &q;
        !           437:             goto outimg;
        !           438:             }
        !           439:          return;
        !           440: 
        !           441:       case T_Tvtbl:
        !           442:          bp = BlkLoc(*d);
        !           443:          /*
        !           444:           * It is possible that descriptor d which thinks it is pointing
        !           445:           *  at a TVTBL may actually be pointing at a TELEM which had
        !           446:           *  been converted from a trapped variable. Check for this first
        !           447:           *  and if it is a TELEM produce the outimage of its value.
        !           448:           */
        !           449:          if (bp->tvtbl.title == T_Telem) {
        !           450:             outimage(f, &bp->tvtbl.tval, restrict);
        !           451:             return;
        !           452:             }
        !           453:          /*
        !           454:           * It really was a TVTBL - Produce "t[s]" where t is the image of
        !           455:           *  the table containing the element and s is the image of the
        !           456:           *  subscript.
        !           457:           */
        !           458:          else {
        !           459:             outimage(f, &bp->tvtbl.clink, restrict);
        !           460:             putc('[', f);
        !           461:             outimage(f, &bp->tvtbl.tref, restrict);
        !           462:             putc(']', f);
        !           463:             return;
        !           464:             }
        !           465: 
        !           466:       case T_Tvkywd:
        !           467:          bp = BlkLoc(*d);
        !           468:          i = StrLen(bp->tvkywd.kyname);
        !           469:          s = StrLoc(bp->tvkywd.kyname);
        !           470:          while (i-- > 0)
        !           471:             putc(*s++, f);
        !           472:          fprintf(f, " = ");
        !           473:          outimage(f, &bp->tvkywd.kyval, restrict);
        !           474:          return;
        !           475: 
        !           476: 
        !           477:       case T_Coexpr:
        !           478:          fprintf(f, "co-expression");
        !           479:          return;
        !           480: 
        !           481:       default:
        !           482:          if (Type(*d) <= MaxType)
        !           483:             fprintf(f, "%s", blkname[Type(*d)]);
        !           484:          else
        !           485:             syserr("outimage: unknown type");
        !           486:       }
        !           487:    }
        !           488: 
        !           489: /*
        !           490:  * printimage - print character c on file f using escape conventions
        !           491:  *  if c is unprintable, '\', or equal to q.
        !           492:  */
        !           493: 
        !           494: static printimage(f, c, q)
        !           495: FILE *f;
        !           496: int c, q;
        !           497:    {
        !           498:    if (c >= ' ' && c < '\177') {
        !           499:       /*
        !           500:        * c is printable, but special case ", ', and \.
        !           501:        */
        !           502:       switch (c) {
        !           503:          case '"':
        !           504:             if (c != q) goto def;
        !           505:             fprintf(f, "\\\"");
        !           506:             return;
        !           507:          case '\'':
        !           508:             if (c != q) goto def;
        !           509:             fprintf(f, "\\'");
        !           510:             return;
        !           511:          case '\\':
        !           512:             fprintf(f, "\\\\");
        !           513:             return;
        !           514:          default:
        !           515:          def:
        !           516:             putc(c, f);
        !           517:             return;
        !           518:          }
        !           519:       }
        !           520: 
        !           521:    /*
        !           522:     * c is some sort of unprintable character. If it one of the common
        !           523:     *  ones, produce a special representation for it, otherwise, produce
        !           524:     *  its octal value.
        !           525:     */
        !           526:    switch (c) {
        !           527:       case '\b':                        /* backspace */
        !           528:          fprintf(f, "\\b");
        !           529:          return;
        !           530:       case '\177':                        /* delete */
        !           531:          fprintf(f, "\\d");
        !           532:          return;
        !           533:       case '\33':                        /* escape */
        !           534:          fprintf(f, "\\e");
        !           535:          return;
        !           536:       case '\f':                        /* form feed */
        !           537:          fprintf(f, "\\f");
        !           538:          return;
        !           539:       case '\n':                        /* new line */
        !           540:          fprintf(f, "\\n");
        !           541:          return;
        !           542:       case '\r':                        /* return */
        !           543:          fprintf(f, "\\r");
        !           544:          return;
        !           545:       case '\t':                        /* horizontal tab */
        !           546:          fprintf(f, "\\t");
        !           547:          return;
        !           548:       case '\13':                        /* vertical tab */
        !           549:          fprintf(f, "\\v");
        !           550:          return;
        !           551:       default:                               /* octal constant */
        !           552:          fprintf(f, "\\%03o", c&0377);
        !           553:          return;
        !           554:       }
        !           555:    }
        !           556: 
        !           557: /*
        !           558:  * listimage - print an image of a list.
        !           559:  */
        !           560: 
        !           561: static listimage(f, lp, restrict)
        !           562: FILE *f;
        !           563: struct b_list *lp;
        !           564: int restrict;
        !           565:    {
        !           566:    register word i, j;
        !           567:    register struct b_lelem *bp;
        !           568:    word size, count;
        !           569: 
        !           570:    bp = (struct b_lelem *) BlkLoc(lp->listhead);
        !           571:    size = lp->size;
        !           572: 
        !           573:    if (restrict > 0 && size > 0) {
        !           574:       /*
        !           575:        * Just give indication of size if the list isn't empty.
        !           576:        */
        !           577:       fprintf(f, "list(%ld)", (long)size);
        !           578:       return;
        !           579:       }
        !           580: 
        !           581:    /*
        !           582:     * Print [e1,...,en] on f.  If more than ListLimit elements are in the
        !           583:     *  list, produce the first ListLimit/2 elements, an ellipsis, and the
        !           584:     *  last ListLimit elements.
        !           585:     */
        !           586:    putc('[', f);
        !           587:    count = 1;
        !           588:    i = 0;
        !           589:    if (size > 0) {
        !           590:       for (;;) {
        !           591:          if (++i > bp->nused) {
        !           592:             i = 1;
        !           593:             bp = (struct b_lelem *) BlkLoc(bp->listnext);
        !           594:             }
        !           595:          if (count <= ListLimit/2 || count > size - ListLimit/2) {
        !           596:             j = bp->first + i - 1;
        !           597:             if (j >= bp->nelem)
        !           598:                j -= bp->nelem;
        !           599:             outimage(f, &bp->lslots[j], restrict+1);
        !           600:             if (count >= size)
        !           601:                break;
        !           602:             putc(',', f);
        !           603:             }
        !           604:          else if (count == ListLimit/2 + 1)
        !           605:             fprintf(f, "...,");
        !           606:          count++;
        !           607:          }
        !           608:       }
        !           609:    putc(']', f);
        !           610:    }
        !           611: 
        !           612: 
        !           613: /*
        !           614:  * qtos - convert a qualified string named by *d to a C-style string in
        !           615:  *  in str.  At most MaxCvtLen characters are copied into str.
        !           616:  */
        !           617: 
        !           618: qtos(d, str)
        !           619: struct descrip *d;
        !           620: char *str;
        !           621:    {
        !           622:    register word cnt, slen;
        !           623:    register char *c;
        !           624: 
        !           625:    c = StrLoc(*d);
        !           626:    slen = StrLen(*d);
        !           627:    for (cnt = Min(slen, MaxCvtLen - 1); cnt > 0; cnt--)
        !           628:       *str++ = *c++;
        !           629:    *str = '\0';
        !           630:    }
        !           631: 
        !           632: 
        !           633: /*
        !           634:  * ctrace - procedure *bp is being called with nargs arguments, the first
        !           635:  *  of which is at arg; produce a trace message.
        !           636:  */
        !           637: ctrace(bp, nargs, arg)
        !           638: struct b_proc *bp;
        !           639: int nargs;
        !           640: struct descrip *arg;
        !           641:    {
        !           642:    register int n;
        !           643: 
        !           644:    if (k_trace > 0)
        !           645:       k_trace--;
        !           646:    showline(bp->filename, line);
        !           647:    showlevel(k_level);
        !           648:    putstr(stderr, StrLoc(bp->pname), StrLen(bp->pname));
        !           649:    putc('(', stderr);
        !           650:    while (nargs--) {
        !           651:       outimage(stderr, arg++, 0);
        !           652:       if (nargs)
        !           653:          putc(',', stderr);
        !           654:       }
        !           655:    putc(')', stderr);
        !           656:    putc('\n', stderr);
        !           657:    fflush(stderr);
        !           658:    }
        !           659: 
        !           660: /*
        !           661:  * rtrace - procedure *bp is returning *rval; produce a trace message.
        !           662:  */
        !           663: 
        !           664: rtrace(bp, rval)
        !           665: register struct b_proc *bp;
        !           666: struct descrip *rval;
        !           667:    {
        !           668:    register int n;
        !           669: 
        !           670:    if (k_trace > 0)
        !           671:       k_trace--;
        !           672:    showline(bp->filename, line);
        !           673:    showlevel(k_level);
        !           674:    putstr(stderr, StrLoc(bp->pname), StrLen(bp->pname));
        !           675:    fprintf(stderr, " returned ");
        !           676:    outimage(stderr, rval, 0);
        !           677:    putc('\n', stderr);
        !           678:    fflush(stderr);
        !           679:    }
        !           680: 
        !           681: /*
        !           682:  * ftrace - procedure *bp is failing; produce a trace message.
        !           683:  */
        !           684: 
        !           685: ftrace(bp)
        !           686: register struct b_proc *bp;
        !           687:    {
        !           688:    register int n;
        !           689: 
        !           690:    if (k_trace > 0)
        !           691:       k_trace--;
        !           692:    showline(bp->filename, line);
        !           693:    showlevel(k_level);
        !           694:    putstr(stderr, StrLoc(bp->pname), StrLen(bp->pname));
        !           695:    fprintf(stderr, " failed");
        !           696:    putc('\n', stderr);
        !           697:    fflush(stderr);
        !           698:    }
        !           699: 
        !           700: /*
        !           701:  * strace - procedure *bp is suspending *rval; produce a trace message.
        !           702:  */
        !           703: 
        !           704: strace(bp, rval)
        !           705: register struct b_proc *bp;
        !           706: struct descrip *rval;
        !           707:    {
        !           708:    register int n;
        !           709: 
        !           710:    if (k_trace > 0)
        !           711:       k_trace--;
        !           712:    showline(bp->filename, line);
        !           713:    showlevel(k_level);
        !           714:    putstr(stderr, StrLoc(bp->pname), StrLen(bp->pname));
        !           715:    fprintf(stderr, " suspended ");
        !           716:    outimage(stderr, rval, 0);
        !           717:    putc('\n', stderr);
        !           718:    fflush(stderr);
        !           719:    }
        !           720: 
        !           721: /*
        !           722:  * atrace - procedure *bp is being resumed; produce a trace message.
        !           723:  */
        !           724: 
        !           725: atrace(bp)
        !           726: register struct b_proc *bp;
        !           727:    {
        !           728:    register int n;
        !           729: 
        !           730:    if (k_trace > 0)
        !           731:       k_trace--;
        !           732:    showline(bp->filename, line);
        !           733:    showlevel(k_level);
        !           734:    putstr(stderr, StrLoc(bp->pname), StrLen(bp->pname));
        !           735:    fprintf(stderr, " resumed");
        !           736:    putc('\n', stderr);
        !           737:    fflush(stderr);
        !           738:    }
        !           739: 
        !           740: /*
        !           741:  * showline - print file and line number information.
        !           742:  */
        !           743: static showline(f, l)
        !           744: char *f;
        !           745: int l;
        !           746:    {
        !           747:    if (l > 0)
        !           748:       fprintf(stderr, "%.10s: %d\t", f, l);
        !           749:    else
        !           750:       fprintf(stderr, "\t\t");
        !           751:    }
        !           752: 
        !           753: /*
        !           754:  * showlevel - print "| " n times.
        !           755:  */
        !           756: static showlevel(n)
        !           757: register int n;
        !           758:    {
        !           759:    while (n-- > 0) {
        !           760:       putc('|', stderr);
        !           761:       putc(' ', stderr);
        !           762:       }
        !           763:    }
        !           764: 
        !           765: 
        !           766: /*
        !           767:  * putpos - assign value to &pos
        !           768:  */
        !           769: 
        !           770: putpos(d1)
        !           771: struct descrip *d1;
        !           772:    {
        !           773:    register word l1;
        !           774:    long l2;
        !           775:    switch (cvint(d1, &l2)) {
        !           776: 
        !           777:       case T_Integer:
        !           778:          break;
        !           779: 
        !           780:       case T_Longint:
        !           781:          return NULL;
        !           782: 
        !           783:       default: runerr(101, d1);
        !           784:       }
        !           785: 
        !           786:    l1 = cvpos(l2, StrLen(k_subject));
        !           787:    if (l1 == 0)
        !           788:       return NULL;
        !           789:    k_pos = l1;
        !           790:    return 1;
        !           791:    }
        !           792: 
        !           793: 
        !           794: /*
        !           795:  * putran - assign value to &random
        !           796:  */
        !           797: 
        !           798: putran(d1)
        !           799: struct descrip *d1;
        !           800:    {
        !           801:    long l1;
        !           802:    switch (cvint(d1, &l1)) {
        !           803: 
        !           804:       case T_Integer:
        !           805:       case T_Longint:
        !           806:          break;
        !           807: 
        !           808:       default: runerr(101, d1);
        !           809:       }
        !           810: 
        !           811:    k_random = l1;
        !           812:    return 1;
        !           813:    }
        !           814: 
        !           815: 
        !           816: /*
        !           817:  * putsub - assign value to &subject
        !           818:  */
        !           819: 
        !           820: /* >putsub */
        !           821: putsub(dp)
        !           822: struct descrip *dp;
        !           823:    {
        !           824:    char sbuf[MaxCvtLen];
        !           825:    extern char *alcstr();
        !           826: 
        !           827:    switch (cvstr(dp, sbuf)) {
        !           828: 
        !           829:       case NULL:
        !           830:          runerr(103, dp);
        !           831: 
        !           832:       case Cvt:
        !           833:          strreq(StrLen(*dp));
        !           834:          StrLoc(*dp) = alcstr(StrLoc(*dp), StrLen(*dp));
        !           835: 
        !           836:       case NoCvt:
        !           837:          k_subject = *dp;
        !           838:          k_pos = 1;
        !           839:       }
        !           840: 
        !           841:    return 1;
        !           842:    }
        !           843: /* <putsub */
        !           844: 
        !           845: 
        !           846: /*
        !           847:  * puttrc - assign value to &trace
        !           848:  */
        !           849: 
        !           850: puttrc(d1)
        !           851: struct descrip *d1;
        !           852:    {
        !           853:    long l1;
        !           854:    switch (cvint(d1, &l1)) {
        !           855: 
        !           856:       case T_Integer:
        !           857:          k_trace = (int)l1;
        !           858:          break;
        !           859: 
        !           860:       case T_Longint:
        !           861:          k_trace = -1;
        !           862:          break;
        !           863: 
        !           864:       default: runerr(101, d1);
        !           865:       }
        !           866: 
        !           867:    return 1;
        !           868:    }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.