home *** CD-ROM | disk | FTP | other *** search
/ M.u.C.S. Disc 2000 / MUCS2000.iso / anwend / slectric / fsel_inp.c < prev    next >
C/C++ Source or Header  |  1996-11-28  |  10KB  |  340 lines

  1. /* ------------------------------------------------------------------------- */
  2. /* ----- fsel_inp.c ----- Ein universeller fsel_(ex)input() Call ----------- */
  3. /* ---------------------- und Routinen für den Selectric Support ----------- */
  4. /* ------------------------------------------------------------------------- */
  5. /* ----------------------------------------- (c) 1992 by Oliver Scheel ----- */
  6. /* ------------------------------------------------------------------------- */
  7.  
  8. #include <string.h>
  9. #include <tos.h>
  10. #include <vdi.h>
  11.  
  12. #include "fsel_inp.h"
  13.  
  14. #define NULL    ((void *) 0l)
  15. #define FALSE    0
  16. #define TRUE    (!FALSE)
  17.  
  18. /* ------------------------------------------------------------------------- */
  19.  
  20. SLCT_STR    *slct = NULL;
  21. long        *fsel = NULL;
  22.  
  23. SYSHDR        *sys_header;
  24.  
  25. /* ----- Cookie Jar -------------------------------------------------------- */
  26.  
  27. typedef struct
  28. {
  29.     long    id,
  30.         *ptr;
  31. } COOKJAR;
  32.  
  33. /* ------------------------------------------------------------------------- */
  34. /* ----- get_cookie -------------------------------------------------------- */
  35. /* ------------------------------------------------------------------------- */
  36.  
  37. long *get_cookie(long cookie)
  38. {
  39.     long    sav;
  40.     COOKJAR    *cookiejar;
  41.     int    i = 0;
  42.  
  43.     sav = Super((void *)1L);
  44.     if(sav == 0L)
  45.         sav = Super(0L);
  46.     cookiejar = *((COOKJAR **)0x05a0l);
  47.     sys_header = *((SYSHDR **)0x04f2L);    /* ... wenn wir schonmal
  48.                             super drauf sind */
  49.     if(sav != -1L)
  50.         Super((void *)sav);
  51.     if(cookiejar)
  52.     {
  53.         while(cookiejar[i].id)
  54.         {
  55.             if(cookiejar[i].id == cookie)
  56.                 return(cookiejar[i].ptr);
  57.             i++;
  58.         }
  59.     }
  60.     return(0l);
  61. }
  62.  
  63. /* ------------------------------------------------------------------------- */
  64. /* ----- fsel_check -------------------------------------------------------- */
  65. /* ------------------------------------------------------------------------- */
  66. /*
  67. **    int fsel_check(void)
  68. **
  69. **    Funktion:    Prüft nach, ob ein FSEL-Cookie vorhanden ist.
  70. **
  71. **    Parameter:    keine
  72. **
  73. **    Return:        TRUE    FSEL-Cookie vorhanden.
  74. **            FALSE    -----"----- nicht vorhanden.
  75. **
  76. ** ------------------------------------------------------------------------- */
  77.  
  78. int fsel_check(void)
  79. {
  80.     if(!fsel)
  81.         fsel = get_cookie('FSEL');
  82.     return(fsel ? TRUE : FALSE);
  83. }
  84.  
  85. /* ------------------------------------------------------------------------- */
  86. /* ----- slct_check -------------------------------------------------------- */
  87. /* ------------------------------------------------------------------------- */
  88. /*
  89. **    int slct_check(unsigned int version)
  90. **
  91. **    Funktion:    Checkt, ob Selectric installiert ist und ob es
  92. **            die Mindest-Versionsnummer besitzt.
  93. **
  94. **    Parameter:    version    Enhält die zu prüfende Versionsnummer
  95. **                (es wird ein '>='-Test gemacht!!)
  96. **
  97. **    Return:        TRUE    Selectric ist installiert und
  98. **                die Versionsnummer ist ok.
  99. **            FALSE    Entweder nicht installiert oder zu
  100. **                niedrige Versionsnummer.
  101. **
  102. ** ------------------------------------------------------------------------- */
  103.  
  104. int slct_check(unsigned int version)
  105. {
  106.     if(fsel_check())
  107.     {
  108.         slct = (SLCT_STR *)fsel;
  109.         if(slct->id != 'SLCT')
  110.             slct = 0L;
  111.     }
  112.     if(slct && (slct->version >= version))
  113.         return(TRUE);
  114.     else
  115.         return(FALSE);
  116. }
  117.  
  118. /* ------------------------------------------------------------------------- */
  119. /* ----- file_select ------------------------------------------------------- */
  120. /* ------------------------------------------------------------------------- */
  121. /*
  122. **    int file_select(char *pfname, char *pname, char *fname, char *ext,
  123. **            char *title)
  124. **
  125. **    Funktion:    Ruft den FileSelector in komfortabler Art und Weise
  126. **            auf. Dabei kann man alle Parts (Filename, Pathname,
  127. **            etc.) einzeln übergeben. Man kann aber auch Pathname
  128. **            und den kompletten Namen in `pfname' übergeben. Diese
  129. **            Routine sucht sich schon das, was ihr fehlt in
  130. **            bestimmten Grenzen selbst heraus.
  131. **            Diese Funktion unterstützt den FSEL-Cookie und läuft
  132. **            auch ohne Selectric.
  133. **
  134. **    Parameter:    *pfname    Enthält abschlie₧end den fertigen Pfad, den
  135. **                man sofort in ein `open' einsetzen kann.
  136. **            *pname    Der Startpfad (ohne Wildcards!).
  137. **            *fname    Ein voreingestellte Filenamen.
  138. **            *ext    Eine Extension.
  139. **            *title    Einen Boxtitel. Dabei wird a) die TOS-Version
  140. **                als auch der FSEL-Cookie überprüft.
  141. **
  142. **    Return:        Der Button mit dem der Selector verlassen wurde.
  143. **
  144. **    Bemerkung:    Beim Aufruf aus Accessories nicht vergessen ein
  145. **            BEG/END_UPDATE um diesen Aufruf zu legen!!!!!!!!!!
  146. **            Die meisten File-Selector Clones (incl. Selectric)
  147. **            machen das eh, nicht aber das Original ...
  148. **
  149. ** ------------------------------------------------------------------------- */
  150.  
  151. int file_select(char *pfname, char *pname, char *fname, const char *ext, char *title)
  152. {
  153.     int    but;
  154.     char    *p;
  155.  
  156.     if(!fname[0])
  157.     {
  158.         p = strrchr(pfname, '\\');
  159.         if(p)
  160.             strcpy(fname, p+1);
  161.         else
  162.             strcpy(fname, pfname);
  163.     }
  164.     if(!pname[0])
  165.     {
  166.         p = strrchr(pfname, '\\');
  167.         if(p)
  168.         {
  169.             p[1] = '\0';
  170.             strcpy(pname, pfname);
  171.         }
  172.     }
  173.     else if(pname[strlen(pname)-1] != '\\')
  174.         strcat(pname, "\\");
  175.     strcat(pname, ext);
  176.  
  177.     if(fsel_check() || (sys_header->os_version >= 0x0104))
  178.         fsel_exinput(pname, fname, &but, title);
  179.     else
  180.         fsel_input(pname, fname, &but);
  181.  
  182.     p = strrchr(pname, '\\');
  183.     if(p)
  184.         *p = '\0';
  185.     strcpy(pfname, pname);
  186.     strcat(pfname, "\\");
  187.     strcat(pfname, fname);
  188.     return(but);
  189. }
  190.  
  191. /* ------------------------------------------------------------------------- */
  192. /* ----- slct_extpath ------------------------------------------------------ */
  193. /* ------------------------------------------------------------------------- */
  194. /*
  195. **    int slct_extpath(int ext_num, char *ext[], int path_num, char *paths[])
  196. **
  197. **    Funktion:    Setzt benutzerdefinierte Extensions und Pfade,
  198. **            welche dann von Selectric benutzt werden. Die
  199. **            Extensions und Pfade müssen vor jedem Selectric-
  200. **            Aufruf gesetzt werden!
  201. **
  202. **    Parameter:    ext_num        Anzahl der Extensions
  203. **            *ext[]        Die Extensions
  204. **            path_num    Anzahl Pfade
  205. **            *paths[]    Die Pfade
  206. **
  207. **    Return:        TRUE    Selectric ist installiert
  208. **            FALSE    Selectric ist nicht installiert
  209. **
  210. ** ------------------------------------------------------------------------- */
  211.  
  212. int slct_extpath(int ext_num, char *(*ext)[], int path_num, char *(*paths)[])
  213. {
  214.     if(slct_check(0x0100))
  215.     {
  216.         slct->num_ext = ext_num;
  217.         slct->ext = ext;
  218.         slct->num_paths = path_num;
  219.         slct->paths = paths;
  220.         return(TRUE);
  221.     }
  222.     else
  223.         return(FALSE);
  224. }
  225. /* ------------------------------------------------------------------------- */
  226. /* ----- slct_morenames ---------------------------------------------------- */
  227. /* ------------------------------------------------------------------------- */
  228. /*
  229. **    int slct_morenames(int mode, int num, void *ptr)
  230. **
  231. **    Funktion:    Initialisiert Selectric so, da₧ es wei₧, da₧ mehr
  232. **            als ein Name zurückgegeben werden kann.
  233. **
  234. **    Parameter:    mode    Gibt den Modus an. Z.Zt sind folgende Modi
  235. **                vorhanden:
  236. **                0    Files in Pointerlist zurückgeben.
  237. **                1    Files in einem einzigen String -"-.
  238. **            num    Anzahl der Namen die maximal zu-
  239. **                rückgegeben werden sollen.
  240. **            *ptr    Der Zeiger auf die entsprechende
  241. **                Struktur.
  242. **
  243. **    Return:        TRUE    Selectric ist installiert
  244. **            FALSE    Selectric ist nicht installiert
  245. **
  246. ** ------------------------------------------------------------------------- */
  247.  
  248. int slct_morenames(int mode, int num, void *ptr)
  249. {
  250.     if(slct_check(0x0100))
  251.     {
  252.         slct->comm |= CMD_FILES_OUT;
  253.         if(mode)
  254.             slct->comm |= CFG_ONESTRING;
  255.         slct->out_count = num;
  256.         slct->out_ptr = ptr;
  257.         return(TRUE);
  258.     }
  259.     else
  260.         return(FALSE);
  261. }
  262.  
  263. /* ------------------------------------------------------------------------- */
  264. /* ----- slct_first -------------------------------------------------------- */
  265. /* ------------------------------------------------------------------------- */
  266. /*
  267. **    int slct_first(DTA *mydta, int attr)
  268. **
  269. **    Funktion:    Wurde das Communication-Byte auf CFG_FIRSTNEXT
  270. **            gesetzt, so kann man über diese Funktion den
  271. **            ersten selektierten Namen mit dem entsprechenden
  272. **            Attribut bekommen.
  273. **
  274. **    Parameter:    mydta    Die DTA in der die Informationen
  275. **                gespeichert werden sollen.
  276. **            attr    Die Attribute (s.a. Fsfirst). Selectric
  277. **                verknüpft beide Attribute mit UND und
  278. **                prüft auf != 0.
  279. **
  280. **    Return:        0    OK
  281. **            -49    keine weiteren Dateien
  282. **            -32    Funktion nicht vorhanden (Version < 1.02)
  283. **
  284. ** ------------------------------------------------------------------------- */
  285.  
  286. int slct_first(DTA *mydta, int attr)
  287. {
  288.     if(slct_check(0x0102))
  289.         return(slct->get_first(mydta, attr));
  290.     else
  291.         return(-32);
  292. }
  293.  
  294. /* ------------------------------------------------------------------------- */
  295. /* ----- slct_next --------------------------------------------------------- */
  296. /* ------------------------------------------------------------------------- */
  297. /*
  298. **    int slct_next(DTA *mydta)
  299. **
  300. **    Funktion:    Nachdem man mit slct_first() den ersten Namen
  301. **            zurückbekommt, kann man über diese Funktion weitere
  302. **            Namen erhalten.
  303. **
  304. **    Parameter:    mydta    s.o.
  305. **
  306. **    Return:        s.o.
  307. **
  308. ** ------------------------------------------------------------------------- */
  309.  
  310. int slct_next(DTA *mydta)
  311. {
  312.     if(slct_check(0x0102))
  313.         return(slct->get_next(mydta));
  314.     else
  315.         return(-32);
  316. }
  317.  
  318. /* ------------------------------------------------------------------------- */
  319. /* ----- release_dir ------------------------------------------------------- */
  320. /* ------------------------------------------------------------------------- */
  321. /*
  322. **    int release_dir(void)
  323. **
  324. **    Funktion:    Gibt das Verzeichnis wieder frei (Wichtig!).
  325. **
  326. **    Parameter:    keine
  327. **
  328. **    Return:        TRUE    Verzeichnis konnte freigegeben werden.
  329. **            FALSE    Fehler
  330. **
  331. ** ------------------------------------------------------------------------- */
  332.  
  333. int slct_release(void)
  334. {
  335.     if(slct_check(0x0102))
  336.         return(slct->release_dir());
  337.     else
  338.         return(-32);
  339. }
  340.