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 >
Wrap
Text File
|
1988-04-20
|
5KB
|
235 lines
/* dieser File enthaelt die Funktion selectfile */
/* Version 1 7.12.1987 Uwe Simon */
/* Version 2 14.4.1988 Uwe Simon */
#include <stdio.h>
#include <strings.h>
#include <dir.h>
#include <termcap.h>
#include <ctype.h>
#include "selectfile.h"
char *cm,*cl,*bl;
short ospeed=0;
char *BC,*UP,PC_=0;
int is_init=0;
char *term_type;
char tcbuf[1024];
char tcapbuf[20], *ptr;
char names[100][MAXNAMLEN+1];
tputc(c)
char c;
{
write(1,&c,1);
}
gotoxy(x,y)
int x,y;
{
tputs(tgoto(cm,x,y),1,tputc);
}
init()
{
if((term_type=(char *)getenv("TERM"))==NULL) {
fprintf(stderr,"Enviromentvariable TERM not defined!\n");
exit(1);
}
if(tgetent(tcbuf,term_type)<=0) {
fprintf("Unknown terminal type '%s'!\n",term_type);
exit(1);
}
ptr=tcapbuf;
cl=tgetstr("cl",&ptr);
cm=tgetstr("cm",&ptr);
if(!(cl&&cm))
fprintf(stderr,"'cl' and 'cm' needed in termcap\n");
is_init=1;
}
int read_sort(s,ma,p)
char *s,*ma;
int p;
/* s ist das Directory
* und ma ist die Maske nach der die Files gesucht werden sollen
* returns Number der gefundenen Files
*/
{
DIR *di;
int anz,mh;
struct direct *entry;
mh=strlen(ma);
if((di=opendir(s))==NULL) return(-1);
else
{
for(anz=0;(entry=readdir(di));anz++) {
strcpy(names[anz],entry->d_name);
if((!(p&ALL_FILES))&&(names[anz][0]=='.')) anz--;
else if(ma && (_cmpnam(names[anz],ma,mh)==-1)) anz--;
}
closedir(di);
qsort(names,anz,MAXNAMLEN+1,strcmp);
return(anz);
}
}
maske(ti,qu,s,pa)
char *ti,*qu,*s;
int pa;
{
int i;
tputs(cl,1,tputc);
gotoxy(0,0);
for(i=0;i<40-(strlen(ti)/2);i++) printf(" ");
printf("%s\n",ti);
printf("\nDirectory : %s\n\n",s);
printf(" + show next page - show first page A..Z select file\n");
printf(" ! exit Menue ");
if(pa&CHD) printf(". change directory ");
if(pa&PARA) printf("a..z file with parameter\n"); else printf("\n");
printf("\n===== %-65s =====\n",qu);
}
int new_dir(xd,fi,pa,pos,ges)
char *xd,*fi;
int pa,pos,ges;
{
char s[70],c,*h;
int anz;
gotoxy(0,23);
printf("Select directory ('.' one back) ? ");
fflush(stdout);
read(fileno(stdin),&c,1);
c=toupper(c);
switch(c) {
case '.':
strcpy(s,xd);
if((h=rindex(&s[1],'/'))!=NULL) *h='\0';
break;
case '\n':
gotoxy(0,23);
printf("Path of the new directory (from rootdir) ? ");
fflush(stdout);
s[readln(fileno(stdin),s,70)-1]='\0';
break;
default:
if((c>='A')&&(c<=ges+'@')) {
strcpy(s,xd);
strcat(s,"/");
strcat(s,names[c-'A'+pos]);
}
else printf("%c ",7);
break;
}
if((anz=read_sort(s,fi,pa))>=0) {
strcpy(xd,s); /* directory zurueckgeben */
return(anz);
}
else return(-1);
}
/* der Aufruf select_file("....",PARA ermoeglicht auch Parameterangaben */
char *select_file(ti,qu,xd,pa,ma,prog)
/* gibt NULL zurueck falls keine Auswahl moeglich oder abgebrochen wurde */
char *ti,*qu,*xd,*prog; /* gib Titel ti aus */
/* stell die Frage qu */
/* xd Startdirectory fuer Kommandoauswahl */
/* in xd wird das aktuell angewaehlte Directory zurueckgegeben */
int pa; /* p== PARA dann mit Parameterangabe */
{
int pos,anz,weiter,ok,error,anz_files;
char c,fi[100],s[100],hi[100];
if(!is_init) init();
strcpy(s,xd);
error=((anz_files=read_sort(s,ma,pa))==-1);
maske(ti,qu,s,pa);
pos=0;
do {
anz=0; c='A';
if(error) printf("\n\n\n can't open %s\n",s);
while(anz+pos<anz_files &&(c<='Z')) {
printf("%c %-32s",c++,names[pos+anz]);
anz++;
if(c&1) printf("\n");
}
if(!(c&1)) printf("\n");
gotoxy(0,23);
printf("Select file : ");
fflush(stdout); read(fileno(stdin),&c,1);
if(!(pa&PARA)) c=toupper(c); /* keine parameter erlauben */
switch(c) {
case '!':
weiter=0;
break;
case '\n':
if(pa&CHD) {
gotoxy(0,23);
printf("Name of the Files ? "); fflush(stdout);
fi[readln(fileno(stdin),fi,100)-1]='\0';
weiter=0;
break;
} else {
printf("%c",7);
weiter=1;
}
case '.':
weiter=1;
if(pa&CHD) {
strcpy(s,xd);
if((anz_files=new_dir(s,ma,pa,pos,anz))==-1) error=1;
else {
strcpy(xd,s);
error=0;
pos=0;
}
}
else printf("%c",7);
break;
case '-':
pos=(pos>26)?pos-26:0;
weiter=1;
break;
case '+':
weiter=1;
pos=(pos<anz_files-26)?pos+26:0;
break;
default: {
int pr;
weiter=0;
if(islower(c)) {
pr=1; c=toupper(c);
} else pr=0;
if((c>='A')&&(c<=anz+'@')) { /* hole entsprechenden Eintrag */
strcpy(fi,names[c-'A'+pos]);
printf("%c%s ",8,fi);
if(pr) {
fflush(stdout);
fgets(hi,70,stdin);
strcat(fi," "); strcat(fi,hi);
}
} else {
printf("%c",7);
weiter=1;
}
}
}
if(weiter) maske(ti,qu,s,pa);
} while(weiter);
if(c=='!') return(NULL);
printf("\n");
strcpy(prog,fi);
return(prog);
}