/MirOS/dist/jupp/joe-3.1jupp23.tgz jupp-3_1_23
authorThorsten Glaser <tg@mirbsd.org>
Sun, 30 Dec 2012 22:22:29 +0000 (22:22 +0000)
committerThorsten Glaser <tg@mirbsd.org>
Sun, 30 Dec 2012 22:22:29 +0000 (22:22 +0000)
46 files changed:
LIST
NEWS
TODO
b.c
builtins.c
bw.c
cmd.c
configure
configure.ac
help.c
help.h
jmacsrc.in
joe.1.in
joe.txt
joerc.in
jpicorc.in
jstarrc.in
jupprc
macro.c
main.c
main.h
menu.c
path.c
rc.c
rc.h
regex.c
rjoerc.in
scrn.c
scrn.h
selinux.c
syntax.c
syntax/python.jsf.in
termcap.c
tty.c
tty.h
types.h
ublock.c
ufile.c
umath.c
umath.h
usearch.c
ushell.c
ushell.h
vs.c
w.c
w.h

diff --git a/LIST b/LIST
index f55a674..4523866 100644 (file)
--- a/LIST
+++ b/LIST
@@ -1,4 +1,4 @@
-$MirOS: contrib/code/jupp/LIST,v 1.4 2009/08/02 15:24:57 tg Exp $
+$MirOS: contrib/code/jupp/LIST,v 1.7 2012/12/30 21:45:11 tg Exp $
 -----------------------------------------------------------------
 
 Joe commands grouped by function
@@ -141,6 +141,7 @@ rindent             Indent to the right
 Help
 ----
 help           Turn help on or off
+helpcard       Turn help on at selected screen
 hnext          Switch to next help screen
 hprev          Switch to previous help screen
 
@@ -179,7 +180,10 @@ Misc
 ----
 beep           Beep
 execmd         Execute a joe command
+keymap         Switch keymap
 math           Calculator
+mathins                Insert last math expression
+mathres                Insert last math result
 mode           Mode prompt
 msg            Display a message
 notmod         Clear the modified flag
diff --git a/NEWS b/NEWS
index 26d98e1..ff8eb74 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,6 +1,27 @@
-$MirOS: contrib/code/jupp/NEWS,v 1.56 2012/09/02 14:46:49 tg Exp $
+$MirOS: contrib/code/jupp/NEWS,v 1.71 2012/12/30 21:45:11 tg Exp $
 ------------------------------------------------------------------
 
+JOE 3.1jupp23
+
+- Overhaul and harmonise syntax detection and editor defaults
+  across all six *rc files (except jupp continues having no
+  wordwrap by default and now disables guess_indent except in
+  *.txt files); improve shell/mail wildcards; recognise a lot
+  more diff files by pathname or content patterns
+- Recognise more Python keywords in syntax highlighting
+  (patch contributed by Eike Jesinghaus)
+- Allow building against bionic libc (for Android)
+- Securely make backup files using mkstemp(3), thanks Han Boetes
+- Print math results more precisely; if possible, as integer
+- Permit hexadecimal input in math expressions
+- Hook up GOTO “byte” offset command as ^QO, “col”umn as ^Q- and
+  scratch+præfix as ^K- in jupprc
+- ^KE no longer trashes buffers cloned by ^KO and ^K; needs not split
+- jupp: ^[# inserts last math equation; ^[= its result
+- Use ${SHELL:-${EXECSHELL:-/bin/sh}} for all shells and check access
+- After ^KR, the current position is before and ^QP after the insertion
+- ^[p and xterm-xfree86 paste mode (automatic in the latter)
+
 JOE 3.1jupp22
 
 - Fix ternary operator PHP syntax highlighting hiccup
diff --git a/TODO b/TODO
index 4d4a2b8..9746a04 100644 (file)
--- a/TODO
+++ b/TODO
@@ -345,9 +345,7 @@ jstar missing sequences
 ^U undo (supossed to be unerase)
 ^^ autoindent on/off
 ^\ meta (supposed to be refresh screen)
-ESC =  insert math result
 ESC $  insert math result money formatted
-ESC #  insert math equation
 ESC m  Memorandum
 ESC s  isearch fwrd (supposed to be Sincerely)
 ESC c  compile (supposed to be center line)
@@ -480,9 +478,10 @@ New features:
     - there are many references to '\t' and ' '.
     - EBCDIC used to be fixed record length (80 columns) anyway.
 
-Math: hex, octal more functions. (-lm?)
+Math: octal(?), more functions. (-lm?)
 
 Perl compatible regex search.
+(Ugh. But grouping lile \+\(foo\+ \) would be cool.)
 
 Improvements for regular text
 -----------------------------
@@ -605,15 +604,21 @@ Mouse:
 
  ` and autoindent mode are a problem for drag and drop.
  any way we can distinguish normal typing from a drop?
- modify xterm...
+
+ xterm can actually do that: it's called bracketed paste mode:
+ you send ^[ [ ? 2 0 0 4 h then any pastes you receive begin
+ with ^[ [ 2 0 0 ~ and end with ^[ [ 2 0 1 ~ until you send
+ ^[ [ ? 2 0 0 4 l but it only works with recent xterm and, while
+ you can wrap the requests between ^[ P and ^[ \ to make them
+ pass GNU screen it would wreck havoc with the other tabs, so
+ we make this conditional on $TERM being xterm-xfree86 offering
+ a generic paste mode in addition via :paste keymap
 
  mouse mode: mouse can position cursor.  Would be good for
  jcua...
 
 Major new modes:
 
- Hex edit mode
-
  Fixed record length mode
 
 
@@ -645,6 +650,8 @@ Other requests:
 └───────────┘
 
 • merge syntax handling code from joe-3.7+
+• merge math from joe-3.7+
+• add group support to regex code
 • make -Wcast-qual clean
 • write a jupp(1) mdoc page
 • use mirkev (better code for hashtables)
@@ -654,4 +661,4 @@ Other requests:
 • …
 
 __________________________________________________________________
-$MirOS: contrib/code/jupp/TODO,v 1.11 2012/09/02 14:15:23 tg Exp $
+$MirOS: contrib/code/jupp/TODO,v 1.15 2012/12/30 21:45:12 tg Exp $
diff --git a/b.c b/b.c
index ec5e47c..e30c6d8 100644 (file)
--- a/b.c
+++ b/b.c
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/b.c,v 1.10 2012/06/07 22:16:08 tg Exp $ */
+/* $MirOS: contrib/code/jupp/b.c,v 1.11 2012/12/22 00:06:09 tg Exp $ */
 /*
  *     Editor engine
  *     Copyright
@@ -1810,6 +1810,11 @@ static H *bldchn(unsigned char *blk, int size, long *nlines)
        } while (size);
        l = anchor.link.next;
        deque(H, link, &anchor);
+#ifdef CLANG_SCAN_BUILD
+       /* this can only be fixed properly by using ({ … }) in queue.h */
+       ITEM = NULL;
+       QUEUE = NULL;
+#endif
        return l;
 }
 
index a0f9f51..877d604 100644 (file)
@@ -1,6 +1,10 @@
 /* Built-in files */
 
-/* while IFS= read -r x; do x=${x//\\/\\\\}; print -r -- $'\t\t'\""${x//\"/\\\"}\n"\"; done */
+/*
+       <jupprc grep -v $'^[\t ]' | while IFS= read -r x; do
+               x=${x//\\/\\\\}; print -r -- $'\t\t'\""${x//\"/\\\"}\n"\";
+       done | perl -pi -e 's/[^\ca-~]/sprintf "\\x%02X", unpack("U", $&)/eg'
+ */
 
 #include "types.h"
 
@@ -16,6 +20,7 @@ const unsigned char * const builtins[]=
                "-nobackups\n"
                "-noxon\n"
                "-notite\n"
+               "-pastetite\n"
                "-pg 2\n"
                "-lmsg \\i%k%T%*\\b%n\\b%R\n"
                "-rmsg  R%r<%l C%c\\u%o|%O\\i\\b%a|%A\\b\\i\\u %u\n"
@@ -24,7 +29,7 @@ const unsigned char * const builtins[]=
                "-french\n"
                "-indentc 9\n"
                "-istep 1\n"
-               "-guess_indent\n"
+               "--guess_indent\n"
                "--autoindent\n"
                "-purify\n"
                "-highlight\n"
@@ -72,36 +77,41 @@ const unsigned char * const builtins[]=
                "\\i \\i^F next word     ^QD end of line  ^K/ pipe ^QY >line ^O  options  \\u\\bFILE\\b\\u       \\i \\i\n"
                "\\i \\i\\u\\bSEARCH\\b\\u           ^QR top of file  ^KB begin          \\u\\bBUFFER\\b\\u       ^KE new    \\i \\i\n"
                "\\i \\i^QF find first   ^QC end of file  ^KK end  ^K] space ^U undo      ^KR import \\i \\i\n"
-               "\\i \\i^L  find next    ^QI to line No.  ^KD reformat       ^^ redo      ^KW export \\i \\i\n"
+               "\\i \\i^L  find next    ^QO byte offset  ^KD reformat       ^^ redo      ^KW export \\i \\i\n"
                "}\n"
                "\n"
                "{Windows\n"
                "\\i   Help Screen    turn off with ^J     prev. screen ^[,    next screen ^[.     \\i\n"
-               "\\i \\i^KO Split the window in half         ^KE Load file into window               \\i \\i\n"
+               "\\i \\i^KO Split the window in half         ^KE Load file into new window           \\i \\i\n"
                "\\i \\i^KG Make current window bigger       ^KT Make current window smaller         \\i \\i\n"
                "\\i \\i^KN Go to the window below           ^KP Go to the window above              \\i \\i\n"
                "\\i \\i^KQ Eliminate the current window     ^KI Show all windows / Show one window  \\i \\i\n"
+               "\\i \\i^K; Do ctags search into new window  ^K- Edit scratch buffer in new window   \\i \\i\n"
+               "\\i \\i Note: some commands (^KE ^K; ^K-) hide the current window. Use ^KI/^KN then.\\i \\i\n"
                "\\i \\i\\u\\bSpecial help for XON/XOFF aware terminals\\b\\u                                    \\i \\i\n"
                "\\i \\i You can use \\b^[q\\b and \\b^[s\\b instead of \\b^Q\\b and \\b^S\\b to initiate a command.         \\i \\i\n"
                "}\n"
                "\n"
                "{Advanced\n"
                "\\i   Help Screen    turn off with ^J     prev. screen ^[,    next screen ^[.     \\i\n"
-               "\\i \\i\\u\\bMACROS\\b\\u      \\u\\bMISC\\b\\u          \\u\\bSCROLL\\b\\u      \\u\\bSHELL\\b\\u       \\u\\bGOTO\\b\\u        \\u\\bI-SEARCH\\b\\u       \\i \\i\n"
-               "\\i \\i^[( Record  ^Q? status    ^Q. Right   ^K' Window  ^QB to ^KB  ^[R Backwards  \\i \\i\n"
-               "\\i \\i^[) Stop    ^QQ repeat    ^Q, Left    ^[! Command ^QK to ^KK  ^[S Forwards   \\i \\i\n"
-               "\\i \\i^[ 0-9 Play ^QM Math      \\u\\bCharSEARCH\\b\\u  \\u\\bQUOTE\\b\\u       \\u\\bDELETE\\b\\u      \\u\\bBOOKMARKS\\b\\u      \\i \\i\n"
-               "\\i \\i^[? Query   ^KA CenterLn. ^QH forwrd   ` Ctrl-    ^[Y yank    ^K 0-9 Set     \\i \\i\n"
-               "\\i \\i^[D Dump    ^[H Message   ^QG backwd  ^P Meta-    ^[O word<   ^Q 0-9 Goto    \\i \\i\n"
+               "\\i \\i\\u\\bMACROS\\b\\u       \\u\\bMISC\\b\\u         \\u\\bSCROLL\\b\\u      \\u\\bSHELL\\b\\u       \\u\\bGOTO\\b\\u        \\u\\bI-SEARCH\\b\\u       \\i \\i\n"
+               "\\i \\i^[( Record   ^Q? status   ^Q. Right   ^K' Window  ^QB to ^KB  ^[R Backwards  \\i \\i\n"
+               "\\i \\i^[) Stop     ^QQ repeat   ^Q, Left    ^[! Command ^QK to ^KK  ^[S Forwards   \\i \\i\n"
+               "\\i \\i^[? Query    ^QM Math     \\u\\bCharSEARCH\\b\\u  \\u\\bQUOTE\\b\\u       \\u\\bDELETE\\b\\u      \\u\\bBOOKMARKS\\b\\u      \\i \\i\n"
+               "\\i \\i^[D Dump     ^[H Message  ^QH forwrd   ` Ctrl-    ^[Y yank    ^K 0-9 Set     \\i \\i\n"
+               "\\i \\i^[ 0-9 Play  ^N  Play #0  ^QG backwd  ^P Meta-    ^[O word<   ^Q 0-9 Goto    \\i \\i\n"
+               "\\i \\i \\u\\bIn math mode\\b\\u, use 0xCAFE for hex. All ops are floating point internally.    \\i \\i\n"
+               "\\i \\i \\u\\bPredefined variables:\\b\\u byte col height line lines top width                  \\i \\i\n"
                "}\n"
                "\n"
                "{Programs\n"
                "\\i   Help Screen    turn off with ^J     prev. screen ^[,    next screen ^[.     \\i\n"
-               "\\i \\i\\u\\bGOTO\\b\\u                  \\u\\bINDENT\\b\\u         \\u\\bCOMPILING\\b\\u                   \\u\\bMACROS\\b\\u      \\i \\i\n"
-               "\\i \\i^Q[ Matching brace    ^K. more       ^[C Compile & parse errors  ^N play #0  \\i \\i\n"
-               "\\i \\i^QP Previous place    ^K, less       ^[E Parse errors            \\u\\bSLIDING\\b\\u     \\i \\i\n"
-               "\\i \\i^K= Next place        \\u\\bSPECIAL\\b\\u        ^[M Goto next error         ^W up       \\i \\i\n"
-               "\\i \\i^K; Split+Tag search  ^[- jexecmd    ^[N Goto previous error     ^Z down     \\i \\i\n"
+               "\\i \\i\\u\\bGOTO\\b\\u                  \\u\\bCOMPILING\\b\\u                    \\u\\bINDENT\\b\\u       \\u\\bSLIDING\\b\\u      \\i \\i\n"
+               "\\i \\i^Q- to column number  ^[C Compile & parse errors   ^K. more     ^W up        \\i \\i\n"
+               "\\i \\i^QI to line number    ^[E Parse errors             ^K, less     ^Z down      \\i \\i\n"
+               "\\i \\i^QP previous place    \\u\\bGOTO AFTER COMPILING\\b\\u         ^KA center   \\u\\bINSERT MATH\\b\\u  \\i \\i\n"
+               "\\i \\i^K= next place        ^[N previous error    \\u\\bSPECIAL\\b\\u             ^[# equation \\i \\i\n"
+               "\\i \\i^Q[ matching brace    ^[M next error        ^[- exec. juppcmd   ^[= result   \\i \\i\n"
                "}\n"
                "\n"
                "{Search\n"
@@ -135,7 +145,7 @@ const unsigned char * const builtins[]=
                "\\i \\i go to \\uhttp://sf.net/projects/joe-editor/\\u for upstream bug reports. JUPP 2.8 \\i \\i\n"
                "\\i \\i for DOS compiled by A. Totlis, packed with LHarc 2.13; JUPP 3.x for UNIX\\d(R)\\d \\i \\i\n"
                "\\i \\i at \\uhttp://mirbsd.de/jupp\\u and by \\bThorsten \"\\dmirabilos\\d\" Glaser <\\utg@mirbsd.org\\u>\\b \\i \\i\n"
-               "\\i \\i @(#) blt_in 2012-09-02; 3.1; autoCR-LF; UTF-8 via locale; per-file encoding \\i \\i\n"
+               "\\i \\i @(#) blt_in 2012-12-30; 3.1; autoCR-LF; UTF-8 via locale; per-file encoding \\i \\i\n"
                "}\n"
                "\n"
                "{CharTable\n"
@@ -144,16 +154,21 @@ const unsigned char * const builtins[]=
                "\\i \\i         |                                              |                    \\i \\i\n"
                "\\i \\i   0  00 | \\u@ABC\\u \\uDEFG\\u  \\uHIJK\\u \\uLMNO\\u    \\i\\u@ABC\\u\\i \\i\\uDEFG\\u\\i  \\i\\uHIJK\\u\\i \\i\\uLMNO\\u\\i | 80  128            \\i \\i\n"
                "\\i \\i  16  10 | \\uPQRS\\u \\uTUVW\\u  \\uXYZ[\\u \\u\\\\]^_\\u    \\i\\uPQRS\\u\\i \\i\\uTUVW\\u\\i  \\i\\uXYZ[\\u\\i \\i\\u\\\\]^_\\u\\i | 90  144            \\i \\i\n"
-               "\\i \\i  32  20 |  !\"# $%&'  ()*+ ,-./     ¡¢£ ¤¥¦§  ¨©ª« ¬­®¯ | A0  160            \\i \\i\n"
-               "\\i \\i  48  30 | 0123 4567  89:; <=>?    °±²³ ´µ¶·  ¸¹º» ¼½¾¿ | B0  176            \\i \\i\n"
-               "\\i \\i  64  40 | @ABC DEFG  HIJK LMNO    ÀÁÂàÄÅÆÇ  ÈÉÊË ÌÍÎÏ | C0  192            \\i \\i\n"
-               "\\i \\i  80  50 | PQRS TUVW  XYZ[ \\\\]^_    ÐÑÒÓ ÔÕÖ×  ØÙÚÛ ÜÝÞß | D0  208            \\i \\i\n"
-               "\\i \\i  96  60 | `abc defg  hijk lmno    àáâã äåæç  èéêë ìíîï | E0  224            \\i \\i\n"
-               "\\i \\i 112  70 | pqrs tuvw  xyz{ |}~\7f    ðñòó ôõö÷  øùúû üýþÿ | F0  240            \\i \\i\n"
+               "\\i \\i  32  20 |  !\"# $%&'  ()*+ ,-./    \xA0\xA1\xA2\xA3 \xA4\xA5\xA6\xA7  \xA8\xA9\xAA\xAB \xAC\xAD\xAE\xAF | A0  160            \\i \\i\n"
+               "\\i \\i  48  30 | 0123 4567  89:; <=>?    \xB0\xB1\xB2\xB3 \xB4\xB5\xB6\xB7  \xB8\xB9\xBA\xBB \xBC\xBD\xBE\xBF | B0  176            \\i \\i\n"
+               "\\i \\i  64  40 | @ABC DEFG  HIJK LMNO    \xC0\xC1\xC2\xC3 \xC4\xC5\xC6\xC7  \xC8\xC9\xCA\xCB \xCC\xCD\xCE\xCF | C0  192            \\i \\i\n"
+               "\\i \\i  80  50 | PQRS TUVW  XYZ[ \\\\]^_    \xD0\xD1\xD2\xD3 \xD4\xD5\xD6\xD7  \xD8\xD9\xDA\xDB \xDC\xDD\xDE\xDF | D0  208            \\i \\i\n"
+               "\\i \\i  96  60 | `abc defg  hijk lmno    \xE0\xE1\xE2\xE3 \xE4\xE5\xE6\xE7  \xE8\xE9\xEA\xEB \xEC\xED\xEE\xEF | E0  224            \\i \\i\n"
+               "\\i \\i 112  70 | pqrs tuvw  xyz{ |}~\x7F    \xF0\xF1\xF2\xF3 \xF4\xF5\xF6\xF7  \xF8\xF9\xFA\xFB \xFC\xFD\xFE\xFF | F0  240            \\i \\i\n"
+               "}\n"
+               "\n"
+               "{Paste\n"
+               "\\i                                                                               \\i\n"
+               "\\i \\i \\u\\bPaste Mode\\b\\u     turn off with \\b^D\\b or \\b^[[201~\\b                                  \\i \\i\n"
                "}\n"
                "\n"
                ":windows\n"
-               "type           ^@ TO ÿ\n"
+               "type           ^@ TO \xFF\n"
                "abort          ^K Q\n"
                "abort          ^K ^Q\n"
                "abort          ^K q\n"
@@ -172,6 +187,8 @@ const unsigned char * const builtins[]=
                "math           ^Q ^M\n"
                "math           ^Q m\n"
                "math           ^[ q m\n"
+               "mathins                ^[ #\n"
+               "mathres                ^[ =\n"
                "msg            ^[ H\n"
                "msg            ^[ h\n"
                "nextw          ^K N\n"
@@ -195,11 +212,21 @@ const unsigned char * const builtins[]=
                "shell          ^K z\n"
                "stop           ^[ )\n"
                "\n"
+               ":Paste\n"
+               "type                                   ^@ TO \xFF\n"
+               "rtn                                    ^M\n"
+               "msg,\"Entered bracketed paste mode\",rtn       ^[ [ 2 0 0 ~\n"
+               "helpcard,rtn,keymap,\"main\",rtn,msg,rtn       ^[ [ 2 0 1 ~\n"
+               "helpcard,rtn,keymap,\"main\",rtn               ^D\n"
+               "\n"
                ":main\n"
                ":inherit windows\n"
                "bof,qrepl,\"\\\\[\",quote,\"i\",quote,\"k\",quote,\"l\",quote,\"m ]\\\\+\\\\[\",quote,\"i\",quote,\"k\",quote,\"l\",quote,\"m ]\\\\$\",rtn,rtn,rtn,\"r\",eof   ^K ]\n"
                "edit,rtn,filt,query,parserr    ^[ C\n"
                "edit,rtn,filt,query,parserr    ^[ c\n"
+               "helpcard,\"Paste\",rtn,keymap,\"Paste\",rtn    ^[ P\n"
+               "helpcard,\"Paste\",rtn,keymap,\"Paste\",rtn    ^[ p\n"
+               "helpcard,\"Paste\",rtn,keymap,\"Paste\",rtn    ^[ [ 2 0 0 ~\n"
                "begin_marking,uparw,toggle_marking     ^[ [ 1 ; 2 A\n"
                "begin_marking,dnarw,toggle_marking     ^[ [ 1 ; 2 B\n"
                "begin_marking,rtarw,toggle_marking     ^[ [ 1 ; 2 C\n"
@@ -212,10 +239,10 @@ const unsigned char * const builtins[]=
                "backs          ^H\n"
                "backw          ^[ o\n"
                "bknd           ^K '\n"
-               "bkwdc          ^Q G ^@ TO ÿ\n"
-               "bkwdc          ^Q ^G ^@ TO ÿ\n"
-               "bkwdc          ^Q g ^@ TO ÿ\n"
-               "bkwdc          ^[ q g ^@ TO ÿ\n"
+               "bkwdc          ^Q G ^@ TO \xFF\n"
+               "bkwdc          ^Q ^G ^@ TO \xFF\n"
+               "bkwdc          ^Q g ^@ TO \xFF\n"
+               "bkwdc          ^[ q g ^@ TO \xFF\n"
                "blkcpy         ^K C\n"
                "blkcpy         ^K ^C\n"
                "blkcpy         ^K c\n"
@@ -245,9 +272,14 @@ const unsigned char * const builtins[]=
                "bos            ^Q ^X\n"
                "bos            ^Q x\n"
                "bos            ^[ q x\n"
+               "byte           ^Q O\n"
+               "byte           ^Q ^O\n"
+               "byte           ^Q o\n"
+               "byte           ^[ q o\n"
                "center         ^K A\n"
                "center         ^K ^A\n"
                "center         ^K a\n"
+               "col            ^Q -\n"
                "crawll         ^Q ,\n"
                "crawll         ^[ q ,\n"
                "crawlr         ^Q .\n"
@@ -303,10 +335,10 @@ const unsigned char * const builtins[]=
                "fnext          ^L\n"
                "fnext          ^[ [ 1 3 ~\n"
                "format         ^B\n"
-               "fwrdc          ^Q H ^@ TO ÿ\n"
-               "fwrdc          ^Q ^H ^@ TO ÿ\n"
-               "fwrdc          ^Q h ^@ TO ÿ\n"
-               "fwrdc          ^[ q h ^@ TO ÿ\n"
+               "fwrdc          ^Q H ^@ TO \xFF\n"
+               "fwrdc          ^Q ^H ^@ TO \xFF\n"
+               "fwrdc          ^Q h ^@ TO \xFF\n"
+               "fwrdc          ^[ q h ^@ TO \xFF\n"
                "gomark         ^Q 0 TO 9\n"
                "gomark         ^[ q 0 TO 9\n"
                "groww          ^K G\n"
@@ -383,6 +415,7 @@ const unsigned char * const builtins[]=
                "save           ^K S\n"
                "save           ^K ^S\n"
                "save           ^K s\n"
+               "scratch,\"(S) \"       ^K -\n"
                "setmark                ^K 0 TO 9\n"
                "shrinkw                ^K T\n"
                "shrinkw                ^K ^T\n"
@@ -390,9 +423,9 @@ const unsigned char * const builtins[]=
                "splitw         ^K O\n"
                "splitw         ^K ^O\n"
                "splitw         ^K o\n"
-               "splitw,tag     ^K ;\n"
                "stat           ^Q ?\n"
                "stat           ^[ q ?\n"
+               "tag            ^K ;\n"
                "tomarkb                ^Q B\n"
                "tomarkb                ^Q ^B\n"
                "tomarkb                ^Q b\n"
@@ -483,10 +516,10 @@ const unsigned char * const builtins[]=
                ":inherit windows\n"
                "\n"
                ":querya\n"
-               "type           ^@ TO ÿ\n"
+               "type           ^@ TO \xFF\n"
                "\n"
                ":querysr\n"
-               "type           ^@ TO ÿ\n"
+               "type           ^@ TO \xFF\n"
 ,      NULL
-,      "@(#) $MirOS: contrib/code/jupp/builtins.c,v 1.6 2012/09/02 14:46:50 tg Exp $"
+,      "@(#) $MirOS: contrib/code/jupp/builtins.c,v 1.15 2012/12/30 21:45:12 tg Exp $"
 };
diff --git a/bw.c b/bw.c
index 3f428b7..417fda5 100644 (file)
--- a/bw.c
+++ b/bw.c
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/bw.c,v 1.16 2012/07/18 16:46:03 tg Exp $ */
+/* $MirOS: contrib/code/jupp/bw.c,v 1.18 2012/12/30 21:45:12 tg Exp $ */
 /*
  *     Edit buffer window generation
  *     Copyright
@@ -52,7 +52,7 @@ static P *getto(P *p, P *cur, P *top, long int line)
                }
                d = (line >= top->line ? line - top->line : top->line - line);
                if (d < dist) {
-                       dist = d;
+                       /* dead store: dist = d; */
                        best = top;
                }
                p = pdup(best);
@@ -148,11 +148,9 @@ static void bwfllwt(BW *w)
                pset(w->top, newtop);
                prm(newtop);
        } else if (w->cursor->line >= w->top->line + w->h) {
-               newtop = pdup(w->top);
-               if (mid)
-                       newtop = getto(NULL, w->cursor, w->top, w->cursor->line - w->h / 2);
-               else
-                       newtop = getto(NULL, w->cursor, w->top, w->cursor->line - (w->h - 1));
+               pdup(w->top);
+               newtop = getto(NULL, w->cursor, w->top, w->cursor->line -
+                   (mid ? (w->h / 2) : (w->h - 1)));
                if (newtop->line - w->top->line < w->h)
                        nscrlup(w->t->t, w->y, w->y + w->h, (int) (newtop->line - w->top->line));
                else {
@@ -933,7 +931,7 @@ BW *bwmk(W *window, B *b, int prompt)
        }
        if (window == window->main) {
                rmkbd(window->kbd);
-               window->kbd = mkkbd(kmap_getcontext(w->o.context));
+               window->kbd = mkkbd(kmap_getcontext(w->o.context, 1));
        }
        w->top->xcol = 0;
        w->cursor->xcol = 0;
diff --git a/cmd.c b/cmd.c
index 14e86c5..a5755c5 100644 (file)
--- a/cmd.c
+++ b/cmd.c
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/cmd.c,v 1.7 2010/01/03 17:54:07 tg Exp $ */
+/* $MirOS: contrib/code/jupp/cmd.c,v 1.11 2012/12/30 21:45:13 tg Exp $ */
 /*
  *     Command execution
  *     Copyright
@@ -9,6 +9,9 @@
 #include "config.h"
 #include "types.h"
 
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
 #include <string.h>
 
 #include "b.h"
@@ -16,6 +19,7 @@
 #include "cmd.h"
 #include "hash.h"
 #include "help.h"
+#include "kbd.h"
 #include "macro.h"
 #include "main.h"
 #include "menu.h"
@@ -55,6 +59,34 @@ int ubeep(BW *bw, int k)
        return 0;
 }
 
+extern char main_context[];
+static int do_keymap(BW *bw, unsigned char *s, void *object, int *notify)
+{
+       KMAP *new_kmap;
+
+       if (notify)
+               *notify = 1;
+       if (!s || !*s || !(new_kmap = kmap_getcontext(s, 0)))
+               return (-1);
+       if (bw->o.context != (unsigned char *)main_context)
+               free(bw->o.context);
+       bw->o.context = strcmp((char *)s, main_context) ?
+           (unsigned char *)strdup((char *)s) : (unsigned char *)main_context;
+       rmkbd(bw->parent->kbd);
+       bw->parent->kbd = mkkbd(new_kmap);
+       joe_snprintf_1((char *)msgbuf, JOE_MSGBUFSIZE, "New keymap: %s", s);
+       msgnw(bw->parent, msgbuf);
+       return (0);
+}
+static int ukeymap(BW *bw)
+{
+       if (wmkpw(bw->parent, US "Name of keymap to switch to: ", NULL,
+           do_keymap, NULL, NULL, utypebw, NULL, NULL, locale_map)) {
+               return (0);
+       }
+       return (-1);
+}
+
 CMD cmds[] = {
        {US "abort", TYPETW + TYPEPW + TYPEMENU + TYPEQW, uabort, NULL, 0, NULL},
        {US "abortbuf", TYPETW, uabortbuf, NULL, 0, NULL},
@@ -99,7 +131,7 @@ CMD cmds[] = {
        {US "dnslide", TYPETW + TYPEPW + TYPEMENU + TYPEQW + EMOVE, udnslide, NULL, 1, US "upslide"},
        {US "drop", TYPETW + TYPEPW, udrop, NULL, 0, NULL},
        {US "dupw", TYPETW, uduptw, NULL, 0, NULL},
-       {US "edit", TYPETW + TYPEPW, uedit, NULL, 0, NULL},
+       {US "edit", TYPETW, uedit, NULL, 0, NULL},
        {US "eof", TYPETW + TYPEPW + EFIXXCOL + EMOVE, u_goto_eof, NULL, 0, NULL},
        {US "eofmenu", TYPEMENU, umeof, NULL, 0, NULL},
        {US "eol", TYPETW + TYPEPW + EFIXXCOL, u_goto_eol, NULL, 0, NULL},
@@ -121,11 +153,13 @@ CMD cmds[] = {
        {US "killjoe", TYPETW + TYPEPW + TYPEMENU + TYPEQW, ukilljoe, NULL, 0, NULL},
        {US "killproc", TYPETW + TYPEPW, ukillpid, NULL, 0, NULL},
        {US "help", TYPETW + TYPEPW + TYPEQW, u_help, NULL, 0, NULL},
+       {US "helpcard", TYPETW + TYPEPW + TYPEQW, u_helpcard, NULL, 0, NULL},
        {US "home", TYPETW + TYPEPW + EFIXXCOL, uhome, NULL, 0, NULL},
        {US "hnext", TYPETW + TYPEPW + TYPEQW, u_help_next, NULL, 0, NULL},
        {US "hprev", TYPETW + TYPEPW + TYPEQW, u_help_prev, NULL, 0, NULL},
        {US "insc", TYPETW + TYPEPW + EFIXXCOL + EMOD, uinsc, NULL, 1, US "delch"},
        {US "insf", TYPETW + TYPEPW + EMOD, uinsf, NULL, 0, NULL}, 
+       {US "keymap", TYPETW, ukeymap, NULL, 0, NULL},
        {US "lindent", TYPETW + TYPEPW + EFIXXCOL + EMOD + EBLOCK, ulindent, NULL, 1, US "rindent"},
        {US "line", TYPETW + TYPEPW, uline, NULL, 0, NULL},
        {US "lose", TYPETW + TYPEPW, ulose, NULL, 0, NULL}, 
@@ -137,6 +171,8 @@ CMD cmds[] = {
        {US "markk", TYPETW + TYPEPW, umarkk, NULL, 0, NULL},
        {US "markl", TYPETW + TYPEPW, umarkl, NULL, 0, NULL},
        {US "math", TYPETW + TYPEPW, umath, NULL, 0, NULL},
+       {US "mathins", TYPETW + TYPEPW, umathins, NULL, 0, NULL},
+       {US "mathres", TYPETW + TYPEPW, umathres, NULL, 0, NULL},
        {US "mode", TYPETW + TYPEPW + TYPEQW, umode, NULL, 0, NULL},
        {US "msg", TYPETW + TYPEPW + TYPEQW + TYPEMENU, umsg, NULL, 0, NULL},
        {US "nbuf", TYPETW, unbuf, NULL, 1, US "pbuf"},
@@ -178,7 +214,7 @@ CMD cmds[] = {
        {US "rtarw", TYPETW + TYPEPW /* + EFIXXCOL */, u_goto_right, NULL, 1, US "ltarw"}, /* EFIX removed for picture mode */
        {US "rtarwmenu", TYPEMENU, umrtarw, NULL, 1, US "ltarwmenu"},
        {US "rtn", TYPETW + TYPEPW + TYPEMENU + TYPEQW + EMOD, urtn, NULL, 1, NULL},
-       {US "save", TYPETW + TYPEPW, usave, NULL, 0, NULL},
+       {US "save", TYPETW, usave, NULL, 0, NULL},
        {US "scratch", TYPETW + TYPEPW, uscratch, NULL, 0, NULL},
        {US "select", TYPETW + TYPEPW, uselect, NULL, 0, NULL},
        {US "setmark", TYPETW + TYPEPW, usetmark, NULL, 0, NULL},
@@ -391,3 +427,34 @@ int uexecmd(BW *bw)
                return -1;
        }
 }
+
+/*
+ * Show help screen at a specific card
+ */
+static int do_helpcard(BASE *base, unsigned char *s, void *object, int *notify)
+{
+       struct help *new_help;
+
+       if (notify)
+               *notify = 1;
+       if (!s || !*s) {
+               while (help_actual->prev != NULL)
+                       /* find the first help entry */
+                       help_actual = help_actual->prev;
+               help_off(base->parent->t);
+               return (0);
+       }
+       if ((new_help = find_context_help(s)) != NULL) {
+               help_actual = new_help;
+               return (help_on(base->parent->t));
+       }
+       return (-1);
+}
+int u_helpcard(BASE *base)
+{
+       if (wmkpw(base->parent, US "Name of help card to show: ", NULL,
+           do_helpcard, NULL, NULL, utypebw, NULL, NULL, locale_map)) {
+               return (0);
+       }
+       return (-1);
+}
index 9565c6e..e02c76a 100644 (file)
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.61-MirPorts-1 for joe 3.1jupp22.
+# Generated by GNU Autoconf 2.61-MirPorts-1 for joe 3.1jupp23.
 #
 # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
 # 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
@@ -572,8 +572,8 @@ SHELL=${CONFIG_SHELL-/bin/sh}
 # Identity of this package.
 PACKAGE_NAME='joe'
 PACKAGE_TARNAME='joe'
-PACKAGE_VERSION='3.1jupp22'
-PACKAGE_STRING='joe 3.1jupp22'
+PACKAGE_VERSION='3.1jupp23'
+PACKAGE_STRING='joe 3.1jupp23'
 PACKAGE_BUGREPORT=''
 
 ac_unique_file="b.c"
@@ -1223,7 +1223,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures joe 3.1jupp22 to adapt to many kinds of systems.
+\`configure' configures joe 3.1jupp23 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1294,7 +1294,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of joe 3.1jupp22:";;
+     short | recursive ) echo "Configuration of joe 3.1jupp23:";;
    esac
   cat <<\_ACEOF
 
@@ -1385,7 +1385,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-joe configure 3.1jupp22
+joe configure 3.1jupp23
 generated by GNU Autoconf 2.61-MirPorts-1
 
 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
@@ -1399,7 +1399,7 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by joe $as_me 3.1jupp22, which was
+It was created by joe $as_me 3.1jupp23, which was
 generated by GNU Autoconf 2.61-MirPorts-1.  Invocation command line was
 
   $ $0 $@
@@ -2200,7 +2200,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='joe'
- VERSION='3.1jupp22'
+ VERSION='3.1jupp23'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -10908,7 +10908,7 @@ exec 6>&1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by joe $as_me 3.1jupp22, which was
+This file was extended by joe $as_me 3.1jupp23, which was
 generated by GNU Autoconf 2.61-MirPorts-1.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -10961,7 +10961,7 @@ Report bugs to <bug-autoconf@gnu.org>."
 _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF
 ac_cs_version="\\
-joe config.status 3.1jupp22
+joe config.status 3.1jupp23
 configured by $0, generated by GNU Autoconf 2.61-MirPorts-1,
   with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
 
index de48873..2011435 100644 (file)
@@ -1,4 +1,4 @@
-# $MirOS: contrib/code/jupp/configure.ac,v 1.40 2012/09/02 14:46:50 tg Exp $
+# $MirOS: contrib/code/jupp/configure.ac,v 1.41 2012/12/19 23:11:41 tg Exp $
 #-
 # Process this file with autoconf to produce a configure script.
 
@@ -6,7 +6,7 @@
 AC_PREREQ(2.54)
 
 #### Here's the only place where to change version number ####
-AC_INIT(joe, 3.1jupp22)
+AC_INIT(joe, 3.1jupp23)
 #### But see main.c for the Copyright (c) owner and year! ####
 AC_CONFIG_SRCDIR([b.c])
 
diff --git a/help.c b/help.c
index 5d18270..79464b2 100644 (file)
--- a/help.c
+++ b/help.c
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/help.c,v 1.6 2011/07/16 21:57:57 tg Exp $ */
+/* $MirOS: contrib/code/jupp/help.c,v 1.7 2012/12/30 19:27:13 tg Exp $ */
 /*
  *     Help system
  *     Copyright
@@ -133,7 +133,7 @@ int help_init(unsigned char *filename)
  * Find context help - find help entry with the same name
  */
 
-struct help *find_context_help(unsigned char *name)
+struct help *find_context_help(const unsigned char *name)
 {
        struct help *tmp = help_actual;
 
@@ -306,7 +306,7 @@ int help_on(SCREEN *t)
 /*
  * Hide help screen
  */
-static void help_off(SCREEN *t)
+void help_off(SCREEN *t)
 {
        t->wind = skiptop;
        wfit(t);
diff --git a/help.h b/help.h
index ca1e906..6612601 100644 (file)
--- a/help.h
+++ b/help.h
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/help.h,v 1.2 2008/05/13 13:08:22 tg Exp $ */
+/* $MirOS: contrib/code/jupp/help.h,v 1.4 2012/12/30 19:50:32 tg Exp $ */
 /*
  *     Help system
  *     Copyright
 #include "config.h"
 #include "types.h"
 
+extern struct help *help_actual;
+
 void help_display PARAMS((SCREEN *t));         /* display text in help window */
+void help_off PARAMS((SCREEN *t));             /* turn help off */
 int help_on PARAMS((SCREEN *t));               /* turn help on */
 int help_init PARAMS((unsigned char *filename));/* load help file */
+struct help *find_context_help PARAMS((const unsigned char *name));
 
 int u_help PARAMS((BASE *base));               /* toggle help on/off */
+int u_helpcard PARAMS((BASE *base));           /* enable help at screen */
 int u_help_next PARAMS((BASE *base));          /* goto next help screen */
 int u_help_prev PARAMS((BASE *base));          /* goto prev help screen */
 
index fc45bf7..7b060b4 100644 (file)
@@ -1,4 +1,4 @@
- $MirOS: contrib/code/jupp/jmacsrc.in,v 1.8 2011/10/04 22:35:44 tg Exp $
+ $MirOS: contrib/code/jupp/jmacsrc.in,v 1.12 2012/12/30 21:45:13 tg Exp $
 
                          Initialization file for JOE
                                 GNU-Emacs Joe
@@ -49,6 +49,8 @@
 -notite         Don't send terminal initialization and termination strings: prevents
                 restoration of screen on exit.
 
+-pastetite     Enter bracketed paste mode automatically for TERM=xterm-xfree86
+
  -usetabs       Use tabs to help optimize screen update.
 
 -assume_color  Assume terminal has ANSI color support even if termcap/terminfo entry
 
  Default local options
 -highlight
+-french
 -tab 8
 -indentc 9
 -istep 1
+-purify
 --autoindent
 -smartbacks
 --wordwrap
 
+ === Generic files
+ No '.' in filename?
+*
+ Assume it's a text file and, except in jupp, we want wordwrap on.
+-wordwrap
+
+ Filename with '.' is probably not a text file.
+*.*
+
+ === Patterns with multiple wildcards
+ Order is latest match wins, so...
+*/patch-*
+-highlight
+-syntax diff
+
+*.sh*
+-syntax sh
+
+*.ksh*
+-syntax sh
+
+*.mksh*
+-syntax sh
+
+*.bash*
+-syntax sh
+
+*tmp/mutt-*
+-wordwrap
+-syntax mail
+
+*tmp/pico.*
+-wordwrap
+-syntax mail
+
+*/mail/*
+-syntax mail
+
+*/patches/*
+-highlight
+-syntax diff
+
  === Assembly
 *.asm
 -syntax asm
 
  === Diff
 *.diff
+-highlight
 -syntax diff
 
 *.patch
+-highlight
+-syntax diff
+
+*.rej
+-highlight
+-syntax diff
+
+*.debdiff
+-highlight
 -syntax diff
 
 *
-+--- 
++---\[ ]
+-highlight
 -syntax diff
 
 *
-+*** 
++***\[ ]
+-highlight
 -syntax diff
 
 *
 +\[1-9]\+\[0-9]\[cda]
+-highlight
 -syntax diff
 
 *
 +Index: \*\n======================================================
+-highlight
 -syntax diff
 
- === eMail
-*tmp/mutt-*
--syntax mail
+*
++\[=?]\*\n--- \*\n+++\[ ]
+-highlight
+-syntax diff
 
-*/mail/*
--syntax mail
+*
++diff\*\n--- \*\n+++\[ ]
+-highlight
+-syntax diff
 
+ === eMail
 *.eml
 -syntax mail
 
+ Not quite eMail but still RFC822
+*.mht
+-syntax mail
+
  === FORTRAN
 *.f
 -syntax fortran
 -spaces
 
  === Bourne, Korn, POSIX Shell
-*.sh
--syntax sh
-
-*.ksh
--syntax sh
-
-*.mksh
--syntax sh
-
-*.bash
--syntax sh
-
-*.bash_login
--syntax sh
-
-*.bash_logout
--syntax sh
-
 *profile
 -syntax sh
 
 *.tcl
 -syntax tcl
 
+ === Text
+*.txt
+-guess_indent
+-wordwrap
+
  === Verilog
 *.v
 -syntax verilog
 \i \i 112  70 | pqrs tuvw  xyz{ |}~\7f    ðñòó ôõö÷  øùúû üýþÿ | F0  240            \i \i
 }
 
+{Paste
+\i                                                                               \i
+\i \i \u\bPaste Mode\b\u     turn off with \b^D\b or \b^[[201~\b                                  \i \i
+}
+
  FOURTH SECTION: Key bindings:
 
  Section names you must provide:
@@ -672,9 +732,18 @@ shell              ^Z              Suspend
 shell          ^[ s            Suspend (uemacs)
 stop           ^X )            Stop recording macro
 
+:Paste
+type                                   ^@ TO ÿ
+rtn                                    ^M
+msg,"Entered bracketed paste mode",rtn ^[ [ 2 0 0 ~
+helpcard,rtn,keymap,"main",rtn,msg,rtn ^[ [ 2 0 1 ~
+helpcard,rtn,keymap,"main",rtn         ^D
+
 :main                  Text editing window
 :inherit windows
 
+helpcard,"Paste",rtn,keymap,"Paste",rtn        ^[ [ 2 0 0 ~
+
   ESC-x compile
 
 :def compile querysave,query,scratch,"* Build Log *",rtn,bof,markb,eof," ",markk,blkdel,build
index 2f61f3d..306f1f5 100644 (file)
--- a/joe.1.in
+++ b/joe.1.in
@@ -1,4 +1,4 @@
-.\" $MirOS: contrib/code/jupp/joe.1.in,v 1.12 2011/10/04 22:35:45 tg Exp $
+.\" $MirOS: contrib/code/jupp/joe.1.in,v 1.14 2012/12/30 21:45:13 tg Exp $
 .\"-
 .TH JOE 1
 .SH Name
@@ -748,12 +748,20 @@ different rate than it's communicating over the phone line), you can put a
 numeric value in the \fBBAUD\fR environment variable instead (use \fBsetenv
 BAUD 9600\fR for csh or \fBBAUD=9600; export BAUD\fR for sh).
 
+The \fBSHELL\fR or \fBEXECSHELL\fR environment variable must be set to the
+full pathname of a shell executable that accepts the \-i (interactive) and
+\-c (run a command) arguments of the Korn Shell; otherwise, \fB/bin/sh\fR
+is used.
+
 The \fBTERM\fR environment variable must be set to the type of terminal
 you're using.  If the size (number of lines/columns) of your terminal is
 different from what is reported in the TERMCAP or TERMINFO entry, you can
 set this with the \fBstty rows nn cols nn\fR command, or by setting the
 \fBLINES\fR and \fBCOLUMNS\fR environment variables.
 
+The \fBxterm\-xfree86\fR terminal allows automatic entering and leaving
+of the bracketed paste mode.
+
 JOE normally expects that flow control between the computer and your
 terminal to use ^S/^Q handshaking (I.E., if the computer is sending
 characters too fast for your terminal, your terminal sends ^S to stop the
diff --git a/joe.txt b/joe.txt
index 37be9b2..10fa208 100644 (file)
--- a/joe.txt
+++ b/joe.txt
@@ -848,6 +848,11 @@ Environment variables
      instead (use setenv BAUD 9600 for csh or BAUD=9600; export\r
      BAUD for sh).\r
 \r
+     The SHELL or EXECSHELL environment variable must be set to\r
+     the full pathname of a shell executable that accepts the -i\r
+     (interactive) and -c (run a command) arguments of the Korn\r
+     Shell; otherwise, /bin/sh is used.\r
+\r
      The TERM environment variable must be set to the type of\r
      terminal you're using.  If the size (number of\r
      lines/columns) of your terminal is different from what is\r
@@ -855,6 +860,9 @@ Environment variables
      with the stty rows nn cols nn command, or by setting the\r
      LINES and COLUMNS environment variables.\r
 \r
+     The xterm-xfree86 terminal allows automatic entering and\r
+     leaving of the bracketed paste mode.\r
+\r
      JOE normally expects that flow control between the computer\r
      and your terminal to use ^S/^Q handshaking (I.E., if the\r
      computer is sending characters too fast for your terminal,\r
index 43eae8b..4c8369f 100644 (file)
--- a/joerc.in
+++ b/joerc.in
@@ -1,4 +1,4 @@
- $MirOS: contrib/code/jupp/joerc.in,v 1.8 2011/10/04 22:35:45 tg Exp $
+ $MirOS: contrib/code/jupp/joerc.in,v 1.10 2012/12/30 21:45:14 tg Exp $
 
                          Initialization file for JOE
                                 Standard Joe
@@ -69,6 +69,8 @@
 -notite         Don't send terminal initialization and termination strings: prevents
                 restoration of screen on exit.
 
+-pastetite     Enter bracketed paste mode automatically for TERM=xterm-xfree86
+
  -usetabs       Use tabs to help optimize screen update.
 
 -assume_color  Assume terminal has ANSI color support even if termcap/terminfo entry
 
  Default local options
 -highlight
--istep 2
+-french
+-indentc 9
+-istep 1
+-purify
+-smartbacks
+-tab 8
+--wordwrap
 
- No '.' in file name?  Assume it's a text file and we want wordwrap on.
+ === Generic files
+ No '.' in filename?
 *
+ Assume it's a text file and, except in jupp, we want wordwrap on.
 -wordwrap
 
- File name with '.'?  It's probably not a text file.
+ Filename with '.' is probably not a text file.
 *.*
 
- Diff
-*
-+--- 
+ === Patterns with multiple wildcards
+ Order is latest match wins, so...
+*/patch-*
+-highlight
 -syntax diff
 
-*
-+*** 
--syntax diff
+*.sh*
+-syntax sh
 
-*
-+\[1-9]\+\[0-9]\[cda]
--syntax diff
+*.ksh*
+-syntax sh
 
- Text file.
-*.txt
--wordwrap
+*.mksh*
+-syntax sh
 
- Assembly language
-*.asm
+*.bash*
+-syntax sh
+
+*tmp/mutt-*
 -wordwrap
--syntax asm
+-syntax mail
 
-*.s
+*tmp/pico.*
 -wordwrap
+-syntax mail
+
+*/mail/*
+-syntax mail
+
+*/patches/*
+-highlight
+-syntax diff
+
+ === Assembly
+*.asm
 -syntax asm
 
 *.S
--wordwrap
 -syntax asm
 
- Mason
-*.mas
--autoindent
--syntax mason
--smarthome
--smartbacks
-
- Perl
-*
-+#!\+\[        ]\+\[a-z/]/perl\>
--autoindent
--syntax perl
--smarthome
--smartbacks
-
-*.pl
--autoindent
--syntax perl
--smarthome
--smartbacks
+*.s
+-syntax asm
 
-*.pm
--autoindent
--syntax perl
--smarthome
--smartbacks
+ === C, C++, Objective-C
+*.C
+-syntax c
 
- C language file
 *.c
--autoindent
 -syntax c
--smarthome
--smartbacks
--purify
+
+*.cc
+-syntax c
 
 *.cpp
--autoindent
 -syntax c
--smarthome
--smartbacks
--purify
+
+*.cxx
+-syntax c
 
 *.c++
--autoindent
 -syntax c
--smarthome
--smartbacks
--purify
 
- C language header file
 *.h
--autoindent
 -syntax c
--smarthome
--smartbacks
--purify
+
+*.hh
+-syntax c
 
 *.hpp
--autoindent
 -syntax c
--smarthome
--smartbacks
--purify
 
 *.h++
--autoindent
 -syntax c
--smarthome
--smartbacks
--purify
-
- Verilog file
-*.v
--autoindent
--syntax verilog
--istep 2
--smarthome
--smartbacks
--purify
-
- Verilog header file
-*.vh
--autoindent
--syntax verilog
--istep 2
--smarthome
--smartbacks
--purify
 
- VHDL file
-*.vhd
--autoindent
--syntax vhdl
--istep 2
--smarthome
--smartbacks
--purify
+*.m
+-syntax c
 
- XML
-*.xml
--wordwrap
--autoindent
--syntax xml
+ === C Shell
+*.csh
+-syntax csh
 
- HTML
-*.htm
--wordwrap
--autoindent
--syntax html
+*.login
+-syntax csh
 
-*.html
--wordwrap
--autoindent
--syntax html
+*.logout
+-syntax csh
 
- JAVA
-*.java
--autoindent
--syntax java
--smarthome
--smartbacks
--purify
+*.tcsh
+-syntax csh
 
- Hypertext preprocessor file
-*.php
--autoindent
--syntax php
--smarthome
--smartbacks
--purify
+*.tcshrc
+-syntax csh
 
- Python
 *
-+#!\+\[        ]\+\[a-z/]/python
--autoindent
--syntax python
--smarthome
--smartbacks
--purify
-
-*.py
--autoindent
--syntax python
--smarthome
--smartbacks
--purify
++#!\+\[         ]\+\[a-z/]/\+tcsh\>
+-syntax csh
 
- CSH
 *
-+#!\+\[        ]\+\[a-z/]/csh\>
--autoindent
++#!\+\[         ]\+\[a-z/]/env\+\[      ]\+tcsh\>
 -syntax csh
 
-*.csh
--autoindent
--syntax csh
+ === Diff
+*.diff
+-highlight
+-syntax diff
 
-*.cshrc
--autoindent
--syntax csh
+*.patch
+-highlight
+-syntax diff
 
-*.login
--autoindent
--syntax csh
+*.rej
+-highlight
+-syntax diff
 
-*.logout
--autoindent
--syntax csh
+*.debdiff
+-highlight
+-syntax diff
 
- TCSH
 *
-+#!\+\[        ]\+\[a-z/]/tcsh\>
--autoindent
--syntax csh
-
-*.tcsh
--autoindent
--syntax csh
++---\[ ]
+-highlight
+-syntax diff
 
-*.tcshrc
--autoindent
--syntax csh
+*
++***\[ ]
+-highlight
+-syntax diff
 
- Shell
 *
-+#!\+\[        ]\+\[a-z/]/sh\>
--autoindent
--syntax sh
++\[1-9]\+\[0-9]\[cda]
+-highlight
+-syntax diff
 
-*.sh
--autoindent
--syntax sh
+*
++Index: \*\n======================================================
+-highlight
+-syntax diff
 
-*profile
--autoindent
--syntax sh
+*
++\[=?]\*\n--- \*\n+++\[ ]
+-highlight
+-syntax diff
 
- BASH Shell
 *
-+#!\+\[        ]\+\[a-z/]/bash\>
--autoindent
--syntax sh
++diff\*\n--- \*\n+++\[ ]
+-highlight
+-syntax diff
 
-*.bash
--autoindent
--syntax sh
+ === eMail
+*.eml
+-syntax mail
 
-*.bash_login
--autoindent
--syntax sh
+ Not quite eMail but still RFC822
+*.mht
+-syntax mail
 
-*.bash_logout
--autoindent
--syntax sh
+ === FORTRAN
+*.f
+-syntax fortran
+
+*.for
+-syntax fortran
+
+*.FOR
+-syntax fortran
+
+*.f77
+-syntax fortran
+
+*.F77
+-syntax fortran
+
+*.f90
+-syntax fortran
+
+*.F90
+-syntax fortran
+
+ === GNU autoconf
+*.ac
+-syntax conf
+
+*.am
+-syntax conf
 
- LISP
+ === HTML
+*.htm
+-encoding utf8
+-syntax html
+
+*.html
+-encoding utf8
+-syntax html
+
+ === Java
+*.java
+-encoding utf8
+-syntax java
+
+ === Joe Syntax File
+*.jsf
+-syntax conf
+
+ === flex
+*.l
+-syntax lex
+
+ === LISP
 *.lisp
--autoindent
 -syntax lisp
 
 *.lsp
--autoindent
 -syntax lisp
 
 *.el
--autoindent
 -syntax lisp
 
- KSH
-*
-+#!\+\[        ]\+\[a-z/]/ksh\>
--autoindent
--syntax sh
-
-*.ksh
--autoindent
--syntax sh
+ === M4
+*.m4
+-syntax m4
 
Makefile
=== Make
 *akefile
--autoindent
 -syntax conf
 
 *AKEFILE
--autoindent
 -syntax conf
 
- Pascal
+ === Mason
+*.mas
+-syntax mason
+
+ === Pascal
 *.p
--autoindent
 -syntax pascal
--smarthome
--smartbacks
--purify
 
 *.pas
--autoindent
 -syntax pascal
--smarthome
--smartbacks
--purify
 
- Fortran
-*.f
--autoindent
--syntax fortran
+ === Perl
+*.pl
+-syntax perl
 
-*.for
--autoindent
--syntax fortran
+*.pm
+-syntax perl
 
-*.FOR
--autoindent
--syntax fortran
+*
++#!\+\[         ]\+\[a-z/]/perl
+-syntax perl
 
- YACC
-*.y
--autoindent
--syntax yacc
+*
++#!\+\[         ]\+\[a-z/]/env\+\[      ]perl
+-syntax perl
 
- LEX
-*.l
--autoindent
--syntax lex
+ === PHP
+*.php
+-syntax php
+
+ === Python
+*.py
+-encoding utf8
+-syntax python
+--guess_indent
+-tab 4
+-indentc 32
+-istep 4
+-spaces
+
+*
++#!\+\[         ]\+\[a-z/]/python
+-encoding utf8
+-syntax python
+--guess_indent
+-tab 4
+-indentc 32
+-istep 4
+-spaces
+
+*
++#!\+\[         ]\+\[a-z/]/env\+\[      ]python
+-encoding utf8
+-syntax python
+--guess_indent
+-tab 4
+-indentc 32
+-istep 4
+-spaces
+
+ === Bourne, Korn, POSIX Shell
+*profile
+-syntax sh
+
+*
++:\[    \n]
+-syntax sh
+
+*
++#!\+\[         ]\+\[a-z/]/\+\[bd]\+ash\>
+-syntax sh
+
+*
++#!\+\[         ]\+\[a-z/]/env\+\[      ]\+\[bd]\+ash\>
+-syntax sh
 
- TCL
+*
++#!\+\[         ]\+\[a-z/]/\+\[a-z]ksh\+\[0-9._-]\>
+-syntax sh
+
+*
++#!\+\[         ]\+\[a-z/]/env\+\[      ]\+\[a-z]ksh\+\[0-9._-]\>
+-syntax sh
+
+ === TCL
 *.tcl
--autoindent
 -syntax tcl
 
- Joe Syntax File
-*.jsf
--autoindent
--syntax conf
+ === Text
+*.txt
+-guess_indent
+-wordwrap
 
- Autoconfig file
-*.ac
--autoindent
--syntax conf
+ === Verilog
+*.v
+-syntax verilog
+-istep 2
 
- M4 file
-*.m4
--autoindent
--syntax m4
+*.vh
+-syntax verilog
+-istep 2
 
- Automake file
-*.am
--autoindent
--syntax conf
+ === VHDL
+*.vhd
+-syntax vhdl
+-istep 2
 
- Mail file
-*tmp/mutt-*
--wordwrap
--syntax mail
+ === XML
+*.xml
+-encoding utf8
+-syntax xml
+
+ === yacc
+*.y
+-syntax yacc
 
  THIRD SECTION: Named help screens:
 
 \i \i 112  70 | pqrs tuvw  xyz{ |}~\7f    ðñòó ôõö÷  øùúû üýþÿ | F0  240            \i \i
 }
 
+{Paste
+\i                                                                               \i
+\i \i \u\bPaste Mode\b\u     turn off with \b^D\b or \b^[[201~\b                                  \i \i
+}
+
  FOURTH SECTION: Key bindings:
 
  Section names you must provide:
@@ -771,9 +785,18 @@ shell              ^K ^Z
 shell          ^K z
 stop           ^K ]            Stop recording
 
+:Paste
+type                                   ^@ TO ÿ
+rtn                                    ^M
+msg,"Entered bracketed paste mode",rtn ^[ [ 2 0 0 ~
+helpcard,rtn,keymap,"main",rtn,msg,rtn ^[ [ 2 0 1 ~
+helpcard,rtn,keymap,"main",rtn         ^D
+
 :main                  Text editing window
 :inherit windows
 
+helpcard,"Paste",rtn,keymap,"Paste",rtn        ^[ [ 2 0 0 ~
+
  Spell-check macros
 
  Ispell
index fc12252..170d094 100644 (file)
@@ -1,4 +1,4 @@
- $MirOS: contrib/code/jupp/jpicorc.in,v 1.7 2011/10/04 22:35:46 tg Exp $
+ $MirOS: contrib/code/jupp/jpicorc.in,v 1.9 2012/12/30 21:45:15 tg Exp $
 
                          Initialization file for JOE
                                  Super Pico
@@ -69,6 +69,8 @@
 -notite         Don't send terminal initialization and termination strings: prevents
                 restoration of screen on exit.
 
+-pastetite     Enter bracketed paste mode automatically for TERM=xterm-xfree86
+
  -usetabs       Use tabs to help optimize screen update.
 
 -assume_color  Assume terminal has ANSI color support even if termcap/terminfo entry
 
  Default local options
 -highlight
--istep 2
+-french
+-indentc 9
+-istep 1
+-purify
+-smartbacks
+-tab 8
+--wordwrap
 
- No '.' in file name?  Assume it's a text file and we want wordwrap on.
+ === Generic files
+ No '.' in filename?
 *
+ Assume it's a text file and, except in jupp, we want wordwrap on.
 -wordwrap
 
- File name with '.'?  It's probably not a text file.
+ Filename with '.' is probably not a text file.
 *.*
 
- Diff
-*
-+--- 
+ === Patterns with multiple wildcards
+ Order is latest match wins, so...
+*/patch-*
+-highlight
 -syntax diff
 
-*
-+*** 
--syntax diff
+*.sh*
+-syntax sh
 
-*
-+\[1-9]\+\[0-9]\[cda]
--syntax diff
+*.ksh*
+-syntax sh
 
- Text file.
-*.txt
--wordwrap
+*.mksh*
+-syntax sh
 
- Assembly language
-*.asm
+*.bash*
+-syntax sh
+
+*tmp/mutt-*
 -wordwrap
--syntax asm
+-syntax mail
 
-*.s
+*tmp/pico.*
 -wordwrap
+-syntax mail
+
+*/mail/*
+-syntax mail
+
+*/patches/*
+-highlight
+-syntax diff
+
+ === Assembly
+*.asm
 -syntax asm
 
 *.S
--wordwrap
 -syntax asm
 
- Mason
-*.mas
--autoindent
--syntax mason
--smarthome
--smartbacks
-
- Perl
-*
-+#!\+\[        ]\+\[a-z/]/perl\>
--autoindent
--syntax perl
--smarthome
--smartbacks
-
-*.pl
--autoindent
--syntax perl
--smarthome
--smartbacks
+*.s
+-syntax asm
 
-*.pm
--autoindent
--syntax perl
--smarthome
--smartbacks
+ === C, C++, Objective-C
+*.C
+-syntax c
 
- C language file
 *.c
--autoindent
 -syntax c
--smarthome
--smartbacks
--purify
+
+*.cc
+-syntax c
 
 *.cpp
--autoindent
 -syntax c
--smarthome
--smartbacks
--purify
+
+*.cxx
+-syntax c
 
 *.c++
--autoindent
 -syntax c
--smarthome
--smartbacks
--purify
 
- C language header file
 *.h
--autoindent
 -syntax c
--smarthome
--smartbacks
--purify
+
+*.hh
+-syntax c
 
 *.hpp
--autoindent
 -syntax c
--smarthome
--smartbacks
--purify
 
 *.h++
--autoindent
 -syntax c
--smarthome
--smartbacks
--purify
 
- Verilog file
-*.v
--autoindent
--syntax verilog
--istep 2
--smarthome
--smartbacks
--purify
-
- Verilog header file
-*.vh
--autoindent
--syntax verilog
--istep 2
--smarthome
--smartbacks
--purify
-
- VHDL file
-*.vhd
--autoindent
--syntax vhdl
--istep 2
--smarthome
--smartbacks
--purify
+*.m
+-syntax c
 
- XML
-*.xml
--wordwrap
--autoindent
--syntax xml
+ === C Shell
+*.csh
+-syntax csh
 
- HTML
-*.htm
--wordwrap
--autoindent
--syntax html
+*.login
+-syntax csh
 
-*.html
--wordwrap
--autoindent
--syntax html
+*.logout
+-syntax csh
 
- JAVA
-*.java
--autoindent
--syntax java
--smarthome
--smartbacks
--purify
+*.tcsh
+-syntax csh
 
- Hypertext preprocessor file
-*.php
--autoindent
--syntax php
--smarthome
--smartbacks
--purify
+*.tcshrc
+-syntax csh
 
- Python
 *
-+#!\+\[        ]\+\[a-z/]/python
--autoindent
--syntax python
--smarthome
--smartbacks
--purify
-
-*.py
--autoindent
--syntax python
--smarthome
--smartbacks
--purify
++#!\+\[         ]\+\[a-z/]/\+tcsh\>
+-syntax csh
 
- CSH
 *
-+#!\+\[        ]\+\[a-z/]/csh\>
--autoindent
++#!\+\[         ]\+\[a-z/]/env\+\[      ]\+tcsh\>
 -syntax csh
 
-*.csh
--autoindent
--syntax csh
+ === Diff
+*.diff
+-highlight
+-syntax diff
 
-*.cshrc
--autoindent
--syntax csh
+*.patch
+-highlight
+-syntax diff
 
-*.login
--autoindent
--syntax csh
+*.rej
+-highlight
+-syntax diff
 
-*.logout
--autoindent
--syntax csh
+*.debdiff
+-highlight
+-syntax diff
 
- TCSH
 *
-+#!\+\[        ]\+\[a-z/]/tcsh\>
--autoindent
--syntax csh
-
-*.tcsh
--autoindent
--syntax csh
++---\[ ]
+-highlight
+-syntax diff
 
-*.tcshrc
--autoindent
--syntax csh
+*
++***\[ ]
+-highlight
+-syntax diff
 
- Shell
 *
-+#!\+\[        ]\+\[a-z/]/sh\>
--autoindent
--syntax sh
++\[1-9]\+\[0-9]\[cda]
+-highlight
+-syntax diff
 
-*.sh
--autoindent
--syntax sh
+*
++Index: \*\n======================================================
+-highlight
+-syntax diff
 
-*profile
--autoindent
--syntax sh
+*
++\[=?]\*\n--- \*\n+++\[ ]
+-highlight
+-syntax diff
 
- BASH Shell
 *
-+#!\+\[        ]\+\[a-z/]/bash\>
--autoindent
--syntax sh
++diff\*\n--- \*\n+++\[ ]
+-highlight
+-syntax diff
 
-*.bash
--autoindent
--syntax sh
+ === eMail
+*.eml
+-syntax mail
 
-*.bash_login
--autoindent
--syntax sh
+ Not quite eMail but still RFC822
+*.mht
+-syntax mail
 
-*.bash_logout
--autoindent
--syntax sh
+ === FORTRAN
+*.f
+-syntax fortran
 
- KSH
-*
-+#!\+\[        ]\+\[a-z/]/ksh\>
--autoindent
--syntax sh
+*.for
+-syntax fortran
 
-*.ksh
--autoindent
--syntax sh
+*.FOR
+-syntax fortran
+
+*.f77
+-syntax fortran
+
+*.F77
+-syntax fortran
+
+*.f90
+-syntax fortran
+
+*.F90
+-syntax fortran
+
+ === GNU autoconf
+*.ac
+-syntax conf
+
+*.am
+-syntax conf
+
+ === HTML
+*.htm
+-encoding utf8
+-syntax html
+
+*.html
+-encoding utf8
+-syntax html
+
+ === Java
+*.java
+-encoding utf8
+-syntax java
+
+ === Joe Syntax File
+*.jsf
+-syntax conf
 
- LISP
+ === flex
+*.l
+-syntax lex
+
+ === LISP
 *.lisp
--autoindent
 -syntax lisp
 
 *.lsp
--autoindent
 -syntax lisp
 
 *.el
--autoindent
 -syntax lisp
 
- Makefile
+ === M4
+*.m4
+-syntax m4
+
+ === Make
 *akefile
--autoindent
 -syntax conf
 
 *AKEFILE
--autoindent
 -syntax conf
 
- Pascal
+ === Mason
+*.mas
+-syntax mason
+
+ === Pascal
 *.p
--autoindent
 -syntax pascal
--smarthome
--smartbacks
--purify
 
 *.pas
--autoindent
 -syntax pascal
--smarthome
--smartbacks
--purify
 
- Fortran
-*.f
--autoindent
--syntax fortran
+ === Perl
+*.pl
+-syntax perl
 
-*.for
--autoindent
--syntax fortran
+*.pm
+-syntax perl
 
-*.FOR
--autoindent
--syntax fortran
+*
++#!\+\[         ]\+\[a-z/]/perl
+-syntax perl
 
- YACC
-*.y
--autoindent
--syntax yacc
+*
++#!\+\[         ]\+\[a-z/]/env\+\[      ]perl
+-syntax perl
 
- LEX
-*.l
--autoindent
--syntax lex
+ === PHP
+*.php
+-syntax php
 
- TCL
+ === Python
+*.py
+-encoding utf8
+-syntax python
+--guess_indent
+-tab 4
+-indentc 32
+-istep 4
+-spaces
+
+*
++#!\+\[         ]\+\[a-z/]/python
+-encoding utf8
+-syntax python
+--guess_indent
+-tab 4
+-indentc 32
+-istep 4
+-spaces
+
+*
++#!\+\[         ]\+\[a-z/]/env\+\[      ]python
+-encoding utf8
+-syntax python
+--guess_indent
+-tab 4
+-indentc 32
+-istep 4
+-spaces
+
+ === Bourne, Korn, POSIX Shell
+*profile
+-syntax sh
+
+*
++:\[    \n]
+-syntax sh
+
+*
++#!\+\[         ]\+\[a-z/]/\+\[bd]\+ash\>
+-syntax sh
+
+*
++#!\+\[         ]\+\[a-z/]/env\+\[      ]\+\[bd]\+ash\>
+-syntax sh
+
+*
++#!\+\[         ]\+\[a-z/]/\+\[a-z]ksh\+\[0-9._-]\>
+-syntax sh
+
+*
++#!\+\[         ]\+\[a-z/]/env\+\[      ]\+\[a-z]ksh\+\[0-9._-]\>
+-syntax sh
+
+ === TCL
 *.tcl
--autoindent
 -syntax tcl
 
- Joe Syntax File
-*.jsf
--autoindent
--syntax conf
+ === Text
+*.txt
+-guess_indent
+-wordwrap
 
- Autoconfig file
-*.ac
--autoindent
--syntax conf
+ === Verilog
+*.v
+-syntax verilog
+-istep 2
 
- M4 file
-*.m4
--autoindent
--syntax m4
+*.vh
+-syntax verilog
+-istep 2
 
- Automake file
-*.am
--autoindent
--syntax conf
+ === VHDL
+*.vhd
+-syntax vhdl
+-istep 2
 
- Mail file
-*tmp/mutt-*
--wordwrap
--syntax mail
+ === XML
+*.xml
+-encoding utf8
+-syntax xml
+
+ === yacc
+*.y
+-syntax yacc
 
  THIRD SECTION: Named help screens:
 
 \i \i 112  70 | pqrs tuvw  xyz{ |}~\7f    ðñòó ôõö÷  øùúû üýþÿ | F0  240            \i \i
 }
 
+{Paste
+\i                                                                               \i
+\i \i \u\bPaste Mode\b\u     turn off with \b^D\b or \b^[[201~\b                                  \i \i
+}
+
  FOURTH SECTION: Key bindings:
 
  Section names you must provide:
@@ -737,9 +751,18 @@ shell              ^[ Z
 shell          ^[ ^Z
 stop           ^[ )            Stop recording
 
+:Paste
+type                                   ^@ TO ÿ
+rtn                                    ^M
+msg,"Entered bracketed paste mode",rtn ^[ [ 2 0 0 ~
+helpcard,rtn,keymap,"main",rtn,msg,rtn ^[ [ 2 0 1 ~
+helpcard,rtn,keymap,"main",rtn         ^D
+
 :main                  Text editing window
 :inherit windows
 
+helpcard,"Paste",rtn,keymap,"Paste",rtn        ^[ [ 2 0 0 ~
+
 begin_marking,uparw,toggle_marking     ^[ [ 1 ; 2 A    xterm shift-up mark
 begin_marking,dnarw,toggle_marking     ^[ [ 1 ; 2 B    xterm shift-down mark
 begin_marking,rtarw,toggle_marking     ^[ [ 1 ; 2 C    xterm shift-right mark
index c28240c..b6e1ab1 100644 (file)
@@ -1,4 +1,4 @@
- $MirOS: contrib/code/jupp/jstarrc.in,v 1.8 2011/10/04 22:35:46 tg Exp $
+ $MirOS: contrib/code/jupp/jstarrc.in,v 1.10 2012/12/30 21:45:15 tg Exp $
 
                          Initialization file for JOE
                            WordStar / Turbo-C Joe
@@ -48,6 +48,8 @@
 -notite         Don't send terminal initialization and termination strings: prevents
                 restoration of screen on exit.
 
+-pastetite     Enter bracketed paste mode automatically for TERM=xterm-xfree86
+
  -usetabs       Use tabs to help optimize screen update.
 
 -assume_color  Assume terminal has ANSI color support even if termcap/terminfo entry
 
  Default local options
 -highlight
--istep 2
+-french
+-indentc 9
+-istep 1
+-purify
+-smartbacks
+-tab 8
+--wordwrap
 
- No '.' in file name?  Assume it's a text file and we want wordwrap on.
+ === Generic files
+ No '.' in filename?
 *
+ Assume it's a text file and, except in jupp, we want wordwrap on.
 -wordwrap
 
- File name with '.'?  It's probably not a text file.
+ Filename with '.' is probably not a text file.
 *.*
 
- Diff
-*
-+--- 
+ === Patterns with multiple wildcards
+ Order is latest match wins, so...
+*/patch-*
+-highlight
 -syntax diff
 
-*
-+*** 
--syntax diff
+*.sh*
+-syntax sh
 
-*
-+\[1-9]\+\[0-9]\[cda]
--syntax diff
+*.ksh*
+-syntax sh
 
- Assembly language
-*.asm
--wordwrap
--syntax asm
+*.mksh*
+-syntax sh
 
-*.s
--wordwrap
--syntax asm
+*.bash*
+-syntax sh
 
-*.S
+*tmp/mutt-*
 -wordwrap
--syntax asm
+-syntax mail
 
- Text file.
-*.txt
+*tmp/pico.*
 -wordwrap
+-syntax mail
 
- Mason
-*.mas
--autoindent
--syntax mason
--smarthome
--smartbacks
+*/mail/*
+-syntax mail
 
- Perl
-*
-+#!\+\[        ]\+\[a-z/]/perl\>
--autoindent
--syntax perl
--smarthome
--smartbacks
+*/patches/*
+-highlight
+-syntax diff
 
-*.pl
--autoindent
--syntax perl
--smarthome
--smartbacks
+ === Assembly
+*.asm
+-syntax asm
 
-*.pm
--autoindent
--syntax perl
--smarthome
--smartbacks
+*.S
+-syntax asm
+
+*.s
+-syntax asm
+
+ === C, C++, Objective-C
+*.C
+-syntax c
 
- C language file
 *.c
--autoindent
 -syntax c
--smarthome
--smartbacks
--purify
+
+*.cc
+-syntax c
 
 *.cpp
--autoindent
 -syntax c
--smarthome
--smartbacks
--purify
+
+*.cxx
+-syntax c
 
 *.c++
--autoindent
 -syntax c
--smarthome
--smartbacks
--purify
 
- C language header file
 *.h
--autoindent
 -syntax c
--smarthome
--smartbacks
--purify
+
+*.hh
+-syntax c
 
 *.hpp
--autoindent
 -syntax c
--smarthome
--smartbacks
--purify
 
 *.h++
--autoindent
 -syntax c
--smarthome
--smartbacks
--purify
-
- Verilog file
-*.v
--autoindent
--syntax verilog
--istep 2
--smarthome
--smartbacks
--purify
 
- Verilog header file
-*.vh
--autoindent
--syntax verilog
--istep 2
--smarthome
--smartbacks
--purify
-
- VHDL file
-*.vhd
--autoindent
--syntax vhdl
--istep 2
--smarthome
--smartbacks
--purify
+*.m
+-syntax c
 
- XML
-*.xml
--wordwrap
--autoindent
--syntax xml
+ === C Shell
+*.csh
+-syntax csh
 
- HTML
-*.htm
--wordwrap
--autoindent
--syntax html
+*.login
+-syntax csh
 
-*.html
--wordwrap
--autoindent
--syntax html
+*.logout
+-syntax csh
 
- JAVA
-*.java
--autoindent
--syntax java
--smarthome
--smartbacks
--purify
+*.tcsh
+-syntax csh
 
- Hypertext preprocessor file
-*.php
--autoindent
--syntax php
--smarthome
--smartbacks
--purify
+*.tcshrc
+-syntax csh
 
- Python
 *
-+#!\+\[        ]\+\[a-z/]/python
--autoindent
--syntax python
--smarthome
--smartbacks
--purify
-
-*.py
--autoindent
--syntax python
--smarthome
--smartbacks
--purify
++#!\+\[         ]\+\[a-z/]/\+tcsh\>
+-syntax csh
 
- CSH
 *
-+#!\+\[        ]\+\[a-z/]/csh\>
--autoindent
++#!\+\[         ]\+\[a-z/]/env\+\[      ]\+tcsh\>
 -syntax csh
 
-*.csh
--autoindent
--syntax csh
+ === Diff
+*.diff
+-highlight
+-syntax diff
 
-*.cshrc
--autoindent
--syntax csh
+*.patch
+-highlight
+-syntax diff
 
-*.login
--autoindent
--syntax csh
+*.rej
+-highlight
+-syntax diff
 
-*.logout
--autoindent
--syntax csh
+*.debdiff
+-highlight
+-syntax diff
 
- TCSH
 *
-+#!\+\[        ]\+\[a-z/]/tcsh\>
--autoindent
--syntax csh
-
-*.tcsh
--autoindent
--syntax csh
++---\[ ]
+-highlight
+-syntax diff
 
-*.tcshrc
--autoindent
--syntax csh
+*
++***\[ ]
+-highlight
+-syntax diff
 
- Shell
 *
-+#!\+\[        ]\+\[a-z/]/sh\>
--autoindent
--syntax sh
++\[1-9]\+\[0-9]\[cda]
+-highlight
+-syntax diff
 
-*.sh
--autoindent
--syntax sh
+*
++Index: \*\n======================================================
+-highlight
+-syntax diff
 
-*profile
--autoindent
--syntax sh
+*
++\[=?]\*\n--- \*\n+++\[ ]
+-highlight
+-syntax diff
 
- BASH Shell
 *
-+#!\+\[        ]\+\[a-z/]/bash\>
--autoindent
--syntax sh
++diff\*\n--- \*\n+++\[ ]
+-highlight
+-syntax diff
 
-*.bash
--autoindent
--syntax sh
+ === eMail
+*.eml
+-syntax mail
 
-*.bash_login
--autoindent
--syntax sh
+ Not quite eMail but still RFC822
+*.mht
+-syntax mail
 
-*.bash_logout
--autoindent
--syntax sh
+ === FORTRAN
+*.f
+-syntax fortran
 
- KSH
-*
-+#!\+\[        ]\+\[a-z/]/ksh\>
--autoindent
--syntax sh
+*.for
+-syntax fortran
 
-*.ksh
--autoindent
--syntax sh
+*.FOR
+-syntax fortran
+
+*.f77
+-syntax fortran
+
+*.F77
+-syntax fortran
+
+*.f90
+-syntax fortran
+
+*.F90
+-syntax fortran
+
+ === GNU autoconf
+*.ac
+-syntax conf
+
+*.am
+-syntax conf
+
+ === HTML
+*.htm
+-encoding utf8
+-syntax html
+
+*.html
+-encoding utf8
+-syntax html
+
+ === Java
+*.java
+-encoding utf8
+-syntax java
+
+ === Joe Syntax File
+*.jsf
+-syntax conf
 
- LISP
+ === flex
+*.l
+-syntax lex
+
+ === LISP
 *.lisp
--autoindent
 -syntax lisp
 
 *.lsp
--autoindent
 -syntax lisp
 
 *.el
--autoindent
--syntax el
+-syntax lisp
 
- Makefile
+ === M4
+*.m4
+-syntax m4
+
+ === Make
 *akefile
--autoindent
 -syntax conf
 
 *AKEFILE
--autoindent
 -syntax conf
 
- Pascal
+ === Mason
+*.mas
+-syntax mason
+
+ === Pascal
 *.p
--autoindent
 -syntax pascal
--smarthome
--smartbacks
--purify
 
 *.pas
--autoindent
 -syntax pascal
--smarthome
--smartbacks
--purify
 
- Fortran
-*.f
--autoindent
--syntax fortran
+ === Perl
+*.pl
+-syntax perl
 
-*.for
--autoindent
--syntax fortran
+*.pm
+-syntax perl
 
-*.FOR
--autoindent
--syntax fortran
+*
++#!\+\[         ]\+\[a-z/]/perl
+-syntax perl
 
- YACC
-*.y
--autoindent
--syntax yacc
+*
++#!\+\[         ]\+\[a-z/]/env\+\[      ]perl
+-syntax perl
 
- LEX
-*.l
--autoindent
--syntax lex
+ === PHP
+*.php
+-syntax php
+
+ === Python
+*.py
+-encoding utf8
+-syntax python
+--guess_indent
+-tab 4
+-indentc 32
+-istep 4
+-spaces
+
+*
++#!\+\[         ]\+\[a-z/]/python
+-encoding utf8
+-syntax python
+--guess_indent
+-tab 4
+-indentc 32
+-istep 4
+-spaces
+
+*
++#!\+\[         ]\+\[a-z/]/env\+\[      ]python
+-encoding utf8
+-syntax python
+--guess_indent
+-tab 4
+-indentc 32
+-istep 4
+-spaces
+
+ === Bourne, Korn, POSIX Shell
+*profile
+-syntax sh
+
+*
++:\[    \n]
+-syntax sh
+
+*
++#!\+\[         ]\+\[a-z/]/\+\[bd]\+ash\>
+-syntax sh
+
+*
++#!\+\[         ]\+\[a-z/]/env\+\[      ]\+\[bd]\+ash\>
+-syntax sh
 
- TCL
+*
++#!\+\[         ]\+\[a-z/]/\+\[a-z]ksh\+\[0-9._-]\>
+-syntax sh
+
+*
++#!\+\[         ]\+\[a-z/]/env\+\[      ]\+\[a-z]ksh\+\[0-9._-]\>
+-syntax sh
+
+ === TCL
 *.tcl
--autoindent
 -syntax tcl
 
- Joe Syntax File
-*.jsf
--autoindent
--syntax conf
+ === Text
+*.txt
+-guess_indent
+-wordwrap
 
- Autoconfig file
-*.ac
--autoindent
--syntax conf
+ === Verilog
+*.v
+-syntax verilog
+-istep 2
 
- M4 file
-*.m4
--autoindent
--syntax m4
+*.vh
+-syntax verilog
+-istep 2
 
- Automake file
-*.am
--autoindent
--syntax conf
+ === VHDL
+*.vhd
+-syntax vhdl
+-istep 2
 
- Mail file
-*tmp/mutt-*
--wordwrap
--syntax mail
+ === XML
+*.xml
+-encoding utf8
+-syntax xml
+
+ === yacc
+*.y
+-syntax yacc
 
  THIRD SECTION: Named help screens:
 
 \i \i 112  70 | pqrs tuvw  xyz{ |}~\7f    ðñòó ôõö÷  øùúû üýþÿ | F0  240            \i \i
 }
 
+{Paste
+\i                                                                               \i
+\i \i \u\bPaste Mode\b\u     turn off with \b^D\b or \b^[[201~\b                                  \i \i
+}
+
  FOURTH SECTION: Key bindings:
 
  Section names you must provide:
@@ -730,9 +744,18 @@ shell              ^K ^Z
 shell          ^K z
 stop           ^[ )
 
+:Paste
+type                                   ^@ TO ÿ
+rtn                                    ^M
+msg,"Entered bracketed paste mode",rtn ^[ [ 2 0 0 ~
+helpcard,rtn,keymap,"main",rtn,msg,rtn ^[ [ 2 0 1 ~
+helpcard,rtn,keymap,"main",rtn         ^D
+
 :main                  Text editing window
 :inherit windows
 
+helpcard,"Paste",rtn,keymap,"Paste",rtn        ^[ [ 2 0 0 ~
+
 begin_marking,uparw,toggle_marking     ^[ [ 1 ; 2 A    xterm shift-up mark
 begin_marking,dnarw,toggle_marking     ^[ [ 1 ; 2 B    xterm shift-down mark
 begin_marking,rtarw,toggle_marking     ^[ [ 1 ; 2 C    xterm shift-right mark
diff --git a/jupprc b/jupprc
index 43f9f0d..87c3d5b 100644 (file)
--- a/jupprc
+++ b/jupprc
@@ -23,6 +23,7 @@
 -nobackups
 -noxon
 -notite
+-pastetite
 -pg 2
 -lmsg \i%k%T%*\b%n\b%R
 -rmsg  R%r<%l C%c\u%o|%O\i\b%a|%A\b\i\u %u
@@ -33,7 +34,7 @@
  -hex
 -indentc 9
 -istep 1
--guess_indent
+--guess_indent
 --autoindent
 -purify
 -highlight
 -tab 8
 --wordwrap
 
+ === Generic files
+ No '.' in filename?
+*
+ Assume it's a text file and, except in jupp, we want wordwrap on.
+ -wordwrap
+
+ Filename with '.' is probably not a text file.
+*.*
+
+ === Patterns with multiple wildcards
+ Order is latest match wins, so...
+*/patch-*
+-highlight
+-syntax diff
+
+*.sh*
+-syntax sh
+
+*.ksh*
+-syntax sh
+
+*.mksh*
+-syntax sh
+
+*.bash*
+-syntax sh
+
+*tmp/mutt-*
+ -wordwrap
+-syntax mail
+
+*tmp/pico.*
+ -wordwrap
+-syntax mail
+
+*/mail/*
+-syntax mail
+
+*/patches/*
+-highlight
+-syntax diff
+
  === Assembly
 *.asm
 -syntax asm
 -highlight
 -syntax diff
 
+*.rej
+-highlight
+-syntax diff
+
 *.debdiff
 -highlight
 -syntax diff
 
 *
-+--- 
++---\[ ]
 -highlight
 -syntax diff
 
 *
-+*** 
++***\[ ]
 -highlight
 -syntax diff
 
 -syntax diff
 
 *
-+=\*\n---\*\n+++
++\[=?]\*\n--- \*\n+++\[ ]
 -highlight
 -syntax diff
 
- === eMail
-*tmp/mutt-*
--syntax mail
+*
++diff\*\n--- \*\n+++\[ ]
+-highlight
+-syntax diff
 
-*/mail/*
+ === eMail
+*.eml
 -syntax mail
 
-*.eml
+ Not quite eMail but still RFC822
+*.mht
 -syntax mail
 
  === FORTRAN
 -spaces
 
  === Bourne, Korn, POSIX Shell
-*.sh
--syntax sh
-
-*.ksh
--syntax sh
-
-*.mksh
--syntax sh
-
-*.bash
--syntax sh
-
-*.bash_login
--syntax sh
-
-*.bash_logout
--syntax sh
-
 *profile
 -syntax sh
 
 *.tcl
 -syntax tcl
 
+ === Text
+*.txt
+-guess_indent
+-wordwrap
+
  === Verilog
 *.v
 -syntax verilog
 *.y
 -syntax yacc
 
-
 {Basic
 \i   Help Screen    turn off with ^J     more help with ESC . (^[.)              \i
 \i \i\u\bCURSOR\b\u           \u\bGOTO\b\u             \u\bBLOCK\b\u    \u\bDELETE\b\u    \u\bMISC\b\u         \u\bEXIT\b\u       \i \i
 \i \i^F next word     ^QD end of line  ^K/ pipe ^QY >line ^O  options  \u\bFILE\b\u       \i \i
 \i \i\u\bSEARCH\b\u           ^QR top of file  ^KB begin          \u\bBUFFER\b\u       ^KE new    \i \i
 \i \i^QF find first   ^QC end of file  ^KK end  ^K] space ^U undo      ^KR import \i \i
-\i \i^L  find next    ^QI to line No.  ^KD reformat       ^^ redo      ^KW export \i \i
+\i \i^L  find next    ^QO byte offset  ^KD reformat       ^^ redo      ^KW export \i \i
 }
 
 {Windows
 \i   Help Screen    turn off with ^J     prev. screen ^[,    next screen ^[.     \i
-\i \i^KO Split the window in half         ^KE Load file into window               \i \i
+\i \i^KO Split the window in half         ^KE Load file into new window           \i \i
 \i \i^KG Make current window bigger       ^KT Make current window smaller         \i \i
 \i \i^KN Go to the window below           ^KP Go to the window above              \i \i
 \i \i^KQ Eliminate the current window     ^KI Show all windows / Show one window  \i \i
+\i \i^K; Do ctags search into new window  ^K- Edit scratch buffer in new window   \i \i
+\i \i Note: some commands (^KE ^K; ^K-) hide the current window. Use ^KI/^KN then.\i \i
 \i \i\u\bSpecial help for XON/XOFF aware terminals\b\u                                    \i \i
 \i \i You can use \b^[q\b and \b^[s\b instead of \b^Q\b and \b^S\b to initiate a command.         \i \i
 }
 
 {Advanced
 \i   Help Screen    turn off with ^J     prev. screen ^[,    next screen ^[.     \i
-\i \i\u\bMACROS\b\u      \u\bMISC\b\u          \u\bSCROLL\b\u      \u\bSHELL\b\u       \u\bGOTO\b\u        \u\bI-SEARCH\b\u       \i \i
-\i \i^[( Record  ^Q? status    ^Q. Right   ^K' Window  ^QB to ^KB  ^[R Backwards  \i \i
-\i \i^[) Stop    ^QQ repeat    ^Q, Left    ^[! Command ^QK to ^KK  ^[S Forwards   \i \i
-\i \i^[ 0-9 Play ^QM Math      \u\bCharSEARCH\b\u  \u\bQUOTE\b\u       \u\bDELETE\b\u      \u\bBOOKMARKS\b\u      \i \i
-\i \i^[? Query   ^KA CenterLn. ^QH forwrd   ` Ctrl-    ^[Y yank    ^K 0-9 Set     \i \i
-\i \i^[D Dump    ^[H Message   ^QG backwd  ^P Meta-    ^[O word<   ^Q 0-9 Goto    \i \i
+\i \i\u\bMACROS\b\u       \u\bMISC\b\u         \u\bSCROLL\b\u      \u\bSHELL\b\u       \u\bGOTO\b\u        \u\bI-SEARCH\b\u       \i \i
+\i \i^[( Record   ^Q? status   ^Q. Right   ^K' Window  ^QB to ^KB  ^[R Backwards  \i \i
+\i \i^[) Stop     ^QQ repeat   ^Q, Left    ^[! Command ^QK to ^KK  ^[S Forwards   \i \i
+\i \i^[? Query    ^QM Math     \u\bCharSEARCH\b\u  \u\bQUOTE\b\u       \u\bDELETE\b\u      \u\bBOOKMARKS\b\u      \i \i
+\i \i^[D Dump     ^[H Message  ^QH forwrd   ` Ctrl-    ^[Y yank    ^K 0-9 Set     \i \i
+\i \i^[ 0-9 Play  ^N  Play #0  ^QG backwd  ^P Meta-    ^[O word<   ^Q 0-9 Goto    \i \i
+\i \i \u\bIn math mode\b\u, use 0xCAFE for hex. All ops are floating point internally.    \i \i
+\i \i \u\bPredefined variables:\b\u byte col height line lines top width                  \i \i
 }
 
 {Programs
 \i   Help Screen    turn off with ^J     prev. screen ^[,    next screen ^[.     \i
-\i \i\u\bGOTO\b\u                  \u\bINDENT\b\u         \u\bCOMPILING\b\u                   \u\bMACROS\b\u      \i \i
-\i \i^Q[ Matching brace    ^K. more       ^[C Compile & parse errors  ^N play #0  \i \i
-\i \i^QP Previous place    ^K, less       ^[E Parse errors            \u\bSLIDING\b\u     \i \i
-\i \i^K= Next place        \u\bSPECIAL\b\u        ^[M Goto next error         ^W up       \i \i
-\i \i^K; Split+Tag search  ^[- jexecmd    ^[N Goto previous error     ^Z down     \i \i
+\i \i\u\bGOTO\b\u                  \u\bCOMPILING\b\u                    \u\bINDENT\b\u       \u\bSLIDING\b\u      \i \i
+\i \i^Q- to column number  ^[C Compile & parse errors   ^K. more     ^W up        \i \i
+\i \i^QI to line number    ^[E Parse errors             ^K, less     ^Z down      \i \i
+\i \i^QP previous place    \u\bGOTO AFTER COMPILING\b\u         ^KA center   \u\bINSERT MATH\b\u  \i \i
+\i \i^K= next place        ^[N previous error    \u\bSPECIAL\b\u             ^[# equation \i \i
+\i \i^Q[ matching brace    ^[M next error        ^[- exec. juppcmd   ^[= result   \i \i
 }
 
 {Search
 \i \i go to \uhttp://sf.net/projects/joe-editor/\u for upstream bug reports. JUPP 2.8 \i \i
 \i \i for DOS compiled by A. Totlis, packed with LHarc 2.13; JUPP 3.x for UNIX\d(R)\d \i \i
 \i \i at \uhttp://mirbsd.de/jupp\u and by \bThorsten "\dmirabilos\d" Glaser <\utg@mirbsd.org\u>\b \i \i
-\i \i @(#) jupprc 2012-09-02; 3.1; autoCR-LF; UTF-8 via locale; per-file encoding \i \i
+\i \i @(#) jupprc 2012-12-30; 3.1; autoCR-LF; UTF-8 via locale; per-file encoding \i \i
 }
 
 {CharTable
 \i \i 112  70 | pqrs tuvw  xyz{ |}~\7f    ðñòó ôõö÷  øùúû üýþÿ | F0  240            \i \i
 }
 
+{Paste
+\i                                                                               \i
+\i \i \u\bPaste Mode\b\u     turn off with \b^D\b or \b^[[201~\b                                  \i \i
+}
 
 :windows
 type           ^@ TO ÿ
@@ -474,6 +519,8 @@ math                ^Q M
 math           ^Q ^M
 math           ^Q m
 math           ^[ q m
+mathins                ^[ #
+mathres                ^[ =
 msg            ^[ H
 msg            ^[ h
 nextw          ^K N
@@ -497,11 +544,21 @@ shell             ^K ^Z
 shell          ^K z
 stop           ^[ )
 
+:Paste
+type                                   ^@ TO ÿ
+rtn                                    ^M
+msg,"Entered bracketed paste mode",rtn ^[ [ 2 0 0 ~
+helpcard,rtn,keymap,"main",rtn,msg,rtn ^[ [ 2 0 1 ~
+helpcard,rtn,keymap,"main",rtn         ^D
+
 :main
 :inherit windows
 bof,qrepl,"\\[",quote,"i",quote,"k",quote,"l",quote,"m ]\\+\\[",quote,"i",quote,"k",quote,"l",quote,"m ]\\$",rtn,rtn,rtn,"r",eof       ^K ]
 edit,rtn,filt,query,parserr    ^[ C
 edit,rtn,filt,query,parserr    ^[ c
+helpcard,"Paste",rtn,keymap,"Paste",rtn        ^[ P
+helpcard,"Paste",rtn,keymap,"Paste",rtn        ^[ p
+helpcard,"Paste",rtn,keymap,"Paste",rtn        ^[ [ 2 0 0 ~
 begin_marking,uparw,toggle_marking     ^[ [ 1 ; 2 A
 begin_marking,dnarw,toggle_marking     ^[ [ 1 ; 2 B
 begin_marking,rtarw,toggle_marking     ^[ [ 1 ; 2 C
@@ -547,9 +604,14 @@ bos                ^Q X
 bos            ^Q ^X
 bos            ^Q x
 bos            ^[ q x
+byte           ^Q O
+byte           ^Q ^O
+byte           ^Q o
+byte           ^[ q o
 center         ^K A
 center         ^K ^A
 center         ^K a
+col            ^Q -
 crawll         ^Q ,
 crawll         ^[ q ,
 crawlr         ^Q .
@@ -685,6 +747,7 @@ run         ^[ !
 save           ^K S
 save           ^K ^S
 save           ^K s
+scratch,"(S) " ^K -
 setmark                ^K 0 TO 9
 shrinkw                ^K T
 shrinkw                ^K ^T
@@ -692,9 +755,9 @@ shrinkw             ^K t
 splitw         ^K O
 splitw         ^K ^O
 splitw         ^K o
-splitw,tag     ^K ;
 stat           ^Q ?
 stat           ^[ q ?
+tag            ^K ;
 tomarkb                ^Q B
 tomarkb                ^Q ^B
 tomarkb                ^Q b
diff --git a/macro.c b/macro.c
index 969c455..b3d181b 100644 (file)
--- a/macro.c
+++ b/macro.c
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/macro.c,v 1.6 2010/04/08 15:31:01 tg Exp $ */
+/* $MirOS: contrib/code/jupp/macro.c,v 1.7 2012/12/22 00:06:11 tg Exp $ */
 /*
  *     Keyboard macros
  *     Copyright
@@ -386,6 +386,7 @@ static int argset = 0;              /* Set if 'arg' is set */
 int exmacro(MACRO *m, int u)
 {
        int larg;
+       /*XXX why is this local here and global below? */
        int negarg = 0;
        int flg = 0;
        CMD *cmd = NULL;
@@ -399,9 +400,9 @@ int exmacro(MACRO *m, int u)
                        negarg = 1;
                        larg = -larg;
                }
-               if (m->steps)
-                       negarg = 0;
-               else {
+               if (m->steps) {
+                       ; /* dead store: negarg = 0; */
+               else {
                        cmd = m->cmd;
                        if (!cmd->arg)
                                larg = 0;
diff --git a/main.c b/main.c
index 67bddd8..df04d4d 100644 (file)
--- a/main.c
+++ b/main.c
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/main.c,v 1.17 2012/06/07 23:38:17 tg Exp $ */
+/* $MirOS: contrib/code/jupp/main.c,v 1.19 2012/12/30 21:45:16 tg Exp $ */
 
 #define JUPP_IS_COPYRIGHT_C_BY "2012 mirabilos"
 
@@ -67,6 +67,8 @@ unsigned char *exmsg = NULL;          /* Message to display when exiting the editor */
 
 SCREEN *maint;                 /* Main edit screen */
 
+const char null[] = "";
+
 /* Make windows follow cursor */
 
 void dofollows(void)
@@ -399,7 +401,7 @@ int main(int argc, char **argv, char **envp)
                                                /* update keymap */
                                                rmkbd(bw->parent->kbd);
                                                bw->parent->kbd =
-                                                   mkkbd(kmap_getcontext(bw->o.context));
+                                                   mkkbd(kmap_getcontext(bw->o.context, 1));
                                        }
                                }
                                bw->b->o = bw->o;
diff --git a/main.h b/main.h
index 21eefc2..ee0318f 100644 (file)
--- a/main.h
+++ b/main.h
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/main.h,v 1.2 2008/05/13 13:08:23 tg Exp $ */
+/* $MirOS: contrib/code/jupp/main.h,v 1.3 2012/12/22 00:06:12 tg Exp $ */
 /*
  *     Editor startup and edit loop
  *     Copyright
@@ -12,6 +12,8 @@
 #include "config.h"
 #include "types.h"
 
+extern const char null[];
+
 extern unsigned char *exmsg;   /* Exit message */
 extern int help;               /* Set to start with help on */
 extern SCREEN *maint;          /* Primary screen */
diff --git a/menu.c b/menu.c
index 0028c55..cb9fd9f 100644 (file)
--- a/menu.c
+++ b/menu.c
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/menu.c,v 1.4 2009/10/18 14:52:56 tg Exp $ */
+/* $MirOS: contrib/code/jupp/menu.c,v 1.5 2012/12/22 00:06:13 tg Exp $ */
 /*
  *     Menu selection window
  *     Copyright
@@ -80,12 +80,10 @@ static void menudisp(MENU *m)
                s += m->t->t->co;
                a += m->t->t->co;
        }
-       m->parent->cury = (m->cursor - m->top) / m->perline;
+       m->parent->cury = (m->cursor - m->top) / (m->perline ? m->perline : 1);
        col = txtwidth(m->list[m->cursor],strlen((char *)m->list[m->cursor]));
-       if (col < m->width)
-               m->parent->curx = ((m->cursor - m->top) % m->perline) * (m->width + 1) + col;
-       else
-               m->parent->curx = ((m->cursor - m->top) % m->perline) * (m->width + 1) + m->width;
+       m->parent->curx = ((m->cursor - m->top) % (m->perline ? m->perline : 1)) *
+           (m->width + 1) + (col < m->width ? col : m->width);
 }
 
 static void menumove(MENU *m, int x, int y)
diff --git a/path.c b/path.c
index 2642747..566491c 100644 (file)
--- a/path.c
+++ b/path.c
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/path.c,v 1.7 2012/06/07 22:18:23 tg Exp $ */
+/* $MirOS: contrib/code/jupp/path.c,v 1.8 2012/12/19 21:14:53 tg Exp $ */
 /* 
  *     Directory and path functions
  *     Copyright
@@ -225,12 +225,12 @@ unsigned char *mktmp(unsigned char *where)
        if (!where)
                where = US _PATH_TMP;
 
-       namesize = strlen((char *)where) + 16;
+       namesize = strlen((char *)where) + 20;
        name = vsmk(namesize);  /* [G.Ghibo'] we need to use vsmk() and not malloc() as
                                   area returned by mktmp() is destroyed later with
                                   vsrm(); */
 #ifdef HAVE_MKSTEMP
-       joe_snprintf_1((char *)name, namesize, "%s/joe.tmp.XXXXXX", where);
+       joe_snprintf_1((char *)name, namesize, "%s/joe.tmp.XXXXXXXXXX", where);
        if((fd = mkstemp((char *)name)) == -1)
                return NULL;    /* FIXME: vflsh() and vflshf() */
                                /* expect mktmp() always succeed!!! */
@@ -242,12 +242,13 @@ unsigned char *mktmp(unsigned char *where)
 
 #else
       loop:
-       seq = (seq + 1) % 1000;
-       joe_snprintf_3(name, namesize, "%s/joe.tmp.%03u%03u", where, seq, (unsigned) time(NULL) % 1000);
+       seq = (seq + 1) % 10000;
+       joe_snprintf_3(name, namesize, "%s/joe.tmp.%04u%05u", where, seq, (unsigned) time(NULL) % 100000);
        if ((fd = open(name, O_RDONLY)) != -1) {
                close(fd);
                goto loop;      /* FIXME: possible endless loop --> DoS attack */
        }
+#warning "Waah, this is insecure! Consider getting mkstemp!"
        if ((fd = open(name, O_RDWR | O_CREAT | O_EXCL, 0600)) == -1)
                return NULL;    /* FIXME: see above */
        else
diff --git a/rc.c b/rc.c
index dee66ac..6ac91c4 100644 (file)
--- a/rc.c
+++ b/rc.c
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/rc.c,v 1.18 2012/06/08 16:45:00 tg Exp $ */
+/* $MirOS: contrib/code/jupp/rc.c,v 1.19 2012/12/30 21:45:16 tg Exp $ */
 /*
  *     *rc file parser
  *     Copyright
@@ -51,13 +51,17 @@ static struct context {
  * is created.
  */
 
-KMAP *kmap_getcontext(unsigned char *name)
+KMAP *kmap_getcontext(unsigned char *name, int docreate)
 {
        struct context *c;
 
        for (c = contexts; c; c = c->next)
                if (!strcmp(c->name, name))
                        return c->kmap;
+
+       if (!docreate)
+               return (NULL);
+
        c = (struct context *) joe_malloc(sizeof(struct context));
 
        c->next = contexts;
@@ -71,7 +75,7 @@ OPTIONS *options = NULL;
 /* Global variable options */
 extern int mid, dspasis, dspctrl, help, square, csmode, nobackups, lightoff, exask, skiptop;
 extern int noxon, lines, columns, Baud, dopadding, orphan, marking, keepup, nonotice;
-extern int notite, usetabs, assume_color, guesscrlf, guessindent, menu_explorer, icase, wrap, autoswap;
+extern int notite, pastetite, usetabs, assume_color, guesscrlf, guessindent, menu_explorer, icase, wrap, autoswap;
 extern unsigned char *backpath;
 
 /* Default options for prompt windows */
@@ -121,6 +125,7 @@ OPTIONS pdefault = {
 
 /* Default options for file windows */
 
+char main_context[] = "main";
 OPTIONS fdefault = {
        NULL,           /* *next */
        NULL,           /* *name_regex */
@@ -133,7 +138,7 @@ OPTIONS fdefault = {
        8,              /* tab */
        ' ',            /* indent char */
        1,              /* indent step */
-       US "main",              /* *context */
+       US main_context,        /* *context */
        US "\\i%n %m %M",       /* *lmsg */
        US " %S Ctrl-K H for help",     /* *rmsg */
        NULL,           /* *hmsg */
@@ -289,6 +294,7 @@ struct glopts {
        {US "columns",  1, &columns, NULL, 0, 0, 0, 0, 2, 1024 },
        {US "skiptop",  1, &skiptop, NULL, 0, 0, 0, 0, 0, 64 },
        {US "notite",   0, &notite, NULL, 0, 0, 0 },
+       {US "pastetite", 0, &pastetite, NULL, 0, 0, 0 },
        {US "usetabs",  0, &usetabs, NULL, 0, 0, 0 },
        {US "assume_color", 0, &assume_color, NULL, 0, 0, 0 },
        { NULL,         0, NULL, NULL, NULL, NULL, NULL, 0, 0, 0 }
@@ -1019,7 +1025,7 @@ int procrc(CAP *cap, unsigned char *name)
                                                        for (c = x; !joe_isspace_eof(locale_map,buf[c]); ++c) ;
                                                        buf[c] = 0;
                                                        if (c != x)
-                                                               kcpy(context, kmap_getcontext(buf + x));
+                                                               kcpy(context, kmap_getcontext(buf + x, 1));
                                                        else {
                                                                err = 1;
                                                                fprintf(stderr, "\n%s:%d: context name missing from :inherit", name, line);
@@ -1060,7 +1066,7 @@ int procrc(CAP *cap, unsigned char *name)
                                                        err = 1;
                                                        fprintf(stderr, "\n%s:%d: No context selected for :delete", name, line);
                                        } else
-                                               context = kmap_getcontext(buf + 1);
+                                               context = kmap_getcontext(buf + 1, 1);
                                else {
                                        err = 1;
                                        fprintf(stderr, "\n%s:%d: Invalid context name", name, line);
diff --git a/rc.h b/rc.h
index f7270be..b389fa2 100644 (file)
--- a/rc.h
+++ b/rc.h
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/rc.h,v 1.3 2008/05/13 13:08:24 tg Exp $ */
+/* $MirOS: contrib/code/jupp/rc.h,v 1.4 2012/12/30 21:45:16 tg Exp $ */
 /*
  *     *rc file parser
  *     Copyright
@@ -20,7 +20,7 @@ void setopt PARAMS((B *b, unsigned char *name));
  * Find and return the KMAP for a given context name.  If none is found, an
  * empty kmap is created, bound to the context name, and returned.
  */
-KMAP *kmap_getcontext PARAMS((unsigned char *name));
+KMAP *kmap_getcontext PARAMS((unsigned char *name, int docreate));
 
 /* int procrc(CAP *cap, char *name);  Process an rc file
    Returns 0 for success
diff --git a/regex.c b/regex.c
index 9aecf9b..9cdc2e0 100644 (file)
--- a/regex.c
+++ b/regex.c
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/regex.c,v 1.4 2010/04/08 15:31:03 tg Exp $ */
+/* $MirOS: contrib/code/jupp/regex.c,v 1.5 2012/12/22 00:06:13 tg Exp $ */
 /*
  *     Regular expression subroutines
  *     Copyright
@@ -227,7 +227,7 @@ static int skip_special(P *p)
                break;
        case '\'':
                if ((s = pgetc(p)) == '\\') {
-                       s = pgetc(p);
+                       pgetc(p);
                        s = pgetc(p);
                }
                if (s == '\'')
index 23d6d9d..09828fd 100644 (file)
--- a/rjoerc.in
+++ b/rjoerc.in
@@ -1,4 +1,4 @@
- $MirOS: contrib/code/jupp/rjoerc.in,v 1.8 2011/10/04 22:35:46 tg Exp $
+ $MirOS: contrib/code/jupp/rjoerc.in,v 1.10 2012/12/30 21:45:16 tg Exp $
 
                          Initialization file for JOE
                             Restricted access Joe
@@ -69,6 +69,8 @@
 -notite         Don't send terminal initialization and termination strings: prevents
                 restoration of screen on exit.
 
+-pastetite     Enter bracketed paste mode automatically for TERM=xterm-xfree86
+
  -usetabs       Use tabs to help optimize screen update.
 
 -assume_color  Assume terminal has ANSI color support even if termcap/terminfo entry
 
  Default local options
 -highlight
--istep 2
+-french
+-indentc 9
+-istep 1
+-purify
+-smartbacks
+-tab 8
+--wordwrap
 
- No '.' in file name?  Assume it's a text file and we want wordwrap on.
+ === Generic files
+ No '.' in filename?
 *
+ Assume it's a text file and, except in jupp, we want wordwrap on.
 -wordwrap
 
- File name with '.'?  It's probably not a text file.
+ Filename with '.' is probably not a text file.
 *.*
 
- Diff
-*
-+--- 
+ === Patterns with multiple wildcards
+ Order is latest match wins, so...
+*/patch-*
+-highlight
 -syntax diff
 
-*
-+*** 
--syntax diff
+*.sh*
+-syntax sh
 
-*
-+\[1-9]\+\[0-9]\[cda]
--syntax diff
+*.ksh*
+-syntax sh
 
- Text file.
-*.txt
--wordwrap
+*.mksh*
+-syntax sh
 
- Assembly language
-*.asm
+*.bash*
+-syntax sh
+
+*tmp/mutt-*
 -wordwrap
--syntax asm
+-syntax mail
 
-*.s
+*tmp/pico.*
 -wordwrap
+-syntax mail
+
+*/mail/*
+-syntax mail
+
+*/patches/*
+-highlight
+-syntax diff
+
+ === Assembly
+*.asm
 -syntax asm
 
 *.S
--wordwrap
 -syntax asm
 
- Mason
-*.mas
--autoindent
--syntax mason
--smarthome
--smartbacks
-
- Perl
-*
-+#!\+\[        ]\+\[a-z/]/perl\>
--autoindent
--syntax perl
--smarthome
--smartbacks
-
-*.pl
--autoindent
--syntax perl
--smarthome
--smartbacks
+*.s
+-syntax asm
 
-*.pm
--autoindent
--syntax perl
--smarthome
--smartbacks
+ === C, C++, Objective-C
+*.C
+-syntax c
 
- C language file
 *.c
--autoindent
 -syntax c
--smarthome
--smartbacks
--purify
+
+*.cc
+-syntax c
 
 *.cpp
--autoindent
 -syntax c
--smarthome
--smartbacks
--purify
+
+*.cxx
+-syntax c
 
 *.c++
--autoindent
 -syntax c
--smarthome
--smartbacks
--purify
 
- C language header file
 *.h
--autoindent
 -syntax c
--smarthome
--smartbacks
--purify
+
+*.hh
+-syntax c
 
 *.hpp
--autoindent
 -syntax c
--smarthome
--smartbacks
--purify
 
 *.h++
--autoindent
 -syntax c
--smarthome
--smartbacks
--purify
-
- Verilog file
-*.v
--autoindent
--syntax verilog
--istep 2
--smarthome
--smartbacks
--purify
-
- Verilog header file
-*.vh
--autoindent
--syntax verilog
--istep 2
--smarthome
--smartbacks
--purify
 
- VHDL file
-*.vhd
--autoindent
--syntax vhdl
--istep 2
--smarthome
--smartbacks
--purify
+*.m
+-syntax c
 
- XML
-*.xml
--wordwrap
--autoindent
--syntax xml
+ === C Shell
+*.csh
+-syntax csh
 
- HTML
-*.htm
--wordwrap
--autoindent
--syntax html
+*.login
+-syntax csh
 
-*.html
--wordwrap
--autoindent
--syntax html
+*.logout
+-syntax csh
 
- JAVA
-*.java
--autoindent
--syntax java
--smarthome
--smartbacks
--purify
+*.tcsh
+-syntax csh
 
- Hypertext preprocessor file
-*.php
--autoindent
--syntax php
--smarthome
--smartbacks
--purify
+*.tcshrc
+-syntax csh
 
- Python
 *
-+#!\+\[        ]\+\[a-z/]/python
--autoindent
--syntax python
--smarthome
--smartbacks
--purify
-
-*.py
--autoindent
--syntax python
--smarthome
--smartbacks
--purify
++#!\+\[         ]\+\[a-z/]/\+tcsh\>
+-syntax csh
 
- CSH
 *
-+#!\+\[        ]\+\[a-z/]/csh\>
--autoindent
++#!\+\[         ]\+\[a-z/]/env\+\[      ]\+tcsh\>
 -syntax csh
 
-*.csh
--autoindent
--syntax csh
+ === Diff
+*.diff
+-highlight
+-syntax diff
 
-*.cshrc
--autoindent
--syntax csh
+*.patch
+-highlight
+-syntax diff
 
-*.login
--autoindent
--syntax csh
+*.rej
+-highlight
+-syntax diff
 
-*.logout
--autoindent
--syntax csh
+*.debdiff
+-highlight
+-syntax diff
 
- TCSH
 *
-+#!\+\[        ]\+\[a-z/]/tcsh\>
--autoindent
--syntax csh
-
-*.tcsh
--autoindent
--syntax csh
++---\[ ]
+-highlight
+-syntax diff
 
-*.tcshrc
--autoindent
--syntax csh
+*
++***\[ ]
+-highlight
+-syntax diff
 
- Shell
 *
-+#!\+\[        ]\+\[a-z/]/sh\>
--autoindent
--syntax sh
++\[1-9]\+\[0-9]\[cda]
+-highlight
+-syntax diff
 
-*.sh
--autoindent
--syntax sh
+*
++Index: \*\n======================================================
+-highlight
+-syntax diff
 
-*profile
--autoindent
--syntax sh
+*
++\[=?]\*\n--- \*\n+++\[ ]
+-highlight
+-syntax diff
 
- BASH Shell
 *
-+#!\+\[        ]\+\[a-z/]/bash\>
--autoindent
--syntax sh
++diff\*\n--- \*\n+++\[ ]
+-highlight
+-syntax diff
 
-*.bash
--autoindent
--syntax sh
+ === eMail
+*.eml
+-syntax mail
 
-*.bash_login
--autoindent
--syntax sh
+ Not quite eMail but still RFC822
+*.mht
+-syntax mail
 
-*.bash_logout
--autoindent
--syntax sh
+ === FORTRAN
+*.f
+-syntax fortran
+
+*.for
+-syntax fortran
+
+*.FOR
+-syntax fortran
+
+*.f77
+-syntax fortran
+
+*.F77
+-syntax fortran
+
+*.f90
+-syntax fortran
+
+*.F90
+-syntax fortran
+
+ === GNU autoconf
+*.ac
+-syntax conf
+
+*.am
+-syntax conf
 
- LISP
+ === HTML
+*.htm
+-encoding utf8
+-syntax html
+
+*.html
+-encoding utf8
+-syntax html
+
+ === Java
+*.java
+-encoding utf8
+-syntax java
+
+ === Joe Syntax File
+*.jsf
+-syntax conf
+
+ === flex
+*.l
+-syntax lex
+
+ === LISP
 *.lisp
--autoindent
 -syntax lisp
 
 *.lsp
--autoindent
 -syntax lisp
 
 *.el
--autoindent
 -syntax lisp
 
- KSH
-*
-+#!\+\[        ]\+\[a-z/]/ksh\>
--autoindent
--syntax sh
-
-*.ksh
--autoindent
--syntax sh
+ === M4
+*.m4
+-syntax m4
 
Makefile
=== Make
 *akefile
--autoindent
 -syntax conf
 
 *AKEFILE
--autoindent
 -syntax conf
 
- Pascal
+ === Mason
+*.mas
+-syntax mason
+
+ === Pascal
 *.p
--autoindent
 -syntax pascal
--smarthome
--smartbacks
--purify
 
 *.pas
--autoindent
 -syntax pascal
--smarthome
--smartbacks
--purify
 
- Fortran
-*.f
--autoindent
--syntax fortran
+ === Perl
+*.pl
+-syntax perl
 
-*.for
--autoindent
--syntax fortran
+*.pm
+-syntax perl
 
-*.FOR
--autoindent
--syntax fortran
+*
++#!\+\[         ]\+\[a-z/]/perl
+-syntax perl
 
- YACC
-*.y
--autoindent
--syntax yacc
+*
++#!\+\[         ]\+\[a-z/]/env\+\[      ]perl
+-syntax perl
 
- LEX
-*.l
--autoindent
--syntax lex
+ === PHP
+*.php
+-syntax php
+
+ === Python
+*.py
+-encoding utf8
+-syntax python
+--guess_indent
+-tab 4
+-indentc 32
+-istep 4
+-spaces
+
+*
++#!\+\[         ]\+\[a-z/]/python
+-encoding utf8
+-syntax python
+--guess_indent
+-tab 4
+-indentc 32
+-istep 4
+-spaces
+
+*
++#!\+\[         ]\+\[a-z/]/env\+\[      ]python
+-encoding utf8
+-syntax python
+--guess_indent
+-tab 4
+-indentc 32
+-istep 4
+-spaces
+
+ === Bourne, Korn, POSIX Shell
+*profile
+-syntax sh
+
+*
++:\[    \n]
+-syntax sh
+
+*
++#!\+\[         ]\+\[a-z/]/\+\[bd]\+ash\>
+-syntax sh
+
+*
++#!\+\[         ]\+\[a-z/]/env\+\[      ]\+\[bd]\+ash\>
+-syntax sh
 
- TCL
+*
++#!\+\[         ]\+\[a-z/]/\+\[a-z]ksh\+\[0-9._-]\>
+-syntax sh
+
+*
++#!\+\[         ]\+\[a-z/]/env\+\[      ]\+\[a-z]ksh\+\[0-9._-]\>
+-syntax sh
+
+ === TCL
 *.tcl
--autoindent
 -syntax tcl
 
- Joe Syntax File
-*.jsf
--autoindent
--syntax conf
+ === Text
+*.txt
+-guess_indent
+-wordwrap
 
- Autoconfig file
-*.ac
--autoindent
--syntax conf
+ === Verilog
+*.v
+-syntax verilog
+-istep 2
 
- M4 file
-*.m4
--autoindent
--syntax m4
+*.vh
+-syntax verilog
+-istep 2
 
- Automake file
-*.am
--autoindent
--syntax conf
+ === VHDL
+*.vhd
+-syntax vhdl
+-istep 2
 
- Mail file
-*tmp/mutt-*
--wordwrap
--syntax mail
+ === XML
+*.xml
+-encoding utf8
+-syntax xml
+
+ === yacc
+*.y
+-syntax yacc
 
  THIRD SECTION: Named help screens:
 
 \i \i 112  70 | pqrs tuvw  xyz{ |}~\7f    ðñòó ôõö÷  øùúû üýþÿ | F0  240            \i \i
 }
 
+{Paste
+\i                                                                               \i
+\i \i \u\bPaste Mode\b\u     turn off with \b^D\b or \b^[[201~\b                                  \i \i
+}
+
  FOURTH SECTION: Key bindings:
 
  Section names you must provide:
@@ -754,9 +768,18 @@ rtn                ^M              Return
  shell         ^K z
 stop           ^K ]            Stop recording
 
+:Paste
+type                                   ^@ TO ÿ
+rtn                                    ^M
+msg,"Entered bracketed paste mode",rtn ^[ [ 2 0 0 ~
+helpcard,rtn,keymap,"main",rtn,msg,rtn ^[ [ 2 0 1 ~
+helpcard,rtn,keymap,"main",rtn         ^D
+
 :main                  Text editing window
 :inherit windows
 
+helpcard,"Paste",rtn,keymap,"Paste",rtn        ^[ [ 2 0 0 ~
+
  Spell-check macros
 
  Ispell
diff --git a/scrn.c b/scrn.c
index 9496009..ed23f2a 100644 (file)
--- a/scrn.c
+++ b/scrn.c
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/scrn.c,v 1.8 2011/10/04 20:05:29 tg Exp $ */
+/* $MirOS: contrib/code/jupp/scrn.c,v 1.11 2012/12/30 21:45:17 tg Exp $ */
 /*
  *     Device independant TTY interface for JOE
  *     Copyright
@@ -27,6 +27,7 @@ int skiptop = 0;
 int lines = 0;
 int columns = 0;
 int notite = 0;
+int pastetite = 0;
 int usetabs = 0;
 int assume_color = 0;
 
@@ -477,17 +478,41 @@ SCRN *nopen(CAP *cap)
        t->xn = getflag(t->cap,US "xn");
        t->am = getflag(t->cap,US "am");
 
-       if (notite)
-               t->ti = 0;
-       else
-               t->ti = jgetstr(t->cap,US "ti");
        t->cl = jgetstr(t->cap,US "cl");
        t->cd = jgetstr(t->cap,US "cd");
 
-       if (notite)
-               t->te = 0;
-       else
+       if (notite) {
+               t->ti = NULL;
+               t->te = NULL;
+       } else {
+               t->ti = jgetstr(t->cap,US "ti");
                t->te = jgetstr(t->cap,US "te");
+       }
+       if (pastetite && t->cap->paste_on && t->cap->paste_off) {
+               if (notite) {
+                       t->ti = (void *)strdup(t->cap->paste_on);
+                       t->te = (void *)strdup(t->cap->paste_off);
+               } else {
+                       size_t n1, n2;
+                       char *cp;
+
+                       n1 = t->ti ? strlen(t->ti) : 0;
+                       n2 = strlen(t->cap->paste_on);
+                       cp = joe_malloc(n1 + n2 + 1);
+                       if (t->ti)
+                               memcpy(cp, t->ti, n1);
+                       memcpy(cp + n1, t->cap->paste_on, n2 + 1);
+                       t->ti = cp;
+
+                       n1 = t->te ? strlen(t->te) : 0;
+                       n2 = strlen(t->cap->paste_off);
+                       cp = joe_malloc(n1 + n2 + 1);
+                       memcpy(cp, t->cap->paste_off, n2 + 1);
+                       if (t->te)
+                               memcpy(cp + n2, t->te, n1 + 1);
+                       t->te = cp;
+               }
+       }
 
        t->ut = getflag(t->cap,US "ut");
        t->Sb = jgetstr(t->cap,US "AB");
@@ -1023,7 +1048,7 @@ static void cposs(register SCRN *t, register int x, register int y)
        if (t->cho + t->ccv < bestcost) {
                cost = tcost(t->cap, t->ho, 1, 0, 0, 0, 0) + tcost(t->cap, t->cv, 1, y, 0, 0, 0) + relcost(t, x, y, 0, y);
                if (cost < bestcost) {
-                       bestcost = cost;
+                       /* dead store: bestcost = cost; */
                        bestway = 12;
                }
        }
@@ -1897,7 +1922,7 @@ int txtwidth(unsigned char *s,int len)
 
 /* Generate text with formatting escape sequences */
 
-void genfmt(SCRN *t, int x, int y, int ofst, unsigned char *s, int flg)
+void genfmt(SCRN *t, int x, int y, int ofst, const unsigned char *s, int flg)
 {
        int *scrn = t->scrn + y * t->co + x;
        int *attr = t->attr + y * t->co + x;
@@ -1987,7 +2012,7 @@ void genfmt(SCRN *t, int x, int y, int ofst, unsigned char *s, int flg)
 
 /* Determine column width of string with format codes */
 
-int fmtlen(unsigned char *s)
+int fmtlen(const unsigned char *s)
 {
        int col = 0;
        struct utf8_sm sm;
diff --git a/scrn.h b/scrn.h
index abdb31e..3bd619b 100644 (file)
--- a/scrn.h
+++ b/scrn.h
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/scrn.h,v 1.3 2009/10/18 14:52:57 tg Exp $ */
+/* $MirOS: contrib/code/jupp/scrn.h,v 1.4 2012/12/30 17:10:58 tg Exp $ */
 /*
  *     Device independant tty interface for JOE
  *     Copyright
@@ -182,10 +182,10 @@ void genfield PARAMS((SCRN *t,int *scrn,int *attr,int x,int y,int ofst,unsigned
 int txtwidth PARAMS((unsigned char *s,int len));
 
 /* Generate a field: formatted */
-void genfmt PARAMS((SCRN *t, int x, int y, int ofst, unsigned char *s, int flg));
+void genfmt PARAMS((SCRN *t, int x, int y, int ofst, const unsigned char *s, int flg));
 
 /* Column width of formatted string */
-int fmtlen PARAMS((unsigned char *s));
+int fmtlen PARAMS((const unsigned char *s));
 
 /* Offset within formatted string of particular column */
 int fmtpos PARAMS((unsigned char *s, int goal));
index 5856dcd..9102aed 100644 (file)
--- a/selinux.c
+++ b/selinux.c
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/selinux.c,v 1.5 2010/04/08 17:54:19 tg Exp $ */
+/* $MirOS: contrib/code/jupp/selinux.c,v 1.6 2012/11/10 16:22:20 tg Exp $ */
 
 #include "config.h"
 #if defined(HAVE_SELINUX_HDR) && defined(HAVE_SELINUX_FUN)
@@ -14,8 +14,8 @@
 #ifdef WITH_SELINUX
 #include <selinux/selinux.h>
 static int selinux_enabled = -1;
+#include <err.h>
 #include <errno.h>
-#include <error.h>
 #include <string.h>
 #endif
 
@@ -42,7 +42,7 @@ copy_security_context(const char *from_file, const char *to_file)
                if (errno == EOPNOTSUPP)
                        return 0;
 
-               error(0, errno, "Could not get security context for %s",
+               warn("Could not get security context for %s",
                      from_file);
                return 1;
        }
@@ -53,7 +53,7 @@ copy_security_context(const char *from_file, const char *to_file)
                msg_outtrans(to_file);
                msg_putchar('\n');
 #else
-               error(0, errno, "Could not get security context for %s",
+               warn("Could not get security context for %s",
                    to_file);
 #endif
                freecon(from_context);
@@ -62,7 +62,7 @@ copy_security_context(const char *from_file, const char *to_file)
 
        if (strcmp(from_context, to_context) != 0) {
                if (setfilecon(to_file, from_context) < 0) {
-                       error(0, errno,
+                       warn(
                              "Could not set security context for %s",
                              to_file);
                        status = 1;
@@ -96,13 +96,13 @@ match_default_security_context(const char *from_file)
                if (errno == EOPNOTSUPP)
                        return 0;
 
-               error(0, errno, "Could not get security context for %s",
+               warn("Could not get security context for %s",
                      from_file);
                return 1;
        }
 
        if (setfscreatecon(scontext) < 0) {
-               error(0, errno,
+               warn(
                      "Could not set default security context for %s",
                      from_file);
                freecon(scontext);
@@ -125,7 +125,7 @@ reset_default_security_context(void)
                return 0;
 
        if (setfscreatecon(0) < 0) {
-               error(0, errno, "Could not reset default security context");
+               warn("Could not reset default security context");
                return 1;
        }
 #endif
@@ -153,12 +153,12 @@ output_security_context(char *from_file)
                if (errno == EOPNOTSUPP)
                        return 0;
                
-               error(0, errno, "Could not get security context for %s",
+               warn("Could not get security context for %s",
                      from_file);
                return 1;
        }
 
-       error(0, 0, "%s Security Context %s", from_file, scontext);
+       fprintf(stderr, "%s Security Context %s", from_file, scontext);
        freecon(scontext);
 #endif
        return 0;
index f57ff12..24945f1 100644 (file)
--- a/syntax.c
+++ b/syntax.c
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/syntax.c,v 1.8 2012/07/18 17:02:56 tg Exp $ */
+/* $MirOS: contrib/code/jupp/syntax.c,v 1.9 2012/12/22 00:06:14 tg Exp $ */
 /*
  *     Syntax highlighting DFA interpreter
  *     Copyright
@@ -218,11 +218,13 @@ struct high_syntax *load_dfa(unsigned char *name)
        syntax->default_cmd.new_state = 0;
        syntax->default_cmd.keywords = 0;
 
+       memset(clist, 0, sizeof(clist));
+
        /* Parse file */
        while(fgets((char *)buf,1023,f)) {
                ++line;
                p = buf;
-               c = parse_ws(&p,'#');
+               parse_ws(&p,'#');
                if(!parse_char(&p, ':')) {
                        if(!parse_ident(&p, bf, 255)) {
 
@@ -327,7 +329,7 @@ struct high_syntax *load_dfa(unsigned char *name)
                                                                while(fgets((char *)buf,1023,f)) {
                                                                        ++line;
                                                                        p = buf;
-                                                                       c = parse_ws(&p,'#');
+                                                                       parse_ws(&p,'#');
                                                                        if (*p) {
                                                                                if(!parse_field(&p,US "done"))
                                                                                        break;
index ba16ada..decac70 100644 (file)
@@ -1,4 +1,4 @@
-# $MirOS: contrib/code/jupp/syntax/python.jsf.in,v 1.4 2012/09/02 14:46:52 tg Exp $
+# $MirOS: contrib/code/jupp/syntax/python.jsf.in,v 1.5 2012/10/23 16:29:16 tg Exp $
 #-
 # JOE syntax highlight file for Python
 
 :ident Idle
        *               idle            noeat strings
        "and"           kw
+       "as"            kw
        "assert"        kw
        "break"         kw
        "class"         kw
        "return"        kw
        "try"           kw
        "while"         kw
+       "with"          kw
        "yield"         kw
 done
        "a-zA-Z0-9_"    ident
index a2a934e..6acce62 100644 (file)
--- a/termcap.c
+++ b/termcap.c
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/termcap.c,v 1.6 2012/06/08 17:05:12 tg Exp $ */
+/* $MirOS: contrib/code/jupp/termcap.c,v 1.8 2012/12/30 21:45:17 tg Exp $ */
 /*
  *     TERMCAP/TERMINFO database interface
  *     Copyright
@@ -164,6 +164,13 @@ CAP *getcap(unsigned char *name, unsigned int baud, void (*out) (unsigned char *
        cap->tbuf = vsmk(4096);
        cap->abuf = NULL;
        cap->sort = NULL;
+       cap->paste_on = NULL;
+       cap->paste_off = NULL;
+
+       if (!strcmp(name, "xterm-xfree86")) {
+               cap->paste_on = "\033[?2004h";
+               cap->paste_off = "\033[?2004l";
+       }
 
 #ifdef TERMINFO
        cap->abuf = (unsigned char *) joe_malloc(4096);
@@ -301,7 +308,7 @@ CAP *getcap(unsigned char *name, unsigned int baud, void (*out) (unsigned char *
                y = cap->sortlen;
                z = -1;
                if (!y) {
-                       z = 0;
+                       /* dead store: z = 0; */
                        goto in;
                }
                while (z != (x + y) / 2) {
diff --git a/tty.c b/tty.c
index 52b8e1e..fb95aba 100644 (file)
--- a/tty.c
+++ b/tty.c
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/tty.c,v 1.17 2012/06/08 16:55:28 tg Exp $ */
+/* $MirOS: contrib/code/jupp/tty.c,v 1.18 2012/12/30 18:18:06 tg Exp $ */
 /*
  *     UNIX Tty and Process interface
  *     Copyright
@@ -108,6 +108,7 @@ int idleout = 1;
 #include "scrn.h"
 #include "tty.h"
 #include "utils.h"
+#include "ushell.h"
 
 /** Aliased defines **/
 
@@ -709,12 +710,9 @@ void ttgtsz(int *x, int *y)
 void ttshell(unsigned char *cmd)
 {
        int x, omode = ttymode;
-       unsigned char *s = (unsigned char *)getenv("SHELL");
+       const char *sh;
 
-       if (!s) {
-               s = US "/bin/sh";
-               /* return; */
-       }
+       sh = getushell();
        ttclsn();
        if ((x = fork()) != 0) {
                if (x != -1)
@@ -724,10 +722,10 @@ void ttshell(unsigned char *cmd)
        } else {
                signrm();
                if (cmd)
-                       execl((char *)s, (char *)s, "-c", cmd, NULL);
+                       execl(sh, sh, "-c", cmd, NULL);
                else {
                        fprintf(stderr, "You are at the command shell.  Type 'exit' to return\n");
-                       execl((char *)s, (char *)s, NULL);
+                       execl(sh, sh, NULL);
                }
                _exit(0);
        }
@@ -1008,7 +1006,7 @@ static unsigned char **newenv(unsigned char **old, unsigned char *s)
 
 /* Create a shell process */
 
-MPX *mpxmk(int *ptyfd, unsigned char *cmd, unsigned char **args, void (*func) (/* ??? */), void *object, void (*die) (/* ??? */), void *dieobj)
+MPX *mpxmk(int *ptyfd, const unsigned char *cmd, unsigned char **args, void (*func) (/* ??? */), void *object, void (*die) (/* ??? */), void *dieobj)
 {
        unsigned char buf[80];
        int fds[2];
@@ -1160,7 +1158,7 @@ MPX *mpxmk(int *ptyfd, unsigned char *cmd, unsigned char **args, void (*func) (/
 #endif
 
                                /* Execute the shell */
-                               execve((char *)cmd, (char **)args, (char **)env);
+                               execve((const char *)cmd, (char **)args, (char **)env);
 
                                /* If shell didn't execute */
                                joe_snprintf_1((char *)buf,sizeof(buf),"Couldn't execute shell '%s'\n",cmd);
diff --git a/tty.h b/tty.h
index 8e412de..accb93f 100644 (file)
--- a/tty.h
+++ b/tty.h
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/tty.h,v 1.4 2010/04/08 15:31:04 tg Exp $ */
+/* $MirOS: contrib/code/jupp/tty.h,v 1.5 2012/12/30 18:18:07 tg Exp $ */
 /*
  *     TTY interface header file
  *     Copyright
@@ -183,7 +183,7 @@ void signrm PARAMS((void));
  *   Function to call when process dies in 'die'
  *   The first arg passed to func and die is object and dieobj
  */
-MPX *mpxmk PARAMS((int *ptyfd, unsigned char *cmd, unsigned char **args, void (*func) (/* ??? */), void *object, void (*die) (/* ??? */), void *dieobj));
+MPX *mpxmk PARAMS((int *ptyfd, const unsigned char *cmd, unsigned char **args, void (*func) (/* ??? */), void *object, void (*die) (/* ??? */), void *dieobj));
 
 /* int subshell(int *ptyfd);
  * Execute a subshell.  Returns 'pid' of shell or zero if there was a
diff --git a/types.h b/types.h
index 13b484a..cdc4b9e 100644 (file)
--- a/types.h
+++ b/types.h
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/types.h,v 1.8 2012/06/08 16:55:28 tg Exp $ */
+/* $MirOS: contrib/code/jupp/types.h,v 1.11 2012/12/30 21:45:17 tg Exp $ */
 
 #ifndef _JOE_TYPES_H
 #define _JOE_TYPES_H
 #include <sys/types.h>                         /* we need pid_t */
 #endif
 
+#if defined(DEBUG) || defined(__COVERITY__)
+#define mkssert(e)     ((e) ? (void)0 : exit(255))
+#else
+#define mkssert(e)     ((void)0)
+#endif
+
 #define LINK(type) struct { type *next; type *prev; }
 
 #define KEYS           256
@@ -288,8 +294,8 @@ struct window {
        } object;
 #endif
 
-       unsigned char   *msgt;          /* Message at top of window */
-       unsigned char   *msgb;          /* Message at bottom of window */
+       const unsigned char *msgt;      /* Message at top of window */
+       const unsigned char *msgb;      /* Message at bottom of window */
        unsigned char   *huh;           /* Name of window for context sensitive hlp */
        int     *notify;        /* Address of kill notification flag */
 };
@@ -488,6 +494,8 @@ struct cap {
        void    *outptr;        /* First arg passed to output routine.  Second
                                   arg is character to write */
        int     dopadding;      /* Set if pad characters should be used */
+       const char *paste_on;   /* Enable bracketed paste mode */
+       const char *paste_off;  /* Disable bracketed paste mode */
 };
 
 
index 2ff3719..bf8b3fb 100644 (file)
--- a/ublock.c
+++ b/ublock.c
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/ublock.c,v 1.6 2011/07/16 21:57:58 tg Exp $ */
+/* $MirOS: contrib/code/jupp/ublock.c,v 1.8 2012/12/30 18:43:40 tg Exp $ */
 /*
  *     Highlighted block functions
  *     Copyright
@@ -29,6 +29,8 @@
 #include "uedit.h"
 #include "utils.h"
 #include "vs.h"
+#include "poshist.h"
+#include "ushell.h"
 #include "utf8.h"
 #include "charmap.h"
 #include "w.h"
@@ -916,8 +918,15 @@ int doinsf(BW *bw, unsigned char *s, void *object, int *notify)
                if (error) {
                        msgnw(bw->parent, msgs[-error]), brm(tmp);
                        ret = -1;
-               } else
+               } else {
+                       P *pafter;
+
+                       pafter = pdup(bw->cursor);
+                       pgetc(pafter);
                        binsb(bw->cursor, tmp);
+                       prgetc(pafter);
+                       aftermove(bw->parent, pafter);
+               }
                vsrm(s);
                bw->cursor->xcol = piscol(bw->cursor);
                return ret;
@@ -959,6 +968,7 @@ static int dofilt(BW *bw, unsigned char *s, void *object, int *notify)
        npartial(bw->parent->t->t);
        ttclsn();
        if (!fork()) {
+               const char *sh;
 #ifdef HAVE_PUTENV
                unsigned char           *fname, *name;
                unsigned        len;
@@ -984,7 +994,8 @@ static int dofilt(BW *bw, unsigned char *s, void *object, int *notify)
                putenv((char *)fname);
                vsrm(fname);
 #endif
-               execl("/bin/sh", "/bin/sh", "-c", s, NULL);
+               sh = getushell();
+               execl(sh, sh, "-c", s, NULL);
                _exit(0);
        }
        close(fr[1]);
diff --git a/ufile.c b/ufile.c
index 0197a3d..369f79d 100644 (file)
--- a/ufile.c
+++ b/ufile.c
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/ufile.c,v 1.4 2010/04/08 15:31:05 tg Exp $ */
+/* $MirOS: contrib/code/jupp/ufile.c,v 1.8 2012/12/20 21:39:28 tg Exp $ */
 /*
  *     User file operations
  *     Copyright
@@ -155,9 +155,10 @@ int ushell(BW *bw)
 
 /* Copy a file */
 
-static int cp(unsigned char *from, unsigned char *to)
+static int
+cp(unsigned char *from, int g, unsigned char *tmpfn, unsigned char *to)
 {
-       int f, g, amnt;
+       int f, amnt;
        struct stat sbuf;
 
 #ifdef HAVEUTIME
@@ -175,10 +176,9 @@ static int cp(unsigned char *from, unsigned char *to)
        if (fstat(f, &sbuf) < 0) {
                return -1;
        }
-       g = creat((char *)to, sbuf.st_mode & ~(S_ISUID | S_ISGID));
-       if (g < 0) {
+       if (fchmod(g, sbuf.st_mode & 0777)) {
                close(f);
-               return -1;
+               return (-1);
        }
        while ((amnt = read(f, stdbuf, stdsiz)) > 0) {
                if (amnt != joe_write(g, stdbuf, amnt)) {
@@ -186,11 +186,20 @@ static int cp(unsigned char *from, unsigned char *to)
                }
        }
        close(f);
-       close(g);
        if (amnt) {
                return -1;
        }
 
+       if (tmpfn && rename(tmpfn, to)) {
+               return (-1);
+       }
+       /*
+        * Do not return !0 from here on.
+        * Below are only operations that run when the copy
+        * process finished successfully.
+        */
+       close(g);
+
 #ifdef HAVEUTIME
 #ifdef NeXT
        utbuf[0] = (time_t) sbuf.st_atime;
@@ -203,7 +212,7 @@ static int cp(unsigned char *from, unsigned char *to)
 #endif
 
 #ifdef WITH_SELINUX
-       copy_security_context(from,to);
+       copy_security_context(from, to);
 #endif
 
        return 0;
@@ -214,59 +223,63 @@ static int cp(unsigned char *from, unsigned char *to)
  * Returns 1 for error
  */
 
-static int backup(BW *bw)
+static int
+backup(BW *bw)
 {
-       if (!bw->b->backup && !nobackups && bw->b->name && bw->b->name[0]) {
-               unsigned char tmp[1024];
-               unsigned char name[1024];
+       unsigned char tmp[1024 + 12];
+       unsigned char name[1024];
+       unsigned char *simple_backup_suffix;
+       int fd;
 
-#ifdef __MSDOS__
-               int x;
+       if (bw->b->backup || nobackups || !(bw->b->name) || !(bw->b->name[0]))
+               return (0);
 
-               if (backpath) {
-                       joe_snprintf_2(name, sizeof(name), "%s/%s", backpath, namepart(tmp, bw->b->name));
-               } else {
-                       joe_snprintf_1(name, sizeof(name), "%s", bw->b->name);
-               }
+       /* Create backup file name */
+       simple_backup_suffix = (unsigned char *)getenv("SIMPLE_BACKUP_SUFFIX");
 
-               for (x = strlen(name); name[--x] != '.';) {
-                       if (name[x] == '\\' || (name[x] == ':' && x == 1) || x == 0) {
-                               x = strlen(name);
-                               break;
-                       }
-               }
+       if (simple_backup_suffix == NULL) {
+               simple_backup_suffix = US "~";
+       }
+       if (backpath) {
+               joe_snprintf_3((char *)name, sizeof(name), "%s/%s%s", backpath, namepart(tmp, bw->b->name), simple_backup_suffix);
+       } else {
+               joe_snprintf_2((char *)name, sizeof(name), "%s%s", bw->b->name, simple_backup_suffix);
+       }
 
-               strcpy(name + x, ".bak");
+#ifdef HAVE_MKSTEMP
+       /* Securely generate a backup file temporary file */
+       joe_snprintf_1((char *)tmp, sizeof(tmp), "%s.XXXXXXXXXX", name);
+       if ((fd = mkstemp((char *)tmp)) < 0) {
+               return (1);
+       }
+#endif
 
+       /* Attempt to delete backup file first */
+       unlink((char *)name);
+
+#ifdef HAVE_MKSTEMP
+       /* Copy original file to backup file securely */
+       if (cp(bw->b->name, fd, tmp, name)) {
+               close(fd);
+               unlink((char *)tmp);
+               return (1);
+       }
 #else
+       /* Yeowch! */
+       if ((fd = creat((char *)name, 0600)) < 0) {
+               return (1);
+       }
+#warning "TOCTOU temp file race here! Consider getting mkstemp!"
 
-               /* Create backup file name */
-               unsigned char *simple_backup_suffix = (unsigned char *)getenv("SIMPLE_BACKUP_SUFFIX");
-               
-               if (simple_backup_suffix == NULL) {
-                       simple_backup_suffix = US "~";
-               }
-               if (backpath) {
-                       joe_snprintf_3((char *)name, sizeof(name), "%s/%s%s", backpath, namepart(tmp, bw->b->name), simple_backup_suffix);
-               } else {
-                       joe_snprintf_2((char *)name, sizeof(name), "%s%s", bw->b->name, simple_backup_suffix);
-               }
-               
-               /* Attempt to delete backup file first */
+       /* Copy original file to backup file */
+       if (cp(bw->b->name, fd, NULL, name)) {
+               close(fd);
                unlink((char *)name);
-
-#endif
-
-               /* Copy original file to backup file */
-               if (cp(bw->b->name, name)) {
-                       return 1;
-               } else {
-                       bw->b->backup = 1;
-                       return 0;
-               }
-       } else {
-               return 0;
+               return (1);
        }
+#endif
+       bw->b->backup = 1;
+       return (0);
 }
 
 /* Write file */
@@ -468,7 +481,7 @@ static int dosave1(BW *bw, unsigned char *s, struct savereq *req, int *notify)
 int usave(BW *bw)
 {
        BW *pbw;
-       
+
        pbw = wmkpw(bw->parent, US "Name of file to save (^C to abort): ", &filehist, dosave1, US "Names", NULL, cmplt, mksavereq(NULL,NULL,NULL,0), NULL, locale_map);
 
        if (pbw && bw->b->name) {
@@ -501,7 +514,7 @@ int doedit1(BW *bw,int c,unsigned char *s,int *notify)
 
                b = bfind_reload(s);
                er = error;
-               if (bw->b->count == 1 && (bw->b->changed || bw->b->name)) {
+               if (bw->b->count >= 1 && (bw->b->changed || bw->b->name)) {
                        if (orphan) {
                                orphit(bw);
                        } else {
diff --git a/umath.c b/umath.c
index e9f6f49..3d898f0 100644 (file)
--- a/umath.c
+++ b/umath.c
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/umath.c,v 1.2 2008/05/13 13:08:28 tg Exp $ */
+/* $MirOS: contrib/code/jupp/umath.c,v 1.6 2012/12/30 17:12:37 tg Exp $ */
 /*
  *     Math
  *     Copyright
@@ -10,6 +10,9 @@
 #include "types.h"
 
 #include <stdio.h>
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
 #include <string.h>
 
 #include "b.h"
 #include "charmap.h"
 #include "w.h"
 
-unsigned char *merr;
+const unsigned char * volatile merr;
+
+static char math_res[JOE_MSGBUFSIZE];
+static char *math_exp;
 
 static RETSIGTYPE fperr(int unused)
 {
@@ -80,6 +86,14 @@ static double expr(int prec, struct var **rtv)
                v = get(s);
                x = v->val;
                *ptr = c;
+       } else if (ptr[0] == '0' && (ptr[1] | 0x20) == 'x') {
+               unsigned long xi;
+
+               sscanf((char *)ptr, "%li", &xi);
+               x = (double)xi;
+               ptr += 2;
+               while ((*ptr >= '0' && *ptr <= '9') || ((*ptr | 0x20) >= 'a' && (*ptr | 0x20) <= 'f'))
+                       ++ptr;
        } else if ((*ptr >= '0' && *ptr <= '9') || *ptr == '.') {
                sscanf((char *)ptr, "%lf", &x);
                while ((*ptr >= '0' && *ptr <= '9') || *ptr == '.' || *ptr == 'e' || *ptr == 'E')
@@ -132,12 +146,25 @@ static double expr(int prec, struct var **rtv)
        return x;
 }
 
+#if defined(SIZEOF_LONG_LONG) && (SIZEOF_LONG_LONG > 0)
+typedef long long joe_imaxt;
+#define JOE_IMAXT "ll"
+#else
+typedef long joe_imaxt;
+#define JOE_IMAXT "l"
+#endif
+
 double calc(BW *bw, unsigned char *s)
 {
        double result;
        struct var *v;
        BW *tbw = bw->parent->main->object;
 
+       if (math_exp) {
+               free(math_exp);
+       }
+       math_exp = strdup((void *)s);
+
        v = get(US "top");
        v->val = tbw->top->line + 1;
        v->set = 1;
@@ -179,13 +206,31 @@ double calc(BW *bw, unsigned char *s)
                        merr = US "Extra junk after end of expr";
                }
        }
+
+       if (merr) {
+               joe_snprintf_1(math_res, JOE_MSGBUFSIZE,
+                   "math_error{%s}", merr);
+       } else {
+               joe_imaxt ires = (joe_imaxt)result;
+
+               if ((double)ires == result) {
+                       /* representable as integer value */
+                       joe_snprintf_1(math_res, JOE_MSGBUFSIZE,
+                           "%" JOE_IMAXT "d", ires);
+               } else {
+                       /* use float with large precision */
+                       joe_snprintf_1(math_res, JOE_MSGBUFSIZE,
+                           "%.60G", result);
+               }
+       }
+
        return result;
 }
 
 /* Main user interface */
 static int domath(BW *bw, unsigned char *s, void *object, int *notify)
 {
-       double result = calc(bw, s);
+       calc(bw, s);
 
        if (notify) {
                *notify = 1;
@@ -195,7 +240,7 @@ static int domath(BW *bw, unsigned char *s, void *object, int *notify)
                return -1;
        }
        vsrm(s);
-       joe_snprintf_1((char *)msgbuf, JOE_MSGBUFSIZE, "%G", result);
+       memcpy(msgbuf, math_res, JOE_MSGBUFSIZE);
        if (bw->parent->watom->what != TYPETW) {
                binsm(bw->cursor, sz(msgbuf));
                pfwrd(bw->cursor, strlen((char *)msgbuf));
@@ -217,3 +262,17 @@ int umath(BW *bw)
                return -1;
        }
 }
+
+int umathins(BW *bw)
+{
+       if (math_exp) {
+               binss(bw->cursor, (void *)math_exp);
+       }
+       return 0;
+}
+
+int umathres(BW *bw)
+{
+       binss(bw->cursor, (void *)math_res);
+       return 0;
+}
diff --git a/umath.h b/umath.h
index 49dbef6..935bbaf 100644 (file)
--- a/umath.h
+++ b/umath.h
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/umath.h,v 1.2 2008/05/13 13:08:28 tg Exp $ */
+/* $MirOS: contrib/code/jupp/umath.h,v 1.4 2012/12/30 17:12:37 tg Exp $ */
 /*
  *     Math
  *     Copyright
 #include "config.h"
 #include "types.h"
 
-extern unsigned char *merr;
+extern const unsigned char * volatile merr;
 double calc(BW *bw, unsigned char *s);
 int umath(BW *bw);
+int umathins(BW *bw);
+int umathres(BW *bw);
 
 #endif
index bd9f719..d72fbb4 100644 (file)
--- a/usearch.c
+++ b/usearch.c
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/usearch.c,v 1.5 2010/04/08 15:31:06 tg Exp $ */
+/* $MirOS: contrib/code/jupp/usearch.c,v 1.6 2012/12/22 00:06:15 tg Exp $ */
 /*
  *     Search & Replace system
  *     Copyright
@@ -99,7 +99,7 @@ unsigned char **get_word_list(B *b,int ignore)
 
 void fcmplt_ins(BW *bw, unsigned char *line)
 {
-       P *p = pdup(bw->cursor);
+       P *p;
        int c;
 
        if (!piseol(bw->cursor)) {
index 42c00be..f8e9c08 100644 (file)
--- a/ushell.c
+++ b/ushell.c
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/ushell.c,v 1.3 2008/05/13 13:08:29 tg Exp $ */
+/* $MirOS: contrib/code/jupp/ushell.c,v 1.4 2012/12/30 18:18:07 tg Exp $ */
 /*
  *     Shell-window functions
  *     Copyright
@@ -13,6 +13,9 @@
 #ifdef HAVE_SYS_TYPES_H
 #include <sys/types.h>
 #endif
+#ifdef HAVE_SYS_STAT_H
+#include <sys/stat.h>
+#endif
 #ifdef HAVE_SIGNAL_H
 #include <signal.h>
 #endif
@@ -30,6 +33,7 @@
 #include "ufile.h"
 #include "va.h"
 #include "vs.h"
+#include "ushell.h"
 #include "utf8.h"
 #include "w.h"
 
@@ -104,7 +108,7 @@ static void cdata(B *b, unsigned char *dat, int siz)
        cfollow(b,byte);
 }
 
-static int cstart(BW *bw, unsigned char *name, unsigned char **s, void *obj, int *notify, int build)
+static int doushell(BW *bw, unsigned char *cmd, int *notify, int build)
 {
 #ifdef __MSDOS__
        if (notify) {
@@ -115,6 +119,22 @@ static int cstart(BW *bw, unsigned char *name, unsigned char **s, void *obj, int
        return -1;
 #else
        MPX *m;
+       unsigned char **s;
+       unsigned char *u;
+       const unsigned char *name;
+
+       name = getushell();
+       s = vamk(10);
+       u = vsncpy(NULL, 0, sz(name));
+       s = vaadd(s, u);
+       if (cmd) {
+               u = vsncpy(NULL, 0, sc("-c"));
+               s = vaadd(s, u);
+               s = vaadd(s, cmd);
+       } else {
+               u = vsncpy(NULL, 0, sc("-i"));
+               s = vaadd(s, u);
+       }
 
        if (notify) {
                *notify = 1;
@@ -139,35 +159,17 @@ static int cstart(BW *bw, unsigned char *name, unsigned char **s, void *obj, int
 
 int ubknd(BW *bw)
 {
-       unsigned char **a;
-       unsigned char *s;
-        unsigned char *sh=(unsigned char *)getenv("SHELL");
-        if (!sh) {
+       if (!getenv("SHELL")) {
                msgnw(bw->parent, US "\"SHELL\" environment variable not defined or exported");
-               /* return -1; */
-               sh = US "/bin/sh";
         }
-
-       a = vamk(3);
-       s = vsncpy(NULL, 0, sz(sh));
-       a = vaadd(a, s);
-       s = vsncpy(NULL, 0, sc("-i"));
-       a = vaadd(a, s);
-       return cstart(bw, sh, a, NULL, NULL, 0);
+       return doushell(bw, NULL, NULL, 0);
 }
 
 /* Run a program in a window */
 
 static int dorun(BW *bw, unsigned char *s, void *object, int *notify)
 {
-       unsigned char **a = vamk(10);
-       unsigned char *cmd = vsncpy(NULL, 0, sc("/bin/sh"));
-
-       a = vaadd(a, cmd);
-       cmd = vsncpy(NULL, 0, sc("-c"));
-       a = vaadd(a, cmd);
-       a = vaadd(a, s);
-       return cstart(bw, US "/bin/sh", a, NULL, notify, 0);
+       return doushell(bw, s, notify, 0);
 }
 
 B *runhist = NULL;
@@ -183,14 +185,7 @@ int urun(BW *bw)
 
 static int dobuild(BW *bw, unsigned char *s, void *object, int *notify)
 {
-       unsigned char **a = vamk(10);
-       unsigned char *cmd = vsncpy(NULL, 0, sc("/bin/sh"));
-
-       a = vaadd(a, cmd);
-       cmd = vsncpy(NULL, 0, sc("-c"));
-       a = vaadd(a, cmd);
-       a = vaadd(a, s);
-       return cstart(bw, US "/bin/sh", a, NULL, notify, 1);
+       return doushell(bw, s, notify, 1);
 }
 
 B *buildhist = NULL;
@@ -239,3 +234,32 @@ int ukillpid(BW *bw)
                return 0;
        }
 }
+
+static const char * const getushell_envs[] = {
+       "SHELL",
+       "EXECSHELL",
+};
+const void *getushell(void)
+{
+       static char *rshell;
+
+       if (!rshell) {
+               char *eshell;
+               struct stat sbuf;
+               int i = 0;
+
+               while (i < 2) {
+                       eshell = getenv(getushell_envs[i++]);
+                       if (eshell && *eshell &&
+                           !stat(eshell, &sbuf) &&
+                           S_ISREG(sbuf.st_mode) &&
+                           (sbuf.st_mode & 0111) &&
+                           /* LINTED use of access */
+                           !access(eshell, X_OK)) {
+                               rshell = eshell;
+                               break;
+                       }
+               }
+       }
+       return (rshell ? rshell : "/bin/sh");
+}
index 0486af3..a36929d 100644 (file)
--- a/ushell.h
+++ b/ushell.h
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/ushell.h,v 1.2 2008/05/13 13:08:30 tg Exp $ */
+/* $MirOS: contrib/code/jupp/ushell.h,v 1.3 2012/12/30 18:18:07 tg Exp $ */
 /*
  *     Shell-window functions
  *     Copyright (C) 1992 Joseph H. Allen
@@ -16,4 +16,6 @@ int ukillpid PARAMS((BW *bw));
 int urun PARAMS((BW *bw));
 int ubuild PARAMS((BW *bw));
 
+const void *getushell PARAMS((void));
+
 #endif
diff --git a/vs.c b/vs.c
index c60a03f..ef10b57 100644 (file)
--- a/vs.c
+++ b/vs.c
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/vs.c,v 1.4 2012/06/08 16:55:29 tg Exp $ */
+/* $MirOS: contrib/code/jupp/vs.c,v 1.5 2012/12/22 00:06:16 tg Exp $ */
 /*
  *     Variable length strings
  *     Copyright
@@ -98,6 +98,7 @@ sELEMENT *vsncpy(sELEMENT *vary, int pos, const sELEMENT *array, int len)
 
        if (!vary || pos + len > sSIZ(vary))
                vary = vsensure(vary, pos + len);
+       mkssert(vary != NULL);
        if (pos + len > olen) {
                vary[pos + len] = vary[olen];
                sLen(vary) = pos + len;
@@ -222,6 +223,10 @@ int vsspan(sELEMENT *a, int alen, sELEMENT *b, int blen)
 {
        int x;
 
+       /* should not happen */
+       if (!b)
+               return (0);
+
        for (x = 0; x != alen; ++x) {
                int z = vsbsearch(b, blen, a[x]);
 
diff --git a/w.c b/w.c
index a2b9ae6..d16d5d9 100644 (file)
--- a/w.c
+++ b/w.c
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/w.c,v 1.2 2008/05/13 13:08:32 tg Exp $ */
+/* $MirOS: contrib/code/jupp/w.c,v 1.5 2012/12/30 21:45:18 tg Exp $ */
 /*
  *     Window system
  *     Copyright
@@ -301,6 +301,9 @@ void wfit(SCREEN *t)
                } while (w != t->topwin && w->main == w->link.prev->main);
        } while (w != t->topwin && left >= FITHEIGHT);
 
+       if (!pw)
+               return;
+
        /* We can't use extra space to fit a new family on, so give space to parent of
         * previous family */
        pw->nh += left;
@@ -489,7 +492,7 @@ void wshowall(SCREEN *t)
        } while (w != t->topwin);
 
        /* Compute size to set each window */
-       if ((set = (t->h - t->wind) / n) < FITHEIGHT)
+       if ((set = (t->h - t->wind) / (n ? n : 1)) < FITHEIGHT)
                set = FITHEIGHT;
 
        /* Set size of each variable size window */
@@ -609,7 +612,7 @@ W *wcreate(SCREEN *t, WATOM *watom, W *where, W *target, W *original, int height
 
        /* Create new keyboard handler for window */
        if (watom->context)
-               new->kbd = mkkbd(kmap_getcontext(watom->context));
+               new->kbd = mkkbd(kmap_getcontext(watom->context, 1));
        else
                new->kbd = NULL;
 
@@ -703,7 +706,7 @@ int wabort(W *w)
 
 /* Display a message and skip the next key */
 
-static void mdisp(SCRN *t, int y, unsigned char *s)
+static void mdisp(SCRN *t, int y, const unsigned char *s)
 {
        int ofst;
        int len;
@@ -723,11 +726,11 @@ void msgout(W *w)
 
        if (w->msgb) {
                mdisp(t, w->y + w->h - 1, w->msgb);
-               w->msgb = 0;
+               w->msgb = NULL;
        }
        if (w->msgt) {
                mdisp(t, w->y + ((w->h > 1 && (w->y || !staen)) ? 1 : 0), w->msgt);
-               w->msgt = 0;
+               w->msgt = NULL;
        }
 }
 
@@ -736,12 +739,12 @@ void msgout(W *w)
 unsigned char msgbuf[JOE_MSGBUFSIZE];
 
 /* display message on bottom line of window */
-void msgnw(W *w, unsigned char *s)
+void msgnw(W *w, const unsigned char *s)
 {
        w->msgb = s;
 }
 
-void msgnwt(W *w, unsigned char *s)
+void msgnwt(W *w, const unsigned char *s)
 {
        w->msgt = s;
 }
diff --git a/w.h b/w.h
index a74ed53..f8eb09f 100644 (file)
--- a/w.h
+++ b/w.h
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/w.h,v 1.2 2008/05/13 13:08:33 tg Exp $ */
+/* $MirOS: contrib/code/jupp/w.h,v 1.3 2012/12/30 17:10:59 tg Exp $ */
 /*
  *     Window management
  *     Copyright
@@ -149,8 +149,8 @@ void updall PARAMS((void));
  * msgnw displays message on bottom line of window
  * msgnwt displays message on top line of window
  */
-void msgnw PARAMS((W *w, unsigned char *s));
-void msgnwt PARAMS((W *w, unsigned char *s));
+void msgnw PARAMS((W *w, const unsigned char *s));
+void msgnwt PARAMS((W *w, const unsigned char *s));
 
 #define JOE_MSGBUFSIZE 300
 extern unsigned char msgbuf[JOE_MSGBUFSIZE];   /* Message composition buffer for msgnw/msgnwt */