On Wed, 2005-06-01 at 03:26, Benjamin Herrenschmidt wrote: > Here's the fourth version of my document along with new kernel patches > for the new improved flattened format, and the first release of the > device-tree "compiler" tool. The patches will be posted as a reply to > this email. The compiler, dtc, can be downloaded, the URL is in the > document.
Ben, Does it make sense to do this as well? Thanks, jdl diff -Nur dtc.orig/lsprop.c dtc/lsprop.c --- dtc.orig/lsprop.c 1969-12-31 18:00:00.000000000 -0600 +++ dtc/lsprop.c 2005-06-01 11:43:01.000002000 -0500 @@ -0,0 +1,221 @@ +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <sys/stat.h> +#include <sys/types.h> +#include <dirent.h> + +int recurse; +int maxbytes = 128; +int words_per_line = 0; +char *buf; + +void lsprop(FILE *f, char *name); +void lsdir(char *name); + +main(int ac, char **av) +{ + FILE *f; + int i; + struct stat sb; + char *endp; + + while ((i = getopt(ac, av, "Rm:w:")) != EOF) { + switch (i) { + case 'R': + recurse = 1; + break; + case 'm': + maxbytes = strtol(optarg, &endp, 0); + if (endp == optarg) { + fprintf(stderr, "%s: bad argument (%s) to -m option\n", av[0], + optarg); + exit(1); + } + maxbytes = (maxbytes + 15) & -16; + break; + case 'w': + words_per_line = strtol(optarg, &endp, 0); + if (endp == optarg) { + fprintf(stderr, "%s: bad argument (%s) to -w option\n", + av[0], optarg); + exit(1); + } + break; + } + } + + buf = malloc(maxbytes); + if (buf == 0) { + fprintf(stderr, "%s: virtual memory exhausted\n", av[0]); + exit(1); + } + + if (optind == ac) + lsdir("."); + else + for (i = optind; i < ac; ++i) { + if (stat(av[i], &sb) < 0) { + perror(av[i]); + continue; + } + if (S_ISREG(sb.st_mode)) { + f = fopen(av[i], "r"); + if (f == NULL) { + perror(av[i]); + continue; + } + lsprop(f, av[i]); + fclose(f); + } else if (S_ISDIR(sb.st_mode)) { + lsdir(av[i]); + } + } + exit(0); +} + +void lsdir(char *name) +{ + DIR *d; + struct dirent *de; + char *p, *q; + struct stat sb; + FILE *f; + int np = 0; + + d = opendir(name); + if (d == NULL) { + perror(name); + return; + } + + p = malloc(strlen(name) + 520); + if (p == 0) { + fprintf(stderr, "%s: virtual memory exhausted\n", name); + closedir(d); + return; + } + strcpy(p, name); + q = p + strlen(p); + while (q > p && q[-1] == '/') + --q; + if (q == p + 1 && p[0] == '.') + q = p; + else + *q++ = '/'; + + while ((de = readdir(d)) != NULL) { + if (strcmp(de->d_name, ".") == 0 || strcmp(de->d_name, "..") == 0) + continue; + strcpy(q, de->d_name); + if (stat(p, &sb) < 0) { + perror(p); + continue; + } + if (S_ISREG(sb.st_mode)) { + f = fopen(p, "r"); + if (f == NULL) { + perror(p); + } else { + lsprop(f, de->d_name); + fclose(f); + ++np; + } + } + } + rewinddir(d); + while ((de = readdir(d)) != NULL) { + if (strcmp(de->d_name, ".") == 0 || strcmp(de->d_name, "..") == 0) + continue; + strcpy(q, de->d_name); + if (lstat(p, &sb) < 0) { + perror(p); + continue; + } + if (S_ISDIR(sb.st_mode)) { + if (np) + printf("\n"); + printf("%s:\n", p); + lsdir(p); + ++np; + } + } + free(p); + closedir(d); +} + +void lsprop(FILE *f, char *name) +{ + int n, nw, npl, i, j; + + n = fread(buf, 1, maxbytes, f); + if (n < 0) { + printf("%s: read error\n", name); + return; + } + printf("%-16s", name); + if (strlen(name) > 16) + printf("\n\t\t"); + for (i = 0; i < n; ++i) + if (buf[i] >= 0x7f || + (buf[i] < 0x20 && buf[i] != '\r' && buf[i] != '\n' + && buf[i] != '\t' && buf[i] != 0)) + break; + if (i == n && n != 0 && (n == 1 || buf[0] != 0) && buf[n-1] == 0) { + printf(" \""); + for (i = 0; i < n - 1; ++i) + if (buf[i] == 0) + printf("\"\n\t\t \""); + else if (buf[i] == '\r' || buf[i] == '\n') + printf("\n\t\t "); + else + putchar(buf[i]); + putchar('"'); + } else if ((n & 3) == 0) { + nw = n >> 2; + if (nw == 1) { + i = *(int *)buf; + printf(" %.8x", i); + if (i > -0x10000 && !(i >= 0 && i <= 9)) + printf(" (%d)", i); + } else { + npl = words_per_line; + if (npl <= 0) { + if ((nw % 6) == 0) + npl = 6; + else if ((nw % 5) == 0) + npl = 5; + else + npl = 4; + } + for (i = 0; i < nw; i += npl) { + if (i != 0) + printf("\n\t\t"); + for (j = 0; j < npl && i + j < nw; ++j) + printf(" %.8x", ((unsigned int *)buf)[i+j]); + } + } + } else { + for (i = 0; i < n; i += 16) { + if (i != 0) + printf("\n\t\t"); + for (j = 0; j < 16 && i + j < n; ++j) + printf(" %.2x", buf[i+j]); + for (; j < 16; ++j) + printf(" "); + for (j = 0; j < 16 && i + j < n; ++j) + if (buf[i+j] > 0x20 && buf[i+j] <= 0x7e) + putchar(buf[i+j]); + else + putchar('.'); + } + } + printf("\n"); + if (n == maxbytes) { + while ((i = fread(buf, 1, maxbytes, f)) > 0) + n += i; + if (n > maxbytes) + printf("\t\t [%d bytes total]\n", n); + } +} + diff -Nur dtc.orig/Makefile dtc/Makefile --- dtc.orig/Makefile 2005-06-01 11:44:29.000002000 -0500 +++ dtc/Makefile 2005-06-01 11:46:26.000002000 -0500 @@ -1,15 +1,21 @@ -TARGETS = dtc +TARGETS = dtc lsprop CFLAGS = -Wall -g -OBJS = dtc.o livetree.o flattree.o data.o treesource.o fstree.o \ +OBJS-dtc = dtc.o livetree.o flattree.o data.o treesource.o fstree.o \ y.tab.o lex.yy.o +OBJS-lsprop = lsprop.o + + default: $(TARGETS) -dtc: $(OBJS) +dtc: $(OBJS-dtc) + $(LINK.c) -o $@ $^ + +lsprop: $(OBJS-lsprop) $(LINK.c) -o $@ $^ -$(OBJS): dtc.h +$(OBJS-dtc): dtc.h y.tab.c y.tab.h: dtc-parser.y $(YACC) -d $<