MANIFEST                 |    2 
 NEWS                     |  161 +-------
 charproc.c               |  185 ++++++++-
 ctlseqs.ms               |   50 ++
 ctlseqs.txt              |   40 +-
 fontutils.c              |  169 ++++++---
 fontutils.h              |    9 
 graphics.c               |   18 
 graphics_regis.c         |  870 +++++++++++++++++++++++++++++++----------------
 main.c                   |    2 
 misc.c                   |    4 
 package/debian/changelog |   12 
 package/freebsd/Makefile |    2 
 package/xterm.spec       |    4 
 print.c                  |    4 
 ptydata.c                |    6 
 trace.c                  |    4 
 util.c                   |   32 -
 version.h                |    6 
 wcwidth.c                |  628 ++++++++++++++++++++++++++-------
 wcwidth.h                |   33 +
 xstrings.c               |   20 -
 xterm.log.html           |  148 +++++++
 xterm.man                |    7 
 24 files changed, 1696 insertions(+), 720 deletions(-)

New commits:
commit 44287d929208662c177f7b123b7af447669252f9
Author: Sven Joachim <svenj...@gmx.de>
Date:   Thu Jun 22 19:11:05 2017 +0200

    Imported Upstream version 330

diff --git a/MANIFEST b/MANIFEST
index e3ef41e..d4d4430 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -1,4 +1,4 @@
-MANIFEST for xterm-329, version xterm-329
+MANIFEST for xterm-330, version xterm-330
 
--------------------------------------------------------------------------------
 MANIFEST                        this file
 256colres.h                     resource-definitions for 256-color mode
diff --git a/NEWS b/NEWS
index 6bdc013..7022694 100644
--- a/NEWS
+++ b/NEWS
@@ -1,44 +1,38 @@
 The NEWS file was generated from xterm.log.html, which serves as the changelog
 for xterm.
 
--------------------------------------------------------------------------------
-                            Patch #329 - 2017/06/12
+                            Patch #330 - 2017/06/20
 
-     * add  control  sequences  for  reading  the Sixel and ReGIS graphics
-       sizes (suggested by Ben Wong).
-     * add  a  workaround  for  wcwidth  returning -1 for characters which
-       should have been printable (FreeBSD #219800).
-     * fix a bug in font initialization from patch #328 (FreeBSD #219800).
-     * fix  a special case in HideCursor which assigned a bold font to the
-       slot  used  for  normal  font  in changes for italics in patch #307
-       (Debian #858304).
      * updates for ReGIS (Ross Combs):
-          + Strings  specified  with  no  command  are used as "comments".
-            Print these in the log when tracing.
-          + Catch  attempts  to use "alternate display" mode (AKA "blink")
-            from the GIGI, but do not implement it.
-          + The  T(M)  command  should only multiply the height by 10, not
-            20.
-          + Make  the  S(E)  command reset more state than just the screen
-            contents.
-          + Remove two rotation variables which were only being printed.
-          + Numerous minor fixes and comment updates in the R command.
-          + Unknown R command option names trigger an empty response.
-          + Fix  the  output  position after printing rotated text (it was
-            missing the the sign before).
-          + Fix  the  position  change  with pixelvectors and rotated text
-            (the rotation transform was not being applied).
-          + Update  the TODO list and remove a verification FIXME (slanted
-            text positioning is correct as is).
-          + Emulate  the  approximately  1.4x  enlargement  for text which
-            isn't rotated at right angles.
-          + Only  update the color planes specified in the plane mask (the
-            W command's F option).
-     * fix  a  bug  introduced by the changes to font information in patch
-       #328.   When  processing  the  "checkfont"  option  of  the  locale
-       resource,  the  program  referred  to the request data, to an array
-       which  was  only  allocated  in  the new/result widget (report by H
-       Merijn Brand).
-     * fix  a  missing assignment initialization to make the utf8 resource
-       control  whether  escape sequences to enable/disable UTF-8 mode are
-       allowed.
+          + remove redundant text command error check which broke T(B) and
+            T(E).
+          + retain  the  loading  alphabet  number across multiple “L”
+            commands.
+          + add S(T) delay handler.
+          + fix some color handling error messages.
+          + add stubbed-out macrograph handling.
+          + use  fragment_remaining()  and  fragment_consumed() instead of
+            manually checking position / length in various places.
+          + rename  some  local  variables  in  string  /  extent / option
+            parsing
+          + wrap some long lines.
+          + move macrograph command handling out of the top-level.
+     * add a summary of the italic fonts loaded to -report-fonts option.
+     * modify the font-lookup for italics to allow for “-i-” if no match
+       is found with slant “-o-” (prompted by patch by Ben Wong).
+     * change  default values for mkSamplePass and mkSampleSize to reflect
+       generally-improved  locale  support  in  various  operating systems
+       (FreeBSD #219800).
+     * modify  wcwidth.c to return -1 for non-Unicode values, and adjust a
+       couple  of blocks to better match assumptions about ambiguous-width
+       characters  in  other  implementations.  Also  modify  wcwidth.c to
+       support  configurable soft-hyphen, so there is no drawback to using
+       this version rather than a system wcwidth.
+     * amend  change  made  in  patch #328 for cursor-visibility to handle
+       case  where  an  application  is  updating  the reverse-video state
+       (FreeBSD #219800).
+     * update  tables  of  combining  and  ambiguous-width  characters  in
+       wcwidth.c based on Unicode 10.0.0.
+     * build-fix         for        --enable-sixel-graphics        without
+       --enable-regis-graphics (reports by Sven Joachim, FreeBSD #219945).
 
diff --git a/charproc.c b/charproc.c
index 8cf2285..31cd8bc 100644
--- a/charproc.c
+++ b/charproc.c
@@ -1,4 +1,4 @@
-/* $XTermId: charproc.c,v 1.1487 2017/06/12 01:01:20 tom Exp $ */
+/* $XTermId: charproc.c,v 1.1492 2017/06/19 08:34:54 tom Exp $ */
 
 /*
  * Copyright 1999-2016,2017 by Thomas E. Dickey
@@ -746,8 +746,8 @@ static XtResource xterm_resources[] =
     Bres(XtNvt100Graphics, XtCVT100Graphics, screen.vt100_graphics, True),
     Bres(XtNwideChars, XtCWideChars, screen.wide_chars, False),
     Ires(XtNcombiningChars, XtCCombiningChars, screen.max_combining, 2),
-    Ires(XtNmkSamplePass, XtCMkSamplePass, misc.mk_samplepass, 256),
-    Ires(XtNmkSampleSize, XtCMkSampleSize, misc.mk_samplesize, 1024),
+    Ires(XtNmkSamplePass, XtCMkSamplePass, misc.mk_samplepass, 655),
+    Ires(XtNmkSampleSize, XtCMkSampleSize, misc.mk_samplesize, 65536),
     Sres(XtNutf8, XtCUtf8, screen.utf8_mode_s, "default"),
     Sres(XtNutf8Fonts, XtCUtf8Fonts, screen.utf8_fonts_s, "default"),
     Sres(XtNwideBoldFont, XtCWideBoldFont, misc.default_font.f_wb, 
DEFWIDEBOLDFONT),
@@ -2874,6 +2874,7 @@ doparsing(XtermWidget xw, unsigned c, struct ParseState 
*sp)
                        if_OPT_ISO_COLORS(screen, {
                            break;
                        });
+                       /* FALLTHRU */
                    default:
                        TRACE(("...unexpected subparameter in SGR\n"));
                        op = 9999;
@@ -3696,6 +3697,7 @@ doparsing(XtermWidget xw, unsigned c, struct ParseState 
*sp)
                            break;
                        }
                        break;
+# if OPT_REGIS_GRAPHICS
                    case 3:     /* ReGIS geometry */
                        switch (GetParam(1)) {
                        case 1: /* read */
@@ -3717,6 +3719,7 @@ doparsing(XtermWidget xw, unsigned c, struct ParseState 
*sp)
                            break;
                        }
                        break;
+#endif
                    default:
                        TRACE(("DATA_ERROR: CASE_GRAPHICS_ATTRIBUTES request 
with unknown item parameter: %d\n",
                               GetParam(0)));
@@ -8559,6 +8562,7 @@ VTInitialize(Widget wrequest,
        TRACE(("setting utf8_mode to 0\n"));
        screen->utf8_mode = uFalse;
     }
+    mk_wcwidth_init(screen->utf8_mode);
     TRACE(("initialized UTF-8 mode to %d\n", screen->utf8_mode));
 
 #if OPT_MINI_LUIT
@@ -10352,10 +10356,16 @@ ShowCursor(void)
                }
            }
        }
-       if (T_COLOR(screen, TEXT_CURSOR) == bg_pix ||
-           T_COLOR(screen, TEXT_CURSOR) == (reversed
-                                            ? xw->dft_background
-                                            : xw->dft_foreground)) {
+
+#define CUR_XX T_COLOR(screen, TEXT_CURSOR)
+#define CGS_FG getCgsFore(xw, currentWin, getCgsGC(xw, currentWin, currentCgs))
+#define CGS_BG getCgsBack(xw, currentWin, getCgsGC(xw, currentWin, currentCgs))
+
+#define FIX_311 (CUR_XX == (reversed ? xw->dft_background : 
xw->dft_foreground))
+#define FIX_328 (CUR_XX == bg_pix)
+#define FIX_330 (FIX_328 && reversed && in_selection)
+
+       if (FIX_330 || FIX_311) {
            setCgsBack(xw, currentWin, currentCgs, fg_pix);
        }
        setCgsFore(xw, currentWin, currentCgs, bg_pix);
@@ -10432,10 +10442,7 @@ ShowCursor(void)
             * Set up a new request.
             */
            if (filled) {
-               if (T_COLOR(screen, TEXT_CURSOR) == bg_pix ||
-                   T_COLOR(screen, TEXT_CURSOR) == (reversed
-                                                    ? xw->dft_background
-                                                    : xw->dft_foreground)) {
+               if (FIX_330 || FIX_311) {
                    setCgsBack(xw, currentWin, currentCgs, fg_pix);
                }
                setCgsFore(xw, currentWin, currentCgs, bg_pix);
@@ -10571,7 +10578,7 @@ HideCursor(void)
     int cursor_col;
     CLineData *ld = 0;
 #if OPT_WIDE_ATTRS
-    CgsEnum which_Cgs = gcMAX;
+    int which_Cgs = gcMAX;
     unsigned attr_flags;
     int which_font = fNorm;
 #endif
@@ -10663,7 +10670,7 @@ HideCursor(void)
        which_Cgs = reverseCgs(xw, attr_flags, in_selection, which_font);
        if (which_Cgs != gcMAX) {
            setCgsFont(xw, WhichVWin(screen),
-                      which_Cgs,
+                      (CgsEnum) which_Cgs,
                       (((attr_flags & ATR_ITALIC) && UseItalicFont(screen))
                        ? getItalicFont(screen, which_font)
                        : getNormalFont(screen, which_font)));
@@ -10707,7 +10714,7 @@ HideCursor(void)
 #if OPT_WIDE_ATTRS
     if (which_Cgs != gcMAX) {
        setCgsFont(xw, WhichVWin(screen),
-                  which_Cgs,
+                  (CgsEnum) which_Cgs,
                   (((xw->flags & ATR_ITALIC) && UseItalicFont(screen))
                    ? getItalicFont(screen, which_font)
                    : getNormalFont(screen, which_font)));
diff --git a/fontutils.c b/fontutils.c
index 6f80c84..6db575e 100644
--- a/fontutils.c
+++ b/fontutils.c
@@ -1,4 +1,4 @@
-/* $XTermId: fontutils.c,v 1.528 2017/06/08 23:53:31 tom Exp $ */
+/* $XTermId: fontutils.c,v 1.531 2017/06/20 09:10:19 tom Exp $ */
 
 /*
  * Copyright 1998-2016,2017 by Thomas E. Dickey
@@ -460,11 +460,58 @@ bold_font_name(FontNameProperties *props, int 
use_average_width)
 
 #if OPT_WIDE_ATTRS
 static char *
-italic_font_name(FontNameProperties *props, int use_average_width)
+italic_font_name(FontNameProperties *props, const char *slant)
 {
     FontNameProperties myprops = *props;
-    myprops.slant = "o";
-    return derive_font_name(&myprops, props->weight, use_average_width, 
props->end);
+    myprops.slant = slant;
+    return derive_font_name(&myprops, props->weight, myprops.average_width, 
props->end);
+}
+
+static Boolean
+open_italic_font(XtermWidget xw, int n, FontNameProperties *fp, XTermFonts * 
data)
+{
+    static const char *slant[] =
+    {
+       "o",
+       "i"
+    };
+    char *name;
+    Cardinal pass;
+    Boolean result = False;
+
+    for (pass = 0; pass < XtNumber(slant); ++pass) {
+       if ((name = italic_font_name(fp, slant[pass])) != 0) {
+           TRACE(("open_italic_font %s %s\n",
+                  whichFontEnum((VTFontEnum) n), name));
+           if (xtermOpenFont(xw, name, data, False)) {
+               result = (data->fs != 0);
+#if OPT_REPORT_FONTS
+               if (resource.reportFonts) {
+                   printf("opened italic version of %s:\n\t%s\n",
+                          whichFontEnum(n),
+                          name);
+               }
+#endif
+           }
+           free(name);
+           if (result)
+               break;
+       }
+    }
+#if OPT_TRACE
+    if (result) {
+       XFontStruct *fs = data->fs;
+       if (fs != 0) {
+           TRACE(("...actual size %dx%d (ascent %d, descent %d)\n",
+                  fs->ascent +
+                  fs->descent,
+                  fs->max_bounds.width,
+                  fs->ascent,
+                  fs->descent));
+       }
+    }
+#endif
+    return result;
 }
 #endif
 
@@ -1062,7 +1109,7 @@ reportVTFontInfo(XtermWidget xw, int fontnum)
 }
 #endif
 
-typedef XTermFonts *(*MyGetFont) (TScreen *, VTFontEnum);
+typedef XTermFonts *(*MyGetFont) (TScreen *, int);
 
 void
 xtermUpdateFontGCs(XtermWidget xw, Bool italic)
@@ -1645,45 +1692,44 @@ xtermLoadItalics(XtermWidget xw)
 
     if (!screen->ifnts_ok) {
        int n;
+       FontNameProperties *fp;
+       XTermFonts *data;
 
        screen->ifnts_ok = True;
        for (n = 0; n < fMAX; ++n) {
-           FontNameProperties *fp;
-           XTermFonts *data = getItalicFont(screen, n);
+           switch (n) {
+           case fNorm:
+               /* FALLTHRU */
+           case fBold:
+               /* FALLTHRU */
+#if OPT_WIDE_CHARS
+           case fWide:
+               /* FALLTHRU */
+           case fWBold:
+#endif
+               /* FALLTHRU */
+               data = getItalicFont(screen, n);
 
-           /*
-            * FIXME - need to handle font-leaks
-            */
-           data->fs = 0;
-           if (getNormalFont(screen, n)->fs != 0 &&
-               (fp = get_font_name_props(screen->display,
-                                         getNormalFont(screen, n)->fs,
-                                         0)) != 0) {
-               char *name;
-
-               if ((name = italic_font_name(fp, fp->average_width)) != 0) {
-                   TRACE(("xtermLoadItalics %s %s\n", whichFontEnum(n), name));
-                   if (xtermOpenFont(xw, name, data, False)) {
-#if OPT_TRACE
-                       XFontStruct *fs = data->fs;
-                       if (fs != 0) {
-                           TRACE(("...actual size %dx%d (ascent %d, descent 
%d)\n",
-                                  fs->ascent +
-                                  fs->descent,
-                                  fs->max_bounds.width,
-                                  fs->ascent,
-                                  fs->descent));
+               /*
+                * FIXME - need to handle font-leaks
+                */
+               data->fs = 0;
+               if (getNormalFont(screen, n)->fs != 0 &&
+                   (fp = get_font_name_props(screen->display,
+                                             getNormalFont(screen, n)->fs,
+                                             0)) != 0) {
+                   if (!open_italic_font(xw, n, fp, data)) {
+                       if (n > 0) {
+                           xtermCopyFontInfo(data,
+                                             getItalicFont(screen, n - 1));
+                       } else {
+                           xtermOpenFont(xw,
+                                         getNormalFont(screen, n)->fn,
+                                         data, False);
                        }
-#endif
-                   } else if (n > 0) {
-                       xtermCopyFontInfo(data, getItalicFont(screen, n - 1));
-                   } else {
-                       xtermOpenFont(xw,
-                                     getNormalFont(screen, n)->fn,
-                                     data, False);
                    }
-                   free(name);
                }
+               break;
            }
        }
     }
@@ -2148,6 +2194,7 @@ xtermSetCursorBox(TScreen *screen)
 
 #if OPT_RENDERFONT
 
+#if OPT_REPORT_FONTS
 static FcChar32
 xtermXftFirstChar(XftFont *xft)
 {
@@ -2192,8 +2239,9 @@ xtermXftLastChar(XftFont *xft)
            break;
        }
     }
-    return (long) last;
+    return (FcChar32) last;
 }
+#endif /* OPT_REPORT_FONTS */
 
 #if OPT_TRACE > 1
 static void
@@ -2264,6 +2312,7 @@ checkXft(XtermWidget xw, XTermXftFonts *data, XftFont 
*xft)
     data->map.mixed = (data->map.max_width >= (data->map.min_width + 1));
 }
 
+#if OPT_REPORT_FONTS
 static void
 reportXftFonts(XtermWidget xw,
               XftFont *fp,
@@ -2300,6 +2349,9 @@ reportXftFonts(XtermWidget xw,
        }
     }
 }
+#else
+#define reportXftFonts(xw, result, name, tag, match)   /* empty */
+#endif /* OPT_REPORT_FONTS */
 
 static XftFont *
 xtermOpenXft(XtermWidget xw, const char *name, XftPattern *pat, const char 
*tag)
@@ -3695,8 +3747,8 @@ HandleSetFont(Widget w GCC_UNUSED,
                /* FALLTHRU */
            case 4:
                fonts.f_w = x_strdup(params[3]);
-               /* FALLTHRU */
 #endif
+               /* FALLTHRU */
            case 3:
                fonts.f_b = x_strdup(params[2]);
                /* FALLTHRU */
@@ -4072,7 +4124,7 @@ initFontList(XtermWidget xw,
 
     TRACE(("initFontList(%s)\n", name));
     for (which = 0; which < fMAX; ++which) {
-       save2FontList(xw, name, target, which, "", ttf);
+       save2FontList(xw, name, target, (VTFontEnum) which, "", ttf);
     }
 }
 
@@ -4188,10 +4240,10 @@ freeFontLists(VTFontList * lists)
  * XXX make this allocate the font on demand.
  */
 XTermFonts *
-getNormalFont(TScreen *screen, VTFontEnum which)
+getNormalFont(TScreen *screen, int which)
 {
     XTermFonts *result = 0;
-    if ((int) which >= 0 && which < fMAX)
+    if (which >= 0 && which < fMAX)
        result = &(screen->fnts[which]);
     return result;
 }
@@ -4209,11 +4261,11 @@ getDoubleFont(TScreen *screen, int which)
 
 #if OPT_WIDE_ATTRS || OPT_RENDERWIDE
 XTermFonts *
-getItalicFont(TScreen *screen, VTFontEnum which)
+getItalicFont(TScreen *screen, int which)
 {
     XTermFonts *result = 0;
 #if OPT_WIDE_ATTRS
-    if ((int) which >= 0 && which < fMAX)
+    if (which >= 0 && which < fMAX)
        result = &(screen->ifnts[which]);
 #else
     (void) screen;
@@ -4229,12 +4281,12 @@ getItalicFont(TScreen *screen, VTFontEnum which)
  * XXX make this allocate the font on demand.
  */
 XTermXftFonts *
-getMyXftFont(XtermWidget xw, VTFontEnum which, int fontnum)
+getMyXftFont(XtermWidget xw, int which, int fontnum)
 {
     TScreen *screen = TScreenOf(xw);
     XTermXftFonts *result = 0;
     if (fontnum >= 0 && fontnum < NMENUFONTS) {
-       switch (which) {
+       switch ((VTFontEnum) which) {
        case fNorm:
            result = &(screen->renderFontNorm[fontnum]);
            break;
diff --git a/fontutils.h b/fontutils.h
index fac6759..188cca5 100644
--- a/fontutils.h
+++ b/fontutils.h
@@ -1,4 +1,4 @@
-/* $XTermId: fontutils.h,v 1.118 2017/06/08 23:52:08 tom Exp $ */
+/* $XTermId: fontutils.h,v 1.119 2017/06/19 08:31:10 tom Exp $ */
 
 /*
  * Copyright 1998-2016,2017 by Thomas E. Dickey
@@ -39,8 +39,8 @@
 extern Bool xtermLoadDefaultFonts (XtermWidget /* xw */);
 extern Bool xtermOpenFont (XtermWidget /* xw */, const char */* name */, 
XTermFonts * /* result */, Bool /* force */);
 extern XTermFonts * getDoubleFont (TScreen * /* screen */, int /* which */);
-extern XTermFonts * getItalicFont (TScreen * /* screen */, VTFontEnum /* which 
*/);
-extern XTermFonts * getNormalFont (TScreen * /* screen */, VTFontEnum /* which 
*/);
+extern XTermFonts * getItalicFont (TScreen * /* screen */, int /* which */);
+extern XTermFonts * getNormalFont (TScreen * /* screen */, int /* which */);
 extern const VTFontNames * defaultVTFontNames(XtermWidget /* xw */);
 extern const VTFontNames * xtermFontName (const char */* normal */);
 extern const char * whichFontEnum (VTFontEnum /* value */);
@@ -136,7 +136,7 @@ extern void xtermSaveVTFonts (XtermWidget /* xw */);
 
 #if OPT_RENDERFONT
 extern Bool xtermXftMissing (XtermWidget /* xw */, XftFont * /* font */, 
unsigned /* wc */);
-extern XTermXftFonts *getMyXftFont (XtermWidget /* xw */, VTFontEnum /* which 
*/, int /* fontnum */);
+extern XTermXftFonts *getMyXftFont (XtermWidget /* xw */, int /* which */, int 
/* fontnum */);
 extern XftFont *getXftFont (XtermWidget /* xw */, VTFontEnum /* which */, int 
/* fontnum */);
 extern void xtermCloseXft (TScreen * /* screen */, XTermXftFonts * /* pub */);
 #endif
diff --git a/graphics.c b/graphics.c
index 9c5ec90..4bd50b4 100644
--- a/graphics.c
+++ b/graphics.c
@@ -1,7 +1,7 @@
-/* $XTermId: graphics.c,v 1.72 2017/06/07 00:19:36 Ross.Combs Exp $ */
+/* $XTermId: graphics.c,v 1.73 2017/06/18 18:20:22 tom Exp $ */
 
 /*
- * Copyright 2013-2015,2016 by Ross Combs
+ * Copyright 2013-2016,2017 by Ross Combs
  *
  *                         All Rights Reserved
  *
diff --git a/graphics_regis.c b/graphics_regis.c
index 4ab3fca..ce52b49 100644
--- a/graphics_regis.c
+++ b/graphics_regis.c
@@ -1,4 +1,4 @@
-/* $XTermId: graphics_regis.c,v 1.92 2017/06/11 21:47:52 tom Exp $ */
+/* $XTermId: graphics_regis.c,v 1.96 2017/06/21 01:15:19 tom Exp $ */
 
 /*
  * Copyright 2014-2016,2017 by Ross Combs
@@ -224,6 +224,7 @@ typedef struct RegisParseState {
 #define TEXT_TILT_STATE_GOT_DSD  3U
 
 typedef struct RegisGraphicsContext {
+    XtermWidget current_widget;
     Graphic *destination_graphic;
     Graphic *display_graphic;
     int terminal_id;
@@ -306,6 +307,28 @@ static void get_bitmap_of_character(RegisGraphicsContext 
const *context,
                                    unsigned *w, unsigned *h,
                                    unsigned max_pixels);
 
+static void
+init_regis_load_state(RegisParseState *state)
+{
+    state->load_index = MAX_REGIS_ALPHABETS;
+    state->load_w = 8U;
+    state->load_h = 10U;
+    state->load_alphabet = 1U; /* FIXME: is this the correct default */
+    state->load_name[0] = '\0';
+    state->load_glyph = (unsigned) (unsigned char) '\0';
+    state->load_row = 0U;
+}
+
+static void
+init_regis_parse_state(RegisParseState *state)
+{
+    state->command = '_';
+    state->option = '_';
+    state->stack_next = 0U;
+    state->load_index = MAX_REGIS_ALPHABETS;
+    init_regis_load_state(state);
+}
+
 static int
 ifloor(double d)
 {
@@ -2118,9 +2141,12 @@ get_bitmap_of_character(RegisGraphicsContext const 
*context, int ch,
     unsigned bestmatch;
     char const *fontname = NULL;
 
-    if (context->current_text_controls->alphabet_num == 0) {
+    assert(context);
+    assert(w);
+    assert(h);
+
+    if (context->current_text_controls->alphabet_num == 0)
        fontname = context->builtin_font;
-    }
 
     *w = 0U;
     *h = 0U;
@@ -2710,14 +2736,26 @@ get_fragment(RegisDataFragment const *fragment, 
unsigned pos)
     return '\0';
 }
 
-static size_t
-fragment_len(RegisDataFragment const *fragment)
+#define fragment_length(f) (f)->len
+
+static unsigned
+fragment_remaining(RegisDataFragment const *fragment)
 {
     assert(fragment);
 
+    if (fragment->pos > fragment->len)
+       return 0U;
     return fragment->len - fragment->pos;
 }
 
+static int
+fragment_consumed(RegisDataFragment const *fragment)
+{
+    assert(fragment);
+
+    return fragment->pos >= fragment->len;
+}
+
 static void
 fragment_to_string(RegisDataFragment const *fragment, char *out,
                   unsigned outlen)
@@ -2759,8 +2797,8 @@ skip_regis_whitespace(RegisDataFragment *input)
 
     assert(input);
 
-    for (; input->pos < input->len; input->pos++) {
-       char ch = input->start[input->pos];
+    while (!fragment_consumed(input)) {
+       char ch = peek_fragment(input);
        if (ch != ',' && !IsSpace(ch)) {
            break;
        }
@@ -2768,6 +2806,7 @@ skip_regis_whitespace(RegisDataFragment *input)
            TRACE(("end of input line\n\n"));
        }
        skipped = 1;
+       pop_fragment(input);
     }
 
     if (skipped)
@@ -2920,33 +2959,36 @@ extract_regis_command(RegisDataFragment *input, char 
*command)
 static int
 extract_regis_string(RegisDataFragment *input, char *out, unsigned maxlen)
 {
-    char first_ch;
+    char open_quote_ch;
     char ch;
-    unsigned outlen = 0U;
+    unsigned outlen;
 
     assert(input);
     assert(out);
+    assert(maxlen > 0U);
 
     if (input->pos >= input->len)
        return 0;
 
-    ch = input->start[input->pos];
+    ch = peek_fragment(input);
     if (ch != '\'' && ch != '"')
        return 0;
-    first_ch = ch;
-    input->pos++;
+    open_quote_ch = ch;
+    outlen = 0U;
+    pop_fragment(input);
 
     ch = '\0';
-    for (; input->pos < input->len; input->pos++) {
+    while (!fragment_consumed(input)) {
        char prev_ch = ch;
-       ch = input->start[input->pos];
-       /* ';' (resync) is not recognized in strings */
-       if (prev_ch == first_ch) {
-           if (ch == first_ch) {
+       ch = peek_fragment(input);
+       /* ';' (resync) and '@' (macrograph) are not recognized in strings */
+       if (prev_ch == open_quote_ch) {
+           if (ch == open_quote_ch) {
                if (outlen < maxlen) {
                    out[outlen] = ch;
                }
                outlen++;
+               pop_fragment(input);
                ch = '\0';
                continue;
            }
@@ -2958,14 +3000,15 @@ extract_regis_string(RegisDataFragment *input, char 
*out, unsigned maxlen)
        }
        if (ch == '\0')
            break;
-       if (ch != first_ch) {
-           if (outlen < maxlen) {
+       if (ch != open_quote_ch) {
+           if (outlen < maxlen)
                out[outlen] = ch;
-           }
            outlen++;
        }
+       pop_fragment(input);
     }
-    if (ch == first_ch) {
+    if (ch == open_quote_ch) {
+       pop_fragment(input);
        if (outlen < maxlen)
            out[outlen] = '\0';
        else
@@ -2983,7 +3026,7 @@ extract_regis_parenthesized_data(RegisDataFragment *input,
                                 RegisDataFragment *output)
 {
     char ch;
-    char first_ch;
+    char open_quote_ch;
     int nesting;
 
     assert(input);
@@ -3002,25 +3045,25 @@ extract_regis_parenthesized_data(RegisDataFragment 
*input,
     input->pos++;
     output->start++;
     nesting = 1;
-    first_ch = '\0';
+    open_quote_ch = '\0';
 
     ch = '\0';
     for (; input->pos < input->len; input->pos++, output->len++) {
        char prev_ch = ch;
        ch = input->start[input->pos];
        if (ch == '\'' || ch == '"') {
-           if (first_ch == '\0') {
-               first_ch = ch;
+           if (open_quote_ch == '\0') {
+               open_quote_ch = ch;
            } else {
-               if (ch == prev_ch && prev_ch == first_ch) {
+               if (ch == prev_ch && prev_ch == open_quote_ch) {
                    ch = '\0';
-               } else if (ch == first_ch) {
-                   first_ch = '\0';
+               } else if (ch == open_quote_ch) {
+                   open_quote_ch = '\0';
                }
            }
            continue;
        }
-       if (first_ch != '\0')
+       if (open_quote_ch != '\0')
            continue;
 
        if (ch == ';') {
@@ -3051,7 +3094,7 @@ extract_regis_option(RegisDataFragment *input,
 {
     char ch;
     int paren_level, bracket_level;
-    char first_ch;
+    char open_quote_ch;
 
     assert(input);
     assert(option);
@@ -3086,21 +3129,21 @@ extract_regis_option(RegisDataFragment *input,
     paren_level = 0;
     bracket_level = 0;
 
-    first_ch = '\0';
+    open_quote_ch = '\0';
     for (; input->pos < input->len; input->pos++, output->len++) {
        ch = input->start[input->pos];
        TRACE(("looking at char '%c' in option '%c'\n", ch, *option));
        /* FIXME: any special rules for commas? */
        /* FIXME: handle escaped quotes */
        if (ch == '\'' || ch == '"') {
-           if (first_ch == ch) {
-               first_ch = '\0';
+           if (open_quote_ch == ch) {
+               open_quote_ch = '\0';
            } else {
-               first_ch = ch;
+               open_quote_ch = ch;
            }
            continue;
        }
-       if (first_ch != '\0')
+       if (open_quote_ch != '\0')
            continue;
        if (ch == '(') {
            paren_level++;
@@ -3165,6 +3208,9 @@ regis_num_to_int(RegisDataFragment const *input, int *out)
 {
     char ch;
 
+    assert(input);
+    assert(out);
+
     /* FIXME: handle exponential notation and rounding */
     /* FIXME: check for junk after the number */
     ch = peek_fragment(input);
@@ -3198,15 +3244,21 @@ load_regis_colorspec(RegisGraphicsContext const 
*context,
     short l = -1;
     int simple;
 
+    assert(context);
+    assert(input);
+    assert(r_out);
+    assert(g_out);
+    assert(b_out);
+
     copy_fragment(&colorspec, input);
     TRACE(("colorspec option: \"%s\"\n", fragment_to_tempstr(&colorspec)));
 
     skip_regis_whitespace(&colorspec);
     simple = 0;
-    if (fragment_len(&colorspec) == 1) {
+    if (fragment_remaining(&colorspec) == 1U) {
        simple = 1;
-    } else if (fragment_len(&colorspec) > 1) {
-       char after = get_fragment(&colorspec, 1);
+    } else if (fragment_remaining(&colorspec) > 1U) {
+       char after = get_fragment(&colorspec, 1U);
        if (IsSpace(after))
            simple = 1;
     }
@@ -3273,7 +3325,7 @@ load_regis_colorspec(RegisGraphicsContext const *context,
            l = 100;
            break;
        default:
-           TRACE(("unknown RGB color name: \"%c\"\n", ch));
+           TRACE(("DATA_ERROR: unknown RGB color name: \"%c\"\n", ch));
            return 0;
        }
     } else {
@@ -3283,7 +3335,7 @@ load_regis_colorspec(RegisGraphicsContext const *context,
        short h = -1;
        short s = -1;
 
-       while (colorspec.pos < colorspec.len) {
+       while (!fragment_consumed(&colorspec)) {
            if (skip_regis_whitespace(&colorspec))
                continue;
 
@@ -3325,13 +3377,15 @@ load_regis_colorspec(RegisGraphicsContext const 
*context,
                break;
 #endif
            default:
-               TRACE(("unrecognized character in colorspec: \"%c\"\n", comp));
+               TRACE(("DATA_ERROR: unrecognized component in colorspec: 
'%c'\n",
+                      comp));
                return 0;
            }
 
            skip_regis_whitespace(&colorspec);
            if (!extract_regis_num(&colorspec, &num)) {
-               TRACE(("unrecognized character in colorspec: \"%c\"\n", comp));
+               TRACE(("DATA_ERROR: expected int after '%c' component in 
colorspec: \"%s\"\n",
+                      comp, fragment_to_tempstr(&colorspec)));
                return 0;
            }
            if (!regis_num_to_int(&num, &val)) {
@@ -3382,7 +3436,7 @@ load_regis_colorspec(RegisGraphicsContext const *context,
            hls2rgb(0, l, 0, &r, &g, &b);
            TRACE(("converted to RGB: %hd,%hd,%hd\n", r, g, b));
        } else {
-           TRACE(("unrecognized colorspec format\n"));
+           TRACE(("DATA_ERROR: unrecognized colorspec format\n"));
            return 0;
        }
     }
@@ -3400,7 +3454,7 @@ load_regis_colorspec(RegisGraphicsContext const *context,
     *b_out = b;
 
     skip_regis_whitespace(&colorspec);
-    if (colorspec.pos < colorspec.len) {
+    if (!fragment_consumed(&colorspec)) {
        char skip;
 
        skip = pop_fragment(&colorspec);
@@ -3450,7 +3504,7 @@ load_regis_regnum_or_colorspec(RegisGraphicsContext const 
*context,
        *out = (RegisterNum) val;
 
        skip_regis_whitespace(&colorspec);
-       if (colorspec.pos < colorspec.len) {
+       if (!fragment_consumed(&colorspec)) {
            char skip;
 
            skip = pop_fragment(&colorspec);
@@ -3757,10 +3811,12 @@ load_regis_coord_pixelvector(RegisGraphicsContext const 
*context,
                             int origx, int origy,
                             int *xloc, int *yloc)
 {
-    const int mul = (int) (context->temporary_write_controls.pv_multiplier * 
COORD_SCALE);
+    const int mul = (int) (context->temporary_write_controls.pv_multiplier
+                          * COORD_SCALE);
     int found = 0;
     int ux = 0, uy = 0;
     unsigned offset = 0U;
+
     while (load_regis_raw_pixelvector_digit(pixelvector, &offset,
                                            &ux, &uy,
                                            mul))
@@ -3793,7 +3849,8 @@ load_regis_coord_pixelvector_step(RegisGraphicsContext 
const *context,
                                  int origx, int origy,
                                  int *xloc, int *yloc)
 {
-    const int mul = (int) (context->temporary_write_controls.pv_multiplier * 
COORD_SCALE);
+    const int mul = (int) (context->temporary_write_controls.pv_multiplier
+                          * COORD_SCALE);
     int found = 0;
     int ux = 0, uy = 0;
     if (load_regis_raw_pixelvector_digit(pixelvector, offset, &ux, &uy, mul))
@@ -3944,7 +4001,7 @@ load_regis_write_control(RegisParseState *state,
            RegisDataFragment item;
            char suboption;
 
-           while (arg->pos < arg->len) {
+           while (!fragment_consumed(arg)) {
                if (skip_regis_whitespace(arg))
                    continue;
 
@@ -3953,7 +4010,7 @@ load_regis_write_control(RegisParseState *state,
                if (extract_regis_parenthesized_data(arg, &suboptionset)) {
                    TRACE(("got write pattern suboptionset: \"%s\"\n",
                           fragment_to_tempstr(&suboptionset)));
-                   while (suboptionset.pos < suboptionset.len) {
+                   while (!fragment_consumed(&suboptionset)) {
                        skip_regis_whitespace(&suboptionset);
                        if (extract_regis_option(&suboptionset, &suboption,
                                                 &suboptionarg)) {
@@ -3984,7 +4041,7 @@ load_regis_write_control(RegisParseState *state,
                                        skip_regis_whitespace(&suboptionarg);
                                    }
 
-                                   if (fragment_len(&suboptionarg)) {
+                                   if (!fragment_consumed(&suboptionarg)) {
                                        TRACE(("DATA_ERROR: unknown content 
after pattern multiplier \"%s\"\n",
                                               
fragment_to_tempstr(&suboptionarg)));
                                        return 0;
@@ -4133,7 +4190,7 @@ load_regis_write_control(RegisParseState *state,
            int ref_x = cur_x, ref_y = cur_y;
            int shading_enabled = 0;
 
-           while (arg->pos < arg->len) {
+           while (!fragment_consumed(arg)) {
                if (skip_regis_whitespace(arg))
                    continue;
 
@@ -4155,7 +4212,7 @@ load_regis_write_control(RegisParseState *state,
                    skip_regis_whitespace(&suboptionset);
                    TRACE(("got shading control suboptionset: \"%s\"\n",
                           fragment_to_tempstr(&suboptionset)));
-                   while (suboptionset.pos < suboptionset.len) {
+                   while (!fragment_consumed(&suboptionset)) {
                        if (skip_regis_whitespace(&suboptionset))
                            continue;
                        if (extract_regis_option(&suboptionset, &suboption,
@@ -4168,7 +4225,7 @@ load_regis_write_control(RegisParseState *state,
                            case 'x':
                                TRACE(("found horizontal shading suboption 
\"%s\"\n",
                                       fragment_to_tempstr(&suboptionarg)));
-                               if (fragment_len(&suboptionarg)) {
+                               if (!fragment_consumed(&suboptionarg)) {
                                    TRACE(("DATA_ERROR: unexpected value to 
horizontal shading suboption FIXME\n"));
                                    return 0;
                                }
@@ -4278,14 +4335,14 @@ load_regis_write_control_set(RegisParseState *state,
     RegisDataFragment arg;
     char option;
 
-    while (controls->pos < controls->len) {
+    while (!fragment_consumed(controls)) {
        if (skip_regis_whitespace(controls))
            continue;
 
        if (extract_regis_parenthesized_data(controls, &optionset)) {
            TRACE(("got write control optionset: \"%s\"\n",
                   fragment_to_tempstr(&optionset)));
-           while (optionset.pos < optionset.len) {
+           while (!fragment_consumed(&optionset)) {
                skip_regis_whitespace(&optionset);
                if (extract_regis_option(&optionset, &option, &arg)) {
                    skip_regis_whitespace(&arg);
@@ -4361,21 +4418,23 @@ map_regis_graphics_pages(XtermWidget xw, 
RegisGraphicsContext *context)
        old_display_id = context->display_graphic->id;
     }
 
-    context->destination_graphic = get_new_or_matching_graphic(xw,
-                                                              charrow, charcol,
-                                                              context->width,
-                                                              context->height,
-                                                              
context->destination_page);
+    context->destination_graphic =
+       get_new_or_matching_graphic(xw,
+                                   charrow, charcol,
+                                   context->width,
+                                   context->height,
+                                   context->destination_page);

Reply via email to