home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / EFFO / forum5.lzh / SPRACHEN / C / GSHELL / selectfile.c < prev    next >
Text File  |  1988-04-20  |  5KB  |  235 lines

  1. /* dieser File enthaelt die Funktion selectfile */
  2. /* Version 1   7.12.1987   Uwe Simon            */
  3. /* Version 2   14.4.1988   Uwe Simon            */
  4.  
  5.  
  6. #include <stdio.h>
  7. #include <strings.h>
  8. #include <dir.h>
  9. #include <termcap.h>
  10. #include <ctype.h>
  11. #include "selectfile.h"
  12.  
  13. char *cm,*cl,*bl;
  14. short ospeed=0;
  15. char *BC,*UP,PC_=0;
  16. int is_init=0;
  17. char *term_type;
  18. char tcbuf[1024];
  19. char tcapbuf[20], *ptr;
  20. char names[100][MAXNAMLEN+1];
  21.     
  22. tputc(c)
  23. char c;
  24. {
  25.     write(1,&c,1);
  26. }
  27.  
  28.  
  29. gotoxy(x,y)
  30. int x,y;
  31. {
  32.     tputs(tgoto(cm,x,y),1,tputc);
  33. }
  34.  
  35.  
  36. init()
  37. {
  38.     if((term_type=(char *)getenv("TERM"))==NULL) {
  39.         fprintf(stderr,"Enviromentvariable TERM not defined!\n");
  40.         exit(1);
  41.     }
  42.     if(tgetent(tcbuf,term_type)<=0) {
  43.         fprintf("Unknown terminal type '%s'!\n",term_type);
  44.         exit(1);
  45.     }
  46.     ptr=tcapbuf;
  47.     cl=tgetstr("cl",&ptr);
  48.     cm=tgetstr("cm",&ptr);
  49.     if(!(cl&&cm)) 
  50.         fprintf(stderr,"'cl' and 'cm' needed in termcap\n");
  51.     is_init=1;
  52. }
  53.  
  54. int read_sort(s,ma,p)
  55. char *s,*ma;
  56. int p;
  57. /* s ist das Directory 
  58.  * und ma ist die Maske nach der die Files gesucht werden sollen 
  59.  * returns Number der gefundenen Files
  60.  */
  61. {
  62.     DIR *di;
  63.     int anz,mh;
  64.     struct direct *entry;
  65.     
  66.     mh=strlen(ma);
  67.     if((di=opendir(s))==NULL) return(-1);
  68.     else
  69.     {
  70.         for(anz=0;(entry=readdir(di));anz++) {
  71.             strcpy(names[anz],entry->d_name);
  72.             if((!(p&ALL_FILES))&&(names[anz][0]=='.')) anz--;
  73.             else if(ma && (_cmpnam(names[anz],ma,mh)==-1)) anz--;
  74.         }
  75.         closedir(di);
  76.         qsort(names,anz,MAXNAMLEN+1,strcmp);
  77.         return(anz);
  78.     }
  79. }
  80.  
  81. maske(ti,qu,s,pa)
  82. char *ti,*qu,*s;
  83. int pa;
  84. {
  85.     int i;
  86.     
  87.     tputs(cl,1,tputc);
  88.     gotoxy(0,0);
  89.     for(i=0;i<40-(strlen(ti)/2);i++) printf(" ");
  90.     printf("%s\n",ti);
  91.     printf("\nDirectory : %s\n\n",s);
  92.     printf("   +  show next page   -  show first page    A..Z select file\n");
  93.     printf("   !  exit Menue       ");
  94.     if(pa&CHD) printf(".  change directory   ");
  95.     if(pa&PARA) printf("a..z  file with parameter\n");        else printf("\n");
  96.     printf("\n===== %-65s =====\n",qu);
  97.     
  98. }
  99.  
  100.  
  101. int new_dir(xd,fi,pa,pos,ges)
  102. char *xd,*fi;
  103. int pa,pos,ges;
  104. {
  105.     char s[70],c,*h;
  106.     int anz;
  107.     gotoxy(0,23);
  108.     printf("Select directory ('.' one back) ? ");
  109.     fflush(stdout);    
  110.     read(fileno(stdin),&c,1);
  111.     c=toupper(c);
  112.     switch(c) {
  113.         case '.':
  114.             strcpy(s,xd);
  115.             if((h=rindex(&s[1],'/'))!=NULL) *h='\0';
  116.             break;
  117.         case '\n':
  118.             gotoxy(0,23);
  119.             printf("Path of the new directory (from rootdir) ? ");
  120.             fflush(stdout);
  121.             s[readln(fileno(stdin),s,70)-1]='\0';
  122.             break;
  123.         default:
  124.             if((c>='A')&&(c<=ges+'@')) {
  125.                 strcpy(s,xd);
  126.                 strcat(s,"/"); 
  127.                 strcat(s,names[c-'A'+pos]);
  128.             }
  129.             else printf("%c  ",7);
  130.             break;
  131.     }
  132.     if((anz=read_sort(s,fi,pa))>=0) {
  133.         strcpy(xd,s); /* directory zurueckgeben */
  134.         return(anz);
  135.     }
  136.     else return(-1);
  137. }
  138.  
  139.  
  140. /* der Aufruf select_file("....",PARA ermoeglicht auch Parameterangaben */
  141.  
  142. char *select_file(ti,qu,xd,pa,ma,prog)   
  143.    /* gibt NULL zurueck falls keine Auswahl moeglich oder abgebrochen wurde */
  144. char *ti,*qu,*xd,*prog; /* gib Titel ti aus                       */
  145.                         /* stell die Frage qu                     */
  146.                         /* xd Startdirectory fuer Kommandoauswahl */
  147.                         /* in xd wird das aktuell angewaehlte Directory zurueckgegeben */
  148. int pa;               /* p== PARA dann mit Parameterangabe      */
  149. {
  150.     int pos,anz,weiter,ok,error,anz_files;
  151.     char c,fi[100],s[100],hi[100];
  152.     if(!is_init) init();
  153.     strcpy(s,xd);
  154.     error=((anz_files=read_sort(s,ma,pa))==-1);
  155.     maske(ti,qu,s,pa);
  156.     pos=0;
  157.  
  158.     do {
  159.         anz=0; c='A';
  160.         if(error) printf("\n\n\n can't open %s\n",s);
  161.         while(anz+pos<anz_files &&(c<='Z')) {
  162.             printf("%c  %-32s",c++,names[pos+anz]);
  163.             anz++;
  164.             if(c&1) printf("\n");
  165.         }
  166.         if(!(c&1)) printf("\n");
  167.         gotoxy(0,23);
  168.         printf("Select file : ");
  169.         fflush(stdout); read(fileno(stdin),&c,1);
  170.             if(!(pa&PARA)) c=toupper(c);  /* keine parameter erlauben */
  171.             switch(c) {
  172.                 case '!':
  173.                     weiter=0;
  174.                     break;
  175.                 case '\n':
  176.                     if(pa&CHD) {
  177.                         gotoxy(0,23);
  178.                         printf("Name of the Files ? "); fflush(stdout);
  179.                         fi[readln(fileno(stdin),fi,100)-1]='\0';
  180.                         weiter=0;
  181.                         break;
  182.                     } else {
  183.                         printf("%c",7);
  184.                         weiter=1;
  185.                     }
  186.                 case '.':   
  187.                     weiter=1;
  188.                         if(pa&CHD) {
  189.                             strcpy(s,xd);
  190.                             if((anz_files=new_dir(s,ma,pa,pos,anz))==-1) error=1;
  191.                             else {
  192.                                 strcpy(xd,s);
  193.                                 error=0;
  194.                                 pos=0;
  195.                             }
  196.                         }
  197.                         else printf("%c",7);
  198.                         break;
  199.                 case '-':
  200.                     pos=(pos>26)?pos-26:0;
  201.                     weiter=1;
  202.                     break;
  203.                 case '+':
  204.                     weiter=1;
  205.                     pos=(pos<anz_files-26)?pos+26:0;
  206.                     break;
  207.                 default: {
  208.                     int pr;
  209.                     
  210.                     weiter=0;
  211.                     if(islower(c)) {
  212.                         pr=1; c=toupper(c);
  213.                     } else pr=0;
  214.                     if((c>='A')&&(c<=anz+'@')) {   /* hole entsprechenden Eintrag */
  215.                         strcpy(fi,names[c-'A'+pos]);
  216.                         printf("%c%s ",8,fi);                
  217.                         if(pr) {
  218.                             fflush(stdout); 
  219.                             fgets(hi,70,stdin);
  220.                             strcat(fi," "); strcat(fi,hi);
  221.                         }
  222.                     } else {
  223.                         printf("%c",7);
  224.                         weiter=1;
  225.                     }
  226.                 }
  227.             }
  228.         if(weiter) maske(ti,qu,s,pa);
  229.     } while(weiter);    
  230.     if(c=='!') return(NULL);
  231.     printf("\n");
  232.     strcpy(prog,fi);
  233.     return(prog);
  234. }
  235.