(linenum→info "unix/slp.c:2238")

bsd-games/2.17/lib/fgetln.c

    1: /* lib/fgetln.c - bsd-games implementation of fgetln.
    2:  *
    3:  * Copyright (c) 1997, 1998, 1999, 2000, 2004 Joseph Samuel Myers.
    4:  * All rights reserved.
    5:  *
    6:  * Redistribution and use in source and binary forms, with or without
    7:  * modification, are permitted provided that the following conditions
    8:  * are met:
    9:  * 1. Redistributions of source code must retain the above copyright
   10:  *    notice, this list of conditions and the following disclaimer.
   11:  * 2. Redistributions in binary form must reproduce the above copyright
   12:  *    notice, this list of conditions and the following disclaimer in the
   13:  *    documentation and/or other materials provided with the distribution.
   14:  * 3. The name of the author may not be used to endorse or promote products
   15:  *    derived from this software without specific prior written permission.
   16:  *
   17:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
   18:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   19:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
   20:  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
   21:  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
   22:  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
   23:  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
   24:  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   25:  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   26:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   27:  * SUCH DAMAGE.
   28:  */
   29: 
   30: #include <stdio.h>
   31: #include <stdlib.h>
   32: #include <string.h>
   33: 
   34: #ifndef HAVE_fgetln
   35: char *
   36: fgetln(FILE *stream, size_t *len)
   37: {
   38:   static char *buf = NULL;
   39:   static size_t buflen = 0;
   40:   char *res;
   41:   char *nbuf;
   42:   if (buf == NULL) {
   43:     buf = (char *)malloc(buflen = 1024);
   44:     if (buf == NULL) {
   45:       return NULL;
   46:     }
   47:   }
   48:   buf[buflen - 1] = 1;
   49:   res = fgets(buf, buflen, stream);
   50:   if (res == NULL)
   51:     return NULL;
   52:   while (buf[buflen - 1] == 0 && buf[buflen - 2] != '\n') { /* long line */
   53:     nbuf = realloc(buf, buflen * 2);
   54:     if (nbuf == NULL)
   55:       return NULL;
   56:     buf = nbuf;
   57:     buflen *= 2;
   58:     buf[buflen - 1] = 1;
   59:     res = fgets(buf + buflen/2 - 1, buflen/2 + 1, stream);
   60:     if (res == NULL)
   61:       return NULL;
   62:   }
   63:   *len = strlen(buf);
   64:   return buf;
   65: }
   66: #endif /* !defined(HAVE_fgetln) */
Syntax (Markdown)