summaryrefslogtreecommitdiff
path: root/libmailutils/tests/wsp.c
diff options
context:
space:
mode:
Diffstat (limited to 'libmailutils/tests/wsp.c')
-rw-r--r--libmailutils/tests/wsp.c654
1 files changed, 0 insertions, 654 deletions
diff --git a/libmailutils/tests/wsp.c b/libmailutils/tests/wsp.c
deleted file mode 100644
index cd158dc11..000000000
--- a/libmailutils/tests/wsp.c
+++ /dev/null
@@ -1,654 +0,0 @@
-/* GNU Mailutils -- a suite of utilities for electronic mail
- Copyright (C) 2005-2019 Free Software Foundation, Inc.
-
- GNU Mailutils is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3, or (at your option)
- any later version.
-
- GNU Mailutils 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with GNU Mailutils. If not, see <http://www.gnu.org/licenses/>. */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <mailutils/wordsplit.h>
-#include <mailutils/alloc.h>
-#include <mailutils/kwd.h>
-#include <mailutils/errno.h>
-#include <mailutils/error.h>
-#include <mailutils/cstr.h>
-#include <mailutils/io.h>
-
-extern char **environ;
-
-char *progname;
-
-struct mu_kwd bool_keytab[] = {
- { "append", MU_WRDSF_APPEND },
- /*{ "reuse", MU_WRDSF_REUSE },*/
- { "undef", MU_WRDSF_UNDEF },
- { "novar", MU_WRDSF_NOVAR },
- { "nocmd", MU_WRDSF_NOCMD },
- { "ws", MU_WRDSF_WS },
- { "quote", MU_WRDSF_QUOTE },
- { "squote", MU_WRDSF_SQUOTE },
- { "dquote", MU_WRDSF_DQUOTE },
- { "squeeze_delims", MU_WRDSF_SQUEEZE_DELIMS },
- { "return_delims", MU_WRDSF_RETURN_DELIMS },
- { "sed", MU_WRDSF_SED_EXPR },
- { "debug", MU_WRDSF_SHOWDBG },
- { "nosplit", MU_WRDSF_NOSPLIT },
- { "keepundef", MU_WRDSF_KEEPUNDEF },
- { "warnundef", MU_WRDSF_WARNUNDEF },
- { "cescapes", MU_WRDSF_CESCAPES },
- { "default", MU_WRDSF_DEFFLAGS },
- { "env_kv", MU_WRDSF_ENV_KV },
- { "incremental", MU_WRDSF_INCREMENTAL },
- { "pathexpand", MU_WRDSF_PATHEXPAND },
- { NULL, 0 }
-};
-
-struct mu_kwd opt_keytab[] = {
- { "nullglob", MU_WRDSO_NULLGLOB },
- { "failglob", MU_WRDSO_FAILGLOB },
- { "dotglob", MU_WRDSO_DOTGLOB },
- { NULL, 0 }
-};
-
-struct mu_kwd string_keytab[] = {
- { "delim", MU_WRDSF_DELIM },
- { "comment", MU_WRDSF_COMMENT },
- { "escape", MU_WRDSF_ESCAPE },
- { NULL, 0 }
-};
-
-static void
-help ()
-{
- size_t i;
-
- printf ("usage: %s [options] [VAR=VALUE...] [-- EXTRA...]\n", progname);
- printf ("options are:\n");
- printf (" [-]trimnl\n");
- printf (" [-]plaintext\n");
- printf (" -env\n");
- printf (" env sys|none|null\n");
- putchar ('\n');
- for (i = 0; bool_keytab[i].name; i++)
- printf (" [-]%s\n", bool_keytab[i].name);
- putchar ('\n');
- for (i = 0; string_keytab[i].name; i++)
- {
- printf (" -%s\n", string_keytab[i].name);
- printf (" %s ARG\n", string_keytab[i].name);
- }
- printf (" escape-word ARG\n");
- printf (" escape-quote ARG\n");
- putchar ('\n');
- for (i = 0; opt_keytab[i].name; i++)
- {
- printf (" [-]%s\n", opt_keytab[i].name);
- }
- putchar ('\n');
- printf (" -dooffs\n");
- printf (" dooffs COUNT ARGS...\n");
- exit (0);
-}
-
-void
-print_qword (const char *word, int plaintext)
-{
- static char *qbuf = NULL;
- static size_t qlen = 0;
- int quote;
- size_t size = mu_wordsplit_c_quoted_length (word, 0, &quote);
-
- if (plaintext)
- {
- printf ("%s", word);
- return;
- }
-
- if (*word == 0)
- quote = 1;
-
- if (size >= qlen)
- {
- qlen = size + 1;
- qbuf = mu_realloc (qbuf, qlen);
- }
- mu_wordsplit_c_quote_copy (qbuf, word, 0);
- qbuf[size] = 0;
- if (quote)
- printf ("\"%s\"", qbuf);
- else
- printf ("%s", qbuf);
-}
-
-/* Convert environment to K/V form */
-static char **
-make_env_kv ()
-{
- size_t i, j, size;
- char **newenv;
-
- /* Count the number of entries */
- for (i = 0; environ[i]; i++)
- ;
-
- size = i * 2 + 1;
- newenv = mu_calloc (size, sizeof (newenv[0]));
-
- for (i = j = 0; environ[i]; i++)
- {
- size_t len = strcspn (environ[i], "=");
- char *p = mu_alloc (len+1);
- memcpy (p, environ[i], len);
- p[len] = 0;
- newenv[j++] = p;
- p = mu_strdup (environ[i] + len + 1);
- newenv[j++] = p;
- }
- newenv[j] = NULL;
- return newenv;
-}
-
-static int
-wsp_getvar (char **ret, const char *vptr, size_t vlen, void *data)
-{
- char **base = data;
- int i;
-
- for (i = 0; base[i]; i++)
- {
- size_t l = strcspn (base[i], "=");
- if (l == vlen && memcmp (base[i], vptr, vlen) == 0)
- {
- char *p = strdup (base[i] + vlen + 1);
- if (p == NULL)
- return MU_WRDSE_NOSPACE;
- *ret = p;
- return MU_WRDSE_OK;
- }
- }
- return MU_WRDSE_UNDEF;
-}
-
-static int
-cmd_quote (char **ret, const char *str, size_t len, char **argv)
-{
- int alen;
- for (alen = 0; alen < len && !(str[alen] == ' ' || str[alen] == '\t'); alen++)
- ;
- for (; alen < len && (str[alen] == ' ' || str[alen] == '\t'); alen++)
- ;
- len -= alen;
- *ret = malloc (len + 1);
- if (!*ret)
- return MU_WRDSE_NOSPACE;
- memcpy (*ret, str + alen, len);
- (*ret)[len] = 0;
- return MU_WRDSE_OK;
-}
-
-static int
-cmd_words (char **ret, const char *str, size_t len, char **argv)
-{
- char *p;
- int i;
-
- p = malloc (len + 1);
- if (!p)
- return MU_WRDSE_NOSPACE;
- *ret = p;
- for (i = 1; argv[i]; i++)
- {
- size_t s = strlen (argv[i]);
- if (i > 1)
- *p++ = ' ';
- memcpy (p, argv[i], s);
- p += s;
- }
- *p = 0;
- return MU_WRDSE_OK;
-}
-
-static int
-cmd_lines (char **ret, const char *str, size_t len, char **argv)
-{
- char *p;
- int i;
-
- p = malloc (len + 1);
- if (!p)
- return MU_WRDSE_NOSPACE;
- *ret = p;
- for (i = 1; argv[i]; i++)
- {
- size_t s = strlen (argv[i]);
- if (i > 1)
- *p++ = '\n';
- memcpy (p, argv[i], s);
- p += s;
- }
- *p = 0;
- return MU_WRDSE_OK;
-}
-
-static struct command
-{
- char const *name;
- int (*cmd)(char **ret, const char *str, size_t len, char **argv);
-} comtab[] = {
- { "quote", cmd_quote },
- { "words", cmd_words },
- { "lines", cmd_lines }
-};
-
-static int
-wsp_runcmd (char **ret, const char *str, size_t len, char **argv, void *closure)
-{
- int i;
-
- for (i = 0; ; i++)
- {
- if (i == sizeof (comtab) / sizeof (comtab[0]))
- break;
- if (strcmp (comtab[i].name, argv[0]) == 0)
- return comtab[i].cmd (ret, str, len, argv);
- }
-
- *ret = NULL;
- if (mu_asprintf (ret, "unknown command: %s", argv[0]))
- return MU_WRDSE_NOSPACE;
- else
- return MU_WRDSE_USERERR;
-}
-
-enum env_type
- {
- env_none,
- env_null,
- env_sys
- };
-
-struct mu_kwd env_keytab[] = {
- { "none", env_none },
- { "null", env_null },
- { "sys", env_sys },
- { NULL }
-};
-
-static void
-set_escape_string (mu_wordsplit_t *ws, int *wsflags, int q, const char *str)
-{
- if (*str == ':')
- {
- while (*++str != ':')
- {
- int f;
- switch (*str)
- {
- case '+':
- f = MU_WRDSO_BSKEEP;
- break;
-
- case '0':
- f = MU_WRDSO_OESC;
- break;
-
- case 'x':
- f = MU_WRDSO_XESC;
- break;
-
- default:
- fprintf (stderr, "%s: invalid escape flag near %s\n",
- progname, str);
- abort ();
- }
- MU_WRDSO_ESC_SET (ws, q, f);
- }
- *wsflags |= MU_WRDSF_OPTIONS;
- ++str;
- }
- ws->ws_escape[q] = str;
-}
-
-int
-main (int argc, char **argv)
-{
- char buf[1024], *ptr, *saved_ptr;
- int i, offarg = 0;
- int trimnl_option = 0;
- int plaintext_option = 0;
- int wsflags = (MU_WRDSF_DEFFLAGS & ~MU_WRDSF_NOVAR) |
- MU_WRDSF_ENOMEMABRT |
- MU_WRDSF_SHOWERR;
- mu_wordsplit_t ws;
- int next_call = 0;
- char *fenvbase[128];
- size_t fenvidx = 0;
- size_t fenvmax = sizeof (fenvbase) / sizeof (fenvbase[0]);
- int use_env = env_sys;
- int appendc = 0;
- char **appendv = NULL;
-
- progname = argv[0];
-
- ws.ws_options = 0;
- for (i = 1; i < argc; i++)
- {
- char *opt = argv[i];
- int negate;
- int flag;
-
- if (opt[0] == '-')
- {
- if (opt[1] == '-' && opt[2] == 0)
- {
- appendc = argc - i - 1;
- appendv = argv + i + 1;
- break;
- }
- negate = 1;
- opt++;
- }
- else if (opt[0] == '+')
- {
- negate = 0;
- opt++;
- }
- else
- negate = 0;
-
- if (strcmp (opt, "h") == 0 ||
- strcmp (opt, "help") == 0 ||
- strcmp (opt, "-help") == 0)
- {
- help ();
- }
-
- if (strcmp (opt, "trimnl") == 0)
- {
- trimnl_option = !negate;
- continue;
- }
-
- if (strcmp (opt, "plaintext") == 0)
- {
- plaintext_option = !negate;
- continue;
- }
-
- if (strcmp (opt, "env") == 0)
- {
- if (negate)
- use_env = env_none;
- else
- {
- i++;
- if (i == argc)
- {
- fprintf (stderr, "%s: missing argument for env\n",
- progname);
- exit (1);
- }
-
- if (mu_kwd_xlat_name (env_keytab, argv[i], &use_env))
- {
- fprintf (stderr, "%s: invalid argument for env\n",
- progname);
- exit (1);
- }
- }
- continue;
- }
-
- if (mu_kwd_xlat_name (bool_keytab, opt, &flag) == 0)
- {
- if (negate)
- wsflags &= ~flag;
- else
- wsflags |= flag;
- continue;
- }
-
- if (mu_kwd_xlat_name (string_keytab, opt, &flag) == 0)
- {
- if (negate)
- wsflags &= ~flag;
- else
- {
- i++;
- if (i == argc)
- {
- fprintf (stderr, "%s: missing argument for %s\n",
- progname, opt);
- exit (1);
- }
-
- switch (flag)
- {
- case MU_WRDSF_DELIM:
- ws.ws_delim = argv[i];
- break;
-
- case MU_WRDSF_COMMENT:
- ws.ws_comment = argv[i];
- break;
-
- case MU_WRDSF_ESCAPE:
- set_escape_string (&ws, &wsflags, 0, argv[i]);
- set_escape_string (&ws, &wsflags, 1, argv[i]);
- break;
- }
-
- wsflags |= flag;
- }
- continue;
- }
-
- if (strcmp (opt, "escape-word") == 0
- || strcmp (opt, "escape-quote") == 0)
- {
- int q = opt[7] == 'q';
-
- i++;
- if (i == argc)
- {
- fprintf (stderr, "%s: missing argument for %s\n",
- progname, opt);
- exit (1);
- }
- if (!(wsflags & MU_WRDSF_ESCAPE))
- {
- wsflags |= MU_WRDSF_ESCAPE;
- ws.ws_escape[!q] = NULL;
- }
- set_escape_string (&ws, &wsflags, q, argv[i]);
- continue;
- }
-
- if (strcmp (opt, "dooffs") == 0)
- {
- if (negate)
- wsflags &= ~MU_WRDSF_DOOFFS;
- else
- {
- char *p;
-
- i++;
-
- if (i == argc)
- {
- fprintf (stderr, "%s: missing arguments for %s\n",
- progname, opt);
- exit (1);
- }
- ws.ws_offs = strtoul (argv[i], &p, 10);
- if (*p)
- {
- fprintf (stderr, "%s: invalid number: %s\n",
- progname, argv[i]);
- exit (1);
- }
-
- i++;
- if (i + ws.ws_offs > argc)
- {
- fprintf (stderr, "%s: not enough arguments for %s\n",
- progname, opt);
- exit (1);
- }
- offarg = i;
- i += ws.ws_offs - 1;
- wsflags |= MU_WRDSF_DOOFFS;
- }
- continue;
- }
-
- if (mu_kwd_xlat_name (opt_keytab, opt, &flag) == 0)
- {
- wsflags |= MU_WRDSF_OPTIONS;
- if (negate)
- ws.ws_options &= ~flag;
- else
- ws.ws_options |= flag;
- continue;
- }
-
- if (strchr (opt, '='))
- {
- if (fenvidx < fenvmax - 1)
- {
- fenvbase[fenvidx++] = opt;
- continue;
- }
- else
- {
- fprintf (stderr, "%s: environment too big\n", progname);
- exit (1);
- }
- }
-
- fprintf (stderr, "%s: unrecognized argument: %s\n",
- progname, opt);
- exit (1);
- }
-
- if (fenvidx)
- {
- fenvbase[fenvidx] = NULL;
- wsflags |= MU_WRDSF_GETVAR | MU_WRDSF_CLOSURE;
- ws.ws_getvar = wsp_getvar;
- ws.ws_closure = fenvbase;
- }
-
- switch (use_env)
- {
- case env_null:
- wsflags |= MU_WRDSF_ENV;
- ws.ws_env = NULL;
- break;
-
- case env_none:
- break;
-
- case env_sys:
- wsflags |= MU_WRDSF_ENV;
- if (wsflags & MU_WRDSF_ENV_KV)
- ws.ws_env = (const char **) make_env_kv ();
- else
- ws.ws_env = (const char **) environ;
- break;
- }
-
- if (!(wsflags & MU_WRDSF_NOCMD))
- ws.ws_command = wsp_runcmd;
-
- if (wsflags & MU_WRDSF_INCREMENTAL)
- trimnl_option = 1;
-
- next_call = 0;
- while ((ptr = fgets (buf, sizeof (buf), stdin)))
- {
- int rc;
- size_t i;
-
- if (trimnl_option)
- {
- size_t len = strlen (ptr);
- if (len && ptr[len-1] == '\n')
- ptr[len-1] = 0;
- }
-
- if (wsflags & MU_WRDSF_INCREMENTAL)
- {
- if (next_call)
- {
- if (*ptr == 0)
- ptr = NULL;
- else
- free (saved_ptr);
- }
- else
- next_call = 1;
- if (ptr)
- ptr = saved_ptr = mu_strdup (ptr);
- }
-
- rc = mu_wordsplit (ptr, &ws, wsflags);
- if (rc)
- {
- if (!(wsflags & MU_WRDSF_SHOWERR))
- mu_wordsplit_perror (&ws);
- continue;
- }
-
- if (offarg)
- {
- for (i = 0; i < ws.ws_offs; i++)
- ws.ws_wordv[i] = argv[offarg + i];
- offarg = 0;
- }
-
- if (appendc)
- {
- rc = mu_wordsplit_append (&ws, appendc, appendv);
- if (rc)
- {
- if (!(wsflags & MU_WRDSF_SHOWERR))
- mu_wordsplit_perror (&ws);
- continue;
- }
- }
-
- wsflags |= MU_WRDSF_REUSE | (ws.ws_flags & MU_WRDSF_ENV);
- printf ("NF: %lu", (unsigned long) ws.ws_wordc);
- if (wsflags & MU_WRDSF_DOOFFS)
- printf (" (%lu)", (unsigned long) ws.ws_offs);
- putchar ('\n');
- for (i = 0; i < ws.ws_offs; i++)
- {
- printf ("(%lu): ", (unsigned long) i);
- print_qword (ws.ws_wordv[i], plaintext_option);
- putchar ('\n');
- }
- for (; i < ws.ws_offs + ws.ws_wordc; i++)
- {
- printf ("%lu: ", (unsigned long) i);
- print_qword (ws.ws_wordv[i], plaintext_option);
- putchar ('\n');
- }
- }
- return 0;
-}

Return to:

Send suggestions and report system problems to the System administrator.