Category : Dbase (Clipper, FoxBase, etc) Languages Source Code
Archive   : JKEY06.ZIP
Filename : JKEY.C

 
Output of file : JKEY.C contained in archive : JKEY06.ZIP
/* JKEY.C V 1.06 */
/* */
/* Copyright: Joseph A. Gotthelf, 1992 */
/* */
/* Incremental browse utility. */
/* */

#include
#include

#define nl _PutChr('\n') /* from Swatch.C, from Fox Software */
#define TicksPerSecond 18.2064819336 /* " " */

#define MAXKEYLEN 100
#define UpArrow 328
#define DnArrow 336
#define LtArrow 331
#define RtArrow 333
#define Home 327
#define End 335
#define PgUp 329
#define PgDn 337
#define Ins 338
#define Del 339
#define Tab 9
#define CTRLY 25 + ctrlKey
#define ShiftTab 271 + shiftKey
#define F1 315
#define CTRLF1 350 + ctrlKey
#define CTRLF7 356 + ctrlKey
#define CTRLF8 357 + ctrlKey
#define CTRLF9 358 + ctrlKey
#define CTRLF10 359 + ctrlKey
#define NewLine 10 + ctrlKey
#define EnterKey 13

#define OFF 1
#define STDWIN 2
#define TOPWIN 3

MHANDLE jBuffHand = 0 ;
MHANDLE TalkHand = 0 ;
MHANDLE PrefixHand = 0 ;
MHANDLE WindHand = 0 ;

int JGotIt = FALSE ;
int HavejHand = FALSE ;
int HavePreHand = FALSE ;
int HaveTalkHand = FALSE ;
int HaveWindHand = FALSE ;
int HaveWind = FALSE ;
int HaveTalk = OFF ;
int HaveTalkWind = FALSE ;
int HaveNear = FALSE ;
int HaveBell = FALSE ;
int ResetTick = FALSE ;
int jLen = 0 ;
int pLen = 0 ;
int tpLen = 0 ;
int TalkLen = 0 ;
char ULA = 'A' ;
Rect TypeRect ;
Ticks DblClick, LastTick;
WHANDLE TalkWin ;
Point ZeroPt ;

unsigned handlerid;

int FAR JKEYClose(void)
{
_DeactivateHandler(handlerid);
FreeEm() ; // free handles

if (HaveTalkWind && HaveTalk != TOPWIN)
_WClose(TalkWin) ;

HaveTalk = OFF ; // reset these vars....
HaveTalkWind = FALSE ;
HaveWind = FALSE ;
return YES;
}

int FAR JKEYKey(EventRec FAR *ev)
{
Value val;
char FAR * jBuff ;
long OldRec;
int x ;

switch(ev->modifiers + ev->message) {
case 27: /* esc */
case 17 + ctrlKey: /* ctrl-q */
case 23 + ctrlKey: /* ctrl-w */
if (HaveWind)
if (!ThisWind())
return NO ;
JKEYClose();
return NO;

case UpArrow:
case DnArrow:
case LtArrow:
case RtArrow:
case Home:
case End:
case PgUp:
case PgDn:
case Ins:
case Del:
case Tab:
case ShiftTab:
case EnterKey:
case CTRLF7:
case CTRLF8:
case CTRLF9:
case CTRLF10:
return NO;

case CTRLF1: // only accept this if we can intelligently deal with it...
if (HaveWind)
return NO ;
break ;

case NewLine:
return YES; // just eat this

case CTRLY: // clear the input buffer
jLen = pLen ;
if (HaveTalkWind)
_WClearRect(TalkWin, TypeRect) ;
LastTick = ev->when ;
return YES;

default:
if (HaveWind)
if (!ThisWind())
return NO ;

_HLock(jBuffHand) ; // lots of callbacks in here
jBuff = _HandToPtr(jBuffHand) ;
if (ev->modifiers + ev->message == 8) { /* backspace */
jLen = jLen - 1 ;
if (HaveTalkWind)
_WClearRect(TalkWin, TypeRect) ;
}
else {
if (jLen <= MAXKEYLEN-1) {
switch(ULA)
{
case 'U':
jBuff[jLen] = jUpper(ev->message) ;
break ;
case 'L':
jBuff[jLen] = JLower(ev->message) ;
break ;
default:
jBuff[jLen] = ev->modifiers + ev->message ;
break ;
}
jLen = jLen + 1 ;
}
}
if (jLen < pLen)
jLen = pLen ;
else {
val.ev_type = 'C' ;
val.ev_width = 1 ;
val.ev_handle = jBuffHand ;
val.ev_length = jLen ;
jBuff[jLen] = '\0' ;
if (HaveTalkWind) {
_WPosCursor(TalkWin, ZeroPt) ;
if(jLen - pLen > TalkLen)
_WPutStr(TalkWin, jBuff + pLen + ((jLen - pLen)-TalkLen));
else
_WPutStr(TalkWin, jBuff + pLen);
}
OldRec = _DBRecNo(-1L);
if ((JGotIt = _dbseek(&val)) == 0 && !HaveNear) {
if (HaveBell)
_PutChr(7);
_DBRead(-1L, OldRec) ;
}
}
ResetTick = TRUE ;
_HUnLock(jBuffHand) ;
return YES;
}
}

int FAR OKLHandler(WHANDLE theWindow, EventRec FAR *ev)
{
switch(ev->what) {
case nullEvent:
if (ResetTick) {
LastTick = ev->when ;
ResetTick = FALSE ;
}
if ((ev->when - LastTick) > DblClick && jLen > pLen) {
jLen = pLen ;
if (HaveTalkWind)
_WClearRect(TalkWin, TypeRect) ;
LastTick = ev->when ;
}
return NO;

case keyDownEvent:
return JKEYKey(ev);

default:
return NO;
}
}

void FAR JKEYInit(ParamBlk FAR *parm)
{
Value DblVal;
char FAR * TempBuff;
char FAR * PrefixBuff;
char FAR * TalkBuff ;
int x;

if (HavejHand)
JKEYClose() ;

switch(parm->pCount) {
case 0:
/* no parameters */
break ;

case 4:
Parm4(parm) ; // exits api if it fails

case 3:
Parm3(parm) ; // exits api if it fails

case 2:
Parm2(parm) ; // exits api if it fails

case 1:
Parm1(parm) ; // exits api if it fails
break ;

default:
_UserError("usage: =JKEY([U/L/A[,prefix][,prefix]]") ; // exits api
}

if ((jBuffHand = _AllocHand(MAXKEYLEN + 1)) == 0)
jError(182) ; // out of memory - exits api

HavejHand = TRUE ;

if(pLen > 0) { // move prefix into the main seek buffer
_MemMove(_HandToPtr(jBuffHand), _HandToPtr(PrefixHand), pLen) ;
jLen = pLen;
}

if (HavePreHand) {
_FreeHand(PrefixHand) ;
HavePreHand = FALSE ;
}

if ((x = _Evaluate(&DblVal, "_DBLCLICK")) < 0)
jError(x) ; // exits api

DblClick = DblVal.ev_real * TicksPerSecond ;

if ((x = _Evaluate(&DblVal, "SET('TALK')")) < 0)
jError(x) ; // exits api

_FreeHand(DblVal.ev_handle) ;

if(DblVal.ev_length == 2 && HaveTalk == OFF) // len=2 if 'ON', len=3 if 'OFF'
HaveTalk = STDWIN ;

if (HaveTalk != OFF) {
if (tpLen > 56)
tpLen = 56 ;

if (HaveTalk == TOPWIN) {
TalkWin = _WOnTop() ;

if ((x = _Evaluate(&DblVal, "ROW()")) < 0)
jError(x) ; // exits api

TypeRect.top = DblVal.ev_long ;
TypeRect.bottom = TypeRect.top + 1 ;

if ((x = _Evaluate(&DblVal, "COL()")) < 0)
jError(x) ; // exits api

TypeRect.left = tpLen = DblVal.ev_long ;

if ((x = _Evaluate(&DblVal, "WCOL()")) < 0)
jError(x) ; // exits api

TypeRect.right = DblVal.ev_long - 1 ;
TalkLen = TypeRect.right - tpLen ;

ZeroPt.v = TypeRect.top ;
ZeroPt.h = TypeRect.left ;
_WPosCursor(TalkWin, ZeroPt) ;
HaveTalkWind = TRUE ;
} else {
TalkWin = _WOpen(1, 60 - tpLen, 3, 78, SHADOW+AUTOSCROLL+MOVE, DIALOG_SCHEME, 0, WO_SINGLEBOX) ;
TalkLen = 16 ; // allocated for scrolling text
HaveTalkWind = TRUE ;

TypeRect.top = 0 ;
TypeRect.left = tpLen ;
TypeRect.bottom = 1 ;
TypeRect.right = (78 - (60-tpLen)) - 1 ; // watcom will roll up

_WShow(TalkWin) ;
if (tpLen > 0) {
ZeroPt.v = 0 ;
ZeroPt.h = 0 ;
_WPosCursor(TalkWin, ZeroPt) ;
TalkBuff = _HandToPtr(TalkHand) ;
_WPutStr(TalkWin, TalkBuff);
}
ZeroPt.v = 0 ;
ZeroPt.h = tpLen ;
}
}
if (HaveTalkHand) {
_HUnLock(TalkHand) ;
_FreeHand(TalkHand) ;
HaveTalkHand = FALSE ;
}

if ((x = _Evaluate(&DblVal, "SET('NEAR')")) < 0)
jError(x) ; // exits api

_FreeHand(DblVal.ev_handle) ;

if(DblVal.ev_length == 2) // len=2 if 'ON', len=3 if 'OFF'
HaveNear = TRUE ;

if ((x = _Evaluate(&DblVal, "SET('BELL')")) < 0)
jError(x) ; // exits api

_FreeHand(DblVal.ev_handle) ;

if(DblVal.ev_length == 2) // len=2 if 'ON', len=3 if 'OFF'
HaveBell = TRUE ;

handlerid = _ActivateHandler(OKLHandler);
}

void FreeEm(void)
{
if (HavePreHand)
_FreeHand(PrefixHand) ;

if (HaveTalkHand)
_FreeHand(TalkHand) ;

if (HavejHand)
_FreeHand(jBuffHand) ;

if (HaveWindHand)
_FreeHand(WindHand) ;

HavePreHand = HaveTalkHand = HavejHand = HaveWindHand = FALSE ;
}

void Parm1(ParamBlk FAR *parm)
{
Value FAR * HoldVal = _Alloca(sizeof(Value)) ;
char FAR * TempBuff ;

FillVal(parm, HoldVal, 0) ; // exits api on failure

if(HoldVal->ev_length != 1) {
JKEYClose() ;
_UserError("First parm must be U, L, or A") ; // exits api
}

TempBuff = (char FAR *) _HandToPtr(HoldVal->ev_handle);

switch(TempBuff[0])
{
case 'U':
case 'u':
ULA = 'U';
break;
case 'L':
case 'l':
ULA = 'L';
break;
case 'A':
case 'a':
ULA = 'A';
break ;
default:
if(parm->p[0].loc.l_type == 'R')
_FreeHand(HoldVal->ev_handle) ;
JKEYClose() ;
_UserError("First parm must be U, L, or A") ; // exits api
}
if(parm->p[0].loc.l_type == 'R')
_FreeHand(HoldVal->ev_handle) ;
}

void Parm2(ParamBlk FAR *parm)
{
char FAR * PrefixBuff ;
Value FAR * HoldVal = _Alloca(sizeof(Value)) ;

FillVal(parm, HoldVal, 1) ; // exits api on failure

if((PrefixHand = _AllocHand(HoldVal->ev_length + 1)) == 0) {
if(parm->p[1].loc.l_type == 'R') // pass by reference
_FreeHand(HoldVal->ev_handle) ;
jError(182); // out of memory - exits api
}

HavePreHand = TRUE ; // global variable
pLen = HoldVal->ev_length;

PrefixBuff = _HandToPtr(PrefixHand);

_MemMove(PrefixBuff, _HandToPtr(HoldVal->ev_handle), pLen) ;

*(PrefixBuff + pLen) = '\0' ;

if(parm->p[1].loc.l_type == 'R') // pass by reference
_FreeHand(HoldVal->ev_handle) ;
}

void Parm3(ParamBlk FAR *parm)
{
// talk window text

char FAR * TalkBuff ;
Value FAR * HoldVal = _Alloca(sizeof(Value)) ;

FillVal(parm, HoldVal, 2) ; // exits api on failure

if((TalkHand = _AllocHand(HoldVal->ev_length + 1)) == 0) {
if(parm->p[2].loc.l_type == 'R') // pass by reference
_FreeHand(HoldVal->ev_handle) ;
jError(182); // out of memory - exits api
}
HaveTalkHand = TRUE ;
tpLen = HoldVal->ev_length ;
HaveTalk = OFF ;
if (tpLen > 0)
HaveTalk = STDWIN ; // regardless of SET TALK

TalkBuff = _HandToPtr(TalkHand) ;

_MemMove(TalkBuff, _HandToPtr(HoldVal->ev_handle), tpLen) ;

*(TalkBuff + tpLen) = '\0' ;

if (tpLen == 1)
if (TalkBuff[0] == '*')
HaveTalk = TOPWIN ;

if(parm->p[2].loc.l_type == 'R') // pass by reference
_FreeHand(HoldVal->ev_handle) ;
}

void Parm4(ParamBlk FAR *parm)
{
char FAR * WindBuff ;
Value FAR * HoldVal = _Alloca(sizeof(Value)) ;
int WindLen ;

FillVal(parm, HoldVal, 3) ; // exits api on failure

if((WindHand = _AllocHand(HoldVal->ev_length + 1)) == 0) {
if(parm->p[3].loc.l_type == 'R') // pass by reference
_FreeHand(HoldVal->ev_handle) ;
jError(182); // out of memory - exits api
}
HaveWindHand = TRUE;
WindLen = HoldVal->ev_length;

WindBuff = _HandToPtr(WindHand) ;

_MemMove(WindBuff, _HandToPtr(HoldVal->ev_handle), WindLen) ;

*(WindBuff + WindLen) = '\0' ;

if(parm->p[3].loc.l_type == 'R')
_FreeHand(HoldVal->ev_handle) ;

if (WindLen > 0)
HaveWind = TRUE ;
}

/* Adapted from a Compuserve message/code fragment posted by */
/* Peter Colclough which explained how to get parameters by */
/* reference. */
void FillVal(ParamBlk FAR *parm, Value FAR * HoldVal, int ParmNum)
{
if(parm->p[ParmNum].loc.l_type == 'R') // pass by reference
_Load(&parm->p[ParmNum].loc, HoldVal) ;
else
_MemMove(HoldVal, &parm->p[ParmNum].val, sizeof(Value)) ;

if(HoldVal->ev_type != 'C')
jError(901) ; // invalid function argument value... - exits api
}

int ThisWind(void)
{
// char FAR * TempWind ;
char TempWind [80] ;

_HLock(WindHand) ;
_WTitle(_WOnTop(), TempWind) ;
if (StrCmp(TempWind, _HandToPtr(WindHand))) {
_HUnLock(WindHand) ;
return NO ;
}
_HUnLock(WindHand) ;
return YES ;
}

void JKEYCanc(void)
{
JKEYClose() ;
}

jUpper(unsigned long jMessage)
{
jMessage = (int) toupper((int) jMessage) ;

if (jMessage <= 90L && jMessage >= 65L)
return jMessage ;

// test for international...
return jUpLo(jMessage, 1, 2) ;
}


unsigned long jLower(unsigned long jMessage)
{
jMessage = (int) tolower((int) jMessage) ;

if (jMessage <= 90L && jMessage >= 65L)
return jMessage ;

return jUpLo(jMessage, 2, 1) ;
}

jUpLo(unsigned long jMessage, int Src, int Dest)
{
Locator loc;
NTI nti;
Value val;
int element, errcode, NumElements ;
static Locator g_pdparms ;

if ((nti = _NameTableIndex("_JKEYINTER")) >= 0) {
if (_FindVar(nti, -1, &loc)) {
g_pdparms = loc;
if (loc.l_subs != 2) {
JKEYClose() ;
_UserError("_jKeyInter must be 2 dimentional") ; // exits api
}
if (_ALen(nti, AL_SUBSCRIPT2) != 2) {
JKEYClose() ;
_UserError("_jKeyInter must be 2 columns wide") ; // exits api
}
NumElements = _ALen(nti, AL_SUBSCRIPT1) ;
for (element = 0; element < NumElements ; element++) {
loc = g_pdparms;
loc.l_sub1 = element + 1;
loc.l_sub2 = Src ;

if (errcode = _Load(&loc, &val))
jError(errcode) ; // exits api

if (jMessage == (unsigned long) val.ev_real) {
loc = g_pdparms ;
loc.l_sub1 = element+1 ;
loc.l_sub2 = Dest ;
_Load(&loc, &val) ;
jMessage = (unsigned long) val.ev_real ;
break ;
} // endif
} // endfor
} // endif (_FindVar(nti, -1, &loc))
} // endif ((nti = _NameTableIndex("_JKEYINTER")) >= 0)
return jMessage ;
}

void JKEYAbout(void)
{
_Dialog(6,
"JKEY - Incremental browse search utility.\nVersion 1.06 5/18/92.\nby Joe Gotthelf CIS ID: 74017,3670",
(char FAR *)0, "Ok", (char FAR *)0, 1, 1) ;
}

void JKEYFound(void)
{
if (JGotIt)
_RetLogical(TRUE) ;
else
_RetLogical(FALSE) ;
}

void jError(int ErrNum)
{
JKEYClose() ;
_Error(ErrNum) ;
}

/*
void jPrintVars()
{
char jbuff[80] ;
sprintf(jbuff, "JGotIt %d\n", JGotIt) ;
_PutStr(jbuff) ;

sprintf(jbuff, "HavejHand %d\n", HavejHand) ;
_PutStr(jbuff) ;

sprintf(jbuff, "HavePreHand %d\n", HavePreHand) ;
_PutStr(jbuff) ;

sprintf(jbuff, "HaveTalkHand %d\n", HaveTalkHand) ;
_PutStr(jbuff) ;

sprintf(jbuff, "HaveWindHand %d\n", HaveWindHand) ;
_PutStr(jbuff) ;

sprintf(jbuff, "HaveWind %d\n", HaveWind) ;
_PutStr(jbuff) ;

sprintf(jbuff, "HaveTalk %d\n", HaveTalk) ;
_PutStr(jbuff) ;

sprintf(jbuff, "HaveTalkWind %d\n", HaveTalkWind) ;
_PutStr(jbuff) ;

sprintf(jbuff, "HaveNear %d\n", HaveNear) ;
_PutStr(jbuff) ;

sprintf(jbuff, "HaveBell %d\n", HaveBell) ;
_PutStr(jbuff) ;

sprintf(jbuff, "ResetTick %d\n", ResetTick) ;
_PutStr(jbuff) ;

sprintf(jbuff, "jLen %d\n", jLen) ;
_PutStr(jbuff) ;

sprintf(jbuff, "pLen %d\n", pLen) ;
_PutStr(jbuff) ;

sprintf(jbuff, "tpLen %d\n", tpLen) ;
_PutStr(jbuff) ;

sprintf(jbuff, "TalkLen %d\n", TalkLen) ;
_PutStr(jbuff) ;

sprintf(jbuff, "ULA %c\n", ULA) ;
_PutStr(jbuff) ;

sprintf(jbuff, "TypeRect.top %d\n", TypeRect.top) ;
_PutStr(jbuff) ;

sprintf(jbuff, "TypeRect.bottom %d\n", TypeRect.bottom) ;
_PutStr(jbuff) ;


sprintf(jbuff, "TypeRect.left %d\n", TypeRect.left) ;
_PutStr(jbuff) ;

sprintf(jbuff, "TypeRect.right %d\n", TypeRect.right) ;
_PutStr(jbuff) ;

sprintf(jbuff, "ZeroPt.v %d\n", ZeroPt.v) ;
_PutStr(jbuff) ;

sprintf(jbuff, "ZeroPt.h %d\n", ZeroPt.h) ;
_PutStr(jbuff) ;
}
*/
FoxInfo myFoxInfo[] = {
{"JKEYINIT", JKEYInit, 4, ".?,.?,.?,.?"},
{"JKEYCANC", JKEYCanc, 0, ""},
{"JKEYCLOSE", JKEYClose, CALLONUNLOAD, ""},
{"JKEYFOUND", JKEYFound, 0, ""},
{"JKEYABOUT", JKEYAbout, 0, ""}
// {"JPRINTVARS", jPrintVars, 0, ""}
};

FoxTable _FoxTable = {
(FoxTable FAR *)0, sizeof(myFoxInfo) / sizeof(FoxInfo), myFoxInfo
};


  3 Responses to “Category : Dbase (Clipper, FoxBase, etc) Languages Source Code
Archive   : JKEY06.ZIP
Filename : JKEY.C

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/