home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Software of the Month Club 1995 December
/
SOFM_Dec1995.bin
/
pc
/
dos
/
biz
/
pbase
/
pbase.cfx
< prev
next >
Wrap
Text File
|
1995-10-31
|
76KB
|
2,792 lines
#define _ENTRY_
#ifdef __TURBOC__
#include <conio.h>
#else
#include <graph.h>
#endif
#include <io.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "db_lsc.h"
#include "db_types.h"
#include "db_conio.h"
#include "db_curs.h"
#include "db_date.h"
#include "db_dos.h"
#include "db_file.h"
#include "extfhc.h"
#include "db_funcs.h"
#include "db_heap.h"
#include "db_gvar.h"
#include "db_key.h"
#include "db_pswd.h"
#include "db_sets.h"
#include "db_str.h"
#include "db_win.h"
#include "db_mnu.h"
#include "db_util.h"
#include "db_work.h"
#include "db_tree.h"
#include "db_list.h"
#include "db_man.h"
#include "db_memo.h"
unsigned _stklen = 0x4000; /* Default stack of 16 K */
string _tts, _tranString; /* _tranString for internal generator use only */
/********************************* TYPES **********************************/
typedef struct {
char exeid[9];
byte anchor;
int deltat;
} defaultrec;
typedef enum {Cmd_No_Command,
Cmd_Next_Record,
Cmd_Prev_Record,
Cmd_Find_Record,
Cmd_Top_Record,
Cmd_Last_Record,
Cmd_Edit_Record,
Cmd_Add_Record,
Cmd_Copy_Record,
Cmd_Delete_Record,
Cmd_Next_File,
Cmd_Prev_File,
Cmd_Swap_Menu
}commandtyp;
typedef struct {
byte f;
byte k;
byte l;
uchar t;
} lback;
typedef struct savmtyp {
pathstr savnam;
byte savno;
char savprompt[81];
pathstr savpath;
struct savmtyp *savprv;
} savmtyp, *savmptr;
/************************* INITIALIZED VARIABLES **************************/
defaultrec def1 = {"öDBPSKL_",0,150};
namestr applname = "PBASE";
pathstr localmenu = "PBASE.MEN";
#define maxfilno 12
#define maxkeyno 16
str12 dbnames[maxfilno+1][maxkeyno+1] = /* [1.. ,0.. ] */
{
{"","","","","","","","","","","","","","","","",""},
{"PBASE1.DAT","PBASE1.K1","PBASE1.K2","PBASE1.K3","PBASE1.K4","PBASE1.K5","PBASE1.K6",
"PBASE1.K7","PBASE1.K8","PBASE1.K9","PBASE1.K10","PBASE1.K11","PBASE1.K12","PBASE1.K13",
"PBASE1.K14","",""},
{"PBASE2.DAT","PBASE2.K1","","","","","","","","","","","","","","",""},
{"PBASE3.DAT","PBASE3.K1","PBASE3.K2","","","","","","","","","","","","","",
""},
{"PBASE4.DAT","PBASE4.K1","PBASE4.K2","PBASE4.K3","PBASE4.K4","PBASE4.K5","PBASE4.K6",
"PBASE4.K7","PBASE4.K8","PBASE4.K9","PBASE4.K10","PBASE4.K11","PBASE4.K12","PBASE4.K13",
"PBASE4.K14","PBASE4.K15","PBASE4.K16"},
{"PBASE5.DAT","PBASE5.K1","","","","","","","","","","","","","","",""},
{"PBASE6.DAT","PBASE6.K1","","","","","","","","","","","","","","",""},
{"UCOUNT1.DAT","UCOUNT1.K1","UCOUNT1.K2","UCOUNT1.K3","UCOUNT1.K4","","","",
"","","","","","","","",""},
{"UCOMP1.DAT","UCOMP1.K1","UCOMP1.K2","","","","","","","","","","","","","",
""},
{"UOCCUP1.DAT","UOCCUP1.K1","UOCCUP1.K2","","","","","","","","","","","","",
"",""},
{"UZIP1.DAT","UZIP1.K1","","","","","","","","","","","","","","",""},
{"GRPACC1.DAT","GRPACC1.K1","GRPACC1.K2","","","","","","","","","","","","",
"",""},
{"UISSUE1.DAT","UISSUE1.K1","UISSUE1.K2","","","","","","","","","","","","",
"",""}};
long maxrec[maxfilno+1] =
{0,
2147483646,
2147483646,
2147483646,
2147483646,
2147483646,
2147483646,
2147483646,
2147483646,
2147483646,
2147483646,
2147483646,
2147483646};
byte keymode[maxfilno+1][maxkeyno+1] = /* [1.. ,1.. ] */
{
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0}};
byte keylen[maxfilno+1][maxkeyno+1] = /* [1.. ,1.. ] */
{
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,4,6,4,5,20,10,2,9,16,8,1,18,18,10,0,0},
{0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,4,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,4,30,15,10,3,3,8,1,15,15,8,1,20,20,20,20},
{0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,30,8,4,20,0,0,0,0,0,0,0,0,0,0,0,0},
{0,20,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,16,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,40,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,4,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0}};
byte keyseg1len[maxfilno+1][maxkeyno+1] =
{
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,4,6,4,5,20,10,2,9,16,8,1,18,18,10,0,0},
{0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,4,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,4,30,15,10,3,3,8,1,15,15,8,1,20,20,20,20},
{0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,30,8,4,20,0,0,0,0,0,0,0,0,0,0,0,0},
{0,20,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,16,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,40,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,4,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0}};
char keyuse[maxfilno+1][maxkeyno+1] = /* [1.. ,1.. ] */
{
{' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '},
{' ',_Display,_Edit,_Edit,_Edit,_Edit,_Edit,_Edit,_Edit,_Edit,_Edit,_Edit,_Edit,_Edit,_Edit,' ',' '},
{' ',_Include,' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '},
{' ',_Include,_Edit,' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '},
{' ',_Include,_Edit,_Edit,_Edit,_Edit,_Edit,_Edit,_Edit,_Edit,_Edit,_Edit,_Edit,_Edit,_Edit,_Edit,_Edit},
{' ',_Include,' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '},
{' ',_Edit,' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '},
{' ',_Include,_Include,_Include,_Include,' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '},
{' ',_Include,_Include,' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '},
{' ',_Include,_Include,' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '},
{' ',_Include,' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '},
{' ',_Include,_Include,' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '},
{' ',_Include,_Include,' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '}};
char keytype[maxfilno+1][maxkeyno+1] = /* [1.. ,1.. ] */
{
{' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '},
{' ',_Num,_Ch,_Ch,_Ch,_Ch,_Ch,_Ch,_Ch,_Ch,_Ch,_Ch,_Ch,_Ch,_Num,' ',' '},
{' ',_Num,' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '},
{' ',_Num,_Ch,' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '},
{' ',_Num,_Ch,_Ch,_Ch,_Ch,_Ch,_Ch,_Ch,_Ch,_Ch,_Ch,_Ch,_Ch,_Ch,_Ch,_Ch},
{' ',_Num,' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '},
{' ',_Ch,' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '},
{' ',_Ch,_Num,_Num,_Ch,' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '},
{' ',_Ch,_Num,' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '},
{' ',_Ch,_Ch,' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '},
{' ',_Ch,' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '},
{' ',_Ch,_Ch,' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '},
{' ',_Num,_Ch,' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '}};
byte keyfld[maxfilno+1][maxkeyno+1] = /* [1.. ,1.. ] */
{
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,1,3,5,6,2,11,12,26,27,28,10,7,8,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,1,2,3,4,5,7,8,9,10,11,12,13,14,15,16},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}};
findwtyp findscrpos[maxfilno+1][maxkeyno+1] = /* [1.. ,1.. ] */
{
{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11}},
{{0,0,0,0},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11}},
{{0,0,0,0},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11}},
{{0,0,0,0},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11}},
{{0,0,0,0},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11}},
{{0,0,0,0},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11}},
{{0,0,0,0},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11}},
{{0,0,0,0},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11}},
{{0,0,0,0},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11}},
{{0,0,0,0},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11}},
{{0,0,0,0},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11}},
{{0,0,0,0},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11},{20,10,40,11}}};
bool filinuse[maxfilno+1] =
{False,True,True,True,True,True,True,False,False,False,False,False,False};
byte winforfile[maxfilno+1] =
{0, 1, 2, 3, 4, 5, 6, 0, 0, 0, 0, 0, 0};
byte tabsize[maxfilno+1] =
{0,1,1,20,1,14,1,1,1,1,1,1,1};
lback linkback[maxfilno+1] =
{{0,0,0,' '},{0,0,0,' '},{1,1,4,_Unique},
{1,1,4,_Unique},{1,1,4,_Unique},
{1,1,4,_Unique},{0,0,0,' '},
{0,0,0,' '},{0,0,0,' '},
{0,0,0,' '},{0,0,0,' '},
{0,0,0,' '},{0,0,0,' '}};
str20 keynamtab[maxfilno+1][maxkeyno+1] =
{
{"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
""},
{"",
"ID",
"LAST_NAME",
"FIRST_NAME",
"POSITION",
"COMPANY",
"HONR",
"HOME_STATE",
"HOME_ZIP",
"STATUS",
"LAST_CONTACT",
"P_MARKED",
"HOME_CITY",
"HOME_ADDR1",
"HOME_STREET_NUM",
"",
""},
{"",
"ID",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
""},
{"",
"ID",
"GROUPS",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
""},
{"",
"ID",
"VOTER_COUNTY",
"VOTER_CITY",
"VOTER_PRECINCT",
"VOTER_CONG_DIST",
"VOTER_SCH_DIST",
"VOTER_BIRTHDATE",
"VOTER_SEX",
"VOTER_ORIGIN",
"VOTER_PARTY",
"VOTER_LAST_VOTED",
"VOTER_ABS",
"VOTER_ISSUE1",
"VOTER_ISSUE2",
"VOTER_ISSUE3",
"VOTER_ISSUE4"},
{"",
"ID",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
""},
{"",
"BOGUS_ID",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
""},
{"",
"VOTER_COUNTY",
"COUNTY_SIZE",
"ID",
"COUNTY_SEAT",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
""},
{"",
"COMPANY",
"ID",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
""},
{"",
"POSITION",
"POS_DESC",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
""},
{"",
"HOME_ZIP",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
""},
{"",
"GROUPS",
"GROUP_DESC",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
""},
{"",
"ISSID",
"VOTER_ISSUE",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
""}};
bool menudriven = False;
/******************************* VARIABLES ********************************/
bool switchtab,leaveclear;
recnotyp tabrecno;
byte tabidx[maxfilno+1];
byte tabused[maxfilno+1];
bool pathSwap;
savmptr smc, svm;
string tempString;
byte menuanchor;
bool quit,fok,cleartop,scrn_active, listAndAdd;
int keynum,_trace,filno,scrno,dispsno;
long nextrec;
keystr key,skey,tempkey;
mnufrec dm;
winfrec uw,hw;
winptr twinp;
int dbsize[maxfilno+1];
datafile *datf[maxfilno+1];
indexfile *idxkey[maxfilno+1][maxkeyno+1];
keystr tkeytab[maxkeyno+1], savkey[maxkeyno+1];
fldtyp *keyseg1fld[maxfilno + 1][maxkeyno + 1];
string savelnk[maxfilno+1];
int tv;
char lastrecop;
commandtyp command;
#include "PBASE1.STC"
#include "PBASE2.STC"
#include "PBASE3.STC"
#include "PBASE4.STC"
#include "PBASE5.STC"
#include "PBASE6.STC"
#include "UCOUNTY1.STC"
#include "UCOMP1.STC"
#include "UOCCUP1.STC"
#include "UZIP1.STC"
#include "GRPACCT1.STC"
#include "UISSUE1.STC"
bool custom_key(int scr, int fno, int *fld, uchar *key);
void getarec(int fno);
void putarec(int fno);
void displayrec(int fno, int sno);
void clear_rec(int fno);
strptr list(strptr sout, int fno, int kno, keystr ks);
strptr listadd(strptr sout, int fno, int kno, keystr aKey);
void tandk(int x, int y, winptr w)
{
string ts;
while (!kpressed()) {
if (mtime.x) writewxy(get_time(ts,(_timemode)(mtime.m)),0,mtime.x,mtime.y,NULL);
if (mksta.x) writewxy(keystat(ts,0),0,mksta.x,mksta.y,NULL);
}
}
bool found(int fno, int kno, keystr chkkey)
{
bool tok;
bool tfound;
keystr aKey; /* SN 3.5 */
tok = ok;
if ((fno != filno) && (keylen[fno][kno] > 0)) {
strcpy(aKey,chkkey); /* SN 3.5 */
searchkey(idxkey[fno][kno], &recno[fno], aKey); /* SN 3.5 */
ok = (bool)(ok && (strsearch(aKey, chkkey) == aKey)); /* SN 3.5 */
if (ok) switch (fno) {
case 1 : getrec(datf[1],recno[1],&PBASE1); break;
case 2 : getrec(datf[2],recno[2],&PBASE2); break;
case 3 : getrec(datf[3],recno[3],&PBASE3); break;
case 4 : getrec(datf[4],recno[4],&PBASE4); break;
case 5 : getrec(datf[5],recno[5],&PBASE5); break;
case 6 : getrec(datf[6],recno[6],&PBASE6); break;
case 7 : getrec(datf[7],recno[7],&UCOUNTY1); break;
case 8 : getrec(datf[8],recno[8],&UCOMP1); break;
case 9 : getrec(datf[9],recno[9],&UOCCUP1); break;
case 10 : getrec(datf[10],recno[10],&UZIP1); break;
case 11 : getrec(datf[11],recno[11],&GRPACCT1); break;
case 12 : getrec(datf[12],recno[12],&UISSUE1); break;
}
tfound = ok;
}
else tfound = False;
ok = tok;
recavail[fno] = tfound;
return(tfound);
}
#include "PBASE.EDT"
void openfiles(void)
{
int i, j, fo_i, fo_j;
string prepend;
int tlen;
string ts;
fo_i = fo_j = 0;
initPBASE1(); dbsize[1] = PBASE1.datasize;
initPBASE2(); dbsize[2] = PBASE2.datasize;
initPBASE3(); dbsize[3] = PBASE3.datasize;
initPBASE4(); dbsize[4] = PBASE4.datasize;
initPBASE5(); dbsize[5] = PBASE5.datasize;
initPBASE6(); dbsize[6] = PBASE6.datasize;
initUCOUNTY1(); dbsize[7] = UCOUNTY1.datasize;
initUCOMP1(); dbsize[8] = UCOMP1.datasize;
initUOCCUP1(); dbsize[9] = UOCCUP1.datasize;
initUZIP1(); dbsize[10] = UZIP1.datasize;
initGRPACCT1(); dbsize[11] = GRPACCT1.datasize;
initUISSUE1(); dbsize[12] = UISSUE1.datasize;
strip(prepend,datapath);
tlen = strlen(prepend);
if ((tlen > 0) && (prepend[tlen-1] != '\\')) {
prepend[tlen] = '\\';
prepend[tlen+1] = '\0';
}
fok = True;
for (i=1;i <= maxfilno; i++)
if (fok) {
datf[i] = db_malloc(sizeof(datafile));
strconcat(ts,prepend,dbnames[i][0],NULL);
openfile(datf[i],ts,dbsize[i]);
fok = (bool)(fok && ok);
if (fok) {
fo_i = i;
fo_j = 0;
for (j=1; j <= maxkeyno; j++)
if (fok && (keylen[i][j] > 0)) {
idxkey[i][j] = db_malloc(sizeof(indexfile));
strconcat(ts,prepend,dbnames[i][j],NULL);
openindex(idxkey[i][j],ts,keylen[i][j],keymode[i][j]);
fok = (bool)(fok && ok);
if (fok) fo_j = j;
}
}
else if (filinuse[i]) {
strconcat(ts,prepend,dbnames[i][0],NULL);
makefile(datf[i],ts,dbsize[i]);
fok = ok;
if (fok) {
fo_i = i; fo_j = 0;
for (j=1; j <= maxkeyno; j++)
if (fok && (keylen[i][j] > 0)) {
idxkey[i][j] = db_malloc(sizeof(indexfile));
strconcat(ts,prepend,dbnames[i][j],NULL);
makeindex(idxkey[i][j],ts,keylen[i][j],keymode[i][j]);
fok = (bool)(fok && ok);
if (fok) {
fo_j = j;
}
}
}
}
}
if (!fok)
for (i=1; i <= maxfilno; i++)
if (i <= fo_i) {
closefile(datf[i]);
db_free(datf[i]);
for (j=1; j <= maxkeyno; j++)
if ((i < fo_i) || (j <= fo_j))
if (keylen[i][j] > 0) {
closeindex(idxkey[i][j]);
db_free(idxkey[i][j]);
}
}
}
void closefiles(void)
{
int i,j;
for (i=1; i <= maxfilno; i++) {
closefile(datf[i]); db_free(datf[i]);
for (j=1; j <= maxkeyno; j++) if (keylen[i][j] > 0) {
closeindex(idxkey[i][j]);
db_free(idxkey[i][j]);
}
}
}
strptr makekey(strptr sout, int fno, int kno)
{
string ks, ts;
string tempString;
ks[0] = '\0';
switch (fno) {
case 1 : switch (kno) {
case 1 :
strcat(ks,PBASE1.ID);
break;
case 2 :
strcat(ks,strcopy(ts,PBASE1.LAST_NAME,0,6));
break;
case 3 :
strcat(ks,strcopy(ts,PBASE1.FIRST_NAME,0,4));
break;
case 4 :
strcat(ks,strcopy(ts,PBASE1.POSITION,0,5));
break;
case 5 :
strcat(ks,PBASE1.COMPANY);
break;
case 6 :
strcat(ks,PBASE1.HONR);
break;
case 7 :
strcat(ks,PBASE1.HOME_STATE);
break;
case 8 :
strcat(ks,PBASE1.HOME_ZIP);
break;
case 9 :
strcat(ks,PBASE1.STATUS);
break;
case 10 :
strcat(ks,PBASE1.LAST_CONTACT);
break;
case 11 :
strcat(ks,PBASE1.P_MARKED);
break;
case 12 :
strcat(ks,PBASE1.HOME_CITY);
break;
case 13 :
strcat(ks,PBASE1.HOME_ADDR1);
break;
case 14 :
strcat(ks,PBASE1.HOME_STREET_NUM);
break;
} break; /* switch (kno) */
case 2 : switch (kno) {
case 1 :
strcat(ks,PBASE2.ID);
break;
} break; /* switch (kno) */
case 3 : switch (kno) {
case 1 :
strcat(ks,PBASE3.ID);
break;
case 2 :
strcat(ks,PBASE3.GROUPS);
break;
} break; /* switch (kno) */
case 4 : switch (kno) {
case 1 :
strcat(ks,PBASE4.ID);
break;
case 2 :
strcat(ks,PBASE4.VOTER_COUNTY);
break;
case 3 :
strcat(ks,PBASE4.VOTER_CITY);
break;
case 4 :
strcat(ks,PBASE4.VOTER_PRECINCT);
break;
case 5 :
strcat(ks,PBASE4.VOTER_CONG_DIST);
break;
case 6 :
strcat(ks,PBASE4.VOTER_SCH_DIST);
break;
case 7 :
strcat(ks,PBASE4.VOTER_BIRTHDATE);
break;
case 8 :
strcat(ks,PBASE4.VOTER_SEX);
break;
case 9 :
strcat(ks,PBASE4.VOTER_ORIGIN);
break;
case 10 :
strcat(ks,PBASE4.VOTER_PARTY);
break;
case 11 :
strcat(ks,PBASE4.VOTER_LAST_VOTED);
break;
case 12 :
strcat(ks,PBASE4.VOTER_ABS);
break;
case 13 :
strcat(ks,PBASE4.VOTER_ISSUE1);
break;
case 14 :
strcat(ks,PBASE4.VOTER_ISSUE2);
break;
case 15 :
strcat(ks,PBASE4.VOTER_ISSUE3);
break;
case 16 :
strcat(ks,PBASE4.VOTER_ISSUE4);
break;
} break; /* switch (kno) */
case 5 : switch (kno) {
case 1 :
strcat(ks,PBASE5.ID);
break;
} break; /* switch (kno) */
case 6 : switch (kno) {
case 1 :
strcat(ks,PBASE6.BOGUS_ID);
break;
} break; /* switch (kno) */
case 7 : switch (kno) {
case 1 :
strcat(ks,UCOUNTY1.VOTER_COUNTY);
break;
case 2 :
strcat(ks,UCOUNTY1.COUNTY_SIZE);
break;
case 3 :
strcat(ks,UCOUNTY1.ID);
break;
case 4 :
strcat(ks,UCOUNTY1.COUNTY_SEAT);
break;
} break; /* switch (kno) */
case 8 : switch (kno) {
case 1 :
strcat(ks,UCOMP1.COMPANY);
break;
case 2 :
strcat(ks,UCOMP1.ID);
break;
} break; /* switch (kno) */
case 9 : switch (kno) {
case 1 :
strcat(ks,UOCCUP1.POSITION);
break;
case 2 :
strcat(ks,UOCCUP1.POS_DESC);
break;
} break; /* switch (kno) */
case 10 : switch (kno) {
case 1 :
strcat(ks,UZIP1.HOME_ZIP);
break;
} break; /* switch (kno) */
case 11 : switch (kno) {
case 1 :
strcat(ks,GRPACCT1.GROUPS);
break;
case 2 :
strcat(ks,strcopy(ts,GRPACCT1.GROUP_DESC,0,10));
break;
} break; /* switch (kno) */
case 12 : switch (kno) {
case 1 :
strcat(ks,UISSUE1.ISSID);
break;
case 2 :
strcat(ks,UISSUE1.VOTER_ISSUE);
break;
} break; /* switch (kno) */
} /* switch (fno) */
strcpy(sout,ks);
return(sout);
}
strptr keyexpr(strptr sout, int fno, int kno, string kvar)
{
string ts, ks;
byte tlen;
strcpy(ks,kvar);
tlen = strlen(ks);
switch (fno) {
case 1 : switch (kno) {
case 1 :
fstr(ts,valu(strcopy(ts,ks,0,4)),4,0); memmove(&ks[0],ts,4);
break;
case 2 :
strcpy(ts,upper(_tts,strcopy(ts,ks,0,6))); memmove(&ks[0],ts,6);
break;
case 3 :
strcpy(ts,upper(_tts,strcopy(ts,ks,0,4))); memmove(&ks[0],ts,4);
break;
case 7 :
strcpy(ts,upper(_tts,strcopy(ts,ks,0,2))); memmove(&ks[0],ts,2);
break;
case 14 :
fstr(ts,valu(strcopy(ts,ks,0,10)),10,0); memmove(&ks[0],ts,10);
break;
} break;
case 2 : switch (kno) {
case 1 :
fstr(ts,valu(strcopy(ts,ks,0,4)),4,0); memmove(&ks[0],ts,4);
break;
} break;
case 3 : switch (kno) {
case 1 :
fstr(ts,valu(strcopy(ts,ks,0,4)),4,0); memmove(&ks[0],ts,4);
break;
} break;
case 4 : switch (kno) {
case 1 :
fstr(ts,valu(strcopy(ts,ks,0,4)),4,0); memmove(&ks[0],ts,4);
break;
} break;
case 5 : switch (kno) {
case 1 :
fstr(ts,valu(strcopy(ts,ks,0,4)),4,0); memmove(&ks[0],ts,4);
break;
} break;
case 7 : switch (kno) {
case 2 :
fstr(ts,valu(strcopy(ts,ks,0,8)),8,0); memmove(&ks[0],ts,8);
break;
case 3 :
fstr(ts,valu(strcopy(ts,ks,0,4)),4,0); memmove(&ks[0],ts,4);
break;
} break;
case 8 : switch (kno) {
case 2 :
fstr(ts,valu(strcopy(ts,ks,0,4)),4,0); memmove(&ks[0],ts,4);
break;
} break;
case 12 : switch (kno) {
case 1 :
fstr(ts,valu(strcopy(ts,ks,0,4)),4,0); memmove(&ks[0],ts,4);
break;
} break;
}
ks[tlen] = Nul;
strcpy(sout,ks);
return(sout);
}
strptr getakey(strptr sout, int fno, int kno)
{
keyexpr(sout,fno,kno,makekey(sout,fno,kno));
return(sout);
}
strptr getlink(strptr sout, int fno)
{
string tkey;
tkey[0] = '\0';
getakey(tkey,linkback[fno].f,linkback[fno].k);
strcopy(sout,tkey,0,linkback[fno].l);
return(sout);
}
void edit_rec(int fld)
{
edthook = tandk;
PBASE_edt(filno,fld,tabidx[filno] - 1);
edthook = NULL;
}
bool status_ok(int fno)
{
bool tok;
keystr tk1, tk2;
tok = (bool)(usedrecs(datf[fno]) > 0);
if (linkback[fno].f > 0) {
getlink(tk1,fno);
strcopy(tk2,getakey(tk2,fno,1),0,linkback[fno].l);
tok = (bool)(tok && recavail[linkback[fno].f] && (strcmp(tk1,tk2) == 0));
}
recavail[fno] = tok;
return(tok);
}
void clearbuf(ptr fb)
{
word w;
string tpic;
fldblk *fblk;
fldtyp *ftp;
fblk = fb;
for (w=0; w < fblk->numf; w++) {
ftp = &(*fblk->farr)[w];
expand(tpic,ftp->pic);
switch (ftp->typ) {
case _Ch : fillstr(ftp->faddr,piclen(tpic,ftp->typ),' '); break;
case _Num : fstr(ftp->faddr,0.0,_calc_int(tpic),_calc_frac(tpic)); break;
case _Memo : memset(ftp->faddr,0,4); break;
}
}
}
void clearmemo(ptr fb)
{
word w;
fldblk *fblk;
bool memofile;
fldtyp *ftp;
fblk = fb;
memofile = False;
for (w=0; w < fblk->numf; w++) {
ftp = &(*fblk->farr)[w];
if (ftp->typ == _Memo) {
memofile = True;
memset(ftp->faddr,0,4);
}
}
if (memofile) displayrec(filno,scrno);
}
void clear_rec(int fno)
{
int i;
if (link == Up_N_Down)
for (i=1; i <= maxfilno; i++)
if (linkback[i].f == (byte)fno) clear_rec(i);
if (cleartop || (fno != filno)) {
switch (fno) {
case 1 : clearbuf(&PBASE1.datasize); break;
case 2 : clearbuf(&PBASE2.datasize); break;
case 3 : clearbuf(&PBASE3.datasize); break;
case 4 : clearbuf(&PBASE4.datasize); break;
case 5 : clearbuf(&PBASE5.datasize); break;
case 6 : clearbuf(&PBASE6.datasize); break;
case 7 : clearbuf(&UCOUNTY1.datasize); break;
case 8 : clearbuf(&UCOMP1.datasize); break;
case 9 : clearbuf(&UOCCUP1.datasize); break;
case 10 : clearbuf(&UZIP1.datasize); break;
case 11 : clearbuf(&GRPACCT1.datasize); break;
case 12 : clearbuf(&UISSUE1.datasize); break;
}
displayrec(fno,scrno);
}
}
/* SN 3.5 - the whole function was created for this version 3.5 */
long add2CodeFile(int fileNumber)
{
bool saveOk,
aOk;
byte keyNumber, keyNumberCount;
keystr aKey;
char *aBufferPtr,
*aFieldPtr,
errorMessage[256];
saveOk = ok;
*(recno + fileNumber) = 0;
switch(fileNumber) {
case 7 : {
aBufferPtr = (ptr)(&UCOUNTY1);
aFieldPtr = (ptr)(&UCOUNTY1.datasize);
}
break;
case 8 : {
aBufferPtr = (ptr)(&UCOMP1);
aFieldPtr = (ptr)(&UCOMP1.datasize);
}
break;
case 9 : {
aBufferPtr = (ptr)(&UOCCUP1);
aFieldPtr = (ptr)(&UOCCUP1.datasize);
}
break;
case 10 : {
aBufferPtr = (ptr)(&UZIP1);
aFieldPtr = (ptr)(&UZIP1.datasize);
}
break;
case 11 : {
aBufferPtr = (ptr)(&GRPACCT1);
aFieldPtr = (ptr)(&GRPACCT1.datasize);
}
break;
case 12 : {
aBufferPtr = (ptr)(&UISSUE1);
aFieldPtr = (ptr)(&UISSUE1.datasize);
}
break;
default :
aBufferPtr = aFieldPtr = 0;
break;
}
if (aBufferPtr) {
clearbuf(aFieldPtr);
memmove(aBufferPtr, &recno[fileNumber], 4);
do {
ok = False;
editdefaultdata(fileNumber, aFieldPtr);
if (exitcode != QitKey) {
addrec(datf[fileNumber], &recno[fileNumber], aBufferPtr);
keyNumber = 0;
ok = True;
while (ok && (keyNumber < maxkeyno)) {
keyNumber++;
if (keylen[fileNumber][keyNumber]) {
getakey(aKey, fileNumber, keyNumber);
addkey(idxkey[fileNumber][keyNumber], &recno[fileNumber], aKey);
}
}
if (!ok) {
audible(Error);
dspmsge(LSC_BaseError, strconcat(errorMessage, LSC_KeyExists, "(", keynamtab[fileNumber][keyNumber], ")"), 4);
for (keyNumberCount = 1; keyNumberCount < keyNumber; keyNumberCount++) {
if (keylen[fileNumber][keyNumberCount]) {
getakey(aKey, fileNumber, keyNumberCount);
deletekey(idxkey[fileNumber][keyNumberCount], &recno[fileNumber], aKey);
}
}
deleterec(datf[fileNumber], recno[fileNumber]);
ok = False;
}
}
}while (!ok && (exitcode != QitKey));
if (exitcode == QitKey) {
clearbuf(aFieldPtr);
recno[fileNumber] = 0;
}
}
ok = saveOk;
exitcode = Nul;
return(recno[fileNumber]);
}
bool skip(char dirn, int fno)
{
bool fval;
string ts;
fval = True;
if (dirn == _Next) nextkey(idxkey[fno][1],&recno[fno],key);
else prevkey(idxkey[fno][1],&recno[fno],key);
if (linkback[fno].f > 0) ok = (bool)(ok && (strsearch(key,getlink(ts,fno)) == key));
if (!ok) {
fval = False;
if (dirn == _Next) prevkey(idxkey[fno][1],&recno[fno],key);
else nextkey(idxkey[fno][1],&recno[fno],key);
}
return(fval);
}
void getarec(int fno)
{
int i;
string tkey;
string ts;
bool tb;
tkey[0] = '\0';
recavail[fno] = ok;
if (ok)
switch (fno) {
case 1 : getrec(datf[1],recno[1],&PBASE1); break;
case 2 : getrec(datf[2],recno[2],&PBASE2); break;
case 3 : getrec(datf[3],recno[3],&PBASE3); break;
case 4 : getrec(datf[4],recno[4],&PBASE4); break;
case 5 : getrec(datf[5],recno[5],&PBASE5); break;
case 6 : getrec(datf[6],recno[6],&PBASE6); break;
case 7 : getrec(datf[7],recno[7],&UCOUNTY1); break;
case 8 : getrec(datf[8],recno[8],&UCOMP1); break;
case 9 : getrec(datf[9],recno[9],&UOCCUP1); break;
case 10 : getrec(datf[10],recno[10],&UZIP1); break;
case 11 : getrec(datf[11],recno[11],&GRPACCT1); break;
case 12 : getrec(datf[3],recno[12],&UISSUE1); break;
}
if ((!recavail[fno]) ||
((link != No_Link) && (_trace != fno) && !status_ok(fno))) {
tb = scrn_active;
scrn_active = False;
clear_rec(fno);
scrn_active = tb;
recavail[fno] = False;
}
if (link != No_Link) {
if ((tabsize[fno] > 1) && (fno != filno) && !switchtab) {
tabrecno[fno] = recno[fno]; tabidx[fno] = 1;
}
for (i=1; i <= maxfilno; i++)
if (linkback[i].f == (byte)fno)
if (!status_ok(i)) {
getlink(tkey,i);
searchkey(idxkey[i][1],&recno[i],tkey);
ok = (bool)(ok && (strsearch(tkey,getlink(ts,i)) == tkey));
getarec(i); /* recursion */
}
}
if (fno == filno) ok = recavail[fno];
}
void putarec(int fno)
{
if (recavail[fno]) {
switch (fno) {
case 1 : putrec(datf[1],recno[1],&PBASE1); break;
case 2 : putrec(datf[2],recno[2],&PBASE2); break;
case 3 : putrec(datf[3],recno[3],&PBASE3); break;
case 4 : putrec(datf[4],recno[4],&PBASE4); break;
case 5 : putrec(datf[5],recno[5],&PBASE5); break;
case 6 : putrec(datf[6],recno[6],&PBASE6); break;
case 7 : putrec(datf[7],recno[7],&UCOUNTY1); break;
case 8 : putrec(datf[8],recno[8],&UCOMP1); break;
case 9 : putrec(datf[9],recno[9],&UOCCUP1); break;
case 10 : putrec(datf[10],recno[10],&UZIP1); break;
case 11 : putrec(datf[11],recno[11],&GRPACCT1); break;
case 12 : putrec(datf[12],recno[12],&UISSUE1); break;
}
}
}
void top_record(void)
{
if (!linkback[filno].f) {
clearkey(idxkey[filno][1]);
nextkey(idxkey[filno][1],&recno[filno],key);
}
else {
getlink(tempkey,filno);
strcpy(skey,tempkey);
searchkey(idxkey[filno][1],&recno[filno],tempkey);
ok = (bool)(ok && (strsearch(tempkey,skey) == tempkey));
}
if (ok)
getarec(filno);
else {
clear_rec(filno);
recavail[filno] = False;
}
if (tabsize[filno] > 1) {
tabrecno[filno] = recno[filno]; tabidx[filno] = 1;
}
displayrec(filno,scrno);
}
void findmulti(int fno, long *recn, strptr key2find)
{
long saverecn;
keystr savk2f;
saverecn = *recn;
strcpy(savk2f,key2find);
searchkey(idxkey[fno][1],recn,key2find);
ok = (bool)(ok && (strsearch(key2find,savk2f) == key2find));
while ((*recn != saverecn) && ok) {
nextkey(idxkey[fno][1],recn,key2find);
ok = (bool)(ok && (strsearch(key2find,savk2f) == key2find));
}
}
void gettabrec(byte fno)
{
switch (fno) {
case 3 : getrec(datf[3],tabrecno[3],&PBASE3); break;
case 5 : getrec(datf[5],tabrecno[5],&PBASE5); break;
}
}
void disptab(byte fno)
{
byte incy;
long srec;
bool rec_ok;
string tk;
if (tabsize[fno] < 2) {
incy = tabidx[fno]-1;
PBASE_dsp(fno,dispsno,incy);
}
else {
incy = 0;
rec_ok = recavail[fno];
if (rec_ok) {
srec = recno[fno];
if (!leaveclear || (linkback[fno].f != (byte)filno)) gettabrec(fno);
getakey(tk,fno,1);
findmulti(fno,&tabrecno[fno],tk);
if (!ok) {
scrn_active = False;
clear_rec(fno);
scrn_active = True;
rec_ok = False;
}
if ((tabidx[fno] > tabsize[fno]) && (skip(_Next,fno))) {
tabidx[fno] = tabsize[fno];
tabrecno[fno] = recno[fno];
gettabrec(fno);
}
if ((tabidx[fno] == 0) && (skip(_Prev,fno))) {
tabidx[fno] = 1;
tabrecno[fno] = recno[fno];
gettabrec(fno);
}
}
(uw.wa[dispsno])->disp = False;
tabused[fno] = 0;
do {
PBASE_dsp(fno,dispsno,incy);
incy++;
if (rec_ok && (incy < tabsize[fno])) {
tabused[fno] = incy;
link = No_Link;
if ((!leaveclear || (linkback[fno].f != (byte)filno)) && recavail[fno]) {
if (skip(_Next,fno)) getarec(fno);
else {
scrn_active = False;
clear_rec(fno);
scrn_active = True;
rec_ok = False;
}
}
else {
scrn_active = False;
clear_rec(fno);
scrn_active = True;
rec_ok = False;
}
link = Up_N_Down;
}
} while (incy < tabsize[fno]);
(uw.wa[dispsno])->disp = True; dispwindow(uw.wa[dispsno]);
if (recavail[fno]) {
recno[fno] = srec;
if (!leaveclear || (linkback[fno].f != (byte)filno)) getarec(fno);
else {
link = No_Link;
getarec(fno);
link = Up_N_Down;
}
getakey(tk,fno,1);
findmulti(fno,&srec,tk);
}
}
}
void dispfields(int fno, int sno)
{
dispsno = sno;
switch (sno) {
case 1 :
PBASE_dsp(1,sno,0);
break;
case 2 :
PBASE_dsp(2,sno,0);
break;
case 3 :
if (fno <= 3) disptab( 3);
break;
case 4 :
PBASE_dsp(4,sno,0);
break;
case 5 :
if (fno <= 5) disptab( 5);
break;
case 6 :
PBASE_dsp(6,sno,0);
break;
}
}
void displayrec(int fno, int sno)
{
if (scrn_active) dispfields(fno,sno);
}
void switch_file(char mode)
{
int fno,incr;
scrn_active = True;
if (mode == '+') incr = 1;
else if (mode == '-') incr = -1;
else incr = 0;
fno = filno;
do {
filno += incr;
if ((filno < 1) || (filno > maxfilno)) {
incr = -incr; filno += incr;
audible(Warning);
}
} while (!filinuse[filno] && (filno != fno));
if (scrno < winforfile[filno]) displayrec(filno,scrno);
while (scrno > winforfile[filno]) {
hidewin(T_OFF,uw.wa[scrno]);
scrno--;
}
while (scrno < winforfile[filno]) {
scrno++;
hidewin(T_ON,uw.wa[scrno]);
}
if (!status_ok(filno)) top_record(); else ok = True;
switchtab = True;
displayrec(filno,scrno);
switchtab = False;
}
void traceback(int fno)
{
string tk,sk;
int f,k;
f = linkback[fno].f;
k = linkback[fno].k;
_trace = f;
if (recavail[fno]) {
strcopy(tk,getakey(tk,fno,1),0,linkback[fno].l); strcpy(sk,tk);
searchkey(idxkey[f][k],&recno[f],tk);
ok = (bool)(ok && (strsearch(tk,sk) == tk));
if (ok) {
getarec(f);
ok = status_ok(fno);
if (tabsize[f] > 1) {
tabrecno[f] = recno[f]; tabidx[f] = 1;
}
if (ok && (k > 1)) {
getakey(tk,f,1);
findmulti(f,&recno[f],tk);
}
}
}
else ok = True;
if (!ok) {
audible(Error);
dspmsge(LSC_BaseError,LSC_TracebackFailed,4.0);
filno = 1;
switch_file(' ');
top_record();
}
else
if (linkback[f].f > 0)
traceback(f);
_trace = 0;
ok = status_ok(fno);
}
void align_tab(int fno)
{
byte count;
long srno;
string ts;
getakey(tempkey,fno,1);
strcpy(skey,tempkey);
srno = recno[fno];
count = 1;
do {
prevkey(idxkey[fno][1],&recno[fno],tempkey);
ok = (bool)(ok && (strsearch(tempkey,getlink(ts,fno)) == tempkey));
if (ok) count++;
} while ((count <= tabsize[fno]) && ok);
if (!ok) nextkey(idxkey[fno][1],&recno[fno],tempkey);
tabidx[fno] = count;
tabrecno[fno] = recno[fno];
recno[fno] = srno;
findmulti(filno,&recno[fno],skey);
}
void displayall(void)
{
int i;
for (i=1; i <= filno; i++) (uw.wa[winforfile[i]])->disp = False;
link = No_Link;
for (i=1; i <= scrno; i++) displayrec(0,i);
link = Up_N_Down;
for (i=1; i <= filno; i++) hidewin(T_ON,uw.wa[winforfile[i]]);
}
void align_rec(long oldr)
{
int i;
ok = True;
_trace = filno;
recno[filno] = oldr;
scrn_active = False;
if (oldr > 0) getarec(filno);
else recavail[filno] = False;
if (recavail[filno]) {
getakey(skey,filno,1);
findmulti(filno,&oldr,skey);
if (!ok) {
audible(Error);
dspmsge(LSC_BaseError,LSC_Mismatch,4.0);
top_record();
}
}
else top_record();
if (linkback[filno].f > 0) traceback(filno);
if (tabsize[filno] > 1) align_tab(filno);
_trace = 0;
scrn_active = True;
displayall();
}
void next_record(char dirn)
{
long savr;
if (status_ok(filno)) {
savr = recno[filno];
if (skip(dirn,filno)) {
getarec(filno);
if (tabsize[filno] > 1)
if (dirn == _Next) tabidx[filno]++; else tabidx[filno]--;
if (!recavail[filno]) align_rec(savr);
else displayrec(filno,scrno);
}
else audible(Warning);
if (!ok) top_record();
}
else audible(Warning);
}
void next_tab_page(char dirn)
{
byte count;
if ((tabsize[filno] > 1) && status_ok(filno)) {
count = 1;
while ((count < tabsize[filno]) && skip(dirn,filno)) count++;
getarec(filno);
align_tab(filno);
displayrec(filno,scrno);
}
}
void last_record(void)
{
long savr;
if (status_ok(filno)) {
savr = recno[filno];
if (linkback[filno].f == 0) {
clearkey(idxkey[filno][1]);
prevkey(idxkey[filno][1],&recno[filno],key);
}
else {
getlink(tempkey,filno);
strcpy(skey,tempkey);
searchkey(idxkey[filno][1],&recno[filno],tempkey);
ok = (bool)(ok && (strsearch(tempkey,skey) == tempkey));
if (ok) {
while (ok) {
nextkey(idxkey[filno][1],&recno[filno],tempkey);
ok = (bool)(ok && (strsearch(tempkey,skey) == tempkey));
}
prevkey(idxkey[filno][1],&recno[filno],tempkey);
}
}
if (!ok) top_record();
else {
getarec(filno);
if (tabsize[filno] > 1) align_tab(filno);
if (!recavail[filno]) align_rec(savr);
else displayrec(filno,scrno);
}
}
else audible(Warning);
}
strptr horizrec(strptr sout, uchar mode, byte fno, byte kno)
{
string ts;
strcpy(ts, "~");
if (mode == _Header) {
switch (fno) {
case 1:
break;
case 2:
break;
case 3:
break;
case 4:
break;
case 5:
break;
case 6:
break;
case 7:
break;
case 8:
break;
case 9:
break;
case 10:
break;
case 11:
break;
case 12:
break;
}
if (ts[0] == '~') strconcat(ts,LSC_DispSequence," ",keynamtab[fno][kno],NULL);
}
else {
switch (fno) {
case 1:
if (ts[0] == '~') defaultdata(ts,&PBASE1.datasize);
break;
case 2:
if (ts[0] == '~') defaultdata(ts,&PBASE2.datasize);
break;
case 3:
if (ts[0] == '~') defaultdata(ts,&PBASE3.datasize);
break;
case 4:
if (ts[0] == '~') defaultdata(ts,&PBASE4.datasize);
break;
case 5:
if (ts[0] == '~') defaultdata(ts,&PBASE5.datasize);
break;
case 6:
if (ts[0] == '~') defaultdata(ts,&PBASE6.datasize);
break;
case 7:
if (ts[0] == '~') defaultdata(ts,&UCOUNTY1.datasize);
break;
case 8:
if (ts[0] == '~') defaultdata(ts,&UCOMP1.datasize);
break;
case 9:
if (ts[0] == '~') defaultdata(ts,&UOCCUP1.datasize);
break;
case 10:
if (ts[0] == '~') defaultdata(ts,&UZIP1.datasize);
break;
case 11:
if (ts[0] == '~') defaultdata(ts,&GRPACCT1.datasize);
break;
case 12:
if (ts[0] == '~') defaultdata(ts,&UISSUE1.datasize);
break;
}
}
pad(sout,ts,255,Right);
return(sout);
}
void display_the_find(long trecno, long oldnum)
{
align_rec(trecno ? trecno : oldnum);
}
void find_record(void)
{
int tpos,i, dsplen;
bool tb,abort;
char temp_pic[DB_Klen+1];
long trecno,oldnum;
char chosen[21];
string numstr, choosestr;
string ts;
string aPictureField;
uchar aFieldType;
exitcode = ' ';
if ((usedrecs(datf[filno]) > 0) && (filinuse[filno])) {
oldnum = (recavail[filno]) ? recno[filno] : 0;
if ((keynum > maxkeyno) || (keylen[filno][keynum] == 0)) keynum = 1;
abort = False;
dsplen = 0; /* SN 3.5 */
for (i = 1; i <= maxkeyno; ++i) dsplen += strlen(keynamtab[filno][i]); /* SN 3.5 */
/* dsplen = (dsplen > 255) ? 14 : 20; */ /* SN 3.5 */
dsplen = 12;
i = keynum;
choosestr[0] = '\0';
numstr[0] = '\0';
do {
if ((keylen[filno][i] != 0) && (keynamtab[filno][i][0] != '\0')) {
strconcat(numstr,numstr,istr(ts,(long)i,2),"|",NULL);
strconcat(choosestr,choosestr,pad(ts,keynamtab[filno][i],dsplen,Right),"|",NULL); /* SN 3.5 */
}
i++;
if (i > maxkeyno) i = 1;
} while (i != keynum);
gotoxy((scrwid-20)/2,scrhgt-maxkeyno-4);
tb = permitesc;
permitesc = True;
i = strlen(numstr);
if (!i) exitcode = QitKey;
else if (i == 3) strcopy(chosen, numstr, 0, 2);
else choose(key, numstr, choosestr, chosen);
permitesc = tb;
if (chosen[0] != 0) keynum = (int) ival(chosen);
abort = (bool)(exitcode == QitKey);
if (!abort) {
strconcat(ts," ",LSC_EnterTheKey," : ",trim(ts,keynamtab[filno][keynum])," ",NULL);
if (openwin(0,2,scrhgt-2,78,1,31,31,8,"─┐│┘─└│┌",TopCnt,ts)) {
twinp = curwin;
twinp->disp = True;
dispwindow(twinp);
fillstr(key,DB_Klen,' ');
strchcat(strip(temp_pic,istr(temp_pic,(long)DB_Klen,3)),Pic_X);
tpos = (78-(strlen(LSC_EnterOrEsc)+DB_Klen+2))/2;
writewxy(LSC_EnterOrEsc,31,(byte)tpos,1,twinp);
tpos = tpos + strlen(LSC_EnterOrEsc) + 1;
/* Written by SN 3.5 - Start */
strcpy(aPictureField, keyseg1fld[filno][keynum]->pic);
aFieldType = keyseg1fld[filno][keynum]->typ;
expand(choosestr, aPictureField);
switch (aFieldType) {
case _Ch : {
fillstr(choosestr, piclen(choosestr, aFieldType), ' ');
break;
}
case _Num : {
fstr(choosestr, 0.0, _calc_int(choosestr), _calc_frac(choosestr));
break;
}
}
dsp_fld(tpos,1,choosestr, aFieldType, aPictureField, 1, 40, 0, twinp);
edt_fld(tpos,1,choosestr, aFieldType, aPictureField, 40, 0, twinp);
*skey = '\0';
strcopy(key,choosestr,0,keyseg1len[filno][keynum]);
if (aFieldType == _Num && (valu(key) == 0)) *key = '\0';
pic_fld(choosestr, choosestr, aFieldType, 0, 0, aPictureField);
/* Written by SN 3.5 - Finish */
closewin(&twinp);
if (exitcode == Esc) goto Find_Exit;
if (!empty(key)) {
trim(key,keyexpr(key,filno,keynum,key));
strcpy(skey,key);
}
searchkey(idxkey[filno][keynum],&recno[filno],key);
if ((!ok) || (strsearch(key,skey) != key)) {
audible(Warning);
strconcat(ts, LSC_NoExactMatch, choosestr, NULL);
strcopy (ts, ts, 0, 76);
dspmsge("",ts,4.0);
}
tempkey[0] = '\0';
if (ok) {
nextkey(idxkey[filno][keynum],&recno[filno],key);
if (ok) strcpy(tempkey,key);
prevkey(idxkey[filno][keynum],&recno[filno],key);
}
else prevkey(idxkey[filno][keynum],&recno[filno],key);
if (!skey[0] || (strsearch(key,skey) != key) || (strsearch(tempkey,skey) == tempkey)) {
trecno = list_n_choose((byte)filno,(byte)keynum,key,idxkey[filno][keynum],findscrpos[filno][keynum]);
display_the_find(trecno,oldnum);
}
else align_rec(recno[filno]);
}
}
}
else audible(Warning);
Find_Exit : ;
exitcode = ' ';
}
strptr list(strptr sout, int fno, int kno, keystr ks)
{
long trecno;
keystr lastks;
bool tok;
byte stabsiz;
if (!listAndAdd) listing = True;
if ((fno != filno) && (keylen[fno][kno] > 0)) {
tok = ok;
scrn_active = False;
strcpy(lastks,ks);
clearkey(idxkey[fno][kno]);
nextkey(idxkey[fno][kno],&recno[fno],lastks);
lastks[0] = '\0';
trecno = -1;
if (ok) trecno = list_n_choose((byte)fno,(byte)kno,lastks,idxkey[fno][kno],findscrpos[fno][kno]);
if (trecno == 0 && listAndAdd) trecno = add2CodeFile(fno);
if (trecno > 0) {
ok = True;
recno[fno] = trecno;
link = No_Link;
getarec(fno);
link = Up_N_Down;
strcopy(ks,makekey(lastks,fno,kno),0,strlen(ks));
}
else clear_rec(fno);
ok = tok;
scrn_active = True;
stabsiz = tabsize[filno];
tabsize[filno] = 1;
displayrec(filno,scrno);
tabsize[filno] = stabsiz;
}
fldnum--;
listing = False;
sout[0] = '\0';
return(sout);
}
/* SN 3.5 - The complete Function was created for 3.5 */
strptr listadd(strptr sout, int fno, int kno, keystr aKey)
{
listAndAdd = True;
list(sout, fno, kno, aKey);
listAndAdd = False;
return(sout);
}
void setlinkage(int fno)
{
switch (fno) {
case 2 : strcpy(PBASE2.ID,PBASE1.ID); break;
case 3 : strcpy(PBASE3.ID,PBASE1.ID); break;
case 4 : strcpy(PBASE4.ID,PBASE1.ID); break;
case 5 : strcpy(PBASE5.ID,PBASE1.ID); break;
}
}
void remove_keys(int badkey)
{
long recd;
int keyno;
for (keyno = 1; keyno <= (badkey-1); keyno++)
if (strcmp(savkey[keyno],tkeytab[keyno]) != 0) {
recd = recno[filno];
deletekey(idxkey[filno][keyno],&recd,tkeytab[keyno]);
}
}
void putlink(int nummer)
{
string tkey;
long trecno;
int tf;
do {
strcpy(key,savelnk[nummer]);
strcpy(tkey,key);
searchkey(idxkey[nummer][1],&recno[nummer],key);
ok = (bool)(ok && (strsearch(key,tkey) == key));
if (ok) {
link = No_Link;
getarec(nummer);
link = Up_N_Down;
for (tf = 1; tf <= maxkeyno; tf++)
getakey(savkey[tf],nummer,tf);
for (tf = 1; tf <= maxfilno; tf++)
if (linkback[tf].f == nummer) getlink(savelnk[tf],tf);
setlinkage(nummer);
putarec(nummer);
for (tf = 1; tf <= maxkeyno; tf++) {
getakey(tkey,nummer,tf);
if (strcmp(savkey[tf],tkey) != 0) {
deletekey(idxkey[nummer][tf],&recno[nummer],savkey[tf]);
addkey(idxkey[nummer][tf],&recno[nummer],tkey);
}
}
for (tf = 1; tf <= maxfilno; tf++)
if ((linkback[tf].f == nummer) && filinuse[tf] &&
(strcmp(savelnk[tf],getlink(tkey,tf)) != 0)) putlink(tf);
}
} while (ok);
ok = True;
}
void edit_record(void)
{
bool changedkey;
int fno,tf,keyno;
long trecno;
keystr tk;
editmode = True;
lastrecop = _Edit;
if (status_ok(filno)) {
getarec(filno);
displayrec(filno,scrno);
for (keyno = 1; keyno <= maxkeyno; keyno++)
getakey(savkey[keyno],filno,keyno);
for (fno = 1; fno <= maxfilno; fno++) if (linkback[fno].f == filno)
getlink(savelnk[fno],fno);
edit_rec(0);
changedkey = False;
if (exitcode != QitKey) {
keyno = 1;
while ((keyno <= maxkeyno) && (exitcode != QitKey)) {
getakey(tkeytab[keyno],filno,keyno);
if (strcmp(tkeytab[keyno],savkey[keyno]) == 0)
ok = True;
else {
addkey(idxkey[filno][keyno],&recno[filno],tkeytab[keyno]);
if (!ok) {
remove_keys(keyno);
audible(Error);
dspmsge(LSC_BaseError,LSC_KeyExists,4.0);
edit_rec(keyfld[filno][keyno]);
keyno = 0;
}
}
keyno++;
}
if (exitcode != QitKey) {
for (keyno = 1; keyno <= maxkeyno; keyno++)
if (strcmp(tkeytab[keyno],savkey[keyno]) != 0) {
changedkey = True;
strcpy(tk,tkeytab[keyno]);
strcpy(tkeytab[keyno],savkey[keyno]);
strcpy(savkey[keyno],tk);
}
remove_keys(maxkeyno+1);
putarec(filno);
for (fno = 1; fno <= maxfilno; fno++)
if ((linkback[fno].f == filno) &&
(linkback[fno].t == _Unique) &&
filinuse[fno] &&
(strcmp(savelnk[fno],getlink(tk,fno)) != 0)) putlink(fno);
}
else ok = True;
}
getarec(filno);
if ((tabsize[filno] > 1) && changedkey) {
getakey(savkey[1],filno,1);
findmulti(filno,&recno[filno],savkey[1]);
align_tab(filno);
}
displayrec(filno,scrno);
lastrecop = Nul;
editmode = False;
}
}
void deletememos(void *fb, void *buf, int fno)
{
word w;
long mrec,trec;
genbuf sbuf;
fldblk *fblk;
fldtyp *fld;
byteptr buffer;
fblk = (fldblk *) fb;
buffer = (byteptr) buf;
memmove(&sbuf[1],buf,fblk->dsz);
w = 0;
do {
fld = &(*fblk->farr)[w];
if (fld->typ == _Memo) {
memmove(&mrec,fld->faddr,4);
while (mrec != 0) {
getrec(datf[fno],mrec,buf);
memmove(&trec,&buffer[(fblk->dsz-3)-1],4);
deleterec(datf[fno],mrec);
mrec = trec;
}
memmove(buf,&sbuf[1],fblk->dsz);
}
w++;
} while (w < fblk->numf);
}
void delarec(int fno)
{
string tkey,tkey2;
bool savok;
int i,keyno;
long delrecno;
getarec(fno);
for (i = 1; i <= maxfilno; i++) {
if ((linkback[i].t == _Unique) && (linkback[i].f == (byte)fno)) {
if (filinuse[i]) {
getlink(tkey,i);
strcpy(tkey2,tkey);
do {
searchkey(idxkey[i][1],&recno[i],tkey2);
savok = (bool)(ok && (strsearch(tkey2,tkey) == tkey2));
if (savok) delarec(i);
} while (savok);
}
}
}
delrecno = recno[fno];
switch (fno) {
case 1 : deletememos(&PBASE1.datasize,&PBASE1,fno); break;
case 2 : deletememos(&PBASE2.datasize,&PBASE2,fno); break;
case 3 : deletememos(&PBASE3.datasize,&PBASE3,fno); break;
case 4 : deletememos(&PBASE4.datasize,&PBASE4,fno); break;
case 5 : deletememos(&PBASE5.datasize,&PBASE5,fno); break;
case 6 : deletememos(&PBASE6.datasize,&PBASE6,fno); break;
case 7 : deletememos(&UCOUNTY1.datasize,&UCOUNTY1,fno); break;
case 8 : deletememos(&UCOMP1.datasize,&UCOMP1,fno); break;
case 9 : deletememos(&UOCCUP1.datasize,&UOCCUP1,fno); break;
case 10 : deletememos(&UZIP1.datasize,&UZIP1,fno); break;
case 11 : deletememos(&GRPACCT1.datasize,&GRPACCT1,fno); break;
case 12 : deletememos(&UISSUE1.datasize,&UISSUE1,fno); break;
}
deleterec(datf[fno], delrecno);
for (keyno = 1; keyno <= maxkeyno; keyno++) {
if (keylen[fno][keyno] > 0) {
delrecno = recno[fno];
getakey(tkey,fno,keyno);
deletekey(idxkey[fno][keyno],&delrecno,tkey);
}
}
}
void delete_record(void)
{
byte i,ch;
long trecno;
keystr nxtkey;
bool tok,child;
int tf;
string msg;
lastrecop = _Delete;
if (status_ok(filno)) {
getarec(filno);
displayrec(filno,scrno);
child = False;
for (i = 1; i <= maxfilno; i++)
child = (bool)(child || ((linkback[i].f == (byte)filno) && (filinuse[i])));
strcpy(msg,(child) ? LSC_DelLinkedRec : LSC_ConfirmDelRec);
do {
dspmsge(LSC_Warning,msg,0.0);
ch = upperch(getkey());
} while ((ch !=_YES) && (ch != QitKey));
if (ch == _YES) {
trecno = recno[filno];
prevkey(idxkey[filno][1],&recno[filno],key);
if (ok) {
strcpy(nxtkey,key);
nextrec = recno[filno];
}
tok = ok;
nextkey(idxkey[filno][1],&recno[filno],key);
if (recno[filno] != trecno) {
audible(Error);
dspmsge(LSC_BaseError,LSC_CorruptIndex,4.0);
getarec(filno);
displayrec(filno,scrno);
}
else {
ok = True;
message(NULL, LSC_Deleting);
delarec(filno);
message(NULL, "");
if (tok) {
recno[filno] = nextrec;
findmulti(filno,&recno[filno],nxtkey);
if (ok) {
getarec(filno);
if (tabsize[filno] != 1) align_tab(filno);
if (status_ok(filno)) displayrec(filno,scrno); else top_record();
}
else top_record();
}
else top_record();
}
}
}
else audible(Warning);
}
strptr autoinc(keystr sout, int kno)
{
float tl = 1; /* SN 3.5 */
char tempString1[10], /* SN 3.5 */
tempString2[10], /* SN 3.5 */
tempString3[10], /* SN 3.5 */
tempString4[10], /* SN 3.5 */
tempString5[10], /* SN 3.5 */
fileName[20]; /* SN 3.5 */
clearkey(idxkey[filno][kno]);
prevkey(idxkey[filno][kno],&recno[filno],key);
if (!ok) strcpy(sout,"1");
else strip(sout,fstr(sout,valu(key)+1,11,0));
return (strip(tempString1, sout));
}
void addarec(void)
{
switch (filno) {
case 1 :
PBASE1.recstat = 0;
addrec(datf[1],&recno[1],&PBASE1);
break;
case 2 :
PBASE2.recstat = 0;
addrec(datf[2],&recno[2],&PBASE2);
break;
case 3 :
PBASE3.recstat = 0;
addrec(datf[3],&recno[3],&PBASE3);
break;
case 4 :
PBASE4.recstat = 0;
addrec(datf[4],&recno[4],&PBASE4);
break;
case 5 :
PBASE5.recstat = 0;
addrec(datf[5],&recno[5],&PBASE5);
break;
case 6 :
PBASE6.recstat = 0;
addrec(datf[6],&recno[6],&PBASE6);
break;
}
}
void add_record(char func)
{
byte stabsiz,stabidx;
int fno;
long savr,recd;
int tf,keyno;
bool rav;
string tts;
lastrecop = func;
rav = True;
if (linkback[filno].f > 0) rav = recavail[linkback[filno].f];
if ((usedrecs(datf[filno]) >= maxrec[filno]) || !rav) {
if (rav) dspmsge("",LSC_MaxRecsReached,4.0);
else dspmsge("",LSC_NoParentRec,4.0);
}
else {
if (ok) savr = recno[filno]; else savr = 0;
scrn_active = False;
cleartop = (bool)(func == 'A');
clear_rec(filno);
scrn_active = True;
if (!cleartop)
switch (filno) {
case 1 : clearmemo(&PBASE1.datasize); break;
case 2 : clearmemo(&PBASE2.datasize); break;
case 3 : clearmemo(&PBASE3.datasize); break;
case 4 : clearmemo(&PBASE4.datasize); break;
case 5 : clearmemo(&PBASE5.datasize); break;
case 6 : clearmemo(&PBASE6.datasize); break;
case 7 : clearmemo(&UCOUNTY1.datasize); break;
case 8 : clearmemo(&UCOMP1.datasize); break;
case 9 : clearmemo(&UOCCUP1.datasize); break;
case 10 : clearmemo(&UZIP1.datasize); break;
case 11 : clearmemo(&GRPACCT1.datasize); break;
case 12 : clearmemo(&UISSUE1.datasize); break;
}
cleartop = True;
switch (filno) {
case 1:
strcopy(PBASE1.STATUS,pad(tts,"Active",16,Right),0,16);
strcopy(PBASE1.LAST_CONTACT,pad(tts,sysdate(_tts),8,Right),0,8);
strcopy(PBASE1.ID,fstr(tts,valu(ltoa(txtinc(".\\pbinc.num",1),_tts,10)),4,0),0,4);
strcopy(PBASE1.HONR,pad(tts,"None",10,Right),0,10);
break;
case 2:
setlinkage(filno);
break;
case 3:
setlinkage(filno);
break;
case 4:
setlinkage(filno);
break;
case 5:
setlinkage(filno);
strcopy(PBASE5.TIME,pad(tts,"0001",4,Right),0,4);
break;
}
stabsiz = 1;
if (tabsize[filno] > 1) {
stabidx = tabidx[filno];
if (tabidx[filno] == tabsize[filno])
tabidx[filno] = 1;
else
tabidx[filno] = tabused[filno]+1;
stabsiz = tabsize[filno];
tabsize[filno] = 1;
}
leaveclear = True;
displayrec(filno,scrno);
edit_rec(0);
if (exitcode != QitKey) {
addarec();
for (keyno = 1; keyno <= maxkeyno; keyno++) savkey[keyno][0] = '\0';
keyno = 1;
ok = True;
while ((keyno <= maxkeyno) && (exitcode != QitKey)) {
if (keylen[filno][keyno] > 0) {
getakey(tkeytab[keyno],filno,keyno);
addkey(idxkey[filno][keyno],&recno[filno],tkeytab[keyno]);
if (!ok) {
remove_keys(keyno);
audible(Error);
dspmsge(LSC_BaseError,LSC_KeyExists,4.0);
edit_rec(keyfld[filno][keyno]);
if (exitcode == QitKey) {
recd = recno[filno];
deleterec(datf[filno],recd);
recno[filno] = savr;
}
else {
keyno = 0;
putarec(filno);
}
}
}
keyno++;
}
}
else recno[filno] = savr;
if (exitcode == QitKey) {
if (stabsiz > 1) tabidx[filno] = stabidx;
fno = filno;
switch (fno) {
case 1 : deletememos(&PBASE1.datasize,&PBASE1,fno); break;
case 2 : deletememos(&PBASE2.datasize,&PBASE2,fno); break;
case 3 : deletememos(&PBASE3.datasize,&PBASE3,fno); break;
case 4 : deletememos(&PBASE4.datasize,&PBASE4,fno); break;
case 5 : deletememos(&PBASE5.datasize,&PBASE5,fno); break;
case 6 : deletememos(&PBASE6.datasize,&PBASE6,fno); break;
case 7 : deletememos(&UCOUNTY1.datasize,&UCOUNTY1,fno); break;
case 8 : deletememos(&UCOMP1.datasize,&UCOMP1,fno); break;
case 9 : deletememos(&UOCCUP1.datasize,&UOCCUP1,fno); break;
case 10 : deletememos(&UZIP1.datasize,&UZIP1,fno); break;
case 11 : deletememos(&GRPACCT1.datasize,&GRPACCT1,fno); break;
case 12 : deletememos(&UISSUE1.datasize,&UISSUE1,fno); break;
}
}
if (stabsiz > 1) tabsize[filno] = stabsiz;
leaveclear = False;
ok = (bool)(ok || (savr > 0));
getarec(filno);
if ((exitcode != QitKey) && (tabsize[filno] > 1)) {
getakey(skey,filno,1);
findmulti(filno,&recno[filno],skey);
align_tab(filno);
}
displayrec(filno,scrno);
}
lastrecop = Nul;
}
void initialize(void)
{
keyseg1fld[ 1][ 1] = &PBASE1._ID;
keyseg1fld[ 1][ 2] = &PBASE1._LAST_NAME;
keyseg1fld[ 1][ 3] = &PBASE1._FIRST_NAME;
keyseg1fld[ 1][ 4] = &PBASE1._POSITION;
keyseg1fld[ 1][ 5] = &PBASE1._COMPANY;
keyseg1fld[ 1][ 6] = &PBASE1._HONR;
keyseg1fld[ 1][ 7] = &PBASE1._HOME_STATE;
keyseg1fld[ 1][ 8] = &PBASE1._HOME_ZIP;
keyseg1fld[ 1][ 9] = &PBASE1._STATUS;
keyseg1fld[ 1][10] = &PBASE1._LAST_CONTACT;
keyseg1fld[ 1][11] = &PBASE1._P_MARKED;
keyseg1fld[ 1][12] = &PBASE1._HOME_CITY;
keyseg1fld[ 1][13] = &PBASE1._HOME_ADDR1;
keyseg1fld[ 1][14] = &PBASE1._HOME_STREET_NUM;
keyseg1fld[ 2][ 1] = &PBASE2._ID;
keyseg1fld[ 3][ 1] = &PBASE3._ID;
keyseg1fld[ 3][ 2] = &PBASE3._GROUPS;
keyseg1fld[ 4][ 1] = &PBASE4._ID;
keyseg1fld[ 4][ 2] = &PBASE4._VOTER_COUNTY;
keyseg1fld[ 4][ 3] = &PBASE4._VOTER_CITY;
keyseg1fld[ 4][ 4] = &PBASE4._VOTER_PRECINCT;
keyseg1fld[ 4][ 5] = &PBASE4._VOTER_CONG_DIST;
keyseg1fld[ 4][ 6] = &PBASE4._VOTER_SCH_DIST;
keyseg1fld[ 4][ 7] = &PBASE4._VOTER_BIRTHDATE;
keyseg1fld[ 4][ 8] = &PBASE4._VOTER_SEX;
keyseg1fld[ 4][ 9] = &PBASE4._VOTER_ORIGIN;
keyseg1fld[ 4][10] = &PBASE4._VOTER_PARTY;
keyseg1fld[ 4][11] = &PBASE4._VOTER_LAST_VOTED;
keyseg1fld[ 4][12] = &PBASE4._VOTER_ABS;
keyseg1fld[ 4][13] = &PBASE4._VOTER_ISSUE1;
keyseg1fld[ 4][14] = &PBASE4._VOTER_ISSUE2;
keyseg1fld[ 4][15] = &PBASE4._VOTER_ISSUE3;
keyseg1fld[ 4][16] = &PBASE4._VOTER_ISSUE4;
keyseg1fld[ 5][ 1] = &PBASE5._ID;
keyseg1fld[ 6][ 1] = &PBASE6._BOGUS_ID;
keyseg1fld[ 7][ 1] = &UCOUNTY1._VOTER_COUNTY;
keyseg1fld[ 7][ 2] = &UCOUNTY1._COUNTY_SIZE;
keyseg1fld[ 7][ 3] = &UCOUNTY1._ID;
keyseg1fld[ 7][ 4] = &UCOUNTY1._COUNTY_SEAT;
keyseg1fld[ 8][ 1] = &UCOMP1._COMPANY;
keyseg1fld[ 8][ 2] = &UCOMP1._ID;
keyseg1fld[ 9][ 1] = &UOCCUP1._POSITION;
keyseg1fld[ 9][ 2] = &UOCCUP1._POS_DESC;
keyseg1fld[10][ 1] = &UZIP1._HOME_ZIP;
keyseg1fld[11][ 1] = &GRPACCT1._GROUPS;
keyseg1fld[11][ 2] = &GRPACCT1._GROUP_DESC;
keyseg1fld[12][ 1] = &UISSUE1._ISSID;
keyseg1fld[12][ 2] = &UISSUE1._VOTER_ISSUE;
command = Cmd_No_Command;
deltas = def1.deltat;
keynum = 1;
scrno = 1;
_trace = 0;
menuanchor = 0;
link = Up_N_Down;
listing = False;
listAndAdd = False;
leaveclear = False;
switchtab = False;
scrn_active = False;
cleartop = True;
for (filno = 1; filno <= maxfilno; filno++) {
recno[filno] = 0;
tabrecno[filno] = 0;
clear_rec(filno);
recavail[filno] = (bool)(usedrecs(datf[filno]) > 0);
tabidx[filno] = 1; tabused[filno] = 0;
}
for (filno = 1; filno <= maxfilno; filno++) if (linkback[filno].f == 0) top_record();
scrn_active = True;
filno = 1;
}
bool custom_key(int scr, int fno, int *fld, uchar *key)
{
bool tb;
return(False);
}
void on_error(void)
{
closefiles();
}
void swapmenu(void)
{
bool savdisp;
byte ni,tl,tw,tlen;
itmptr titm;
mnuptr m;
savdisp = (bool)((dm.curmnu->winp != NULL) && dm.curmnu->winp->disp);
if (savdisp) zapmnu(&dm,dm.curmnu);
m = dm.curmnu;
m->mtyp = (byte)((m->mtyp == Vert) ? 2 : Vert);
tw = 1; ni = 0; tl = 0;
titm = m->fitm;
do {
ni++; tl += m->mtyp;
if (m->mtyp == Vert) { titm->ix = 2; titm->iy = ni; }
else { titm->ix = tl; titm->iy = 1; }
tlen = (byte)strlen(titm->prompt); tl += tlen;
if (tlen > tw) tw = tlen;
titm = titm->nitm;
} while (titm != m->fitm);
if (m->mtyp == Vert) { m->widm = tw+2; m->hgtm = ni; }
else { m->widm = tl+m->mtyp-2; m->hgtm = 1; }
if (m->mtyp != Vert) {
m->ym = (m->xm == 2) ? 1 : scrhgt;
m->xm = 1; m->mbchrs[0] = '\0';
}
else {
if (m->ym == 1) { m->ym = 2; m->xm = scrwid-m->widm; }
else { m->ym = scrhgt-m->hgtm; m->xm = 2; }
m->mbchrs[0] = '─';
}
if (savdisp) dspmnu(&dm,dm.curmnu);
menuanchor = (menuanchor+1) % 4;
}
void changeto(pathstr newpath, int *res)
{
*res = (changedir(newpath)) ? 0 : 1;
if (*res == 0) {
getcurrentdir(datapath,0);
pathSwap = True;
}
}
void newload(mnufrec *m, pathstr newmenu)
{
int i;
pathstr newnam;
strcpy(newnam,newmenu);
svm = smc;
smc = db_malloc(sizeof(savmtyp));
smc->savprv = svm;
strcpy(smc->savnam,m->mnufnam);
smc->savno = m->curmnu->mno;
strcpy(smc->savprompt,m->curitm->prompt);
if (dm.curitm->selpath[0] != '\0') {
getcurrentdir(smc->savpath,0);
changeto(dm.curitm->selpath,&i);
}
else {
i = 0;
smc->savpath[0] = '\0';
}
if (i == 0) {
disposemnus(&dm);
strcpy(dm.mnufnam,newnam);
initmnu(&dm,0,0,OnDisk);
dispallwin();
if (dm.curmnu == NULL) {
if (smc->savpath[0] != '\0')
changeto(smc->savpath,&i);
strcpy(dm.mnufnam,smc->savnam);
initmnu(&dm,0,0,OnDisk);
dispallwin();
jumptomnu(&dm,smc->savno);
do
dm.curitm = dm.curitm->nitm;
while ((strcmp(smc->savnam,dm.curitm->prompt) != 0) &&
(dm.curitm != dm.curmnu->fitm));
db_free(smc);
smc = svm;
}
else {
dspmnu(&dm,dm.curmnu);
}
}
else {
db_free(smc);
smc = svm;
doserr(3,dm.curitm->selpath);
}
pathSwap = True;
}
void setcommand(byte c_num)
{
switch(c_num) {
case 1 : command = Cmd_Next_Record; break;
case 2 : command = Cmd_Prev_Record; break;
case 3 : command = Cmd_Find_Record; break;
case 4 : command = Cmd_Top_Record; break;
case 5 : command = Cmd_Last_Record; break;
case 6 : command = Cmd_Edit_Record; break;
case 7 : command = Cmd_Add_Record; break;
case 8 : command = Cmd_Copy_Record; break;
case 9 : command = Cmd_Delete_Record; break;
case 10 : command = Cmd_Next_File; break;
case 11 : command = Cmd_Prev_File; break;
case 12 : command = Cmd_Swap_Menu; break;
}
}
/***********************************************************************/
/* */
/* DO_PROC menu procedures */
/* */
/***********************************************************************/
void do_proc(int procno, mnufrec *m)
{
setcommand(procno);
hidewin(T_OFF,dm.curmnu->winp);
switch (procno) {
case 1 : next_record(_Next); break;
case 2 : next_record(_Prev); break;
case 3 : find_record(); break;
case 4 : if (status_ok(filno)) top_record(); else audible(Warning); break;
case 5 : last_record(); break;
case 6 : if (status_ok(filno)) {
edit_record();
getakey(key,filno,1);
findmulti(filno,&recno[filno],key);
if (!ok) top_record();
}
else audible(Warning); break;
case 7 :
add_record('A');
getakey(key,filno,1);
findmulti(filno,&recno[filno],key);
if (!ok) top_record();
break;
case 8 : if (status_ok(filno)) {
add_record('C');
getakey(key,filno,1);
findmulti(filno,&recno[filno],key);
if (!ok) top_record();
}
else audible(Warning); break;
case 9 : delete_record(); break;
case 10: switch_file('+'); break;
case 11: switch_file('-'); break;
case 12: setdeltas(); break;
case 13: swapmenu(); break;
/***************************************************************************
* [DG] 09/11/92 -- Added cases 101-116, which will switch instantly to *
* files 1-16, by subtracting 100 from the case number. *
* If the file number is larger than the maximum defined *
* file, we switch to the highest valid file. *
***************************************************************************/
case 101:
case 102:
case 103:
case 104:
case 105:
case 106:
case 107:
case 108:
case 109:
case 110:
case 111:
case 112:
case 113:
case 114:
case 115:
case 116: filno = (procno - 100);
if (filno > maxfilno) filno = maxfilno;
switch_file(' ');
break;
/***********************/ /* [DG] End Modification */ /*******************/
}
hidewin(T_ON,dm.curmnu->winp);
dispwindow(dm.curmnu->winp);
}
/*************************************************************************/
void do_ctl(mnufrec *m, itmptr itm)
{
string ts;
uchar yes[2],tpic[2];
if ((m->curmnu != NULL) && (itm != NULL)) {
switch (itm->seltyp) {
case _Proc : do_proc((int) ival(itm->selact),m); break;
case _Menu :
if ((ival(itm->selact) > 0) && (m->mat[(int) ival(itm->selact)-1] != NULL)) {
if (m->mat[(int) ival(itm->selact)-1]->winp != NULL)
jumptomnu(m,(byte) ival(itm->selact));
else {
m->mat[(int) ival(itm->selact)-1]->pmnu = m->curmnu->mno;
m->curmnu = m->mat[(int) ival(itm->selact)-1];
dspmnu(m,m->curmnu);
m->curitm = m->curmnu->litm;
m->level = 0;
}
}
break;
case _Quit :
dbgetstr(ts,_Ch,LSC_QuitDataBase,chstr(yes,_YES),chstr(tpic,Pic_U),"",chkyesno,nohelp);
quit = (bool)((ts[0] == _YES) && (exitcode != QitKey));
break;
}
}
}
bool initdbm(void)
{
strcpy(dm.mnufnam,localmenu);
initmnu(&dm,0,0,OnDisk);
return (bool)(dm.curmnu != NULL);
}
void datenpath(void)
{
string ts;
if (uw.bgw != NULL) {
if (mdate.x != 0)
if (mdate.m == 0)
writewxy(datum(ts,sysdate(ts)),0,mdate.x,mdate.y,uw.bgw);
else
writewxy(slash(ts,sysdate(ts)),0,mdate.x,mdate.y,uw.bgw);
if (mpath.x != 0) {
strcpy(ts,datapath);
if (strlen(ts) == 3) strcat(ts,applname);
else { strcat(ts,"\\"); strcat(ts,applname); }
writewxy(ts,0,mpath.x,mpath.y,uw.bgw);
}
}
}
void do_menu(void)
{
byte b;
uchar ctlkey;
int err;
string ts;
uchar yes[2],tpic[2];
set_addmember(ExitSet,AltX);
if (initdbm()) {
for (b = 0; b < def1.anchor; b++) swapmenu();
strcat(strcpy(uw.wfnam,applname),".DBW");
err = initwin(&uw);
if (err == 0) {
if ((dm.curmnu->ym == 25) && (scrhgt > 25)) dm.curmnu->ym = scrhgt;
datenpath();
if (uw.bgw != NULL) uw.bgw->disp = True;
strcat(strcpy(hw.wfnam,applname),".DBH");
initwin(&hw);
dispallwin();
hidewin(T_ON,uw.wa[1]);
top_record();
quit = False;
dspmnu(&dm,dm.curmnu);
do {
if (dm.curitm->sec > gvar->sec) {
if (dm.curmnu->mtyp == Vert) goud(&dm,Down);
else gorl(&dm,Right);
}
hbar(&dm);
tandk(0,0,uw.wa[scrno]);
ctlkey = upperch(getkey());
if ((dm.curitm->sec > gvar->sec) &&
((ctlkey != AltX) && (ctlkey != AltL) && (ctlkey != QitKey)))
dberrm(LSC_MustLogOn);
// [DG] 09/09/1992
// Restructured switch statement to allow (mostly) CUA-compliant hot-keys
switch (ctlkey) {
case Enter : if (gvar->sec >= dm.curitm->sec)
do_ctl(&dm,dm.curitm); break;
case HlpKey : itemhelp(&dm); break;
/* Next */ case CtrlRArr : do_proc( 1,&dm); break;
/* Prev */ case CtrlLArr : do_proc( 2,&dm); break;
/* Find */ case AltS : do_proc( 3,&dm); break;
/* Top */ case Home : do_proc( 4,&dm); break;
/* Last */ case EndKey : do_proc( 5,&dm); break;
/* Edit */ case CtrlEnter: do_proc( 6,&dm); break;
/* Add */ case Ins : do_proc( 7,&dm); break;
/* Copy */ case CtrlC : do_proc( 8,&dm); break;
/* Del */ case Del : do_proc( 9,&dm); break;
/* +Fil */ case PgDn : do_proc(10,&dm); break;
/* -Fil */ case PgUp : do_proc(11,&dm); break;
/* ScSv */ case AltV : do_proc(12,&dm); break;
case UArr : if (dm.curmnu->mtyp != Vert) do_proc(2,&dm);
else goud(&dm,Up); break;
case DArr : if (dm.curmnu->mtyp != Vert) do_proc(1,&dm);
else goud(&dm,Down); break;
case LArr : gorl(&dm,Left); break;
case RArr : gorl(&dm,Right); break;
case CtrlPgUp : if (tabsize[filno] > 1)
next_tab_page(_Prev); break;
case CtrlPgDn : if (tabsize[filno] > 1)
next_tab_page(_Next); break;
case AltX : dbgetstr(ts,_Ch,LSC_QuitDataBase,
chstr(yes,_YES),chstr(tpic,Pic_U),"",
chkyesno,nohelp);
quit = (bool)((ts[0] == _YES) &&
(exitcode != QitKey));
break;
case QitKey : if ((dm.curmnu != NULL) &&
(dm.curmnu->pmnu != 0))
{
zapmnu(&dm,dm.curmnu);
dm.curmnu->litm = dm.curitm;
dm.curmnu = dm.mat[dm.curmnu->pmnu-1];
dm.curitm = dm.curmnu->litm;
dm.level = 0;
if (dm.curmnu->winp == NULL)
dspmnu(&dm,dm.curmnu);
}
else
{
if (filno > 1)
switch_file('-');
else
{
dbgetstr(ts,_Ch,LSC_QuitDataBase,
chstr(yes,_YES),
chstr(tpic,Pic_U),"",
chkyesno,nohelp);
quit = (bool)((ts[0] == _YES) &&
(exitcode != QitKey));
}
}
break;
default : if (selitm(ctlkey,&dm))
{
hbar(&dm);
do_ctl(&dm,dm.curitm);
}
break;
// End of changes
}
} while (!quit);
}
else dberrm(strconcat(ts,DOSErr8," [",uw.wfnam,"]",NULL));
if ((menuanchor != def1.anchor) || (deltas != def1.deltat)) {
def1.anchor = menuanchor;
def1.deltat = deltas;
updexe(def1.exeid,sizeof(def1));
}
disposemnus(&dm);
closeallwin();
}
else dberrm(strconcat(ts,_NoFiles," [",localmenu,"]",NULL));
}
void main(void)
{
extfhc_init();
db_curs_init();
db_date_init();
db_funcs_init();
db_heap_init();
db_gvar_init();
db_key_init();
db_pswd_init();
db_win_init();
db_util_init();
db_work_init();
db_tree_init();
db_list_init();
db_man_init();
db_mnu_init();
db_memo_init();
multiuser = False;
initedit();
initindex();
_keyexpr = keyexpr;
_getarec = getarec;
_horizrec = horizrec;
clrscr();
if (menudriven && !dbcaller) {
audible(Error);
dspmsge(LSC_BaseError,LSC_MenuDriven,4.0);
}
else if (!validpath()) {
audible(Error);
dspmsge(LSC_BaseError,LSC_AbortBadPath,4.0);
}
else {
if (openwin(0,(byte)(80-strlen(LSC_Initializing))/2,12,
(byte)strlen(LSC_Initializing),1,31,31,8,"─┐│┘─└│┌",TopCnt,"")) {
twinp = curwin;
writewxy(LSC_Initializing,31,1,1,twinp);
hidewin(T_ON,twinp);
openfiles();
closewin(&twinp);
}
if (fok) {
shutdown = on_error;
initialize();
initmanual("PBASE.MAN");
do_menu();
if (openwin(0,(80-strlen(LSC_ClosingFile))/2,12,
(byte)strlen(LSC_ClosingFile),1,31,31,8,"─┐│┘─└│┌",TopCnt,"")) {
twinp = curwin;
writewxy(LSC_ClosingFile,31,1,1,twinp);
hidewin(T_ON,twinp);
closefiles();
closewin(&twinp);
}
}
else {
audible(Error);
dspmsge(LSC_ErrNeededFiles,LSC_ErrMissingFile,5.0);
}
}
clrscr();
}