home *** CD-ROM | disk | FTP | other *** search
/ Games 1995 to 2000 / Games.iso / SexTetris / INPUT.C < prev    next >
Encoding:
C/C++ Source or Header  |  1993-09-16  |  8.1 KB  |  231 lines

  1. #include "microlib.h"
  2.  
  3. #include <dos.h>
  4. #include "ibmpc.h"
  5. #include "input.h"
  6. #include "kbd.h"
  7.  
  8. #define OVERSTRIKE  0
  9. #define FALSE       0
  10. #define TRUE        1
  11.  
  12. int GetInput(int col, int line, UCHAR cEditAttr, UCHAR cWinAttr, PSTR pszField, PSTR pszFormat, int nScrnSize, int nTrueSize, PSTR pszValidSet)
  13. {
  14.     BOOL bInputAbsolute = OVERSTRIKE; // OverStrike = 0, Insert = 1
  15.     int  nCount, nCurrX, nCurrY, nCurrPos, nLastPos;
  16.     BOOL bDone;
  17.     char TStr1[256];
  18.     int  nCurrKey;
  19.     int  len, pos;
  20.     int  nLastCurrX, nLastCurrY;
  21.     int  nScanStart, nScanEnd;
  22.     int  nValidSetLen = strlen(pszValidSet);
  23.     char szStr[256] = {'\0'};
  24.     char *pszStr = &szStr[0];
  25.  
  26.     vioGetCurType(&nScanStart, &nScanEnd);
  27.     vioGetCurPos(&nLastCurrY, &nLastCurrX);
  28.     vioSetCurPos(line, col);
  29.     vioGetCurPos(&nCurrY, &nCurrX);
  30.     nLastPos = nCurrX + nScrnSize - 1;
  31.     nCurrPos = nCurrX;
  32.  
  33.     switch (*pszFormat) {
  34.         case 's' :
  35.             strcpy(szStr, pszField);
  36.             break;
  37.         case 'd' :
  38.             itoa(*pszField, szStr, 10);
  39.             break;
  40.     }
  41.  
  42.     at_say(nCurrX-2, nCurrY-1, "[", cWinAttr);
  43.     if (nScrnSize != nTrueSize)
  44.         at_say(nCurrX-1 + nScrnSize, nCurrY-1, "", cWinAttr);
  45.     else
  46.         at_say(nCurrX-1 + nScrnSize, nCurrY-1, "]", cWinAttr);
  47.  
  48.     at_say(nCurrX-1, nCurrY-1, LJ(szStr, TStr1, nScrnSize), cEditAttr);
  49.  
  50.     bDone = FALSE;
  51.     while (!bDone) {
  52.  
  53.         while (!(nCurrKey = _kbdhit()));
  54.  
  55.         switch (nCurrKey) {
  56.             case VK_TAB :
  57.             case VK_SHIFT_TAB :
  58.             case VK_DOWN :
  59.             case VK_UP :
  60.             case VK_PGDN :
  61.             case VK_PGUP :
  62.                 bDone = TRUE;
  63.                 break;
  64.  
  65.             case VK_LEFT :
  66.                 if (nCurrPos > nCurrX)
  67.                     nCurrPos -= 1;
  68.                 else {
  69.                     if (pszStr > &szStr[0]) {
  70.                         pszStr--;
  71.                         at_say(nCurrX-1 + nScrnSize, nCurrY-1, "", cWinAttr);
  72.                     }
  73.                     else
  74.                         at_say(nCurrX-2, nCurrY-1, "[", cWinAttr);
  75.                 }
  76.                 //CurPos -= (CurPos > CurX);
  77.                 break;
  78.  
  79.             case VK_RIGHT :
  80.                 if (nCurrPos < nLastPos)
  81.                     nCurrPos++;
  82.                 else {
  83.                     if (strlen(pszStr) > nScrnSize) {
  84.                         pszStr++;
  85.                         at_say(nCurrX-2, nCurrY-1, "", cWinAttr);
  86.                     }
  87.                     else
  88.                         if (strlen(szStr) < nTrueSize)
  89.                             pszStr++;
  90.                 }
  91.                 //CurPos += (CurPos < nLastPos);
  92.                 break;
  93.  
  94.             case VK_CTRL_BKSPACE :
  95.                 szStr[0] = '\0';
  96.                 pszStr = &szStr[0];
  97.                 nCurrPos = nCurrX;
  98.                 break;
  99.  
  100.             case VK_INSERT :
  101.                 bInputAbsolute ^= 1;
  102.                 if (bInputAbsolute != OVERSTRIKE)
  103.                     vioSetCurType(6, 12, 0);
  104.                 else
  105.                     vioSetCurType(nScanStart, nScanEnd, 0);
  106.                 break;
  107.  
  108.             case VK_DELETE :
  109.                 nCount = strlen(pszStr) - (nCurrPos - nCurrX);
  110.                 _movmem(pszStr + (nCurrPos - nCurrX), pszStr + (nCurrPos - nCurrX + 1), nCount > 0 ? nCount : 0);
  111.                 break;
  112.  
  113.             case VK_HOME :
  114.                 nCurrPos = nCurrX;
  115.                 pszStr = &szStr[0];
  116.                 at_say(nCurrX-2, nCurrY-1, "[", cWinAttr);
  117.                 if (nScrnSize != nTrueSize)
  118.                     at_say(nCurrX-1 + nScrnSize, nCurrY-1, "", cWinAttr);
  119.                 break;
  120.  
  121.             case VK_END :
  122.                 if (nScrnSize != nTrueSize)
  123.                     at_say(nCurrX-2, nCurrY-1, "", cWinAttr);
  124.                 at_say(nCurrX-1 + nScrnSize, nCurrY-1, "]", cWinAttr);
  125.                 len = strlen(szStr);
  126.                 if (len > nScrnSize) {
  127.                     pszStr = &szStr[0];
  128.                     pszStr += len - nScrnSize;
  129.                     if (len < nTrueSize)
  130.                         pszStr++;
  131.                     nCurrPos = nLastPos;
  132.                 }
  133.                 else
  134.                     nCurrPos = nCurrX - 1 + len;
  135.                 //CurPos = CurX + strlen(St) - (strlen(St) == nScrnSize);
  136.                 break;
  137.  
  138.             case VK_BKSPACE :
  139.                 //if ((nScrnSize == 1) || (strlen(St) == nScrnSize)) {
  140.                 if ((nScrnSize == 1) || (strlen(szStr) == nTrueSize)) {
  141.                     szStr[nCurrPos - nCurrX] = '\0';
  142.                 }
  143.                 else {
  144.                     if (nCurrPos != nCurrX) {
  145.                         nCount = strlen(pszStr) - (nCurrPos - nCurrX) + 1;
  146.                         _movmem(pszStr + (nCurrPos - nCurrX - 1), pszStr + (nCurrPos - nCurrX), nCount > 0 ? nCount : 0);
  147.                         if (pszStr > &szStr[0])
  148.                             pszStr--;
  149.                         else
  150.                             nCurrPos--;
  151.                     }
  152.                 }
  153.                 break;
  154.  
  155.             default:
  156.                 if (nCurrKey != VK_ESCAPE && nCurrKey != VK_ENTER && (nCurrKey > 0x01F && nCurrKey < 0x0100)) {
  157.                     TStr1[0] = (char) nCurrKey;
  158.                     TStr1[1] = '\0';
  159.                     if (*pszValidSet)
  160.                         if (!memchr(pszValidSet, TStr1[0], nValidSetLen)) {
  161.                             putchar(0x07);
  162.                             continue;
  163.                         }
  164.                     //if (InputAbsolute && (strlen(pSt) < nScrnSize)) {
  165.                     if (bInputAbsolute) {
  166.                         if (strlen(szStr) == nTrueSize) {
  167.                             putchar(0x07);
  168.                             break;
  169.                         }
  170.                         nCount = strlen(szStr) - (nCurrPos - nCurrX) + 1;
  171.                         // replace CurX/CurPos with strlen(pSt) in case
  172.                         // we are in a virtual position
  173.                         _movmem(TStr1, pszStr + (nCurrPos - nCurrX), nCount > 0 ? nCount : 0);
  174.                         _movmem(pszStr + (nCurrPos - nCurrX + 1), TStr1, nCount > 0 ? nCount : 0);
  175.                         pszStr[nCurrPos - nCurrX] = (char) nCurrKey;
  176.                         if (strlen(pszStr) > nScrnSize) {
  177.                             pszStr++;
  178.                             nCurrPos--;
  179.                         }
  180.                     }
  181.                     else {
  182.                         if ((nCurrPos - nCurrX + 1) == nScrnSize) {
  183.                             pszStr++;
  184.                             nCurrPos--;
  185.                             if (nScrnSize != nTrueSize)
  186.                                 at_say(nCurrX-2, nCurrY-1, "", cWinAttr);
  187.                         }
  188.                         Replace(TStr1, pszStr, (nCurrPos - nCurrX + 1));
  189.                         if (strlen(szStr) == nTrueSize)
  190.                             at_say(nCurrX-1 + nScrnSize, nCurrY-1, "]", cWinAttr);
  191.                     }
  192.  
  193.                     if (strlen(szStr) < nTrueSize)
  194.                         nCurrPos += ((nCurrPos - nCurrX + 1) < nScrnSize);
  195.                     else {
  196.                         if (pszStr != &szStr[0])
  197.                             pszStr--;
  198.                         nCurrPos++;
  199.                     }
  200.                 }
  201.                 else
  202.                     bDone = TRUE;
  203.                 break;
  204.         }
  205.  
  206.         if (!bDone) {
  207.             //at_say(CurY-1, CurX-1, LJ(St, TStr1, nScrnSize), cEditAttr);
  208.             at_say(nCurrX-1, nCurrY-1, LJ(pszStr, TStr1, nScrnSize), cEditAttr);
  209.             vioSetCurPos(nCurrY, nCurrPos);
  210.         }
  211.  
  212.     }
  213.     nCount = strlen(szStr);
  214.     if (nCount <= nScrnSize)
  215.         memset(szStr + nCount + 1, nScrnSize - nCount, 0);
  216.     at_say(nCurrX-1, nCurrY-1, LJ(szStr, TStr1, nScrnSize), cWinAttr);
  217.     vioSetCurPos(nLastCurrY, nLastCurrX);
  218.     vioSetCurType(nScanStart, nScanEnd, 0);
  219.  
  220.     switch (*pszFormat) {
  221.         case 's' :
  222.             strcpy(pszField, szStr);
  223.             break;
  224.         case 'd' :
  225.             *pszField = atoi(szStr);
  226.             break;
  227.     }
  228.  
  229.     return (nCurrKey);
  230. }
  231.