From: Dan Cross <cross@math.psu.edu>
To: 9fans@cse.psu.edu
Subject: Re: [9fans] walk
Date: Fri, 25 Jul 2003 09:59:07 -0400 [thread overview]
Message-ID: <200307251359.h6PDx7704315@augusta.math.psu.edu> (raw)
In-Reply-To: Your message of "Fri, 25 Jul 2003 08:36:14 +0200." <000501c35277$0bd23fe0$2a8be793@gli.cas.cz>
[-- Attachment #1: Type: text/plain, Size: 555 bytes --]
> Dan Cross also has walk.c and sor.c (mentioned on the list earlier) -- Dan,
> please, could you share them?
Sure. I'll include them in this email. Note, however, that sor is an
rc script, not a C program. Here are some pointers to my original posts
on the subject, as well. These are mainly useful as an explanation of
my position and for the examples of find idioms rendered in walk/sor.
https://lists.cse.psu.edu/archives/9fans/2002-October/020820.html
https://lists.cse.psu.edu/archives/9fans/2002-October/020822.html
- Dan C.
[-- Attachment #2: Type: text/plain, Size: 2336 bytes --]
/*
* Walk a directory tree, in the style of du(1),
* but with some additional flourishes.
*
* Dan Cross <cross@math.psu.edu>
*/
#include <u.h>
#include <libc.h>
static int mkdepth(int);
static char *mkname(char *, int *, char *, char *);
static void walk(char *, int, int);
static void walkname(char *, int, int);
char *fmt;
void
main(int argc, char *argv[])
{
char *dir;
int depth;
Dir *d;
dir = ".";
fmt = "%s\n";
depth = -1;
ARGBEGIN {
case 'd':
depth = atoi(ARGF());
break;
case 'q':
quotefmtinstall();
doquote = needsrcquote;
fmt = "%q\n";
break;
}ARGEND
if (argc == 0)
walkname(".", depth, 1);
else {
for (dir = *argv; dir; dir = *++argv) {
if ((d = dirstat(dir)) == nil) {
fprint(2, "dirstat %s: %r\n", dir);
continue;
}
walkname(dir, depth, d->mode & DMDIR);
free(d);
}
}
exits(0);
}
static void
walkname(char *dirname, int depth, int isdir)
{
int fd;
if (strcmp(dirname, ".") != 0 && strcmp(dirname, "..") != 0)
print(fmt, dirname);
if (isdir) {
fd = open(dirname, OREAD);
if (fd < 0) {
fprint(2, "open %s: %r\n", dirname);
return;
}
walk(dirname, fd, depth);
close(fd);
}
}
static char *
mkname(char *name, int *l, char *basename, char *filename)
{
char *nname;
int t;
t = strlen(basename) + 1 + strlen(filename) + 1;
if (*l == 0 || name == nil) {
*l = t;
name = malloc(t);
if (name == nil)
sysfatal("malloc %d: %r\n", l);
} else if (*l < t) {
nname = realloc(name, t);
if (nname == nil) {
free(name);
sysfatal("malloc %d: %r\n", l);
}
*l = t;
name = nname;
}
snprint(name, t, "%s/%s", basename, filename);
cleanname(name);
return(name);
}
static int
mkdepth(int depth)
{
return((depth == -1) ? depth : depth - 1);
}
static void
walk(char *dirname, int fd, int depth)
{
Dir *dir, *dp;
char *name, *nname;
int i, l, n, t;
if (depth == 0)
return;
l = 0;
name = nil;
n = dirreadall(fd, &dir);
for (dp = dir, i = 0; i < n; dp++, i++) {
if (strcmp(dp->name, ".") == 0 || strcmp(dp->name, "..") == 0)
continue;
name = mkname(name, &l, dirname, dp->name);
walkname(name, mkdepth(depth), dp->mode & DMDIR);
}
free(dir);
if (name != nil)
free(name);
}
[-- Attachment #3: Type: text/plain, Size: 193 bytes --]
#!/bin/rc
rfork e
fn runtests {
file=$1; shift
while (! ~ $#* 0 && ! eval $1 ''''^$file^'''')
shift
if (! ~ $#* 0)
echo $file
}
while (file = `{read}) {
runtests $file $*
}
next prev parent reply other threads:[~2003-07-25 13:59 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2003-07-25 6:36 pac
2003-07-25 13:59 ` Dan Cross [this message]
2003-07-25 14:07 ` Fco.J.Ballesteros
2003-07-29 17:40 ` [9fans] VMWare workstation-4.0? Ishwar Rattan
2003-07-29 18:26 ` andrey mirtchovski
2003-07-25 14:16 ` [9fans] walk Charles Forsyth
2003-07-25 15:31 ` Dan Cross
-- strict thread matches above, loose matches on Subject: below --
2003-07-24 9:03 pac
2003-07-24 9:21 ` boyd, rounin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=200307251359.h6PDx7704315@augusta.math.psu.edu \
--to=cross@math.psu.edu \
--cc=9fans@cse.psu.edu \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).