static void strings(FILE *fp, const char *fname, size_t len) { Rune r, *rbuf; size_t i, bread; off_t off; rbuf = ereallocarray(NULL, len, sizeof(*rbuf)); for (off = 0, i = 0; (bread = efgetrune(&r, fp, fname)); ) { off += bread; if (r == Runeerror) continue; if (!isprintrune(r)) { if (i > len) putchar('\n'); i = 0; continue; } if (i < len) { rbuf[i++] = r; continue; } else if (i > len) { efputrune(&r, stdout, "<stdout>"); continue; } printf(format, (long)off - i); for (i = 0; i < len; i++) efputrune(rbuf + i, stdout, "<stdout>"); efputrune(&r, stdout, "<stdout>"); i++; } free(rbuf); }
static void lsdir(const char *path) { DIR *dp; Rune r; struct entry ent, *ents = NULL; struct dirent *d; size_t i, n = 0, len; char cwd[PATH_MAX], *p, *q, *name; if (!getcwd(cwd, sizeof(cwd))) eprintf("getcwd:"); if (!(dp = opendir(path))) eprintf("opendir %s:", path); if (chdir(path) < 0) eprintf("chdir %s:", path); if (many || Rflag) { if (!first) putchar('\n'); printf("%s:\n", path); } first = 0; while ((d = readdir(dp))) { if (d->d_name[0] == '.' && !aflag && !Aflag) continue; else if (Aflag) if (strcmp(d->d_name, ".") == 0 || strcmp(d->d_name, "..") == 0) continue; if (Uflag){ mkent(&ent, d->d_name, Fflag || lflag || pflag || iflag || Rflag, Lflag); ls(&ent, Rflag); } else { ents = ereallocarray(ents, ++n, sizeof(*ents)); name = p = estrdup(d->d_name); if (qflag) { q = d->d_name; while (*q) { len = chartorune(&r, q); if (isprintrune(r)) { memcpy(p, q, len); p += len, q += len; } else { *p++ = '?'; q += len; } } *p = '\0'; } mkent(&ents[n - 1], name, tflag || Sflag || Fflag || iflag || lflag || pflag || Rflag, Lflag); } } closedir(dp); if (!Uflag){ qsort(ents, n, sizeof(*ents), entcmp); for (i = 0; i < n; i++) { ls(&ents[rflag ? (n - i - 1) : i], Rflag); free(ents[rflag ? (n - i - 1) : i].name); } } if (chdir(cwd) < 0) eprintf("chdir %s:", cwd); free(ents); }
int isgraphrune(Rune r) { return !isspacerune(r) && isprintrune(r); }