home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1990 / 03 / tricks / dirman.c < prev    next >
Encoding:
C/C++ Source or Header  |  1989-12-14  |  3.6 KB  |  134 lines

  1. /* ------------------------------------------------------ */
  2. /*                       DIRMAN.C                         */
  3. /*           (c) 1990 Olaf Stoyke & TOOLBOX               */
  4. /* ------------------------------------------------------ */
  5. #include "dirman.h"
  6.  
  7. /* Hier startet der nicht-variable Teil von DIRMAN:       */
  8.  
  9. char dirmem[STACKMAX][MAXDIR];       /* Verzeichnisstapel */
  10. char filename[MAXDIR] = STDNAME;
  11. int  maxdir = 0;
  12.  
  13. void load_data(void) {
  14. int  i;
  15. FILE *source;
  16.                       /* Datei lesen und CRLF's entfernen */
  17.  
  18.   if ((source = fopen(filename, "r")) != NULL)
  19.     while (fgets(dirmem[maxdir], MAXDIR, source) != NULL) {
  20.       for (i = 0; dirmem[maxdir][i] != '\n'; i++);
  21.       dirmem[maxdir++][i] = '\0';
  22.     }
  23.   --maxdir;
  24.   fclose(source);
  25. }
  26.  
  27. void create_file(FILE **fp) {
  28.                             /* Datei zum Schreiben öffnen */
  29.  
  30.   if ((*fp = fopen(filename, "w")) == NULL) {
  31.     printf(NOCREAT, filename);
  32.     exit(1);
  33.   }
  34. }
  35.  
  36. int optcode(char optchar) {
  37. char mask[7] = "sSlLpP";
  38. int  i;
  39.     /* Umsetzen der Optionszeichen in einen internen Code */
  40.  
  41.   for (i = 0; (i < 6) && (mask[i] != optchar); i++);
  42.   i /= 2;
  43.   if (i == 3) return 0;            /* Option nicht gültig */
  44.   else        return i + 1;
  45. }
  46.  
  47. void show_num(void) {
  48.  
  49.  printf(NENTRY, maxdir + 1, filename);
  50.                             /* Anzahl der Namen ausgeben */
  51. }
  52.  
  53. void save_dir(void) {
  54. int  i, handle;
  55. char curdir[MAXDIR];
  56. FILE *dest;
  57.  
  58.   create_file(&dest);                 /* Datei erzeugen */
  59.   if (maxdir == STACKMAX - 1) {
  60.                       /* Wenn bereits STACKMAX Einträge */
  61.     printf(OVERFLOW);
  62.                      /* existieren, muß der letzte dran */
  63.     --maxdir;                            /* glauben ... */
  64.   }
  65.   strcpy(curdir, "A:\\");     /* Pfadangabe für "chdir" */
  66.   curdir[0] += getdisk();      /* incl. Laufwerksangabe */
  67.   if (getcurdir(0, &curdir[3]) == -1) {
  68.     printf(DIRERR);
  69.     exit(1);
  70.   }
  71.   fprintf(dest, "%s", curdir);
  72.                      /* aktuelles Verzeichnis schreiben */
  73.   printf(SAVEMSG, curdir, filename);
  74.   for (i = 0; i <= maxdir; i++)
  75.                            /* alten Stack schreiben ... */
  76.   fprintf(dest, "\n%s", dirmem[i]);
  77.   fclose(dest);
  78. }
  79.  
  80. void peek_dir(void) {
  81.  
  82.   if ((maxdir == -1) || (chdir(dirmem[0]) == -1))
  83.     printf(DIRERR);
  84.   else {
  85.     setdisk(dirmem[0][0] - 'A');
  86.                            /* Auch das Laufwerk wechseln */
  87.     printf(LOADMSG, dirmem[0]);
  88.   }
  89. }
  90.  
  91. void load_dir(void) {
  92. int  i, handle;
  93. FILE *dest;
  94.  
  95.   create_file(&dest);
  96.   for (i = 1; i <= maxdir; i++)
  97.                         /* Nur ersten Namen nicht sichern */
  98.   fprintf(dest, ((i < maxdir) ? "%s\n" : "%s"), dirmem[i]);
  99.   fclose(dest);
  100.   peek_dir();
  101. }
  102.  
  103. main(int argc, char *argv[]) {
  104. int i, option = OINIT;
  105.  
  106.   printf(HEAD);                             /* Muß sein ! */
  107.   if (argc > 3) {                    /* Darf nicht sein ! */
  108.     printf(PARAMERR);
  109.     exit(1);
  110.   }
  111.   for (i = 1; i < argc; i++)
  112.     if (argv[i][0] == '/')   /* Optionenzeichen gelesen ? */
  113.       option = optcode(argv[i][1]);
  114.     else
  115.       strcpy(filename, argv[i]); /* ... sonst Dateiname ! */
  116.   load_data();                        /* Stackdatei lesen */
  117.   switch (option) {               /* Optionen verarbeiten */
  118.     case OINIT:
  119.       show_num();
  120.       break;
  121.     case OSAVE:
  122.       save_dir();
  123.       break;
  124.     case OLOAD:
  125.       load_dir();
  126.       break;
  127.     case OPEEK:
  128.       peek_dir();
  129.       break;
  130.   }
  131. }
  132. /* ------------------------------------------------------ */
  133. /*                  Ende von DIRMAN.C                     */
  134.