/* GNU Mailutils -- a suite of utilities for electronic mail Copyright (C) 2011-2021 Free Software Foundation, Inc. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library. If not, see . */ #include "mu_scm.h" #include #include SCM_DEFINE_PUBLIC (scm_mu_debug_parse, "mu-debug-parse", 1, 0, 0, (SCM spec), "Parses @var{spec} and sets MU debugging level according to it.") #define FUNC_NAME s_scm_mu_debug_parse { char *s; SCM_ASSERT (scm_is_string (spec), spec, SCM_ARG1, FUNC_NAME); s = scm_to_locale_string (spec); mu_debug_parse_spec (s); free (s); return SCM_UNSPECIFIED; } #undef FUNC_NAME static int string_member_p (SCM list, SCM x) { return scm_member (x, list) != SCM_BOOL_F; } SCM_DEFINE_PUBLIC (scm_mu_debug_set, "mu-debug-set", 1, 0, 0, (SCM catlist), "Sets MU debug level according to @var{catlist}, which is a list of\n" "conses: (cons category level)\n") #define FUNC_NAME s_scm_mu_debug_set { SCM_ASSERT (scm_is_pair (catlist), catlist, SCM_ARG1, FUNC_NAME); for (; !scm_is_null (catlist); catlist = SCM_CDR (catlist)) { SCM cell = SCM_CAR (catlist); SCM x; char *name; mu_debug_level_t lev; SCM_ASSERT (scm_is_pair (cell), cell, SCM_ARGn, FUNC_NAME); x = scm_car (cell); SCM_ASSERT (scm_is_string (x), x, SCM_ARGn, FUNC_NAME); name = scm_to_locale_string (x); x = scm_cdr (cell); SCM_ASSERT (scm_is_integer (x), x, SCM_ARGn, FUNC_NAME); lev = scm_to_int (x); if (lev == 0) mu_debug_disable_category (name, strlen (name)); else mu_debug_enable_category (name, strlen (name), lev); free (name); } return SCM_UNSPECIFIED; } #undef FUNC_NAME SCM_DEFINE_PUBLIC (scm_mu_debug_get, "mu-debug-get", 0, 2, 0, (SCM catlist, SCM skipunset), "Returns a list of MU debugging categories with corresponding levels.\n" "If @var{catlist} is supplied, it is a list of category names. In this case\n" "only categories from this list are returned") #define FUNC_NAME s_scm_mu_debug_get { int skipunset_flag = 0; mu_iterator_t itr; SCM head = SCM_EOL, tail = SCM_EOL; int (*member_p) (SCM list, SCM needle); if (SCM_UNBNDP (catlist) || catlist == SCM_BOOL_F) member_p = NULL; else { SCM_ASSERT (scm_is_pair (catlist), catlist, SCM_ARG1, FUNC_NAME); member_p = string_member_p; } if (!SCM_UNBNDP (skipunset)) { SCM_ASSERT (scm_is_bool (skipunset), skipunset, SCM_ARG2, FUNC_NAME); skipunset_flag = skipunset == SCM_BOOL_T; } mu_debug_get_iterator (&itr, skipunset_flag); for (mu_iterator_first (itr); !mu_iterator_is_done (itr); mu_iterator_next (itr)) { const char *name; mu_debug_level_t level; SCM scm_name; mu_iterator_current_kv (itr, (const void**) &name, (void**) &level); scm_name = scm_from_locale_string (name); if (!member_p || member_p (catlist, scm_name)) { SCM scm_new = scm_cons (scm_cons (scm_name, scm_from_uintmax (level)), SCM_EOL); if (scm_is_null (head)) head = tail = scm_new; else { SCM_SETCDR (tail, scm_new); tail = scm_new; } } } mu_iterator_destroy (&itr); return head; } #undef FUNC_NAME void mu_scm_debug_init () { #include "mu_debug.x" }