X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=init.c;h=76bb0851db9685033c52b2b880acaf5fdcbc83a8;hp=0a0d9abe68e8581ff37b635d97ee556130d36387;hb=9c35e6b2c6568130f29a4dfeeca73862bed015fe;hpb=ba5e3af4ea19e1d20c80941c077039871ec84258 diff --git a/init.c b/init.c index 0a0d9ab..76bb085 100644 --- a/init.c +++ b/init.c @@ -12,6 +12,8 @@ #endif #include "mutt.h" +#include "buffer.h" +#include "ascii.h" #include "mapping.h" #include "mutt_curses.h" #include "history.h" @@ -133,176 +135,6 @@ int mutt_option_index (char *s) return (-1); } -int mutt_extract_token (BUFFER * dest, BUFFER * tok, int flags) -{ - char ch; - char qc = 0; /* quote char */ - char *pc; - - /* reset the destination pointer to the beginning of the buffer */ - dest->dptr = dest->data; - - SKIPWS (tok->dptr); - while ((ch = *tok->dptr)) { - if (!qc) { - if ((ISSPACE (ch) && !(flags & M_TOKEN_SPACE)) || - (ch == '#' && !(flags & M_TOKEN_COMMENT)) || - (ch == '=' && (flags & M_TOKEN_EQUAL)) || - (ch == ';' && !(flags & M_TOKEN_SEMICOLON)) || - ((flags & M_TOKEN_PATTERN) && strchr ("~!|", ch))) - break; - } - - tok->dptr++; - - if (ch == qc) - qc = 0; /* end of quote */ - else if (!qc && (ch == '\'' || ch == '"') && !(flags & M_TOKEN_QUOTE)) - qc = ch; - else if (ch == '\\' && qc != '\'') { - if (!*tok->dptr) - return -1; /* premature end of token */ - switch (ch = *tok->dptr++) { - case 'c': - case 'C': - if (!*tok->dptr) - return -1; /* premature end of token */ - mutt_buffer_addch (dest, (toupper ((unsigned char) *tok->dptr) - - '@') & 0x7f); - tok->dptr++; - break; - case 'r': - mutt_buffer_addch (dest, '\r'); - break; - case 'n': - mutt_buffer_addch (dest, '\n'); - break; - case 't': - mutt_buffer_addch (dest, '\t'); - break; - case 'f': - mutt_buffer_addch (dest, '\f'); - break; - case 'e': - mutt_buffer_addch (dest, '\033'); - break; - default: - if (isdigit ((unsigned char) ch) && - isdigit ((unsigned char) *tok->dptr) && - isdigit ((unsigned char) *(tok->dptr + 1))) { - - mutt_buffer_addch (dest, - (ch << 6) + (*tok->dptr << 3) + *(tok->dptr + - 1) - 3504); - tok->dptr += 2; - } - else - mutt_buffer_addch (dest, ch); - } - } - else if (ch == '^' && (flags & M_TOKEN_CONDENSE)) { - if (!*tok->dptr) - return -1; /* premature end of token */ - ch = *tok->dptr++; - if (ch == '^') - mutt_buffer_addch (dest, ch); - else if (ch == '[') - mutt_buffer_addch (dest, '\033'); - else if (isalpha ((unsigned char) ch)) - mutt_buffer_addch (dest, toupper ((unsigned char) ch) - '@'); - else { - mutt_buffer_addch (dest, '^'); - mutt_buffer_addch (dest, ch); - } - } - else if (ch == '`' && (!qc || qc == '"')) { - FILE *fp; - pid_t pid; - char *cmd, *ptr; - size_t expnlen; - BUFFER expn; - int line = 0; - - pc = tok->dptr; - do { - if ((pc = strpbrk (pc, "\\`"))) { - /* skip any quoted chars */ - if (*pc == '\\') - pc += 2; - } - } while (pc && *pc != '`'); - if (!pc) { - debug_print (1, ("mismatched backtics\n")); - return (-1); - } - cmd = str_substrdup (tok->dptr, pc); - if ((pid = mutt_create_filter (cmd, NULL, &fp, NULL)) < 0) { - debug_print (1, ("unable to fork command: %s\n", cmd)); - mem_free (&cmd); - return (-1); - } - mem_free (&cmd); - - tok->dptr = pc + 1; - - /* read line */ - memset (&expn, 0, sizeof (expn)); - expn.data = mutt_read_line (NULL, &expn.dsize, fp, &line); - fclose (fp); - mutt_wait_filter (pid); - - /* if we got output, make a new string consiting of the shell ouptput - plus whatever else was left on the original line */ - /* BUT: If this is inside a quoted string, directly add output to - * the token */ - if (expn.data && qc) { - mutt_buffer_addstr (dest, expn.data); - mem_free (&expn.data); - } - else if (expn.data) { - expnlen = str_len (expn.data); - tok->dsize = expnlen + str_len (tok->dptr) + 1; - ptr = mem_malloc (tok->dsize); - memcpy (ptr, expn.data, expnlen); - strcpy (ptr + expnlen, tok->dptr); /* __STRCPY_CHECKED__ */ - if (tok->destroy) - mem_free (&tok->data); - tok->data = ptr; - tok->dptr = ptr; - tok->destroy = 1; /* mark that the caller should destroy this data */ - ptr = NULL; - mem_free (&expn.data); - } - } - else if (ch == '$' && (!qc || qc == '"') - && (*tok->dptr == '{' || isalpha ((unsigned char) *tok->dptr))) { - char *env = NULL, *var = NULL; - - if (*tok->dptr == '{') { - tok->dptr++; - if ((pc = strchr (tok->dptr, '}'))) { - var = str_substrdup (tok->dptr, pc); - tok->dptr = pc + 1; - } - } - else { - for (pc = tok->dptr; isalnum ((unsigned char) *pc) || *pc == '_'; - pc++); - var = str_substrdup (tok->dptr, pc); - tok->dptr = pc; - } - if (var && (env = getenv (var))) - mutt_buffer_addstr (dest, env); - mem_free (&var); - } - else - mutt_buffer_addch (dest, ch); - } - mutt_buffer_addch (dest, 0); /* terminate the string */ - SKIPWS (tok->dptr); - return 0; -} - static void add_to_list (LIST ** list, const char *str) { LIST *t, *last = NULL;