home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The World of Computer Software
/
World_Of_Computer_Software-02-386-Vol-2of3.iso
/
c
/
ccua_dbc.zip
/
DB_MEMO.C
< prev
next >
Wrap
C/C++ Source or Header
|
1992-09-11
|
18KB
|
649 lines
/****************************************************************************/
/* DATABOSS MODULE: DB_MEMO.C */
/****************************************************************************/
#include "db_lsc.h"
#ifdef __TURBOC__
#include <conio.h>
#else
#include <graph.h>
#endif
#include <stdio.h>
#include <string.h>
#include "db_types.h"
#include "db_conio.h"
#include "db_curs.h"
#include "db_file.h"
#include "db_funcs.h"
#include "db_key.h"
#include "db_math.h"
#include "db_sets.h"
#include "db_str.h"
#include "db_tree.h"
#include "db_win.h"
#include "db_util.h"
#include "db_memo.h"
/**************************** GLOBAL VARIABLES ****************************/
bool editmode;
long memorecstat;
/*************************** INTERNAL CONSTANTS ***************************/
#define Msge1 "Warning!!"
#define Msge2 "File is Locked. You MUST wait until it becomes available"
/*************************** INTERNAL VARIABLES ***************************/
static word memosize;
static int blockpos;
static byte ml,ms;
static winptr markw;
static byte x,y,a;
static winptr w;
static bool initialized = False;
/***************************** IMPLEMENTATION *****************************/
void secure_rec0(datafile *f, byte lck)
{
int tv;
if (multiuser) {
do {
tv = lock_datf(f,0L,lck);
if (tv == -1)
dspmsge(LSC_Warning, LSC_StatusRecLocked,4.0);
} while (tv != 0);
}
}
void dspm(byte x, byte y, byte atr, byte sno,
word recsize,
fldptr fld,
datafile *dataf,
winptr w)
{
long mrecno;
int i;
word bs;
byte ml,ms;
genbuf tbuf;
uchar mbuf[membufsiz+1];
string pic,ts;
memset(&mbuf[1],' ',membufsiz);
memmove(&mrecno,fld->faddr,4);
strcpy(pic,fld->pic);
i = strposch(Pic_Star,pic) + 1;
ml = (byte) ival(strcopy(ts,pic,i,strlen(pic)-i+2));
strcopy(pic,pic,0,i-1);
strcat(pic,chstr(ts,Pic_X));
expand(pic,pic);
ms = (byte) strlen(pic);
bs = recsize - 8;
if (atr == 0) atr = attrib;
else {
if (atr == 255) atr = 0;
}
i = 0;
while ((mrecno != 0) && ((i*bs) < (ml*ms))) {
getrec(dataf,mrecno,&tbuf[1]);
memmove(&mrecno,&tbuf[bs+5],4);
memmove(&mbuf[1+i*bs],&tbuf[5],bs);
i++;
}
ts[ms] = '\0';
i = 0;
do {
memmove(ts,&mbuf[i*ms+1],ms);
writewxy(ts,atr,x,(byte)(y+i),w);
i++;
} while (i < ml);
}
bool chkblk(word sz, uchar *tbuf)
{
word i;
i = 1;
while ((tbuf[i] == ' ') && (i <= sz)) i++;
return ((bool) (i > sz));
}
void drawbar(byte line)
{
if (markw != NULL) {
writewxy("░",_iv,1,(byte) blockpos,markw);
blockpos = (int) fround((double) (((line + ml) * ml)/(memosize/ms)));
if (blockpos < 1) blockpos = 1;
if ((blockpos == 1) && (line != 1)) blockpos = 2;
else {
if (line == 1) blockpos = 1;
else {
if ((blockpos == ml) && (((word) ((line+ml)*ms)) <= memosize)) blockpos = ml-1;
else {
if (((word) ((line+ml)*ms)) > memosize) blockpos = ml;
}
}
}
writewxy("█",15,1,(byte) blockpos,markw);
}
}
void dispblk(byte line, uchar *mbuf)
{
string ts;
int i,j;
ts[ms] = '\0';
i = line - 1;
j = 0;
do {
memmove(ts,&mbuf[i*ms+1],ms);
writewxy(ts,a,x,(byte)(y+j),w);
i++;
j++;
} while (j < ml);
drawbar(line);
}
void scroll(int posptr, word msize, byte bwid,
byte *line, bool *redisp, uchar *mbuf)
{
if (posptr > (msize + ((*line - 1) * bwid))) {
(*line)++;
dispblk(*line,mbuf);
*redisp = False;
}
else {
if (posptr <= ((*line - 1) * bwid)) {
(*line)--;
dispblk(*line,mbuf);
*redisp = False;
}
}
}
void blkedit( byte px, byte py, byte bwid, word msize, word bsize,
byte *sx, byte *sy, winptr winp, uchar *mbuf)
{
uchar ukey;
byte b,line;
int posptr,lpos,moveblock,movepos,splitpos,z;
bool qit,redisp;
string ts;
cursortyp tcurs;
tcurs = winp->curs;
line = 1;
splitpos = 0;
lpos = 0;
ukey = ' ';
qit = False;
redisp = False;
posptr = *sx + (*sy-1)*bwid;
ins_flag = (bool) (!ins_flag);
toggleins(&winp->curs);
set_del(ExitSet,Enter,UArr,DArr,PgUp,PgDn,CtrlEnd,CtrlHome,0);
do {
if (redisp) {
writewxy(chstr(ts,mbuf[lpos]),a,(byte)(px+*sx-1),(byte)(py+*sy-1),NULL);
if ((splitpos != 0) || (ins_flag) || ((ukey == Del) || (ukey == BackSp))) dispblk(line,mbuf);
splitpos = 0;
redisp = False;
}
lpos = posptr;
*sy = (byte) (((posptr-1)/bwid)+1-(line-1));
*sx = (byte) (posptr % bwid);
if (*sx == 0) *sx = bwid;
gotoxy(px+*sx-1,py+*sy-1);
if (ukey == BackSp) writewxy(chstr(ts,mbuf[lpos]),a,(byte)(px+*sx-1),(byte)(py+*sy-1),NULL);
ukey = getkey();
if ((_xkey && (set_member(ExitSet,ukey))) ||
((ukey == QitKey) || (ukey == CtrlPgUp) || (ukey == CtrlPgDn))) {
exitcode = ukey;
qit = True;
/************************************************************************
* [DG] 09/10/92 -- remapped CtrlEnter to F10, Tab to CtrlPgDn, and *
* STab to CtrlPgUp. *
************************************************************************/
switch (ukey) {
case CtrlEnter : exitcode = F10; _xkey = True; break;
case Tab : exitcode = CtrlPgDn; break;
case STab : exitcode = CtrlPgUp; break;
}
/*********************/ /* [DG] End Modification */ /*******************/
}
else {
if (_xkey || (ukey < ' ')) {
switch (ukey) {
case CtrlEnd :
posptr = bsize - bwid + 1;
line = (byte) ((bsize/ms) - ml + 1);
dispblk(line,mbuf);
break;
case CtrlHome :
posptr = 1;
line = 1;
dispblk(line,mbuf);
break;
case Ins : toggleins(&winp->curs); break;
case LArr :
if (posptr > 1) {
posptr--;
scroll(posptr,msize,bwid,&line,&redisp,mbuf);
}
break;
case RArr :
if (posptr < bsize) {
posptr++;
scroll(posptr,msize,bwid,&line,&redisp,mbuf);
}
break;
case UArr :
if ((int) (posptr-bwid) >= 1) {
posptr -= bwid;
scroll(posptr,msize,bwid,&line,&redisp,mbuf);
}
break;
case DArr :
if ((posptr+bwid) <= bsize) {
posptr += bwid;
scroll(posptr,msize,bwid,&line,&redisp,mbuf);
}
break;
case PgUp :
for (b = 1; b <= ml-1; b++) {
if ((int) (posptr-bwid) >= 1) {
posptr -= bwid;
scroll(posptr,msize,bwid,&line,&redisp,mbuf);
}
}
break;
case PgDn :
for (b = 1; b <= ml-1; b++) {
if ((posptr+bwid) <= bsize) {
posptr += bwid;
scroll(posptr,msize,bwid,&line,&redisp,mbuf);
}
}
break;
case Home :
posptr = posptr - *sx + 1;
*sx = 1;
break;
case EndKey :
posptr += (bwid - *sx);
z = posptr;
b = *sx;
*sx = bwid;
while ((mbuf[posptr] == ' ') && (*sx > 1)) {
(*sx)--;
posptr--;
}
if ((*sx < bwid) && (mbuf[posptr] != ' ')) {
(*sx)++;
posptr++;
}
if (*sx == b) {
*sx = bwid;
posptr = z;
}
break;
case CtrlRArr :
if (posptr < bsize) {
if (set_member(_WORDSET,mbuf[posptr])) {
do {
posptr++;
scroll(posptr,msize,bwid,&line,&redisp,mbuf);
} while ((set_member(_WORDSET,mbuf[posptr])) && (posptr != bsize));
}
while ((!set_member(_WORDSET,mbuf[posptr])) && (posptr < bsize)) {
posptr++;
scroll(posptr,msize,bwid,&line,&redisp,mbuf);
}
}
break;
case CtrlLArr :
if (posptr > 1) {
if (!set_member(_WORDSET,mbuf[posptr-1])) {
do {
posptr--;
scroll(posptr,msize,bwid,&line,&redisp,mbuf);
} while ((!set_member(_WORDSET,mbuf[posptr])) && (posptr != 1));
}
while ((set_member(_WORDSET,mbuf[posptr-1])) && (posptr > 1)) {
posptr--;
scroll(posptr,msize,bwid,&line,&redisp,mbuf);
}
}
break;
case ClrKey :
for (b = *sx; b <= bwid; b++)
mbuf[posptr+b-*sx] = ' ';
dispblk(line,mbuf);
break;
/***********************************************************************
*[DG] 09/10/92 -- Commented out the Tab and STab edit handlers, so *
* these keys can be used to exit the memo field. *
***********************************************************************/
/*
case Tab :
b = (byte) _Tab_Space;
while ((b > 0) && (posptr < bsize)) {
b--;
posptr++;
scroll(posptr,msize,bwid,&line,&redisp,mbuf);
}
break;
case STab :
b = (byte) _Tab_Space;
while ((b > 0) && (posptr > 1)) {
b--;
posptr--;
scroll(posptr,msize,bwid,&line,&redisp,mbuf);
}
break;
********************/ /* [DG] End Modifications */ /*******************/
case Enter :
if ((posptr+bwid) <= bsize) {
if (ins_flag) {
redisp = True;
if ((posptr+bwid+bwid) < bsize) {
memmove(&mbuf[posptr+(bwid-*sx+1)+bwid],
&mbuf[posptr+(bwid-*sx+1)],
bsize-bwid-(posptr+(bwid-*sx)));
memset(&mbuf[posptr+(bwid-*sx+1)],' ',bwid);
}
memmove(&mbuf[posptr+(bwid-*sx+1)],&mbuf[posptr],bwid-*sx+1);
memset(&mbuf[posptr],' ',bwid-*sx+1);
}
posptr += (bwid-*sx+1);
scroll(posptr,msize,bwid,&line,&redisp,mbuf);
}
break;
case Del :
redisp = True;
memmove(ts,&mbuf[posptr],bwid-*sx+1);
ts[bwid-*sx+1] = '\0';
strip(ts,ts);
if (ts[0] != '\0') {
memmove(&mbuf[posptr],&mbuf[posptr+1],bwid-*sx);
mbuf[posptr+(bwid-*sx)] = ' ';
}
else {
if (posptr + bwid < bsize) {
moveblock = bwid - *sx + 1;
if (moveblock != bwid) {
while ((mbuf[posptr+(bwid-*sx)+moveblock] != ' ') && (moveblock > 0))
moveblock--;
}
if (moveblock > 0) {
memmove(&mbuf[posptr],&mbuf[posptr+(bwid-*sx+1)],bwid);
memset(&mbuf[posptr+bwid],' ',moveblock);
memmove(ts,&mbuf[posptr+(bwid-*sx+1)],bwid);
ts[bwid] = '\0';
strip(ts,ts);
if ((ts[0] == '\0') && ((posptr+2*bwid) < bsize)) {
memmove(&mbuf[posptr + (bwid-*sx+1)],&mbuf[posptr+(bwid-*sx+1)+bwid],
bsize-bwid-(posptr+(bwid-*sx)));
memset(&mbuf[bsize-bwid+1],' ',bwid);
}
}
}
}
break;
case BackSp :
if (posptr > 1) {
redisp = True;
posptr--;
if (*sx > 1) {
memmove(&mbuf[posptr],&mbuf[posptr+1],bwid-*sx+1);
mbuf[posptr+(bwid-*sx+1)] = ' ';
}
else {
movepos = 0;
while ((mbuf[posptr-movepos] == ' ') && (movepos < bwid))
movepos++;
moveblock = movepos;
while ((mbuf[posptr+moveblock] != ' ') && (moveblock > 0))
moveblock--;
if (moveblock > 0) {
memmove(&mbuf[posptr-movepos+1],&mbuf[posptr+1],moveblock);
memmove(&mbuf[posptr+1],&mbuf[posptr+moveblock+1],bwid-moveblock);
memset(&mbuf[posptr+bwid-moveblock+1],' ',moveblock);
memmove(ts,&mbuf[posptr + 1],bwid);
ts[bwid] = '\0';
strip(ts,ts);
if ((ts[0] == '\0') && (posptr+2*bwid < bsize)) {
memmove(&mbuf[posptr+1],&mbuf[posptr+1+bwid],bsize-bwid-posptr);
memset(&mbuf[bsize-bwid+1],' ',bwid);
}
posptr = posptr - movepos + 1;
scroll(posptr,msize,bwid,&line,&redisp,mbuf);
}
}
}
break;
}
}
else {
redisp = True;
if ((*sx == bwid) && (posptr != bsize) && (ukey != ' ')) {
memmove(&mbuf[posptr+bwid+1],&mbuf[posptr+1],bsize-bwid-posptr);
memset(&mbuf[posptr+1],' ',bwid);
splitpos = posptr - 1;
while ((mbuf[splitpos] != ' ') && (mbuf[splitpos] != '-') &&
(posptr - splitpos < bwid-1))
splitpos--;
if ((mbuf[splitpos] == ' ') || (mbuf[splitpos] == '-')) {
mbuf[posptr] = ukey;
memmove(&mbuf[posptr+1],&mbuf[splitpos+1],posptr-splitpos);
memset(&mbuf[splitpos+1],' ',posptr-splitpos);
posptr += (posptr-splitpos);
}
else {
splitpos = 0;
if (ins_flag) memmove(&mbuf[posptr+1],&mbuf[posptr],bsize-posptr);
mbuf[posptr] = ukey;
}
}
else {
if (ins_flag) {
if ((mbuf[posptr+(bwid-*sx)] != ' ') && (posptr + bwid < bsize)) {
if (posptr + bwid + bwid < bsize)
memmove(&mbuf[posptr+(bwid-*sx+1)+bwid],&mbuf[posptr+(bwid-*sx+1)],
bsize-bwid-(posptr+(bwid-*sx)));
memset(&mbuf[posptr+(bwid-*sx+1)],' ',bwid);
memmove(&mbuf[posptr+(bwid-*sx+1)],&mbuf[posptr],bwid-*sx+1);
memset(&mbuf[posptr],' ',bwid-*sx+1);
}
else
memmove(&mbuf[posptr+1],&mbuf[posptr],bwid-*sx);
}
mbuf[posptr] = ukey;
}
if (posptr < bsize) posptr++;
scroll(posptr,msize,bwid,&line,&redisp,mbuf);
}
}
} while (!qit);
set_add(ExitSet,Enter,UArr,DArr,PgUp,PgDn,0);
winp->curs = tcurs;
}
void editmemo(byte _x, byte _y, byte atr,
word recsize,
fldtyp *fld,
ptr buf,
winptr _w, winptr h,
datafile *dataf,
long *recnum)
{
uchar tbuf[DB_mxdrs+1],mbuf[membufsiz+1];
string pic,ts;
int i;
word bs,fillpos,memrecsiz,nummemrecs;
long mrecno,srec,trec,nextmemrec;
cursortyp tcurs;
byte sx,sy;
bool dataok,blockempty;
x = _x;
y = _y;
w = _w;
memset(&mbuf[1],' ',membufsiz);
strcpy(pic,fld->pic);
i = strposch(Pic_Star,pic) + 1;
ml = (byte) ival(strcopy(ts,pic,i,strlen(pic)-i+2));
strcopy(pic,pic,0,i-1);
strcat(pic,chstr(ts,Pic_X));
expand(pic,pic);
ms = (byte) strlen(pic);
memosize = membufsiz - (membufsiz % ms);
bs = recsize - 8;
i = 0;
memmove(&mrecno,fld->faddr,4);
srec = mrecno;
while (mrecno != 0) {
getrec(dataf,mrecno,&tbuf[1]);
memmove(&mrecno,&tbuf[bs+5],4);
fillpos = 1 + (i * bs);
if ((fillpos + bs) > memosize)
memmove(&mbuf[fillpos],&tbuf[5],memosize - (i*bs));
else
memmove(&mbuf[fillpos],&tbuf[5],bs);
i++;
}
a = _ev;
blockpos = 1;
if (openwin(0,x+w->mx-1+ms,y+w->my-1,1,ml,_iv,_iv,0,"\0 ",TopCnt,"")) {
markw = curwin;
markw->disp = True;
initblk(markw->mwid * markw->mhgt,'░',markw->wincolr,markw->winblk);
dispwindow(markw);
}
dispblk(1,mbuf);
sx = 1;
sy = 1;
curfun(_GetCurs,&tcurs);
do {
blkedit((byte)(x+w->mx-1),(byte)(y+w->my-1),ms,ms*ml,memosize,&sx,&sy,w,mbuf);
if (exitcode == HlpKey) disphelp(h);
} while (exitcode == HlpKey);
if (markw != NULL) closewin(&markw);
curfun(_SetCTyp,&tcurs);
if (atr == 0) a = attrib;
else a = (byte) ((atr == 255) ? 0 : atr);
dispblk(1,mbuf);
if (exitcode != QitKey) {
_upward = (bool) (exitcode == CtrlPgUp);
memrecsiz = bs;
nummemrecs = memosize/bs;
if ((memosize % bs) != 0) {
nummemrecs++;
memrecsiz = memosize % bs;
}
dataok = False;
nextmemrec = 0;
if (srec == 0) {
memset(&tbuf[1],' ',recsize);
while (nummemrecs > 0) {
memmove(&tbuf[5],&mbuf[1+(nummemrecs-1)*bs],memrecsiz);
blockempty = chkblk(memrecsiz+4,tbuf);
if (memrecsiz < bs)
memrecsiz = bs;
if (dataok || (!blockempty)) {
dataok = True;
memmove(&tbuf[1],&memorecstat,4);
memmove(&tbuf[bs+5],&nextmemrec,4);
secure_rec0(dataf,Lock);
addrec(dataf,&nextmemrec,&tbuf[1]);
secure_rec0(dataf,UnLock);
memset(&tbuf[1],' ',recsize);
}
nummemrecs--;
}
memmove(fld->faddr,&nextmemrec,4);
}
else {
getrec(dataf,srec,&tbuf[1]);
memmove(&trec,&tbuf[bs+5],4);
memset(&tbuf[1],' ',recsize);
while (nummemrecs > 0) {
memmove(&tbuf[5],&mbuf[1+(nummemrecs-1)*bs],memrecsiz);
blockempty = chkblk(memrecsiz+4,tbuf);
if (memrecsiz < bs)
memrecsiz = bs;
if (dataok || (!blockempty)) {
dataok = True;
memmove(&tbuf[1],&memorecstat,4);
memmove(&tbuf[bs+5],&nextmemrec,4);
if (srec != 0) {
putrec(dataf,srec,&tbuf[1]);
nextmemrec = srec;
srec = trec;
if (srec != 0) {
getrec(dataf,srec,&tbuf[1]);
memmove(&trec,&tbuf[bs+5],4);
}
}
else {
secure_rec0(dataf,Lock);
addrec(dataf,&nextmemrec,&tbuf[1]);
secure_rec0(dataf,UnLock);
}
memset(&tbuf[1],' ',recsize);
}
nummemrecs--;
}
if (editmode) {
memmove(&tbuf[1],buf,recsize);
getrec(dataf,*recnum,buf);
memmove(fld->faddr,&nextmemrec,4);
putrec(dataf,*recnum,buf);
memmove(buf,&tbuf[1],recsize);
}
memmove(fld->faddr,&nextmemrec,4);
while (srec != 0) {
deleterec(dataf,srec);
srec = trec;
if (srec != 0) {
getrec(dataf,srec,&tbuf[1]);
memmove(&trec,&tbuf[bs+5],4);
}
}
}
}
}
/********************** UNIT INITIALIZATION/EXIT CODE *********************/
void db_memo_init(void)
{
if (!initialized) {
initialized = True;
db_funcs_init();
db_key_init();
db_tree_init();
db_util_init();
db_win_init();
memorecstat = -2;
editmode = False;
}
}
/**************************** END OF DB_MEMO.C ****************************/