|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.