home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / listings / v_06_03 / v6n3050a.txt < prev    next >
Text File  |  1989-09-28  |  3KB  |  161 lines

  1. #include <stdio.h>
  2.  
  3. #define MAXNAME 128
  4. #define MAXOPTS 20
  5. #define MAXLINE 80
  6.  
  7. #include "scr_def.h"
  8.  
  9. #define NONE 2
  10. #define BACKUP 3
  11. #define DONE 4
  12.  
  13. #define CLEAR_STR "\f"
  14.  
  15. #define ANS_X 0
  16. #define ANS_Y 23
  17.  
  18. #define ESC 0x1b
  19. #define CNTRL_E 0x05
  20.  
  21. #define TRUE 1
  22. #define FALSE 0
  23.  
  24. #ifdef DEBUG
  25. #define DBG(x) printf x
  26. #else
  27. #define DBG(x)
  28. #endif
  29.  
  30. main(argc,argv)
  31. int argc;
  32. char *argv[];
  33. {
  34. int stat;
  35. char *dirname, fname[MAXNAME], *getenv();
  36. char mname[MAXNAME];
  37. FILE *mfile;
  38. void domenu();
  39. void bldfname();
  40.  
  41. scr_init();
  42. if ((dirname = getenv("MENUS")) == NULL){
  43.    dirname = "menus/";
  44.    }
  45. if (argc > 1){
  46.    strcpy(fname,argv[1]);
  47.    }
  48. else strcpy(fname,"main");
  49. bldfname(mname,dirname,fname);
  50. DBG(("effective menu name = /%s/\n",mname));
  51.  
  52. while ((stat=strncmp(fname,"exit",4))!= 0){
  53.    if((mfile = fopen(mname,"r")) == NULL){
  54.       fprintf(stderr,"%s: Can't find menu %s.\n",argv[0],mname);
  55.       scr_end();
  56.       exit(1);
  57.       }
  58.    domenu(mfile,fname);
  59.    fclose(mfile);    
  60.    bldfname(mname,dirname,fname);
  61.    } /* end while */
  62. scr_end();
  63. exit(0);
  64. }   
  65.  
  66. void domenu(file,nxbuf)
  67. FILE *file;
  68. char *nxbuf;
  69. {
  70. char options[MAXOPTS+1];
  71. char backup[MAXNAME+1];
  72. char buf[MAXLINE+1];
  73. char dflt,sel, get_sel();
  74. void do_sel();
  75.  
  76. scr_cls();
  77. fscanf(file,"%[^|]%*c%[^|]%*c%c%*c%s",options,backup,&dflt,nxbuf);
  78. DBG(("options set to /%s/\n",options));
  79. while (strncmp(fgets(buf,MAXLINE,file),"END",3)) scr_put(buf);
  80. sprintf(buf,"ENTER selects %c\n",dflt);
  81. scr_put(buf);
  82. sel=get_sel(options);
  83. if (sel == NONE) sel = dflt;
  84. if (sel == BACKUP) strncpy(nxbuf,backup,MAXNAME);
  85. else if (sel == DONE) strcpy(nxbuf,"exit");
  86. else do_sel(file,sel,nxbuf);
  87. DBG(("next menu set to %s\n",nxbuf));
  88. }
  89.  
  90. char get_sel(opts)
  91. char *opts;
  92. {
  93. char buf[MAXLINE+1];
  94.  
  95. do {
  96.    scr_mv_xy(ANS_X, ANS_Y);
  97.    scr_eol();
  98.    scr_mv_xy(ANS_X, ANS_Y);
  99.    scr_put("Selection...");
  100.    if (opts[0] == 'Y') scr_put("ESC backs up...");
  101.    if (opts[1] == 'Y') scr_put("CNTRL_E exits...");
  102.    scr_get(buf);
  103.    } while  (! in_set(buf[0],opts)); 
  104. if (buf[0] == '\n') return NONE;
  105. if (buf[0] == ESC) return BACKUP;
  106. if (buf[0] == CNTRL_E) return DONE;
  107. return buf[0];
  108. }
  109.  
  110. int in_set(ch,opts)
  111. char ch, *opts;
  112. {
  113. int i;
  114.  
  115. if (ch == '\n') return TRUE;
  116. if ((ch == ESC) && (opts[0] == 'Y')) return TRUE;
  117. if ((ch == CNTRL_E) && (opts[1] == 'Y')) return TRUE;
  118. for (i=2; opts[i]; i++){
  119.    if (ch == opts[i]) return TRUE;
  120.    }
  121. return FALSE;
  122. }
  123.  
  124.  
  125. void bldfname(buf,dir,file)
  126. char *buf, *dir, *file;
  127. {
  128. buf[0] = '\0';
  129. strncat(buf,dir,MAXNAME);
  130. strncat(buf,file,MAXNAME-strlen(dir));
  131.  
  132. void do_sel(file,sel,next)
  133. FILE *file;
  134. char sel, *next;
  135. {
  136. char l_sel,l_next[MAXLINE+1];
  137. char action[MAXLINE+1], atype;
  138. int args;
  139.  
  140. for (;;){
  141.    if ((args=fscanf(file,"%c%c%*c%[^|]%*c%[^\n]%*c",
  142.                     &l_sel,&atype,&l_next[0],&action[0])) ==EOF){
  143.       fprintf(stderr,"Error in menu specification, can't find %c\n",sel);
  144.       return;
  145.       }
  146.    if (sel == l_sel) {
  147.       DBG(("\nmatches = %d",args));
  148.       DBG(("\naction = %s",action));
  149.       DBG(("\nlsel,atype = %c %c ", l_sel, atype));
  150.       if (atype == 'P') system(action);
  151.       else strcpy(next,action);
  152.       if ((l_next[0] != ' ') && (atype != 'M')) strcpy(next,l_next);
  153.       return;
  154.       }
  155.    } 
  156. }
  157.  
  158.  
  159.  
  160.