Update to CVS snapshot, for testing
authormirabilos <m@mirbsd.org>
Tue, 8 Aug 2017 15:42:27 +0000 (17:42 +0200)
committermirabilos <m@mirbsd.org>
Tue, 8 Aug 2017 15:42:27 +0000 (17:42 +0200)
18 files changed:
Makefile.bsd-wrapper
NEWS
TODO
aclocal.m4
bw.c
debian/changelog
i18n.c
i18n.h
macro.c
rc.c
scrn.c
scrn.h
syntax.c
tty.c
tw.c
uedit.c
umath.c
umath.h

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..9a53cb0 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,6 +1,14 @@
-$MirOS: contrib/code/jupp/NEWS,v 1.105 2017/01/11 22:36:43 tg Exp $
+$MirOS: contrib/code/jupp/NEWS,v 1.108 2017/07/09 01:03:53 tg Exp $
 -------------------------------------------------------------------
 
+JOE-current
+
+- 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
+
 JOE 3.1jupp30
 
 - Fix spelling mistakes, some found by lintian (thanks!)
@@ -17,7 +25,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..300b4ea 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,7 +578,8 @@ 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
 • put all configuration files into /usr/share; use XDG dirs for
@@ -676,7 +587,11 @@ Other requests:
 • 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!)
+• killjoe equivalent to not exit 0; consider elsewhere too…
+  (hardcoded in main.c, maybe leave=2?)
+• !isatty(0), as in foo|xargs jupp (or use BSD xargs -o ?)
+• presentation mode (^KP, ^KN, ^QBKBQKKKK/) on some F-keys
 • …
 
 __________________________________________________________________
-$MirOS: contrib/code/jupp/TODO,v 1.30 2017/01/11 22:04:31 tg Exp $
+$MirOS: contrib/code/jupp/TODO,v 1.36 2017/07/09 01:03:53 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
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;
index bb39e7a..2dedf05 100644 (file)
@@ -1,8 +1,9 @@
 jupp (3.1.30-2) UNRELEASED; urgency=medium
 
   * Mention that the WordStar emulation only applies to non-document mode
+  * Update to CVS snapshot, for testing
 
- -- Thorsten Glaser <tg@mirbsd.de>  Sun, 19 Mar 2017 19:27:52 +0100
+ -- Thorsten Glaser <tg@mirbsd.de>  Tue, 08 Aug 2017 17:42:14 +0200
 
 jupp (3.1.30-1) unstable; urgency=medium
 
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
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/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..a26d2eb 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.25 2017/07/09 01:19:54 tg Exp $ */
 /*
  *     Device independant TTY interface for JOE
  *     Copyright
@@ -205,26 +205,22 @@ 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;
+                       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 +229,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 +303,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 */
@@ -1212,6 +1211,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 +1382,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 +1394,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 +1566,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 +1647,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 +1655,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 +1675,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 +1683,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 +1807,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 +1819,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 +1840,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 +1929,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;
diff --git a/tty.c b/tty.c
index bd5c79c..310995b 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.23 2017/03/19 19:19:51 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)
 {
@@ -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;
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);