home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 6 / FM Towns Free Software Collection 6.iso / t_os / helper / source / file.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-07-08  |  46.9 KB  |  2,047 lines

  1. #include    <stdio.h>
  2. #include    <stdlib.h>
  3. #include    <stdarg.h>
  4. #include    <string.h>
  5. #include    <ctype.h>
  6. #include    <mos.h>
  7. #include    "dir.h"
  8. #include    "scrn.h"
  9. #include    "keyword.h"
  10. #include    "graphic.h"
  11. #include    "event.h"
  12. #include    "coldef.h"
  13. #include    "bitmap.h"
  14.  
  15. #define    TRUE    1
  16. #define    FALSE    0
  17. #define    ERR    (-1)
  18.  
  19. #define    LIN_MAX        80
  20. #define    TAB        8
  21. #define    LPT_LINE    59
  22.  
  23. #define    PAGE        0x40000
  24.  
  25. #define    MAX_Y        25
  26. #define    SCRN_Y        52
  27.  
  28. #define    SCRN_X1        0
  29. #define    SCRN_Y1        47
  30. #define    SCRN_X2        639
  31. #define    SCRN_Y2        454
  32.  
  33. #define    BAR_SIZ        (25*8)
  34. #define    BAR_X1        8
  35. #define    BAR_Y1        458
  36. #define    BAR_X2        (BAR_X1+BAR_SIZ+4)
  37. #define    BAR_Y2        (BAR_Y1+19)
  38.  
  39. #define    KAKU_X1        (15*8-4)
  40. #define    KAKU_Y1        180
  41. #define    KAKU_X2        (64*8+3)
  42. #define    KAKU_Y2        280
  43.  
  44. #define    KAKU_MSG_X    ((KAKU_X1+KAKU_X2)/2)
  45. #define    KAKU_MSG_Y    (KAKU_Y1+30)
  46.  
  47. #define    KAKU_CHK_X    ((KAKU_X1+KAKU_X2)/2-(4*8))
  48. #define    KAKU_CHK_Y    (KAKU_Y1+70)
  49.  
  50. #define    KAKU_YES_X    ((KAKU_X1+KAKU_X2)/2-(10*8))
  51. #define    KAKU_YES_Y    (KAKU_Y1+70)
  52.  
  53. #define    KAKU_NO_X    ((KAKU_X1+KAKU_X2)/2+(2*8))
  54. #define    KAKU_NO_Y    (KAKU_Y1+70)
  55.  
  56. #define    BREAK_X1    (13*8-4)
  57. #define    BREAK_Y1    160
  58. #define    BREAK_X2    (66*8+3)
  59. #define    BREAK_Y2    300
  60.  
  61. #define    BREAK_MSG_X    ((BREAK_X1+BREAK_X2)/2)
  62. #define    BREAK_MSG_Y    (BREAK_Y1+30)
  63.  
  64. #define    BREAK_BAR_SIZ    (41*8)
  65. #define    BREAK_BAR_X    (BREAK_X1+6*8)
  66. #define    BREAK_BAR_Y    (BREAK_Y1+70)
  67.  
  68. #define    BREAK_BAR_X1    (BREAK_BAR_X-2)
  69. #define    BREAK_BAR_Y1    (BREAK_BAR_Y-2)
  70. #define    BREAK_BAR_X2    (BREAK_BAR_X+BREAK_BAR_SIZ+2)
  71. #define    BREAK_BAR_Y2    (BREAK_BAR_Y+17)
  72.  
  73. #define    BREAK_CHK_X    ((BREAK_X1+BREAK_X2)/2-(4*8))
  74. #define    BREAK_CHK_Y    (BREAK_Y1+110)
  75.  
  76. typedef struct _LP {
  77.     struct _LP    *next;
  78.     struct _LP    *back;
  79.     char        buf[1];
  80. } LINPTR;
  81.  
  82. void    INKEY_start(void);
  83. void    INKEY_end(void);
  84. int    getch(void);
  85. int    CLIP_box();
  86.  
  87. extern int    cur_x;
  88. extern int    cur_y;
  89.  
  90.        int      cut_mode = FALSE;
  91.        char     cut_buf[2][128];
  92.  
  93. static int    old_line=(-1);
  94. static int    now_line=0;
  95. static int    max_line=0;
  96. static int    now_ofs=0;
  97. static int    slow_ofs=0;
  98. static int    tik_speed=100;
  99. static int    scr_speed=16;
  100. static int    pas_flg=FALSE;
  101. static int    bar_old_x1=(-1);
  102. static int    bar_old_x2=(-1);
  103. static LINPTR    *top_ptr=NULL;
  104. static LINPTR    *now_ptr=NULL;
  105. static BLOCK    *save=NULL;
  106. static char    file_name[128];
  107. static int    break_bar=0;
  108. static BLOCK    *break_save=NULL;
  109. static EVENT    *break_ep=NULL;
  110.  
  111. int    pause(char *form,...)
  112. {
  113.     va_list arg;
  114.     int     n,x1,x2;
  115.     int     cd,sw,bx,by;
  116.     BLOCK   *sp;
  117.     EVENT   *ep=NULL;
  118.     char    tmp[256];
  119.  
  120.     va_start(arg,form);
  121.     vsprintf((char *)tmp,form,arg);
  122.     va_end(arg);
  123.  
  124.     if ( (n = (strlen(tmp) * 8 + 32) / 2) < 160 )
  125.     n = 160;
  126.     x1 = (KAKU_X1 + KAKU_X2) / 2 - n;
  127.     x2 = (KAKU_X1 + KAKU_X2) / 2 + n;
  128.  
  129.     MOS_disp(OFF);
  130.     sp = DSP_push_vram(x1,KAKU_Y1,x2,KAKU_Y2);
  131.     DSP_opbox(x1,KAKU_Y1,x2,KAKU_Y2);
  132.     DSP_wbox(x1,KAKU_Y1,x2,KAKU_Y2,LINE_COL,FILD_COL,M_PSET);
  133.     gputs(KAKU_MSG_X-strlen(tmp)*4,KAKU_MSG_Y,CHR_COL,FILD_COL,tmp);
  134.  
  135. /*******
  136.     ep = EVT_sw(ep,0,KAKU_YES_X,KAKU_YES_Y,CHR_COL,WIND_COL,"CONTINUE");
  137.     ep = EVT_sw(ep,1,KAKU_NO_X,KAKU_NO_Y,CHR_COL,WIND_COL,  " CANCEL ");
  138. ********/
  139.     ep = EVT_img(ep,0,KAKU_YES_X,KAKU_YES_Y,CHR_COL,WIND_COL,64,continue_img);
  140.     ep = EVT_img(ep,1,KAKU_NO_X,KAKU_NO_Y,CHR_COL,WIND_COL,  64,cancel_img);
  141.  
  142.     MOS_rdpos(&sw,&bx,&by);
  143.     MOS_setpos((KAKU_X1+KAKU_X2)/2,KAKU_YES_Y+8);
  144.     MOS_disp(ON);
  145.  
  146.     cd = (EVT_wait(ep) == 0 ? TRUE:ERR);
  147.     EVT_free(ep);
  148.  
  149.     MOS_disp(OFF);
  150.     DSP_pop_vram(sp);
  151.     DSP_clbox(x1,KAKU_Y1,x2,KAKU_Y2);
  152.     MOS_setpos(bx,by);
  153.     MOS_disp(ON);
  154.  
  155.     return cd;
  156. }
  157. int    yesno2(char *form,...)
  158. {
  159.     va_list arg;
  160.     int     n,x1,x2;
  161.     int     cd,sw,bx,by;
  162.     BLOCK   *sp;
  163.     EVENT   *ep=NULL;
  164.     char    tmp[256];
  165.  
  166.     va_start(arg,form);
  167.     vsprintf((char *)tmp,form,arg);
  168.     va_end(arg);
  169.  
  170.     if ( (n = (strlen(tmp) * 8 + 32) / 2) < 160 )
  171.     n = 160;
  172.     x1 = (KAKU_X1 + KAKU_X2) / 2 - n;
  173.     x2 = (KAKU_X1 + KAKU_X2) / 2 + n;
  174.  
  175.     MOS_disp(OFF);
  176.     sp = DSP_push_vram(x1,KAKU_Y1,x2,KAKU_Y2);
  177.     DSP_opbox(x1,KAKU_Y1,x2,KAKU_Y2);
  178.     DSP_wbox(x1,KAKU_Y1,x2,KAKU_Y2,LINE_COL,FILD_COL,M_PSET);
  179.     gputs(KAKU_MSG_X-strlen(tmp)*4,KAKU_MSG_Y,CHR_COL,FILD_COL,tmp);
  180.  
  181. /*********
  182.     ep = EVT_sw(ep,0,KAKU_YES_X,KAKU_YES_Y,CHR_COL,WIND_COL,"  YES  ");
  183.     ep = EVT_sw(ep,1,KAKU_NO_X,KAKU_NO_Y,CHR_COL,WIND_COL,  "   NO  ");
  184. **********/
  185.     ep = EVT_img(ep,0,KAKU_YES_X,KAKU_YES_Y,CHR_COL,WIND_COL,64,yes_img);
  186.     ep = EVT_img(ep,1,KAKU_NO_X,KAKU_NO_Y,CHR_COL,WIND_COL,  64,no_img);
  187.  
  188.     MOS_rdpos(&sw,&bx,&by);
  189.     MOS_setpos((KAKU_X1+KAKU_X2)/2,KAKU_YES_Y+8);
  190.     MOS_disp(ON);
  191.  
  192.     cd = (EVT_wait(ep) == 0 ? TRUE:ERR);
  193.     EVT_free(ep);
  194.  
  195.     MOS_disp(OFF);
  196.     DSP_pop_vram(sp);
  197.     DSP_clbox(x1,KAKU_Y1,x2,KAKU_Y2);
  198.     MOS_setpos(bx,by);
  199.     MOS_disp(ON);
  200.  
  201.     return cd;
  202. }
  203. int    yesno(char *form,...)
  204. {
  205.     va_list arg;
  206.     int     n,x1,x2;
  207.     int     cd,sw,bx,by;
  208.     BLOCK   *sp;
  209.     EVENT   *ep=NULL;
  210.     char    tmp[256];
  211.  
  212.     va_start(arg,form);
  213.     vsprintf((char *)tmp,form,arg);
  214.     va_end(arg);
  215.  
  216.     if ( (n = (strlen(tmp) * 8 + 32) / 2) < 160 )
  217.     n = 160;
  218.     x1 = (KAKU_X1 + KAKU_X2) / 2 - n;
  219.     x2 = (KAKU_X1 + KAKU_X2) / 2 + n;
  220.  
  221.     MOS_disp(OFF);
  222.     sp = DSP_push_vram(x1,KAKU_Y1,x2,KAKU_Y2);
  223.     DSP_opbox(x1,KAKU_Y1,x2,KAKU_Y2);
  224.     DSP_wbox(x1,KAKU_Y1,x2,KAKU_Y2,LINE_COL,FILD_COL,M_PSET);
  225.     gputs(KAKU_MSG_X-strlen(tmp)*4,KAKU_MSG_Y,CHR_COL,FILD_COL,tmp);
  226.  
  227. /***********
  228.     ep = EVT_sw(ep,0,KAKU_YES_X,KAKU_YES_Y,CHR_COL,WIND_COL,"  YES  ");
  229.     ep = EVT_sw(ep,1,KAKU_NO_X,KAKU_NO_Y,CHR_COL,WIND_COL,  "   NO  ");
  230. ***********/
  231.     ep = EVT_img(ep,0,KAKU_YES_X,KAKU_YES_Y,CHR_COL,WIND_COL,64,yes_img);
  232.     ep = EVT_img(ep,1,KAKU_NO_X,KAKU_NO_Y,CHR_COL,WIND_COL,  64,no_img);
  233.  
  234.     MOS_rdpos(&sw,&bx,&by);
  235.     MOS_setpos((KAKU_X1+KAKU_X2)/2,KAKU_YES_Y+8);
  236.     MOS_disp(ON);
  237.  
  238.     cd = (EVT_wait(ep) == 0 ? TRUE:ERR);
  239.     EVT_free(ep);
  240.  
  241.     MOS_disp(OFF);
  242.     DSP_pop_vram(sp);
  243.     DSP_clbox(x1,KAKU_Y1,x2,KAKU_Y2);
  244.     MOS_setpos(bx,by);
  245.     MOS_disp(ON);
  246.  
  247.     return cd;
  248. }
  249. void    kakunin(char *form,...)
  250. {
  251.     va_list arg;
  252.     int     n,x1,x2;
  253.     int     sw,bx,by;
  254.     BLOCK   *sp;
  255.     EVENT   *ep=NULL;
  256.     char    tmp[256];
  257.  
  258.     va_start(arg,form);
  259.     vsprintf((char *)tmp,form,arg);
  260.     va_end(arg);
  261.  
  262.     if ( (n = (strlen(tmp) * 8 + 32) / 2) < 160 )
  263.     n = 160;
  264.     x1 = (KAKU_X1 + KAKU_X2) / 2 - n;
  265.     x2 = (KAKU_X1 + KAKU_X2) / 2 + n;
  266.  
  267.     MOS_disp(OFF);
  268.     sp = DSP_push_vram(x1,KAKU_Y1,x2,KAKU_Y2);
  269.     DSP_opbox(x1,KAKU_Y1,x2,KAKU_Y2);
  270.     DSP_wbox(x1,KAKU_Y1,x2,KAKU_Y2,ERR_COL,FILD_COL,M_PSET);
  271.     gputs(KAKU_MSG_X-strlen(tmp)*4,KAKU_MSG_Y,ERR_COL,FILD_COL,tmp);
  272.  
  273. /******
  274.     ep = EVT_sw(ep,0,KAKU_CHK_X,KAKU_CHK_Y,ERR_COL,WIND_COL," CHECK ");
  275. *******/
  276.     ep = EVT_img(ep,0,KAKU_CHK_X,KAKU_CHK_Y,ERR_COL,WIND_COL,64,check_img);
  277.  
  278.     MOS_rdpos(&sw,&bx,&by);
  279.     MOS_setpos((KAKU_X1+KAKU_X2)/2,KAKU_CHK_Y+8);
  280.     MOS_disp(ON);
  281.  
  282.     EVT_wait(ep);
  283.     EVT_free(ep);
  284.  
  285.     MOS_disp(OFF);
  286.     DSP_pop_vram(sp);
  287.     DSP_clbox(x1,KAKU_Y1,x2,KAKU_Y2);
  288.     MOS_setpos(bx,by);
  289.     MOS_disp(ON);
  290. }
  291. void    BREAK_open(char *form,...)
  292. {
  293.     va_list arg;
  294.     char    tmp[256];
  295.  
  296.     va_start(arg,form);
  297.     vsprintf((char *)tmp,form,arg);
  298.     va_end(arg);
  299.  
  300.     MOS_disp(OFF);
  301.     break_save = DSP_push_vram(BREAK_X1,BREAK_Y1,BREAK_X2,BREAK_Y2);
  302.     DSP_opbox(BREAK_X1,BREAK_Y1,BREAK_X2,BREAK_Y2);
  303.     DSP_wbox(BREAK_X1,BREAK_Y1,BREAK_X2,BREAK_Y2,
  304.                     LINE_COL,FILD_COL,M_PSET);
  305.     DSP_rbox(BREAK_BAR_X1,BREAK_BAR_Y1,BREAK_BAR_X2,BREAK_BAR_Y2,
  306.                     LINE_COL,WIND_COL,M_PSET);
  307.     gputs(BREAK_MSG_X-strlen(tmp)*4,BREAK_MSG_Y,
  308.                     CHR_COL,FILD_COL,tmp);
  309. /*******
  310.     break_ep = EVT_sw(NULL,0,BREAK_CHK_X,BREAK_CHK_Y,
  311.                     CHR_COL,WIND_COL," ABORT ");
  312. *******/
  313.     break_ep = EVT_img(NULL,0,BREAK_CHK_X,BREAK_CHK_Y,
  314.                     CHR_COL,WIND_COL,64,abort_img);
  315.  
  316.     DSP_mos(2);
  317.     MOS_disp(ON);
  318.  
  319.     break_bar = (-1);
  320.     EVT_msg_no = ERR;
  321. }
  322. int    BREAK_chk(int max,int pos)
  323. {
  324.     int     n;
  325.  
  326.     if ( (n = (max > 0 ? (BREAK_BAR_SIZ * pos / max):0)) != break_bar ) {
  327.     MOS_disp(OFF);
  328.     DSP_box(BREAK_BAR_X,BREAK_BAR_Y,
  329.         BREAK_BAR_X+n,BREAK_BAR_Y+15,7,M_PSET);
  330.     MOS_disp(ON);
  331.     break_bar = n;
  332.     }
  333.  
  334.     EVT_loop(break_ep);
  335.  
  336.     return (EVT_msg_no == 0 ? TRUE:FALSE);
  337. }
  338. void    BREAK_close(void)
  339. {
  340.     EVT_free(break_ep); break_ep = NULL;
  341.     MOS_disp(OFF);
  342.     DSP_pop_vram(break_save);
  343.     DSP_clbox(BREAK_X1,BREAK_Y1,BREAK_X2,BREAK_Y2);
  344.     DSP_mos(0);
  345.     MOS_disp(ON);
  346. }
  347. static LINPTR  *get_ptr(str)
  348. char    *str;
  349. {
  350.     register LINPTR *lp;
  351.  
  352.     if ( (lp = (LINPTR *)malloc(strlen(str)+sizeof(LINPTR))) != NULL ) {
  353.         lp->next = lp->back = NULL;
  354.     strcpy(lp->buf,str);
  355.     }
  356.     return lp;
  357. }
  358. static LINPTR  *read_line(fp)
  359. FILE    *fp;
  360. {
  361.     int     i,j,ch;
  362.     char    tmp[LIN_MAX + 1];
  363.  
  364.     for ( i = 0 ; i < LIN_MAX ; ) {
  365.         if ( (ch = getc(fp)) == EOF || ch == '\n' )
  366.             break;
  367.     if ( iskanji(ch) ) {
  368.             if ( i == (LIN_MAX - 1) ) {
  369.                 ungetc(ch,fp);
  370.         break;
  371.             }
  372.         tmp[i++] = ch;
  373.             if ( (ch = getc(fp)) == EOF ) {
  374.                 i--;
  375.                 break;
  376.             }
  377.             tmp[i++] = ch;
  378.         } else if ( ch == '\t' ) {
  379.         j = TAB - (i % TAB);
  380.         while ( i < LIN_MAX && j-- > 0 )
  381.         tmp[i++] = ' ';
  382.     } else
  383.         tmp[i++] = ch;
  384.     }
  385.     tmp[i] = '\0';
  386.  
  387.     if ( tmp[0] == '\0' && feof(fp) )
  388.     return NULL;
  389.  
  390.     return get_ptr(tmp);
  391. }
  392. static LINPTR    *read_file(file)
  393. char    *file;
  394. {
  395.     FILE    *fp;
  396.     LINPTR  *lp;
  397.     LINPTR  tp;
  398.     char    *p;
  399.  
  400.     file_name[0] = '\0';
  401.  
  402.     if ( file == NULL || (fp = fopen(file,"r")) == NULL )
  403.     return NULL;
  404.  
  405.     strcpy(file_name,file);
  406.     if ( (p = strrchr(file_name,'\\')) != NULL )
  407.     *p = '\0';
  408.  
  409.     lp = &tp;
  410.     while ( (lp->next = read_line(fp)) != NULL ) {
  411.     lp->next->back = lp;
  412.     lp = lp->next;
  413.     max_line++;
  414.     }
  415.  
  416.     fclose(fp);
  417.     if ( tp.next != NULL )
  418.     tp.next->back = NULL;
  419.     return tp.next;
  420. }
  421. static void    free_file(LINPTR *tp)
  422. {
  423.     LINPTR *lp;
  424.  
  425.     while ( tp != NULL ) {
  426.     lp = tp->next;
  427.     free(tp);
  428.     tp = lp;
  429.     }
  430. }
  431. static void    scrool_bar_disp(void)
  432. {
  433.     int     x1,x2,s;
  434.  
  435.     if ( (s = max_line - now_line) > MAX_Y )
  436.     s = MAX_Y;
  437.  
  438.     if ( bar_old_x1 == (-1) )
  439.     DSP_rbox(BAR_X1,BAR_Y1,BAR_X2,BAR_Y2,LINE_COL,PRG_COL,M_PSET);
  440.     else
  441.     DSP_box(bar_old_x1,BAR_Y1+2,bar_old_x2,BAR_Y2-2,PRG_COL,M_PSET);
  442.  
  443.     if ( max_line > 0 ) {
  444.         x1 = BAR_X1 + 2 + BAR_SIZ * now_line / max_line;
  445.         x2 = BAR_X1 + 2 + BAR_SIZ * (now_line + s) / max_line;
  446.     DSP_box(x1,BAR_Y1+2,x2,BAR_Y2-2,XPRG_COL,M_PSET);
  447.     bar_old_x1 = x1;
  448.     bar_old_x2 = x2;
  449.     }
  450.  
  451.     MENU_mask(BACK_NO,now_line > 0 ? ON:OFF);
  452.     MENU_mask(NEXT_NO,(now_line + MAX_Y) < max_line ? ON:OFF);
  453. }
  454. static void    FILE_disp(int line)
  455. {
  456.     int     i;
  457.     LINPTR  *tp;
  458.  
  459.     while ( line > now_line && now_ptr != NULL && now_ptr->next != NULL ) {
  460.     now_line++;
  461.     now_ptr = now_ptr->next;
  462.     }
  463.     while ( line < now_line && now_ptr != NULL && now_ptr->back != NULL ) {
  464.     now_line--;
  465.     now_ptr = now_ptr->back;
  466.     }
  467.  
  468.     if ( old_line == now_line )
  469.     return;
  470.     old_line = now_line;
  471.  
  472.     MOS_disp(OFF);
  473.     now_ofs += slow_ofs; now_ofs &= 511;
  474.     slow_ofs = 0;
  475.     DSP_offset(1,0,(now_ofs - SCRN_Y)&511);
  476.     tp = now_ptr;
  477.     for ( i = 0 ; i < MAX_Y ; i++ ) {
  478.     if ( tp != NULL ) {
  479.         putstr(tp->buf,PAGE,(i*16+now_ofs)&511);
  480.         tp = tp->next;
  481.     } else
  482.         putstr("",PAGE,(i*16+now_ofs)&511);
  483.     }
  484.     scrool_bar_disp();
  485.     MOS_disp(ON);
  486. }
  487. void    FILE_open(char *file)
  488. {
  489.     MOS_disp(OFF);
  490.     if ( save == NULL )
  491.     save = DSP_push_vram(SCRN_X1,SCRN_Y1,SCRN_X2,479);
  492.     DSP_rbox(SCRN_X1,SCRN_Y1,SCRN_X2,SCRN_Y2,LINE_COL,SCRN_COL,M_PSET);
  493.     gputs(240,220,MENU_COL,SCRN_COL,"Now Loading......");
  494.     DSP_mos(2);
  495.     MOS_disp(ON);
  496.  
  497.     free_file(top_ptr);
  498.     bar_old_x1 = bar_old_x2 = old_line = (-1);
  499.     max_line = now_line = 0;
  500.     scr_speed = 16;
  501.     slow_ofs = now_ofs = 0;
  502.     top_ptr = now_ptr = read_file(file);
  503.     cut_buf[0][0] = cut_buf[1][0] = '\0';
  504.     FILE_disp(now_line);
  505.  
  506.     MOS_disp(OFF);
  507.     DSP_offset(1,0,(now_ofs - SCRN_Y)&511);
  508.     DSP_box(0,SCRN_Y,639,SCRN_Y+MAX_Y*16-1,0,M_PSET);
  509.     gprintf(49*8,460,XPRG_COL,PRG_COL,"%-30.30s",file_name);
  510.     DSP_mos(0);
  511.     MOS_disp(ON);
  512.     MENU_mask(PRNT_NO,top_ptr == NULL ? OFF:ON);
  513. }
  514. void    FILE_close(void)
  515. {
  516.     free_file(top_ptr);
  517.     top_ptr = now_ptr = NULL;
  518.     MOS_disp(OFF);
  519.     DSP_pop_vram(save);
  520.     DSP_clear(1);
  521.     MOS_disp(ON);
  522.     save = NULL;
  523. }
  524. void    FILE_back(void)
  525. {
  526.     if ( top_ptr == NULL || now_line <= 0 )
  527.     return;
  528.     FILE_disp(now_line - MAX_Y);
  529. }
  530. void    FILE_next(void)
  531. {
  532.     if ( top_ptr == NULL || (now_line + MAX_Y) >= max_line )
  533.     return;
  534.     FILE_disp(now_line + MAX_Y);
  535. }
  536. static void    FILE_one_up(void)
  537. {
  538.     int     i;
  539.     LINPTR  *tp;
  540.  
  541.     if ( (now_line + MAX_Y) > max_line ||
  542.      now_ptr == NULL || now_ptr->next == NULL )
  543.     return;
  544.  
  545.     now_line++;
  546.     old_line++;
  547.     tp = now_ptr = now_ptr->next;
  548.     for ( i = 1 ; tp != NULL && i < MAX_Y ; i++ )
  549.     tp = tp->next;
  550.  
  551.     MOS_disp(OFF);
  552.     putstr((tp == NULL ? "":tp->buf),PAGE,(MAX_Y*16+now_ofs+slow_ofs)&511);
  553.     slow_ofs += 16;
  554.     pas_flg = TRUE;
  555.     scrool_bar_disp();
  556.     MOS_disp(ON);
  557. }
  558. static void    FILE_one_down(void)
  559. {
  560.     if ( now_ptr == NULL || now_ptr->back == NULL )
  561.     return;
  562.  
  563.     now_line--;
  564.     old_line--;
  565.     now_ptr = now_ptr->back;
  566.  
  567.     MOS_disp(OFF);
  568.     putstr(now_ptr->buf,PAGE,(now_ofs+slow_ofs-16)&511);
  569.     slow_ofs -= 16;
  570.     pas_flg = TRUE;
  571.     scrool_bar_disp();
  572.     MOS_disp(ON);
  573. }
  574. static void    OFS_cont(void)
  575. {
  576.     int     n;
  577.  
  578.     if ( slow_ofs > 0 ) {
  579.     n = (slow_ofs > scr_speed ? scr_speed:slow_ofs);
  580.     now_ofs += n; now_ofs &= 511;
  581.     DSP_offset(1,0,(now_ofs - SCRN_Y)&511);
  582.     if ( (slow_ofs -= n) <= 0 && pas_flg != FALSE )
  583.         FILE_one_up();
  584.  
  585.     } else if ( slow_ofs < 0 ) {
  586.     n = (-slow_ofs > scr_speed ? scr_speed:-slow_ofs);
  587.     now_ofs -= n; now_ofs &= 511;
  588.     DSP_offset(1,0,(now_ofs - SCRN_Y)&511);
  589.     if ( (slow_ofs += n) >= 0 && pas_flg != FALSE )
  590.         FILE_one_down();
  591.     }
  592. }
  593. void    FILE_irq(void)
  594. {
  595.     int     i,rc,fg,sw,x,y,sx,sy;
  596.  
  597.     if ( top_ptr == NULL )
  598.     return;
  599.  
  600.     if ( tick_timer >= tik_speed ) {
  601.     tick_timer = 0;
  602.         OFS_cont();
  603.     }
  604.  
  605.     MOS_rdpos(&sw,&x,&y);
  606.     if ( sw == 0 )
  607.     return;
  608.  
  609.     fg = rc = FALSE;
  610.  
  611.     if ( y >= SCRN_Y1 && y <= SCRN_Y2 ) {
  612.     DSP_mos(1);
  613.     do {
  614.         MOS_rdpos(&sw,&sx,&sy);
  615.  
  616.         if ( cut_mode != FALSE && y >= SCRN_Y && sw != 0 &&
  617.          ((sx - x) >= 16 || fg != FALSE) ) {
  618.         rc = CLIP_box(sw == 1 ? 0:1,
  619.                   x / 8,(y - SCRN_Y) / 16,(sx - x) / 8);
  620.         if ( rc != FALSE )
  621.             fg = TRUE;
  622.         }
  623.  
  624.         if ( fg == FALSE ) {
  625.             if ( (i = (sy - y) / 4) < 0 ) {
  626.             i = (y - sy) / 4;
  627.             scr_speed = ((tik_speed = 16 - i) < 0 ? 16:1);
  628.                 if ( slow_ofs <= 0 )
  629.                 FILE_one_up();
  630.             } else if ( i > 0 ) {
  631.             scr_speed = ((tik_speed = 16 - i) < 0 ? 16:1);
  632.                 if ( slow_ofs >= 0 )
  633.                     FILE_one_down();
  634.             } else
  635.             pas_flg = FALSE;
  636.         }
  637.  
  638.         if ( tick_timer >= tik_speed ) {
  639.         tick_timer = 0;
  640.             OFS_cont();
  641.         }
  642.     } while ( sw != 0 );
  643.     DSP_mos(0);
  644.  
  645.     } else if ( x >= BAR_X1 && x <= BAR_X2 &&
  646.          y >= BAR_Y1 && y <= BAR_Y2 ) {
  647.     DSP_mos(1);
  648.     MOS_horizon(BAR_X1,BAR_X2);
  649.     MOS_vertical(BAR_Y1,BAR_Y2-8);
  650.     do {
  651.         FILE_disp((x - BAR_X1) * max_line / BAR_SIZ);
  652.         MOS_rdpos(&sw,&x,&y);
  653.     } while ( sw != 0 );
  654.     MOS_horizon(0,632);
  655.     MOS_vertical(0,470);
  656.     DSP_mos(0);
  657.     }
  658. }
  659. /****************************
  660. static int    LPT_putc(char ch,FILE *fp)
  661. {
  662.     for ( ; ; ) {
  663.     putc(ch,fp);
  664.     if ( !ferror(fp) )
  665.         break;
  666.     if ( pause("プリンタ出力にエラ-が発生しました!") == ERR )
  667.         return ERR;
  668.     clearerr(fp);
  669.     }
  670.     return FALSE;
  671. }
  672. void    FILE_lpt(void)
  673. {
  674.     int     n,ln;
  675.     LINPTR  *lp;
  676.     FILE    *fp;
  677.     char    *p;
  678.  
  679.     if ( top_ptr == NULL )
  680.     return;
  681.  
  682.     if ( yesno("表示している文書をプリンタに出力しますか?") == ERR )
  683.     return;
  684.  
  685.     if ( (fp = fopen("PRN","w")) == NULL ) {
  686.     kakunin("プリンタ出力がオ-プン出来ません");
  687.     return;
  688.     }
  689.  
  690.     BREAK_open("プリンタに出力しています ちょっと待ってね");
  691.  
  692.     n = ln = 0;
  693.     for ( lp = top_ptr ; lp != NULL ; lp = lp->next ) {
  694.     for ( p = lp->buf ; *p != '\0' ; p++ ) {
  695.         if ( LPT_putc(*p,fp) )
  696.         goto ENDOF;
  697.     }
  698.     if ( LPT_putc('\r',fp) || LPT_putc('\n',fp) )
  699.         goto ENDOF;
  700.     if ( ++ln >= LPT_LINE ) {
  701.         if ( LPT_putc('\x0C',fp) )
  702.         goto ENDOF;
  703.         ln = 0;
  704.     }
  705.     if ( BREAK_chk(max_line,++n) )
  706.         break;
  707.     }
  708.     if ( ln > 0 )
  709.     LPT_putc('\x0C',fp);
  710.  
  711. ENDOF:
  712.     fclose(fp);
  713.     BREAK_close();
  714. }
  715. *****************************************/
  716.  
  717. void    FILE_lpt(void)
  718. {
  719.     int     n;
  720.     LINPTR  *lp;
  721.  
  722.     if ( top_ptr == NULL )
  723.     return;
  724.  
  725.     if ( yesno("Are You Sure ?") == ERR )
  726.     return;
  727.  
  728.     if ( LPT_open() == ERR )
  729.     return;
  730.  
  731.     BREAK_open("Working.....");
  732.  
  733.     n = 0;
  734.     for ( lp = top_ptr ; lp != NULL ; lp = lp->next ) {
  735.     if ( PRN_puts(lp->buf) )
  736.         goto ENDOF;
  737.     if ( BREAK_chk(max_line,++n) )
  738.         break;
  739.     }
  740.     PRN_close();
  741.  
  742. ENDOF:
  743.     BREAK_close();
  744. }
  745.  
  746. int    iskan(char *p)
  747. {
  748.     if ( iskanji(*p) && iskanji2(*(p+1)) )
  749.     return TRUE;
  750.     else
  751.     return FALSE;
  752. }
  753. int    kan_pos(char *p,int n)
  754. {
  755.     int     i;
  756.  
  757.     for ( i = n ; i > 0 ; ) {
  758.     if ( *p == '\0' ) {
  759.         return (n - i);
  760.  
  761.     } else if ( iskan(p) ) {
  762.         i -= 2;
  763.         p += 2;
  764.  
  765.     } else {
  766.         i--;
  767.         p++;
  768.     }
  769.     }
  770.     return (n + i);
  771. }
  772.  
  773. int    input(int x,int y,int max,char *str)
  774. {
  775.     int     i,n,ch,cd;
  776.     int     ofs=0,len=0,pos=0;
  777.     BLOCK   *sp;
  778.     char    *p;
  779.     char    tmp[128];
  780.  
  781.     INKEY_start();
  782.     pos = len = strlen(str);
  783.  
  784.     memset(tmp,' ',max);
  785.     tmp[max] = '\0';
  786.     gputs(x,y,CHR_COL,WIND_COL,tmp);
  787.  
  788.     for ( ch = 0 ; ; ) {
  789.     ofs = 0;
  790.     n = pos;
  791.     while ( n >= (max - 4) ) {
  792.         ofs += (max / 2);
  793.         ofs = kan_pos(str,ofs);
  794.         n = pos - ofs;
  795.     }
  796.  
  797.     if ( (i = len - ofs) >= max )
  798.         i = kan_pos(str,ofs+max) - ofs;
  799.  
  800.     strncpy(tmp,&(str[ofs]),i);
  801.     tmp[i] = '\0';
  802.  
  803.         sp = DSP_push_vram(x,y,x+(i+3)*8,y+15);
  804.         gputs(x,y,CHR_COL,WIND_COL,tmp);
  805.     DSP_box(x+n*8,y+14,x+n*8+7,y+15,13,M_XOR);
  806.  
  807.     cur_x = x + n * 8;
  808.     cur_y = y;
  809.  
  810.     while ( (ch = getch()) == EOF );
  811.  
  812.     do {
  813.  
  814.         if ( ch == 0x08 && pos > 0 ) {
  815.         pos = kan_pos(str,pos-1);
  816.         p = &(str[pos]);
  817.         n = (iskan(p) ? 2:1);
  818.         strcpy(p,p+n);
  819.         len -= n;
  820.  
  821.         } else if ( ch == 0x7F ) {
  822.         if ( pos < len ) {
  823.             p = &(str[pos]);
  824.             n = (iskan(p) ? 2:1);
  825.             strcpy(p,p+n);
  826.             len -= n;
  827.         }
  828.  
  829.         } else if ( ch == 0x1C ) {
  830.         if ( pos < len )
  831.             pos += (iskan(&(str[pos])) ? 2:1);
  832.  
  833.         } else if ( ch == 0x1D ) {
  834.         if ( pos > 0 )
  835.             pos = kan_pos(str,pos-1);
  836.  
  837.         } else if ( ch >= ' ' && len < 80 ) {
  838.         if ( pos < len ) {
  839.             p = &(str[len]);
  840.             for ( i = len - pos ; i > 0 ; i--,p-- )
  841.             *p = *(p-1);
  842.         }
  843.         str[pos++] = ch;
  844.         len++;
  845.  
  846.         } else if ( ch == 0x0D ) {
  847.         cd = FALSE;
  848.         goto ENDOF;
  849.         } else if ( ch == 0x1B ) {
  850.         cd = ERR;
  851.         goto ENDOF;
  852.         }
  853.  
  854.     } while ( (ch = getch()) != EOF );
  855.  
  856.         DSP_pop_vram(sp);
  857.     }
  858.  
  859. ENDOF:
  860.     DSP_pop_vram(sp);
  861.     str[len] = '\0';
  862.     INKEY_end();
  863.     if ( (i = len) >= max )
  864.      i = kan_pos(str,max);
  865.     strncpy(tmp,&(str[ofs]),i);
  866.     tmp[i] = '\0';
  867.     gputs(x,y,CHR_COL,WIND_COL,tmp);
  868.  
  869.     return cd;
  870. }
  871. int    CLIP_box(box,cx,cy,len)
  872. int    box,cx,cy,len;
  873. {
  874.     int     i,n;
  875.     int     cut_x1,cut_y1,cut_x2,cut_y2;
  876.     LINPTR  *tp;
  877.  
  878.     tp = now_ptr;
  879.     for ( i = 0 ; tp != NULL && i < cy ; i++ )
  880.         tp = tp->next;
  881.  
  882.     if ( tp == NULL )
  883.     return FALSE;
  884.  
  885.     for ( i = 0 ; tp->buf[i] != '\0' && i < cx ; i++ ) {
  886.     if ( iskan(&(tp->buf[i])) ) {
  887.         if ( (i + 1) >= cx )
  888.         break;
  889.         i++;
  890.     }
  891.     }
  892.     cx = i;
  893.  
  894.     for ( n = 0 ; tp->buf[i] != '\0' && n < len ; ) {
  895.     if ( iskan(&(tp->buf[i])) ) {
  896.         cut_buf[box][n++] = tp->buf[i++];
  897.         cut_buf[box][n++] = tp->buf[i++];
  898.     } else {
  899.         cut_buf[box][n++] = tp->buf[i++];
  900.     }
  901.     }
  902.     cut_buf[box][n] = '\0';
  903.  
  904.     if ( (len = n) == 0 )
  905.     return FALSE;
  906.  
  907.     MOS_disp(OFF);
  908.     DSP_page(1);
  909.     cut_x1 = cx * 8;
  910.     cut_y1 = (cy * 16 + now_ofs + slow_ofs) & 511;
  911.     cut_x2 = (cx + len) * 8 - 1;
  912.     cut_y2 = (cy * 16 + 15 + now_ofs + slow_ofs) & 511;
  913.     DSP_vsync();
  914.     DSP_box(cut_x1,cut_y1,cut_x2,cut_y2,8,M_XOR);
  915.     DSP_vsync();
  916.     DSP_box(cut_x1,cut_y1,cut_x2,cut_y2,8,M_XOR);
  917.     DSP_page(0);
  918.     MOS_disp(ON);
  919.  
  920.     return TRUE;
  921. }
  922. /********************************************************************
  923.  
  924.     COPY Funcsion
  925.  
  926. *********************************************************************/
  927.  
  928. static int    dir_make(char *file)
  929. {
  930.     char    *p;
  931.  
  932.     if ( (p = strchr(file,'\\')) != NULL ) {
  933.     *p = '\0';
  934.     if ( chdir(file) ) {
  935.         if ( mkdir(file) ) {
  936.         kakunin("ディレクトリの作成に失敗しました");
  937.         return ERR;
  938.         } else if ( chdir(file) ) {
  939.         kakunin("ディレクトリの移動に失敗しました");
  940.         return ERR;
  941.         }
  942.     }
  943.     *p = '\\';
  944.     dir_make(p+1);
  945.     chdir("..");
  946.     }
  947.     return FALSE;
  948. }
  949. static int    copy(char *src,char *dis)
  950. {
  951.     int     cd,i,n;
  952.     long    fs;
  953.     FILE    *ifp,*ofp;
  954.     char    *p;
  955.     char    tmp[4096];
  956.  
  957.     if ( (ifp = fopen(dis,"rb")) != NULL ) {
  958.     fclose(ifp);
  959.     if ( yesno("%sが存在しますコピ-を行いますか?",dis) == ERR )
  960.         return TRUE;
  961.     }
  962.  
  963.     if ( dir_make(dis) == ERR )
  964.     return ERR;
  965.  
  966.     if ( (ifp = fopen(src,"rb")) == NULL ) {
  967.     kakunin("%sファイルがオ-プンできません",src);
  968.     return ERR;
  969.     }
  970.  
  971.     if ( (ofp = fopen(dis,"wb")) == NULL ) {
  972.     fclose(ifp);
  973.     kakunin("%sファイルがオ-プンできません",dis);
  974.     return ERR;
  975.     }
  976.  
  977.     cd = FALSE;
  978.     n = 0;
  979.     fseek(ifp,0L,SEEK_END);
  980.     fs = ftell(ifp);
  981.     rewind(ifp);
  982.  
  983.     if ( (p = strrchr(dis,'\\')) != NULL )
  984.     p++;
  985.     else
  986.     p = dis;
  987.     BREAK_open("Making a copy %s", dis);
  988.     while ( (i = fread(tmp,1,4096,ifp)) > 0 ) {
  989.     fwrite(tmp,1,i,ofp);
  990.     n += i;
  991.     if ( ferror(ifp) || ferror(ofp) ) {
  992.         kakunin("ファイルコピ-にエラ-が発生しました");
  993.         cd = ERR;
  994.         break;
  995.     }
  996.     if ( BREAK_chk(fs,n) ) {
  997.         cd = ERR;
  998.         break;
  999.     }
  1000.     }
  1001.     fclose(ifp);
  1002.     fclose(ofp);
  1003.     if ( cd == ERR )
  1004.     remove(dis);
  1005.     BREAK_close();
  1006.  
  1007.     return cd;
  1008. }
  1009. static    int    cmds_xcopy(char *home,char *src,char *dis)
  1010. {
  1011.     int     n;
  1012.     int     cd;
  1013.     int     wd=FALSE;
  1014.     DIR     *dirp;
  1015.     DIRECT  *dp;
  1016.     char    *p;
  1017.     char    tmp[128];
  1018.     char    dmy[128];
  1019.  
  1020.     if ( src == NULL || *src == '\0' )
  1021.     src = "*.*";
  1022.  
  1023.     if ( src[1] != ':' && home != NULL ) {
  1024.     strcpy(tmp,home);
  1025.     joint_path(tmp,src);
  1026.     } else
  1027.     strcpy(tmp,src);
  1028.  
  1029.     for ( p = tmp ; *p != '\0' ; p++ );
  1030.  
  1031.     if ( strchr(tmp,'*') != NULL || strchr(tmp,'?') )
  1032.     wd = TRUE;
  1033.     else if ( (p != tmp && *(p-1) == '\\') || isdir(tmp) ) {
  1034.     joint_path(tmp,"*.*");
  1035.     wd = TRUE;
  1036.     }
  1037.  
  1038.     DSP_mos(2);
  1039.     dirp = opendir(tmp);
  1040.     DSP_mos(0);
  1041.  
  1042.     if ( dirp == NULL ) {
  1043.     kakunin("%sファイルが見当たりません",tmp);
  1044.     return ERR;
  1045.     }
  1046.  
  1047.     if ( (src = strrchr(tmp,'\\')) != NULL ||
  1048.      (src = strrchr(tmp,':')) != NULL )
  1049.     src++;
  1050.     else
  1051.     src = tmp;
  1052.  
  1053.     if ( dis == NULL )
  1054.     dis = "";
  1055.  
  1056.     strcpy(dmy,dis);
  1057.  
  1058.     for ( n = 0 ; dmy[n] != '\0' ; n++ );
  1059.     if ( n == 0 || dmy[n-1] == '\\' || dmy[n-1] == ':' )
  1060.      wd = TRUE;
  1061.  
  1062.     if ( wd != FALSE ) {
  1063.     for ( n = 0 ; dmy[n] != '\0' ; n++ );
  1064.     if ( n > 0 && dmy[n-1] != '\\' && dmy[n-1] != ':' )
  1065.         strcat(dmy,"\\");
  1066.     dis = dmy;
  1067.     while ( *dis != '\0' ) dis++;
  1068.     }
  1069.  
  1070.     while ( (dp = readdir(dirp)) != NULL ) {
  1071.     if ( !IS_DIR(dp) ) {
  1072.  
  1073.         strcpy(src,dp->d_name);
  1074.  
  1075.         if ( wd != FALSE )
  1076.         strcpy(dis,dp->d_name);
  1077.  
  1078.         while ( (cd = copy(tmp,dmy)) == ERR ) {
  1079.         if ( pause("コピ-を続行しますか?") == ERR )
  1080.             goto ENDOF;
  1081.         }
  1082.     } else if ( strcmp(dp->d_name,".") != 0 &&
  1083.             strcmp(dp->d_name,"..") != 0 ) {
  1084.         strcpy(src,dp->d_name);
  1085.         if ( wd != FALSE )
  1086.         strcpy(dis,dp->d_name);
  1087.         if ( cmds_xcopy(home,tmp,dmy) ) {
  1088.         if ( pause("コピ-を続行しますか?") == ERR )
  1089.             goto ENDOF;
  1090.         }
  1091.     }
  1092.     }
  1093.  
  1094. ENDOF:
  1095.     closedir(dirp);
  1096.     return (cd == ERR ? ERR:FALSE);
  1097. }
  1098. static    int    cmds_copy(char *home,char *src,char *dis)
  1099. {
  1100.     int     n;
  1101.     int     cd;
  1102.     int     wd=FALSE;
  1103.     DIR     *dirp;
  1104.     DIRECT  *dp;
  1105.     char    *p;
  1106.     char    tmp[128];
  1107.     char    dmy[128];
  1108.  
  1109.     if ( src == NULL || *src == '\0' )
  1110.     src = "*.*";
  1111.  
  1112.     if ( src[1] != ':' && home != NULL ) {
  1113.     strcpy(tmp,home);
  1114.     joint_path(tmp,src);
  1115.     } else
  1116.     strcpy(tmp,src);
  1117.  
  1118.     for ( p = tmp ; *p != '\0' ; p++ );
  1119.  
  1120.     if ( strchr(tmp,'*') != NULL || strchr(tmp,'?') )
  1121.     wd = TRUE;
  1122.     else if ( (p != tmp && *(p-1) == '\\') || isdir(tmp) ) {
  1123.     joint_path(tmp,"*.*");
  1124.     wd = TRUE;
  1125.     }
  1126.  
  1127.     DSP_mos(2);
  1128.     dirp = opendir(tmp);
  1129.     DSP_mos(0);
  1130.  
  1131.     if ( dirp == NULL ) {
  1132.     kakunin("%sファイルが見当たりません",tmp);
  1133.     return ERR;
  1134.     }
  1135.  
  1136.     if ( (src = strrchr(tmp,'\\')) != NULL ||
  1137.      (src = strrchr(tmp,':')) != NULL )
  1138.     src++;
  1139.     else
  1140.     src = tmp;
  1141.  
  1142.     if ( dis == NULL )
  1143.     dis = "";
  1144.  
  1145.     strcpy(dmy,dis);
  1146.  
  1147.     for ( n = 0 ; dmy[n] != '\0' ; n++ );
  1148.     if ( n == 0 || dmy[n-1] == '\\' || dmy[n-1] == ':' )
  1149.      wd = TRUE;
  1150.  
  1151.     if ( wd != FALSE ) {
  1152.     for ( n = 0 ; dmy[n] != '\0' ; n++ );
  1153.     if ( n > 0 && dmy[n-1] != '\\' && dmy[n-1] != ':' )
  1154.         strcat(dmy,"\\");
  1155.     dis = dmy;
  1156.     while ( *dis != '\0' ) dis++;
  1157.     }
  1158.  
  1159.     while ( (dp = readdir(dirp)) != NULL ) {
  1160.     if ( !IS_DIR(dp) ) {
  1161.  
  1162.         strcpy(src,dp->d_name);
  1163.  
  1164.         if ( wd != FALSE )
  1165.         strcpy(dis,dp->d_name);
  1166.  
  1167.         while ( (cd = copy(tmp,dmy)) == ERR ) {
  1168.         if ( pause("コピ-を続行しますか?") == ERR )
  1169.             goto ENDOF;
  1170.         }
  1171.     }
  1172.     }
  1173.  
  1174. ENDOF:
  1175.     closedir(dirp);
  1176.     return (cd == ERR ? ERR:FALSE);
  1177. }
  1178. static    int    cmds_rename(char *src,char *dis)
  1179. {
  1180.     if ( src[0] != '\0' && src[1] == ':' ) {
  1181.     kakunin("絶対パスでのファイル名変更はできません");
  1182.     return ERR;
  1183.     }
  1184.  
  1185.     if ( rename(src,dis) ) {
  1186.     kakunin("ファイル名の変更ができませんでした");
  1187.     return ERR;
  1188.     }
  1189.     return FALSE;
  1190. }
  1191. static    int    cmds_mkdir(char *dir)
  1192. {
  1193.     if ( dir[0] != '\0' && dir[1] == ':' ) {
  1194.     kakunin("絶対パスでのディレクトリ作成はできません");
  1195.     return ERR;
  1196.     }
  1197.  
  1198.     if ( mkdir(dir) ) {
  1199.     kakunin("ディレクトリの作成ができませんでした");
  1200.     return ERR;
  1201.     }
  1202.     return FALSE;
  1203. }
  1204. static    int    cmds_chdir(char *dir)
  1205. {
  1206.     if ( dir[0] != '\0' && dir[1] == ':' ) {
  1207.     kakunin("絶対パスでのディレクトリ移動はできません");
  1208.     return ERR;
  1209.     }
  1210.  
  1211.     if ( chdir(dir) ) {
  1212.     kakunin("ディレクトリの移動ができませんでした");
  1213.     return ERR;
  1214.     }
  1215.     return FALSE;
  1216. }
  1217. static    int    cmdstr(char *src,char *ptn)
  1218. {
  1219.     while ( *ptn != '\0' ) {
  1220.     if ( toupper(*src) != *ptn )
  1221.         return FALSE;
  1222.     src++;
  1223.     ptn++;
  1224.     }
  1225.     if ( *src == '\0' || isspace(*src) )
  1226.     return TRUE;
  1227.     else
  1228.     return FALSE;
  1229. }
  1230.  
  1231. #define    ST_EOF        0
  1232. #define    ST_ELSE        1
  1233. #define    ST_ENDIF    2
  1234.  
  1235. static    char    cmds_dmy[BUFSIZ];
  1236. static    char    cmds_home[BUFSIZ];
  1237.  
  1238. static    int    cmds_line(LINPTR **fp,int rc)
  1239. {
  1240.     int     n;
  1241.     char    *p;
  1242.     char    *s;
  1243.     char    *r;
  1244.  
  1245.     while ( (*fp)->next != NULL ) {
  1246.     (*fp) = (*fp)->next;
  1247.     p = (*fp)->buf;
  1248.  
  1249.     while ( isspace(*p) ) p++;
  1250.  
  1251.     if ( *p == '\0' || *p == '#' )
  1252.         continue;
  1253.  
  1254.     if ( cmdstr(p,"IF") ) {
  1255.         if ( rc == FALSE ) {
  1256.         while ( (n = cmds_line(fp,FALSE)) == ST_ELSE );
  1257.         if ( n == ST_EOF )
  1258.             break;
  1259.  
  1260.         continue;
  1261.         }
  1262.  
  1263.         while ( !isspace(*p) && *p != '\0' ) p++;
  1264.         while ( isspace(*p) ) p++;
  1265.         if ( yesno2(p) == ERR ) {    /* else */
  1266.         if ( (n = cmds_line(fp,FALSE)) == ST_ELSE )
  1267.            n = cmds_line(fp,TRUE);
  1268.  
  1269.         } else {            /* then */
  1270.         if ( (n = cmds_line(fp,TRUE)) == ST_ELSE )
  1271.            n = cmds_line(fp,FALSE);
  1272.         }
  1273.         if ( n == ST_EOF )
  1274.         break;
  1275.  
  1276.         continue;
  1277.  
  1278.     } else if ( cmdstr(p,"ELSE") ) {
  1279.         return ST_ELSE;
  1280.  
  1281.     } else if ( cmdstr(p,"ENDIF") ) {
  1282.         return ST_ENDIF;
  1283.     }
  1284.  
  1285.     if ( rc == FALSE )
  1286.         continue;
  1287.  
  1288.     if ( cmdstr(p,"XCOPY") ) {
  1289.         while ( !isspace(*p) && *p != '\0' ) p++;
  1290.         while ( isspace(*p) ) p++;
  1291.         s = p;
  1292.         while ( !isspace(*p) && *p != '\0' ) p++;
  1293.         if ( *p != '\0' ) *(p++) = '\0';
  1294.         while ( isspace(*p) ) p++;
  1295.         r = p;
  1296.         while ( !isspace(*r) && *r != '\0' ) r++;
  1297.         *r = '\0';
  1298.         if ( cmds_xcopy(cmds_home,s,p) )
  1299.         break;
  1300.  
  1301.     } else if ( cmdstr(p,"COPY") ) {
  1302.         while ( !isspace(*p) && *p != '\0' ) p++;
  1303.         while ( isspace(*p) ) p++;
  1304.         s = p;
  1305.         while ( !isspace(*p) && *p != '\0' ) p++;
  1306.         if ( *p != '\0' ) *(p++) = '\0';
  1307.         while ( isspace(*p) ) p++;
  1308.         r = p;
  1309.         while ( !isspace(*r) && *r != '\0' ) r++;
  1310.         *r = '\0';
  1311.         if ( cmds_copy(cmds_home,s,p) )
  1312.         break;
  1313.  
  1314.     } else if ( cmdstr(p,"RENAME") ) {
  1315.         while ( !isspace(*p) && *p != '\0' ) p++;
  1316.         while ( isspace(*p) ) p++;
  1317.         s = p;
  1318.         while ( !isspace(*p) && *p != '\0' ) p++;
  1319.         if ( *p != '\0' ) *(p++) = '\0';
  1320.         while ( isspace(*p) ) p++;
  1321.         r = p;
  1322.         while ( !isspace(*r) && *r != '\0' ) r++;
  1323.         *r = '\0';
  1324.         if ( cmds_rename(s,p) )
  1325.         break;
  1326.  
  1327.     } else if ( cmdstr(p,"MKDIR") ) {
  1328.         while ( !isspace(*p) && *p != '\0' ) p++;
  1329.         while ( isspace(*p) ) p++;
  1330.         r = p;
  1331.         while ( !isspace(*r) && *r != '\0' ) r++;
  1332.         *r = '\0';
  1333.         if ( cmds_mkdir(p) )
  1334.         break;
  1335.  
  1336.     } else if ( cmdstr(p,"CHDIR") ) {
  1337.         while ( !isspace(*p) && *p != '\0' ) p++;
  1338.         while ( isspace(*p) ) p++;
  1339.         r = p;
  1340.         while ( !isspace(*r) && *r != '\0' ) r++;
  1341.         *r = '\0';
  1342.         if ( cmds_chdir(p) )
  1343.         break;
  1344.  
  1345.     } else if ( cmdstr(p,"PAUSE") ) {
  1346.         while ( !isspace(*p) && *p != '\0' ) p++;
  1347.         while ( isspace(*p) ) p++;
  1348.         if ( pause(p) == ERR )
  1349.         break;
  1350.  
  1351.     } else if ( cmdstr(p,"INST") ) {
  1352.         while ( !isspace(*p) && *p != '\0' ) p++;
  1353.         while ( isspace(*p) ) p++;
  1354.         r = p;
  1355.         while ( !isspace(*r) && *r != '\0' ) r++;
  1356.         *r = '\0';
  1357.         strcpy(cmds_dmy,cmds_home);
  1358.         joint_path(cmds_dmy,p);
  1359.         if ( CMDS_file(cmds_dmy) )
  1360.         break;
  1361.  
  1362.     } else if ( cmdstr(p,"LOOK") ) {
  1363.         while ( !isspace(*p) && *p != '\0' ) p++;
  1364.         while ( isspace(*p) ) p++;
  1365.         r = p;
  1366.         while ( !isspace(*r) && *r != '\0' ) r++;
  1367.         *r = '\0';
  1368.         strcpy(cmds_dmy,cmds_home);
  1369.         joint_path(cmds_dmy,p);
  1370.         if ( !JOKE_run(cmds_dmy) )
  1371.         break;
  1372.  
  1373.     } else if ( cmdstr(p,"PLAY") ) {
  1374.         while ( !isspace(*p) && *p != '\0' ) p++;
  1375.         while ( isspace(*p) ) p++;
  1376.         r = p;
  1377.         while ( !isspace(*r) && *r != '\0' ) r++;
  1378.         *r = '\0';
  1379.         if ( cmdstr(p,"STOP") ) {
  1380.         END_eup();
  1381.         } else {
  1382.             strcpy(cmds_dmy,cmds_home);
  1383.             joint_path(cmds_dmy,p);
  1384.             PLAY_eup(cmds_dmy);
  1385.         }
  1386.  
  1387.     } else if ( cmdstr(p,"PUSH") ) {
  1388.         SCRN_saver(1);
  1389.  
  1390.     } else if ( cmdstr(p,"POP") ) {
  1391.         SCRN_saver(0);
  1392.  
  1393.     } else if ( cmdstr(p,"EXIT") ) {
  1394.         break;
  1395.  
  1396.     }
  1397.     }
  1398.  
  1399.     return ST_EOF;
  1400. }
  1401. int    CMDS_file(char *file)
  1402. {
  1403.     int     n;
  1404.     LINPTR  tp;
  1405.     LINPTR  *fp;
  1406.     char    *p;
  1407.     char    home[BUFSIZ];
  1408.  
  1409.     n = max_line;
  1410.     if ( (tp.next = read_file(file)) == NULL ) {
  1411.     kakunin("'%s'コマンドが見当たりません",file);
  1412.     return ERR;
  1413.     }
  1414.     max_line = n;
  1415.  
  1416.     strcpy(home,cmds_home);
  1417.     strcpy(cmds_home,file);
  1418.     if ( (p = strrchr(cmds_home,'\\')) == NULL )
  1419.     p = cmds_home;
  1420.     *p = '\0';
  1421.  
  1422.     fp = &tp;
  1423.     cmds_line(&fp,TRUE);
  1424.  
  1425.     strcpy(cmds_home,home);
  1426.     free_file(tp.next);
  1427.     return FALSE;
  1428. }
  1429. static int    wcopy(char *wild)
  1430. {
  1431.     int     cd;
  1432.     DIR     *dirp;
  1433.     DIRECT  *dp;
  1434.     char    *p;
  1435.     char    *src,*dis;
  1436.     char    tmp[128];
  1437.  
  1438.     if ( (p = strrchr(wild,'\\')) == NULL )
  1439.     p = wild;
  1440.  
  1441.     if ( (p = strrchr(p,'.')) != NULL && strcmp(p,".QQQ") == 0 )
  1442.     return CMDS_file(wild);
  1443.  
  1444.     DSP_mos(2);
  1445.     dirp = opendir(wild);
  1446.     DSP_mos(0);
  1447.  
  1448.     if ( dirp == NULL )
  1449.     return TRUE;
  1450.  
  1451.     strcpy(tmp,wild);
  1452.     if ( (p = strrchr(tmp,'\\')) != NULL )
  1453.     p++;
  1454.     else
  1455.     p = tmp;
  1456.  
  1457.     while ( (dp = readdir(dirp)) != NULL ) {
  1458.     if ( !IS_DIR(dp) ) {
  1459.  
  1460.         strcpy(p,dp->d_name);
  1461.         src = tmp;
  1462.         dis = dp->d_name;
  1463.  
  1464.         while ( (cd = copy(src,dis)) == ERR ) {
  1465.         if ( yesno("コピ-を続行しますか?") == ERR )
  1466.             goto ENDOF;
  1467.         }
  1468.  
  1469.     } else if ( dp->d_name[0] != '.' ) {
  1470.         if ( yesno("%sディレクトリもコピ-しますか?",dp->d_name) == ERR )
  1471.         continue;
  1472.         if ( mkdir(dp->d_name) )
  1473.         kakunin("サブディレクトリの作成に失敗しました");
  1474.         else if ( chdir(dp->d_name) )
  1475.         kakunin("サブディレクトリへの移動に失敗しました");
  1476.         else {
  1477.         strcpy(p,dp->d_name);
  1478.         strcat(tmp, "\\*.*");
  1479.         if ( (cd = wcopy(tmp)) == ERR )
  1480.             goto ENDOF;
  1481.         chdir("..");
  1482.         }
  1483.     }
  1484.     }
  1485.  
  1486. ENDOF:
  1487.     closedir(dirp);
  1488.     return cd;
  1489. }
  1490.  
  1491. #define    CHDIR_X1    (11*8-4)
  1492. #define    CHDIR_Y1    150
  1493. #define    CHDIR_X2    (68*8+3)
  1494. #define    CHDIR_Y2    340
  1495.  
  1496. #define    CHDIR_MSG_X    ((CHDIR_X1+CHDIR_X2)/2)
  1497. #define    CHDIR_MSG_Y    (CHDIR_Y1+30)
  1498.  
  1499. #define    CHDIR_TTL_X    (CHDIR_X1+3*8)
  1500.  
  1501. #define    CHDIR_BACK_X    (CHDIR_X1+17*8)
  1502. #define    CHDIR_BACK_Y    (CHDIR_Y1+70)
  1503.  
  1504. #define    CHDIR_BACK_X1    (CHDIR_BACK_X-4)
  1505. #define    CHDIR_BACK_Y1    (CHDIR_BACK_Y-9)
  1506. #define    CHDIR_BACK_X2    (CHDIR_BACK_X+2*8+4)
  1507. #define    CHDIR_BACK_Y2    (CHDIR_BACK_Y1+33)
  1508.  
  1509. #define    CHDIR_DRIV_X    (CHDIR_X1+20*8)
  1510. #define    CHDIR_DRIV_Y    (CHDIR_Y1+61)
  1511.  
  1512. #define    CHDIR_DRIV_X1    (CHDIR_DRIV_X)
  1513. #define    CHDIR_DRIV_Y1    (CHDIR_DRIV_Y)
  1514. #define    CHDIR_DRIV_X2    (CHDIR_DRIV_X+33)
  1515. #define    CHDIR_DRIV_Y2    (CHDIR_DRIV_Y+33)
  1516.  
  1517. #define    CHDIR_NEXT_X    (CHDIR_X1+25*8+2)
  1518. #define    CHDIR_NEXT_Y    (CHDIR_Y1+70)
  1519.  
  1520. #define    CHDIR_NEXT_X1    (CHDIR_NEXT_X-4)
  1521. #define    CHDIR_NEXT_Y1    (CHDIR_NEXT_Y-9)
  1522. #define    CHDIR_NEXT_X2    (CHDIR_NEXT_X+2*8+4)
  1523. #define    CHDIR_NEXT_Y2    (CHDIR_NEXT_Y1+33)
  1524.  
  1525. #define    CHDIR_DIR_X    (CHDIR_X1+17*8)
  1526. #define    CHDIR_DIR_Y    (CHDIR_Y1+110)
  1527.  
  1528. #define    CHDIR_YES_X    ((CHDIR_X1+CHDIR_X2)/2-(10*8))
  1529. #define    CHDIR_YES_Y    (CHDIR_Y1+150)
  1530.  
  1531. #define    CHDIR_NO_X    ((CHDIR_X1+CHDIR_X2)/2+(2*8))
  1532. #define    CHDIR_NO_Y    (CHDIR_Y1+150)
  1533.  
  1534. void    COPY_all(int argc,char *argv[])
  1535. {
  1536.     int     now,fg;
  1537.     int     cd,sw,bx,by;
  1538.     BLOCK   *sp;
  1539.     EVENT   *ep=NULL;
  1540.     char    *p,*s;
  1541.     char    tmp[256];
  1542.  
  1543.     if ( yesno("Are You Sure ?") == ERR )
  1544.     return;
  1545.  
  1546.     MOS_disp(OFF);
  1547.     sp = DSP_push_vram(CHDIR_X1,CHDIR_Y1,CHDIR_X2,CHDIR_Y2);
  1548.     DSP_opbox(CHDIR_X1,CHDIR_Y1,CHDIR_X2,CHDIR_Y2);
  1549.     DSP_wbox(CHDIR_X1,CHDIR_Y1,CHDIR_X2,CHDIR_Y2,LINE_COL,FILD_COL,M_PSET);
  1550.  
  1551. /*******
  1552.     strcpy(tmp,"DRIVE & DIRECTORY SELECT");
  1553.     gputs(CHDIR_MSG_X-strlen(tmp)*4,CHDIR_MSG_Y,CHR_COL,FILD_COL,tmp);
  1554.     gputs(CHDIR_TTL_X,CHDIR_BACK_Y,CHR_COL,FILD_COL,"DRIVE");
  1555.     gputs(CHDIR_TTL_X,CHDIR_DIR_Y,CHR_COL,FILD_COL,"DIRECTORY");
  1556. ********/
  1557.  
  1558.     DSP_strimg(drive_select_img,
  1559.     CHDIR_MSG_X-86,CHDIR_MSG_Y+3,CHR_COL,FILD_COL,M_PSET);
  1560.     DSP_strimg(drive_img,
  1561.     CHDIR_TTL_X,CHDIR_BACK_Y+3,CHR_COL,FILD_COL,M_PSET);
  1562.     DSP_strimg(directory_img,
  1563.     CHDIR_TTL_X,CHDIR_DIR_Y+3,CHR_COL,FILD_COL,M_PSET);
  1564.  
  1565.     now = getdrv();
  1566.     DSP_wbox(CHDIR_BACK_X1,CHDIR_BACK_Y1,
  1567.          CHDIR_BACK_X2,CHDIR_BACK_Y2,LINE_COL,WIND_COL,M_PSET);
  1568.     gputs(CHDIR_BACK_X,CHDIR_BACK_Y,CHR_COL,WIND_COL,"<");
  1569.     ep = EVT_set(ep,1,CHDIR_BACK_X1,CHDIR_BACK_Y1,
  1570.               CHDIR_BACK_X2,CHDIR_BACK_Y2,EVT_proc);
  1571.  
  1572.     ep = EVT_set(ep,2,CHDIR_DRIV_X1,CHDIR_DRIV_Y1,
  1573.               CHDIR_DRIV_X2,CHDIR_DRIV_Y2,EVT_proc);
  1574.  
  1575.     DSP_wbox(CHDIR_NEXT_X1,CHDIR_NEXT_Y1,
  1576.          CHDIR_NEXT_X2,CHDIR_NEXT_Y2,LINE_COL,WIND_COL,M_PSET);
  1577.     gputs(CHDIR_NEXT_X,CHDIR_NEXT_Y,CHR_COL,WIND_COL,">");
  1578.     ep = EVT_set(ep,3,CHDIR_NEXT_X1,CHDIR_NEXT_Y1,
  1579.               CHDIR_NEXT_X2,CHDIR_NEXT_Y2,EVT_proc);
  1580.  
  1581.     sprintf(tmp,"%-34.34s","?");
  1582.     ep = EVT_sw(ep,4,CHDIR_DIR_X,CHDIR_DIR_Y,CHR_COL,WIND_COL,tmp);
  1583.  
  1584. /***************
  1585.     ep = EVT_sw(ep,5,CHDIR_YES_X,CHDIR_YES_Y,CHR_COL,WIND_COL,"   OK   ");
  1586.     ep = EVT_sw(ep,6,CHDIR_NO_X,CHDIR_NO_Y,CHR_COL,WIND_COL,  " CANCEL ");
  1587. ****************/
  1588.     ep = EVT_img(ep,5,CHDIR_YES_X,CHDIR_YES_Y,CHR_COL,WIND_COL,64,ok_img);
  1589.     ep = EVT_img(ep,6,CHDIR_NO_X,CHDIR_NO_Y,CHR_COL,WIND_COL,  64,cancel_img);
  1590.  
  1591.     ICON_disp(CHDIR_DRIV_X,CHDIR_DRIV_Y,now);
  1592.  
  1593.     MOS_rdpos(&sw,&bx,&by);
  1594.     MOS_setpos((CHDIR_X1+CHDIR_X2)/2,(CHDIR_Y1+CHDIR_Y2)/2);
  1595.     MOS_disp(ON);
  1596.  
  1597.     tmp[0] = '\0';
  1598.     for ( cd = FALSE ; cd == FALSE ; ) {
  1599.     switch(EVT_wait(ep)) {
  1600.     case 1:
  1601.         do {
  1602.         if ( --now < 0 ) now = 16;
  1603.         } while ( drv_tbl[now] == IS_NON );
  1604.         MOS_disp(OFF);
  1605.         ICON_disp(CHDIR_DRIV_X,CHDIR_DRIV_Y,now);
  1606.         tmp[0] = '\0';
  1607.         gprintf(CHDIR_DIR_X,CHDIR_DIR_Y,CHR_COL,WIND_COL,"%-34.34s","?");
  1608.         MOS_disp(ON);
  1609.         break;
  1610.  
  1611.     case 2:
  1612.         DSP_mos(2);
  1613.         if ( chdrv(now) || getdir(tmp) )
  1614.         tmp[0] = 0;
  1615.         DSP_mos(0);
  1616.         MOS_disp(OFF);
  1617.         gprintf(CHDIR_DIR_X,CHDIR_DIR_Y,CHR_COL,WIND_COL,"%-34.34s",
  1618.                     tmp[0] == '\0' ? "?":tmp);
  1619.         MOS_disp(ON);
  1620.         break;
  1621.  
  1622.     case 3:
  1623.         do {
  1624.         if ( ++now >= 17 ) now = 0;
  1625.         } while ( drv_tbl[now] == IS_NON );
  1626.         MOS_disp(OFF);
  1627.         ICON_disp(CHDIR_DRIV_X,CHDIR_DRIV_Y,now);
  1628.         tmp[0] = '\0';
  1629.         gprintf(CHDIR_DIR_X,CHDIR_DIR_Y,CHR_COL,WIND_COL,"%-34.34s","?");
  1630.         MOS_disp(ON);
  1631.         break;
  1632.  
  1633.     case 4:
  1634.         MOS_disp(OFF);
  1635.         input(CHDIR_DIR_X,CHDIR_DIR_Y,33,tmp);
  1636.         gprintf(CHDIR_DIR_X,CHDIR_DIR_Y,CHR_COL,WIND_COL,"%-34.34s",
  1637.                     tmp[0] == '\0' ? "?":tmp);
  1638.         MOS_disp(ON);
  1639.         break;
  1640.  
  1641.     case 5: cd = TRUE; break;
  1642.     case 6: cd = ERR;  break;
  1643.     }
  1644.     }
  1645.  
  1646.     EVT_free(ep);
  1647.     MOS_disp(OFF);
  1648.     DSP_pop_vram(sp);
  1649.     DSP_clbox(CHDIR_X1,CHDIR_Y1,CHDIR_X2,CHDIR_Y2);
  1650.     MOS_setpos(bx,by);
  1651.     DSP_mos(2);
  1652.     MOS_disp(ON);
  1653.  
  1654.     if ( cd == TRUE ) {
  1655.     if ( chdrv(now) ) {
  1656.         kakunin("ドライブが異常なので処理を中断します");
  1657.         cd = ERR;
  1658.         goto ENDOF;
  1659.     }
  1660.     p = tmp;
  1661.     if ( *p == '\\' ) {
  1662.         chdir("\\");
  1663.         p++;
  1664.     }
  1665.     while ( *p != '\0' ) {
  1666.         if ( (s = strchr(p,'\\')) == NULL ) {
  1667.         for ( s = p ; *s != '\0' ; s++ );
  1668.         fg = TRUE;
  1669.         } else
  1670.         fg = FALSE;
  1671.  
  1672.         *s = '\0';
  1673.  
  1674.         if ( *p == '\0' )
  1675.         break;
  1676.  
  1677.         if ( chdir(p) ) {
  1678.         if ( yesno("%sディレクトリを作成しますか?",p) == ERR ) {
  1679.             cd = ERR;
  1680.             goto ENDOF;
  1681.         }
  1682.         if ( mkdir(p) ) {
  1683.             kakunin("ディレクトリの作成に失敗しました");
  1684.             cd = ERR;
  1685.             goto ENDOF;
  1686.         } else if ( chdir(p) ) {
  1687.             kakunin("ディレクトリの移動に失敗しました");
  1688.             cd = ERR;
  1689.             goto ENDOF;
  1690.         }
  1691.         }
  1692.  
  1693.         if ( fg != FALSE )
  1694.         break;
  1695.         *(s++) = '\\';
  1696.         p = s;
  1697.     }
  1698.  
  1699.     while ( argc-- > 0 && wcopy(*(argv++)) != ERR );
  1700.  
  1701.     }
  1702.  
  1703. ENDOF:
  1704.  
  1705.     DSP_mos(0);
  1706. }
  1707. /*************************************************************
  1708. 01234567890123456789012345678901234567890123456789012345678901234567890123456789                01234567890123456789012345678901234567890123456
  1709.                 +---------------------------------------------+
  1710. 0               |             ふぁいる せれくた~       | × ||
  1711. 1               |+---++---++---++---++---++---++---++---++---+|
  1712. 2               || A || B || C || D || E || F || G || H || I ||
  1713. 3               |+---++---++---++---++---++---++---++---++---+|
  1714. 4               |+---++---++---++---++---++---++---++---++---+|
  1715. 5               || J || K || L || M || N || O || P || Q || R ||
  1716. 6               |+---++---++---++---++---++---++---++---++---+|
  1717. 7               |******************************************** |
  1718. 8               |xxxxxxxxxx xxx|xxxxxxxxxx xxx|xxxxxxxxxx xxx |
  1719. 9               |xxxxxxxxxx xxx|xxxxxxxxxx xxx|xxxxxxxxxx xxx |
  1720. 10              |xxxxxxxxxx xxx|xxxxxxxxxx xxx|xxxxxxxxxx xxx |
  1721. 11              |xxxxxxxxxx xxx|xxxxxxxxxx xxx|xxxxxxxxxx xxx |
  1722. 12              |xxxxxxxxxx xxx|xxxxxxxxxx xxx|xxxxxxxxxx xxx |
  1723. 13              |ooooooooooooooooooooooooooooooooooooo|<||>||
  1724. 14              +---------------------------------------------+
  1725. **************************************************************/
  1726.  
  1727. #define    FSEL_X1        (16*8)
  1728. #define    FSEL_Y1        (240-8*20)
  1729. #define    FSEL_X2        (62*8)
  1730. #define    FSEL_Y2        (FSEL_Y1+264)
  1731.  
  1732. #define    FSEL_MSG_X    (FSEL_X1+23*8)
  1733. #define    FSEL_MSG_Y    (FSEL_Y1+4)
  1734.  
  1735. #define    FSEL_EXIT_X    (FSEL_X1+43*8-2)
  1736. #define    FSEL_EXIT_Y    (FSEL_Y1+4)
  1737.  
  1738. #define    FSEL_DRIV_X    (FSEL_X1+1*8)
  1739. #define    FSEL_DRIV_Y    (FSEL_Y1+24)
  1740.  
  1741. #define    FSEL_DIR_X    (FSEL_X1+1*8)
  1742. #define    FSEL_DIR_Y    (FSEL_Y1+103)
  1743.  
  1744. #define    FSEL_FILE_X    (FSEL_X1+1*8)
  1745. #define    FSEL_FILE_Y    (FSEL_Y1+124)
  1746.  
  1747. #define    FSEL_BACK_X    ((FSEL_X1+FSEL_X2)/2-8*8)
  1748. #define    FSEL_BACK_Y    (FSEL_Y1+240)
  1749.  
  1750. #define    FSEL_NEXT_X    ((FSEL_X1+FSEL_X2)/2+2*8)
  1751. #define    FSEL_NEXT_Y    (FSEL_Y1+240)
  1752.  
  1753. #define    FSEL_DPOS_X1(n)    (FSEL_DRIV_X+((n)%9)*40)
  1754. #define    FSEL_DPOS_Y1(n)    (FSEL_DRIV_Y+((n)/9)*40)
  1755. #define    FSEL_DPOS_X2(n)    (FSEL_DRIV_X+((n)%9)*40+33)
  1756. #define    FSEL_DPOS_Y2(n)    (FSEL_DRIV_Y+((n)/9)*40+33)
  1757.  
  1758. #define    FSEL_FPOS_X1(n)    (FSEL_FILE_X+((n)/5)*15*8-4)
  1759. #define    FSEL_FPOS_Y1(n)    (FSEL_FILE_Y+((n)%5)*22)
  1760. #define    FSEL_FPOS_X2(n)    (FSEL_FILE_X+((n)/5)*15*8+15*8-6)
  1761. #define    FSEL_FPOS_Y2(n)    (FSEL_FILE_Y+((n)%5)*22+19)
  1762.  
  1763. static    char    *HIS_dir(void);
  1764.  
  1765. char    *formname(name)
  1766. char    *name;
  1767. {
  1768.     int     i;
  1769.     char    *p;
  1770.     static char tmp[16];
  1771.  
  1772.     if ( strcmp(name,"..") == 0 || (p = strchr(name,'.')) == NULL )
  1773.         for ( p = name ; *p != '\0' ; p++ );
  1774.  
  1775.     for ( i = 0 ; name < p && i < 8 ; i++ )
  1776.     tmp[i] = *(name++);
  1777.  
  1778.     for ( ; i < 11 ; i++ )
  1779.     tmp[i] = ' ';
  1780.  
  1781.     if ( *p == '.' ) p++;
  1782.  
  1783.     while ( *p != '\0' )
  1784.     tmp[i++] = *(p++);
  1785.  
  1786.     for ( ; i < 14 ; i++ )
  1787.     tmp[i] = ' ';
  1788.  
  1789.     tmp[i] = '\0';
  1790.     return tmp;
  1791. }
  1792. char    *FILE_select(void)
  1793. {
  1794.     int     i,n,cd;
  1795.     int     sw,bx,by;
  1796.     int     drv_old,drv_now;
  1797.     int     pos_old,pos_now;
  1798.     int     dir_flg,dir_max;
  1799.     BLOCK   *sp;
  1800.     EVENT   *ep=NULL;
  1801.     DIR     *dirp;
  1802.     DIRECT  *dp;
  1803.     DIRECT  *file_ptr[15];
  1804.     char    drv_no[17];
  1805.     char    *p;
  1806.     static char tmp[128];
  1807.  
  1808.     MOS_disp(OFF);
  1809.     sp = DSP_push_vram(FSEL_X1,FSEL_Y1,FSEL_X2,FSEL_Y2);
  1810.     DSP_opbox(FSEL_X1,FSEL_Y1,FSEL_X2,FSEL_Y2);
  1811.     DSP_wbox(FSEL_X1,FSEL_Y1,FSEL_X2,FSEL_Y2,LINE_COL,FILD_COL,M_PSET);
  1812.  
  1813.     DSP_strimg(file_selecter_img,
  1814.         FSEL_MSG_X - 46, FSEL_MSG_Y + 3,
  1815.         CHR_COL, FILD_COL, M_PSET);
  1816. /**********
  1817.     gputs(FSEL_MSG_X,FSEL_MSG_Y,CHR_COL,FILD_COL,"FILE SELECTOR");
  1818. ***********/
  1819.  
  1820.     ep = EVT_sw(ep,0,FSEL_EXIT_X,FSEL_EXIT_Y,CHR_COL,WIND_COL,"×");
  1821.     ep = EVT_sw(ep,1,FSEL_BACK_X,FSEL_BACK_Y,CHR_COL,WIND_COL,"  ≪  ");
  1822.     ep = EVT_sw(ep,2,FSEL_NEXT_X,FSEL_NEXT_Y,CHR_COL,WIND_COL,"  ≫  ");
  1823.  
  1824.     for ( i = n = 0 ; i < 17 ; i++ ) {
  1825.     if ( drv_tbl[i] != IS_NON ) {
  1826.         ICON_disp(FSEL_DPOS_X1(n),FSEL_DPOS_Y1(n),i);
  1827.         ep = EVT_set(ep,i+100,
  1828.             FSEL_DPOS_X1(n),FSEL_DPOS_Y1(n),
  1829.                 FSEL_DPOS_X2(n),FSEL_DPOS_Y2(n),EVT_proc);
  1830.         drv_no[i] = n;
  1831.         n++;
  1832.     } else
  1833.         drv_no[i] = 17;
  1834.     }
  1835.  
  1836.     for ( i = 0 ; i < 15 ; i++ ) {
  1837.     ep = EVT_set(ep,i+200,
  1838.         FSEL_FPOS_X1(i),FSEL_FPOS_Y1(i),
  1839.             FSEL_FPOS_X2(i),FSEL_FPOS_Y2(i),EVT_proc);
  1840.     DSP_wbox(FSEL_FPOS_X1(i),FSEL_FPOS_Y1(i),
  1841.              FSEL_FPOS_X2(i),FSEL_FPOS_Y2(i),LINE_COL,WIND_COL,M_PSET);
  1842.     }
  1843.  
  1844.     DSP_wbox(FSEL_DIR_X-4,FSEL_DIR_Y-2,
  1845.          FSEL_DIR_X+(44*8)+2,FSEL_DIR_Y+17,LINE_COL,WIND_COL,M_PSET);
  1846.  
  1847.     ep = EVT_set(ep, 5,
  1848.         FSEL_DIR_X-4, FSEL_DIR_Y-2,
  1849.         FSEL_DIR_X+(44*8)+2, FSEL_DIR_Y+17, EVT_proc);
  1850.  
  1851.     MOS_rdpos(&sw,&bx,&by);
  1852.     MOS_setpos((FSEL_X1+FSEL_X2)/2,(FSEL_Y1+FSEL_Y2)/2);
  1853.     MOS_disp(ON);
  1854.  
  1855.     drv_now = getdrv();
  1856.     drv_old = ERR;
  1857.     dir_flg = TRUE;
  1858.     dirp = NULL;
  1859.     pos_old = ERR;
  1860.     pos_now = 0;
  1861.  
  1862.     for ( cd = FALSE ; cd == FALSE ; ) {
  1863.  
  1864.     if ( drv_old != drv_now ) {
  1865.         MOS_disp(OFF);
  1866.         if ( drv_old != ERR )
  1867.         DSP_box(FSEL_DPOS_X1(drv_no[drv_old]),
  1868.             FSEL_DPOS_Y1(drv_no[drv_old]),
  1869.             FSEL_DPOS_X2(drv_no[drv_old]),
  1870.             FSEL_DPOS_Y2(drv_no[drv_old]),
  1871.             11,M_XOR);
  1872.  
  1873.         DSP_box(FSEL_DPOS_X1(drv_no[drv_now]),
  1874.             FSEL_DPOS_Y1(drv_no[drv_now]),
  1875.             FSEL_DPOS_X2(drv_no[drv_now]),
  1876.             FSEL_DPOS_Y2(drv_no[drv_now]),
  1877.             11,M_XOR);
  1878.         MOS_disp(ON);
  1879.  
  1880.         DSP_mos(2);
  1881.         chdrv(drv_now);
  1882.         DSP_mos(0);
  1883.  
  1884.         drv_old = drv_now;
  1885.         dir_flg = TRUE;
  1886.     }
  1887.  
  1888.     if ( dir_flg != FALSE ) {
  1889.         DSP_mos(2);
  1890.         getdir(tmp);
  1891.  
  1892.         MOS_disp(OFF);
  1893.         gprintf(FSEL_DIR_X,FSEL_DIR_Y,CHR_COL,WIND_COL,"%-44.44s",tmp);
  1894.         MOS_disp(ON);
  1895.  
  1896.         if ( tmp[1] != '\0' )
  1897.         strcat(tmp,"\\");
  1898.         strcat(tmp,"*.*");
  1899.         if ( dirp !=  NULL )
  1900.         closedir(dirp);
  1901.         dirp = opendir(tmp);
  1902.         dir_max = countdir(dirp);
  1903.         pos_now = 0;
  1904.         pos_old = ERR;
  1905.         dir_flg = FALSE;
  1906.         DSP_mos(0);
  1907.     }
  1908.  
  1909.     if ( pos_old != pos_now ) {
  1910.         seekdir(dirp,pos_now);
  1911.         MOS_disp(OFF);
  1912.         for ( i = 0 ; i < 15 ; i++ ) {
  1913.         dp = readdir(dirp);
  1914.         gputs(FSEL_FPOS_X1(i)+4,FSEL_FPOS_Y1(i)+2,
  1915.             (IS_DIR(dp) ? KEY_COL:CHR_COL),WIND_COL,
  1916.             (dp != NULL ? 
  1917.                   formname(dp->d_name):"              "));
  1918.         file_ptr[i] = dp;
  1919.         }
  1920.         MOS_disp(ON);
  1921.         pos_old = pos_now;
  1922.     }
  1923.  
  1924.     i = EVT_wait(ep);
  1925.  
  1926.     if ( i == 0 ) {
  1927.         cd = ERR;
  1928.  
  1929.     } else if ( i == 1 ) {
  1930.         if ( pos_now > 0 )
  1931.         pos_now -= 15;
  1932.  
  1933.     } else if ( i == 2 ) {
  1934.         if ( (pos_now + 15) < dir_max )
  1935.              pos_now += 15;
  1936.  
  1937.     } else if ( i == 5 ) {
  1938.         p = HIS_dir();
  1939.         chdir(p);
  1940.         if ( p[0] != '\0' && p[1] == ':' )
  1941.             drv_now = toupper(p[0]) - 'A';
  1942.         dir_flg = TRUE;
  1943.  
  1944.     } else if ( i >= 200 ) {
  1945.         if ( (dp = file_ptr[i-200]) != NULL ) {
  1946.         if ( IS_DIR(dp) ) {
  1947.             chdir(dp->d_name);
  1948.             dir_flg = TRUE;
  1949.         } else {
  1950.             strcpy(tmp,dp->d_name);
  1951.             cd = TRUE;
  1952.         }
  1953.         }
  1954.  
  1955.     } else if ( i >= 100 ) {
  1956.         drv_now = i - 100;
  1957.         dir_flg = TRUE;
  1958.     }
  1959.     }
  1960.  
  1961.     if ( dirp != NULL )
  1962.     closedir(dirp);
  1963.  
  1964.     EVT_free(ep);
  1965.     MOS_disp(OFF);
  1966.     DSP_pop_vram(sp);
  1967.     DSP_clbox(FSEL_X1,FSEL_Y1,FSEL_X2,FSEL_Y2);
  1968.     MOS_setpos(bx,by);
  1969.     MOS_disp(ON);
  1970.  
  1971.     return (cd == ERR ? NULL:tmp);
  1972. }
  1973.  
  1974. #define    HIS_X1        (18 * 8)
  1975. #define    HIS_X2        (HIS_X1 + 30 * 8 + 8)
  1976. #define    HIS_Y1        (240 - 6 * 20)
  1977. #define    HIS_Y2        (HIS_Y1 + 10 * 22 + 8)
  1978.  
  1979. #define    HIS_FPOS_X1(n)    (HIS_X1 + 4)
  1980. #define    HIS_FPOS_X2(n)    (HIS_X1 + 30 * 8 + 4)
  1981. #define    HIS_FPOS_Y1(n)    (HIS_Y1 + 4 + (n) * 22)
  1982. #define    HIS_FPOS_Y2(n)    (HIS_Y1 + 4 + (n) * 22 + 19)
  1983.  
  1984. static    char    *HIS_dir(void)
  1985. {
  1986.     int     n;
  1987.     int     sw, bx, by;
  1988.     BLOCK   *sp;
  1989.     EVENT   *ep = NULL;
  1990. /**************************
  1991.     static char *his_tab[] = {
  1992.         "F:\\CIRCLE",
  1993.         "F:\\GAME",
  1994.         "F:\\FB386",
  1995.         "F:\\MS_DOS",
  1996.         "F:\\T_OS",
  1997.         "F:\\MUSIC\\MIDI",
  1998.         "F:\\MUSIC\\NAIZOU",
  1999.         "G:\\GRAPHICS",
  2000.         "F:\\WINDOWS",
  2001.         "G:\\GEAR",
  2002.     };
  2003. *****************************/
  2004.     static char *his_tab[] = {
  2005.         "Q:\\CIRCLE",
  2006.         "Q:\\FB386",
  2007.         "Q:\\GAME",
  2008.         "Q:\\GEAR",
  2009.         "Q:\\GRAPHICS",
  2010.         "Q:\\MS_DOS",
  2011.         "Q:\\MUSIC\\MIDI",
  2012.         "Q:\\MUSIC\\NAIZOU",
  2013.         "Q:\\T_OS",
  2014.         "Q:\\WINDOWS",
  2015.     };
  2016.  
  2017.     MOS_disp(OFF);
  2018.     sp = DSP_push_vram(HIS_X1,HIS_Y1,HIS_X2,HIS_Y2);
  2019.     DSP_opbox(HIS_X1,HIS_Y1,HIS_X2,HIS_Y2);
  2020.     DSP_wbox(HIS_X1,HIS_Y1,HIS_X2,HIS_Y2,LINE_COL,FILD_COL,M_PSET);
  2021.  
  2022.     for ( n = 0 ; n < 10 ; n++ ) {
  2023.     ep = EVT_set(ep, n,
  2024.         HIS_FPOS_X1(n), HIS_FPOS_Y1(n),
  2025.             HIS_FPOS_X2(n), HIS_FPOS_Y2(n), EVT_proc);
  2026.     DSP_wbox(HIS_FPOS_X1(n), HIS_FPOS_Y1(n),
  2027.              HIS_FPOS_X2(n), HIS_FPOS_Y2(n), LINE_COL, WIND_COL, M_PSET);
  2028.     gputs(HIS_FPOS_X1(n) + 4, HIS_FPOS_Y1(n) + 2,
  2029.         CHR_COL, WIND_COL, his_tab[n]);
  2030.     }
  2031.  
  2032.     MOS_rdpos(&sw,&bx,&by);
  2033.     MOS_setpos((HIS_X1+HIS_X2)/2,(HIS_Y1+HIS_Y2)/2);
  2034.     MOS_disp(ON);
  2035.  
  2036.     n = EVT_wait(ep);
  2037.  
  2038.     EVT_free(ep);
  2039.     MOS_disp(OFF);
  2040.     DSP_pop_vram(sp);
  2041.     DSP_clbox(HIS_X1,HIS_Y1,HIS_X2,HIS_Y2);
  2042.     MOS_setpos(bx,by);
  2043.     MOS_disp(ON);
  2044.  
  2045.     return his_tab[n];
  2046. }
  2047.