Annotation of researchv10dc/cmd/icon/src/iconx/lmisc.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * File: lmisc.c
                      3:  *  Contents: create, keywd, limit, llist
                      4:  */
                      5: 
                      6: #include "../h/rt.h"
                      7: #include "../h/keyword.h"
                      8: #include "../h/version.h"
                      9: 
                     10: #ifndef VMS
                     11: #ifndef MSDOS
                     12: #include <sys/types.h>
                     13: #include <sys/times.h>
                     14: #include SysTime
                     15: #else MSDOS
                     16: 
                     17: #ifdef LATTICE
                     18: #include <time.h>
                     19: #endif LATTICE
                     20: #ifdef MSoft
                     21: #include <sys/types.h>
                     22: #include <time.h>
                     23: #endif MSoft
                     24: #endif MSDOS
                     25: 
                     26: #else VMS
                     27: #include <types.h>
                     28: #include <time.h>
                     29: struct tms {
                     30:     time_t    tms_utime;       /* user time */
                     31:     time_t    tms_stime;       /* system time */
                     32:     time_t    tms_cutime;      /* user time, children */
                     33:     time_t    tms_cstime;      /* system time, children */
                     34: };
                     35: #endif VMS
                     36: 
                     37: /*
                     38:  * create - return an entry block for a co-expression.
                     39:  */
                     40: 
                     41: OpBlock(create, 1, "create", 0)
                     42: 
                     43: create(entryp, cargp)
                     44: word *entryp;
                     45: register struct descrip *cargp;
                     46:    {
                     47:    register struct b_coexpr *sblkp;
                     48:    register struct b_refresh *rblkp;
                     49:    register struct descrip *dp, *ndp, *dsp;
                     50:    register word *newsp;
                     51:    int na, nl, i;
                     52:    struct b_proc *cproc;
                     53:    extern struct b_coexpr *alcstk();
                     54:    extern struct b_refresh *alceblk();
                     55: 
                     56:    /*
                     57:     * Get a new co-expression stack and initialize.
                     58:     */
                     59:    sblkp = alcstk();
                     60:    sblkp->activator = nulldesc;
                     61:    sblkp->size = 0;
                     62:    sblkp->nextstk = stklist;
                     63:    stklist = sblkp;
                     64:    /*
                     65:     * Icon stack starts at word after co-expression stack block.  C stack
                     66:     *  starts at end of stack region on machines with down-growing C stacks
                     67:     *  and somewhere in the middle of the region.
                     68:     *
                     69:     * The C stack is aligned on a doubleword boundary. For upgrowing
                     70:     *  stacks, the C stack starts in the middle of the stack portion
                     71:     *  of the static block.  For downgrowing stacks, the C stack starts
                     72:     *  at the end of the static block.
                     73:     */
                     74:    newsp = (word *)((char *)sblkp + sizeof(struct b_coexpr));
                     75: #ifdef UpStack
                     76:    sblkp->cstate[0] =
                     77:       ((word)((char *)sblkp + (stksize - sizeof(*sblkp))/2)
                     78:        &~(WordSize*2-1));
                     79: #else
                     80:    sblkp->cstate[0] =
                     81:        ((word)((char *)sblkp + stksize - WordSize)&~(WordSize*2-1));
                     82: #endif UpStack
                     83:    sblkp->es_argp = (struct descrip *)newsp;
                     84:    /*
                     85:     * Calculate number of arguments and number of local variables.
                     86:     *  na is nargs + 1 to include Arg0.
                     87:     */
                     88:    na = pfp->pf_nargs + 1;
                     89:    cproc = (struct b_proc *)BlkLoc(argp[0]);
                     90:    nl = cproc->ndynam;
                     91: 
                     92:    /*
                     93:     * Get a refresh block for the new co-expression.
                     94:     */
                     95:    blkreq((word)sizeof(struct b_refresh) + (na + nl) * sizeof(struct descrip));
                     96:    rblkp = alceblk(entryp, na, nl);
                     97:    sblkp->freshblk.dword = D_Refresh;
                     98:    BlkLoc(sblkp->freshblk) = (union block *) rblkp;
                     99: 
                    100:    /*
                    101:     * Copy current procedure frame marker into refresh block.
                    102:     */
                    103:    rblkp->pfmkr = *pfp;
                    104:    rblkp->pfmkr.pf_pfp = 0;
                    105: 
                    106:    /*
                    107:     * Copy arguments into refresh block and onto new stack.
                    108:     */
                    109:    dp = &argp[0];
                    110:    ndp = &rblkp->elems[0];
                    111:    dsp = (struct descrip *)newsp;
                    112:    for (i = 1; i <= na; i++) {
                    113:       *dsp++ = *dp;
                    114:       *ndp++ = *dp++;
                    115:       }
                    116: 
                    117:    /*
                    118:     * Copy procedure frame to new stack and point dsp to word after frame.
                    119:     */
                    120:    *((struct pf_marker *)dsp) = *pfp;
                    121:    sblkp->es_pfp = (struct pf_marker *)dsp;
                    122:    sblkp->es_pfp->pf_pfp = 0;
                    123:    dsp = (struct descrip *)((word *)dsp + Vwsizeof(*pfp));
                    124:    sblkp->es_ipc = entryp;
                    125:    sblkp->es_gfp = 0;
                    126:    sblkp->es_efp = 0;
                    127:    sblkp->es_ilevel = 0;
                    128:    sblkp->tvalloc = NULL;
                    129: 
                    130:    /*
                    131:     * Copy locals to new stack and refresh block.
                    132:     */
                    133:    dp = &(pfp->pf_locals)[0];
                    134:    for (i = 1; i <= nl; i++) {
                    135:       *dsp++ = *dp;
                    136:       *ndp++ = *dp++;
                    137:       }
                    138:    /*
                    139:     * Push two null descriptors on the stack.
                    140:     */
                    141:    *dsp++ = nulldesc;
                    142:    *dsp++ = nulldesc;
                    143: 
                    144:    sblkp->es_sp = (word *)dsp - 1;
                    145: 
                    146:    /*
                    147:     * Establish line and file values and clear location for transmitted value.
                    148:     */
                    149:    sblkp->es_line = line;
                    150: 
                    151:    /*
                    152:     * Return the new co-expression.
                    153:     */
                    154:    Arg0.dword = D_Coexpr;
                    155:    BlkLoc(Arg0) = (union block *) sblkp;
                    156:    Return;
                    157:    }
                    158: 
                    159: static char *day[] = {
                    160:    "Sunday", "Monday", "Tuesday", "Wednesday",
                    161:    "Thursday", "Friday", "Saturday"
                    162:    };
                    163: 
                    164: static char *month[] = {
                    165:    "January", "February", "March", "April", "May", "June",
                    166:    "July", "August", "September", "October", "November", "December"
                    167:    };
                    168: 
                    169: /*
                    170:  * keywd - process keyword.
                    171:  */
                    172: 
                    173: LibDcl(keywd,0,"&keywd")
                    174:    {
                    175:    register int hour;
                    176:    register word i;
                    177:    register char *merid;
                    178:    char sbuf[MaxCvtLen];
                    179:    struct tm *tbuf, *localtime();
                    180: #ifndef MSDOS
                    181:    struct tms tp;
                    182: #endif MSDOS
                    183:    long time();
                    184:    long clock, runtim;
                    185:    char *alcstr();
                    186: 
                    187:    /*
                    188:     * This is just plug and chug code. For whatever keyword is desired,
                    189:     *  the appropriate value is dug out of the system and made into
                    190:     *  a suitable Icon value.
                    191:     *
                    192:     * A few special cases are worth noting:
                    193:     *  &pos, &random, &trace - built-in trapped variables are returned
                    194:     */
                    195:    switch (IntVal(Arg0)) {
                    196:       case K_ASCII:
                    197:         Arg0.dword = D_Cset;
                    198:         BlkLoc(Arg0) = (union block *) &k_ascii;
                    199:         break;
                    200:       case K_CLOCK:
                    201:         strreq((word)8);
                    202:         time(&clock);
                    203:         tbuf = localtime(&clock);
                    204:         sprintf(sbuf,"%02d:%02d:%02d",tbuf->tm_hour,tbuf->tm_min,tbuf->tm_sec);
                    205:         StrLen(Arg0) = 8;
                    206:         StrLoc(Arg0) = alcstr(sbuf,(word)8);
                    207:         break;
                    208:       case K_CSET:
                    209:         Arg0.dword = D_Cset;
                    210:         BlkLoc(Arg0) = (union block *) &k_cset;
                    211:         break;
                    212:       case K_DATE:
                    213:         strreq((word)10);
                    214:         time(&clock);
                    215:         tbuf = localtime(&clock);
                    216:         sprintf(sbuf, "%04d/%02d/%02d",
                    217:                      (tbuf->tm_year)+1900,tbuf->tm_mon+1,tbuf->tm_mday);
                    218:         StrLen(Arg0) = 10;
                    219:         StrLoc(Arg0) = alcstr(sbuf,(word)10);
                    220:         break;
                    221:       case K_DATELINE:
                    222:         time(&clock);
                    223:         tbuf = localtime(&clock);
                    224:         if ((hour = tbuf->tm_hour) >= 12) {
                    225:            merid = "pm";
                    226:            if (hour > 12)
                    227:               hour -= 12;
                    228:            }
                    229:         else {
                    230:            merid = "am";
                    231:            if (hour < 1)
                    232:               hour += 12;
                    233:            }
                    234:         sprintf(sbuf, "%s, %s %d, %d  %d:%02d %s",
                    235:                 day[tbuf->tm_wday], month[tbuf->tm_mon], tbuf->tm_mday,
                    236:                 1900 + tbuf->tm_year, hour, tbuf->tm_min, merid);
                    237:         strreq(i = strlen(sbuf));
                    238:         StrLen(Arg0) = i;
                    239:         StrLoc(Arg0) = alcstr(sbuf, i);
                    240:         break;
                    241:       case K_ERROUT:
                    242:         Arg0.dword = D_File;
                    243:         BlkLoc(Arg0) = (union block *) &k_errout;
                    244:         break;
                    245:       case K_HOST:
                    246:         iconhost(sbuf);
                    247:         strreq(i = strlen(sbuf));
                    248:         StrLen(Arg0) = i;
                    249:         StrLoc(Arg0) = alcstr(sbuf, i);
                    250:         break;
                    251:       case K_INPUT:
                    252:         Arg0.dword = D_File;
                    253:         BlkLoc(Arg0) = (union block *) &k_input;
                    254:         break;
                    255:       case K_LCASE:
                    256:         Arg0.dword = D_Cset;
                    257:         BlkLoc(Arg0) = (union block *) &k_lcase;
                    258:         break;
                    259:       case K_LEVEL:
                    260:         Arg0.dword = D_Integer;
                    261:         IntVal(Arg0) = k_level;
                    262:         break;
                    263:       case K_MAIN:
                    264:         Arg0 = k_main;
                    265:         break;
                    266:       case K_OUTPUT:
                    267:         Arg0.dword = D_File;
                    268:         BlkLoc(Arg0) = (union block *) &k_output;
                    269:         break;
                    270:       case K_POS:
                    271:         Arg0.dword = D_Tvkywd;
                    272:         BlkLoc(Arg0) = (union block *) &tvky_pos;
                    273:         break;
                    274:       case K_RANDOM:
                    275:         Arg0.dword = D_Tvkywd;
                    276:         BlkLoc(Arg0) = (union block *) &tvky_ran;
                    277:         break;
                    278:       case K_SOURCE:
                    279:         Arg0 = BlkLoc(current)->coexpr.activator;
                    280:         break;
                    281:       case K_SUBJECT:
                    282:         Arg0.dword = D_Tvkywd;
                    283:         BlkLoc(Arg0) = (union block *) &tvky_sub;
                    284:         break;
                    285:       case K_TIME:
                    286: #ifndef MSDOS
                    287:         times(&tp);
                    288:         runtim =
                    289:           1000 * ((tp.tms_utime - starttime) / (double)Hz);
                    290: #else MSDOS
                    291:         runtim = time() - starttime;
                    292: #endif MSDOS
                    293:         Mkint(runtim, &Arg0);
                    294:         break;
                    295:       case K_TRACE:
                    296:         Arg0.dword = D_Tvkywd;
                    297:         BlkLoc(Arg0) = (union block *) &tvky_trc;
                    298:         break;
                    299:       case K_UCASE:
                    300:         Arg0.dword = D_Cset;
                    301:         BlkLoc(Arg0) = (union block *) &k_ucase;
                    302:         break;
                    303:       case K_VERSION:
                    304:         strreq(i = strlen(VERSION));
                    305:         StrLen(Arg0) = i;
                    306:         StrLoc(Arg0) = VERSION;
                    307:         break;
                    308:       default:
                    309:         syserr("keyword: unknown keyword type.");
                    310:       }
                    311:    Return;
                    312:    }
                    313: 
                    314: 
                    315: /*
                    316:  * limit - explicit limitation initialization.
                    317:  */
                    318: 
                    319: LibDcl(limit,0,"limit")
                    320:    {
                    321:    long l;
                    322: 
                    323:    /*
                    324:     * The limit is both passed and returned in Arg0.  The limit must
                    325:     *  be an integer.  If the limit is 0, the expression being evaluated
                    326:     *  fails.  If the limit is < 0, it is an error.  Note that the
                    327:     *  result produced by limit is ultimately picked up by the lsusp
                    328:     *  function.
                    329:     */
                    330:    DeRef(Arg0);
                    331:    switch (cvint(&Arg0, &l)) {
                    332: 
                    333:       case T_Integer:
                    334:          Mkint(l, &Arg0);
                    335:          break;
                    336: 
                    337:       case T_Longint:
                    338:          runerr(205, &Arg0);
                    339: 
                    340:       default:
                    341:          runerr(101, &Arg0);
                    342:       }
                    343: 
                    344:    if (l < 0)
                    345:       runerr(205, &Arg0);
                    346:    if (l == 0)
                    347:       Fail;
                    348:    Return;
                    349:    }
                    350: 
                    351: 
                    352: /*
                    353:  * [ ... ] - create an explicitly specified list.
                    354:  */
                    355: 
                    356: LibDcl(llist,-1,"[...]")
                    357:    {
                    358:    register word i;
                    359:    register struct b_list *hp;
                    360:    register struct b_lelem *bp;
                    361:    extern struct b_list *alclist();
                    362:    extern struct b_lelem *alclstb();
                    363:    word nelem;
                    364: 
                    365:    /*
                    366:     * Round the number of elements in the list (as indicated by nargs)
                    367:     *  up to MinListSlots and ensure space for the list.
                    368:     */
                    369:    nelem = nargs;
                    370:    if (nelem < MinListSlots)
                    371:       nelem = MinListSlots;
                    372:    blkreq((word)sizeof(struct b_list) + sizeof(struct b_lelem) +
                    373:         nelem * sizeof(struct descrip));
                    374: 
                    375:    /*
                    376:     * Allocate the list and a list block.
                    377:     */
                    378:    hp = alclist((word)nargs);
                    379:    bp = alclstb(nelem, (word)0, (word)nargs);
                    380: 
                    381:    /*
                    382:     * Make the list block just allocated into the first and last blocks
                    383:     *  for the list.
                    384:     */
                    385:    hp->listhead.dword = hp->listtail.dword = D_Lelem;
                    386:    BlkLoc(hp->listhead) = BlkLoc(hp->listtail) = (union block *) bp;
                    387:    /*
                    388:     * Dereference each argument in turn and assign it to a list element.
                    389:     */
                    390:    for (i = 1; i <= nargs; i++) {
                    391:       DeRef(Arg(i));
                    392:       bp->lslots[i-1] = Arg(i);
                    393:       }
                    394:    /*
                    395:     * Point Arg0 at the new list and return it.
                    396:     */
                    397:    ArgType(0) = D_List;
                    398:    Arg(0).vword.bptr = (union block *)hp;
                    399:    Return;
                    400:    }

unix.superglobalmegacorp.com

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