--- 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);
