This commit is contained in:
Oliver Lehmann 1989-12-07 09:44:22 +00:00
parent 36d584e2bc
commit 8fb09fec93
1 changed files with 440 additions and 0 deletions

View File

@ -0,0 +1,440 @@
# include "AA_liba.h"
AAgetup(d, given, low_tid, high_tid, low_key, high_key)
register DESCXX *d;
char *given;
register long *low_tid;
register long *high_tid;
char *low_key;
char *high_key;
{
register int i;
errno = 0;
# ifdef AMX_TRACE
if (AAtTfp(9, 0,
# ifdef MSDOS
"get tuple\t'%.10s' ",
# else
"get tuple\t'%.14s' ",
# endif
d->xx_desc.reldum.relid))
AAdumptid(low_tid);
# endif
if (!AA_NOLOCKS && !d->xx_excl)
AAerror(19, d->xx_desc.reldum.relid);
AArefresh(d);
/* pop key conditions */
AAbmove(given, &d->xx_desc.relgiven[1], d->xx_desc.reldum.relatts);
for ( ; ; )
{
AA = AAam_get(d, low_tid, high_tid, AA_STUP, 1);
# ifdef AM_TRACE
AAtTfp(9, 10, "##AM_GETUP\t%d\n", AA);
if (AAtTfp(9, 11, "##\t\tlo_"))
AAdumptid(low_tid);
if (AAtTfp(9, 12, "##\t\thi_"))
AAdumptid(high_tid);
if (AAtTfp(9, 13, "##\t\tnewtup"))
AAprtup(d, AA_STUP);
# endif
if (AA || AAtup_compare(d, low_key, high_key))
break;
}
if (AA < 0)
AAerror(11, d->xx_desc.reldum.relid);
/* get value of tidp for AAgetid if indexed access path */
if (ctoi(d->xx_desc.reldum.relindxd) == SECINDEX)
{
i = d->xx_desc.reldum.relatts;
i = d->xx_desc.reloff[i];
AAbmove(&AA_STUP[i], &AA_TID, sizeof AA_TID);
}
# ifdef AMX_TRACE
AAtTfp(9, 1, "... ret %d\n", !AA);
# endif
return (!AA);
}
AAgetid(d, tid, given, low_key, high_key)
register DESCXX *d;
register long *tid;
char *given;
char *low_key;
char *high_key;
{
register int i;
errno = 0;
*tid = AA_TID;
# ifdef AMX_TRACE
if (AAtTfp(10, 0,
# ifdef MSDOS
"get tid\t\t'%.10s'",
# else
"get tid\t\t'%.14s'",
# endif
d->xx_desc.reldum.relid))
AAdumptid(tid);
# endif
if (!AA_NOLOCKS && !d->xx_excl)
AAerror(19, d->xx_desc.reldum.relid);
AArefresh(d);
/* pop key conditions */
AAbmove(given, &d->xx_desc.relgiven[1], d->xx_desc.reldum.relatts);
AA = AAam_get(d, tid, tid, AA_STUP, 0);
# ifdef AM_TRACE
AAtTfp(10, 10, "##AM_GETID\t%d\n", AA);
if (AAtTfp(10, 11, "##\t\tnewtup"))
AAprtup(d, AA_STUP);
# endif
if (AA)
AAerror(12, d->xx_desc.reldum.relid);
i = AAtup_compare(d, low_key, high_key);
# ifdef AMX_TRACE
AAtTfp(10, 1, "... ret %d\n", i);
# endif
return (i);
}
AAget(d, tid)
register DESCXX *d;
register long *tid;
{
register int i;
errno = 0;
# ifdef AMX_TRACE
if (AAtTfp(43, 0,
# ifdef MSDOS
"get tid tuple\t'%.10s' ",
# else
"get tid tuple\t'%.14s' ",
# endif
d->xx_desc.reldum.relid))
AAdumptid(tid);
# endif
if (!AA_NOLOCKS && !d->xx_excl)
AAerror(19, d->xx_desc.reldum.relid);
AArefresh(d);
AA = AAam_get(d, tid, tid, AA_STUP, 0);
# ifdef AM_TRACE
AAtTfp(43, 10, "##AM_GET\t%d\n", AA);
if (AAtTfp(43, 11, "##\t\tnewtup"))
AAprtup(d, AA_STUP);
# endif
if (AA < 0)
AAerror(25, d->xx_desc.reldum.relid);
# ifdef AMX_TRACE
AAtTfp(43, 1, "... ret %d\n", !AA);
# endif
return (!AA);
}
static AAtup_compare(d, low_key, high_key)
register DESCXX *d;
char *low_key;
char *high_key;
{
register int dom;
register int cond1;
register int cond2;
for (dom = d->xx_desc.reldum.relatts; dom; --dom)
{
if (cond1 = d->xx_desc.relgiven[dom])
{
cond2 = 0;
if (bitset(AP_NE, cond1) && bitset((AP_LT | AP_GT), cond1))
{
clrbit(AP_NE, cond1);
cond2 = AP_NE;
}
else if (bitset(AP_LT, cond1) && bitset(AP_GT, cond1))
{
clrbit(AP_GT, cond1);
cond2 = AP_GT;
if (bitset(AP_GE, cond1))
{
clrbit(AP_GE, cond1);
cond2 |= AP_GE;
}
}
if (AAdom_compare(d, dom, cond1, low_key, AP_P1))
return (0);
if (cond2 && AAdom_compare(d, dom, cond2, high_key, AP_P2))
return (0);
}
}
return (1);
}
static AAdom_compare(d, dom, cond, key, pat)
register DESCXX *d;
register int dom;
register int cond;
char *key;
int pat;
{
register int frml;
register int off;
register int i;
frml = ctou(d->xx_desc.relfrml[dom]);
off = d->xx_desc.reloff[dom];
key += off;
i = bitset(pat, d->xx_desc.relgiven[dom])?
AApcompare(key, frml, AA_STUP + off, frml):
AAicompare(AA_STUP + off, key, d->xx_desc.relfrmt[dom], frml);
# ifdef AM_TRACE
AAtTfp(32, 0, "##AM_DOM_COMP\tdom %d pat 0%o given 0%o cond 0%o rc %d\n",
dom, pat, d->xx_desc.relgiven[dom], cond, i);
if (AAtTfp(32, 1, "##\t\toldkey"))
AAprkey(d, key - off);
if (AAtTfp(32, 2, "##\t\toldtup"))
AAprtup(d, AA_STUP);
# endif
if (i < 0 && bitset((AP_LT | AP_NE), cond))
return (0);
else if (!i && bitset((AP_EQ | AP_LE | AP_GE), cond))
return (0);
else if (i > 0 && bitset((AP_GT | AP_NE), cond))
return (0);
return (1);
}
static AApcompare(s1, l1, s2, l2)
register char *s1;
int l1;
char *s2;
int l2;
{
register int l;
register char *s;
char str1[MAXFIELD];
char str2[MAXFIELD];
for (l = l1, s = str1; l; --l)
if ((*s = *s1++) == ' ')
--l1;
else
s++;
for (l = l2, s1 = s2, s = str2; l; --l)
if ((*s = *s1++) == ' ')
--l2;
else
s++;
return (AApattern(str1, l1, str2, l2));
}
/*
** AApattern performs character comparisons between the two
** strings s1 and s2. All blanks and null are ignored in
** both strings. In addition pattern matching is performed
** using the "shell syntax". Pattern matching characters
** are converted to the pattern matching symbols PAT_ANY etc.
** by the scanner.
**
** Pattern matching characters can appear in string s1.
**
** examples:
**
** "Smith, Homer" = "Smith,Homer"
**
** "abcd" < "abcdd"
**
** "abcd" = "aPAT_ANYd"
**
** returns <0 if s1 > s2
** 0 if s1 = s2
** >0 if s1 < s2
*/
static AApattern(s1, l1, s2, l2)
register char *s1;
register int l1;
register char *s2;
register int l2;
{
register int c1;
register int c2;
# ifdef AM_TRACE
if (AAtTfp(33, 0, "##AM_PATTERN\t%d", l1))
{
AApratt(BINARY, l1, s1);
printf("| %d", l2);
AApratt(BINARY, l2, s2);
printf("|\n");
}
# endif
loop:
while (l1--)
{
switch (c1 = *s1++)
{
case PAT_ANY:
return (AAany_match(s1, l1, s2, l2));
case PAT_LBRAC:
return (AAset_match(s1, l1, s2, l2));
default:
if (!l2--)
return (-1); /* s1 > s2 */
if (c1 == (c2 = *s2++) || c1 == PAT_ONE)
goto loop;
return (c2 - c1);
}
}
/* examine remainder of s2 for any characters */
return (l2? 1: 0);
}
static AAany_match(s1, l1, s2, l2)
register char *s1;
register int l1;
register char *s2;
register int l2;
{
register int c1;
# ifdef AM_TRACE
if (AAtTfp(34, 0, "##AM_PAT_ANY\t%d", l1))
{
AApratt(BINARY, l1, s1);
printf("| %d", l2);
AApratt(BINARY, l2, s2);
printf("|\n");
}
# endif
if (!l1)
return (0); /* a match if no more chars in p */
/*
** If the next character in "s1" is not another
** pattern matching character, then scan until
** first matching char and continue comparison.
*/
if ((c1 = *s1) != PAT_ANY && c1 != PAT_LBRAC && c1 != PAT_ONE)
{
while (l2--)
{
if (*s2 == c1 && !AApattern(s1, l1, s2, l2 + 1))
return (0);
s2++;
}
}
else
{
while (l2)
if (!AApattern(s1, l1, s2++, l2--))
return (0); /* match */
}
return (1); /* no match */
}
static AAset_match(s1, l1, s2, l2)
register char *s1;
register int l1;
register char *s2;
register int l2;
{
register int c1;
register int c2;
register int oldc;
int found;
# ifdef AM_TRACE
if (AAtTfp(35, 0, "##AM_PAT_SET\t%d", l1))
{
AApratt(BINARY, l1, s1);
printf("| %d", l2);
AApratt(BINARY, l2, s2);
printf("|\n");
}
# endif
c2 = *s2;
while (l2--)
{
/* search for a match on 'c2' */
found = 0; /* assume failure */
oldc = 0777; /* make previous char large */
while (l1--)
{
switch (c1 = *s1++)
{
case PAT_RBRAC:
return (found? AApattern(s1, l1, s2, l2): 1);
case '-':
if (!l1--)
return (1); /* not found */
c1 = *s1++;
if (!found && oldc <= c2 && c2 <= c1)
{
s2++;
found++;
}
break;
default:
if (c2 == (oldc = c1))
{
s2++;
found++;
}
}
}
return (1); /* no match */
}
return (-1);
}