From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Rob Browning Newsgroups: gmane.lisp.guile.devel Subject: [PATCH 3/8] pyutil: add INTEGER_TO_PY as BUP_LONGISH_TO_PY Date: Tue, 30 May 2023 19:49:39 -0500 Message-ID: <20230531004944.1657633-4-rlb@defaultvalue.org> References: <20230531004944.1657633-1-rlb@defaultvalue.org> Mime-Version: 1.0 Content-Transfer-Encoding: 8bit Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="13783"; mail-complaints-to="usenet@ciao.gmane.io" To: guile-devel@gnu.org Original-X-From: guile-devel-bounces+guile-devel=m.gmane-mx.org@gnu.org Wed May 31 02:50:04 2023 Return-path: Envelope-to: guile-devel@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1q4A2N-0003MV-Tl for guile-devel@m.gmane-mx.org; Wed, 31 May 2023 02:50:04 +0200 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1q4A2B-0006KT-Aj; Tue, 30 May 2023 20:49:51 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1q4A29-0006Jo-Eg for guile-devel@gnu.org; Tue, 30 May 2023 20:49:49 -0400 Original-Received: from defaultvalue.org ([45.33.119.55]) by eggs.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1q4A27-0008E4-Lc for guile-devel@gnu.org; Tue, 30 May 2023 20:49:49 -0400 Original-Received: from trouble.defaultvalue.org (localhost [127.0.0.1]) (Authenticated sender: rlb@defaultvalue.org) by defaultvalue.org (Postfix) with ESMTPSA id 6C5A520275 for ; Tue, 30 May 2023 19:49:45 -0500 (CDT) Original-Received: by trouble.defaultvalue.org (Postfix, from userid 1000) id 0EBF914E09D; Tue, 30 May 2023 19:49:45 -0500 (CDT) X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230531004944.1657633-1-rlb@defaultvalue.org> Received-SPF: pass client-ip=45.33.119.55; envelope-from=rlb@defaultvalue.org; helo=defaultvalue.org X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: guile-devel@gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "Developers list for Guile, the GNU extensibility library" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guile-devel-bounces+guile-devel=m.gmane-mx.org@gnu.org Original-Sender: guile-devel-bounces+guile-devel=m.gmane-mx.org@gnu.org Xref: news.gmane.io gmane.lisp.guile.devel:21840 Archived-At: Change to longish to hint that it only handles up to long (long)s. Signed-off-by: Rob Browning Tested-by: Rob Browning --- lib/bup/_helpers.c | 47 ++++++++++++++++++++++------------------------ src/bup/pyutil.h | 7 +++++++ 2 files changed, 29 insertions(+), 25 deletions(-) diff --git a/lib/bup/_helpers.c b/lib/bup/_helpers.c index 6874a2bc6..d58cf9954 100644 --- a/lib/bup/_helpers.c +++ b/lib/bup/_helpers.c @@ -125,9 +125,6 @@ static uint64_t htonll(uint64_t value) #define INTEGRAL_ASSIGNMENT_FITS(dest, src) INT_ADD_OK(src, 0, dest) -#define INTEGER_TO_PY(x) \ - EXPR_SIGNED(x) ? PyLong_FromLongLong(x) : PyLong_FromUnsignedLongLong(x) - static int bup_ulong_from_py(unsigned long *x, PyObject *py, const char *name) { @@ -1359,22 +1356,22 @@ static PyObject *stat_struct_to_py(const struct stat *st, { // We can check the known (via POSIX) signed and unsigned types at // compile time, but not (easily) the unspecified types, so handle - // those via INTEGER_TO_PY(). Assumes ns values will fit in a + // those via BUP_LONGISH_TO_PY(). Assumes ns values will fit in a // long. return Py_BuildValue("NKNNNNNL(Nl)(Nl)(Nl)", - INTEGER_TO_PY(st->st_mode), + BUP_LONGISH_TO_PY(st->st_mode), (unsigned PY_LONG_LONG) st->st_ino, - INTEGER_TO_PY(st->st_dev), - INTEGER_TO_PY(st->st_nlink), - INTEGER_TO_PY(st->st_uid), - INTEGER_TO_PY(st->st_gid), - INTEGER_TO_PY(st->st_rdev), + BUP_LONGISH_TO_PY(st->st_dev), + BUP_LONGISH_TO_PY(st->st_nlink), + BUP_LONGISH_TO_PY(st->st_uid), + BUP_LONGISH_TO_PY(st->st_gid), + BUP_LONGISH_TO_PY(st->st_rdev), (PY_LONG_LONG) st->st_size, - INTEGER_TO_PY(st->st_atime), + BUP_LONGISH_TO_PY(st->st_atime), (long) BUP_STAT_ATIME_NS(st), - INTEGER_TO_PY(st->st_mtime), + BUP_LONGISH_TO_PY(st->st_mtime), (long) BUP_STAT_MTIME_NS(st), - INTEGER_TO_PY(st->st_ctime), + BUP_LONGISH_TO_PY(st->st_ctime), (long) BUP_STAT_CTIME_NS(st)); } @@ -1573,15 +1570,15 @@ static PyObject *pwd_struct_to_py(const struct passwd *pwd) { // We can check the known (via POSIX) signed and unsigned types at // compile time, but not (easily) the unspecified types, so handle - // those via INTEGER_TO_PY(). + // those via BUP_LONGISH_TO_PY(). if (pwd == NULL) Py_RETURN_NONE; return Py_BuildValue(cstr_argf cstr_argf "OO" cstr_argf cstr_argf cstr_argf, pwd->pw_name, pwd->pw_passwd, - INTEGER_TO_PY(pwd->pw_uid), - INTEGER_TO_PY(pwd->pw_gid), + BUP_LONGISH_TO_PY(pwd->pw_uid), + BUP_LONGISH_TO_PY(pwd->pw_gid), pwd->pw_gecos, pwd->pw_dir, pwd->pw_shell); @@ -1621,7 +1618,7 @@ static PyObject *grp_struct_to_py(const struct group *grp) { // We can check the known (via POSIX) signed and unsigned types at // compile time, but not (easily) the unspecified types, so handle - // those via INTEGER_TO_PY(). + // those via BUP_LONGISH_TO_PY(). if (grp == NULL) Py_RETURN_NONE; @@ -1631,7 +1628,7 @@ static PyObject *grp_struct_to_py(const struct group *grp) return Py_BuildValue(cstr_argf cstr_argf "OO", grp->gr_name, grp->gr_passwd, - INTEGER_TO_PY(grp->gr_gid), + BUP_LONGISH_TO_PY(grp->gr_gid), members); } @@ -2274,7 +2271,7 @@ static int setup_module(PyObject *m) // Just be sure (relevant when passing timestamps back to Python above). assert(sizeof(PY_LONG_LONG) <= sizeof(long long)); assert(sizeof(unsigned PY_LONG_LONG) <= sizeof(unsigned long long)); - // At least for INTEGER_TO_PY + // At least for BUP_LONGISH_TO_PY assert(sizeof(intmax_t) <= sizeof(long long)); assert(sizeof(uintmax_t) <= sizeof(unsigned long long)); // This should be guaranteed by the C standard, but it's cheap to @@ -2296,10 +2293,10 @@ static int setup_module(PyObject *m) char *e; { PyObject *value; - value = INTEGER_TO_PY(INT_MAX); + value = BUP_LONGISH_TO_PY(INT_MAX); PyObject_SetAttrString(m, "INT_MAX", value); Py_DECREF(value); - value = INTEGER_TO_PY(UINT_MAX); + value = BUP_LONGISH_TO_PY(UINT_MAX); PyObject_SetAttrString(m, "UINT_MAX", value); Py_DECREF(value); } @@ -2308,13 +2305,13 @@ static int setup_module(PyObject *m) #ifdef HAVE_UTIMENSAT { PyObject *value; - value = INTEGER_TO_PY(AT_FDCWD); + value = BUP_LONGISH_TO_PY(AT_FDCWD); PyObject_SetAttrString(m, "AT_FDCWD", value); Py_DECREF(value); - value = INTEGER_TO_PY(AT_SYMLINK_NOFOLLOW); + value = BUP_LONGISH_TO_PY(AT_SYMLINK_NOFOLLOW); PyObject_SetAttrString(m, "AT_SYMLINK_NOFOLLOW", value); Py_DECREF(value); - value = INTEGER_TO_PY(UTIME_NOW); + value = BUP_LONGISH_TO_PY(UTIME_NOW); PyObject_SetAttrString(m, "UTIME_NOW", value); Py_DECREF(value); } @@ -2324,7 +2321,7 @@ static int setup_module(PyObject *m) #ifdef BUP_HAVE_MINCORE_INCORE { PyObject *value; - value = INTEGER_TO_PY(MINCORE_INCORE); + value = BUP_LONGISH_TO_PY(MINCORE_INCORE); PyObject_SetAttrString(m, "MINCORE_INCORE", value); Py_DECREF(value); } diff --git a/src/bup/pyutil.h b/src/bup/pyutil.h index 680ca5460..d49e6f001 100644 --- a/src/bup/pyutil.h +++ b/src/bup/pyutil.h @@ -1,4 +1,11 @@ #pragma once +#include + +#include "bup/intprops.h" + +#define BUP_LONGISH_TO_PY(x) \ + EXPR_SIGNED(x) ? PyLong_FromLongLong(x) : PyLong_FromUnsignedLongLong(x) + void *checked_calloc(size_t n, size_t size); void *checked_malloc(size_t n, size_t size); -- 2.39.2