home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Shareware Overload
/
ShartewareOverload.cdr
/
database
/
mbase.zip
/
BUILD.C
next >
Wrap
C/C++ Source or Header
|
1991-02-11
|
10KB
|
418 lines
#include "stdinc.h"
#define cr(x) ((x) == 0) ? "\n\n" : "\n"
static char *justword[] = { "L-just", "R-just" };
char *word (fle)
int fle;
{
int i;
char a[2];
static char buffer [81];
i = 0;
while (read (fle, a, 1) == 1)
{
if (a[0] == ' ' || a[0] == '\n')
{ if (i != 0)
break;
}
else
buffer[i++] = a[0];
};
buffer [i] = 0;
return buffer;
}
char *repeat (ch, nm)
int ch, nm;
{
char buf [MAX_RPT];
buf[(nm = (nm < 0) ? 0 : nm)] = 0;
for (nm--; nm >= 0; nm--) buf[nm] = ch;
return buf;
}
pattern (whole, match, skip)
char *whole, *match;
int skip;
{
int i, j, m, w;
m = strlen (match); w = strlen (whole);
for (i = 0; i <= w-m; i++)
{
for (j = 0; match [j] != 0 && whole[i+j] == match[j]; j++)
;
if (match[j] == 0) if (skip-- == 0) return i;
};
return -1;
}
/* Encode and Eval perform base 10 to base 255 conversion, with a bottom
value of 1 (As opposed to 0) for the base-255 numbers. Perfect for
encoding BIG numbers (See chart) and storing them in 5 bytes on disk, eh?
# of characters used______________Maximum integer representable
1 254
2 65024
3 16581374
4 4228250624
5 107820390900.... etc. */
long _eval (st, x)
char *st;
int x;
{
long int j;
long int n;
int a;
j = 0; n = 1;
while (x > 0) { a = st[--x]; a = fix (a); j += n * (a - 1); n *= 255; };
return j;
}
char *_encode (num, len)
long int num;
int len;
{
register int i;
int a;
static char buf[10];
len = (len < 9) ? len : 9;
for (i = len-1; i >= 0; i--)
{ a = num % 255;
num = (num - a) / 255;
buf[i] = a + 1;
};
buf[len] = 0;
return buf;
}
main (argc, argv)
int argc;
char **argv;
{
char flds[384], lens[384], idxs[20][50];
char rel[80], temp[80], tmp2[80];
int stage, column, num_i, num_f, R;
int n, i, fle, st, dups, s, r_len, isright;
if (argc != 2)
{ printf ("%s: Format = '%s%s%s schema.s'\n", argv[0], BOLD, argv[0], NORM);
exit (1);
};
n = strlen (argv[1]);
if (argv[1][n-1] != 's' || argv[1][n-2] != '.') strcat (argv[1], ".s");
sprintf (flds, "|"); sprintf (rel, "%s", argv[1]); sprintf (lens, "");
for (i = strlen(argv[1])-1; i > -1 && argv[1][i] != ':'
&& argv[1][i] != '/'; i--);
r_len = rel[i+1] = 0;
if ((fle = open (argv[1], O_RDONLY)) == -1)
{ fprintf (stderr, "\nCannot open %s%s%s.\n", BOLD, argv[1], NORM);
exit (1);
};
skip (fle, "relation");
sprintf (temp, "%s", word (fle));
if (strlen (temp) == 0)
{ fprintf (stderr, "\nFile %s%s%s holds no schema definition.\n",
BOLD, argv[1], NORM);
exit (1);
};
printf ("%s", CLS);
printf ("Building relation %s%s%s", BOLD, temp, NORM);
if (rel[0] != 0)
printf (" under directory %s%s%s\n\n", BOLD, rel, NORM);
else
printf (" under current directory\n\n");
sprintf (rel, "%s%s.rel", rel, temp);
num_f = num_i = 0;
column = stage = 1;
printf ("%s%-60.60s%s\n", UNDR, "Fields", NORM);
do
{ sprintf (temp, "%s", word (fle));
if (strcmp (temp, "field") == 0)
{ if (stage == 2)
{ fprintf (stderr, "%sField %s%s%s declared after indicies.\n",
cr (column), BOLD, word (fle), NORM);
exit (1);
};
sprintf (temp, "%s", word (fle));
if (temp [strlen(temp)-1] == '|') temp[strlen(temp)-1] = 0;
sprintf (tmp2, "|%s|", temp);
if (pattern (flds, tmp2, 0) != -1)
{ fprintf (stderr, "%sField %s%s%s declared twice.\n",
cr (column), BOLD, temp, NORM);
exit (1);
};
strcat (flds, temp); strcat (flds, "|");
skip (fle, "length");
sprintf (tmp2, "%03s", word (fle));
strcat (lens, tmp2);
if ((isright = skip (fle, "right")) == 1)
strcat (lens, "r|");
else
{ strcat (lens, "l|");
skip (fle, "left");
};
r_len += atoi (tmp2) + 1;
sprintf (temp, "%s [%d] %s", temp, atoi (tmp2), justword[isright]);
if ((column = 1-column) == 0)
printf ("%s%-30.30s%s", SUBD, temp, NORM);
else
printf ("%s%s%s\n", SUBD, temp, NORM);
num_f ++;
if (skip (fle, ";") == 1)
{ do sprintf (temp, "%s", word (fle));
until (strcmp (temp, ";") == 0 || temp[0] == 0);
if (temp[0] == 0)
{ printf ("%s", cr (column));
endoffile (num_f, num_i);
stage = 3;
};
};
}
else
if (strcmp (temp, "index") == 0)
{
if (stage == 1)
{ if (column == 0) printf ("\n");
if (num_f == 0)
{ fprintf (stderr, "\nNo fields declared before indicies.\n");
exit (1);
};
printf ("\n%s%-60.60s%s\n", UNDR, "Indicies", NORM);
stage = 2;
column = 1;
};
skip (fle, "on");
sprintf (temp, "%s", word (fle));
if (temp[strlen(temp)-1] == '|') temp[strlen(temp)-1] = 0;
printf ("%s%s%s%s", SUBD, temp, NORM,
repeat ('.', 36-strlen (temp)));
dups = 0;
if (skip (fle, "with") == 1)
{ if (skip (fle, "duplicates") == 0)
{ fprintf (stderr, "?\n\nIncorrect syntax\n");
exit (1);
}
else
{ printf ("Duplicates allowed\n");
dups = 1;
};
}
else
printf ("Duplicates not allowed\n");
strcat (temp, "|"); sprintf (tmp2, "%s", "");
s = idxs[num_i][0] = 0;
while (temp[s] != 0)
{ for (i = s, tmp2[0] = '|'; temp[i] != '|'; i++)
tmp2 [i-s+1] = temp [i];
tmp2[i-s+1] = '|'; tmp2[i-s+2] = 0; s = i+1;
if ((i = pattern (flds, tmp2, 0)) == -1)
{
sprintf (temp, "%s", &tmp2[1]); temp[strlen(temp)-1] = 0;
fprintf (stderr, "\nField %s%s%s undefined\n", BOLD,
temp, NORM);
exit (1);
};
for (st = 0, i++; i >= 0; i--) if (flds[i] == '|') st++;
sprintf (tmp2, "%03d|", st);
strcat (idxs[num_i], tmp2);
};
if (dups == 1) strcat (idxs[num_i], "d");
num_i ++;
if (skip (fle, ";") == 1)
{ do sprintf (temp, "%s", word (fle));
until (strcmp (temp, ";") == 0 || temp[0] == 0);
if (temp[0] == 0)
{ printf ("%s", cr (column));
endoffile (num_f, num_i);
stage = 3;
};
};
}
else
if (strcmp (temp, "end") == 0 || temp[0] == 0)
{ printf ("%s", cr (column));
endoffile (num_f, num_i);
stage = 3;
}
else
{ fprintf (stderr, "%sIdentifier %s%s%s not recognized.\n",
cr (column), BOLD, temp, NORM);
exit (1);
};
} while (stage != 3);
R = open (rel, O_RDWR);
if (R != -1)
{ if (read (R, temp, 1) != -1)
if (temp[0] != 1)
{ fprintf (stderr, "\n%s%s%32.32s%-28.28s%s\n", SUBD, INVR,
"*** ERR", "OR ***", NORM);
fprintf (stderr, "\n This relation is busy. It cannot be");
fprintf (stderr, " built during use.\n\n");
close (R); exit (1);
};
printf ("%s%s%32.32s%-28.28s%s\n", SUBD, INVR, "** WARN", "ING **", NORM);
printf ("\n The file about to be created already exists under the\n");
printf (" target directory! This data will be lost!\n\n");
close (R);
};
printf ("Continue with the creation of the relation [Y/n] ? ");
i = getchar ();
printf ("\n");
if (i == 'n' || i == 'N' || i == 'q' || i == 'Q') exit (0);
remove (rel);
if ((R = open (rel, O_RDWR | O_CREAT)) == -1)
{ fprintf (stderr, "\n\nCannot open relation -- Aborted\n");
exit (-1);
};
#ifdef UNIX
sprintf (temp, "chmod 755 %s", rel);
system (temp);
#endif
write (R, _encode (0, 1), 1);
write (R, _encode (num_i, 1), 1);
write (R, _encode (r_len, 2), 2);
for (i = 0; i < num_i; i++) write (R, _encode (0, 4), 4);
write (R, ".\001\001\001\001.\n", 7);
write (R, lens, strlen(lens)); write (R, "\n", 1);
for (i = 0; i < num_i; i++)
{ write (R, idxs[i], strlen (idxs[i])); write (R, "\n", 1);
};
close (R);
printf ("Relation created -- zero entries.\n");
}
skip (f, s) /* 0 means didn't skip the word, 1 means we did. */
int f;
char *s;
{
int i;
char a[2];
i = 0;
while (s[i] != 0)
{
if (read (f, a, 1) != 1) return -1;
if (i != 0 || (i == 0 && a[0] != ' ' && a[0] != '\n'))
{ if (s[i] != a[0])
{ lseek (f, -1, 1);
break;
}
else
i++;
};
}
if (s[i] == 0) return 1;
return 0;
}
endoffile (num_f, num_i)
int num_f, num_i;
{
if (num_f == 0)
{ fprintf (stderr, "No fields declared before end reached\n");
exit (1);
};
if (num_i == 0)
{ fprintf (stderr, "No indicies declared before end reached\n");
exit (1);
};
}