1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
--- xdu.c.orig Mon Jun 6 04:29:23 1994
+++ xdu.c Fri Mar 16 07:20:49 2001
@@ -235,6 +235,7 @@
char name[4096];
int size;
FILE *fp;
+ char *p, *n;
if (strcmp(filename, "-") == 0) {
fp = stdin;
@@ -244,11 +245,21 @@
exit(1);
}
}
+
while (fgets(buf,sizeof(buf),fp) != NULL) {
- sscanf(buf, "%d %s\n", &size, name);
+ p = buf;
+ while (*p && isspace(*p)) p++;
+ size = atoi(p);
+ while (*p && !isspace(*p)) p++;
+ while (*p && isspace(*p)) p++;
+ n = name;
+ while (*p && *p != '\n' && *p != '\r')
+ *n++ = *p++;
+ *n++ = '\0';
/*printf("%d %s\n", size, name);*/
parse_entry(name,size);
}
+
fclose(fp);
}
@@ -269,7 +280,7 @@
length = strlen(name);
if ((length > 0) && (name[length-1] == '/')) {
/* strip off trailing / (e.g. GNU du) */
- name[length-1] = 0;
+ name[--length] = 0;
}
arg = 0; indx = 0;
@@ -289,8 +300,10 @@
}
name++;
}
- buf[indx] = 0;
- path[arg++] = strdup(buf);
+ if (length) {
+ buf[indx] = 0;
+ path[arg++] = strdup(buf);
+ }
path[arg] = NULL;
addtree(&top,path,size);
@@ -399,15 +412,15 @@
/*printf("addtree(\"%s\",\"%s\",%d)\n", top->name, path[0], size);*/
+ if (path[0] == NULL) {
+ /* end of the chain, save size */
+ top->size = size;
+ return;
+ }
+
/* check all children for a match */
for (np = top->child; np != NULL; np = np->peer) {
if (strcmp(path[0],np->name) == 0) {
- /* name matches */
- if (path[1] == NULL) {
- /* end of the chain, save size */
- np->size = size;
- return;
- }
/* recurse */
addtree(np,&path[1],size);
return;
|