Path: blob/main/contrib/libarchive/unzip/la_getline.c
39482 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 "bsdunzip_platform.h"10#ifndef HAVE_GETLINE1112#ifdef HAVE_STDLIB_H13#include <stdlib.h>14#endif15#ifdef HAVE_STDIO_H16#include <stdio.h>17#endif18#ifdef HAVE_UNISTD_H19#include <unistd.h>20#endif21#ifdef HAVE_ERRNO_H22#include <errno.h>23#endif24#ifdef HAVE_STRING_H25#include <string.h>26#endif2728static ssize_t29la_getdelim(char **buf, size_t *bufsiz, int delimiter, FILE *fp)30{31char *ptr, *eptr;323334if (*buf == NULL || *bufsiz == 0) {35*bufsiz = BUFSIZ;36if ((*buf = malloc(*bufsiz)) == NULL)37return -1;38}3940for (ptr = *buf, eptr = *buf + *bufsiz;;) {41int c = fgetc(fp);42if (c == -1) {43if (feof(fp)) {44ssize_t diff = (ssize_t)(ptr - *buf);45if (diff != 0) {46*ptr = '\0';47return diff;48}49}50return -1;51}52*ptr++ = c;53if (c == delimiter) {54*ptr = '\0';55return ptr - *buf;56}57if (ptr + 2 >= eptr) {58char *nbuf;59size_t nbufsiz = *bufsiz * 2;60ssize_t d = ptr - *buf;61if ((nbuf = realloc(*buf, nbufsiz)) == NULL)62return -1;63*buf = nbuf;64*bufsiz = nbufsiz;65eptr = nbuf + nbufsiz;66ptr = nbuf + d;67}68}69}7071ssize_t72getline(char **buf, size_t *bufsiz, FILE *fp)73{74return la_getdelim(buf, bufsiz, '\n', fp);75}76#endif777879