"Fossies" - the Fresh Open Source Software Archive

Member "file-5.35/src/getline.c" (18 Dec 2014, 2810 Bytes) of package /linux/misc/file-5.35.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file. For more information about "getline.c" see the Fossies "Dox" file reference documentation.

    1 /*  $NetBSD: getline.c,v 1.2 2014/09/16 17:23:50 christos Exp $ */
    2 
    3 /*-
    4  * Copyright (c) 2011 The NetBSD Foundation, Inc.
    5  * All rights reserved.
    6  *
    7  * This code is derived from software contributed to The NetBSD Foundation
    8  * by Christos Zoulas.
    9  *
   10  * Redistribution and use in source and binary forms, with or without
   11  * modification, are permitted provided that the following conditions
   12  * are met:
   13  * 1. Redistributions of source code must retain the above copyright
   14  *    notice, this list of conditions and the following disclaimer.
   15  * 2. Redistributions in binary form must reproduce the above copyright
   16  *    notice, this list of conditions and the following disclaimer in the
   17  *    documentation and/or other materials provided with the distribution.
   18  *
   19  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
   20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
   21  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
   22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
   23  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
   24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
   25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
   26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
   27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
   29  * POSSIBILITY OF SUCH DAMAGE.
   30  */
   31 
   32 #include "file.h"
   33 #if !HAVE_GETLINE
   34 #include <stdlib.h>
   35 #include <stdio.h>
   36 #include <unistd.h>
   37 #include <errno.h>
   38 #include <string.h>
   39 
   40 public ssize_t
   41 getdelim(char **buf, size_t *bufsiz, int delimiter, FILE *fp)
   42 {
   43     char *ptr, *eptr;
   44 
   45 
   46     if (*buf == NULL || *bufsiz == 0) {
   47         *bufsiz = BUFSIZ;
   48         if ((*buf = malloc(*bufsiz)) == NULL)
   49             return -1;
   50     }
   51 
   52     for (ptr = *buf, eptr = *buf + *bufsiz;;) {
   53         int c = fgetc(fp);
   54         if (c == -1) {
   55             if (feof(fp)) {
   56                 ssize_t diff = (ssize_t)(ptr - *buf);
   57                 if (diff != 0) {
   58                     *ptr = '\0';
   59                     return diff;
   60                 }
   61             }
   62             return -1;
   63         }
   64         *ptr++ = c;
   65         if (c == delimiter) {
   66             *ptr = '\0';
   67             return ptr - *buf;
   68         }
   69         if (ptr + 2 >= eptr) {
   70             char *nbuf;
   71             size_t nbufsiz = *bufsiz * 2;
   72             ssize_t d = ptr - *buf;
   73             if ((nbuf = realloc(*buf, nbufsiz)) == NULL)
   74                 return -1;
   75             *buf = nbuf;
   76             *bufsiz = nbufsiz;
   77             eptr = nbuf + nbufsiz;
   78             ptr = nbuf + d;
   79         }
   80     }
   81 }
   82 
   83 public ssize_t
   84 getline(char **buf, size_t *bufsiz, FILE *fp)
   85 {
   86     return getdelim(buf, bufsiz, '\n', fp);
   87 }
   88 
   89 #endif
   90 
   91 #ifdef TEST
   92 int
   93 main(int argc, char *argv[])
   94 {
   95     char *p = NULL;
   96     ssize_t len;
   97     size_t n = 0;
   98 
   99     while ((len = getline(&p, &n, stdin)) != -1)
  100         (void)printf("%" SIZE_T_FORMAT "d %s", len, p);
  101     free(p);
  102     return 0;
  103 }
  104 #endif