|
|
1.1 ! root 1: # include <ingres.h> ! 2: # include <access.h> ! 3: # include <symbol.h> ! 4: # include <sccs.h> ! 5: ! 6: SCCSID(@(#)get_tuple.c 7.1 2/5/81) ! 7: ! 8: /* ! 9: ** Routine associated with getting a tuple out of ! 10: ** the current buffer. ! 11: */ ! 12: ! 13: ! 14: /* ! 15: ** Get_tuple - take the tuple specified ! 16: ** by tid and move it to "tuple" ! 17: */ ! 18: ! 19: get_tuple(d, tid, tuple) ! 20: register DESC *d; ! 21: TID *tid; ! 22: char *tuple; ! 23: { ! 24: register char *cp; ! 25: char *get_addr(); ! 26: ! 27: cp = get_addr(tid); ! 28: ! 29: if (d->reldum.relspec < 0) ! 30: uncomp_tup(d, cp, tuple); /* compressed tuple */ ! 31: else ! 32: bmove(cp, tuple, d->reldum.relwid); /* uncompressed tuple */ ! 33: } ! 34: /* ! 35: ** Getint_tuple - get the tuple specified by ! 36: ** tid. If possible avoid moving the tuple. ! 37: ** Return value is address of tuple. ! 38: */ ! 39: ! 40: char * ! 41: getint_tuple(d, tid, tuple) ! 42: register DESC *d; ! 43: TID *tid; ! 44: char *tuple; ! 45: { ! 46: register char *cp, *ret; ! 47: extern char *get_addr(); ! 48: ! 49: cp = get_addr(tid); ! 50: ! 51: if (d->reldum.relspec < 0) ! 52: { ! 53: ret = tuple; ! 54: uncomp_tup(d, cp, ret); /* compressed tuple */ ! 55: } ! 56: else ! 57: ret = cp; /* uncompressed tuple */ ! 58: return (ret); ! 59: } ! 60: /* ! 61: ** Routine to compute the address of a tuple ! 62: ** within the current buffer. ! 63: ** Syserr if specified tuple deleted. ! 64: */ ! 65: ! 66: char * ! 67: get_addr(tid) ! 68: register TID *tid; ! 69: { ! 70: register int offset; ! 71: ! 72: offset = Acc_head->linetab[-(tid->line_id & I1MASK)]; ! 73: if (offset == 0) ! 74: { ! 75: syserr("get_addr rel=%ld tid=%ld", Acc_head->rel_tupid, *(long *)tid); ! 76: } ! 77: # ifdef xATR3 ! 78: if (offset < 0 || offset > PGSIZE) ! 79: syserr("get_addr: offset=%d\n"); ! 80: # endif ! 81: return (((char *) Acc_head) + offset); ! 82: } ! 83: /* ! 84: ** Uncompress - decompress the tuple at address cp ! 85: ** according to descriptor. ! 86: */ ! 87: ! 88: uncomp_tup(d, cp, tuple) ! 89: register DESC *d; ! 90: char *cp; ! 91: char *tuple; ! 92: { ! 93: register char *src, *dst; ! 94: int i, j; ! 95: ! 96: dst = tuple; ! 97: src = cp; ! 98: ! 99: /* for each domain, copy and blank pad if char */ ! 100: for (i = 1; i <= d->reldum.relatts; i++) ! 101: { ! 102: j = d->relfrml[i] & I1MASK; ! 103: if (d->relfrmt[i] == CHAR) ! 104: { ! 105: while (j--) ! 106: { ! 107: if ((*dst++ = *src++) == NULL) ! 108: { ! 109: /* back up one */ ! 110: dst--; ! 111: j++; ! 112: break; ! 113: } ! 114: } ! 115: ! 116: /* blank pad if necessary */ ! 117: while (j-- > 0) ! 118: *dst++ = ' '; ! 119: } ! 120: else ! 121: { ! 122: while (j--) ! 123: *dst++ = *src++; ! 124: } ! 125: } ! 126: } ! 127: /* ! 128: ** Check if a line number is valid. ! 129: ** If linenumber is illegal return AMINVL_ERR ! 130: ** if Line has been deleted return 2 ! 131: ** else return 0 ! 132: */ ! 133: ! 134: invalid(tid) ! 135: register TID *tid; ! 136: { ! 137: register int i; ! 138: ! 139: i = tid->line_id & I1MASK; ! 140: ! 141: if (i >= Acc_head->nxtlino) ! 142: return (acc_err(AMINVL_ERR)); ! 143: ! 144: if (Acc_head->linetab[-i] == 0) ! 145: return (2); ! 146: ! 147: return (0); ! 148: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.