tor

The Tor anonymity network
git clone https://git.dasho.dev/tor.git
Log | Files | Refs | README | LICENSE

getdelim.c (2484B)


      1 /*	$NetBSD: getdelim.c,v 1.2 2015/12/25 20:12:46 joerg Exp $	*/
      2 /*	NetBSD-src: getline.c,v 1.2 2014/09/16 17:23:50 christos Exp 	*/
      3 
      4 /*-
      5 * Copyright (c) 2011 The NetBSD Foundation, Inc.
      6 * All rights reserved.
      7 *
      8 * This code is derived from software contributed to The NetBSD Foundation
      9 * by Christos Zoulas.
     10 *
     11 * Redistribution and use in source and binary forms, with or without
     12 * modification, are permitted provided that the following conditions
     13 * are met:
     14 * 1. Redistributions of source code must retain the above copyright
     15 *    notice, this list of conditions and the following disclaimer.
     16 * 2. Redistributions in binary form must reproduce the above copyright
     17 *    notice, this list of conditions and the following disclaimer in the
     18 *    documentation and/or other materials provided with the distribution.
     19 *
     20 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     21 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     22 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     23 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     24 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     25 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     30 * POSSIBILITY OF SUCH DAMAGE.
     31 */
     32 
     33 #ifndef BUFSIZ
     34 #define BUFSIZ 512
     35 #endif
     36 
     37 ssize_t
     38 compat_getdelim_(char **buf, size_t *bufsiz, int delimiter, FILE *fp)
     39 {
     40 char *ptr, *eptr;
     41 
     42 
     43 if (*buf == NULL || *bufsiz == 0) {
     44 	*bufsiz = BUFSIZ;
     45 	if ((*buf = raw_malloc(*bufsiz)) == NULL)
     46 		return -1;
     47 }
     48 
     49 for (ptr = *buf, eptr = *buf + *bufsiz;;) {
     50 	int c = fgetc(fp);
     51 	if (c == -1) {
     52 		if (feof(fp)) {
     53 			ssize_t diff = (ssize_t)(ptr - *buf);
     54 			if (diff != 0) {
     55 				*ptr = '\0';
     56 				return diff;
     57 			}
     58 		}
     59 		return -1;
     60 	}
     61 	*ptr++ = c;
     62 	if (c == delimiter) {
     63 		*ptr = '\0';
     64 		return ptr - *buf;
     65 	}
     66 	if (ptr + 2 >= eptr) {
     67 		char *nbuf;
     68 		size_t nbufsiz = *bufsiz * 2;
     69 		ssize_t d = ptr - *buf;
     70 		if (nbufsiz < *bufsiz ||
     71 		    (nbuf = raw_realloc(*buf, nbufsiz)) == NULL)
     72 			return -1;
     73 		*buf = nbuf;
     74 		*bufsiz = nbufsiz;
     75 		eptr = nbuf + nbufsiz;
     76 		ptr = nbuf + d;
     77 	}
     78 }
     79 }