home *** CD-ROM | disk | FTP | other *** search
/ ProfitPress Mega CDROM2 …eeware (MSDOS)(1992)(Eng) / ProfitPress-MegaCDROM2.B6I / COMM / MISC / SRC26_2.ZIP / SRC / SETUP.C < prev    next >
Encoding:
C/C++ Source or Header  |  1990-07-12  |  35.6 KB  |  1,252 lines

  1. /*
  2.  * setup.c: hterm set-up menu system (not regident)
  3.  *
  4.  * Author: HIRANO Satoshi
  5.  * (C) 1989, 1990  Halca Computer Science Laboratory TM
  6.  *           University of Tokyo
  7.  *
  8.  * 2.2 89/05/16 Halca.Hirano change Shift-JIS menu item to ASCII
  9.  *                V2.2 distribution
  10.  * 2.3 89/06/15 Halca.Hirano integrate 98 and PC
  11.  * 2.4 89/07/04 Halca.Hirano builtin mini mini emacs editor
  12.  * 2.5 89/07/15 Halca.Hirano add help system
  13.  * 2.6 89/07/20 Halca.Hirano add PFkey editor
  14.  * 2.7 89/07/27 Halca.Hirano make effort to reduce code size
  15.  *     ---- V2.3.-1 distribution ----
  16.  * 2.8 89/09/15 Halca.Hirano add RTS/CTS flow ctrl, fix lineMode bug
  17.  * 2.9 89/09/21 Halca.Hirano add xmodem file transfer facility
  18.  *    add file xfer options set-up
  19.  *    ---- V2.4.0 distribution ----
  20.  * 3.0 89/10/04 Halca.Hirano fix port number bug
  21.  *    move change directory to file.c
  22.  * 3.1 89/11/10 Tominaga@Titech ported to J3100, 
  23.  *    improve many items.
  24.  *        put 'done' message after clearing display
  25.  *        don't change lowScrRegion at resetTerminal()
  26.  *        locate(0,0) after returing from DOS
  27.  *        put 'not supported' or 'only this' messages instead of 'xx only'
  28.  *        put 'only this' messages properly
  29.  *        add ^U (erase to top of line) to mini-mini-emacs editor
  30.  * ----  V2.5.0 distribution ----
  31.  * 3.2 89/11/29 Halca.Hirano add audible/visible/both bell mode
  32.  * 3.3 89/12/04 Halca.Hirano add remap keys!
  33.  *    drop ER at exit
  34.  * 3.4 89/12/12 Halca.Hirano move getting filename for filexfer to 
  35.  *    kermit.c/xmodem.c so that these functions are able to be called from
  36.  *    communication mode.
  37.  * ---- V2.5.1 distribution ----
  38.  * 3.5 89/12/16 Halca.Hirano save/restore dropER in set-up file
  39.  * 3.6 90/06/16 Halca.Hirano
  40.  *    rewrite menu interpreter smaller
  41.  *        use locate/reverseMode instead of sprintf("ESC[10;20fESC[7m....
  42.  *
  43.  * $Header: setup.cv  1.21  90/07/04 18:02:18  hirano  Exp $
  44.  *
  45.  */
  46.  
  47. #include "option.h"
  48. #ifdef SETUP
  49. #include <stdio.h>
  50. #include <string.h>
  51. #include <stdlib.h>
  52. #include "config.h"
  53. #include "hterm.h"
  54. #include "default.h"
  55. #include "global.h"
  56. #include "version.h"
  57.  
  58.  
  59. /*
  60.  * menu entry
  61.  */
  62. struct _menu {
  63.     int x, y;            /* menu position            */
  64.     char *string;        /* menu label string        */
  65.     char *key;            /* help database index key    */
  66. };
  67.  
  68. #define sorry()    putStatus(future)
  69. #define onlyThis() putStatus(only)
  70. #define notSupported() putStatus(useOtherMachine)
  71.  
  72. static int first = YES;
  73. static char manual[70] = "intro";
  74. static char toNext[] = " To Next Set-Up ";
  75. static char toDir[] = " To Directory ";
  76. static char msg_prnNotRdy[] = "Printer not ready";
  77. static char msg_bsOff[] = " BS Key Watcher OFF ";
  78. static char msg_bsNum[] = " BS Key Watcher %2u%% ";
  79. static char useOtherMachine[] = "not supported";
  80. static char future[] = "Future Function";
  81. static char only[] = "Only this";
  82.  
  83. static    void mainDirectory(void);
  84. static  int displayDirectory(void );
  85. static  int dispEnhanstDirectory(void );
  86. static  int generalDirectory(void );
  87. static  int genEnhanstDirectory(void );
  88. static  int commDirectory(void );
  89. static  int printerDirectory(void );
  90. static  int keybdDirectory(void );
  91. static  int keyRemapDirectory(void );
  92. static  int tabDirectory(void );
  93. static  int fileXferDirectory(void );
  94. static  int xferOptionsDirectory(void );
  95. static  void putmenu(int num,struct _menu *p);
  96. static  int getmenu(int num,struct _menu *p,int menu);
  97.  
  98. void setup()
  99. {
  100.     showHelp = NO;
  101.     mode = M_SETUP;
  102.     showPage1();
  103.  
  104.     conPrint(versionString());
  105.     conPrint("Copyright (C) 1986, 1990  Halca Computer Science Laboratory  TM\n\r");
  106.     conPrint("                          University of Tokyo\n\r");
  107.     conPrint("All rights reserved.\n\r");
  108.     conPrint("Author: HIRANO Satoshi\n\r");
  109.     conPrint("Automatic hterm information: hterm@tkl.iis.u-tokyo.ac.jp\n\r");
  110.     conPrint("Bug report and contribution: hterm-bug@tkl.iis.u-tokyo.ac.jp\n\r");
  111.     conPrint("Please use this software freely, but only for peaceful purpose.\n\r\n");
  112.     reverseMode();
  113.     conPrint(" ? for help ");
  114.     normalMode();
  115.  
  116.     mainDirectory();
  117.  
  118.     mode = M_COMM;
  119.     showPage0();
  120. }
  121.  
  122. /*
  123. ** static void mainDirectory
  124.  *
  125.  * main set-up directory
  126.  */
  127. struct _menu smainmenu[] = 
  128. {/* 0 */ {0,  0, " hterm  Set-Up Directory", NULL}, 
  129.  /* 1 */ {0,  2, " Display ", "M1"}, 
  130.  /* 2 */ {10, 2, " General ", "M2"}, 
  131.  /* 3 */ {20, 2, " Communication ", "M3"},
  132.  /* 4 */ {36, 2, " Keyboard ", "M4"}, 
  133.  /* 5 */ {47, 2, " Printer ", "M5"}, 
  134.  /* 6 */ {57, 2, " Tabs ", "M6"},
  135.  /* 7 */ {0,  4, " File Xfer ", "M7"},
  136.  /* 8 */ {12, 4, " OS  ", "M8"},
  137.  /* 9 */ {18, 4, NULL, "M9"}, 
  138.  /* 10*/ {29, 4, " Clear Display ", "M10"}, 
  139.  /* 11*/ {45, 4, " Clear Comm ", "M11"},
  140.  /* 12*/ {58, 4, " Reset Terminal ", "M12"}, 
  141.  /* 13*/ {0,  6, " Redial ", "M13"}, 
  142.  /* 14*/ {9,  6, " Manual ", "intro"},
  143.  /* 15*/ {18, 6, " Save Set-Up ", "M15"}, 
  144.  /* 16*/ {32, 6, " Exit Set-up ", "M16"}, 
  145.  /* 17*/ {46, 6, " Exit hterm ", "M17"}};
  146. #define N_MENU 17
  147.  
  148. char *sm_online[] = {" Off Line ", " On Line  "};
  149.  
  150. static void mainDirectory()
  151. {
  152.     register int menu, status;
  153.     char *diag;
  154.  
  155.     smainmenu[9].string = sm_online[online];
  156.     menu = 1; status = M_DIRECTORY;
  157.     for(;;) {
  158.         if (status != M_NEXT) {
  159.             if (status != M_NOCHANGE)
  160.                 putmenu(N_MENU, smainmenu);
  161.             menu = getmenu(N_MENU, smainmenu, menu);
  162.         }
  163.         status = M_NOCHANGE;
  164.         switch(menu) {
  165.         case 1: status = displayDirectory(); break;
  166.         case 2: status = generalDirectory(); break;
  167.         case 3: status = commDirectory(); break;
  168.         case 4: status = keybdDirectory(); break;
  169.         case 5: status = printerDirectory(); break;
  170.         case 6: status = tabDirectory(); break;
  171.         case 7: status = fileXferDirectory(); break;
  172.         case 8: callOS(); goto redraw;
  173.         case 9:smainmenu[9].string = sm_online[online = !online]; break;
  174.         case 10:
  175.             clearSavedPage(page0Save);
  176.             clearSavedPage(ansiVramSave);
  177.             curYSave = 0, curXSave = 0; attrSave = eraseAttr;
  178. #ifdef UOP_GRAPHICS
  179.             plot_erase();
  180. #endif /* UOP_GRAPHICS */
  181.             goto redraw;
  182.         case 11: portSetup(); ansiSetup();
  183.             break;
  184.         case 12: 
  185.             resetTerminal();
  186. redraw:
  187.             putmenu(N_MENU, smainmenu);            
  188.             break;
  189.         case 13:
  190.             redial = !redial;
  191.             if (redial)
  192.                 putStatus("redial after set-up");
  193.             else
  194.                 putStatus("No redial");
  195.             break;
  196.         case 14: { 
  197.             char *nextKey;
  198.             strcpy(tmpBuf, manual);
  199.             if (emacs("Topics: ", tmpBuf, MAX_FILE_NAME, E_NO_HELP) == ERR)
  200.                 break;
  201.             if (tmpBuf[0] == '\0' || tmpBuf[0] == '?')
  202.                 strcpy(manual, "intro");
  203.             else
  204.                 strcpy(manual, tmpBuf);
  205.             if ((nextKey = helpSystem(manual)) != (char *)NULL);
  206.                 strcpy(manual, nextKey);
  207.             }
  208.             break;
  209.         case 15: strcpy(tmpBuf, setFileName);
  210.             if (emacs("Set-Up filename: ", tmpBuf, MAX_FILE_NAME, (E_HELP|E_FILE)) == ERR)
  211.                 break;
  212.             if ((diag = saveSetup(tmpBuf)) != NULL)  {
  213.                 putStatus(diag); bell(); 
  214.             } else {
  215.                 strcpy(setFileName, tmpBuf);
  216.             }
  217.             break;
  218.         case 16: return;
  219.         case 17:
  220.             showPage0(); termination();
  221.         case END_SETUP: return;
  222.         }
  223.         if (status == END_SETUP) return;
  224.         else if (status == M_NEXT)
  225.             if (++menu > 7) menu = 1;
  226.         if (status == M_DIRECTORY)
  227.             menu = 1;
  228.     } 
  229.  
  230.  
  231. /*
  232. ** displayDirectory()
  233.  *
  234.  * display setup directory
  235.  */
  236. struct _menu sdisplay[] = {
  237. /* 0 */{0,  0, " Display Set-Up", NULL},
  238. /* 1 */{0,  2, toNext, "D1"}, 
  239. /* 2 */{17, 2, toDir, "to dir"}, 
  240. /* 3 */{32, 2, NULL, "D3"}, /* interpret */
  241. /* 4 */{56, 2, NULL, "D4"}, /* auto wrap */
  242. /* 5 */{0,  4, NULL, "D5"}, /* soft font */
  243. /* 6 */{12, 4, NULL, "D6"}, /* cursor    */
  244. /* 7 */{24, 4, NULL, "D7"},    /* statline */
  245. /* 8 */{41, 4, NULL, "D8"}};/* backquote */
  246. #undef N_MENU
  247. #define N_MENU 8
  248.  
  249. char *sd_intCon[] = {" No Interpret Controls ", " Interpret Controls    "};
  250. char *sd_aWrap[] = {" No Auto Wrap ", " Auto Wrap    "};
  251. char *sd_softFont[] = {" ROM Font  ", " Soft Font "};
  252. char *sd_cur[] = {" No Cursor ", " Cursor    "};
  253. char *sd_sLine[] = {" No Status Line ", " Status Line    "};
  254. char *sd_backQ[] = {" No Backquote ", " Backquote    "};
  255.  
  256. static displayDirectory()
  257. {
  258.     register int menu;
  259.     int softFontDummy;
  260.     char *msg;
  261.  
  262.     sdisplay[3].string = sd_intCon[intConSave];
  263.     sdisplay[4].string = sd_aWrap[autoWrap];
  264.     sdisplay[5].string = sd_softFont[softFont];
  265.     sdisplay[6].string = sd_cur[cursorSave];
  266.     sdisplay[7].string = sd_sLine[0 /*stLineEnable*/];
  267.     sdisplay[8].string = sd_backQ[backQuote];
  268.     putmenu(N_MENU, sdisplay);
  269.     menu = 1;
  270.     for (;;) {
  271.         switch(menu = getmenu(N_MENU, sdisplay, menu)) {
  272.         case 1: return(dispEnhanstDirectory());
  273.         case 2: return(M_DIRECTORY);
  274.         case 3: sdisplay[3].string = sd_intCon[intConSave = !intConSave]; break;
  275.         case 4:    sdisplay[4].string = sd_aWrap[autoWrap = !autoWrap]; break;
  276.         case 5:
  277. #ifdef SOFT_FONT
  278.             softFontDummy = !softFont;
  279.             if (softFontDummy && fontFileLoaded == NO) {
  280.                 putStatus("Loading font...");
  281.                 msg = fontLoad(fontName);
  282.                 if (msg) {
  283.                     putStatus(msg);
  284.                     break;
  285.                 }
  286.             }
  287.             if (softFont)
  288.                 attrib = eraseAttr = _NORMAL;        /* normal attribute        */
  289.             initPage();
  290.             softFont = softFontDummy;
  291.             sdisplay[5].string = sd_softFont[softFont];
  292.             setCRTMode();
  293.             putmenu(N_MENU, sdisplay);
  294. #else
  295.             putStatus("soft font not installed");
  296. #endif    /* SOFT_FONT */
  297.             break;
  298.         case 6: sdisplay[6].string = sd_cur[cursorSave = !cursorSave]; break;
  299.         case 7: sorry(); break;
  300. #if 0
  301.         case 7: 
  302.             if ((statline = !statline) == YES) 
  303.                 enable25();
  304.             else
  305.                 disable25();
  306.             sdisplay[7].string = sd_sLine[statline]; break;
  307. #endif
  308.         case 8: /* PC98 only */
  309. #ifdef PC98
  310.             sdisplay[8].string = sd_backQ[backQuote = !backQuote]; break;
  311. #else
  312.             onlyThis(); break;
  313. #endif /* PC98 */
  314.         case END_SETUP: return(END_SETUP);
  315.         }
  316.     }
  317.  
  318. /*
  319. ** dispEnhanstDirectory()
  320.  *
  321.  * display enhancements set-up directory
  322.  */
  323. struct _menu sdispenhanst[] = {
  324. /* 0 */{0,  0, " Display Enhancements Set-Up", NULL},
  325. /* 1 */{0,  2, toNext, "d1"}, 
  326. /* 2 */{17, 2, toDir, "to dir"}, 
  327. /* 3 */{32, 2, " magenda char ", "d3"},    /* ccol */
  328. /* 4 */{47, 2, " magenda back ", "d4"},    /* bcol    */
  329. /* 5 */{62, 2, " magenda border ", "d5"},
  330. /* 6 */{0,  4, NULL, "d6"}, /*blink*/
  331. /* 7 */{18, 4, NULL, "d7"},    /* under */
  332. /* 8 */{43, 4, NULL, "d8"}};/*vbell*/
  333. #undef N_MENU
  334. #define N_MENU 8
  335.  
  336. char *sde_blinkCursor[] = {" Static Cursor   ", " Blinking Cursor "};
  337. char *sde_blockCursor[] = {" Underline Cursor Style ", " Block Cursor Style     "};
  338. char *sde_vbell[] = {" Audible Bell  ", " Visible Bell  ", " Both A/V Bell "};
  339. char *sde_ccol = " %s Char ";
  340. char *sde_ecol = " %s Back ";
  341. char *sde_bcol = " %s Border ";
  342. #ifdef PC98
  343. char *colname[] = {"Black  ","Blue   ","Red    ","Vioret ","Green  ",
  344.                     "Magenta", "Yellow ","White  "};
  345. #endif
  346. #if defined(IBMPC) || defined(J3100)
  347. char *colname[] = {"Black  ","Blue   ","Green  ",  "Cyan   ","Red    ",
  348.                     "Magenta", "Brown  ","White  "};
  349. #endif
  350.  
  351. static dispEnhanstDirectory()
  352. {
  353.     register int menu;
  354.     int ccol;
  355.     int ecol;
  356.     int bcol;
  357.  
  358.     if (softFont)
  359.         attrib = eraseAttr = _NORMAL;        /* normal attribute        */
  360.     
  361. #ifdef PC98
  362.     bcol = border>>4;
  363.  
  364.     if (eraseAttr & B_REVER) {
  365.         ecol = eraseAttr>>5;    /* non-black    */
  366.         ccol = 0;
  367.     } else {
  368.         ecol = 0;                /* black        */
  369.         ccol = attrib>>5;
  370.     }
  371. #endif
  372. #ifdef IBMPC
  373.     ccol = attrib & 0x07;
  374.     ecol = (attrib & 0x70) >> 4;
  375.     bcol = 0;
  376. #endif
  377. #ifdef J3100
  378.     ccol = 7;
  379.     ecol = 0;
  380.     bcol = 0;
  381. #endif
  382.     sprintf(sdispenhanst[3].string, sde_ccol, colname[ccol]);
  383.     sprintf(sdispenhanst[4].string, sde_ecol, colname[ecol]);
  384.     sprintf(sdispenhanst[5].string, sde_bcol, colname[bcol]);
  385.     sdispenhanst[6].string = sde_blinkCursor[blinkCursor];
  386.     sdispenhanst[7].string = sde_blockCursor[blockCursor];
  387.     sdispenhanst[8].string = sde_vbell[visibleBell];
  388.     putmenu(N_MENU, sdispenhanst);
  389.     menu = 1;
  390.     for (;;) {
  391.         switch(menu = getmenu(N_MENU, sdispenhanst, menu)) {
  392.         case 1: return(M_NEXT);
  393.         case 2: return(M_DIRECTORY);
  394. #ifdef PC98
  395.         case 3:
  396.             if (softFont)
  397.                 break;
  398.             if (ecol != 0) {
  399.                 putStatus("Only black char with non-black backgroud");
  400.                 break;
  401.             }
  402.             if (++ccol >= MAX_BACK_COLOR) ccol = 0;
  403.             eraseAttr = attrSave = attrib = (ccol<<5)|B_NORMAL;
  404.             goto clearAll;
  405.         case 4:    if (++ecol >= MAX_BACK_COLOR) ecol = 0;
  406.             if (softFont)
  407.                 break;
  408.             if (ecol == 0) {    /* black    */
  409.                 eraseAttr = A_WHITE|B_NORMAL;    
  410.                 ccol = 7;        /* white char    */
  411.             } else {
  412.                 eraseAttr = (ecol<<5)|B_REVER|B_NORMAL;
  413.                 ccol = 0;        /* black char */
  414.             }
  415.             attrSave = attrib = eraseAttr;
  416.             sprintf(sdispenhanst[4].string, sde_ecol, colname[ecol]);
  417. clearAll:    sprintf(sdispenhanst[3].string, sde_ccol, colname[ccol]);
  418.             initPage();
  419.             clearSavedPage(page0Save);
  420.             curXSave = curYSave = 0;
  421.             putmenu(N_MENU, sdispenhanst);
  422.             break;
  423.         case 5:    if (++bcol >= MAX_BACK_COLOR) bcol = 0;
  424.             border = (bcol << 4);
  425.             sprintf(sdispenhanst[5].string, sde_bcol, colname[bcol]);
  426.             setBorder(border);
  427.             break;
  428. #endif /* PC98 */
  429. #ifdef IBMPC
  430.         case 3:
  431.             if (softFont)
  432.                 break;
  433.             if (++ccol >= MAX_BACK_COLOR) ccol = 0;
  434.             goto clearAll;
  435.         case 4:    
  436.             if (softFont)
  437.                 break;
  438.             if (++ecol >= MAX_BACK_COLOR) ecol = 0;
  439. clearAll:    attrSave = eraseAttr = attrib = (ccol | (ecol<<4));
  440.             sprintf(sdispenhanst[3].string, sde_ccol, colname[ccol]);
  441.             sprintf(sdispenhanst[4].string, sde_ecol, colname[ecol]);
  442.             initPage();
  443.             clearSavedPage(page0Save);
  444.             curXSave = curYSave = 0;
  445.             putmenu(N_MENU, sdispenhanst);
  446.             break;
  447.         case 5:
  448.             break;
  449. #endif /* IBMPC */
  450. #ifdef J3100
  451.         case 3: case 4: case 5: break;
  452. #endif /* J3100 */
  453.         case 6:
  454.             sdispenhanst[6].string = sde_blinkCursor[blinkCursor = !blinkCursor]; 
  455.             break;
  456.         case 7:
  457.             sdispenhanst[7].string = sde_blockCursor[blockCursor = !blockCursor]; 
  458.             break;
  459.         case 8: if (++visibleBell > MAX_BELL_MODE) visibleBell = 0;
  460.             sdispenhanst[8].string = sde_vbell[visibleBell]; break;
  461.         case END_SETUP: return(END_SETUP);
  462.         }
  463.     }
  464.  
  465. /*
  466. ** generalDirectory
  467.  *
  468.  * general set-up directory
  469.  */
  470. struct _menu sgeneral[] = {
  471. /* 0 */{0,  0, " General Set-Up"},
  472. /* 1 */{0,  2, toNext, "G1"}, 
  473. /* 2 */{17, 2, toDir, "to dir"},
  474. /* 3 */{32, 2, " VT200 Mode, 7 Bit Controls ", "G3"}, 
  475. /* 4 */{61, 2, " VT220 ID ", "G4"},
  476. /* 5 */{0,  4, NULL, "G5"},    /*keypad*/
  477. /* 6 */{17, 4, NULL, "G6"},    /*cursor*/
  478. /* 7 */{38, 4, NULL, "G7"}, /*newline*/
  479. /* 8 */{52, 4, NULL, "G8"},    /*JIS*/
  480. /* 9 */{0,  6, NULL, "G9"},    /*fep*/
  481. /* 10*/{22, 6, NULL, "G10"},/*speed*/
  482. /* 11*/{37, 6, NULL, "G11"}};/*bskey*/
  483. #undef N_MENU
  484. #define N_MENU 11
  485.  
  486. char *sg_padkey[] = {" Numeric Keypad ", " Appl. Keypad   "};
  487. char *sg_curkey[] = {" Normal Cursor Keys ", " Appl. Cursor Keys  "};
  488. char *sg_newline[] = {" No New Line ", " New Line    "}; 
  489. char *sg_code[] = {" Shift JIS ", " Old JIS   ", " New JIS   ", 
  490.                    " EUC       ", " NEC KANJI "};
  491. #ifdef J3100
  492. char *sg_fep[] = {" KANJI-KEY FEP       "};
  493. #else /* !J3100 */
  494. char *sg_fep[] = {" No FEP              ", " CTRL-XFER FEP       ", 
  495.         " SHIFT-XFER FEP      ", " CTRL/SHIFT-XFER FEP "};
  496. #endif /* J3100 */
  497. char *sg_mSpeed[] = {" Mouse Fast   ", " Mouse Middle ", " Mouse Slow   "};
  498.  
  499. static generalDirectory()
  500. {
  501.     register int menu;
  502.     int tmp;
  503.     char buf[10];
  504.     char buf2[40];
  505.     extern int newline;
  506.  
  507.     sgeneral[5].string = sg_padkey[applKeypad];
  508.     sgeneral[6].string = sg_curkey[applCursor];
  509.     sgeneral[7].string = sg_newline[newline];
  510. #ifdef KANJI
  511.     sgeneral[8].string = sg_code[kanjiSave];
  512.     sgeneral[9].string = sg_fep[fepInvoke];
  513. #else
  514.     sgeneral[8].string = " No KANJI  ";
  515.     sgeneral[9].string = " No KANJI            ";
  516. #endif /* KANJI */
  517.     sgeneral[10].string = sg_mSpeed[mouseSpeed];
  518.     if (bsKeyRatio) {
  519.         sprintf(buf2, msg_bsNum /*" BS Key Watcher %2u%% "*/, bsKeyRatio);
  520.         sgeneral[11].string = buf2;
  521.     } else
  522.         sgeneral[11].string = msg_bsOff/*" BS Key Watcher OFF "*/;
  523.  
  524.     putmenu(N_MENU, sgeneral);
  525.     menu = 1;
  526.     for (;;) {
  527.         switch(menu = getmenu(N_MENU, sgeneral, menu)) {
  528.         case 1: return(genEnhanstDirectory());
  529.         case 2: return(M_DIRECTORY);
  530.         case 3: case 4: 
  531.             onlyThis(); break;
  532.         case 5: sgeneral[5].string = sg_padkey[applKeypad = !applKeypad]; break;
  533.         case 6: sgeneral[6].string = sg_curkey[applCursor = !applCursor]; break;
  534.         case 7: sgeneral[7].string = sg_newline[newline = !newline]; break;
  535. #ifdef KANJI
  536.         case 8: if (++kanjiSave > KMAX) kanjiSave = SJIS;
  537.             sgeneral[8].string = sg_code[kanjiSave]; break;
  538.         case 9: 
  539. #if MAX_FEP_XFER
  540.             if (++fepInvoke > MAX_FEP_XFER) 
  541.                 fepInvoke = 0;
  542.             sgeneral[9].string = sg_fep[fepInvoke];
  543.             if (fepInvoke == FEP_BOTHXFER)
  544.                 putStatus("Please take attention.");
  545.             else
  546.                 clearStatus();
  547. #else
  548.             onlyThis();
  549. #endif /* MAX_FEP_XFER */
  550.             break;
  551. #else
  552.         case 8: case 9: onlyThis(); break;
  553. #endif /* KANJI */
  554.         case 10: if (++mouseSpeed > MOUSE_SPEED_MAX)
  555.                 mouseSpeed = 0;
  556.             sgeneral[10].string = sg_mSpeed[mouseSpeed];
  557.             break;
  558.         case 11:
  559. #ifdef BS_WATCHER
  560.             sprintf(buf, "%d%%", bsKeyRatio);
  561.             if (emacs("BS key ratio (N% or off): ", buf, 10, E_NO_HELP) == ERR)
  562.                 break;
  563.             tmp = atoi(buf);
  564.             if (tmp < 0 || tmp > 99)
  565.                 break;
  566.             bsKeyRatio = tmp;
  567.             if (bsKeyRatio) {
  568.                 sprintf(buf2, msg_bsNum/*" BS Key Watcher %2u%% "*/, bsKeyRatio);
  569.                 sgeneral[11].string = buf2;
  570.             } else
  571.                 sgeneral[11].string = msg_bsOff /*" BS Key Watcher OFF "*/;
  572. #else
  573.             onlyThis();
  574. #endif /* BS_WATCHER */
  575.             break;
  576.         case END_SETUP: return(END_SETUP);
  577.         }
  578.     }
  579.  
  580. /*
  581. ** genEnhanstDirectory
  582.  *
  583.  * general enhansments set-up directory
  584.  */
  585. struct _menu sgenenhanst[] = {
  586. /* 0 */{0,  0, " General Enhancements Set-Up"},
  587. /* 1 */{0,  2, toNext, "g1"}, 
  588. /* 2 */{17, 2, toDir, "to dir"},
  589. /* 3 */{32, 2, NULL, "g3"},/*form*/
  590. /* 4 */{58, 2, NULL, "g4"},/*linemode*/
  591. /* 5 */{0,  4, NULL, "g5"},/*tab*/
  592. /* 6 */{12, 4, NULL, "g6"},/*saver*/
  593. /* 7 */{28, 4, NULL, "g7"},/*bsave*/
  594. /* 8 */{42, 4, NULL, "g8"},/*lock*/
  595. /* 9 */{0,  6, NULL, "g9"},/*dial*/
  596. /* 10*/{24, 6, " Dialing Sequence ", "g10"},/*seq*/
  597. /* 11*/{43, 6, " Default Command ", "g11"}};/*com*/
  598. #undef N_MENU
  599. #define N_MENU 11
  600.  
  601. char *sge_form[] = {" Form Feed: Line Feed    ", " Form Feed: Home & Clear "};
  602. char *sge_lineMode[] = {" 24 line mode ", " 25 line mode ", 
  603.             " 19 line mode ", " 20 line mode "};
  604. char *sge_tab[] = {" Skip Tab  ", " Space Tab "};
  605. char *sge_saver[] = {" CRT Saver Off ", " CRT Saver 3   ", " CRT Saver 10  "};
  606. char *sge_lock[] = {" No Shift/Ctrl Lock ", " Shift/Ctrl Lock    "};
  607. char *sge_dial[] = {" No Dialing at Startup ", " Dialing at Startup    "};
  608.  
  609. static genEnhanstDirectory()
  610. {
  611.     register int menu;
  612.     extern int formfeed;
  613.     extern char *saverName();    /* saver??.c    */
  614.  
  615.     sgenenhanst[3].string = sge_form[formfeed];
  616.     sgenenhanst[4].string = sge_lineMode[lineMode];
  617.     sgenenhanst[5].string = sge_tab[spaceTab];
  618.     sgenenhanst[6].string = sge_saver[saver];
  619.     sgenenhanst[7].string = saverName(saverType);
  620.     sgenenhanst[8].string = sge_lock[shiftLock];
  621.     sgenenhanst[9].string = sge_dial[dialStartup];
  622.  
  623.     putmenu(N_MENU, sgenenhanst);
  624.     menu = 1;
  625.     for (;;) {
  626.         switch(menu = getmenu(N_MENU, sgenenhanst, menu)) {
  627.         case 1: return(M_NEXT);
  628.         case 2: return(M_DIRECTORY);
  629.         case 3: sgenenhanst[3].string = sge_form[formfeed = !formfeed]; break;
  630.         case 4: if (++lineMode > MAX_LINE_MODE) lineMode = 0;
  631.             sgenenhanst[4].string = sge_lineMode[lineMode];
  632.             clearSavedPage(page0Save);
  633.             curXSave = curYSave = saveX = saveY = 0;
  634.             setLineMode(lineMode);
  635.             lowScrRgSave = bottomLine;
  636.             setLineMode(LINE_MODE_25);
  637.             break;
  638.         case 5: sgenenhanst[5].string = sge_tab[spaceTab = !spaceTab]; break;
  639.         case 6: if (++saver > MAX_CRT_SAVER) saver = 0;
  640.             setTimerValue();
  641.             sgenenhanst[6].string = sge_saver[saver];
  642.             break;
  643.         case 7: if (maxSaverType == 0) {
  644.                 onlyThis();
  645.             } else {
  646.                 if (++saverType > maxSaverType) saverType = 0;
  647.                 sgenenhanst[7].string = saverName(saverType);
  648.             }
  649.             break;
  650. #ifdef PC98
  651.         case 8: sgenenhanst[8].string = sge_lock[shiftLock = !shiftLock];
  652.             if (shiftLock)
  653.                 (void)helpSystem("shift lock");
  654.             else
  655.                 clearCopyright();
  656.             break;
  657. #else
  658.         case 8: notSupported(); break;
  659. #endif /* PC98 */
  660.         case 9: sgenenhanst[9].string = sge_dial[dialStartup = !dialStartup];
  661.             break;
  662.         case 10: strcpy(tmpBuf, phone);
  663.             if (emacs("Sequence: ", tmpBuf, MAX_PHONE, E_HELP) != ERR)
  664.                 strcpy(phone, tmpBuf);
  665.             break;
  666.         case 11: 
  667.             strcpy(tmpBuf, defaultCommandLine);
  668.             if (emacs("command: ", tmpBuf, MAX_FILE_NAME, E_HELP) != ERR)
  669.                 strcpy(defaultCommandLine, tmpBuf);
  670.             break;
  671.         case END_SETUP: return(END_SETUP);
  672.         }
  673.     }
  674.  
  675. /*
  676. ** commDirectory()
  677.  *
  678.  * communication set-up directory
  679.  */
  680. struct _menu scom[] = {
  681. /* 0 */{0,  0, " Communication Set-Up"},
  682. /* 1 */{0,  2, toNext, "C1"}, 
  683. /* 2 */{17, 2, toDir, "to dir"},
  684. /* 3 */{32, 2, " Baud Rate = 38400   ", "C3"}, 
  685. /* 4 */{52, 2, NULL, "C4"},/*parity*/
  686. /* 5 */{0,  4, NULL, "C5"},/*stop*/
  687. /* 6 */{13, 4, NULL, "C6"},/*echo*/
  688. /* 7 */{29, 4, NULL, "C7"},/*xon*/
  689. /* 8 */{44, 4, NULL, "C8"},/*port*/
  690. /* 9 */{52, 4, NULL, "C9"}};/*drop*/
  691. #undef N_MENU
  692. #define N_MENU 9
  693.  
  694. char *sc_baud = " Baud Rate = %5u ";
  695. char *sc_par[] = {" 8 Bits, No Parity    ", " 8 Bits, Even Parity  ",
  696. " 7 Bits, No Parity    ", " 7 Bits, Even Parity  ", " 7 Bits, Space Parity "};
  697. char *sc_stop[] = {" 1 Stop Bit ", " 2 Stop Bit "};
  698. char *sc_echo[] = {" No Local Echo ", " Local Echo    "};
  699. char *sc_xon[] = {" No Flow Ctrl ", " XON/XOFF     ", " RTS/CTS      "};
  700. char *sc_port[] = {" COM1: ", " COM2: ", " COM3: ", " COM4: ", " Ether "};
  701. char *sc_drop[] = {" Keep Line at Exit ", " Drop Line at Exit "};
  702.  
  703. static commDirectory()
  704. {
  705.     register int menu;
  706.  
  707.     sprintf(scom[3].string, sc_baud, numBaud(baud));
  708.     scom[4].string = sc_par[paritybit];
  709.     scom[5].string = sc_stop[stopbit];
  710.     scom[6].string = sc_echo[echoMode];
  711.     scom[7].string = sc_xon[xonXoff];
  712.     scom[8].string = sc_port[portNo];
  713.     scom[9].string = sc_drop[dropER];
  714.  
  715.     putmenu(N_MENU, scom);
  716.     menu = 1;
  717.     for (;;) {
  718.         switch(menu = getmenu(N_MENU, scom, menu)) {
  719.         case 1: return(M_NEXT);
  720.         case 2: return(M_DIRECTORY);
  721.         case 3: if (++baud > BAUD_NUM_MAX) baud = 1;
  722.             if (numBaud(baud) == 0)
  723.                 baud = 1;
  724.             sprintf(scom[3].string, sc_baud, numBaud(baud));
  725.             initPortDevice(baud, parity);
  726.             baudrate = numBaud(baud);
  727.             break;
  728.         case 4: if (++paritybit > MAX_PARITY) paritybit = 0;
  729.             scom[4].string = sc_par[paritybit];
  730.             parity = parcalc(paritybit, stopbit);
  731.             initPortDevice(baud, parity); 
  732.             break;
  733.         case 5: stopbit = !stopbit;
  734.             scom[5].string = sc_stop[stopbit];
  735.             parity = parcalc(paritybit, stopbit); 
  736.             initPortDevice(baud, parity); 
  737.             break;
  738.         case 6: scom[6].string = sc_echo[echoMode = !echoMode]; break;
  739.         case 7: if (++xonXoff > FLOWCTRL_MAX) xonXoff = 0;
  740.             scom[7].string = sc_xon[xonXoff]; 
  741.             break;
  742.         case 8: if (++portNo > MAX_PORT) portNo = 0;
  743.             scom[8].string = sc_port[portNo];
  744.             setPort(portNo);
  745.             break;
  746.         case 9: scom[9].string = sc_drop[dropER = !dropER]; break;
  747.         case END_SETUP: return(END_SETUP);
  748.         }
  749.     }
  750.  
  751. /*
  752. ** printerDirectory
  753.  *
  754.  * printer set-up directory
  755.  */
  756. struct _menu sprinter[] = {
  757. /* 0 */{0,  0, " Printer Set-Up"},
  758. /* 1 */{0,  2, toNext, "P1"},
  759. /* 2 */{17, 2, toDir, "to dir"},
  760. /* 3 */{32, 2, NULL, "P3"}, /*auto*/
  761. /* 4 */{45, 2, " Send Formfeed ", "P4"},/*form*/
  762. /* 5 */{61, 2, " Spacing=8 ", "P5"}};/*spacing*/
  763. #undef N_MENU
  764. #define N_MENU 5
  765.  
  766. char *sp_print[] = {" No Print   ", " Auto Print "};
  767. char *sp_space = " Spacing=%d ";
  768.  
  769. static printerDirectory()
  770. {
  771.     register int menu;
  772.  
  773.     sprinter[3].string = sp_print[printMSave];
  774.     sprintf(sprinter[5].string, sp_space, spacing);
  775.     putmenu(N_MENU, sprinter);
  776.     menu = 1;
  777.     for (;;) {
  778.         switch(menu = getmenu(N_MENU, sprinter, menu)) {
  779.         case 1: return(M_NEXT);
  780.         case 2: return(M_DIRECTORY);
  781.         case 3: printMSave = !printMSave;
  782.             if (printMSave == YES) 
  783.                 if (checkPrinterReady() == ERR) {
  784.                     printMSave = NO;
  785.                     putStatus(msg_prnNotRdy /*"Printer not ready"*/); bell();
  786.                 } else
  787.                     printOn();
  788.             sprinter[3].string = sp_print[printMSave];
  789.             break;
  790.         case 4: if (checkPrinterReady() == ERR) {
  791.                 putStatus(msg_prnNotRdy /*"Printer not ready"*/); bell();
  792.             } else
  793.                 outPrinter(0x0c); 
  794.             break;
  795.         case 5: /* PC98 only */
  796.             if (++spacing > 8) spacing = 0;
  797.             sprintf(sprinter[5].string, sp_space, spacing);
  798.             break;
  799.         case END_SETUP: return(END_SETUP);
  800.         }
  801.     }
  802.  
  803. /*
  804. ** keybdDirectory()
  805.  *
  806.  * keyboard set-up directory
  807.  */
  808. struct _menu skey[] = {
  809. /* 0 */{0,  0, " Keyboard Set-Up "},
  810. /* 1 */{0,  2, toNext, "K1"}, 
  811. /* 2 */{17, 2, toDir, "to dir"},
  812. /* 3 */{32, 2, NULL, "K3"},/*click*/
  813. /* 4 */{46, 2, NULL, "K4"},/*ansi*/
  814. /* 5 */{64, 2, NULL, "K5"},/*bs*/
  815. /* 6 */{0,  4, " Remap Keys ", "K6"}, 
  816. /* 7 */{13, 4, " Function Keys ", "K7"},
  817. /* 8 */{29, 4, " SHIFT-Function Keys ", "K8"},
  818. /* 9 */{51, 4, " CTRL-Function keys ", "K9"},
  819. /* 10*/{0,  6, " META-Function keys ", "K10"},
  820. /* 11*/{21, 6, " Normal Cursor Keys ", "K11"},
  821. /* 12*/{42, 6, " Appl. Cursor Keys ", "K12"},
  822. /* 13*/{62, 6, " Appl. Keypad ", "K13"}};
  823. #undef N_MENU
  824. #define N_MENU 13
  825.  
  826. char *sk_click[] = {" No Keyclick ", " Keyclick    "};
  827. char *sk_asckey[] = {" PC9801 Keyboard ", " ANSI Keyboard   "};
  828. char *sk_bsDel[] = {" BS key BS  ", " BS key DEL "};
  829.  
  830. static keybdDirectory()
  831. {
  832.     register int menu;
  833.  
  834.     skey[3].string = sk_click[clickFlag];
  835.     skey[4].string = sk_asckey[asckey];
  836.     skey[5].string = sk_bsDel[bsDel];
  837.  
  838.     putmenu(N_MENU, skey);
  839.     menu = 1;
  840.     for (;;) {
  841.         switch(menu = getmenu(N_MENU, skey, menu)) {
  842.         case 1: return(M_NEXT);
  843.         case 2: return(M_DIRECTORY);
  844.         case 3: skey[3].string = sk_click[clickFlag = !clickFlag]; break;
  845. #ifdef PC98
  846. #ifdef PC98XA
  847.         case 4: onlyThis(); break;
  848. #else
  849.         case 4: /* PC98 only */
  850.             skey[4].string = sk_asckey[asckey = !asckey];
  851.             keyMode(); break;
  852. #endif /* PC98XA */
  853. #else
  854.         case 4: onlyThis(); break;
  855. #endif /* PC98 */
  856.         case 5: skey[5].string = sk_bsDel[bsDel = !bsDel];
  857.             setBSDel(bsDel); break;
  858.         case 6: switch(keyRemapDirectory()) {
  859.             case M_DIRECTORY: return(M_DIRECTORY);
  860.             case M_NEXT: putmenu(N_MENU, skey); menu = 6; break;
  861.             default: return(END_SETUP);
  862.             }
  863.             break;
  864.         case 7: editPFKey(); break;
  865.         case 8: editSPFKey(); break;
  866.         case 9: (void)helpSystem(skey[9].key); break;
  867.         case 10: (void)helpSystem(skey[10].key); break;
  868.         case 11: editCursorKey(); break;
  869.         case 12: editAppCursorKey(); break;
  870.         case 13: editAppKeyPad(); break;
  871.         case END_SETUP: return(END_SETUP);
  872.         }
  873.     }
  874.  
  875. /*
  876. ** keyRemapDirectory()
  877.  *
  878.  * keyboard remap set-up directory
  879.  */
  880. struct _menu sremap[] = {
  881. /* 0 */{0,  0, " Keyboard Map Set-Up ", NULL},
  882. /* 1 */{0,  2, " To Directory ", "to dir"},
  883. /* 2 */{15, 2, " To Keyboard Set-Up ", "k2"},
  884. /* 3 */{36, 2, " Normal-Keys ", "k3"},
  885. /* 4 */{50, 2, " Shift-Keys ", "k4"},
  886. /* 5 */{63, 2, " CTRL-Keys ", "k5"},
  887. /* 6 */{0,  4, " Kana Keys ", "k6"},
  888. /* 7 */{12, 4, " Shift-Kana Keys ", "k7"},
  889. /* 8 */{30, 4, " hterm CTRL-Key Binding ", "k8"},
  890. /* 9 */{55, 4, " Swap keys ", "k9"}};
  891. #undef N_MENU
  892. #define N_MENU 9
  893.  
  894. static keyRemapDirectory()
  895. {
  896.     register int menu;
  897.  
  898.     putmenu(N_MENU, sremap);
  899.     menu = 1;
  900.     for (;;) {
  901.         switch(menu = getmenu(N_MENU, sremap, menu)) {
  902.         case 1: return(M_DIRECTORY);
  903.         case 2: return(M_NEXT);
  904.         case 8: editBinding(); break;
  905. #ifdef PC98
  906.         case 3: editNormalKeys(); break;
  907.         case 4: editShiftKeys(); break;
  908.         case 5: editCtrlKeys(); break;
  909.         case 6: editKanaKeys(); break;
  910.         case 7: editShKanaKeys(); break;
  911.         case 9: editKeySwapTable(); break;
  912. #else
  913.         case 3: case 4: case 5: case 6: case 7:    case 9: 
  914.             sorry();
  915.             break;
  916. #endif
  917.         case END_SETUP: return(END_SETUP);
  918.         }
  919.     }
  920. }
  921.  
  922. /*
  923. ** tabDirectory()
  924.  *
  925.  * tab set-up directory
  926.  */
  927. struct _menu stab[] = {
  928. /* 0 */{0,  0, " Tab Set-Up"},
  929. /* 1 */{0,  2, toNext, "T1"}, 
  930. /* 2 */{17, 2, toDir, "to dir"}, 
  931. /* 3 */{32, 2, " Clear All Tabs ", "T3"}, 
  932. /* 4 */{49, 2, NULL, "T4"},
  933. /* 5 */{0,  4, " Edit Tabs ", "T5"}};
  934. #undef N_MENU
  935. #define N_MENU 5
  936.  
  937. char *tab_ntab[] = {" Set 4 Column Tabs ", " Set 8 Column Tabs "};
  938.  
  939. static tabDirectory()
  940. {
  941.     register int menu;
  942.     static int tabn = 0;
  943.  
  944.     stab[4].string = tab_ntab[tabn];
  945.  
  946.     putmenu(N_MENU, stab);
  947.     menu = 1;
  948.     for (;;) {
  949.         dispTabs();
  950.         switch(menu = getmenu(N_MENU, stab, menu)) {
  951.         case 1: return(M_NEXT);
  952.         case 2: return(M_DIRECTORY);
  953.         case 3:    clearAllTabs(); dispTabs(); break;
  954.         case 4: stab[4].string = tab_ntab[tabn = !tabn];
  955.             setTabs(tabn ? 8 : 4); dispTabs(); break;
  956.         case 5: editTabs(); break;
  957.         case END_SETUP: return(END_SETUP);
  958.         }
  959.     }
  960.  
  961. /*
  962. ** fileXferDirectory()
  963.  *
  964.  * file transfer set-up directory
  965.  */
  966. struct _menu fxfer[] = {
  967. /* 0 */{0,  0, " File Transfer Set-Up"},
  968. /* 1 */{0,  2, toNext, "X1"}, 
  969. /* 2 */{17, 2, toDir, "to dir"},
  970. /* 3 */{32, 2, " Options ", "X3"},
  971. /* 4 */{42, 2, NULL, "X4"}, /* log*/
  972. /* 5 */{61, 2, NULL, "X5"}, /* up*/
  973. /* 6 */{0,  4, " XMODEM Receive ", "X6"}, 
  974. /* 7 */{17, 4, " XMODEM Send ", "X7"},
  975. /* 8 */{31, 4, " Change Directory ", "X8"},
  976. /* 9 */{0,  6, " KERMIT Receive ", "X9"}, 
  977. /* 10*/{17, 6, " KERMIT Send ", "X10"},
  978. /* 11*/{31, 6, " KERMIT Get ", "X11"}, 
  979. /* 12*/{44, 6, " KERMIT Finish ", "X12"}};
  980. #undef N_MENU
  981. #define N_MENU 12
  982.  
  983. char *fx_up[] = {" File Up Load Off ", " File Up Load On  "};
  984. char *fx_log[] = {" Logging Off ", " Logging On  "};
  985.  
  986. static fileXferDirectory()
  987. {
  988.     register int menu;
  989.  
  990.     fxfer[4].string = fx_up[upLoadSave ? 1 : 0];
  991.     fxfer[5].string = fx_log[loggingSave ? 1 : 0];
  992.  
  993.     putmenu(N_MENU, fxfer);
  994.     menu = 1;
  995.     for (;;) {
  996.         switch(menu = getmenu(N_MENU, fxfer, menu)) {
  997.         case 1: return(M_NEXT);
  998.         case 2: return(M_DIRECTORY);
  999.         case 3: switch (xferOptionsDirectory()) {
  1000.             case M_DIRECTORY: return(M_DIRECTORY);
  1001.             case M_NEXT: putmenu(N_MENU, fxfer); menu = 3; break;
  1002.             default: return(END_SETUP);
  1003.             }
  1004.             break;
  1005.         case 4: fxfer[4].string = fx_up[setUpLoad()];
  1006.             break;
  1007.         case 5:    fxfer[5].string = fx_log[setLogging()];
  1008.             break;
  1009. #ifdef XMODEM
  1010.         case 6: xrec(); break;
  1011.         case 7: xsend(); break;
  1012. #else
  1013.         case 6: case 7:
  1014.             putStatus("XMODEM is not configured. Recompile hterm.");
  1015.             break;
  1016. #endif /* XMODEM */
  1017.         case 8: changeDirectory();        /* in file.c    */
  1018.             break;                    
  1019. #ifdef KERMIT
  1020.         case 9: krec(); break;
  1021.         case 10: ksend(); break;
  1022.         case 11: kget(); break;
  1023.         case 12: kfinish(); break;
  1024. #else
  1025.         case 9: case 10: case 11: case 12:
  1026.             putStatus("Kermit is not configured. Recompile hterm.");
  1027.             break;
  1028. #endif /* KERMIT */
  1029.         case END_SETUP: return(END_SETUP);
  1030.         }
  1031.     }
  1032.  
  1033. /*
  1034. ** xferOptionsDirectory()
  1035.  *
  1036.  * file transfer options set-up direcotory
  1037.  */
  1038. struct _menu xsetup[] = {
  1039. /* 0 */{0,  0, " File Xfer Options Set-Up", NULL},
  1040. /* 1 */{0,  2, " To Directory ", "to dir"},
  1041. /* 2 */{15, 2, " To File Xfer ", "x2"},
  1042. /* 3 */{30, 2, NULL, "x3"},/*logtype*/
  1043. /* 4 */{47, 2, NULL, "x4"},/*uptype*/
  1044. /* 5 */{0,  4, NULL, "x5"},/*ftype*/
  1045. /* 6 */{16, 4, NULL, "x6"},/*longp*/
  1046. /* 7 */{31, 4, " Up Load Delay=100 ", "x7"}};/*delay*/
  1047. #undef N_MENU
  1048. #define N_MENU 7
  1049.  
  1050. char *xs_log[] = {" Logging Text   ", " Logging Binary "};
  1051. char *xs_up[] = {" Up Load Text   ", " Up Load Binary "};
  1052. char *xs_xtype[] = {" XMODEM Binary ", " XMODEM Text   "};
  1053. char *xs_longp[] = {" Short Packet ", " Long Packet  "};
  1054. char *xs_delay = " Up Load Delay=%3d ";
  1055.  
  1056. static xferOptionsDirectory()
  1057. {
  1058.     register int menu;
  1059.  
  1060.     xsetup[3].string = xs_log[loggingType-1];
  1061.     xsetup[4].string = xs_up[upLoadType-1];
  1062.     xsetup[5].string = xs_xtype[xmodemType];
  1063.     xsetup[6].string = xs_longp[xmodemLongP];
  1064.     sprintf(xsetup[7].string, xs_delay, upLoadDelay);
  1065.  
  1066.     putmenu(N_MENU, xsetup);
  1067.     menu = 1;
  1068.     for (;;) {
  1069.         switch(menu = getmenu(N_MENU, xsetup, menu)) {
  1070.         case 1: return (M_DIRECTORY);
  1071.         case 2: return (M_NEXT);
  1072.         case 3: loggingType = loggingType == LOG_CONVERT ? LOG_NO_CONVERT : LOG_CONVERT;
  1073.             xsetup[3].string = xs_log[loggingType-1];
  1074.             break;
  1075.         case 4: upLoadType = upLoadType == UP_CONVERT ? UP_NO_CONVERT : UP_CONVERT;
  1076.             xsetup[4].string = xs_up[upLoadType-1];
  1077.             break;
  1078.         case 5: xsetup[5].string = xs_xtype[xmodemType = !xmodemType];
  1079.             break;
  1080.         case 6:    xsetup[6].string = xs_longp[xmodemLongP  = !xmodemLongP];
  1081.             break;
  1082.         case 7: upLoadDelay += 10;
  1083.             if (upLoadDelay >= 80) upLoadDelay = 10;
  1084.             sprintf(xsetup[7].string, xs_delay, upLoadDelay);
  1085.             break;
  1086.         case END_SETUP:
  1087.             return(END_SETUP);
  1088.         }
  1089.     }
  1090. }
  1091.  
  1092. /*
  1093.  *
  1094.  * setup utilities and goodies
  1095.  *
  1096.  */
  1097.  
  1098. /*
  1099. ** static void putmenu(register int num, register struct _menu *p)
  1100.  *
  1101.  * display set-up direcotry menu
  1102.  */
  1103. static void putmenu(num, p)
  1104. register int num;
  1105. register struct _menu *p;
  1106. {
  1107.     if (first)
  1108.         showHelp = YES;
  1109.     else if (showHelp)
  1110.         clearCopyright();
  1111.     normalMode();
  1112.     clearLine(SETUP_LINE, BOTTOM_LINE_25_MODE);
  1113.     locate(p->x, (p->y)+SETUP_LINE);
  1114.     conPrint(p->string);
  1115.     p++; num--;
  1116.     reverseMode();
  1117.     while (num-- >= 0) {
  1118.         locate(p->x, (p->y)+SETUP_LINE);
  1119.         conPrint(p->string);
  1120.         p++;
  1121.     }
  1122.     normalMode();
  1123. }
  1124.  
  1125. /*
  1126. ** static getmenu(int num, register struct _menu p[], register int menu)
  1127.  *
  1128.  * return a selected item from menu
  1129.  */
  1130. static int getmenu(num, p, menu)
  1131. int num;
  1132. register struct _menu p[];
  1133. register int menu;
  1134. {
  1135.     int oldmenu;
  1136.     char i, j, k;
  1137.     u_short key;
  1138.  
  1139.     oldmenu = menu;
  1140. #ifdef J3100
  1141.     normalMode();
  1142.     locate(p[menu].x, p[menu].y+SETUP_LINE);
  1143. #else
  1144.     if (softFont)
  1145.         normalMode();
  1146.     else
  1147.         conPrint("\x1b[0;7;5;1m");
  1148.     locate(p[menu].x, p[menu].y+SETUP_LINE);
  1149. #endif /* J3100 */
  1150.     conPrint(p[menu].string);
  1151.     normalMode();
  1152.     for (;;) {
  1153.         oldmenu = menu;
  1154.         while ((int)(key = keyin()) == (-1)) {
  1155.             ;
  1156. #ifdef TIMER_TEST /* timer test facility for debug */
  1157. sprintf(tmpBuf, "%d  ", timerValue);
  1158. locate(0,24);
  1159. conPrint(tmpBuf);
  1160. #endif /* TIMER_TEST */
  1161.         }
  1162.         if ((key & 0xff) == 0x0d)
  1163.             return(menu);
  1164.         if (showHelp) {
  1165.             clearCopyright();
  1166.             showHelp = NO;
  1167.         }
  1168.         clearStatus();
  1169.         if (key == HOME_KEY || key == bindTab[C_TOL]) {
  1170.             menu = 1;
  1171.         } else if (key == END_KEY || key == bindTab[C_EOL]) {
  1172.             menu = num;
  1173.         } else if (key == LEFT_KEY || key == bindTab[C_BDEL] ||
  1174.             key == 'h' || key == DEL || key == bindTab[C_LEFT]) {
  1175.                 if (--menu <= 0) menu = num; 
  1176.         } else if (key == UP_KEY || key == 'k' || key == bindTab[C_UP]) {
  1177.             if (p[menu].y != 2) {
  1178.                 for (i = 0; i <= menu; i++)
  1179.                     if (p[menu].y - 2 == p[i].y)
  1180.                         break;    /* i = upper line first item */
  1181.                 for (j = i; j <= menu; j++)
  1182.                     if (p[menu].y == p[j].y)
  1183.                         break;    /* j = same line first item */
  1184.                 menu = (menu - j > j - 1) ? (j - 1) : (i + menu - j);
  1185.             }
  1186.         } else if (key == DOWN_KEY || key == 'j' || key == bindTab[C_DOWN]) {
  1187.             for (i = 0; i <= menu; i++)
  1188.                 if (p[menu].y == p[i].y)
  1189.                     break;    /* i = same line first item */
  1190.             for (j = i; j < num + 1; j++)
  1191.                 if (p[menu].y + 2 == p[j].y)
  1192.                     break;    /* j = lower line first item */
  1193.             if (j == num + 1)
  1194.                 ;    /* menu is lowest line */
  1195.             else {
  1196.                 for (k = j; k < (num + 1) && (p[menu].y+2) == p[k].y; k++)
  1197.                     ;
  1198.                 --k;            /* k = lower line last item */
  1199.                 menu = (menu - i + j >= k) ? k : (j + menu - i);
  1200.             }
  1201.         } else if (key == RIGHT_KEY || key == SPACE || key == 9 ||
  1202.             key == 'l' || key == bindTab[C_RIGHT]) {
  1203.             if (++menu > num) menu = 1;
  1204.         } else if (key == SETUP_KEY || key == META_PF9) {    /* exit set-up    */
  1205.             return(END_SETUP);
  1206.         } else if (key == STOP_KEY || key == META_PF10) {    /* exit hterm    */
  1207.             termination(); 
  1208.         } else if (key == ESC || key == bindTab[C_ESC]) {    /* escape    */
  1209.             if (p != smainmenu)
  1210.                 return(2);    /* to M_DIRECTORY */
  1211.             else
  1212.                 return(END_SETUP);    /* exit set-up    */
  1213.         } else if (key == '?' || key == HELP_KEY) {            /* help        */
  1214.             (void)helpSystem(p[menu].key);
  1215.         } else {
  1216.             bell();
  1217.         }
  1218.         reverseMode();
  1219.         locate(p[oldmenu].x, p[oldmenu].y+SETUP_LINE);
  1220.         conPrint(p[oldmenu].string);
  1221. #ifdef J3100
  1222.         normalMode();
  1223.         locate(p[menu].x, p[menu].y+SETUP_LINE);
  1224. #else
  1225.         if (softFont)
  1226.             normalMode();
  1227.         else
  1228.             conPrint("\x1b[0;7;5;1m");
  1229.         locate(p[menu].x, p[menu].y+SETUP_LINE);
  1230. #endif /* J3100 */
  1231.         conPrint(p[menu].string);
  1232.         normalMode();
  1233.     }
  1234. }
  1235. #else
  1236. char *sge_lineMode[] = {" 24 line mode ", " 25 line mode ", 
  1237.             " 19 line mode ", " 20 line mode "};
  1238. char *sc_baud = " Baud Rate = %5u ";
  1239. char *sc_par[] = {" 8 Bits, No Parity    ", " 8 Bits, Even Parity  ",
  1240. " 7 Bits, No Parity    ", " 7 Bits, Even Parity  ", " 7 Bits, Space Parity "};
  1241. #endif /* SETUP */
  1242.