Import jupp25 jupp-3_1_25
authorThorsten Glaser <tg@mirbsd.org>
Mon, 19 Aug 2013 23:23:02 +0000 (23:23 +0000)
committerThorsten Glaser <tg@mirbsd.org>
Mon, 19 Aug 2013 23:23:02 +0000 (23:23 +0000)
28 files changed:
HINTS
LIST
Makefile.bsd-wrapper [new file with mode: 0644]
NEWS
README
TODO
builtins.c
cmd.c
configure
configure.ac
i18n.c
i18n.h
jmacsrc.in
joerc.in
jpicorc.in
jstarrc.in
jupprc
main.c
menu.c
path.c
path.h
rjoerc.in
syntax/diff.jsf.in
types.h
ublock.c
uedit.c
ufile.c
vfile.c

diff --git a/HINTS b/HINTS
index 1c99698..4d4cbec 100644 (file)
--- a/HINTS
+++ b/HINTS
@@ -15,6 +15,9 @@ Disable the following warnings; the code doesn't cope with it:
 -Wno-cast-qual
 -Wno-missing-prototypes -Wno-missing-declarations
 
+Additionally, -Wstrict-overflow bitches around if you enable it.
+This needs verification and possibly fixes.
+
 UTF-8
 -----
 
@@ -128,4 +131,4 @@ will not insert.
 - Search, incremental search, and search & replace all operate as usual.
 
 __________________________________________________________________
-$MirOS: contrib/code/jupp/HINTS,v 1.6 2011/10/04 22:47:50 tg Exp $
+$MirOS: contrib/code/jupp/HINTS,v 1.7 2013/08/19 22:04:14 tg Exp $
diff --git a/LIST b/LIST
index 4523866..a8db6fc 100644 (file)
--- a/LIST
+++ b/LIST
@@ -1,4 +1,4 @@
-$MirOS: contrib/code/jupp/LIST,v 1.7 2012/12/30 21:45:11 tg Exp $
+$MirOS: contrib/code/jupp/LIST,v 1.8 2013/08/19 19:19:30 tg Exp $
 -----------------------------------------------------------------
 
 Joe commands grouped by function
@@ -185,7 +185,8 @@ math                Calculator
 mathins                Insert last math expression
 mathres                Insert last math result
 mode           Mode prompt
-msg            Display a message
+msg            Display a message (clear message if empty)
+nop            Do nothing
 notmod         Clear the modified flag
 retype         Refresh screen
 shell          Suspend process or execute a sub-shell
diff --git a/Makefile.bsd-wrapper b/Makefile.bsd-wrapper
new file mode 100644 (file)
index 0000000..2563c51
--- /dev/null
@@ -0,0 +1,34 @@
+# $MirOS: contrib/code/jupp/Makefile.bsd-wrapper,v 1.1 2013/08/19 17:40:16 tg Exp $
+
+MAN=           joe.1
+INST_TARGET=   INSTALL_MAN= install
+CLEANFILES+=   charmaps syntax
+
+CFPREFIX?=     /usr/local
+.if ${CFPREFIX} == "/usr"
+CFMANDIR?=     /usr/share/man
+.endif
+CFMANDIR?=     ${CFPREFIX}/man
+CFETC?=                /etc
+
+sysconfjoesubdir?=/jupp
+
+CFARGS+=       --prefix=${CFPREFIX:Q} \
+               --mandir=${CFMANDIR:Q} \
+               --sysconfdir=${CFETC:Q}
+XARGS+=                sysconfjoesubdir=${sysconfjoesubdir:Q}
+
+.include <bsd.own.mk>
+FSFISLIB=      No
+
+.ifdef __CRAZY
+COPTS+=                -Wno-unused-parameter \
+               -Wno-missing-field-initializers \
+               -Wno-old-style-definition -Wno-strict-prototypes \
+               -Wno-cast-qual \
+               -Wno-missing-prototypes -Wno-missing-declarations
+.endif
+
+joe.1: config.status
+
+.include <bsd.cfwrap.mk>
diff --git a/NEWS b/NEWS
index 8584035..5fd3f39 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,6 +1,22 @@
-$MirOS: contrib/code/jupp/NEWS,v 1.72 2013/01/05 22:16:29 tg Exp $
+$MirOS: contrib/code/jupp/NEWS,v 1.76 2013/08/19 23:05:07 tg Exp $
 ------------------------------------------------------------------
 
+JOE 3.1jupp25
+
+- Better colouring of diffs; better support for CVS and git
+- New wcwidth code; aligned with Unicode 6.2.0
+- Prevent accidentally freeing an environment string
+- On SIGWINCH, resize menu to avoid using stale columns information
+- msg command with empty argument now clears message buffer
+- New "nop" command
+- Permit changing keymap for prompt windows
+- Fix CUA keymap paste mode
+- Handle xterm bracketed paste for prompt windows
+- In prompt windows (paste or regular), ^L is now nop (screen refresh)
+- Honour TMPDIR environment variable (before TEMP)
+- Sanitise handling of temporary files, somewhat
+- Fix subprocess (pipe) corruption of data (LP#1198221)
+
 JOE 3.1jupp24
 
 - Bugfix for all *rc files: -guess_indent is a global option,
diff --git a/README b/README
index 51d45f8..fdb5790 100644 (file)
--- a/README
+++ b/README
@@ -81,6 +81,9 @@ properly fit.  If this doesn't work, either ttgtsz() (in tty.c) is not
 reading the size properly, or the SIGWINCH signal is not being received
 by JOE (the handler is winchd() in tty.c).
 
+JOE requires a certain minimum window size, which differs between the
+functions needing it. Do not complain if your window is *much* too small.
+
 Baud rate:
 ----------
 
@@ -427,4 +430,4 @@ joe's stdin/stdout to /dev/tty:
        joe filename  </dev/tty >/dev/tty
 
 ___________________________________________________________________
-$MirOS: contrib/code/jupp/README,v 1.4 2012/08/23 19:55:07 tg Exp $
+$MirOS: contrib/code/jupp/README,v 1.5 2013/08/19 23:05:08 tg Exp $
diff --git a/TODO b/TODO
index 5947ed4..9bf3c53 100644 (file)
--- a/TODO
+++ b/TODO
@@ -662,7 +662,8 @@ Other requests:
 • bracketed paste mode should disable autoindent, wordwrap,
   updating the status line, …(?) ⇐ implemented using a “paste”
   labeled ftype that is switched to using the UI (command)
+• ^Q] should work for “'” and “"” too
 • …
 
 __________________________________________________________________
-$MirOS: contrib/code/jupp/TODO,v 1.18 2013/01/05 22:03:21 tg Exp $
+$MirOS: contrib/code/jupp/TODO,v 1.19 2013/02/19 19:32:20 tg Exp $
index fc5c8dc..2da9d2b 100644 (file)
@@ -142,7 +142,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 2013-01-05; 3.1; autoCR-LF; UTF-8 via locale; per-file encoding \\i \\i\n"
+               "\\i \\i @(#) blt_in 2013-08-19; 3.1; autoCR-LF; UTF-8 via locale; per-file encoding \\i \\i\n"
                "}\n"
                "\n"
                "{CharTable\n"
@@ -216,6 +216,14 @@ const unsigned char * const builtins[]=
                "helpcard,rtn,keymap,\"main\",rtn,msg,rtn       ^[ [ 2 0 1 ~\n"
                "helpcard,rtn,keymap,\"main\",rtn               ^D\n"
                "\n"
+               ":Pasteprompt\n"
+               "type                                   ^@ TO \xFF\n"
+               "nop                                    ^L\n"
+               "keymap,\"prompt\",rtn,msg,rtn,rtn              ^M\n"
+               "msg,\"Entered bracketed paste mode\",rtn       ^[ [ 2 0 0 ~\n"
+               "keymap,\"prompt\",rtn,msg,rtn          ^[ [ 2 0 1 ~\n"
+               "keymap,\"prompt\",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"
@@ -224,6 +232,7 @@ const unsigned char * const builtins[]=
                "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"
+               "nop                                    ^[ [ 2 0 1 ~\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"
@@ -455,6 +464,10 @@ const unsigned char * const builtins[]=
                ":inherit main\n"
                "abort          ^C\n"
                "complete       ^I\n"
+               "nop            ^L\n"
+               "keymap,\"Pasteprompt\",rtn,msg,\"Entered bracketed paste mode\",rtn    ^[ P\n"
+               "keymap,\"Pasteprompt\",rtn,msg,\"Entered bracketed paste mode\",rtn    ^[ p\n"
+               "keymap,\"Pasteprompt\",rtn,msg,\"Entered bracketed paste mode\",rtn    ^[ [ 2 0 0 ~\n"
                "\n"
                ":menu\n"
                ":inherit windows\n"
@@ -518,5 +531,5 @@ const unsigned char * const builtins[]=
                ":querysr\n"
                "type           ^@ TO \xFF\n"
 ,      NULL
-,      "@(#) $MirOS: contrib/code/jupp/builtins.c,v 1.16 2013/01/05 22:16:29 tg Exp $"
+,      "@(#) $MirOS: contrib/code/jupp/builtins.c,v 1.17 2013/08/19 23:05:08 tg Exp $"
 };
diff --git a/cmd.c b/cmd.c
index a5755c5..088f508 100644 (file)
--- a/cmd.c
+++ b/cmd.c
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/cmd.c,v 1.11 2012/12/30 21:45:13 tg Exp $ */
+/* $MirOS: contrib/code/jupp/cmd.c,v 1.12 2013/08/19 19:19:30 tg Exp $ */
 /*
  *     Command execution
  *     Copyright
@@ -87,6 +87,11 @@ static int ukeymap(BW *bw)
        return (-1);
 }
 
+static int unop(void)
+{
+       return (0);
+}
+
 CMD cmds[] = {
        {US "abort", TYPETW + TYPEPW + TYPEMENU + TYPEQW, uabort, NULL, 0, NULL},
        {US "abortbuf", TYPETW, uabortbuf, NULL, 0, NULL},
@@ -159,7 +164,7 @@ CMD cmds[] = {
        {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 "keymap", TYPETW + TYPEPW, 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}, 
@@ -181,6 +186,7 @@ CMD cmds[] = {
        {US "nextw", TYPETW + TYPEPW + TYPEMENU + TYPEQW, unextw, NULL, 1, US "prevw"},
        {US "nextword", TYPETW + TYPEPW + EFIXXCOL, u_goto_next, NULL, 1, US "prevword"},
        {US "nmark", TYPETW + TYPEPW, unmark, NULL, 0, NULL},
+       {US "nop", TYPETW + TYPEPW + TYPEMENU + TYPEQW, unop, NULL, 0, NULL},
        {US "notmod", TYPETW, unotmod, NULL, 0, NULL},
        {US "nxterr", TYPETW, unxterr, NULL, 1, US "prverr"},
        {US "open", TYPETW + TYPEPW + EFIXXCOL + EMOD, uopen, NULL, 1, US "deleol"},
index 2dd8315..de712d6 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.1jupp24.
+# Generated by GNU Autoconf 2.61-MirPorts-1 for joe 3.1jupp25.
 #
 # 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.1jupp24'
-PACKAGE_STRING='joe 3.1jupp24'
+PACKAGE_VERSION='3.1jupp25'
+PACKAGE_STRING='joe 3.1jupp25'
 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.1jupp24 to adapt to many kinds of systems.
+\`configure' configures joe 3.1jupp25 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.1jupp24:";;
+     short | recursive ) echo "Configuration of joe 3.1jupp25:";;
    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.1jupp24
+joe configure 3.1jupp25
 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.1jupp24, which was
+It was created by joe $as_me 3.1jupp25, 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.1jupp24'
+ VERSION='3.1jupp25'
 
 
 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.1jupp24, which was
+This file was extended by joe $as_me 3.1jupp25, 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.1jupp24
+joe config.status 3.1jupp25
 configured by $0, generated by GNU Autoconf 2.61-MirPorts-1,
   with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
 
index e829a0c..465dd30 100644 (file)
@@ -1,4 +1,4 @@
-# $MirOS: contrib/code/jupp/configure.ac,v 1.42 2013/01/05 22:16:30 tg Exp $
+# $MirOS: contrib/code/jupp/configure.ac,v 1.43 2013/08/19 19:23:44 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.1jupp24)
+AC_INIT(joe, 3.1jupp25)
 #### But see main.c for the Copyright (c) owner and year! ####
 AC_CONFIG_SRCDIR([b.c])
 
diff --git a/i18n.c b/i18n.c
index 0a72de5..66d2e19 100644 (file)
--- a/i18n.c
+++ b/i18n.c
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/i18n.c,v 1.6 2012/09/01 23:46:44 tg Exp $ */
+/* $MirOS: contrib/code/jupp/i18n.c,v 1.8 2013/08/19 17:39:29 tg Exp $ */
 /*
  *     UNICODE/ISO-10646 functions for JOE
  *     Copyright
 #include "utf8.h"
 #include "i18n.h"
 
-/*
- * This is an implementation of wcwidth() and wcswidth() (defined in
- * IEEE Std 1002.1-2001) for Unicode.
- *
- * http://www.opengroup.org/onlinepubs/007904975/functions/wcwidth.html
- * http://www.opengroup.org/onlinepubs/007904975/functions/wcswidth.html
- *
- * In fixed-width output devices, Latin characters all occupy a single
- * "cell" position of equal width, whereas ideographic CJK characters
- * occupy two such cells. Interoperability between terminal-line
- * applications and (teletype-style) character terminals using the
- * UTF-8 encoding requires agreement on which character should advance
- * the cursor by how many cell positions. No established formal
- * standards exist at present on which Unicode character shall occupy
- * how many cell positions on character terminals. These routines are
- * a first attempt of defining such behavior based on simple rules
- * applied to data provided by the Unicode Consortium.
- *
- * For some graphical characters, the Unicode standard explicitly
- * defines a character-cell width via the definition of the East Asian
- * FullWidth (F), Wide (W), Half-width (H), and Narrow (Na) classes.
- * In all these cases, there is no ambiguity about which width a
- * terminal shall use. For characters in the East Asian Ambiguous (A)
- * class, the width choice depends purely on a preference of backward
- * compatibility with either historic CJK or Western practice.
- * Choosing single-width for these characters is easy to justify as
- * the appropriate long-term solution, as the CJK practice of
- * displaying these characters as double-width comes from historic
- * implementation simplicity (8-bit encoded characters were displayed
- * single-width and 16-bit ones double-width, even for Greek,
- * Cyrillic, etc.) and not any typographic considerations.
- *
- * Much less clear is the choice of width for the Not East Asian
- * (Neutral) class. Existing practice does not dictate a width for any
- * of these characters. It would nevertheless make sense
- * typographically to allocate two character cells to characters such
- * as for instance EM SPACE or VOLUME INTEGRAL, which cannot be
- * represented adequately with a single-width glyph. The following
- * routines at present merely assign a single-cell width to all
- * neutral characters, in the interest of simplicity. This is not
- * entirely satisfactory and should be reconsidered before
- * establishing a formal standard in this area. At the moment, the
- * decision which Not East Asian (Neutral) characters should be
- * represented by double-width glyphs cannot yet be answered by
- * applying a simple rule from the Unicode database content. Setting
- * up a proper standard for the behavior of UTF-8 character terminals
- * will require a careful analysis not only of each Unicode character,
- * but also of each presentation form, something the author of these
- * routines has avoided to do so far.
- *
- * http://www.unicode.org/unicode/reports/tr11/
- *
- * Markus Kuhn -- 2007-05-26 (Unicode 5.0)
- *
- * Permission to use, copy, modify, and distribute this software
- * for any purpose and without fee is hereby granted. The author
- * disclaims all warranties with regard to this software.
- *
- * Latest version: http://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c
- */
+/* From: X11/xc/programs/xterm/wcwidth.c,v 1.6 2013/05/31 23:27:09 tg Exp $ */
 
-struct interval {
-       int first;
-       int last;
+struct mb_ucsrange {
+       unsigned int beg;
+       unsigned int end;
 };
 
-static int bisearch(int ucs, const struct interval *table, int max)
-{
-       int min = 0;
-       int mid;
-
-       if (ucs < table[0].first || ucs > table[max].last)
-               return -1;
-       while (max >= min) {
-               mid = (min + max) / 2;
-               if (ucs > table[mid].last)
-                       min = mid + 1;
-               else if (ucs < table[mid].first)
-                       max = mid - 1;
-               else
-                       return mid;
-       }
-
-       return -1;
-}
+static size_t mb_ucsbsearch(const struct mb_ucsrange arr[], size_t elems,
+    unsigned int val);
 
 /* Macro for generating joe_iswXXX functions */
 
 #define MAKE_ISW(x) \
        int joe_isw##x(struct charmap *foo,int c) \
        { \
-               if (-1!=bisearch(c, data_wctype_##x, sizeof(data_wctype_##x)/sizeof(struct interval) - 1)) \
+               if (mb_ucsbsearch(data_wctype_##x, NELEM(data_wctype_##x), c) != (size_t)-1) \
                        return 1; \
                else \
                        return 0; \
        }
 
-/* The following function defines the column width of an ISO 10646
- * character as follows:
- *
- *    - The null character (U+0000) has a column width of 0.
- *
- *    - Other C0/C1 control characters and DEL will lead to a return
- *      value of -1.
- *
- *    - Non-spacing and enclosing combining characters (general
- *      category code Mn or Me in the Unicode database) have a
- *      column width of 0.
- *
- *    - SOFT HYPHEN (U+00AD) has a column width of 1.
- *
- *    - Other format characters (general category code Cf in the Unicode
- *      database) and ZERO WIDTH SPACE (U+200B) have a column width of 0.
- *
- *    - Hangul Jamo medial vowels and final consonants (U+1160-U+11FF)
- *      have a column width of 0.
- *
- *    - Spacing characters in the East Asian Wide (W) or East Asian
- *      Full-width (F) category as defined in Unicode Technical
- *      Report #11 have a column width of 2.
- *
- *    - All remaining characters (including all printable
- *      ISO 8859-1 and WGL4 characters, Unicode control characters,
- *      etc.) have a column width of 1.
- *
- * This implementation assumes that wchar_t characters are encoded
- * in ISO 10646.
+/*
+ * Generated by MirOS: contrib/code/Snippets/eawparse,v 1.1 2013/05/31 23:27:16 tg Exp $
+ * from Unicode 6.2.0
  */
 
+static const struct mb_ucsrange mb_ucs_combining[] = {
+       { 0x0300, 0x036F },
+       { 0x0483, 0x0489 },
+       { 0x0591, 0x05BD },
+       { 0x05BF, 0x05BF },
+       { 0x05C1, 0x05C2 },
+       { 0x05C4, 0x05C5 },
+       { 0x05C7, 0x05C7 },
+       { 0x0600, 0x0604 },
+       { 0x0610, 0x061A },
+       { 0x064B, 0x065F },
+       { 0x0670, 0x0670 },
+       { 0x06D6, 0x06DD },
+       { 0x06DF, 0x06E4 },
+       { 0x06E7, 0x06E8 },
+       { 0x06EA, 0x06ED },
+       { 0x070F, 0x070F },
+       { 0x0711, 0x0711 },
+       { 0x0730, 0x074A },
+       { 0x07A6, 0x07B0 },
+       { 0x07EB, 0x07F3 },
+       { 0x0816, 0x0819 },
+       { 0x081B, 0x0823 },
+       { 0x0825, 0x0827 },
+       { 0x0829, 0x082D },
+       { 0x0859, 0x085B },
+       { 0x08E4, 0x08FE },
+       { 0x0900, 0x0902 },
+       { 0x093A, 0x093A },
+       { 0x093C, 0x093C },
+       { 0x0941, 0x0948 },
+       { 0x094D, 0x094D },
+       { 0x0951, 0x0957 },
+       { 0x0962, 0x0963 },
+       { 0x0981, 0x0981 },
+       { 0x09BC, 0x09BC },
+       { 0x09C1, 0x09C4 },
+       { 0x09CD, 0x09CD },
+       { 0x09E2, 0x09E3 },
+       { 0x0A01, 0x0A02 },
+       { 0x0A3C, 0x0A3C },
+       { 0x0A41, 0x0A42 },
+       { 0x0A47, 0x0A48 },
+       { 0x0A4B, 0x0A4D },
+       { 0x0A51, 0x0A51 },
+       { 0x0A70, 0x0A71 },
+       { 0x0A75, 0x0A75 },
+       { 0x0A81, 0x0A82 },
+       { 0x0ABC, 0x0ABC },
+       { 0x0AC1, 0x0AC5 },
+       { 0x0AC7, 0x0AC8 },
+       { 0x0ACD, 0x0ACD },
+       { 0x0AE2, 0x0AE3 },
+       { 0x0B01, 0x0B01 },
+       { 0x0B3C, 0x0B3C },
+       { 0x0B3F, 0x0B3F },
+       { 0x0B41, 0x0B44 },
+       { 0x0B4D, 0x0B4D },
+       { 0x0B56, 0x0B56 },
+       { 0x0B62, 0x0B63 },
+       { 0x0B82, 0x0B82 },
+       { 0x0BC0, 0x0BC0 },
+       { 0x0BCD, 0x0BCD },
+       { 0x0C3E, 0x0C40 },
+       { 0x0C46, 0x0C48 },
+       { 0x0C4A, 0x0C4D },
+       { 0x0C55, 0x0C56 },
+       { 0x0C62, 0x0C63 },
+       { 0x0CBC, 0x0CBC },
+       { 0x0CBF, 0x0CBF },
+       { 0x0CC6, 0x0CC6 },
+       { 0x0CCC, 0x0CCD },
+       { 0x0CE2, 0x0CE3 },
+       { 0x0D41, 0x0D44 },
+       { 0x0D4D, 0x0D4D },
+       { 0x0D62, 0x0D63 },
+       { 0x0DCA, 0x0DCA },
+       { 0x0DD2, 0x0DD4 },
+       { 0x0DD6, 0x0DD6 },
+       { 0x0E31, 0x0E31 },
+       { 0x0E34, 0x0E3A },
+       { 0x0E47, 0x0E4E },
+       { 0x0EB1, 0x0EB1 },
+       { 0x0EB4, 0x0EB9 },
+       { 0x0EBB, 0x0EBC },
+       { 0x0EC8, 0x0ECD },
+       { 0x0F18, 0x0F19 },
+       { 0x0F35, 0x0F35 },
+       { 0x0F37, 0x0F37 },
+       { 0x0F39, 0x0F39 },
+       { 0x0F71, 0x0F7E },
+       { 0x0F80, 0x0F84 },
+       { 0x0F86, 0x0F87 },
+       { 0x0F8D, 0x0F97 },
+       { 0x0F99, 0x0FBC },
+       { 0x0FC6, 0x0FC6 },
+       { 0x102D, 0x1030 },
+       { 0x1032, 0x1037 },
+       { 0x1039, 0x103A },
+       { 0x103D, 0x103E },
+       { 0x1058, 0x1059 },
+       { 0x105E, 0x1060 },
+       { 0x1071, 0x1074 },
+       { 0x1082, 0x1082 },
+       { 0x1085, 0x1086 },
+       { 0x108D, 0x108D },
+       { 0x109D, 0x109D },
+       { 0x1160, 0x11FF },
+       { 0x135D, 0x135F },
+       { 0x1712, 0x1714 },
+       { 0x1732, 0x1734 },
+       { 0x1752, 0x1753 },
+       { 0x1772, 0x1773 },
+       { 0x17B4, 0x17B5 },
+       { 0x17B7, 0x17BD },
+       { 0x17C6, 0x17C6 },
+       { 0x17C9, 0x17D3 },
+       { 0x17DD, 0x17DD },
+       { 0x180B, 0x180D },
+       { 0x18A9, 0x18A9 },
+       { 0x1920, 0x1922 },
+       { 0x1927, 0x1928 },
+       { 0x1932, 0x1932 },
+       { 0x1939, 0x193B },
+       { 0x1A17, 0x1A18 },
+       { 0x1A56, 0x1A56 },
+       { 0x1A58, 0x1A5E },
+       { 0x1A60, 0x1A60 },
+       { 0x1A62, 0x1A62 },
+       { 0x1A65, 0x1A6C },
+       { 0x1A73, 0x1A7C },
+       { 0x1A7F, 0x1A7F },
+       { 0x1B00, 0x1B03 },
+       { 0x1B34, 0x1B34 },
+       { 0x1B36, 0x1B3A },
+       { 0x1B3C, 0x1B3C },
+       { 0x1B42, 0x1B42 },
+       { 0x1B6B, 0x1B73 },
+       { 0x1B80, 0x1B81 },
+       { 0x1BA2, 0x1BA5 },
+       { 0x1BA8, 0x1BA9 },
+       { 0x1BAB, 0x1BAB },
+       { 0x1BE6, 0x1BE6 },
+       { 0x1BE8, 0x1BE9 },
+       { 0x1BED, 0x1BED },
+       { 0x1BEF, 0x1BF1 },
+       { 0x1C2C, 0x1C33 },
+       { 0x1C36, 0x1C37 },
+       { 0x1CD0, 0x1CD2 },
+       { 0x1CD4, 0x1CE0 },
+       { 0x1CE2, 0x1CE8 },
+       { 0x1CED, 0x1CED },
+       { 0x1CF4, 0x1CF4 },
+       { 0x1DC0, 0x1DE6 },
+       { 0x1DFC, 0x1DFF },
+       { 0x200B, 0x200F },
+       { 0x202A, 0x202E },
+       { 0x2060, 0x2064 },
+       { 0x206A, 0x206F },
+       { 0x20D0, 0x20F0 },
+       { 0x2CEF, 0x2CF1 },
+       { 0x2D7F, 0x2D7F },
+       { 0x2DE0, 0x2DFF },
+       { 0x302A, 0x302D },
+       { 0x3099, 0x309A },
+       { 0xA66F, 0xA672 },
+       { 0xA674, 0xA67D },
+       { 0xA69F, 0xA69F },
+       { 0xA6F0, 0xA6F1 },
+       { 0xA802, 0xA802 },
+       { 0xA806, 0xA806 },
+       { 0xA80B, 0xA80B },
+       { 0xA825, 0xA826 },
+       { 0xA8C4, 0xA8C4 },
+       { 0xA8E0, 0xA8F1 },
+       { 0xA926, 0xA92D },
+       { 0xA947, 0xA951 },
+       { 0xA980, 0xA982 },
+       { 0xA9B3, 0xA9B3 },
+       { 0xA9B6, 0xA9B9 },
+       { 0xA9BC, 0xA9BC },
+       { 0xAA29, 0xAA2E },
+       { 0xAA31, 0xAA32 },
+       { 0xAA35, 0xAA36 },
+       { 0xAA43, 0xAA43 },
+       { 0xAA4C, 0xAA4C },
+       { 0xAAB0, 0xAAB0 },
+       { 0xAAB2, 0xAAB4 },
+       { 0xAAB7, 0xAAB8 },
+       { 0xAABE, 0xAABF },
+       { 0xAAC1, 0xAAC1 },
+       { 0xAAEC, 0xAAED },
+       { 0xAAF6, 0xAAF6 },
+       { 0xABE5, 0xABE5 },
+       { 0xABE8, 0xABE8 },
+       { 0xABED, 0xABED },
+       { 0xFB1E, 0xFB1E },
+       { 0xFE00, 0xFE0F },
+       { 0xFE20, 0xFE26 },
+       { 0xFEFF, 0xFEFF },
+       { 0xFFF9, 0xFFFB },
+       { 0x101FD, 0x101FD },
+       { 0x10A01, 0x10A03 },
+       { 0x10A05, 0x10A06 },
+       { 0x10A0C, 0x10A0F },
+       { 0x10A38, 0x10A3A },
+       { 0x10A3F, 0x10A3F },
+       { 0x11001, 0x11001 },
+       { 0x11038, 0x11046 },
+       { 0x11080, 0x11081 },
+       { 0x110B3, 0x110B6 },
+       { 0x110B9, 0x110BA },
+       { 0x110BD, 0x110BD },
+       { 0x11100, 0x11102 },
+       { 0x11127, 0x1112B },
+       { 0x1112D, 0x11134 },
+       { 0x11180, 0x11181 },
+       { 0x111B6, 0x111BE },
+       { 0x116AB, 0x116AB },
+       { 0x116AD, 0x116AD },
+       { 0x116B0, 0x116B5 },
+       { 0x116B7, 0x116B7 },
+       { 0x16F8F, 0x16F92 },
+       { 0x1D167, 0x1D169 },
+       { 0x1D173, 0x1D182 },
+       { 0x1D185, 0x1D18B },
+       { 0x1D1AA, 0x1D1AD },
+       { 0x1D242, 0x1D244 },
+       { 0xE0001, 0xE0001 },
+       { 0xE0020, 0xE007F },
+       { 0xE0100, 0xE01EF }
+};
+
+static const struct mb_ucsrange mb_ucs_fullwidth[] = {
+       { 0x1100, 0x115F },
+       { 0x2329, 0x232A },
+       { 0x2E80, 0x303E },
+       { 0x3040, 0xA4CF },
+       { 0xA960, 0xA97F },
+       { 0xAC00, 0xD7A3 },
+       { 0xF900, 0xFAFF },
+       { 0xFE10, 0xFE19 },
+       { 0xFE30, 0xFE6F },
+       { 0xFF00, 0xFF60 },
+       { 0xFFE0, 0xFFE6 },
+       { 0x1B000, 0x1B001 },
+       { 0x1F200, 0x1F202 },
+       { 0x1F210, 0x1F23A },
+       { 0x1F240, 0x1F248 },
+       { 0x1F250, 0x1F251 },
+       { 0x20000, 0x2FFFD },
+       { 0x30000, 0x3FFFD }
+};
+
+/* from mksh */
+#define NELEM(a)       (sizeof(a) / sizeof((a)[0]))
+
+/* simple binary search in ranges, with bounds optimisation */
+static size_t
+mb_ucsbsearch(const struct mb_ucsrange arr[], size_t elems, unsigned int val)
+{
+       size_t min = 0, mid, max = elems;
+
+       if (val < arr[min].beg || val > arr[max - 1].end)
+               return ((size_t)-1);
+
+       while (min < max) {
+               mid = (min + max) / 2;
+
+               if (val < arr[mid].beg)
+                       max = mid;
+               else if (val > arr[mid].end)
+                       min = mid + 1;
+               else
+                       return (mid);
+       }
+       return ((size_t)-1);
+}
+
 /* Modified for JOE: returns printed width of control and other non-printable
    characters */
 
-int joe_wcwidth(int wide,int ucs)
-{
-       /* sorted list of non-overlapping intervals of non-spacing characters */
-       /* generated by "uniset +cat=Me +cat=Mn +cat=Cf -00AD +1160-11FF +200B c" */
-       static const struct interval combining[] = {
-               /* Unicode 6.1.0 Full Range */
-               { 0x0300, 0x036F }, { 0x0483, 0x0489 }, { 0x0591, 0x05BD },
-               { 0x05BF, 0x05BF }, { 0x05C1, 0x05C2 }, { 0x05C4, 0x05C5 },
-               { 0x05C7, 0x05C7 }, { 0x0600, 0x0604 }, { 0x0610, 0x061A },
-               { 0x064B, 0x065F }, { 0x0670, 0x0670 }, { 0x06D6, 0x06DD },
-               { 0x06DF, 0x06E4 }, { 0x06E7, 0x06E8 }, { 0x06EA, 0x06ED },
-               { 0x070F, 0x070F }, { 0x0711, 0x0711 }, { 0x0730, 0x074A },
-               { 0x07A6, 0x07B0 }, { 0x07EB, 0x07F3 }, { 0x0816, 0x0819 },
-               { 0x081B, 0x0823 }, { 0x0825, 0x0827 }, { 0x0829, 0x082D },
-               { 0x0859, 0x085B }, { 0x08E4, 0x08FE }, { 0x0900, 0x0902 },
-               { 0x093A, 0x093A }, { 0x093C, 0x093C }, { 0x0941, 0x0948 },
-               { 0x094D, 0x094D }, { 0x0951, 0x0957 }, { 0x0962, 0x0963 },
-               { 0x0981, 0x0981 }, { 0x09BC, 0x09BC }, { 0x09C1, 0x09C4 },
-               { 0x09CD, 0x09CD }, { 0x09E2, 0x09E3 }, { 0x0A01, 0x0A02 },
-               { 0x0A3C, 0x0A3C }, { 0x0A41, 0x0A42 }, { 0x0A47, 0x0A48 },
-               { 0x0A4B, 0x0A4D }, { 0x0A51, 0x0A51 }, { 0x0A70, 0x0A71 },
-               { 0x0A75, 0x0A75 }, { 0x0A81, 0x0A82 }, { 0x0ABC, 0x0ABC },
-               { 0x0AC1, 0x0AC5 }, { 0x0AC7, 0x0AC8 }, { 0x0ACD, 0x0ACD },
-               { 0x0AE2, 0x0AE3 }, { 0x0B01, 0x0B01 }, { 0x0B3C, 0x0B3C },
-               { 0x0B3F, 0x0B3F }, { 0x0B41, 0x0B44 }, { 0x0B4D, 0x0B4D },
-               { 0x0B56, 0x0B56 }, { 0x0B62, 0x0B63 }, { 0x0B82, 0x0B82 },
-               { 0x0BC0, 0x0BC0 }, { 0x0BCD, 0x0BCD }, { 0x0C3E, 0x0C40 },
-               { 0x0C46, 0x0C48 }, { 0x0C4A, 0x0C4D }, { 0x0C55, 0x0C56 },
-               { 0x0C62, 0x0C63 }, { 0x0CBC, 0x0CBC }, { 0x0CBF, 0x0CBF },
-               { 0x0CC6, 0x0CC6 }, { 0x0CCC, 0x0CCD }, { 0x0CE2, 0x0CE3 },
-               { 0x0D41, 0x0D44 }, { 0x0D4D, 0x0D4D }, { 0x0D62, 0x0D63 },
-               { 0x0DCA, 0x0DCA }, { 0x0DD2, 0x0DD4 }, { 0x0DD6, 0x0DD6 },
-               { 0x0E31, 0x0E31 }, { 0x0E34, 0x0E3A }, { 0x0E47, 0x0E4E },
-               { 0x0EB1, 0x0EB1 }, { 0x0EB4, 0x0EB9 }, { 0x0EBB, 0x0EBC },
-               { 0x0EC8, 0x0ECD }, { 0x0F18, 0x0F19 }, { 0x0F35, 0x0F35 },
-               { 0x0F37, 0x0F37 }, { 0x0F39, 0x0F39 }, { 0x0F71, 0x0F7E },
-               { 0x0F80, 0x0F84 }, { 0x0F86, 0x0F87 }, { 0x0F8D, 0x0F97 },
-               { 0x0F99, 0x0FBC }, { 0x0FC6, 0x0FC6 }, { 0x102D, 0x1030 },
-               { 0x1032, 0x1037 }, { 0x1039, 0x103A }, { 0x103D, 0x103E },
-               { 0x1058, 0x1059 }, { 0x105E, 0x1060 }, { 0x1071, 0x1074 },
-               { 0x1082, 0x1082 }, { 0x1085, 0x1086 }, { 0x108D, 0x108D },
-               { 0x109D, 0x109D }, { 0x1160, 0x11FF }, { 0x135D, 0x135F },
-               { 0x1712, 0x1714 }, { 0x1732, 0x1734 }, { 0x1752, 0x1753 },
-               { 0x1772, 0x1773 }, { 0x17B4, 0x17B5 }, { 0x17B7, 0x17BD },
-               { 0x17C6, 0x17C6 }, { 0x17C9, 0x17D3 }, { 0x17DD, 0x17DD },
-               { 0x180B, 0x180D }, { 0x18A9, 0x18A9 }, { 0x1920, 0x1922 },
-               { 0x1927, 0x1928 }, { 0x1932, 0x1932 }, { 0x1939, 0x193B },
-               { 0x1A17, 0x1A18 }, { 0x1A56, 0x1A56 }, { 0x1A58, 0x1A5E },
-               { 0x1A60, 0x1A60 }, { 0x1A62, 0x1A62 }, { 0x1A65, 0x1A6C },
-               { 0x1A73, 0x1A7C }, { 0x1A7F, 0x1A7F }, { 0x1B00, 0x1B03 },
-               { 0x1B34, 0x1B34 }, { 0x1B36, 0x1B3A }, { 0x1B3C, 0x1B3C },
-               { 0x1B42, 0x1B42 }, { 0x1B6B, 0x1B73 }, { 0x1B80, 0x1B81 },
-               { 0x1BA2, 0x1BA5 }, { 0x1BA8, 0x1BA9 }, { 0x1BAB, 0x1BAB },
-               { 0x1BE6, 0x1BE6 }, { 0x1BE8, 0x1BE9 }, { 0x1BED, 0x1BED },
-               { 0x1BEF, 0x1BF1 }, { 0x1C2C, 0x1C33 }, { 0x1C36, 0x1C37 },
-               { 0x1CD0, 0x1CD2 }, { 0x1CD4, 0x1CE0 }, { 0x1CE2, 0x1CE8 },
-               { 0x1CED, 0x1CED }, { 0x1CF4, 0x1CF4 }, { 0x1DC0, 0x1DE6 },
-               { 0x1DFC, 0x1DFF }, { 0x200B, 0x200F }, { 0x202A, 0x202E },
-               { 0x2060, 0x2064 }, { 0x206A, 0x206F }, { 0x20D0, 0x20F0 },
-               { 0x2CEF, 0x2CF1 }, { 0x2D7F, 0x2D7F }, { 0x2DE0, 0x2DFF },
-               { 0x302A, 0x302D }, { 0x3099, 0x309A }, { 0xA66F, 0xA672 },
-               { 0xA674, 0xA67D }, { 0xA69F, 0xA69F }, { 0xA6F0, 0xA6F1 },
-               { 0xA802, 0xA802 }, { 0xA806, 0xA806 }, { 0xA80B, 0xA80B },
-               { 0xA825, 0xA826 }, { 0xA8C4, 0xA8C4 }, { 0xA8E0, 0xA8F1 },
-               { 0xA926, 0xA92D }, { 0xA947, 0xA951 }, { 0xA980, 0xA982 },
-               { 0xA9B3, 0xA9B3 }, { 0xA9B6, 0xA9B9 }, { 0xA9BC, 0xA9BC },
-               { 0xAA29, 0xAA2E }, { 0xAA31, 0xAA32 }, { 0xAA35, 0xAA36 },
-               { 0xAA43, 0xAA43 }, { 0xAA4C, 0xAA4C }, { 0xAAB0, 0xAAB0 },
-               { 0xAAB2, 0xAAB4 }, { 0xAAB7, 0xAAB8 }, { 0xAABE, 0xAABF },
-               { 0xAAC1, 0xAAC1 }, { 0xAAEC, 0xAAED }, { 0xAAF6, 0xAAF6 },
-               { 0xABE5, 0xABE5 }, { 0xABE8, 0xABE8 }, { 0xABED, 0xABED },
-               { 0xFB1E, 0xFB1E }, { 0xFE00, 0xFE0F }, { 0xFE20, 0xFE26 },
-               { 0xFEFF, 0xFEFF }, { 0xFFF9, 0xFFFB }, { 0x101FD, 0x101FD },
-               { 0x10A01, 0x10A03 }, { 0x10A05, 0x10A06 }, { 0x10A0C, 0x10A0F },
-               { 0x10A38, 0x10A3A }, { 0x10A3F, 0x10A3F }, { 0x11001, 0x11001 },
-               { 0x11038, 0x11046 }, { 0x11080, 0x11081 }, { 0x110B3, 0x110B6 },
-               { 0x110B9, 0x110BA }, { 0x110BD, 0x110BD }, { 0x11100, 0x11102 },
-               { 0x11127, 0x1112B }, { 0x1112D, 0x11134 }, { 0x11180, 0x11181 },
-               { 0x111B6, 0x111BE }, { 0x116AB, 0x116AB }, { 0x116AD, 0x116AD },
-               { 0x116B0, 0x116B5 }, { 0x116B7, 0x116B7 }, { 0x16F8F, 0x16F92 },
-               { 0x1D167, 0x1D169 }, { 0x1D173, 0x1D182 }, { 0x1D185, 0x1D18B },
-               { 0x1D1AA, 0x1D1AD }, { 0x1D242, 0x1D244 }, { 0xE0001, 0xE0001 },
-               { 0xE0020, 0xE007F }, { 0xE0100, 0xE01EF }
-       };
+static const struct mb_ucsrange joe_ctrlchars[] = {
+       { 0x200B, 0x200F },
+       { 0x2028, 0x202E },
+       { 0x2060, 0x2063 },
+       { 0x206A, 0x206F },
+       { 0xFDD0, 0xFDEF },
+       { 0xFEFF, 0xFEFF },
+       { 0xFFF9, 0xFFFB },
+       { 0xFFFE, 0xFFFF }
+};
 
+int joe_wcwidth(int wide, unsigned int ucs)
+{
        /* If terminal is not UTF-8 or file is not UTF-8: width is 1 */
        /* FIXME */
        if (!locale_map->type || !wide)
-               return 1;
+               return (1);
 
-       /* Control characters are one column wide in JOE */
-       if (ucs < 32 || ucs == 0x7F)
-               return 1;
+       if ((wide = unictrl(ucs)))
+               return (wide);
 
-       /* More control characters... */
-       if (ucs >= 0x80 && ucs < 0xA0)
-               return 4;
+       /* combining characters use 0 screen columns */
+       if (mb_ucsbsearch(mb_ucs_combining, NELEM(mb_ucs_combining), ucs) != (size_t)-1)
+               return (0);
 
-       /* More control characters... */
-       /*XXX revisit all of these -mirabilos */
-       if (ucs >= 0x200B && ucs <= 0x206F) {
-               if (ucs <= 0x200F) return 6;
-               if (ucs >= 0x2028 && ucs <= 0x202E) return 6;
-               if (ucs >= 0x2060 && ucs <= 0x2063) return 6;
-               if (ucs >= 0x206A) return 6;
-       }
-
-       /* More control characters... */
-       if (ucs >= 0xFDD0 && ucs <= 0xFDEF)
-               return 6;
-
-       if (ucs == 0xFEFF)
-               return 6;
-
-       if (ucs >= 0xFFF9 && ucs <= 0xFFFB)
-               return 6;
-
-       if (ucs >= 0xFFFE && ucs <= 0xFFFF)
-               return 6;
-
-       /* binary search in table of non-spacing characters */
-       if (-1 != bisearch(ucs, combining, sizeof(combining) / sizeof(struct interval) - 1))
-               return 0;
-
-       /* if we arrive here, c is not a combining or C0/C1 control char */
-
-       return 1 +
-         (ucs >= 0x1100 &&
-          (ucs <= 0x115F ||                    /* Hangul Jamo init. consonants */
-           ucs == 0x2329 || ucs == 0x232A ||
-           (ucs >= 0x2E80 && ucs <= 0xA4CF &&
-            ucs != 0x303F) ||                  /* CJK ... Yi */
-           (ucs >= 0xAC00 && ucs <= 0xD7A3) || /* Hangul Syllables */
-           (ucs >= 0xF900 && ucs <= 0xFAFF) || /* CJK Compatibility Ideographs */
-           (ucs >= 0xFE10 && ucs <= 0xFE19) || /* Vertical forms */
-           (ucs >= 0xFE30 && ucs <= 0xFE6F) || /* CJK Compatibility Forms */
-           (ucs >= 0xFF00 && ucs <= 0xFF60) || /* Fullwidth Forms */
-           (ucs >= 0xFFE0 && ucs <= 0xFFE6) ||
-           (ucs >= 0x20000 && ucs <= 0x2FFFD) ||
-           (ucs >= 0x30000 && ucs <= 0x3FFFD)));
+       /* all others use 1 or 2 screen columns */
+       if (mb_ucsbsearch(mb_ucs_fullwidth, NELEM(mb_ucs_fullwidth), ucs) != (size_t)-1)
+               return (2);
+       return (1);
 }
 
 /* MAKE_ISW functions... */
 
-static struct interval data_wctype_upper[]=
+static struct mb_ucsrange data_wctype_upper[]=
 {
        { 0x0041, 0x005A },
        { 0x00C0, 0x00D6 },
@@ -390,7 +455,7 @@ static struct interval data_wctype_upper[]=
 
 MAKE_ISW(upper)
 
-static struct interval data_wctype_lower[]=
+static struct mb_ucsrange data_wctype_lower[]=
 {
        { 0x0061, 0x007A },
        { 0x00B5, 0x00B5 },
@@ -504,7 +569,7 @@ static struct interval data_wctype_lower[]=
 
 MAKE_ISW(lower)
 
-struct interval data_wctype_alpha[]=
+struct mb_ucsrange data_wctype_alpha[]=
 {
        { 0x0041, 0x005A },
        { 0x005F, 0x005F },     /* Include _ for joe */
@@ -878,14 +943,14 @@ int joe_iswalnum_(struct charmap *foo,int c)
                return joe_iswalpha(foo,c);
 }
 
-struct interval data_wctype_digit[]=
+struct mb_ucsrange data_wctype_digit[]=
 {
        { 0x0030, 0x0039 }
 };
 
 MAKE_ISW(digit)
 
-struct interval data_wctype_space[]=
+struct mb_ucsrange data_wctype_space[]=
 {
        { 0x0009, 0x000D },
        { 0x0020, 0x0020 },
@@ -900,7 +965,7 @@ struct interval data_wctype_space[]=
 
 MAKE_ISW(space)
 
-struct interval data_wctype_ctrl[]=
+struct mb_ucsrange data_wctype_ctrl[]=
 {
        { 0x0000, 0x001F },
        { 0x007F, 0x009F },
@@ -910,7 +975,7 @@ struct interval data_wctype_ctrl[]=
 
 MAKE_ISW(ctrl)
 
-struct interval data_wctype_punct[]=
+struct mb_ucsrange data_wctype_punct[]=
 {
        { 0x0021, 0x002F },
        { 0x003A, 0x0040 },
@@ -1165,7 +1230,7 @@ struct interval data_wctype_punct[]=
 
 MAKE_ISW(punct)
 
-struct interval data_wctype_graph[]=
+struct mb_ucsrange data_wctype_graph[]=
 {
        { 0x0021, 0x007E },
        { 0x00A0, 0x0220 },
@@ -1560,7 +1625,7 @@ struct interval data_wctype_graph[]=
 
 MAKE_ISW(graph)
 
-struct interval data_wctype_print[]=
+struct mb_ucsrange data_wctype_print[]=
 {
        { 0x0020, 0x007E },
        { 0x00A0, 0x0220 },
@@ -1954,7 +2019,7 @@ struct interval data_wctype_print[]=
 
 MAKE_ISW(print)
 
-struct interval data_wctype_xdigit[]=
+struct mb_ucsrange data_wctype_xdigit[]=
 {
        { 0x0030, 0x0039 },
        { 0x0041, 0x0046 },
@@ -1963,7 +2028,7 @@ struct interval data_wctype_xdigit[]=
 
 MAKE_ISW(xdigit)
 
-struct interval data_wctype_blank[]=
+struct mb_ucsrange data_wctype_blank[]=
 {
        { 0x0009, 0x0009 },
        { 0x0020, 0x0020 },
@@ -1978,7 +2043,7 @@ MAKE_ISW(blank)
 
 /* Conversion functions */
 
-static struct interval data_wctype_toupper[]=
+static struct mb_ucsrange data_wctype_toupper[]=
 {
        { 0x0061, 0x0041 },
        { 0x0062, 0x0042 },
@@ -2741,13 +2806,13 @@ static struct interval data_wctype_toupper[]=
        { 0x0001044D, 0x00010425 }
 };
 
-static struct interval *data_wctype_toupper_i;
+static struct mb_ucsrange *data_wctype_toupper_i;
 static int toupper_i_size;
 static int *toupper_cvt;
 
 int joe_towupper(struct charmap *foo,int c)
 {
-       int idx;
+       size_t idx;
 
        if (c>=0x61 && c<=0x7A)
                return c+0x41-0x61;
@@ -2758,31 +2823,31 @@ int joe_towupper(struct charmap *foo,int c)
        if (!data_wctype_toupper_i) {
                int x;
                int y = -1;
-               data_wctype_toupper_i = (struct interval *)malloc(sizeof(data_wctype_toupper));
-               toupper_cvt = (int *)malloc(sizeof(data_wctype_toupper)/sizeof(struct interval)*sizeof(int));
+               data_wctype_toupper_i = (struct mb_ucsrange *)malloc(sizeof(data_wctype_toupper));
+               toupper_cvt = (int *)malloc(sizeof(data_wctype_toupper)/sizeof(struct mb_ucsrange)*sizeof(int));
 
-               for (x=0;x!=sizeof(data_wctype_toupper)/sizeof(struct interval);++x) {
-                       if (y == -1 || data_wctype_toupper_i[y].first + 1 != data_wctype_toupper[x].first ||
-                           toupper_cvt[y] != data_wctype_toupper[x].last - data_wctype_toupper[x].first) {
+               for (x=0;x!=sizeof(data_wctype_toupper)/sizeof(struct mb_ucsrange);++x) {
+                       if (y == -1 || data_wctype_toupper_i[y].beg + 1 != data_wctype_toupper[x].beg ||
+                           toupper_cvt[y] != (int)(data_wctype_toupper[x].end - data_wctype_toupper[x].beg)) {
                                ++y;
-                               data_wctype_toupper_i[y].first = data_wctype_toupper[x].first;
-                               data_wctype_toupper_i[y].last = data_wctype_toupper[x].first;
-                               toupper_cvt[y] = data_wctype_toupper[x].last - data_wctype_toupper[x].first;
+                               data_wctype_toupper_i[y].beg = data_wctype_toupper[x].beg;
+                               data_wctype_toupper_i[y].end = data_wctype_toupper[x].beg;
+                               toupper_cvt[y] = data_wctype_toupper[x].end - data_wctype_toupper[x].beg;
                        } else
-                               ++data_wctype_toupper_i[y].last;
+                               ++data_wctype_toupper_i[y].end;
                }
-               toupper_i_size = y;
+               toupper_i_size = y + 1;
        }
 
-       idx = bisearch(c, data_wctype_toupper_i, toupper_i_size);
+       idx = mb_ucsbsearch(data_wctype_toupper_i, toupper_i_size, c);
 
-       if (idx==-1)
+       if (idx == (size_t)-1)
                return c;
        else
                return c+toupper_cvt[idx];
 }
 
-static struct interval data_wctype_tolower[]=
+static struct mb_ucsrange data_wctype_tolower[]=
 {
        { 0x0041, 0x0061 },
        { 0x0042, 0x0062 },
@@ -3535,13 +3600,13 @@ static struct interval data_wctype_tolower[]=
        { 0x00010425, 0x0001044D }
 };
 
-static struct interval *data_wctype_tolower_i;
+static struct mb_ucsrange *data_wctype_tolower_i;
 static int tolower_i_size;
 static int *tolower_cvt;
 
 int joe_towlower(struct charmap *foo,int c)
 {
-       int idx;
+       size_t idx;
 
        if (c>=0x41 && c<=0x5A)
                return c + 0x61 - 0x41;
@@ -3552,25 +3617,25 @@ int joe_towlower(struct charmap *foo,int c)
        if (!data_wctype_tolower_i) {
                int x;
                int y = -1;
-               data_wctype_tolower_i = (struct interval *)malloc(sizeof(data_wctype_tolower));
-               tolower_cvt = (int *)malloc(sizeof(data_wctype_tolower)/sizeof(struct interval)*sizeof(int));
+               data_wctype_tolower_i = (struct mb_ucsrange *)malloc(sizeof(data_wctype_tolower));
+               tolower_cvt = (int *)malloc(sizeof(data_wctype_tolower)/sizeof(struct mb_ucsrange)*sizeof(int));
 
-               for (x=0;x!=sizeof(data_wctype_tolower)/sizeof(struct interval);++x) {
-                       if (y == -1 || data_wctype_tolower_i[y].last + 1 != data_wctype_tolower[x].first ||
-                           tolower_cvt[y] != data_wctype_tolower[x].last - data_wctype_tolower[x].first) {
+               for (x=0;x!=sizeof(data_wctype_tolower)/sizeof(struct mb_ucsrange);++x) {
+                       if (y == -1 || data_wctype_tolower_i[y].end + 1 != data_wctype_tolower[x].beg ||
+                           tolower_cvt[y] != (int)(data_wctype_tolower[x].end - data_wctype_tolower[x].beg)) {
                                ++y;
-                               data_wctype_tolower_i[y].first = data_wctype_tolower[x].first;
-                               data_wctype_tolower_i[y].last = data_wctype_tolower[x].first;
-                               tolower_cvt[y] = data_wctype_tolower[x].last - data_wctype_tolower[x].first;
+                               data_wctype_tolower_i[y].beg = data_wctype_tolower[x].beg;
+                               data_wctype_tolower_i[y].end = data_wctype_tolower[x].beg;
+                               tolower_cvt[y] = data_wctype_tolower[x].end - data_wctype_tolower[x].beg;
                        } else
-                               ++data_wctype_tolower_i[y].last;
+                               ++data_wctype_tolower_i[y].end;
                }
-               tolower_i_size = y;
+               tolower_i_size = y + 1;
        }
 
-       idx = bisearch(c, data_wctype_tolower_i, tolower_i_size);
+       idx = mb_ucsbsearch(data_wctype_tolower_i, tolower_i_size, c);
 
-       if (idx==-1)
+       if (idx == (size_t)-1)
                return c;
        else
                return c+tolower_cvt[idx];
@@ -3601,37 +3666,22 @@ main(int argc,char *argv[])
 */
 
 /* Return true if c is a control character which should not be displayed */
-/* This should match mk_wcwidth() */
-
-int unictrl(int ucs)
+int unictrl(unsigned int ucs)
 {
-       /* Control characters are one column wide in JOE */
+       /* C0 Control characters are one column wide in JOE */
        if (ucs < 32 || ucs == 0x7F)
-               return 1;
+               return (1);
 
-       if (ucs >= 0x80 && ucs <= 0x9F)
-               return 4;
-
-       /* More control characters... */
-       if (ucs>=0x200b && ucs<=0x206f) {
-               if (ucs<=0x200f) return 6;
-               if (ucs>=0x2028 && ucs<=0x202E) return 6;
-               if (ucs>=0x2060 && ucs<=0x2063) return 6;
-               if (ucs>=0x206a) return 6;
-       }
+       /* C1 control characters... */
+       if (ucs >= 0x80 && ucs < 0xA0)
+               return (4);
 
        /* More control characters... */
-       if (ucs>=0xFDD0 && ucs<=0xFDEF)
-               return 6;
-
-       if (ucs==0xFEFF)
-               return 6;
-
-       if (ucs>=0xFFF9 && ucs<=0xFFFB)
-               return 6;
+       if (mb_ucsbsearch(joe_ctrlchars, NELEM(joe_ctrlchars), ucs) != (size_t)-1)
+               return (6);
 
-       if (ucs>=0xFFFE && ucs<=0xFFFF)
-               return 6;
+       if ((ucs & 0xFFFE) == 0xFFFE)
+               return (ucs > 0xFFFFF ? 8 : 7);
 
-       return 0;
+       return (0);
 }
diff --git a/i18n.h b/i18n.h
index b8f6e8c..11d3041 100644 (file)
--- a/i18n.h
+++ b/i18n.h
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/i18n.h,v 1.2 2008/05/13 13:08:22 tg Exp $ */
+/* $MirOS: contrib/code/jupp/i18n.h,v 1.3 2013/05/31 23:27:18 tg Exp $ */
 
 #ifndef _Ii18n
 #define _Ii18n 1
@@ -24,12 +24,12 @@ int joe_iswprint PARAMS((struct charmap *,int c));
 int joe_iswxdigit PARAMS((struct charmap *,int c));
 int joe_iswblank PARAMS((struct charmap *,int c));
 
-int joe_wcwidth PARAMS((int wide,int c));
+int joe_wcwidth PARAMS((int wide, unsigned int c));
 /* Looking for wswidth? Take a look at scrn.c/txtwidth() */
 
 int joe_towupper PARAMS((struct charmap *,int c));
 int joe_towlower PARAMS((struct charmap *,int c));
 
-int unictrl PARAMS((int c));
+int unictrl PARAMS((unsigned int c));
 
 #endif
index 7352e88..e9d5d04 100644 (file)
@@ -1,4 +1,4 @@
- $MirOS: contrib/code/jupp/jmacsrc.in,v 1.13 2013/01/05 22:16:30 tg Exp $
+ $MirOS: contrib/code/jupp/jmacsrc.in,v 1.15 2013/08/19 19:20:21 tg Exp $
 
                          Initialization file for JOE
                                 GNU-Emacs Joe
 -syntax diff
 
 *
++Index: \*\ndiff\*\n--- \*\n+++\[ ]
+-highlight
+-syntax diff
+
+*
 +\[=?]\*\n--- \*\n+++\[ ]
 -highlight
 -syntax diff
 -highlight
 -syntax diff
 
+*
++diff --git\*\nindex\*\n--- \*\n+++\[ ]
+-highlight
+-syntax diff
+
  === eMail
 *.eml
 -syntax mail
@@ -741,10 +751,19 @@ 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
 
+:Pasteprompt
+type                                   ^@ TO ÿ
+nop                                    ^L
+keymap,"prompt",rtn,msg,rtn,rtn                ^M
+msg,"Entered bracketed paste mode",rtn ^[ [ 2 0 0 ~
+keymap,"prompt",rtn,msg,rtn            ^[ [ 2 0 1 ~
+keymap,"prompt",rtn                    ^D
+
 :main                  Text editing window
 :inherit windows
 
 helpcard,"Paste",rtn,keymap,"Paste",rtn        ^[ [ 2 0 0 ~
+nop                                    ^[ [ 2 0 1 ~
 
   ESC-x compile
 
@@ -966,6 +985,10 @@ yankpop            ^[ y            Yank-pop
 abort          ^G
 abort          ^C
 complete       ^I
+nop            ^L
+keymap,"Pasteprompt",rtn,msg,"Entered bracketed paste mode",rtn        ^[ P
+keymap,"Pasteprompt",rtn,msg,"Entered bracketed paste mode",rtn        ^[ p
+keymap,"Pasteprompt",rtn,msg,"Entered bracketed paste mode",rtn        ^[ [ 2 0 0 ~
 
 :menu                  Selection menus
 :inherit windows
index 9279a46..228baa5 100644 (file)
--- a/joerc.in
+++ b/joerc.in
@@ -1,4 +1,4 @@
- $MirOS: contrib/code/jupp/joerc.in,v 1.11 2013/01/05 22:16:30 tg Exp $
+ $MirOS: contrib/code/jupp/joerc.in,v 1.15 2013/08/19 19:20:21 tg Exp $
 
                          Initialization file for JOE
                                 Standard Joe
 -syntax diff
 
 *
++Index: \*\ndiff\*\n--- \*\n+++\[ ]
+-highlight
+-syntax diff
+
+*
 +\[=?]\*\n--- \*\n+++\[ ]
 -highlight
 -syntax diff
 -highlight
 -syntax diff
 
+*
++diff --git\*\nindex\*\n--- \*\n+++\[ ]
+-highlight
+-syntax diff
+
  === eMail
 *.eml
 -syntax mail
@@ -794,10 +804,26 @@ 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
 
+:Pastecua
+type                                   ^@ TO ÿ
+rtn                                    ^M
+msg,"Entered bracketed paste mode",rtn ^[ [ 2 0 0 ~
+helpcard,rtn,keymap,"cua",rtn,msg,rtn  ^[ [ 2 0 1 ~
+helpcard,rtn,keymap,"cua",rtn          ^D
+
+:Pasteprompt
+type                                   ^@ TO ÿ
+nop                                    ^L
+keymap,"prompt",rtn,msg,rtn,rtn                ^M
+msg,"Entered bracketed paste mode",rtn ^[ [ 2 0 0 ~
+keymap,"prompt",rtn,msg,rtn            ^[ [ 2 0 1 ~
+keymap,"prompt",rtn                    ^D
+
 :main                  Text editing window
 :inherit windows
 
 helpcard,"Paste",rtn,keymap,"Paste",rtn        ^[ [ 2 0 0 ~
+nop                                    ^[ [ 2 0 1 ~
 
  Spell-check macros
 
@@ -1078,6 +1104,10 @@ uparw            ^[ [ A
 :prompt                        Prompt windows
 :inherit main
 complete       ^I
+nop            ^L
+keymap,"Pasteprompt",rtn,msg,"Entered bracketed paste mode",rtn        ^[ P
+keymap,"Pasteprompt",rtn,msg,"Entered bracketed paste mode",rtn        ^[ p
+keymap,"Pasteprompt",rtn,msg,"Entered bracketed paste mode",rtn        ^[ [ 2 0 0 ~
 
 :menu                  Selection menus
 :inherit windows
@@ -1153,3 +1183,6 @@ undo              ^Z
 blkdel,nmark   ^X
 copy           ^C
 yank           ^V
+helpcard,"Paste",rtn,keymap,"Pastecua",rtn     ^[ P
+helpcard,"Paste",rtn,keymap,"Pastecua",rtn     ^[ p
+helpcard,"Paste",rtn,keymap,"Pastecua",rtn     ^[ [ 2 0 0 ~
index 31c5fea..2993af5 100644 (file)
@@ -1,4 +1,4 @@
- $MirOS: contrib/code/jupp/jpicorc.in,v 1.10 2013/01/05 22:16:30 tg Exp $
+ $MirOS: contrib/code/jupp/jpicorc.in,v 1.15 2013/08/19 19:20:22 tg Exp $
 
                          Initialization file for JOE
                                  Super Pico
 -syntax diff
 
 *
++Index: \*\ndiff\*\n--- \*\n+++\[ ]
+-highlight
+-syntax diff
+
+*
 +\[=?]\*\n--- \*\n+++\[ ]
 -highlight
 -syntax diff
 -highlight
 -syntax diff
 
+*
++diff --git\*\nindex\*\n--- \*\n+++\[ ]
+-highlight
+-syntax diff
+
  === eMail
 *.eml
 -syntax mail
@@ -760,10 +770,19 @@ 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
 
+:Pasteprompt
+type                                   ^@ TO ÿ
+nop                                    ^L
+keymap,"prompt",rtn,msg,rtn,rtn                ^M
+msg,"Entered bracketed paste mode",rtn ^[ [ 2 0 0 ~
+keymap,"prompt",rtn,msg,rtn            ^[ [ 2 0 1 ~
+keymap,"prompt",rtn                    ^D
+
 :main                  Text editing window
 :inherit windows
 
 helpcard,"Paste",rtn,keymap,"Paste",rtn        ^[ [ 2 0 0 ~
+nop                                    ^[ [ 2 0 1 ~
 
 begin_marking,uparw,toggle_marking     ^[ [ 1 ; 2 A    xterm shift-up mark
 begin_marking,dnarw,toggle_marking     ^[ [ 1 ; 2 B    xterm shift-down mark
@@ -920,6 +939,10 @@ cancel,eof ^V
 cancel,line    ^T
 cancel,bop     ^W
 cancel,eop     ^O
+nop            ^L
+keymap,"Pasteprompt",rtn,msg,"Entered bracketed paste mode",rtn        ^[ P
+keymap,"Pasteprompt",rtn,msg,"Entered bracketed paste mode",rtn        ^[ p
+keymap,"Pasteprompt",rtn,msg,"Entered bracketed paste mode",rtn        ^[ [ 2 0 0 ~
 
 :menu                  Selection menus
 :inherit windows
index 6c254c6..53682f5 100644 (file)
@@ -1,4 +1,4 @@
- $MirOS: contrib/code/jupp/jstarrc.in,v 1.11 2013/01/05 22:16:31 tg Exp $
+ $MirOS: contrib/code/jupp/jstarrc.in,v 1.15 2013/08/19 19:20:22 tg Exp $
 
                          Initialization file for JOE
                            WordStar / Turbo-C Joe
 -syntax diff
 
 *
++Index: \*\ndiff\*\n--- \*\n+++\[ ]
+-highlight
+-syntax diff
+
+*
 +\[=?]\*\n--- \*\n+++\[ ]
 -highlight
 -syntax diff
 -highlight
 -syntax diff
 
+*
++diff --git\*\nindex\*\n--- \*\n+++\[ ]
+-highlight
+-syntax diff
+
  === eMail
 *.eml
 -syntax mail
@@ -753,10 +763,26 @@ 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
 
+:Pastecua
+type                                   ^@ TO ÿ
+rtn                                    ^M
+msg,"Entered bracketed paste mode",rtn ^[ [ 2 0 0 ~
+helpcard,rtn,keymap,"cua",rtn,msg,rtn  ^[ [ 2 0 1 ~
+helpcard,rtn,keymap,"cua",rtn          ^D
+
+:Pasteprompt
+type                                   ^@ TO ÿ
+nop                                    ^L
+keymap,"prompt",rtn,msg,rtn,rtn                ^M
+msg,"Entered bracketed paste mode",rtn ^[ [ 2 0 0 ~
+keymap,"prompt",rtn,msg,rtn            ^[ [ 2 0 1 ~
+keymap,"prompt",rtn                    ^D
+
 :main                  Text editing window
 :inherit windows
 
 helpcard,"Paste",rtn,keymap,"Paste",rtn        ^[ [ 2 0 0 ~
+nop                                    ^[ [ 2 0 1 ~
 
 begin_marking,uparw,toggle_marking     ^[ [ 1 ; 2 A    xterm shift-up mark
 begin_marking,dnarw,toggle_marking     ^[ [ 1 ; 2 B    xterm shift-down mark
@@ -1012,6 +1038,10 @@ upslide          ^W
 :inherit main
 abort          ^C
 complete       ^I
+nop            ^L
+keymap,"Pasteprompt",rtn,msg,"Entered bracketed paste mode",rtn        ^[ P
+keymap,"Pasteprompt",rtn,msg,"Entered bracketed paste mode",rtn        ^[ p
+keymap,"Pasteprompt",rtn,msg,"Entered bracketed paste mode",rtn        ^[ [ 2 0 0 ~
 
 :menu                  Selection menus
 :inherit windows
@@ -1091,3 +1121,6 @@ undo              ^Z
 blkdel,nmark   ^X
 copy           ^C
 yank           ^V
+helpcard,"Paste",rtn,keymap,"Pastecua",rtn     ^[ P
+helpcard,"Paste",rtn,keymap,"Pastecua",rtn     ^[ p
+helpcard,"Paste",rtn,keymap,"Pastecua",rtn     ^[ [ 2 0 0 ~
diff --git a/jupprc b/jupprc
index cd7d54b..78be3a0 100644 (file)
--- a/jupprc
+++ b/jupprc
 -syntax diff
 
 *
++Index: \*\ndiff\*\n--- \*\n+++\[ ]
+-highlight
+-syntax diff
+
+*
 +\[=?]\*\n--- \*\n+++\[ ]
 -highlight
 -syntax diff
 -highlight
 -syntax diff
 
+*
++diff --git\*\nindex\*\n--- \*\n+++\[ ]
+-highlight
+-syntax diff
+
  === eMail
 *.eml
 -syntax mail
 \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 2013-01-05; 3.1; autoCR-LF; UTF-8 via locale; per-file encoding \i \i
+\i \i @(#) jupprc 2013-08-19; 3.1; autoCR-LF; UTF-8 via locale; per-file encoding \i \i
 }
 
 {CharTable
@@ -553,6 +563,21 @@ 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
 
+:Pastecua
+type                                   ^@ TO ÿ
+rtn                                    ^M
+msg,"Entered bracketed paste mode",rtn ^[ [ 2 0 0 ~
+helpcard,rtn,keymap,"cua",rtn,msg,rtn  ^[ [ 2 0 1 ~
+helpcard,rtn,keymap,"cua",rtn          ^D
+
+:Pasteprompt
+type                                   ^@ TO ÿ
+nop                                    ^L
+keymap,"prompt",rtn,msg,rtn,rtn                ^M
+msg,"Entered bracketed paste mode",rtn ^[ [ 2 0 0 ~
+keymap,"prompt",rtn,msg,rtn            ^[ [ 2 0 1 ~
+keymap,"prompt",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 ]
@@ -561,6 +586,7 @@ 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 ~
+nop                                    ^[ [ 2 0 1 ~
 begin_marking,uparw,toggle_marking     ^[ [ 1 ; 2 A
 begin_marking,dnarw,toggle_marking     ^[ [ 1 ; 2 B
 begin_marking,rtarw,toggle_marking     ^[ [ 1 ; 2 C
@@ -792,6 +818,10 @@ yankpop            ^[ y
 :inherit main
 abort          ^C
 complete       ^I
+nop            ^L
+keymap,"Pasteprompt",rtn,msg,"Entered bracketed paste mode",rtn        ^[ P
+keymap,"Pasteprompt",rtn,msg,"Entered bracketed paste mode",rtn        ^[ p
+keymap,"Pasteprompt",rtn,msg,"Entered bracketed paste mode",rtn        ^[ [ 2 0 0 ~
 
 :menu
 :inherit windows
@@ -861,3 +891,6 @@ undo                ^Z
 blkdel,nmark   ^X
 copy           ^C
 yank           ^V
+helpcard,"Paste",rtn,keymap,"Pastecua",rtn     ^[ P
+helpcard,"Paste",rtn,keymap,"Pastecua",rtn     ^[ p
+helpcard,"Paste",rtn,keymap,"Pastecua",rtn     ^[ [ 2 0 0 ~
diff --git a/main.c b/main.c
index 69974f4..fe26d80 100644 (file)
--- a/main.c
+++ b/main.c
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/main.c,v 1.20 2013/01/05 22:16:31 tg Exp $ */
+/* $MirOS: contrib/code/jupp/main.c,v 1.21 2013/08/19 23:05:11 tg Exp $ */
 
 #define JUPP_IS_COPYRIGHT_C_BY "2013 mirabilos"
 
@@ -179,11 +179,6 @@ int edloop(int flg)
                return ret;
 }
 
-#ifdef __MSDOS__
-extern void setbreak();
-extern int breakflg;
-#endif
-
 unsigned char **mainenv;
 
 int main(int argc, char **argv, char **envp)
@@ -191,9 +186,6 @@ int main(int argc, char **argv, char **envp)
        CAP *cap;
        unsigned char *s;
        unsigned char *run;
-#ifdef __MSDOS__
-       unsigned char *rundir;
-#endif
        SCRN *n;
        int opened = 0;
        int omid;
@@ -203,21 +195,7 @@ int main(int argc, char **argv, char **envp)
        joe_locale();
 
        mainenv = (unsigned char **)envp;
-
-#ifdef __MSDOS__
-       _fmode = O_BINARY;
-       strcpy(stdbuf, argv[0]);
-       joesep(stdbuf);
-       run = namprt(stdbuf);
-       rundir = dirprt(stdbuf);
-       for (c = 0; run[c]; ++c)
-               if (run[c] == '.') {
-                       run = vstrunc(run, c);
-                       break;
-               }
-#else
        run = namprt(argv[0]);
-#endif
 
        if ((s = (unsigned char *)getenv("LINES")) != NULL)
                sscanf((char *)s, "%d", &lines);
@@ -232,47 +210,10 @@ int main(int argc, char **argv, char **envp)
        if ((s = (unsigned char *)getenv("JOETERM")) != NULL)
                joeterm = s;
 
-#ifndef __MSDOS__
        if (!(cap = getcap(NULL, 9600, NULL, NULL))) {
                fprintf(stderr, "Couldn't load termcap/terminfo entry\n");
                return 1;
        }
-#endif
-
-#ifdef __MSDOS__
-
-       s = vsncpy(NULL, 0, sv(run));
-       s = vsncpy(sv(s), sc("rc"));
-       c = procrc(cap, s);
-       if (c == 0)
-               goto donerc;
-       if (c == 1) {
-               unsigned char buf[8];
-
-               fprintf(stderr, "There were errors in '%s'.  Use it anyway?", s);
-               fflush(stderr);
-               fgets(buf, 8, stdin);
-               if (buf[0] == 'y' || buf[0] == 'Y')
-                       goto donerc;
-       }
-
-       vsrm(s);
-       s = vsncpy(NULL, 0, sv(rundir));
-       s = vsncpy(sv(s), sv(run));
-       s = vsncpy(sv(s), sc("rc"));
-       c = procrc(cap, s);
-       if (c == 0)
-               goto donerc;
-       if (c == 1) {
-               unsigned char buf[8];
-
-               fprintf(stderr, "There were errors in '%s'.  Use it anyway?", s);
-               fflush(stderr);
-               fgets(buf, 8, stdin);
-               if (buf[0] == 'y' || buf[0] == 'Y')
-                       goto donerc;
-       }
-#else
 
        s = (unsigned char *)getenv("HOME");
        if (s) {
@@ -328,7 +269,6 @@ int main(int argc, char **argv, char **envp)
                    (buf[0] == 'y' || buf[0] == 'Y'))
                        goto donerc;
        }
-#endif
 
        fprintf(stderr, "Couldn't open '%s'\n", s);
        return 1;
diff --git a/menu.c b/menu.c
index cb9fd9f..fd5e9fd 100644 (file)
--- a/menu.c
+++ b/menu.c
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/menu.c,v 1.5 2012/12/22 00:06:13 tg Exp $ */
+/* $MirOS: contrib/code/jupp/menu.c,v 1.6 2013/08/19 18:25:44 tg Exp $ */
 /*
  *     Menu selection window
  *     Copyright
@@ -20,6 +20,8 @@
 
 extern int dostaupd;
 
+static void mconfig(MENU *);
+
 static void menufllw(MENU *m)
 {
        if (m->cursor < m->top)
@@ -39,6 +41,9 @@ static void menudisp(MENU *m)
 
        utf8_init(&sm);
 
+       if (m->t->t->co != m->saved_co)
+               mconfig(m);
+
        for (y = 0; y != m->h; ++y) {
                col = 0;
                for (x = 0; x != m->perline && y*m->perline+x+m->top<m->nitems; ++x) {
@@ -140,6 +145,8 @@ static void mconfig(MENU *m)
                m->perline = m->w / (m->width + 1);
 
                /* lines = (m->nitems + m->perline - 1) / m->perline; */
+
+               m->saved_co = m->t->t->co;
        }
 }
 
@@ -427,6 +434,7 @@ MENU *mkmenu(W *w, unsigned char **s, int (*func) (/* ??? */), int (*abrt) (/* ?
        m->x = new->x;
        m->y = new->y;
        m->top = 0;
+       m->saved_co = 0;
        ldmenu(m, s, cursor);
        w->t->curwin = new;
        return m;
diff --git a/path.c b/path.c
index 566491c..a118a31 100644 (file)
--- a/path.c
+++ b/path.c
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/path.c,v 1.8 2012/12/19 21:14:53 tg Exp $ */
+/* $MirOS: contrib/code/jupp/path.c,v 1.10 2013/08/19 22:48:32 tg Exp $ */
 /* 
  *     Directory and path functions
  *     Copyright
@@ -132,7 +132,7 @@ unsigned char *namepart(unsigned char *tmp, unsigned char *path)
        return (tmp);
 }
 /********************************************************************/
-unsigned char *dirprt(unsigned char *path)
+unsigned char *dirprt_ptr(unsigned char *path)
 {
        unsigned char *b = path;
        unsigned char *z = path + slen(path);
@@ -140,7 +140,11 @@ unsigned char *dirprt(unsigned char *path)
        skip_drive_letter(b);
        while ((z != b) && (z[-1] != '/'))
                --z;
-       return vsncpy(NULL, 0, path, z - path);
+       return (z);
+}
+unsigned char *dirprt(unsigned char *path)
+{
+       return vsncpy(NULL, 0, path, dirprt_ptr(path) - path);
 }
 /********************************************************************/
 unsigned char *begprt(unsigned char *path)
@@ -211,7 +215,7 @@ int mkpath(unsigned char *path)
 /********************************************************************/
 /* Create a temporary file */
 /********************************************************************/
-unsigned char *mktmp(unsigned char *where)
+unsigned char *mktmp(unsigned char *where, int *fdp)
 {
 #ifndef HAVE_MKSTEMP
        static unsigned seq = 0;
@@ -221,6 +225,8 @@ unsigned char *mktmp(unsigned char *where)
        unsigned namesize;
 
        if (!where)
+               where = (unsigned char *)getenv("TMPDIR");
+       if (!where)
                where = (unsigned char *)getenv("TEMP");
        if (!where)
                where = US _PATH_TMP;
@@ -231,30 +237,30 @@ unsigned char *mktmp(unsigned char *where)
                                   vsrm(); */
 #ifdef HAVE_MKSTEMP
        joe_snprintf_1((char *)name, namesize, "%s/joe.tmp.XXXXXXXXXX", where);
-       if((fd = mkstemp((char *)name)) == -1)
-               return NULL;    /* FIXME: vflsh() and vflshf() */
+       if ((fd = mkstemp((char *)name)) == -1)
+               return (NULL);  /* FIXME: vflsh() and vflshf() */
                                /* expect mktmp() always succeed!!! */
-
-       fchmod(fd, 0600);       /* Linux glibc 2.0 mkstemp() creates it with */
+       fchmod(fd, 0600);       /* Linux glibc 2.0 mkstemp() creates it with */
                                /* 0666 mode --> change it to 0600, so nobody */
                                /* else sees content of temporary file */
-       close(fd);
-
 #else
-      loop:
+#warning "Waah, this is insane! Consider getting mkstemp!"
+ loop:
        seq = (seq + 1) % 10000;
-       joe_snprintf_3(name, namesize, "%s/joe.tmp.%04u%05u", where, seq, (unsigned) time(NULL) % 100000);
+       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 */
+               return (NULL);  /* FIXME: see above */
+#endif
+       if (fdp)
+               *fdp = fd;
        else
                close(fd);
-#endif
-       return name;
+       return (name);
 }
 /********************************************************************/
 int rmatch(unsigned char *a, unsigned char *b)
diff --git a/path.h b/path.h
index d66d79c..2fa0f20 100644 (file)
--- a/path.h
+++ b/path.h
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/path.h,v 1.6 2011/07/02 22:49:12 tg Exp $ */
+/* $MirOS: contrib/code/jupp/path.h,v 1.8 2013/08/19 22:48:33 tg Exp $ */
 /*
  *     Directory and path functions
  *     Copyright
@@ -32,8 +32,11 @@ unsigned char *namepart PARAMS((unsigned char *tmp, unsigned char *path))
  * The directory part of "/hello/there" is "/hello/"
  * The directory part of "/hello/" is "/hello/"
  * The directory part of "/" is "/"
+ *
+ * dirprt_ptr points to just beyond what dirprt returns.
  */
 unsigned char *dirprt PARAMS((unsigned char *path));
+unsigned char *dirprt_ptr PARAMS((unsigned char *path));
 
 /* char *begprt(char *path);
  * Return the beginning part of a path.
@@ -63,12 +66,13 @@ unsigned char *endprt PARAMS((unsigned char *path));
  */
 int mkpath PARAMS((unsigned char *path));
 
-/* char *mktmp(char *);
+/* char *mktmp(char *, int *);
  * Create an empty temporary file.  The file name created is the string passed
  * to this function postfixed with /joe.tmp.XXXXXX, where XXXXXX is some
  * string six chars long which makes this file unique.
+ * If second argument is not NULL, fd is kept open and stored there.
 */
-unsigned char *mktmp PARAMS((unsigned char *where));
+unsigned char *mktmp PARAMS((unsigned char *where, int *fdp));
 
 /* Change drive and directory */
 #define chddir chdir
index 46a491f..ac0a1e3 100644 (file)
--- a/rjoerc.in
+++ b/rjoerc.in
@@ -1,4 +1,4 @@
- $MirOS: contrib/code/jupp/rjoerc.in,v 1.11 2013/01/05 22:16:32 tg Exp $
+ $MirOS: contrib/code/jupp/rjoerc.in,v 1.15 2013/08/19 19:20:23 tg Exp $
 
                          Initialization file for JOE
                             Restricted access Joe
 -syntax diff
 
 *
++Index: \*\ndiff\*\n--- \*\n+++\[ ]
+-highlight
+-syntax diff
+
+*
 +\[=?]\*\n--- \*\n+++\[ ]
 -highlight
 -syntax diff
 -highlight
 -syntax diff
 
+*
++diff --git\*\nindex\*\n--- \*\n+++\[ ]
+-highlight
+-syntax diff
+
  === eMail
 *.eml
 -syntax mail
@@ -777,10 +787,26 @@ 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
 
+:Pastecua
+type                                   ^@ TO ÿ
+rtn                                    ^M
+msg,"Entered bracketed paste mode",rtn ^[ [ 2 0 0 ~
+helpcard,rtn,keymap,"cua",rtn,msg,rtn  ^[ [ 2 0 1 ~
+helpcard,rtn,keymap,"cua",rtn          ^D
+
+:Pasteprompt
+type                                   ^@ TO ÿ
+nop                                    ^L
+keymap,"prompt",rtn,msg,rtn,rtn                ^M
+msg,"Entered bracketed paste mode",rtn ^[ [ 2 0 0 ~
+keymap,"prompt",rtn,msg,rtn            ^[ [ 2 0 1 ~
+keymap,"prompt",rtn                    ^D
+
 :main                  Text editing window
 :inherit windows
 
 helpcard,"Paste",rtn,keymap,"Paste",rtn        ^[ [ 2 0 0 ~
+nop                                    ^[ [ 2 0 1 ~
 
  Spell-check macros
 
@@ -1054,6 +1080,10 @@ uparw            ^[ [ A
 :prompt                        Prompt windows
 :inherit main
 complete       ^I
+nop            ^L
+keymap,"Pasteprompt",rtn,msg,"Entered bracketed paste mode",rtn        ^[ P
+keymap,"Pasteprompt",rtn,msg,"Entered bracketed paste mode",rtn        ^[ p
+keymap,"Pasteprompt",rtn,msg,"Entered bracketed paste mode",rtn        ^[ [ 2 0 0 ~
 
 :menu                  Selection menus
 :inherit windows
@@ -1129,3 +1159,6 @@ undo              ^Z
 blkdel,nmark   ^X
 copy           ^C
 yank           ^V
+helpcard,"Paste",rtn,keymap,"Pastecua",rtn     ^[ P
+helpcard,"Paste",rtn,keymap,"Pastecua",rtn     ^[ p
+helpcard,"Paste",rtn,keymap,"Pastecua",rtn     ^[ [ 2 0 0 ~
index 6fbbc3e..f74b1c8 100644 (file)
@@ -1,4 +1,4 @@
-# $MirOS: contrib/code/jupp/syntax/diff.jsf.in,v 1.5 2012/09/02 14:46:51 tg Exp $
+# $MirOS: contrib/code/jupp/syntax/diff.jsf.in,v 1.6 2013/02/15 19:38:47 tg Exp $
 #-
 # JOE syntax highlight file for diff/patch files
 #
@@ -19,7 +19,7 @@
 
 # Color definitions
 =Idle
-=Garbage       dim white
+=Garbage       bold black
 =DiffCmd       blue
 =FileOld       bold red
 =FileNew       bold green
diff --git a/types.h b/types.h
index cdc4b9e..9f8cfb5 100644 (file)
--- a/types.h
+++ b/types.h
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/types.h,v 1.11 2012/12/30 21:45:17 tg Exp $ */
+/* $MirOS: contrib/code/jupp/types.h,v 1.12 2013/08/19 18:25:44 tg Exp $ */
 
 #ifndef _JOE_TYPES_H
 #define _JOE_TYPES_H
@@ -329,6 +329,7 @@ struct menu {
        int     width;          /* Width of widest item, up to 'w' max */
        int     perline;        /* Number of items on each line */
        int     nitems;         /* No. items in list */
+       int     saved_co;       /* Saved #columns of screen */
        SCREEN  *t;             /* Screen we're on */
        int     h, w, x, y;
        int     (*abrt) ();     /* Abort callback function */
index bf8b3fb..fb0733e 100644 (file)
--- a/ublock.c
+++ b/ublock.c
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/ublock.c,v 1.8 2012/12/30 18:43:40 tg Exp $ */
+/* $MirOS: contrib/code/jupp/ublock.c,v 1.10 2013/08/19 22:04:15 tg Exp $ */
 /*
  *     Highlighted block functions
  *     Copyright
@@ -29,6 +29,7 @@
 #include "uedit.h"
 #include "utils.h"
 #include "vs.h"
+#include "path.h"
 #include "poshist.h"
 #include "ushell.h"
 #include "utf8.h"
@@ -938,11 +939,22 @@ int doinsf(BW *bw, unsigned char *s, void *object, int *notify)
 
 static int filtflg = 0;
 
+/*
+ * This isn't optimal, but until the home-brewn VM system is removed
+ * it is the best we can do: we cannot use bsavefd() in a concurrent
+ * child because it uses JOE's VM subsystem which then copies around
+ * content in file-backed memory that's not unshared, leading to da-
+ * ta corruption if the content is big enough.
+ *
+ * TBH, I'd rather love to see that VM system gone and revert to the
+ * JOE original code for dofilt... --mirabilos
+ */
 static int dofilt(BW *bw, unsigned char *s, void *object, int *notify)
 {
        int fr[2];
-       int fw[2];
+       int fw;
        int flg = 0;
+       unsigned char *tf;
 
        if (notify)
                *notify = 1;
@@ -956,17 +968,28 @@ static int dofilt(BW *bw, unsigned char *s, void *object, int *notify)
       ok:
 
        if (pipe(fr)) {
- piperr:
                msgnw(bw->parent, US "Pipe error");
                return (-1);
        }
-       if (pipe(fw)) {
+       if ((tf = mktmp(NULL, &fw)) == NULL) {
                close(fr[0]);
                close(fr[1]);
-               goto piperr;
+               msgnw(bw->parent, US "Cannot create temporary file");
+               return (-1);
        }
+       unlink((char *)tf);
+       vsrm(tf);
        npartial(bw->parent->t->t);
        ttclsn();
+       if (square) {
+               B *tmp = pextrect(markb,
+                                 markk->line - markb->line + 1,
+                                 markk->xcol);
+
+               bsavefd(tmp->bof, fw, tmp->eof->byte);
+       } else
+               bsavefd(markb, fw, markk->byte - markb->byte);
+       lseek(fw, (off_t)0, SEEK_SET);
        if (!fork()) {
                const char *sh;
 #ifdef HAVE_PUTENV
@@ -978,12 +1001,11 @@ static int dofilt(BW *bw, unsigned char *s, void *object, int *notify)
                close(1);
                close(2);
                /* these dups will not fail */
-               if (dup(fw[0])) {}
+               if (dup(fw)) {}
                if (dup(fr[1])) {}
                if (dup(fr[1])) {}
-               close(fw[0]);
+               close(fw);
                close(fr[1]);
-               close(fw[1]);
                close(fr[0]);
 #ifdef HAVE_PUTENV
                fname = vsncpy(NULL, 0, sc("JOE_FILENAME="));
@@ -992,76 +1014,60 @@ static int dofilt(BW *bw, unsigned char *s, void *object, int *notify)
                        len = 512;
                fname = vsncpy(sv(fname), name, len);
                putenv((char *)fname);
-               vsrm(fname);
 #endif
                sh = getushell();
                execl(sh, sh, "-c", s, NULL);
                _exit(0);
        }
        close(fr[1]);
-       close(fw[0]);
-       if (fork()) {
-               close(fw[1]);
-               if (square) {
-                       B *tmp;
-                       long width = markk->xcol - markb->xcol;
-                       long height;
-                       int usetabs = ptabrect(markb,
-                                              markk->line - markb->line + 1,
-                                              markk->xcol);
-
-                       tmp = bread(fr[0], MAXLONG);
-                       if (piscol(tmp->eof))
-                               height = tmp->eof->line + 1;
-                       else
-                               height = tmp->eof->line;
-                       if (bw->o.overtype) {
-                               pclrrect(markb, markk->line - markb->line + 1, markk->xcol, usetabs);
-                               pdelrect(markb, long_max(height, markk->line - markb->line + 1), width + markb->xcol);
-                       } else
-                               pdelrect(markb, markk->line - markb->line + 1, markk->xcol);
-                       pinsrect(markb, tmp, width, usetabs);
-                       pdupown(markb, &markk);
-                       markk->xcol = markb->xcol;
-                       if (height) {
-                               pline(markk, markk->line + height - 1);
-                               pcol(markk, markb->xcol + width);
-                               markk->xcol = markb->xcol + width;
-                       }
-                       if (lightoff)
-                               unmark(bw);
-                       brm(tmp);
-                       updall();
-               } else {
-                       P *p = pdup(markk);
-                       if (!flg)
-                               prgetc(p);
-                       bdel(markb, p);
-                       binsb(p, bread(fr[0], MAXLONG));
-                       if (!flg) {
-                               pset(p,markk);
-                               prgetc(p);
-                               bdel(p,markk);
-                       }
-                       prm(p);
-                       if (lightoff)
-                               unmark(bw);
+       close(fw);
+       if (square) {
+               B *tmp;
+               long width = markk->xcol - markb->xcol;
+               long height;
+               int usetabs = ptabrect(markb,
+                                      markk->line - markb->line + 1,
+                                      markk->xcol);
+
+               tmp = bread(fr[0], MAXLONG);
+               if (piscol(tmp->eof))
+                       height = tmp->eof->line + 1;
+               else
+                       height = tmp->eof->line;
+               if (bw->o.overtype) {
+                       pclrrect(markb, markk->line - markb->line + 1, markk->xcol, usetabs);
+                       pdelrect(markb, long_max(height, markk->line - markb->line + 1), width + markb->xcol);
+               } else
+                       pdelrect(markb, markk->line - markb->line + 1, markk->xcol);
+               pinsrect(markb, tmp, width, usetabs);
+               pdupown(markb, &markk);
+               markk->xcol = markb->xcol;
+               if (height) {
+                       pline(markk, markk->line + height - 1);
+                       pcol(markk, markb->xcol + width);
+                       markk->xcol = markb->xcol + width;
                }
-               close(fr[0]);
-               wait(NULL);
-               wait(NULL);
+               if (lightoff)
+                       unmark(bw);
+               brm(tmp);
+               updall();
        } else {
-               if (square) {
-                       B *tmp = pextrect(markb,
-                                         markk->line - markb->line + 1,
-                                         markk->xcol);
-
-                       bsavefd(tmp->bof, fw[1], tmp->eof->byte);
-               } else
-                       bsavefd(markb, fw[1], markk->byte - markb->byte);
-               close(fw[1]);
-               _exit(0);
+               P *p = pdup(markk);
+               if (!flg)
+                       prgetc(p);
+               bdel(markb, p);
+               binsb(p, bread(fr[0], MAXLONG));
+               if (!flg) {
+                       pset(p,markk);
+                       prgetc(p);
+                       bdel(p,markk);
+               }
+               prm(p);
+               if (lightoff)
+                       unmark(bw);
        }
+       close(fr[0]);
+       wait(NULL);
        vsrm(s);
        ttopnn();
        if (filtflg)
diff --git a/uedit.c b/uedit.c
index 5d3fd9d..3f9f42b 100644 (file)
--- a/uedit.c
+++ b/uedit.c
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/uedit.c,v 1.9 2009/10/18 16:02:02 tg Exp $ */
+/* $MirOS: contrib/code/jupp/uedit.c,v 1.10 2013/08/19 19:19:31 tg Exp $ */
 /*
  *     Basic user edit functions
  *     Copyright
@@ -1586,7 +1586,7 @@ static int domsg(BASE *b, unsigned char *s, void *object, int *notify)
                *notify = 1;
        strlcpy((char *)msgbuf, (char *)s, JOE_MSGBUFSIZE);
        vsrm(s);
-       msgnw(b->parent, msgbuf);
+       msgnw(b->parent, *msgbuf ? msgbuf : NULL);
        return 0;
 }
 
diff --git a/ufile.c b/ufile.c
index 369f79d..5f10168 100644 (file)
--- a/ufile.c
+++ b/ufile.c
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/ufile.c,v 1.8 2012/12/20 21:39:28 tg Exp $ */
+/* $MirOS: contrib/code/jupp/ufile.c,v 1.10 2013/08/19 22:48:33 tg Exp $ */
 /*
  *     User file operations
  *     Copyright
@@ -246,38 +246,30 @@ backup(BW *bw)
                joe_snprintf_2((char *)name, sizeof(name), "%s%s", bw->b->name, simple_backup_suffix);
        }
 
-#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);
+       *tmp = '\0';
+       if (*name != '/') {
+               /* relative pathname */
+               if (!getcwd((char *)tmp, sizeof(tmp)) ||
+                   strlcat((char *)tmp, "/", sizeof(tmp)) >= sizeof(tmp))
+                       return (1);
        }
-#endif
+       if (strlcat((char *)tmp, (char *)name, sizeof(tmp)) >= sizeof(tmp))
+               return (1);
+       *(dirprt_ptr(tmp)) = '\0';
+       if ((simple_backup_suffix = mktmp(tmp, &fd)) == NULL)
+               return (1);
 
        /* 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)) {
+       if (cp(bw->b->name, fd, simple_backup_suffix, name)) {
                close(fd);
-               unlink((char *)tmp);
+               unlink((char *)simple_backup_suffix);
                return (1);
        }
-#else
-       /* Yeowch! */
-       if ((fd = creat((char *)name, 0600)) < 0) {
-               return (1);
-       }
-#warning "TOCTOU temp file race here! Consider getting mkstemp!"
 
-       /* Copy original file to backup file */
-       if (cp(bw->b->name, fd, NULL, name)) {
-               close(fd);
-               unlink((char *)name);
-               return (1);
-       }
-#endif
        bw->b->backup = 1;
        return (0);
 }
diff --git a/vfile.c b/vfile.c
index e43cc57..e53320c 100644 (file)
--- a/vfile.c
+++ b/vfile.c
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/vfile.c,v 1.6 2012/06/07 22:30:49 tg Exp $ */
+/* $MirOS: contrib/code/jupp/vfile.c,v 1.8 2013/08/19 22:03:20 tg Exp $ */
 /*
  *     Software virtual memory system
  *     Copyright
@@ -61,12 +61,13 @@ void vflsh(void)
                                }
                if (vlowest) {
                        if (!vfile->name)
-                               vfile->name = mktmp(NULL);
+                               vfile->name = mktmp(NULL,
+                                   vfile->fd ? NULL : &vfile->fd);
                        if (!vfile->fd)
                                vfile->fd = open((char *)(vfile->name), O_RDWR);
                        lseek(vfile->fd, addr, 0);
                        if (addr + PGSIZE > vsize(vfile)) {
-                               joe_write(vfile->fd, vlowest->data, (int) (vsize(vfile) - addr));
+                               joe_write(vfile->fd, vlowest->data, vsize(vfile) - addr);
                                vfile->size = vsize(vfile);
                        } else {
                                joe_write(vfile->fd, vlowest->data, PGSIZE);
@@ -98,13 +99,14 @@ void vflshf(VFILE *vfile)
                        }
        if (vlowest) {
                if (!vfile->name)
-                       vfile->name = mktmp(NULL);
+                       vfile->name = mktmp(NULL,
+                           vfile->fd ? NULL : &vfile->fd);
                if (!vfile->fd) {
                        vfile->fd = open((char *)(vfile->name), O_RDWR);
                }
                lseek(vfile->fd, addr, 0);
                if (addr + PGSIZE > vsize(vfile)) {
-                       joe_write(vfile->fd, vlowest->data, (int) (vsize(vfile) - addr));
+                       joe_write(vfile->fd, vlowest->data, vsize(vfile) - addr);
                        vfile->size = vsize(vfile);
                } else {
                        joe_write(vfile->fd, vlowest->data, PGSIZE);
@@ -127,7 +129,7 @@ unsigned char *vlock(VFILE *vfile, unsigned long addr)
 {
        VPAGE *vp, *pp;
        int x, y;
-       int ofst = (addr & (PGSIZE - 1));
+       long ofst = (addr & (PGSIZE - 1));
 
        addr -= ofst;
 
@@ -211,7 +213,7 @@ unsigned char *vlock(VFILE *vfile, unsigned long addr)
                }
                lseek(vfile->fd, addr, 0);
                if (addr + PGSIZE > (unsigned long)vfile->size) {
-                       joe_read(vfile->fd, vp->data, (int) (vfile->size - addr));
+                       joe_read(vfile->fd, vp->data, vfile->size - addr);
                        mset(vp->data + vfile->size - addr, 0, PGSIZE - (int) (vfile->size - addr));
                } else
                        joe_read(vfile->fd, vp->data, PGSIZE);