X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/1691e80890e5d8ba258c51c214a3e91880e1db2b..94187a80bd60baab4b9c4b949ad820d730578123:/sbr/context_find.c diff --git a/sbr/context_find.c b/sbr/context_find.c index 1e324013..f4fe7ed1 100644 --- a/sbr/context_find.c +++ b/sbr/context_find.c @@ -1,25 +1,73 @@ - -/* - * context_find.c -- find an entry in the context/profile list +/* context_find.c -- find an entry in the context/profile list * - * $Id$ + * This code is Copyright (c) 2002, by the authors of nmh. See the + * COPYRIGHT file in the root directory of the nmh distribution for + * complete copyright information. */ #include char * -context_find (char *str) +context_find (const char *str) { struct node *np; - /* sanity check - check that context has been read */ - if (defpath == NULL) - adios (NULL, "oops, context hasn't been read yet"); - + str = FENDNULL(str); for (np = m_defs; np; np = np->n_next) - if (!strcasecmp (np->n_name, str)) - return (np->n_field); + if (!strcasecmp(FENDNULL(np->n_name), str)) + return np->n_field; return NULL; } + + +/* + * Helper function to search first, if subtype is non-NULL, for + * invoname-string-type/subtype and then, if not yet found, + * invoname-string-type. If entry is found but is empty, it is + * treated as not found. + */ +char * +context_find_by_type (const char *string, const char *type, + const char *subtype) { + char *value = NULL; + + if (subtype) { + char *cp; + + cp = concat (invo_name, "-", string, "-", type, "/", subtype, NULL); + if ((value = context_find (cp)) != NULL && *value == '\0') value = NULL; + free (cp); + } + + if (value == NULL) { + char *cp; + + cp = concat (invo_name, "-", string, "-", type, NULL); + if ((value = context_find (cp)) != NULL && *value == '\0') value = NULL; + free (cp); + } + + return value; +} + + +/* + * Helper function to search profile an entry with name beginning with prefix. + * The search is case insensitive. + */ +int +context_find_prefix (const char *prefix) { + struct node *np; + size_t len; + + len = strlen(prefix); + for (np = m_defs; np; np = np->n_next) { + if (np->n_name && ! strncasecmp (np->n_name, prefix, len)) { + return 1; + } + } + + return 0; +}