39 lines
		
	
	
		
			610 B
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			39 lines
		
	
	
		
			610 B
		
	
	
	
		
			C
		
	
	
	
	
	
 | 
						|
#include <stdio.h>
 | 
						|
#include <stdlib.h>
 | 
						|
#include <string.h>
 | 
						|
 | 
						|
char *
 | 
						|
fgetln(FILE *fp, size_t *lenp)
 | 
						|
{
 | 
						|
#define EXTRA 80
 | 
						|
	char *buf = NULL;
 | 
						|
	int used = 0, len = 0, remain = 0, final = 0;
 | 
						|
	while(!final) {
 | 
						|
		char *b;
 | 
						|
		int r;
 | 
						|
		if(remain < EXTRA) {
 | 
						|
			int newlen;
 | 
						|
			char *newbuf;
 | 
						|
			newlen = len + EXTRA;
 | 
						|
			if(!(newbuf = realloc(buf, newlen))) {
 | 
						|
				if(buf) free(buf);
 | 
						|
				return NULL;
 | 
						|
			}
 | 
						|
			buf = newbuf;
 | 
						|
			len = newlen;
 | 
						|
			remain += EXTRA;
 | 
						|
		}
 | 
						|
		buf[used] = '\0';
 | 
						|
		if(!fgets(buf + used, remain, fp))
 | 
						|
			break;
 | 
						|
		r = strlen(buf+used);
 | 
						|
		used += r;
 | 
						|
		remain -= r;
 | 
						|
		len += r;
 | 
						|
	}
 | 
						|
	*lenp = len;
 | 
						|
	return buf;
 | 
						|
}
 | 
						|
 |