commit-mailutils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[SCM] GNU Mailutils branch, master, updated. release-2.2-169-g63fec21


From: Sergey Poznyakoff
Subject: [SCM] GNU Mailutils branch, master, updated. release-2.2-169-g63fec21
Date: Fri, 29 Oct 2010 09:02:24 +0000

This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU Mailutils".

http://git.savannah.gnu.org/cgit/mailutils.git/commit/?id=63fec21357c175772a8ca153266919c12b6f8bd5

The branch, master has been updated
       via  63fec21357c175772a8ca153266919c12b6f8bd5 (commit)
       via  90ba2e7e0c53957254719e46a7bd22e14b92a96c (commit)
       via  f49d4057c49022a646c8dbe2d203e8c374bb7427 (commit)
       via  5dd9e9c13bafea91ccdc97a3afcbc13a8762aee1 (commit)
       via  41a0da7a22995b23a3fec61d5b87ed880c87fe97 (commit)
      from  4a49f5341ae9005c9ffbd7620efaecffcdfda79f (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 63fec21357c175772a8ca153266919c12b6f8bd5
Author: Sergey Poznyakoff <address@hidden>
Date:   Fri Oct 29 11:54:29 2010 +0300

    Use wordsplit to expand command prompt in mu.
    
    * mu/mu.h (mutool_prompt_vartab): Remove.
    (mutool_prompt_env): New extern.
    * mu/pop.c (pop_prompt_vartab): Rewrite as pop_prompt_env.
    All callers changed.
    * mu/shell.c (mutool_prompt_vartab): Remove variable.
    (mutool_prompt_env): New variable.
    (expand_prompt): Remove function.
    (input_line_interactive): Use mu_wordsplit to expand command prompt.

commit 90ba2e7e0c53957254719e46a7bd22e14b92a96c
Author: Sergey Poznyakoff <address@hidden>
Date:   Fri Oct 29 11:32:46 2010 +0300

    Implement a Key/Value environment.
    
    K/V is a new type of environment where variable names (keys) and
    values are stored separately in adjacent environment elements.
    This should simplify wordsplit initialization in many cases.
    
    * include/mailutils/wordsplit.h (MU_WRDSF_ENV_KV): New flag.
    * libmailutils/string/wordsplit.c (mu_wordsplit_find_env): Implement
    search in a K/V environment.
    * libmailutils/tests/wordsplit.at: Test K/V environments.
    * libmailutils/tests/wsp.c (bool_keytab): Implement env_kv.
    (make_env_kv): New function.
    (main): Convert environment if env_kv is given.

commit f49d4057c49022a646c8dbe2d203e8c374bb7427
Author: Sergey Poznyakoff <address@hidden>
Date:   Fri Oct 29 10:50:11 2010 +0300

    Fixes in wordsplit.  Use wordsplit instead of vartab in movemail.
    
    Eventually this will lead to vartab fading out until it is removed
    in some point in the future.  Wordsplit provides a much better
    variable substitution mechanism.
    
    * include/mailutils/wordsplit.h (mu_wordsplit) <ws_getvar>: Change
    signature.
    <ws_closure>: New member.
    (MU_WRDSF_CLOSURE): New flag.
    * libmailutils/string/wordsplit.c (mu_wordsplit_init): Initialize
    ws_closure to NULL, unless MU_WRDSF_CLOSURE is set.
    Do not modify ws_wordn if MU_WRDSF_DOOFFS is set.
    (wsnode_remove): Clear _WSNF_JOIN on the previous node if the node
    being deleted is the last one in chain.
    (expvar): Pass ws_closure as 3rd argument to ws_getvar.
    Insert a NULL node if the variable is not defined.
    
    * movemail/movemail.c: Use wordsplit instead of vartab. Note a side
    effect: the "source:*" and "dest:*" variables are now written as
    "source_*" and "dest_*", correspondingly.
    (movemail_getvar_closure): New structure.
    (DCL_VTX): Remove macro and its uses.
    (get_url_part, movemail_getvar): New functions.
    (set_program_id): Rewrite using wordsplit.

commit 5dd9e9c13bafea91ccdc97a3afcbc13a8762aee1
Merge: 41a0da7 4a49f53
Author: Sergey Poznyakoff <address@hidden>
Date:   Thu Oct 28 23:24:27 2010 +0300

    Merge branch 'master' of ssh://git.savannah.gnu.org/srv/git/mailutils

commit 41a0da7a22995b23a3fec61d5b87ed880c87fe97
Author: Sergey Poznyakoff <address@hidden>
Date:   Wed Oct 27 19:55:24 2010 +0300

    Fix allowed URL parts for local mailboxes.
    
    Parameters are allowed: they are used to expand hashed or indexed
    mailbox names.
    
    * libproto/maildir/folder.c (_maildir_record): Add MU_URL_PARAM.
    * libproto/mbox/folder.c (_mbox_record): Likewise.
    * libproto/mh/folder.c (_mh_record): Likewise.

-----------------------------------------------------------------------

Summary of changes:
 include/mailutils/wordsplit.h   |   11 +++-
 libmailutils/string/wordsplit.c |   60 +++++++++++++++-----
 libmailutils/tests/wordsplit.at |   10 +++
 libmailutils/tests/wsp.c        |   51 ++++++++++++++++-
 libproto/maildir/folder.c       |    2 +-
 libproto/mbox/folder.c          |    2 +-
 libproto/mh/folder.c            |    2 +-
 movemail/movemail.c             |  116 ++++++++++++++++++++++++---------------
 mu/mu.h                         |    2 +-
 mu/pop.c                        |   57 +++++++++++--------
 mu/shell.c                      |   32 ++++++-----
 11 files changed, 240 insertions(+), 105 deletions(-)

diff --git a/include/mailutils/wordsplit.h b/include/mailutils/wordsplit.h
index 13edb25..40e4289 100644
--- a/include/mailutils/wordsplit.h
+++ b/include/mailutils/wordsplit.h
@@ -35,8 +35,9 @@ struct mu_wordsplit
                    __attribute__ ((__format__ (__printf__, 1, 2)));
        
   const char **ws_env;
-  char *(*ws_getvar) (const char *, size_t); 
-       
+  const char *(*ws_getvar) (const char *, size_t, void *); 
+  void *ws_closure;
+  
   const char *ws_input;
   size_t ws_len;
   size_t ws_endp;
@@ -103,6 +104,12 @@ struct mu_wordsplit
 /* Handle C escapes */
 #define MU_WRDSF_CESCAPES          0x1000000
 
+/* ws_closure is set */
+#define MU_WRDSF_CLOSURE           0x2000000
+/* ws_env is a Key/Value environment, i.e. the value of a variable is
+   stored in the element that follows its name. */
+#define MU_WRDSF_ENV_KV            0x4000000
+
 #define MU_WRDSF_DEFFLAGS             \
   (MU_WRDSF_NOVAR | MU_WRDSF_NOCMD | \
    MU_WRDSF_QUOTE | MU_WRDSF_SQUEEZE_DELIMS | MU_WRDSF_CESCAPES)
diff --git a/libmailutils/string/wordsplit.c b/libmailutils/string/wordsplit.c
index 301ab00..563752c 100644
--- a/libmailutils/string/wordsplit.c
+++ b/libmailutils/string/wordsplit.c
@@ -151,9 +151,10 @@ mu_wordsplit_init (struct mu_wordsplit *wsp, const char 
*input, size_t len,
       wsp->ws_wordc = 0;
       wsp->ws_wordn = 0;
     }
-  if (wsp->ws_flags & MU_WRDSF_DOOFFS)
-    wsp->ws_wordn += wsp->ws_offs;
 
+  if (!(wsp->ws_flags & MU_WRDSF_CLOSURE))
+    wsp->ws_closure = NULL;
+  
   wsp->ws_endp = 0;
   wsp->ws_errno = 0;
   wsp->ws_head = wsp->ws_tail = NULL;
@@ -311,7 +312,11 @@ wsnode_remove (struct mu_wordsplit *wsp, struct 
mu_wordsplit_node *node)
 
   p = node->prev;
   if (p)
-    p->next = node->next;
+    {
+      p->next = node->next;
+      if (!node->next)
+       p->flags &= ~_WSNF_JOIN;
+    }
   else
     wsp->ws_head = node->next;
 
@@ -646,16 +651,35 @@ mu_wordsplit_find_env (struct mu_wordsplit *wsp, const 
char *name, size_t len)
 
   if (!(wsp->ws_flags & MU_WRDSF_ENV))
     return NULL;
-  for (i = 0; wsp->ws_env[i]; i++)
-    {
-      size_t j;
-      const char *var = wsp->ws_env[i];
 
-      for (j = 0; j < len; j++)
-       if (name[j] != var[j])
-         break;
-      if (j == len && var[j] == '=')
-       return var + j + 1;
+  if (wsp->ws_flags & MU_WRDSF_ENV_KV)
+    {
+      /* A key-value pair environment */
+      for (i = 0; wsp->ws_env[i]; i++)
+       {
+         size_t elen = strlen (wsp->ws_env[i]);
+         if (elen == len && memcmp (wsp->ws_env[i], name, elen) == 0)
+           return wsp->ws_env[i + 1];
+         /* Skip the value.  Break the loop if it is NULL. */
+         i++;
+         if (wsp->ws_env[i] == NULL)
+           break;
+       }
+    }
+  else
+    {
+      /* Usual (A=B) environment. */
+      for (i = 0; wsp->ws_env[i]; i++)
+       {
+         size_t j;
+         const char *var = wsp->ws_env[i];
+         
+         for (j = 0; j < len; j++)
+           if (name[j] != var[j])
+             break;
+         if (j == len && var[j] == '=')
+           return var + j + 1;
+       }
     }
   return NULL;
 }
@@ -666,7 +690,7 @@ expvar (struct mu_wordsplit *wsp, const char *str, size_t 
len,
 {
   size_t i = 0;
   const char *defstr = NULL;
-  char *value;
+  const char *value;
   const char *vptr;
   struct mu_wordsplit_node *newnode;
   const char *start = str - 1;
@@ -738,7 +762,7 @@ expvar (struct mu_wordsplit *wsp, const char *str, size_t 
len,
        return _wsplt_nomem (wsp);
     }
   else if (wsp->ws_flags & MU_WRDSF_GETVAR)
-    value = wsp->ws_getvar (str, i);
+    value = wsp->ws_getvar (str, i, wsp->ws_closure);
   else if (wsp->ws_flags & MU_WRDSF_UNDEF)
     {
       wsp->ws_errno = MU_WRDSE_UNDEF;
@@ -822,6 +846,14 @@ expvar (struct mu_wordsplit *wsp, const char *str, size_t 
len,
       memcpy (newnode->v.word, start, size);
       newnode->v.word[size] = 0;
     }
+  else
+    {
+      if (wsnode_new (wsp, &newnode))
+       return 1;
+      wsnode_insert (wsp, newnode, *ptail, 0);
+      *ptail = newnode;
+      newnode->flags = _WSNF_NULL;
+    }
   return 0;
 }
 
diff --git a/libmailutils/tests/wordsplit.at b/libmailutils/tests/wordsplit.at
index dca3792..2159b7f 100644
--- a/libmailutils/tests/wordsplit.at
+++ b/libmailutils/tests/wordsplit.at
@@ -203,6 +203,16 @@ TESTWSP([disable variable expansion],[],[novar],
 [],
 [FOO=bar])
 
+TESTWSP([K/V environment],[],[env_kv],
+[$FOO a$BAZ],
+[NF: 2
+0: bar
+1: aqux
+],
+[],
+[FOO=bar BAZ=qux])
+
+
 TESTWSP([nosplit with expansion],[],[nosplit],
 [a $FOO test],
 [NF: 1
diff --git a/libmailutils/tests/wsp.c b/libmailutils/tests/wsp.c
index 095ce66..bbb3416 100644
--- a/libmailutils/tests/wsp.c
+++ b/libmailutils/tests/wsp.c
@@ -44,6 +44,7 @@ struct mu_kwd bool_keytab[] = {
   { "warnundef", MU_WRDSF_WARNUNDEF },
   { "cescapes", MU_WRDSF_CESCAPES },
   { "default", MU_WRDSF_DEFFLAGS },
+  { "env_kv", MU_WRDSF_ENV_KV },
   { NULL, 0 }
 };
 
@@ -112,6 +113,49 @@ print_qword (const char *word, int plaintext)
     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 - 1) * 2 + 1;
+  newenv = calloc (size, sizeof (newenv[0]));
+  if (!newenv)
+    {
+      mu_error ("not enough memory");
+      exit (1);
+    }
+
+  for (i = j = 0; environ[i]; i++)
+    {
+      size_t len = strcspn (environ[i], "=");
+      char *p = malloc (len+1);
+      if (!p)
+       {
+         mu_error ("not enough memory");
+         exit (1);
+       }
+      memcpy (p, environ[i], len);
+      p[len] = 0;
+      newenv[j++] = p;
+      p = strdup (environ[i] + len + 1);
+      if (!p)
+       {
+         mu_error ("not enough memory");
+         exit (1);
+       }
+      newenv[j++] = p;
+    }
+  newenv[j] = NULL;
+  return newenv;
+}
+    
 int
 main (int argc, char **argv)
 {
@@ -161,7 +205,7 @@ main (int argc, char **argv)
          plaintext_option = !negate;
          continue;
        }
-
+         
       if (mu_kwd_xlat_name (bool_keytab, opt, &flag) == 0)
        {
          if (negate)
@@ -239,7 +283,10 @@ main (int argc, char **argv)
       exit (1);
     }
 
-  ws.ws_env = (const char **) environ;
+  if (wsflags & MU_WRDSF_ENV_KV)
+    ws.ws_env = (const char **) make_env_kv ();
+  else
+    ws.ws_env = (const char **) environ;
        
   while (fgets (buf, sizeof (buf), stdin))
     {
diff --git a/libproto/maildir/folder.c b/libproto/maildir/folder.c
index d53c526..8d8163e 100644
--- a/libproto/maildir/folder.c
+++ b/libproto/maildir/folder.c
@@ -99,7 +99,7 @@ static struct _mu_record _maildir_record =
   MU_MAILDIR_PRIO,
   MU_MAILDIR_SCHEME,
   MU_RECORD_LOCAL,
-  MU_URL_SCHEME | MU_URL_PATH,
+  MU_URL_SCHEME | MU_URL_PATH | MU_URL_PARAM,
   MU_URL_PATH,
   mu_url_expand_path, /* Url init.  */
   _mailbox_maildir_init, /* Mailbox init.  */
diff --git a/libproto/mbox/folder.c b/libproto/mbox/folder.c
index 95506e3..682ac24 100644
--- a/libproto/mbox/folder.c
+++ b/libproto/mbox/folder.c
@@ -101,7 +101,7 @@ static struct _mu_record _mbox_record =
   MU_MBOX_PRIO,
   MU_MBOX_SCHEME,
   MU_RECORD_LOCAL,
-  MU_URL_SCHEME | MU_URL_PATH,
+  MU_URL_SCHEME | MU_URL_PATH | MU_URL_PARAM,
   MU_URL_PATH,
   mu_url_expand_path, /* URL init.  */
   _mailbox_mbox_init, /* Mailbox init.  */
diff --git a/libproto/mh/folder.c b/libproto/mh/folder.c
index 90291d0..a00932a 100644
--- a/libproto/mh/folder.c
+++ b/libproto/mh/folder.c
@@ -139,7 +139,7 @@ static struct _mu_record _mh_record =
   MU_MH_PRIO,
   MU_MH_SCHEME,
   MU_RECORD_LOCAL,
-  MU_URL_SCHEME | MU_URL_PATH,
+  MU_URL_SCHEME | MU_URL_PATH | MU_URL_PARAM,
   MU_URL_PATH,
   mu_url_expand_path, /* Url init.  */
   _mailbox_mh_init, /* Mailbox init.  */
diff --git a/movemail/movemail.c b/movemail/movemail.c
index 61daad6..b8da17f 100644
--- a/movemail/movemail.c
+++ b/movemail/movemail.c
@@ -650,70 +650,98 @@ _compare_uidls (const void *item, const void *value)
 
   return strcmp (a->uidl, b->uidl);
 }
+
+struct movemail_getvar_closure
+{
+  const char *source_name;
+  const char *dest_name;
+  mu_url_t source_url;
+  mu_url_t dest_url;
+};
 
-#define __cat2__(a,b) a ## b
-#define DCL_VTX(what)                                          \
-static int                                                     \
- __cat2__(_vtx_,what) (const char *name, void *data, char **p) \
-{                                                              \
-  mu_url_t url = data;                                         \
-  int rc = __cat2__(mu_url_aget_,what) (url, p);                \
-  if (rc == MU_ERR_NOENT)                                      \
-    {                                                           \
-      *p = strdup ("");                                                \
-      return 0;                                                 \
-    }                                                           \
-  return rc;                                                    \
-}
+#define SEQ(s, n, l) \
+  (((l) == (sizeof(s) - 1)) && memcmp (s, n, l) == 0)
 
-DCL_VTX (host)
-DCL_VTX (user)
-DCL_VTX (path)
+static const char *
+get_url_part (mu_url_t url, const char *name, size_t nlen)
+{
+  int rc = MU_ERR_NOENT;
+  const char *s;
+  
+  if (!url)
+    return NULL;
+  if (SEQ ("user", name, nlen))
+    rc = mu_url_sget_user (url, &s);
+  else if (SEQ ("host", name, nlen))
+    rc = mu_url_sget_host (url, &s);
+  else if (SEQ ("port", name, nlen))
+    rc = mu_url_sget_portstr (url, &s);
+  else if (SEQ ("path", name, nlen))
+    rc = mu_url_sget_path (url, &s);
+
+  if (rc)
+    return NULL;
+  return s;
+}
+    
+static const char *
+movemail_getvar (const char *name, size_t nlen, void *data)
+{
+  struct movemail_getvar_closure *pc = data;
+  
+  if (SEQ ("progname", name, nlen))
+    return mu_program_name;
+  if (SEQ ("source", name, nlen))
+    return pc->source_name;
+  if (SEQ ("dest", name, nlen))
+    return pc->dest_name;
+
+  if (nlen > 7 && memcmp ("source_", name, 7) == 0)
+    return get_url_part (pc->source_url, name + 7, nlen - 7);
+  if (nlen > 5 && memcmp ("dest_", name, 5) == 0)
+    return get_url_part (pc->dest_url, name + 5, nlen - 5);
+  
+  return NULL;
+}
 
 static void
 set_program_id (const char *source_name, const char *dest_name)
 {
   int rc;
-  mu_vartab_t vtab;
-  char *id;
-  mu_url_t url;
-      
-  mu_vartab_create (&vtab);
-  mu_vartab_define (vtab, "progname", mu_program_name, 1);
-  mu_vartab_define (vtab, "source", source_name, 1);
-  rc = mu_mailbox_get_url (source, &url);
+  struct mu_wordsplit ws;
+  struct movemail_getvar_closure clos;
+
+  clos.source_name = source_name;
+  clos.dest_name = dest_name;
+  rc = mu_mailbox_get_url (source, &clos.source_url);
   if (rc)
     mu_diag_output (MU_DIAG_INFO,
                    _("cannot obtain source mailbox URL: %s"),
                    mu_strerror (rc));
-  else
-    {
-      mu_vartab_define_exp (vtab, "source:user", _vtx_user, NULL, url);
-      mu_vartab_define_exp (vtab, "source:host", _vtx_host, NULL, url);
-      mu_vartab_define_exp (vtab, "source:path", _vtx_path, NULL, url);
-    }
-      
-  mu_vartab_define (vtab, "dest", dest_name, 1);
-  rc = mu_mailbox_get_url (dest, &url);
+  rc = mu_mailbox_get_url (dest, &clos.dest_url);
   if (rc)
     mu_diag_output (MU_DIAG_INFO,
                    _("cannot obtain destination mailbox URL: %s"),
                    mu_strerror (rc));
-  else
+  
+  ws.ws_getvar = movemail_getvar;
+  ws.ws_closure = &clos;
+  if (mu_wordsplit (program_id_option, &ws,
+                   MU_WRDSF_NOSPLIT | MU_WRDSF_NOCMD |
+                   MU_WRDSF_GETVAR | MU_WRDSF_CLOSURE))
     {
-      mu_vartab_define_exp (vtab, "dest:user", _vtx_user, NULL, url);
-      mu_vartab_define_exp (vtab, "dest:host", _vtx_host, NULL, url);
-      mu_vartab_define_exp (vtab, "dest:path", _vtx_path, NULL, url);
+      mu_error (_("cannot expand line `%s': %s"), program_id_option,
+               mu_wordsplit_strerror (&ws));
+      return;
     }
-      
-  rc = mu_vartab_expand (vtab, program_id_option, &id);
-  mu_vartab_destroy (&vtab);
-  /*      mu_asprintf (&id, "%s: %s", mu_program_name, s);
-         free (s);*/
+  
   /* FIXME: Don't use mu_set_program_name here, because it
      plays wise with its argument. We need a mu_set_diag_prefix
      function. */
-  mu_program_name = id;
+  mu_program_name = ws.ws_wordv[0];
+  ws.ws_wordv[0] = NULL;
+  ws.ws_wordc = 0;
+  mu_wordsplit_free (&ws);
 }
 
 int
diff --git a/mu/mu.h b/mu/mu.h
index 22bcc33..4280b0e 100644
--- a/mu/mu.h
+++ b/mu/mu.h
@@ -40,7 +40,7 @@ int mutool_ldflags (int argc, char **argv);
 int mutool_cflags (int argc, char **argv);
   
 extern char *mutool_shell_prompt;
-extern mu_vartab_t mutool_prompt_vartab;
+extern char **mutool_prompt_env;
 extern int mutool_shell_interactive;
 extern mu_stream_t mustrin, mustrout;
 int mutool_shell (const char *name, struct mutool_command *cmd);
diff --git a/mu/pop.c b/mu/pop.c
index 70e5708..311bd67 100644
--- a/mu/pop.c
+++ b/mu/pop.c
@@ -152,26 +152,35 @@ pop_session_str (enum pop_session_status stat)
 }
 
 static void
-pop_prompt_vartab ()
+pop_prompt_env ()
 {
-  mu_vartab_t vtab;
-  
-  if (mu_vartab_create (&vtab))
-    return;
-  mu_vartab_define (vtab, "user",
-                   (pop_session_status == pop_session_logged_in) ?
-                     username : "not logged in", 1);
-  mu_vartab_define (vtab, "host",
-                   (pop_session_status != pop_session_disconnected) ?
-                     host : "not connected", 1);
-  mu_vartab_define (vtab, "program-name", mu_program_name, 1);
-  mu_vartab_define (vtab, "canonical-program-name", "mu", 1);
-  mu_vartab_define (vtab, "package", PACKAGE, 1);
-  mu_vartab_define (vtab, "version", PACKAGE_VERSION, 1);
-  mu_vartab_define (vtab, "status", pop_session_str (pop_session_status), 1);
-  
-  mu_vartab_destroy (&mutool_prompt_vartab);
-  mutool_prompt_vartab = vtab;
+  if (!mutool_prompt_env)
+    mutool_prompt_env = xcalloc (2*7 + 1, sizeof(mutool_prompt_env[0]));
+
+  mutool_prompt_env[0] = "user";
+  mutool_prompt_env[1] = (pop_session_status == pop_session_logged_in) ?
+                           username : "[nouser]";
+
+  mutool_prompt_env[2] = "host"; 
+  mutool_prompt_env[3] = (pop_session_status != pop_session_disconnected) ?
+                           host : "[nohost]";
+
+  mutool_prompt_env[4] = "program-name";
+  mutool_prompt_env[5] = (char*) mu_program_name;
+
+  mutool_prompt_env[6] = "canonical-program-name";
+  mutool_prompt_env[7] = "mu";
+
+  mutool_prompt_env[8] = "package";
+  mutool_prompt_env[9] = PACKAGE;
+
+  mutool_prompt_env[10] = "version";
+  mutool_prompt_env[11] = PACKAGE_VERSION;
+
+  mutool_prompt_env[12] = "status";
+  mutool_prompt_env[13] = (char*) pop_session_str (pop_session_status);
+
+  mutool_prompt_env[14] = NULL;
 }
 
 
@@ -295,7 +304,7 @@ com_user (int argc, char **argv)
   if (status == 0)
     {
       username = strdup (argv[1]);
-      pop_prompt_vartab ();
+      pop_prompt_env ();
     }
   return status;
 }
@@ -495,7 +504,7 @@ com_pass (int argc, char **argv)
   if (status == 0)
     {
       pop_session_status = pop_session_logged_in;
-      pop_prompt_vartab ();
+      pop_prompt_env ();
     }
   free (passbuf);
   return status;
@@ -593,7 +602,7 @@ com_disconnect (int argc MU_ARG_UNUSED, char **argv 
MU_ARG_UNUSED)
       connect_argc = 0;
       connect_argv = NULL;
       pop_session_status = pop_session_disconnected;
-      pop_prompt_vartab ();
+      pop_prompt_env ();
     }
   return 0;
 }
@@ -689,7 +698,7 @@ com_connect (int argc, char **argv)
       port = n;
       pop_session_status = pop_session_connected;
 
-      pop_prompt_vartab ();
+      pop_prompt_env ();
     }
   
   return status;
@@ -794,7 +803,7 @@ mutool_pop (int argc, char **argv)
 
   /* Command line prompt */
   mutool_shell_prompt = xstrdup ("pop> ");
-  pop_prompt_vartab ();
+  pop_prompt_env ();
   mutool_shell ("pop", pop_comtab);
   return 0;
 }
diff --git a/mu/shell.c b/mu/shell.c
index 910a13a..51ed25a 100644
--- a/mu/shell.c
+++ b/mu/shell.c
@@ -31,21 +31,10 @@
 #endif
 
 char *mutool_shell_prompt;
-mu_vartab_t mutool_prompt_vartab;
+char **mutool_prompt_env;
 int mutool_shell_interactive;
 mu_stream_t mustrin, mustrout;
 
-static char *
-expand_prompt ()
-{
-  char *str;
-  
-  if (!mutool_prompt_vartab
-      || mu_vartab_expand (mutool_prompt_vartab, mutool_shell_prompt, &str))
-    str = strdup (mutool_shell_prompt);
-  return str;
-}
-
 
 static int shell_exit (int, char **);
 static int shell_help (int, char **);
@@ -516,9 +505,22 @@ execute_line (char *line)
 static char *
 input_line_interactive ()
 {
-  char *p = expand_prompt ();
-  char *line = readline (p);
-  free (p);
+  char *line;
+  int wsflags = MU_WRDSF_NOSPLIT | MU_WRDSF_NOCMD;
+  struct mu_wordsplit ws;
+  
+  if (mutool_prompt_env)
+    {
+      ws.ws_env = (const char **)mutool_prompt_env;
+      wsflags |= MU_WRDSF_ENV | MU_WRDSF_ENV_KV;
+    }
+  if (mu_wordsplit (mutool_shell_prompt, &ws, wsflags))
+    line = readline (mutool_shell_prompt);
+  else
+    {
+      line = readline (ws.ws_wordv[0]);
+      mu_wordsplit_free (&ws);
+    }
   return line;
 }
 


hooks/post-receive
-- 
GNU Mailutils



reply via email to

[Prev in Thread] Current Thread [Next in Thread]