NoPaste

myreaddir()

von RobertDebiannutzer

SNIPPET_TEXT:
  1. void
  2. myreaddir(void)
  3. {
  4.         static char errbuf[BUFSIZ];
  5.         DIR *dir;
  6.         size_t errc, i;
  7.         struct dirent *sd;
  8.  
  9.         dir = opendir(".");
  10.         if (dir == NULL) {
  11.                 errmsg("opendir", strerror(errno));
  12.                 return;
  13.         }
  14.  
  15.         free_data();
  16.  
  17.         dotc = errc = fstl = pos = 0;
  18.  
  19.         for (i=0; ; i++) {
  20.                 errno = 0; /* cf. manpage readdir(3) */
  21.                 sd = readdir(dir);
  22.                 if (sd == NULL) {
  23.                         if (errno == 0) {
  24.                                 break;
  25.                         }
  26.                         errc++;
  27.                         continue;
  28.                 }
  29.                 cdir = srealloc(cdir, sizeof(char *)*(i+1));
  30.                 cdir[i] = scalloc(strlen(sd->d_name)+1, 1);
  31.                 strcpy(cdir[i], sd->d_name);
  32.                 ca = srealloc(ca, sizeof(List)*(i+1));
  33.         }
  34.         closedir(dir);
  35.         num = i-1;
  36.  
  37.         qsort(&cdir[0], num+1, sizeof(char *), mycompare);
  38.  
  39.         for (i=0; i<=num; i++) {
  40.                 if ((cdir[i][0] == '.') && (cdir[i][1] != '\0') &&
  41.                                 (strcmp(cdir[i], "..") != 0)) {
  42.                         /* this entry is a dotfile */
  43.                         ca[i].d = 1;
  44.                         ca[i].s = dot ? 1 : 0;
  45.                         dotc++;
  46.                 } else {
  47.                         ca[i].d = 0;
  48.                         ca[i].s = 1;
  49.                 }
  50.  
  51.                 st = srealloc(st, sizeof(struct stat)*(i+1));
  52.  
  53.                 /* get strlen respecting UTF-8 */
  54.                 ca[i].l = mbstowcs(NULL, cdir[i], 0);
  55.                 if (lstat(cdir[i], &st[i]) == -1) {
  56.                         errc++;
  57.                         ca[i].a = A_REVERSE;
  58.                         continue;
  59.                 } else {
  60.                         ca[i].a = file_preinfo(i);
  61.                 }
  62.         }
  63.         max = dot ? num : num-dotc;
  64.  
  65.         if (errc != 0) {
  66.                 memset(errbuf, 0, sizeof(errbuf));
  67.                 snprintf(errbuf, SOA(errbuf),
  68.                                 "%zd errors while reading directory", errc);
  69.                 errmsg("myreaddir", errbuf);
  70.         }
  71.  
  72.         read_devices();
  73.         title();
  74.         /* flush filter */
  75.         if (strlen(search) > 0) {
  76.                 /* search is stack allocated */
  77.                 memset(search, 0, sizeof(search));
  78.         }
  79.         filterfiles(search);
  80.         update = 1;
  81. }

Quellcode

Hier kannst du den Code kopieren und ihn in deinen bevorzugten Editor einfügen. PASTEBIN_DOWNLOAD_SNIPPET_EXPLAIN