Ejemplo n.º 1
0
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);
}
Ejemplo n.º 2
0
Archivo: ls.c Proyecto: rovaughn/distro
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);
}
Ejemplo n.º 3
0
int
isgraphrune(Rune r)
{
	return !isspacerune(r) && isprintrune(r);
}