2.11BSD/ingres/source/decomp/rnum.c
# include "../ingres.h"
# include "decomp.h"
# define FIRSTNUM MAXRANGE + 3
# define LASTNUM 100
/*
** Internal numbers are used in decomp to
** represent relation names. The numbers
** from 0 to FIRSTNUM-1 refer to the names
** stored in Name_table[].
**
** The number from FIRSTNUM to LASTNUM have
** names which are computed from aa, ab, etc.
*/
char Name_table[FIRSTNUM-1][MAXNAME];
char Num_used[LASTNUM+1];
rnum_assign(name)
char *name;
/*
** Assign an internal number rnum to name.
*/
{
register int i;
for (i = 0; i < FIRSTNUM; i++)
if (Num_used[i] == 0)
{
bmove(name, Name_table[i], MAXNAME);
Num_used[i]++;
return (i);
}
syserr("rnum_assign:no room");
}
rnum_alloc()
/*
** Allocate the next available name
*/
{
register int i;
register char *cp;
cp = &Num_used[FIRSTNUM];
for (i = FIRSTNUM; i < LASTNUM; i++)
if (*cp++ == 0)
{
--cp;
(*cp)++;
return (i);
}
syserr("no free names");
}
char *rnum_convert(num)
int num;
/*
** Convert internal relation number
** to its real name. Guarantee '\0' at end.
*/
{
register int i;
register char *ret, *cp;
static char temp[MAXNAME+1];
extern char *Fileset;
extern char *concat();
i = num;
if (i > LASTNUM || Num_used[i] == 0)
syserr("no name for %d", i);
ret = temp;
if (i < FIRSTNUM)
{
bmove(Name_table[i], ret, MAXNAME);
}
else
{
/* compute temp name */
cp = concat("_SYS", Fileset, ret);
pad(ret, MAXNAME);
i -= FIRSTNUM;
*cp++ = i/26 + 'a';
*cp = i%26 + 'a';
}
return (ret);
}
rnum_remove(num)
int num;
/*
** Remove a num from the used list
*/
{
register int i;
register char *cp;
cp = &Num_used[num];
if (*cp == 0)
syserr("cant remove %d", num);
*cp = 0;
}
rnum_last()
/*
** returns number of largest assigned temp number.
** zero if none
*/
{
register int i;
register char *cp;
for (i = LASTNUM; i >= FIRSTNUM; i--)
if (Num_used[i])
return (i);
return (0);
}
rnum_temp(rnum)
int rnum;
/*
** Predicate to check whether rnum is a temporary relation or not
*/
{
register int i;
i = rnum;
return (i >= FIRSTNUM || bequal("_SYS", rnum_convert(i), 4));
}
rnum_init()
/*
** Clear tag fields from previous query
*/
{
register char *cp;
register int i;
cp = Num_used;
i = FIRSTNUM;
while (--i)
*cp++ = 0;
}