morpheus-base

morpheus base system
git clone git://git.2f30.org/morpheus-base
Log | Files | Refs

fgetln.c (2341B)


      1 /*
      2  * Copyright © 2005 Hector Garcia Alvarez
      3  * Copyright © 2005, 2008-2012 Guillem Jover <guillem@hadrons.org>
      4  *
      5  * Redistribution and use in source and binary forms, with or without
      6  * modification, are permitted provided that the following conditions
      7  * are met:
      8  * 1. Redistributions of source code must retain the above copyright
      9  *    notice, this list of conditions and the following disclaimer.
     10  * 2. Redistributions in binary form must reproduce the above copyright
     11  *    notice, this list of conditions and the following disclaimer in the
     12  *    documentation and/or other materials provided with the distribution.
     13  * 3. The name of the author may not be used to endorse or promote products
     14  *    derived from this software without specific prior written permission.
     15  *
     16  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
     17  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
     18  * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
     19  * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     20  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     21  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
     22  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     23  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
     24  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
     25  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     26  */
     27 
     28 #include <stdio.h>
     29 #include <sys/types.h>
     30 #include <string.h>
     31 
     32 struct filebuf {
     33 	FILE *fp;
     34 	char *buf;
     35 	size_t len;
     36 };
     37 
     38 #define FILEBUF_POOL_ITEMS 32
     39 
     40 static struct filebuf fb_pool[FILEBUF_POOL_ITEMS];
     41 static int fb_pool_cur;
     42 
     43 char *
     44 fgetln(FILE *stream, size_t *len)
     45 {
     46 	struct filebuf *fb;
     47 	ssize_t nread;
     48 
     49 	/* Try to diminish the possibility of several fgetln() calls being
     50 	 * used on different streams, by using a pool of buffers per file. */
     51 	fb = &fb_pool[fb_pool_cur];
     52 	if (fb->fp != stream && fb->fp != NULL) {
     53 		fb_pool_cur++;
     54 		fb_pool_cur %= FILEBUF_POOL_ITEMS;
     55 		fb = &fb_pool[fb_pool_cur];
     56 	}
     57 	fb->fp = stream;
     58 
     59 	nread = getline(&fb->buf, &fb->len, stream);
     60 	/* Note: the getdelim/getline API ensures nread != 0. */
     61 	if (nread == -1) {
     62 		*len = 0;
     63 		return NULL;
     64 	} else {
     65 		*len = (size_t)nread;
     66 		return fb->buf;
     67 	}
     68 }