* Allow filenames with whitespace characters (not CR or LF though) * Correctly handle root directory entry ("/") --- xdu.c.orig Mon Apr 24 09:01:53 2000 +++ xdu.c Mon Apr 24 10:08:07 2000 @@ -234,6 +234,7 @@ char name[4096]; int size; FILE *fp; + char *p, *n; if (strcmp(filename, "-") == 0) { fp = stdin; @@ -243,11 +244,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); } @@ -268,7 +279,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; @@ -288,8 +299,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); @@ -398,15 +411,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;