--- xdu-3.0/xdu.c.orig Mon Jun 6 04:29:23 1994 +++ xdu-3.0/xdu.c Mon Oct 18 01:20:58 1999 @@ -232,7 +232,7 @@ char *filename; { char buf[4096]; - char name[4096]; + char *name; int size; FILE *fp; @@ -245,7 +245,9 @@ } } while (fgets(buf,sizeof(buf),fp) != NULL) { - sscanf(buf, "%d %s\n", &size, name); + if ( (name=strpbrk(buf,"\r\n")) != NULL ) *name = '\0'; + size = (int)strtol( buf, &name, 10 ); + while ( isspace(*name) ) name++; /*printf("%d %s\n", size, name);*/ parse_entry(name,size); } @@ -259,38 +261,24 @@ int size; { char *path[MAXDEPTH]; /* break up path into this list */ - char buf[MAXNAME]; /* temp space for path element name */ - int arg, indx; + int arg; + char *s; int length; /* nelson@reed.edu - trailing / fix */ - if (*name == '/') - name++; /* skip leading / */ - length = strlen(name); - if ((length > 0) && (name[length-1] == '/')) { + if ( length == 0 ) return; + if ((length > 1) && (name[length-1] == '/')) { /* strip off trailing / (e.g. GNU du) */ name[length-1] = 0; } - arg = 0; indx = 0; - bzero(path,sizeof(path)); - bzero(buf,sizeof(buf)); - while (*name != NULL) { - if (*name == '/') { - buf[indx] = 0; - path[arg++] = strdup(buf); - indx = 0; - if (arg >= MAXDEPTH) - break; - } else { - buf[indx++] = *name; - if (indx >= MAXNAME) - break; - } - name++; + arg = 0; + s = strdup(name); + if ( s[0] == '/' ) path[arg++] = "/"; /* root dir */ + for ( s=strtok(s,"/"); s!=NULL; s=strtok(NULL,"/") ) { + path[arg++] = s; + if ( arg >= MAXDEPTH-1 ) break; } - buf[indx] = 0; - path[arg++] = strdup(buf); path[arg] = NULL; addtree(&top,path,size);