home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Computer Club Elmshorn Atari PD
/
CCE_PD.iso
/
pc
/
0400
/
CCE_0493.ZIP
/
CCE_0493.PD
/
SLECTRIC.110
/
FSEL_INP.C
< prev
next >
Wrap
C/C++ Source or Header
|
1992-06-04
|
10KB
|
340 lines
/* ------------------------------------------------------------------------- */
/* ----- fsel_inp.c ----- Ein universeller fsel_(ex)input() Call ----------- */
/* ---------------------- und Routinen für den Selectric Support ----------- */
/* ------------------------------------------------------------------------- */
/* ----------------------------------------- (c) 1992 by Oliver Scheel ----- */
/* ------------------------------------------------------------------------- */
#include <string.h>
#include <tos.h>
#include <vdi.h>
#include "fsel_inp.h"
#define NULL ((void *) 0l)
#define FALSE 0
#define TRUE (!FALSE)
/* ------------------------------------------------------------------------- */
SLCT_STR *slct = NULL;
long *fsel = NULL;
SYSHDR *sys_header;
/* ----- Cookie Jar -------------------------------------------------------- */
typedef struct
{
long id,
*ptr;
} COOKJAR;
/* ------------------------------------------------------------------------- */
/* ----- get_cookie -------------------------------------------------------- */
/* ------------------------------------------------------------------------- */
long *get_cookie(long cookie)
{
long sav;
COOKJAR *cookiejar;
int i = 0;
sav = Super((void *)1L);
if(sav == 0L)
sav = Super(0L);
cookiejar = *((COOKJAR **)0x05a0l);
sys_header = *((SYSHDR **)0x04f2L); /* ... wenn wir schonmal
super drauf sind */
if(sav != -1L)
Super((void *)sav);
if(cookiejar)
{
while(cookiejar[i].id)
{
if(cookiejar[i].id == cookie)
return(cookiejar[i].ptr);
i++;
}
}
return(0l);
}
/* ------------------------------------------------------------------------- */
/* ----- fsel_check -------------------------------------------------------- */
/* ------------------------------------------------------------------------- */
/*
** int fsel_check(void)
**
** Funktion: Prüft nach, ob ein FSEL-Cookie vorhanden ist.
**
** Parameter: keine
**
** Return: TRUE FSEL-Cookie vorhanden.
** FALSE -----"----- nicht vorhanden.
**
** ------------------------------------------------------------------------- */
int fsel_check(void)
{
if(!fsel)
fsel = get_cookie('FSEL');
return(fsel ? TRUE : FALSE);
}
/* ------------------------------------------------------------------------- */
/* ----- slct_check -------------------------------------------------------- */
/* ------------------------------------------------------------------------- */
/*
** int slct_check(unsigned int version)
**
** Funktion: Checkt, ob Selectric installiert ist und ob es
** die Mindest-Versionsnummer besitzt.
**
** Parameter: version Enhält die zu prüfende Versionsnummer
** (es wird ein '>='-Test gemacht!!)
**
** Return: TRUE Selectric ist installiert und
** die Versionsnummer ist ok.
** FALSE Entweder nicht installiert oder zu
** niedrige Versionsnummer.
**
** ------------------------------------------------------------------------- */
int slct_check(unsigned int version)
{
if(fsel_check())
{
slct = (SLCT_STR *)fsel;
if(slct->id != 'SLCT')
slct = 0L;
}
if(slct && (slct->version >= version))
return(TRUE);
else
return(FALSE);
}
/* ------------------------------------------------------------------------- */
/* ----- file_select ------------------------------------------------------- */
/* ------------------------------------------------------------------------- */
/*
** int file_select(char *pfname, char *pname, char *fname, char *ext,
** char *title)
**
** Funktion: Ruft den FileSelector in komfortabler Art und Weise
** auf. Dabei kann man alle Parts (Filename, Pathname,
** etc.) einzeln übergeben. Man kann aber auch Pathname
** und den kompletten Namen in `pfname' übergeben. Diese
** Routine sucht sich schon das, was ihr fehlt in
** bestimmten Grenzen selbst heraus.
** Diese Funktion unterstützt den FSEL-Cookie und läuft
** auch ohne Selectric.
**
** Parameter: *pfname Enthält abschließend den fertigen Pfad, den
** man sofort in ein `open' einsetzen kann.
** *pname Der Startpfad (ohne Wildcards!).
** *fname Ein voreingestellte Filenamen.
** *ext Eine Extension.
** *title Einen Boxtitel. Dabei wird a) die TOS-Version
** als auch der FSEL-Cookie überprüft.
**
** Return: Der Button mit dem der Selector verlassen wurde.
**
** Bemerkung: Beim Aufruf aus Accessories nicht vergessen ein
** BEG/END_UPDATE um diesen Aufruf zu legen!!!!!!!!!!
** Die meisten File-Selector Clones (incl. Selectric)
** machen das eh, nicht aber das Original ...
**
** ------------------------------------------------------------------------- */
int file_select(char *pfname, char *pname, char *fname, const char *ext, char *title)
{
int but;
char *p;
if(!fname[0])
{
p = strrchr(pfname, '\\');
if(p)
strcpy(fname, p+1);
else
strcpy(fname, pfname);
}
if(!pname[0])
{
p = strrchr(pfname, '\\');
if(p)
{
p[1] = '\0';
strcpy(pname, pfname);
}
}
else if(pname[strlen(pname)-1] != '\\')
strcat(pname, "\\");
strcat(pname, ext);
if(fsel_check() || (sys_header->os_version >= 0x0104))
fsel_exinput(pname, fname, &but, title);
else
fsel_input(pname, fname, &but);
p = strrchr(pname, '\\');
if(p)
*p = '\0';
strcpy(pfname, pname);
strcat(pfname, "\\");
strcat(pfname, fname);
return(but);
}
/* ------------------------------------------------------------------------- */
/* ----- slct_extpath ------------------------------------------------------ */
/* ------------------------------------------------------------------------- */
/*
** int slct_extpath(int ext_num, char *ext[], int path_num, char *paths[])
**
** Funktion: Setzt benutzerdefinierte Extensions und Pfade,
** welche dann von Selectric benutzt werden. Die
** Extensions und Pfade müssen vor jedem Selectric-
** Aufruf gesetzt werden!
**
** Parameter: ext_num Anzahl der Extensions
** *ext[] Die Extensions
** path_num Anzahl Pfade
** *paths[] Die Pfade
**
** Return: TRUE Selectric ist installiert
** FALSE Selectric ist nicht installiert
**
** ------------------------------------------------------------------------- */
int slct_extpath(int ext_num, char *(*ext)[], int path_num, char *(*paths)[])
{
if(slct_check(0x0100))
{
slct->num_ext = ext_num;
slct->ext = ext;
slct->num_paths = path_num;
slct->paths = paths;
return(TRUE);
}
else
return(FALSE);
}
/* ------------------------------------------------------------------------- */
/* ----- slct_morenames ---------------------------------------------------- */
/* ------------------------------------------------------------------------- */
/*
** int slct_morenames(int mode, int num, void *ptr)
**
** Funktion: Initialisiert Selectric so, daß es weiß, daß mehr
** als ein Name zurückgegeben werden kann.
**
** Parameter: mode Gibt den Modus an. Z.Zt sind folgende Modi
** vorhanden:
** 0 Files in Pointerlist zurückgeben.
** 1 Files in einem einzigen String -"-.
** num Anzahl der Namen die maximal zu-
** rückgegeben werden sollen.
** *ptr Der Zeiger auf die entsprechende
** Struktur.
**
** Return: TRUE Selectric ist installiert
** FALSE Selectric ist nicht installiert
**
** ------------------------------------------------------------------------- */
int slct_morenames(int mode, int num, void *ptr)
{
if(slct_check(0x0100))
{
slct->comm |= CMD_FILES_OUT;
if(mode)
slct->comm |= CFG_ONESTRING;
slct->out_count = num;
slct->out_ptr = ptr;
return(TRUE);
}
else
return(FALSE);
}
/* ------------------------------------------------------------------------- */
/* ----- slct_first -------------------------------------------------------- */
/* ------------------------------------------------------------------------- */
/*
** int slct_first(DTA *mydta, int attr)
**
** Funktion: Wurde das Communication-Byte auf CFG_FIRSTNEXT
** gesetzt, so kann man über diese Funktion den
** ersten selektierten Namen mit dem entsprechenden
** Attribut bekommen.
**
** Parameter: mydta Die DTA in der die Informationen
** gespeichert werden sollen.
** attr Die Attribute (s.a. Fsfirst). Selectric
** verknüpft beide Attribute mit UND und
** prüft auf != 0.
**
** Return: 0 OK
** -49 keine weiteren Dateien
** -32 Funktion nicht vorhanden (Version < 1.02)
**
** ------------------------------------------------------------------------- */
int slct_first(DTA *mydta, int attr)
{
if(slct_check(0x0102))
return(slct->get_first(mydta, attr));
else
return(-32);
}
/* ------------------------------------------------------------------------- */
/* ----- slct_next --------------------------------------------------------- */
/* ------------------------------------------------------------------------- */
/*
** int slct_next(DTA *mydta)
**
** Funktion: Nachdem man mit slct_first() den ersten Namen
** zurückbekommt, kann man über diese Funktion weitere
** Namen erhalten.
**
** Parameter: mydta s.o.
**
** Return: s.o.
**
** ------------------------------------------------------------------------- */
int slct_next(DTA *mydta)
{
if(slct_check(0x0102))
return(slct->get_next(mydta));
else
return(-32);
}
/* ------------------------------------------------------------------------- */
/* ----- release_dir ------------------------------------------------------- */
/* ------------------------------------------------------------------------- */
/*
** int release_dir(void)
**
** Funktion: Gibt das Verzeichnis wieder frei (Wichtig!).
**
** Parameter: keine
**
** Return: TRUE Verzeichnis konnte freigegeben werden.
** FALSE Fehler
**
** ------------------------------------------------------------------------- */
int slct_release(void)
{
if(slct_check(0x0102))
return(slct->release_dir());
else
return(-32);
}