joe-3.1jupp31.tgz (die zweite Klappe…) jupp-3_1_31
authormirabilos <m@mirbsd.org>
Wed, 9 Aug 2017 03:51:30 +0000 (05:51 +0200)
committermirabilos <m@mirbsd.org>
Wed, 9 Aug 2017 03:51:30 +0000 (05:51 +0200)
33 files changed:
LIST
Makefile.bsd-wrapper
NEWS
TODO
aclocal.m4
autoconf.h.in
blocks.c
builtins.c
bw.c
cmd.c
configure
configure.ac
i18n.c
i18n.h
joe.1.in
joe.txt
jupprc
macro.c
main.c
rc.c
scrn.c
scrn.h
syntax.c
termcap.c
tty.c
tw.c
uedit.c
uerror.c
ufile.c
ufile.h
umath.c
umath.h
utag.c

diff --git a/LIST b/LIST
index 1ae6a44..a7a112f 100644 (file)
--- a/LIST
+++ b/LIST
@@ -1,4 +1,4 @@
-$MirOS: contrib/code/jupp/LIST,v 1.10 2016/10/07 20:07:49 tg Exp $
+$MirOS: contrib/code/jupp/LIST,v 1.11 2017/08/08 21:39:27 tg Exp $
 -----------------------------------------------------------------
 
 Joe commands grouped by function
@@ -124,6 +124,7 @@ querysave   Prompt to save each modified buffer
                Use in a macro: "querysave,query,killjoe"
 
 killjoe                Exit joe immediately without checking for modified buffers
+abendjoe       Same, but with errorlevel 1
 
 Files
 -----
index 9c434e1..5bac4de 100644 (file)
@@ -1,10 +1,10 @@
-# $MirOS: contrib/code/jupp/Makefile.bsd-wrapper,v 1.9 2016/10/30 00:04:18 tg Exp $
+# $MirOS: contrib/code/jupp/Makefile.bsd-wrapper,v 1.10 2017/07/08 15:38:43 tg Exp $
 #-
 # make -f Makefile.bsd-wrapper CFPREFIX=/usr/mpkg sysconfjoesubdir=/joe
 
 MAN=           joe.1
 INST_TARGET=   INSTALL_MAN= install
-CLEANFILES+=   .deps charmap charmaps syntax joe.1 joe.txt{,~} jupp
+CLEANFILES+=   .deps charmap charmaps i18n syntax joe.1 joe.txt{,~} jupp
 
 CFPREFIX?=     /usr/local
 .if ${CFPREFIX} == "/usr"
diff --git a/NEWS b/NEWS
index cd9f758..edc9c7b 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,6 +1,23 @@
-$MirOS: contrib/code/jupp/NEWS,v 1.105 2017/01/11 22:36:43 tg Exp $
+$MirOS: contrib/code/jupp/NEWS,v 1.110 2017/08/09 01:00:22 tg Exp $
 -------------------------------------------------------------------
 
+jupp-current
+
+JOE 3.1jupp31
+
+- Fix <bsd/string.h> usage issue on Haiku
+- Make some signal handlers a bit more safe
+- Remove unused Unicode categorisations (~15K in the binary)
+- Update internationalisation data to Unicode 10.0.0
+- Partial fix for redrawing lines with combining characters
+- Quell stricter GCC 7 warnings
+- Fall back to /dev/tty if stdin or stdout is not a tty(4)
+- Add new command “abendjoe” to exit with errorlevel 1, cf. AbEnd
+- Introduce “presentation mode”, F6 toggles zoom/fullscreen;
+  F7/F8 go one file (“slide”) back/forth, F9 pipes the entire
+  file (needs rectangle mode disabled) and offers previous command
+- Fix some ctags operations segfaulting
+
 JOE 3.1jupp30
 
 - Fix spelling mistakes, some found by lintian (thanks!)
@@ -17,7 +34,7 @@ JOE 3.1jupp30
 - Disable setlocale for old cygwin32; use the current codepage instead
 - Add JOECHARMAP override for locale/codepage-detected I/O charmap
 - Display codes 128–159 in the CharTable help card properly
- Avoid the Win32 console beeping on • by making it non-printable (WTF)
+- Avoid the Win32 console beeping on • by making it non-printable (WTF)
 - Improve some documentation façets
 - Add “-CYGhack” command line option; use it in right-click menu (WTF²)
 - Do not force use of /usr/local in configure on Solaris
diff --git a/TODO b/TODO
index c75dfc1..e36c215 100644 (file)
--- a/TODO
+++ b/TODO
@@ -1,3 +1,13 @@
+F-keys:
+
+               F1    F2    F3    F4    F5     F6     F7     F8    F9    F10   F11   F12
+MirBSD console ^[[11~^[[12~^[[13~^[[14~^[[15~ ^[[17~ ^[[18~ ^[[19~^[[20~^[[21~^[[23~^[[24~     also “ssh 3.2”, PuTTY, rxvt below
+xterm          ^[OP  ^[OQ  ^[OR  ^[OS  ^[[15~ ^[[17~ ^[[18~ ^[[19~^[[20~^[[21~^[[23~^[[24~     also cygwin abusch, st izabera
+gnome-t. below   -   ^[OQ  ^[OR  ^[OS  ^[[15~~^[[17~~^[[18~~^[[19~^[[20~  -   ^[[23~^[[24~
+konsole                ^[OP  ^[OQ  ^[OR  ^[OS  ^[[15~ ^[[17~ ^[[18~ ^[[19~^[[20~^[[21~  -   ^[[24~     also yakuake
+linux console  ^[[[A ^[[[B ^[[[C ^[[[D ^[[[E  ^[[17~ ^[[18~ ^[[19~^[[20~^[[21~^[[23~^[[24~     also cygwin console below
+
+
 Do something with these keys:
 
 -------
@@ -10,18 +20,6 @@ Pgup: \e[5~
 Pgdn: \e[6~
 Ins: \e[2~
 Del: \7f
-F1: \e[11~
-F2: \e[12~
-F3: \e[13~
-F4: \e[14~
-F5: \e[15~
-F6: \e[17~
-F7: \e[18~
-F8: \e[19~
-F9: \e[20~
-F10: \e[21~
-F11: \e[23~
-F12: \e[24~
 
 Ctrl-arrow: -
 Alt-arrow: - (can set Alt=ESC mode, but doesn't work with arrow keys)
@@ -38,18 +36,6 @@ Pgup: \e[5~
 Pgdn: \e[6~
 Ins: \e[2~
 Del: \e[3~
-F1: \e[11~
-F2: \e[12~
-F3: \e[13~
-F4: \e[14~
-F5: \e[15~
-F6: \e[17~
-F7: \e[18~
-F8: \e[19~
-F9: \e[20~
-F10: \e[21~
-F11: \e[23~
-F12: \e[24~
 
 Ctrl-arrow: \eOC \eOD \eOA \eOB
 Ctrl-home: -
@@ -86,18 +72,6 @@ PgUp: \e[5~
 PgDn: \e[6~
 Ins: \e[2~
 Del: \e[3~
-F1: \eOP
-F2: \eOQ
-F3: \eOR
-F4: \eOS
-F5: \e[15~
-F6: \e[17~
-F7: \e[18~
-F8: \e[19~
-F9: \e[20~
-F10: \e[21~
-F11: \e[23~
-F12: \e[24~
 
 Ctrl-arrow: \e[1;5C \e[1;5D \e[1;5A \e[1;5B
 Ctrl-home: \e[1;5H
@@ -142,19 +116,6 @@ Pgdn: \e[6~
 Ins: \e[2~
 Del: \e[3~
 
-F1: \e[11~
-F2: \e[12~
-F3: \e[13~
-F4: \e[14~
-F5: \e[15~
-F6: \e[17~
-F7: \e[18~
-F8: \e[19~
-F9: \e[20~
-F10: \e[21~
-F11: \e[23~
-F12: \e[24~
-
 Ctrl-arrow: \eOc \eOd \eOa \eOb
 Ctrl-home: \e[7^
 Ctrl-end: \e[8^
@@ -184,18 +145,6 @@ PgUp: \e[5~
 PgDn: \e[6~
 Ins: \e[2~
 Del: \e[3~
-F1: -
-F2: \eOQ
-F3: \eOR
-F4: \eOS
-F5: \e[15~~
-F6: \e[17~~
-F7: \e[18~~
-F8: \e[19~
-F9: \e[20~
-F10: -
-F11: \e[23~
-F12: \e[24~
 
 Ctrl-arrow: \e[5C \e[5D \e[5A \e[5B
 Ctrl-home: \eOH
@@ -235,18 +184,6 @@ PgUp: \e[5~
 PgDn: \e[6~
 Ins: \e[2~
 Del: \e[3~
-F1: \eOP
-F2: \eOQ
-F3: \eOR
-F4: \eOS
-F5: \e[15~
-F6: \e[17~
-F7: \e[18~
-F8: \e[19~
-F9: \e[20~
-F10: \e[21~
-F11: \e[23~
-F12: \e[24~
 
 Ctrl-arrows: \e[C \e[D \e[A \e[B
 Ctrl-home: \e[H
@@ -282,18 +219,6 @@ PgUp: \e[5~
 PgDn: \e[6~
 Ins: \e[2~
 Del: \e[3~
-F1: \e[[A
-F2: \e[[B
-F3: \e[[C
-F4: \e[[D
-F5: \e[[E
-F6: \e[17~
-F7: \e[18~
-F8: \e[19~
-F9: \e[20~
-F10: \e[21~
-F11: \e[23~
-F12: \e[24~
 
 Ctrl-arrows: \e[C \e[D \e[A \e[B
 Ctrl-home: \e[1~
@@ -319,18 +244,6 @@ PgUp: \e[5~
 PgDn: \e[6~
 Ins: \e[2~
 Del: \e[3~
-F1: \e[[A
-F2: \e[[B
-F3: \e[[C
-F4: \e[[D
-F5: \e[[E
-F6: \e[17~
-F7: \e[18~
-F8: \e[19~
-F9: \e[20~
-F10: \e[21~
-F11: \e[23~
-F12: \e[24~
 
 Ctrl-arrows: -
 Shift-arrows: -
@@ -405,13 +318,11 @@ F5        date/time
   back to start mode?
 
 
-
 - save all files without asking thing for quick compile
 
 - better parsing of compile messages
 
 
-
 - continued search mode for jpico?
 
 - smarter highlighter- need char and string storage.
@@ -455,7 +366,7 @@ Save all history buffers and keyboard macros in ~/.joe_state file?
 Although, if merged, it must be disabled by default like mksh’s HISTFILE is:
   18:48⎜«asarch» That would be for a wish list then: to keep the
        ⎜    list of all opened files with their last position
-  Natureshadow agrees with me that this is a JOE antifeature  
+  Natureshadow agrees with me that this is a JOE antifeature
 
   Update documentation.
 
@@ -589,7 +500,6 @@ Prompts:
  HTML-style thing for option selection?
 
 
-
 Terminal handling:
 
  Emit ESC c to reset terminal on startup?
@@ -668,15 +578,18 @@ Other requests:
   labeled ftype that is switched to using the UI (command)
 • switch from autoconf to mirtoconf2
 • ANSI syntax highlighting; auto-turn it on in shell windows (‽)
-• proper redraw for lines that had combining characters in them
+  ⇒ would need to hide the ANSI chars, yet enable backspacing
+• handle combining characters in the scrn array somehow
 • add a soft line break flag: display as line-wrapped, do not
   save any newlines introduced by that
+• perhaps wrap at U+00AD?
 • put all configuration files into /usr/share; use XDG dirs for
   overriding (HOME, maybe site?)
 • rc.c: struct glopts.set (int*) violates the strict aliasing
   rule as it’s treated as (unsigned char *) for type 2 (global
   option string), consider a union instead (check local types!)
+• plug memory leaks (Valgrind reports a few)
 • …
 
 __________________________________________________________________
-$MirOS: contrib/code/jupp/TODO,v 1.30 2017/01/11 22:04:31 tg Exp $
+$MirOS: contrib/code/jupp/TODO,v 1.40 2017/08/09 01:15:24 tg Exp $
index 4eadb13..4f5bc14 100644 (file)
@@ -488,7 +488,7 @@ AC_SUBST(install_sh)])
 
 # serial 2
 
-# Check whether the underlying file-system supports filenames
+# Check whether the underlying filesystem supports filenames
 # with a leading dot.  For instance MS-DOS doesn't.
 AC_DEFUN([AM_SET_LEADING_DOT],
 [rm -rf .tst 2>/dev/null
index e275603..210161f 100644 (file)
@@ -1,4 +1,4 @@
-/* autoconf.h.in.  Generated from configure.ac by autoheader 2.61-MirPorts-1.  */
+/* autoconf.h.in.  Generated from configure.ac by autoheader 2.61-MirPorts-2.  */
 
 /* Define to 1 if `TIOCGWINSZ' requires <sys/ioctl.h>. */
 #undef GWINSZ_IN_SYS_IOCTL
@@ -56,6 +56,9 @@
 /* Define to 1 if you have the <inttypes.h> header file. */
 #undef HAVE_INTTYPES_H
 
+/* Define to 1 if you have the `isatty' function. */
+#undef HAVE_ISATTY
+
 /* Define to 1 if you have the `isblank' function. */
 #undef HAVE_ISBLANK
 
index 3d087d4..c25652b 100644 (file)
--- a/blocks.c
+++ b/blocks.c
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/blocks.c,v 1.4 2012/06/08 16:55:27 tg Exp $ */
+/* $MirOS: contrib/code/jupp/blocks.c,v 1.5 2017/08/08 16:09:43 tg Exp $ */
 /*
  *     Fast block move/copy subroutines
  *     Copyright
@@ -51,21 +51,21 @@ int *msetI(void *dest, int c, int sz)
                sz -= 16;
        }
        switch (sz) {
-       case 15:        d[14] = c;
-       case 14:        d[13] = c;
-       case 13:        d[12] = c;
-       case 12:        d[11] = c;
-       case 11:        d[10] = c;
-       case 10:        d[9] = c;
-       case 9:         d[8] = c;
-       case 8:         d[7] = c;
-       case 7:         d[6] = c;
-       case 6:         d[5] = c;
-       case 5:         d[4] = c;
-       case 4:         d[3] = c;
-       case 3:         d[2] = c;
-       case 2:         d[1] = c;
-       case 1:         d[0] = c;
+       case 15:        d[14] = c;      /* FALLTHROUGH */
+       case 14:        d[13] = c;      /* FALLTHROUGH */
+       case 13:        d[12] = c;      /* FALLTHROUGH */
+       case 12:        d[11] = c;      /* FALLTHROUGH */
+       case 11:        d[10] = c;      /* FALLTHROUGH */
+       case 10:        d[9] = c;       /* FALLTHROUGH */
+       case 9:         d[8] = c;       /* FALLTHROUGH */
+       case 8:         d[7] = c;       /* FALLTHROUGH */
+       case 7:         d[6] = c;       /* FALLTHROUGH */
+       case 6:         d[5] = c;       /* FALLTHROUGH */
+       case 5:         d[4] = c;       /* FALLTHROUGH */
+       case 4:         d[3] = c;       /* FALLTHROUGH */
+       case 3:         d[2] = c;       /* FALLTHROUGH */
+       case 2:         d[1] = c;       /* FALLTHROUGH */
+       case 1:         d[0] = c;       /* FALLTHROUGH */
        case 0:         /* do nothing */;
        }
        return orgd;
@@ -99,21 +99,21 @@ void **msetP(void **d, void *c, int sz)
                sz -= 16;
        }
        switch (sz) {
-       case 15:        d[14] = c;
-       case 14:        d[13] = c;
-       case 13:        d[12] = c;
-       case 12:        d[11] = c;
-       case 11:        d[10] = c;
-       case 10:        d[9] = c;
-       case 9:         d[8] = c;
-       case 8:         d[7] = c;
-       case 7:         d[6] = c;
-       case 6:         d[5] = c;
-       case 5:         d[4] = c;
-       case 4:         d[3] = c;
-       case 3:         d[2] = c;
-       case 2:         d[1] = c;
-       case 1:         d[0] = c;
+       case 15:        d[14] = c;      /* FALLTHROUGH */
+       case 14:        d[13] = c;      /* FALLTHROUGH */
+       case 13:        d[12] = c;      /* FALLTHROUGH */
+       case 12:        d[11] = c;      /* FALLTHROUGH */
+       case 11:        d[10] = c;      /* FALLTHROUGH */
+       case 10:        d[9] = c;       /* FALLTHROUGH */
+       case 9:         d[8] = c;       /* FALLTHROUGH */
+       case 8:         d[7] = c;       /* FALLTHROUGH */
+       case 7:         d[6] = c;       /* FALLTHROUGH */
+       case 6:         d[5] = c;       /* FALLTHROUGH */
+       case 5:         d[4] = c;       /* FALLTHROUGH */
+       case 4:         d[3] = c;       /* FALLTHROUGH */
+       case 3:         d[2] = c;       /* FALLTHROUGH */
+       case 2:         d[1] = c;       /* FALLTHROUGH */
+       case 1:         d[0] = c;       /* FALLTHROUGH */
        case 0:         /* do nothing */;
        }
        return orgd;
@@ -129,21 +129,21 @@ unsigned char *mset(void *dest, unsigned char c, int sz)
 
        if (sz < 16) {
                switch (sz) {
-               case 15:        d[14] = c;
-               case 14:        d[13] = c;
-               case 13:        d[12] = c;
-               case 12:        d[11] = c;
-               case 11:        d[10] = c;
-               case 10:        d[9] = c;
-               case 9:         d[8] = c;
-               case 8:         d[7] = c;
-               case 7:         d[6] = c;
-               case 6:         d[5] = c;
-               case 5:         d[4] = c;
-               case 4:         d[3] = c;
-               case 3:         d[2] = c;
-               case 2:         d[1] = c;
-               case 1:         d[0] = c;
+               case 15:        d[14] = c;      /* FALLTHROUGH */
+               case 14:        d[13] = c;      /* FALLTHROUGH */
+               case 13:        d[12] = c;      /* FALLTHROUGH */
+               case 12:        d[11] = c;      /* FALLTHROUGH */
+               case 11:        d[10] = c;      /* FALLTHROUGH */
+               case 10:        d[9] = c;       /* FALLTHROUGH */
+               case 9:         d[8] = c;       /* FALLTHROUGH */
+               case 8:         d[7] = c;       /* FALLTHROUGH */
+               case 7:         d[6] = c;       /* FALLTHROUGH */
+               case 6:         d[5] = c;       /* FALLTHROUGH */
+               case 5:         d[4] = c;       /* FALLTHROUGH */
+               case 4:         d[3] = c;       /* FALLTHROUGH */
+               case 3:         d[2] = c;       /* FALLTHROUGH */
+               case 2:         d[1] = c;       /* FALLTHROUGH */
+               case 1:         d[0] = c;       /* FALLTHROUGH */
                case 0:         /* do nothing */;
                }
        } else {
@@ -151,13 +151,13 @@ unsigned char *mset(void *dest, unsigned char c, int sz)
 
                if (z != SIZEOF_INT) {
                        switch (z) {
-                       case 7:         d[6] = c;
-                       case 6:         d[5] = c;
-                       case 5:         d[4] = c;
-                       case 4:         d[3] = c;
-                       case 3:         d[2] = c;
-                       case 2:         d[1] = c;
-                       case 1:         d[0] = c;
+                       case 7:         d[6] = c;       /* FALLTHROUGH */
+                       case 6:         d[5] = c;       /* FALLTHROUGH */
+                       case 5:         d[4] = c;       /* FALLTHROUGH */
+                       case 4:         d[3] = c;       /* FALLTHROUGH */
+                       case 3:         d[2] = c;       /* FALLTHROUGH */
+                       case 2:         d[1] = c;       /* FALLTHROUGH */
+                       case 1:         d[0] = c;       /* FALLTHROUGH */
                        case 0:         /* do nothing */;
                        }
                        d += z;
@@ -176,13 +176,13 @@ unsigned char *mset(void *dest, unsigned char c, int sz)
                      c, sz >> SHFT);
                d += sz & ~(SIZEOF_INT - 1);
                switch (sz & (SIZEOF_INT - 1)) {
-               case 7:         d[6] = c;
-               case 6:         d[5] = c;
-               case 5:         d[4] = c;
-               case 4:         d[3] = c;
-               case 3:         d[2] = c;
-               case 2:         d[1] = c;
-               case 1:         d[0] = c;
+               case 7:         d[6] = c;       /* FALLTHROUGH */
+               case 6:         d[5] = c;       /* FALLTHROUGH */
+               case 5:         d[4] = c;       /* FALLTHROUGH */
+               case 4:         d[3] = c;       /* FALLTHROUGH */
+               case 3:         d[2] = c;       /* FALLTHROUGH */
+               case 2:         d[1] = c;       /* FALLTHROUGH */
+               case 1:         d[0] = c;       /* FALLTHROUGH */
                case 0:         /* do nothing */;
                }
        }
@@ -225,21 +225,21 @@ static int *mbkwdI(void *dest, const void *src, int sz)
        d -= sz;
        s -= sz;
        switch (sz) {
-       case 15:        d[14] = s[14];
-       case 14:        d[13] = s[13];
-       case 13:        d[12] = s[12];
-       case 12:        d[11] = s[11];
-       case 11:        d[10] = s[10];
-       case 10:        d[9] = s[9];
-       case 9:         d[8] = s[8];
-       case 8:         d[7] = s[7];
-       case 7:         d[6] = s[6];
-       case 6:         d[5] = s[5];
-       case 5:         d[4] = s[4];
-       case 4:         d[3] = s[3];
-       case 3:         d[2] = s[2];
-       case 2:         d[1] = s[1];
-       case 1:         d[0] = s[0];
+       case 15:        d[14] = s[14];  /* FALLTHROUGH */
+       case 14:        d[13] = s[13];  /* FALLTHROUGH */
+       case 13:        d[12] = s[12];  /* FALLTHROUGH */
+       case 12:        d[11] = s[11];  /* FALLTHROUGH */
+       case 11:        d[10] = s[10];  /* FALLTHROUGH */
+       case 10:        d[9] = s[9];    /* FALLTHROUGH */
+       case 9:         d[8] = s[8];    /* FALLTHROUGH */
+       case 8:         d[7] = s[7];    /* FALLTHROUGH */
+       case 7:         d[6] = s[6];    /* FALLTHROUGH */
+       case 6:         d[5] = s[5];    /* FALLTHROUGH */
+       case 5:         d[4] = s[4];    /* FALLTHROUGH */
+       case 4:         d[3] = s[3];    /* FALLTHROUGH */
+       case 3:         d[2] = s[2];    /* FALLTHROUGH */
+       case 2:         d[1] = s[1];    /* FALLTHROUGH */
+       case 1:         d[0] = s[0];    /* FALLTHROUGH */
        case 0:         /* do nothing */;
        }
        return d;
@@ -279,21 +279,21 @@ static int *mfwrdI(void *dest, const void *src, int sz)
        s -= 15 - sz;
        d -= 15 - sz;
        switch (sz) {
-       case 15:        d[0] = s[0];
-       case 14:        d[1] = s[1];
-       case 13:        d[2] = s[2];
-       case 12:        d[3] = s[3];
-       case 11:        d[4] = s[4];
-       case 10:        d[5] = s[5];
-       case 9:         d[6] = s[6];
-       case 8:         d[7] = s[7];
-       case 7:         d[8] = s[8];
-       case 6:         d[9] = s[9];
-       case 5:         d[10] = s[10];
-       case 4:         d[11] = s[11];
-       case 3:         d[12] = s[12];
-       case 2:         d[13] = s[13];
-       case 1:         d[14] = s[14];
+       case 15:        d[0] = s[0];    /* FALLTHROUGH */
+       case 14:        d[1] = s[1];    /* FALLTHROUGH */
+       case 13:        d[2] = s[2];    /* FALLTHROUGH */
+       case 12:        d[3] = s[3];    /* FALLTHROUGH */
+       case 11:        d[4] = s[4];    /* FALLTHROUGH */
+       case 10:        d[5] = s[5];    /* FALLTHROUGH */
+       case 9:         d[6] = s[6];    /* FALLTHROUGH */
+       case 8:         d[7] = s[7];    /* FALLTHROUGH */
+       case 7:         d[8] = s[8];    /* FALLTHROUGH */
+       case 6:         d[9] = s[9];    /* FALLTHROUGH */
+       case 5:         d[10] = s[10];  /* FALLTHROUGH */
+       case 4:         d[11] = s[11];  /* FALLTHROUGH */
+       case 3:         d[12] = s[12];  /* FALLTHROUGH */
+       case 2:         d[13] = s[13];  /* FALLTHROUGH */
+       case 1:         d[14] = s[14];  /* FALLTHROUGH */
        case 0:         /* do nothing */;
        }
        return od;
@@ -321,13 +321,13 @@ static unsigned char *mbkwd(register unsigned char *d, register const unsigned c
                s -= z;
                d -= z;
                switch (z) {
-               case 7:         d[6] = s[6];
-               case 6:         d[5] = s[5];
-               case 5:         d[4] = s[4];
-               case 4:         d[3] = s[3];
-               case 3:         d[2] = s[2];
-               case 2:         d[1] = s[1];
-               case 1:         d[0] = s[0];
+               case 7:         d[6] = s[6];    /* FALLTHROUGH */
+               case 6:         d[5] = s[5];    /* FALLTHROUGH */
+               case 5:         d[4] = s[4];    /* FALLTHROUGH */
+               case 4:         d[3] = s[3];    /* FALLTHROUGH */
+               case 3:         d[2] = s[2];    /* FALLTHROUGH */
+               case 2:         d[1] = s[1];    /* FALLTHROUGH */
+               case 1:         d[0] = s[0];    /* FALLTHROUGH */
                case 0:         /* do nothing */;
                }
                sz -= z;
@@ -335,13 +335,13 @@ static unsigned char *mbkwd(register unsigned char *d, register const unsigned c
                d -= sz;
                s -= sz;
                switch (sz & (SIZEOF_INT - 1)) {
-               case 7:         d[6] = s[6];
-               case 6:         d[5] = s[5];
-               case 5:         d[4] = s[4];
-               case 4:         d[3] = s[3];
-               case 3:         d[2] = s[2];
-               case 2:         d[1] = s[1];
-               case 1:         d[0] = s[0];
+               case 7:         d[6] = s[6];    /* FALLTHROUGH */
+               case 6:         d[5] = s[5];    /* FALLTHROUGH */
+               case 5:         d[4] = s[4];    /* FALLTHROUGH */
+               case 4:         d[3] = s[3];    /* FALLTHROUGH */
+               case 3:         d[2] = s[2];    /* FALLTHROUGH */
+               case 2:         d[1] = s[1];    /* FALLTHROUGH */
+               case 1:         d[0] = s[0];    /* FALLTHROUGH */
                case 0:         /* do nothing */;
                }
        } else {
@@ -369,21 +369,21 @@ static unsigned char *mbkwd(register unsigned char *d, register const unsigned c
                d -= sz;
                s -= sz;
                switch (sz) {
-               case 15:        d[14] = s[14];
-               case 14:        d[13] = s[13];
-               case 13:        d[12] = s[12];
-               case 12:        d[11] = s[11];
-               case 11:        d[10] = s[10];
-               case 10:        d[9] = s[9];
-               case 9:         d[8] = s[8];
-               case 8:         d[7] = s[7];
-               case 7:         d[6] = s[6];
-               case 6:         d[5] = s[5];
-               case 5:         d[4] = s[4];
-               case 4:         d[3] = s[3];
-               case 3:         d[2] = s[2];
-               case 2:         d[1] = s[1];
-               case 1:         d[0] = s[0];
+               case 15:        d[14] = s[14];  /* FALLTHROUGH */
+               case 14:        d[13] = s[13];  /* FALLTHROUGH */
+               case 13:        d[12] = s[12];  /* FALLTHROUGH */
+               case 12:        d[11] = s[11];  /* FALLTHROUGH */
+               case 11:        d[10] = s[10];  /* FALLTHROUGH */
+               case 10:        d[9] = s[9];    /* FALLTHROUGH */
+               case 9:         d[8] = s[8];    /* FALLTHROUGH */
+               case 8:         d[7] = s[7];    /* FALLTHROUGH */
+               case 7:         d[6] = s[6];    /* FALLTHROUGH */
+               case 6:         d[5] = s[5];    /* FALLTHROUGH */
+               case 5:         d[4] = s[4];    /* FALLTHROUGH */
+               case 4:         d[3] = s[3];    /* FALLTHROUGH */
+               case 3:         d[2] = s[2];    /* FALLTHROUGH */
+               case 2:         d[1] = s[1];    /* FALLTHROUGH */
+               case 1:         d[0] = s[0];    /* FALLTHROUGH */
                case 0:         /* do nothing */;
                }
        }
@@ -414,23 +414,23 @@ static unsigned char *mfwrd(register unsigned char *d, register const unsigned c
                        d -= z;
                        switch (SIZEOF_INT - z) {
 #if SIZEOF_INT == 8
-                       case 7:         d[1] = s[1];
-                       case 6:         d[2] = s[2];
-                       case 5:         d[3] = s[3];
-                       case 4:         d[4] = s[4];
-                       case 3:         d[5] = s[5];
-                       case 2:         d[6] = s[6];
-                       case 1:         d[7] = s[7];
+                       case 7:         d[1] = s[1];    /* FALLTHROUGH */
+                       case 6:         d[2] = s[2];    /* FALLTHROUGH */
+                       case 5:         d[3] = s[3];    /* FALLTHROUGH */
+                       case 4:         d[4] = s[4];    /* FALLTHROUGH */
+                       case 3:         d[5] = s[5];    /* FALLTHROUGH */
+                       case 2:         d[6] = s[6];    /* FALLTHROUGH */
+                       case 1:         d[7] = s[7];    /* FALLTHROUGH */
                        case 0:         /* do nothing */;
 #else
 #if SIZEOF_INT == 4
-                       case 3:         d[1] = s[1];
-                       case 2:         d[2] = s[2];
-                       case 1:         d[3] = s[3];
+                       case 3:         d[1] = s[1];    /* FALLTHROUGH */
+                       case 2:         d[2] = s[2];    /* FALLTHROUGH */
+                       case 1:         d[3] = s[3];    /* FALLTHROUGH */
                        case 0:         /* do nothing */;
 #else
 #if SIZEOF_INT == 2
-                       case 1:         d[1] = s[1];
+                       case 1:         d[1] = s[1];    /* FALLTHROUGH */
                        case 0:         /* do nothing */;
 #endif
 #endif
@@ -445,23 +445,23 @@ static unsigned char *mfwrd(register unsigned char *d, register const unsigned c
                d += sz - (SIZEOF_INT - 1);
                switch (sz & (SIZEOF_INT - 1)) {
 #if SIZEOF_INT == 8
-               case 7:         d[0] = s[0];
-               case 6:         d[1] = s[1];
-               case 5:         d[2] = s[2];
-               case 4:         d[3] = s[3];
-               case 3:         d[4] = s[4];
-               case 2:         d[5] = s[5];
-               case 1:         d[6] = s[6];
+               case 7:         d[0] = s[0];    /* FALLTHROUGH */
+               case 6:         d[1] = s[1];    /* FALLTHROUGH */
+               case 5:         d[2] = s[2];    /* FALLTHROUGH */
+               case 4:         d[3] = s[3];    /* FALLTHROUGH */
+               case 3:         d[4] = s[4];    /* FALLTHROUGH */
+               case 2:         d[5] = s[5];    /* FALLTHROUGH */
+               case 1:         d[6] = s[6];    /* FALLTHROUGH */
                case 0:         /* do nothing */;
 #else
 #if SIZEOF_INT == 4
-               case 3:         d[0] = s[0];
-               case 2:         d[1] = s[1];
-               case 1:         d[2] = s[2];
+               case 3:         d[0] = s[0];    /* FALLTHROUGH */
+               case 2:         d[1] = s[1];    /* FALLTHROUGH */
+               case 1:         d[2] = s[2];    /* FALLTHROUGH */
                case 0:         /* do nothing */;
 #else
 #if SIZEOF_INT == 2
-               case 1:         d[0] = s[0];
+               case 1:         d[0] = s[0];    /* FALLTHROUGH */
                case 0:         /* do nothing */;
 #endif
 #endif
@@ -492,21 +492,21 @@ static unsigned char *mfwrd(register unsigned char *d, register const unsigned c
                s -= 15 - sz;
                d -= 15 - sz;
                switch (sz) {
-               case 15:        d[0] = s[0];
-               case 14:        d[1] = s[1];
-               case 13:        d[2] = s[2];
-               case 12:        d[3] = s[3];
-               case 11:        d[4] = s[4];
-               case 10:        d[5] = s[5];
-               case 9:         d[6] = s[6];
-               case 8:         d[7] = s[7];
-               case 7:         d[8] = s[8];
-               case 6:         d[9] = s[9];
-               case 5:         d[10] = s[10];
-               case 4:         d[11] = s[11];
-               case 3:         d[12] = s[12];
-               case 2:         d[13] = s[13];
-               case 1:         d[14] = s[14];
+               case 15:        d[0] = s[0];    /* FALLTHROUGH */
+               case 14:        d[1] = s[1];    /* FALLTHROUGH */
+               case 13:        d[2] = s[2];    /* FALLTHROUGH */
+               case 12:        d[3] = s[3];    /* FALLTHROUGH */
+               case 11:        d[4] = s[4];    /* FALLTHROUGH */
+               case 10:        d[5] = s[5];    /* FALLTHROUGH */
+               case 9:         d[6] = s[6];    /* FALLTHROUGH */
+               case 8:         d[7] = s[7];    /* FALLTHROUGH */
+               case 7:         d[8] = s[8];    /* FALLTHROUGH */
+               case 6:         d[9] = s[9];    /* FALLTHROUGH */
+               case 5:         d[10] = s[10];  /* FALLTHROUGH */
+               case 4:         d[11] = s[11];  /* FALLTHROUGH */
+               case 3:         d[12] = s[12];  /* FALLTHROUGH */
+               case 2:         d[13] = s[13];  /* FALLTHROUGH */
+               case 1:         d[14] = s[14];  /* FALLTHROUGH */
                case 0:         /* do nothing */;
                }
        }
@@ -549,21 +549,21 @@ int mcnt(register unsigned char *blk, register unsigned char c, int size)
                size -= 16;
        }
        switch (size) {
-       case 15:        if (blk[14] == c) ++nlines;
-       case 14:        if (blk[13] == c) ++nlines;
-       case 13:        if (blk[12] == c) ++nlines;
-       case 12:        if (blk[11] == c) ++nlines;
-       case 11:        if (blk[10] == c) ++nlines;
-       case 10:        if (blk[9] == c) ++nlines;
-       case 9:         if (blk[8] == c) ++nlines;
-       case 8:         if (blk[7] == c) ++nlines;
-       case 7:         if (blk[6] == c) ++nlines;
-       case 6:         if (blk[5] == c) ++nlines;
-       case 5:         if (blk[4] == c) ++nlines;
-       case 4:         if (blk[3] == c) ++nlines;
-       case 3:         if (blk[2] == c) ++nlines;
-       case 2:         if (blk[1] == c) ++nlines;
-       case 1:         if (blk[0] == c) ++nlines;
+       case 15:        if (blk[14] == c) ++nlines;     /* FALLTHROUGH */
+       case 14:        if (blk[13] == c) ++nlines;     /* FALLTHROUGH */
+       case 13:        if (blk[12] == c) ++nlines;     /* FALLTHROUGH */
+       case 12:        if (blk[11] == c) ++nlines;     /* FALLTHROUGH */
+       case 11:        if (blk[10] == c) ++nlines;     /* FALLTHROUGH */
+       case 10:        if (blk[9] == c) ++nlines;      /* FALLTHROUGH */
+       case 9:         if (blk[8] == c) ++nlines;      /* FALLTHROUGH */
+       case 8:         if (blk[7] == c) ++nlines;      /* FALLTHROUGH */
+       case 7:         if (blk[6] == c) ++nlines;      /* FALLTHROUGH */
+       case 6:         if (blk[5] == c) ++nlines;      /* FALLTHROUGH */
+       case 5:         if (blk[4] == c) ++nlines;      /* FALLTHROUGH */
+       case 4:         if (blk[3] == c) ++nlines;      /* FALLTHROUGH */
+       case 3:         if (blk[2] == c) ++nlines;      /* FALLTHROUGH */
+       case 2:         if (blk[1] == c) ++nlines;      /* FALLTHROUGH */
+       case 1:         if (blk[0] == c) ++nlines;      /* FALLTHROUGH */
        case 0:         /* do nothing */;
        }
        return nlines;
index bc3a8eb..ecd907c 100644 (file)
@@ -83,13 +83,13 @@ const unsigned char * const builtins[] = {
                "\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 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^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; Run a ctags search                ^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"
@@ -101,7 +101,7 @@ const unsigned char * const builtins[] = {
                "\\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\\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"
@@ -119,13 +119,13 @@ const unsigned char * const builtins[] = {
                "\n"
                "{Search\n"
                "\\i   Help Screen    turn off with ^J     prev. screen ^[,    next screen ^[.     \\i\n"
-               "\\i \\i\\u\\bSpecial search sequences\\b\\u                                                     \\i \\i\n"
+               "\\i \\i\\u\\bSpecial search sequences:\\b\\u                                                    \\i \\i\n"
                "\\i \\i    \\\\^  \\\\$  matches beg./end of line       \\\\?     match any single char      \\i \\i\n"
                "\\i \\i    \\\\<  \\\\>  matches beg./end of word       \\\\*     match 0 or more chars      \\i \\i\n"
                "\\i \\i    \\\\c     matches balanced C expression   \\\\\\\\     matches a \\\\                \\i \\i\n"
                "\\i \\i    \\\\[..]  matches one of a set            \\\\n     matches a newline          \\i \\i\n"
                "\\i \\i    \\\\+     matches 0 or more of the character which follows the \\\\+           \\i \\i\n"
-               "\\i \\i\\u\\bSpecial replace sequences\\b\\u                                                    \\i \\i\n"
+               "\\i \\i\\u\\bSpecial replace sequences:\\b\\u                                                   \\i \\i\n"
                "\\i \\i    \\\\&     replaced with text which matched search string                    \\i \\i\n"
                "\\i \\i    \\\\0 - 9 replaced with text which matched \\bN\\bth \\\\*, \\\\?, \\\\c, \\\\+, or \\\\[..]     \\i \\i\n"
                "\\i \\i    \\\\\\\\     replaced with \\\\                 \\\\n     replaced with newline      \\i \\i\n"
@@ -140,6 +140,7 @@ const unsigned char * const builtins[] = {
                "\\i \\i      -                        Read/Write to/from standard I/O               \\i \\i\n"
                "\\i \\i      filename,START,SIZE      Read/Write a part of a file/device            \\i \\i\n"
                "\\i \\i          Give START/SIZE in decimal (255), octal (0377) or hex (0xFF)       \\i \\i\n"
+               "\\i \\i \\u\\bPresentation mode:\\b\\u F6=fullscreen; F7=previous, F8=next win; F9=filter/again \\i \\i\n"
                "}\n"
                "\n"
                "{Joe\n"
@@ -148,7 +149,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 2017-01-11; 3.1; autoCR-LF; UTF-8 via locale; per-file encoding \\i \\i\n"
+               "\\i \\i @(#) blt_in 2017-08-08; 3.1; autoCR-LF; UTF-8 via locale; per-file encoding \\i \\i\n"
                "}\n"
                "\n"
                "{CharTable\n"
@@ -182,6 +183,7 @@ const unsigned char * const builtins[] = {
                "explode                ^K I\n"
                "explode                ^K ^I\n"
                "explode                ^K i\n"
+               "explode                ^[ [ 1 7 ~\n"
                "help           ^J\n"
                "help           ^[ [ 1 1 ~\n"
                "hnext          ^[ .\n"
@@ -197,10 +199,12 @@ const unsigned char * const builtins[] = {
                "nextw          ^K N\n"
                "nextw          ^K ^N\n"
                "nextw          ^K n\n"
+               "nextw          ^[ [ 1 9 ~\n"
                "play           ^[ 0 TO 9\n"
                "prevw          ^K P\n"
                "prevw          ^K ^P\n"
                "prevw          ^K p\n"
+               "prevw          ^[ [ 1 8 ~\n"
                "query          ^[ ?\n"
                "quote          `\n"
                "quote8         ^P\n"
@@ -342,6 +346,7 @@ const unsigned char * const builtins[] = {
                "ffirst         ^Q f\n"
                "ffirst         ^[ q f\n"
                "filt           ^K /\n"
+               "nmark,filt,uparw       ^[ [ 2 0 ~\n"
                "fmtblk         ^K D\n"
                "fmtblk         ^K ^D\n"
                "fmtblk         ^K d\n"
@@ -545,5 +550,5 @@ const unsigned char * const builtins[] = {
                ":querysr\n"
                "type           ^@ TO \xFF\n"
 ,      NULL
-,      "@(#) $MirOS: contrib/code/jupp/builtins.c,v 1.24 2017/01/11 22:23:45 tg Exp $"
+,      "@(#) $MirOS: contrib/code/jupp/builtins.c,v 1.25 2017/08/09 02:47:30 tg Exp $"
 };
diff --git a/bw.c b/bw.c
index 7ab3499..cf29675 100644 (file)
--- a/bw.c
+++ b/bw.c
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/bw.c,v 1.21 2016/10/08 19:28:53 tg Exp $ */
+/* $MirOS: contrib/code/jupp/bw.c,v 1.22 2017/07/09 01:15:51 tg Exp $ */
 /*
  *     Edit buffer window generation
  *     Copyright
@@ -444,7 +444,7 @@ static int lgen(SCRN *t, int y, int *screen, int *attr, int x, int w, P *p, long
                                                wid = 1;
                                }
 
-                               if(wid>0) {
+                               if (wid >= 0) {
                                        col += wid;
                                        if (col == scr) {
                                                --amnt;
diff --git a/cmd.c b/cmd.c
index 2e5ed6c..8989fd2 100644 (file)
--- a/cmd.c
+++ b/cmd.c
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/cmd.c,v 1.15 2016/10/08 14:58:45 tg Exp $ */
+/* $MirOS: contrib/code/jupp/cmd.c,v 1.17 2017/08/08 21:39:28 tg Exp $ */
 /*
  *     Command execution
  *     Copyright
@@ -93,11 +93,11 @@ static int unop(void)
 }
 
 CMD cmds[] = {
+       {US "abendjoe", TYPETW + TYPEPW + TYPEMENU + TYPEQW, uabendjoe, NULL, 0, NULL},
        {US "abort", TYPETW + TYPEPW + TYPEMENU + TYPEQW, uabort, NULL, 0, NULL},
        {US "abortbuf", TYPETW, uabortbuf, NULL, 0, NULL},
        {US "arg", TYPETW + TYPEPW + TYPEMENU + TYPEQW, uarg, NULL, 0, NULL},
        {US "ask", TYPETW + TYPEPW, uask, NULL, 0, NULL},
-       {US "uarg", TYPETW + TYPEPW + TYPEMENU + TYPEQW, uuarg, NULL, 0, NULL},
        {US "backs", TYPETW + TYPEPW + ECHKXCOL + EFIXXCOL + EMINOR + EKILL + EMOD, ubacks, NULL, 1, US "delch"},
        {US "backsmenu", TYPEMENU, umbacks, NULL, 1, NULL},
        {US "backw", TYPETW + TYPEPW + ECHKXCOL + EFIXXCOL + EKILL + EMOD, ubackw, NULL, 1, US "delw"},
@@ -120,12 +120,12 @@ CMD cmds[] = {
        {US "byte", TYPETW + TYPEPW, ubyte, NULL, 0, NULL},
        {US "cancel", TYPETW + TYPEPW + TYPEMENU + TYPEQW, ucancel, NULL, 0, NULL},
        {US "center", TYPETW + TYPEPW + EFIXXCOL + EMOD, ucenter, NULL, 1, NULL},
-       {US "ctrl", TYPETW + TYPEPW + EMOD, uctrl, NULL, 0, NULL},
        {US "col", TYPETW + TYPEPW, ucol, NULL, 0, NULL},
        {US "complete", TYPEPW + EMINOR + EMOD, ucmplt, NULL, 0, NULL},
        {US "copy", TYPETW + TYPEPW, ucopy, NULL, 0, NULL},
        {US "crawll", TYPETW + TYPEPW, ucrawll, NULL, 1, US "crawlr"},
        {US "crawlr", TYPETW + TYPEPW, ucrawlr, NULL, 1, US "crawll"},
+       {US "ctrl", TYPETW + TYPEPW + EMOD, uctrl, NULL, 0, NULL},
        {US "delbol", TYPETW + TYPEPW + EFIXXCOL + EKILL + EMOD, udelbl, NULL, 1, US "deleol"},
        {US "delch", TYPETW + TYPEPW + ECHKXCOL + EFIXXCOL + EMINOR + EKILL + EMOD, udelch, NULL, 1, US "backs"},
        {US "deleol", TYPETW + TYPEPW + EKILL + EMOD, udelel, NULL, 1, US "delbol"},
@@ -148,23 +148,23 @@ CMD cmds[] = {
        {US "ffirst", TYPETW + TYPEPW, pffirst, NULL, 0, NULL},
        {US "filt", TYPETW + TYPEPW + EMOD + EBLOCK, ufilt, NULL, 0, NULL},
        {US "finish", TYPETW + TYPEPW + EMOD, ufinish, NULL, 1, NULL},
+       {US "fmtblk", TYPETW + EMOD + EFIXXCOL + EBLOCK, ufmtblk, NULL, 1, NULL},
        {US "fnext", TYPETW + TYPEPW, pfnext, NULL, 1, NULL},
        {US "format", TYPETW + TYPEPW + EFIXXCOL + EMOD, uformat, NULL, 1, NULL},
-       {US "fmtblk", TYPETW + EMOD + EFIXXCOL + EBLOCK, ufmtblk, NULL, 1, NULL},
        {US "fwrdc", TYPETW + TYPEPW, ufwrdc, NULL, 1, US "bkwdc"},
        {US "gomark", TYPETW + TYPEPW + EMOVE, ugomark, NULL, 0, NULL},
        {US "groww", TYPETW, ugroww, NULL, 1, US "shrinkw"},
-       {US "isrch", TYPETW + TYPEPW, uisrch, NULL, 0, NULL},
-       {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 "home", TYPETW + TYPEPW + EFIXXCOL, uhome, 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 "isrch", TYPETW + TYPEPW, uisrch, NULL, 0, NULL},
        {US "keymap", TYPETW + TYPEPW, ukeymap, NULL, 0, NULL},
+       {US "killjoe", TYPETW + TYPEPW + TYPEMENU + TYPEQW, ukilljoe, NULL, 0, NULL},
+       {US "killproc", TYPETW + TYPEPW, ukillpid, 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},
@@ -199,12 +199,12 @@ CMD cmds[] = {
        {US "pgupmenu", TYPEMENU, umpgup, NULL, 1, US "pgdnmenu"},
        {US "picokill", TYPETW + TYPEPW + EFIXXCOL + EKILL + EMOD, upicokill, NULL, 1, NULL},
        {US "play", TYPETW + TYPEPW + TYPEMENU + TYPEQW, uplay, NULL, 1, NULL}, /* EFIXX? */
+       {US "pop", TYPETW + TYPEPW + TYPEMENU + TYPEQW, upop, NULL, 0, NULL},
        {US "prevpos", TYPETW + TYPEPW + EPOS + EMID + EFIXXCOL, uprevpos, NULL, 1, US "nextpos"},
        {US "prevw", TYPETW + TYPEPW + TYPEMENU + TYPEQW, uprevw, NULL, 1, US "nextw"},
        {US "prevword", TYPETW + TYPEPW + EFIXXCOL + ECHKXCOL, u_goto_prev, NULL, 1, US "nextword"},
        {US "prverr", TYPETW, uprverr, NULL, 1, US "nxterr"},
        {US "psh", TYPETW + TYPEPW + TYPEMENU + TYPEQW, upsh, NULL, 0, NULL},
-       {US "pop", TYPETW + TYPEPW + TYPEMENU + TYPEQW, upop, NULL, 0, NULL},
        {US "qrepl", TYPETW + TYPEPW + EMOD, pqrepl, NULL, 0, NULL},
        {US "query", TYPETW + TYPEPW + TYPEMENU + TYPEQW, uquery, NULL, 0, NULL},
        {US "querysave", TYPETW, uquerysave, NULL, 0, NULL},
@@ -215,11 +215,11 @@ CMD cmds[] = {
        {US "retype", TYPETW + TYPEPW + TYPEMENU + TYPEQW, uretyp, NULL, 0, NULL},
        {US "rfirst", TYPETW + TYPEPW, prfirst, NULL, 0, NULL},
        {US "rindent", TYPETW + TYPEPW + EFIXXCOL + EMOD + EBLOCK, urindent, NULL, 1, US "lindent"},
-       {US "run", TYPETW + TYPEPW, urun, NULL, 0, NULL},
        {US "rsrch", TYPETW + TYPEPW, ursrch, NULL, 0, NULL},
        {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 "run", TYPETW + TYPEPW, urun, NULL, 0, NULL},
        {US "rvmatch", TYPETW + TYPEPW + EFIXXCOL, urvmatch, NULL, 0, NULL},
        {US "save", TYPETW, usave, NULL, 0, NULL},
        {US "scratch", TYPETW + TYPEPW, uscratch, NULL, 0, NULL},
@@ -244,14 +244,15 @@ CMD cmds[] = {
        {US "tw1", TYPETW + TYPEPW + TYPEQW + TYPEMENU, utw1, NULL, 0, NULL},
        {US "txt", TYPETW + TYPEPW, utxt, NULL, 0, NULL},
        {US "type", TYPETW + TYPEPW + TYPEQW + TYPEMENU + EMINOR + EMOD, utype, NULL, 1, US "backs"},
+       {US "uarg", TYPETW + TYPEPW + TYPEMENU + TYPEQW, uuarg, NULL, 0, NULL},
        {US "undo", TYPETW + TYPEPW + EFIXXCOL, uundo, NULL, 1, US "redo"},
        {US "uparw", TYPETW + TYPEPW + EMOVE, uuparw, NULL, 1, US "dnarw"},
        {US "uparwmenu", TYPEMENU, umuparw, NULL, 1, US "dnarwmenu"},
        {US "upper", TYPETW + TYPEPW + EMOD + EBLOCK, uupper, NULL, 0, NULL},
        {US "upslide", TYPETW + TYPEPW + TYPEMENU + TYPEQW + EMOVE, uupslide, NULL, 1, US "dnslide"},
        {US "yank", TYPETW + TYPEPW + EFIXXCOL + EMOD, uyank, NULL, 1, NULL},
-       {US "yapp", TYPETW + TYPEPW + EKILL, uyapp, NULL, 0, NULL},
-       {US "yankpop", TYPETW + TYPEPW + EFIXXCOL + EMOD, uyankpop, NULL, 1, NULL}
+       {US "yankpop", TYPETW + TYPEPW + EFIXXCOL + EMOD, uyankpop, NULL, 1, NULL},
+       {US "yapp", TYPETW + TYPEPW + EKILL, uyapp, NULL, 0, NULL}
 };
 
 /* Execute a command n with key k */
index 9e09506..696164e 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.1jupp30.
+# Generated by GNU Autoconf 2.61-MirPorts-2 for joe 3.1jupp31.
 #
 # 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.1jupp30'
-PACKAGE_STRING='joe 3.1jupp30'
+PACKAGE_VERSION='3.1jupp31'
+PACKAGE_STRING='joe 3.1jupp31'
 PACKAGE_BUGREPORT=''
 
 ac_unique_file="b.c"
@@ -1231,7 +1231,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.1jupp30 to adapt to many kinds of systems.
+\`configure' configures joe 3.1jupp31 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1302,7 +1302,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of joe 3.1jupp30:";;
+     short | recursive ) echo "Configuration of joe 3.1jupp31:";;
    esac
   cat <<\_ACEOF
 
@@ -1395,8 +1395,8 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-joe configure 3.1jupp30
-generated by GNU Autoconf 2.61-MirPorts-1
+joe configure 3.1jupp31
+generated by GNU Autoconf 2.61-MirPorts-2
 
 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
@@ -1409,8 +1409,8 @@ 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.1jupp30, which was
-generated by GNU Autoconf 2.61-MirPorts-1.  Invocation command line was
+It was created by joe $as_me 3.1jupp31, which was
+generated by GNU Autoconf 2.61-MirPorts-2.  Invocation command line was
 
   $ $0 $@
 
@@ -2210,7 +2210,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='joe'
- VERSION='3.1jupp30'
+ VERSION='3.1jupp31'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -9914,7 +9914,8 @@ done
 
 
 
-for ac_func in setitimer sigaction sigvec siginterrupt sigprocmask
+
+for ac_func in setitimer sigaction sigvec siginterrupt sigprocmask isatty
 do
 as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
 { echo "$as_me:$LINENO: checking for $ac_func" >&5
@@ -10977,8 +10978,8 @@ 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.1jupp30, which was
-generated by GNU Autoconf 2.61-MirPorts-1.  Invocation command line was
+This file was extended by joe $as_me 3.1jupp31, which was
+generated by GNU Autoconf 2.61-MirPorts-2.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
   CONFIG_HEADERS  = $CONFIG_HEADERS
@@ -11030,8 +11031,8 @@ Report bugs to <bug-autoconf@gnu.org>."
 _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF
 ac_cs_version="\\
-joe config.status 3.1jupp30
-configured by $0, generated by GNU Autoconf 2.61-MirPorts-1,
+joe config.status 3.1jupp31
+configured by $0, generated by GNU Autoconf 2.61-MirPorts-2,
   with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
 
 Copyright (C) 2006 Free Software Foundation, Inc.
index eba0ae9..56dda7a 100644 (file)
@@ -1,4 +1,4 @@
-# $MirOS: contrib/code/jupp/configure.ac,v 1.54 2017/01/11 22:09:19 tg Exp $
+# $MirOS: contrib/code/jupp/configure.ac,v 1.56 2017/08/09 01:00:22 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.1jupp30)
+AC_INIT(joe, 3.1jupp31)
 #### But see main.c for the Copyright (c) owner and year! ####
 AC_CONFIG_SRCDIR([b.c])
 
@@ -205,7 +205,7 @@ if test x"$ac_cv_func_isblank" = xyes; then
        joe_ISBLANK
 fi
 AC_CHECK_FUNCS([alarm mkdir mkstemp putenv setlocale strchr strdup utime setpgid])
-AC_CHECK_FUNCS([setitimer sigaction sigvec siginterrupt sigprocmask])
+AC_CHECK_FUNCS([setitimer sigaction sigvec siginterrupt sigprocmask isatty])
 AC_CHECK_FUNCS([strlcpy strlcat nl_langinfo get_current_dir_name ctime popen])
 
 AC_CHECK_DECLS([strlcpy, strlcat, popen])
diff --git a/i18n.c b/i18n.c
index 2eb5d28..10b486e 100644 (file)
--- a/i18n.c
+++ b/i18n.c
@@ -1,12 +1,13 @@
 #if 0
 .if "0" == "1"
 #endif
-/* $MirOS: contrib/code/jupp/i18n.c,v 1.16 2017/01/11 00:34:03 tg Exp $ */
+/* $MirOS: contrib/code/jupp/i18n.c,v 1.23 2017/08/07 21:38:49 tg Exp $ */
 /*
  *     UNICODE/ISO-10646 functions for JOE
  *     Copyright
  *             (C) 1992 Joseph H. Allen
- *     Copyright © 2014 Thorsten Glaser
+ *     Copyright © 2014, 2017
+ *             mirabilos <m@mirbsd.org>
  *
  *     This file is part of JOE (Joe's Own Editor)
  *
@@ -25,7 +26,7 @@
 #include "utf8.h"
 #include "i18n.h"
 
-/* From: X11/xc/programs/xterm/wcwidth.c,v 1.9 */
+/* From: X11/xc/programs/xterm/wcwidth.c,v 1.10 */
 
 struct mb_ucsrange {
        unsigned int beg;
@@ -36,8 +37,8 @@ static size_t mb_ucsbsearch(const struct mb_ucsrange arr[], size_t elems,
     unsigned int val);
 
 /*
- * Generated from the Unicode Character Database, Version 9.0.0, by
- * MirOS: contrib/code/Snippets/eawparse,v 1.3 2014/11/16 12:16:24 tg Exp $
+ * Generated from the Unicode Character Database, Version 10.0.0, by
+ * MirOS: contrib/code/Snippets/eawparse,v 1.10 2017/07/12 22:47:26 tg Exp $
  */
 
 static const struct mb_ucsrange mb_ucs_combining[] = {
@@ -93,6 +94,7 @@ static const struct mb_ucsrange mb_ucs_combining[] = {
        { 0x0AC7, 0x0AC8 },
        { 0x0ACD, 0x0ACD },
        { 0x0AE2, 0x0AE3 },
+       { 0x0AFA, 0x0AFF },
        { 0x0B01, 0x0B01 },
        { 0x0B3C, 0x0B3C },
        { 0x0B3F, 0x0B3F },
@@ -115,7 +117,8 @@ static const struct mb_ucsrange mb_ucs_combining[] = {
        { 0x0CC6, 0x0CC6 },
        { 0x0CCC, 0x0CCD },
        { 0x0CE2, 0x0CE3 },
-       { 0x0D01, 0x0D01 },
+       { 0x0D00, 0x0D01 },
+       { 0x0D3B, 0x0D3C },
        { 0x0D41, 0x0D44 },
        { 0x0D4D, 0x0D4D },
        { 0x0D62, 0x0D63 },
@@ -200,7 +203,7 @@ static const struct mb_ucsrange mb_ucs_combining[] = {
        { 0x1CED, 0x1CED },
        { 0x1CF4, 0x1CF4 },
        { 0x1CF8, 0x1CF9 },
-       { 0x1DC0, 0x1DF5 },
+       { 0x1DC0, 0x1DF9 },
        { 0x1DFB, 0x1DFF },
        { 0x200B, 0x200F },
        { 0x202A, 0x202E },
@@ -304,6 +307,15 @@ static const struct mb_ucsrange mb_ucs_combining[] = {
        { 0x1171D, 0x1171F },
        { 0x11722, 0x11725 },
        { 0x11727, 0x1172B },
+       { 0x11A01, 0x11A06 },
+       { 0x11A09, 0x11A0A },
+       { 0x11A33, 0x11A38 },
+       { 0x11A3B, 0x11A3E },
+       { 0x11A47, 0x11A47 },
+       { 0x11A51, 0x11A56 },
+       { 0x11A59, 0x11A5B },
+       { 0x11A8A, 0x11A96 },
+       { 0x11A98, 0x11A99 },
        { 0x11C30, 0x11C36 },
        { 0x11C38, 0x11C3D },
        { 0x11C3F, 0x11C3F },
@@ -311,6 +323,11 @@ static const struct mb_ucsrange mb_ucs_combining[] = {
        { 0x11CAA, 0x11CB0 },
        { 0x11CB2, 0x11CB3 },
        { 0x11CB5, 0x11CB6 },
+       { 0x11D31, 0x11D36 },
+       { 0x11D3A, 0x11D3A },
+       { 0x11D3C, 0x11D3D },
+       { 0x11D3F, 0x11D45 },
+       { 0x11D47, 0x11D47 },
        { 0x16AF0, 0x16AF4 },
        { 0x16B30, 0x16B36 },
        { 0x16F8F, 0x16F92 },
@@ -375,19 +392,22 @@ static const struct mb_ucsrange mb_ucs_fullwidth[] = {
        { 0x2B1B, 0x2B1C },
        { 0x2B50, 0x2B50 },
        { 0x2B55, 0x2B55 },
-       { 0x2E80, 0x303E },
-       { 0x3040, 0xA4CF },
+       { 0x2E80, 0x3029 },
+       { 0x302E, 0x303E },
+       { 0x3040, 0x3098 },
+       { 0x309B, 0xA4CF },
        { 0xA960, 0xA97F },
        { 0xAC00, 0xD7A3 },
        { 0xF900, 0xFAFF },
        { 0xFE10, 0xFE19 },
        { 0xFE30, 0xFE6F },
-       { 0xFF00, 0xFF60 },
+       { 0xFF01, 0xFF60 },
        { 0xFFE0, 0xFFE6 },
-       { 0x16FE0, 0x16FE0 },
+       { 0x16FE0, 0x16FE1 },
        { 0x17000, 0x187EC },
        { 0x18800, 0x18AF2 },
-       { 0x1B000, 0x1B001 },
+       { 0x1B000, 0x1B11E },
+       { 0x1B170, 0x1B2FB },
        { 0x1F004, 0x1F004 },
        { 0x1F0CF, 0x1F0CF },
        { 0x1F18E, 0x1F18E },
@@ -396,6 +416,7 @@ static const struct mb_ucsrange mb_ucs_fullwidth[] = {
        { 0x1F210, 0x1F23B },
        { 0x1F240, 0x1F248 },
        { 0x1F250, 0x1F251 },
+       { 0x1F260, 0x1F265 },
        { 0x1F300, 0x1F320 },
        { 0x1F32D, 0x1F335 },
        { 0x1F337, 0x1F37C },
@@ -418,15 +439,13 @@ static const struct mb_ucsrange mb_ucs_fullwidth[] = {
        { 0x1F6CC, 0x1F6CC },
        { 0x1F6D0, 0x1F6D2 },
        { 0x1F6EB, 0x1F6EC },
-       { 0x1F6F4, 0x1F6F6 },
-       { 0x1F910, 0x1F91E },
-       { 0x1F920, 0x1F927 },
-       { 0x1F930, 0x1F930 },
-       { 0x1F933, 0x1F93E },
-       { 0x1F940, 0x1F94B },
-       { 0x1F950, 0x1F95E },
-       { 0x1F980, 0x1F991 },
+       { 0x1F6F4, 0x1F6F8 },
+       { 0x1F910, 0x1F93E },
+       { 0x1F940, 0x1F94C },
+       { 0x1F950, 0x1F96B },
+       { 0x1F980, 0x1F997 },
        { 0x1F9C0, 0x1F9C0 },
+       { 0x1F9D0, 0x1F9E6 },
        { 0x20000, 0x2FFFD },
        { 0x30000, 0x3FFFD }
 };
@@ -458,16 +477,36 @@ mb_ucsbsearch(const struct mb_ucsrange arr[], size_t elems, unsigned int val)
 
 /*XXX possibly more */
 static const struct mb_ucsrange joe_ctrlchars[] = {
+       { 0x0080, 0x009F },
        { 0x200B, 0x200F },
        { 0x2028, 0x202E },
        { 0x2060, 0x2063 },
        { 0x2066, 0x206F },
+       { 0xD800, 0xDFFF },
        { 0xFDD0, 0xFDEF },
        { 0xFEFF, 0xFEFF },
-       { 0xFFF9, 0xFFFB },
-       { 0xFFFE, 0xFFFF }
+       { 0xFFF9, 0xFFFB }
 };
 
+/* returns column width of control character, 0 for regular */
+unsigned char unictrlbuf[11];
+int unictrl(unsigned int ucs)
+{
+       *unictrlbuf = 0;
+
+       /* ASCII control characters use one screen column */
+       if (ucs < 32 || ucs == 0x7F)
+               return (1);
+
+       /* not a control or noncharacter? */
+       if (mb_ucsbsearch(joe_ctrlchars, NELEM(joe_ctrlchars),
+           ucs) == (size_t)-1 && (ucs & 0xFFFE) != 0xFFFE && ucs <= 0x10FFFF)
+               return (0);
+
+       return (joe_snprintf_1((char *)unictrlbuf, sizeof(unictrlbuf),
+           "<%X>", ucs));
+}
+
 int joe_wcwidth(int wide, unsigned int ucs)
 {
 #ifndef TEST
@@ -502,8 +541,9 @@ int joe_wcwidth(int wide, unsigned int ucs)
 
 /* MAKE_ISW functions... */
 
-/* From: contrib/hosted/tg/jupptables,v 1.1 2013/11/30 23:58:29 tg Exp $ */
+/* From: contrib/hosted/tg/jupptables,v 1.4 2017/07/08 14:53:45 tg Exp $ */
 
+#ifdef TEST_I18N
 static const struct mb_ucsrange data_wctype_upper[] = {
        { 0x0041, 0x005A },
        { 0x00C0, 0x00D6 },
@@ -1710,8 +1750,8 @@ static const struct mb_ucsrange data_wctype_lower[] = {
 };
 
 MAKE_ISW(lower)
+#endif
 
-/* plus U+005F (UNDERSCORE) */
 static const struct mb_ucsrange data_wctype_alpha[] = {
        { 0x0041, 0x005A },
        { 0x005F, 0x005F },
@@ -1763,6 +1803,7 @@ static const struct mb_ucsrange data_wctype_alpha[] = {
        { 0x0824, 0x0824 },
        { 0x0828, 0x0828 },
        { 0x0840, 0x0858 },
+       { 0x0860, 0x086A },
        { 0x08A0, 0x08B4 },
        { 0x08B6, 0x08BD },
        { 0x0904, 0x0939 },
@@ -1781,6 +1822,7 @@ static const struct mb_ucsrange data_wctype_alpha[] = {
        { 0x09DC, 0x09DD },
        { 0x09DF, 0x09E1 },
        { 0x09F0, 0x09F1 },
+       { 0x09FC, 0x09FC },
        { 0x0A05, 0x0A0A },
        { 0x0A0F, 0x0A10 },
        { 0x0A13, 0x0A28 },
@@ -2013,12 +2055,12 @@ static const struct mb_ucsrange data_wctype_alpha[] = {
        { 0x309D, 0x309F },
        { 0x30A1, 0x30FA },
        { 0x30FC, 0x30FF },
-       { 0x3105, 0x312D },
+       { 0x3105, 0x312E },
        { 0x3131, 0x318E },
        { 0x31A0, 0x31BA },
        { 0x31F0, 0x31FF },
        { 0x3400, 0x4DB5 },
-       { 0x4E00, 0x9FD5 },
+       { 0x4E00, 0x9FEA },
        { 0xA000, 0xA48C },
        { 0xA4D0, 0xA4FD },
        { 0xA500, 0xA60C },
@@ -2108,7 +2150,7 @@ static const struct mb_ucsrange data_wctype_alpha[] = {
        { 0x10280, 0x1029C },
        { 0x102A0, 0x102D0 },
        { 0x10300, 0x1031F },
-       { 0x10330, 0x10340 },
+       { 0x1032D, 0x10340 },
        { 0x10342, 0x10349 },
        { 0x10350, 0x10375 },
        { 0x10380, 0x1039D },
@@ -2191,11 +2233,21 @@ static const struct mb_ucsrange data_wctype_alpha[] = {
        { 0x11700, 0x11719 },
        { 0x118A0, 0x118DF },
        { 0x118FF, 0x118FF },
+       { 0x11A00, 0x11A00 },
+       { 0x11A0B, 0x11A32 },
+       { 0x11A3A, 0x11A3A },
+       { 0x11A50, 0x11A50 },
+       { 0x11A5C, 0x11A83 },
+       { 0x11A86, 0x11A89 },
        { 0x11AC0, 0x11AF8 },
        { 0x11C00, 0x11C08 },
        { 0x11C0A, 0x11C2E },
        { 0x11C40, 0x11C40 },
        { 0x11C72, 0x11C8F },
+       { 0x11D00, 0x11D06 },
+       { 0x11D08, 0x11D09 },
+       { 0x11D0B, 0x11D30 },
+       { 0x11D46, 0x11D46 },
        { 0x12000, 0x12399 },
        { 0x12480, 0x12543 },
        { 0x13000, 0x1342E },
@@ -2210,10 +2262,11 @@ static const struct mb_ucsrange data_wctype_alpha[] = {
        { 0x16F00, 0x16F44 },
        { 0x16F50, 0x16F50 },
        { 0x16F93, 0x16F9F },
-       { 0x16FE0, 0x16FE0 },
+       { 0x16FE0, 0x16FE1 },
        { 0x17000, 0x187EC },
        { 0x18800, 0x18AF2 },
-       { 0x1B000, 0x1B001 },
+       { 0x1B000, 0x1B11E },
+       { 0x1B170, 0x1B2FB },
        { 0x1BC00, 0x1BC6A },
        { 0x1BC70, 0x1BC7C },
        { 0x1BC80, 0x1BC88 },
@@ -2287,6 +2340,7 @@ static const struct mb_ucsrange data_wctype_alpha[] = {
        { 0x2A700, 0x2B734 },
        { 0x2B740, 0x2B81D },
        { 0x2B820, 0x2CEA1 },
+       { 0x2CEB0, 0x2EBE0 },
        { 0x2F800, 0x2FA1D }
 };
 
@@ -2302,12 +2356,6 @@ int joe_iswdigit(struct charmap *foo, int c)
        return ((c >= 0x30 && c <= 0x39) ? 1 : 0);
 }
 
-/*
- * plus ;WS;
- *  except U+2007 (<noBreak> FIGURE SPACE)
- * plus U+200B (ZERO WIDTH SPACE)
- * plus U+2029 (PARAGRAPH SEPARATOR)
- */
 static const struct mb_ucsrange data_wctype_space[] = {
        { 0x0009, 0x000D },
        { 0x0020, 0x0020 },
@@ -2321,10 +2369,7 @@ static const struct mb_ucsrange data_wctype_space[] = {
 
 MAKE_ISW(space)
 
-/*
- * plus U+2028 (LINE SEPARATOR)
- * plus U+2029 (PARAGRAPH SEPARATOR)
- */
+#ifdef TEST_I18N
 static const struct mb_ucsrange data_wctype_cntrl[] = {
        { 0x0000, 0x001F },
        { 0x007F, 0x009F },
@@ -2332,6 +2377,7 @@ static const struct mb_ucsrange data_wctype_cntrl[] = {
 };
 
 MAKE_ISW(cntrl)
+#endif
 
 static const struct mb_ucsrange data_wctype_punct[] = {
        { 0x0021, 0x002F },
@@ -2399,6 +2445,7 @@ static const struct mb_ucsrange data_wctype_punct[] = {
        { 0x09E2, 0x09E3 },
        { 0x09E6, 0x09EF },
        { 0x09F2, 0x09FB },
+       { 0x09FD, 0x09FD },
        { 0x0A01, 0x0A03 },
        { 0x0A3C, 0x0A3C },
        { 0x0A3E, 0x0A42 },
@@ -2414,6 +2461,7 @@ static const struct mb_ucsrange data_wctype_punct[] = {
        { 0x0ACB, 0x0ACD },
        { 0x0AE2, 0x0AE3 },
        { 0x0AE6, 0x0AF1 },
+       { 0x0AFA, 0x0AFF },
        { 0x0B01, 0x0B03 },
        { 0x0B3C, 0x0B3C },
        { 0x0B3E, 0x0B44 },
@@ -2445,7 +2493,8 @@ static const struct mb_ucsrange data_wctype_punct[] = {
        { 0x0CD5, 0x0CD6 },
        { 0x0CE2, 0x0CE3 },
        { 0x0CE6, 0x0CEF },
-       { 0x0D01, 0x0D03 },
+       { 0x0D00, 0x0D03 },
+       { 0x0D3B, 0x0D3C },
        { 0x0D3E, 0x0D44 },
        { 0x0D46, 0x0D48 },
        { 0x0D4A, 0x0D4D },
@@ -2536,8 +2585,8 @@ static const struct mb_ucsrange data_wctype_punct[] = {
        { 0x1CD0, 0x1CE8 },
        { 0x1CED, 0x1CED },
        { 0x1CF2, 0x1CF4 },
-       { 0x1CF8, 0x1CF9 },
-       { 0x1DC0, 0x1DF5 },
+       { 0x1CF7, 0x1CF9 },
+       { 0x1DC0, 0x1DF9 },
        { 0x1DFB, 0x1DFF },
        { 0x1FBD, 0x1FBD },
        { 0x1FBF, 0x1FC1 },
@@ -2549,7 +2598,7 @@ static const struct mb_ucsrange data_wctype_punct[] = {
        { 0x2066, 0x2070 },
        { 0x2074, 0x207E },
        { 0x2080, 0x208E },
-       { 0x20A0, 0x20BE },
+       { 0x20A0, 0x20BF },
        { 0x20D0, 0x20F0 },
        { 0x2100, 0x2101 },
        { 0x2103, 0x2106 },
@@ -2567,15 +2616,14 @@ static const struct mb_ucsrange data_wctype_punct[] = {
        { 0x214F, 0x215F },
        { 0x2180, 0x2182 },
        { 0x2185, 0x218B },
-       { 0x2190, 0x23FE },
-       { 0x2400, 0x2426 },
+       { 0x2190, 0x2426 },
        { 0x2440, 0x244A },
        { 0x2460, 0x24B5 },
        { 0x24EA, 0x2B73 },
        { 0x2B76, 0x2B95 },
        { 0x2B98, 0x2BB9 },
        { 0x2BBD, 0x2BC8 },
-       { 0x2BCA, 0x2BD1 },
+       { 0x2BCA, 0x2BD2 },
        { 0x2BEC, 0x2BEF },
        { 0x2CE5, 0x2CEA },
        { 0x2CEF, 0x2CF1 },
@@ -2583,7 +2631,7 @@ static const struct mb_ucsrange data_wctype_punct[] = {
        { 0x2D70, 0x2D70 },
        { 0x2D7F, 0x2D7F },
        { 0x2DE0, 0x2E2E },
-       { 0x2E30, 0x2E44 },
+       { 0x2E30, 0x2E49 },
        { 0x2E80, 0x2E99 },
        { 0x2E9B, 0x2EF3 },
        { 0x2F00, 0x2FD5 },
@@ -2759,6 +2807,12 @@ static const struct mb_ucsrange data_wctype_punct[] = {
        { 0x1171D, 0x1172B },
        { 0x11730, 0x1173F },
        { 0x118E0, 0x118F2 },
+       { 0x11A01, 0x11A0A },
+       { 0x11A33, 0x11A39 },
+       { 0x11A3B, 0x11A47 },
+       { 0x11A51, 0x11A5B },
+       { 0x11A8A, 0x11A9C },
+       { 0x11A9E, 0x11AA2 },
        { 0x11C2F, 0x11C36 },
        { 0x11C38, 0x11C3F },
        { 0x11C41, 0x11C45 },
@@ -2766,6 +2820,12 @@ static const struct mb_ucsrange data_wctype_punct[] = {
        { 0x11C70, 0x11C71 },
        { 0x11C92, 0x11CA7 },
        { 0x11CA9, 0x11CB6 },
+       { 0x11D31, 0x11D36 },
+       { 0x11D3A, 0x11D3A },
+       { 0x11D3C, 0x11D3D },
+       { 0x11D3F, 0x11D45 },
+       { 0x11D47, 0x11D47 },
+       { 0x11D50, 0x11D59 },
        { 0x12400, 0x1246E },
        { 0x12470, 0x12474 },
        { 0x16A60, 0x16A69 },
@@ -2821,9 +2881,10 @@ static const struct mb_ucsrange data_wctype_punct[] = {
        { 0x1F210, 0x1F23B },
        { 0x1F240, 0x1F248 },
        { 0x1F250, 0x1F251 },
-       { 0x1F300, 0x1F6D2 },
+       { 0x1F260, 0x1F265 },
+       { 0x1F300, 0x1F6D4 },
        { 0x1F6E0, 0x1F6EC },
-       { 0x1F6F0, 0x1F6F6 },
+       { 0x1F6F0, 0x1F6F8 },
        { 0x1F700, 0x1F773 },
        { 0x1F780, 0x1F7D4 },
        { 0x1F800, 0x1F80B },
@@ -2831,14 +2892,13 @@ static const struct mb_ucsrange data_wctype_punct[] = {
        { 0x1F850, 0x1F859 },
        { 0x1F860, 0x1F887 },
        { 0x1F890, 0x1F8AD },
-       { 0x1F910, 0x1F91E },
-       { 0x1F920, 0x1F927 },
-       { 0x1F930, 0x1F930 },
-       { 0x1F933, 0x1F93E },
-       { 0x1F940, 0x1F94B },
-       { 0x1F950, 0x1F95E },
-       { 0x1F980, 0x1F991 },
+       { 0x1F900, 0x1F90B },
+       { 0x1F910, 0x1F93E },
+       { 0x1F940, 0x1F94C },
+       { 0x1F950, 0x1F96B },
+       { 0x1F980, 0x1F997 },
        { 0x1F9C0, 0x1F9C0 },
+       { 0x1F9D0, 0x1F9E6 },
        { 0xE0001, 0xE0001 },
        { 0xE0020, 0xE007F },
        { 0xE0100, 0xE01EF },
@@ -2848,6 +2908,7 @@ static const struct mb_ucsrange data_wctype_punct[] = {
 
 MAKE_ISW(punct)
 
+#ifdef TEST_I18N
 static const struct mb_ucsrange data_wctype_graph[] = {
        { 0x0021, 0x007E },
        { 0x00A0, 0x0377 },
@@ -2873,6 +2934,7 @@ static const struct mb_ucsrange data_wctype_graph[] = {
        { 0x0830, 0x083E },
        { 0x0840, 0x085B },
        { 0x085E, 0x085E },
+       { 0x0860, 0x086A },
        { 0x08A0, 0x08B4 },
        { 0x08B6, 0x08BD },
        { 0x08D4, 0x0983 },
@@ -2888,7 +2950,7 @@ static const struct mb_ucsrange data_wctype_graph[] = {
        { 0x09D7, 0x09D7 },
        { 0x09DC, 0x09DD },
        { 0x09DF, 0x09E3 },
-       { 0x09E6, 0x09FB },
+       { 0x09E6, 0x09FD },
        { 0x0A01, 0x0A03 },
        { 0x0A05, 0x0A0A },
        { 0x0A0F, 0x0A10 },
@@ -2918,7 +2980,7 @@ static const struct mb_ucsrange data_wctype_graph[] = {
        { 0x0AD0, 0x0AD0 },
        { 0x0AE0, 0x0AE3 },
        { 0x0AE6, 0x0AF1 },
-       { 0x0AF9, 0x0AF9 },
+       { 0x0AF9, 0x0AFF },
        { 0x0B01, 0x0B03 },
        { 0x0B05, 0x0B0C },
        { 0x0B0F, 0x0B10 },
@@ -2975,11 +3037,10 @@ static const struct mb_ucsrange data_wctype_graph[] = {
        { 0x0CE0, 0x0CE3 },
        { 0x0CE6, 0x0CEF },
        { 0x0CF1, 0x0CF2 },
-       { 0x0D01, 0x0D03 },
+       { 0x0D00, 0x0D03 },
        { 0x0D05, 0x0D0C },
        { 0x0D0E, 0x0D10 },
-       { 0x0D12, 0x0D3A },
-       { 0x0D3D, 0x0D44 },
+       { 0x0D12, 0x0D44 },
        { 0x0D46, 0x0D48 },
        { 0x0D4A, 0x0D4F },
        { 0x0D54, 0x0D63 },
@@ -3085,9 +3146,8 @@ static const struct mb_ucsrange data_wctype_graph[] = {
        { 0x1C3B, 0x1C49 },
        { 0x1C4D, 0x1C88 },
        { 0x1CC0, 0x1CC7 },
-       { 0x1CD0, 0x1CF6 },
-       { 0x1CF8, 0x1CF9 },
-       { 0x1D00, 0x1DF5 },
+       { 0x1CD0, 0x1CF9 },
+       { 0x1D00, 0x1DF9 },
        { 0x1DFB, 0x1F15 },
        { 0x1F18, 0x1F1D },
        { 0x1F20, 0x1F45 },
@@ -3108,17 +3168,16 @@ static const struct mb_ucsrange data_wctype_graph[] = {
        { 0x2066, 0x2071 },
        { 0x2074, 0x208E },
        { 0x2090, 0x209C },
-       { 0x20A0, 0x20BE },
+       { 0x20A0, 0x20BF },
        { 0x20D0, 0x20F0 },
        { 0x2100, 0x218B },
-       { 0x2190, 0x23FE },
-       { 0x2400, 0x2426 },
+       { 0x2190, 0x2426 },
        { 0x2440, 0x244A },
        { 0x2460, 0x2B73 },
        { 0x2B76, 0x2B95 },
        { 0x2B98, 0x2BB9 },
        { 0x2BBD, 0x2BC8 },
-       { 0x2BCA, 0x2BD1 },
+       { 0x2BCA, 0x2BD2 },
        { 0x2BEC, 0x2BEF },
        { 0x2C00, 0x2C2E },
        { 0x2C30, 0x2C5E },
@@ -3137,7 +3196,7 @@ static const struct mb_ucsrange data_wctype_graph[] = {
        { 0x2DC8, 0x2DCE },
        { 0x2DD0, 0x2DD6 },
        { 0x2DD8, 0x2DDE },
-       { 0x2DE0, 0x2E44 },
+       { 0x2DE0, 0x2E49 },
        { 0x2E80, 0x2E99 },
        { 0x2E9B, 0x2EF3 },
        { 0x2F00, 0x2FD5 },
@@ -3145,14 +3204,14 @@ static const struct mb_ucsrange data_wctype_graph[] = {
        { 0x3000, 0x303F },
        { 0x3041, 0x3096 },
        { 0x3099, 0x30FF },
-       { 0x3105, 0x312D },
+       { 0x3105, 0x312E },
        { 0x3131, 0x318E },
        { 0x3190, 0x31BA },
        { 0x31C0, 0x31E3 },
        { 0x31F0, 0x321E },
        { 0x3220, 0x32FE },
        { 0x3300, 0x4DB5 },
-       { 0x4DC0, 0x9FD5 },
+       { 0x4DC0, 0x9FEA },
        { 0xA000, 0xA48C },
        { 0xA490, 0xA4C6 },
        { 0xA4D0, 0xA62B },
@@ -3232,7 +3291,7 @@ static const struct mb_ucsrange data_wctype_graph[] = {
        { 0x102A0, 0x102D0 },
        { 0x102E0, 0x102FB },
        { 0x10300, 0x10323 },
-       { 0x10330, 0x1034A },
+       { 0x1032D, 0x1034A },
        { 0x10350, 0x1037A },
        { 0x10380, 0x1039D },
        { 0x1039F, 0x103C3 },
@@ -3336,6 +3395,10 @@ static const struct mb_ucsrange data_wctype_graph[] = {
        { 0x11730, 0x1173F },
        { 0x118A0, 0x118F2 },
        { 0x118FF, 0x118FF },
+       { 0x11A00, 0x11A47 },
+       { 0x11A50, 0x11A83 },
+       { 0x11A86, 0x11A9C },
+       { 0x11A9E, 0x11AA2 },
        { 0x11AC0, 0x11AF8 },
        { 0x11C00, 0x11C08 },
        { 0x11C0A, 0x11C36 },
@@ -3344,6 +3407,13 @@ static const struct mb_ucsrange data_wctype_graph[] = {
        { 0x11C70, 0x11C8F },
        { 0x11C92, 0x11CA7 },
        { 0x11CA9, 0x11CB6 },
+       { 0x11D00, 0x11D06 },
+       { 0x11D08, 0x11D09 },
+       { 0x11D0B, 0x11D36 },
+       { 0x11D3A, 0x11D3A },
+       { 0x11D3C, 0x11D3D },
+       { 0x11D3F, 0x11D47 },
+       { 0x11D50, 0x11D59 },
        { 0x12000, 0x12399 },
        { 0x12400, 0x1246E },
        { 0x12470, 0x12474 },
@@ -3364,10 +3434,11 @@ static const struct mb_ucsrange data_wctype_graph[] = {
        { 0x16F00, 0x16F44 },
        { 0x16F50, 0x16F7E },
        { 0x16F8F, 0x16F9F },
-       { 0x16FE0, 0x16FE0 },
+       { 0x16FE0, 0x16FE1 },
        { 0x17000, 0x187EC },
        { 0x18800, 0x18AF2 },
-       { 0x1B000, 0x1B001 },
+       { 0x1B000, 0x1B11E },
+       { 0x1B170, 0x1B2FB },
        { 0x1BC00, 0x1BC6A },
        { 0x1BC70, 0x1BC7C },
        { 0x1BC80, 0x1BC88 },
@@ -3460,9 +3531,10 @@ static const struct mb_ucsrange data_wctype_graph[] = {
        { 0x1F210, 0x1F23B },
        { 0x1F240, 0x1F248 },
        { 0x1F250, 0x1F251 },
-       { 0x1F300, 0x1F6D2 },
+       { 0x1F260, 0x1F265 },
+       { 0x1F300, 0x1F6D4 },
        { 0x1F6E0, 0x1F6EC },
-       { 0x1F6F0, 0x1F6F6 },
+       { 0x1F6F0, 0x1F6F8 },
        { 0x1F700, 0x1F773 },
        { 0x1F780, 0x1F7D4 },
        { 0x1F800, 0x1F80B },
@@ -3470,18 +3542,18 @@ static const struct mb_ucsrange data_wctype_graph[] = {
        { 0x1F850, 0x1F859 },
        { 0x1F860, 0x1F887 },
        { 0x1F890, 0x1F8AD },
-       { 0x1F910, 0x1F91E },
-       { 0x1F920, 0x1F927 },
-       { 0x1F930, 0x1F930 },
-       { 0x1F933, 0x1F93E },
-       { 0x1F940, 0x1F94B },
-       { 0x1F950, 0x1F95E },
-       { 0x1F980, 0x1F991 },
+       { 0x1F900, 0x1F90B },
+       { 0x1F910, 0x1F93E },
+       { 0x1F940, 0x1F94C },
+       { 0x1F950, 0x1F96B },
+       { 0x1F980, 0x1F997 },
        { 0x1F9C0, 0x1F9C0 },
+       { 0x1F9D0, 0x1F9E6 },
        { 0x20000, 0x2A6D6 },
        { 0x2A700, 0x2B734 },
        { 0x2B740, 0x2B81D },
        { 0x2B820, 0x2CEA1 },
+       { 0x2CEB0, 0x2EBE0 },
        { 0x2F800, 0x2FA1D },
        { 0xE0001, 0xE0001 },
        { 0xE0020, 0xE007F },
@@ -3491,6 +3563,7 @@ static const struct mb_ucsrange data_wctype_graph[] = {
 };
 
 MAKE_ISW(graph)
+#endif
 
 static const struct mb_ucsrange data_wctype_print[] = {
        { 0x0020, 0x007E },
@@ -3517,6 +3590,7 @@ static const struct mb_ucsrange data_wctype_print[] = {
        { 0x0830, 0x083E },
        { 0x0840, 0x085B },
        { 0x085E, 0x085E },
+       { 0x0860, 0x086A },
        { 0x08A0, 0x08B4 },
        { 0x08B6, 0x08BD },
        { 0x08D4, 0x0983 },
@@ -3532,7 +3606,7 @@ static const struct mb_ucsrange data_wctype_print[] = {
        { 0x09D7, 0x09D7 },
        { 0x09DC, 0x09DD },
        { 0x09DF, 0x09E3 },
-       { 0x09E6, 0x09FB },
+       { 0x09E6, 0x09FD },
        { 0x0A01, 0x0A03 },
        { 0x0A05, 0x0A0A },
        { 0x0A0F, 0x0A10 },
@@ -3562,7 +3636,7 @@ static const struct mb_ucsrange data_wctype_print[] = {
        { 0x0AD0, 0x0AD0 },
        { 0x0AE0, 0x0AE3 },
        { 0x0AE6, 0x0AF1 },
-       { 0x0AF9, 0x0AF9 },
+       { 0x0AF9, 0x0AFF },
        { 0x0B01, 0x0B03 },
        { 0x0B05, 0x0B0C },
        { 0x0B0F, 0x0B10 },
@@ -3619,11 +3693,10 @@ static const struct mb_ucsrange data_wctype_print[] = {
        { 0x0CE0, 0x0CE3 },
        { 0x0CE6, 0x0CEF },
        { 0x0CF1, 0x0CF2 },
-       { 0x0D01, 0x0D03 },
+       { 0x0D00, 0x0D03 },
        { 0x0D05, 0x0D0C },
        { 0x0D0E, 0x0D10 },
-       { 0x0D12, 0x0D3A },
-       { 0x0D3D, 0x0D44 },
+       { 0x0D12, 0x0D44 },
        { 0x0D46, 0x0D48 },
        { 0x0D4A, 0x0D4F },
        { 0x0D54, 0x0D63 },
@@ -3729,9 +3802,8 @@ static const struct mb_ucsrange data_wctype_print[] = {
        { 0x1C3B, 0x1C49 },
        { 0x1C4D, 0x1C88 },
        { 0x1CC0, 0x1CC7 },
-       { 0x1CD0, 0x1CF6 },
-       { 0x1CF8, 0x1CF9 },
-       { 0x1D00, 0x1DF5 },
+       { 0x1CD0, 0x1CF9 },
+       { 0x1D00, 0x1DF9 },
        { 0x1DFB, 0x1F15 },
        { 0x1F18, 0x1F1D },
        { 0x1F20, 0x1F45 },
@@ -3758,17 +3830,16 @@ static const struct mb_ucsrange data_wctype_print[] = {
        { 0x2066, 0x2071 },
        { 0x2074, 0x208E },
        { 0x2090, 0x209C },
-       { 0x20A0, 0x20BE },
+       { 0x20A0, 0x20BF },
        { 0x20D0, 0x20F0 },
        { 0x2100, 0x218B },
-       { 0x2190, 0x23FE },
-       { 0x2400, 0x2426 },
+       { 0x2190, 0x2426 },
        { 0x2440, 0x244A },
        { 0x2460, 0x2B73 },
        { 0x2B76, 0x2B95 },
        { 0x2B98, 0x2BB9 },
        { 0x2BBD, 0x2BC8 },
-       { 0x2BCA, 0x2BD1 },
+       { 0x2BCA, 0x2BD2 },
        { 0x2BEC, 0x2BEF },
        { 0x2C00, 0x2C2E },
        { 0x2C30, 0x2C5E },
@@ -3787,7 +3858,7 @@ static const struct mb_ucsrange data_wctype_print[] = {
        { 0x2DC8, 0x2DCE },
        { 0x2DD0, 0x2DD6 },
        { 0x2DD8, 0x2DDE },
-       { 0x2DE0, 0x2E44 },
+       { 0x2DE0, 0x2E49 },
        { 0x2E80, 0x2E99 },
        { 0x2E9B, 0x2EF3 },
        { 0x2F00, 0x2FD5 },
@@ -3795,14 +3866,14 @@ static const struct mb_ucsrange data_wctype_print[] = {
        { 0x3000, 0x303F },
        { 0x3041, 0x3096 },
        { 0x3099, 0x30FF },
-       { 0x3105, 0x312D },
+       { 0x3105, 0x312E },
        { 0x3131, 0x318E },
        { 0x3190, 0x31BA },
        { 0x31C0, 0x31E3 },
        { 0x31F0, 0x321E },
        { 0x3220, 0x32FE },
        { 0x3300, 0x4DB5 },
-       { 0x4DC0, 0x9FD5 },
+       { 0x4DC0, 0x9FEA },
        { 0xA000, 0xA48C },
        { 0xA490, 0xA4C6 },
        { 0xA4D0, 0xA62B },
@@ -3882,7 +3953,7 @@ static const struct mb_ucsrange data_wctype_print[] = {
        { 0x102A0, 0x102D0 },
        { 0x102E0, 0x102FB },
        { 0x10300, 0x10323 },
-       { 0x10330, 0x1034A },
+       { 0x1032D, 0x1034A },
        { 0x10350, 0x1037A },
        { 0x10380, 0x1039D },
        { 0x1039F, 0x103C3 },
@@ -3986,6 +4057,10 @@ static const struct mb_ucsrange data_wctype_print[] = {
        { 0x11730, 0x1173F },
        { 0x118A0, 0x118F2 },
        { 0x118FF, 0x118FF },
+       { 0x11A00, 0x11A47 },
+       { 0x11A50, 0x11A83 },
+       { 0x11A86, 0x11A9C },
+       { 0x11A9E, 0x11AA2 },
        { 0x11AC0, 0x11AF8 },
        { 0x11C00, 0x11C08 },
        { 0x11C0A, 0x11C36 },
@@ -3994,6 +4069,13 @@ static const struct mb_ucsrange data_wctype_print[] = {
        { 0x11C70, 0x11C8F },
        { 0x11C92, 0x11CA7 },
        { 0x11CA9, 0x11CB6 },
+       { 0x11D00, 0x11D06 },
+       { 0x11D08, 0x11D09 },
+       { 0x11D0B, 0x11D36 },
+       { 0x11D3A, 0x11D3A },
+       { 0x11D3C, 0x11D3D },
+       { 0x11D3F, 0x11D47 },
+       { 0x11D50, 0x11D59 },
        { 0x12000, 0x12399 },
        { 0x12400, 0x1246E },
        { 0x12470, 0x12474 },
@@ -4014,10 +4096,11 @@ static const struct mb_ucsrange data_wctype_print[] = {
        { 0x16F00, 0x16F44 },
        { 0x16F50, 0x16F7E },
        { 0x16F8F, 0x16F9F },
-       { 0x16FE0, 0x16FE0 },
+       { 0x16FE0, 0x16FE1 },
        { 0x17000, 0x187EC },
        { 0x18800, 0x18AF2 },
-       { 0x1B000, 0x1B001 },
+       { 0x1B000, 0x1B11E },
+       { 0x1B170, 0x1B2FB },
        { 0x1BC00, 0x1BC6A },
        { 0x1BC70, 0x1BC7C },
        { 0x1BC80, 0x1BC88 },
@@ -4110,9 +4193,10 @@ static const struct mb_ucsrange data_wctype_print[] = {
        { 0x1F210, 0x1F23B },
        { 0x1F240, 0x1F248 },
        { 0x1F250, 0x1F251 },
-       { 0x1F300, 0x1F6D2 },
+       { 0x1F260, 0x1F265 },
+       { 0x1F300, 0x1F6D4 },
        { 0x1F6E0, 0x1F6EC },
-       { 0x1F6F0, 0x1F6F6 },
+       { 0x1F6F0, 0x1F6F8 },
        { 0x1F700, 0x1F773 },
        { 0x1F780, 0x1F7D4 },
        { 0x1F800, 0x1F80B },
@@ -4120,18 +4204,18 @@ static const struct mb_ucsrange data_wctype_print[] = {
        { 0x1F850, 0x1F859 },
        { 0x1F860, 0x1F887 },
        { 0x1F890, 0x1F8AD },
-       { 0x1F910, 0x1F91E },
-       { 0x1F920, 0x1F927 },
-       { 0x1F930, 0x1F930 },
-       { 0x1F933, 0x1F93E },
-       { 0x1F940, 0x1F94B },
-       { 0x1F950, 0x1F95E },
-       { 0x1F980, 0x1F991 },
+       { 0x1F900, 0x1F90B },
+       { 0x1F910, 0x1F93E },
+       { 0x1F940, 0x1F94C },
+       { 0x1F950, 0x1F96B },
+       { 0x1F980, 0x1F997 },
        { 0x1F9C0, 0x1F9C0 },
+       { 0x1F9D0, 0x1F9E6 },
        { 0x20000, 0x2A6D6 },
        { 0x2A700, 0x2B734 },
        { 0x2B740, 0x2B81D },
        { 0x2B820, 0x2CEA1 },
+       { 0x2CEB0, 0x2EBE0 },
        { 0x2F800, 0x2FA1D },
        { 0xE0001, 0xE0001 },
        { 0xE0020, 0xE007F },
@@ -4142,6 +4226,7 @@ static const struct mb_ucsrange data_wctype_print[] = {
 
 MAKE_ISW(print)
 
+#ifdef TEST_I18N
 static const struct mb_ucsrange data_wctype_xdigit[] = {
        { 0x0030, 0x0039 },
        { 0x0041, 0x0046 },
@@ -4150,13 +4235,6 @@ static const struct mb_ucsrange data_wctype_xdigit[] = {
 
 MAKE_ISW(xdigit)
 
-/*
- * plus ;Zs;
- *  except U+00A0 (<noBreak> NON-BREAKING SPACE)
- *  except U+2007 (<noBreak> FIGURE SPACE)
- *  except U+202F (<noBreak> NARROW NO-BREAK SPACE)
- * plus U+200B (ZERO WIDTH SPACE)
- */
 static const struct mb_ucsrange data_wctype_blank[] = {
        { 0x0009, 0x0009 },
        { 0x0020, 0x0020 },
@@ -4168,6 +4246,7 @@ static const struct mb_ucsrange data_wctype_blank[] = {
 };
 
 MAKE_ISW(blank)
+#endif
 
 /* Conversion functions */
 
@@ -6848,27 +6927,6 @@ main(int argc,char *argv[])
 }
 #endif
 
-/* Return true if c is a control character which should not be displayed */
-int unictrl(unsigned int ucs)
-{
-       /* C0 Control characters are one column wide in JOE */
-       if (ucs < 32 || ucs == 0x7F)
-               return (1);
-
-       /* C1 control characters... */
-       if (ucs >= 0x80 && ucs < 0xA0)
-               return (4);
-
-       /* More control characters... */
-       if (mb_ucsbsearch(joe_ctrlchars, NELEM(joe_ctrlchars), ucs) != (size_t)-1)
-               return (6);
-
-       if ((ucs & 0xFFFE) == 0xFFFE)
-               return (ucs > 0xFFFFF ? 8 : 7);
-
-       return (0);
-}
-
 #if 0
 .endif
 
diff --git a/i18n.h b/i18n.h
index 20f2eb9..96c39a2 100644 (file)
--- a/i18n.h
+++ b/i18n.h
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/i18n.h,v 1.6 2014/07/25 21:41:49 tg Exp $ */
+/* $MirOS: contrib/code/jupp/i18n.h,v 1.8 2017/07/08 16:23:26 tg Exp $ */
 
 #ifndef _Ii18n
 #define _Ii18n 1
@@ -6,8 +6,10 @@
 #include "config.h"
 #include "types.h"
 
+#ifdef TEST_I18N
 int joe_iswupper PARAMS((struct charmap *,int c));
 int joe_iswlower PARAMS((struct charmap *,int c));
+#endif
 
 /* the following two include _ */
 int joe_iswalpha PARAMS((struct charmap *,int c));
@@ -15,12 +17,18 @@ int joe_iswalnum PARAMS((struct charmap *,int c));
 
 int joe_iswdigit PARAMS((struct charmap *,int c));
 int joe_iswspace PARAMS((struct charmap *,int c));
+#ifdef TEST_I18N
 int joe_iswcntrl PARAMS((struct charmap *,int c));
+#endif
 int joe_iswpunct PARAMS((struct charmap *,int c));
+#ifdef TEST_I18N
 int joe_iswgraph PARAMS((struct charmap *,int c));
+#endif
 int joe_iswprint PARAMS((struct charmap *,int c));
+#ifdef TEST_I18N
 int joe_iswxdigit PARAMS((struct charmap *,int c));
 int joe_iswblank PARAMS((struct charmap *,int c));
+#endif
 
 int joe_wcwidth PARAMS((int wide, unsigned int c));
 /* Looking for wswidth? Take a look at scrn.c/txtwidth() */
@@ -28,6 +36,7 @@ int joe_wcwidth PARAMS((int wide, unsigned int c));
 int joe_towupper PARAMS((struct charmap *,int c));
 int joe_towlower PARAMS((struct charmap *,int c));
 
+extern unsigned char unictrlbuf[11];
 int unictrl PARAMS((unsigned int c));
 
 #endif
index cfdf394..a0c995a 100644 (file)
--- a/joe.1.in
+++ b/joe.1.in
@@ -1,4 +1,4 @@
-.\" $MirOS: contrib/code/jupp/joe.1.in,v 1.24 2017/01/11 22:04:32 tg Exp $
+.\" $MirOS: contrib/code/jupp/joe.1.in,v 1.25 2017/08/09 00:59:09 tg Exp $
 .\"-
 .TH JOE 1
 .SH Name
@@ -302,7 +302,7 @@ line.
 If you want to indent the text you enter, you can use the \fBTAB\fR key.
 This inserts a special control character which makes the characters which
 follow it begin at the next TAB STOP.  TAB STOPS normally occur every 8
-columns, but this can be changed with the \fB^T D\fR command.  PASCAL and C
+columns, but this can be changed with the \fB^T D\fR command.  Python
 programmers often set TAB STOPS on every 4 columns.
 
 If for some reason your terminal screen gets messed up (for example, if
diff --git a/joe.txt b/joe.txt
index 9f39fb5..428a51a 100644 (file)
--- a/joe.txt
+++ b/joe.txt
@@ -329,8 +329,8 @@ Editing Tasks
      TAB key. This inserts a special control character which\r
      makes the characters which follow it begin at the next TAB\r
      STOP.  TAB STOPS normally occur every 8 columns, but this\r
-     can be changed with the ^T D command.  PASCAL and C program-\r
-     mers often set TAB STOPS on every 4 columns.\r
+     can be changed with the ^T D command.  Python programmers\r
+     often set TAB STOPS on every 4 columns.\r
 \r
      If for some reason your terminal screen gets messed up (for\r
      example, if you receive a mail notice from biff), you can\r
diff --git a/jupprc b/jupprc
index 7886720..a2100bc 100644 (file)
--- a/jupprc
+++ b/jupprc
 
 {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 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^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; Run a ctags search                ^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
 }
 
 \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\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
 }
 
 
 {Search
 \i   Help Screen    turn off with ^J     prev. screen ^[,    next screen ^[.     \i
-\i \i\u\bSpecial search sequences\b\u                                                     \i \i
+\i \i\u\bSpecial search sequences:\b\u                                                    \i \i
 \i \i    \\^  \\$  matches beg./end of line       \\?     match any single char      \i \i
 \i \i    \\<  \\>  matches beg./end of word       \\*     match 0 or more chars      \i \i
 \i \i    \\c     matches balanced C expression   \\\\     matches a \\                \i \i
 \i \i    \\[..]  matches one of a set            \\n     matches a newline          \i \i
 \i \i    \\+     matches 0 or more of the character which follows the \\+           \i \i
-\i \i\u\bSpecial replace sequences\b\u                                                    \i \i
+\i \i\u\bSpecial replace sequences:\b\u                                                   \i \i
 \i \i    \\&     replaced with text which matched search string                    \i \i
 \i \i    \\0 - 9 replaced with text which matched \bN\bth \\*, \\?, \\c, \\+, or \\[..]     \i \i
 \i \i    \\\\     replaced with \\                 \\n     replaced with newline      \i \i
 \i \i      -                        Read/Write to/from standard I/O               \i \i
 \i \i      filename,START,SIZE      Read/Write a part of a file/device            \i \i
 \i \i          Give START/SIZE in decimal (255), octal (0377) or hex (0xFF)       \i \i
+\i \i \u\bPresentation mode:\b\u F6=fullscreen; F7=previous, F8=next win; F9=filter/again \i \i
 }
 
 {Joe
 \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 2017-01-11; 3.1; autoCR-LF; UTF-8 via locale; per-file encoding \i \i
+\i \i @(#) jupprc 2017-08-08; 3.1; autoCR-LF; UTF-8 via locale; per-file encoding \i \i
 }
 
  #HOOK#3103 additional help screens
@@ -531,6 +532,7 @@ arg         ^[ q q
 explode                ^K I
 explode                ^K ^I
 explode                ^K i
+explode                ^[ [ 1 7 ~
 help           ^J
 help           ^[ [ 1 1 ~
 hnext          ^[ .
@@ -546,10 +548,12 @@ msg               ^[ h
 nextw          ^K N
 nextw          ^K ^N
 nextw          ^K n
+nextw          ^[ [ 1 9 ~
 play           ^[ 0 TO 9
 prevw          ^K P
 prevw          ^K ^P
 prevw          ^K p
+prevw          ^[ [ 1 8 ~
 query          ^[ ?
 quote          `
 quote8         ^P
@@ -699,6 +703,7 @@ ffirst              ^Q ^F
 ffirst         ^Q f
 ffirst         ^[ q f
 filt           ^K /
+nmark,filt,uparw       ^[ [ 2 0 ~
 fmtblk         ^K D
 fmtblk         ^K ^D
 fmtblk         ^K d
diff --git a/macro.c b/macro.c
index b3d181b..d19c980 100644 (file)
--- a/macro.c
+++ b/macro.c
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/macro.c,v 1.7 2012/12/22 00:06:11 tg Exp $ */
+/* $MirOS: contrib/code/jupp/macro.c,v 1.8 2017/03/19 19:19:50 tg Exp $ */
 /*
  *     Keyboard macros
  *     Copyright
@@ -582,8 +582,8 @@ static int doarg(BW *bw, unsigned char *s, void *object, int *notify)
        if (notify)
                *notify = 1;
        num = calc(bw, s);
-       if (merr) {
-               msgnw(bw->parent, merr);
+       if (merrf) {
+               msgnw(bw->parent, merrt);
                return -1;
        }
        arg = num;
diff --git a/main.c b/main.c
index ae1914b..d195361 100644 (file)
--- a/main.c
+++ b/main.c
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/main.c,v 1.28 2017/01/11 21:48:58 tg Exp $ */
+/* $MirOS: contrib/code/jupp/main.c,v 1.31 2017/08/08 21:39:28 tg Exp $ */
 
 #define JUPP_IS_COPYRIGHT_C_BY "2017 mirabilos"
 
@@ -39,6 +39,7 @@
 #ifdef HAVE_STDLIB_H
 #include <stdlib.h>
 #endif
+#include <unistd.h>
 
 #include "b.h"
 #include "help.h"
@@ -185,7 +186,8 @@ int edloop(int flg)
 
 unsigned char **mainenv;
 
-int main(int argc, char **argv, char **envp)
+static int
+main_init(int argc, char **argv, char **envp, SCRN **np)
 {
        CAP *cap;
        unsigned char *s;
@@ -313,6 +315,11 @@ int main(int argc, char **argv, char **envp)
                }
        }
 
+#if HAVE_ISATTY
+       if (idleout && (!isatty(0) || !isatty(1)))
+               idleout = 0;
+#endif
+
        if (!(n = nopen(cap)))
                return 1;
        maint = screate(n);
@@ -411,10 +418,24 @@ int main(int argc, char **argv, char **envp)
                msgnw(((BASE *)lastw(maint)->object)->parent, msgbuf);
        }
 
+       *np = n;
+       return 0;
+}
+
+int main_rv;
+
+int
+main(int argc, char **argv, char **envp)
+{
+       SCRN *n;
+
+       if ((main_rv = main_init(argc, argv, envp, &n)))
+               return (main_rv);
+
        edloop(0);
        vclose(vmem);
        nclose(n);
        if (exmsg)
                fprintf(stderr, "\n%s\n", exmsg);
-       return 0;
+       return (main_rv);
 }
diff --git a/rc.c b/rc.c
index 3f38aba..7ba6ae1 100644 (file)
--- a/rc.c
+++ b/rc.c
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/rc.c,v 1.22 2017/01/11 22:04:32 tg Exp $ */
+/* $MirOS: contrib/code/jupp/rc.c,v 1.23 2017/03/19 19:19:50 tg Exp $ */
 /*
  *     *rc file parser
  *     Copyright
@@ -522,8 +522,8 @@ static int doopt1(BW *bw, unsigned char *s, int *xx, int *notify)
                        break;
                }
                v = calc(bw, s);
-               if (merr) {
-                       msgnw(bw->parent, merr);
+               if (merrf) {
+                       msgnw(bw->parent, merrt);
                        ret = -1;
                } else if (v >= glopts[x].low && v <= glopts[x].high)
                        *glopts[x].set = v;
@@ -542,8 +542,8 @@ static int doopt1(BW *bw, unsigned char *s, int *xx, int *notify)
                        break;
                }
                v = calc(bw, s);
-               if (merr) {
-                       msgnw(bw->parent, merr);
+               if (merrf) {
+                       msgnw(bw->parent, merrt);
                        ret = -1;
                } else if (v >= glopts[x].low && v <= glopts[x].high)
                        *(int *) ((unsigned char *) &bw->o + glopts[x].ofst) = v;
@@ -558,8 +558,8 @@ static int doopt1(BW *bw, unsigned char *s, int *xx, int *notify)
                        break;
                }
                v = calc(bw, s) - 1.0;
-               if (merr) {
-                       msgnw(bw->parent, merr);
+               if (merrf) {
+                       msgnw(bw->parent, merrt);
                        ret = -1;
                } else if (v >= glopts[x].low && v <= glopts[x].high)
                        *(int *) ((unsigned char *) &bw->o + glopts[x].ofst) = v;
diff --git a/scrn.c b/scrn.c
index 0c520c4..68c27c9 100644 (file)
--- a/scrn.c
+++ b/scrn.c
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/scrn.c,v 1.19 2017/01/10 23:59:33 tg Exp $ */
+/* $MirOS: contrib/code/jupp/scrn.c,v 1.26 2017/08/08 16:09:43 tg Exp $ */
 /*
  *     Device independant TTY interface for JOE
  *     Copyright
@@ -205,26 +205,23 @@ void outatr(struct charmap *map,SCRN *t,int *scrn,int *attrf,int xx,int yy,int c
                if(locale_map->type) {
                        /* UTF-8 char to UTF-8 terminal */
                        int wid;
-                       int uni_ctrl = 0;
-                       unsigned char buf[16];
 
-                       /* Deal with control characters */
-                       if (c<32) {
-                               c = c + '@';
-                               a ^= UNDERLINE;
-                       } else if (c==127) {
-                               c = '?';
-                               a ^= UNDERLINE;
-                       } else if (unictrl(c)) {
+                       switch ((wid = unictrl(c))) {
+                       case 0:
+                               /* not a control character */
+                               wid = joe_wcwidth(1, c);
+                               break;
+                       case 1:
+                               c ^= 0x40;
+                               /* FALLTHROUGH */
+                       default:
                                a ^= UNDERLINE;
-                               uni_ctrl = 1;
+                               break;
                        }
 
                        if(*scrn==c && *attrf==a)
                                return;
 
-                       wid = joe_wcwidth(1,c);
-
                        *scrn = c;
                        *attrf = a;
                        if(t->ins)
@@ -233,12 +230,15 @@ void outatr(struct charmap *map,SCRN *t,int *scrn,int *attrf,int xx,int yy,int c
                                cpos(t, xx, yy);
                        if(t->attrib != a)
                                set_attr(t, a);
-                       if (uni_ctrl) {
-                               joe_snprintf_1((char *)buf,16,"<%X>",c);
-                               ttputs(buf);
+                       if (*unictrlbuf) {
+                               ttputs(unictrlbuf);
                        } else {
+                               unsigned char buf[7];
+
                                utf8_encode(buf,c);
                                ttputs(buf);
+                               if (wid == 0 && xx > 0)
+                                       attrf[-1] |= HAS_COMBINING;
                        }
                        t->x+=wid;
                        while (wid>1) {
@@ -304,7 +304,7 @@ void outatr(struct charmap *map,SCRN *t,int *scrn,int *attrf,int xx,int yy,int c
                        t->x++;
                } else {
                        /* Non UTF-8 char to UTF-8 terminal */
-                       unsigned char buf[16];
+                       unsigned char buf[7];
                        int wid;
 
                        /* Deal with control characters */
@@ -1029,6 +1029,7 @@ static void cposs(register SCRN *t, register int x, register int y)
                texec(t->cap, t->ho, 1, 0, 0, 0, 0);
                t->x = 0;
                t->y = hy;
+               /* FALLTHROUGH */
  doch:
                /* FALLTHROUGH */
        case 4:
@@ -1048,6 +1049,7 @@ static void cposs(register SCRN *t, register int x, register int y)
        case 8:
                texec(t->cap, t->cr, 1, 0, 0, 0, 0);
                t->x = 0;
+               /* FALLTHROUGH */
  docv:
                /* FALLTHROUGH */
        case 5:
@@ -1212,6 +1214,10 @@ int cpos(register SCRN *t, register int x, register int y)
                                if(*cs<32 || *cs>=127)
                                        break;
 
+                               /* has a combining character attached? */
+                               if (*as & HAS_COMBINING)
+                                       break;
+
                                if (*as != t->attrib)
                                        set_attr(t, *as);
 
@@ -1379,7 +1385,8 @@ void magic(SCRN *t, int y, int *cs, int *ca,int *s, int *a, int placex)
                        if (q > 0) {
                                int z, fu;
 
-                               for (z = x; z != t->co - 1 && ofst[z] == q; ++z) ;
+                               for (z = x; z != t->co - 1 && ofst[z] == q; ++z)
+                                       ;
                                while (s[x] == cs[x] && x < placex)
                                        ++x;
                                dodelchr(t, x, y, q);
@@ -1390,7 +1397,8 @@ void magic(SCRN *t, int y, int *cs, int *ca,int *s, int *a, int placex)
                        } else {
                                int z, fu;
 
-                               for (z = x; z != t->co - 1 && ofst[z] == q; ++z) ;
+                               for (z = x; z != t->co - 1 && ofst[z] == q; ++z)
+                                       ;
                                while (s[x + q] == cs[x + q] && x - q < placex)
                                        ++x;
                                doinschr(t, x + q, y, s + x + q, a + x + q, -q);
@@ -1561,12 +1569,14 @@ void nscroll(SCRN *t)
                                doupscrl(t, y, z + q, q);
                                y = z - 1;
                        } else {
-                               for (r = y; r != t->li && (t->sary[r] < 0 || t->sary[r] == t->li); ++r) ;
+                               for (r = y; r != t->li && (t->sary[r] < 0 || t->sary[r] == t->li); ++r)
+                                       ;
                                p = r - 1;
                                do {
                                        q = t->sary[p];
                                        if (q && q != t->li) {
-                                               for (z = p; t->sary[z] = 0, (z && t->sary[z - 1] == q); --z) ;
+                                               for (z = p; t->sary[z] = 0, (z && t->sary[z - 1] == q); --z)
+                                                       ;
                                                dodnscrl(t, z + q, p + 1, -q);
                                                p = z + 1;
                                        }
@@ -1640,7 +1650,7 @@ void nscrldn(SCRN *t, int top, int bot, int amnt)
                for (x = top; x != top + amnt; ++x) {
                        t->updtab[x] = 1;
                        t->syntab[x] = -1;
-                       }
+               }
        }
        if (amnt > bot - top)
                amnt = bot - top;
@@ -1648,7 +1658,7 @@ void nscrldn(SCRN *t, int top, int bot, int amnt)
        if (amnt == bot - top) {
                msetI(t->updtab + top, 1, amnt);
                msetI(t->syntab + top, -1, amnt);
-               }
+       }
 }
 
 void nscrlup(SCRN *t, int top, int bot, int amnt)
@@ -1668,7 +1678,7 @@ void nscrlup(SCRN *t, int top, int bot, int amnt)
                for (x = bot - amnt; x != bot; ++x) {
                        t->updtab[x] = 1;
                        t->syntab[x] = -1;
-                       }
+               }
        }
        if (amnt > bot - top)
                amnt = bot - top;
@@ -1676,7 +1686,7 @@ void nscrlup(SCRN *t, int top, int bot, int amnt)
        if (amnt == bot - top) {
                msetI(t->updtab + bot - amnt, 1, amnt);
                msetI(t->syntab + bot - amnt, -1, amnt);
-               }
+       }
 }
 
 extern volatile int dostaupd;
@@ -1800,9 +1810,9 @@ void genfield(SCRN *t,int *scrn,int *attr,int x,int y,int ofst,unsigned char *s,
                                wid = joe_wcwidth(1,c);
                } else {
                        /* Byte mode: character is one column wide */
-                       wid = 1 ;
+                       wid = 1;
                }
-               if (wid>=0) {
+               if (wid >= 0) {
                        if (col >= ofst) {
                                if (x + wid > last_col) {
                                        /* Character crosses end of field, so fill balance of field with '>' characters instead */
@@ -1812,7 +1822,7 @@ void genfield(SCRN *t,int *scrn,int *attr,int x,int y,int ofst,unsigned char *s,
                                                ++attr;
                                                ++x;
                                        }
-                               } else if(wid) {
+                               } else /* if (wid >(=) 0) */ {
                                        /* Emit character */
                                        outatr(locale_map, t, scrn, attr, x, y, c, my_atr);
                                        x += wid;
@@ -1833,7 +1843,7 @@ void genfield(SCRN *t,int *scrn,int *attr,int x,int y,int ofst,unsigned char *s,
                                }
                        } else
                                col += wid;
-       }
+               }
        }
        /* Fill balance of field with spaces */
        while (x < last_col) {
@@ -1922,14 +1932,14 @@ void genfmt(SCRN *t, int x, int y, int ofst, const unsigned char *s, int flg)
                                /* UTF-8 mode: decode character and determine its width */
                                c = utf8_decode(&sm,c);
                                if (c >= 0) {
-                                               wid = joe_wcwidth(1,c);
+                                       wid = joe_wcwidth(1, c);
                                }
                        } else {
                                /* Byte mode: character is one column wide */
-                               wid = 1 ;
+                               wid = 1;
                        }
 
-                       if (wid>=0) {
+                       if (wid >= 0) {
                                if (col >= ofst) {
                                        outatr(locale_map, t, scrn, attr, x, y, c, atr);
                                        scrn += wid;
diff --git a/scrn.h b/scrn.h
index 3bd619b..b2fc63f 100644 (file)
--- a/scrn.h
+++ b/scrn.h
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/scrn.h,v 1.4 2012/12/30 17:10:58 tg Exp $ */
+/* $MirOS: contrib/code/jupp/scrn.h,v 1.5 2017/07/09 01:03:54 tg Exp $ */
 /*
  *     Device independant tty interface for JOE
  *     Copyright
@@ -127,6 +127,8 @@ extern unsigned atab[];
 #define FG_RED (14<<FG_SHIFT)
 #define FG_BLACK (15<<FG_SHIFT)
 
+#define HAS_COMBINING 0x200000
+
 void outatr PARAMS((struct charmap *map,SCRN *t,int *scrn,int *attrf,int xx,int yy,int c,int a));
 
 #endif
index 8a56eb8..8faae8e 100644 (file)
--- a/syntax.c
+++ b/syntax.c
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/syntax.c,v 1.16 2017/01/11 22:04:33 tg Exp $ */
+/* $MirOS: contrib/code/jupp/syntax.c,v 1.17 2017/07/08 16:15:12 tg Exp $ */
 /*
  *     Syntax highlighting DFA interpreter
  *     Copyright
@@ -20,7 +20,7 @@
 #include "syntax.h"
 
 static struct {
-       unsigned char buf[6];
+       unsigned char buf[7];
        unsigned char start;
        unsigned char limit;
        unsigned eaten : 1;
index faf3d6a..7661ed0 100644 (file)
--- a/termcap.c
+++ b/termcap.c
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/termcap.c,v 1.12 2017/01/11 22:41:19 tg Exp $ */
+/* $MirOS: contrib/code/jupp/termcap.c,v 1.14 2017/08/08 16:12:04 tg Exp $ */
 /*
  *     TERMCAP/TERMINFO database interface
  *     Copyright
@@ -79,7 +79,7 @@ static unsigned char *lfind(unsigned char *s, int pos, FILE *fd, unsigned char *
        while (c = getc(fd), c == ' ' || c == '\t' || c == '#')
                do {
                        c = getc(fd);
-               } while (!(c == -1 || c == '\n'));
+               } while (c != -1 && c != '\n');
        if (c == -1)
                return s = vstrunc(s, pos);
        ungetc(c, fd);
@@ -571,9 +571,11 @@ void texec(CAP *cap, unsigned char *s, int l, int a0, int a1, int a2, int a3)
                                        cap->out(cap->outptr, x / 96);
                                        x %= 96;
                                }
+                               /* FALLTHROUGH */
                        case '+':
                                if (*s)
                                        x += escape(&s);
+                               /* FALLTHROUGH */
                        case '.':
                                cap->out(cap->outptr, x);
                                ++a;
@@ -581,9 +583,11 @@ void texec(CAP *cap, unsigned char *s, int l, int a0, int a1, int a2, int a3)
                        case 'd':
                                if (x < 10)
                                        goto one;
+                               /* FALLTHROUGH */
                        case '2':
                                if (x < 100)
                                        goto two;
+                               /* FALLTHROUGH */
                        case '3':
                                c = '0';
                                while (x >= 100) {
@@ -591,7 +595,8 @@ void texec(CAP *cap, unsigned char *s, int l, int a0, int a1, int a2, int a3)
                                        x -= 100;
                                }
                                cap->out(cap->outptr, c);
-                             two:c = '0';
+ two:
+                               c = '0';
                                while (x >= 10) {
                                        ++c;
                                        x -= 10;
@@ -664,6 +669,7 @@ void texec(CAP *cap, unsigned char *s, int l, int a0, int a1, int a2, int a3)
                                        a[0] += escape(&s);
                                else
                                        escape(&s);
+                               /* FALLTHROUGH */
                        default:
                                cap->out(cap->outptr, '%');
                                cap->out(cap->outptr, c);
diff --git a/tty.c b/tty.c
index bd5c79c..82b1c57 100644 (file)
--- a/tty.c
+++ b/tty.c
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/tty.c,v 1.22 2016/10/30 02:38:35 tg Exp $ */
+/* $MirOS: contrib/code/jupp/tty.c,v 1.24 2017/08/08 16:12:04 tg Exp $ */
 /*
  *     UNIX Tty and Process interface
  *     Copyright
@@ -263,19 +263,19 @@ void ttclose(void)
        signrm();
 }
 
-static int winched = 0;
+static volatile sig_atomic_t winched = 0;
 #ifdef SIGWINCH
 /* Window size interrupt handler */
 static RETSIGTYPE winchd(int unused)
 {
-       ++winched;
+       winched = 1;
        REINSTALL_SIGHANDLER(SIGWINCH, winchd);
 }
 #endif
 
 /* Second ticker */
 
-int ticked = 0;
+static volatile sig_atomic_t ticked = 0;
 extern int dostaupd;
 static RETSIGTYPE dotick(int unused)
 {
@@ -408,7 +408,7 @@ baud_reset(int bbaud)
        upc = DIVIDEND / baud;
        if (obuf)
                joe_free(obuf);
-       if (!(TIMES * upc))
+       if ((TIMES * upc) == 0)
                obufsiz = 4096;
        else {
                obufsiz = 1000000 / (TIMES * upc);
@@ -453,7 +453,7 @@ void ttclsn(void)
 
 /* Timer interrupt handler */
 
-static int yep;
+static volatile sig_atomic_t yep;
 static RETSIGTYPE dosig(int unused)
 {
        yep = 1;
@@ -589,17 +589,16 @@ int ttflsh(void)
 
 void mpxdied(MPX *m);
 
-long last_time;
+static time_t last_time;
 
 int ttgetc(void)
 {
        int stat_;
-       long new_time;
-
+       time_t new_time;
 
        tickon();
 
     loop:
+ loop:
        new_time = time(NULL);
        if (new_time != last_time) {
                last_time = new_time;
@@ -963,7 +962,7 @@ static unsigned char *getpty(int *ptyfd)
 /* Shell dies signal handler.  Puts pty in non-block mode so
  * that read returns with <1 when all data from process has
  * been read. */
-int dead = 0;
+static volatile sig_atomic_t dead = 0;
 int death_fd;
 static RETSIGTYPE death(int unused)
 {
diff --git a/tw.c b/tw.c
index f16a75e..42f0d9b 100644 (file)
--- a/tw.c
+++ b/tw.c
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/tw.c,v 1.10 2017/01/10 19:16:28 tg Exp $ */
+/* $MirOS: contrib/code/jupp/tw.c,v 1.12 2017/03/19 18:53:02 tg Exp $ */
 /* 
  *     Text editing windows
  *     Copyright
@@ -11,6 +11,7 @@
 
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
 #ifdef HAVE_TIME_H
 #include <time.h>
 #endif
@@ -143,31 +144,30 @@ unsigned char *get_context(BW *bw)
 
 static unsigned char *stagen(unsigned char *stalin, BW *bw, unsigned char *s, int fill)
 {
+       unsigned char *cp, *cp2, uc;
        unsigned char buf[80];
        int x;
        W *w = bw->parent;
+       time_t tt;
        int special_aA = 0;
 
-       {
-               unsigned char *cp = s, *cp2;
-
-               while ((cp2 = strstr(cp, "%a")) != NULL) {
-                       cp2 += /* %a */ 2;
-                       if (cp2[1] == '%')
-                               ++cp2;
-                       if (cp2[0] == '%' && cp2[1] == 'A') {
-                               special_aA = 1;
-                               break;
-                       }
+       cp = s;
+       while ((cp2 = strstr(cp, "%a")) != NULL) {
+               cp2 += /* %a */ 2;
+               if (cp2[1] == '%')
+                       ++cp2;
+               if (cp2[0] == '%' && cp2[1] == 'A') {
+                       special_aA = 1;
+                       break;
                }
-               if (!special_aA) while ((cp2 = strstr(cp, "%A")) != NULL) {
-                       cp2 += /* %A */ 2;
-                       if (cp2[1] == '%')
-                               ++cp2;
-                       if (cp2[0] == '%' && cp2[1] == 'a') {
-                               special_aA = 1;
-                               break;
-                       }
+       }
+       if (!special_aA) while ((cp2 = strstr(cp, "%A")) != NULL) {
+               cp2 += /* %A */ 2;
+               if (cp2[1] == '%')
+                       ++cp2;
+               if (cp2[0] == '%' && cp2[1] == 'a') {
+                       special_aA = 1;
+                       break;
                }
        }
 
@@ -175,46 +175,37 @@ static unsigned char *stagen(unsigned char *stalin, BW *bw, unsigned char *s, in
        while (*s) {
                if (*s == '%' && s[1]) {
                        switch (*++s) {
-                       case 'x': /* Context (but only if autoindent is enabled) */
-                               {
-                                       if ( bw->o.autoindent) {
-                                               unsigned char *s_ = get_context(bw);
-                                               stalin = vsncpy(sv(stalin), sz(s_));
-                                       }
+                       case 'x':
+                               /* Context (but only if autoindent is enabled) */
+                               if (bw->o.autoindent) {
+                                       cp = get_context(bw);
+                                       stalin = vsncpy(sv(stalin), sz(cp));
                                }
                                break;
 
                        case 'y':
-                               {
-                                       if (bw->o.syntax) {
-                                               joe_snprintf_1((char *)buf, sizeof(buf), "(%s)", bw->o.syntax->name);
-                                               stalin = vsncpy(sv(stalin), sz(buf));
-                                       }
+                               if (bw->o.syntax) {
+                                       joe_snprintf_1((char *)buf, sizeof(buf), "(%s)", bw->o.syntax->name);
+                                       stalin = vsncpy(sv(stalin), sz(buf));
                                }
                                break;
                        case 't':
-                               {
-                                       time_t n = time(NULL);
-                                       int l;
-                                       unsigned char *d = (unsigned char *)ctime(&n);
-
-                                       l = (d[11] - '0') * 10 + d[12] - '0';
-                                       if (l > 12)
-                                               l -= 12;
-                                       joe_snprintf_1((char *)buf, sizeof(buf), "%2.2d", l);
-                                       if (buf[0] == '0')
-                                               buf[0] = fill;
-                                       stalin = vsncpy(sv(stalin), buf, 2);
-                                       stalin = vsncpy(sv(stalin), d + 13, 3);
-                               }
+                               tt = time(NULL);
+                               cp = (unsigned char *)ctime(&tt);
+
+                               x = (cp[11] - '0') * 10 + cp[12] - '0';
+                               if (x > 12)
+                                       x -= 12;
+                               joe_snprintf_1((char *)buf, sizeof(buf), "%2.2d", x);
+                               if (buf[0] == '0')
+                                       buf[0] = fill;
+                               stalin = vsncpy(sv(stalin), buf, 2);
+                               stalin = vsncpy(sv(stalin), cp + 13, 3);
                                break;
                        case 'u':
-                               {
-                                       time_t n = time(NULL);
-                                       unsigned char *d = (unsigned char *)ctime(&n);
-
-                                       stalin = vsncpy(sv(stalin), d + 11, 5);
-                               }
+                               tt = time(NULL);
+                               cp = (unsigned char *)ctime(&tt);
+                               stalin = vsncpy(sv(stalin), cp + 11, 5);
                                break;
                        case 'T':
                                if (bw->o.overtype)
@@ -240,24 +231,24 @@ static unsigned char *stagen(unsigned char *stalin, BW *bw, unsigned char *s, in
                                else
                                        stalin = vsadd(stalin, fill);
                                break;
-                       case 'n': {
-                               unsigned char fnc;
-                               const unsigned char *fn = bw->b->name ? bw->b->name :
-                                   (const unsigned char *)"Unnamed";
-
+                       case 'n':
+                               if (!bw->b->name) {
+                                       stalin = vsncpy(sv(stalin), sc("Unnamed"));
+                                       break;
+                               }
+                               cp = bw->b->name;
  escape_loop:
-                               switch ((fnc = *fn++)) {
+                               switch ((uc = *cp++)) {
                                case '\\':
-                                       stalin = vsadd(stalin, fnc);
+                                       stalin = vsadd(stalin, uc);
                                        /* FALLTHROUGH */
                                default:
-                                       stalin = vsadd(stalin, fnc);
+                                       stalin = vsadd(stalin, uc);
                                        goto escape_loop;
                                case '\0':
                                        break;
                                }
                                break;
-                           }
                        case 'm':
                                if (bw->b->changed)
                                        stalin = vsncpy(sv(stalin), sc("(Modified)"));
@@ -358,33 +349,29 @@ static unsigned char *stagen(unsigned char *stalin, BW *bw, unsigned char *s, in
                                stalin = vsncpy(sv(stalin), sz(buf));
                                break;
                        case 'k':
-                               {
-                                       int i;
-                                       unsigned char *cpos_ = buf;
-
-                                       buf[0] = 0;
-                                       if (w->kbd->x && w->kbd->seq[0])
-                                               for (i = 0; i != w->kbd->x; ++i) {
-                                                       int c = w->kbd->seq[i] & 127;
-
-                                                       if (c < 32) {
-                                                               cpos_[0] = '^';
-                                                               cpos_[1] = c + '@';
-                                                               cpos_ += 2;
-                                                       } else if (c == 127) {
-                                                               cpos_[0] = '^';
-                                                               cpos_[1] = '?';
-                                                               cpos_ += 2;
-                                                       } else {
-                                                               cpos_[0] = c;
-                                                               cpos_ += 1;
-                                                       }
+                               cp = buf;
+                               buf[0] = 0;
+                               if (w->kbd->x && w->kbd->seq[0])
+                                       for (x = 0; x != w->kbd->x; ++x) {
+                                               uc = w->kbd->seq[x] & 127;
+
+                                               if (uc < 32) {
+                                                       cp[0] = '^';
+                                                       cp[1] = uc + '@';
+                                                       cp += 2;
+                                               } else if (uc == 127) {
+                                                       cp[0] = '^';
+                                                       cp[1] = '?';
+                                                       cp += 2;
+                                               } else {
+                                                       cp[0] = uc;
+                                                       cp += 1;
                                                }
-                                       *cpos_++ = fill;
-                                       while (cpos_ - buf < 4)
-                                               *cpos_++ = fill;
-                                       stalin = vsncpy(sv(stalin), buf, cpos_ - buf);
-                               }
+                                       }
+                               *cp++ = fill;
+                               while (cp - buf < 4)
+                                       *cp++ = fill;
+                               stalin = vsncpy(sv(stalin), buf, cp - buf);
                                break;
                        case 'S':
                                if (bw->b->pid)
diff --git a/uedit.c b/uedit.c
index 4b9542b..e550185 100644 (file)
--- a/uedit.c
+++ b/uedit.c
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/uedit.c,v 1.15 2017/01/11 22:56:49 tg Exp $ */
+/* $MirOS: contrib/code/jupp/uedit.c,v 1.17 2017/03/19 19:19:51 tg Exp $ */
 /*
  *     Basic user edit functions
  *     Copyright
@@ -10,6 +10,7 @@
 #include "types.h"
 
 #include <stdio.h>
+#include <string.h>
 
 #ifdef HAVE_BSD_STRING_H
 #include <bsd/string.h>
@@ -670,7 +671,7 @@ static int doline(BW *bw, unsigned char *s, void *object, int *notify)
        if (notify)
                *notify = 1;
        vsrm(s);
-       if (num >= 1 && !merr) {
+       if (num >= 1 && !merrf) {
                int tmp = mid;
 
                if (num > bw->b->eof->line)
@@ -681,8 +682,8 @@ static int doline(BW *bw, unsigned char *s, void *object, int *notify)
                mid = tmp;
                return 0;
        } else {
-               if (merr)
-                       msgnw(bw->parent, merr);
+               if (merrf)
+                       msgnw(bw->parent, merrt);
                else
                        msgnw(bw->parent, US "Invalid line number");
                return -1;
@@ -708,7 +709,7 @@ static int docol(BW *bw, unsigned char *s, void *object, int *notify)
        if (notify)
                *notify = 1;
        vsrm(s);
-       if (num >= 1 && !merr) {
+       if (num >= 1 && !merrf) {
                int tmp = mid;
 
                pcol(bw->cursor, num - 1), bw->cursor->xcol = piscol(bw->cursor);
@@ -717,8 +718,8 @@ static int docol(BW *bw, unsigned char *s, void *object, int *notify)
                mid = tmp;
                return 0;
        } else {
-               if (merr)
-                       msgnw(bw->parent, merr);
+               if (merrf)
+                       msgnw(bw->parent, merrt);
                else
                        msgnw(bw->parent, US "Invalid column number");
                return -1;
@@ -744,7 +745,7 @@ static int dobyte(BW *bw, unsigned char *s, void *object, int *notify)
        if (notify)
                *notify = 1;
        vsrm(s);
-       if (num >= 0 && !merr) {
+       if (num >= 0 && !merrf) {
                int tmp = mid;
 
                pgoto(bw->cursor, num), bw->cursor->xcol = piscol(bw->cursor);
@@ -753,8 +754,8 @@ static int dobyte(BW *bw, unsigned char *s, void *object, int *notify)
                mid = tmp;
                return 0;
        } else {
-               if (merr)
-                       msgnw(bw->parent, merr);
+               if (merrf)
+                       msgnw(bw->parent, merrt);
                else
                        msgnw(bw->parent, US "Invalid byte number");
                return -1;
index d71a887..0d9e5c9 100644 (file)
--- a/uerror.c
+++ b/uerror.c
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/uerror.c,v 1.3 2008/05/13 13:08:27 tg Exp $ */
+/* $MirOS: contrib/code/jupp/uerror.c,v 1.4 2017/08/09 00:46:02 tg Exp $ */
 /*
  *     Compiler error handler
  *     Copyright
@@ -276,7 +276,7 @@ int unxterr(BW *bw)
        }
        errptr = errptr->link.next;
        if (!bw->b->name || strcmp(errptr->file, bw->b->name)) {
-               if (doedit(bw, vsdup(errptr->file), NULL, NULL))
+               if (doswitch(bw, vsdup(errptr->file), NULL, NULL))
                        return -1;
                bw = (BW *) maint->curwin->object;
        }
@@ -301,7 +301,7 @@ int uprverr(BW *bw)
        }
        errptr = errptr->link.prev;
        if (!bw->b->name || strcmp(errptr->file, bw->b->name)) {
-               if (doedit(bw, vsdup(errptr->file), NULL, NULL))
+               if (doswitch(bw, vsdup(errptr->file), NULL, NULL))
                        return -1;
                bw = (BW *) maint->curwin->object;
        }
diff --git a/ufile.c b/ufile.c
index ac151f8..a2dd940 100644 (file)
--- a/ufile.c
+++ b/ufile.c
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/ufile.c,v 1.11 2014/10/23 16:10:28 tg Exp $ */
+/* $MirOS: contrib/code/jupp/ufile.c,v 1.12 2017/08/08 21:39:28 tg Exp $ */
 /*
  *     User file operations
  *     Copyright
@@ -1067,3 +1067,12 @@ int ukilljoe(BW *bw)
        leave = 1;
        return 0;
 }
+
+extern int main_rv;
+
+int
+uabendjoe(BW *bw)
+{
+       main_rv = 1;
+       return (ukilljoe(bw));
+}
diff --git a/ufile.h b/ufile.h
index 5bf9224..0aa5c8d 100644 (file)
--- a/ufile.h
+++ b/ufile.h
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/ufile.h,v 1.2 2008/05/13 13:08:28 tg Exp $ */
+/* $MirOS: contrib/code/jupp/ufile.h,v 1.4 2017/08/09 00:46:02 tg Exp $ */
 /*
  *     User file operations
  *     Copyright
@@ -30,8 +30,9 @@ int uask PARAMS((BW *bw));
 int ubufed PARAMS((BW *bw));
 int ulose PARAMS((BW *bw));
 int okrepl PARAMS((BW *bw));
-int doedit PARAMS((BW *bw, unsigned char *s, void *obj, int *notify));
+int doswitch PARAMS((BW *bw, unsigned char *s, void *obj, int *notify));
 int uquerysave PARAMS((BW *bw));
 int ukilljoe PARAMS((BW *bw));
+int uabendjoe PARAMS((BW *bw));
 
 #endif
diff --git a/umath.c b/umath.c
index 3d898f0..284e493 100644 (file)
--- a/umath.c
+++ b/umath.c
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/umath.c,v 1.6 2012/12/30 17:12:37 tg Exp $ */
+/* $MirOS: contrib/code/jupp/umath.c,v 1.7 2017/03/19 19:19:51 tg Exp $ */
 /*
  *     Math
  *     Copyright
 #include "charmap.h"
 #include "w.h"
 
-const unsigned char * volatile merr;
+volatile sig_atomic_t merrf;
+const unsigned char *merrt;
 
 static char math_res[JOE_MSGBUFSIZE];
 static char *math_exp;
 
 static RETSIGTYPE fperr(int unused)
 {
-       if (!merr) {
-               merr = US "Float point exception";
-       }
+       if (!merrf)
+               merrf = 2;
        REINSTALL_SIGHANDLER(SIGFPE, fperr);
 }
 
@@ -103,9 +103,9 @@ static double expr(int prec, struct var **rtv)
                x = expr(0, &v);
                if (*ptr == ')')
                        ++ptr;
-               else {
-                       if (!merr)
-                               merr = US "Missing )";
+               else if (!merrf) {
+                       merrf = 1;
+                       merrt = US "Missing )";
                }
        } else if (*ptr == '-') {
                ++ptr;
@@ -136,9 +136,9 @@ static double expr(int prec, struct var **rtv)
                if (v) {
                        v->val = x;
                        v->set = 1;
-               } else {
-                       if (!merr)
-                               merr = US "Left side of = is not an l-value";
+               } else if (!merrf) {
+                       merrf = 1;
+                       merrt = US "Left side of = is not an l-value";
                }
                goto loop;
        }
@@ -187,10 +187,10 @@ double calc(BW *bw, unsigned char *s)
        v->val = tbw->w;
        v->set = 1;
        ptr = s;
-       merr = 0;
+       merrf = 0;
       up:
        result = expr(0, &dumb);
-       if (!merr) {
+       if (!merrf) {
                while (*ptr == ' ' || *ptr == '\t') {
                        ++ptr;
                }
@@ -202,14 +202,17 @@ double calc(BW *bw, unsigned char *s)
                        if (*ptr) {
                                goto up;
                        }
-               } else if (*ptr) {
-                       merr = US "Extra junk after end of expr";
+               } else if (*ptr && !merrf) {
+                       merrf = 1;
+                       merrt = US "Extra junk after end of expr";
                }
        }
 
-       if (merr) {
+       if (merrf) {
+               if (merrf == 2)
+                       merrt = US "Float point exception";
                joe_snprintf_1(math_res, JOE_MSGBUFSIZE,
-                   "math_error{%s}", merr);
+                   "math_error{%s}", merrt);
        } else {
                joe_imaxt ires = (joe_imaxt)result;
 
@@ -235,8 +238,8 @@ static int domath(BW *bw, unsigned char *s, void *object, int *notify)
        if (notify) {
                *notify = 1;
        }
-       if (merr) {
-               msgnw(bw->parent, merr);
+       if (merrf) {
+               msgnw(bw->parent, merrt);
                return -1;
        }
        vsrm(s);
diff --git a/umath.h b/umath.h
index 935bbaf..49ee8f6 100644 (file)
--- a/umath.h
+++ b/umath.h
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/umath.h,v 1.4 2012/12/30 17:12:37 tg Exp $ */
+/* $MirOS: contrib/code/jupp/umath.h,v 1.5 2017/03/19 19:19:51 tg Exp $ */
 /*
  *     Math
  *     Copyright
 #include "config.h"
 #include "types.h"
 
-extern const unsigned char * volatile merr;
+#ifdef HAVE_SIGNAL_H
+#include <signal.h>
+#endif
+
+extern volatile sig_atomic_t merrf;       
+extern const unsigned char *merrt;
+
 double calc(BW *bw, unsigned char *s);
 int umath(BW *bw);
 int umathins(BW *bw);
diff --git a/utag.c b/utag.c
index 1f88b80..61d6053 100644 (file)
--- a/utag.c
+++ b/utag.c
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/utag.c,v 1.2 2008/05/13 13:08:30 tg Exp $ */
+/* $MirOS: contrib/code/jupp/utag.c,v 1.3 2017/08/09 00:46:02 tg Exp $ */
 /*
  *     tags file symbol lookup
  *     Copyright
@@ -60,7 +60,7 @@ static int dotag(BW *bw, unsigned char *s, void *obj, int *notify)
                        if (x != y) {
                                c = buf[y];
                                buf[y] = 0;
-                               if (doedit(bw, vsncpy(NULL, 0, sz(buf + x)), NULL, NULL)) {
+                               if (doswitch(bw, vsncpy(NULL, 0, sz(buf + x)), NULL, NULL)) {
                                        vsrm(s);
                                        vsrm(t);
                                        fclose(f);