1: # include   <ingres.h>
   2: # include   "globs.h"
   3: # include   <sccs.h>
   4: 
   5: SCCSID(@(#)rnum.c	8.2	5/1/85)
   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: **	Find an existing rnum on a relation or add one.
  42: */
  43: 
  44: rnum_findadd(name)
  45: char    *name;
  46: {
  47:     register int    i;
  48: 
  49:     for (i = 0; i < FIRSTNUM; i++)
  50:         if (De.de_num_used[i]
  51:           && !bcmp(name, De.de_name_table[i], MAXNAME))
  52:             return(i);
  53:     return(rnum_assign(name));
  54: }
  55: /*
  56: **	Allocate the next available name
  57: */
  58: 
  59: rnum_alloc()
  60: {
  61:     register int    i;
  62:     register char   *cp;
  63: 
  64:     cp = &De.de_num_used[FIRSTNUM];
  65:     for (i = FIRSTNUM; i < LASTNUM; i++)
  66:         if (*cp++ == 0)
  67:         {
  68:             --cp;
  69:             (*cp)++;
  70:             return (i);
  71:         }
  72:     syserr("no free names");
  73:     return (-1);
  74: }
  75: /*
  76: **	Convert internal relation number
  77: **	to its real name. Guarantee '\0' at end.
  78: */
  79: 
  80: char *
  81: rnum_convert(num)
  82: int num;
  83: {
  84:     register int    i;
  85:     register char   *ret, *cp;
  86:     static char temp[MAXNAME+1];
  87:     extern char *Fileset;
  88:     extern char *concat();
  89: 
  90:     i = num;
  91:     if (i > LASTNUM || De.de_num_used[i] == 0)
  92:         syserr("no name for %d", i);
  93: 
  94:     ret = temp;
  95: 
  96:     if (i < FIRSTNUM)
  97:     {
  98:         bmove(De.de_name_table[i], ret, MAXNAME);
  99:     }
 100:     else
 101:     {
 102:         /* compute temp name */
 103:         i -= FIRSTNUM;
 104:         strcpy(temp, "_SYS");
 105:         temp[4] = i%26 + 'a';
 106:         temp[5] = i/26 + 'a';
 107:         temp[6] = '\0';
 108:         concat(temp, Fileset, temp);
 109:         pad(temp, MAXNAME);
 110:     }
 111:     return (ret);
 112: }
 113: /*
 114: **	Remove a num from the used list
 115: */
 116: 
 117: rnum_remove(num)
 118: int num;
 119: {
 120:     register char   *cp;
 121: 
 122:     cp = &De.de_num_used[num];
 123: 
 124:     if (*cp == 0)
 125:         syserr("cant remove %d", num);
 126:     *cp = 0;
 127: }
 128: /*
 129: **	returns number of largest assigned temp number.
 130: **	zero if none
 131: */
 132: 
 133: rnum_last()
 134: {
 135:     register int    i;
 136: 
 137:     for (i = LASTNUM - 1; i >= FIRSTNUM; i--)
 138:     {
 139:         if (De.de_num_used[i])
 140:         {
 141:             return (i);
 142:         }
 143:     }
 144: 
 145:     return (0);
 146: }
 147: /*
 148: **	Predicate to check whether rnum is a temporary relation or not
 149: */
 150: 
 151: rnum_temp(rnum)
 152: int rnum;
 153: {
 154:     register int    i;
 155: 
 156:     i = rnum;
 157: 
 158:     return (i >= FIRSTNUM || bequal("_SYS", rnum_convert(i), 4));
 159: }
 160: /*
 161: **	Clear tag fields from previous query
 162: */
 163: 
 164: rnum_init()
 165: {
 166:     register char   *cp;
 167:     register int    i;
 168: 
 169:     cp = De.de_num_used;
 170:     i = FIRSTNUM;
 171:     while (--i)
 172:         *cp++ = 0;
 173: }
Last modified: 1986-04-17
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 730
Valid CSS Valid XHTML 1.0 Strict