summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2017-06-02 11:38:26 +0300
committerSergey Poznyakoff <gray@gnu.org.ua>2017-06-02 11:38:26 +0300
commit46d7640ffc83a8b809845099839990c9a2cf70f6 (patch)
tree834f831e73d339eca06762a111588104e368fe96
parent58cc7c8f6bd1956a47f56c3aba1be8a417916064 (diff)
downloadmailutils-46d7640ffc83a8b809845099839990c9a2cf70f6.tar.gz
mailutils-46d7640ffc83a8b809845099839990c9a2cf70f6.tar.bz2
New wordsplit call: mu_worsplit_append
* include/mailutils/wordsplit.h (mu_wordsplit_append): New proto. * libmailutils/string/wordsplit.c (mu_wordsplit_append): New function. * libmailutils/tests/wordsplit.at: Two more tests cases for mu_wordsplit_append. * libmailutils/tests/wsp.c: Accept extra arguments to append using the new function.
-rw-r--r--include/mailutils/wordsplit.h1
-rw-r--r--libmailutils/string/wordsplit.c30
-rw-r--r--libmailutils/tests/wordsplit.at27
-rw-r--r--libmailutils/tests/wsp.c21
4 files changed, 77 insertions, 2 deletions
diff --git a/include/mailutils/wordsplit.h b/include/mailutils/wordsplit.h
index 0d525d16a..0b32e6529 100644
--- a/include/mailutils/wordsplit.h
+++ b/include/mailutils/wordsplit.h
@@ -241,6 +241,7 @@ void mu_wordsplit_free_words (mu_wordsplit_t *ws);
void mu_wordsplit_free_envbuf (mu_wordsplit_t *ws);
int mu_wordsplit_get_words (mu_wordsplit_t *ws, size_t *wordc, char ***wordv);
+int mu_wordsplit_append (struct mu_wordsplit *wsp, int argc, char **argv);
int mu_wordsplit_c_unquote_char (int c);
int mu_wordsplit_c_quote_char (int c);
diff --git a/libmailutils/string/wordsplit.c b/libmailutils/string/wordsplit.c
index c072a5b55..343024713 100644
--- a/libmailutils/string/wordsplit.c
+++ b/libmailutils/string/wordsplit.c
@@ -674,7 +674,35 @@ mu_wordsplit_finish (struct mu_wordsplit *wsp)
return 0;
}
-
+int
+mu_wordsplit_append (struct mu_wordsplit *wsp, int argc, char **argv)
+{
+ int rc;
+ size_t i;
+
+ rc = alloc_space (wsp, wsp->ws_wordc + argc + 1);
+ if (rc)
+ return rc;
+ for (i = 0; i < argc; i++)
+ {
+ char *newstr = strdup (argv[i]);
+ if (!newstr)
+ {
+ while (i > 0)
+ {
+ free (wsp->ws_wordv[wsp->ws_offs + wsp->ws_wordc + i - 1]);
+ wsp->ws_wordv[wsp->ws_offs + wsp->ws_wordc + i - 1] = NULL;
+ i--;
+ }
+ return _wsplt_nomem (wsp);
+ }
+ wsp->ws_wordv[wsp->ws_offs + wsp->ws_wordc + i] = newstr;
+ }
+ wsp->ws_wordc += i;
+ wsp->ws_wordv[wsp->ws_offs + wsp->ws_wordc] = NULL;
+ return 0;
+}
+
/* Variable expansion */
static int
node_split_prefix (struct mu_wordsplit *wsp,
diff --git a/libmailutils/tests/wordsplit.at b/libmailutils/tests/wordsplit.at
index 88da4751d..24eae0912 100644
--- a/libmailutils/tests/wordsplit.at
+++ b/libmailutils/tests/wordsplit.at
@@ -623,5 +623,32 @@ EOT
[no files match pattern dir/*.d
])
AT_CLEANUP
+
+TESTWSP([append],[],[-- extra arguments follow],
+[some words and],
+[NF: 6
+0: some
+1: words
+2: and
+3: extra
+4: arguments
+5: follow
+])
+
+TESTWSP([append + dooffs + env],[],
+[dooffs 2 preface words V=2 -- extra arguments follow],
+[some words and var=$V],
+[NF: 7 (2)
+(0): preface
+(1): words
+2: some
+3: words
+4: and
+5: var=2
+6: extra
+7: arguments
+8: follow
+])
+
m4_popdef([TESTWSP])
diff --git a/libmailutils/tests/wsp.c b/libmailutils/tests/wsp.c
index bcb0405fc..34386b6f1 100644
--- a/libmailutils/tests/wsp.c
+++ b/libmailutils/tests/wsp.c
@@ -77,7 +77,7 @@ help ()
{
size_t i;
- printf ("usage: %s [options] [VAR=VALUE...]\n", progname);
+ printf ("usage: %s [options] [VAR=VALUE...] [-- EXTRA...]\n", progname);
printf ("options are:\n");
printf (" [-]trimnl\n");
printf (" [-]plaintext\n");
@@ -314,6 +314,8 @@ main (int argc, char **argv)
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];
@@ -326,6 +328,12 @@ main (int argc, char **argv)
if (opt[0] == '-')
{
+ if (opt[1] == '-' && opt[2] == 0)
+ {
+ appendc = argc - i - 1;
+ appendv = argv + i + 1;
+ break;
+ }
negate = 1;
opt++;
}
@@ -588,6 +596,17 @@ main (int argc, char **argv)
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)

Return to:

Send suggestions and report system problems to the System administrator.