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 8F453431FBC for ; Sat, 21 Nov 2009 19:07:56 -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 FOM2OT-pNV7G for ; Sat, 21 Nov 2009 19:07:56 -0800 (PST) Received: from mail-gx0-f221.google.com (mail-gx0-f221.google.com [209.85.217.221]) by olra.theworths.org (Postfix) with ESMTP id EC1DA431FAE for ; Sat, 21 Nov 2009 19:07:55 -0800 (PST) Received: by gxk21 with SMTP id 21so3933233gxk.10 for ; Sat, 21 Nov 2009 19:07:55 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:from:to:cc:subject:date :message-id:x-mailer; bh=1b4qTuTZy7cuCliveYb0PuCPZtCMfJ9ELOFeMa1N0tc=; b=ZRViiUXOIMHjW/QVaVoG5nm0s9DC/4j+tGZ+8UQpy6kb76BC6hbwdcqtzpn3vn0mkQ AL/YYm3H7lHKBxATFcrJ0degaFI3Ej13thFm+7620XgZDfhFvnIpH+JwDb2IwOywZiJS Va2l2MA1kSqX5WCTXoiHzktc/tGWzPWPoVbpA= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=from:to:cc:subject:date:message-id:x-mailer; b=hAxsseWffc8HTQR9UXrqgEZhiYZvck6guLr/XCXgl6Ln2q5ELJtCzgYYt+5Rn6ghWU AV5vFsgrOpOHDLvFktR+JXGfTYh77dKzq6FcTS+om5Ew1p+LfMYqL+/EGLEK1bF28VRz aPCPIIljyQCXE05NphN72DBSXGwEvTQ4n6RUo= Received: by 10.150.38.4 with SMTP id l4mr5562259ybl.340.1258859275618; Sat, 21 Nov 2009 19:07:55 -0800 (PST) Received: from localhost.localdomain ([123.116.120.71]) by mx.google.com with ESMTPS id 14sm1524526gxk.10.2009.11.21.19.07.51 (version=TLSv1/SSLv3 cipher=RC4-MD5); Sat, 21 Nov 2009 19:07:54 -0800 (PST) From: Jjgod Jiang To: notmuch@notmuchmail.org Date: Sun, 22 Nov 2009 11:07:36 +0800 Message-Id: <1258859256-33197-1-git-send-email-gzjjgod@gmail.com> X-Mailer: git-send-email 1.6.4 Subject: [notmuch] [PATCH] Mac OS X compatibility fixes 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: Sun, 22 Nov 2009 03:07:56 -0000 Add missing GNU extensions strdup() and getline(). The C library shipped with Mac OS X does not include them (though it does support some GNU extensions when _GNU_SOURCE is defined), so we have to add these two. The getline() implementation is a modified version of getdelim() from GNU Libc. --- 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..805b236 100644 --- a/lib/xutil.c +++ b/lib/xutil.c @@ -79,6 +79,105 @@ xstrdup (const char *s) return ret; } +#ifdef __APPLE__ +/* Mac OS X don't have strndup even if _GNU_SOURCE is defined */ +char *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 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; +} +#endif + char * xstrndup (const char *s, size_t n) { diff --git a/lib/xutil.h b/lib/xutil.h index b973f7d..0b53f7c 100644 --- a/lib/xutil.h +++ b/lib/xutil.h @@ -25,6 +25,12 @@ #include #include +#ifdef __APPLE__ +/* Mac OS X don't have strndup and getline even if _GNU_SOURCE is defined */ +char *strndup (const char *s, size_t n); +ssize_t getline(char **lineptr, size_t *n, FILE *stream); +#endif + /* xutil.c */ void * xcalloc (size_t nmemb, size_t size); -- 1.6.4