msgunfmt works properly with escaped hex.
This commit is contained in:
parent
17e50f2642
commit
53f2a2da2a
|
@ -137,7 +137,7 @@ set ( CFILES
|
|||
${SRCDIR}/buffio.c ${SRCDIR}/fileio.c ${SRCDIR}/streamio.c
|
||||
${SRCDIR}/tagask.c ${SRCDIR}/tmbstr.c ${SRCDIR}/utf8.c
|
||||
${SRCDIR}/tidylib.c ${SRCDIR}/mappedio.c ${SRCDIR}/gdoc.c
|
||||
${SRCDIR}/language.c ${SRCDIR}/win_vsnprintf.c )
|
||||
${SRCDIR}/language.c )
|
||||
set ( HFILES
|
||||
${INCDIR}/tidyplatform.h ${INCDIR}/tidy.h ${INCDIR}/tidyenum.h
|
||||
${INCDIR}/tidybuffio.h )
|
||||
|
|
|
@ -1,51 +0,0 @@
|
|||
Building with MinGW
|
||||
===================
|
||||
|
||||
Currently building with MinGW on Windows is a bit complicated, and these
|
||||
assumptions are made:
|
||||
|
||||
1. Using MinGW as distributed from [http://mingw.org](http://mingw.org).
|
||||
2. Using default install path (C:\MinGW)
|
||||
|
||||
|
||||
Pre-Build Instructions
|
||||
----------------------
|
||||
|
||||
**Copy the file `specs` into `C:\MinGW\lib\gcc\<version>\specs`**
|
||||
|
||||
This file was generated with `gcc-dumpspecs > specs`, and then modified to add
|
||||
`-lmsvcrt_tidy` to the `*libgcc:` linking section.
|
||||
|
||||
|
||||
**Copy the file `libmsvcrt_tidy.a` into `C:\MinGW\lib\`** (or someplace else you
|
||||
know is included in gcc's library search path).
|
||||
|
||||
This file is the import library for `msvcrt.dll` that includes the missing
|
||||
definitions not included in MinGW's own import library. It was generated via
|
||||
`dlltool -v -d msvcrt.def -l libmsvcrt_tidy.a --dllname %windir%\System32\msvcrt.dll`.
|
||||
The `msvcrt.def` file is available in the `mingw` directory, too.
|
||||
|
||||
You can inspect MS' `msvcrt.dll` with `dumpbin /exports C:\Windows\System32\msvcrt.dll`
|
||||
in the Visual Studio Command Prompt (not CMD).
|
||||
|
||||
|
||||
Build
|
||||
-----
|
||||
|
||||
`cmake ..\.. -G "MinGW Makefiles"`
|
||||
`mingw32-make`
|
||||
|
||||
|
||||
Todo
|
||||
----
|
||||
|
||||
Obviously this isn't a fun solution. Some help configuring CMake to include the
|
||||
import library would be appreciated.
|
||||
|
||||
Also I'm not certain we should be distributing the import library as part of the
|
||||
source. Would it be better to distribute the `msvcrt.def` as part of the source
|
||||
and build the import library with `dlltool` as part of the build process?
|
||||
|
||||
|
||||
|
||||
|
Binary file not shown.
|
@ -1,4 +0,0 @@
|
|||
LIBRARY msvcrt.dll
|
||||
EXPORTS
|
||||
_vscprintf_p_l
|
||||
_vsprintf_p
|
|
@ -1,147 +0,0 @@
|
|||
*asm:
|
||||
|
||||
|
||||
*asm_debug:
|
||||
%{!g0:%{gstabs*:--gstabs}%{!gstabs*:%{g*:--gdwarf2}}} %{fdebug-prefix-map=*:--debug-prefix-map %*}
|
||||
|
||||
*asm_final:
|
||||
%{gsplit-dwarf:
|
||||
objcopy --extract-dwo %{c:%{o*:%*}%{!o*:%b%O}}%{!c:%U%O} %{c:%{o*:%:replace-extension(%{o*:%*} .dwo)}%{!o*:%b.dwo}}%{!c:%b.dwo}
|
||||
objcopy --strip-dwo %{c:%{o*:%*}%{!o*:%b%O}}%{!c:%U%O} }
|
||||
|
||||
*asm_options:
|
||||
%{-target-help:%:print-asm-header()} %{v} %{w:-W} %{I*} %a %Y %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O}
|
||||
|
||||
*invoke_as:
|
||||
%{!fwpa: %{fcompare-debug=*|fdump-final-insns=*:%:compare-debug-dump-opt()} %{!S:-o %|.s |
|
||||
as %(asm_options) %m.s %A } }
|
||||
|
||||
*cpp:
|
||||
%{posix:-D_POSIX_SOURCE} %{mthreads:-D_MT} %{pthread:-D_REENTRANT} %{!no-pthread: }
|
||||
|
||||
*cpp_options:
|
||||
%(cpp_unique_options) %1 %{m*} %{std*&ansi&trigraphs} %{W*&pedantic*} %{w} %{f*} %{g*:%{!g0:%{g*} %{!fno-working-directory:-fworking-directory}}} %{O*} %{undef} %{save-temps*:-fpch-preprocess}
|
||||
|
||||
*cpp_debug_options:
|
||||
%{d*}
|
||||
|
||||
*cpp_unique_options:
|
||||
%{!Q:-quiet} %{nostdinc*} %{C} %{CC} %{v} %{I*&F*} %{P} %I %{MD:-MD %{!o:%b.d}%{o*:%.d%*}} %{MMD:-MMD %{!o:%b.d}%{o*:%.d%*}} %{M} %{MM} %{MF*} %{MG} %{MP} %{MQ*} %{MT*} %{!E:%{!M:%{!MM:%{!MT:%{!MQ:%{MD|MMD:%{o*:-MQ %*}}}}}}} %{remap} %{g3|ggdb3|gstabs3|gcoff3|gxcoff3|gvms3:-dD} %{!iplugindir*:%{fplugin*:%:find-plugindir()}} %{H} %C %{D*&U*&A*} %{i*} %Z %i %{fmudflap:-D_MUDFLAP -include mf-runtime.h} %{fmudflapth:-D_MUDFLAP -D_MUDFLAPTH -include mf-runtime.h} %{E|M|MM:%W{o*}}
|
||||
|
||||
*trad_capable_cpp:
|
||||
cc1 -E %{traditional|traditional-cpp:-traditional-cpp}
|
||||
|
||||
*cc1:
|
||||
%(cc1_cpu)
|
||||
|
||||
*cc1_options:
|
||||
%{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}} %{!iplugindir*:%{fplugin*:%:find-plugindir()}} %1 %{!Q:-quiet} %{!dumpbase:-dumpbase %B} %{d*} %{m*} %{aux-info*} %{fcompare-debug-second:%:compare-debug-auxbase-opt(%b)} %{!fcompare-debug-second:%{c|S:%{o*:-auxbase-strip %*}%{!o*:-auxbase %b}}}%{!c:%{!S:-auxbase %b}} %{g*} %{O*} %{W*&pedantic*} %{w} %{std*&ansi&trigraphs} %{v:-version} %{pg:-p} %{p} %{f*} %{undef} %{Qn:-fno-ident} %{Qy:} %{-help:--help} %{-target-help:--target-help} %{-version:--version} %{-help=*:--help=%*} %{!fsyntax-only:%{S:%W{o*}%{!o*:-o %b.s}}} %{fsyntax-only:-o %j} %{-param*} %{fmudflap|fmudflapth:-fno-builtin -fno-merge-constants} %{coverage:-fprofile-arcs -ftest-coverage}
|
||||
|
||||
*cc1plus:
|
||||
|
||||
|
||||
*link_gcc_c_sequence:
|
||||
%G %L %G
|
||||
|
||||
*link_ssp:
|
||||
%{fstack-protector|fstack-protector-all:-lssp_nonshared -lssp}
|
||||
|
||||
*endfile:
|
||||
%{Ofast|ffast-math|funsafe-math-optimizations:crtfastmath.o%s} crtend.o%s
|
||||
|
||||
*link:
|
||||
%{mwindows:--subsystem windows} %{mconsole:--subsystem console} %{shared: %{mdll: %eshared and mdll are not compatible}} %{shared: --shared} %{mdll:--dll} %{static:-Bstatic} %{!static:-Bdynamic} %{shared|mdll: -e _DllMainCRTStartup@12 --enable-auto-image-base} %(shared_libgcc_undefs)
|
||||
|
||||
*lib:
|
||||
%{pg:-lgmon} %{pthread:-lpthread} %{!no-pthread: } %{mwindows:-lgdi32 -lcomdlg32} -ladvapi32 -lshell32 -luser32 -lkernel32
|
||||
|
||||
*mfwrap:
|
||||
%{static: %{fmudflap|fmudflapth: --wrap=malloc --wrap=free --wrap=calloc --wrap=realloc --wrap=mmap --wrap=mmap64 --wrap=munmap --wrap=alloca} %{fmudflapth: --wrap=pthread_create}} %{fmudflap|fmudflapth: --wrap=main}
|
||||
|
||||
*mflib:
|
||||
%{fmudflap|fmudflapth: -export-dynamic}
|
||||
|
||||
*link_gomp:
|
||||
|
||||
|
||||
*libgcc:
|
||||
%{mthreads:-lmingwthrd} -lmingw32 %{static|static-libgcc:-lgcc -lgcc_eh} %{!static: %{!static-libgcc: %{!shared: %{!shared-libgcc:-lgcc -lgcc_eh} %{shared-libgcc:-lgcc_s -lgcc} } %{shared:-lgcc_s -lgcc} } } -lmoldname -lmingwex -lmsvcrt -lmsvcrt_tidy
|
||||
|
||||
*startfile:
|
||||
%{shared|mdll:dllcrt2%O%s} %{!shared:%{!mdll:crt2%O%s}} %{pg:gcrt2%O%s} crtbegin.o%s
|
||||
|
||||
*cross_compile:
|
||||
0
|
||||
|
||||
*version:
|
||||
4.8.1
|
||||
|
||||
*multilib:
|
||||
. ;
|
||||
|
||||
*multilib_defaults:
|
||||
|
||||
|
||||
*multilib_extra:
|
||||
|
||||
|
||||
*multilib_matches:
|
||||
|
||||
|
||||
*multilib_exclusions:
|
||||
|
||||
|
||||
*multilib_options:
|
||||
|
||||
|
||||
*multilib_reuse:
|
||||
|
||||
|
||||
*linker:
|
||||
collect2
|
||||
|
||||
*linker_plugin_file:
|
||||
|
||||
|
||||
*lto_wrapper:
|
||||
|
||||
|
||||
*lto_gcc:
|
||||
|
||||
|
||||
*link_libgcc:
|
||||
%D
|
||||
|
||||
*md_exec_prefix:
|
||||
|
||||
|
||||
*md_startfile_prefix:
|
||||
|
||||
|
||||
*md_startfile_prefix_1:
|
||||
|
||||
|
||||
*startfile_prefix_spec:
|
||||
|
||||
|
||||
*sysroot_spec:
|
||||
--sysroot=%R
|
||||
|
||||
*sysroot_suffix_spec:
|
||||
|
||||
|
||||
*sysroot_hdrs_suffix_spec:
|
||||
|
||||
|
||||
*self_spec:
|
||||
|
||||
|
||||
*cc1_cpu:
|
||||
%{march=native:%>march=native %:local_cpu_detect(arch) %{!mtune=*:%>mtune=native %:local_cpu_detect(tune)}} %{mtune=native:%>mtune=native %:local_cpu_detect(tune)}
|
||||
|
||||
*shared_libgcc_undefs:
|
||||
%{shared-libgcc: -u ___register_frame_info -u ___deregister_frame_info}
|
||||
|
||||
*link_command:
|
||||
%{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S: %(linker) %{!fno-use-linker-plugin:%{flto|flto=*|fuse-linker-plugin: -plugin %(linker_plugin_file) -plugin-opt=%(lto_wrapper) -plugin-opt=-fresolution=%u.res %{!nostdlib:%{!nodefaultlibs:%:pass-through-libs(%(link_gcc_c_sequence))}} }}%{flto|flto=*:%<fcompare-debug*} %{flto} %{flto=*} %l %{pie:-pie} %{fuse-ld=*:-fuse-ld=%*} %X %{o*} %{e*} %{N} %{n} %{r} %{s} %{t} %{u*} %{z} %{Z} %{!nostdlib:%{!nostartfiles:%S}} %{static:} %{L*} %(mfwrap) %(link_libgcc) %{!nostdlib:%{!nodefaultlibs:%{fsanitize=address:} %{fsanitize=thread:}}} %o %{fopenmp|ftree-parallelize-loops=*:%:include(libgomp.spec)%(link_gomp)} %{fgnu-tm:%:include(libitm.spec)%(link_itm)} %(mflib) %{fsplit-stack: --wrap=pthread_create} %{fprofile-arcs|fprofile-generate*|coverage:-lgcov} %{!nostdlib:%{!nodefaultlibs:%{fsanitize=address:%{static-libasan:-Bstatic} -lasan %{static-libasan:-Bdynamic} %{static:%ecannot specify -static with -fsanitize=address} %{fsanitize=thread:%e-fsanitize=address is incompatible with -fsanitize=thread}} %{fsanitize=thread:%{static-libtsan:-Bstatic} -ltsan %{static-libtsan:-Bdynamic} %{!pie:%{!shared:%e-fsanitize=thread linking must be done with -pie or -shared}}}}} %{!nostdlib:%{!nodefaultlibs:%(link_ssp) %(link_gcc_c_sequence)}} %{!nostdlib:%{!nostartfiles:%E}} %{T*} }}}}}}
|
||||
|
|
@ -13,11 +13,9 @@
|
|||
#include "locale.h"
|
||||
#if defined(_WIN32)
|
||||
#include <windows.h> /* Force console to UTF8. */
|
||||
/* Windows requires special help for printf positional format specifiers. */
|
||||
#include "win_vsnprintf.h"
|
||||
#define nest_(x) TY_(x)
|
||||
#define printf nest_(win_printf)
|
||||
#define fprint nest_(win_fprintf)
|
||||
//#define nest_(x) TY_(x)
|
||||
//#define printf nest_(win_printf)
|
||||
//#define fprint nest_(win_fprintf)
|
||||
#endif
|
||||
#if !defined(NDEBUG) && defined(_MSC_VER)
|
||||
#include "sprtf.h"
|
||||
|
|
|
@ -450,7 +450,7 @@ extern "C" {
|
|||
#define utimbuf _utimbuf /* Windows seems to want utimbuf */
|
||||
#define stat _stat
|
||||
#define utime _utime
|
||||
#define vsnprintf prvTidywin_vsnprintf
|
||||
#define vsnprintf _vsnprintf
|
||||
#endif /* _WIN32 */
|
||||
|
||||
#endif /* PRESERVE_FILE_TIMES */
|
||||
|
|
|
@ -365,8 +365,12 @@ module PoConvertModule
|
|||
self.items[l_key][num_case][:comment] = comment
|
||||
self.items[l_key][num_case][:case] = num_case
|
||||
self.items[l_key][num_case][:if_group] = nil
|
||||
tmp = ''
|
||||
string.each_line { |line| tmp << line.lstrip }
|
||||
# Reconstitute Hex Escapes
|
||||
tmp = string.each_line.collect do |line|
|
||||
line.lstrip.gsub(/\\x(..)/) { |g| [$1.hex].pack('c*').force_encoding('UTF-8') }
|
||||
end
|
||||
# Eliminate C double-double-quotes.
|
||||
tmp = tmp.join.gsub(/""/) { |g| }
|
||||
self.items[l_key][num_case][:string] = tmp
|
||||
end
|
||||
if !self.items || self.items.empty?
|
||||
|
@ -403,6 +407,7 @@ module PoConvertModule
|
|||
include PoConvertModule
|
||||
|
||||
attr_accessor :emacs_footer
|
||||
attr_accessor :plaintext
|
||||
|
||||
#########################################################
|
||||
# initialize
|
||||
|
@ -411,6 +416,7 @@ module PoConvertModule
|
|||
@po_locale = nil # The locale to use to generate PO files.
|
||||
@known_locales = {} # The locales we know about.
|
||||
@emacs_footer = false # Indicates whether or not to add emacs instructions.
|
||||
@plaintext = false # Indicates whether or not we should stick to plaintext.
|
||||
end
|
||||
|
||||
|
||||
|
@ -777,18 +783,23 @@ msgstr ""
|
|||
end
|
||||
end
|
||||
|
||||
# Gather some information to format this nicely.
|
||||
|
||||
# Gather some information to format this nicely, and perform
|
||||
# UTF escaping if necessary.
|
||||
longest_key = 22 # length of TIDY_MESSAGE_TYPE_LAST.
|
||||
longest_value = 10 # reasonable default in case no single-line strings are found.
|
||||
po_content.items.each do |key, value|
|
||||
longest_key = key.length if key.length > longest_key
|
||||
value.each_value do |value_inner|
|
||||
value_inner[:string].gsub!(/[^\u0000-\u007e][0-9a-fA-F]?/) do |c|
|
||||
esc = c[0].bytes.map{ |b| '\\x' + b.to_s(16) }.join('')
|
||||
if c[1]
|
||||
esc += '""' + c[1]
|
||||
# If we're not plaintext then escape UTF sequences.
|
||||
unless plaintext
|
||||
value_inner[:string].gsub!(/[^\u0000-\u007e][0-9a-fA-F]?/) do |c|
|
||||
esc = c[0].bytes.map{ |b| '\\x' + b.to_s(16) }.join('')
|
||||
if c[1]
|
||||
esc += '""' + c[1]
|
||||
end
|
||||
esc
|
||||
end
|
||||
esc
|
||||
end
|
||||
length = value_inner[:string].length
|
||||
longest_value = length if length > longest_value && !value_inner[:string].start_with?("\n")
|
||||
|
@ -875,7 +886,7 @@ msgstr ""
|
|||
File.rename(output_file, safe_backup_name(output_file))
|
||||
end
|
||||
File.open(output_file, 'w') do |f|
|
||||
#f.write "\uFEFF" # MSVC requires a BOM.
|
||||
f.write "\uFEFF" if plaintext # MSVC requires a BOM.
|
||||
f.write(report)
|
||||
end
|
||||
@@log.info "#{__method__}: Results written to #{output_file}"
|
||||
|
@ -1026,10 +1037,12 @@ Complete Help:
|
|||
desc 'msgunfmt <input_file.h>', 'Converts an existing Tidy header H file to PO format.'
|
||||
long_desc <<-LONG_DESC
|
||||
Converts an existing Tidy header H file to a PO file using the locale
|
||||
specified in the H file. Specifying <input_file.h> is required. The
|
||||
resulting file will consist of English original strings, the translated
|
||||
strings from the header, and blank translated strings if not specified in
|
||||
the header.
|
||||
specified in the H file. Specifying <input_file.h> is required, and
|
||||
multiple input files may be specified.
|
||||
|
||||
The resulting file will consist of English original strings, the
|
||||
translated strings from the header, and blank translated strings if not
|
||||
specified in the header.
|
||||
|
||||
You can use the --baselang option to gather the untranslated strings from
|
||||
a different header file. This may be useful for translators that want to
|
||||
|
@ -1039,14 +1052,20 @@ Complete Help:
|
|||
Use case: create a PO file from an existing Tidy header H file using a
|
||||
combination of languages that are suitable to you.
|
||||
LONG_DESC
|
||||
def msgunfmt(input_file = nil)
|
||||
converter = PoConverter.new
|
||||
converter.emacs_footer = options[:emacs]
|
||||
set_options
|
||||
if converter.convert_to_po( input_file, options[:baselang] )
|
||||
def msgunfmt(*args)
|
||||
error_count = 0
|
||||
|
||||
args.each do |input_file|
|
||||
converter = PoConverter.new
|
||||
converter.emacs_footer = options[:emacs]
|
||||
set_options
|
||||
error_count = converter.convert_to_po(input_file, options[:baselang]) ? error_count : error_count + 1
|
||||
end
|
||||
|
||||
if error_count == 0
|
||||
puts 'msgunfmt exited without errors.'
|
||||
else
|
||||
puts 'msgunfmt exited with errors. Consider using the --verbose or --debug options.'
|
||||
puts "msgunfmt exited with errors #{error_count} time(s). Consider using the --verbose or --debug options."
|
||||
exit 1
|
||||
end
|
||||
end # msgunfmt
|
||||
|
@ -1060,10 +1079,14 @@ Complete Help:
|
|||
:type => :string,
|
||||
:desc => 'Specifies a base language <file.h> from which to exclude translated strings.',
|
||||
:aliases => '-b'
|
||||
option :plaintext,
|
||||
:type => :boolean,
|
||||
:desc => 'Specifies that the generated file contain plain text instead of hex escaped characters.',
|
||||
:aliases => '-p'
|
||||
desc 'msgfmt <input_file.po>', 'Creates a Tidy header H file from the given PO file.'
|
||||
long_desc <<-LONG_DESC
|
||||
Creates a Tidy header H file from the specified <input_file.po> PO file,
|
||||
which is a required argument.
|
||||
which is a required argument. Multiple input files may be specified.
|
||||
|
||||
You can use the --baselang option to exclude already translated strings from an
|
||||
inherited base language. This will help keep Tidy's library and executable size
|
||||
|
@ -1075,13 +1098,20 @@ Complete Help:
|
|||
Use case: Tidy can only build H files, and so this command will convert
|
||||
PO files to something useful.
|
||||
LONG_DESC
|
||||
def msgfmt(input_file)
|
||||
converter = PoConverter.new
|
||||
set_options
|
||||
if converter.convert_to_h( input_file, options[:baselang] )
|
||||
def msgfmt(*args)
|
||||
error_count = 0
|
||||
|
||||
args.each do |input_file|
|
||||
converter = PoConverter.new
|
||||
converter.plaintext = options[:plaintext]
|
||||
set_options
|
||||
error_count = converter.convert_to_h( input_file, options[:baselang] ) ? error_count : error_count + 1
|
||||
end
|
||||
|
||||
if error_count == 0
|
||||
puts 'msgfmt exited without errors.'
|
||||
else
|
||||
puts 'msgfmt exited with errors. Consider using the --verbose or --debug options.'
|
||||
puts "msgfmt exited with errors #{error_count} time(s). Consider using the --verbose or --debug options."
|
||||
exit 1
|
||||
end
|
||||
end # msgfmt
|
||||
|
|
|
@ -22,7 +22,7 @@ msgstr ""
|
|||
#, c-format
|
||||
msgctxt "FILE_CANT_OPEN"
|
||||
msgid "Can't open \"%1$s\"\n"
|
||||
msgstr ""
|
||||
msgstr "No se puede abrir \"%1$s\"\n"
|
||||
|
||||
#, c-format
|
||||
msgctxt "LINE_COLUMN_STRING"
|
||||
|
|
577
src/language.c
577
src/language.c
|
@ -18,21 +18,15 @@
|
|||
#endif
|
||||
#include "tmbstr.h"
|
||||
#include "locale.h"
|
||||
#if defined(_WIN32)
|
||||
#include "win_vsnprintf.h"
|
||||
#define nest_(x) TY_(x)
|
||||
#define printf nest_(win_printf)
|
||||
#define fprint nest_(win_fprintf)
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
* This structure type provides universal access to all of Tidy's strings.
|
||||
*/
|
||||
typedef struct {
|
||||
languageDefinition *currentLanguage;
|
||||
languageDefinition *fallbackLanguage;
|
||||
languageDefinition *languages[];
|
||||
languageDefinition *currentLanguage;
|
||||
languageDefinition *fallbackLanguage;
|
||||
languageDefinition *languages[];
|
||||
} tidyLanguagesType;
|
||||
|
||||
|
||||
|
@ -41,20 +35,20 @@ typedef struct {
|
|||
* `.currentLanguage` to language_en, which is Tidy's default language.
|
||||
*/
|
||||
static tidyLanguagesType tidyLanguages = {
|
||||
&language_en, /* current language */
|
||||
&language_en, /* first fallback language */
|
||||
{
|
||||
&language_en, /* current language */
|
||||
&language_en, /* first fallback language */
|
||||
{
|
||||
/* Required localization! */
|
||||
&language_en,
|
||||
#if SUPPORT_LOCALIZATIONS
|
||||
/* These additional languages are installed. */
|
||||
&language_en_gb,
|
||||
&language_es,
|
||||
&language_es_mx,
|
||||
/* These additional languages are installed. */
|
||||
&language_en_gb,
|
||||
&language_es,
|
||||
&language_es_mx,
|
||||
&language_zh_cn,
|
||||
#endif
|
||||
NULL /* This array MUST be null terminated. */
|
||||
}
|
||||
NULL /* This array MUST be null terminated. */
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
@ -64,168 +58,168 @@ static tidyLanguagesType tidyLanguages = {
|
|||
* POSIX names).
|
||||
*/
|
||||
static const tidyLocaleMapItem localeMappings[] = {
|
||||
{ "america", "en_us" },
|
||||
{ "american english", "en_us" },
|
||||
{ "american-english", "en_us" },
|
||||
{ "american", "en_us" },
|
||||
{ "aus", "en_au" },
|
||||
{ "australia", "en_au" },
|
||||
{ "australian", "en_au" },
|
||||
{ "austria", "de_at" },
|
||||
{ "aut", "de_at" },
|
||||
{ "bel", "nl_be" },
|
||||
{ "belgian", "nl_be" },
|
||||
{ "belgium", "nl_be" },
|
||||
{ "bra", "pt-br" },
|
||||
{ "brazil", "pt-br" },
|
||||
{ "britain", "en_gb" },
|
||||
{ "can", "en_ca" },
|
||||
{ "canada", "en_ca" },
|
||||
{ "canadian", "en_ca" },
|
||||
{ "che", "de_ch" },
|
||||
{ "china", "zh_cn" },
|
||||
{ "chinese-simplified", "zh" },
|
||||
{ "chinese-traditional", "zh_tw" },
|
||||
{ "chinese", "zh" },
|
||||
{ "chn", "zh_cn" },
|
||||
{ "chs", "zh" },
|
||||
{ "cht", "zh_tw" },
|
||||
{ "csy", "cs" },
|
||||
{ "cze", "cs_cz" },
|
||||
{ "czech", "cs_cz" },
|
||||
{ "dan", "da" },
|
||||
{ "danish", "da" },
|
||||
{ "dea", "de_at" },
|
||||
{ "denmark", "da_dk" },
|
||||
{ "des", "de_ch" },
|
||||
{ "deu", "de" },
|
||||
{ "dnk", "da_dk" },
|
||||
{ "dutch-belgian", "nl_be" },
|
||||
{ "dutch", "nl" },
|
||||
{ "ell", "el" },
|
||||
{ "ena", "en_au" },
|
||||
{ "enc", "en_ca" },
|
||||
{ "eng", "eb_gb" },
|
||||
{ "england", "en_gb" },
|
||||
{ "english-american", "en_us" },
|
||||
{ "english-aus", "en_au" },
|
||||
{ "english-can", "en_ca" },
|
||||
{ "english-nz", "en_nz" },
|
||||
{ "english-uk", "eb_gb" },
|
||||
{ "english-us", "en_us" },
|
||||
{ "english-usa", "en_us" },
|
||||
{ "english", "en" },
|
||||
{ "enu", "en_us" },
|
||||
{ "enz", "en_nz" },
|
||||
{ "esm", "es-mx" },
|
||||
{ "esn", "es" },
|
||||
{ "esp", "es" },
|
||||
{ "fin", "fi" },
|
||||
{ "finland", "fi_fi" },
|
||||
{ "finnish", "fi" },
|
||||
{ "fra", "fr" },
|
||||
{ "france", "fr_fr" },
|
||||
{ "frb", "fr_be" },
|
||||
{ "frc", "fr_ca" },
|
||||
{ "french-belgian", "fr_be" },
|
||||
{ "french-canadian", "fr_ca" },
|
||||
{ "french-swiss", "fr_ch" },
|
||||
{ "french", "fr" },
|
||||
{ "frs", "fr_ch" },
|
||||
{ "gbr", "en_gb" },
|
||||
{ "german-austrian", "de_at" },
|
||||
{ "german-swiss", "de_ch" },
|
||||
{ "german", "de" },
|
||||
{ "germany", "de_de" },
|
||||
{ "grc", "el_gr" },
|
||||
{ "great britain", "en_gb" },
|
||||
{ "greece", "el_gr" },
|
||||
{ "greek", "el" },
|
||||
{ "hkg", "zh_hk" },
|
||||
{ "holland", "nl_nl" },
|
||||
{ "hong kong", "zh_hk" },
|
||||
{ "hong-kong", "zh_hk" },
|
||||
{ "hun", "hu" },
|
||||
{ "hungarian", "hu" },
|
||||
{ "hungary", "hu_hu" },
|
||||
{ "iceland", "is_is" },
|
||||
{ "icelandic", "is" },
|
||||
{ "ireland", "en_ie" },
|
||||
{ "irl", "en_ie" },
|
||||
{ "isl", "is" },
|
||||
{ "ita", "it" },
|
||||
{ "ita", "it_it" },
|
||||
{ "italian-swiss", "it_ch" },
|
||||
{ "italian", "it" },
|
||||
{ "italy", "it_it" },
|
||||
{ "its", "it_ch" },
|
||||
{ "japan", "ja_jp" },
|
||||
{ "japanese", "ja" },
|
||||
{ "jpn", "ja" },
|
||||
{ "kor", "ko" },
|
||||
{ "korea", "ko_kr" },
|
||||
{ "korean", "ko" },
|
||||
{ "mex", "es-mx" },
|
||||
{ "mexico", "es-mx" },
|
||||
{ "netherlands", "nl_nl" },
|
||||
{ "new zealand", "en_nz" },
|
||||
{ "new-zealand", "en_nz" },
|
||||
{ "nlb", "nl_be" },
|
||||
{ "nld", "nl" },
|
||||
{ "non", "nn" },
|
||||
{ "nor", "nb" },
|
||||
{ "norway", "no" },
|
||||
{ "norwegian-bokmal", "nb" },
|
||||
{ "norwegian-nynorsk", "nn" },
|
||||
{ "norwegian", "no" },
|
||||
{ "nz", "en_nz" },
|
||||
{ "nzl", "en_nz" },
|
||||
{ "plk", "pl" },
|
||||
{ "pol", "pl-pl" },
|
||||
{ "poland", "pl-pl" },
|
||||
{ "polish", "pl" },
|
||||
{ "portugal", "pt-pt" },
|
||||
{ "portuguese-brazil", "pt-br" },
|
||||
{ "portuguese", "pt" },
|
||||
{ "pr china", "zh_cn" },
|
||||
{ "pr-china", "zh_cn" },
|
||||
{ "prt", "pt-pt" },
|
||||
{ "ptb", "pt-br" },
|
||||
{ "ptg", "pt" },
|
||||
{ "rus", "ru" },
|
||||
{ "russia", "ru-ru" },
|
||||
{ "russian", "ru" },
|
||||
{ "sgp", "zh_sg" },
|
||||
{ "singapore", "zh_sg" },
|
||||
{ "sky", "sk" },
|
||||
{ "slovak", "sk" },
|
||||
{ "spain", "es-es" },
|
||||
{ "spanish-mexican", "es-mx" },
|
||||
{ "spanish-modern", "es" },
|
||||
{ "spanish", "es" },
|
||||
{ "sve", "sv" },
|
||||
{ "svk", "sk-sk" },
|
||||
{ "swe", "sv-se" },
|
||||
{ "sweden", "sv-se" },
|
||||
{ "swedish", "sv" },
|
||||
{ "swiss", "de_ch" },
|
||||
{ "switzerland", "de_ch" },
|
||||
{ "taiwan", "zh_tw" },
|
||||
{ "trk", "tr" },
|
||||
{ "tur", "tr-tr" },
|
||||
{ "turkey", "tr-tr" },
|
||||
{ "turkish", "tr" },
|
||||
{ "twn", "zh_tw" },
|
||||
{ "uk", "en_gb" },
|
||||
{ "united kingdom", "en_gb" },
|
||||
{ "united states", "en_us" },
|
||||
{ "united-kingdom", "en_gb" },
|
||||
{ "united-states", "en_us" },
|
||||
{ "us", "en_us" },
|
||||
{ "usa", "en_us" },
|
||||
{ "america", "en_us" },
|
||||
{ "american english", "en_us" },
|
||||
{ "american-english", "en_us" },
|
||||
{ "american", "en_us" },
|
||||
{ "aus", "en_au" },
|
||||
{ "australia", "en_au" },
|
||||
{ "australian", "en_au" },
|
||||
{ "austria", "de_at" },
|
||||
{ "aut", "de_at" },
|
||||
{ "bel", "nl_be" },
|
||||
{ "belgian", "nl_be" },
|
||||
{ "belgium", "nl_be" },
|
||||
{ "bra", "pt-br" },
|
||||
{ "brazil", "pt-br" },
|
||||
{ "britain", "en_gb" },
|
||||
{ "can", "en_ca" },
|
||||
{ "canada", "en_ca" },
|
||||
{ "canadian", "en_ca" },
|
||||
{ "che", "de_ch" },
|
||||
{ "china", "zh_cn" },
|
||||
{ "chinese-simplified", "zh" },
|
||||
{ "chinese-traditional", "zh_tw" },
|
||||
{ "chinese", "zh" },
|
||||
{ "chn", "zh_cn" },
|
||||
{ "chs", "zh" },
|
||||
{ "cht", "zh_tw" },
|
||||
{ "csy", "cs" },
|
||||
{ "cze", "cs_cz" },
|
||||
{ "czech", "cs_cz" },
|
||||
{ "dan", "da" },
|
||||
{ "danish", "da" },
|
||||
{ "dea", "de_at" },
|
||||
{ "denmark", "da_dk" },
|
||||
{ "des", "de_ch" },
|
||||
{ "deu", "de" },
|
||||
{ "dnk", "da_dk" },
|
||||
{ "dutch-belgian", "nl_be" },
|
||||
{ "dutch", "nl" },
|
||||
{ "ell", "el" },
|
||||
{ "ena", "en_au" },
|
||||
{ "enc", "en_ca" },
|
||||
{ "eng", "eb_gb" },
|
||||
{ "england", "en_gb" },
|
||||
{ "english-american", "en_us" },
|
||||
{ "english-aus", "en_au" },
|
||||
{ "english-can", "en_ca" },
|
||||
{ "english-nz", "en_nz" },
|
||||
{ "english-uk", "eb_gb" },
|
||||
{ "english-us", "en_us" },
|
||||
{ "english-usa", "en_us" },
|
||||
{ "english", "en" },
|
||||
{ "enu", "en_us" },
|
||||
{ "enz", "en_nz" },
|
||||
{ "esm", "es-mx" },
|
||||
{ "esn", "es" },
|
||||
{ "esp", "es" },
|
||||
{ "fin", "fi" },
|
||||
{ "finland", "fi_fi" },
|
||||
{ "finnish", "fi" },
|
||||
{ "fra", "fr" },
|
||||
{ "france", "fr_fr" },
|
||||
{ "frb", "fr_be" },
|
||||
{ "frc", "fr_ca" },
|
||||
{ "french-belgian", "fr_be" },
|
||||
{ "french-canadian", "fr_ca" },
|
||||
{ "french-swiss", "fr_ch" },
|
||||
{ "french", "fr" },
|
||||
{ "frs", "fr_ch" },
|
||||
{ "gbr", "en_gb" },
|
||||
{ "german-austrian", "de_at" },
|
||||
{ "german-swiss", "de_ch" },
|
||||
{ "german", "de" },
|
||||
{ "germany", "de_de" },
|
||||
{ "grc", "el_gr" },
|
||||
{ "great britain", "en_gb" },
|
||||
{ "greece", "el_gr" },
|
||||
{ "greek", "el" },
|
||||
{ "hkg", "zh_hk" },
|
||||
{ "holland", "nl_nl" },
|
||||
{ "hong kong", "zh_hk" },
|
||||
{ "hong-kong", "zh_hk" },
|
||||
{ "hun", "hu" },
|
||||
{ "hungarian", "hu" },
|
||||
{ "hungary", "hu_hu" },
|
||||
{ "iceland", "is_is" },
|
||||
{ "icelandic", "is" },
|
||||
{ "ireland", "en_ie" },
|
||||
{ "irl", "en_ie" },
|
||||
{ "isl", "is" },
|
||||
{ "ita", "it" },
|
||||
{ "ita", "it_it" },
|
||||
{ "italian-swiss", "it_ch" },
|
||||
{ "italian", "it" },
|
||||
{ "italy", "it_it" },
|
||||
{ "its", "it_ch" },
|
||||
{ "japan", "ja_jp" },
|
||||
{ "japanese", "ja" },
|
||||
{ "jpn", "ja" },
|
||||
{ "kor", "ko" },
|
||||
{ "korea", "ko_kr" },
|
||||
{ "korean", "ko" },
|
||||
{ "mex", "es-mx" },
|
||||
{ "mexico", "es-mx" },
|
||||
{ "netherlands", "nl_nl" },
|
||||
{ "new zealand", "en_nz" },
|
||||
{ "new-zealand", "en_nz" },
|
||||
{ "nlb", "nl_be" },
|
||||
{ "nld", "nl" },
|
||||
{ "non", "nn" },
|
||||
{ "nor", "nb" },
|
||||
{ "norway", "no" },
|
||||
{ "norwegian-bokmal", "nb" },
|
||||
{ "norwegian-nynorsk", "nn" },
|
||||
{ "norwegian", "no" },
|
||||
{ "nz", "en_nz" },
|
||||
{ "nzl", "en_nz" },
|
||||
{ "plk", "pl" },
|
||||
{ "pol", "pl-pl" },
|
||||
{ "poland", "pl-pl" },
|
||||
{ "polish", "pl" },
|
||||
{ "portugal", "pt-pt" },
|
||||
{ "portuguese-brazil", "pt-br" },
|
||||
{ "portuguese", "pt" },
|
||||
{ "pr china", "zh_cn" },
|
||||
{ "pr-china", "zh_cn" },
|
||||
{ "prt", "pt-pt" },
|
||||
{ "ptb", "pt-br" },
|
||||
{ "ptg", "pt" },
|
||||
{ "rus", "ru" },
|
||||
{ "russia", "ru-ru" },
|
||||
{ "russian", "ru" },
|
||||
{ "sgp", "zh_sg" },
|
||||
{ "singapore", "zh_sg" },
|
||||
{ "sky", "sk" },
|
||||
{ "slovak", "sk" },
|
||||
{ "spain", "es-es" },
|
||||
{ "spanish-mexican", "es-mx" },
|
||||
{ "spanish-modern", "es" },
|
||||
{ "spanish", "es" },
|
||||
{ "sve", "sv" },
|
||||
{ "svk", "sk-sk" },
|
||||
{ "swe", "sv-se" },
|
||||
{ "sweden", "sv-se" },
|
||||
{ "swedish", "sv" },
|
||||
{ "swiss", "de_ch" },
|
||||
{ "switzerland", "de_ch" },
|
||||
{ "taiwan", "zh_tw" },
|
||||
{ "trk", "tr" },
|
||||
{ "tur", "tr-tr" },
|
||||
{ "turkey", "tr-tr" },
|
||||
{ "turkish", "tr" },
|
||||
{ "twn", "zh_tw" },
|
||||
{ "uk", "en_gb" },
|
||||
{ "united kingdom", "en_gb" },
|
||||
{ "united states", "en_us" },
|
||||
{ "united-kingdom", "en_gb" },
|
||||
{ "united-states", "en_us" },
|
||||
{ "us", "en_us" },
|
||||
{ "usa", "en_us" },
|
||||
|
||||
/* MUST be last. */
|
||||
{ NULL, NULL }
|
||||
/* MUST be last. */
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
|
||||
|
@ -499,18 +493,18 @@ ctmbstr tidyErrorCodeAsString(uint code)
|
|||
*/
|
||||
ctmbstr TY_(tidyLocalizedString)( uint messageType, languageDefinition *definition, uint plural )
|
||||
{
|
||||
int i;
|
||||
languageDictionary *dictionary = &definition->messages;
|
||||
uint pluralForm = definition->whichPluralForm(plural);
|
||||
int i;
|
||||
languageDictionary *dictionary = &definition->messages;
|
||||
uint pluralForm = definition->whichPluralForm(plural);
|
||||
|
||||
for (i = 0; (*dictionary)[i].value; ++i)
|
||||
{
|
||||
if ( (*dictionary)[i].key == messageType && (*dictionary)[i].pluralForm == pluralForm )
|
||||
{
|
||||
return (*dictionary)[i].value;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
for (i = 0; (*dictionary)[i].value; ++i)
|
||||
{
|
||||
if ( (*dictionary)[i].key == messageType && (*dictionary)[i].pluralForm == pluralForm )
|
||||
{
|
||||
return (*dictionary)[i].value;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
|
@ -525,28 +519,28 @@ ctmbstr TY_(tidyLocalizedString)( uint messageType, languageDefinition *definiti
|
|||
*/
|
||||
ctmbstr tidyLocalizedStringN( uint messageType, uint quantity )
|
||||
{
|
||||
ctmbstr result;
|
||||
ctmbstr result;
|
||||
|
||||
result = TY_(tidyLocalizedString)( messageType, tidyLanguages.currentLanguage, quantity);
|
||||
result = TY_(tidyLocalizedString)( messageType, tidyLanguages.currentLanguage, quantity);
|
||||
|
||||
if (!result && tidyLanguages.fallbackLanguage )
|
||||
{
|
||||
result = TY_(tidyLocalizedString)( messageType, tidyLanguages.fallbackLanguage, quantity);
|
||||
}
|
||||
if (!result && tidyLanguages.fallbackLanguage )
|
||||
{
|
||||
result = TY_(tidyLocalizedString)( messageType, tidyLanguages.fallbackLanguage, quantity);
|
||||
}
|
||||
|
||||
if (!result)
|
||||
{
|
||||
/* Fallback to en which is built in. */
|
||||
result = TY_(tidyLocalizedString)( messageType, &language_en, quantity);
|
||||
}
|
||||
if (!result)
|
||||
{
|
||||
/* Fallback to en which is built in. */
|
||||
result = TY_(tidyLocalizedString)( messageType, &language_en, quantity);
|
||||
}
|
||||
|
||||
if (!result)
|
||||
{
|
||||
/* Last resort: Fallback to en singular which is built in. */
|
||||
result = TY_(tidyLocalizedString)( messageType, &language_en, 1);
|
||||
}
|
||||
if (!result)
|
||||
{
|
||||
/* Last resort: Fallback to en singular which is built in. */
|
||||
result = TY_(tidyLocalizedString)( messageType, &language_en, 1);
|
||||
}
|
||||
|
||||
return result;
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
|
@ -560,7 +554,7 @@ ctmbstr tidyLocalizedStringN( uint messageType, uint quantity )
|
|||
*/
|
||||
ctmbstr tidyLocalizedString( uint messageType )
|
||||
{
|
||||
return tidyLocalizedStringN( messageType, 1 );
|
||||
return tidyLocalizedStringN( messageType, 1 );
|
||||
}
|
||||
|
||||
|
||||
|
@ -574,23 +568,23 @@ ctmbstr tidyLocalizedString( uint messageType )
|
|||
*/
|
||||
tmbstr tidySystemLocale(tmbstr result)
|
||||
{
|
||||
ctmbstr temp;
|
||||
ctmbstr temp;
|
||||
|
||||
/* This should set the OS locale. */
|
||||
setlocale( LC_ALL, "" );
|
||||
/* This should set the OS locale. */
|
||||
setlocale( LC_ALL, "" );
|
||||
|
||||
/* This should read the current locale. */
|
||||
temp = setlocale( LC_ALL, NULL);
|
||||
/* This should read the current locale. */
|
||||
temp = setlocale( LC_ALL, NULL);
|
||||
|
||||
/* Make a new copy of the string, because temp
|
||||
always points to the current locale. */
|
||||
if (( result = malloc( strlen( temp ) + 1 ) ))
|
||||
strcpy(result, temp);
|
||||
/* Make a new copy of the string, because temp
|
||||
always points to the current locale. */
|
||||
if (( result = malloc( strlen( temp ) + 1 ) ))
|
||||
strcpy(result, temp);
|
||||
|
||||
/* This should restore the C locale. */
|
||||
setlocale( LC_ALL, "C" );
|
||||
/* This should restore the C locale. */
|
||||
setlocale( LC_ALL, "C" );
|
||||
|
||||
return result;
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
|
@ -601,47 +595,52 @@ tmbstr tidySystemLocale(tmbstr result)
|
|||
*/
|
||||
tmbstr tidyNormalizedLocaleName( ctmbstr locale )
|
||||
{
|
||||
uint i;
|
||||
uint len;
|
||||
static char result[6] = "xx_yy";
|
||||
tmbstr search = strdup(locale);
|
||||
search = TY_(tmbstrtolower)(search);
|
||||
uint i;
|
||||
uint len;
|
||||
static char result[6] = "xx_yy";
|
||||
char character[1];
|
||||
tmbstr search = strdup(locale);
|
||||
search = TY_(tmbstrtolower)(search);
|
||||
|
||||
/* See if our string matches a Windows name. */
|
||||
for (i = 0; localeMappings[i].winName; ++i)
|
||||
{
|
||||
if ( strcmp( localeMappings[i].winName, search ) == 0 )
|
||||
{
|
||||
/* See if our string matches a Windows name. */
|
||||
for (i = 0; localeMappings[i].winName; ++i)
|
||||
{
|
||||
if ( strcmp( localeMappings[i].winName, search ) == 0 )
|
||||
{
|
||||
free(search);
|
||||
search = strdup(localeMappings[i].POSIXName);
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* We're going to be stupid about this and trust the user, and
|
||||
return just the first two characters if they exist and the
|
||||
4th and 5th if they exist. The worst that can happen is a
|
||||
junk language that doesn't exist and won't be set. */
|
||||
/* We're going to be stupid about this and trust the user, and
|
||||
return just the first two characters if they exist and the
|
||||
4th and 5th if they exist. The worst that can happen is a
|
||||
junk language that doesn't exist and won't be set. */
|
||||
|
||||
len = strlen( search );
|
||||
len = len <= 5 ? len : 5;
|
||||
len = strlen( search );
|
||||
len = len <= 5 ? len : 5;
|
||||
|
||||
for ( i = 0; i < len; i++ )
|
||||
{
|
||||
if ( i == 2 )
|
||||
{
|
||||
/* Either terminate the string or ensure there's an underscore */
|
||||
strncpy( result + i, strlen( search ) >= 5 ? "_" : '\0', 1 );
|
||||
}
|
||||
else
|
||||
{
|
||||
strncpy( result + i, search + i, 1);
|
||||
result[i] = tolower( result[i] );
|
||||
}
|
||||
}
|
||||
for ( i = 0; i < len; i++ )
|
||||
{
|
||||
if ( i == 2 )
|
||||
{
|
||||
/* Either terminate the string or ensure there's an underscore */
|
||||
if (strlen( search) >= 5)
|
||||
character[0] = '_';
|
||||
else
|
||||
character[0] = '\0';
|
||||
strncpy( result + i, character, 1 );
|
||||
}
|
||||
else
|
||||
{
|
||||
strncpy( result + i, search + i, 1);
|
||||
result[i] = tolower( result[i] );
|
||||
}
|
||||
}
|
||||
|
||||
if ( search ) free( search );
|
||||
return result;
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
|
@ -651,22 +650,22 @@ tmbstr tidyNormalizedLocaleName( ctmbstr locale )
|
|||
*/
|
||||
languageDefinition *TY_(tidyTestLanguage)( ctmbstr languageCode )
|
||||
{
|
||||
uint i;
|
||||
languageDefinition *testLang;
|
||||
languageDictionary *testDict;
|
||||
ctmbstr testCode;
|
||||
uint i;
|
||||
languageDefinition *testLang;
|
||||
languageDictionary *testDict;
|
||||
ctmbstr testCode;
|
||||
|
||||
for (i = 0; tidyLanguages.languages[i]; ++i)
|
||||
{
|
||||
testLang = tidyLanguages.languages[i];
|
||||
testDict = &testLang->messages;
|
||||
testCode = (*testDict)[0].value;
|
||||
for (i = 0; tidyLanguages.languages[i]; ++i)
|
||||
{
|
||||
testLang = tidyLanguages.languages[i];
|
||||
testDict = &testLang->messages;
|
||||
testCode = (*testDict)[0].value;
|
||||
|
||||
if ( strcmp(testCode, languageCode) == 0 )
|
||||
if ( strcmp(testCode, languageCode) == 0 )
|
||||
return testLang;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
|
@ -683,14 +682,14 @@ languageDefinition *TY_(tidyTestLanguage)( ctmbstr languageCode )
|
|||
*/
|
||||
Bool tidySetLanguage( ctmbstr languageCode )
|
||||
{
|
||||
languageDefinition *dict1 = NULL;
|
||||
languageDefinition *dict2 = NULL;
|
||||
tmbstr wantCode = NULL;
|
||||
char lang[3] = "";
|
||||
languageDefinition *dict1 = NULL;
|
||||
languageDefinition *dict2 = NULL;
|
||||
tmbstr wantCode = NULL;
|
||||
char lang[3] = "";
|
||||
|
||||
if ( !languageCode || !(wantCode = tidyNormalizedLocaleName( languageCode )) )
|
||||
if ( !languageCode || !(wantCode = tidyNormalizedLocaleName( languageCode )) )
|
||||
{
|
||||
return no;
|
||||
return no;
|
||||
}
|
||||
|
||||
/* We want to use the specified language as the currentLanguage, and set
|
||||
|
@ -727,7 +726,7 @@ Bool tidySetLanguage( ctmbstr languageCode )
|
|||
/* No change. */
|
||||
}
|
||||
|
||||
return dict1 || dict2;
|
||||
return dict1 || dict2;
|
||||
}
|
||||
|
||||
|
||||
|
@ -736,9 +735,9 @@ Bool tidySetLanguage( ctmbstr languageCode )
|
|||
*/
|
||||
ctmbstr tidyGetLanguage()
|
||||
{
|
||||
languageDefinition *langDef = tidyLanguages.currentLanguage;
|
||||
languageDictionary *langDict = &langDef->messages;
|
||||
return (*langDict)[0].value;
|
||||
languageDefinition *langDef = tidyLanguages.currentLanguage;
|
||||
languageDictionary *langDict = &langDef->messages;
|
||||
return (*langDict)[0].value;
|
||||
}
|
||||
|
||||
|
||||
|
@ -748,7 +747,7 @@ ctmbstr tidyGetLanguage()
|
|||
*/
|
||||
ctmbstr tidyDefaultString( uint messageType )
|
||||
{
|
||||
return TY_(tidyLocalizedString)( messageType, &language_en, 1);
|
||||
return TY_(tidyLocalizedString)( messageType, &language_en, 1);
|
||||
}
|
||||
|
||||
|
||||
|
@ -813,16 +812,16 @@ uint getNextStringKey( TidyIterator* iter )
|
|||
*/
|
||||
const uint TY_(tidyLanguageListSize)()
|
||||
{
|
||||
static uint array_size = 0;
|
||||
static uint array_size = 0;
|
||||
|
||||
if ( array_size == 0 )
|
||||
{
|
||||
if ( array_size == 0 )
|
||||
{
|
||||
while ( localeMappings[array_size].winName ) {
|
||||
array_size++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return array_size;
|
||||
return array_size;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -863,16 +862,16 @@ const tidyLocaleMapItem *getNextWindowsLanguage( TidyIterator *iter )
|
|||
*/
|
||||
const uint TY_(tidyInstalledLanguageListSize)()
|
||||
{
|
||||
static uint array_size = 0;
|
||||
static uint array_size = 0;
|
||||
|
||||
if ( array_size == 0 )
|
||||
{
|
||||
while ( tidyLanguages.languages[array_size] ) {
|
||||
array_size++;
|
||||
}
|
||||
}
|
||||
if ( array_size == 0 )
|
||||
{
|
||||
while ( tidyLanguages.languages[array_size] ) {
|
||||
array_size++;
|
||||
}
|
||||
}
|
||||
|
||||
return array_size;
|
||||
return array_size;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#ifndef language_en_h
|
||||
#ifndef language_en_h
|
||||
#define language_en_h
|
||||
/*
|
||||
* language_en.h
|
||||
|
@ -16,9 +16,6 @@
|
|||
* See tidy.h and access.h for the copyright notice.
|
||||
*
|
||||
* Created by Jim Derry on 11/28/15.
|
||||
*
|
||||
* PO_LAST_TRANSLATOR=jderry
|
||||
* PO_REVISION_DATE=2016-01-12
|
||||
*/
|
||||
|
||||
#ifdef _MSC_VER
|
||||
|
@ -72,16 +69,16 @@ static languageDefinition language_en = { whichPluralForm_en, {
|
|||
{/* Only translate if a URL to the target language can be found. */
|
||||
ATRC_ACCESS_URL, 0, "http://www.html-tidy.org/accessibility/"
|
||||
},
|
||||
{ FILE_CANT_OPEN, 0, "Can't open \"%1$s\"\n" },
|
||||
{ LINE_COLUMN_STRING, 0, "line %1$d column %2$d - " },
|
||||
{ STRING_CONTENT_LOOKS, 0, "Document content looks like %1$s" },
|
||||
{ FILE_CANT_OPEN, 0, "Can't open \"%s\"\n" },
|
||||
{ LINE_COLUMN_STRING, 0, "line %d column %d - " },
|
||||
{ STRING_CONTENT_LOOKS, 0, "Document content looks like %s" },
|
||||
{/* For example, "discarding invalid UTF-16 surrogate pair" */
|
||||
STRING_DISCARDING, 0, "discarding"
|
||||
},
|
||||
{ STRING_DOCTYPE_GIVEN, 0, "Doctype given is \"%1$s\"" },
|
||||
{ STRING_DOCTYPE_GIVEN, 0, "Doctype given is \"%s\"" },
|
||||
|
||||
{/* The strings "Tidy" and "HTML Tidy" are the program name and must not be translated. */
|
||||
STRING_ERROR_COUNT, 0, "Tidy found %1$u %2$s and %3$u %4$s!"
|
||||
STRING_ERROR_COUNT, 0, "Tidy found %u %s and %u %s!"
|
||||
},
|
||||
{ STRING_ERROR_COUNT_ERROR, 0, "error" },
|
||||
{ STRING_ERROR_COUNT_ERROR, 1, "errors" },
|
||||
|
@ -91,7 +88,7 @@ static languageDefinition language_en = { whichPluralForm_en, {
|
|||
{/* This is not a formal name and can be translated. */
|
||||
STRING_HTML_PROPRIETARY, 0, "HTML Proprietary"
|
||||
},
|
||||
{ STRING_MISSING_MALFORMED, 0, "missing or malformed argument for option: %1$s" },
|
||||
{ STRING_MISSING_MALFORMED, 0, "missing or malformed argument for option: %s" },
|
||||
{ STRING_NO_ERRORS, 0, "No warnings or errors were found." },
|
||||
{ STRING_NO_SYSID, 0, "No system identifier in emitted doctype" },
|
||||
{ STRING_NOT_ALL_SHOWN, 0, "Not all warnings/errors were shown." },
|
||||
|
@ -102,9 +99,9 @@ static languageDefinition language_en = { whichPluralForm_en, {
|
|||
{/* For example, "you should avoid using the specified encoding." */
|
||||
STRING_SPECIFIED, 0, "specified"
|
||||
},
|
||||
{ STRING_UNKNOWN_FILE, 0, "%1$s: can't open file \"%2$s\"\n" },
|
||||
{ STRING_UNKNOWN_OPTION, 0, "unknown option: %1$s" },
|
||||
{ STRING_UNRECZD_OPTION, 0, "unrecognized option -%1$c use -help to list options\n" },
|
||||
{ STRING_UNKNOWN_FILE, 0, "%s: can't open file \"%s\"\n" },
|
||||
{ STRING_UNKNOWN_OPTION, 0, "unknown option: %s" },
|
||||
{ STRING_UNRECZD_OPTION, 0, "unrecognized option -%c use -help to list options\n" },
|
||||
{ STRING_XML_DECLARATION, 0, "XML declaration" },
|
||||
|
||||
{/* This console output should be limited to 78 characters per line. */
|
||||
|
@ -133,22 +130,23 @@ static languageDefinition language_en = { whichPluralForm_en, {
|
|||
"than Windows character code 153 (0x2122 in Unicode). Note that\n"
|
||||
"as of February 1998 few browsers support the new entities.\n\n"
|
||||
},
|
||||
{/* This console output should be limited to 78 characters per line. */
|
||||
{/* This console output should be limited to 78 characters per line.
|
||||
- %s represents a string-encoding name which may be localized in your language. */
|
||||
TEXT_VENDOR_CHARS, 0,
|
||||
"It is unlikely that vendor-specific, system-dependent encodings\n"
|
||||
"work widely enough on the World Wide Web; you should avoid using the \n"
|
||||
"%1$s character encoding, instead you are recommended to\n"
|
||||
"%s character encoding, instead you are recommended to\n"
|
||||
"use named entities, e.g. ™.\n"
|
||||
"\n"
|
||||
},
|
||||
{/* This console output should be limited to 78 characters per line.
|
||||
- %1$s represents a string-encoding name which may be localized in your language.
|
||||
- %s represents a string-encoding name which may be localized in your language.
|
||||
- The strings "Tidy" and "HTML Tidy" are the program name and must not be translated. */
|
||||
TEXT_SGML_CHARS, 0,
|
||||
"Character codes 128 to 159 (U+0080 to U+009F) are not allowed in HTML;\n"
|
||||
"even if they were, they would likely be unprintable control characters.\n"
|
||||
"Tidy assumed you wanted to refer to a character with the same byte value in the \n"
|
||||
"%1$s encoding and replaced that reference with the Unicode \n"
|
||||
"%s encoding and replaced that reference with the Unicode \n"
|
||||
"equivalent.\n"
|
||||
"\n"
|
||||
},
|
||||
|
@ -330,100 +328,100 @@ static languageDefinition language_en = { whichPluralForm_en, {
|
|||
|
||||
/* ReportEncodingWarning */
|
||||
{
|
||||
ENCODING_MISMATCH, 0, "specified input encoding (%1$s) does not match actual input encoding (%2$s)" }, /* Warning */
|
||||
ENCODING_MISMATCH, 0, "specified input encoding (%s) does not match actual input encoding (%s)" }, /* Warning */
|
||||
|
||||
/* ReportEncodingError */
|
||||
{ VENDOR_SPECIFIC_CHARS, 0, "%1$s invalid character code %2$s" }, /* Error */
|
||||
{ INVALID_SGML_CHARS, 0, "%1$s invalid character code %2$s" }, /* Error */
|
||||
{ INVALID_UTF8, 0, "%1$s invalid UTF-8 bytes (char. code %2$s)" }, /* Error */
|
||||
{ INVALID_UTF16, 0, "%1$s invalid UTF-16 surrogate pair (char. code %2$s)" }, /* Error */
|
||||
{ INVALID_NCR, 0, "%1$s invalid numeric character reference %2$s" }, /* Error */
|
||||
{ VENDOR_SPECIFIC_CHARS, 0, "%s invalid character code %s" }, /* Error */
|
||||
{ INVALID_SGML_CHARS, 0, "%s invalid character code %s" }, /* Error */
|
||||
{ INVALID_UTF8, 0, "%s invalid UTF-8 bytes (char. code %s)" }, /* Error */
|
||||
{ INVALID_UTF16, 0, "%s invalid UTF-16 surrogate pair (char. code %s)" }, /* Error */
|
||||
{ INVALID_NCR, 0, "%s invalid numeric character reference %s" }, /* Error */
|
||||
|
||||
/* ReportEntityError */
|
||||
{ MISSING_SEMICOLON, 0, "entity \"%1$s\" doesn't end in ';'" }, /* Warning in HTML, Error in XML/XHTML */
|
||||
{ MISSING_SEMICOLON_NCR, 0, "numeric character reference \"%1$s\" doesn't end in ';'" }, /* Warning in HTML, Error in XML/XHTML */
|
||||
{ MISSING_SEMICOLON, 0, "entity \"%s\" doesn't end in ';'" }, /* Warning in HTML, Error in XML/XHTML */
|
||||
{ MISSING_SEMICOLON_NCR, 0, "numeric character reference \"%s\" doesn't end in ';'" }, /* Warning in HTML, Error in XML/XHTML */
|
||||
{ UNESCAPED_AMPERSAND, 0, "unescaped & which should be written as &" }, /* Warning in HTML, Error in XHTML */
|
||||
{ UNKNOWN_ENTITY, 0, "unescaped & or unknown entity \"%1$s\"" }, /* Error */
|
||||
{ UNKNOWN_ENTITY, 0, "unescaped & or unknown entity \"%s\"" }, /* Error */
|
||||
{ APOS_UNDEFINED, 0, "named entity ' only defined in XML/XHTML" }, /* Error in HTML (should only occur for HTML input) */
|
||||
|
||||
/* ReportAttrError - attribute name */
|
||||
{ INSERTING_ATTRIBUTE, 0, "%1$s inserting \"%2$s\" attribute" }, /* Warning in CheckLINK, Error otherwise */
|
||||
{ INSERTING_AUTO_ATTRIBUTE, 0, "%1$s inserting \"%2$s\" attribute using value \"%3$s\"" }, /* Warning */
|
||||
{ MISSING_ATTR_VALUE, 0, "%1$s attribute \"%2$s\" lacks value" }, /* Warning in CheckUrl, Error otherwise */
|
||||
{ UNKNOWN_ATTRIBUTE, 0, "%1$s unknown attribute \"%2$s\"" }, /* Error */
|
||||
{ PROPRIETARY_ATTRIBUTE, 0, "%1$s proprietary attribute \"%2$s\"" }, /* Error */
|
||||
{ JOINING_ATTRIBUTE, 0, "%1$s joining values of repeated attribute \"%2$s\"" }, /* Error */
|
||||
{ XML_ATTRIBUTE_VALUE, 0, "%1$s has XML attribute \"%2$s\"" }, /* Error (but deprecated) */
|
||||
{ INSERTING_ATTRIBUTE, 0, "%s inserting \"%s\" attribute" }, /* Warning in CheckLINK, Error otherwise */
|
||||
{ INSERTING_AUTO_ATTRIBUTE, 0, "%s inserting \"%s\" attribute using value \"%s\"" }, /* Warning */
|
||||
{ MISSING_ATTR_VALUE, 0, "%s attribute \"%s\" lacks value" }, /* Warning in CheckUrl, Error otherwise */
|
||||
{ UNKNOWN_ATTRIBUTE, 0, "%s unknown attribute \"%s\"" }, /* Error */
|
||||
{ PROPRIETARY_ATTRIBUTE, 0, "%s proprietary attribute \"%s\"" }, /* Error */
|
||||
{ JOINING_ATTRIBUTE, 0, "%s joining values of repeated attribute \"%s\"" }, /* Error */
|
||||
{ XML_ATTRIBUTE_VALUE, 0, "%s has XML attribute \"%s\"" }, /* Error (but deprecated) */
|
||||
|
||||
/* ReportAttrError - attribute value */
|
||||
{ XML_ID_SYNTAX, 0, "%1$s ID \"%2$s\" uses XML ID syntax" }, /* Warning if XHTML, Error if HTML */
|
||||
{ ATTR_VALUE_NOT_LCASE, 0, "%1$s attribute value \"%2$s\" must be lower case for XHTML" }, /* Error if XHTML input, Notice if HTML input and XHTML outpout */
|
||||
{ PROPRIETARY_ATTR_VALUE, 0, "%1$s proprietary attribute value \"%2$s\"" }, /* Error */
|
||||
{ ANCHOR_NOT_UNIQUE, 0, "%1$s anchor \"%2$s\" already defined" }, /* Error */
|
||||
{ XML_ID_SYNTAX, 0, "%s ID \"%s\" uses XML ID syntax" }, /* Warning if XHTML, Error if HTML */
|
||||
{ ATTR_VALUE_NOT_LCASE, 0, "%s attribute value \"%s\" must be lower case for XHTML" }, /* Error if XHTML input, Notice if HTML input and XHTML outpout */
|
||||
{ PROPRIETARY_ATTR_VALUE, 0, "%s proprietary attribute value \"%s\"" }, /* Error */
|
||||
{ ANCHOR_NOT_UNIQUE, 0, "%s anchor \"%s\" already defined" }, /* Error */
|
||||
|
||||
/* ReportAttrError - attribute name, attribute value */
|
||||
{ BAD_ATTRIBUTE_VALUE, 0, "%1$s attribute \"%2$s\" has invalid value \"%3$s\"" }, /* Error */
|
||||
{ BAD_ATTRIBUTE_VALUE_REPLACED, 0, "%1$s attribute \"%2$s\" had invalid value \"%3$s\" and has been replaced" }, /* Error */
|
||||
{ INVALID_ATTRIBUTE, 0, "%1$s attribute name \"%2$s\" (value=\"%3$s\") is invalid" }, /* Error */
|
||||
{ BAD_ATTRIBUTE_VALUE, 0, "%s attribute \"%s\" has invalid value \"%s\"" }, /* Error */
|
||||
{ BAD_ATTRIBUTE_VALUE_REPLACED, 0, "%s attribute \"%s\" had invalid value \"%s\" and has been replaced" }, /* Error */
|
||||
{ INVALID_ATTRIBUTE, 0, "%s attribute name \"%s\" (value=\"%s\") is invalid" }, /* Error */
|
||||
|
||||
/* ReportAttrError - attribute value, attribute name */
|
||||
{ REPEATED_ATTRIBUTE, 0, "%1$s dropping value \"%2$s\" for repeated attribute \"%3$s\"" }, /* Error */
|
||||
{ REPEATED_ATTRIBUTE, 0, "%s dropping value \"%s\" for repeated attribute \"%s\"" }, /* Error */
|
||||
|
||||
/* ReportAttrError - no arguments */
|
||||
{ INVALID_XML_ID, 0, "%1$s cannot copy name attribute to id" }, /* Warning */
|
||||
{ UNEXPECTED_GT, 0, "%1$s missing '>' for end of tag" }, /* Warning if HTML, Error if XML/XHTML */
|
||||
{ UNEXPECTED_QUOTEMARK, 0, "%1$s unexpected or duplicate quote mark" }, /* Error */
|
||||
{ MISSING_QUOTEMARK, 0, "%1$s attribute with missing trailing quote mark" }, /* Error */
|
||||
{ UNEXPECTED_END_OF_FILE_ATTR, 0, "%1$s end of file while parsing attributes" }, /* Error */
|
||||
{ ID_NAME_MISMATCH, 0, "%1$s id and name attribute value mismatch" }, /* Error */
|
||||
{ BACKSLASH_IN_URI, 0, "%1$s URI reference contains backslash. Typo?" }, /* Error */
|
||||
{ FIXED_BACKSLASH, 0, "%1$s converting backslash in URI to slash" }, /* Error */
|
||||
{ ILLEGAL_URI_REFERENCE, 0, "%1$s improperly escaped URI reference" }, /* Error */
|
||||
{ ESCAPED_ILLEGAL_URI, 0, "%1$s escaping malformed URI reference" }, /* Error */
|
||||
{ NEWLINE_IN_URI, 0, "%1$s discarding newline in URI reference" }, /* Error */
|
||||
{ WHITE_IN_URI, 0, "%1$s discarding whitespace in URI reference" }, /* Error */
|
||||
{ UNEXPECTED_EQUALSIGN, 0, "%1$s unexpected '=', expected attribute name" }, /* Error */
|
||||
{ MISSING_IMAGEMAP, 0, "%1$s should use client-side image map" }, /* Warning (but deprecated) */
|
||||
{ INVALID_XML_ID, 0, "%s cannot copy name attribute to id" }, /* Warning */
|
||||
{ UNEXPECTED_GT, 0, "%s missing '>' for end of tag" }, /* Warning if HTML, Error if XML/XHTML */
|
||||
{ UNEXPECTED_QUOTEMARK, 0, "%s unexpected or duplicate quote mark" }, /* Error */
|
||||
{ MISSING_QUOTEMARK, 0, "%s attribute with missing trailing quote mark" }, /* Error */
|
||||
{ UNEXPECTED_END_OF_FILE_ATTR, 0, "%s end of file while parsing attributes" }, /* Error */
|
||||
{ ID_NAME_MISMATCH, 0, "%s id and name attribute value mismatch" }, /* Error */
|
||||
{ BACKSLASH_IN_URI, 0, "%s URI reference contains backslash. Typo?" }, /* Error */
|
||||
{ FIXED_BACKSLASH, 0, "%s converting backslash in URI to slash" }, /* Error */
|
||||
{ ILLEGAL_URI_REFERENCE, 0, "%s improperly escaped URI reference" }, /* Error */
|
||||
{ ESCAPED_ILLEGAL_URI, 0, "%s escaping malformed URI reference" }, /* Error */
|
||||
{ NEWLINE_IN_URI, 0, "%s discarding newline in URI reference" }, /* Error */
|
||||
{ WHITE_IN_URI, 0, "%s discarding whitespace in URI reference" }, /* Error */
|
||||
{ UNEXPECTED_EQUALSIGN, 0, "%s unexpected '=', expected attribute name" }, /* Error */
|
||||
{ MISSING_IMAGEMAP, 0, "%s should use client-side image map" }, /* Warning (but deprecated) */
|
||||
|
||||
/* ReportMissingAttr */
|
||||
{ MISSING_ATTRIBUTE, 0, "%1$s lacks \"%2$s\" attribute" }, /* Error */
|
||||
{ MISSING_ATTRIBUTE, 0, "%s lacks \"%s\" attribute" }, /* Error */
|
||||
|
||||
/* ReportWarning */
|
||||
{ NESTED_EMPHASIS, 0, "nested emphasis %1$s" }, /* Warning */
|
||||
{ NESTED_EMPHASIS, 0, "nested emphasis %s" }, /* Warning */
|
||||
{ NESTED_QUOTATION, 0, "nested q elements, possible typo." }, /* Warning */
|
||||
{ OBSOLETE_ELEMENT, 0, "replacing obsolete element %1$s with %2$s" }, /* Warning */
|
||||
{ COERCE_TO_ENDTAG_WARN, 0, "<%1$s> is probably intended as </%2$s>" }, /* Warning */
|
||||
{ REMOVED_HTML5, 0, "%1$s element removed from HTML5" }, /* Warning */
|
||||
{ OBSOLETE_ELEMENT, 0, "replacing obsolete element %s with %s" }, /* Warning */
|
||||
{ COERCE_TO_ENDTAG_WARN, 0, "<%s> is probably intended as </%s>" }, /* Warning */
|
||||
{ REMOVED_HTML5, 0, "%s element removed from HTML5" }, /* Warning */
|
||||
{ BAD_BODY_HTML5, 0, "Found attribute on body that is obsolete in HTML5. Use CSS" }, /* Warning */
|
||||
{ BAD_ALIGN_HTML5, 0, "The align attribute on the %1$s element is obsolete. Use CSS" }, /* Warning */
|
||||
{ BAD_SUMMARY_HTML5, 0, "The summary attribute on the %1$s element is obsolete in HTML5" }, /* Warning */
|
||||
{ BAD_ALIGN_HTML5, 0, "The align attribute on the %s element is obsolete. Use CSS" }, /* Warning */
|
||||
{ BAD_SUMMARY_HTML5, 0, "The summary attribute on the %s element is obsolete in HTML5" }, /* Warning */
|
||||
|
||||
/* ReportNotice */
|
||||
{ TRIM_EMPTY_ELEMENT, 0, "trimming empty %1$s" }, /* Notice */
|
||||
{ REPLACING_ELEMENT, 0, "replacing %1$s with %2$s" }, /* Notice */
|
||||
{ TRIM_EMPTY_ELEMENT, 0, "trimming empty %s" }, /* Notice */
|
||||
{ REPLACING_ELEMENT, 0, "replacing %s with %s" }, /* Notice */
|
||||
|
||||
/* ReportError */
|
||||
{ COERCE_TO_ENDTAG, 0, "<%1$s> is probably intended as </%2$s>" }, /* Error */
|
||||
{ REPLACING_UNEX_ELEMENT, 0, "replacing unexpected %1$s with %2$s" }, /* Error */
|
||||
{ MISSING_ENDTAG_FOR, 0, "missing </%1$s>" }, /* Error */
|
||||
{ MISSING_ENDTAG_BEFORE, 0, "missing </%1$s> before %2$s" }, /* Error */
|
||||
{ DISCARDING_UNEXPECTED, 0, "discarding unexpected %1$s" }, /* Error */
|
||||
{ NON_MATCHING_ENDTAG, 0, "replacing unexpected %1$s with </%2$s>" }, /* Error */
|
||||
{ TAG_NOT_ALLOWED_IN, 0, "%1$s isn't allowed in <%2$s> elements" }, /* Error */
|
||||
{ MISSING_STARTTAG, 0, "missing <%1$s>" }, /* Error */
|
||||
{ UNEXPECTED_ENDTAG, 0, "unexpected </%1$s>" }, /* Error */
|
||||
{ TOO_MANY_ELEMENTS, 0, "too many %1$s elements" }, /* Error */
|
||||
{ USING_BR_INPLACE_OF, 0, "using <br> in place of %1$s" }, /* Error */
|
||||
{ INSERTING_TAG, 0, "inserting implicit <%1$s>" }, /* Error */
|
||||
{ CANT_BE_NESTED, 0, "%1$s can't be nested" }, /* Error */
|
||||
{ PROPRIETARY_ELEMENT, 0, "%1$s is not approved by W3C" }, /* Error */
|
||||
{ ILLEGAL_NESTING, 0, "%1$s shouldn't be nested" }, /* Error */
|
||||
{ NOFRAMES_CONTENT, 0, "%1$s not inside 'noframes' element" }, /* Error */
|
||||
{ UNEXPECTED_END_OF_FILE, 0, "unexpected end of file %1$s" }, /* Error */
|
||||
{ ELEMENT_NOT_EMPTY, 0, "%1$s element not empty or not closed" }, /* Error */
|
||||
{ UNEXPECTED_ENDTAG_IN, 0, "unexpected </%1$s> in <%2$s>" }, /* Error */
|
||||
{ TOO_MANY_ELEMENTS_IN, 0, "too many %1$s elements in <%2$s>" }, /* Error */
|
||||
{ UNESCAPED_ELEMENT, 0, "unescaped %1$s in pre content" }, /* Error (but deprecated) */
|
||||
{ COERCE_TO_ENDTAG, 0, "<%s> is probably intended as </%s>" }, /* Error */
|
||||
{ REPLACING_UNEX_ELEMENT, 0, "replacing unexpected %s with %s" }, /* Error */
|
||||
{ MISSING_ENDTAG_FOR, 0, "missing </%s>" }, /* Error */
|
||||
{ MISSING_ENDTAG_BEFORE, 0, "missing </%s> before %s" }, /* Error */
|
||||
{ DISCARDING_UNEXPECTED, 0, "discarding unexpected %s" }, /* Error */
|
||||
{ NON_MATCHING_ENDTAG, 0, "replacing unexpected %s with </%s>" }, /* Error */
|
||||
{ TAG_NOT_ALLOWED_IN, 0, "%s isn't allowed in <%s> elements" }, /* Error */
|
||||
{ MISSING_STARTTAG, 0, "missing <%s>" }, /* Error */
|
||||
{ UNEXPECTED_ENDTAG, 0, "unexpected </%s>" }, /* Error */
|
||||
{ TOO_MANY_ELEMENTS, 0, "too many %s elements" }, /* Error */
|
||||
{ USING_BR_INPLACE_OF, 0, "using <br> in place of %s" }, /* Error */
|
||||
{ INSERTING_TAG, 0, "inserting implicit <%s>" }, /* Error */
|
||||
{ CANT_BE_NESTED, 0, "%s can't be nested" }, /* Error */
|
||||
{ PROPRIETARY_ELEMENT, 0, "%s is not approved by W3C" }, /* Error */
|
||||
{ ILLEGAL_NESTING, 0, "%s shouldn't be nested" }, /* Error */
|
||||
{ NOFRAMES_CONTENT, 0, "%s not inside 'noframes' element" }, /* Error */
|
||||
{ UNEXPECTED_END_OF_FILE, 0, "unexpected end of file %s" }, /* Error */
|
||||
{ ELEMENT_NOT_EMPTY, 0, "%s element not empty or not closed" }, /* Error */
|
||||
{ UNEXPECTED_ENDTAG_IN, 0, "unexpected </%s> in <%s>" }, /* Error */
|
||||
{ TOO_MANY_ELEMENTS_IN, 0, "too many %s elements in <%s>" }, /* Error */
|
||||
{ UNESCAPED_ELEMENT, 0, "unescaped %s in pre content" }, /* Error (but deprecated) */
|
||||
|
||||
/* ReportError - no arguments */
|
||||
{ DOCTYPE_AFTER_TAGS, 0, "<!DOCTYPE> isn't allowed after elements" }, /* Error */
|
||||
|
@ -444,10 +442,10 @@ static languageDefinition language_en = { whichPluralForm_en, {
|
|||
/* ReportFatal */
|
||||
{ SUSPECTED_MISSING_QUOTE, 0, "missing quote mark for attribute value" }, /* Error? (not really sometimes) */
|
||||
{ DUPLICATE_FRAMESET, 0, "repeated FRAMESET element" }, /* Error */
|
||||
{ UNKNOWN_ELEMENT, 0, "%1$s is not recognized!" }, /* Error */
|
||||
{ UNKNOWN_ELEMENT, 0, "%s is not recognized!" }, /* Error */
|
||||
|
||||
/* Info */
|
||||
{ PREVIOUS_LOCATION, 0, "<%1$s> previously mentioned" }, /* Info */
|
||||
{ PREVIOUS_LOCATION, 0, "<%s> previously mentioned" }, /* Info */
|
||||
|
||||
#if SUPPORT_ACCESSIBILITY_CHECKS
|
||||
|
||||
|
@ -1594,7 +1592,7 @@ static languageDefinition language_en = { whichPluralForm_en, {
|
|||
{ TC_LABEL_LANG, 0, "lang" },
|
||||
{ TC_LABEL_LEVL, 0, "level" },
|
||||
{ TC_LABEL_OPT, 0, "option" },
|
||||
{ TC_MAIN_ERROR_LOAD_CONFIG, 0, "Loading config file \"%1$s\" failed, err = %2$d" },
|
||||
{ TC_MAIN_ERROR_LOAD_CONFIG, 0, "Loading config file \"%s\" failed, err = %d" },
|
||||
{ TC_OPT_ACCESS, 0,
|
||||
"do additional accessibility checks (<level> = 0, 1, 2, 3). 0 is "
|
||||
"assumed if <level> is missing."
|
||||
|
@ -1675,16 +1673,16 @@ static languageDefinition language_en = { whichPluralForm_en, {
|
|||
TC_STRING_CONF_NOTE, 0, "Values marked with an *asterisk are calculated internally by HTML Tidy"
|
||||
},
|
||||
|
||||
{ TC_STRING_OPT_NOT_DOCUMENTED, 0, "Warning: option `%1$s' is not documented." },
|
||||
{ TC_STRING_OPT_NOT_DOCUMENTED, 0, "Warning: option `%s' is not documented." },
|
||||
{ TC_STRING_OUT_OF_MEMORY, 0, "Out of memory. Bailing out." },
|
||||
{ TC_STRING_FATAL_ERROR, 0, "Fatal error: impossible value for id='%1$d'." },
|
||||
{ TC_STRING_FATAL_ERROR, 0, "Fatal error: impossible value for id='%d'." },
|
||||
{ TC_STRING_FILE_MANIP, 0, "File manipulation" },
|
||||
{ TC_STRING_PROCESS_DIRECTIVES, 0, "Processing directives" },
|
||||
{ TC_STRING_CHAR_ENCODING, 0, "Character encodings" },
|
||||
{ TC_STRING_LANG_MUST_SPECIFY, 0, "A POSIX or Windows locale must be specified." },
|
||||
|
||||
{/* The strings "Tidy" and "HTML Tidy" are the program name and must not be translated. */
|
||||
TC_STRING_LANG_NOT_FOUND, 0, "Tidy doesn't have language '%1$s,' will use '%2$s' instead."
|
||||
TC_STRING_LANG_NOT_FOUND, 0, "Tidy doesn't have language '%s,' will use '%s' instead."
|
||||
},
|
||||
|
||||
{ TC_STRING_MISC, 0, "Miscellaneous" },
|
||||
|
@ -1692,34 +1690,34 @@ static languageDefinition language_en = { whichPluralForm_en, {
|
|||
{ TC_STRING_MUST_SPECIFY, 0, "A Tidy option name must be specified." },
|
||||
|
||||
{/* The strings "Tidy" and "HTML Tidy" are the program name and must not be translated. */
|
||||
TC_STRING_UNKNOWN_OPTION, 0, "HTML Tidy: unknown option: %1$c"
|
||||
TC_STRING_UNKNOWN_OPTION, 0, "HTML Tidy: unknown option: %c"
|
||||
},
|
||||
{/* The strings "Tidy" and "HTML Tidy" are the program name and must not be translated. */
|
||||
TC_STRING_UNKNOWN_OPTION_B, 0, "HTML Tidy: unknown option."
|
||||
},
|
||||
{/* The strings "Tidy" and "HTML Tidy" are the program name and must not be translated. */
|
||||
TC_STRING_VERS_A, 0, "HTML Tidy for %1$s version %2$s"
|
||||
TC_STRING_VERS_A, 0, "HTML Tidy for %s version %s"
|
||||
},
|
||||
{/* The strings "Tidy" and "HTML Tidy" are the program name and must not be translated. */
|
||||
TC_STRING_VERS_B, 0, "HTML Tidy version %1$s"
|
||||
TC_STRING_VERS_B, 0, "HTML Tidy version %s"
|
||||
},
|
||||
|
||||
{/* This console output should be limited to 78 characters per line.
|
||||
- %1$n represents the name of the executable from the file system, and is mostly like going to be "tidy".
|
||||
- %2$2 represents a version number, typically x.x.xx.
|
||||
- %n represents the name of the executable from the file system, and is mostly like going to be "tidy".
|
||||
- %2 represents a version number, typically x.x.xx.
|
||||
- The strings "Tidy" and "HTML Tidy" are the program name and must not be translated. */
|
||||
TC_TXT_HELP_1, 0,
|
||||
"\n"
|
||||
"%1$s [options...] [file...] [options...] [file...]\n"
|
||||
"%s [options...] [file...] [options...] [file...]\n"
|
||||
"Utility to clean up and pretty print HTML/XHTML/XML.\n"
|
||||
"\n"
|
||||
"This is modern HTML Tidy version %2$s.\n"
|
||||
"This is modern HTML Tidy version %s.\n"
|
||||
"\n"
|
||||
},
|
||||
{/* The strings "Tidy" and "HTML Tidy" are the program name and must not be translated.
|
||||
- %1$s represents the platform, for example, "Mac OS X" or "Windows". */
|
||||
- %s represents the platform, for example, "Mac OS X" or "Windows". */
|
||||
TC_TXT_HELP_2A, 0,
|
||||
"Command Line Arguments for HTML Tidy for %1$s:"
|
||||
"Command Line Arguments for HTML Tidy for %s:"
|
||||
},
|
||||
{/* The strings "Tidy" and "HTML Tidy" are the program name and must not be translated. */
|
||||
TC_TXT_HELP_2B, 0,
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#ifndef language_en_gb_h
|
||||
#ifndef language_en_gb_h
|
||||
#define language_en_gb_h
|
||||
/*
|
||||
* language_en_gb.h
|
||||
|
@ -20,7 +20,7 @@
|
|||
*
|
||||
* Orginating PO file metadata:
|
||||
* PO_LAST_TRANSLATOR=jderry
|
||||
* PO_REVISION_DATE=2016-01-23 16:04:27
|
||||
* PO_REVISION_DATE=2016-01-26 14:38:30
|
||||
*/
|
||||
|
||||
#ifdef _MSC_VER
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#ifndef language_es_h
|
||||
#ifndef language_es_h
|
||||
#define language_es_h
|
||||
/*
|
||||
* language_es.h
|
||||
|
@ -20,7 +20,7 @@
|
|||
*
|
||||
* Orginating PO file metadata:
|
||||
* PO_LAST_TRANSLATOR=jderry
|
||||
* PO_REVISION_DATE=2016-01-23 16:04:55
|
||||
* PO_REVISION_DATE=2016-01-26 14:38:30
|
||||
*/
|
||||
|
||||
#ifdef _MSC_VER
|
||||
|
@ -61,26 +61,26 @@ static languageDefinition language_es = { whichPluralForm_es, {
|
|||
- The strings "Tidy" and "HTML Tidy" are the program name and must not be translated. */
|
||||
TEXT_GENERAL_INFO_PLEA, 0,
|
||||
"\n"
|
||||
"\xc2\xbfLe gustar\xc3\xad""a ver Tidy en un espa\xc3\xb1ol correcto? Por favor considere \n"
|
||||
"ayudarnos a localizar HTML Tidy. Para m\xc3\xa1s detalles consulte \n"
|
||||
"¿Le gustaría ver Tidy en un español correcto? Por favor considere \n"
|
||||
"ayudarnos a localizar HTML Tidy. Para más detalles consulte \n"
|
||||
"https://github.com/htacg/tidy-html5/blob/master/README/LOCALIZE.md \n"
|
||||
},
|
||||
{/* Please use _only_ <code></code>, <em></em>, <strong></strong>, and <br/>.
|
||||
It's very important that <br/> be self-closing in this manner!
|
||||
- The strings "Tidy" and "HTML Tidy" are the program name and must not be translated. */
|
||||
TidyMakeClean, 0,
|
||||
"Esta opci\xc3\xb3n especifica si Tidy debe realizar la limpieza de alg\xc3\xban legado etiquetas de "
|
||||
"presentaci\xc3\xb3n (actualmente <code><i></code>, <code><b></code>, <code><center></"
|
||||
"code> cuando encerrados dentro de las etiquetas apropiadas en l\xc3\xadnea y <code><font></"
|
||||
"code>). Si se establece en <code>yes</code>, entonces etiquetas existentes ser\xc3\xa1n reemplazados "
|
||||
"con CSS <code><style></code> y estructural markup seg\xc3\xban corresponda. "
|
||||
"Esta opción especifica si Tidy debe realizar la limpieza de algún legado etiquetas de "
|
||||
"presentación (actualmente <code><i></code>, <code><b></code>, <code><center></"
|
||||
"code> cuando encerrados dentro de las etiquetas apropiadas en línea y <code><font></"
|
||||
"code>). Si se establece en <code>yes</code>, entonces etiquetas existentes serán reemplazados "
|
||||
"con CSS <code><style></code> y estructural markup según corresponda. "
|
||||
},
|
||||
|
||||
#if SUPPORT_ASIAN_ENCODINGS
|
||||
{/* Please use _only_ <code></code>, <em></em>, <strong></strong>, and <br/>.
|
||||
It's very important that <br/> be self-closing in this manner!
|
||||
- The strings "Tidy" and "HTML Tidy" are the program name and must not be translated. */
|
||||
TidyNCR, 0, "Esta opci\xc3\xb3n especifica si Tidy debe permitir referencias de caracteres num\xc3\xa9ricos. "
|
||||
TidyNCR, 0, "Esta opción especifica si Tidy debe permitir referencias de caracteres numéricos. "
|
||||
},
|
||||
#endif /* SUPPORT_ASIAN_ENCODINGS */
|
||||
|
||||
|
@ -88,22 +88,22 @@ static languageDefinition language_es = { whichPluralForm_es, {
|
|||
- The strings "Tidy" and "HTML Tidy" are the program name and must not be translated. */
|
||||
TC_TXT_HELP_LANG_1, 0,
|
||||
"\n"
|
||||
"La opci\xc3\xb3n --language (o --lang) indica el lenguaje Tidy debe \n"
|
||||
"La opción --language (o --lang) indica el lenguaje Tidy debe \n"
|
||||
"utilizar para comunicar su salida. Tenga en cuenta que esto no es \n"
|
||||
"un servicio de traducci\xc3\xb3n de documentos, y s\xc3\xb3lo afecta a los mensajes \n"
|
||||
"un servicio de traducción de documentos, y sólo afecta a los mensajes \n"
|
||||
"que Tidy comunica a usted. \n"
|
||||
"\n"
|
||||
"Cuando se utiliza la l\xc3\xadnea de comandos el argumento --language debe \n"
|
||||
"utilizarse antes de cualquier argumento que dan lugar a la producci\xc3\xb3n, \n"
|
||||
"de lo contrario Tidy producir\xc3\xa1 la salida antes de que se conozca el \n"
|
||||
"Cuando se utiliza la línea de comandos el argumento --language debe \n"
|
||||
"utilizarse antes de cualquier argumento que dan lugar a la producción, \n"
|
||||
"de lo contrario Tidy producirá la salida antes de que se conozca el \n"
|
||||
"idioma a utilizar. \n"
|
||||
"\n"
|
||||
"Adem\xc3\xa1s de los c\xc3\xb3""digos de idioma est\xc3\xa1ndar POSIX, Tidy es capaz de \n"
|
||||
"entender c\xc3\xb3""digos de idioma legados de Windows. Tenga en cuenta que \n"
|
||||
"este lista indica los c\xc3\xb3""digos Tidy entiende, y no indica que \n"
|
||||
"actualmente el idioma est\xc3\xa1 instalado. \n"
|
||||
"Además de los códigos de idioma estándar POSIX, Tidy es capaz de \n"
|
||||
"entender códigos de idioma legados de Windows. Tenga en cuenta que \n"
|
||||
"este lista indica los códigos Tidy entiende, y no indica que \n"
|
||||
"actualmente el idioma está instalado. \n"
|
||||
"\n"
|
||||
"La columna m\xc3\xa1s a la derecha indica c\xc3\xb3mo Tidy comprender\xc3\xa1 el \n"
|
||||
"La columna más a la derecha indica cómo Tidy comprenderá el \n"
|
||||
"legado nombre de Windows.\n"
|
||||
"\n"
|
||||
},
|
||||
|
@ -111,23 +111,23 @@ static languageDefinition language_es = { whichPluralForm_es, {
|
|||
- The strings "Tidy" and "HTML Tidy" are the program name and must not be translated. */
|
||||
TC_TXT_HELP_LANG_2, 0,
|
||||
"\n"
|
||||
"Los siguientes idiomas est\xc3\xa1n instalados actualmente en Tidy. Tenga \n"
|
||||
"en cuenta que no hay garant\xc3\xad""a de que est\xc3\xa1n completos; s\xc3\xb3lo quiere decir \n"
|
||||
"que un desarrollador u otro comenzaron a a\xc3\xb1""adir el idioma indicado. \n"
|
||||
"Los siguientes idiomas están instalados actualmente en Tidy. Tenga \n"
|
||||
"en cuenta que no hay garantía de que están completos; sólo quiere decir \n"
|
||||
"que un desarrollador u otro comenzaron a añadir el idioma indicado. \n"
|
||||
"\n"
|
||||
"Localizaciones incompletas por defecto se usan \"en\" cuando sea \n"
|
||||
"necesario. \xc2\xa1""Favor de informar los desarrolladores de estes casos! \n"
|
||||
"necesario. ¡Favor de informar los desarrolladores de estes casos! \n"
|
||||
"\n"
|
||||
},
|
||||
{/* This console output should be limited to 78 characters per line.
|
||||
- The strings "Tidy" and "HTML Tidy" are the program name and must not be translated. */
|
||||
TC_TXT_HELP_LANG_3, 0,
|
||||
"\n"
|
||||
"Si Tidy es capaz de determinar la configuraci\xc3\xb3n regional entonces \n"
|
||||
"Tidy utilizar\xc3\xa1 el lenguaje de forma autom\xc3\xa1tica de la configuraci\xc3\xb3n \n"
|
||||
"Si Tidy es capaz de determinar la configuración regional entonces \n"
|
||||
"Tidy utilizará el lenguaje de forma automática de la configuración \n"
|
||||
"regional. Por ejemplo los sistemas de tipo Unix utilizan los variables \n"
|
||||
"$LANG y/o $LC_ALL. Consulte a su documentaci\xc3\xb3n del sistema para \n"
|
||||
"obtener m\xc3\xa1s informaci\xc3\xb3n.\n"
|
||||
"$LANG y/o $LC_ALL. Consulte a su documentación del sistema para \n"
|
||||
"obtener más información.\n"
|
||||
"\n"
|
||||
},
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#ifndef language_es_mx_h
|
||||
#ifndef language_es_mx_h
|
||||
#define language_es_mx_h
|
||||
/*
|
||||
* language_es_mx.h
|
||||
|
@ -20,7 +20,7 @@
|
|||
*
|
||||
* Orginating PO file metadata:
|
||||
* PO_LAST_TRANSLATOR=jderry
|
||||
* PO_REVISION_DATE=2016-01-23 16:04:41
|
||||
* PO_REVISION_DATE=2016-01-26 14:38:30
|
||||
*/
|
||||
|
||||
#ifdef _MSC_VER
|
||||
|
@ -61,8 +61,8 @@ static languageDefinition language_es_mx = { whichPluralForm_es_mx, {
|
|||
- The strings "Tidy" and "HTML Tidy" are the program name and must not be translated. */
|
||||
TEXT_GENERAL_INFO_PLEA, 0,
|
||||
"\n"
|
||||
"\xc2\xbfLe gustar\xc3\xad""a ver Tidy en adecuada, espa\xc3\xb1ol mexicano? Por favor considere \n"
|
||||
"ayudarnos a localizar HTML Tidy. Para m\xc3\xa1s detalles consulte \n"
|
||||
"¿Le gustaría ver Tidy en adecuada, español mexicano? Por favor considere \n"
|
||||
"ayudarnos a localizar HTML Tidy. Para más detalles consulte \n"
|
||||
"https://github.com/htacg/tidy-html5/blob/master/README/LOCALIZE.md \n"
|
||||
},
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#ifndef language_zh_cn_h
|
||||
#ifndef language_zh_cn_h
|
||||
#define language_zh_cn_h
|
||||
/*
|
||||
* language_zh_cn.h
|
||||
|
@ -20,7 +20,7 @@
|
|||
*
|
||||
* Orginating PO file metadata:
|
||||
* PO_LAST_TRANSLATOR=jderry
|
||||
* PO_REVISION_DATE=2016-01-23 16:05:15
|
||||
* PO_REVISION_DATE=2016-01-26 14:38:30
|
||||
*/
|
||||
|
||||
#ifdef _MSC_VER
|
||||
|
@ -57,14 +57,14 @@ static languageDefinition language_zh_cn = { whichPluralForm_zh_cn, {
|
|||
{/* Specify the ll or ll_cc language code here. */
|
||||
TIDY_LANGUAGE, 0, "zh_cn"
|
||||
},
|
||||
{ FILE_CANT_OPEN, 0, "\xe6\x97\xa0\xe6\xb3\x95\xe6\x89\x93\xe5\xbc\x80\xe2\x80\x9d%1$s\xe2\x80\x9d\n" },
|
||||
{ LINE_COLUMN_STRING, 0, "\xe8\xa1\x8c %1$d \xe5\x88\x97 %2$d - " },
|
||||
{ STRING_CONTENT_LOOKS, 0, "\xe6\x96\x87\xe6\xa1\xa3\xe5\x86\x85\xe5\xae\xb9\xe7\x9c\x8b\xe8\xb5\xb7\xe6\x9d\xa5\xe5\x83\x8f %1$s" },
|
||||
{ FILE_CANT_OPEN, 0, "无法打开”%s”\n" },
|
||||
{ LINE_COLUMN_STRING, 0, "行 %d 列 %d - " },
|
||||
{ STRING_CONTENT_LOOKS, 0, "文档内容看起来像 %s" },
|
||||
{/* The strings "Tidy" and "HTML Tidy" are the program name and must not be translated. */
|
||||
TC_STRING_VERS_A, 0, "HTML Tidy \xe7\x89\x88\xe6\x9c\xac %2$s \xe7\x94\xa8\xe4\xba\x8e %1$s"
|
||||
TC_STRING_VERS_A, 0, "HTML Tidy 用于 %s 版本 %s"
|
||||
},
|
||||
{/* The strings "Tidy" and "HTML Tidy" are the program name and must not be translated. */
|
||||
TC_STRING_VERS_B, 0, "HTML Tidy \xe7\x89\x88\xe6\x9c\xac %1$s"
|
||||
TC_STRING_VERS_B, 0, "HTML Tidy 版本 %s"
|
||||
},
|
||||
|
||||
{/* This MUST be present and last. */
|
||||
|
|
|
@ -8,9 +8,6 @@
|
|||
#include "forward.h"
|
||||
#include "tmbstr.h"
|
||||
#include "lexer.h"
|
||||
#if defined(_WIN32)
|
||||
#include "win_vsnprintf.h"
|
||||
#endif
|
||||
|
||||
/* like strdup but using an allocator */
|
||||
tmbstr TY_(tmbstrdup)( TidyAllocator *allocator, ctmbstr str )
|
||||
|
|
|
@ -1,129 +0,0 @@
|
|||
/* win_vsnprintf.h -- Provides standard vsnprintf.h and
|
||||
* additional printf routines to Tidy on Windows.
|
||||
*
|
||||
* Created by Jim Derry on 1/8/16.
|
||||
* (c) 2016 HTACG
|
||||
* See tidy.h and access.h for the copyright notice.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
#include "forward.h"
|
||||
#include "win_vsnprintf.h"
|
||||
|
||||
#if defined(__MINGW32__)
|
||||
/* minGW.org doesn't automatically include these in its `libmsvcrt.a` although
|
||||
* `dumpbin /exports C:\Windows\System32\msvcrt.dll` indicates they are present.
|
||||
* We include our own import library `libmsvcrt_tidy.a` that adds these missing
|
||||
* definitions.
|
||||
*
|
||||
* Unfortunately `msvcrt.dll` only includes `_vscprintf_p_l` for some strange
|
||||
* reason, which takes a locale_t which is not available to minGW. Since we're
|
||||
* going to pass NULL anyway, we can import it as a void*.
|
||||
*/
|
||||
extern int _vscprintf_p_l(const char *fmt, void *locale, va_list ap);
|
||||
extern int _vsprintf_p(char *s, uint n, const char *fmt, va_list ap);
|
||||
#endif
|
||||
|
||||
|
||||
#if defined(_WIN32)
|
||||
|
||||
static char* TY_(new_string)( const ctmbstr fmt, va_list args );
|
||||
|
||||
|
||||
/* Provides a proper `vsnprintf` for Windows including correct return
|
||||
* values and with support for positional arguments.
|
||||
* Adapted from FFmpeg -- LGPL
|
||||
*/
|
||||
int TY_(win_vsnprintf)(char *s, uint n, const char *fmt, va_list ap)
|
||||
{
|
||||
int ret;
|
||||
va_list ap_copy;
|
||||
|
||||
if (n == 0)
|
||||
return _vscprintf_p_l(fmt, NULL, ap);
|
||||
|
||||
memset(s, 0, n);
|
||||
va_copy(ap_copy, ap);
|
||||
ret = _vsprintf_p(s, n, fmt, ap_copy);
|
||||
va_end(ap_copy);
|
||||
if (ret == -1)
|
||||
ret = _vscprintf(fmt, ap);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/* Provides a proper `snprintf` for Windows including correct return
|
||||
* values and with support for positional arguments.
|
||||
*/
|
||||
int TY_(win_snprintf)(char *s, uint n, const char *fmt, ...)
|
||||
{
|
||||
int retval;
|
||||
va_list args;
|
||||
va_start(args, fmt);
|
||||
retval = TY_(win_vsnprintf)(s, n, fmt, args);
|
||||
va_end(args);
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
||||
/* Provides a wrapper for `printf` using the improved `vsnprintf`. */
|
||||
int TY_(win_printf)(const char *s, ...)
|
||||
{
|
||||
int result;
|
||||
char *out_string;
|
||||
va_list args;
|
||||
va_start(args, s);
|
||||
out_string = TY_(new_string)( s, args );
|
||||
va_end(args);
|
||||
|
||||
result = printf("%s", out_string);
|
||||
|
||||
if (out_string)
|
||||
free(out_string);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
/* Provides a wrapper for `fprintf` using the improved `vsnprintf`. */
|
||||
int TY_(win_fprintf)(FILE *f, const char *s, ...)
|
||||
{
|
||||
int result;
|
||||
char *out_string;
|
||||
va_list args;
|
||||
va_start(args, s);
|
||||
out_string = TY_(new_string)( s, args );
|
||||
va_end(args);
|
||||
|
||||
result = fprintf(f, "%s", out_string);
|
||||
|
||||
if (out_string)
|
||||
free(out_string);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
/* Convenience to create a new string with a format and arguments.
|
||||
*/
|
||||
static char* TY_(new_string)( const ctmbstr fmt, va_list args )
|
||||
{
|
||||
char *result = NULL;
|
||||
int len = 0;
|
||||
|
||||
len = TY_(win_vsnprintf)( result, 0, fmt, args );
|
||||
if (!(result = malloc( len + 1) ))
|
||||
{ /* @todo */
|
||||
fprintf(stderr, "MALLOC FAILED in win_vsnprintf.c creating a new string!");
|
||||
exit(2);
|
||||
}
|
||||
|
||||
TY_(win_vsnprintf)( result, len + 1, fmt, args );
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
#endif /* defined(_WIN32) */
|
|
@ -1,40 +0,0 @@
|
|||
#ifndef __win_vsnprintf_h__
|
||||
#define __win_vsnprintf_h__
|
||||
|
||||
/* win_vsnprintf.h -- Provides standard vsnprintf.h and
|
||||
* additional printf routines to Tidy on Windows.
|
||||
*
|
||||
* Created by Jim Derry on 1/8/16.
|
||||
* (c) 2016 HTACG
|
||||
* See tidy.h and access.h for the copyright notice.
|
||||
*/
|
||||
|
||||
#if defined(_WIN32)
|
||||
|
||||
#include <stdio.h>
|
||||
#include "tidyplatform.h"
|
||||
#include "forward.h"
|
||||
|
||||
|
||||
/* Provides a proper `vsnprintf` for Windows including correct return
|
||||
* values and with support for positional arguments.
|
||||
*/
|
||||
int TY_(win_vsnprintf)(char *s, uint n, const char *fmt, va_list ap);
|
||||
|
||||
|
||||
/* Provides a proper `snprintf` for Windows including correct return
|
||||
* values and with support for positional arguments.
|
||||
*/
|
||||
int TY_(win_snprintf)(char *s, uint n, const char *fmt, ...);
|
||||
|
||||
|
||||
/* Provides a wrapper for `printf` using the improved `vsnprintf`. */
|
||||
int TY_(win_printf)(const char *s, ...);
|
||||
|
||||
|
||||
/* Provides a wrapper for `fprintf` using the improved `vsnprintf`. */
|
||||
int TY_(win_fprintf)(FILE *f, const char *s, ...);
|
||||
|
||||
|
||||
#endif /* defined(_WIN32) */
|
||||
#endif /* __win_vsnprintf_h_ */
|
Loading…
Reference in a new issue