Return to BSD News archive
Path: sserve!newshost.anu.edu.au!harbinger.cc.monash.edu.au!msuinfo!netnews.upenn.edu!news.amherst.edu!news.mtholyoke.edu!uhog.mit.edu!europa.eng.gtefsd.com!howland.reston.ans.net!EU.net!Germany.EU.net!netmbx.de!zelator!deadline.bln.sub.org!boavista.panic.bln.sub.org!boavista.bln.sub.org!erdmann From: erdmann@boavista.bln.sub.org (Michael Erdmann) Newsgroups: comp.os.386bsd.development Subject: Best buffering method for gets, read1line etc... Date: 11 Aug 1994 12:26:14 GMT Organization: none Lines: 62 Distribution: world Message-ID: <32d5d7$27j@boavista.bln.sub.org> Reply-To: erdmann@boavista.bln.sub.org (Michael Erdmann) NNTP-Posting-Host: 200.0.0.1 Keywords: realloc First of all sorry for changing the title, but i think this issue is not connected to the original problem: Why does FreeBSD 1.1.5 say gets() is unsafe? After all the discussion i will use the following code given below as a replacement of gets: Based Kees J. Bot code original code with following changes: 1. An intermediate buffer is allocated for the whole liftime of the application. This buffer will be increased by the rule size = _reallocTuning *size (In my original positing i have used size += size in contradiction to the text, did any body realize this??). 2. The function returns a string of the exact size. So no memory is wasted by giving to large strings back to the application. Still the major performance bottleneck beside of i/o speed is the strdup which yields the return string. The allocation/reallocation method will not be the important issue for well structured text files, because the realloc will not happen on every line. The worst case would be an document with constantly increases line length. #include <stdio.h> #include <strings.h> #include <stdlib.h> double _reallocTuning = 1.5; #define K *1024 char *read1line(FILE *fp) { static char *line = NULL; size_t lineLength=2 K; size_t idx; int c; if( line ==NULL ) line = malloc(lineLength*sizeof(char)); for(idx=0; (c= getc(fp)) != EOF && c != '\n'; ++idx) { if (idx == lineLength ) { lineLength = _reallocTuning * lineLength ; line= realloc(line, lineLength*sizeof(char)); } line[idx]= c; } if (c == EOF) return NULL; line[idx]= 0; return strdup(line); } --