|
|
1.1 ! root 1: # include "ctlmod.h" ! 2: # include "pipes.h" ! 3: # include <resp.h> ! 4: # include <ingres.h> ! 5: # include <aux.h> ! 6: # include <tree.h> ! 7: # include <sccs.h> ! 8: ! 9: SCCSID(@(#)readinput.c 7.2 2/16/81) ! 10: ! 11: /* ! 12: ** READINPUT -- read the input pipe and determine next function ! 13: ** ! 14: ** The input pipe is read (using pb_get). Parameters are ! 15: ** collected and set up in the global Ctx.ctx_pv. *ppb ! 16: ** is set to the new function, block type, etc. ! 17: ** ! 18: ** If an error block is read, the error routine processing ! 19: ** is invoked. ! 20: ** ! 21: ** Parameters: ! 22: ** ppb -- a pointer to the pipe block to read into; ! 23: ** also becomes part of the return value. ! 24: ** ! 25: ** Returns: ! 26: ** nothing directly. ! 27: ** ! 28: ** Side Effects: ! 29: ** Sets Ctx.ctx_pv, Ctx.ctx_pc to the new parmv & ! 30: ** parmc read from the pipe. ! 31: ** Sets the *ppb struct to indicate state, etc. ! 32: ** ! 33: ** Trace Flags: ! 34: ** 10.0 - 10.5 ! 35: */ ! 36: ! 37: readinput(ppb) ! 38: register pb_t *ppb; ! 39: { ! 40: register int i; ! 41: ! 42: /* ! 43: ** Top Loop. ! 44: ** Executed once for each complete block read. Normally ! 45: ** only executed once, but can be more if an error ! 46: ** block is read. ! 47: ** ! 48: ** We mark Qbuf first, so we can free any parameters ! 49: ** when they are no longer needed (such as when they ! 50: ** are passed to another process). ! 51: */ ! 52: ! 53: Ctx.ctx_pmark = markbuf(Qbuf); ! 54: # ifdef xCTR1 ! 55: if (tTf(10, 0)) ! 56: lprintf("readinput: mark %d, errfn %x, ppb %x\n", Ctx.ctx_pmark, Ctx.ctx_errfn, ppb); ! 57: # endif ! 58: ! 59: for (;;) ! 60: { ! 61: /* prime the input (reads first block) */ ! 62: pb_prime(ppb, PB_NOTYPE); ! 63: # ifdef xCTR2 ! 64: if (tTf(10, 1)) ! 65: lprintf("readinput: type %d\n", ppb->pb_type); ! 66: # endif ! 67: ! 68: /* if this is a response block, return immediately */ ! 69: if (ppb->pb_type == PB_RESP) ! 70: { ! 71: i = pb_get(ppb, (char *) &Resp, sizeof Resp); ! 72: if (i != sizeof Resp) ! 73: syserr("readinput: Resp sz %d", i); ! 74: /* ! 75: read_arg(ppb, &Resp.resp_rval); ! 76: */ ! 77: break; ! 78: } ! 79: ! 80: /* ! 81: ** Parameter Loop. ! 82: ** Wander through and start reading parameters. ! 83: */ ! 84: ! 85: for (Ctx.ctx_pc = 0; Ctx.ctx_pc < PV_MAXPC; Ctx.ctx_pc++) ! 86: { ! 87: if (read_arg(ppb, &Ctx.ctx_pv[Ctx.ctx_pc]) == PV_EOF) ! 88: break; ! 89: } ! 90: ! 91: /* out of loop, check for vector overflow */ ! 92: if (Ctx.ctx_pc >= PV_MAXPC) ! 93: syserr("readinput: overflow"); ! 94: ! 95: /* check for error blocks */ ! 96: if (ppb->pb_type == PB_ERR) ! 97: { ! 98: proc_err(ppb, Ctx.ctx_pc, Ctx.ctx_pv); ! 99: syserr("readinput: proc_err"); ! 100: } ! 101: ! 102: ! 103: /* non-error block */ ! 104: # ifdef xCM_DEBUG ! 105: if (ppb->pb_type != PB_REG) ! 106: syserr("readinput: pb_type %d", ppb->pb_type); ! 107: # endif ! 108: Ctx.ctx_resp = ppb->pb_resp; ! 109: break; ! 110: } ! 111: # ifdef xCTR1 ! 112: if (tTf(10, 4)) ! 113: { ! 114: lprintf("readinput: "); ! 115: pb_dump(ppb, FALSE); ! 116: } ! 117: # endif ! 118: } ! 119: /* ! 120: ** READ_ARG -- Read a single argument from pipe ! 121: ** ! 122: ** An argument can be as simple as an integer, or as complex ! 123: ** as a query tree. ! 124: ** ! 125: ** Parameters: ! 126: ** ppb -- the pipe block to read from. ! 127: ** pparm -- the parameter descripter to put the ! 128: ** argument in. ! 129: ** ! 130: ** Returns: ! 131: ** none. ! 132: ** ! 133: ** Side Effects: ! 134: ** May allocate space from Qbuf for trees, etc. ! 135: ** ! 136: ** Called By: ! 137: ** readinput ! 138: ** ! 139: ** Trace Flags: ! 140: ** 10.6 - 10.7 ! 141: */ ! 142: ! 143: read_arg(ppb, pparm) ! 144: register pb_t *ppb; ! 145: register PARM *pparm; ! 146: { ! 147: auto char ptype; ! 148: auto short plen; ! 149: register int i; ! 150: register char *p; ! 151: QTREE *q; ! 152: extern char *need(); ! 153: extern QTREE *readqry(); ! 154: ! 155: /* get the parameter type */ ! 156: i = pb_get(ppb, &ptype, 1); ! 157: if (i == 0) ! 158: { ! 159: pparm->pv_type = PV_EOF; ! 160: pparm->pv_val.pv_str = NULL; ! 161: return (PV_EOF); ! 162: } ! 163: i = pb_get(ppb, (char *) &plen, 2); ! 164: if (i < 2) ! 165: syserr("readarg: pb_get %d", i); ! 166: ! 167: /* figure out the type */ ! 168: switch (ptype) ! 169: { ! 170: case PV_INT: ! 171: # ifdef xCM_DEBUG ! 172: if (plen != sizeof pparm->pv_val.pv_int) ! 173: syserr("readinput: PV_INT %d", plen); ! 174: # endif ! 175: pb_get(ppb, (char *) &pparm->pv_val.pv_int, plen); ! 176: break; ! 177: ! 178: case PV_STR: ! 179: case PV_TUPLE: ! 180: p = need(Qbuf, plen); ! 181: pb_get(ppb, p, plen); ! 182: pparm->pv_val.pv_str = p; ! 183: break; ! 184: ! 185: case PV_QTREE: ! 186: q = readqry(pb_get, (int) ppb, TRUE); ! 187: pparm->pv_val.pv_qtree = q; ! 188: break; ! 189: ! 190: case PV_EOF: ! 191: /* this case is allowed for the mon-par interface */ ! 192: break; ! 193: ! 194: default: ! 195: syserr("readinput: type %d len %d", ptype, plen); ! 196: } ! 197: ! 198: /* save the type & length */ ! 199: pparm->pv_type = ptype; ! 200: pparm->pv_len = plen; ! 201: ! 202: return (ptype); ! 203: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.