Read-only archive view · 1995-08-14 · 12,348 bytes · SHA-256 9DD694B8772A0DA8AAAF437CFDC3E0A7316C7C576B430964D1728FCF64AA804B
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <malloc.h>
#include "xbindex.h"
#include "xbase.h"
#include "xbcmds.h"
#include "dottalk.h"
extern select_rec * FAR s[max_area];
extern short far area;
extern long memory;
extern int DOSERROR;
extern int XERROR;
extern char *XMSG[];
char *dfile,*xfile;
void main()
{
char command_line[max_params*param_size];
memory = 0;
initcmds();
initbase();
memset((char *)command_line,' ',sizeof(command_line));
commands(command_line);
}
static char *help[] =
{
"QUIT",
"USE FILENAME [INDEX <INDEXNAME>]",
"INDEX <INDEXNAME> <FIELD_NUMBER>",
"LIST <FIELDNAME...>",
"FIELD <FIELDNAME...>",
"TOP",
"BOTTOM",
"SKIP <NUM_OF_RECORDS>",
"DISPLAY",
"GOTO <RECORD_NUMBER>",
"COPY TO FILENAME [FOR | WHILE FIELDNAME <|>|>=|<= <STRING>] [TYPE SDF] [TYPE DELIMITED] ",
"RECNO",
"DIR",
"!",
"ASCEND",
"DESCEND",
"NIDX",
"PIDX",
"RTREE",
"FIND",
"LOCATE <FIELDNAME> <STRING>",
"SAYGET",
"EDIT <FIELDNAME> <STRING>",
"APPEND",
"SAVE",
"DELETE",
"PACK",
"COUNT",
"SELECT <AREA>",
"DEBUG [BUFFER] [FIELD <FIELDNUMBER>]",
"HELP"
};
void sayfield(int field_idx)
{
printf("%s ",SA->fd[field_idx]);
}
void display()
{
short i ;
if (!SA->fok)
{
return;
}
printf("\n");
for (i = 1; i <= SA->num_of_fields; i++)
{
printf("%s\n",SA->fd[i]);
};
printf("\n");
}
void ascendtree()
{
int i;
i = first_key(SI.pe,SI.pix);
while (i != EOIX)
{
printf("%s %d\n",SI.pe->key,SI.pe->rptr);
i = next_key(SI.pe,SI.pix);
}
}
void descendtree()
{
int i;
last_key(SI.pe,SI.pix);
i = prev_key(SI.pe,SI.pix);
while (i != EOIX)
{
printf("%s %d\n",SI.pe->key,SI.pe->rptr);
i = prev_key(SI.pe,SI.pix);
}
}
char * FAR PASCAL _export parsecom(char *comstr,char *cp[])
{
/*num_of_params is a global variable in xbcmds.h */
num_of_params = (char)sscanf(comstr,"%s%s%s%s%s",cp[1],cp[2],cp[3],cp[4],cp[5]);
return(cp[1]);
}
void commands(char *command_str)
{
int i,j,ret;
int stat;
short fieldno;
char *cp[6];
char *dfile;
SA->fok = FALSE;
SI.idx = FALSE;
for (i=1;i<=5;i++)
{
cp[i] = calloc(param_size,sizeof(char));
memchk(cp[i],"commands","cp[i]",(long)(param_size*sizeof(char)));
}
while (strnicmp(command_str,"QUIT",3)!=0)
{
printf(".");
memset(command_str,' ',sizeof(command_str));
for (i=1;i<=5;i++)
{
/* cp[i] = "\0"; */
memset(cp[i],' ',sizeof(cp[i]));
}
gets(command_str);
command_verb = parsecom(command_str,cp);
if (strnicmp(command_verb,"LIST",3)==0)
{
if (!SA->fok) return;
stat = 1;
if (!SI.idx)
{
for (i=(int)SA->crn;i<=SA->hr->num_of_recs;i++)
{
if (num_of_params < 2)
{
display();
}
else
{
for (j=2;j<=num_of_params;j++)
{
sayfield(match(cp[j]));
}
printf("\n");
}
if (i != SA->hr->num_of_recs)
stat = skip(1);
}
}
else
{
while (stat != EOIX)
{
if (num_of_params <2)
{
display();
}
else
{
for (j=2;j<=num_of_params;j++)
{
sayfield(match(cp[j]));
}
printf("\n");
}
stat = skip(1);
}
}
}
if (strnicmp(command_verb,"FIELD",3)==0)
{
for (i=2;i<=num_of_params;i++)
sayfield(match(cp[i]));
printf("\n");
}
if (strnicmp(command_verb,"LOCA",3)==0)
locate(cp[2],cp[3]);
if (strnicmp(command_verb,"GOTO",3)==0)
{
i = atoi(cp[2]);
if ((i >= 0) && (i <= SA->hr->num_of_recs))
goto_rec(i);
else
printf("%d is not a valid number\n",i);
}
if (strnicmp(command_verb,"TOP ",3)==0) top();
if (strnicmp(command_verb,"BOTT",3)==0) bottom();
if (strnicmp(command_verb,"SKIP",3)==0)
{
i = atoi(cp[2]);
if (abs(i) <= SA->hr->num_of_recs)
skip(i);
else
if ((strnicmp(cp[2]," ",3)==0) ||
(num_of_params == 1))
skip(1);
else
printf("%d is not a valid record number\n",i);
}
if (strnicmp(command_verb,"COPY",3)==0) copyfile(cp);
if (strnicmp(command_verb,"DISP",3)==0) display();
if (strnicmp(command_verb,"USE ",3)==0)
{
if (num_of_params == 1)
{
if (SI.idx)
{
close_index(SI.pix);
free(SI.pix);
free(SI.pe);
}
if (SA->fok)
close_file(area);
}
else
{
if (strnicmp(cp[3],"INDEX",3)==0)
stat=TRUE;
else
{
stat=FALSE;
if (SI.idx)
{
close_index(SI.pix);
free(SI.pix);
free(SI.pe);
}
}
dfile = dbname(cp[2]);
xfile = dxname(cp[4]);
use(dfile,xfile,(char)stat);
}
}
if (strnicmp(command_verb,"SAVE",3)==0)
{
save_rec(area);
printf("record updated\n");
}
if (strnicmp(command_verb,"EDIT",3)==0)
{
if (num_of_params == 3)
{
if (edit_field(cp[2],cp[3]) == 0)
{
printf("could not edit %s\n",cp[2]);
}
}
}
if (strnicmp(command_verb,"SELE",3)==0)
{
i = atoi(cp[2]);
if (i==0)
printf("current work area = %d\n",area);
else
{
if ((i>-1) && (i<256))
area = (char)i;
else
printf("select %s failed\n",cp[2]);
}
}
if (strnicmp(command_verb,"RECO",3)==0) printf("%d\n",SA->crn);
if (strnicmp(command_verb,"DIR ",3)==0)
{
/* DOSERROR = system("C:\\COMMAND.COM /C DIR *.*"); */
if (DOSERROR != 0)
printf("#%d DOS ERROR\n",DOSERROR);
}
if (strnicmp(command_verb,"! ",3)==0)
{
/* DOSERROR = system("C:\\COMMAND.COM"); */
if (DOSERROR != 0)
printf("#%d DOS ERROR\n",DOSERROR);
}
/* if (strnicmp(command_verb,"BROW",3)==0) browse(W,H,X,Y); */
if (strnicmp(command_verb,"RELA",3)==0)
relate((char)atoi(cp[2]),(char)atoi(cp[3]),
(char)atoi(cp[4]),(char)atoi(cp[5]));
if (strnicmp(command_verb,"ASCE",3)==0) ascendtree();
if (strnicmp(command_verb,"DESC",3)==0) descendtree();
if (strnicmp(command_verb,"NIDX",3)==0)
{
ret = next_key(SI.pe,SI.pix);
if (ret==IX_OK)
goto_rec(SI.pe->rptr);
else
printf("%d\n",ret);
}
if (strnicmp(command_verb,"PIDX",3)==0)
{
if (prev_key(SI.pe,SI.pix)==IX_OK)
goto_rec(SI.pe->rptr);
}
if (strnicmp(command_verb,"INDE",3)==0)
{
fieldno = (short)atoi(cp[3]);
if ((fieldno > 0) && (fieldno <= SA->num_of_fields))
{
/* syntax - INDEX indexname fieldnumber */
SI.idx= FALSE;
xfile = dxname(cp[2]);
build_index(xfile,fieldno,SA->hr->num_of_recs);
}
else
printf("invalid order\n");
}
if (strnicmp(command_verb,"FIND",3)==0)
{
if (!SI.idx)
printf("this area not indexed\n");
else
{
if (num_of_params == 1)
cp[2] = " ";
if (!find(cp[2]))
printf("could not find %s\n",cp[2]);
}
}
if (strnicmp(command_verb,"SAYGET",3)==0)
{
}
if (strnicmp(command_verb,"APPE",3)==0) append_blank(area);
if (strnicmp(command_verb,"DELE",3)==0)
delete_rec(area);
if (strnicmp(command_verb,"PACK",3)==0)
{
/* pack(area); */
}
if (strnicmp(command_verb,"COUN",3)==0)
printf("%d\n",SA->hr->num_of_recs);
if (strnicmp(command_verb,"REIN",3)==0)
reindex(cp[2]);
if (strnicmp(command_verb,"HELP",3)==0)
for (i=0;i<=25;i++) printf("%s\n",help[i]);
#if MSDOS
if (strnicmp(command_verb,"MEMO",3)==0)
printf("memory available = %d free count = %d\n",_memavl(),_freect(1));
#endif
if (strnicmp(command_verb,"ORDE",3)==0)
{
i = atoi(cp[2]);
if (i==0)
printf("current order in area %d = %d\n",area,SA->ord);
else
order((char)atoi(cp[2]),(char)atoi(cp[3]));
}
if (strnicmp(command_verb,"OPEN",3)==0)
{
if (strnicmp(cp[2],"INDEX",3)==0)
{
if (open_index(dxname(cp[3]),1)==0)
printf("index open error\n");
}
}
if (strnicmp(command_verb,"SWAB",3)==0) swabdbf(cp[2]);
if (strnicmp(command_verb,"FIXH",3)==0)
{
SA->hr->num_of_recs = atol(cp[2]);
printf("num_of_recs = %d %x\n",
SA->hr->num_of_recs,
SA->hr->num_of_recs);
}
if (strnicmp(command_verb,"DEBU",3)==0)
{
printf(" Select Record Information\n");
printf("area = %d\n",SA->a);
printf("file pointer = %d\n",*SA->fp);
printf("file ok = %d\n",SA->fok);
printf("curr rec no = %d\n",SA->crn);
if (strnicmp(cp[2],"BUFF",3)==0)
{
for (i=0;i<SA->hr->cpr;i++) printf("%c",SA->rd[i]);
}
printf("indexed = %d\n",SI.idx);
printf("index order = %d\n",SA->ord);
printf("num_of_fields = %d\n",SA->num_of_fields);
/*
field_rec *fr[max_fields];
string fd[max_fields];
*/
printf(" Header Information - %s\n",dbname);
printf("version = %x\n",SA->hr->version);
/* update last_updated */
printf("num of recs = %d\n",SA->hr->num_of_recs);
printf("data start = %d\n",SA->hr->data_start);
printf("chars per rec = %d\n",SA->hr->cpr);
if (strnicmp(cp[2],"FIEL",3)==0)
{
i = atoi(cp[3]);
printf("%d\n",i);
if (i == 0)
{
for (i=1;i<=SA->num_of_fields;i++)
{
printf(" Field %d Information \n",i);
printf("field name char = %c\n",SA->fr[i]->field_name[0]);
printf("field_type = %c\n",SA->fr[i]->field_type);
printf("field_data_address = %d\n",SA->fr[i]->field_data_address);
printf("field_length = %d\n",SA->fr[i]->field_length);
printf("decimal_places = %d\n",SA->fr[i]->decimal_places) ;
}
}
else
{
printf(" Field %d Information \n",i);
printf("field name char = %c\n",SA->fr[i]->field_name[0]);
printf("field_type = %c\n",SA->fr[i]->field_type);
printf("field_data_address = %d\n",SA->fr[i]->field_data_address);
printf("field_length = %d\n",SA->fr[i]->field_length);
printf("decimal_places = %d\n",SA->fr[i]->decimal_places) ;
}
}
}
}
fcloseall();
}