The reStructuredText (ReST) format is still quite readable as raw text,
and is much more capable than the myriad all-slightly-incompatible
variants of Markdown.
Also work around buggy implementations of strfmon() that do not copy
complete multibyte sequences that may be part of a locale's
mon_thousands_sep, thousands_sep, mon_decimal_point or decimal_point.
Current and previous versions of ISO/IEC 9945-1 (POSIX), particularly SUSv3
(2001) and SUSv4 (2008), require strfmon() to return rather meaningless
strings when used with the POSIX "C" locale. In particular, the standard
POSIX locale does not define a currency symbol, a monetary radix symbol
(decimal point) or a negative sign. This means strfmon(..., "%n", -123.45)
is supposed to produce "12345" instead of something like "$-123.45"!
The new xstrfmon() overcomes these limitations by using snprintf() as
appropriate.
This makes the main source code look a little cleaner, at the expense of
background magic happening in the configure-generated config.h. But this
magic was already happening for _GNU_SOURCE, __EXTENSIONS__ and the like.
The only wrinkle is that newer versions of NcursesW cause ./configure to
include "-D_XOPEN_SOURCE=600" as part of the compilation command line--on
systems that support _XOPEN_SOURCE=700. The AC_DEFINE/AC_DEFINE_UNQUOTED
macros automatically comment out any "#undef" lines in config.h, so the
file lib/xopen_source.h works around this limitation. It is
automatically included by config.h.
The Minix C library does not seem to support Unicode well (for example,
wcwidth() returns -1 for UTF-8 byte sequences), the native curses library
is quite buggy, playing around with the Gnulib wcwidth module did not fix
issues with Unicode--it's all in the "too hard" basket!
Note that although Star Traders compiles and installs successfully,
running the binary with a locale set to use non-ASCII strings currently
fails with "mkchstr: 'STRING': Illegal byte sequence" ("STRING" being the
translated string).
Rewrite a check that unscramble_table[] is of the right size as an
assertion, which prevents Clang from issuing a warning that the "result
of comparison of constant 256 with expression of type 'const unsigned
char' is always false".
Oh for the day that C11's _Static_assert can be used amongst all
compilers! But perhaps Gnulib's assert-h module can be used instead...
This version of the AX_CFLAGS_WARN_ALL macro uses a far more robust
method of detecting compilers to select appropriate warning flags. It
also uses the AX_PREPEND_FLAG macro instead of AX_APPEND_FLAG.
This version of ax_cflags_warn_all.m4 (and ax_prepend_flag.m4) has been
submitted upstream; see https://savannah.gnu.org/patch/?9673 for details.
The function wctob() returns an int that can be -1; a conversion to
unsigned char will make that value 0xFF. Although the "if" statement
still works in this case, we should be more diligent in our programming.
Arithmetic on void * pointers is undefined, according to Section 6.5.6
Paragraph 2, Section 6.2.5 Paragraph 1 and Section 6.2.5 Paragraph 19 of
the ISO/IEC 9899:1999 C99 standard: the void type is incomplete and thus
its size cannot be determined.
GCC allows pointer arithmetic on void * as an extension (and only warns
if "-Wpointer-arith" is given); the Oracle Developer Studio C compiler
issues a warning by default.