home *** CD-ROM | disk | FTP | other *** search
- #include "microlib.h"
-
- #include <dos.h>
- #include "ibmpc.h"
- #include "input.h"
- #include "kbd.h"
-
- #define OVERSTRIKE 0
- #define FALSE 0
- #define TRUE 1
-
- int GetInput(int col, int line, UCHAR cEditAttr, UCHAR cWinAttr, PSTR pszField, PSTR pszFormat, int nScrnSize, int nTrueSize, PSTR pszValidSet)
- {
- BOOL bInputAbsolute = OVERSTRIKE; // OverStrike = 0, Insert = 1
- int nCount, nCurrX, nCurrY, nCurrPos, nLastPos;
- BOOL bDone;
- char TStr1[256];
- int nCurrKey;
- int len, pos;
- int nLastCurrX, nLastCurrY;
- int nScanStart, nScanEnd;
- int nValidSetLen = strlen(pszValidSet);
- char szStr[256] = {'\0'};
- char *pszStr = &szStr[0];
-
- vioGetCurType(&nScanStart, &nScanEnd);
- vioGetCurPos(&nLastCurrY, &nLastCurrX);
- vioSetCurPos(line, col);
- vioGetCurPos(&nCurrY, &nCurrX);
- nLastPos = nCurrX + nScrnSize - 1;
- nCurrPos = nCurrX;
-
- switch (*pszFormat) {
- case 's' :
- strcpy(szStr, pszField);
- break;
- case 'd' :
- itoa(*pszField, szStr, 10);
- break;
- }
-
- at_say(nCurrX-2, nCurrY-1, "[", cWinAttr);
- if (nScrnSize != nTrueSize)
- at_say(nCurrX-1 + nScrnSize, nCurrY-1, "", cWinAttr);
- else
- at_say(nCurrX-1 + nScrnSize, nCurrY-1, "]", cWinAttr);
-
- at_say(nCurrX-1, nCurrY-1, LJ(szStr, TStr1, nScrnSize), cEditAttr);
-
- bDone = FALSE;
- while (!bDone) {
-
- while (!(nCurrKey = _kbdhit()));
-
- switch (nCurrKey) {
- case VK_TAB :
- case VK_SHIFT_TAB :
- case VK_DOWN :
- case VK_UP :
- case VK_PGDN :
- case VK_PGUP :
- bDone = TRUE;
- break;
-
- case VK_LEFT :
- if (nCurrPos > nCurrX)
- nCurrPos -= 1;
- else {
- if (pszStr > &szStr[0]) {
- pszStr--;
- at_say(nCurrX-1 + nScrnSize, nCurrY-1, "", cWinAttr);
- }
- else
- at_say(nCurrX-2, nCurrY-1, "[", cWinAttr);
- }
- //CurPos -= (CurPos > CurX);
- break;
-
- case VK_RIGHT :
- if (nCurrPos < nLastPos)
- nCurrPos++;
- else {
- if (strlen(pszStr) > nScrnSize) {
- pszStr++;
- at_say(nCurrX-2, nCurrY-1, "", cWinAttr);
- }
- else
- if (strlen(szStr) < nTrueSize)
- pszStr++;
- }
- //CurPos += (CurPos < nLastPos);
- break;
-
- case VK_CTRL_BKSPACE :
- szStr[0] = '\0';
- pszStr = &szStr[0];
- nCurrPos = nCurrX;
- break;
-
- case VK_INSERT :
- bInputAbsolute ^= 1;
- if (bInputAbsolute != OVERSTRIKE)
- vioSetCurType(6, 12, 0);
- else
- vioSetCurType(nScanStart, nScanEnd, 0);
- break;
-
- case VK_DELETE :
- nCount = strlen(pszStr) - (nCurrPos - nCurrX);
- _movmem(pszStr + (nCurrPos - nCurrX), pszStr + (nCurrPos - nCurrX + 1), nCount > 0 ? nCount : 0);
- break;
-
- case VK_HOME :
- nCurrPos = nCurrX;
- pszStr = &szStr[0];
- at_say(nCurrX-2, nCurrY-1, "[", cWinAttr);
- if (nScrnSize != nTrueSize)
- at_say(nCurrX-1 + nScrnSize, nCurrY-1, "", cWinAttr);
- break;
-
- case VK_END :
- if (nScrnSize != nTrueSize)
- at_say(nCurrX-2, nCurrY-1, "", cWinAttr);
- at_say(nCurrX-1 + nScrnSize, nCurrY-1, "]", cWinAttr);
- len = strlen(szStr);
- if (len > nScrnSize) {
- pszStr = &szStr[0];
- pszStr += len - nScrnSize;
- if (len < nTrueSize)
- pszStr++;
- nCurrPos = nLastPos;
- }
- else
- nCurrPos = nCurrX - 1 + len;
- //CurPos = CurX + strlen(St) - (strlen(St) == nScrnSize);
- break;
-
- case VK_BKSPACE :
- //if ((nScrnSize == 1) || (strlen(St) == nScrnSize)) {
- if ((nScrnSize == 1) || (strlen(szStr) == nTrueSize)) {
- szStr[nCurrPos - nCurrX] = '\0';
- }
- else {
- if (nCurrPos != nCurrX) {
- nCount = strlen(pszStr) - (nCurrPos - nCurrX) + 1;
- _movmem(pszStr + (nCurrPos - nCurrX - 1), pszStr + (nCurrPos - nCurrX), nCount > 0 ? nCount : 0);
- if (pszStr > &szStr[0])
- pszStr--;
- else
- nCurrPos--;
- }
- }
- break;
-
- default:
- if (nCurrKey != VK_ESCAPE && nCurrKey != VK_ENTER && (nCurrKey > 0x01F && nCurrKey < 0x0100)) {
- TStr1[0] = (char) nCurrKey;
- TStr1[1] = '\0';
- if (*pszValidSet)
- if (!memchr(pszValidSet, TStr1[0], nValidSetLen)) {
- putchar(0x07);
- continue;
- }
- //if (InputAbsolute && (strlen(pSt) < nScrnSize)) {
- if (bInputAbsolute) {
- if (strlen(szStr) == nTrueSize) {
- putchar(0x07);
- break;
- }
- nCount = strlen(szStr) - (nCurrPos - nCurrX) + 1;
- // replace CurX/CurPos with strlen(pSt) in case
- // we are in a virtual position
- _movmem(TStr1, pszStr + (nCurrPos - nCurrX), nCount > 0 ? nCount : 0);
- _movmem(pszStr + (nCurrPos - nCurrX + 1), TStr1, nCount > 0 ? nCount : 0);
- pszStr[nCurrPos - nCurrX] = (char) nCurrKey;
- if (strlen(pszStr) > nScrnSize) {
- pszStr++;
- nCurrPos--;
- }
- }
- else {
- if ((nCurrPos - nCurrX + 1) == nScrnSize) {
- pszStr++;
- nCurrPos--;
- if (nScrnSize != nTrueSize)
- at_say(nCurrX-2, nCurrY-1, "", cWinAttr);
- }
- Replace(TStr1, pszStr, (nCurrPos - nCurrX + 1));
- if (strlen(szStr) == nTrueSize)
- at_say(nCurrX-1 + nScrnSize, nCurrY-1, "]", cWinAttr);
- }
-
- if (strlen(szStr) < nTrueSize)
- nCurrPos += ((nCurrPos - nCurrX + 1) < nScrnSize);
- else {
- if (pszStr != &szStr[0])
- pszStr--;
- nCurrPos++;
- }
- }
- else
- bDone = TRUE;
- break;
- }
-
- if (!bDone) {
- //at_say(CurY-1, CurX-1, LJ(St, TStr1, nScrnSize), cEditAttr);
- at_say(nCurrX-1, nCurrY-1, LJ(pszStr, TStr1, nScrnSize), cEditAttr);
- vioSetCurPos(nCurrY, nCurrPos);
- }
-
- }
- nCount = strlen(szStr);
- if (nCount <= nScrnSize)
- memset(szStr + nCount + 1, nScrnSize - nCount, 0);
- at_say(nCurrX-1, nCurrY-1, LJ(szStr, TStr1, nScrnSize), cWinAttr);
- vioSetCurPos(nLastCurrY, nLastCurrX);
- vioSetCurType(nScanStart, nScanEnd, 0);
-
- switch (*pszFormat) {
- case 's' :
- strcpy(pszField, szStr);
- break;
- case 'd' :
- *pszField = atoi(szStr);
- break;
- }
-
- return (nCurrKey);
- }
-