Author: yuripv
Date: Sat Oct 27 23:31:42 2018
New Revision: 339827
URL: https://svnweb.freebsd.org/changeset/base/339827

Log:
  localedef: define characters in "space" class also as "print", except
  for the known conflicts ("control" characters can't be "print"able).
  POSIX doesn't explicitly forbid this, and actually includes <space>
  character in "print".
  
  PR:           225692
  Reviewed by:  bapt, cem (previous version), pfg (previous version)
  Approved by:  kib (mentor)
  Differential Revision:        https://reviews.freebsd.org/D17467

Modified:
  head/usr.bin/localedef/ctype.c

Modified: head/usr.bin/localedef/ctype.c
==============================================================================
--- head/usr.bin/localedef/ctype.c      Sat Oct 27 21:24:28 2018        
(r339826)
+++ head/usr.bin/localedef/ctype.c      Sat Oct 27 23:31:42 2018        
(r339827)
@@ -120,7 +120,13 @@ add_ctype_impl(ctype_node_t *ctn)
                ctn->ctype |= (_ISDIGIT | _ISGRAPH | _ISPRINT | _ISXDIGIT | 
_E4);
                break;
        case T_ISSPACE:
-               ctn->ctype |= _ISSPACE;
+               /*
+                * This can be troublesome as <form-feed>, <newline>,
+                * <carriage-return>, <tab>, and <vertical-tab> are defined both
+                * as space and cntrl, and POSIX doesn't allow cntrl/print
+                * combination.  We will take care of this in dump_ctype().
+                */
+               ctn->ctype |= (_ISSPACE | _ISPRINT);
                break;
        case T_ISCNTRL:
                ctn->ctype |= _ISCNTRL;
@@ -378,9 +384,15 @@ dump_ctype(void)
                        ctn->ctype |= _ISPRINT;
 
                /*
-                * Finally, POSIX requires that certain combinations
-                * are invalid.  We don't flag this as a fatal error,
-                * but we will warn about.
+                * POSIX requires that certain combinations are invalid.
+                * Try fixing the cases we know about (see add_ctype_impl()).
+                */
+               if ((ctn->ctype & (_ISSPACE|_ISCNTRL)) == (_ISSPACE|_ISCNTRL))
+                       ctn->ctype &= ~_ISPRINT;
+
+               /*
+                * Finally, don't flag remaining cases as a fatal error,
+                * and just warn about them.
                 */
                if ((ctn->ctype & _ISALPHA) &&
                    (ctn->ctype & (_ISPUNCT|_ISDIGIT)))
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to