home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 5 / 05.iso / a / a014 / 1.ddi / CDBINC.EXE / MENU.C < prev    next >
Encoding:
C/C++ Source or Header  |  1992-06-05  |  38.7 KB  |  1,537 lines

  1. #include <stdio.h>
  2. #include <dos.h>
  3. #include <conio.h>
  4. #include <ctype.h>
  5. #include <dir.h>
  6. #include <sys\stat.h>
  7. #include <fcntl.h>
  8.  
  9.  
  10. char title[80],subtitle[80];
  11. FILE *fp_menu, *fp_db;
  12.  
  13. #define black  0x0
  14. #define blue   0x10
  15. #define green  0x20
  16. #define cyan   0x30
  17. #define red    0x40
  18. #define white  0x70
  19.  
  20. #define yellow 33
  21. #define ewhite 37
  22. #define blue_back 44
  23. #define green_back 42
  24.  
  25. #define back_black 40
  26. #define back_red  41
  27. #define back_green 42
  28. #define back_yellow 43
  29. #define back_blue 44
  30. #define back_magenta 45
  31. #define back_cyan 46
  32. #define back_white 47
  33. #define fore_black 30
  34. #define fore_red 31
  35. #define fore_green 32
  36. #define fore_yellow 33
  37. #define fore_blue 34
  38. #define fore_magenta 35
  39. #define fore_cyan 36
  40. #define fore_white 37
  41.  
  42.  
  43. #define UP  6     /* used in edd() */
  44. #define DOWN 7
  45. #define PgUp 18688
  46. #define PgDn 20736
  47. #define NOTHING 0 /* used in edd() */
  48. #define DOUBLE 0 /*  using in aframe() */
  49. #define SINGAL 1
  50. #define CLEAR  2  /* used in  aframe*/
  51. #define YES    1  /* using in want_cursor() */
  52. #define NO     0  /* using in want_cursor() */
  53.  
  54. #define   MENUSIZE   12
  55. #define   DBSIZE    30
  56. #define   DB         1
  57. #define   READ       2
  58. #define   MENU       2
  59. #define   EMPTY      3
  60. #define   IS_SUBMENU 1
  61. #define   ISLEAF     0
  62. #define   Alt_C      11776
  63. #define   Alt_X      11520
  64. #define   Alt_Y      5376
  65. #define   Alt_Q      4096
  66. #define   Alt_D      8192
  67. #define   Alt_Z      11264
  68.  
  69. struct DD {
  70.   struct EE {
  71.        char name[10];
  72.        char mean[20];
  73.        char mainkey[4][12];
  74.        char path[30];
  75.        char serve;   /*if*/
  76.        char flag;
  77.          } db[DBSIZE];
  78.   int count;
  79.          }    *q;
  80.  
  81. struct AA {
  82.      struct BB {
  83.         char  name[40];
  84.     int  isleaf;
  85.     char shortn[11];
  86.         int  row;
  87.     int  col;
  88.     int  pos;
  89.     int  total;
  90.     struct DD *pdb;
  91.            }   men[MENUSIZE];
  92.      int countm;
  93.      int count;
  94.      struct AA *last, *next;
  95.       }  *root,*work, *p,*tail,*work2p;
  96.  
  97.  
  98.  int  deep;  /* this is depth of menu tree */
  99.  
  100. int  func; /* pointer of function */
  101. char *item;/* name of applition system */
  102. char shortname[14];   /* shortname of current item */
  103. static char number[24][3]={" ","0","1","2","3","4","5","6","7","8","9",
  104.           "a","b","c","d","e","f","g","h","i","j","k","l","m"
  105.          };
  106.  
  107. char *spaces="                                                                               ";
  108. char screen[25][81];
  109. int modifed=0;
  110. int title_d=0;
  111. int *fpos;
  112. int edit_flag;
  113.  
  114. char *bt[2]={
  115. "ú├ú─ú┬ú┴ú╟  ú┤íúú░  ░µ (═°┬τ░µ)",
  116. "╥╗ ╛┼ ╛┼ ╥╗  ─Ω ╦─ ╘┬ ",};
  117.  
  118.  
  119.  
  120. main(argc,argv)
  121. int argc;
  122. char *argv[];
  123. {
  124.   int  h,total,showx,showy,delay;
  125.   int  choice;
  126.  
  127.       clear_win(0,0,24,79,6,0,0x70);
  128.       if ((strcmp(argv[2],"wh"))!=0) for(;;);
  129.       title[0]='\0';
  130.       subtitle[0]='\0';
  131.       shortname[0]='\0';
  132.       deep=0;
  133.       root=work=work2p=tail=NULL;
  134.       cs();
  135.       func=0;
  136.       delay=0;
  137.       for(;;){
  138.         clear_win(0,0,24,79,6,0,white);
  139.         clear_win(6,13,18,72,6,0,black);
  140.         clear_win(6,12,17,70,6,0,blue);
  141.         gframe(6,12,18,70,0,0|30);
  142.           disp_menu0();
  143.           choice=get_choice(0,3);
  144.           switch(choice){
  145.           case 0 : strcpy(shortname,"ROOT" );
  146.                strcpy(title,shortname);
  147.                titles();
  148.                clear_win(0,0,24,79,6,0,white);
  149.                func=1;
  150.                delay=0;
  151.                break;
  152.           case 1 : func=2;
  153.                if (root->count==1) {
  154.                clear_win(0,0,24,79,6,0,white);
  155.                clear_win(8,24,16,62,6,0,black);
  156.                clear_win(7,22,15,60,6,0,blue);
  157.               printf("\033[10;27H\033[1;33;44m╙ª╙├╧╡═│ [ %s ] ╙╨╫╙╧╡═│┬≡ ?",title);
  158.               printf("\033[13;33H\033[0;33;42m[ %s ]\033[13;48H[ %s ]","YES "," NO ");
  159.                           *fpos=0;
  160.               choice=get_yn(13,33,48,fpos);
  161.                if(choice=='n' || choice=='N') {
  162.                       strcpy(root->men[0].name,shortname);
  163.                         work=root;
  164.                         work->men[0].isleaf=ISLEAF;
  165.                         if (work->men[0].pdb==NULL)
  166.                            {
  167.                            getmem(DB);
  168.                            work->men[0].pdb=q;
  169.                            getdb(0);
  170.                            }
  171.                         else
  172.                            modidb(0);
  173.                         clear_win(1,3,20,78,6,0,white);
  174.                         func=2;
  175.                         delay=0;
  176.                         break;
  177.                            }
  178.                     }
  179.            item=title;
  180.            add();
  181.           func=2;
  182.           delay=0;
  183.           break;
  184.           case 2 :
  185.                func2();
  186.                modifed=1;
  187.                func=3;
  188.                clear_win(0,0,24,79,6,0,white);
  189.                delay=0;
  190.                break;
  191.           case 3 :
  192.                 disp_menu0();
  193.                   if ( ! modifed) {
  194.                   clear_win(0,0,24,79,6,0,white);
  195.                   printf("\033[10;2H\033[1;%d;%d╛»╕µ : ╚⌠─·╘÷╠φ┴╦╫╙╧╡═│╢°▓╗╔Φ╝╞▓╦╡Ñ,╔·│╔╡─▓╦╡Ñ╜½╬▐╖¿╟²╢» . . .",fore_white,back_red);
  196.                   getcc();
  197.                   }
  198.                 wtofile();
  199.             return;
  200.           default :delay=1;
  201.                break;
  202.                }      /*end switch*/
  203.  
  204.          }
  205.    }
  206.  
  207. get_yn(row,col1,col2,flag)
  208. int row,col1,col2,*flag;
  209. {
  210.     int i,key;
  211. static  char  ret[2][5]={"YES "," NO "};
  212.     if(*flag==0)
  213.       i=col1;
  214.       else i=col2;
  215.       printf("\033[%u;%uH\033[1;33;%um[ %s ]\033[%u;%uH",row,i,back_black,ret[*flag],row,i);
  216.       for(;;){
  217.       key=getcc();
  218.        switch(key)
  219.     { case 'n':
  220.       case 'N' :
  221.              i=col2;
  222.            printf("\033[%u;%uH\033[0;33;42m[ %s ]",row,col1,ret[0]);
  223.           printf("\033[%u;%uH\033[1;33;%um[ %s ]\033[%u;%uH",row,i,back_black,ret[1],row,i);
  224.            return('N');
  225.       case 'y':
  226.       case 'Y':
  227.              i=col1;
  228.           printf("\033[%u;%uH\033[0;33;42m[ %s ]",row,col2,ret[1]);
  229.           printf("\033[%u;%uH\033[1;33;%um[ %s ]\033[%u;%uH",row,i,back_black,ret[0],row,i);
  230.  
  231.            return('Y');
  232.  
  233.      case 13 :
  234.            if(i==col1) return('Y');
  235.            else return('N');
  236.      case  19200 :
  237.           if(i==col2)
  238.           {i=col1;
  239.           printf("\033[%u;%uH\033[0;33;42m[ %s ]",row,col2,ret[1]);
  240.           printf("\033[%u;%uH\033[1;33;%um[ %s ]\033[%u;%uH",row,i,back_black,ret[0],row,i);
  241.           }
  242.           break;
  243.      case 19712 :
  244.           if(i==col1)
  245.         {i=col2;
  246.            printf("\033[%u;%uH\033[0;33;42m[ %s ]",row,col1,ret[0]);
  247.           printf("\033[%u;%uH\033[1;33;%um[ %s ]\033[%u;%uH",row,i,back_black,ret[1],row,i);}
  248.           break;
  249.      default :
  250.          break;
  251.          }
  252.        }
  253.     }
  254.  
  255. cs(){
  256. char name[40],shortt[11],path[30],w_flag[2],w_share[2];
  257. int fir_pos,count;
  258. int r,c,flag,i,j,h;
  259.  
  260. strcpy(shortname,"bt");
  261. strcpy(title,shortname);
  262. getmem(MENU);
  263. tail=root=p;
  264. root->last=root;
  265. work2p=root;
  266. work=root;
  267. if ((fp_menu=fopen("menu.txt","r"))==NULL) return(1);
  268.   fp_db=fopen("db.txt","r");
  269.      work->count=work->countm=0;
  270.  
  271.      for (i=0;i<MENUSIZE ; ++i ){
  272.       if (feof(fp_menu)) break;
  273.       for(r=0; r<40; ++r) name[r]='\0';
  274.       for(r=0; r<11; ++r) shortt[r]='\0';
  275.       flag=fir_pos=count=r=c=0;
  276.       fscanf(fp_menu,"#%[^#]#,#%[^#]#,%d,%d,%d,%d,%d\n",name,shortt,&flag,
  277.                               &fir_pos,&count,&r,&c);
  278.       if (i>1 && ! strcmp(name,"═╦│÷")) {
  279.        for(j=0; j<11; ++j) shortname[j]='\0';
  280.       strncpy(shortname,work->men[i-1].shortn,strlen(work->men[i-1].shortn)-1);
  281.       for (i=0; i<MENUSIZE; ++i){
  282.     p->men[i].shortn[0]='\0';
  283.     strcpy(p->men[i].shortn,shortname);
  284.      strcat(p->men[i].shortn,number[i+1]);
  285.                  }
  286.        i=0;
  287.        getmem(MENU);
  288.        p->count=p->countm=0;
  289.              }    /*end of if */
  290.      strcpy(work->men[i].name,name);
  291.       strcpy(work->men[i].shortn,shortt);
  292.      work->men[i].isleaf=flag;
  293.      work->men[i].pos=fir_pos;
  294.      work->men[i].total=count;
  295.      work->men[i].row=r;
  296.      work->men[i].col=c;
  297.      work->count++;
  298.      work->countm++;
  299.      if (flag==ISLEAF && fp_db!=NULL) {
  300.       getmem(DB);
  301.       work->men[i].pdb=q;
  302.       q->count=count;
  303.       work->countm--;
  304.   for(r=0; r<count; r++) {
  305.     fscanf(fp_db,"#%[^#]#,#%[^#]#,#%[^#]#,#%[^#]#,#%[^#]#,#%[^#]#,#%[^#]#,#%[^#]#,#%[^#]#\n",q->db[r].mean,\
  306.    q->db[r].mainkey[0],q->db[r].mainkey[1],q->db[r].mainkey[2],\
  307.     q->db[r].mainkey[3],q->db[r].name,w_flag,w_share,q->db[r].path);
  308.     q->db[r].flag=w_flag[0];q->db[r].serve=w_share[0];
  309.               }
  310.              } /*if*/
  311.                }
  312.       for(j=0; j<11; ++j) shortname[0]='\0';
  313.       strncpy(shortname,work->men[1].shortn,strlen(work->men[1].shortn)-1);
  314.       for(i=0; i<MENUSIZE; ++i){
  315.     p->men[i].shortn[0]='\0';
  316.     strcpy(p->men[i].shortn,shortname);
  317.     strcat(p->men[i].shortn,number[i+1]);
  318.                   }
  319.       fclose(fp_db);
  320.       fclose(fp_menu);
  321. }
  322.  
  323.  
  324.  
  325. line(color1,color2,str)
  326. int color1,color2;
  327. char *str;
  328. {
  329. clear_win(23,0,23,79,6,0,color2);
  330. printf("\033[24;0H\033[0;%d;%dm%s",color1,back_red,str);
  331. }
  332.  
  333. get_choice(h,max)
  334. int h;
  335. int  max;
  336. {
  337. int choice;
  338.   for(;;){
  339.  ptime();
  340.        choice=getcc();
  341.        switch(choice) {
  342.      case 18432 :
  343.               func--;
  344.               if (func < h) func=max;
  345.               return(-1);
  346.      case 20480 :
  347.               func++;
  348.                if (func > max) func=h;
  349.               return(-1);
  350.      case 13    :
  351.               return(func);
  352.      default    :
  353.               if (choice>='0' && choice <='9') {
  354.             if (choice=='0') {  func=max; return(max);}
  355.             choice-= '0';
  356.             if (choice<=max) { func=choice+h-1;
  357.                       return(func);
  358.                      }
  359.                             }
  360.          break;
  361.               }
  362.               }
  363.      }
  364.  
  365.  
  366.  
  367. disp_menu0(){
  368.      int row;
  369.  
  370.      static char numberi[][2]={
  371.                   "1","2","3","0","4","5"
  372.                  };
  373.      static char function1[4][40]={ "ú▒  ╔·│╔╙ª╙├╧╡═│▒Ω╠Γ" ,
  374.                     "ú▓  ╔·│╔╙ª╙├╧╡═│▓╦╡Ñ",
  375.                     "ú│  ╔Φ╝╞▓╦╡Ñ╧╘╩╛╕±╩╜" ,
  376.                     "ú░  ═╦│÷",
  377.                    };
  378.      int     i;
  379.      row=8;
  380.      for (i=0; i<=3; ++i) {
  381.     if(func==i)
  382.       printf("\033[%d;32H\033[0;0;7m%s",row,function1[i]);
  383.     else
  384.       printf("\033[%d;32H\033[1;33;44m%s",row,function1[i]);
  385.     row+=2;            }
  386.      printf("\033[17;34H\033[1;33;44m╟δ─·╤í╘±[ %s ]\033[17;46H",numberi[func]);
  387.      return;
  388.          }
  389.  
  390.  
  391.  
  392.  
  393. now_cursor(x,y)
  394. int *x,*y;
  395. {
  396.   union REGS r;
  397.  
  398.    r.h.ah=3;
  399.    r.h.bh=0;
  400.    int86(0x10,&r,&r);
  401.    *x = r.h.dh;
  402.    *y = r.h.dl;
  403.   return;
  404.  }
  405.  
  406.  
  407. ptime(){
  408. struct date today;
  409. struct time now;
  410.  
  411. getdate(&today);
  412. printf("\033[24;1H\033[0;%u;%um%*sDATE %u.%u.%u",fore_white,back_red,50," ",today.da_year,today.da_mon,today.da_day);
  413. gettime(&now);
  414. printf(" CLOCK %02d:%02d:%02d",now.ti_hour,now.ti_min,now.ti_sec);
  415. return;
  416. }
  417.  
  418. clear_win(startx,starty,endx,endy,action,line,attribe)
  419. int startx,starty;
  420. int endx,endy;
  421. int action,line,attribe;
  422. {
  423. union REGS r;
  424.  
  425. r.h.ah=action;
  426. r.h.al=line;
  427. r.h.bh=attribe;
  428. r.h.ch=startx;
  429. r.h.cl=starty;
  430. r.h.dh=endx;
  431. r.h.dl=endy;
  432. int86(0x10,&r,&r);
  433. return;
  434.  
  435. }
  436.  
  437.     edd(ss,length,row,col)
  438.     char *ss;
  439.     int length;
  440.     int row;
  441.     int col;
  442.     {
  443.      int flag;
  444.      static int insert=0;
  445.      int col1,i;
  446.      int ch;
  447.      char *t,*s;
  448.  
  449.      t=ss;
  450.      s=ss;
  451.      col1=col+1;
  452.      flag=0;
  453.      length--;
  454.      printf("\033[%u;%uH\033[1;33;46m%s",row,col+1,ss);
  455.          printf("\033[%u;%uH",row,col1);
  456.          ch=getcc();
  457.          for(;;){
  458.          switch(ch){
  459.            case 19200 :   /* <--- */
  460.                if (t>ss) {t--;col1--;}/*pointer compete ss for heat pointer*/
  461.                break;
  462.            case 19712 :  /* ---> */
  463.                 if (*t && t<ss+length-1) {col1++;t++;}
  464.                 break;
  465.            case 9     : /* right tab */
  466.                 for (i=0; i<8; ++i)
  467.                   if (*t && t<ss+length-1) {col1++; t++;}
  468.              break;
  469.            case 3840  : for (i=0; i<8; ++i) /*left tab*/
  470.                   if (t>ss) { t--;col1--; }
  471.                  break;
  472.            case 18688 :  return(PgUp);
  473.            case 20736 :  return(PgDn);
  474.            case 15104 :  /* F1 key */
  475.            case Alt_D :
  476.            case Alt_C :
  477.            case Alt_Q :
  478.            case Alt_Y :
  479.            case Alt_Z :
  480.            case Alt_X :  return(ch);
  481.            case 18432 :
  482.             printf("\033[%u;%uH\033[1;33;44m%s",row,col+1,ss);
  483.                  return(UP);   /* ^ */
  484.            case 20480 :
  485.                 printf("\033[%u;%uH\033[1;33;44m%s",row,col+1,ss);
  486.                  return(DOWN);
  487.            case 8    :               /* backspace */
  488.            case 21248 : flag++;
  489.                 if (ch!=8)  s=t;
  490.                 else
  491.                    {
  492.                    if (t>ss) {s=t-1; col1--;}
  493.                    else break;
  494.                    }
  495.                 while ((*s)&&(s<ss+length-1)) {*s = *(1+s); s++;}
  496.                 if (ch!=8)  s=t;
  497.                 else
  498.                    {
  499.                    if (t>ss) s=t-1;
  500.                    else break;
  501.                    }
  502.                 printf("\033[%u;%uH\033[1;33;44m%s ",row,col1,s);
  503.                 printf("\033[%u;%uH\033[1;33;44m%s",row,col1,s);
  504.                 if (ch==8 && t>ss) { t--; /*col1--; */}
  505.                 edit_flag=1;
  506.                 break;
  507.          case 13   :                /* return */
  508.                printf("\033[%u;%uH\033[1;33;44m%s",row,col+1,ss);
  509.                 if (flag) return(1);
  510.                 return(NOTHING);
  511.            case 20992 : /* insert */
  512.                 insert=1-insert;
  513.               break;
  514.            case 18176 : col1=col;  /*home*/
  515.                 t=ss;
  516.              break;
  517.            case 20224 :   /*end*/
  518.                 while ((*t)&&(t<ss+length)) { t++; col1++;}
  519.                 t--; col1--;
  520.                  break;
  521.            default    :  if (ch%256==0) break;/*goto begin;divid others gongkeys*/
  522.                  flag++;    edit_flag=1;
  523.                  if (insert==0) { /* Ins off */
  524.                 if ((*t)&&(t<ss+length))       *t=ch;
  525.                   else
  526.                   if (t<ss+length) { *t=ch; *(t+1)='\0'; }
  527.                   printf("\033[%u;%uH\033[1;33;44m%s",row,col1,t);
  528.                   if (t<ss+length) {t++; col1++;}
  529.              break;
  530.                             }
  531.                  s=t;
  532.                  while ((*s++)&&(s<ss+length)) ;    /* Ins on  */
  533.                  if (s>ss+length) {s=ss+length;*s='\0';s--;}
  534.                  while (s>t) { *s = *(s-1); s--;}
  535.                  *t=ch;
  536.                  printf("\033[%u;%uH\033[1;33;44m%s",row,col1,t);
  537.                  if (t<ss+length) {t++; col1++; }
  538.                  break;
  539.                }  /* end switch */
  540.          printf("\033[%u;%uH\033[1;33;44m\0",row,col1);
  541.          ch=getcc();
  542.       } /*endfor*/
  543.  
  544.        }
  545.  
  546.    getcc(){
  547.    union REGS r;
  548.    r.h.ah=0;
  549.    int86(0x16,&r,&r);
  550.    if (r.h.al==27) exit(0);
  551.    if (r.h.al) return(r.h.al);
  552.    return(r.x.ax);
  553.   }
  554.  
  555.  
  556. add(){
  557. int count;
  558. int flag;
  559. int r,c;
  560. char s[40];
  561.  
  562. clear_win(1,3,20,77,6,0,white);
  563. deep=0;
  564. work=root;
  565. work2p=root;
  566. receive();
  567.  
  568.  while (work2p != NULL) {
  569.      deep++;
  570.      for (count=1; count<MENUSIZE; ++count){
  571.     if(work2p->men[count].isleaf!= READ) continue;
  572.     item=work2p->men[count].name; /*HAVE SUBSYSTEM*/
  573.     strcpy(shortname,work2p->men[count].shortn);
  574.     work2p->men[count].isleaf=IS_SUBMENU;
  575.     work=work2p;
  576.     r=0;
  577.     while(r++<work2p->countm && work->next!=NULL)
  578.        work=work->next;
  579.     getmem(MENU);
  580.     receive();
  581.                       }
  582.      work2p=work2p->next; }
  583.     } /* end of add() */
  584.  
  585.     display(pp,cc1,cc,row,col)
  586.     struct AA *pp;
  587.     int cc1,*cc;
  588.     int *row;
  589.     int *col;
  590.     {
  591.  
  592.      *row=7;
  593.      *col=20;
  594.      clear_win(5,14,14,67,6,0,blue);
  595.      while((cc1<*cc) && *cc<cc1+5){
  596.       if (pp->men[cc1].name[0]=='\0')  break;
  597.       if(*cc>20) {printf("\007");return(0);}
  598.       printf("\033[%u;%uH\033[1;%d;44m%s --- %s\033[%u;56H%s",*row,(*col)+1,fore_yellow,number[cc1+1],pp->men[cc1].name,*row,pp->men[cc1].shortn);
  599.       cc1++; *row+=2;
  600.                    }
  601.       if(*cc>20) {printf("\007");return(0);}
  602.       else
  603.       {
  604.     *cc=cc1;
  605.      printf("\033[%u;%uH\033[1;%d;44m%s --- %s\033[%u;56H%s",*row,(*col)+1,fore_yellow,number[cc1+1],pp->men[cc1].name,*row,pp->men[cc1].shortn);
  606.      return(1);}
  607.  
  608.     }  /* end of display() */
  609.  
  610.  
  611.     receive()
  612.     {
  613.       int cc,cc1,cc2;
  614.       int act;
  615.       char syst[9];
  616.       int c,exi,syslen;
  617.       int row,col;
  618.       int deep1;
  619.  
  620.       tom:
  621.      deep1=deep;
  622.      clear_win(2,3,20,76,6,0,white);
  623.      cc1=0;
  624.      cc=4;
  625.       clear_win(3,13,17,71,6,0,black);
  626.       clear_win(3,12,16,68,6,0,blue);
  627.       gframe(3,12,17,69,0,0|30);
  628.  
  629.      c=0;
  630.        for(;;)
  631.          {
  632. /*         clear_win(2,3,20,76,6,0,white);
  633.          clear_win(3,13,17,71,6,0,black);
  634.          clear_win(3,12,16,68,6,0,blue);
  635.          gframe(3,12,17,69,0,0|30);*/
  636.          syslen=strlen(work->men[0].shortn);
  637.          strncpy(syst,work->men[0].shortn,syslen-1); syst[syslen-1]='\0';
  638.          printf("\033[4;27H\033[1;33;44m╟δ╩Σ╚δ╧╡═│%-s ╡─╦∙╙╨╫╙╧╡═│\033[17;13H ╜ß╩° : ╓▒╜╙╗╪│╡  ╓╨╢╧ : ESC ▓╦╡Ñ╔ε╢╚ :%-1d ╖¡╥│ : PgUp/PgDn",syst,syslen-2);/*item,number[deep1+2]);*/
  639.          if(c==0){exi=display(work,cc1,&cc,&row,&col);
  640.              cc2=cc; }
  641.  
  642.          c=0;
  643.         if(exi!=0)
  644.         {
  645.         if (work->men[cc2].isleaf==ISLEAF){
  646.         printf("\033[24;0H\033[1;33;44m%s\033[24;20H\033[1;33;44m Alt_y   ╨▐╕─╩²╛▌┐Γ▓╦╡Ñ ",spaces);
  647.                       }
  648.         else {
  649.         printf("\033[24;0H\033[0;%d;44m%s",fore_white,spaces);
  650.               }
  651.         }
  652.      if(exi==0) act=NOTHING;
  653.      else
  654.      act=edd(work->men[cc2].name,40,row,col+6);
  655.  
  656.      switch(act) {
  657.         case NOTHING:
  658.                   if (require(cc2)==10) { deep++; goto tom;}
  659.                   else
  660.                  return(1);
  661.         case Alt_Y : modidb(cc2);
  662.                  clear_win(2,3,22,76,6,0,white);
  663.                  clear_win(3,13,17,71,6,0,black);
  664.                  clear_win(3,12,16,68,6,0,blue);
  665.                  gframe(3,12,17,69,0,0|30);
  666.                  /*clear_win(14,0,24,79,6,0,blue);
  667.                               clear_win(3,14,16,70,6,0,black);
  668.                 clear_win(2,12,15,68,6,0,cyan);
  669.                 printf("\033[3;27H\033[1;%d;42m╟δ╩Σ╚δ╧╡═│%s ╡─╦∙╙╨╫╙╧╡═│\033[15;13H ╜ß╩° : ╓▒╜╙╗╪│╡  ╓╨╢╧ : ESC ▓╦╡Ñ╔ε╢╚ :%s ╖¡╥│ : PgUp/PgDn",fore_white,item,number[deep1+2]);*/
  670.                  break;
  671.         case UP   :
  672.                   if (cc2>cc1) {
  673.                      cc2--; row-=2; c=1;break;
  674.                        }
  675.         case PgUp : if (cc1==0) {
  676.                  if (work->last==work) {putchar(7); }
  677.                   else {
  678.                   deep1--;
  679.                   work=work->last; cc=cc1+4;
  680.                   if (deep1<deep) work2p=work;
  681.                     }
  682.                   break;
  683.                     }
  684.                 cc1 -= 5;
  685.                 cc=cc1+4;
  686.                 clear_win(4,14,13,67,6,0,blue);
  687.                  break;
  688.         case 1    : if (cc<cc1+4) { cc++ ;break;}
  689.  
  690.         case DOWN : if (cc2<cc && cc2<cc1+4) {
  691.             row+=2;  cc2++; c=1; break;  }
  692.         case PgDn :
  693.                 cc1+=5;
  694.                 if (cc1>work->count && act !=1) {
  695.                   if (work==root && work->men[cc].name[0]!='\0')
  696.                     {
  697.                                             cc=cc1+4;
  698.                         clear_win(4,14,13,67,6,0,blue);
  699.                         break;}
  700.                   if (work->next==NULL) { putchar(7); cc1-=5; }
  701.                    else {
  702.                    deep1++;
  703.                    work=work->next ;
  704.                    cc1=0; cc=4;
  705.                      }
  706.                 break;
  707.                    }
  708.              cc=cc1+4;
  709.                 clear_win(4,14,13,67,6,0,blue);
  710.                 break;
  711.     default   :
  712.                 putchar(7);
  713.                 break;
  714.                     }/*end switch*/
  715.               } /*end for*/
  716.     }
  717.  
  718.  
  719. #include <alloc.h>
  720. #include <stdio.h>
  721.     getmem(which)
  722.     int which;
  723.     {
  724.      switch(which){
  725.        case MENU :
  726.           p=(struct AA *) malloc(sizeof(struct AA));
  727.           initmem(MENU);
  728.           return;
  729.        case DB   :
  730.           q=(struct DD *) malloc(sizeof(struct DD));
  731.           initmem(DB);
  732.           return;
  733.           }
  734.       return;
  735.       }
  736.  
  737.  
  738. initmem(which)
  739. int which;
  740. {
  741. int i,n;
  742. char buff[10];
  743.     switch(which){
  744.      case MENU :
  745.     work=root;
  746.     strcpy(buff,shortname);
  747.     strcat(buff,number[2]);
  748.     if (work!=NULL)
  749.        {
  750.        while (work->next!=NULL && strlen(buff)>strlen(work->next->men[1].shortn))
  751.          work=work->next;
  752.        while (work->next!=NULL && strlen(buff)==strlen(work->next->men[1].shortn) \
  753.        && strcmp(buff,work->next->men[1].shortn)>=0) work=work->next;
  754.        }
  755.     p->last=work;
  756.     if (work!=NULL) {
  757.       p->next=work->next;
  758.       work->next=p;
  759.             }
  760.     else
  761.        p->next=NULL;
  762.     if (p->next!= NULL)
  763.       (p->next)->last=p;
  764.       work=p;
  765.       p->count=p->countm=1;
  766.       for (i=0; i<MENUSIZE; ++i){
  767.     p->men[i].isleaf=EMPTY;
  768.     p->men[i].shortn[0]='\0';
  769.     p->men[i].pdb=NULL;
  770.     p->men[i].pos= -1;
  771.     p->men[i].total= -1;
  772.     p->men[i].row=p->men[i].col= -1;
  773.     strcpy(p->men[i].shortn,shortname);
  774.     strcat(p->men[i].shortn,number[i+1]);
  775.     p->men[i].name[0]='\0';}
  776.     strcat(p->men[0].name,"═╦│÷");
  777.     p->men[0].isleaf=IS_SUBMENU;
  778.     return(1);
  779.      case DB :
  780.        q->count=0;
  781.        for (i=0; i<DBSIZE ; ++i)
  782.        {
  783.      q->db[i].flag='n';
  784.      q->db[i].serve='N';
  785.      q->db[i].path[0]='\0';
  786.      q->db[i].mean[0]='\0';
  787.      q->db[i].name[0]='\0';
  788.      for (n=0;n<4;n++)
  789.          q->db[i].mainkey[n][0]='\0';
  790.        }
  791.      return(1);
  792.      }
  793.    return(0);
  794. }
  795.  
  796. require(cc2)
  797. {
  798. int ans,ans1;
  799. int cc1/*,cc2*/;
  800. int zl,judge;
  801. char prog_name[11];
  802.  
  803. zl=1;
  804.   for(;;)
  805.   {
  806.   if (work->men[cc2].isleaf==IS_SUBMENU)
  807.      {
  808.      strcpy(prog_name,work->men[cc2].shortn);
  809.      strcat(prog_name,"1");
  810. /*     judge=work->men[cc2].pos; work=work->next;*/
  811.      while (strcmp(prog_name,work->men[1].shortn)) work=work->next;
  812.      return(10);
  813.      }
  814.   for (cc2=1; cc2<MENUSIZE ; ++cc2) {
  815.      if  (work->men[cc2].isleaf!=EMPTY) continue;
  816.      if (work->men[cc2].name[0]=='\0') continue;
  817.       work->count++;
  818.       clear_win(0,0,24,79,6,0,white);
  819.       clear_win(9,22,18,68,6,0,black);
  820.       clear_win(8,20,17,66,6,0,blue);
  821.        for(;;){
  822.       zl=1;
  823.       printf("\033[11;30H\033[1;33;44m    < %s >   ╙╨╫╙╧╡═│┬≡",work->men[cc2].name);
  824.     printf("\033[15;33H\033[0;33;42m[ %s ]\033[15;48H[ %s ]","YES "," NO ");
  825.     ans=get_yn(15,33,48,fpos);
  826.       printf("\033[11;30H\033[1;33;44m           ╚╖╨┼┬≡?           ");
  827.       printf("\033[15;33H\033[0;33;42m[ %s ]\033[15;48H[ %s ]","YES "," NO ");
  828.       if(ans=='N')  *fpos=1;
  829.       else *fpos=0;
  830.       if ((ans1=get_yn(15,33,48,fpos))=='y' || ans1=='Y')
  831.       switch(ans){
  832.     case 'y' :
  833.     case 'Y' :
  834.              work->men[cc2].isleaf=READ;
  835.              work->countm++;
  836.              zl=0;
  837.              break;
  838.     case 'n' :
  839.     case 'N' :
  840.              work->men[cc2].isleaf=ISLEAF;
  841.              getmem(DB);
  842.              work->men[cc2].pdb=q;
  843.              getdb(cc2);
  844.              zl=0;
  845.              break;
  846.     default  :      zl=1; break;
  847.                  }
  848.       if(zl==0) break;
  849.  
  850.        }  /*endfor*/
  851.     printf("\033[13;18H\033[0;%d;44m                                                             ",fore_white);
  852.             } /* end of for */
  853.       if (work->next!= NULL) { work=work->next;  }
  854.       return(0);}
  855.     }
  856.  
  857. getdb(cc2)
  858. int cc2;
  859.  {
  860.   int cc,n;
  861.   int r=0,c;
  862.   int count;
  863.   int col,f_key;
  864.    int serve;
  865.   count=0;
  866.   for(;;){
  867.  clear_win(0,0,24,79,6,0,white);
  868.  printf("\033[2;1H\033[1;33;%dm┐Γ┬╝╚δ─ú┐Θ",back_red);
  869.  clear_win(7,10,21,70,6,0,black);
  870.  clear_win(6,8,20,68,6,0,blue);
  871.  printf("\033[8;20H\033[1;%d;%dm╟δ╩Σ╚δ<%s>╦∙╙├╡─╩²╛▌┐Γ ú║\
  872. \033[20;62H┐Γ %d\033[11;13H┐Γ╬─╝■├√ ú║\
  873.  \033[11;38H╓≈╣╪╝ⁿ╫╓ 1ú║\033[14;13H┐Γ▓╦╡Ñ├√ú║               ",fore_yellow,back_blue,work->men[cc2].name,count+1);
  874.   if (edd(q->db[count].name,10,11,25)==NOTHING && count==q->count)
  875.     if (r=='y' || r=='Y'){
  876.       /*  clear_win(0,0,23,79,6,0,white);*/
  877.         return(1);
  878.                   }
  879.  n=0;
  880. while(1){
  881.   if (n>3) break;
  882.   printf("\033[11;38H\033[1;33;44m╓≈╣╪╝ⁿ╫╓%d ú║                 ",n+1);
  883.   printf("\033[%u;%uH\033[1;33;44m",11,52);
  884.   do
  885.     f_key=edd(q->db[count].mainkey[n],12,11,52);
  886.   while(f_key>1);
  887.   if (f_key==NOTHING && n>0 && q->db[count].mainkey[n][0]=='\0') break;
  888.   n++;
  889. }
  890.   printf("\033[14;13H\033[1;33;44m┐Γ▓╦╡Ñ├√ : ");
  891.   while(edd(q->db[count].mean,20,14,24)>1);
  892.   clear_win(14,40,22,76,6,0,black);
  893.   clear_win(13,38,21,74,6,0,green);
  894.   printf("\033[15;50H\033[0;%d;%dm╩╟╣▓╧φ┐Γ┬≡ú┐",fore_red,back_white);
  895.   printf("\033[19;47H\033[0;33;46m[ %s ]\033[19;60H\033[0;%u;%u[ %s ]"," YES",fore_yellow,back_black," NO ");
  896.   *fpos=1;
  897.   serve=get_yn(19,47,60,fpos);
  898.   if(serve=='Y') {q->db[count].serve='Y';
  899.           clear_win(12,36,24,79,6,0,white);
  900.           clear_win(12,36,21,70,6,0,black);
  901.           clear_win(12,36,20,68,6,0,blue);
  902.           printf("\033[20;62H\033[0;30;46mku%d",count+1);
  903.           }
  904.    else       {  clear_win(12,36,24,79,6,0,white);
  905.          clear_win(12,36,21,70,6,0,black);
  906.           clear_win(12,36,20,68,6,0,blue);
  907.         }
  908.   if(serve=='Y'){
  909.     printf("\033[17;11H\033[1;%d;%dm╣▓╧φ┐Γ┬╖╛╢ :",fore_yellow,back_blue);
  910.     while(edd(q->db[count].path,30,17,25)>1);
  911.     }
  912.   clear_win(14,40,22,76,6,0,black);
  913.   clear_win(13,38,21,74,6,0,green);
  914.   printf("\033[15;45H\033[0;%d;%dm─▄╚╖╢¿─·╡─╦∙╙╨▓┘╫≈┬≡ú┐",fore_yellow,back_green);
  915.   printf("\033[19;47H\033[0;%u;%um[ %s ]\033[19;60H\033[0;30;46m[ %s ]",fore_yellow,back_black,"YES "," NO ");
  916.   *fpos=0;
  917.   r=get_yn(19,47,60,fpos);
  918.   if(r=='Y'){
  919.         if (count==q->count) { q->count++; count++; }
  920.         else count++;
  921.         }
  922.        }
  923.   }
  924.  
  925. func2(){
  926.  
  927. char *s;
  928. int i,j,k;
  929. int cc;
  930. int rr=0;
  931. int countm=0,countd=0;
  932. static int point[5], pp;
  933. int startx,starty;
  934. static int row[2]={0,23} , pr=1;
  935. char str[3],name[20];
  936. int pos[20][2],tt,row1;
  937. FILE *fp;
  938.  
  939.  
  940. if (title_d==0){
  941. p=root->next;
  942. while(p!=NULL){
  943.   for(s=p->men[0].shortn; *s!='\0'; s++);
  944.   *(s-2)='\0';
  945.   p=p->next;
  946.           }
  947. p=work=root;
  948. cc=0;
  949. p->men[0].pos=rr;
  950. if (p->count==1) { p->men[0].total=(p->men[0].pdb)->count; goto next;}
  951. else
  952. p->men[0].total=p->count;
  953. for(s=p->men[0].shortn; *s!='\0'; s++);
  954. *(s-1)='\0';
  955. strcpy(shortname,work->men[0].shortn);
  956. item=title;
  957.           }
  958.  
  959.   beginn:
  960. for (i=0; i<25; ++i){
  961.   for (j=0; j<80; ++j)
  962.    screen[i][j]=' ';
  963. screen[i][80]='\0';  }
  964. if (title_d==1)
  965.    {
  966.       strcpy(name,shortname);
  967.       strcat(name,".prg");
  968.       if ((fp=fopen(name,"r"))!=NULL) {
  969.        fgets(screen[0],83,fp);
  970.        fgets(screen[0],83,fp);
  971.        for(row1=0;row1<25; row1++){
  972.          fgets(screen[row1],83,fp);
  973.          screen[row1][79]=' ';
  974.          screen[row1][80]='\0';    }
  975.        fclose(fp);
  976.        }
  977.    }
  978. if (!title_d) {
  979.            for(i=0; i<20; ++i){
  980.            pos[i][0]=work->men[i].row;
  981.            pos[i][1]=work->men[i].col;
  982.                   }
  983.            cpmenu();
  984.            }  /* end if */
  985. pp=0;
  986. i=0;
  987. disp_menu(0,23); edit_flag=0;
  988. printf("\033[24;0H\033[0;%d;44m%s\033[24;10H\033[0;%d;%dm╚½╞┴─╗▒α╝¡\033[24;30H F1 : ░∩╓·\033[24;50HPgDn: ┤µ┼╠═╦│÷",fore_white,spaces,fore_white,back_black);
  989. while ((j=edd(screen[i],80,i+1,0))!=PgDn) {
  990.    switch(j){
  991.      case UP : if (--i>=0) ;
  992.         else i=22;
  993.         continue;
  994.      case 1    :
  995.      case NOTHING :
  996.      case DOWN :
  997.  
  998.  
  999.         if (++i<=22 ) ;
  1000.         else i=0;
  1001.         continue;
  1002.      case Alt_C: edit_flag=1;
  1003.          aframe(point[0],point[1],point[2],point[3],DOUBLE,str);
  1004.          break;
  1005.      case Alt_X: edit_flag=1;
  1006.          aframe(point[0],point[1],point[2],point[3],SINGAL,str);
  1007.          break;
  1008.      case Alt_Q: edit_flag=1;
  1009.          aframe(point[0],point[1],point[2],point[3],CLEAR,str);
  1010.          break;
  1011.      case Alt_Z :edit_flag=1;
  1012.         printf("\033[24;0H\033[0;%d;44m%s\033[24;0H\033[0;%d;%dm╟δ╩Σ╚δ─·╡─╫╓╖√(2╬╗) :",fore_white,spaces,fore_yellow,back_blue);
  1013.          str[0]=getcc();
  1014.          putchar(str[0]);
  1015.          str[1]=getcc();
  1016.          putchar(str[1]);
  1017.          str[2]='\0';
  1018.          aframe(point[0],point[1],point[2],point[3],3,str);
  1019.          break;
  1020.      case Alt_Y : edit_flag=1;
  1021.           move();
  1022.           continue;
  1023.      case PgUp  :
  1024.          if (title_d) return(1);
  1025.          for (tt=0; tt<20; ++tt){
  1026.            work->men[tt].row=pos[tt][0];
  1027.            work->men[tt].col=pos[tt][1];
  1028.                     }
  1029.           goto next;
  1030.  
  1031.      case Alt_D : now_cursor(&startx,&starty);
  1032.          if (starty==79) starty=78;
  1033.          screen[startx][starty]='*';
  1034.          screen[startx][starty+1]=' ';
  1035.          pr=1-pr;
  1036.          row[pr]=startx;
  1037.          point[pp++]=startx;
  1038.          point[pp++]=starty;
  1039.          disp_menu(startx,startx);
  1040.          pp=pp % 4;
  1041.          continue;
  1042.      case 15104 : /* F1 pressed */
  1043.           help();
  1044.           continue;
  1045.           }
  1046.  
  1047. disp_menu(row[0],row[1]);
  1048. pp=0;                          }
  1049.      if (edit_flag) ag();
  1050.      if (title_d) return(1);
  1051. next:      while (1){
  1052.       if (cc>0 && p->men[cc].isleaf==IS_SUBMENU){
  1053.     countm+=work->count;
  1054.     item=p->men[cc].name;
  1055.     work=work->next;
  1056.     if (work==NULL)  return(0);
  1057.     p->men[cc].pos=countm;
  1058.     p->men[cc].total=work->count;
  1059.     work->men[0].pos=rr;
  1060.     work->men[0].total=p->count;
  1061.     strcpy(shortname,p->men[cc++].shortn);
  1062.     goto beginn;                   }
  1063.       if (p->men[cc].isleaf==ISLEAF)              {
  1064.      q=p->men[cc].pdb; p->men[cc].total=q->count;
  1065.      p->men[cc].pos=countd; countd+=q->count; }
  1066.       if (++cc>=MENUSIZE) {
  1067.       rr+=p->count;
  1068.       p=p->next;
  1069.       cc=0;
  1070.       if (p==NULL) return(2);
  1071.               }
  1072.               }
  1073. }
  1074.  
  1075.  
  1076.  
  1077. aframe(startx,starty,endx,endy,sss,str)
  1078. int startx,starty;
  1079. int endx,endy;
  1080. int sss;
  1081. char *str;
  1082. {
  1083. static char dd[4][6][3]={
  1084.       "⌐Ñ","⌐º","⌐│","⌐╖","⌐╗","⌐┐",
  1085.       "⌐ñ","⌐ª","⌐░","⌐┤","⌐╕","⌐╝" ,
  1086.       "  ","  ","  ","  ","  ","  " ,
  1087.       "\0\0","\0\0","\0\0","\0\0","\0\0","\0\0"
  1088.                      };
  1089. int row,col;
  1090. int temp;
  1091.  
  1092. if (sss==3)
  1093.    for (temp=0 ; temp<6; temp++)
  1094.       strcpy(dd[3][temp],str);
  1095. if (startx>endx)
  1096.      {
  1097.       temp=startx;
  1098.       startx=endx;
  1099.       endx=temp;
  1100.      }
  1101. if (starty>endy)
  1102.      {
  1103.        temp=starty;
  1104.        starty=endy;
  1105.        endy=temp;
  1106.      }
  1107. if ((starty %2)!=0) starty--;
  1108. if ((endy %2)!=0)  endy--;
  1109.  
  1110. if (startx==endx) {
  1111.      for (row=starty; row<=endy ;){
  1112.          screen[startx][row++]=dd[sss][0][0];
  1113.          screen[startx][row++]=dd[sss][0][1];}
  1114.           return;                 }
  1115.  
  1116. if (starty==endy) {
  1117.        for (row=startx; row<=endx; row++){
  1118.       screen[row][endy]=dd[sss][1][0];
  1119.       screen[row][endy+1]=dd[sss][1][1];}
  1120.       return; }
  1121. screen[startx][starty]=dd[sss][2][0];
  1122. screen[startx][starty+1]=dd[sss][2][1];
  1123. screen[startx][endy]=dd[sss][3][0];
  1124. screen[startx][endy+1]=dd[sss][3][1];
  1125. for(col=starty+2; col<endy;){
  1126.      screen[startx][col++]=dd[sss][0][0];
  1127.      screen[startx][col++]=dd[sss][0][1];
  1128.                    }
  1129.  
  1130. for(row=startx+1; row<endx; ++row){
  1131.     screen[row][starty]=screen[row][endy]=dd[sss][1][0];
  1132.     screen[row][starty+1]=screen[row][endy+1]=dd[sss][1][1];
  1133.                  }
  1134.   screen[endx][starty]=dd[sss][4][0];
  1135.   screen[endx][starty+1]=dd[sss][4][1];
  1136.   for(col=starty+2; col<endy; ++col){
  1137.      screen[endx][col++]=dd[sss][0][0];
  1138.      screen[endx][col]=dd[sss][0][1];
  1139.      }
  1140.   screen[endx][endy]=dd[sss][5][0];
  1141.   screen[endx][endy+1]=dd[sss][5][1];
  1142.    return;
  1143. }
  1144.  
  1145. disp_menu(begin,end)
  1146. int begin, end;
  1147. {
  1148. int i;
  1149.  
  1150. if (begin>end) {
  1151.     i=begin;
  1152.     begin=end;
  1153.     end=i;     }
  1154.  
  1155. if (end>23){ end=23;
  1156.       clear_win(0,0,23,79,6,0,white);
  1157.      }
  1158. for (i=begin; i<=end; ++i){
  1159.   sprint(screen[i],0|30,i,0);
  1160.             }
  1161. return;
  1162. }
  1163.  
  1164. sprint(char *string,int attr,int row,int col)
  1165.  {
  1166.   _SI =(unsigned int) string;
  1167.   _DH=(unsigned char)row;
  1168.   _DL=(unsigned char)col;
  1169.   _CX=1;
  1170.   while(*((char *)_SI)){
  1171.     _AH=(unsigned char)2;
  1172.     _BH=(unsigned char)0;
  1173.     geninterrupt(0x10);
  1174.     ++_DL;
  1175.   _AH=(unsigned char)9;
  1176.   _AL=*((char *)_SI);
  1177.   _SI++;
  1178.   _BH=(unsigned char)0;
  1179.   _BL=(unsigned char)attr;
  1180.   geninterrupt(0x10);
  1181.  }
  1182. }
  1183.  
  1184. cpmenu()
  1185. {
  1186. int row1,row2,col;
  1187. char *t;
  1188. char name[31];
  1189. FILE *fp;
  1190.  
  1191.       switch(work->count/8) {
  1192.     case 0 :
  1193.          format1(&row1,&row2);
  1194.          break;
  1195.  
  1196.     case 1 :
  1197.          format3(&row1,&row2,2);
  1198.          break;
  1199.     default :
  1200.          format3(&row1,&row2,1);
  1201.          break;
  1202.                   }
  1203.     t=item;
  1204.     col=40-strlen(item)/2;
  1205.     while(*t) screen[row1][col++]=*t++;
  1206.     t="╟δ╙├┐╒╕±╝ⁿú½╗╪│╡╝ⁿ╗≥╩²╫╓╝ⁿ╤í╘±";
  1207.     col=30;
  1208.     while (*t) screen[row2][col++]=*t++;
  1209.          }
  1210.  
  1211. format1(row1,row2)
  1212. int *row1,*row2;
  1213. {
  1214.     int row,col;
  1215.     char *t;
  1216.     int cc;
  1217.     char prgname[14];
  1218.     FILE *prg_file;
  1219.  
  1220.     strcpy(prgname,shortname);
  1221.     strcat(prgname,".prg");
  1222.     prg_file=fopen(prgname,"w");
  1223.     fprintf(prg_file,"set color to w/w\nclear\nset color to n/n\n");
  1224.     *row1=9-work->count;
  1225.     row=*row1+2;
  1226.     fprintf(prg_file,"@%d,%d clea to %d,%d\nset color to w+/b\n",row+1,25,row+1+2*work->count,55);
  1227.     fprintf(prg_file,"@%d,%d clea to %d,%d\n",row,23,row+2*work->count,53);
  1228.     aframe(row,10,11+work->count,70,SINGAL);
  1229.     for(row++,cc=0; cc<work->count; row+=2,cc++){
  1230.       col=20;
  1231.       t=number[cc+1];
  1232.       while (*t) screen[row][col++]=*t++;
  1233.       t=" --- ";
  1234.       while (*t) screen[row][col++]=*t++;
  1235.       t=work->men[cc].name;
  1236.       work->men[cc].row=row;
  1237.       work->men[cc].col=20;
  1238.       while(*t) screen[row][col++]=*t++;
  1239.       fprintf(prg_file,"@%d,%d say '%d --- %s'\n",row,28,cc,work->men[cc].name);
  1240.       }
  1241.       *row2=2+row;
  1242.       fprintf(prg_file,"return\n");
  1243.       fclose(prg_file);
  1244.     return;
  1245.     }/* end of format1() */
  1246.  
  1247.  
  1248.    format3(row1,row2,step)
  1249.    int *row1,*row2,step;
  1250.    {
  1251.     int row,col;
  1252.     char *t;
  1253.     int cc;
  1254.     int tt;
  1255.     int rowe;
  1256.     char prgname[14];
  1257.     FILE *prg_file;
  1258.  
  1259.     strcpy(prgname,shortname);
  1260.     strcat(prgname,".prg");
  1261.     prg_file=fopen(prgname,"w");
  1262.     fprintf(prg_file,"set color to w/w\nclear\nset color to n/n\n");
  1263.  
  1264.     if (step==1) tt=4;
  1265.      else tt=2;
  1266.     *row1=9-work->count/tt;
  1267.     rowe=12;
  1268.     switch(work->count % tt) {
  1269.       case 1 :
  1270.       case 2 :  rowe=13;
  1271.         break;
  1272.       case 3 :  rowe=14;
  1273.         break;       }
  1274.     row=*row1+2;
  1275.     fprintf(prg_file,"@%d,%d clea to %d,%d\nset color to w+/b\n",row+1,10,row+1+2*(work->count/tt),70);
  1276.     fprintf(prg_file,"@%d,%d clea to %d,%d\n",row,8,row+2*(work->count/tt),68);
  1277.     aframe(row,4,rowe+work->count/tt,74,SINGAL);
  1278.     for(row++,cc=0; cc<work->count; ++cc,row+=step){
  1279.       col=8;
  1280.       t=number[cc+1];
  1281.       while (*t) screen[row][col++]=*t++;
  1282.       t=" --- ";
  1283.       while (*t) screen[row][col++]=*t++;
  1284.       t=work->men[cc].name;
  1285.       work->men[cc].row=row;
  1286.       work->men[cc].col=8;
  1287.       fprintf(prg_file,"@%d,%d say '%d --- %s'\n",row,10,cc,work->men[cc].name);
  1288.       cc++;
  1289.       while(*t) screen[row][col++]=*t++;
  1290.       if (cc>=work->count) break;
  1291.       col=40;
  1292.       t=number[cc+1];
  1293.       while (*t) screen[row][col++]=*t++;
  1294.       t=" --- ";
  1295.       while (*t) screen[row][col++]=*t++;
  1296.       t=work->men[cc].name;
  1297.       work->men[cc].row=row;
  1298.       work->men[cc].col=40;
  1299.       while (*t) screen[row][col++]=*t++;
  1300.       fprintf(prg_file,"@%d,%d say '%d --- %s'\n",row,40,cc,work->men[cc].name);
  1301.       }
  1302.     *row2=3+row;
  1303.       fprintf(prg_file,"return\n");
  1304.       fclose(prg_file);
  1305.        return;
  1306.        }
  1307.  
  1308. ag()
  1309. {
  1310. int i,j;
  1311. FILE *fp_file;
  1312.  
  1313. strcat(shortname,".prg");
  1314. fp_file=fopen(shortname,"w");
  1315. if (fp_file==NULL) printf("\033[0;%d;44mfile can't be opened\n",fore_red);
  1316. fprintf(fp_file,"clear\nset color to w+/b\ntext\n");
  1317. for(i=0; i<25; ++i){
  1318.  for(j=0;j<79;j++)
  1319.    {
  1320.    if (screen[i][j]=='\0') screen[i][j]=' ';
  1321.    fprintf(fp_file,"%c",screen[i][j]);
  1322.    }
  1323.  screen[i][79]='\0';
  1324.  fprintf(fp_file,"%c\n",screen[i][79]);
  1325. }
  1326. fprintf(fp_file,"endtext\nreturn\n");
  1327. fclose(fp_file);
  1328. return(1);
  1329.     }
  1330.  
  1331. wtofile(){
  1332. int i,j;
  1333. p=root;
  1334. fp_menu=fopen("menu.txt","w");
  1335. fp_db=fopen("db.txt","w");
  1336. while(p!=NULL){
  1337.   for(i=0; i<MENUSIZE; i++){
  1338.    if (p->men[i].isleaf==EMPTY ) continue;
  1339.      if (p->men[i].isleaf==ISLEAF)
  1340.       { q=p->men[i].pdb;
  1341.        for(j=0; j<DBSIZE; j++) {
  1342.         if (q->db[j].name[0]!='\0')
  1343.         fprintf(fp_db,"#%s#,#%s#,#%s#,#%s#,#%s#,#%s#,#%c#,#%c#,#%s#\n",q->db[j].mean\
  1344.        ,q->db[j].mainkey[0],q->db[j].mainkey[1],q->db[j].mainkey[2],\
  1345.         q->db[j].mainkey[3],q->db[j].name,q->db[j].flag,q->db[j].serve,q->db[j].path);
  1346.                   }
  1347.       }
  1348.        fprintf(fp_menu,"#%s#,#%s#,%d,%d,%d,%d,%d\n",p->men[i].name,p->men[i].shortn,p->men[i].isleaf, \
  1349.                 p->men[i].pos,p->men[i].total,p->men[i].row, \
  1350.                 p->men[i].col);
  1351.              } /* end for */
  1352.    p=p->next;   } /*end while */
  1353.    fclose(fp_db);
  1354.    fclose(fp_menu);
  1355.  
  1356. return(1);
  1357.  }
  1358.  
  1359.  
  1360. move(){
  1361.   int step,r,c,i;
  1362.   int choice,act;
  1363.   char last[81], next[81];
  1364.   printf("\033[24;0H\033[0;%d;44m%s\033[24;0H\033[1;%d;44m╟δ╩Σ╚δ╥¬╥╞╢»╡─╫╓╢╬║┼: \033[24;30HAlt_Y : ╜ß╩°   í· : ╙╥╥╞  í√ : ╫≤╥╞",fore_white,spaces,fore_white);
  1365.    for(;;){
  1366.     printf("\033[24;25H");
  1367.        choice=getcc();
  1368.        putchar(choice);
  1369.        if (choice>='0' && choice<='9') {choice-='0';break;}
  1370.        else if (choice>='a' && choice<='l') {choice=choice-'a'+10;break;}
  1371.        }
  1372.  
  1373.        r=work->men[choice].row;
  1374.        strcpy(last,screen[r]);
  1375.        c=work->men[choice].col;
  1376.        for(step=1; step<strlen(work->men[choice].name)+7; c++,step++)
  1377.                last[c]=' ';
  1378.        while((act=getcc())!=Alt_Y && act!=PgDn){
  1379.        switch(act){
  1380.          case 19200 :  c=--work->men[choice].col;  /*<---*/
  1381.                r=work->men[choice].row;
  1382.          for(step=1; step<strlen(work->men[choice].name)+7; c++,step++)
  1383.                 screen[r][c]=screen[r][1+c];
  1384.                 screen[r][c]=last[c];
  1385.                 break;
  1386.           case 19712 :    c=work->men[choice].col++;      /* --> */
  1387.                   r=work->men[choice].row;
  1388.          for(step=strlen(work->men[choice].name)+6,c+=step; step>0; c--,step--)
  1389.                 screen[r][c]=screen[r][c-1];
  1390.                 screen[r][c]=last[c];
  1391.                 break;
  1392.           case 18432 : /*  up arrow */
  1393.                 r=work->men[choice].row--;
  1394.                 c=work->men[choice].col;
  1395.                 strcpy(next,screen[r-1]);
  1396.                 for (step=strlen(work->men[choice].name)+6; step>0; step--){
  1397.                    screen[r-1][c]=screen[r][c++];
  1398.                              }
  1399.                   strcpy(screen[r],last);
  1400.                   strcpy(last,next);
  1401.                  disp_menu(r-1,r-1);
  1402.                  break;
  1403.           case 20480 : /* down arrow */
  1404.                 r=work->men[choice].row++;
  1405.                 c=work->men[choice].col;
  1406.                 strcpy(next,screen[r+1]);
  1407.                 for (step=strlen(work->men[choice].name)+6; step>0; step--){
  1408.                    screen[r+1][c]=screen[r][c++];
  1409.                  }
  1410.                   strcpy(screen[r],last);
  1411.                   strcpy(last,next);
  1412.                  disp_menu(r+1,r+1);
  1413.                  break;
  1414.           default    :
  1415.                 if (act>='0' && act<='9') choice=act-'0';
  1416.              else if (act>='a' && act<='l') choice=act-'a'+10;
  1417.               else continue;
  1418.               printf("\033[24;25H");
  1419.               putchar(act);
  1420.        c=work->men[choice].col;  /*<---*/
  1421.        r=work->men[choice].row;
  1422.        strcpy(last,screen[r]);
  1423.        for(step=1; step<strlen(work->men[choice].name)+7; c++,step++)
  1424.                last[c]=' ';
  1425.             }
  1426.  
  1427.          disp_menu(r,r);
  1428.                }
  1429.     printf("\033[24;0H\033[0;%d;44m%s",fore_white,spaces);
  1430.     return(1);
  1431.        }
  1432.  
  1433.  
  1434.    print(int prow,int pcol,int attr,char *format,...)
  1435. {
  1436.     va_list arg;
  1437.     char print_str[254],*string;
  1438.     va_start(arg,format);
  1439.     vsprintf(print_str,format,arg);
  1440.     string=print_str;
  1441.   _SI =(unsigned int) string;
  1442.   _DH =(unsigned char)prow-1;
  1443.   _DL =(unsigned char)pcol-1;
  1444.   _CX=1;
  1445.    while(*((char *)_SI)){
  1446.    _AH=(unsigned char)2;
  1447.    _BH=(unsigned char)0;
  1448.    geninterrupt(0x10);
  1449.    ++_DL;
  1450.   _AH=(unsigned char)9;
  1451.   _AL=*((char *)_SI);
  1452.   _SI++;
  1453.   _BH=(unsigned char)0;
  1454.   _BL=(unsigned char)attr;
  1455.   geninterrupt(0x10);
  1456.  }
  1457. }
  1458.  
  1459.  
  1460. /*-----------------------------DRAW A FRAME-------------------------------*/
  1461. gframe(startx,starty,endx,endy,i,color)
  1462.  int startx,starty;
  1463.  int endx,endy;
  1464.  int i;
  1465.  int color;
  1466. {
  1467. static char dd[3][6][3]={
  1468.       "⌐Ñ","⌐º","⌐│","⌐╖","⌐╗","⌐┐",
  1469.       "⌐ñ","⌐ª","⌐░","⌐┤","⌐╕","⌐╝" ,
  1470.       "  ","  ","  ","  ","  ","  "
  1471.                      };
  1472. int row,col;
  1473. /*clear_win(startx,starty,endx,endy,6,0,black);*/
  1474. print(startx,starty,color,"%s",dd[i][2]);
  1475. for(col=starty+2; col<endy; col+=2)
  1476.    print(startx,col,color,"%s",dd[i][0]);
  1477. print(startx,endy,color,"%s",dd[i][3]);
  1478.  
  1479. for(row=startx+1; row<endx; ++row)
  1480. {   print(row,starty,color,"%s",dd[i][1]);
  1481.    print(row,endy,color,"%s",dd[i][1]);}
  1482.  
  1483. print(endx,starty,color,"%s",dd[i][4]);
  1484.   for(col=starty+2; col<endy; ++col,++col)
  1485.        print(endx,col,color,"%s",dd[i][0]);
  1486. print(endx,endy,color,"%s",dd[i][5]);
  1487. }
  1488.  
  1489.  
  1490. help()
  1491. {
  1492. clear_win(5,20,17,70,6,0,black);
  1493. clear_win(4,18,16,68,6,0,green);
  1494. printf("\033[6;22H\033[0;%d;%dm─·┐╔╘┌╞┴─╗╡─╚╬╥Γ╬╗╓├╩Σ╚δ╚╬╥Γ╫╓╖√,┐╔╙├╝ⁿ╙╨:\033[7;24H Alt_d : ╙├╥╘▒ú┤µ╡▒╟░╣Γ▒Ω╬╗╓├,╡▒─·▒ú┤µ┴╦╥╗  \
  1495.   \033[8;24H        ╕÷╛╪╨╬╢╘╜╟╡─┴╜╡π║≤,┐╔╙├:     \033[9;24HAlt_c : ╗¡╥╗┤╓┐≥\033[10;24HAlt_x : ╗¡╥╗╧╕┐≥                         \
  1496.   \033[11;24HAlt_q : ╟σ│²╘¡┐≥                     \033[12;24HAlt_z : ╙├─·╧▓╗╢╡─╫╓╖√╗¡┐≥.\033[13;24H***** : ╥▓┐╔╗¡║ß,╩·╧▀        \
  1497.   \033[14;24HAlt_y : ╙├╣Γ▒Ω╝ⁿ╡≈╒√▓╦╡Ñ╧ε╧╘╩╛╬╗╓├.         \033[15;24H***** : ╟δ▓╗╥¬╙├▓σ╚δ╗≥╔╛│²▓┘╫≈╕─▒Σ▓╦╡Ñ╧ε╡─\033[16;24H        ╧╘╩╛╬╗╓├.  \
  1498.           ",fore_cyan,back_green);
  1499. getcc();
  1500. clear_win(4,20,17,70,6,0,blue);
  1501. disp_menu(4,17);
  1502. return;}
  1503.  
  1504. modidb(cc2)
  1505. int cc2;
  1506. {
  1507. int i,j,k;
  1508.  
  1509. printf("\033[24;0H\033[0;%d;44m%s\033[24;20H\033[0;%d;%dm╖¡╥│ : PgUp/PgDn\033[24;45H╔╛│² : Alt_d",fore_yellow,back_green);
  1510. q=work->men[cc2].pdb;
  1511. getdb(cc2);
  1512. }
  1513.  
  1514. titles()
  1515. {
  1516. int i;
  1517.  
  1518. clear_win(0,0,24,79,6,0,black);
  1519. printf("\033[3;0H\033[0;%d;%dm╟δ╔Φ╝╞─·╡─╙ª╙├╧╡═│▒Ω╠Γú¼╕▒▒Ω╠Γ╝░╧╘╩╛╗¡├µ",fore_white,back_black);
  1520.  
  1521. while (! bioskey(1)){
  1522. printf("\033[10;30H\033[1;%d;%dm╩Σ╚╬╥Γ╝ⁿ╝╠╨° . . .",fore_white,back_black);
  1523.  
  1524. for(i=0; i<500&&!bioskey(1); ++i);
  1525. printf("\033[10;30H\033[0;%d;%dm                      ",fore_white,back_black);
  1526. for(i=0;i<100 && !bioskey(1);++i);
  1527. }
  1528. title_d=1;
  1529. func2();
  1530. title_d=0;
  1531. return(1);
  1532. }
  1533.  
  1534.  
  1535.  
  1536.  
  1537.