From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED!not-for-mail From: Vibhav Pant Newsgroups: gmane.emacs.devel Subject: [PATCH] Use get_key_arg to parse keyword arguments in json_parse_object_type Date: Wed, 20 Dec 2017 12:09:30 +0530 Message-ID: <20171220063930.19227-1-vibhavp@gmail.com> NNTP-Posting-Host: blaine.gmane.org X-Trace: blaine.gmane.org 1513751893 1329 195.159.176.226 (20 Dec 2017 06:38:13 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Wed, 20 Dec 2017 06:38:13 +0000 (UTC) Cc: Vibhav Pant To: p.stephani2@gmail.com, emacs-devel@gnu.org Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Wed Dec 20 07:38:09 2017 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by blaine.gmane.org with esmtp (Exim 4.84_2) (envelope-from ) id 1eRY12-0008U1-Nz for ged-emacs-devel@m.gmane.org; Wed, 20 Dec 2017 07:38:08 +0100 Original-Received: from localhost ([::1]:34969 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eRY31-0006H0-3m for ged-emacs-devel@m.gmane.org; Wed, 20 Dec 2017 01:40:11 -0500 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:40926) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eRY2u-0006Gk-ED for emacs-devel@gnu.org; Wed, 20 Dec 2017 01:40:05 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eRY2p-0002Gu-EU for emacs-devel@gnu.org; Wed, 20 Dec 2017 01:40:04 -0500 Original-Received: from mail-lf0-x242.google.com ([2a00:1450:4010:c07::242]:38959) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1eRY2p-0002Fu-6O for emacs-devel@gnu.org; Wed, 20 Dec 2017 01:39:59 -0500 Original-Received: by mail-lf0-x242.google.com with SMTP id m20so9648174lfi.6 for ; Tue, 19 Dec 2017 22:39:58 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=TdAtI8vyPMt0i9HHgUmzqByUSm8E1qy0dReKxnZ+0U8=; b=M9oznKJxVluTYjblgzpjK0j6RioUzwA2tHYIh2CMGtXGxlf6SxXHIccJ1CziMNn+ZX 898gbIJZOzBAv1pmGL/W3tQJ6Eg5Y3V1ZrosCwQBIR/2An4/1cXaVXwjBt/QuTCRs4jj wVRnm/i+DYJrzUXZKDJGFlqAKIx4cKw/WiJhGDA7OpBJo5OoXOR6O0t2mtXkf4z/Q4IF a0Fya/7uOz5V9SMtItV2YCSWXA6NpDTRYnWHj74reixT+d8j3BunX7JrjUtLpi9Y7gvs hI9qxR7wzEl4IFRVDahlc5S7saw8PbbSFDATkKNlCbbj+uo/v3ejOHC4GnwWqRSlq1Mo KpxQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=TdAtI8vyPMt0i9HHgUmzqByUSm8E1qy0dReKxnZ+0U8=; b=QZhImWxMYfjeczlwiDbvk/5cKsY61FcX7avUyNT5V5vot2Z1J6Vcn5UMYq5mFs+QRg ndUhDqjqRF/0+EogK1gmJYGkrzFFMjw7U+aF8NTHgOs8hhQXWAUIAljRHaL8xPmkqtSp qgLpPCjYVQZtMShpVu9hOzuPpTM5O7RQIQczOvo3Ml2n0lYNqeTW8Ic/JAzYALRfkGLX hwfkkPPga/Cw4t/uaiEv7/UCmHSbXdGXO6mn3+8OzTCMN6SDGMIQVeVxyfMS8gAfcig6 lZB2762OXWx0i+ovy7Vpk13UIZzExSUXhUvjNwra5NfuuGVvNmeixxoYemXzza4bwmeU EQAA== X-Gm-Message-State: AKGB3mLovmfcw15RdZks01mjONYSAS0mxZZhcmH84Ny1LQ6CSUAXh0eu 0x/MNQJmbqOPfmZAbK8ZvgEws0ci X-Google-Smtp-Source: ACJfBot3yB1JpCMpxEoGkpIhcu4C/2kxjSsknOS58xC6SF1r72X6JDsqJNmHcakjLSXQ+yAa/bNgfw== X-Received: by 10.25.121.10 with SMTP id u10mr3782301lfc.50.1513751997505; Tue, 19 Dec 2017 22:39:57 -0800 (PST) Original-Received: from localhost.localdomain ([122.177.171.178]) by smtp.gmail.com with ESMTPSA id g80sm3497218ljf.89.2017.12.19.22.39.54 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 19 Dec 2017 22:39:57 -0800 (PST) X-Mailer: git-send-email 2.15.1 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:4010:c07::242 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Original-Sender: "Emacs-devel" Xref: news.gmane.org gmane.emacs.devel:221272 Archived-At: * src/fns.c (get_key_arg): Make function non-static. * src/lisp.h: Add extern declaration for get_key_arg. * src/json.c (json_parse_object_type): Use get_key_arg to get the value of `:object-type'. --- src/fns.c | 2 +- src/json.c | 43 +++++++++++++++++++++++-------------------- src/lisp.h | 1 + 3 files changed, 25 insertions(+), 21 deletions(-) diff --git a/src/fns.c b/src/fns.c index 9db9bea9f7..6193319228 100644 --- a/src/fns.c +++ b/src/fns.c @@ -3558,7 +3558,7 @@ next_almost_prime (EMACS_INT n) 0. This function is used to extract a keyword/argument pair from a DEFUN parameter list. */ -static ptrdiff_t +ptrdiff_t get_key_arg (Lisp_Object key, ptrdiff_t nargs, Lisp_Object *args, char *used) { ptrdiff_t i; diff --git a/src/json.c b/src/json.c index 1c9bf6d49b..4fbeab186c 100644 --- a/src/json.c +++ b/src/json.c @@ -632,26 +632,29 @@ json_to_lisp (json_t *json, enum json_object_type object_type) static enum json_object_type json_parse_object_type (ptrdiff_t nargs, Lisp_Object *args) { - switch (nargs) - { - case 0: - return json_object_hashtable; - case 2: - { - Lisp_Object key = args[0]; - Lisp_Object value = args[1]; - if (!EQ (key, QCobject_type)) - wrong_choice (list1 (QCobject_type), key); - if (EQ (value, Qhash_table)) - return json_object_hashtable; - else if (EQ (value, Qalist)) - return json_object_alist; - else - wrong_choice (list2 (Qhash_table, Qalist), value); - } - default: - wrong_type_argument (Qplistp, Flist (nargs, args)); - } + ptrdiff_t i; + enum json_object_type type; + + USE_SAFE_ALLOCA; + char *used = SAFE_ALLOCA (nargs * sizeof *used); + memset (used, 0, nargs * sizeof *used); + i = get_key_arg (QCobject_type, nargs, args, used); + + if (!i) + type = json_object_hashtable; + else if (EQ (args[i], Qhash_table)) + type = json_object_hashtable; + else if (EQ (args[i], Qalist)) + type = json_object_alist; + else + wrong_choice (list2 (Qhash_table, Qalist), args[i]); + + for (i = 0; i < nargs; i++) + if (!used[i]) + signal_error ("Invalid argument list", args[i]); + + SAFE_FREE (); + return type; } DEFUN ("json-parse-string", Fjson_parse_string, Sjson_parse_string, 1, MANY, diff --git a/src/lisp.h b/src/lisp.h index eb31ba209a..9c54913972 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -3494,6 +3494,7 @@ extern void syms_of_syntax (void); /* Defined in fns.c. */ enum { NEXT_ALMOST_PRIME_LIMIT = 11 }; extern EMACS_INT next_almost_prime (EMACS_INT) ATTRIBUTE_CONST; +extern ptrdiff_t get_key_arg (Lisp_Object, ptrdiff_t, Lisp_Object *, char *); extern Lisp_Object larger_vector (Lisp_Object, ptrdiff_t, ptrdiff_t); extern void sweep_weak_hash_tables (void); extern char *extract_data_from_object (Lisp_Object, ptrdiff_t *, ptrdiff_t *); -- 2.15.1