Annotation of os2sdk/demos/apps/terminal/options.c, revision 1.1.1.1

1.1       root        1: /***
                      2:  *
                      3:  * TITLE 
                      4:  *
                      5:  *     options.c
                      6:  *     Copyright (C) Microsoft Corporation 1987
                      7:  *     March 1987
                      8:  *
                      9:  * DESCRIPTION
                     10:  *
                     11:  *     This module handles the user interface for setting the options for
                     12:  *      the COM port and the MODEM.
                     13:  *
                     14:  *     If a filename was specified in the command line, the initialisation 
                     15:  *     of the COM port and the MODEM will be performed as indicated in 
                     16:  *     the file (creation of this file will be described later). If an error 
                     17:  *     is encountered in opening the file or, if no file was specified in the 
                     18:  *     command line, an option screen is displayed. The user is then required 
                     19:  *     to specify the appropriate options for initialisation of the COM port 
                     20:  *     and the MODEM.
                     21:  * 
                     22:  *     The program will request the following information from the user via 
                     23:  *     the option screen:
                     24:  *
                     25:  *             Port        :
                     26:  *             Baud Rate   :
                     27:  *             Data Bits   :
                     28:  *             Stop Bits   :
                     29:  *             Parity      :
                     30:  *             Connect     : 
                     31:  *             Dial Type   : 
                     32:  *             Wait Tone   :
                     33:  *             Wait Carrier:
                     34:  *             Phone Number:
                     35:  *             Setup File  :
                     36:  *
                     37:  *     Port:
                     38:  *             Specify com port. The available options are com1, com2.
                     39:  *     Baud Rate:
                     40:  *             The available options are 1200, 2400, 4800, 9600, 110,
                     41:  *             150, 300, 600.
                     42:  *     Data Bits:
                     43:  *             The available options are 7 and 8.
                     44:  *     Stop Bits:
                     45:  *             The available options are 1 and 2.
                     46:  *     Parity:
                     47:  *             The available options are even, none and odd.
                     48:  *     Connect: 
                     49:  *             The available options are computer and modem.
                     50:  *     Dial Type:
                     51:  *             The available options are tone and pulse.
                     52:  *     Wait Tone:
                     53:  *             The available options are 10, 15, 20, 25, 50, 75, 100, 
                     54:  *             125, 150, 175, 200, 225 and 250 seconds.
                     55:  *             Determines how long the modem waits after "picking up
                     56:  *             the telephone" before it dials the first digit of the
                     57:  *             telephone number. This delay allows time for the central
                     58:  *             office to detect the "off-hook" condition of the line and
                     59:  *             apply a dial tone.
                     60:  *     Wait Carrier: 
                     61:  *             The available options are 10, 15, 20, 25, and 30.
                     62:  *             Sets the time that the local modem waits for carrier from
                     63:  *             the remote modem before hanging up.
                     64:  *     Phone Number:
                     65:  *             Type the telephone number of the service. Type the entire
                     66:  *             number including 1 and the area code if necessary. 
                     67:  *             Commas instruct the modem to pause before dialing a number.
                     68:  *             For example, if you must dial 9 to get an outside line, type
                     69:  *             a comma after the 9. This allows time to wait for a dial
                     70:  *             tone before the modem dials the number. You can use hyphens 
                     71:  *             in the number for clarity; the modem ignores them.
                     72:  *     Setup File:
                     73:  *             This is the name of file in which the options will be saved.
                     74:  *             The default file name is terminal.ini . If you prefer
                     75:  *              a different name, delete the default name and type the
                     76:  *              name you prefer. You may include the path name.
                     77:  *
                     78:  */
                     79: 
                     80: #include       <stdio.h>
                     81: #include       <doscalls.h>
                     82: #include       <subcalls.h>
                     83: #include       <malloc.h>
                     84: #include       <string.h>
                     85: #include       <memory.h>
                     86: #include       <conio.h>
                     87: #include       "term.h"
                     88: 
                     89: extern void far error (int, int);
                     90: 
                     91: extern char    *ErrMsg[NUM_MSG];
                     92: 
                     93: #define Z_ALPHA     0x01
                     94: #define Z_DIGIT     0x02
                     95: #define Z_WHITE     0x04
                     96: #define Z_PATH     0x08
                     97: #define Z_PHONE     0x10
                     98: 
                     99: #define     O_WIDTH    62
                    100: #define     O_HEIGHT   21
                    101: 
                    102: char optScreen[O_HEIGHT][O_WIDTH+1] = {
                    103:    /* 123456789 123456789 123456789 123456789 123456789 123456789 1 */
                    104:     "                    [ Terminal Parameters ]                   ", /*  0 */
                    105:     "                                                              ", /*  1 */
                    106:     "   Port        :     com1                                     ", /*  2 */
                    107:     "   Baud Rate   :     1200                                     ", /*  3 */
                    108:     "   Data Bits   :        7                                     ", /*  4 */
                    109:     "   Stop Bits   :        2                                     ", /*  5 */
                    110:     "   Parity      :     even                                     ", /*  6 */
                    111:     "   Connect     : computer                                     ", /*  7 */
                    112:     "   Dial Type   :     tone                                     ", /*  8 */
                    113:     "   Wait Tone   :       30                                     ", /*  9 */
                    114:     "   Wait Carrier:       10                                     ", /* 10 */
                    115:     "                                                              ", /* 11 */
                    116:     "   Phone Number: 9,555-1212                                   ", /* 12 */
                    117:     "                                                              ", /* 13 */
                    118:     "   Setup File  : terminal.ini                                 ", /* 14 */
                    119:     "                                                              ", /* 15 */
                    120:     "                                                              ", /* 16 */
                    121:     "       Use UP and DOWN cursor keys to move between fields.    ", /* 17 */
                    122:     "       Use LEFT and RIGHT cursor keys to change a field.      ", /* 18 */
                    123:     "                                                              ", /* 19 */
                    124:     "                   [ Press Enter to return ]                  "  /* 20 */
                    125: };
                    126: 
                    127: #define     rowPort    2
                    128: #define     colPort    21
                    129: 
                    130: #define     rowBaud    3
                    131: #define     colBaud    21
                    132: 
                    133: #define     rowData    4
                    134: #define     colData    24
                    135: 
                    136: #define     rowStop    5
                    137: #define     colStop    24
                    138: 
                    139: #define     rowParity  6
                    140: #define     colParity  21
                    141: 
                    142: #define            rowConnect  7
                    143: #define     colConnect 17
                    144: 
                    145: #define     rowDial     8
                    146: #define     colDial    20
                    147: 
                    148: #define     rowTone     9
                    149: #define     colTone    22
                    150: 
                    151: #define     rowCarrier  10
                    152: #define     colCarrier  23
                    153: 
                    154: #define     rowPhone   12
                    155: #define     colPhone   17
                    156: #define     wPhone     20              /* width of phone string */
                    157: #define     sPhone  (Z_DIGIT | Z_PHONE)
                    158:                         /*012345678901234567890*/
                    159: char strPhone[wPhone+1] = "9,555-1212           ";
                    160: #define     lenPhone   12
                    161: 
                    162: #define     rowFile    14
                    163: #define     colFile    17
                    164: #define     wFile      40
                    165: #define     sFile   (Z_PATH | Z_ALPHA | Z_DIGIT)
                    166:                     /*01234567890123456789012345678901234567890*/
                    167: char strFile[wFile+1]="terminal.ini                             ";
                    168: #define     lenFile    13
                    169: 
                    170: int O_ROW;     /* Coordinates of top left corner of option menu */
                    171: int O_COL;
                    172: 
                    173: char *csBaud[] = {
                    174:     "1200",
                    175:     "2400",
                    176:     "4800",
                    177:     "9600",
                    178:     " 110",
                    179:     " 150",
                    180:     " 300",
                    181:     " 600"
                    182: };
                    183: 
                    184: #define nBaud  (sizeof(csBaud)/sizeof(char*))
                    185: #define wBaud   4      
                    186: int intBaud[nBaud] = {
                    187:    1200,
                    188:    2400,
                    189:    4800,
                    190:    9600,
                    191:     110,
                    192:     150,
                    193:     300,
                    194:     600
                    195: };
                    196: 
                    197: char *csPort[] = {
                    198:     "com1",
                    199:     "com2"
                    200: };
                    201: #define nPort  (sizeof(csPort)/sizeof(char*))
                    202: #define wPort  4
                    203: 
                    204: char *csData[] = {
                    205:     "7",
                    206:     "8"
                    207: };
                    208: #define nData  (sizeof(csData)/sizeof(char*))
                    209: #define wData  1
                    210: 
                    211: unsigned char chData[nData] = {
                    212:     7,
                    213:     8
                    214: };
                    215: 
                    216: char *csStop[] = {
                    217:     "1",
                    218:     "2"
                    219: };
                    220: #define nStop  (sizeof(csStop)/sizeof(char*))
                    221: #define wStop  1
                    222: 
                    223: unsigned char chStop[nStop] = {
                    224:     0,
                    225:     2
                    226: };
                    227: 
                    228: char *csParity[] = {
                    229:     "even",
                    230:     " odd",
                    231:     "none"
                    232: };
                    233: #define nParity   (sizeof(csParity)/sizeof(char*))
                    234: #define wParity   4
                    235: 
                    236: unsigned char chParity[nParity] = {
                    237:     EVEN,
                    238:     ODD,
                    239:     NONE
                    240: };
                    241: 
                    242: char *csConnect[] = {
                    243:     "computer",
                    244:     "   modem"
                    245: };
                    246: #define nConnect   (sizeof(csConnect)/sizeof(char*))
                    247: #define wConnect   8
                    248: unsigned char chConnect[nConnect] = {
                    249:     COMPUTER,
                    250:     MODEM
                    251: };
                    252: 
                    253: char *csDial[] = {
                    254:     " tone",
                    255:     "pulse"
                    256: };
                    257: #define nDial   (sizeof(csDial)/sizeof(char*))
                    258: #define wDial   5
                    259: unsigned char chDial[nConnect] = {
                    260:     TONE,
                    261:     PULSE
                    262: };
                    263: 
                    264: char *csTone[] = {
                    265:     " 10",
                    266:     " 15",
                    267:     " 20",
                    268:     " 25",
                    269:     " 50",
                    270:     " 75",
                    271:     "100",
                    272:     "125",
                    273:     "150",
                    274:     "175",
                    275:     "200",
                    276:     "225",
                    277:     "250"
                    278: };
                    279: /* register S6 in Hayes Modem */
                    280: #define nTone   (sizeof(csTone)/sizeof(char*))
                    281: #define wTone   3
                    282: int iTone[nTone] = {10,15,20,25,50,75,100,125,150,175,200,225,250};
                    283: 
                    284: char *csCarrier[] = {
                    285:     "30",
                    286:     "25",
                    287:     "20",
                    288:     "15",
                    289:     "10",
                    290:     " 5"
                    291: };
                    292: /* register S7 in Hayes Modem */
                    293: #define nCarrier   (sizeof(csCarrier)/sizeof(char*))
                    294: #define wCarrier   2
                    295: int iCarrier[nCarrier] = {30, 25, 20, 15, 10, 5};
                    296: 
                    297: #define OT_SET     0           /* Option types */
                    298: #define OT_ASCIIZ   1
                    299: 
                    300: unsigned char cMap[256];
                    301: 
                    302: typedef struct {
                    303:     int sc_n;                  /* number of different values */
                    304:     char **sc_name;            /* array of value names */
                    305: } setControl_s;
                    306: 
                    307: typedef struct {
                    308:     unsigned char az_Set;      /* flags of valid characters */
                    309: } azControl_s;
                    310: 
                    311: typedef struct {
                    312:     int ctl_type;              /* Type of control */
                    313:     int ctl_row;               /* row to display value name */
                    314:     int ctl_col;               /* column to display value name */
                    315:     int ctl_width;             /* width of value names */
                    316:     union {
                    317:        setControl_s  sc;
                    318:        azControl_s   az;
                    319:     } ctl_union;
                    320: } control_s;
                    321: 
                    322: typedef union {
                    323:     struct {
                    324:        char *oaz_str;
                    325:        int   oaz_cur;          /* cursor position */
                    326:     } oaz;
                    327:     int   osc;
                    328: } option_u;
                    329: 
                    330: control_s  control[] = {
                    331:     {OT_SET   ,rowPort   ,colPort    ,wPort    ,{nPort    ,csPort    }},
                    332:     {OT_SET   ,rowBaud   ,colBaud    ,wBaud    ,{nBaud    ,csBaud    }},
                    333:     {OT_SET   ,rowData   ,colData    ,wData    ,{nData    ,csData    }},
                    334:     {OT_SET   ,rowStop   ,colStop    ,wStop    ,{nStop    ,csStop    }},
                    335:     {OT_SET   ,rowParity  ,colParity  ,wParity  ,{nParity  ,csParity  }},
                    336:     {OT_SET   ,rowConnect ,colConnect ,wConnect ,{nConnect ,csConnect }},
                    337:     {OT_SET   ,rowDial    ,colDial    ,wDial    ,{nDial    ,csDial    }},
                    338:     {OT_SET   ,rowTone    ,colTone    ,wTone    ,{nTone    ,csTone    }},
                    339:     {OT_SET   ,rowCarrier ,colCarrier ,wCarrier ,{nCarrier ,csCarrier }},
                    340:     {OT_ASCIIZ,rowPhone   ,colPhone   ,wPhone   ,{sPhone             }},
                    341:     {OT_ASCIIZ,rowFile   ,colFile    ,wFile    ,{sFile               }}
                    342: };
                    343: 
                    344: option_u option[] = {          /* Current option settings */
                    345:        {0},                    /* port        */    
                    346:        {0},                    /* baud        */    
                    347:        {0},                    /* data bits   */    
                    348:        {0},                    /* stop bits   */    
                    349:        {0},                    /* parity      */    
                    350:        {0},                    /* connect     */    
                    351:        {0},                    /* dial type   */    
                    352:        {0},                    /* wait tone   */    
                    353:        {0},                    /* wait carrier*/    
                    354:        {strPhone,0},           /* phone       */    
                    355:        {strFile ,0}            /* file        */    
                    356: };
                    357: #define nOption    (sizeof(option)/sizeof(option_u))
                    358: 
                    359: static char    AttrPanel  = COLOR_PANEL,
                    360:                AttrOption = COLOR_OPTION,
                    361:                AttrCursor = COLOR_CURSOR;
                    362: static int     N_of_Cols,              /* number of columns on screen */
                    363:                N_of_Rows;              /* number of rows on screen */
                    364: 
                    365: 
                    366: 
                    367: 
                    368: /***   get_options - get COM port settings and modem settings
                    369:  *
                    370:  *     This routine determines the type of display and sets the display
                    371:  *     attributes appropriately. If a filename was specified in the command
                    372:  *     line, it opens the file and displays the COM port and the MODEM options
                    373:  *     from the file. These options may be modified but the modifications will
                    374:  *     not be written out to the file. If the file open failed, or, if no file
                    375:  *     was specified in the command line, this routine wil display the default
                    376:  *     options on the screen. The user may modify the options and it will be
                    377:  *     writen out to the file specified in the options screen.
                    378:  *
                    379:  *     get_options(argc,argv)
                    380:  *
                    381:  *     ENTRY
                    382:  *             argc - number of command line arguments
                    383:  *             argv - pointer to an array of pointers (to command line args)
                    384:  *
                    385:  *     EXIT
                    386:  *
                    387:  *     WARNING
                    388:  *
                    389:  *     EFFECTS
                    390:  *
                    391:  ***/
                    392: 
                    393: void get_options(argc, argv)
                    394: int    argc;
                    395: char   *argv[];
                    396: {
                    397:        FILE            *fp;
                    398:        char            OptionsSet = FALSE; /* indicate if options are set  */
                    399:        unsigned        RetCode;
                    400:        static struct ConfigData DispConfigData = {sizeof(DispConfigData),};
                    401: 
                    402:        /* if the display is monochrome, change the attributes */
                    403:        if ((RetCode = VIOGETCONFIG(RESERVED,&DispConfigData,RESERVED)) != 0)
                    404:          error(ERR_VIOGETCONFIG, RetCode);
                    405:        if ((DispConfigData.adapter_type == MONOCHROME) || 
                    406:            (DispConfigData.display_type == MONOCHROME)) {
                    407:          AttrPanel  = MONO_PANEL;
                    408:          AttrOption = MONO_OPTION;
                    409:          AttrCursor = MONO_CURSOR;
                    410:        }
                    411: 
                    412: 
                    413:        if (argc > 1) {         /* get com/modem settings from the file */
                    414:          if ((fp = fopen(argv[1], "r")) != NULL) {
                    415: 
                    416:            /* clear the phone-number and file-name string buffers */
                    417:            strnset(strPhone, ' ', wPhone+1);
                    418:            strnset(strFile, ' ', sFile+1);
                    419: 
                    420:            /* read the option settings from the file */
                    421:            fscanf(fp, "%d %d %d %d %d %d %d %d %d \n",
                    422:                    &option[PORT_NAME].osc, &option[BAUD_RATE].osc, 
                    423:                   &option[DATA_BITS].osc, &option[STOP_BITS].osc, 
                    424:                   &option[PARITY].osc, &option[CONNECT].osc, 
                    425:                   &option[DIAL_TYPE].osc, &option[WAIT_TONE].osc, 
                    426:                   &option[WAIT_CARRIER].osc);
                    427:            fscanf(fp, "%21s \n", option[PHONE_NUMBER].oaz.oaz_str);
                    428:            fscanf(fp, "%41s \n", option[SETUP_FILE].oaz.oaz_str);
                    429:            printf("file name = %s \n", option[SETUP_FILE].oaz.oaz_str);
                    430:            option[PHONE_NUMBER].oaz.oaz_cur = 0;  /* init cursor position */
                    431:            option[SETUP_FILE].oaz.oaz_cur = 0;    /* init cursor position */
                    432: 
                    433:            /* show the options on the screen */
                    434:            screen_init();              /* init the physical screen */
                    435:            option_init();
                    436:            show_option();
                    437: 
                    438:            OptionsSet = TRUE;
                    439:            fclose(fp);
                    440:          }
                    441:        }
                    442: 
                    443:        if (!OptionsSet) {              /* get options from the user */
                    444:          screen_init();                        /* init the physical screen */
                    445:          option_init();
                    446:          show_option();
                    447:          /* write option settings to the file specified. */
                    448:          if ((fp = fopen(option[SETUP_FILE].oaz.oaz_str, "w")) != NULL) {
                    449:            DOSHOLDSIGNAL(DISABLE_SIGNALS);
                    450:            fprintf(fp, "%d %d %d %d %d %d %d %d %d \n",
                    451:                     option[PORT_NAME].osc, option[BAUD_RATE].osc, 
                    452:                    option[DATA_BITS].osc, option[STOP_BITS].osc, 
                    453:                    option[PARITY].osc, option[CONNECT].osc, 
                    454:                    option[DIAL_TYPE].osc, option[WAIT_TONE].osc, 
                    455:                    option[WAIT_CARRIER].osc);
                    456:            fprintf(fp, "%21s \n", option[PHONE_NUMBER].oaz.oaz_str);
                    457:            fprintf(fp, "%41s \n", option[SETUP_FILE].oaz.oaz_str);
                    458:            fclose(fp);
                    459:            DOSHOLDSIGNAL(ENABLE_SIGNALS);}
                    460:         } 
                    461: }
                    462: 
                    463: 
                    464: 
                    465: 
                    466: /***   get_com_options - get Com port options
                    467:  *
                    468:  *     This routine copies the current com port options into a structure
                    469:  *     provided by the caller. 
                    470:  *
                    471:  *     get_com_options(psComOptions)
                    472:  *
                    473:  *     ENTRY
                    474:  *             psComOptions = ptr to structure of com port options
                    475:  *
                    476:  *     EXIT
                    477:  *             the structure pointed by psComOptions is filled with com 
                    478:  *             port options
                    479:  *
                    480:  *     WARNING
                    481:  *
                    482:  *     EFFECTS
                    483:  *
                    484:  */
                    485: 
                    486: void get_com_options(psComOptions)
                    487: structComOptions *psComOptions;                /* ptr to struct of com port options */
                    488: {
                    489:        psComOptions->pPortName  = csPort[(option[PORT_NAME].osc)];
                    490:        psComOptions->iBaudRate  = intBaud[(option[BAUD_RATE].osc)];
                    491:        psComOptions->chDataBits = chData[(option[DATA_BITS].osc)];
                    492:         psComOptions->chStopBits = chStop[(option[STOP_BITS].osc)];
                    493:        psComOptions->chParity   = chParity[(option[PARITY].osc)];
                    494: }
                    495: 
                    496: 
                    497: 
                    498: 
                    499: /***   get_modem_options - get modem options 
                    500:  *
                    501:  *     This routine copies the current modem options into a structure
                    502:  *     provided by the caller. 
                    503:  *
                    504:  *     get_modem_options(psModemOptions)
                    505:  *
                    506:  *     ENTRY
                    507:  *             psModemOptions = ptr to structure of modem options
                    508:  *
                    509:  *     EXIT
                    510:  *             the structure pointed by psModemOptions is filled with 
                    511:  *             modem options
                    512:  *
                    513:  *     WARNING
                    514:  *
                    515:  *     EFFECTS
                    516:  *
                    517:  */
                    518: 
                    519: void get_modem_options(psModemOptions)
                    520: structModemOptions *psModemOptions;    /* ptr to struct of modem options */
                    521: {
                    522:        psModemOptions->chDialType   = chDial[(option[DIAL_TYPE].osc)];
                    523:        psModemOptions->iWaitTone    = iTone[(option[WAIT_TONE].osc)];
                    524:        psModemOptions->iWaitCarrier = iCarrier[(option[WAIT_CARRIER].osc)];
                    525:        psModemOptions->pPhoneNumber = option[PHONE_NUMBER].oaz.oaz_str;
                    526: }
                    527: 
                    528: 
                    529: 
                    530: 
                    531: /***   modem - determines if modem connection was requested
                    532:  *
                    533:  *     modem()
                    534:  *
                    535:  *     ENTRY
                    536:  *
                    537:  *     EXIT
                    538:  *             modem = TRUE if modem connection was requested
                    539:  *                     FALSE otherwise
                    540:  *
                    541:  *     WARNING
                    542:  *
                    543:  *     EFFECTS
                    544:  *
                    545:  ***/
                    546: 
                    547: modem()
                    548: {
                    549:        return (chConnect[(option[CONNECT].osc)] == MODEM);
                    550: }
                    551: 
                    552: 
                    553: 
                    554: 
                    555: /***   clear_screen - blank out the entire screen
                    556:  *
                    557:  *     clear_screen()
                    558:  *
                    559:  *     ENTRY
                    560:  *
                    561:  *     EXIT
                    562:  *
                    563:  *     WARNING
                    564:  *
                    565:  *     EFFECTS
                    566:  *
                    567:  ***/
                    568: 
                    569: clear_screen()
                    570: {
                    571:     Cell               c;
                    572:     int                        RetCode;
                    573: 
                    574:     c.ch = ' ';
                    575:     c.at = ATTR(WHITE,BLACK);
                    576:     if ((RetCode = VIOWRTNCELL((char *)(&c), N_of_Rows*N_of_Cols, 
                    577:                                0, 0, RESERVED)) != 0)
                    578:       error(ERR_VIOWRTNCELL, RetCode);
                    579: }   /* clear_screen */
                    580: 
                    581: 
                    582: 
                    583: 
                    584: /***   option_init - initialize option screen 
                    585:  *
                    586:  *     option_init()
                    587:  *
                    588:  *     ENTRY
                    589:  *
                    590:  *     EXIT
                    591:  *
                    592:  *     WARNING
                    593:  *
                    594:  *     EFFECTS
                    595:  *
                    596:  ***/
                    597: 
                    598: option_init()
                    599: {
                    600:        int             i;
                    601: 
                    602:        O_ROW = (N_of_Rows - O_HEIGHT)/2;
                    603:        O_COL = (N_of_Cols - O_WIDTH)/2;
                    604:        for (i=0; i<nOption; i++) {   /* adjust to real screen coordinates */
                    605:           control[i].ctl_row += O_ROW;
                    606:           control[i].ctl_col += O_COL;
                    607:        }
                    608:        init_cmap();
                    609: }      /* option_init */
                    610: 
                    611: 
                    612: 
                    613: 
                    614: /***   init_cmap - initialise valid character set
                    615:  *
                    616:  *     init_cmap()
                    617:  *
                    618:  *     ENTRY
                    619:  *
                    620:  *     EXIT
                    621:  *
                    622:  *     WARNING
                    623:  *
                    624:  *     EFFECTS
                    625:  *
                    626:  ***/
                    627: 
                    628: init_cmap()
                    629: {
                    630:        register int    i;
                    631: 
                    632:        for (i=0; i<256; i++)
                    633:           cMap[i] = 0;
                    634:        for (i='a'; i<='z'; i++)
                    635:           cMap[i] |= Z_ALPHA;
                    636:        for (i='A'; i<='Z'; i++)
                    637:           cMap[i] |= Z_ALPHA;
                    638:        for (i='0'; i<='9'; i++)
                    639:           cMap[i] |= Z_DIGIT;
                    640:        cMap[':']  |= Z_PATH;
                    641:        cMap['\\'] |= Z_PATH;
                    642:        cMap['/']  |= Z_PATH;
                    643:        cMap['.']  |= Z_PATH;
                    644:        cMap['-']  |= Z_PATH;
                    645:        cMap[' ']  |= Z_WHITE;
                    646:        cMap['\t'] |= Z_WHITE;
                    647:        cMap['-']  |= Z_PHONE;
                    648:        cMap[',']  |= Z_PHONE;
                    649: }      /* init_cmap */
                    650: 
                    651: 
                    652: 
                    653: 
                    654: /***   show_option - display option screen and record user modifications
                    655:  *
                    656:  *     show_option()
                    657:  *
                    658:  *     ENTRY
                    659:  *
                    660:  *     EXIT
                    661:  *
                    662:  *     WARNING
                    663:  *
                    664:  *     EFFECTS
                    665:  *
                    666:  ***/
                    667: 
                    668: show_option()
                    669: {
                    670:        int             RetCode;
                    671: 
                    672:        do_option();
                    673:        clear_screen();
                    674:        if ((RetCode = VIOSETCURPOS(0, 0, RESERVED)) != 0)
                    675:           error(ERR_VIOSETCURPOS, RetCode);
                    676: }      /* show_option */
                    677: 
                    678: 
                    679: 
                    680: 
                    681: /***   do_option - show and update option screen
                    682:  *
                    683:  *     do_option()
                    684:  *
                    685:  *     ENTRY
                    686:  *
                    687:  *     EXIT
                    688:  *
                    689:  *     WARNING
                    690:  *
                    691:  *     EFFECTS
                    692:  *
                    693:  ***/
                    694: 
                    695: do_option()
                    696: {
                    697:        unsigned        row, col;
                    698:        char            a;
                    699:        int             RetCode,
                    700:                        i,
                    701:                        key,
                    702:                        iOpt,lastOpt;
                    703: 
                    704:        a = AttrPanel;
                    705:        for (row=0; row<O_HEIGHT; row++)            /* display option panel */
                    706:           if ((RetCode = VIOWRTCHARSTRATT(optScreen[row],O_WIDTH,row+O_ROW,
                    707:                                          O_COL, &a, RESERVED)) != 0)
                    708:             error(ERR_VIOWRTCHARSTRATT, RetCode);
                    709:        for (i=0; i<nOption; i++)          /* Fill in options */
                    710:          show_opt(i, AttrOption);
                    711: 
                    712:        key = 0;
                    713:        iOpt = 0;       /* Start with first option */
                    714:        lastOpt = iOpt;
                    715:        while (key != ENTER_KEY) {
                    716:          if (iOpt != lastOpt)      /* user moved to different field */
                    717:            show_opt(lastOpt, AttrOption); /* revert to normal color */
                    718:          show_opt(iOpt, AttrCursor);   /* highlight current field */
                    719:          lastOpt = iOpt;
                    720:          key = get_key();
                    721:          switch (key) {
                    722:            case UP_KEY:
                    723:                        if (--iOpt < 0)
                    724:                          iOpt = nOption - 1;
                    725:                        break;
                    726:            case DOWN_KEY:
                    727:                        if (++iOpt > (nOption - 1))
                    728:                          iOpt = 0;
                    729:                        break;
                    730:            case RIGHT_KEY:
                    731:                        mod_option(iOpt,  1);
                    732:                        break;
                    733:            case LEFT_KEY:
                    734:                        mod_option(iOpt, -1);
                    735:                        break;
                    736:            case DEL_KEY:
                    737:                        if (control[iOpt].ctl_type == OT_ASCIIZ)
                    738:                          do_right_del(iOpt);
                    739:                        break;
                    740:            case HOME_KEY:
                    741:                        if (control[iOpt].ctl_type == OT_ASCIIZ)
                    742:                          option[iOpt].oaz.oaz_cur = 0;
                    743:                        break;
                    744:            case BKSP_KEY:
                    745:                        if (control[iOpt].ctl_type == OT_ASCIIZ)
                    746:                          do_left_del(iOpt);
                    747:                        break;
                    748:            default:
                    749:                        switch (control[iOpt].ctl_type) {
                    750:                          case OT_SET:    /* Ignore other key strokes */
                    751:                                        break;
                    752:                          case OT_ASCIIZ:
                    753:                                        do_insert(iOpt,key);
                    754:                                        break;
                    755:                          default:
                    756:                                        error(ERR_DO_OPT_INVOPT, NO_RETCODE);
                    757:                        }
                    758:                        break;
                    759:          }     /* switch */
                    760:        }       /* while */
                    761: }      /* do_option */
                    762: 
                    763: 
                    764: 
                    765: 
                    766: /***   do_insert - insert character in a string
                    767:  *
                    768:  *     do_insert(iOpt,key)
                    769:  *
                    770:  *     ENTRY
                    771:  *             iOpt = which option (setup File or Phone Number)
                    772:  *             key  = character to insert
                    773:  *
                    774:  *     EXIT
                    775:  *             char inserted into string (setup File name or Phone Number)
                    776:  *
                    777:  *     WARNING
                    778:  *
                    779:  *     EFFECTS
                    780:  *
                    781:  ***/
                    782: 
                    783: do_insert(iOpt,key)
                    784: int     iOpt;
                    785: unsigned key;
                    786: {
                    787:        int     ch;
                    788:        int     cur;
                    789:        int     i,n;
                    790:        int     width;
                    791:        char    *s,*d,*p;
                    792: 
                    793:        ch = key >> 8;
                    794:        if (ch > 0x7F)  /* Ignore */
                    795:          return;
                    796:        if ((cMap[ch] & control[iOpt].ctl_union.az.az_Set) == 0)
                    797:          return;       /* Not valid char */
                    798: 
                    799:        /*      oaz_cur - points to insertion point
                    800:                We throw away characters at end of string.
                    801: 
                    802:                before: aaaaaaabbbbbbbbbbbbc
                    803:                               ^
                    804:                after:  aaaaaaaxbbbbbbbbbbbb
                    805:                                ^
                    806:        */
                    807:        cur = option[iOpt].oaz.oaz_cur;
                    808:        width = control[iOpt].ctl_width;
                    809:        p = option[iOpt].oaz.oaz_str;
                    810: 
                    811:        d = p+width-1;          /* End of string */
                    812:        s = d-1;                /* End of string - 1 */
                    813:        n = (width-cur)-1;      /* Number of chars to shift */
                    814:        for (i=n; i>0; i--)
                    815:          *d-- = *s--;          /* Shift string */
                    816:        p[cur] = ch;            /* Insert character */
                    817:        cur++;                  /* Advance insertion point */
                    818:        if (cur > (width-1))    /* cursor wrapped */
                    819:          cur = 0;
                    820:        option[iOpt].oaz.oaz_cur = cur;
                    821: }
                    822: 
                    823: 
                    824: 
                    825: 
                    826: /***   do_left_del - delete a character which is to the left of the cursor
                    827:  *
                    828:  *     do_left_del(iOpt)
                    829:  *
                    830:  *     ENTRY
                    831:  *             iOpt = which option (setup File or Phone Number)
                    832:  *
                    833:  *     EXIT
                    834:  *             char deleted from string (setup File name or Phone Number)
                    835:  *
                    836:  *     WARNING
                    837:  *
                    838:  *     EFFECTS
                    839:  *
                    840:  ***/
                    841: 
                    842: do_left_del(iOpt)
                    843: int    iOpt;
                    844: {
                    845:        if (option[iOpt].oaz.oaz_cur == 0)      /* Ignore at start of field */
                    846:          return;
                    847:        /*
                    848:                We delete the character to the left of the cursor and shift
                    849:                rest of characters left 1.  Ignore at beginning of field.
                    850: 
                    851:                before: aaaaaaaxbbbbbbbbbbbb
                    852:                                ^
                    853:                after:  aaaaaaabbbbbbbbbbbb
                    854:                               ^
                    855:        */
                    856:        do_del(iOpt,0,-1);
                    857: }
                    858: 
                    859: 
                    860: 
                    861: 
                    862: /***   do_right_del - delete a character which is at the cursor
                    863:  *
                    864:  *     do_right_del(iOpt)
                    865:  *
                    866:  *     ENTRY
                    867:  *             iOpt = which option (setup File or Phone Number)
                    868:  *
                    869:  *     EXIT
                    870:  *             char deleted from string (setup File name or Phone Number)
                    871:  *
                    872:  *     WARNING
                    873:  *
                    874:  *     EFFECTS
                    875:  *
                    876:  ***/
                    877: 
                    878: do_right_del(iOpt)
                    879: int    iOpt;
                    880: {
                    881:        /*
                    882:                We delete the character at the cursor and shift
                    883:                rest of characters left 1.
                    884: 
                    885:                before: aaaaaaaxbbbbbbbbbbbb
                    886:                               ^
                    887:                after:  aaaaaaabbbbbbbbbbbb
                    888:                               ^
                    889:        */
                    890:        do_del(iOpt,1,0);
                    891: }
                    892: 
                    893: 
                    894: 
                    895: 
                    896: /***   do_del - delete a character
                    897:  *
                    898:  *     do_del(iOpt,iShift,iCur)
                    899:  *
                    900:  *     ENTRY
                    901:  *             iOpt = which option (setup File or Phone Number)
                    902:  *             iShift = amount by which string should be shifted
                    903:  *             iCur = amount by which cursor should be moved
                    904:  *     EXIT
                    905:  *             char deleted from string (setup File name or Phone Number)
                    906:  *             cursor position within the string updated
                    907:  *
                    908:  *     WARNING
                    909:  *
                    910:  *     EFFECTS
                    911:  *
                    912:  ***/
                    913: 
                    914: do_del(iOpt,iShift,iCur)
                    915: int    iOpt,
                    916:         iShift,
                    917:         iCur;
                    918: {
                    919:        int     cur,width,i,n;
                    920:        char    *s,*d,*p;
                    921: 
                    922:        cur = option[iOpt].oaz.oaz_cur;
                    923:        width = control[iOpt].ctl_width;
                    924:        p = option[iOpt].oaz.oaz_str;
                    925: 
                    926:        s = p+cur+iShift;
                    927:        d = s-1;
                    928:        n = (width-(cur+iCur))-1;       /* Number of chars to shift */
                    929:        for (i=n; i>0; i--)
                    930:          *d++ = *s++;                  /* Shift string */
                    931:        cur += iCur;                    /* Adjust cursor */
                    932:        p[width-1] = ' ';               /* Put blank at end */
                    933:        option[iOpt].oaz.oaz_cur = cur;
                    934: }
                    935: 
                    936: 
                    937: 
                    938: 
                    939: /***   mod_option - modify option
                    940:  *
                    941:  *     mod_option(iOpt, inc)
                    942:  *
                    943:  *     ENTRY
                    944:  *             iOpt = which option (Port, Baud Rate, ..., setup File)
                    945:  *             inc  =  1 ( -> key was pressed)
                    946:  *                    -1 ( <- key was pressed)
                    947:  *
                    948:  *     EXIT
                    949:  *             option array entry 'osc' updated for all iOpt except for 
                    950:  *             setupFile and PhoneNumber. In the case of setupFile and 
                    951:  *             PhoneNumber, the cursor position is updated (cursor moved 
                    952:  *             left if '<-' key was pressed; cursor moved right if '->' 
                    953:  *             key was pressed)
                    954:  *
                    955:  *     WARNING
                    956:  *
                    957:  *     EFFECTS
                    958:  *
                    959:  ***/
                    960: 
                    961: mod_option(iOpt, inc)
                    962: int    iOpt,
                    963:        inc;
                    964: {
                    965:        int     col;
                    966:        int     width;
                    967: 
                    968:     switch (control[iOpt].ctl_type) {
                    969:        case OT_SET:    /* Ignore other key strokes */
                    970:            if (inc > 0) {  /* Increment value */
                    971:                if (++option[iOpt].osc > (control[iOpt].ctl_union.sc.sc_n - 1))
                    972:                    option[iOpt].osc = 0;
                    973:            }
                    974:            else            /* Decrement value */
                    975:                if (--option[iOpt].osc < 0 )
                    976:                    option[iOpt].osc = control[iOpt].ctl_union.sc.sc_n - 1;
                    977:            break;
                    978:        case OT_ASCIIZ:
                    979:            col = option[iOpt].oaz.oaz_cur;
                    980:            width = control[iOpt].ctl_width;
                    981:            if (inc > 0) {  /* move cursor right */
                    982:                if (++col > (width-1))
                    983:                    col = 0;
                    984:            }
                    985:            else            /* move cursor left */
                    986:                if (--col < 0 )
                    987:                    col = (width-1);
                    988:            option[iOpt].oaz.oaz_cur = col;
                    989:            break;
                    990:        default:
                    991:            error(ERR_MOD_OPT_INVOPT, NO_RETCODE);
                    992:     }
                    993: }
                    994: 
                    995: 
                    996: 
                    997: 
                    998: /***   show_opt - show option
                    999:  *
                   1000:  *     show_opt(iOpt, color)
                   1001:  *
                   1002:  *     ENTRY
                   1003:  *             iOpt = which option (Port, Baud Rate, . . ., Phone Number)
                   1004:  *             color = color in which the option is to be displayed
                   1005:  *
                   1006:  *     EXIT
                   1007:  *             option indicated by iOpt is displayed on the screen
                   1008:  *
                   1009:  *     WARNING
                   1010:  *
                   1011:  *     EFFECTS
                   1012:  *
                   1013:  ***/
                   1014: 
                   1015: show_opt(iOpt, color)
                   1016: int    iOpt;
                   1017: char   color;
                   1018: {
                   1019:        int             row,col,width;
                   1020:        int             curCol;
                   1021:        char            *name;
                   1022:        unsigned        RetCode;
                   1023: 
                   1024:        row = control[iOpt].ctl_row;
                   1025:        col = control[iOpt].ctl_col;
                   1026:        width = control[iOpt].ctl_width;
                   1027:        switch (control[iOpt].ctl_type) {
                   1028:          case OT_SET:
                   1029:            name = control[iOpt].ctl_union.sc.sc_name[option[iOpt].osc];
                   1030:            curCol = col+width-1;
                   1031:            break;
                   1032:          case OT_ASCIIZ:
                   1033:            name = option[iOpt].oaz.oaz_str;
                   1034:            curCol = col+option[iOpt].oaz.oaz_cur;
                   1035:            break;
                   1036:          default:
                   1037:            error(ERR_SHOW_OPT_INVOPT, NO_RETCODE);
                   1038:        };
                   1039:        if ((RetCode = VIOWRTCHARSTRATT(name, width, row, col, 
                   1040:                                         &color, RESERVED)) != 0)
                   1041:           error(ERR_VIOWRTCHARSTRATT, RetCode);
                   1042:        if ((RetCode = VIOSETCURPOS(row, curCol, RESERVED)) != 0)
                   1043:           error(ERR_VIOSETCURPOS, RetCode);
                   1044: }
                   1045: 
                   1046: 
                   1047: 
                   1048: 
                   1049: /***   get_key - return two-byte key stroke; includes IBM extended ASCII codes
                   1050:  *
                   1051:  *     get_key()
                   1052:  *
                   1053:  *     ENTRY
                   1054:  *
                   1055:  *     EXIT
                   1056:  *
                   1057:  *     WARNING
                   1058:  *
                   1059:  *     EFFECTS
                   1060:  *
                   1061:  ***/
                   1062: 
                   1063: get_key()
                   1064: {
                   1065:     char       c;
                   1066:     unsigned   key;
                   1067: 
                   1068:     if (c = getch())               /* Get character */
                   1069:       key = c << 8;                /* Make scan code zero */
                   1070:     else
                   1071:       key = getch();               /* Get scan code */
                   1072:     return(key);
                   1073: }   /* get_key */
                   1074: 
                   1075: 
                   1076: 
                   1077: 
                   1078: /***   screen_init - Initialize the screen
                   1079:  *
                   1080:  *     screen_init()
                   1081:  *
                   1082:  *     ENTRY
                   1083:  *
                   1084:  *     EXIT
                   1085:  *
                   1086:  *     WARNING
                   1087:  *
                   1088:  *     EFFECTS
                   1089:  *
                   1090:  ***/
                   1091: 
                   1092: screen_init()
                   1093: {
                   1094:        struct ModeData TheModeData;    /* Mode data from VioGetMode */
                   1095:        int             RetCode;
                   1096: 
                   1097:        if ((RetCode = VIOGETMODE(&TheModeData, RESERVED)) != 0)
                   1098:           error(ERR_VIOGETMODE, RetCode);
                   1099:        N_of_Cols = TheModeData.col;
                   1100:        N_of_Rows = TheModeData.row;
                   1101:        clear_screen();
                   1102: }      /* screen_init */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.