diff options
Diffstat (limited to 'usr.bin/join/join.c')
| -rw-r--r-- | usr.bin/join/join.c | 29 | 
1 files changed, 20 insertions, 9 deletions
| diff --git a/usr.bin/join/join.c b/usr.bin/join/join.c index bfe526f67889..21973a8a0efe 100644 --- a/usr.bin/join/join.c +++ b/usr.bin/join/join.c @@ -42,15 +42,16 @@ char copyright[] =  #endif /* not lint */  #ifndef lint -static char sccsid[] = "@(#)join.c	5.1 (Berkeley) 11/18/91"; +/*static char sccsid[] = "from: @(#)join.c	5.1 (Berkeley) 11/18/91";*/ +static char rcsid[] = "$Id: join.c,v 1.4 1994/04/17 09:35:20 alm Exp $";  #endif /* not lint */  #include <sys/types.h> -#include <errno.h> -#include <stdlib.h>  #include <stdio.h> +#include <stdlib.h>  #include <string.h>  #include <ctype.h> +#include <errno.h>  /*   * There's a structure per input file which encapsulates the state of the @@ -270,7 +271,7 @@ slurp(F)  	LINE tmp;  	size_t len;  	int cnt; -	char *bp, *fieldp, *token; +	char *bp, *fieldp;  	/*  	 * Read all of the lines from an input file that have the same @@ -307,20 +308,30 @@ slurp(F)  			F->pushback = -1;  			continue;  		} -		if ((bp = fgetline(F->fp, &len)) == NULL) +		if ((bp = fgetln(F->fp, &len)) == NULL)  			return; -		while (lp->linealloc <= len) { -			lp->linealloc += 100; +		if (lp->linealloc <= len + 1) { +			if (lp->linealloc == 0) +				lp->linealloc = 128; +			while (lp->linealloc <= len + 1) +				lp->linealloc *= 2; +  			if ((lp->line = realloc(lp->line,  			    lp->linealloc * sizeof(char))) == NULL)  				enomem();  		}  		bcopy(bp, lp->line, len+1); +		/* Replace trailing newline, if it exists. */  +		if (bp[len - 1] == '\n') +			lp->line[len - 1] = '\0'; +		else +			lp->line[len] = '\0'; +		bp = lp->line; +  		/* Split the line into fields, allocate space as necessary. */ -		token = lp->line;  		lp->fieldcnt = 0; -		while ((fieldp = strsep(&token, tabchar)) != NULL) { +		while ((fieldp = strsep(&bp, tabchar)) != NULL) {  			if (spans && *fieldp == '\0')  				continue;  			if (lp->fieldcnt == lp->fieldalloc) { | 
