home *** CD-ROM | disk | FTP | other *** search
/ back2roots/padua / padua.7z / padua / uucp / auucp+-1.02 / fuucp_plus_src.lzh / lib / getfiles.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-11-21  |  1.5 KB  |  87 lines

  1.  
  2. /*
  3.  *  GETFILES.C
  4.  */
  5.  
  6. #include <stddef.h>
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10. #include "getfiles.h"
  11. #include "ndir.h"
  12. #include "version.h"
  13.  
  14. IDENT(".01");
  15.  
  16. Prototype dir_list *getfiles(const char *, int, int (*)(char *), int (*)(dir_list *, dir_list *));
  17.  
  18. dir_list *
  19. getfiles(dir, gap, sel, cmp)
  20. const char *dir;
  21. int gap;
  22. int (*sel)(char *);
  23. int (*cmp)(dir_list *, dir_list *);
  24. {
  25.     register DIR *dirp;
  26.     register struct direct *dp;
  27.     register dir_list *this;
  28.     dir_list *first = NULL;    /*  assignment avoids warning, not reqd */
  29.  
  30.     if ((dirp = opendir(dir)) == NULL)
  31.     return NULL;
  32.  
  33.     this = (dir_list *)&first;
  34.     while (dp = readdir(dirp)) {
  35.     if (sel == NULL || (*sel)(dp->d_name)) {
  36.         this->next = malloc(offsetof(dir_list, name)
  37.                 + gap
  38.                 + strlen(dp->d_name)
  39.                 + 1
  40.                    );
  41.         if ((this = this->next) == NULL)
  42.         break;
  43.         strcpy(this->name + gap, dp->d_name);
  44.     }
  45.     }
  46.     this->next = NULL;
  47.     closedir(dirp);
  48.  
  49.     if (cmp == NULL)
  50.     return first;
  51.     return list_sort(first, (int (*)(void *, void *))cmp);
  52. }
  53.  
  54.  
  55. #ifdef TEST
  56.  
  57. sel(a)
  58. char *a;
  59. {
  60.     while (*a != '\0')
  61.         if (*a++ == '.' && *a == 'o')
  62.             return 1;
  63.     return 0;
  64. }
  65.  
  66. cmp(a, b)
  67. dir_list *a, *b;
  68. {
  69.     return strcmp(a->name, b->name);
  70. }
  71.  
  72. main()
  73. {
  74.     register dir_list *p, *q;
  75.  
  76.     p = getfiles("", 0, (void *)NULL, (void *)NULL);
  77.     while (p)
  78.         puts(p->name), q = p->next, free(p), p = q;
  79.  
  80.     p = getfiles("", sel, cmp);
  81.     while (p)
  82.         puts(p->name), q = p->next, free(p), p = q;
  83. }
  84.  
  85. #endif
  86.  
  87.