Annotation of researchv10no/cmd/pret/pret1.c, revision 1.1

1.1     ! root        1: #include <stdio.h>
        !             2: #include "pret.h"
        !             3: 
        !             4: #define LOOK   0
        !             5: #define ADD    1
        !             6: 
        !             7: struct QSET_EL {
        !             8:        char name[MAXNAME];             /* message name           */
        !             9:        char status;                    /* usage of this message  */
        !            10:        int id;                         /* number assigned to msg */
        !            11:        struct QSET_EL *nxtel;
        !            12: };
        !            13: 
        !            14: struct QSETS {
        !            15:        int nrelmnts;
        !            16:        int status;                     /* usage of the qset itself */
        !            17:        int qstatus;                    /* usage of the setowner (a queue) */
        !            18:        char setname[MAXNAME];          /* symbolic name */
        !            19:        char setowner[MAXNAME];         /* queue */
        !            20:        int qind;                       /* NONE if simple q, #expr if array */
        !            21:        struct QSET_EL *elmnts;
        !            22:        struct QSETS *nxtset;
        !            23:        int closed;
        !            24: };
        !            25: 
        !            26: struct QSETS *frstset;
        !            27: int nrsets = 0;
        !            28: 
        !            29: extern struct QTABLE qtable[NQUEUES];
        !            30: extern char procname[MAXNAME];
        !            31: extern char refname[MAXNAME];
        !            32: extern pid, rid;
        !            33: char *Emalloc();
        !            34: 
        !            35: isqset(str)
        !            36:        char *str;
        !            37: {      struct QSETS *q = frstset;
        !            38:        char buf1[MAXNAME], buf2[MAXNAME];
        !            39:        int i;
        !            40: 
        !            41:        buf1[0] = '\0';
        !            42:        if (pid != NONE)
        !            43:                strncpy(buf1, procname, 8);
        !            44:        else if (rid != NONE)
        !            45:                strncpy(buf1, refname, 8);
        !            46:        strcat(buf1, ":");
        !            47: 
        !            48:        strcpy(buf2, "global:");
        !            49:        strcat(buf1, str);
        !            50:        strcat(buf2, str);
        !            51: 
        !            52:        for (i = 0; i < nrsets; i++, q = q->nxtset)
        !            53:        {       if (strcmp(buf1, q->setname) == 0
        !            54:                ||  strcmp(buf2, q->setname) == 0)
        !            55:                        return 1;
        !            56:        }
        !            57:        return 0;
        !            58: }
        !            59: 
        !            60: struct QSETS *
        !            61: findset(which)
        !            62: {      struct QSETS *hook = frstset;
        !            63:        int i;
        !            64: 
        !            65:        if (which >= nrsets || which < 0)
        !            66:                whoops("cannot happen - findset");
        !            67: 
        !            68:        for (i = 0; i < which; i++)
        !            69:                hook = hook->nxtset;
        !            70: 
        !            71:        return hook;
        !            72: }
        !            73: 
        !            74: inqset(which, what, usage, qind)
        !            75:        char *what;
        !            76: {
        !            77:        struct QSETS   *hook  = findset(which);
        !            78:        struct QSET_EL *hookl = hook->elmnts;
        !            79:        int i;
        !            80: 
        !            81:        for (i = 0; i < hook->nrelmnts; i++)
        !            82:        {       if (strcmp(what, hookl->name) == 0)
        !            83:                {       hookl->status |= usage;
        !            84:                        if (hookl->id == -1)
        !            85:                                whoops("unnumbered parameter");
        !            86:                        if (qind != hook->qind)
        !            87:                                yyerror("queue indexing error, qset, %s", what);
        !            88:                        return hookl->id;
        !            89:                }
        !            90:                hookl = hookl->nxtel;
        !            91:        }
        !            92: 
        !            93:        return -1;
        !            94: }
        !            95: 
        !            96: renumqset(which, N)
        !            97: { struct QSETS * hook = findset(which);
        !            98:   struct QSET_EL * hookl = hook->elmnts;
        !            99:   int i, j;
        !           100: 
        !           101:        qsetowner(which, 0);
        !           102:        for (i = 0, j = N; i < hook->nrelmnts; i++)
        !           103:        {       hookl->id = j++;
        !           104:                hookl = hookl->nxtel;
        !           105:        }
        !           106:        return j;
        !           107: }
        !           108: 
        !           109: matchset(a, b)
        !           110: { struct QSETS * one = findset(a);
        !           111:   struct QSETS * two = findset(b);
        !           112:   struct QSET_EL * onel;
        !           113:   struct QSET_EL * twol;
        !           114:   int i;
        !           115: 
        !           116:        if (one->nrelmnts != two->nrelmnts)
        !           117:        {       yyerror("qset does not match formal parameter, %s", one->setname);
        !           118:                return;
        !           119:        }
        !           120:        onel = one->elmnts;
        !           121:        twol = two->elmnts;
        !           122: 
        !           123:        for (i = 0; i < one->nrelmnts; i++)
        !           124:        {       onel->status |= twol->status;
        !           125:                onel = onel->nxtel;
        !           126:                twol = twol->nxtel;
        !           127:        }
        !           128:        return two->qstatus;
        !           129: }
        !           130: 
        !           131: matchowner(a, str, how, qind)
        !           132:        char *str;
        !           133: { struct QSETS * hook = findset(a);
        !           134: 
        !           135:        if (strcmp(hook->setowner, str) == 0)
        !           136:        {       hook->qstatus |= how;
        !           137:                if (qind != hook->qind)
        !           138:                        yyerror("queue indexing error (qset ref), %s", str);
        !           139:                return 1;
        !           140:        }
        !           141:        return 0;
        !           142: }
        !           143: 
        !           144: struct QSET_EL *
        !           145: mkelmnt(str, how)
        !           146:        char *str;
        !           147: { struct QSET_EL *try = (struct QSET_EL *)
        !           148:                Emalloc( sizeof( struct QSET_EL ) );
        !           149: 
        !           150:        strcpy(try->name, str);
        !           151:        try->nxtel = NULL;
        !           152:        try->status = how;
        !           153:        try->id = -1;
        !           154: 
        !           155:        return try;
        !           156: }
        !           157: 
        !           158: struct QSETS *
        !           159: mkset(str1, str2, how, qind)
        !           160:        char *str1, *str2;
        !           161: { struct QSET_EL *hook;
        !           162:   struct QSETS *try = (struct QSETS *)
        !           163:                Emalloc( sizeof( struct QSETS ) );
        !           164: 
        !           165:        if (how == RFR)
        !           166:                yyerror("undeclared qset, %s", str1);
        !           167: 
        !           168:        try->status = how;
        !           169:        try->qstatus = 0;
        !           170:        try->nxtset = NULL;
        !           171:        strcpy(try->setname,  str1);
        !           172:        strcpy(try->setowner, str2);
        !           173:        try->closed = 0;
        !           174:        try->qind = qind;
        !           175: 
        !           176:        try->nrelmnts = 0;
        !           177:        try->elmnts = mkelmnt(" tau", SAR);
        !           178:        try->nrelmnts++;
        !           179: 
        !           180:        hook = try->elmnts;
        !           181:        hook->nxtel = mkelmnt(" any", SND);
        !           182:        try->nrelmnts++;
        !           183: 
        !           184:        nrsets++;
        !           185:        return try;
        !           186: }
        !           187: 
        !           188: qsetowner(which, how)
        !           189: {      struct QSETS *hook = findset(which);
        !           190:        return newqname(hook->setowner, how, NONE, hook->qind);
        !           191: }
        !           192: 
        !           193: inset(str, str2, mask, how, qind)
        !           194:        char *str, *str2;
        !           195: { struct QSETS *hook = frstset;
        !           196:   struct QSETS *last = frstset;
        !           197:   int i;
        !           198:        for (i = 0; i < nrsets && hook != NULL; i++)
        !           199:        {       if (strcmp(hook->setname, str) == 0)
        !           200:                {       if (mask == DCL)
        !           201:                                yyerror("qset redeclared, %s", str);
        !           202:                        hook->status |= mask;
        !           203:                        break;
        !           204:                }
        !           205:                last = hook;
        !           206:                hook = hook->nxtset;
        !           207:        }
        !           208:        if (how == ADD && i == nrsets)
        !           209:                last->nxtset = mkset(str, str2, mask, qind);
        !           210: 
        !           211:        return i;
        !           212: }
        !           213: 
        !           214: newqset(str1, str2, mask, qind)
        !           215:        char *str1, *str2;
        !           216: {
        !           217:        int i = nrsets;
        !           218:        char str[MAXNAME];
        !           219: 
        !           220:        if (pid != NONE)
        !           221:                strncpy(str, procname, 8);
        !           222:        else if (rid != NONE)
        !           223:                strncpy(str, refname, 8);
        !           224:        else
        !           225:                strcpy(str, "global");
        !           226:        strcat(str, ":");
        !           227:        strcat(str, str1);
        !           228: 
        !           229:        if (mask == RFR && (pid != NONE || rid != NONE))
        !           230:        {       if (inset(str, str2, mask, LOOK, qind) == nrsets)
        !           231:                {       strcpy(str, "global");
        !           232:                        strcat(str, ":");
        !           233:                        strcat(str, str1);
        !           234:        }       }
        !           235: 
        !           236:        if (nrsets == 0)
        !           237:                frstset = mkset(str, str2, mask, qind);
        !           238:        else
        !           239:                i = inset(str, str2, mask, ADD, qind);
        !           240: 
        !           241:        return i;
        !           242: }
        !           243: 
        !           244: closeqset(which)
        !           245: {      struct QSETS *where = findset(which);
        !           246:        where->closed = 1;
        !           247: }
        !           248: 
        !           249: isclosed(which)
        !           250: {      struct QSETS *where = findset(which);
        !           251:        return where->closed;
        !           252: }
        !           253: 
        !           254: addsetname(str, which, susp)
        !           255:        char *str;
        !           256: { struct QSETS   *where = findset(which);
        !           257:   struct QSET_EL *hook  = where->elmnts;
        !           258:   int i, j;
        !           259: 
        !           260:        j = newqname(where->setowner, 0, NONE, where->qind);
        !           261:        i = where->nrelmnts;
        !           262: 
        !           263:        if (i == 0)
        !           264:                where->elmnts = mkelmnt(str, 0);
        !           265:        else
        !           266:        {       for (i = 1; i < where->nrelmnts; i++)
        !           267:                        hook = hook->nxtel;
        !           268: 
        !           269:                hook->nxtel = mkelmnt(str, 0);
        !           270:        }
        !           271: 
        !           272:        /* if setowner is a formal parameter name
        !           273:         * the returned value `j' refers to the qset
        !           274:         * in which it was defined + an offset `MANY'
        !           275:         * if so, we must check that the message added
        !           276:         * here was also defined in the original set
        !           277:         */
        !           278: 
        !           279:        if (susp && j >= MANY && isclosed(j - MANY))    /* current set is open */
        !           280:                addmsg(str, j, 0, NORM, where->qind);   /* check validity msg  */
        !           281: 
        !           282:        where->nrelmnts++;
        !           283: 
        !           284:        return i;
        !           285: }
        !           286: 
        !           287: callist(which, hit)
        !           288: { int i, j;
        !           289:   struct QSETS   * hook = findset(which);
        !           290:   struct QSET_EL * kooh = hook->elmnts;
        !           291: 
        !           292:        for (i = 0; i < hook->nrelmnts; i++)
        !           293:        {       j = addmsg(kooh->name, hit, kooh->status, NORM, hook->qind);
        !           294:                callentry(ISM, j);
        !           295:                kooh = kooh->nxtel;
        !           296:        }
        !           297: }

unix.superglobalmegacorp.com

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