home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 10 Tools
/
10-Tools.zip
/
ibmtool.zip
/
intrface.c
< prev
next >
Wrap
Text File
|
1997-11-07
|
19KB
|
556 lines
/******************************************************************************/
/* */
/* FILE: INTRFACE.C */
/* */
/* PURPOSE: This file contains the internal command line and script file */
/* processing. */
/* */
/* FUNCTIONS: InitInterface */
/* ParseCommand */
/* InsertCharStr */
/* GetCommand */
/* DoScript */
/* */
/* GLOBAL DATA ACCESSED */
/* char HelpCmd[15] */
/* int CmdFromHelp */
/* int LastMenuOpt */
/* int PrevMenuOpt */
/* int CurrMenuOpt */
/* BOOLEAN ScriptMode */
/* BOOLEAN SLog */
/* USHORT LastStatus */
/* FILE *ScriptFile, */
/* *LogFile */
/* MENU MenuBar[] */
/* WINDOW CmdLine */
/* */
/******************************************************************************/
#define INCL_SUB
#define INCL_BASE
#define INCL_DOS
#include <os2.h>
#include <stdio.h>
#include <stdarg.h>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "ndis.h"
#include "ibmtool.h"
#include "ioctl.h"
#include "intrface.h"
struct CMDQUEUE {
char Cmd[MAXSTRING];
struct CMDQUEUE *next;
struct CMDQUEUE *prev;
} CmdQ[MAXCMDS];
struct CMDQUEUE *CQTop, *CQBot, *CurCmd;
BOOLEAN MenuMode = FALSE;
COMMAND Cmds[] = {
{ "ADDMC" , TTAddMulticastAddr },
{ "CHKDATA" , TTCheckData },
{ "CHKIND" , TTCheckIndications },
{ "CHKLK" , TTCheckLookahead },
{ "CHKSTAT" , TTCheckStatus },
{ "CHKTOKEN" , TTCheckTokenRing },
{ "CLOSE" , TTClose },
{ "CLRIND" , TTClearIndications },
{ "CLRMAC" , TTClearMAC },
{ "CSTAT" , TTClearStat },
{ "DEBUG" , TTDebug },
{ "DELMC" , TTDeleteMulticastAddr },
{ "ECHO" , TTEcho },
{ "EDITBUF" , TTEditBuffer },
{ "EXIT" , TTExit },
{ "FILTER" , TTSetPacketFilter },
{ "FUNADR" , TTSetFunctionalAddr },
{ "HELP" , Help },
{ "INDCOMP" , TTIndComp },
{ "INDICON" , TTIndicationsOn },
{ "INDICOFF" , TTIndicationsOff },
{ "INITDIAG" , TTInitiateDiagnostics },
{ "INTREQ" , TTInterruptRequest },
{ "INT3" , TTInt3 },
{ "JUMP" , TTJump },
{ "LOG" , TTLog },
{ "MODOPEN" , TTModifyOpenParms },
{ "MONITOR" , TTMonitor },
{ "MULTRAN" , TTMultipleXmit },
{ "OPEN" , TTOpen },
{ "QUIT" , TTExit },
{ "READMAC" , TTReadMAC },
{ "READLOG" , TTReadErrorLog },
{ "REQCONF" , TTReqConf },
{ "RESET" , TTResetMAC },
{ "RUN" , TTRun },
{ "RXBUF" , TTDispRcvBufs },
{ "RXCHAIN" , TTRxChain },
{ "RXLOOK" , TTRxLook },
{ "RXRLS" , TTReceiveRelease },
{ "RXSIZE" , TTSetRxBuffSize },
{ "RXWAIT" , TTRxWait },
{ "SERVER" , TTServer },
{ "SETLOOK" , TTSetLookAhead },
{ "SETSTAT" , TTSetStatus },
{ "SETSTN" , TTSetStationAddr },
{ "SRVTX" , TTServerXmit },
{ "STATIND" , TTStatInd },
{ "STRESS" , TTStress },
{ "TRAN" , TTXmit },
{ "TXBUF" , TTDispXmitBuf },
{ "TXCONF" , TTTxConf },
{ "TXSIZE" , TTSetTxBuffSize },
{ "USEGDT" , TTUseGDT },
{ "USTAT" , TTUpdateStatistics },
{ "SLEEP" , TTSleep },
{ "VER" , TTVersion },
{ "WKSTA" , TTWorkstation },
{ "?" , DoIHelp },
{ "" , NULL } };
char *RcString[] = { "OK", // 0
"Invalid Parameter", // 1
"DEBUG NOT ON", // 2
"General Request did not complete", // 3
"NO SERVER FOUND" // 4
};
void InitInterface ()
{
int i, j;
VIOMODEINFO ModeInfo;
// initialize some global variables
CmdFromHelp = FALSE;
HelpMode = FALSE;
// initialize the command queue
for (i=0; i<MAXCMDS; ++i)
for (j=0; j<MAXSTRING; ++j)
CmdQ[i].Cmd[j] = '\0';
CQBot = CQTop = CurCmd = &CmdQ[0];
for (i=0; i<MAXCMDS - 1; ++i)
CmdQ[i].next = &CmdQ[i+1];
CmdQ[i].next = &CmdQ[0];
for (i=MAXCMDS - 1; i>0; --i)
CmdQ[i].prev = &CmdQ[i-1];
CmdQ[i].prev = &CmdQ[MAXCMDS - 1];
// set video mode
ModeInfo.cb = sizeof (VIOMODEINFO);
VioGetMode (&ModeInfo, 0);
ModeInfo.col = MAXCOL + 1;
ModeInfo.row = MAXROW + 1;
VioSetMode (&ModeInfo, 0);
InitMsg ();
InitMenu ();
InitHelp ();
InitScreen ();
}
void ParseCommand (char *cmd)
{
char newcmd[MAXSTRING];
char temp[15];
char *CmdTok;
int i, rc;
BOOLEAN found = FALSE;
if (!*cmd) return;
strcpy (newcmd, cmd);
strupr (cmd);
if (!ScriptMode && SLog)
{
if (strstr (cmd, "\n"))
fprintf (LogFile, "%s", cmd);
else
fprintf (LogFile, "%s\n", cmd);
}
CmdTok = strtok (cmd, "\n\t ");
if (!CmdTok) return;
// search the regular command list
for (i=0; Cmds[i].CmdFunc != NULL; ++i)
{
if (!stricmp (CmdTok, Cmds[i].Command))
{
found = TRUE;
rc = Cmds[i].CmdFunc ();
if (rc)
PrintMsg (RED, RcString[rc]);
break;
}
} /* endfor */
if (!found)
PrintMsg (YELLOW, "Command not recognized");
else if (!ScriptMode)
{
strcpy (CQBot->Cmd, newcmd);
CQBot = CQBot->next;
CurCmd = CQBot;
if (CQBot == CQTop) CQTop = CQTop->next;
UpdateInfo ();
}
}
void InsertCharStr (char *strpos, char ch)
{
char tstr[MAXSTRING];
char *q = strpos;
strcpy (tstr, strpos);
*q++ = ch;
strcpy (q, tstr);
}
void GetCommand ()
{
BYTE bAttr[2] = " ";
char *p, *s, *token;
char cmd[MAXSTRING];
char temp[15];
int done = 0, i, len = 0, InsertMode = 0;
USHORT col, curcol = CmdLine.Left + 1, ySave;
KBDKEYINFO KbdInfo, NoKbdInfo = { 0, 0, 0, 0, 0, 0L };
VIOCURSORINFO CursorInfo;
VioGetCurType (&CursorInfo, 0);
ySave = CursorInfo.yStart;
bAttr[1] = CmdLine.Attr;
s = p = cmd;
VioSetCurPos (CmdLine.Top, CmdLine.Left + 1, 0);
memset (cmd, '\0', MAXSTRING);
if (CmdFromHelp)
{
strcpy (cmd, HelpCmd);
curcol += len = strlen (cmd);
p += len;
VioWrtCharStrAtt (s, (len < MAXCOL) ? len : MAXCOL,
CmdLine.Top, 1, &CmdLine.Attr, 0);
VioSetCurPos (CmdLine.Top, curcol, 0);
}
while (!done)
{
CheckIndications ();
KbdInfo = NoKbdInfo;
KbdCharIn (&KbdInfo, IO_NOWAIT, 0);
if (KbdInfo.fsState & ALT_KEY)
{
for (i=0; *MenuBar[i].Option; ++i)
{
if (MenuBar[i].SelKey == KbdInfo.chScan)
{
SelectMenuOpt (i);
break;
}
} /* endfor */
}
else if (isprint (KbdInfo.chChar))
{
if (KbdInfo.fsState & INSERT_STATE)
{
InsertCharStr (p, KbdInfo.chChar);
++p;
}
else
*p++ = KbdInfo.chChar;
if (curcol != MAXCOL)
++curcol;
else
++s;
++len;
VioWrtCharStrAtt (s, (len < MAXCOL) ? len : MAXCOL,
CmdLine.Top, 1, &CmdLine.Attr, 0);
VioSetCurPos (CmdLine.Top, curcol, 0);
}
else
{
switch (KbdInfo.chScan)
{
case ENTER:
done = 1;
len = 0;
if (CmdFromHelp)
{
CmdFromHelp = FALSE;
SelectMenuOpt (PrevMenuOpt);
}
break;
case RIGHT:
if (MenuMode)
{
if (CurrMenuOpt == LastMenuOpt)
SelectMenuOpt (0);
else
SelectMenuOpt (CurrMenuOpt + 1);
break;
}
if (len && curcol <= len)
{
++p;
if (++curcol > MAXCOL)
{
curcol = MAXCOL;
++s;
VioWrtCharStrAtt (s, (len < MAXCOL) ? len : MAXCOL,
CmdLine.Top, 1, &CmdLine.Attr, 0);
}
VioSetCurPos (CmdLine.Top, curcol, 0);
}
break;
case LEFT:
if (MenuMode)
{
if (CurrMenuOpt == 0)
SelectMenuOpt (LastMenuOpt);
else
SelectMenuOpt (CurrMenuOpt - 1);
break;
}
if (curcol > 1)
{
VioSetCurPos (CmdLine.Top, --curcol, 0);
--p;
}
if (s != cmd)
{
--s;
VioWrtCharStrAtt (s, (len < MAXCOL) ? len : MAXCOL,
CmdLine.Top, 1, &CmdLine.Attr, 0);
}
break;
case UP:
if (CmdFromHelp)
{
CmdFromHelp = FALSE;
SelectMenuOpt (PrevMenuOpt);
}
if (CurCmd == CQTop) break;
CurCmd = CurCmd->prev;
strcpy (cmd, CurCmd->Cmd);
len = strlen (cmd);
p = cmd + len;
if (len > MAXCOL)
{
s = cmd + len - 78;
curcol = MAXCOL;
}
else
{
s = cmd;
curcol = len + 1;
}
VioWrtCharStrAtt (s, len, CmdLine.Top, 1, &CmdLine.Attr, 0);
VioScrollUp (CmdLine.Top, CmdLine.Left + len + 1,
CmdLine.Bottom, -1, -1, bAttr, 0);
VioSetCurPos (CmdLine.Top, curcol, 0);
break;
case DOWN:
if (CmdFromHelp)
{
CmdFromHelp = FALSE;
SelectMenuOpt (PrevMenuOpt);
}
CurCmd = CurCmd->next;
if (CurCmd == CQBot->next) CurCmd = CQBot;
if (CurCmd == CQBot)
memset (cmd, 0, MAXSTRING);
else
strcpy (cmd, CurCmd->Cmd);
len = strlen (cmd);
p = cmd + len;
if (len > MAXCOL)
{
s = cmd + len - 78;
curcol = MAXCOL;
}
else
{
s = cmd;
curcol = len + 1;
}
VioWrtCharStrAtt (s, len, CmdLine.Top, 1, &CmdLine.Attr, 0);
VioScrollUp (CmdLine.Top, CmdLine.Left + len + 1,
CmdLine.Bottom, -1, -1, bAttr, 0);
VioSetCurPos (CmdLine.Top, curcol, 0);
break;
case HOME:
curcol = 1;
VioWrtCharStrAtt (cmd, (len < MAXCOL) ? len : MAXCOL,
CmdLine.Top, 1, &CmdLine.Attr, 0);
VioSetCurPos (CmdLine.Top, curcol, 0);
s = p = cmd;
break;
case BACKSPACE:
if (p != cmd)
{
strcpy (p-1, p);
*(cmd + strlen (cmd) + 1) = '\0';
--curcol;
--p;
--len;
}
VioWrtCharStrAtt (s, (len < MAXCOL) ? len : MAXCOL,
CmdLine.Top, 1, &CmdLine.Attr, 0);
VioScrollUp (CmdLine.Top, CmdLine.Left + len + 1,
CmdLine.Bottom, -1, -1, bAttr, 0);
VioSetCurPos (CmdLine.Top, curcol, 0);
break;
case END:
p = cmd + len;
if (len > MAXCOL)
{
s = cmd + len - 78;
curcol = MAXCOL;
VioWrtCharStrAtt (s, (len < MAXCOL) ? len : MAXCOL,
CmdLine.Top, 1, &CmdLine.Attr, 0);
}
else
curcol = len + 1;
VioSetCurPos (CmdLine.Top, curcol, 0);
break;
case INSERT:
InsertMode = ~InsertMode;
if (InsertMode)
CursorInfo.yStart = 4;
else
CursorInfo.yStart = ySave;
VioSetCurType (&CursorInfo, 0);
if (CmdFromHelp)
{
if ((token == strtok (cmd, "\n\t ")))
{
strcpy (temp, token);
strcat (temp, " ");
if (strcmp (temp, HelpCmd))
{
CmdFromHelp = FALSE;
SelectMenuOpt (PrevMenuOpt);
memset (cmd, '\0', MAXSTRING);
p = s = cmd;
len = 0;
curcol = 1;
ClearWindow (CmdLine);
aprintf (CmdLine.Top, CmdLine.Left, CmdLine.Attr, ">");
VioSetCurType (&CursorInfo, 0);
VioSetCurPos (CmdLine.Top, curcol, 0);
}
}
}
break;
case DELETE:
if (*p)
{
strcpy (p, p+1);
*(cmd + len + 1) = '\0';
--len;
VioWrtCharStrAtt (s, (len < MAXCOL) ? len : MAXCOL,
CmdLine.Top, 1, &CmdLine.Attr, 0);
VioScrollUp (CmdLine.Top, CmdLine.Left + len + 1,
CmdLine.Bottom, -1, -1, bAttr, 0);
}
if (CmdFromHelp && len < strlen (HelpCmd))
{
CmdFromHelp = FALSE;
SelectMenuOpt (PrevMenuOpt);
memset (cmd, '\0', MAXSTRING);
p = s = cmd;
len = 0;
curcol = 1;
ClearWindow (CmdLine);
aprintf (CmdLine.Top, CmdLine.Left, CmdLine.Attr, ">");
VioSetCurType (&CursorInfo, 0);
VioSetCurPos (CmdLine.Top, curcol, 0);
}
break;
case TAB:
DoMessageWindow ();
VioSetCurPos (CmdLine.Top, curcol, 0);
break;
case ESC:
if (CmdFromHelp)
{
CmdFromHelp = FALSE;
SelectMenuOpt (PrevMenuOpt);
}
memset (cmd, '\0', MAXSTRING);
p = s = cmd;
len = 0;
curcol = 1;
ClearWindow (CmdLine);
aprintf (CmdLine.Top, CmdLine.Left, CmdLine.Attr, ">");
VioSetCurType (&CursorInfo, 0);
VioSetCurPos (CmdLine.Top, curcol, 0);
break;
case F10:
if (MenuMode) MenuMode = FALSE;
else MenuMode = TRUE;
if (CmdFromHelp)
{
CmdFromHelp = FALSE;
SelectMenuOpt (PrevMenuOpt);
}
break;
} /* endswitch */
} /* endif */
} /* endwhile */
if (*cmd && !strnicmp (cmd, "RUN ", 4))
{
token = strtok (cmd, "\n\t ");
TTRun ();
}
else if (*cmd)
ParseCommand (cmd);
ClearWindow (CmdLine);
aprintf (CmdLine.Top, CmdLine.Left, CmdLine.Attr, ">");
VioSetCurPos (CmdLine.Top, CmdLine.Left + 1, 0);
}
void DoScript ()
{
char cmd[MAXSTRING];
memset (cmd, '\0', MAXSTRING);
SLog = TRUE;
while (fgets (cmd, MAXSTRING, ScriptFile))
{
CheckIndications ();
if (*cmd != ':')
{
if (strstr (cmd, "\n"))
{
printf ("%s", cmd);
fprintf (LogFile, "%s", cmd);
}
else
{
printf ("%s\n", cmd);
fprintf (LogFile, "%s\n", cmd);
}
}
if (*cmd != '#' && *cmd != ':')
ParseCommand (cmd);
} /* endwhile */
}