home *** CD-ROM | disk | FTP | other *** search
/ GEMini Atari / GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso / zip / utility / slectric.lzh / DOKU / FSEL_INP.C < prev    next >
C/C++ Source or Header  |  1986-02-06  |  8KB  |  262 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.