Return-Path: X-Original-To: notmuch@notmuchmail.org Delivered-To: notmuch@notmuchmail.org Received: from localhost (localhost [127.0.0.1]) by olra.theworths.org (Postfix) with ESMTP id CA03B431FC4 for ; Mon, 23 Nov 2009 05:44:08 -0800 (PST) X-Virus-Scanned: Debian amavisd-new at olra.theworths.org Received: from olra.theworths.org ([127.0.0.1]) by localhost (olra.theworths.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id Ob-gCvvJIig4 for ; Mon, 23 Nov 2009 05:44:07 -0800 (PST) Received: from mail-yw0-f200.google.com (mail-yw0-f200.google.com [209.85.211.200]) by olra.theworths.org (Postfix) with ESMTP id BCC58431FBF for ; Mon, 23 Nov 2009 05:44:07 -0800 (PST) Received: by ywh38 with SMTP id 38so4839962ywh.6 for ; Mon, 23 Nov 2009 05:44:07 -0800 (PST) Received: by 10.150.109.7 with SMTP id h7mr4222931ybc.349.1258983847264; Mon, 23 Nov 2009 05:44:07 -0800 (PST) Received: from lt26923.campus.dmacc.edu ([69.57.47.215]) by mx.google.com with ESMTPS id 16sm2067660gxk.3.2009.11.23.05.44.05 (version=TLSv1/SSLv3 cipher=RC4-MD5); Mon, 23 Nov 2009 05:44:05 -0800 (PST) Received: from localhost ([127.0.0.1] helo=localhost.localdomain) by lt26923.campus.dmacc.edu with esmtps (TLSv1:AES256-SHA:256) (Exim 4.69) (envelope-from ) id 1NCZD1-0007Hp-Qr; Mon, 23 Nov 2009 07:44:03 -0600 From: "Jeffrey C. Ollie" To: Not Much Mail Date: Mon, 23 Nov 2009 07:43:30 -0600 Message-Id: <1258983810-27522-2-git-send-email-jeff@ocjtech.us> X-Mailer: git-send-email 1.6.5.2 In-Reply-To: <1258983810-27522-1-git-send-email-jeff@ocjtech.us> References: <87bpiughr3.fsf@yoom.home.cworth.org> <1258983810-27522-1-git-send-email-jeff@ocjtech.us> Subject: [notmuch] [PATCH] Add private implementations of strndup and getline. X-BeenThere: notmuch@notmuchmail.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: "Use and development of the notmuch mail system." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 23 Nov 2009 13:44:09 -0000 Add private implementations of strndup and getline for those platforms that don't have them (notably Mac OS X) no matter what preprocessor symbols you define. Signed-off-by: Jeffrey C. Ollie --- lib/xutil.c | 99 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ lib/xutil.h | 6 +++ 2 files changed, 105 insertions(+), 0 deletions(-) diff --git a/lib/xutil.c b/lib/xutil.c index 6fa5eb0..61467f1 100644 --- a/lib/xutil.c +++ b/lib/xutil.c @@ -79,6 +79,105 @@ xstrdup (const char *s) return ret; } +/* Mac OS X don't have strndup even if _GNU_SOURCE is defined */ +char * +_notmuch_strndup (const char *s, size_t n) +{ + size_t len = strlen (s); + char *ret; + + if (len <= n) + return strdup (s); + + ret = malloc(n + 1); + strncpy(ret, s, n); + ret[n] = '\0'; + return ret; +} + +/* getline implementation is copied from glibc. */ + +#ifndef SIZE_MAX +# define SIZE_MAX ((size_t) -1) +#endif +#ifndef SSIZE_MAX +# define SSIZE_MAX ((ssize_t) (SIZE_MAX / 2)) +#endif + +ssize_t +_notmuch_getline (char **lineptr, size_t *n, FILE *fp) +{ + ssize_t result; + size_t cur_len = 0; + + if (lineptr == NULL || n == NULL || fp == NULL) + { + errno = EINVAL; + return -1; + } + + if (*lineptr == NULL || *n == 0) + { + *n = 120; + *lineptr = (char *) malloc (*n); + if (*lineptr == NULL) + { + result = -1; + goto end; + } + } + + for (;;) + { + int i; + + i = getc (fp); + if (i == EOF) + { + result = -1; + break; + } + + /* Make enough space for len+1 (for final NUL) bytes. */ + if (cur_len + 1 >= *n) + { + size_t needed_max = + SSIZE_MAX < SIZE_MAX ? (size_t) SSIZE_MAX + 1 : SIZE_MAX; + size_t needed = 2 * *n + 1; /* Be generous. */ + char *new_lineptr; + + if (needed_max < needed) + needed = needed_max; + if (cur_len + 1 >= needed) + { + result = -1; + goto end; + } + + new_lineptr = (char *) realloc (*lineptr, needed); + if (new_lineptr == NULL) + { + result = -1; + goto end; + } + + *lineptr = new_lineptr; + *n = needed; + } + + (*lineptr)[cur_len] = i; + cur_len++; + + if (i == '\n') + break; + } + (*lineptr)[cur_len] = '\0'; + result = cur_len ? (ssize_t) cur_len : result; + +end: + return result; +} + char * xstrndup (const char *s, size_t n) { diff --git a/lib/xutil.h b/lib/xutil.h index b973f7d..d13259a 100644 --- a/lib/xutil.h +++ b/lib/xutil.h @@ -39,6 +39,12 @@ char * xstrdup (const char *s); char * +_notmuch_strndup (const char *s, size_t n); + +ssize_t +_notmuch_getline (char **lineptr, size_t *n, FILE *stream); + +char * xstrndup (const char *s, size_t n); void -- 1.6.5.2