home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume26 / most-3.2 / part01 / dir.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-04-13  |  2.6 KB  |  121 lines

  1. /* directory functions-- mainly unix stuff, needs work for VMS */
  2. #ifndef VMS
  3. #include <sys/types.h>
  4. #include <sys/dir.h>
  5. #endif
  6.  
  7. #include "buffer.h"
  8. #include "window.h"
  9. #include "file.h"
  10.  
  11. void get_cdir(char *dir)
  12. {
  13.     int i;
  14. #ifndef VMS
  15.     getwd(dir);
  16.     i = strlen(dir); dir[i] = '/'; dir[i] = '\0';
  17. #else
  18.     getcwd(dir,80);
  19. #endif
  20. }
  21.  
  22.  
  23. #ifndef VMS
  24. /* This is a cheap routine-- should be replaced!!!! */
  25. bubble_sort()
  26. {
  27.     unsigned char *this, *next, *save;
  28.     char tmp[80], *t;
  29.     int change;
  30.     
  31.     change = 1;
  32.     while(change)
  33.       {
  34.           next = this = BEG;
  35.           while((next < EOB) && (*next++ != 0));
  36.           if (next == EOB) return;
  37.           change = 0;
  38.           while(next < EOB)
  39.             {
  40.                 if (strcmp((char *)this,(char *) next) > 0)
  41.                   {
  42.                       change = 1;
  43.                       strcpy(tmp,(char *) this);
  44.                       t = tmp;
  45.                       while(*next != 0) *this++ = *next++;
  46.                       *this++ = 0;
  47.                       save = this;
  48.                       /* now next points at a null */
  49.                       next++;
  50.                       while(*t != 0) *this++ = *t++;
  51.                       *this = 0;
  52.                       this = save;
  53.                   }
  54.                 else
  55.                   {
  56.                       this = next;
  57.                       while(next < EOB && *next++ != 0);
  58.                   }
  59.             }
  60.       }
  61. }
  62.  
  63. void get_dir(char *dir)
  64. {
  65.     DIR *dirp;
  66.     struct direct *dp;
  67.     char *p;
  68.     unsigned char *pos;
  69.     int dsize, len, size = 4096, i;
  70.     
  71.     if (*dir == 0)
  72.       dirp = opendir(".");
  73.     else
  74.       dirp = opendir(dir);
  75.  
  76.     if (dirp == NULL)
  77.       {
  78.           message("Unable to open directory.",1);
  79.           return;
  80.       }
  81.     
  82.           
  83.     BEG = (unsigned char *) malloc(size);
  84.     strcpy(BUF->file,dir);
  85.     pos = BEG;
  86.     dsize = size;
  87.     EOB = BEG + size;
  88.     
  89.     for(dp = readdir(dirp); dp != NULL; dp = readdir(dirp))
  90.       {
  91.           p = dp->d_name;
  92.           len = dp->d_namlen;
  93.           if (pos + len >= EOB - 1)
  94.             {
  95.                 size += dsize;
  96.                 BEG = (unsigned char *) realloc(BEG,size);
  97.                 
  98.                 EOB = BEG + size;
  99.                 pos = EOB - dsize;
  100.             }
  101.           strcpy(pos,p);
  102.           pos += len;
  103.           /*           *pos++ = '\n'; */
  104.           *pos++ = '\0';
  105.       }
  106.  
  107.     BUF->end = EOB = pos;
  108.     BUF->beg = BEG;
  109.     closedir(dirp);
  110.     bubble_sort();
  111.     i = 0;
  112.     for (pos = BEG; pos < EOB; pos++)
  113.       if (*pos == '\0')
  114.         {
  115.             if (i = !i, i) *pos = '\t'; else *pos = '\n';
  116.         }
  117.     
  118. }
  119. #endif
  120.  
  121.