|
|
1.1 ! root 1: # include <useful.h> ! 2: # include <ingres.h> ! 3: # include <aux.h> ! 4: # include "IIglobals.h" ! 5: # include <sccs.h> ! 6: # include <errors.h> ! 7: ! 8: SCCSID(@(#)IIreadinp.c 8.2 2/8/85) ! 9: ! 10: ! 11: static char IInbuf[70]; ! 12: static char *IInb_free; ! 13: ! 14: char * ! 15: IIneed(i) ! 16: register i; ! 17: { ! 18: register char *p; ! 19: ! 20: p = IInb_free; ! 21: if (IInb_free + i - IInbuf >= sizeof IInbuf) ! 22: IIsyserr("Error param overflow"); ! 23: IInb_free += i; ! 24: return (p); ! 25: } ! 26: ! 27: IInd_init() ! 28: { ! 29: IInb_free = IInbuf; ! 30: } ! 31: ! 32: /* ! 33: ** IIREADINPUT -- read the input pipe ! 34: ** ! 35: ** The input pipe is read (using pb_get). Parameters are ! 36: ** collected and set up in the global IIerr_pv. ! 37: ** ! 38: ** If an error block is read, the error routine processing ! 39: ** is invoked. ! 40: ** ! 41: ** Parameters: ! 42: ** ppb -- a pointer to the pipe block to read into; ! 43: ** also becomes part of the return value. ! 44: ** ! 45: ** Returns: ! 46: ** ! 47: ** Requires: ! 48: ** pb_prime, pb_get -- to read from the pipe. ! 49: ** IIneed -- to get space to store things ! 50: ** from the pipe. ! 51: ** ! 52: ** History: ! 53: ** 8/21/79 (eric) -- written. ! 54: */ ! 55: ! 56: IIreadinput(ppb) ! 57: register pb_t *ppb; ! 58: { ! 59: register int i; ! 60: int pc; ! 61: char *pv[20]; ! 62: auto int eno; ! 63: ! 64: /* if this is a response block, return immediately */ ! 65: if (ppb->pb_type == PB_RESP) ! 66: { ! 67: i = IIpb_get(ppb, &IIresp, sizeof IIresp); ! 68: if (i != sizeof IIresp) ! 69: IIsyserr("readinput: IIresp sz %d", i); ! 70: IItupcnt = IIresp.resp_tups; ! 71: } ! 72: ! 73: /* ! 74: ** Parameter Loop. ! 75: ** Wander through and start reading parameters. ! 76: */ ! 77: ! 78: IInd_init(); ! 79: for (pc = 0 ; pc < PV_MAXPC; pc++) ! 80: { ! 81: if (IIread_arg(ppb, &pv[pc]) == PV_EOF) ! 82: break; ! 83: } ! 84: ! 85: /* out of loop, check for vector overflow */ ! 86: if (pc >= sizeof pv / sizeof pv[0]) ! 87: IIsyserr("readinput: overflow"); ! 88: ! 89: /* check for error blocks */ ! 90: if (ppb->pb_type == PB_ERR) ! 91: { ! 92: IIatoi(pv[0], &eno); ! 93: IIerror(eno, pc - 1, &pv[1]); ! 94: } ! 95: } ! 96: /* ! 97: ** IIREAD_ARG -- Read a single argument from pipe ! 98: ** ! 99: ** An argument can be as simple as an integer, or as complex ! 100: ** as a query tree. ! 101: ** ! 102: ** Parameters: ! 103: ** ppb -- the pipe block to read from. ! 104: ** pparm -- the parameter descripter to put the ! 105: ** argument in. ! 106: ** ! 107: ** Returns: ! 108: ** PV_EOF -- if last arg read ! 109: ** ! 110: ** Side Effects: ! 111: ** May allocate space from Qbuf for trees, etc. ! 112: ** ! 113: ** Requires: ! 114: ** pb_get ! 115: ** syserr ! 116: ** need ! 117: ** readqtree ! 118: ** ! 119: ** Called By: ! 120: ** readinput ! 121: ** ! 122: ** Trace Flags: ! 123: ** 10.6 - 10.7 ! 124: */ ! 125: ! 126: IIread_arg(ppb, parm) ! 127: register pb_t *ppb; ! 128: char **parm; ! 129: { ! 130: char buf[20]; ! 131: auto char ptype; ! 132: auto short plen; ! 133: register int i; ! 134: register char *p; ! 135: char *ib; ! 136: int j; ! 137: char *IIneed(); ! 138: char *IIitos(); ! 139: ! 140: /* get the parameter type */ ! 141: i = IIpb_get(ppb, &ptype, 1); ! 142: if (i == 0) ! 143: { ! 144: return (PV_EOF); ! 145: } ! 146: i = IIpb_get(ppb, &plen, 2); ! 147: if (i < 2) ! 148: IIsyserr("readarg: pb_get %d", i); ! 149: ! 150: /* figure out the type */ ! 151: switch (ptype) ! 152: { ! 153: case PV_INT: ! 154: IIpb_get(ppb, &j, plen); ! 155: ib = IIitos(j); ! 156: p = IIneed(j = IIlength(ib) + 1); ! 157: IIbmove(ib, p, j); ! 158: break; ! 159: ! 160: case PV_STR: ! 161: p = IIneed(plen + 1); ! 162: IIpb_get(ppb, p, plen); ! 163: p[plen] = 0; ! 164: break; ! 165: ! 166: default: ! 167: IIsyserr("readinput: type %d len %d", ptype, plen); ! 168: } ! 169: *parm = p; ! 170: return (ptype); ! 171: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.