home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
simtel
/
sigm
/
vols000
/
vol025
/
dbbuilde.cpm
< prev
next >
Wrap
Text File
|
1984-04-29
|
22KB
|
848 lines
(**********************************************************
*
*
*********************************************************)
PROGRAM DESCRIPTORBUILDER; (*version 0.0 - 2 Feb 1980*)
(*Copyright 1980 Kenneth L. Bowles. All rights reserved. Permission is
hereby granted to use this material for any non-commerical purpose*)
USES DBUNIT;
CONST
WA0 = 0;
FDNAMEOFFSET = 12;
LASTFIELDDESCRIPTOR = 255;
TYPE
CHSET=SET OF CHAR;
REFLIST=ARRAY[0..0] OF INTEGER; (*index range checking off*)
(*fixed layout parts of descriptors*)
GRPDESCRIPTOR=
PACKED RECORD
OVERLINK:BYTE; (*descriptor longer than 240 bytes not allowed*)
SWITCHES:BYTE; (*packed array gets allocated in whole words*)
(*bit 0 = tagged; bit 1 = linked *)
RECLINK:BYTE;
FILLER:BYTE;
RECNUM:REFLIST;
(*expand here with additional recnum's*)
END;
GRPDESPTR=^GRPDESCRIPTOR;
RECDESCRIPTOR=
PACKED RECORD
OVERLINK:BYTE;
SWITCHES:BYTE; (*bit 0 = tagged; bit 1 = fixed width; bit 2 = sparse *)
SIZE:INTEGER;
FIRSTLITEMNUM:BYTE;
USECOUNT:BYTE;
LAYOUT:BYTE; (*on a large system this could be declared TAG*)
LASTFLDLINK:BYTE; (*points to name field*)
FLDREF:ARRAY [0..0] OF
PACKED RECORD
FDNUM: 0..LASTFIELDDESCRIPTOR;
FLDOFFSET:BYTE; (*for fixed size fields; =0 for linked*)
END;
(*expand here with additional fldref's*)
END;
RECDESPTR=^RECDESCRIPTOR;
FDTYPE=
PACKED RECORD
CASE BOOLEAN OF
TRUE: (S:STRING);
FALSE: (R:FLDDESCRIPTOR)
END;
RDTYPE=
PACKED RECORD
CASE BOOLEAN OF
TRUE: (S:STRING);
FALSE: (R:RECDESCRIPTOR)
END;
GDTYPE=
PACKED RECORD
CASE BOOLEAN OF
TRUE: (S:STRING);
FALSE: (R:GRPDESCRIPTOR)
END;
STRINGPTR = ^STRING;
TRIXPTR=
RECORD CASE DBLEVELTYPE OF
FIELDT: (F:FLDDESPTR);
RECORDT:(R:RECDESPTR);
GROUPT: (G:GRPDESPTR);
NONET: (S:STRINGPTR)
END (*TRIXPTR*);
VAR
DONE:BOOLEAN;
ITEMLEVEL:DBLEVELTYPE;
REMFILE:BOOLEAN;
FOUT:INTERACTIVE;
FUNCTION GETCOMMAND(S:STRING; OKSET:CHSET):CHAR;
VAR CH:CHAR;
BEGIN
REPEAT
WRITELN;
WRITE(S);
READ(CH);
IF CH IN ['a'..'z'] THEN
CH:=CHR(ORD(CH)-32);
IF NOT (CH IN OKSET) THEN
WRITE(' ORD(CH)=',ORD(CH));
UNTIL CH IN OKSET;
WRITELN;
GETCOMMAND:=CH;
END (*GETCOMMAND*);
PROCEDURE LOCATOR(GROUPNUM,RECNUM:INTEGER);
VAR I:INTEGER;
BEGIN
DBSHOWERR('LOC#1', DBHOME(WA0));
DBSHOWERR('LOC#2', DBSEEK(WA0, GROUPNUM));
DBSHOWERR('LOC#3', DBDESCEND(WA0));
DBSHOWERR('LOC#4', DBSEEK(WA0, RECNUM));
END (*LOCATOR*);
FUNCTION READI(S:STRING; X:INTEGER): INTEGER;
VAR I:INTEGER;
BEGIN
WRITE(S,X, ' >');
READLN(I);
IF EOF THEN
BEGIN
RESET(INPUT);
READI:=X;
WRITELN;
END
ELSE
READI:=I;
END (*READI*);
PROCEDURE SHOWFLDTYPE(FLDTYPE:DBFIELDTYPES);
BEGIN
WRITE('FLD TYPE:');
IF NOT (FLDTYPE IN [BYTEF, GROUPF, INTEGERF, LONGINTF, STRINGF,
SETF, PICF]) THEN
WRITELN('***** ILLEGAL ****')
ELSE
CASE FLDTYPE OF
BYTEF: WRITELN('BYTEF');
GROUPF: WRITELN('GROUPF');
INTEGERF: WRITELN('INTEGERF');
LONGINTF: WRITELN('LONGINTF');
SETF: WRITELN('SETF');
PICF: WRITELN('PICF');
TEXTF: WRITELN('TEXTF');
STRINGF: WRITELN('STRINGF')
END (*CASE*);
END (*SHOWFLDTYPE*);
PROCEDURE SHOWFD(PS:STRING);
VAR
FD:FDTYPE;
BEGIN
FD.S:=PS;
WITH FD.R DO
BEGIN
(*note: link value is one more than correct string length*)
WRITELN('FIELD DESCRIPTOR:',NAME:(LENGTH(NAME)-1));
WRITELN('SWITCHES:', SWITCHES);
WRITELN('MAX WIDTH:', MAXWIDTH);
WRITELN('USECOUNT:', USECOUNT);
SHOWFLDTYPE(FLDTYPE);
WRITELN('FLDREF:', FLDREF);
IF FLDREF = 0 THEN
BEGIN
WRITELN('ROW:', ROW);
WRITELN('DATACOL:', DATACOL);
WRITELN('LABELCOL:', LABELCOL);
WRITELN('CONTROLBITS:', CONTROLBITS);
END;
END (*WITH*);
END (*SHOWFD*);
PROCEDURE BUILDFD;
VAR NS:STRING;
I,FLDNUM:INTEGER;
CH:CHAR;
FD:FDTYPE;
BEGIN
DBTYPECHECK:=FALSE;
WRITELN;
WRITE('FIELD NUMBER:');
READLN(FLDNUM);
LOCATOR(3(*FD'S*), FLDNUM);
CASE GETCOMMAND('BUILDFD: C(hange old field or N(ew field?',
['C','c','N','n']) OF
'C','c': BEGIN
DBSHOWERR('BUILDFD-GET', DBGET(WA0));
FD.S:=DBMAIL.STRG;
END;
'N','n': FILLCHAR(FD.S, 82, CHR(0))
END (*CASE*);
WITH FD.R DO
BEGIN
WRITE('FIELD NAME:', NAME:LENGTH(NAME)-1, ' >');
READLN(NS);
IF LENGTH(NS) > 0 THEN
(*$R-*)
BEGIN
MOVELEFT(NS,NAME,LENGTH(NS)+1);
NAME[0]:=CHR(LENGTH(NS)+1);
OVERLINK:=LENGTH(NS)+SIZEOF(FLDDESCRIPTOR)-1;
END
ELSE
WRITELN;
(*$R+*)
SWITCHES:=READI('SWITCH BYTE:',SWITCHES);
MAXWIDTH:=READI('MAXIMUM WIDTH:', MAXWIDTH);
USECOUNT:=0;
SHOWFLDTYPE(FLDTYPE);
WRITE(' G(ROUP R(EC S(TRING B(YTE I(NTEGER >');
REPEAT
READ(CH);
UNTIL (CH IN ['G', 'S', 'B', 'I']) OR EOF;
WRITELN;
IF EOF THEN
RESET(INPUT)
ELSE
CASE CH OF
'B': FLDTYPE:=BYTEF;
'G': FLDTYPE:=GROUPF;
'I': FLDTYPE:=INTEGERF;
'S': FLDTYPE:=STRINGF
END (*CASE*);
IF FLDTYPE = GROUPF THEN
FLDREF:=READI('DESCRIPTOR NUMBER:',FLDREF)
ELSE
FLDREF:=READI('Displayable (=0) or not (=1):', FLDREF);
IF FLDTYPE <> GROUPF THEN
BEGIN
WRITE('Set Display Params? (Y/N)');
READ(CH);
WRITELN;
IF CH IN ['Y', 'y'] THEN
BEGIN
ROW:=READI('ROW:',ROW);
DATACOL:=READI('DATACOL:', DATACOL);
LABELCOL:=READI('LABELCOL:',LABELCOL);
CONTROLBITS:=READI('CONTROLBITS:',CONTROLBITS);
END;
END;
END (*WITH FD.R*);
WRITELN;
WRITE('<ETX> ACCEPTS; <RET> TRY AGAIN');
READ(KEYBOARD,CH);
IF CH = CHR(3(*ETX*)) THEN
WITH DBMAIL DO
BEGIN
STRG:=FD.S;
DBMAILTYPE:=STRINGF;
DBSHOWERR('BUILDFD', DBPUT(WA0));
END;
END (*BUILDFD*);
PROCEDURE SHOWRD(PS:STRING);
VAR I,J,N:INTEGER;
NS:STRING;
RD:RDTYPE;
BEGIN
RD.S:=PS;
NS:=RD.S;
DELETE(NS,1,(RD.R.LASTFLDLINK+SIZEOF(RECDESCRIPTOR)-3));
WRITELN('RECORD DESCRIPTOR:',NS);
WITH RD.R DO
BEGIN
WRITELN('SWITCHES:', SWITCHES);
WRITELN('SIZE:', SIZE);
WRITELN('FIRSTLINK - ITEM# ', FIRSTLITEMNUM);
WRITELN('USECOUNT:', USECOUNT);
WRITELN('LAYOUT:', LAYOUT);
WRITELN('LASTFLDLINK:', LASTFLDLINK);
END (*WITH*);
I:=0;
N:=0;
J:=RD.R.LASTFLDLINK - 2;
WHILE I < J DO
BEGIN
(*$R-*)
WITH RD.R.FLDREF[N] DO
WRITELN(' FLDREF(', N, ') - FDNUM:', FDNUM,
' OFFSET:', FLDOFFSET);
I:=I+2;
N:=N+1;
(*$R+*)
END;
END (*SHOWRD*);
PROCEDURE BUILDRD;
VAR I,J,N,X,RECNUM:INTEGER;
NAME:STRING;
CH:CHAR;
RD:RDTYPE;
BEGIN
REPEAT
FILLCHAR(RD.S, 82, CHR(0));
WRITELN;
WRITE('RECORD DEF NUMBER:');
READLN(RECNUM);
LOCATOR(2(*RD'S*), RECNUM);
WRITE('RECDEF NAME:');
READLN(NAME);
WRITE('SWITCH BYTES:');
WITH RD.R DO
BEGIN
READLN(I);
SWITCHES:=I;
WRITE('SIZE:');
READLN(SIZE);
WRITE('FIRSTLITEMNUM:'); READLN(I); FIRSTLITEMNUM:=I;
USECOUNT:=0;
WRITE('LAYOUT#:');
READLN(I);
LAYOUT:=I;
END (*WITH*);
I:=8;
J:=3;
REPEAT
N:=(I-8) DIV 2;
WRITE('FLDREF #', N, ':');
READ(X);
IF X >= 0 THEN
(*$R-*)
WITH RD.R.FLDREF[N] DO
BEGIN
FDNUM:=X;
WRITE(' OFFSET #', N, ':');
READLN(X);
FLDOFFSET:=X;
(*$R+*)
J:=J+2;
I:=I+2;
END;
UNTIL X < 0;
RD.R.OVERLINK:=2+I;
RD.R.LASTFLDLINK:=J; (*leave 2 empty bytes*)
RD.S:=CONCAT(RD.S,NAME);
RD.S[2+I]:=CHR(LENGTH(NAME)+1);
WRITELN;
SHOWRD(RD.S);
WRITE('<ETX> ACCEPTS; <RET> TRY AGAIN');
READ(KEYBOARD,CH);
UNTIL CH = CHR(3(*ETX*));
WITH DBMAIL DO
BEGIN
STRG:=RD.S;
DBMAILTYPE:=STRINGF;
END;
READ(CH); (*flush buffered char left by READ(X) of '-1<RET>'*)
WRITELN;
END (*BUILDRD*);
PROCEDURE SHOWGD(PS:STRING);
VAR I,J,N:INTEGER;
A: ARRAY[0..0] OF INTEGER;
NS:STRING;
GD:GDTYPE;
BEGIN
GD.S:=PS;
NS:=GD.S;
DELETE(NS,1,(GD.R.RECLINK+SIZEOF(GRPDESCRIPTOR)-4));
WRITELN('GROUP DESCRIPTOR:',NS);
WITH GD.R DO
BEGIN
WRITELN('SWITCHES:', SWITCHES);
WRITELN('RECLINK:', RECLINK);
END (*WITH*);
I:=0;
N:=0;
J:=GD.R.RECLINK-2;
WHILE I < J DO
BEGIN
(*$R-*)
WRITELN(' RECNUM(', N, '):', GD.R.RECNUM[N]);
(*$R+*)
N:=N+1;
I:=I+2;
END;
END (*SHOWGD*);
PROCEDURE BUILDGD;
VAR I,J,N,X,GRPNUM:INTEGER;
NAME:STRING;
CH:CHAR;
GD:GDTYPE;
BEGIN
FILLCHAR(GD.S, 82, CHR(0));
REPEAT
WRITELN;
WRITE('GROUP DEF NUMBER:');
READLN(GRPNUM);
LOCATOR(1(*GD'S*), GRPNUM);
WRITE('GRPDEF NAME:');
READLN(NAME);
WRITE('SWITCH BYTES:');
READLN(I);
GD.R.SWITCHES:=I;
I:=4;
REPEAT
N:=(I-4) DIV 2;
WRITE('RECNUM #', N, ':');
READLN(X);
IF X >= 0 THEN
BEGIN
(*$R-*)
GD.R.RECNUM[N]:=X;
(*$R+*)
I:=I+2;
END;
UNTIL X < 0;
GD.R.OVERLINK:=2+I;
GD.R.RECLINK:=I;
GD.S:=CONCAT(GD.S,NAME);
GD.S[2+I]:=CHR(LENGTH(NAME)+1);
WRITELN;
SHOWGD(GD.S);
WRITE('<ETX> ACCEPTS; <RET> TRY AGAIN');
READ(KEYBOARD,CH);
UNTIL CH = CHR(3(*ETX*));
WITH DBMAIL DO
BEGIN
STRG:=GD.S;
DBMAILTYPE:=STRINGF;
END;
END (*BUILDGD*);
PROCEDURE BUILDLITERAL;
VAR I:INTEGER;
S:STRING;
BEGIN
CASE GETCOMMAND('LITERAL: I(NTEGER S(TRING ', ['I','S']) OF
'I': BEGIN
WRITE('I>');
READLN(I);
WITH DBMAIL DO
BEGIN
INT:=I;
DBMAILTYPE:=INTEGERF;
END;
END;
'S': BEGIN
WRITE('S>');
READLN(S);
WITH DBMAIL DO
BEGIN
STRG:=S;
DBMAILTYPE:=STRINGF;
END;
END
END (*CASES*);
END (*BUILDLITERAL*);
PROCEDURE SHOWLITERAL;
BEGIN
WRITELN;
CASE DBMAIL.DBMAILTYPE OF
STRINGF: WRITELN('STRG: ', DBMAIL.STRG);
INTEGERF: WRITELN('INT: ', DBMAIL.INT)
(*LONGINTF: WRITELN('LINT: ', DBMAIL.LINT) *)
END (*CASES*);
END (*SHOWLITERAL*);
PROCEDURE SHOWDATASTRUCTURE;
VAR TP:TRIXPTR;
GN:INTEGER;
PROCEDURE GDOUT(TP:TRIXPTR; LEVEL,GN:INTEGER); FORWARD;
PROCEDURE FDOUT(TP:TRIXPTR; LEVEL,FN:INTEGER);
VAR NS:STRING;
GP:TRIXPTR;
BEGIN
WITH TP.F^ DO
BEGIN
NS:=NAME;
DELETE(NS,LENGTH(NS),1);
(*note: link value is one more than correct string length*)
WRITE(FOUT,'FLD(':(4+LEVEL), FN, '):',NS, ' ':17-LENGTH(NS));
WRITE(FOUT,' SW:', SWITCHES);
WRITE(FOUT,' W:', MAXWIDTH);
WRITE(FOUT,' T:');
IF NOT (FLDTYPE IN [BYTEF, GROUPF, INTEGERF, LONGINTF, STRINGF,
SETF, PICF]) THEN
WRITE(FOUT,'***** ILLEGAL ****')
ELSE
BEGIN
CASE FLDTYPE OF
BYTEF: WRITE(FOUT,'BYT');
GROUPF: WRITE(FOUT,'GRP');
INTEGERF: WRITE(FOUT,'INT');
LONGINTF: WRITE(FOUT,'LNI');
SETF: WRITE(FOUT,'SET');
PICF: WRITE(FOUT,'PIC');
TEXTF: WRITE(FOUT,'TXT');
STRINGF: WRITE(FOUT,'STR')
END (*CASE*);
IF FLDTYPE = GROUPF THEN
BEGIN
WRITELN(FOUT);
DBGETDESCRIPTORNUM(GROUPT, FLDREF, GP.F);
IF GP.F <> NIL THEN
GDOUT(GP, LEVEL+2, FLDREF);
END
ELSE
BEGIN
IF FLDREF = 0 THEN
WRITE(FOUT, ' ROW=', ROW,
' LCOL=', LABELCOL,
' DCOL=', DATACOL);
WRITELN(FOUT);
END;
END (*FLDTYPE OK*);
END (*WITH TP.F^*);
END (*FDOUT*);
PROCEDURE RDOUT(TP:TRIXPTR; LEVEL,RN:INTEGER);
VAR I,J,N:INTEGER;
NS:STRING;
FP:TRIXPTR;
BEGIN
NS:=TP.S^;
DELETE(NS,1,(TP.R^.LASTFLDLINK+SIZEOF(RECDESCRIPTOR)-3));
(*correct for link to string length*)
DELETE(NS, LENGTH(NS),1);
WRITE(FOUT,'REC(':(4+LEVEL), RN, '):',NS, ' ':18-LENGTH(NS));
WITH TP.R^ DO
BEGIN
WRITE(FOUT,' SW:', SWITCHES);
WRITELN(FOUT,' SIZE:', SIZE);
END (*WITH*);
I:=0;
N:=0;
J:=TP.R^.LASTFLDLINK - 4;
WHILE I < J DO
BEGIN
(*$R-*)
WITH TP.R^.FLDREF[N] DO
BEGIN
DBGETDESCRIPTOR(FIELDT, FDNUM, FP.F);
(*$R+*)
IF FP.F <> NIL THEN
FDOUT(FP, LEVEL+2, FDNUM);
END;
I:=I+2;
N:=N+1;
END;
END (*RDOUT*);
PROCEDURE GDOUT(*TP:TRIXPTR; LEVEL,GN:INTEGER*);
VAR I,J,N:INTEGER;
NS:STRING;
RP:TRIXPTR;
BEGIN
NS:=TP.S^;
DELETE(NS,1,(TP.G^.RECLINK+SIZEOF(GRPDESCRIPTOR)-4));
(*correct for link to string length*)
DELETE(NS, LENGTH(NS),1);
WRITE(FOUT,'GRP(':(4+LEVEL), GN, '):',NS, ' ':18-LENGTH(NS));
WITH TP.G^ DO
BEGIN
WRITELN(FOUT,' SW:', SWITCHES);
I:=0;
N:=0;
J:=RECLINK-4;
WHILE I < J DO
BEGIN
(*$R-*)
DBGETDESCRIPTOR(RECORDT, RECNUM[N], RP.F);
(*$R+*)
IF RP.F <> NIL THEN
RDOUT(RP,LEVEL+2, RECNUM[N]);
N:=N+1;
I:=I+2;
END;
END (*WITH TP.G^*);
END (*GDOUT*);
BEGIN (*SHOWDATASTRUCTURE*)
WRITELN(FOUT);
GN:=0;
DBGETDESCRIPTOR(GROUPT, GN, TP.F);
WHILE TP.F <> NIL DO
BEGIN
GDOUT(TP,0, GN);
WRITELN(FOUT);
GN:=GN+1;
DBGETDESCRIPTOR(GROUPT, GN, TP.F);
END;
END (*SHOWDATASTRUCTURE*);
PROCEDURE SHOWITEMINFO;
VAR ITEMNUM,OFFSET,DESCRIPTORNUM:INTEGER;
NAME:STRING;
BEGIN
WRITELN;
DBITEMINFO(WA0,ITEMLEVEL,ITEMNUM,OFFSET,DESCRIPTORNUM,NAME);
WRITE('LEVEL=');
CASE ITEMLEVEL OF
GROUPT: WRITE('GROUPT');
RECORDT:WRITE('RECORDT');
FIELDT: WRITE('FIELDT');
NONET: WRITE('NONET')
END (*CASES*);
WRITELN(' ITEM#', ITEMNUM, ' OFFSET=', OFFSET,
' DESCRIP#', DESCRIPTORNUM, ' NAME=', NAME);
END (*SHOWITEMINFO*);
PROCEDURE NEWEMPTY;
VAR CH:CHAR;
TAG:INTEGER;
BEGIN
SHOWITEMINFO;
WRITE('Make new item? (Y/N)');
READ(CH);
WRITELN;
IF CH IN ['Y','y'] THEN
BEGIN
CASE ITEMLEVEL OF
GROUPT:
CASE GETCOMMAND('new embedded R(ecord or new G(roup?',
['G','R']) OF
'G': BEGIN
WRITE('TAG VALUE:');
READLN(TAG);
DBSHOWERR('NEWEMPTY-GROUPT',
DBEMPTYITEM(WA0,GROUPT,TAG));
END;
'R': DBSHOWERR('NEWEMPTY-REC', DBEMPTYITEM(WA0,RECORDT,TAG))
END (*CASE GROUPT*);
RECORDT,FIELDT:
DBSHOWERR('NEWEMPTY', DBEMPTYITEM(WA0,ITEMLEVEL,TAG));
NONET: BEGIN (*do nothing*) END
END (*CASE ITEMLEVEL*);
END (*IF CH*);
END (*NEWEMPTY*);
PROCEDURE TRANSFERPRIMITIVES;
BEGIN
CASE GETCOMMAND('XFER: E(MPTY G(ET P(UT R(EMOUT T(YPECHECK Q(UIT ',
['E', 'G', 'P', 'R', 'T', 'Q']) OF
'E': NEWEMPTY;
'P': DBSHOWERR('XFER-PUT', DBPUT(WA0));
'G': DBSHOWERR('XFER-GET', DBGET(WA0));
'R': BEGIN
REMFILE:=NOT REMFILE;
CLOSE(FOUT);
IF REMFILE THEN
BEGIN
RESET(FOUT, 'CONSOLE:');
WRITELN('Output now to CONSOLE:');
END
ELSE
BEGIN
RESET(FOUT, 'REMOUT:');
WRITELN('Output now to REMOUT:');
END;
END;
'T': BEGIN
DBTYPECHECK:=NOT DBTYPECHECK;
WRITE('DBTYPECHECK NOW ');
IF DBTYPECHECK THEN
WRITELN('TRUE')
ELSE
WRITELN('FALSE');
END;
'Q': BEGIN (*do nothing*) END
END (*CASES*);
END (*TRANSFERPRIMITIVES*);
PROCEDURE FILEHANDLER;
CONST
FNUM=0;
PGZERO=0;
EMPTYSTRING='';
VAR
TITLE:STRING;
CH:CHAR;
DUMMY:INTEGER;
PROCEDURE GETTITLE;
BEGIN
WRITE('FILE TITLE:');
READLN(TITLE);
END (*GETTITLE*);
BEGIN (*FILEHANDLER*)
CASE GETCOMMAND(
'FILE: N(EWFILE O(PEN I(NIT-GROUPS C(LOSE R(EMOVE G(ET P(UT Q(UIT',
['C','G','I','N','O','P','R','Q']) OF
'C': DBSHOWERR('FILE(C)', DBFCLOSE(FNUM));
'G': DBSHOWERR('FILE(G)', DBGETPAGE(FNUM,WA0,PGZERO));
'I': DBSHOWERR('FILE(I)', DBGROUPINIT(FNUM,DUMMY,'ALL'));
'N': BEGIN
WRITE('NEW ');
GETTITLE;
DBSHOWERR('FILE(N)', DBFCREATE(FNUM,WA0,EMPTYSTRING,TITLE));
END;
'O': BEGIN
WRITE('OLD ');
GETTITLE;
DBSHOWERR('FILE(O)', DBFOPEN(FNUM, TITLE));
END;
'P': DBSHOWERR('FILE(P)', DBPUTPAGE(FNUM, WA0, PGZERO));
'R': BEGIN
WRITE('REMOVE OLD FILE (Y/N)?');
READ(CH);
IF CH = 'Y' THEN
DBSHOWERR('FILE(R)', DBFREMOVE(FNUM));
END;
'Q': BEGIN
(*DO NOTHING*);
END
END (*CASE*);
END (*FILEHANDLER*);
PROCEDURE TESTFINDREC;
VAR FN,RN:INTEGER;
FOUND:BOOLEAN;
KEY:STRING;
BEGIN
WRITELN('TEST DBFINDREC PROCEDURE');
WRITE('FIELDNUM:');
READLN(FN);
WRITE('KEY(STRING):');
READLN(KEY);
DBSHOWERR('TESTFINDREC', DBFINDREC(WA0, ASCENDING, FN, KEY, RN, FOUND));
IF FOUND THEN WRITE(' FOUND RECORD')
ELSE WRITE(' COULDN''T FIND KEY');
WRITELN(' RECNUM=', RN);
WRITELN;
END (*TESTFINDREC*);
PROCEDURE MOVER;
VAR N,G,R:INTEGER;
BEGIN
CASE GETCOMMAND(
'MOVE: B(EGIN-LEVEL F(IND H(OME N(EXT T(AIL S(EEK D(ESCEND L(OCATE Q(UIT',
['B','F','H','N','S','T','D','L','Q']) OF
'B': DBSHOWERR('MOVE-HEAD', DBHEAD(WA0));
'F': TESTFINDREC;
'H': DBSHOWERR('MOVE-HOME', DBHOME(WA0));
'N': DBSHOWERR('MOVE-NEXT', DBNEXT(WA0));
'T': DBSHOWERR('MOVE-TAIL', DBTAIL(WA0));
'S': BEGIN
WRITELN;
WRITE('ITEM NUMBER:');
READLN(N);
DBSHOWERR('MOVE-SEEK', DBSEEK(WA0, N));
END;
'D': DBSHOWERR('MOVE-DESCEND', DBDESCEND(WA0));
'L': BEGIN
WRITELN;
WRITE('GROUP:');
READLN(G);
WRITE(' RECORD:');
READLN(R);
LOCATOR(G,R);
END;
'Q': BEGIN
(*DO NOTHING*)
END
END (*CASES*);
END (*MOVER*);
PROCEDURE SETTRACESITES;
VAR I:INTEGER;
BEGIN
WRITELN('ENTER TRACE SITE NUMBERS (<ETX> Terminates input list)');
REPEAT
WRITE('>');
READLN(I);
IF NOT EOF THEN
IF (I>=0) AND (I <= 100) THEN
DBTRACESET := DBTRACESET + [I];
UNTIL EOF;
RESET(INPUT);
END (*SETTRACESITES*);
PROCEDURE INIT;
VAR I:INTEGER;
BEGIN
DBINITIALIZE;
WRITELN('DESCRIPTOR BUILDER INITIALIZING');
DBTYPECHECK:=FALSE;
SETTRACESITES;
(*put 5 empty groups in wa0*)
FOR I:=0 TO 4 DO DBSHOWERR('INIT#2', DBEMPTYITEM(WA0,GROUPT,0));
(*put one empty linked record in each group, thus permitting traversal
operations to function*)
FOR I:=1 TO 4 DO
BEGIN
DBSHOWERR('INIT-HOME',DBHOME(WA0));
DBSHOWERR('INIT-SEEK',DBSEEK(WA0,I));
DBSHOWERR('INIT#4', DBEMPTYITEM(WA0, RECORDT,0));
END;
DONE:=FALSE;
REMFILE:=FALSE;
RESET(FOUT, 'CONSOLE:');
END (*INIT*);
BEGIN (*MAIN PROGRAM*)
INIT;
REPEAT
CASE GETCOMMAND(
'B(UILD X(FER D(ISPLAY F(ILE M(OVE S(TRUCT W(RITE Q(UIT',
['B','X','D','F','M','S','T','W','Q']) OF
'B': CASE GETCOMMAND('BUILD: G(ROUP R(ECORD F(IELD L(ITERAL',
['G','R','F','L']) OF
'F': BUILDFD;
'G': BUILDGD;
'L': BUILDLITERAL;
'R': BUILDRD
END (*CASE*);
'X': TRANSFERPRIMITIVES;
'D': CASE GETCOMMAND('DISPLAY: G(ROUP R(ECORD F(IELD L(ITERAL',
['G','R','F','L']) OF
'F': SHOWFD(DBMAIL.STRG);
'G': SHOWGD(DBMAIL.STRG);
'L': SHOWLITERAL;
'R': SHOWRD(DBMAIL.STRG)
END (*CASE*);
'F': FILEHANDLER;
'M': MOVER;
'S': SHOWDATASTRUCTURE;
'T': SETTRACESITES;
'W': DBSHOWERR('WRITEFIELD', DBWRITEFIELD(OUTPUT,WA0));
'Q': DONE:=TRUE
END (*CASE*);
UNTIL DONE;
END.