Path: blob/main/contrib/libarchive/libarchive_fe/lafe_getline.c
288990 views
/* $NetBSD: getline.c,v 1.2 2014/09/16 17:23:50 christos Exp $ */12/*-3* SPDX-License-Identifier: BSD-2-Clause4*5* Copyright (c) 2011 The NetBSD Foundation, Inc.6* All rights reserved.7*/89#include "lafe_platform.h"10#ifndef HAVE_GETLINE1112#ifdef HAVE_STDLIB_H13#include <stdlib.h>14#endif15#ifdef HAVE_STDINT_H16#include <stdint.h>17#endif18#ifdef HAVE_STDIO_H19#include <stdio.h>20#endif21#ifdef HAVE_UNISTD_H22#include <unistd.h>23#endif24#ifdef HAVE_ERRNO_H25#include <errno.h>26#endif27#ifdef HAVE_STRING_H28#include <string.h>29#endif3031#include "lafe_getline.h"3233static ssize_t34lafe_getdelim(char **buf, size_t *bufsiz, int delimiter, FILE *fp)35{36char *ptr, *eptr;373839if (*buf == NULL || *bufsiz == 0) {40*bufsiz = BUFSIZ;41if ((*buf = malloc(*bufsiz)) == NULL)42return -1;43}4445for (ptr = *buf, eptr = *buf + *bufsiz;;) {46int c = fgetc(fp);47if (c == -1) {48if (feof(fp)) {49ssize_t diff = (ssize_t)(ptr - *buf);50if (diff != 0) {51*ptr = '\0';52return diff;53}54}55return -1;56}57*ptr++ = c;58if (c == delimiter) {59*ptr = '\0';60return ptr - *buf;61}62if (ptr + 2 >= eptr) {63char *nbuf;64size_t nbufsiz = *bufsiz * 2;65ssize_t d = ptr - *buf;66if ((nbuf = realloc(*buf, nbufsiz)) == NULL)67return -1;68*buf = nbuf;69*bufsiz = nbufsiz;70eptr = nbuf + nbufsiz;71ptr = nbuf + d;72}73}74}7576ssize_t77getline(char **buf, size_t *bufsiz, FILE *fp)78{79return lafe_getdelim(buf, bufsiz, '\n', fp);80}81#endif828384