Path: utzoo!utgpu!news-server.csri.toronto.edu!cs.utexas.edu!uunet!mcsun!ukc!mucs!ipse2pt5.cs.man.ac.uk From: ian@ipse2pt5.cs.man.ac.uk (Ian Cottam) Newsgroups: comp.lang.c Subject: Yet another fgetline() Message-ID: <2117@m1.cs.man.ac.uk> Date: 7 Feb 91 16:38:32 GMT Sender: news@cs.man.ac.uk Organization: Department of Computer Science, University of Manchester UK Lines: 65 I typed this in because I waited a while and no one else did. (Of course, five minutes ago I just got one over the net :-) !) Anyway, here it is; in case people would like something to criticise. Thanks to a local user for comments (Stephen Bevan). K&R I people will have to hack-out the ANSI stuff. ___________________________________________________cut here_____________ /* Ian Cottam FEB 91 -- donated to public domain. */ #include #include #include /* * fgetline(FILE *f) - returns a pointer to the start of a line read * from f, or the null pointer on any error or eof. * Like fgets(), you may well want to get rid of the * \n at the end (if any), and check feof(f)! This is * not a wonderful interface, but it mimics fgets(). * Caller should free memory if desired. */ #ifndef FGETLINE_BUFFSIZE # define FGETLINE_BUFFSIZE 20 #endif #if FGETLINE_BUFFSIZE < 2 #error FGETLINE_BUFFSIZE must be > 1 #endif char * fgetline(FILE *f) { extern void *malloc(size_t); extern void free(void *); char *buffer= (char *)malloc(FGETLINE_BUFFSIZE); char *result; if (buffer == NULL) return NULL; /*out of memory*/ result= fgets(buffer, FGETLINE_BUFFSIZE, f); if (result == NULL) return NULL; /* either error or at eof */ if (buffer[strlen(buffer)-1] != '\n' && !feof(f)) { /* longer line than buffer can hold */ char *restofline= fgetline(f); char *longline; if (restofline == NULL) return NULL; /*eof or error*/ longline= (char *)malloc(strlen(buffer)+strlen(restofline)+1); if (longline == NULL) return NULL; /*out of memory*/ (void) strcat(strcpy(longline, buffer), restofline ); free(restofline); free(buffer); return longline; } else return buffer; } -- Ian Cottam, Room IT209, Department of Computer Science, University of Manchester, Oxford Road, Manchester, M13 9PL, U.K. Tel: (+44) 61-275 6157 FAX: (+44) 61-275-6280 Internet: ian%cs.man.ac.uk; JANET: ian@uk.ac.man.cs