X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=rcparser.y;h=114c043bcc716971a8140b8e9ea3856015bf2d5a;hp=4f5c572b3e1019358ed723a14600699087c460c7;hb=9468c36e7656e50a91f759e3f5498b7f86dbec30;hpb=24b852b7ee31a675952de8c42643d2448086bbba diff --git a/rcparser.y b/rcparser.y index 4f5c572..114c043 100644 --- a/rcparser.y +++ b/rcparser.y @@ -18,8 +18,10 @@ */ %include { +# include # include "mutt.h" # include "parse.h" +# include "buffy.h" static buffer_t *buffer_merge(buffer_t *A, buffer_t **B) { @@ -80,6 +82,24 @@ buffer_add(buf, s, len); return buf; } + + static void substvar(buffer_t *buf, const segment seg) + { + const char *res; + char tmp[STRING]; + char var[STRING]; + + if (m_strncpy(var, sizeof(var), seg.s, seg.len) <= 0) + return; + + if ((res = getenv(var))) { + buffer_addstr(buf, res); + return; + } + if (mutt_option_value(var, tmp, sizeof(tmp))) { + buffer_addstr(buf, tmp); + } + } } %name rcparse @@ -98,7 +118,7 @@ sp ::= SPACE . sp ::= sp SPACE . sp ::= sp escnl SPACE . -non_nl ::= ATOM|SPACE|BQUOTE|BSLASH|SHARP|DOLLAR|DQUOTE|EQUAL|LBRACE|QUOTE|RBRACE . +non_nl ::= ATOM|SPACE|BQUOTE|BSLASH|SHARP|DOLLAR|DQUOTE|EQUAL|LBRACE|SQUOTE|RBRACE . non_nl_star ::= . non_nl_star ::= non_nl_star non_nl . @@ -110,13 +130,18 @@ to_eol ::= sp to_eol_aux . /****************************************************************************/ /* Our macro tokens */ /****************************************************************************/ +/* {{{*/ + +%type svar { segment } +svar(Z) ::= DOLLAR ATOM(B) . { Z = B; } +svar(Z) ::= DOLLAR LBRACE ATOM(B) RBRACE . { Z = B; } /* '-quoted tokens */ %type sqtok { buffer_t* } %destructor sqtok { buffer_delete(&$$); } sqtok(Z) ::= . { Z = buffer_new(); } sqtok(Z) ::= sqtok(A) escnl . { Z = A; } -sqtok(Z) ::= sqtok(A) BSLASH BSLASH|QUOTE(B) . { buffer_addch(Z = A, *B.s); } +sqtok(Z) ::= sqtok(A) BSLASH BSLASH|SQUOTE(B) . { buffer_addch(Z = A, *B.s); } sqtok(Z) ::= sqtok(A) BSLASH ATOM|SPACE|BQUOTE|SHARP|DOLLAR|DQUOTE|EQUAL|LBRACE|RBRACE(B) . { buffer_addch(Z = A, '\\'); buffer_add(Z, B.s, B.len); @@ -125,41 +150,51 @@ sqtok(Z) ::= sqtok(A) ATOM|SPACE|BQUOTE|SHARP|DOLLAR|DQUOTE|EQUAL|LBRACE|RBRACE( buffer_add(Z = A, B.s, B.len); } +/* `-quoted tokens */ +%type bqtok { buffer_t* } +%destructor bqtok { buffer_delete(&$$); } +bqtok(Z) ::= . { Z = buffer_new(); } +bqtok(Z) ::= bqtok(A) escnl . { Z = A; } +bqtok(Z) ::= bqtok(A) BSLASH non_nl(B) . { Z = buffer_escape(A, B.s, B.len); } +bqtok(Z) ::= bqtok(A) svar(B) . { substvar(Z = A, B); } +bqtok(Z) ::= bqtok(A) ATOM|SPACE|SHARP|EQUAL|LBRACE|RBRACE|SQUOTE|DQUOTE(B) . { + buffer_add(Z = A, B.s, B.len); +} + /* "-quoted tokens */ %type dqtok { buffer_t* } -%destructor dqtok { buffer_delete(&$$); } +%destructor dqtok { buffer_delete(&$$); } dqtok(Z) ::= . { Z = buffer_new(); } dqtok(Z) ::= dqtok(A) escnl . { Z = A; } dqtok(Z) ::= dqtok(A) BSLASH non_nl(B) . { Z = buffer_escape(A, B.s, B.len); } -dqtok(Z) ::= dqtok(A) ATOM|SPACE|SHARP|EQUAL|LBRACE|RBRACE(B) . { +dqtok(Z) ::= dqtok(A) svar(B) . { substvar(Z = A, B); } +dqtok(Z) ::= dqtok(A) ATOM|SPACE|SHARP|EQUAL|LBRACE|RBRACE|SQUOTE(B) . { buffer_add(Z = A, B.s, B.len); } -dqtok(Z) ::= dqtok(A) DOLLAR ATOM(B) . { - // FIXME - B = B; - Z = A; -} -dqtok(Z) ::= dqtok(A) DOLLAR LBRACE ATOM(B) RBRACE . { - // FIXME - B = B; - Z = A; -} +dqtok(Z) ::= dqtok(A) BQUOTE bqtok(B) BQUOTE . { /* XXX */ buffer_merge(Z = A, &B); } /* unquoted tokens */ %type uqtok { buffer_t* } %destructor uqtok { buffer_delete(&$$); } -uqtok(Z) ::= ATOM|EQUAL|LBRACE|RBRACE(A) . { buffer_add(Z = buffer_new(), A.s, A.len); } uqtok(Z) ::= BSLASH non_nl(A) . { buffer_add(Z = buffer_new(), A.s, A.len); } -uqtok(Z) ::= QUOTE sqtok(A) QUOTE . { Z = A; } +uqtok(Z) ::= svar(A) . { substvar(Z = buffer_new(), A); } +uqtok(Z) ::= ATOM|EQUAL|LBRACE|RBRACE(A) . { buffer_add(Z = buffer_new(), A.s, A.len); } +uqtok(Z) ::= SQUOTE sqtok(A) SQUOTE . { Z = A; } uqtok(Z) ::= DQUOTE dqtok(A) DQUOTE . { Z = A; } +uqtok(Z) ::= BQUOTE bqtok(A) BQUOTE . { /* XXX */ Z = A; } + +/* token accumulator: NEVER USE DIRECTLY */ +%type tokaux { buffer_t* } +%destructor tokaux { abort(); } +tokaux(Z) ::= uqtok(A) . { Z = A; } +tokaux(Z) ::= tokaux(A) escnl . { Z = A; } +tokaux(Z) ::= tokaux(A) uqtok(B) . { Z = buffer_merge(A, &B); } -/* token accumulator */ %type token { buffer_t* } %destructor token { buffer_delete(&$$); } -token(Z) ::= uqtok(A) . { Z = A; } -token(Z) ::= token(A) escnl . { Z = A; } -token(Z) ::= token(A) uqtok(B) . { Z = buffer_merge(A, &B); } +token(Z) ::= sp tokaux(A) . { Z = A; } +/* }}}*/ /****************************************************************************/ /* list of tokens */ /****************************************************************************/ @@ -167,10 +202,15 @@ token(Z) ::= token(A) uqtok(B) . { Z = buffer_merge(A, &B); } %type simple_list { string_list_t * } %destructor simple_list { string_list_wipe(&$$); } simple_list ::= . -simple_list(L) ::= simple_list(A) sp token(B) . { - L = string_item_new(); - L->data = buffer_unwrap(&B); - L->next = A; +simple_list(L) ::= simple_list(A) token(B) . { + if (B->len) { + L = string_item_new(); + L->data = buffer_unwrap(&B); + L->next = A; + } else { + L = A; + buffer_delete(&B); + } } @@ -182,6 +222,118 @@ rc ::= rclines . rclines ::= . rclines ::= rclines rcline . +rcline ::= to_eol . +rcline ::= BIND token token token to_eol . +rcline ::= EXEC simple_list to_eol . +rcline ::= MACRO token token token to_eol . +rcline ::= MACRO token token token token to_eol . +rcline ::= PUSH token to_eol . +rcline ::= SCORE token token to_eol . +rcline ::= UNSCORE simple_list to_eol . + +/* {{{ alias */ + +%type atok { buffer_t* } +%destructor atok { buffer_delete(&$$); } +atok(Z) ::= ATOM|SHARP|DQUOTE|EQUAL|LBRACE|SQUOTE|RBRACE(A) . { + buffer_add(Z = buffer_new(), A.s, A.len); +} +atok(Z) ::= SPACE(A) . { + buffer_add(Z = buffer_new(), A.s, A.len); +} +atok(Z) ::= atok(A) escnl . { Z = A; } +atok(Z) ::= atok(A) BSLASH non_nl(B) . { Z = buffer_escape(A, B.s, B.len); } +atok(Z) ::= atok(A) svar(B) . { substvar(Z = A, B); } +atok(Z) ::= atok(A) BQUOTE bqtok(B) BQUOTE . { /* XXX */ buffer_merge(Z = A, &B); } + +rcline ::= ALIAS token SPACE atok to_eol . + +/* }}} */ +/* {{{ colors */ + +rcline ::= COLOR token token token to_eol . +rcline ::= COLOR token token token token to_eol . +rcline ::= UNCOLOR token simple_list to_eol . +rcline ::= MONO token token to_eol . +rcline ::= MONO token token token to_eol . +rcline ::= UNMONO token simple_list to_eol . + +/* }}} */ +/* {{{ hooks */ + +rcline ::= ACCOUNT_HOOK token token to_eol . +rcline ::= APPEND_HOOK token token to_eol . +rcline ::= CHARSET_HOOK token token to_eol . +rcline ::= CLOSE_HOOK token token to_eol . +rcline ::= CRYPT_HOOK token token to_eol . +rcline ::= FCC_HOOK token token to_eol . +rcline ::= FCC_SAVE_HOOK token token to_eol . +rcline ::= FOLDER_HOOK token token to_eol . +rcline ::= ICONV_HOOK token token to_eol . +rcline ::= MBOX_HOOK token token to_eol . +rcline ::= MESSAGE_HOOK token token to_eol . +rcline ::= OPEN_HOOK token token to_eol . +rcline ::= PGP_HOOK token token to_eol . +rcline ::= REPLY_HOOK token token to_eol . +rcline ::= SAVE_HOOK token token to_eol . +rcline ::= SEND2_HOOK token token to_eol . +rcline ::= SEND_HOOK token token to_eol . + +rcline ::= UNHOOK token to_eol . + +/* }}} */ +/* {{{ buffy related */ + +mailboxes ::= . +mailboxes ::= mailboxes token(A) . { + if (A->len) { + char buf[_POSIX_PATH_MAX]; + BUFFY *tmp; + int i; + + m_strcpy(buf, sizeof(buf), A->data); + mutt_expand_path(buf, sizeof(buf)); + i = buffy_lookup(buf); + if (i < 0) { + tmp = p_new(BUFFY, 1); + tmp->path = m_strdup(buf); + buffy_array_append(&Incoming, tmp); + } else { + tmp = Incoming.arr[i]; + } + + tmp->new = 0; + tmp->notified = 1; + tmp->newly_created = 0; + } + buffer_delete(&A); +} +rcline ::= MAILBOXES mailboxes to_eol . + +unmailboxes ::= . +unmailboxes ::= unmailboxes token(A) . { + if (A->len) { + if (A->data[0] == '*' && A->len == 1) { + buffy_array_wipe(&Incoming); + } else { + char buf[_POSIX_PATH_MAX]; + BUFFY *tmp; + int i; + + m_strcpy(buf, sizeof(buf), A->data); + mutt_expand_path(buf, sizeof(buf)); + i = buffy_lookup(buf); + tmp = buffy_array_take(&Incoming, i); + buffy_delete(&tmp); + } + } + buffer_delete(&A); +} +rcline ::= UNMAILBOXES unmailboxes to_eol . + +/* }}} */ +/* {{{ lists (alternative_order, auto_view, hdr_order, mime_lookup */ + rcline ::= ALTERNATIVE_ORDER simple_list(L) to_eol . { string_list_append(&AlternativeOrderList, string_list_rev(L)); } @@ -195,5 +347,6 @@ rcline ::= MIME_LOOKUP simple_list(L) to_eol . { string_list_append(&MimeLookupList, string_list_rev(L)); } +/* }}} */ /* vim: set indentexpr= cin: */