Annotation of os2sdk/demos/apps/sse/dispatch.c, revision 1.1.1.1

1.1       root        1: /*** dispatch() - accepts keyboard input and dispatches control to
                      2:  *               the appropriate function.
                      3:  *
                      4:  *   Wait in a loop for keyboard input, then dispatch to any of several
                      5:  *   functions based on what the character code was. Default is insert()
                      6:  *   after validating, otherwise it is one of our control keys. There is
                      7:  *   a second dispatch function for special keys - those with zero for a
                      8:  *   character value. special_dispatch() works based on the scan code.
                      9:  *
                     10:  *   EFFECTS:  No global variables are directly effected by this function
                     11:  */
                     12: 
                     13: 
                     14: #include <ctype.h>
                     15: #include <dos.h>
                     16: #include <doscalls.h>
                     17: #include <subcalls.h>
                     18: #include "ssedefs.h"
                     19: #include "keydefs.h"
                     20: 
                     21: 
                     22: void dispatch()
                     23:        {
                     24: 
                     25:        struct  KeyData keydata;          /* data structure from subcalls.h */
                     26:        struct  KbdStatus kbdstatus;      /* data structure from subcalls.h */
                     27: 
                     28:        kbdstatus.length = sizeof( kbdstatus );
                     29:        KBDGETSTATUS( &kbdstatus, 0 );                 /* set keyboard mode */
                     30:        kbdstatus.bit_mask |= 4;
                     31:        KBDSETSTATUS( &kbdstatus, 0 );
                     32: 
                     33: 
                     34:     /* the following section waits for keyboard input    */
                     35:     /* then examines the key received and dispatches us  */
                     36:     /* to the appropriate function for the key pressed.  */
                     37: 
                     38: 
                     39:        while(1) {
                     40: 
                     41: 
                     42:                KBDCHARIN( &keydata, 0, 0 );   /* get a character from KBD */
                     43: 
                     44: 
                     45:                switch( keydata.char_code ) {
                     46: 
                     47:                    default:                                 /* default is not */
                     48:                        if ( isprint( keydata.char_code ) )  /* a control key. */
                     49:                              insert( keydata.char_code );   /* check validity */
                     50:                        else  badkey();                      /* and if good,   */
                     51:                        break;                               /* call insert()  */
                     52: 
                     53:         /* "special keys", those with character codes of 00, must */
                     54:         /*  be sent to another dispatcher that checks scan codes. */
                     55: 
                     56:                    case SPECIAL_KEYS_CHAR:
                     57:                        special_dispatch( keydata.scan_code,
                     58:                                          keydata.shift_state );
                     59:                        break;
                     60: 
                     61:         /* all others keys we can dispatch from here. some */
                     62:         /* are easy, just dispatch based on char code...   */
                     63: 
                     64:                    case CTRL_B_CHAR:
                     65:                        ctrl_b();
                     66:                        break;
                     67: 
                     68:                    case BKSP_CHAR:
                     69:                        bksp();
                     70:                        break;
                     71: 
                     72:                    case TAB_CHAR:
                     73:                        tab();
                     74:                        break;
                     75: 
                     76:                    case CRETURN_CHAR:
                     77:                        creturn();
                     78:                        break;
                     79: 
                     80:                    case CTRL_N_CHAR:
                     81:                        ctrl_n();
                     82:                        break;
                     83: 
                     84:                    case CTRL_Y_CHAR:
                     85:                        ctrl_y();
                     86:                        break;
                     87: 
                     88: 
                     89:         /*  ...for others, we must check the scan code and shift */
                     90:         /* also as the char code may be shared with another key. */
                     91: 
                     92:                    case SHIFT_END_CHAR:
                     93:                        if ( keydata.scan_code == END_SCAN  &&
                     94:                             keydata.shift_state < 3 )
                     95:                            shift_end();
                     96:                        else insert( keydata.char_code );
                     97:                        break;
                     98: 
                     99:                    case SHIFT_DOWN_CHAR:
                    100:                        if ( keydata.scan_code == DOWN_SCAN  &&
                    101:                            keydata.shift_state < 3 )
                    102:                            shift_down();
                    103:                        else insert( keydata.char_code );
                    104:                        break;
                    105: 
                    106:                    case SHIFT_LEFT_CHAR:
                    107:                        if ( keydata.scan_code == LEFT_SCAN  &&
                    108:                            keydata.shift_state < 3 )
                    109:                            shift_left();
                    110:                        else insert( keydata.char_code );
                    111:                        break;
                    112: 
                    113:                    case SHIFT_RIGHT_CHAR:
                    114:                        if ( keydata.scan_code == RIGHT_SCAN  &&
                    115:                            keydata.shift_state < 3 )
                    116:                            shift_right();
                    117:                        else insert( keydata.char_code );
                    118:                        break;
                    119: 
                    120:                    case SHIFT_HOME_CHAR:
                    121:                        if ( keydata.scan_code == HOME_SCAN  &&
                    122:                            keydata.shift_state < 3 )
                    123:                            shift_home();
                    124:                       else insert( keydata.char_code );
                    125:                        break;
                    126: 
                    127:                    case SHIFT_UP_CHAR:
                    128:                        if ( keydata.scan_code == UP_SCAN  &&
                    129:                            keydata.shift_state < 3 )
                    130:                            shift_up();
                    131:                        else insert( keydata.char_code );
                    132:                        break;
                    133: 
                    134:         /*  There's one other possibility, that the char code is 0xE0 */
                    135:         /*  which indicates an arrow key on the new AT03 keyboard.    */
                    136:         /*  We will treat these in the same manner as special keys.   */
                    137: 
                    138:                  case ARROW_CHAR:
                    139:                        special_dispatch( keydata.scan_code,
                    140:                                          keydata.shift_state );
                    141:                        break;
                    142: 
                    143: 
                    144:                }
                    145: 
                    146:            }
                    147: 
                    148:        }
                    149: 
                    150: 
                    151: /*** special_dispatch(c,s) - dispatches control to the appropriate function
                    152:  *                          based on character and scan codes received
                    153:  *
                    154:  *   Characters with zero character codes or character code 0xE0 are sent
                    155:  *   here to be dispatched based on their scan code and shift status. These
                    156:  *   values are passed to special_dispatch as parameters.
                    157:  *
                    158:  *   The left and right arrow keys are handled in this routine rather than
                    159:  *   dispatched to their own functions in an attempt to gain some speed.
                    160:  *
                    161:  *   ENTRY:   scan  -   scan code of the key press
                    162:  *           shift -    shift state of the key press
                    163:  *
                    164:  *   EFFECTS:  No global variables are directly effected by this function
                    165:  *             unless the key is an unshifted right or left arrow.
                    166:  *             In that case, effects are:
                    167:  *
                    168:  *                     LinesMarked     -   this flag is cleared
                    169:  *                     MarkedLine[]    -   all cleared
                    170:  *                     CharsMarked     -   this flag is cleared
                    171:  *                     MarkedChar[]    -   all cleared
                    172:  *                     EditBuff[]      -   may be flushed if above were set
                    173:  *                     EditBuffDirty   -   cleared if EditBuff[] flushed
                    174:  *                     CurCol          -   incremented or decremented
                    175:  */
                    176: 
                    177: special_dispatch(scan,shift)      /* dispatcher for "special keys" based on */
                    178:                                   /* the scan code and shift code from KBD  */
                    179: 
                    180:     unsigned char scan;                     /* scan code - must be unsigned */
                    181:     unsigned shift;                                           /* shift code */
                    182: 
                    183:     {
                    184: 
                    185:     register short i;                                  /* indexing variable */
                    186: 
                    187:     switch( scan ) {                /* dispatch based on what scan code was */
                    188:                                    /*  - check the shift state if necessary */
                    189:        case LEFT_SCAN:
                    190:            if( shift == 0 ) {          /* left arrow handled here for speed */
                    191: 
                    192:                if ( LinesMarked || CharsMarked ) {
                    193:                    LinesMarked = 0;                    /* if there's marked */
                    194:                    CharsMarked = 0;                    /* text, clear it    */
                    195:                    for ( i = 0; i < MAXLINES; i++ )
                    196:                        MarkedLine[i] = 0;
                    197:                    for ( i = 0; i < LINESIZE; i++ )
                    198:                        MarkedChar[i] = 0;
                    199:                    if (EditBuffDirty) {     /* flush EditBuff before redraw */
                    200:                        EditBuffDirty = 0;
                    201:                        flushline((TopRow + CurRow), EditBuff);
                    202:                        }
                    203:                    drawscr(TopRow);                    /* redraw the screen */
                    204:                    }
                    205: 
                    206:                if ( CurCol > 0 ) {
                    207:                    CurCol -= 1;                      /* move cursor left 1  */
                    208:                    VIOSETCURPOS( CurRow, CurCol, 0 );    /* if there's room */
                    209:                    }
                    210: 
                    211:                }
                    212: 
                    213:            else
                    214:                shift_left();
                    215:            break;
                    216: 
                    217:        case RIGHT_SCAN:
                    218:            if( shift == 0 ) {         /* right arrow handled here for speed */
                    219: 
                    220:                if ( LinesMarked || CharsMarked ) {
                    221:                    LinesMarked = 0;                    /* if there's marked */
                    222:                    CharsMarked = 0;                    /* text, clear it    */
                    223:                    for ( i = 0; i < MAXLINES; i++ )
                    224:                        MarkedLine[i] = 0;
                    225:                    for ( i = 0; i < LINESIZE; i++ )
                    226:                        MarkedChar[i] = 0;
                    227:                    if (EditBuffDirty) {     /* flush EditBuff before redraw */
                    228:                        EditBuffDirty = 0;
                    229:                        flushline((TopRow + CurRow), EditBuff);
                    230:                        }
                    231:                    drawscr(TopRow);                    /* redraw the screen */
                    232:                    }
                    233: 
                    234:                if (CurCol < (LINESIZE -1)) {      /* move cursor right one  */
                    235:                    CurCol += 1;                   /* column if there's room */
                    236:                    VIOSETCURPOS( CurRow, CurCol, 0 );
                    237:                    }
                    238: 
                    239:                }
                    240: 
                    241:            else
                    242:                shift_right();
                    243:            break;
                    244: 
                    245:        case UP_SCAN:
                    246:            if( shift == 0 )
                    247:                up();
                    248:            else
                    249:                shift_up();
                    250:            break;
                    251: 
                    252:        case DOWN_SCAN:
                    253:            if( shift == 0 )
                    254:                down();
                    255:            else
                    256:                shift_down();
                    257:            break;
                    258: 
                    259:        case HOME_SCAN:
                    260:            if( shift == 0 )
                    261:                home();
                    262:            else
                    263:                shift_home();
                    264:            break;
                    265: 
                    266:        case END_SCAN:
                    267:            if( shift == 0 )
                    268:                end_();
                    269:            else
                    270:                shift_end();
                    271:            break;
                    272: 
                    273:        case PGUP_SCAN:
                    274:            pgup();
                    275:            break;
                    276: 
                    277:        case PGDN_SCAN:
                    278:            pgdn();
                    279:            break;
                    280: 
                    281:        case CTRL_HOME_SCAN:
                    282:            ctrl_home();
                    283:            break;
                    284: 
                    285:        case CTRL_END_SCAN:
                    286:            ctrl_end();
                    287:            break;
                    288: 
                    289:        case CTRL_PGUP_SCAN:
                    290:            ctrl_pgup();
                    291:            break;
                    292: 
                    293:        case CTRL_PGDN_SCAN:
                    294:            ctrl_pgdn();
                    295:            break;
                    296: 
                    297:        case DEL_SCAN:
                    298:            del();
                    299:            break;
                    300: 
                    301:        case F9_SCAN:
                    302:            F9();
                    303:            break;
                    304: 
                    305:        case F10_SCAN:
                    306:            F10();
                    307:            break;
                    308: 
                    309:        default:
                    310:            badkey();
                    311: 
                    312:        }
                    313: 
                    314:     }
                    315: 
                    316: 
                    317: /*** badkey() - sounds a beep when an invalid or inappropriate key is hit
                    318:  *
                    319:  *   EFFECTS:  None
                    320:  */
                    321: 
                    322: badkey()
                    323:     {
                    324:     DOSBEEP (500, 50);                  /*      frequency = 500 Hertz */
                    325:     }                                   /* duration = 50 milliseconds */
                    326: 
                    327: 
                    328: /*** clearscr() - clears the screen by writing blanks over entire screen
                    329:  *
                    330:  *   clearscr() writes blanks with normal attributes over the entire screen,
                    331:  *   effectively clearing it.
                    332:  *
                    333:  *   EFFECTS:  None
                    334:  */
                    335: 
                    336: void clearscr()
                    337:     {
                    338:        char buff[2];             /* local buffer for filling cell value */
                    339: 
                    340:        buff[0] = ' ';                   /* cell to replicate is a blank */
                    341:        buff[1] = BackNorm + ForeNorm;         /* with normal attributes */
                    342: 
                    343:        VIOSCROLLUP(0, 0, -1, -1, -1, (char far *)buff, 0);
                    344: 
                    345:                                      /* when the first 5 parameters are */
                    346:                                      /* set as above, the entire screen */
                    347:                                      /* is filled with the cell in buff */
                    348:     }
                    349: 
                    350: 
                    351: /*** drawscr(startline) - redraws the screen starting at the specified line
                    352:  *
                    353:  *   drawscr() redraws the screen starting at the line specified in the
                    354:  *   parameter it is passed, startline. The screen is drawn with normal
                    355:  *   attributes, since this call will never be made with lines marked.
                    356:  *   Nothing is done with EditBuff[], that is left to the caller, as is
                    357:  *   the value of TopRow.
                    358:  *
                    359:  *   ENTRY:  startline -  the line in the file which will be at the top of
                    360:  *                       the screen when redrawn.
                    361:  *
                    362:  *   EFFECTS:  ScrBuff[][] -  gets reloaded
                    363:  */
                    364: 
                    365: void drawscr(startline)
                    366: 
                    367:     unsigned short startline;
                    368:     {
                    369: 
                    370:     register unsigned short   i, j;                /* indexing variables */
                    371: 
                    372:     char normal = BackNorm + ForeNorm;              /* normal attributes */
                    373: 
                    374:     for ( i = startline, j = 0 ;  j < PageSize ; i++, j++)
                    375:        getline( i, &ScrBuff[j][0] );        /* load ScrBuff[][] with the */
                    376:                                            /* part of the screen we want */
                    377: 
                    378:     VIOWRTCHARSTRATT ( (char far *)ScrBuff, ( PageSize * LINESIZE ), 0, 0,
                    379:                      &normal, 0 );
                    380:                                            /* write it out to the screen */
                    381:     }
                    382: 
                    383: 
                    384: /*** drawline() - redraws the current line
                    385:  *
                    386:  *   drawline() redraws the line the cursor is currently on, using the
                    387:  *   contents of EditBuff[]. All marked characters will be drawn with the
                    388:  *   appropriate attributes. If the line is marked, all characters are
                    389:  *   drawn as marked; if the line is not marked, then the characters marked
                    390:  *   flag is checked. If characters are marked, the line is drawn in three
                    391:  *   sections - unmarked characters at the front of the line (may be 0),
                    392:  *   marked characters in the middle of the line (at least 1), and unmarked
                    393:  *   characters at the end of the line (may be 0). If no characters are marked
                    394:  *   either, then the line is drawn with all normal attributes.
                    395:  *
                    396:  *   EFFECTS:  None
                    397:  */
                    398: 
                    399: drawline()
                    400:     {
                    401:     unsigned short i;                               /* indexing variables */
                    402:     unsigned short j;
                    403: 
                    404:     char hilite = BackHilite + ForeHilite;       /* attributes for marked */
                    405:     char normal = BackNorm + ForeNorm;       /* attributes for not marked */
                    406: 
                    407:     if( MarkedLine[TopRow+CurRow] )
                    408:        VIOWRTCHARSTRATT( EditBuff, LINESIZE, CurRow, 0, &hilite, 0);
                    409:                                             /* if line is marked, do this */
                    410:     else if (CharsMarked) {
                    411:             for( i = 0; !MarkedChar[i] & (i < LINESIZE); i++ );
                    412:             for( j = i; MarkedChar[j] & (j < LINESIZE); j++ );
                    413:             VIOWRTCHARSTRATT( &EditBuff[0], i, CurRow, 0, &normal, 0);
                    414:             VIOWRTCHARSTRATT( &EditBuff[i], (j - i), CurRow, i, &hilite, 0);
                    415:             VIOWRTCHARSTRATT( &EditBuff[j], (LINESIZE - j), CurRow, j,
                    416:                               &normal, 0);
                    417:             }                       /* else if characters marked, do this */
                    418: 
                    419:         else VIOWRTCHARSTRATT( EditBuff, LINESIZE, CurRow, 0, &normal, 0);
                    420:     }                                  /* else if neither marked, do this */
                    421: 
                    422: 
                    423: /*** line25() - updates line number information on last line
                    424:  *
                    425:  *   line25() updates the line numbers maintained in the lower right hand
                    426:  *   corner of the screen - current line of cursor and total lines in file.
                    427:  *   These numbers are first converted from their zero-based internal values
                    428:  *   to a more friendly one-based number. Lots of standing on our heads is
                    429:  *   done to get the numbers into decimal characters without using C runtime
                    430:  *   routines or doing divisions.
                    431:  *
                    432:  *   Note that while the names of these routines refer to the 25th line,
                    433:  *   the pagesize is not hardcoded - if we are in 43 line mode, this
                    434:  *   information will appear on the 43rd line. However, the spacing within
                    435:  *   the line is hardcoded for an 80-column display.
                    436:  *
                    437:  *   EFFECTS - None
                    438:  */
                    439: 
                    440: void line25()
                    441:     {
                    442: 
                    443:     int  flag0 = 0;                /* flag to aid in supressing leading 0's */
                    444:     int  col = 67;                         /* starting column for this info */
                    445:     int  i, n;                                        /* indexing variables */
                    446:     char buff[LINESIZE];                   /* buffer to build output string */
                    447:     char attrib = Back25 + Fore25;          /* attributes for output string */
                    448: 
                    449:     n = (TopRow + CurRow + 1);         /* set n to line number cursor is on */
                    450: 
                    451:     for( i = 0; n > 9999; n -= 10000, i++ );
                    452:     if( i > 0 ) {
                    453:        flag0 = 1;                         /* 10,000's place of current line */
                    454:        buff[0] = i + 0x30;
                    455:        }
                    456:     else buff[0] = ' ';
                    457:     VIOWRTCHARSTRATT( buff, 1, PageSize, col, &attrib, 0 );
                    458:     col += 1;
                    459: 
                    460:     for( i = 0; n > 999; n -= 1000, i++ );
                    461:     if( i > 0 ) {
                    462:        flag0 = 1;                          /* 1,000's place of current line */
                    463:        buff[0] = i + 0x30;
                    464:        }
                    465:     else if( flag0 ) buff[0] = '0';
                    466:        else buff[0] = ' ';
                    467:     VIOWRTCHARSTRATT( buff, 1, PageSize, col, &attrib, 0 );
                    468:     col += 1;
                    469: 
                    470:     for( i = 0; n > 99; n -= 100, i++ );
                    471:     if( i > 0 ) {
                    472:        flag0 = 1;                            /* 100's place of current line */
                    473:        buff[0] = i + 0x30;
                    474:        }
                    475:     else if( flag0 ) buff[0] = '0';
                    476:        else buff[0] = ' ';
                    477:     VIOWRTCHARSTRATT( buff, 1, PageSize, col, &attrib, 0 );
                    478:     col += 1;
                    479: 
                    480:     for( i = 0; n > 9; n -= 10, i++ );
                    481:     if( i > 0 ) {
                    482:        flag0 = 1;                             /* 10's place of current line */
                    483:        buff[0] = i + 0x30;
                    484:        }
                    485:     else if( flag0 ) buff[0] = '0';
                    486:        else buff[0] = ' ';
                    487:     VIOWRTCHARSTRATT( buff, 1, PageSize, col, &attrib, 0 );
                    488:     col += 1;
                    489: 
                    490:     buff[0] = n + 0x30;                        /* 1's place of current line */
                    491:     VIOWRTCHARSTRATT( buff, 1, PageSize, col, &attrib, 0 );
                    492:     col += 1;
                    493: 
                    494:     buff[0] = ' ';
                    495:     buff[1] = '/';                                 /* delimiting characters */
                    496:     buff[2] = ' ';
                    497:     VIOWRTCHARSTRATT( buff, 3, PageSize, col, &attrib, 0 );
                    498:     col += 3;
                    499: 
                    500:     flag0 = 0;
                    501:     n = TotalLines;                             /* n is total lines in file */
                    502: 
                    503:     for( i = 0; n > 9999; n -= 10000, i++ );
                    504:     if( i > 0 ) {
                    505:        flag0 = 1;                          /* 10,000's place of total lines */
                    506:        buff[0] = i + 0x30;
                    507:        VIOWRTCHARSTRATT( buff, 1, PageSize, col, &attrib, 0 );
                    508:        col += 1;
                    509:        }
                    510: 
                    511:     for( i = 0; n > 999; n -= 1000, i++ );
                    512:     if( i > 0 ) {
                    513:        flag0 = 1;                           /* 1,000's place of total lines */
                    514:        buff[0] = i + 0x30;
                    515:        VIOWRTCHARSTRATT( buff, 1, PageSize, col, &attrib, 0 );
                    516:        col += 1;
                    517:        }
                    518:     else if( flag0 ) {
                    519:        buff[0] = '0';
                    520:        VIOWRTCHARSTRATT( buff, 1, PageSize, col, &attrib, 0 );
                    521:        col += 1;
                    522:        }
                    523: 
                    524:     for( i = 0; n > 99; n -= 100, i++ );
                    525:     if( i > 0 ) {
                    526:        flag0 = 1;                             /* 100's place of total lines */
                    527:        buff[0] = i + 0x30;
                    528:        VIOWRTCHARSTRATT( buff, 1, PageSize, col, &attrib, 0 );
                    529:        col += 1;
                    530:        }
                    531:     else if( flag0 ) {
                    532:        buff[0] = '0';
                    533:        VIOWRTCHARSTRATT( buff, 1, PageSize, col, &attrib, 0 );
                    534:        col += 1;
                    535:        }
                    536: 
                    537:     for( i = 0; n > 9; n -= 10, i++ );
                    538:     if( i > 0 ) {
                    539:        flag0 = 1;                              /* 10's place of total lines */
                    540:        buff[0] = i + 0x30;
                    541:        VIOWRTCHARSTRATT( buff, 1, PageSize, col, &attrib, 0 );
                    542:        col += 1;
                    543:        }
                    544:     else if( flag0 ) {
                    545:        buff[0] = '0';
                    546:        VIOWRTCHARSTRATT( buff, 1, PageSize, col, &attrib, 0 );
                    547:        col += 1;
                    548:        }
                    549: 
                    550:     buff[0] = n + 0x30;                         /* 1's place of total lines */
                    551:     VIOWRTCHARSTRATT( buff, 1, PageSize, col, &attrib, 0 );
                    552: 
                    553:     col +=1;
                    554:     n = LINESIZE - col;      /* fill rest of line with blanks; n is how many */
                    555:     for( i = 0; i < LINESIZE; buff[i] = ' ', i++ );
                    556:     VIOWRTCHARSTRATT( buff, n, PageSize, col, &attrib, 0 );
                    557: 
                    558:     }
                    559: 
                    560: /*** name25() - draws prompt and displays filename on 25th line
                    561:  *
                    562:  *   This routine draws a prompt line with usage information about some
                    563:  *   of the less obvious function keys, and the name of the file currently
                    564:  *   being edited. Will be called at the start of execution, and whenever
                    565:  *   an error message has been displayed on the 25th line so that we need
                    566:  *   to re-draw the usage message after the error is responded to. The
                    567:  *   line25() routine takes care of the line numbers at the far right end
                    568:  *   of the line.
                    569:  *
                    570:  *   Note that while the names of these routines refer to the 25th line,
                    571:  *   the pagesize is not hardcoded - if we are in 43 line mode, this
                    572:  *   information will appear on the 43rd line. Spacing within the line
                    573:  *   is hardcoded for an 80-column display.
                    574:  *
                    575:  *   EFFECTS - None
                    576:  */
                    577: 
                    578: void name25()
                    579:     {
                    580: 
                    581:     static char message[51] = "^N/^B=insert above/below ^Y=delete F9=save F10=quit";
                    582:     char  name[16];                            /* for holding name of file */
                    583:     char  attrib = Back25 + Fore25;              /* attributes for message */
                    584:     int   i, j, k;                                   /* indexing variables */
                    585: 
                    586: 
                    587:                                              /* first, print usage message */
                    588:     VIOWRTCHARSTRATT( message, 51, PageSize, 0, &attrib, 0 );
                    589: 
                    590: 
                    591:     /* build filename string */
                    592: 
                    593:     name[0] = ' ';
                    594:     name[1] = ' ';                         /* some blanks at start and end */
                    595:     name[2] = ' ';
                    596:     name[15] = ' ';
                    597: 
                    598:     for( i = 0; fname[i] != 0; i++);     /* find null terminator for fname */
                    599: 
                    600:     if( i > 0 ) i--;                    /* point i to last letter in fname */
                    601: 
                    602:     for( j = i, k = 14;
                    603:        (fname[j] != '\\') && (fname[j] != ':') && (j >= 0) && (k >= 0);
                    604:        name[k] = fname[j], j--, k-- );
                    605:                          /* move the file name into name[] backwards until */
                    606:                          /* we hit a backslash, colon or start of the name */
                    607: 
                    608:     for( ; k >= 0; name[k] = ' ', k-- );    /* if any room left, blank fill */
                    609: 
                    610:     VIOWRTCHARSTRATT( name, 16, PageSize, 51, &attrib, 0 );    /* write it */
                    611: 
                    612:     line25();                              /* call the line number routine */
                    613: 
                    614:     }
                    615: 
                    616: 
                    617: /*** error25(error) - displays error messages on 25th line, accepts responses
                    618:  *
                    619:  *   error25() displays an error message on the 25th line when any of several
                    620:  *   error conditions are encountered, the type of error being passed as a
                    621:  *   parameter. In some cases we just abort; in others we accept input from
                    622:  *   the user to determine what to do next.
                    623:  *
                    624:  *   Note that while the names of these routines refer to the 25th line,
                    625:  *   the pagesize is not hardcoded - if we are in 43 line mode, this
                    626:  *   information will appear on the 43rd line. Spacing within the line
                    627:  *   is hardcoded for an 80-column display.
                    628:  *
                    629:  *   ENTRY   - Error - an arbitrary number identifying the error encountered
                    630:  *
                    631:  *   EFFECTS - May cause us to end execution; otherwise, none
                    632:  */
                    633: 
                    634: void error25(error)
                    635:     unsigned short error;
                    636:     {
                    637:     static char message1[51] = "ERROR: Out of memory or can't read file            ";
                    638:     static char message2[51] = "ERROR: Unable to create backup. Continue?  (y/n)   ";
                    639:     static char message3[51] = "File not found. Create?  (y/n)                     ";
                    640:     static char message4[51] = "ERROR: Unable to create file                       ";
                    641:     static char message5[51] = "ERROR: Unable to open file - denied write access   ";
                    642:     static char message6[51] = "ERROR: Unable to open file                         ";
                    643:     static char message7[51] = "ERROR: Out of memory.   S = save  Q = quit         ";
                    644:     static char message8[51] = "ERROR: No filename given on command line           ";
                    645:     static char message9[51] = "ERROR: Invalid argument on command line            ";
                    646:     static char message10[51] = "ERROR: Too many parameters on command line         ";
                    647:     static char message11[51] = "ERROR: Unable to save file.   C = continue         ";
                    648:     static char message99[51] = "ERROR: Unknown error. Continue?  (y/n)             ";
                    649:     struct  KeyData keydata;
                    650:     char  attrib = Back25 + Fore25;         /* attributes for our messages */
                    651: 
                    652: 
                    653:     switch( error ) {         /* take the appropriate action for the error */
                    654: 
                    655:        case 1:
                    656:            VIOWRTCHARSTRATT( message1, 51, PageSize, 0, &attrib, 0 );
                    657:            quit(1);
                    658:            break;                           /* 1 -> print message and quit */
                    659: 
                    660:        case 2:
                    661:            VIOWRTCHARSTRATT( message2, 51, PageSize, 0, &attrib, 0 );
                    662:            VIOSETCURPOS( PageSize, 50, 0 );
                    663: 
                    664:            while( 1 ) {                   /* 2 -> get a character from KBD */
                    665: 
                    666:                KBDCHARIN( &keydata, 0, 0 );
                    667: 
                    668:                if( (keydata.char_code == 'y') || (keydata.char_code == 'Y') ) {
                    669:                    name25();
                    670:                    break;                                /* if Y, go ahead */
                    671:                    }
                    672: 
                    673:                else if( (keydata.char_code == 'n') || (keydata.char_code == 'N') ) {
                    674:                    VIOWRTCHARSTRATT( &keydata.char_code, 1, PageSize, 50, &attrib, 0 );
                    675:                    quit(1);                       /* if N, quit with error */
                    676:                    break;
                    677:                    }
                    678: 
                    679:                else badkey();            /* otherwise wait for another key */
                    680: 
                    681:                }
                    682:            break;
                    683: 
                    684:        case 3:
                    685:            VIOWRTCHARSTRATT( message3, 51, PageSize, 0, &attrib, 0 );
                    686:            VIOSETCURPOS( PageSize, 32, 0 );
                    687: 
                    688:            while( 1 ) {                   /* 3 -> get a character from KBD */
                    689: 
                    690:                KBDCHARIN( &keydata, 0, 0 );
                    691: 
                    692:                if( (keydata.char_code == 'y') || (keydata.char_code == 'Y') ) {
                    693:                    name25();
                    694:                    break;                                /* if Y, go ahead */
                    695:                    }
                    696: 
                    697:                else if( (keydata.char_code == 'n') || (keydata.char_code == 'N') ) {
                    698:                    VIOWRTCHARSTRATT( &keydata.char_code, 1, PageSize, 50, &attrib, 0 );
                    699:                    quit(1);                       /* if N, quit with error */
                    700:                    break;
                    701:                    }
                    702: 
                    703:                else badkey();            /* otherwise wait for another key */
                    704: 
                    705:                }
                    706:            break;
                    707: 
                    708:        case 4:
                    709:            VIOWRTCHARSTRATT( message4, 51, PageSize, 0, &attrib, 0 );
                    710:            quit(1);
                    711:            break;                           /* 4 -> print message and quit */
                    712: 
                    713:        case 5:
                    714:            VIOWRTCHARSTRATT( message5, 51, PageSize, 0, &attrib, 0 );
                    715:            quit(1);
                    716:            break;                           /* 5 -> print message and quit */
                    717: 
                    718:        case 6:
                    719:            VIOWRTCHARSTRATT( message6, 51, PageSize, 0, &attrib, 0 );
                    720:            quit(1);
                    721:            break;                           /* 6 -> print message and quit */
                    722: 
                    723:        case 7:
                    724:            VIOWRTCHARSTRATT( message7, 51, PageSize, 0, &attrib, 0 );
                    725:            VIOSETCURPOS( PageSize, 44, 0 );
                    726: 
                    727:            while( 1 ) {                   /* 7 -> get a character from KBD */
                    728: 
                    729:                KBDCHARIN( &keydata, 0, 0 );
                    730: 
                    731:                if( (keydata.char_code == 's') || (keydata.char_code == 'S') ) {
                    732:                    VIOWRTCHARSTRATT( &keydata.char_code, 1, PageSize, 50, &attrib, 0 );
                    733:                    if ( !savefile(fhandle)) {  /* if S, save file and quit */
                    734:                        freesegs();
                    735:                        VIOSETCURPOS( PageSize, 0, 0 );
                    736:                        quit(1);
                    737:                        }
                    738:                    else
                    739:                        error25(11);         /* call error 11 if can't save */
                    740:                    }
                    741: 
                    742:                else if( (keydata.char_code == 'q') || (keydata.char_code == 'Q') ) {
                    743:                    VIOWRTCHARSTRATT( &keydata.char_code, 1, PageSize, 50, &attrib, 0 );
                    744:                    quit(1);                       /* if Q, quit with error */
                    745:                    break;
                    746:                    }
                    747: 
                    748:                else badkey();            /* otherwise wait for another key */
                    749: 
                    750:                }
                    751:            break;
                    752: 
                    753:        case 8:
                    754:            VIOWRTCHARSTRATT( message8, 51, PageSize, 0, &attrib, 0 );
                    755:            quit(1);
                    756:            break;                           /* 8 -> print message and quit */
                    757: 
                    758:        case 9:
                    759:            VIOWRTCHARSTRATT( message9, 51, PageSize, 0, &attrib, 0 );
                    760:            quit(1);
                    761:            break;                           /* 9 -> print message and quit */
                    762: 
                    763:        case 10:
                    764:            VIOWRTCHARSTRATT( message10, 51, PageSize, 0, &attrib, 0 );
                    765:            quit(1);
                    766:            break;                          /* 10 -> print message and quit */
                    767: 
                    768:        case 11:
                    769:            VIOWRTCHARSTRATT( message11, 51, PageSize, 0, &attrib, 0 );
                    770:            VIOSETCURPOS( PageSize, 45, 0 );
                    771: 
                    772:            while( 1 ) {                  /* 11 -> get a character from KBD */
                    773: 
                    774:                KBDCHARIN( &keydata, 0, 0 );
                    775: 
                    776:                if( (keydata.char_code == 'c') || (keydata.char_code == 'C') ) {
                    777:                    name25();
                    778:                    break;                              /* C means continue */
                    779:                    }
                    780:                else badkey();            /* otherwise wait for another key */
                    781: 
                    782:                }
                    783:            break;
                    784: 
                    785:        default:
                    786:            VIOWRTCHARSTRATT( message99, 51, PageSize, 0, &attrib, 0 );
                    787:            VIOSETCURPOS( PageSize, 40, 0 );
                    788: 
                    789:            while( 1 ) {                           /* UNKNOWN error number! */
                    790:                                                /* get a character from KBD */
                    791:                KBDCHARIN( &keydata, 0, 0 );
                    792: 
                    793:                if( (keydata.char_code == 'y') || (keydata.char_code == 'Y') ) {
                    794:                    name25();
                    795:                    break;                                /* if Y, go ahead */
                    796:                    }
                    797: 
                    798:                else if( (keydata.char_code == 'n') || (keydata.char_code == 'N') ) {
                    799:                    VIOWRTCHARSTRATT( &keydata.char_code, 1, PageSize, 50, &attrib, 0 );
                    800:                    quit(1);                       /* if N, quit with error */
                    801:                    break;
                    802:                    }
                    803: 
                    804:                else badkey();            /* otherwise wait for another key */
                    805: 
                    806:                }
                    807:            break;
                    808: 
                    809:        }
                    810: 
                    811:     }

unix.superglobalmegacorp.com

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