home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ST-Computer Leser-CD 1999 January
/
STC_CD_01_1999.iso
/
base
/
pd_ph105
/
easyfsel.c
< prev
next >
Wrap
C/C++ Source or Header
|
2000-01-08
|
15KB
|
478 lines
/********************************************************************/
/* EASYFSEL.C */
/* */
/* Routine zum leichten und AES-Versions abhängigen Aufruf der */
/* GEM-Fileselectorbox mit Auswertung des 'FSEL' - Cookies. */
/* Au₧erdem sind einige Routinen zum Umgang mit Dateien enthalten, */
/* sowie zum Suchen eines Cookies. */
/* */
/* Version : 1.27 */
/* Datum : 15.06.1992 */
/* Autor : Andreas Papula (falls nicht anders angegeben) */
/* */
/* Copyright 1992 by MAXON Computer GmbH */
/********************************************************************/
/*------------------------------------------------------------------*/
/* Include-Files einbinden. */
/*------------------------------------------------------------------*/
#include "easyfsel.h"
#include <aes.h>
#include <stddef.h>
#include <string.h>
#include <ext.h>
#include <stdlib.h>
DTA Dta;
#define _sysbase (0x4f2l)
/* -------------------------------------------------------------------- */
/* Globale Variablen */
/* -------------------------------------------------------------------- */
DTAX My_dta;
/* -------------------------------------------------------------------- */
/* lokale Funktionsprototypen */
/* -------------------------------------------------------------------- */
long * get_cookie_ptr(long cookie_name);
int cmp_maske(char *str,char *maske);
/*------------------------------------------------------------------*/
/* BOOLEAN easy_fsel(BYTE *pfad, BYTE *dateiname, BYTE *text) */
/* */
/* Zeigt die Fileselectorbox je nach AES-Version und 'FSEL'-Cookie */
/* an und übernimmt die Auswertung. */
/* Bei einer AES-Version >= 0x0014 oder gesetztem 'FSEL-Cookie' */
/* wird fsel_exinput() aufgerufen, sonst fsel_input(). */
/* */
/* Parameter:Pfad und Dateiname, mit denen die Fileselectorbox */
/* aufgerufen werden soll. */
/* Rückgabe :TRUE, wenn alles glattging und der Benutzer OK ge- */
/* drückt hat, FALSE falls ein Fehler aufgetreten ist */
/* oder Abbruch gewählt wurde. Der neue Pfad steht */
/* in 'pfad', der ausgewählte Dateiname in dateiname'. */
/*------------------------------------------------------------------*/
BOOLEAN easy_fsel(BYTE *pfad, BYTE *dateiname, BYTE *text)
{
WORD button;
WORD result;
LONG c_wert = 0;
/* Entsprechend der Version und des 'FSEL' - Cookies */
/* fsel_input() oder fsel_exinput() aufrufen */
if(_GemParBlk.global[0] < 0x0140 && get_cookie('FSEL', &c_wert) == FALSE)
result = fsel_input(pfad, dateiname, &button);
else
result = fsel_exinput(pfad, dateiname, &button, text);
/* Wenn Fehler aufgetreten oder Abbruch ausgewählt */
if(result == 0 || button == 0)
return FALSE;
else
return TRUE;
}
/*------------------------------------------------------------------*/
/* VOID build_filename(BYTE *dest, BYTE *pfad, BYTE *dateiname) */
/* */
/* Bastelt Pfad- und Dateinamen zusammen. */
/* */
/* Parameter:dest = Zielstring. */
/* pfad = Pfadname. */
/* dateiname = Dateiname. */
/* Rückgabe :Das Ergebnis befindet sich in dest. */
/*------------------------------------------------------------------*/
VOID build_filename(BYTE *dest, BYTE *pfad, BYTE *dateiname)
{
BYTE *xyz;
strcpy(dest, pfad);
xyz = strrchr(dest, (int) '\\');
strcpy(++xyz, dateiname);
}
/*------------------------------------------------------------------*/
/* BYTE *get_akt_path(BYTE *path) */
/* */
/* Gibt das aktuelle Laufwerk und dessen Pfad zurück. */
/* */
/* Parameter: Zeiger auf einen String. */
/* Rückgabe : Zeiger auf das aktuelle Laufwerk und Directory. */
/*------------------------------------------------------------------*/
BYTE *get_akt_path(BYTE *path)
{
strcpy(path, " :");
path[0] = 'A' + getdisk(); /* Laufwerk */
getcurdir(0, path+2); /* Directory */
strcat(path,"\\");
return(path);
}
/*------------------------------------------------------------------*/
/* long lof(FILE *stream) */
/* */
/* Ermittelt die Länge eines offenen Files */
/* */
/* */
/* Parameter: das File */
/* Rückgabe : Länge des Files */
/* */
/* (c) Dimitri Junker */
/*------------------------------------------------------------------*/
long lof(FILE *stream)
{ long pos,len;
pos=ftell(stream);
fseek(stream,0,SEEK_END);
len=ftell(stream);
fseek(stream,pos,SEEK_SET);
return(len);
}
/*------------------------------------------------------------------*/
/* BOOLEAN get_cookie(long cookie_name, LONG *cookie_value)*/
/* Ermittelt den Wert eines Cookies */
/* */
/* Parameter: cookie_name: Name des zu suchenden Cookies */
/* *cookie_value: Pointer für die Rückgabe */
/* Rückgabe : 0,1: 1=erfolgreich */
/* falls 1: Wert des Cookies in cookie_value */
/* cookie_value kann NULL sein, dann wird nur die */
/* Existenz des Cookies getestet */
/* */
/* (c) Dimitri Junker */
/* */
/*------------------------------------------------------------------*/
BOOLEAN get_cookie(long cookie_name, LONG *cookie_value)
{
LONG *cookie;
int ret=1;
/* Zuerst einen Zeiger auf den Cookie holen */
cookie = get_cookie_ptr(cookie_name);
/* Ist der Cookiejar vorhanden ? */
if(!cookie)
ret=0;
else
{ if(!cookie[0])
ret=0;
else
{ if(cookie_value)
*cookie_value=cookie[1];
}
}
return(ret);
}
/*------------------------------------------------------------------*/
/* long get_cookie_jar() */
/* */
/* Ermittelt die Adresse des Cookie Jar. */
/* */
/* Parameter:keine */
/* Rückgabe :Adresse, falls der Cookie Jar gefunden wurde, */
/* NULL falls kein Cookie-Jar */
/* Besonderheit: mu₧ per Supexec aufgerufen werden */
/* (c) by Dimitri Junker 1996 */
/*------------------------------------------------------------------*/
long get_cookie_jar()
{
LONG *cookiejar;
cookiejar = *((LONG **) 0x5a0L);
return((long)cookiejar);
}
/*------------------------------------------------------------------*/
/* long *get_cookie_ptr(BYTE *cookie_name) */
/* */
/* Sucht nach einem Cookie 'cookie_name' und liefert dessen */
/* Adresse zurück. */
/* */
/* Parameter:Name des Cookies */
/* Rückgabe :Adresse, falls der Cookie gefunden wurde, */
/* Adresse des NULL-cookie falls nicht vorhanden */
/* NULL falls kein Cookie-Jar */
/* (c) by Dimitri Junker 1996 */
/*------------------------------------------------------------------*/
long * get_cookie_ptr(long cookie_name)
{
LONG *cookiejar;
/* Zuerst einen Zeiger auf den Cookiejar holen */
cookiejar = (long *)Supexec(get_cookie_jar);
/* Ist der Cookiejar vorhanden ? */
if(!cookiejar)
return(NULL);
else
{
do
{
/* Ist es unser Cookie ? */
if(*cookiejar== cookie_name)
break;
else
{
/* nächster Cookie aus Jar */
cookiejar = &(cookiejar[2]);
}
}
while(cookiejar[0]); /* solange nicht NULL-Cookie */
return(cookiejar);;
}
}
/*------------------------------------------------------------------*/
/* long get_act_pd() */
/* */
/* Gibt die Basepage des aktuellen Proz. zurück */
/* */
/* Parameter: keiner */
/* Rückgabe :Die Funktion liefert als Ergebnis den Pointer, */
/* allerdings als long, wegen Supexec */
/* (c) by Dimitri Junker 1996 */
/* nach Profibuch S.185 */
/* Besonderheit: mu₧ per Supexec aufgerufen werden */
/*------------------------------------------------------------------*/
long get_act_pd(void)
{ BASPAG *bp;
SYSHDR *os;
os=*(SYSHDR **)_sysbase;
os=os->os_base;
bp=*os->_run;
return((long)bp);
}
/*------------------------------------------------------------------*/
/* BOOLEAN exist(const BYTE *dateiname) */
/* */
/* Überprüft, ob die Datei 'dateiname' existiert. */
/* */
/* Parameter:Name der Datei. */
/* Rückgabe :TRUE, falls die Datei existiert, FALSE wenn nicht. */
/*------------------------------------------------------------------*/
BOOLEAN exist(const BYTE *dateiname)
{
if(fsfirst(dateiname, FA_READONLY | FA_HIDDEN | FA_SYSTEM |
FA_ARCHIVE) == 0)
return TRUE;
else
return FALSE;
}
/*------------------------------------------------------------------*/
/* int fsfirst( const char *filename, int attr ); */
/* */
/* Wie das gro₧e Vorbild, aber auch für alternative Filesysteme */
/* */
/* Parameter:f_name: Filename, Pfad o.ä. der angepa₧t werden soll */
/* pfad: Pfad für den es getestet wird */
/* Rückgabe :Die Funktion liefert als Ergebnis 0, wenn eine Datei */
/* gefunden werden konnte, ansonsten einen Fehlercode. */
/* die eigentliche Rückgabe geschiet in My_dta */
/* (c) by Dimitri Junker 1996 */
/*------------------------------------------------------------------*/
int fsfirst( const char *filename, int attr )
{ static int first=1;
int rueck;
XATTR xdummy;
long ldummy;
if(first)
{ first=0;
Fsetdta(&Dta);
My_dta.d_flags=0;
My_dta.d_max_name=FILENAME_MAX;
My_dta.d_max_pfad=PATH_MAX;
My_dta.d_fname=malloc(My_dta.d_max_name+My_dta.d_max_pfad+4);
My_dta.d_fname=&My_dta.d_fname[4];
My_dta.d_pfad=&My_dta.d_fname[My_dta.d_max_name];
My_dta.d_sattr=attr;
if(Pdomain(-1)==1)
{ if((My_dta.d_handle=Dopendir(".",0))!=-32l)
{ My_dta.d_flags=DTF_DO;
if(Fxattr(0,".",&xdummy)!=-32)
My_dta.d_flags|=DTF_FX;
if(Dxreaddir(FILENAME_MAX,My_dta.d_handle,My_dta.d_fname,&xdummy,&ldummy)!=-32)
My_dta.d_flags|=DTF_FX;
Dclosedir(My_dta.d_handle);
}
}
}
else
{ if((My_dta.d_flags&DTF_DO)!=0)
Dclosedir(My_dta.d_handle);
}
if((My_dta.d_flags&DTF_DO)!=0)
{ trenn_pfad(My_dta.d_pfad,My_dta.d_maske,filename);
if(((My_dta.d_handle=Dopendir(My_dta.d_pfad,0))&0xff000000l)==0l)
rueck=fsnext();
else
rueck=(int)My_dta.d_handle;
}
else
{ if((rueck=Fsfirst(filename,attr))==0)
{ memcpy(&My_dta,&Dta,(int)offsetof(DTAX,d_max_pfad));
strcpy(My_dta.d_fname,Dta.d_fname);
}
My_dta.d_max_pfad=PATH_MAX;
My_dta.d_max_name=12;
}
return(rueck);
}
/*------------------------------------------------------------------*/
/* void trenn_pfad(char *pfad,char *name,char *file) */
/* */
/* Bastelt Pfad- und Dateinamen auseinander, */
/* Gegenteil von build_filename. */
/* dabei endet der Pfad mit '\\' */
/* */
/* Parameter: file = File mit Pfad+Name */
/* pfad = Pfadname. */
/* name = Dateiname. */
/* file und pfad dürfen gleich sein */
/* war nicht Teil des Originals, also von DYJ */
/*------------------------------------------------------------------*/
void trenn_pfad(char *pfad,char *name,const char *file)
{ char *ptr;
if(file!=pfad)
strcpy(pfad,file);
if((ptr=strrchr(pfad,'\\'))==NULL)
ptr=pfad; /* dann ist wohl alles nur Name */
else
ptr++;
strcpy(name,ptr);
*ptr='\0';
}
/*------------------------------------------------------------------*/
/* int fsnext(void); */
/* */
/* Wie das gro₧e Vorbild, aber auch für alternative Filesysteme */
/* */
/* Parameter:nur die in My_dta */
/* Rückgabe :Die Funktion liefert als Ergebnis 0, wenn eine Datei */
/* gefunden werden konnte, ansonsten einen Fehlercode. */
/* die eigentliche Rückgabe geschiet in My_dta */
/* (c) by Dimitri Junker 1996 */
/*------------------------------------------------------------------*/
int fsnext(void)
{ int rueck;
XATTR xattr;
char name[PATH_MAX+FILENAME_MAX];
long xret=-32l;
if((My_dta.d_flags&DTF_DO)==0)
{ if((rueck=Fsnext())==0)
{ memcpy(&My_dta,&Dta,(int)offsetof(DTAX,d_max_pfad));
strcpy(My_dta.d_fname,Dta.d_fname);
}
}
else
{ do
{ if((My_dta.d_flags&DTF_DX)==0)
rueck=(int)Dreaddir(My_dta.d_max_name,My_dta.d_handle,&My_dta.d_fname[-4]);
else
rueck=(int)Dxreaddir(My_dta.d_max_name,My_dta.d_handle,&My_dta.d_fname[-4],&xattr,&xret);
switch(rueck)
{ case 0:
rueck=1-cmp_maske(My_dta.d_fname,My_dta.d_maske);
break;
case -64:
My_dta.d_max_name*=2;
My_dta.d_fname=realloc(&My_dta.d_fname[-4],My_dta.d_max_name+My_dta.d_max_pfad+4);
My_dta.d_fname=&My_dta.d_fname[4];
My_dta.d_pfad=&My_dta.d_fname[My_dta.d_max_name];
rueck=1;
break;
}
if(!rueck) /* dann noch die Attribute testen */
{ if((My_dta.d_flags&(DTF_DX|DTF_FX))==DTF_FX)
{ build_filename(name,My_dta.d_pfad,My_dta.d_fname);
xret=Fxattr(0,name,&xattr);
}
if(!xret)
{ if((xattr.attr&(~My_dta.d_sattr))==0)
{ My_dta.d_attrib=xattr.attr;
My_dta.d_time=xattr.mtime;
My_dta.d_date=xattr.mdate;
My_dta.d_length=xattr.size;
}
else
rueck=1;
}
}
}while(rueck==1);
}
return(rueck);
}
/*------------------------------------------------------------------*/
/* int cmp_maske(char *str,char *maske); */
/* */
/* Prüft ob str mit maske verträglich ist. */
/* */
/* Parameter: str ein String */
/* maske die maske, mit * und ? */
/* Achtung *? ist nicht =* sondern irgendwas gefolgt von '?' */
/* Rückgabe :Die Funktion liefert als Ergebnis 1, wenn */
/* beide verträglich sind, sonst 0 */
/* (c) by Dimitri Junker 1996 */
/*------------------------------------------------------------------*/
int cmp_maske(char *str,char *maske)
{ char *m_ptr,*s_ptr;
int gleich=-1;
m_ptr=maske;
s_ptr=str;
while(gleich==-1)
{ switch((int)*m_ptr)
{ case '*':
if(*(++m_ptr))
{ if((s_ptr=strchr(s_ptr,(int)m_ptr[1]))==NULL)
gleich=0;
else
m_ptr++;
}
else
gleich=1;
break;
case '?':
if(*s_ptr)
{ s_ptr++;
m_ptr++;
}
else
gleich=0;
break;
case '\0':
gleich=(*s_ptr=='\0');
break;
default:
if(*s_ptr==*m_ptr)
{ s_ptr++;
m_ptr++;
}
else
gleich=0;
}
}
return(gleich);
}
/*----------------------- Ende der Datei. --------------------------*/