diff --git a/alpine-2.00-as_needed.patch b/alpine-2.00-as_needed.patch deleted file mode 100644 index b74199c..0000000 --- a/alpine-2.00-as_needed.patch +++ /dev/null @@ -1,10 +0,0 @@ ---- configure.ac -+++ configure.ac -@@ -1307,6 +1307,7 @@ - AC_CHECK_LIB(pam, pam_start, - [ - alpine_c_client_target="lnp" -+ LIBS="$LIBS -lpam" - ], - [ - if test -f /etc/shadow ; then diff --git a/alpine-2.10.clean.tar.lzma b/alpine-2.10.clean.tar.lzma deleted file mode 100644 index 707b689..0000000 --- a/alpine-2.10.clean.tar.lzma +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ee9a0a08e2bdeafb42448c759fcc38f1d960ed9485a7c7178d8c4016b13898cc -size 4849936 diff --git a/alpine-2.11.tar.xz b/alpine-2.11.tar.xz new file mode 100644 index 0000000..1f47462 --- /dev/null +++ b/alpine-2.11.tar.xz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fecc9ca5df03e0f368edec65cd61444325157b5635b5c92380cedf9c4ce8fbf6 +size 4403188 diff --git a/alpine-gcc44.diff b/alpine-gcc44.diff index 78dd423..7d29626 100644 --- a/alpine-gcc44.diff +++ b/alpine-gcc44.diff @@ -1,6 +1,13 @@ ---- ./imap/src/osdep/unix/dummy.c 2009/06/02 09:53:30 1.1 -+++ ./imap/src/osdep/unix/dummy.c 2009/06/02 10:04:31 -@@ -723,6 +723,17 @@ +--- + imap/src/osdep/unix/dummy.c | 14 ++++++++++++-- + pith/send.c | 1 + + 2 files changed, 13 insertions(+), 2 deletions(-) + +Index: alpine-2.11/imap/src/osdep/unix/dummy.c +=================================================================== +--- alpine-2.11.orig/imap/src/osdep/unix/dummy.c ++++ alpine-2.11/imap/src/osdep/unix/dummy.c +@@ -736,6 +736,17 @@ long dummy_copy (MAILSTREAM *stream,char return NIL; } @@ -18,7 +25,7 @@ /* Dummy append message string * Accepts: mail stream -@@ -742,8 +753,7 @@ +@@ -755,8 +766,7 @@ long dummy_append (MAILSTREAM *stream,ch /* append to INBOX? */ if (!compare_cstring (mailbox,"INBOX")) { /* yes, if no empty proto try creating */ @@ -28,9 +35,11 @@ } else if (dummy_file (tmp,mailbox) && ((fd = open (tmp,O_RDONLY,NIL)) < 0)) { if ((e = errno) == ENOENT) /* failed, was it no such file? */ ---- pith/send.c 2009/06/02 10:04:13 1.11 -+++ pith/send.c 2009/06/02 10:04:31 -@@ -1569,6 +1569,7 @@ +Index: alpine-2.11/pith/send.c +=================================================================== +--- alpine-2.11.orig/pith/send.c ++++ alpine-2.11/pith/send.c +@@ -1570,6 +1570,7 @@ set_priority_header(METAENV *header, cha pf->textbuf = cpystr(value); } } diff --git a/alpine-maildir-closedir.patch b/alpine-maildir-closedir.patch deleted file mode 100644 index a847917..0000000 --- a/alpine-maildir-closedir.patch +++ /dev/null @@ -1,39 +0,0 @@ ---- imap/src/osdep/unix/maildir.c 2011-10-17 10:11:55.000000000 +0200 -+++ imap/src/osdep/unix/maildir.c 2011-10-17 10:39:31.000000000 +0200 -@@ -2396,7 +2396,6 @@ - || !strncmp(d->d_name, MDUIDTEMP, strlen(MDUIDTEMP))) - break; - } -- closedir(dir); - rv = d ? !strncmp(d->d_name, tmp, strlen(tmp)) : 1; - createtemp = d ? 0 : 1; - if (d && rv == 0){ /* is there a temp file that is not ours? */ -@@ -2410,6 +2409,7 @@ - unlink(tmp); - } - } -+ closedir(dir); - if(createtemp){ - FILE *fp; - sprintf(tmp,"%s/%s.%d.%lu", LOCAL->dir, MDUIDTEMP, getpid(), time(0)); -@@ -2442,7 +2442,6 @@ - if(!strncmp(d->d_name, MDUIDLAST, strlen(MDUIDLAST))) - break; - } -- closedir(dir); - createuid = d == NULL ? 1 : 0; - if(uid_last == NULL) - deleteuid++; -@@ -2473,9 +2472,10 @@ - } - } - if(deleteuid){ -- sprintf(tmp,"%s/%s", LOCAL->dir, d->d_name); -+ snprintf(tmp, sizeof(tmp), "%s/%s", LOCAL->dir, d->d_name); - unlink(tmp); - } -+ closedir(dir); - if(createuid) - maildir_write_uid(stream, (uid_last ? *uid_last : stream->uid_last), - uid_validity ? *uid_validity : time(0)); -Nur in alpine-2.00/imap/src/osdep/unix: maildir.c~. diff --git a/alpine-month_name-utf8.patch b/alpine-month_name-utf8.patch index cba912f..d2128bb 100644 --- a/alpine-month_name-utf8.patch +++ b/alpine-month_name-utf8.patch @@ -1,6 +1,12 @@ ---- pith/string.c -+++ pith/string.c -@@ -769,6 +769,7 @@ +--- + pith/string.c | 14 ++++++++++++++ + 1 file changed, 14 insertions(+) + +Index: alpine-2.11/pith/string.c +=================================================================== +--- alpine-2.11.orig/pith/string.c ++++ alpine-2.11/pith/string.c +@@ -770,6 +770,7 @@ month_abbrev_locale(int month_num) return("xxx"); else{ static char buf[20]; @@ -8,7 +14,7 @@ struct tm tm; memset(&tm, 0, sizeof(tm)); -@@ -810,6 +811,12 @@ +@@ -811,6 +812,12 @@ month_abbrev_locale(int month_num) buf[0] = ' '; } @@ -21,7 +27,7 @@ return(buf); } -@@ -841,12 +848,19 @@ +@@ -842,12 +849,19 @@ month_name_locale(int month_num) return(""); else{ static char buf[20]; diff --git a/alpine-no-add-needed.patch b/alpine-no-add-needed.patch index 6b39c8c..7188b53 100644 --- a/alpine-no-add-needed.patch +++ b/alpine-no-add-needed.patch @@ -3,10 +3,10 @@ configure.ac | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) -Index: alpine-2.10/alpine/Makefile.am +Index: alpine-2.11/alpine/Makefile.am =================================================================== ---- alpine-2.10.orig/alpine/Makefile.am -+++ alpine-2.10/alpine/Makefile.am +--- alpine-2.11.orig/alpine/Makefile.am ++++ alpine-2.11/alpine/Makefile.am @@ -35,7 +35,7 @@ BUILT_SOURCES = date.c LDADD = ../pico/libpico.a ../pico/osdep/libpicoosd.a \ ../pith/libpith.a ../pith/osdep/libpithosd.a \ @@ -16,11 +16,11 @@ Index: alpine-2.10/alpine/Makefile.am AM_CPPFLAGS = -I@top_builddir@/include -I@top_srcdir@/include -DLOCALEDIR=\"$(localedir)\" -Index: alpine-2.10/configure.ac +Index: alpine-2.11/configure.ac =================================================================== ---- alpine-2.10.orig/configure.ac -+++ alpine-2.10/configure.ac -@@ -37,8 +37,9 @@ WEB_BUILD=web/src/alpined.d +--- alpine-2.11.orig/configure.ac ++++ alpine-2.11/configure.ac +@@ -38,8 +38,9 @@ WEB_BUILD=web/src/alpined.d dnl CHECK PROGRAMS diff --git a/alpine.changes b/alpine.changes index 094b3d4..41b4e12 100644 --- a/alpine.changes +++ b/alpine.changes @@ -1,3 +1,27 @@ +------------------------------------------------------------------- +Mon Sep 2 14:07:32 UTC 2013 - jengelh@inai.de + +- Update to new upstream release 2.11 +* Increase encryption of S/MIME encrypted messages. +* Pico: Improvements in justification of paragraphs: lines that + begin with a quote string, followed by a space were considered + individual paragraphs, now they are considered part of a paragraph. +* Unix Alpine: Allow local .pinerc file to be a symbolic link. +* Experimental extended support of recognition of UTF-8 in urls +* Added recognition of ws and wss URIs. +* Add ability to color folder names, directory names, and text in + the FOLDER SCREEN. +* Add the ability to color any token used in the display of the + INDEX SCREEN. +* New option preserve-original-fields that adds the ability to + preserve To: and Cc: fields when replying to a message, as + specified by original sender. +* Added Quota subcommands for printing, forwarding, saving, etc. +- Refresh from homepage (and save as unified): chappa-*.patch +- Refresh for -p1: operation-may-be-undefined-warning.diff, + fix-implicit.patch, alpine-gcc44.diff +- Drop quilt-patches/alpine-2.00-as_needed.patch (merged upstream) + ------------------------------------------------------------------- Wed May 22 20:37:21 UTC 2013 - jengelh@inai.de diff --git a/alpine.spec b/alpine.spec index 58fa2d7..07513c3 100644 --- a/alpine.spec +++ b/alpine.spec @@ -17,34 +17,16 @@ Name: alpine -# # For debugging only: %define build_vanilla 0 -# Summary: Mail User Agent License: Apache-2.0 Group: Productivity/Networking/Email/Clients -BuildRequires: imap-devel -BuildRequires: krb5-devel -BuildRequires: libgssapi -BuildRequires: libtool -BuildRequires: ncurses-devel -BuildRequires: openldap2-devel -BuildRequires: openssl-devel -BuildRequires: pam-devel -BuildRequires: update-desktop-files -BuildRequires: xz -# pgp4pine requires pine: -Provides: pine -# -Obsoletes: pine4 -Provides: pine4 -# -Version: 2.10 +Version: 2.11 Release: 0 -Url: http://www.washington.edu/alpine/ -Source: http://patches.freeiz.com/alpine/patches/alpine-2.10/alpine-2.10.clean.tar.lzma -BuildRoot: %{_tmppath}/%{name}-%{version}-build +Url: http://patches.freeiz.com/alpine/ + +Source: http://patches.freeiz.com/alpine/release/src/%name-%version.tar.xz Source1: %name.png Source2: %name.desktop Patch1: pine-nonvoid-function.patch @@ -52,7 +34,6 @@ Patch2: make-use-of-strncat-safer.diff Patch3: operation-may-be-undefined-warning.diff Patch4: fix-implicit.patch Patch5: alpine-gcc44.diff -Patch6: alpine-2.00-as_needed.patch Patch7: alpine-month_name-utf8.patch Patch10: pico-fix-spurious-undef-warnings.diff Patch20: pine-expression-warnings.diff @@ -70,6 +51,22 @@ Patch604: chappa-maildir.patch Patch605: chappa-WrtAcc.patch Patch606: chappa-unixnullbug.patch Patch613: alpine-no-add-needed.patch +BuildRoot: %{_tmppath}/%{name}-%{version}-build +BuildRequires: autoconf >= 2.69 +BuildRequires: imap-devel +BuildRequires: krb5-devel +BuildRequires: libgssapi +BuildRequires: libtool +BuildRequires: ncurses-devel +BuildRequires: openldap2-devel +BuildRequires: openssl-devel +BuildRequires: pam-devel +BuildRequires: update-desktop-files +BuildRequires: xz +# pgp4pine requires pine: +Provides: pine +Obsoletes: pine4 +Provides: pine4 %description Alpine is a display-oriented email client that is suitable for both @@ -133,11 +130,10 @@ fi # %patch1 -p1 %patch2 -p1 -%patch3 -%patch4 -p0 -%patch5 -p0 -%patch6 -p0 -%patch7 +%patch3 -p1 +%patch4 -p1 +%patch5 -p1 +%patch7 -p1 %patch10 -p1 %patch20 -p1 %patch40 -p1 @@ -188,6 +184,13 @@ autoreconf -fiv grep -B9 -A20 'failed program was' config.log | grep -A24 checking exit 5 } +%{?fedora_version: tag=LFD} +%{?mandriva_version: tag=LMD} +%{?redhat_version: tag=LRH} +%{?centos_version: tag=LRH} +%{?suse_version: tag=LSU} +perl -i -pe 's{(define SYSTYPE) "LNX"}{$1 "'"$tag"'"}g' include/config.h + # # imap does not use CFLAGS from configure, needs EXTRACFLAGS/EXTRALDFLAGS: # diff --git a/chappa-WrtAcc.patch b/chappa-WrtAcc.patch index 8cc7b4e..4e089d3 100644 --- a/chappa-WrtAcc.patch +++ b/chappa-WrtAcc.patch @@ -1,408 +1,351 @@ -diff -rc alpine-2.10/pico/basic.c alpine-2.10.WrtAcc/pico/basic.c -*** alpine-2.10/pico/basic.c 2013-01-11 11:25:28.000000000 -0700 ---- alpine-2.10.WrtAcc/pico/basic.c 2013-01-11 20:43:11.000000000 -0700 -*************** -*** 344,349 **** ---- 344,532 ---- - return(TRUE); - } - -+ unsigned char GetAccent() -+ { -+ UCS c,d; -+ c = GetKey(); -+ if ((c == '?') || (c == '!')) { -+ d = c; -+ c = '\\'; -+ } -+ else -+ if ((c == 's') || (c == 'S')){ -+ c = d = 's'; +--- + pico/basic.c | 183 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + pico/composer.c | 9 ++ + pico/display.c | 7 +- + pico/ebind.h | 8 +- + pico/efunc.h | 3 + pico/main.c | 6 + + pico/search.c | 6 - + 7 files changed, 214 insertions(+), 8 deletions(-) + +Index: alpine-2.11/pico/basic.c +=================================================================== +--- alpine-2.11.orig/pico/basic.c ++++ alpine-2.11/pico/basic.c +@@ -344,6 +344,189 @@ gotobop(int f, int n) + return(TRUE); + } + ++unsigned char GetAccent() ++{ ++ UCS c,d; ++ c = GetKey(); ++ if ((c == '?') || (c == '!')) { ++ d = c; ++ c = '\\'; ++ } ++ else ++ if ((c == 's') || (c == 'S')){ ++ c = d = 's'; ++ } ++ else ++ if ((c == 'l') || (c == 'L')){ ++ c = d = 'l'; ++ } ++ else ++ d = GetKey(); ++ return accent(c,d); ++} ++ ++int pineaccent(f,n) ++ int f,n; ++{ unsigned char e; ++ ++ if (e = GetAccent()) ++ execute(e, 0, 1); ++ return 1; ++} ++ ++unsigned char accent(f,n) ++UCS f,n; ++{ UCS c,d; ++ ++ c = f; ++ d = n; ++ switch(c){ ++ case '~' : ++ switch(d){ ++ case 'a' : return '\343'; ++ case 'n' : return '\361'; ++ case 'o' : return '\365'; ++ case 'A' : return '\303'; ++ case 'N' : return '\321'; ++ case 'O' : return '\325'; ++ } ++ break; ++ case '\047' : ++ switch(d){ ++ case 'a' : return '\341'; ++ case 'e' : return '\351'; ++ case 'i' : return '\355'; ++ case 'o' : return '\363'; ++ case 'u' : return '\372'; ++ case 'y' : return '\375'; ++ case 'A' : return '\301'; ++ case 'E' : return '\311'; ++ case 'I' : return '\315'; ++ case 'O' : return '\323'; ++ case 'U' : return '\332'; ++ case 'Y' : return '\335'; ++ } ++ break; ++ case '"' : ++ switch(d){ ++ case 'a' : return '\344'; ++ case 'e' : return '\353'; ++ case 'i' : return '\357'; ++ case 'o' : return '\366'; ++ case 'u' : return '\374'; ++ case 'y' : return '\377'; ++ case 'A' : return '\304'; ++ case 'E' : return '\313'; ++ case 'I' : return '\317'; ++ case 'O' : return '\326'; ++ case 'U' : return '\334'; ++ } ++ break; ++ case '^' : ++ switch(d){ ++ case 'a' : return '\342'; ++ case 'e' : return '\352'; ++ case 'i' : return '\356'; ++ case 'o' : return '\364'; ++ case 'u' : return '\373'; ++ case 'A' : return '\302'; ++ case 'E' : return '\312'; ++ case 'I' : return '\316'; ++ case 'O' : return '\324'; ++ case 'U' : return '\333'; ++ case '0' : return '\260'; ++ case '1' : return '\271'; ++ case '2' : return '\262'; ++ case '3' : return '\263'; ++ } ++ break; ++ case '`' : ++ switch(d){ ++ case 'a' : return '\340'; ++ case 'e' : return '\350'; ++ case 'i' : return '\354'; ++ case 'o' : return '\362'; ++ case 'u' : return '\371'; ++ case 'A' : return '\300'; ++ case 'E' : return '\310'; ++ case 'I' : return '\314'; ++ case 'O' : return '\322'; ++ case 'U' : return '\331'; ++ } ++ break; ++ case 'o' : ++ switch(d){ ++ case 'a' : return '\345'; ++ case 'A' : return '\305'; ++ case '/' : return '\370'; ++ case 'r' : return '\256'; ++ case 'R' : return '\256'; ++ case 'c' : return '\251'; ++ case 'C' : return '\251'; ++ } ++ break; ++ case '-' : ++ switch(d){ ++ case 'o' : return '\272'; ++ case 'O' : return '\272'; ++ case '0' : return '\272'; ++ case 'a' : return '\252'; ++ case 'A' : return '\252'; ++ case 'l' : return '\243'; ++ case 'L' : return '\243'; ++ } ++ break; ++ case 'O' : ++ switch(d){ ++ case '/' : return '\330'; ++ case 'r' : return '\256'; ++ case 'R' : return '\256'; ++ case 'c' : return '\251'; ++ case 'C' : return '\251'; ++ } ++ case '/' : ++ switch(d){ ++ case 'o' : return '\370'; ++ case 'O' : return '\330'; ++ } ++ break; ++ case 'a' : ++ switch(d){ ++ case 'e' : return '\346'; ++ case 'E' : return '\346'; ++ } ++ break; ++ case 'A' : ++ switch(d){ ++ case 'E' : return '\306'; ++ case 'e' : return '\306'; ++ } ++ break; ++ case ',' : ++ switch(d){ ++ case 'c' : return '\347'; ++ case 'C' : return '\307'; ++ } ++ break; ++ case '\\' : ++ switch(d){ ++ case '?' : return '\277'; ++ case '!' : return '\241'; ++ } ++ break; ++ case 's' : ++ switch(d){ ++ case 's' : return '\337'; ++ } ++ break; ++ case 'l' : ++ switch(d){ ++ case 'l' : return '\243'; ++ } ++ break; + } -+ else -+ if ((c == 'l') || (c == 'L')){ -+ c = d = 'l'; -+ } -+ else -+ d = GetKey(); -+ return accent(c,d); -+ } -+ -+ int pineaccent(f,n) -+ int f,n; -+ { unsigned char e; -+ -+ if (e = GetAccent()) -+ execute(e, 0, 1); -+ return 1; -+ } -+ -+ unsigned char accent(f,n) -+ UCS f,n; -+ { UCS c,d; -+ -+ c = f; -+ d = n; -+ switch(c){ -+ case '~' : -+ switch(d){ -+ case 'a' : return '\343'; -+ case 'n' : return '\361'; -+ case 'o' : return '\365'; -+ case 'A' : return '\303'; -+ case 'N' : return '\321'; -+ case 'O' : return '\325'; -+ } -+ break; -+ case '\047' : -+ switch(d){ -+ case 'a' : return '\341'; -+ case 'e' : return '\351'; -+ case 'i' : return '\355'; -+ case 'o' : return '\363'; -+ case 'u' : return '\372'; -+ case 'y' : return '\375'; -+ case 'A' : return '\301'; -+ case 'E' : return '\311'; -+ case 'I' : return '\315'; -+ case 'O' : return '\323'; -+ case 'U' : return '\332'; -+ case 'Y' : return '\335'; -+ } -+ break; -+ case '"' : -+ switch(d){ -+ case 'a' : return '\344'; -+ case 'e' : return '\353'; -+ case 'i' : return '\357'; -+ case 'o' : return '\366'; -+ case 'u' : return '\374'; -+ case 'y' : return '\377'; -+ case 'A' : return '\304'; -+ case 'E' : return '\313'; -+ case 'I' : return '\317'; -+ case 'O' : return '\326'; -+ case 'U' : return '\334'; -+ } -+ break; -+ case '^' : -+ switch(d){ -+ case 'a' : return '\342'; -+ case 'e' : return '\352'; -+ case 'i' : return '\356'; -+ case 'o' : return '\364'; -+ case 'u' : return '\373'; -+ case 'A' : return '\302'; -+ case 'E' : return '\312'; -+ case 'I' : return '\316'; -+ case 'O' : return '\324'; -+ case 'U' : return '\333'; -+ case '0' : return '\260'; -+ case '1' : return '\271'; -+ case '2' : return '\262'; -+ case '3' : return '\263'; -+ } -+ break; -+ case '`' : -+ switch(d){ -+ case 'a' : return '\340'; -+ case 'e' : return '\350'; -+ case 'i' : return '\354'; -+ case 'o' : return '\362'; -+ case 'u' : return '\371'; -+ case 'A' : return '\300'; -+ case 'E' : return '\310'; -+ case 'I' : return '\314'; -+ case 'O' : return '\322'; -+ case 'U' : return '\331'; -+ } -+ break; -+ case 'o' : -+ switch(d){ -+ case 'a' : return '\345'; -+ case 'A' : return '\305'; -+ case '/' : return '\370'; -+ case 'r' : return '\256'; -+ case 'R' : return '\256'; -+ case 'c' : return '\251'; -+ case 'C' : return '\251'; -+ } -+ break; -+ case '-' : -+ switch(d){ -+ case 'o' : return '\272'; -+ case 'O' : return '\272'; -+ case '0' : return '\272'; -+ case 'a' : return '\252'; -+ case 'A' : return '\252'; -+ case 'l' : return '\243'; -+ case 'L' : return '\243'; -+ } -+ break; -+ case 'O' : -+ switch(d){ -+ case '/' : return '\330'; -+ case 'r' : return '\256'; -+ case 'R' : return '\256'; -+ case 'c' : return '\251'; -+ case 'C' : return '\251'; -+ } -+ case '/' : -+ switch(d){ -+ case 'o' : return '\370'; -+ case 'O' : return '\330'; -+ } -+ break; -+ case 'a' : -+ switch(d){ -+ case 'e' : return '\346'; -+ case 'E' : return '\346'; -+ } -+ break; -+ case 'A' : -+ switch(d){ -+ case 'E' : return '\306'; -+ case 'e' : return '\306'; -+ } -+ break; -+ case ',' : -+ switch(d){ -+ case 'c' : return '\347'; -+ case 'C' : return '\307'; -+ } -+ break; -+ case '\\' : -+ switch(d){ -+ case '?' : return '\277'; -+ case '!' : return '\241'; -+ } -+ break; -+ case 's' : -+ switch(d){ -+ case 's' : return '\337'; -+ } -+ break; -+ case 'l' : -+ switch(d){ -+ case 'l' : return '\243'; -+ } -+ break; -+ } -+ return '\0'; -+ } - - /* - * go forword to the end of the current paragraph -diff -rc alpine-2.10/pico/composer.c alpine-2.10.WrtAcc/pico/composer.c -*** alpine-2.10/pico/composer.c 2013-01-11 19:45:41.000000000 -0700 ---- alpine-2.10.WrtAcc/pico/composer.c 2013-01-11 20:43:11.000000000 -0700 -*************** -*** 2015,2021 **** - tbufp = &strng[ods.p_len]; - - if(VALID_KEY(ch)){ /* char input */ -! /* - * if we are allowing editing, insert the new char - * end up leaving tbufp pointing to newly - * inserted character in string, and offset to the ---- 2015,2021 ---- - tbufp = &strng[ods.p_len]; - - if(VALID_KEY(ch)){ /* char input */ -! insert_char:/* - * if we are allowing editing, insert the new char - * end up leaving tbufp pointing to newly - * inserted character in string, and offset to the -*************** -*** 2095,2100 **** ---- 2095,2107 ---- - } - else { /* interpret ch as a command */ - switch (ch = normalize_cmd(ch, ckm, 2)) { -+ case (CTRL|'\\') : -+ if (ch = GetAccent()) -+ goto insert_char; -+ else -+ clearcursor(); -+ break; -+ - case (CTRL|KEY_LEFT): /* word skip left */ - if(ods.p_ind > 0) /* Scoot one char left if possible */ - ods.p_ind--; -diff -rc alpine-2.10/pico/display.c alpine-2.10.WrtAcc/pico/display.c -*** alpine-2.10/pico/display.c 2013-01-11 11:25:29.000000000 -0700 ---- alpine-2.10.WrtAcc/pico/display.c 2013-01-11 20:43:11.000000000 -0700 -*************** -*** 1751,1756 **** ---- 1751,1761 ---- - b = &buf[ucs4_strlen(buf)]; - continue; - -+ case (CTRL|'\\'): -+ if (c = GetAccent()) -+ goto text; -+ continue; -+ - case (CTRL|'F') : /* CTRL-F forward a char*/ - case KEY_RIGHT : - if(*b == '\0') -*************** -*** 1869,1875 **** - #endif - - default : -! - /* look for match in extra_v */ - for(i = 0; i < 12; i++) - if(c && c == extra_v[i]){ ---- 1874,1880 ---- - #endif - - default : -! text: - /* look for match in extra_v */ - for(i = 0; i < 12; i++) - if(c && c == extra_v[i]){ -diff -rc alpine-2.10/pico/ebind.h alpine-2.10.WrtAcc/pico/ebind.h -*** alpine-2.10/pico/ebind.h 2013-01-11 11:25:29.000000000 -0700 ---- alpine-2.10.WrtAcc/pico/ebind.h 2013-01-11 20:43:11.000000000 -0700 -*************** -*** 61,67 **** - #ifdef MOUSE - {KEY_MOUSE, mousepress}, - #ifndef _WINDOWS -! {CTRL|'\\', toggle_xterm_mouse}, - #endif - #endif - {CTRL|'A', gotobol}, ---- 61,67 ---- - #ifdef MOUSE - {KEY_MOUSE, mousepress}, - #ifndef _WINDOWS -! {CTRL|'|', toggle_xterm_mouse}, - #endif - #endif - {CTRL|'A', gotobol}, -*************** -*** 100,106 **** - {CTRL|KEY_HOME, gotobob}, - {CTRL|KEY_END, gotoeob}, - {0x7F, backdel}, -! {0, NULL} - }; - - ---- 100,108 ---- - {CTRL|KEY_HOME, gotobob}, - {CTRL|KEY_END, gotoeob}, - {0x7F, backdel}, -! {CTRL|'\\', pineaccent}, -! {0, -! NULL} - }; - - -*************** -*** 123,129 **** - #ifdef MOUSE - {KEY_MOUSE, mousepress}, - #ifndef _WINDOWS -! {CTRL|'\\', toggle_xterm_mouse}, - #endif - #endif - {CTRL|'A', gotobol}, ---- 125,131 ---- - #ifdef MOUSE - {KEY_MOUSE, mousepress}, - #ifndef _WINDOWS -! {CTRL|'|', toggle_xterm_mouse}, - #endif - #endif - {CTRL|'A', gotobol}, -diff -rc alpine-2.10/pico/efunc.h alpine-2.10.WrtAcc/pico/efunc.h -*** alpine-2.10/pico/efunc.h 2013-01-11 11:25:29.000000000 -0700 ---- alpine-2.10.WrtAcc/pico/efunc.h 2013-01-11 20:43:11.000000000 -0700 -*************** -*** 54,59 **** ---- 54,62 ---- - extern int backline(int, int); - extern int gotobop(int, int); - extern int gotoeop(int, int); -+ extern int pineaccent(int, int); -+ extern unsigned char accent(UCS, UCS); -+ extern unsigned char GetAccent(void); - extern int forwpage(int, int); - extern int backpage(int, int); - extern int scrollupline(int, int); -diff -rc alpine-2.10/pico/main.c alpine-2.10.WrtAcc/pico/main.c -*** alpine-2.10/pico/main.c 2013-01-11 11:25:29.000000000 -0700 ---- alpine-2.10.WrtAcc/pico/main.c 2013-01-11 20:43:11.000000000 -0700 -*************** -*** 416,421 **** ---- 416,427 ---- - emlwrite(_("You may possibly have new mail."), NULL); - } - -+ if (c == (CTRL|'\\')){ -+ c = GetAccent(); -+ if (!c) -+ c = NODATA; -+ } -+ - if(km_popped) - switch(c){ - case NODATA: -diff -rc alpine-2.10/pico/search.c alpine-2.10.WrtAcc/pico/search.c -*** alpine-2.10/pico/search.c 2013-01-11 11:25:29.000000000 -0700 ---- alpine-2.10.WrtAcc/pico/search.c 2013-01-11 20:43:11.000000000 -0700 -*************** -*** 274,280 **** - } - - if(status + curwp->w_doto >= llength(curwp->w_dotp) || -! !eq(defpat[status],lgetc(curwp->w_dotp, curwp->w_doto + status).c)) - break; /* do nothing! */ - status++; - } ---- 274,280 ---- - } - - if(status + curwp->w_doto >= llength(curwp->w_dotp) || -! !eq((unsigned char)defpat[status],lgetc(curwp->w_dotp, curwp->w_doto + status).c)) - break; /* do nothing! */ - status++; - } -*************** -*** 927,933 **** - c = lgetc(curline, curoff++).c; /* get the char */ - - /* test it against first char in pattern */ -! if (eq(c, patrn[0]) != FALSE) { /* if we find it..*/ - /* setup match pointers */ - matchline = curline; - matchoff = curoff; ---- 927,933 ---- - c = lgetc(curline, curoff++).c; /* get the char */ - - /* test it against first char in pattern */ -! if (eq(c, (unsigned char)patrn[0]) != FALSE) { /* if we find it..*/ - /* setup match pointers */ - matchline = curline; - matchoff = curoff; -*************** -*** 948,954 **** - return(FALSE); - - /* and test it against the pattern */ -! if (eq(*patptr, c) == FALSE) - goto fail; - } - ---- 948,954 ---- - return(FALSE); - - /* and test it against the pattern */ -! if (eq((unsigned char) *patptr, c) == FALSE) - goto fail; - } - ++ return '\0'; ++} + + /* + * go forword to the end of the current paragraph +Index: alpine-2.11/pico/composer.c +=================================================================== +--- alpine-2.11.orig/pico/composer.c ++++ alpine-2.11/pico/composer.c +@@ -2015,7 +2015,7 @@ LineEdit(int allowedit, UCS *lastch) + tbufp = &strng[ods.p_len]; + + if(VALID_KEY(ch)){ /* char input */ +- /* ++insert_char:/* + * if we are allowing editing, insert the new char + * end up leaving tbufp pointing to newly + * inserted character in string, and offset to the +@@ -2095,6 +2095,13 @@ LineEdit(int allowedit, UCS *lastch) + } + else { /* interpret ch as a command */ + switch (ch = normalize_cmd(ch, ckm, 2)) { ++ case (CTRL|'\\') : ++ if (ch = GetAccent()) ++ goto insert_char; ++ else ++ clearcursor(); ++ break; ++ + case (CTRL|KEY_LEFT): /* word skip left */ + if(ods.p_ind > 0) /* Scoot one char left if possible */ + ods.p_ind--; +Index: alpine-2.11/pico/display.c +=================================================================== +--- alpine-2.11.orig/pico/display.c ++++ alpine-2.11/pico/display.c +@@ -1751,6 +1751,11 @@ mlreplyd(UCS *prompt, UCS *buf, int nbuf + b = &buf[ucs4_strlen(buf)]; + continue; + ++ case (CTRL|'\\'): ++ if (c = GetAccent()) ++ goto text; ++ continue; ++ + case (CTRL|'F') : /* CTRL-F forward a char*/ + case KEY_RIGHT : + if(*b == '\0') +@@ -1881,7 +1886,7 @@ mlreplyd(UCS *prompt, UCS *buf, int nbuf + #endif + + default : +- ++text: + /* look for match in extra_v */ + for(i = 0; i < 12; i++) + if(c && c == extra_v[i]){ +Index: alpine-2.11/pico/ebind.h +=================================================================== +--- alpine-2.11.orig/pico/ebind.h ++++ alpine-2.11/pico/ebind.h +@@ -61,7 +61,7 @@ KEYTAB keytab[NBINDS] = { + #ifdef MOUSE + {KEY_MOUSE, mousepress}, + #ifndef _WINDOWS +- {CTRL|'\\', toggle_xterm_mouse}, ++ {CTRL|'|', toggle_xterm_mouse}, + #endif + #endif + {CTRL|'A', gotobol}, +@@ -100,7 +100,9 @@ KEYTAB keytab[NBINDS] = { + {CTRL|KEY_HOME, gotobob}, + {CTRL|KEY_END, gotoeob}, + {0x7F, backdel}, +- {0, NULL} ++ {CTRL|'\\', pineaccent}, ++ {0, ++NULL} + }; + + +@@ -123,7 +125,7 @@ KEYTAB pkeytab[NBINDS] = { + #ifdef MOUSE + {KEY_MOUSE, mousepress}, + #ifndef _WINDOWS +- {CTRL|'\\', toggle_xterm_mouse}, ++ {CTRL|'|', toggle_xterm_mouse}, + #endif + #endif + {CTRL|'A', gotobol}, +Index: alpine-2.11/pico/efunc.h +=================================================================== +--- alpine-2.11.orig/pico/efunc.h ++++ alpine-2.11/pico/efunc.h +@@ -54,6 +54,9 @@ extern int forwline(int, int); + extern int backline(int, int); + extern int gotobop(int, int); + extern int gotoeop(int, int); ++extern int pineaccent(int, int); ++extern unsigned char accent(UCS, UCS); ++extern unsigned char GetAccent(void); + extern int forwpage(int, int); + extern int backpage(int, int); + extern int scrollupline(int, int); +Index: alpine-2.11/pico/main.c +=================================================================== +--- alpine-2.11.orig/pico/main.c ++++ alpine-2.11/pico/main.c +@@ -416,6 +416,12 @@ main(int argc, char *argv[]) + emlwrite(_("You may possibly have new mail."), NULL); + } + ++ if (c == (CTRL|'\\')){ ++ c = GetAccent(); ++ if (!c) ++ c = NODATA; ++ } ++ + if(km_popped) + switch(c){ + case NODATA: +Index: alpine-2.11/pico/search.c +=================================================================== +--- alpine-2.11.orig/pico/search.c ++++ alpine-2.11/pico/search.c +@@ -278,7 +278,7 @@ forwsearch(int f, int n) + } + + if(status + curwp->w_doto >= llength(curwp->w_dotp) || +- !eq(defpat[status],lgetc(curwp->w_dotp, curwp->w_doto + status).c)) ++ !eq((unsigned char)defpat[status],lgetc(curwp->w_dotp, curwp->w_doto + status).c)) + break; /* do nothing! */ + status++; + } +@@ -931,7 +931,7 @@ forscan(int *wrapt, /* boolean indicatin + c = lgetc(curline, curoff++).c; /* get the char */ + + /* test it against first char in pattern */ +- if (eq(c, patrn[0]) != FALSE) { /* if we find it..*/ ++ if (eq(c, (unsigned char)patrn[0]) != FALSE) { /* if we find it..*/ + /* setup match pointers */ + matchline = curline; + matchoff = curoff; +@@ -952,7 +952,7 @@ forscan(int *wrapt, /* boolean indicatin + return(FALSE); + + /* and test it against the pattern */ +- if (eq(*patptr, c) == FALSE) ++ if (eq((unsigned char) *patptr, c) == FALSE) + goto fail; + } + diff --git a/chappa-colortext.patch b/chappa-colortext.patch index 44235ac..4333adb 100644 --- a/chappa-colortext.patch +++ b/chappa-colortext.patch @@ -1,545 +1,522 @@ -diff -rc alpine-2.10/alpine/confscroll.c alpine-2.10.colortext/alpine/confscroll.c -*** alpine-2.10/alpine/confscroll.c 2013-01-11 15:21:34.000000000 -0700 ---- alpine-2.10.colortext/alpine/confscroll.c 2013-01-11 20:43:16.000000000 -0700 -*************** -*** 5180,5185 **** ---- 5180,5188 ---- - - clear_index_cache(ps->mail_stream, 0); - } -+ else if(var == &ps->vars[V_SPECIAL_TEXT]){ -+ regex_pattern(ps->VAR_SPECIAL_TEXT); -+ } - else if(var == &ps->vars[V_INIT_CMD_LIST]){ - if(!revert) - q_status_message(SM_ASYNC, 0, 3, -diff -rc alpine-2.10/pith/conf.c alpine-2.10.colortext/pith/conf.c -*** alpine-2.10/pith/conf.c 2013-01-11 19:45:41.000000000 -0700 ---- alpine-2.10.colortext/pith/conf.c 2013-01-11 20:43:16.000000000 -0700 -*************** -*** 226,231 **** ---- 226,233 ---- - - CONF_TXT_T cf_text_fillcol[] = "Specifies the column of the screen where the composer should wrap."; - -+ CONF_TXT_T cf_special_text_color[] = "Specifies a comma separated list of text and regular expresions that Pine\n# will highlight"; -+ - CONF_TXT_T cf_text_replystr[] = "Specifies the string to insert when replying to a message."; - - CONF_TXT_T cf_text_quotereplstr[] = "Specifies the string to replace quotes with when viewing a message."; -*************** -*** 558,563 **** ---- 560,567 ---- - NULL, cf_text_speller}, - {"composer-wrap-column", 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, - NULL, cf_text_fillcol}, -+ {"special-text-color", 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, -+ NULL, cf_special_text_color}, - {"reply-indent-string", 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, - NULL, cf_text_replystr}, - {"reply-leadin", 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, -*************** -*** 809,814 **** ---- 813,820 ---- - {"incoming-unseen-background-color", 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0}, - {"signature-foreground-color", 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0}, - {"signature-background-color", 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0}, -+ {"special-text-foreground-color", 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0}, -+ {"special-text-background-color", 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0}, - {"prompt-foreground-color", 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0}, - {"prompt-background-color", 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0}, - {"header-general-foreground-color", 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0}, -*************** -*** 1972,1977 **** ---- 1978,1985 ---- - set_current_val(&vars[V_FORM_FOLDER], TRUE, TRUE); - set_current_val(&vars[V_EDITOR], TRUE, TRUE); - set_current_val(&vars[V_SPELLER], TRUE, TRUE); -+ set_current_val(&vars[V_SPECIAL_TEXT], TRUE, TRUE); -+ regex_pattern(VAR_SPECIAL_TEXT); - set_current_val(&vars[V_IMAGE_VIEWER], TRUE, TRUE); - set_current_val(&vars[V_BROWSER], TRUE, TRUE); - set_current_val(&vars[V_SMTP_SERVER], TRUE, TRUE); -*************** -*** 6424,6429 **** ---- 6432,6438 ---- - set_color_val(&vars[V_IND_OP_FORE_COLOR], 0); - set_color_val(&vars[V_INCUNSEEN_FORE_COLOR], 0); - set_color_val(&vars[V_SIGNATURE_FORE_COLOR], 0); -+ set_color_val(&vars[V_SPECIAL_TEXT_FORE_COLOR], 0); - - set_current_val(&ps->vars[V_VIEW_HDR_COLORS], TRUE, TRUE); - set_current_val(&ps->vars[V_KW_COLORS], TRUE, TRUE); -*************** -*** 7599,7604 **** ---- 7608,7615 ---- - return(h_config_scroll_margin); - case V_DEADLETS : - return(h_config_deadlets); -+ case V_SPECIAL_TEXT : -+ return(h_config_special_text_to_color); - case V_FILLCOL : - return(h_config_composer_wrap_column); - case V_TCPOPENTIMEO : -*************** -*** 7758,7763 **** ---- 7769,7777 ---- - case V_SIGNATURE_FORE_COLOR : - case V_SIGNATURE_BACK_COLOR : - return(h_config_signature_color); -+ case V_SPECIAL_TEXT_FORE_COLOR : -+ case V_SPECIAL_TEXT_BACK_COLOR : -+ return(h_config_special_text_color); - case V_PROMPT_FORE_COLOR : - case V_PROMPT_BACK_COLOR : - return(h_config_prompt_color); -diff -rc alpine-2.10/pith/conf.h alpine-2.10.colortext/pith/conf.h -*** alpine-2.10/pith/conf.h 2013-01-11 11:26:44.000000000 -0700 ---- alpine-2.10.colortext/pith/conf.h 2013-01-11 20:43:16.000000000 -0700 -*************** -*** 161,166 **** ---- 161,168 ---- - #define GLO_EDITOR vars[V_EDITOR].global_val.l - #define VAR_SPELLER vars[V_SPELLER].current_val.p - #define GLO_SPELLER vars[V_SPELLER].global_val.p -+ #define VAR_SPECIAL_TEXT vars[V_SPECIAL_TEXT].current_val.l -+ #define GLO_SPECIAL_TEXT vars[V_SPECIAL_TEXT].global_val.l - #define VAR_FILLCOL vars[V_FILLCOL].current_val.p - #define GLO_FILLCOL vars[V_FILLCOL].global_val.p - #define VAR_DEADLETS vars[V_DEADLETS].current_val.p -*************** -*** 444,449 **** ---- 446,453 ---- - #define GLO_SIGNATURE_FORE_COLOR vars[V_SIGNATURE_FORE_COLOR].global_val.p - #define VAR_SIGNATURE_BACK_COLOR vars[V_SIGNATURE_BACK_COLOR].current_val.p - #define GLO_SIGNATURE_BACK_COLOR vars[V_SIGNATURE_BACK_COLOR].global_val.p -+ #define VAR_SPECIAL_TEXT_FORE_COLOR vars[V_SPECIAL_TEXT_FORE_COLOR].current_val.p -+ #define VAR_SPECIAL_TEXT_BACK_COLOR vars[V_SPECIAL_TEXT_BACK_COLOR].current_val.p - #define VAR_PROMPT_FORE_COLOR vars[V_PROMPT_FORE_COLOR].current_val.p - #define VAR_PROMPT_BACK_COLOR vars[V_PROMPT_BACK_COLOR].current_val.p - #define VAR_VIEW_HDR_COLORS vars[V_VIEW_HDR_COLORS].current_val.l -diff -rc alpine-2.10/pith/conftype.h alpine-2.10.colortext/pith/conftype.h -*** alpine-2.10/pith/conftype.h 2013-01-11 19:45:41.000000000 -0700 ---- alpine-2.10.colortext/pith/conftype.h 2013-01-11 20:43:16.000000000 -0700 -*************** -*** 80,85 **** ---- 80,86 ---- - , V_EDITOR - , V_SPELLER - , V_FILLCOL -+ , V_SPECIAL_TEXT - , V_REPLY_STRING - , V_REPLY_INTRO - , V_QUOTE_REPLACE_STRING -*************** -*** 224,229 **** ---- 225,232 ---- - , V_INCUNSEEN_BACK_COLOR - , V_SIGNATURE_FORE_COLOR - , V_SIGNATURE_BACK_COLOR -+ , V_SPECIAL_TEXT_FORE_COLOR -+ , V_SPECIAL_TEXT_BACK_COLOR - , V_PROMPT_FORE_COLOR - , V_PROMPT_BACK_COLOR - , V_HEADER_GENERAL_FORE_COLOR -diff -rc alpine-2.10/pith/mailview.c alpine-2.10.colortext/pith/mailview.c -*** alpine-2.10/pith/mailview.c 2013-01-11 17:43:09.000000000 -0700 ---- alpine-2.10.colortext/pith/mailview.c 2013-01-11 20:43:16.000000000 -0700 -*************** -*** 282,287 **** ---- 282,295 ---- - if((flgs & FM_DISPLAY) - && !(flgs & FM_NOCOLOR) - && pico_usingcolor() -+ && ps_global->VAR_SPECIAL_TEXT_FORE_COLOR -+ && ps_global->VAR_SPECIAL_TEXT_BACK_COLOR){ -+ gf_link_filter(gf_line_test, gf_line_test_opt(color_this_text, NULL)); -+ } -+ -+ if((flgs & FM_DISPLAY) -+ && !(flgs & FM_NOCOLOR) -+ && pico_usingcolor() - && ps_global->VAR_SIGNATURE_FORE_COLOR - && ps_global->VAR_SIGNATURE_BACK_COLOR){ - gf_link_filter(gf_line_test, gf_line_test_opt(color_signature, &is_in_sig)); -*************** -*** 2503,2508 **** ---- 2511,2700 ---- - return(color_pair); - } - -+ void -+ interval_free(IVAL_S **ival) -+ { -+ if (!(*ival)) -+ return; -+ -+ if ((*ival)->next) -+ interval_free(&((*ival)->next)); -+ -+ fs_give((void **)(ival)); -+ } -+ -+ IVAL_S * -+ compute_interval (char *string, int endm) -+ { -+ IVAL_S *ival = NULL; -+ regmatch_t pmatch; -+ -+ if(ps_global->paterror == 0 && -+ regexec(&ps_global->colorpat, string + endm, 1, &pmatch, 0) == 0){ -+ ival = (IVAL_S *) fs_get(sizeof(IVAL_S)); -+ ival->start = endm + pmatch.rm_so; -+ ival->end = endm + pmatch.rm_eo; -+ ival->next = compute_interval(string, ival->end); -+ } -+ return ival; -+ } -+ -+ void -+ regex_pattern(char **plist) -+ { -+ int i = 0, j = 0, len = 0; -+ char *pattern = NULL; -+ regex_t preg; -+ -+ if(ps_global->paterror == 0) -+ regfree(&ps_global->colorpat); -+ -+ if(plist && *plist && *plist){ -+ for (i = 0; plist[i] && plist[i][0]; i++) -+ len += strlen(plist[i]) + 1; -+ pattern = (char *) fs_get(len * sizeof(char)); -+ *pattern = '\0'; -+ for (j = 0; j < i; j++){ -+ strcat(pattern, plist[j]); -+ strcat(pattern, (j < i - 1) ? "|" : ""); -+ } -+ if ((ps_global->paterror = regcomp(&preg, pattern, REG_EXTENDED)) != 0) -+ regfree(&preg); -+ else -+ ps_global->colorpat = preg; -+ } -+ if(pattern) -+ fs_give((void **)&pattern); -+ } -+ -+ LT_INS_S ** -+ insert_color_special_text(LT_INS_S **ins, char **p, IVAL_S *ival, int last_end, -+ COLOR_PAIR *col) -+ { -+ struct variable *vars = ps_global->vars; -+ -+ if (ival){ -+ *p += ival->start - last_end; -+ ins = gf_line_test_new_ins(ins, *p, color_embed(col->fg, col->bg), -+ (2 * RGBLEN) + 4); -+ *p += ival->end - ival->start; -+ ins = gf_line_test_new_ins(ins, *p, color_embed(VAR_NORM_FORE_COLOR, -+ VAR_NORM_BACK_COLOR), (2 * RGBLEN) + 4); -+ ins = insert_color_special_text(ins, p, ival->next, ival->end, col); +--- + alpine/confscroll.c | 3 + pith/conf.c | 14 +++ + pith/conf.h | 4 + + pith/conftype.h | 3 + pith/mailview.c | 192 ++++++++++++++++++++++++++++++++++++++++++++++++++++ + pith/mailview.h | 15 ++++ + pith/pine.hlp | 63 +++++++++++++++++ + pith/state.c | 3 + pith/state.h | 2 + pith/text.c | 9 ++ + 10 files changed, 308 insertions(+) + +Index: alpine-2.11/alpine/confscroll.c +=================================================================== +--- alpine-2.11.orig/alpine/confscroll.c ++++ alpine-2.11/alpine/confscroll.c +@@ -5183,6 +5183,9 @@ fix_side_effects(struct pine *ps, struct + + clear_index_cache(ps->mail_stream, 0); + } ++ else if(var == &ps->vars[V_SPECIAL_TEXT]){ ++ regex_pattern(ps->VAR_SPECIAL_TEXT); + } -+ return ins; -+ } -+ -+ int -+ length_color(char *p, int begin_color) -+ { -+ int len = 0, done = begin_color ? 0 : -1; + else if(var == &ps->vars[V_INIT_CMD_LIST]){ + if(!revert) + q_status_message(SM_ASYNC, 0, 3, +Index: alpine-2.11/pith/conf.c +=================================================================== +--- alpine-2.11.orig/pith/conf.c ++++ alpine-2.11/pith/conf.c +@@ -228,6 +228,8 @@ CONF_TXT_T cf_text_deadlets[] = "Specif + + CONF_TXT_T cf_text_fillcol[] = "Specifies the column of the screen where the composer should wrap."; + ++CONF_TXT_T cf_special_text_color[] = "Specifies a comma separated list of text and regular expresions that Pine\n# will highlight"; ++ + CONF_TXT_T cf_text_replystr[] = "Specifies the string to insert when replying to a message."; + + CONF_TXT_T cf_text_quotereplstr[] = "Specifies the string to replace quotes with when viewing a message."; +@@ -560,6 +562,8 @@ static struct variable variables[] = { + NULL, cf_text_speller}, + {"composer-wrap-column", 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, + NULL, cf_text_fillcol}, ++{"special-text-color", 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, ++ NULL, cf_special_text_color}, + {"reply-indent-string", 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, + NULL, cf_text_replystr}, + {"reply-leadin", 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, +@@ -817,6 +821,8 @@ static struct variable variables[] = { + {"incoming-unseen-background-color", 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0}, + {"signature-foreground-color", 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0}, + {"signature-background-color", 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0}, ++{"special-text-foreground-color", 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0}, ++{"special-text-background-color", 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0}, + {"prompt-foreground-color", 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0}, + {"prompt-background-color", 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0}, + {"header-general-foreground-color", 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0}, +@@ -1985,6 +1991,8 @@ init_vars(struct pine *ps, void (*cmds_f + set_current_val(&vars[V_FORM_FOLDER], TRUE, TRUE); + set_current_val(&vars[V_EDITOR], TRUE, TRUE); + set_current_val(&vars[V_SPELLER], TRUE, TRUE); ++ set_current_val(&vars[V_SPECIAL_TEXT], TRUE, TRUE); ++ regex_pattern(VAR_SPECIAL_TEXT); + set_current_val(&vars[V_IMAGE_VIEWER], TRUE, TRUE); + set_current_val(&vars[V_BROWSER], TRUE, TRUE); + set_current_val(&vars[V_SMTP_SERVER], TRUE, TRUE); +@@ -6483,6 +6491,7 @@ set_current_color_vals(struct pine *ps) + set_color_val(&vars[V_IND_OP_FORE_COLOR], 0); + set_color_val(&vars[V_INCUNSEEN_FORE_COLOR], 0); + set_color_val(&vars[V_SIGNATURE_FORE_COLOR], 0); ++ set_color_val(&vars[V_SPECIAL_TEXT_FORE_COLOR], 0); + + set_current_val(&ps->vars[V_INDEX_TOKEN_COLORS], TRUE, TRUE); + set_current_val(&ps->vars[V_VIEW_HDR_COLORS], TRUE, TRUE); +@@ -7664,6 +7673,8 @@ config_help(int var, int feature) + return(h_config_scroll_margin); + case V_DEADLETS : + return(h_config_deadlets); ++ case V_SPECIAL_TEXT : ++ return(h_config_special_text_to_color); + case V_FILLCOL : + return(h_config_composer_wrap_column); + case V_TCPOPENTIMEO : +@@ -7829,6 +7840,9 @@ config_help(int var, int feature) + case V_SIGNATURE_FORE_COLOR : + case V_SIGNATURE_BACK_COLOR : + return(h_config_signature_color); ++ case V_SPECIAL_TEXT_FORE_COLOR : ++ case V_SPECIAL_TEXT_BACK_COLOR : ++ return(h_config_special_text_color); + case V_PROMPT_FORE_COLOR : + case V_PROMPT_BACK_COLOR : + return(h_config_prompt_color); +Index: alpine-2.11/pith/conf.h +=================================================================== +--- alpine-2.11.orig/pith/conf.h ++++ alpine-2.11/pith/conf.h +@@ -161,6 +161,8 @@ + #define GLO_EDITOR vars[V_EDITOR].global_val.l + #define VAR_SPELLER vars[V_SPELLER].current_val.p + #define GLO_SPELLER vars[V_SPELLER].global_val.p ++#define VAR_SPECIAL_TEXT vars[V_SPECIAL_TEXT].current_val.l ++#define GLO_SPECIAL_TEXT vars[V_SPECIAL_TEXT].global_val.l + #define VAR_FILLCOL vars[V_FILLCOL].current_val.p + #define GLO_FILLCOL vars[V_FILLCOL].global_val.p + #define VAR_DEADLETS vars[V_DEADLETS].current_val.p +@@ -456,6 +458,8 @@ + #define GLO_SIGNATURE_FORE_COLOR vars[V_SIGNATURE_FORE_COLOR].global_val.p + #define VAR_SIGNATURE_BACK_COLOR vars[V_SIGNATURE_BACK_COLOR].current_val.p + #define GLO_SIGNATURE_BACK_COLOR vars[V_SIGNATURE_BACK_COLOR].global_val.p ++#define VAR_SPECIAL_TEXT_FORE_COLOR vars[V_SPECIAL_TEXT_FORE_COLOR].current_val.p ++#define VAR_SPECIAL_TEXT_BACK_COLOR vars[V_SPECIAL_TEXT_BACK_COLOR].current_val.p + #define VAR_PROMPT_FORE_COLOR vars[V_PROMPT_FORE_COLOR].current_val.p + #define VAR_PROMPT_BACK_COLOR vars[V_PROMPT_BACK_COLOR].current_val.p + #define VAR_VIEW_HDR_COLORS vars[V_VIEW_HDR_COLORS].current_val.l +Index: alpine-2.11/pith/conftype.h +=================================================================== +--- alpine-2.11.orig/pith/conftype.h ++++ alpine-2.11/pith/conftype.h +@@ -80,6 +80,7 @@ typedef enum { V_PERSONAL_NAME = 0 + , V_EDITOR + , V_SPELLER + , V_FILLCOL ++ , V_SPECIAL_TEXT + , V_REPLY_STRING + , V_REPLY_INTRO + , V_QUOTE_REPLACE_STRING +@@ -230,6 +231,8 @@ typedef enum { V_PERSONAL_NAME = 0 + , V_INCUNSEEN_BACK_COLOR + , V_SIGNATURE_FORE_COLOR + , V_SIGNATURE_BACK_COLOR ++ , V_SPECIAL_TEXT_FORE_COLOR ++ , V_SPECIAL_TEXT_BACK_COLOR + , V_PROMPT_FORE_COLOR + , V_PROMPT_BACK_COLOR + , V_HEADER_GENERAL_FORE_COLOR +Index: alpine-2.11/pith/mailview.c +=================================================================== +--- alpine-2.11.orig/pith/mailview.c ++++ alpine-2.11/pith/mailview.c +@@ -282,6 +282,14 @@ format_body(long int msgno, BODY *body, + if((flgs & FM_DISPLAY) + && !(flgs & FM_NOCOLOR) + && pico_usingcolor() ++ && ps_global->VAR_SPECIAL_TEXT_FORE_COLOR ++ && ps_global->VAR_SPECIAL_TEXT_BACK_COLOR){ ++ gf_link_filter(gf_line_test, gf_line_test_opt(color_this_text, NULL)); ++ } ++ ++ if((flgs & FM_DISPLAY) ++ && !(flgs & FM_NOCOLOR) ++ && pico_usingcolor() + && ps_global->VAR_SIGNATURE_FORE_COLOR + && ps_global->VAR_SIGNATURE_BACK_COLOR){ + gf_link_filter(gf_line_test, gf_line_test_opt(color_signature, &is_in_sig)); +@@ -2503,6 +2511,190 @@ hdr_color(char *fieldname, char *value, + return(color_pair); + } + ++void ++interval_free(IVAL_S **ival) ++{ ++ if (!(*ival)) ++ return; ++ ++ if ((*ival)->next) ++ interval_free(&((*ival)->next)); ++ ++ fs_give((void **)(ival)); ++} ++ ++IVAL_S * ++compute_interval (char *string, int endm) ++{ ++ IVAL_S *ival = NULL; ++ regmatch_t pmatch; ++ ++ if(ps_global->paterror == 0 && ++ regexec(&ps_global->colorpat, string + endm, 1, &pmatch, 0) == 0){ ++ ival = (IVAL_S *) fs_get(sizeof(IVAL_S)); ++ ival->start = endm + pmatch.rm_so; ++ ival->end = endm + pmatch.rm_eo; ++ ival->next = compute_interval(string, ival->end); ++ } ++ return ival; ++} ++ ++void ++regex_pattern(char **plist) ++{ ++ int i = 0, j = 0, len = 0; ++ char *pattern = NULL; ++ regex_t preg; ++ ++ if(ps_global->paterror == 0) ++ regfree(&ps_global->colorpat); ++ ++ if(plist && *plist && *plist){ ++ for (i = 0; plist[i] && plist[i][0]; i++) ++ len += strlen(plist[i]) + 1; ++ pattern = (char *) fs_get(len * sizeof(char)); ++ *pattern = '\0'; ++ for (j = 0; j < i; j++){ ++ strcat(pattern, plist[j]); ++ strcat(pattern, (j < i - 1) ? "|" : ""); ++ } ++ if ((ps_global->paterror = regcomp(&preg, pattern, REG_EXTENDED)) != 0) ++ regfree(&preg); ++ else ++ ps_global->colorpat = preg; ++ } ++ if(pattern) ++ fs_give((void **)&pattern); ++} ++ ++LT_INS_S ** ++insert_color_special_text(LT_INS_S **ins, char **p, IVAL_S *ival, int last_end, ++ COLOR_PAIR *col) ++{ ++ struct variable *vars = ps_global->vars; ++ ++ if (ival){ ++ *p += ival->start - last_end; ++ ins = gf_line_test_new_ins(ins, *p, color_embed(col->fg, col->bg), ++ (2 * RGBLEN) + 4); ++ *p += ival->end - ival->start; ++ ins = gf_line_test_new_ins(ins, *p, color_embed(VAR_NORM_FORE_COLOR, ++ VAR_NORM_BACK_COLOR), (2 * RGBLEN) + 4); ++ ins = insert_color_special_text(ins, p, ival->next, ival->end, col); ++ } ++ return ins; ++} ++ ++int ++length_color(char *p, int begin_color) ++{ ++ int len = 0, done = begin_color ? 0 : -1; ++ char *orig = p; ++ ++ while (*p && done <= 0){ ++ switch(*p++){ ++ case TAG_HANDLE : ++ p += *p + 1; ++ done++; ++ break; ++ ++ case TAG_FGCOLOR : ++ case TAG_BGCOLOR : ++ p += RGBLEN; ++ if (!begin_color) ++ done++; ++ break; ++ ++ default : ++ break; ++ } ++ } ++ len = p - orig; ++ return len; ++} ++ ++int ++any_color_in_string(char *p) ++{ ++ int rv = 0; + char *orig = p; -+ -+ while (*p && done <= 0){ -+ switch(*p++){ -+ case TAG_HANDLE : -+ p += *p + 1; -+ done++; -+ break; -+ -+ case TAG_FGCOLOR : -+ case TAG_BGCOLOR : -+ p += RGBLEN; -+ if (!begin_color) -+ done++; -+ break; -+ -+ default : -+ break; -+ } ++ while (*p && !rv) ++ if (*p++ == TAG_EMBED) ++ rv = p - orig; ++ return rv; ++} ++ ++void ++remove_spaces_ival(IVAL_S **ivalp, char *p) ++{ ++ IVAL_S *ival; ++ int i; ++ if (!ivalp || !*ivalp) ++ return; ++ ival = *ivalp; ++ for (i = 0; isspace((unsigned char) p[ival->start + i]); i++); ++ if (ival->start + i < ival->end) /* do not do this if match only spaces */ ++ ival->start += i; ++ else ++ return; ++ for (i = 0; isspace((unsigned char) p[ival->end - i - 1]); i++); ++ ival->end -= i; ++ if (ival->next) ++ remove_spaces_ival(&(ival->next), p); ++} ++ ++int ++color_this_text(long linenum, char *line, LT_INS_S **ins, void *local) ++{ ++ struct variable *vars = ps_global->vars; ++ COLOR_PAIR *col = NULL; ++ char *p; ++ int i = 0; ++ static char *pattern = NULL; ++ ++/* select_quote(linenum, line, ins, (void *) &i); ++ for (i = 0; tmp_20k_buf[i] != '\0'; i++); */ ++ p = line + i; ++ ++ if(VAR_SPECIAL_TEXT_FORE_COLOR && VAR_SPECIAL_TEXT_BACK_COLOR ++ && (col = new_color_pair(VAR_SPECIAL_TEXT_FORE_COLOR, ++ VAR_SPECIAL_TEXT_BACK_COLOR)) ++ && !pico_is_good_colorpair(col)) ++ free_color_pair(&col); ++ ++ if(ps_global->VAR_SPECIAL_TEXT && *ps_global->VAR_SPECIAL_TEXT ++ && **ps_global->VAR_SPECIAL_TEXT && col){ ++ IVAL_S *ival; ++ int done = 0, begin_color = 0; ++ ++ while (!done){ ++ if (i = any_color_in_string(p)){ ++ begin_color = (begin_color + 1) % 2; ++ if (begin_color){ ++ p[i - 1] = '\0'; ++ ival = compute_interval(p, 0); ++ remove_spaces_ival(&ival, p); ++ p[i - 1] = TAG_EMBED; ++ ins = insert_color_special_text(ins, &p, ival, 0, col); ++ } ++ for (;*p++ != TAG_EMBED; ); ++ p += length_color(p, begin_color); ++ } ++ else{ ++ ival = compute_interval(p, 0); ++ remove_spaces_ival(&ival, p); ++ ins = insert_color_special_text(ins, &p, ival, 0, col); ++ done++; ++ } ++ interval_free(&ival); ++ if (!*p) ++ done++; ++ } ++ free_color_pair(&col); + } -+ len = p - orig; -+ return len; -+ } -+ -+ int -+ any_color_in_string(char *p) -+ { -+ int rv = 0; -+ char *orig = p; -+ while (*p && !rv) -+ if (*p++ == TAG_EMBED) -+ rv = p - orig; -+ return rv; -+ } -+ -+ void -+ remove_spaces_ival(IVAL_S **ivalp, char *p) -+ { -+ IVAL_S *ival; -+ int i; -+ if (!ivalp || !*ivalp) -+ return; -+ ival = *ivalp; -+ for (i = 0; isspace((unsigned char) p[ival->start + i]); i++); -+ if (ival->start + i < ival->end) /* do not do this if match only spaces */ -+ ival->start += i; -+ else -+ return; -+ for (i = 0; isspace((unsigned char) p[ival->end - i - 1]); i++); -+ ival->end -= i; -+ if (ival->next) -+ remove_spaces_ival(&(ival->next), p); -+ } -+ -+ int -+ color_this_text(long linenum, char *line, LT_INS_S **ins, void *local) -+ { -+ struct variable *vars = ps_global->vars; -+ COLOR_PAIR *col = NULL; -+ char *p; -+ int i = 0; -+ static char *pattern = NULL; -+ -+ /* select_quote(linenum, line, ins, (void *) &i); -+ for (i = 0; tmp_20k_buf[i] != '\0'; i++); */ -+ p = line + i; -+ -+ if(VAR_SPECIAL_TEXT_FORE_COLOR && VAR_SPECIAL_TEXT_BACK_COLOR -+ && (col = new_color_pair(VAR_SPECIAL_TEXT_FORE_COLOR, -+ VAR_SPECIAL_TEXT_BACK_COLOR)) -+ && !pico_is_good_colorpair(col)) -+ free_color_pair(&col); -+ -+ if(ps_global->VAR_SPECIAL_TEXT && *ps_global->VAR_SPECIAL_TEXT -+ && **ps_global->VAR_SPECIAL_TEXT && col){ -+ IVAL_S *ival; -+ int done = 0, begin_color = 0; -+ -+ while (!done){ -+ if (i = any_color_in_string(p)){ -+ begin_color = (begin_color + 1) % 2; -+ if (begin_color){ -+ p[i - 1] = '\0'; -+ ival = compute_interval(p, 0); -+ remove_spaces_ival(&ival, p); -+ p[i - 1] = TAG_EMBED; -+ ins = insert_color_special_text(ins, &p, ival, 0, col); -+ } -+ for (;*p++ != TAG_EMBED; ); -+ p += length_color(p, begin_color); -+ } -+ else{ -+ ival = compute_interval(p, 0); -+ remove_spaces_ival(&ival, p); -+ ins = insert_color_special_text(ins, &p, ival, 0, col); -+ done++; -+ } -+ interval_free(&ival); -+ if (!*p) -+ done++; -+ } -+ free_color_pair(&col); -+ } -+ -+ return 0; -+ } - - /* - * The argument fieldname is something like "Subject:..." or "Subject". -diff -rc alpine-2.10/pith/mailview.h alpine-2.10.colortext/pith/mailview.h -*** alpine-2.10/pith/mailview.h 2013-01-11 11:26:44.000000000 -0700 ---- alpine-2.10.colortext/pith/mailview.h 2013-01-11 20:43:16.000000000 -0700 -*************** -*** 30,35 **** ---- 30,41 ---- - #include "../pith/color.h" - - -+ typedef struct IVAL { -+ int start; -+ int end; -+ struct IVAL *next; -+ } IVAL_S; -+ - /* format_message flags */ - #define FM_DISPLAY 0x0001 /* result is headed for display */ - #define FM_NEW_MESS 0x0002 /* a new message so zero out attachment descrip */ -*************** -*** 126,131 **** ---- 132,146 ---- - int url_hilite(long, char *, LT_INS_S **, void *); - int handle_start_color(char *, size_t, int *, int); - int handle_end_color(char *, size_t, int *); -+ IVAL_S *compute_interval(char *, int); -+ void remove_spaces_ival(IVAL_S **, char *); -+ void interval_free(IVAL_S **); -+ void regex_pattern(char **); -+ LT_INS_S **insert_color_special_text(LT_INS_S **, char **, IVAL_S *, -+ int, COLOR_PAIR *); -+ int any_color_in_string(char *); -+ int length_color(char *, int); -+ int color_this_text(long, char *, LT_INS_S **, void *); - - /* - * BUG: BELOW IS UNIX/PC ONLY since config'd browser means nothing to webpine -diff -rc alpine-2.10/pith/pine.hlp alpine-2.10.colortext/pith/pine.hlp -*** alpine-2.10/pith/pine.hlp 2013-01-11 20:33:27.000000000 -0700 ---- alpine-2.10.colortext/pith/pine.hlp 2013-01-11 20:43:16.000000000 -0700 -*************** -*** 3517,3522 **** ---- 3517,3523 ---- -