|
|
1.1 ! root 1: # include <ingres.h> ! 2: # include "globs.h" ! 3: # include <sccs.h> ! 4: ! 5: SCCSID(@(#)rnum.c 7.1 2/5/81) ! 6: ! 7: ! 8: /* ! 9: ** Internal numbers are used in decomp to ! 10: ** represent relation names. The numbers ! 11: ** from 0 to FIRSTNUM-1 refer to the names ! 12: ** stored in De.de_name_table[]. ! 13: ** ! 14: ** The number from FIRSTNUM to LASTNUM have ! 15: ** names which are computed from aa, ab, etc. ! 16: */ ! 17: ! 18: ! 19: ! 20: ! 21: /* ! 22: ** Assign an internal number rnum to name. ! 23: */ ! 24: ! 25: rnum_assign(name) ! 26: char *name; ! 27: { ! 28: register int i; ! 29: ! 30: for (i = 0; i < FIRSTNUM; i++) ! 31: if (De.de_num_used[i] == 0) ! 32: { ! 33: bmove(name, De.de_name_table[i], MAXNAME); ! 34: De.de_num_used[i]++; ! 35: return (i); ! 36: } ! 37: syserr("rnum_assign:no room"); ! 38: return (-1); ! 39: } ! 40: /* ! 41: ** Allocate the next available name ! 42: */ ! 43: ! 44: rnum_alloc() ! 45: { ! 46: register int i; ! 47: register char *cp; ! 48: ! 49: cp = &De.de_num_used[FIRSTNUM]; ! 50: for (i = FIRSTNUM; i < LASTNUM; i++) ! 51: if (*cp++ == 0) ! 52: { ! 53: --cp; ! 54: (*cp)++; ! 55: return (i); ! 56: } ! 57: syserr("no free names"); ! 58: return (-1); ! 59: } ! 60: /* ! 61: ** Convert internal relation number ! 62: ** to its real name. Guarantee '\0' at end. ! 63: */ ! 64: ! 65: char * ! 66: rnum_convert(num) ! 67: int num; ! 68: { ! 69: register int i; ! 70: register char *ret, *cp; ! 71: static char temp[MAXNAME+1]; ! 72: extern char *Fileset; ! 73: extern char *concat(); ! 74: ! 75: i = num; ! 76: if (i > LASTNUM || De.de_num_used[i] == 0) ! 77: syserr("no name for %d", i); ! 78: ! 79: ret = temp; ! 80: ! 81: if (i < FIRSTNUM) ! 82: { ! 83: bmove(De.de_name_table[i], ret, MAXNAME); ! 84: } ! 85: else ! 86: { ! 87: /* compute temp name */ ! 88: cp = concat("_SYS", Fileset, ret); ! 89: pad(ret, MAXNAME); ! 90: i -= FIRSTNUM; ! 91: *cp++ = i/26 + 'a'; ! 92: *cp = i%26 + 'a'; ! 93: } ! 94: return (ret); ! 95: } ! 96: /* ! 97: ** Remove a num from the used list ! 98: */ ! 99: ! 100: rnum_remove(num) ! 101: int num; ! 102: { ! 103: register char *cp; ! 104: ! 105: cp = &De.de_num_used[num]; ! 106: ! 107: if (*cp == 0) ! 108: syserr("cant remove %d", num); ! 109: *cp = 0; ! 110: } ! 111: /* ! 112: ** returns number of largest assigned temp number. ! 113: ** zero if none ! 114: */ ! 115: ! 116: rnum_last() ! 117: { ! 118: register int i; ! 119: ! 120: for (i = LASTNUM - 1; i >= FIRSTNUM; i--) ! 121: { ! 122: if (De.de_num_used[i]) ! 123: { ! 124: return (i); ! 125: } ! 126: } ! 127: ! 128: return (0); ! 129: } ! 130: /* ! 131: ** Predicate to check whether rnum is a temporary relation or not ! 132: */ ! 133: ! 134: rnum_temp(rnum) ! 135: int rnum; ! 136: { ! 137: register int i; ! 138: ! 139: i = rnum; ! 140: ! 141: return (i >= FIRSTNUM || bequal("_SYS", rnum_convert(i), 4)); ! 142: } ! 143: /* ! 144: ** Clear tag fields from previous query ! 145: */ ! 146: ! 147: rnum_init() ! 148: { ! 149: register char *cp; ! 150: register int i; ! 151: ! 152: cp = De.de_num_used; ! 153: i = FIRSTNUM; ! 154: while (--i) ! 155: *cp++ = 0; ! 156: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.