diff options
Diffstat (limited to 'utils/srclist')
| -rw-r--r-- | utils/srclist/Nt.c | 8 | ||||
| -rw-r--r-- | utils/srclist/Plan9.c | 7 | ||||
| -rw-r--r-- | utils/srclist/Posix.c | 10 | ||||
| -rw-r--r-- | utils/srclist/mkfile | 19 | ||||
| -rw-r--r-- | utils/srclist/srclist.c | 144 |
5 files changed, 188 insertions, 0 deletions
diff --git a/utils/srclist/Nt.c b/utils/srclist/Nt.c new file mode 100644 index 00000000..b86b930d --- /dev/null +++ b/utils/srclist/Nt.c @@ -0,0 +1,8 @@ +#include <windows.h> +#include "lib9.h" + +char* +mygetwd(char *path, int len) +{ + return getcwd(path, len); +} diff --git a/utils/srclist/Plan9.c b/utils/srclist/Plan9.c new file mode 100644 index 00000000..31838bd4 --- /dev/null +++ b/utils/srclist/Plan9.c @@ -0,0 +1,7 @@ +#include "lib9.h" + +char* +mygetwd(char *path, int len) +{ + return getwd(path, len); +} diff --git a/utils/srclist/Posix.c b/utils/srclist/Posix.c new file mode 100644 index 00000000..ea5c842a --- /dev/null +++ b/utils/srclist/Posix.c @@ -0,0 +1,10 @@ +#include "lib9.h" +#undef getwd +#undef getwd +#include <unistd.h> + +char* +mygetwd(char *path, int len) +{ + return getcwd(path, len); +} diff --git a/utils/srclist/mkfile b/utils/srclist/mkfile new file mode 100644 index 00000000..a8c2a4d6 --- /dev/null +++ b/utils/srclist/mkfile @@ -0,0 +1,19 @@ +<../../mkconfig + +TARG=srclist + +OFILES= srclist.$O\ + $TARGMODEL.$O\ + +HFILES=\ + a.out.h\ + bio.h\ + mach.h\ + +LIBS=mach bio 9 # order matters. + +CFLAGS=$CFLAGS -I../include + +BIN=$ROOT/$OBJDIR/bin + +<$ROOT/mkfiles/mkone-$SHELLTYPE diff --git a/utils/srclist/srclist.c b/utils/srclist/srclist.c new file mode 100644 index 00000000..83b0f0ed --- /dev/null +++ b/utils/srclist/srclist.c @@ -0,0 +1,144 @@ +#include <lib9.h> +#include <bio.h> +#include <mach.h> + +int conly; +int exists; + +enum { + Maxroot = 10, +}; + +int nroot; +char *root[Maxroot]; +int rootlen[Maxroot]; + +void usage(void); +void error(char *); +void addroot(char *); +void addroots(char *); +void chomp(char *); + +extern char *mygetwd(char*, int); + +void +main(int argc, char **argv) +{ + char buf[1024], *cwd; + + cwd = mygetwd(buf, sizeof(buf)); + ARGBEGIN { + case 'c': + conly = 1; + break; + case 'e': + exists = 1; + break; + case 'r': + addroots(EARGF(usage())); + break; + default: + usage(); + } ARGEND + + if(argc != 1) + usage(); + + if(cwd != nil) + chdir(cwd); + setbinmode(); + chomp(argv[0]); + + exits(0); +} + +void +addroot(char *x) +{ + if(nroot >= Maxroot){ + fprint(2, "srclist: too many root directories\n"); + exits("usage"); + } + root[nroot] = x; + rootlen[nroot] = strlen(x); + nroot++; +} + +void +addrootnt(char *r) +{ + addroot(r); + if(r[1] != ':') + return; /* phew! */ + if(*r >= 'a' && *r <= 'z' || *r >= 'A' && *r <= 'Z') + addroot(r+2); +} + +void +addroots(char *r) +{ + char buf[1024], *r2; + + addrootnt(r); + if(chdir(r) < 0) + return; + r2 = mygetwd(buf, sizeof(buf)); + if(r2 && strcmp(r2, r) != 0) + addrootnt(r2); +} + +void +chomp(char *file) +{ + int fd, i, j, len; + Fhdr fhdr; + Dir *td; + char fname[1024]; + + fd = open(file, OREAD); + if(fd < 0) + error("open"); + + if(crackhdr(fd, &fhdr) == 0) + error("crackhdr"); + + if(syminit(fd, &fhdr) < 0) + error("syminit"); + + for(i = 0; i < 1000; i++) + if(filesym(i, fname, sizeof(fname)-1)){ + cleanname(fname); + if(conly){ + len = strlen(fname); + if(len < 2 || strcmp(fname+len-2, ".c") != 0) + continue; + } + if(exists){ + if((td = dirstat(fname)) == nil) + continue; + free(td); + } + if(nroot){ + for(j = 0; j < nroot; j++) + if(strncmp(fname, root[j], rootlen[j]) == 0) + break; + if(j == nroot) + continue; + } + print("%s\n", fname); + } +} + +void +usage(void) +{ + fprint(2, "usage: srclist [-ce] [-r root] <objfile>\n"); + exits("usage"); +} + +void +error(char *s) +{ + fprint(2, "srclist: %s: %r\n", s); + exits(s); +} |
