home *** CD-ROM | disk | FTP | other *** search
/ Black Box 4 / BlackBox.cdr / progc / cfuncs.arj / INOUT.C < prev    next >
C/C++ Source or Header  |  1991-12-16  |  10KB  |  364 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <conio.h>
  4. #include <inout.h>
  5. #include <funcs.h>
  6.  
  7. /*----------------------- inout ------------------------------*/
  8. /*DESCRIPTION: Allows entry, editing, displaying, and clearing*/
  9. /*    of a field of data with specified length, position,   */
  10. /*    color attributes, and data types.  Handles function   */
  11. /*    keys, tab keys, and arrow keys.                  */
  12. /*                                  */
  13. /*INPUT:
  14. --------VARIABLE---------------------DESCRIPTION--------------
  15.     X    ;X COORDINATE TO START ENTERING INFORMATION
  16.     Y    ;COLUMN TO START ENTERING INFORMATION
  17.     len    ;MAX LENGTH OF DATA TO BE ENTERED
  18.     FG    ;FOREGROUND COLOR
  19.     BG    ;BACKGROUND COLOR
  20.     Data    ;STRING THE ENTRY IS STORED IN
  21.  
  22.     Mode    ;0 = ENTER
  23.         ;1 = EDIT WITH CURSOR AT THE END OF THE DATA FIELD
  24.         ;2 = EDIT WITH CURSOR AT THE BEGINNING OF THE FIELD
  25.         ;3 = DISPLAY THE DATA FIELD
  26.         ;4 = CLEAR THE DATA FIELD
  27.  
  28.     Type    ;0 = ALPHANUMERIC (DEF)
  29.         ;1 = NUMERIC
  30.         ;2 = PHONE # (999)-999-9999
  31.         ;3 = SOCIAL SECURITY NUMBER 999-99-9999
  32.         ;4 = DATE - MM/DD/YY
  33.         ;5 = PASSWORD
  34.         ;6 = UPPER CASE AN
  35.         ;7 = INTEGER
  36.         ;8 = REAL
  37.         ;9 = A SYSTEM GENERATED NUMBER
  38.         ;10 = LONG
  39.                 ;11 = DOLLAR
  40.  
  41.     show    ;0 = DOTS (DEF)
  42.         ;1 = BLANKS
  43.         ;2 = UNDERSCORE
  44.         ;3 = NO SHOW
  45.  
  46.     vkey    ;CHAR 1 -- F = ALLOW FUNCTION KEY USE
  47.         ;CHAR 2 -- A = ALLOW UP AND DOWN ARROW USE
  48.         ;CHAR 3 -- T = ALLOW TAB AND BACKTAB EXIT FROM INOUT
  49.  
  50.     ret    INPUT
  51.         ;0 = NON-DESTRUCTIVE ENTER KEY IN EDIT MODE (DEF)
  52.         ;1 = DESTRUCTIVE ENTER KEY IN EDIT MODE
  53.         OUTPUT
  54.         ;0 = FIELD FILLED
  55.         ;1-12 = FUNCTION KEY PRESSED
  56.         ;13 = ENTER KEY PRESSED
  57.         ;14 = ESC KEY
  58.         ;15 = UP ARROW
  59.         ;16 = DOWN ARROW
  60.         ;17 = TAB
  61.         ;18 = BACKTAB
  62. USES: strspc, strnchr, OnCursor, GetCursor, SetCursor, rtrim, rtrimlen,
  63.     CheckNum, GetIdleCh
  64. ---------------------------------------------------------------*/
  65. void inout (int X, int Y, int len, int FG, int BG, void *Data, int Mode,
  66.     int Type, int show, char *vkey, int *ret)
  67. {
  68.     int    CursorX = 0, i, Fkey = 0, arrow = 0, tabkey = 0, fld=0;
  69.     char    temp[80], *EntryPtr[3], EntOpt[4], *mask, entry[80];
  70.     int     EntryX[3], EntMd;
  71.     int    retrn, lendata, a, MoveX, MaxFld=0;
  72.     unsigned int    OldCursor;
  73.     char *strand(char *dest, const char *src);
  74.     char *strtok(char *s1, const char *s2);
  75.     char *strspc(char *s, int n);
  76.     char *rtrim(char *s);
  77.     double atof(const char *s);
  78.  
  79. /*----------USE RECURSION TO GET SPECIAL TYPES -----------*/
  80.     if (Type==INOUT_PHONE || Type==INOUT_SSN || Type==INOUT_DATE)
  81.     {
  82.         switch (Type) {
  83.           case INOUT_PHONE : mask = "(   )-   -    "; break;
  84.           case INOUT_SSN :   mask = "   -  -    "; break;
  85.           case INOUT_DATE :  mask = "  /  /  "; break;
  86.           default : printf("illegal type in funcion inout\n"); exit(0); }
  87.           i=0;
  88.           do {
  89.          if(mask[i]==' ')
  90.            temp[i] = (show==INOUT_BLANKS)?' ':(show==INOUT_UNDERSCORE)?'_':'∙';
  91.          else
  92.            temp[i] = mask[i];
  93.           } while(mask[i++] != '\0');
  94.  
  95.            /* display mask or data */
  96.         if(Mode==INOUT_EDIT_BEG || Mode==INOUT_EDIT_END) {
  97.            EntryPtr[0] = Data;
  98.            i = Type; }
  99.         else {
  100.            EntryPtr[0] = temp;
  101.            i = INOUT_AN; }
  102.         inout(X, Y, strlen(mask), FG, BG, EntryPtr[0],
  103.             INOUT_DISPLAY, i, 1, "", &retrn);
  104.  
  105.            /* set specifics for the entry type */
  106.         strand(Data, mask);
  107.         i=0;
  108.         EntryPtr[i] = strtok(Data, "()-/");
  109.         while(EntryPtr[i] != NULL)
  110.            EntryPtr[++i] = strtok(NULL, "()-/");
  111.         for(i=0; i<3; ++i)
  112.           EntryX[i] = X + (EntryPtr[i]-Data)/sizeof(char);
  113.         strcpy(EntOpt, vkey);
  114.         EntOpt[2] = 'T';
  115.         if(Mode==INOUT_EDIT_END) fld = 2;
  116.         /* loop */
  117.         do {
  118.           if(fld < 0)  fld = 0;
  119.           if(fld < MaxFld) EntMd = 2;
  120.           else {
  121.         EntMd = Mode;
  122.         MaxFld = fld; }
  123.           retrn = *ret;
  124.           inout(EntryX[fld], Y, strlen(EntryPtr[fld]), FG, BG,
  125.           EntryPtr[fld], EntMd, 1, show, EntOpt, &retrn);
  126.           if(retrn == INOUT_DOWN || retrn == INOUT_TAB) fld++; /* tab keys  */
  127.           if(retrn == INOUT_BACKTAB || retrn == INOUT_UP) fld--;
  128.           if(retrn == INOUT_ESC) break;
  129.           if(retrn >= INOUT_F1 && retrn <= INOUT_F12 && vkey[0] == 'F') break;
  130.           if(fld<0 || fld >2)
  131.         if((vkey[2]=='T'&&(retrn==17||retrn==18))
  132.             || (vkey[1]=='A' && (retrn==15||retrn==16))) break;
  133.         else if(fld<0)    fld = 0;
  134.              else fld = 2;
  135.           if(retrn == INOUT_ENTER_KEY) break;
  136.           if(retrn == 0) ++fld;
  137.         } while(fld < 3);
  138.         strand(Data, mask);
  139.         *ret = retrn;
  140.         return;
  141.     }
  142.  
  143. /*---------------SET INITIAL CONDITIONS----------*/
  144.     textcolor(FG);
  145.     textbackground(BG);
  146. FailCheckRestart:
  147.     gotoxy(X, Y);
  148.  
  149.     if((Mode == 1 || Mode == 2) && *ret == 1)
  150.         retrn = 1;
  151.     else
  152.         retrn = 0;
  153.     *ret = 0;
  154.  
  155.     if(Mode == INOUT_ENTER || Mode == INOUT_CLEAR)
  156.     {    strspc(entry, len);
  157.         if(show == INOUT_BLANKS)
  158.             cputs(entry);
  159.         else if(show == INOUT_UNDERSCORE)
  160.             cputs(strnchr(temp,'_',len));
  161.         else if(show != INOUT_NO_SHOW)
  162.             cputs(strnchr(temp, '∙', len));
  163.     }
  164.     if(Mode==INOUT_CLEAR)
  165.     {
  166.       if(Type==INOUT_INTEGER)
  167.         *( (int *) Data) = 0;
  168.       else if(Type == INOUT_LONG)
  169.         *( (long *) Data) = 0;
  170.       else if(Type == INOUT_REAL)
  171.         *( (double * ) Data) = 0;
  172.       else if(Type == INOUT_DOLLAR )
  173.         *( (double * ) Data) = 0;
  174.       else
  175.         strcpy(Data, entry);
  176.       return;
  177.     }
  178.  
  179.     if(Mode>=1 && Mode <=3)
  180.       if(Type== INOUT_INTEGER)
  181.         itoa( *((int *) Data), entry, 10);
  182.       else if(Type == INOUT_LONG)
  183.         ltoa( *((long *) Data), entry, 10);
  184.       else if(Type== INOUT_REAL)
  185.             sprintf(entry, "%f", *((double *) Data));
  186.       else if(Type== INOUT_DOLLAR)
  187.         sprintf(entry, "%-*f", len-3,  *((double *) Data));
  188.       else
  189.         strcpy(entry, Data);
  190.  
  191.  
  192.     if(strlen(entry) > len)
  193.         entry[len] = '\0';
  194.  
  195.     if(Mode >= 1 && Mode <= 3)
  196.     {         /* display data */
  197.        lendata = strlen(rtrim(entry));
  198.        cputs((Type==5) ? strnchr(temp, 'X', lendata) : entry);
  199.        if(show != INOUT_NO_SHOW && lendata != len) {
  200.          gotoxy(X+lendata, Y);
  201.          cputs(strnchr(temp,(show==INOUT_BLANKS)?' ':(show==INOUT_UNDERSCORE)?'_':'∙', len-lendata));}
  202.     }
  203.  
  204.     if(Mode==INOUT_DISPLAY) return;
  205.  
  206.     if(vkey[0] == 'F') Fkey = 1;
  207.     if(vkey[1] == 'A') arrow = 1;
  208.     if(vkey[2] == 'T') tabkey = 1;
  209.  
  210.     if(Mode == 1 && lendata < len)
  211.         CursorX = lendata;
  212.     else if( Mode == 1)
  213.         CursorX = len -1;
  214.  
  215.     /* save old cursor & turn on cursor */
  216.     OldCursor = GetCursor();
  217.     OnCursor();
  218. /*----------------MAIN LOOP--------------------------------*/
  219.     for(; 1==1;)
  220.     {
  221.         MoveX = 0;
  222.  
  223.         if((lendata = strlen(entry)) < len)
  224.             strspc(entry+lendata, len - lendata);
  225.         gotoxy(X + CursorX, Y);
  226.  
  227. /*---------------GET INPUT-------------*/
  228.         a = GetIdleCh();
  229.  
  230.         if(a == 0)
  231.             a = 256 + getch();   /* extended characters */
  232.  
  233.         if(a >= 32 && a <=255)        /* valid character */
  234.         {
  235.             if(Type==0 || Type >1&&Type<=6||
  236.                a>='0' && a<='9' ||
  237.                (Type==INOUT_INTEGER||Type==INOUT_REAL||Type==INOUT_DOLLAR||Type==INOUT_LONG) && (a=='-' || a=='+')||
  238.                (Type == INOUT_REAL||Type == INOUT_DOLLAR) && a=='.')
  239.             {  if(Type == INOUT_UPCASE) a = toupper(a);
  240.                putch((Type==5) ? 'X' : a);
  241.                entry[CursorX] = a;
  242.                MoveX = 1; } }
  243.         else if(a == 8)    {        /* bs key */
  244.             if(CursorX != 0) {
  245.               gotoxy(X+CursorX-1, Y);
  246.               lendata = rtrimlen(entry);
  247.               for(i = CursorX-1; i < lendata-1; ++i) {
  248.                 entry[i] = entry[i+1];
  249.                 putch((Type==5) ? 'X' : entry[i]); }
  250.               entry[i] = ' ';
  251.               putch((show==INOUT_BLANKS)?' ':(show==INOUT_UNDERSCORE)?'_':'∙');
  252.               MoveX = -1; } }
  253.         else if(a == 9)            /* tab key */
  254.             if(tabkey) {
  255.               *ret = 17;
  256.               break; }
  257.             else {
  258.               if(CursorX+5 < rtrimlen(entry)) MoveX = 5; }
  259.         else if(a == 13){            /* Enter key */
  260.             *ret = 13;
  261.             break; }
  262.         else if(a == 27) {            /* Esc key */
  263.             *ret = 14;
  264.             break; }
  265.         else if(a >=315 && a <=324)        /* PF key */
  266.             {   if(Fkey)
  267.                 {    *ret = a - 314;
  268.                 break; } }
  269.         else if(a==389 || a==390) {        /* F11 & 12 */
  270.             if(Fkey) {
  271.               *ret = a - 378;
  272.               break; } }
  273.         else if(a == 327)        /* home key */
  274.             MoveX = (CursorX * -1);
  275.         else if( a == 328)        /* up arrow */
  276.             {   if(arrow)
  277.                  {    *ret = 15;
  278.                 break; } }
  279.         else if(a == 336)        /* down arrow */
  280.             {  if(arrow)
  281.                {  *ret = 16;
  282.                   break; } }
  283.         else if(a == 335)        /* end key */
  284.             MoveX = rtrimlen(entry) - CursorX;
  285.         else if(a == 331)        /* left arrow */
  286.             MoveX = -1;
  287.         else if(a == 333 && CursorX < rtrimlen(entry))        /* right arrow */
  288.               MoveX = 1;
  289.         else if(a == 339) {        /* del key */
  290.             lendata = rtrimlen(entry);
  291.             for(i=CursorX; i<lendata-1; ++i) {
  292.               entry[i] = entry[i+1];
  293.               putch((Type==5) ? 'X' : entry[i]); }
  294.             entry[i] = ' ';
  295.               putch((show==INOUT_BLANKS)?' ':(show==INOUT_UNDERSCORE)?'_':'∙');}
  296.         else if(a == 271)        /* backtab key */
  297.             if(tabkey) {
  298.               *ret = 18;
  299.               break; }
  300.             else MoveX = -5;
  301.  
  302. /*------------- CHECK END CONDITIONS --------*/
  303.         if(CursorX + MoveX >= len && a > 30 && a < 256)
  304.             break;
  305.  
  306.         if(CursorX + MoveX > len - 1)    MoveX = 0;
  307.         if(CursorX + MoveX < 0)        MoveX = 0;
  308.         CursorX = CursorX + MoveX;
  309.     }
  310.  
  311.     if((retrn == 1 || Mode == 0) && CursorX +1 != len)
  312.     {    gotoxy( X + CursorX, Y);          /* destructive enter */
  313.         cputs(strnchr(temp,(show==INOUT_DOTS)?'∙':(show==INOUT_UNDERSCORE)?'_':' ', len - CursorX));
  314.         strspc(entry + CursorX, len - CursorX);
  315.     }
  316.  
  317.     if(Type == INOUT_SYSGEN && strcmp(entry, Data) && !CkBeep(CheckNum(entry))) {
  318.        strcpy(Data, entry);
  319.        Mode = INOUT_EDIT_END;
  320.        goto FailCheckRestart; }
  321.  
  322.  
  323.     if(Type==INOUT_INTEGER)
  324.       *( (int *) Data) = atoi(entry);
  325.     else if(Type == INOUT_LONG)
  326.       *( (long *) Data) = atol(entry);
  327.     else if(Type == INOUT_REAL)
  328.       *( (double * ) Data) = atof(entry);
  329.     else if(Type == INOUT_DOLLAR)
  330.       *( (double * ) Data) = atof(entry);
  331.     else
  332.       strcpy(Data, entry);
  333.  
  334.     SetCursor(OldCursor);  /* return cursor to its original shape */
  335. } /* inout */
  336.  
  337. char *strand(char *dest, const char *src)
  338. {
  339.    int i, len;
  340.    len = strlen(src);
  341.    for(i=0; i<len; ++i)
  342.    {
  343.      if(src[i] != ' ')
  344.        dest[i] = src[i];
  345.      if(dest[i] == '\0')
  346.     dest[i] = ' ';
  347.    }
  348.    dest[i] = '\0';
  349.    return(dest);
  350. }
  351.  
  352. /* main()
  353. {
  354.     int ret=0;
  355.         double ammount=250;
  356.  
  357.         clrscr();
  358.     inout(5, 8, 7, WHITE, BLACK, &ammount, EDIT_BEG, DOLLAR, DOTS, "XXX", &ret);
  359. }
  360.  */
  361.  
  362.  
  363.  
  364.