wuffs gen -version=0.3.0-alpha.5
diff --git a/release/c/wuffs-v0.3.c b/release/c/wuffs-v0.3.c
index d2be780..a5a893f 100644
--- a/release/c/wuffs-v0.3.c
+++ b/release/c/wuffs-v0.3.c
@@ -65,15 +65,15 @@
// each major.minor branch, the commit count should increase monotonically.
//
// WUFFS_VERSION was overridden by "wuffs gen -version" based on revision
-// d377dcaea826f12b47492cced1b75450a440f6c1 committed on 2020-06-17.
+// c94ccef400cd94a23bef9e2a3d824358147ea121 committed on 2020-07-01.
#define WUFFS_VERSION 0x000030000
#define WUFFS_VERSION_MAJOR 0
#define WUFFS_VERSION_MINOR 3
#define WUFFS_VERSION_PATCH 0
-#define WUFFS_VERSION_PRE_RELEASE_LABEL "alpha.4"
-#define WUFFS_VERSION_BUILD_METADATA_COMMIT_COUNT 2514
-#define WUFFS_VERSION_BUILD_METADATA_COMMIT_DATE 20200617
-#define WUFFS_VERSION_STRING "0.3.0-alpha.4+2514.20200617"
+#define WUFFS_VERSION_PRE_RELEASE_LABEL "alpha.5"
+#define WUFFS_VERSION_BUILD_METADATA_COMMIT_COUNT 2523
+#define WUFFS_VERSION_BUILD_METADATA_COMMIT_DATE 20200701
+#define WUFFS_VERSION_STRING "0.3.0-alpha.5+2523.20200701"
// Define WUFFS_CONFIG__STATIC_FUNCTIONS to make all of Wuffs' functions have
// static storage. The motivation is discussed in the "ALLOW STATIC
@@ -111,7 +111,9 @@
#define WUFFS_BASE__WARN_UNUSED_RESULT
#endif
-// Flags for wuffs_foo__bar__initialize functions.
+// --------
+
+// Options (bitwise or'ed together) for wuffs_foo__bar__initialize functions.
#define WUFFS_INITIALIZE__DEFAULT_OPTIONS ((uint32_t)0x00000000)
@@ -193,36 +195,36 @@
} wuffs_base__status;
-extern const char* wuffs_base__note__i_o_redirect;
-extern const char* wuffs_base__note__end_of_data;
-extern const char* wuffs_base__note__metadata_reported;
-extern const char* wuffs_base__suspension__even_more_information;
-extern const char* wuffs_base__suspension__mispositioned_read;
-extern const char* wuffs_base__suspension__mispositioned_write;
-extern const char* wuffs_base__suspension__short_read;
-extern const char* wuffs_base__suspension__short_write;
-extern const char* wuffs_base__error__bad_i_o_position;
-extern const char* wuffs_base__error__bad_argument_length_too_short;
-extern const char* wuffs_base__error__bad_argument;
-extern const char* wuffs_base__error__bad_call_sequence;
-extern const char* wuffs_base__error__bad_receiver;
-extern const char* wuffs_base__error__bad_restart;
-extern const char* wuffs_base__error__bad_sizeof_receiver;
-extern const char* wuffs_base__error__bad_vtable;
-extern const char* wuffs_base__error__bad_workbuf_length;
-extern const char* wuffs_base__error__bad_wuffs_version;
-extern const char* wuffs_base__error__cannot_return_a_suspension;
-extern const char* wuffs_base__error__disabled_by_previous_error;
-extern const char* wuffs_base__error__initialize_falsely_claimed_already_zeroed;
-extern const char* wuffs_base__error__initialize_not_called;
-extern const char* wuffs_base__error__interleaved_coroutine_calls;
-extern const char* wuffs_base__error__no_more_information;
-extern const char* wuffs_base__error__not_enough_data;
-extern const char* wuffs_base__error__out_of_bounds;
-extern const char* wuffs_base__error__unsupported_method;
-extern const char* wuffs_base__error__unsupported_option;
-extern const char* wuffs_base__error__unsupported_pixel_swizzler_option;
-extern const char* wuffs_base__error__too_much_data;
+extern const char wuffs_base__note__i_o_redirect[];
+extern const char wuffs_base__note__end_of_data[];
+extern const char wuffs_base__note__metadata_reported[];
+extern const char wuffs_base__suspension__even_more_information[];
+extern const char wuffs_base__suspension__mispositioned_read[];
+extern const char wuffs_base__suspension__mispositioned_write[];
+extern const char wuffs_base__suspension__short_read[];
+extern const char wuffs_base__suspension__short_write[];
+extern const char wuffs_base__error__bad_i_o_position[];
+extern const char wuffs_base__error__bad_argument_length_too_short[];
+extern const char wuffs_base__error__bad_argument[];
+extern const char wuffs_base__error__bad_call_sequence[];
+extern const char wuffs_base__error__bad_receiver[];
+extern const char wuffs_base__error__bad_restart[];
+extern const char wuffs_base__error__bad_sizeof_receiver[];
+extern const char wuffs_base__error__bad_vtable[];
+extern const char wuffs_base__error__bad_workbuf_length[];
+extern const char wuffs_base__error__bad_wuffs_version[];
+extern const char wuffs_base__error__cannot_return_a_suspension[];
+extern const char wuffs_base__error__disabled_by_previous_error[];
+extern const char wuffs_base__error__initialize_falsely_claimed_already_zeroed[];
+extern const char wuffs_base__error__initialize_not_called[];
+extern const char wuffs_base__error__interleaved_coroutine_calls[];
+extern const char wuffs_base__error__no_more_information[];
+extern const char wuffs_base__error__not_enough_data[];
+extern const char wuffs_base__error__out_of_bounds[];
+extern const char wuffs_base__error__unsupported_method[];
+extern const char wuffs_base__error__unsupported_option[];
+extern const char wuffs_base__error__unsupported_pixel_swizzler_option[];
+extern const char wuffs_base__error__too_much_data[];
static inline wuffs_base__status //
wuffs_base__make_status(const char* repr) {
@@ -353,6 +355,46 @@
// inline attribute to guide optimizations such as inlining, to avoid the
// -Wunused-function warning, and we like to compile with -Wall -Werror.
+static inline int8_t //
+wuffs_base__i8__min(int8_t x, int8_t y) {
+ return x < y ? x : y;
+}
+
+static inline int8_t //
+wuffs_base__i8__max(int8_t x, int8_t y) {
+ return x > y ? x : y;
+}
+
+static inline int16_t //
+wuffs_base__i16__min(int16_t x, int16_t y) {
+ return x < y ? x : y;
+}
+
+static inline int16_t //
+wuffs_base__i16__max(int16_t x, int16_t y) {
+ return x > y ? x : y;
+}
+
+static inline int32_t //
+wuffs_base__i32__min(int32_t x, int32_t y) {
+ return x < y ? x : y;
+}
+
+static inline int32_t //
+wuffs_base__i32__max(int32_t x, int32_t y) {
+ return x > y ? x : y;
+}
+
+static inline int64_t //
+wuffs_base__i64__min(int64_t x, int64_t y) {
+ return x < y ? x : y;
+}
+
+static inline int64_t //
+wuffs_base__i64__max(int64_t x, int64_t y) {
+ return x > y ? x : y;
+}
+
static inline uint8_t //
wuffs_base__u8__min(uint8_t x, uint8_t y) {
return x < y ? x : y;
@@ -3865,43 +3907,49 @@
// ---------------- String Conversions
-// wuffs_base__parse_number_i64 parses the ASCII integer in s. For example, if
-// s contains the bytes "-123" then it will return the int64_t -123.
-//
-// It returns an error if s does not contain an integer or if the integer
-// within would overflow an int64_t.
-//
-// It is similar to wuffs_base__parse_number_u64 but it returns a signed
-// integer, not an unsigned integer. It also allows a leading '+' or '-'.
-WUFFS_BASE__MAYBE_STATIC wuffs_base__result_i64 //
-wuffs_base__parse_number_i64(wuffs_base__slice_u8 s);
+// Options (bitwise or'ed together) for wuffs_base__render_number_xxx
+// functions. The XXX options apply to both integer and floating point. The FXX
+// options apply only to floating point.
-// wuffs_base__parse_number_u64 parses the ASCII integer in s. For example, if
-// s contains the bytes "123" then it will return the uint64_t 123.
+#define WUFFS_BASE__RENDER_NUMBER_XXX__DEFAULT_OPTIONS ((uint32_t)0x00000000)
+
+// WUFFS_BASE__RENDER_NUMBER_XXX__ALIGN_RIGHT means to render to the right side
+// (higher indexes) of the destination slice, leaving any untouched bytes on
+// the left side (lower indexes). The default is vice versa: rendering on the
+// left with slack on the right.
+#define WUFFS_BASE__RENDER_NUMBER_XXX__ALIGN_RIGHT ((uint32_t)0x00000001)
+
+// WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN means to render the leading
+// "+" for non-negative numbers: "+0" and "+12.3" instead of "0" and "12.3".
+#define WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN ((uint32_t)0x00000002)
+
+// WUFFS_BASE__RENDER_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA means to render
+// one-and-a-half as "1,5" instead of "1.5".
+#define WUFFS_BASE__RENDER_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA \
+ ((uint32_t)0x00000100)
+
+// WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_ETC means whether to never
+// (EXPONENT_ABSENT, equivalent to printf's "%f") or to always
+// (EXPONENT_PRESENT, equivalent to printf's "%e") render a floating point
+// number as "1.23e+05" instead of "123000".
//
-// It returns an error if s does not contain an integer or if the integer
-// within would overflow a uint64_t.
+// Having both bits set is the same has having neither bit set, where the
+// notation used depends on whether the exponent is sufficiently large: "0.5"
+// is preferred over "5e-01" but "5e-09" is preferred over "0.000000005".
+#define WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_ABSENT ((uint32_t)0x00000200)
+#define WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_PRESENT ((uint32_t)0x00000400)
+
+// WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION means to render the
+// smallest number of digits so that parsing the resultant string will recover
+// the same double-precision floating point number.
//
-// It is similar to the C standard library's strtoull function, but:
-// - Errors are returned in-band (in a result type), not out-of-band (errno).
-// - It takes a slice (a pointer and length), not a NUL-terminated C string.
-// - It does not take an optional endptr argument. It does not allow a partial
-// parse: it returns an error unless all of s is consumed.
-// - It does not allow whitespace, leading or otherwise.
-// - It does not allow a leading '+' or '-'.
-// - It does not allow unnecessary leading zeroes ("0" is valid and its sole
-// zero is necessary). All of "00", "0644" and "007" are invalid.
-// - It does not take a base argument (e.g. base 10 vs base 16). Instead, it
-// always accepts both decimal (e.g "1234", "0d5678") and hexadecimal (e.g.
-// "0x9aBC"). The caller is responsible for prior filtering of e.g. hex
-// numbers if they are unwanted. For example, Wuffs' JSON decoder will only
-// produce a wuffs_base__token for decimal numbers, not hexadecimal.
-// - It is not affected by i18n / l10n settings such as environment variables.
-// - It does allow arbitrary underscores, except inside the optional 2-byte
-// opening "0d" or "0X" that denotes base-10 or base-16. For example,
-// "__0D_1_002" would successfully parse as "one thousand and two".
-WUFFS_BASE__MAYBE_STATIC wuffs_base__result_u64 //
-wuffs_base__parse_number_u64(wuffs_base__slice_u8 s);
+// For example, double-precision cannot distinguish between 0.3 and
+// 0.299999999999999988897769753748434595763683319091796875, so when this bit
+// is set, rendering the latter will produce "0.3" but rendering
+// 0.3000000000000000444089209850062616169452667236328125 will produce
+// "0.30000000000000004".
+#define WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION \
+ ((uint32_t)0x00000800)
// ---------------- IEEE 754 Floating Point
@@ -3944,6 +3992,8 @@
WUFFS_BASE__MAYBE_STATIC wuffs_base__result_f64 //
wuffs_base__parse_number_f64(wuffs_base__slice_u8 s);
+// --------
+
// wuffs_base__ieee_754_bit_representation__etc converts between a double
// precision numerical value and its IEEE 754 64-bit representation (1 sign
// bit, 11 exponent bits, 52 explicit significand bits).
@@ -3973,6 +4023,105 @@
return f;
}
+// ---------------- Integer
+
+// wuffs_base__parse_number_i64 parses the ASCII integer in s. For example, if
+// s contains the bytes "-123" then it will return the int64_t -123.
+//
+// It returns an error if s does not contain an integer or if the integer
+// within would overflow an int64_t.
+//
+// It is similar to wuffs_base__parse_number_u64 but it returns a signed
+// integer, not an unsigned integer. It also allows a leading '+' or '-'.
+WUFFS_BASE__MAYBE_STATIC wuffs_base__result_i64 //
+wuffs_base__parse_number_i64(wuffs_base__slice_u8 s);
+
+// wuffs_base__parse_number_u64 parses the ASCII integer in s. For example, if
+// s contains the bytes "123" then it will return the uint64_t 123.
+//
+// It returns an error if s does not contain an integer or if the integer
+// within would overflow a uint64_t.
+//
+// It is similar to the C standard library's strtoull function, but:
+// - Errors are returned in-band (in a result type), not out-of-band (errno).
+// - It takes a slice (a pointer and length), not a NUL-terminated C string.
+// - It does not take an optional endptr argument. It does not allow a partial
+// parse: it returns an error unless all of s is consumed.
+// - It does not allow whitespace, leading or otherwise.
+// - It does not allow a leading '+' or '-'.
+// - It does not allow unnecessary leading zeroes ("0" is valid and its sole
+// zero is necessary). All of "00", "0644" and "007" are invalid.
+// - It does not take a base argument (e.g. base 10 vs base 16). Instead, it
+// always accepts both decimal (e.g "1234", "0d5678") and hexadecimal (e.g.
+// "0x9aBC"). The caller is responsible for prior filtering of e.g. hex
+// numbers if they are unwanted. For example, Wuffs' JSON decoder will only
+// produce a wuffs_base__token for decimal numbers, not hexadecimal.
+// - It is not affected by i18n / l10n settings such as environment variables.
+// - It does allow arbitrary underscores, except inside the optional 2-byte
+// opening "0d" or "0X" that denotes base-10 or base-16. For example,
+// "__0D_1_002" would successfully parse as "one thousand and two".
+WUFFS_BASE__MAYBE_STATIC wuffs_base__result_u64 //
+wuffs_base__parse_number_u64(wuffs_base__slice_u8 s);
+
+// --------
+
+#define WUFFS_BASE__I64__BYTE_LENGTH__MAX_INCL 20
+#define WUFFS_BASE__U64__BYTE_LENGTH__MAX_INCL 21
+
+// wuffs_base__render_number_f64 writes the decimal encoding of x to dst and
+// returns the number of bytes written. If dst is shorter than the entire
+// encoding, it returns 0 (and no bytes are written).
+//
+// For those familiar with C's printf or Go's fmt.Printf functions:
+// - "%e" means the WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_PRESENT option.
+// - "%f" means the WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_ABSENT option.
+// - "%g" means neither or both bits are set.
+//
+// The precision argument controls the number of digits rendered, excluding the
+// exponent (the "e+05" in "1.23e+05"):
+// - for "%e" and "%f" it is the number of digits after the decimal separator,
+// - for "%g" it is the number of significant digits (and trailing zeroes are
+// removed).
+//
+// A precision of 6 gives similar output to printf's defaults.
+//
+// A precision greater than 4095 is equivalent to 4095.
+//
+// The precision argument is ignored when the
+// WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION option is set. This is
+// similar to Go's strconv.FormatFloat with a negative (i.e. non-sensical)
+// precision, but there is no corresponding feature in C's printf.
+//
+// Extreme values of x will be rendered as "NaN", "Inf" (or "+Inf" if the
+// WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN option is set) or "-Inf".
+WUFFS_BASE__MAYBE_STATIC size_t //
+wuffs_base__render_number_f64(wuffs_base__slice_u8 dst,
+ double x,
+ uint32_t precision,
+ uint32_t options);
+
+// wuffs_base__render_number_i64 writes the decimal encoding of x to dst and
+// returns the number of bytes written. If dst is shorter than the entire
+// encoding, it returns 0 (and no bytes are written).
+//
+// dst will never be too short if its length is at least 20, also known as
+// WUFFS_BASE__I64__BYTE_LENGTH__MAX_INCL.
+WUFFS_BASE__MAYBE_STATIC size_t //
+wuffs_base__render_number_i64(wuffs_base__slice_u8 dst,
+ int64_t x,
+ uint32_t options);
+
+// wuffs_base__render_number_u64 writes the decimal encoding of x to dst and
+// returns the number of bytes written. If dst is shorter than the entire
+// encoding, it returns 0 (and no bytes are written).
+//
+// dst will never be too short if its length is at least 21, also known as
+// WUFFS_BASE__U64__BYTE_LENGTH__MAX_INCL.
+WUFFS_BASE__MAYBE_STATIC size_t //
+wuffs_base__render_number_u64(wuffs_base__slice_u8 dst,
+ uint64_t x,
+ uint32_t options);
+
// ---------------- Hexadecimal
// wuffs_base__hexadecimal__decode2 converts "6A6b" to "jk", where e.g. 'j' is
@@ -4141,7 +4290,7 @@
// --------
-extern const char* wuffs_base__hasher_u32__vtable_name;
+extern const char wuffs_base__hasher_u32__vtable_name[];
typedef struct {
wuffs_base__empty_struct (*set_quirk_enabled)(
@@ -4202,7 +4351,7 @@
// --------
-extern const char* wuffs_base__image_decoder__vtable_name;
+extern const char wuffs_base__image_decoder__vtable_name[];
typedef struct {
wuffs_base__status (*decode_frame)(
@@ -4423,7 +4572,7 @@
// --------
-extern const char* wuffs_base__io_transformer__vtable_name;
+extern const char wuffs_base__io_transformer__vtable_name[];
typedef struct {
wuffs_base__empty_struct (*set_quirk_enabled)(
@@ -4501,7 +4650,7 @@
// --------
-extern const char* wuffs_base__token_decoder__vtable_name;
+extern const char wuffs_base__token_decoder__vtable_name[];
typedef struct {
wuffs_base__status (*decode_tokens)(
@@ -4601,14 +4750,14 @@
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
//
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
-// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for initialize_flags.
+// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
wuffs_adler32__hasher__initialize(
wuffs_adler32__hasher* self,
size_t sizeof_star_self,
uint64_t wuffs_version,
- uint32_t initialize_flags);
+ uint32_t options);
size_t
sizeof__wuffs_adler32__hasher();
@@ -4727,9 +4876,9 @@
initialize(
size_t sizeof_star_self,
uint64_t wuffs_version,
- uint32_t initialize_flags) {
+ uint32_t options) {
return wuffs_adler32__hasher__initialize(
- this, sizeof_star_self, wuffs_version, initialize_flags);
+ this, sizeof_star_self, wuffs_version, options);
}
inline wuffs_base__hasher_u32*
@@ -4765,8 +4914,8 @@
// ---------------- Status Codes
-extern const char* wuffs_bmp__error__bad_header;
-extern const char* wuffs_bmp__error__unsupported_bmp_file;
+extern const char wuffs_bmp__error__bad_header[];
+extern const char wuffs_bmp__error__unsupported_bmp_file[];
// ---------------- Public Consts
@@ -4782,14 +4931,14 @@
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
//
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
-// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for initialize_flags.
+// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
wuffs_bmp__decoder__initialize(
wuffs_bmp__decoder* self,
size_t sizeof_star_self,
uint64_t wuffs_version,
- uint32_t initialize_flags);
+ uint32_t options);
size_t
sizeof__wuffs_bmp__decoder();
@@ -5002,9 +5151,9 @@
initialize(
size_t sizeof_star_self,
uint64_t wuffs_version,
- uint32_t initialize_flags) {
+ uint32_t options) {
return wuffs_bmp__decoder__initialize(
- this, sizeof_star_self, wuffs_version, initialize_flags);
+ this, sizeof_star_self, wuffs_version, options);
}
inline wuffs_base__image_decoder*
@@ -5117,14 +5266,14 @@
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
//
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
-// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for initialize_flags.
+// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
wuffs_crc32__ieee_hasher__initialize(
wuffs_crc32__ieee_hasher* self,
size_t sizeof_star_self,
uint64_t wuffs_version,
- uint32_t initialize_flags);
+ uint32_t options);
size_t
sizeof__wuffs_crc32__ieee_hasher();
@@ -5242,9 +5391,9 @@
initialize(
size_t sizeof_star_self,
uint64_t wuffs_version,
- uint32_t initialize_flags) {
+ uint32_t options) {
return wuffs_crc32__ieee_hasher__initialize(
- this, sizeof_star_self, wuffs_version, initialize_flags);
+ this, sizeof_star_self, wuffs_version, options);
}
inline wuffs_base__hasher_u32*
@@ -5280,19 +5429,19 @@
// ---------------- Status Codes
-extern const char* wuffs_deflate__error__bad_huffman_code_over_subscribed;
-extern const char* wuffs_deflate__error__bad_huffman_code_under_subscribed;
-extern const char* wuffs_deflate__error__bad_huffman_code_length_count;
-extern const char* wuffs_deflate__error__bad_huffman_code_length_repetition;
-extern const char* wuffs_deflate__error__bad_huffman_code;
-extern const char* wuffs_deflate__error__bad_huffman_minimum_code_length;
-extern const char* wuffs_deflate__error__bad_block;
-extern const char* wuffs_deflate__error__bad_distance;
-extern const char* wuffs_deflate__error__bad_distance_code_count;
-extern const char* wuffs_deflate__error__bad_literal_length_code_count;
-extern const char* wuffs_deflate__error__inconsistent_stored_block_length;
-extern const char* wuffs_deflate__error__missing_end_of_block_code;
-extern const char* wuffs_deflate__error__no_huffman_codes;
+extern const char wuffs_deflate__error__bad_huffman_code_over_subscribed[];
+extern const char wuffs_deflate__error__bad_huffman_code_under_subscribed[];
+extern const char wuffs_deflate__error__bad_huffman_code_length_count[];
+extern const char wuffs_deflate__error__bad_huffman_code_length_repetition[];
+extern const char wuffs_deflate__error__bad_huffman_code[];
+extern const char wuffs_deflate__error__bad_huffman_minimum_code_length[];
+extern const char wuffs_deflate__error__bad_block[];
+extern const char wuffs_deflate__error__bad_distance[];
+extern const char wuffs_deflate__error__bad_distance_code_count[];
+extern const char wuffs_deflate__error__bad_literal_length_code_count[];
+extern const char wuffs_deflate__error__inconsistent_stored_block_length[];
+extern const char wuffs_deflate__error__missing_end_of_block_code[];
+extern const char wuffs_deflate__error__no_huffman_codes[];
// ---------------- Public Consts
@@ -5308,14 +5457,14 @@
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
//
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
-// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for initialize_flags.
+// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
wuffs_deflate__decoder__initialize(
wuffs_deflate__decoder* self,
size_t sizeof_star_self,
uint64_t wuffs_version,
- uint32_t initialize_flags);
+ uint32_t options);
size_t
sizeof__wuffs_deflate__decoder();
@@ -5496,9 +5645,9 @@
initialize(
size_t sizeof_star_self,
uint64_t wuffs_version,
- uint32_t initialize_flags) {
+ uint32_t options) {
return wuffs_deflate__decoder__initialize(
- this, sizeof_star_self, wuffs_version, initialize_flags);
+ this, sizeof_star_self, wuffs_version, options);
}
inline wuffs_base__io_transformer*
@@ -5547,7 +5696,7 @@
// ---------------- Status Codes
-extern const char* wuffs_lzw__error__bad_code;
+extern const char wuffs_lzw__error__bad_code[];
// ---------------- Public Consts
@@ -5563,14 +5712,14 @@
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
//
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
-// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for initialize_flags.
+// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
wuffs_lzw__decoder__initialize(
wuffs_lzw__decoder* self,
size_t sizeof_star_self,
uint64_t wuffs_version,
- uint32_t initialize_flags);
+ uint32_t options);
size_t
sizeof__wuffs_lzw__decoder();
@@ -5724,9 +5873,9 @@
initialize(
size_t sizeof_star_self,
uint64_t wuffs_version,
- uint32_t initialize_flags) {
+ uint32_t options) {
return wuffs_lzw__decoder__initialize(
- this, sizeof_star_self, wuffs_version, initialize_flags);
+ this, sizeof_star_self, wuffs_version, options);
}
inline wuffs_base__io_transformer*
@@ -5780,12 +5929,12 @@
// ---------------- Status Codes
-extern const char* wuffs_gif__error__bad_extension_label;
-extern const char* wuffs_gif__error__bad_frame_size;
-extern const char* wuffs_gif__error__bad_graphic_control;
-extern const char* wuffs_gif__error__bad_header;
-extern const char* wuffs_gif__error__bad_literal_width;
-extern const char* wuffs_gif__error__bad_palette;
+extern const char wuffs_gif__error__bad_extension_label[];
+extern const char wuffs_gif__error__bad_frame_size[];
+extern const char wuffs_gif__error__bad_graphic_control[];
+extern const char wuffs_gif__error__bad_header[];
+extern const char wuffs_gif__error__bad_literal_width[];
+extern const char wuffs_gif__error__bad_palette[];
// ---------------- Public Consts
@@ -5817,14 +5966,14 @@
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
//
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
-// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for initialize_flags.
+// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
wuffs_gif__config_decoder__initialize(
wuffs_gif__config_decoder* self,
size_t sizeof_star_self,
uint64_t wuffs_version,
- uint32_t initialize_flags);
+ uint32_t options);
size_t
sizeof__wuffs_gif__config_decoder();
@@ -5834,7 +5983,7 @@
wuffs_gif__decoder* self,
size_t sizeof_star_self,
uint64_t wuffs_version,
- uint32_t initialize_flags);
+ uint32_t options);
size_t
sizeof__wuffs_gif__decoder();
@@ -6168,9 +6317,9 @@
initialize(
size_t sizeof_star_self,
uint64_t wuffs_version,
- uint32_t initialize_flags) {
+ uint32_t options) {
return wuffs_gif__config_decoder__initialize(
- this, sizeof_star_self, wuffs_version, initialize_flags);
+ this, sizeof_star_self, wuffs_version, options);
}
inline wuffs_base__image_decoder*
@@ -6431,9 +6580,9 @@
initialize(
size_t sizeof_star_self,
uint64_t wuffs_version,
- uint32_t initialize_flags) {
+ uint32_t options) {
return wuffs_gif__decoder__initialize(
- this, sizeof_star_self, wuffs_version, initialize_flags);
+ this, sizeof_star_self, wuffs_version, options);
}
inline wuffs_base__image_decoder*
@@ -6534,10 +6683,10 @@
// ---------------- Status Codes
-extern const char* wuffs_gzip__error__bad_checksum;
-extern const char* wuffs_gzip__error__bad_compression_method;
-extern const char* wuffs_gzip__error__bad_encoding_flags;
-extern const char* wuffs_gzip__error__bad_header;
+extern const char wuffs_gzip__error__bad_checksum[];
+extern const char wuffs_gzip__error__bad_compression_method[];
+extern const char wuffs_gzip__error__bad_encoding_flags[];
+extern const char wuffs_gzip__error__bad_header[];
// ---------------- Public Consts
@@ -6553,14 +6702,14 @@
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
//
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
-// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for initialize_flags.
+// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
wuffs_gzip__decoder__initialize(
wuffs_gzip__decoder* self,
size_t sizeof_star_self,
uint64_t wuffs_version,
- uint32_t initialize_flags);
+ uint32_t options);
size_t
sizeof__wuffs_gzip__decoder();
@@ -6704,9 +6853,9 @@
initialize(
size_t sizeof_star_self,
uint64_t wuffs_version,
- uint32_t initialize_flags) {
+ uint32_t options) {
return wuffs_gzip__decoder__initialize(
- this, sizeof_star_self, wuffs_version, initialize_flags);
+ this, sizeof_star_self, wuffs_version, options);
}
inline wuffs_base__io_transformer*
@@ -6755,12 +6904,12 @@
// ---------------- Status Codes
-extern const char* wuffs_json__error__bad_c0_control_code;
-extern const char* wuffs_json__error__bad_utf_8;
-extern const char* wuffs_json__error__bad_backslash_escape;
-extern const char* wuffs_json__error__bad_input;
-extern const char* wuffs_json__error__unsupported_number_length;
-extern const char* wuffs_json__error__unsupported_recursion_depth;
+extern const char wuffs_json__error__bad_c0_control_code[];
+extern const char wuffs_json__error__bad_utf_8[];
+extern const char wuffs_json__error__bad_backslash_escape[];
+extern const char wuffs_json__error__bad_input[];
+extern const char wuffs_json__error__unsupported_number_length[];
+extern const char wuffs_json__error__unsupported_recursion_depth[];
// ---------------- Public Consts
@@ -6818,14 +6967,14 @@
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
//
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
-// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for initialize_flags.
+// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
wuffs_json__decoder__initialize(
wuffs_json__decoder* self,
size_t sizeof_star_self,
uint64_t wuffs_version,
- uint32_t initialize_flags);
+ uint32_t options);
size_t
sizeof__wuffs_json__decoder();
@@ -6971,9 +7120,9 @@
initialize(
size_t sizeof_star_self,
uint64_t wuffs_version,
- uint32_t initialize_flags) {
+ uint32_t options) {
return wuffs_json__decoder__initialize(
- this, sizeof_star_self, wuffs_version, initialize_flags);
+ this, sizeof_star_self, wuffs_version, options);
}
inline wuffs_base__token_decoder*
@@ -7016,7 +7165,7 @@
// ---------------- Status Codes
-extern const char* wuffs_wbmp__error__bad_header;
+extern const char wuffs_wbmp__error__bad_header[];
// ---------------- Public Consts
@@ -7032,14 +7181,14 @@
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
//
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
-// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for initialize_flags.
+// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
wuffs_wbmp__decoder__initialize(
wuffs_wbmp__decoder* self,
size_t sizeof_star_self,
uint64_t wuffs_version,
- uint32_t initialize_flags);
+ uint32_t options);
size_t
sizeof__wuffs_wbmp__decoder();
@@ -7238,9 +7387,9 @@
initialize(
size_t sizeof_star_self,
uint64_t wuffs_version,
- uint32_t initialize_flags) {
+ uint32_t options) {
return wuffs_wbmp__decoder__initialize(
- this, sizeof_star_self, wuffs_version, initialize_flags);
+ this, sizeof_star_self, wuffs_version, options);
}
inline wuffs_base__image_decoder*
@@ -7341,12 +7490,12 @@
// ---------------- Status Codes
-extern const char* wuffs_zlib__note__dictionary_required;
-extern const char* wuffs_zlib__error__bad_checksum;
-extern const char* wuffs_zlib__error__bad_compression_method;
-extern const char* wuffs_zlib__error__bad_compression_window_size;
-extern const char* wuffs_zlib__error__bad_parity_check;
-extern const char* wuffs_zlib__error__incorrect_dictionary;
+extern const char wuffs_zlib__note__dictionary_required[];
+extern const char wuffs_zlib__error__bad_checksum[];
+extern const char wuffs_zlib__error__bad_compression_method[];
+extern const char wuffs_zlib__error__bad_compression_window_size[];
+extern const char wuffs_zlib__error__bad_parity_check[];
+extern const char wuffs_zlib__error__incorrect_dictionary[];
// ---------------- Public Consts
@@ -7362,14 +7511,14 @@
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
//
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
-// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for initialize_flags.
+// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
wuffs_zlib__decoder__initialize(
wuffs_zlib__decoder* self,
size_t sizeof_star_self,
uint64_t wuffs_version,
- uint32_t initialize_flags);
+ uint32_t options);
size_t
sizeof__wuffs_zlib__decoder();
@@ -7526,9 +7675,9 @@
initialize(
size_t sizeof_star_self,
uint64_t wuffs_version,
- uint32_t initialize_flags) {
+ uint32_t options) {
return wuffs_zlib__decoder__initialize(
- this, sizeof_star_self, wuffs_version, initialize_flags);
+ this, sizeof_star_self, wuffs_version, options);
}
inline wuffs_base__io_transformer*
@@ -8154,548 +8303,41 @@
0x08, 0x0A, 0x0C, 0x10, 0x18, 0x20, 0x30, 0x40,
};
-const char* wuffs_base__note__i_o_redirect = "@base: I/O redirect";
-const char* wuffs_base__note__end_of_data = "@base: end of data";
-const char* wuffs_base__note__metadata_reported = "@base: metadata reported";
-const char* wuffs_base__suspension__even_more_information = "$base: even more information";
-const char* wuffs_base__suspension__mispositioned_read = "$base: mispositioned read";
-const char* wuffs_base__suspension__mispositioned_write = "$base: mispositioned write";
-const char* wuffs_base__suspension__short_read = "$base: short read";
-const char* wuffs_base__suspension__short_write = "$base: short write";
-const char* wuffs_base__error__bad_i_o_position = "#base: bad I/O position";
-const char* wuffs_base__error__bad_argument_length_too_short = "#base: bad argument (length too short)";
-const char* wuffs_base__error__bad_argument = "#base: bad argument";
-const char* wuffs_base__error__bad_call_sequence = "#base: bad call sequence";
-const char* wuffs_base__error__bad_receiver = "#base: bad receiver";
-const char* wuffs_base__error__bad_restart = "#base: bad restart";
-const char* wuffs_base__error__bad_sizeof_receiver = "#base: bad sizeof receiver";
-const char* wuffs_base__error__bad_vtable = "#base: bad vtable";
-const char* wuffs_base__error__bad_workbuf_length = "#base: bad workbuf length";
-const char* wuffs_base__error__bad_wuffs_version = "#base: bad wuffs version";
-const char* wuffs_base__error__cannot_return_a_suspension = "#base: cannot return a suspension";
-const char* wuffs_base__error__disabled_by_previous_error = "#base: disabled by previous error";
-const char* wuffs_base__error__initialize_falsely_claimed_already_zeroed = "#base: initialize falsely claimed already zeroed";
-const char* wuffs_base__error__initialize_not_called = "#base: initialize not called";
-const char* wuffs_base__error__interleaved_coroutine_calls = "#base: interleaved coroutine calls";
-const char* wuffs_base__error__no_more_information = "#base: no more information";
-const char* wuffs_base__error__not_enough_data = "#base: not enough data";
-const char* wuffs_base__error__out_of_bounds = "#base: out of bounds";
-const char* wuffs_base__error__unsupported_method = "#base: unsupported method";
-const char* wuffs_base__error__unsupported_option = "#base: unsupported option";
-const char* wuffs_base__error__unsupported_pixel_swizzler_option = "#base: unsupported pixel swizzler option";
-const char* wuffs_base__error__too_much_data = "#base: too much data";
+const char wuffs_base__note__i_o_redirect[] = "@base: I/O redirect";
+const char wuffs_base__note__end_of_data[] = "@base: end of data";
+const char wuffs_base__note__metadata_reported[] = "@base: metadata reported";
+const char wuffs_base__suspension__even_more_information[] = "$base: even more information";
+const char wuffs_base__suspension__mispositioned_read[] = "$base: mispositioned read";
+const char wuffs_base__suspension__mispositioned_write[] = "$base: mispositioned write";
+const char wuffs_base__suspension__short_read[] = "$base: short read";
+const char wuffs_base__suspension__short_write[] = "$base: short write";
+const char wuffs_base__error__bad_i_o_position[] = "#base: bad I/O position";
+const char wuffs_base__error__bad_argument_length_too_short[] = "#base: bad argument (length too short)";
+const char wuffs_base__error__bad_argument[] = "#base: bad argument";
+const char wuffs_base__error__bad_call_sequence[] = "#base: bad call sequence";
+const char wuffs_base__error__bad_receiver[] = "#base: bad receiver";
+const char wuffs_base__error__bad_restart[] = "#base: bad restart";
+const char wuffs_base__error__bad_sizeof_receiver[] = "#base: bad sizeof receiver";
+const char wuffs_base__error__bad_vtable[] = "#base: bad vtable";
+const char wuffs_base__error__bad_workbuf_length[] = "#base: bad workbuf length";
+const char wuffs_base__error__bad_wuffs_version[] = "#base: bad wuffs version";
+const char wuffs_base__error__cannot_return_a_suspension[] = "#base: cannot return a suspension";
+const char wuffs_base__error__disabled_by_previous_error[] = "#base: disabled by previous error";
+const char wuffs_base__error__initialize_falsely_claimed_already_zeroed[] = "#base: initialize falsely claimed already zeroed";
+const char wuffs_base__error__initialize_not_called[] = "#base: initialize not called";
+const char wuffs_base__error__interleaved_coroutine_calls[] = "#base: interleaved coroutine calls";
+const char wuffs_base__error__no_more_information[] = "#base: no more information";
+const char wuffs_base__error__not_enough_data[] = "#base: not enough data";
+const char wuffs_base__error__out_of_bounds[] = "#base: out of bounds";
+const char wuffs_base__error__unsupported_method[] = "#base: unsupported method";
+const char wuffs_base__error__unsupported_option[] = "#base: unsupported option";
+const char wuffs_base__error__unsupported_pixel_swizzler_option[] = "#base: unsupported pixel swizzler option";
+const char wuffs_base__error__too_much_data[] = "#base: too much data";
-const char* wuffs_base__hasher_u32__vtable_name = "{vtable}wuffs_base__hasher_u32";
-const char* wuffs_base__image_decoder__vtable_name = "{vtable}wuffs_base__image_decoder";
-const char* wuffs_base__io_transformer__vtable_name = "{vtable}wuffs_base__io_transformer";
-const char* wuffs_base__token_decoder__vtable_name = "{vtable}wuffs_base__token_decoder";
-
-// ---------------- String Conversions
-
-// wuffs_base__parse_number__foo_digits entries are 0x00 for invalid digits,
-// and (0x80 | v) for valid digits, where v is the 4 bit value.
-
-static const uint8_t wuffs_base__parse_number__decimal_digits[256] = {
- // 0 1 2 3 4 5 6 7
- // 8 9 A B C D E F
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x00 ..= 0x07.
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x08 ..= 0x0F.
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x10 ..= 0x17.
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x18 ..= 0x1F.
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x20 ..= 0x27.
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x28 ..= 0x2F.
- 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, // 0x30 ..= 0x37. '0'-'7'.
- 0x88, 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x38 ..= 0x3F. '8'-'9'.
-
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x40 ..= 0x47.
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x48 ..= 0x4F.
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x50 ..= 0x57.
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x58 ..= 0x5F.
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x60 ..= 0x67.
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x68 ..= 0x6F.
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x70 ..= 0x77.
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x78 ..= 0x7F.
-
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x80 ..= 0x87.
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x88 ..= 0x8F.
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x90 ..= 0x97.
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x98 ..= 0x9F.
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xA0 ..= 0xA7.
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xA8 ..= 0xAF.
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xB0 ..= 0xB7.
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xB8 ..= 0xBF.
-
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xC0 ..= 0xC7.
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xC8 ..= 0xCF.
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xD0 ..= 0xD7.
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xD8 ..= 0xDF.
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xE0 ..= 0xE7.
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xE8 ..= 0xEF.
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xF0 ..= 0xF7.
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xF8 ..= 0xFF.
- // 0 1 2 3 4 5 6 7
- // 8 9 A B C D E F
-};
-
-static const uint8_t wuffs_base__parse_number__hexadecimal_digits[256] = {
- // 0 1 2 3 4 5 6 7
- // 8 9 A B C D E F
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x00 ..= 0x07.
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x08 ..= 0x0F.
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x10 ..= 0x17.
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x18 ..= 0x1F.
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x20 ..= 0x27.
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x28 ..= 0x2F.
- 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, // 0x30 ..= 0x37. '0'-'7'.
- 0x88, 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x38 ..= 0x3F. '8'-'9'.
-
- 0x00, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x00, // 0x40 ..= 0x47. 'A'-'F'.
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x48 ..= 0x4F.
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x50 ..= 0x57.
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x58 ..= 0x5F.
- 0x00, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x00, // 0x60 ..= 0x67. 'a'-'f'.
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x68 ..= 0x6F.
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x70 ..= 0x77.
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x78 ..= 0x7F.
-
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x80 ..= 0x87.
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x88 ..= 0x8F.
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x90 ..= 0x97.
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x98 ..= 0x9F.
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xA0 ..= 0xA7.
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xA8 ..= 0xAF.
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xB0 ..= 0xB7.
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xB8 ..= 0xBF.
-
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xC0 ..= 0xC7.
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xC8 ..= 0xCF.
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xD0 ..= 0xD7.
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xD8 ..= 0xDF.
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xE0 ..= 0xE7.
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xE8 ..= 0xEF.
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xF0 ..= 0xF7.
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xF8 ..= 0xFF.
- // 0 1 2 3 4 5 6 7
- // 8 9 A B C D E F
-};
-
-// --------
-
-WUFFS_BASE__MAYBE_STATIC wuffs_base__result_i64 //
-wuffs_base__parse_number_i64(wuffs_base__slice_u8 s) {
- uint8_t* p = s.ptr;
- uint8_t* q = s.ptr + s.len;
-
- for (; (p < q) && (*p == '_'); p++) {
- }
-
- bool negative = false;
- if (p >= q) {
- goto fail_bad_argument;
- } else if (*p == '-') {
- p++;
- negative = true;
- } else if (*p == '+') {
- p++;
- }
-
- do {
- wuffs_base__result_u64 r = wuffs_base__parse_number_u64(
- wuffs_base__make_slice_u8(p, (size_t)(q - p)));
- if (r.status.repr != NULL) {
- wuffs_base__result_i64 ret;
- ret.status.repr = r.status.repr;
- ret.value = 0;
- return ret;
- } else if (negative) {
- if (r.value > 0x8000000000000000) {
- goto fail_out_of_bounds;
- }
- wuffs_base__result_i64 ret;
- ret.status.repr = NULL;
- ret.value = -(int64_t)(r.value);
- return ret;
- } else if (r.value > 0x7FFFFFFFFFFFFFFF) {
- goto fail_out_of_bounds;
- } else {
- wuffs_base__result_i64 ret;
- ret.status.repr = NULL;
- ret.value = +(int64_t)(r.value);
- return ret;
- }
- } while (0);
-
-fail_bad_argument:
- do {
- wuffs_base__result_i64 ret;
- ret.status.repr = wuffs_base__error__bad_argument;
- ret.value = 0;
- return ret;
- } while (0);
-
-fail_out_of_bounds:
- do {
- wuffs_base__result_i64 ret;
- ret.status.repr = wuffs_base__error__out_of_bounds;
- ret.value = 0;
- return ret;
- } while (0);
-}
-
-WUFFS_BASE__MAYBE_STATIC wuffs_base__result_u64 //
-wuffs_base__parse_number_u64(wuffs_base__slice_u8 s) {
- uint8_t* p = s.ptr;
- uint8_t* q = s.ptr + s.len;
-
- for (; (p < q) && (*p == '_'); p++) {
- }
-
- if (p >= q) {
- goto fail_bad_argument;
-
- } else if (*p == '0') {
- p++;
- if (p >= q) {
- goto ok_zero;
- }
- if (*p == '_') {
- p++;
- for (; p < q; p++) {
- if (*p != '_') {
- goto fail_bad_argument;
- }
- }
- goto ok_zero;
- }
-
- if ((*p == 'x') || (*p == 'X')) {
- p++;
- for (; (p < q) && (*p == '_'); p++) {
- }
- if (p < q) {
- goto hexadecimal;
- }
-
- } else if ((*p == 'd') || (*p == 'D')) {
- p++;
- for (; (p < q) && (*p == '_'); p++) {
- }
- if (p < q) {
- goto decimal;
- }
- }
-
- goto fail_bad_argument;
- }
-
-decimal:
- do {
- uint64_t v = wuffs_base__parse_number__decimal_digits[*p++];
- if (v == 0) {
- goto fail_bad_argument;
- }
- v &= 0x0F;
-
- // UINT64_MAX is 18446744073709551615, which is ((10 * max10) + max1).
- const uint64_t max10 = 1844674407370955161u;
- const uint8_t max1 = 5;
-
- for (; p < q; p++) {
- if (*p == '_') {
- continue;
- }
- uint8_t digit = wuffs_base__parse_number__decimal_digits[*p];
- if (digit == 0) {
- goto fail_bad_argument;
- }
- digit &= 0x0F;
- if ((v > max10) || ((v == max10) && (digit > max1))) {
- goto fail_out_of_bounds;
- }
- v = (10 * v) + ((uint64_t)(digit));
- }
-
- wuffs_base__result_u64 ret;
- ret.status.repr = NULL;
- ret.value = v;
- return ret;
- } while (0);
-
-hexadecimal:
- do {
- uint64_t v = wuffs_base__parse_number__hexadecimal_digits[*p++];
- if (v == 0) {
- goto fail_bad_argument;
- }
- v &= 0x0F;
-
- for (; p < q; p++) {
- if (*p == '_') {
- continue;
- }
- uint8_t digit = wuffs_base__parse_number__hexadecimal_digits[*p];
- if (digit == 0) {
- goto fail_bad_argument;
- }
- digit &= 0x0F;
- if ((v >> 60) != 0) {
- goto fail_out_of_bounds;
- }
- v = (v << 4) | ((uint64_t)(digit));
- }
-
- wuffs_base__result_u64 ret;
- ret.status.repr = NULL;
- ret.value = v;
- return ret;
- } while (0);
-
-ok_zero:
- do {
- wuffs_base__result_u64 ret;
- ret.status.repr = NULL;
- ret.value = 0;
- return ret;
- } while (0);
-
-fail_bad_argument:
- do {
- wuffs_base__result_u64 ret;
- ret.status.repr = wuffs_base__error__bad_argument;
- ret.value = 0;
- return ret;
- } while (0);
-
-fail_out_of_bounds:
- do {
- wuffs_base__result_u64 ret;
- ret.status.repr = wuffs_base__error__out_of_bounds;
- ret.value = 0;
- return ret;
- } while (0);
-}
-
-// ---------------- Hexadecimal
-
-WUFFS_BASE__MAYBE_STATIC size_t //
-wuffs_base__hexadecimal__decode2(wuffs_base__slice_u8 dst,
- wuffs_base__slice_u8 src) {
- size_t src_len2 = src.len / 2;
- size_t len = dst.len < src_len2 ? dst.len : src_len2;
- uint8_t* d = dst.ptr;
- uint8_t* s = src.ptr;
- size_t n = len;
-
- while (n--) {
- *d = (uint8_t)((wuffs_base__parse_number__hexadecimal_digits[s[0]] << 4) |
- (wuffs_base__parse_number__hexadecimal_digits[s[1]] & 0x0F));
- d += 1;
- s += 2;
- }
-
- return len;
-}
-
-WUFFS_BASE__MAYBE_STATIC size_t //
-wuffs_base__hexadecimal__decode4(wuffs_base__slice_u8 dst,
- wuffs_base__slice_u8 src) {
- size_t src_len4 = src.len / 4;
- size_t len = dst.len < src_len4 ? dst.len : src_len4;
- uint8_t* d = dst.ptr;
- uint8_t* s = src.ptr;
- size_t n = len;
-
- while (n--) {
- *d = (uint8_t)((wuffs_base__parse_number__hexadecimal_digits[s[2]] << 4) |
- (wuffs_base__parse_number__hexadecimal_digits[s[3]] & 0x0F));
- d += 1;
- s += 4;
- }
-
- return len;
-}
-
-// ---------------- Unicode and UTF-8
-
-WUFFS_BASE__MAYBE_STATIC size_t //
-wuffs_base__utf_8__encode(wuffs_base__slice_u8 dst, uint32_t code_point) {
- if (code_point <= 0x7F) {
- if (dst.len >= 1) {
- dst.ptr[0] = (uint8_t)(code_point);
- return 1;
- }
-
- } else if (code_point <= 0x07FF) {
- if (dst.len >= 2) {
- dst.ptr[0] = (uint8_t)(0xC0 | ((code_point >> 6)));
- dst.ptr[1] = (uint8_t)(0x80 | ((code_point >> 0) & 0x3F));
- return 2;
- }
-
- } else if (code_point <= 0xFFFF) {
- if ((dst.len >= 3) && ((code_point < 0xD800) || (0xDFFF < code_point))) {
- dst.ptr[0] = (uint8_t)(0xE0 | ((code_point >> 12)));
- dst.ptr[1] = (uint8_t)(0x80 | ((code_point >> 6) & 0x3F));
- dst.ptr[2] = (uint8_t)(0x80 | ((code_point >> 0) & 0x3F));
- return 3;
- }
-
- } else if (code_point <= 0x10FFFF) {
- if (dst.len >= 4) {
- dst.ptr[0] = (uint8_t)(0xF0 | ((code_point >> 18)));
- dst.ptr[1] = (uint8_t)(0x80 | ((code_point >> 12) & 0x3F));
- dst.ptr[2] = (uint8_t)(0x80 | ((code_point >> 6) & 0x3F));
- dst.ptr[3] = (uint8_t)(0x80 | ((code_point >> 0) & 0x3F));
- return 4;
- }
- }
-
- return 0;
-}
-
-// wuffs_base__utf_8__byte_length_minus_1 is the byte length (minus 1) of a
-// UTF-8 encoded code point, based on the encoding's initial byte.
-// - 0x00 is 1-byte UTF-8 (ASCII).
-// - 0x01 is the start of 2-byte UTF-8.
-// - 0x02 is the start of 3-byte UTF-8.
-// - 0x03 is the start of 4-byte UTF-8.
-// - 0x40 is a UTF-8 tail byte.
-// - 0x80 is invalid UTF-8.
-//
-// RFC 3629 (UTF-8) gives this grammar for valid UTF-8:
-// UTF8-1 = %x00-7F
-// UTF8-2 = %xC2-DF UTF8-tail
-// UTF8-3 = %xE0 %xA0-BF UTF8-tail / %xE1-EC 2( UTF8-tail ) /
-// %xED %x80-9F UTF8-tail / %xEE-EF 2( UTF8-tail )
-// UTF8-4 = %xF0 %x90-BF 2( UTF8-tail ) / %xF1-F3 3( UTF8-tail ) /
-// %xF4 %x80-8F 2( UTF8-tail )
-// UTF8-tail = %x80-BF
-static const uint8_t wuffs_base__utf_8__byte_length_minus_1[256] = {
- // 0 1 2 3 4 5 6 7
- // 8 9 A B C D E F
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x00 ..= 0x07.
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x08 ..= 0x0F.
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x10 ..= 0x17.
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x18 ..= 0x1F.
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x20 ..= 0x27.
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x28 ..= 0x2F.
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x30 ..= 0x37.
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x38 ..= 0x3F.
-
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x40 ..= 0x47.
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x48 ..= 0x4F.
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x50 ..= 0x57.
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x58 ..= 0x5F.
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x60 ..= 0x67.
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x68 ..= 0x6F.
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x70 ..= 0x77.
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x78 ..= 0x7F.
-
- 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0x80 ..= 0x87.
- 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0x88 ..= 0x8F.
- 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0x90 ..= 0x97.
- 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0x98 ..= 0x9F.
- 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0xA0 ..= 0xA7.
- 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0xA8 ..= 0xAF.
- 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0xB0 ..= 0xB7.
- 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0xB8 ..= 0xBF.
-
- 0x80, 0x80, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0xC0 ..= 0xC7.
- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0xC8 ..= 0xCF.
- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0xD0 ..= 0xD7.
- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0xD8 ..= 0xDF.
- 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, // 0xE0 ..= 0xE7.
- 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, // 0xE8 ..= 0xEF.
- 0x03, 0x03, 0x03, 0x03, 0x03, 0x80, 0x80, 0x80, // 0xF0 ..= 0xF7.
- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xF8 ..= 0xFF.
- // 0 1 2 3 4 5 6 7
- // 8 9 A B C D E F
-};
-
-WUFFS_BASE__MAYBE_STATIC wuffs_base__utf_8__next__output //
-wuffs_base__utf_8__next(wuffs_base__slice_u8 s) {
- if (s.len == 0) {
- return wuffs_base__make_utf_8__next__output(0, 0);
- }
- uint32_t c = s.ptr[0];
- switch (wuffs_base__utf_8__byte_length_minus_1[c & 0xFF]) {
- case 0:
- return wuffs_base__make_utf_8__next__output(c, 1);
-
- case 1:
- if (s.len < 2) {
- break;
- }
- c = wuffs_base__load_u16le__no_bounds_check(s.ptr);
- if ((c & 0xC000) != 0x8000) {
- break;
- }
- c = (0x0007C0 & (c << 6)) | (0x00003F & (c >> 8));
- return wuffs_base__make_utf_8__next__output(c, 2);
-
- case 2:
- if (s.len < 3) {
- break;
- }
- c = wuffs_base__load_u24le__no_bounds_check(s.ptr);
- if ((c & 0xC0C000) != 0x808000) {
- break;
- }
- c = (0x00F000 & (c << 12)) | (0x000FC0 & (c >> 2)) |
- (0x00003F & (c >> 16));
- if ((c <= 0x07FF) || ((0xD800 <= c) && (c <= 0xDFFF))) {
- break;
- }
- return wuffs_base__make_utf_8__next__output(c, 3);
-
- case 3:
- if (s.len < 4) {
- break;
- }
- c = wuffs_base__load_u32le__no_bounds_check(s.ptr);
- if ((c & 0xC0C0C000) != 0x80808000) {
- break;
- }
- c = (0x1C0000 & (c << 18)) | (0x03F000 & (c << 4)) |
- (0x000FC0 & (c >> 10)) | (0x00003F & (c >> 24));
- if ((c <= 0xFFFF) || (0x110000 <= c)) {
- break;
- }
- return wuffs_base__make_utf_8__next__output(c, 4);
- }
-
- return wuffs_base__make_utf_8__next__output(
- WUFFS_BASE__UNICODE_REPLACEMENT_CHARACTER, 1);
-}
-
-WUFFS_BASE__MAYBE_STATIC size_t //
-wuffs_base__utf_8__longest_valid_prefix(wuffs_base__slice_u8 s) {
- // TODO: possibly optimize the all-ASCII case (4 or 8 bytes at a time).
- //
- // TODO: possibly optimize this by manually inlining the
- // wuffs_base__utf_8__next calls.
- size_t original_len = s.len;
- while (s.len > 0) {
- wuffs_base__utf_8__next__output o = wuffs_base__utf_8__next(s);
- if ((o.code_point > 0x7F) && (o.byte_length == 1)) {
- break;
- }
- s.ptr += o.byte_length;
- s.len -= o.byte_length;
- }
- return original_len - s.len;
-}
-
-WUFFS_BASE__MAYBE_STATIC size_t //
-wuffs_base__ascii__longest_valid_prefix(wuffs_base__slice_u8 s) {
- // TODO: possibly optimize this by checking 4 or 8 bytes at a time.
- uint8_t* original_ptr = s.ptr;
- uint8_t* p = s.ptr;
- uint8_t* q = s.ptr + s.len;
- for (; (p != q) && ((*p & 0x80) == 0); p++) {
- }
- return (size_t)(p - original_ptr);
-}
+const char wuffs_base__hasher_u32__vtable_name[] = "{vtable}wuffs_base__hasher_u32";
+const char wuffs_base__image_decoder__vtable_name[] = "{vtable}wuffs_base__image_decoder";
+const char wuffs_base__io_transformer__vtable_name[] = "{vtable}wuffs_base__io_transformer";
+const char wuffs_base__token_decoder__vtable_name[] = "{vtable}wuffs_base__token_decoder";
#endif // !defined(WUFFS_CONFIG__MODULES) ||
// defined(WUFFS_CONFIG__MODULE__BASE) ||
@@ -9300,8 +8942,8 @@
// ---------------- IEEE 754 Floating Point
-#define WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DECIMAL_POINT__RANGE 1023
-#define WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION 500
+#define WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DECIMAL_POINT__RANGE 2047
+#define WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION 800
// WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL is the largest N
// such that ((10 << N) < (1 << 64)).
@@ -9311,14 +8953,14 @@
// fixed precision floating point decimal number, augmented with ±infinity
// values, but it cannot represent NaN (Not a Number).
//
-// "High precision" means that the mantissa holds 500 decimal digits. 500 is
+// "High precision" means that the mantissa holds 800 decimal digits. 800 is
// WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION.
//
// An HPD isn't for general purpose arithmetic, only for conversions to and
// from IEEE 754 double-precision floating point, where the largest and
// smallest positive, finite values are approximately 1.8e+308 and 4.9e-324.
-// HPD exponents above +1023 mean infinity, below -1023 mean zero. The ±1023
-// bounds are further away from zero than ±(324 + 500), where 500 and 1023 is
+// HPD exponents above +2047 mean infinity, below -2047 mean zero. The ±2047
+// bounds are further away from zero than ±(324 + 800), where 800 and 2047 is
// WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION and
// WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DECIMAL_POINT__RANGE.
//
@@ -9340,8 +8982,8 @@
// - A decimal_point of +4 means "7890."
// - A decimal_point of +5 means "78900."
//
-// As above, a decimal_point higher than +1023 means that the overall value is
-// infinity, lower than -1023 means zero.
+// As above, a decimal_point higher than +2047 means that the overall value is
+// infinity, lower than -2047 means zero.
//
// negative is a sign bit. An HPD can distinguish positive and negative zero.
//
@@ -9373,6 +9015,48 @@
}
}
+// wuffs_base__private_implementation__high_prec_dec__assign sets h to
+// represent the number x.
+//
+// Preconditions:
+// - h is non-NULL.
+static void //
+wuffs_base__private_implementation__high_prec_dec__assign(
+ wuffs_base__private_implementation__high_prec_dec* h,
+ uint64_t x,
+ bool negative) {
+ uint32_t n = 0;
+
+ // Set h->digits.
+ if (x > 0) {
+ // Calculate the digits, working right-to-left. After we determine n (how
+ // many digits there are), copy from buf to h->digits.
+ //
+ // UINT64_MAX, 18446744073709551615, is 20 digits long. It can be faster to
+ // copy a constant number of bytes than a variable number (20 instead of
+ // n). Make buf large enough (and start writing to it from the middle) so
+ // that can we always copy 20 bytes: the slice buf[(20-n) .. (40-n)].
+ uint8_t buf[40] = {0};
+ uint8_t* ptr = &buf[20];
+ do {
+ uint64_t remaining = x / 10;
+ x -= remaining * 10;
+ ptr--;
+ *ptr = (uint8_t)x;
+ n++;
+ x = remaining;
+ } while (x > 0);
+ memcpy(h->digits, ptr, 20);
+ }
+
+ // Set h's other fields.
+ h->num_digits = n;
+ h->decimal_point = (int32_t)n;
+ h->negative = negative;
+ h->truncated = false;
+ wuffs_base__private_implementation__high_prec_dec__trim(h);
+}
+
static wuffs_base__status //
wuffs_base__private_implementation__high_prec_dec__parse(
wuffs_base__private_implementation__high_prec_dec* h,
@@ -9748,6 +9432,11 @@
// wuffs_base__private_implementation__high_prec_dec__rounded_integer and
// wuffs_base__private_implementation__high_prec_dec__lshift_num_new_digits
// have the same preconditions.
+//
+// wuffs_base__private_implementation__high_prec_dec__lshift keeps the first
+// two preconditions but not the last two. Its shift argument is signed and
+// does not need to be "small": zero is a no-op, positive means left shift and
+// negative means right shift.
static void //
wuffs_base__private_implementation__high_prec_dec__small_lshift(
@@ -9861,6 +9550,254 @@
wuffs_base__private_implementation__high_prec_dec__trim(h);
}
+static void //
+wuffs_base__private_implementation__high_prec_dec__lshift(
+ wuffs_base__private_implementation__high_prec_dec* h,
+ int32_t shift) {
+ if (shift > 0) {
+ while (shift > +WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL) {
+ wuffs_base__private_implementation__high_prec_dec__small_lshift(
+ h, WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL);
+ shift -= WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL;
+ }
+ wuffs_base__private_implementation__high_prec_dec__small_lshift(
+ h, ((uint32_t)(+shift)));
+ } else if (shift < 0) {
+ while (shift < -WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL) {
+ wuffs_base__private_implementation__high_prec_dec__small_rshift(
+ h, WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL);
+ shift += WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL;
+ }
+ wuffs_base__private_implementation__high_prec_dec__small_rshift(
+ h, ((uint32_t)(-shift)));
+ }
+}
+
+// --------
+
+// wuffs_base__private_implementation__high_prec_dec__round_etc rounds h's
+// number. For those functions that take an n argument, rounding produces at
+// most n digits (which is not necessarily at most n decimal places). Negative
+// n values are ignored, as well as any n greater than or equal to h's number
+// of digits. The etc__round_just_enough function implicitly chooses an n to
+// implement WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION.
+//
+// Preconditions:
+// - h is non-NULL.
+// - h->decimal_point is "not extreme".
+//
+// "Not extreme" means within
+// ±WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DECIMAL_POINT__RANGE.
+
+static void //
+wuffs_base__private_implementation__high_prec_dec__round_down(
+ wuffs_base__private_implementation__high_prec_dec* h,
+ int32_t n) {
+ if ((n < 0) || (h->num_digits <= (uint32_t)n)) {
+ return;
+ }
+ h->num_digits = (uint32_t)(n);
+ wuffs_base__private_implementation__high_prec_dec__trim(h);
+}
+
+static void //
+wuffs_base__private_implementation__high_prec_dec__round_up(
+ wuffs_base__private_implementation__high_prec_dec* h,
+ int32_t n) {
+ if ((n < 0) || (h->num_digits <= (uint32_t)n)) {
+ return;
+ }
+
+ for (n--; n >= 0; n--) {
+ if (h->digits[n] < 9) {
+ h->digits[n]++;
+ h->num_digits = (uint32_t)(n + 1);
+ return;
+ }
+ }
+
+ // The number is all 9s. Change to a single 1 and adjust the decimal point.
+ h->digits[0] = 1;
+ h->num_digits = 1;
+ h->decimal_point++;
+}
+
+static void //
+wuffs_base__private_implementation__high_prec_dec__round_nearest(
+ wuffs_base__private_implementation__high_prec_dec* h,
+ int32_t n) {
+ if ((n < 0) || (h->num_digits <= (uint32_t)n)) {
+ return;
+ }
+ bool up = h->digits[n] >= 5;
+ if ((h->digits[n] == 5) && ((n + 1) == ((int32_t)(h->num_digits)))) {
+ up = h->truncated || //
+ ((n > 0) && ((h->digits[n - 1] & 1) != 0));
+ }
+
+ if (up) {
+ wuffs_base__private_implementation__high_prec_dec__round_up(h, n);
+ } else {
+ wuffs_base__private_implementation__high_prec_dec__round_down(h, n);
+ }
+}
+
+static void //
+wuffs_base__private_implementation__high_prec_dec__round_just_enough(
+ wuffs_base__private_implementation__high_prec_dec* h,
+ int32_t exp2,
+ uint64_t mantissa) {
+ // The magic numbers 52 and 53 in this function are because IEEE 754 double
+ // precision has 52 mantissa bits.
+ //
+ // Let f be the floating point number represented by exp2 and mantissa (and
+ // also the number in h): the number (mantissa * (2 ** (exp2 - 52))).
+ //
+ // If f is zero, we can return early.
+ if (mantissa == 0) {
+ return;
+ }
+
+ // The smallest normal f has an exp2 of -1022 and a mantissa of (1 << 52).
+ // Subnormal numbers have the same exp2 but a smaller mantissa.
+ static const int32_t min_incl_normal_exp2 = -1022;
+ static const uint64_t min_incl_normal_mantissa = 0x0010000000000000ul;
+
+ // Compute lower and upper bounds such that any number between them (possibly
+ // inclusive) will round to f. First, the lower bound. Our number f is:
+ // ((mantissa + 0) * (2 ** ( exp2 - 52)))
+ //
+ // The next lowest floating point number is:
+ // ((mantissa - 1) * (2 ** ( exp2 - 52)))
+ // unless (mantissa - 1) drops the (1 << 52) bit and exp2 is not the
+ // min_incl_normal_exp2. Either way, call it:
+ // ((l_mantissa) * (2 ** (l_exp2 - 52)))
+ //
+ // The lower bound is halfway between them (noting that 52 became 53):
+ // (((2 * l_mantissa) + 1) * (2 ** (l_exp2 - 53)))
+ int32_t l_exp2 = exp2;
+ uint64_t l_mantissa = mantissa - 1;
+ if ((exp2 > min_incl_normal_exp2) && (mantissa <= min_incl_normal_mantissa)) {
+ l_exp2 = exp2 - 1;
+ l_mantissa = (2 * mantissa) - 1;
+ }
+ wuffs_base__private_implementation__high_prec_dec lower;
+ wuffs_base__private_implementation__high_prec_dec__assign(
+ &lower, (2 * l_mantissa) + 1, false);
+ wuffs_base__private_implementation__high_prec_dec__lshift(&lower,
+ l_exp2 - 53);
+
+ // Next, the upper bound. Our number f is:
+ // ((mantissa + 0) * (2 ** (exp2 - 52)))
+ //
+ // The next highest floating point number is:
+ // ((mantissa + 1) * (2 ** (exp2 - 52)))
+ //
+ // The upper bound is halfway between them (noting that 52 became 53):
+ // (((2 * mantissa) + 1) * (2 ** (exp2 - 53)))
+ wuffs_base__private_implementation__high_prec_dec upper;
+ wuffs_base__private_implementation__high_prec_dec__assign(
+ &upper, (2 * mantissa) + 1, false);
+ wuffs_base__private_implementation__high_prec_dec__lshift(&upper, exp2 - 53);
+
+ // The lower and upper bounds are possible outputs only if the original
+ // mantissa is even, so that IEEE round-to-even would round to the original
+ // mantissa and not its neighbors.
+ bool inclusive = (mantissa & 1) == 0;
+
+ // As we walk the digits, we want to know whether rounding up would fall
+ // within the upper bound. This is tracked by upper_delta:
+ // - When -1, the digits of h and upper are the same so far.
+ // - When +0, we saw a difference of 1 between h and upper on a previous
+ // digit and subsequently only 9s for h and 0s for upper. Thus, rounding
+ // up may fall outside of the bound if !inclusive.
+ // - When +1, the difference is greater than 1 and we know that rounding up
+ // falls within the bound.
+ //
+ // This is a state machine with three states. The numerical value for each
+ // state (-1, +0 or +1) isn't important, other than their order.
+ int upper_delta = -1;
+
+ // We can now figure out the shortest number of digits required. Walk the
+ // digits until h has distinguished itself from lower or upper.
+ //
+ // The zi and zd variables are indexes and digits, for z in l (lower), h (the
+ // number) and u (upper).
+ //
+ // The lower, h and upper numbers may have their decimal points at different
+ // places. In this case, upper is the longest, so we iterate ui starting from
+ // 0 and iterate li and hi starting from either 0 or -1.
+ int32_t ui = 0;
+ for (;; ui++) {
+ // Calculate hd, the middle number's digit.
+ int32_t hi = ui - upper.decimal_point + h->decimal_point;
+ if (hi >= ((int32_t)(h->num_digits))) {
+ break;
+ }
+ uint8_t hd = (((uint32_t)hi) < h->num_digits) ? h->digits[hi] : 0;
+
+ // Calculate ld, the lower bound's digit.
+ int32_t li = ui - upper.decimal_point + lower.decimal_point;
+ uint8_t ld = (((uint32_t)li) < lower.num_digits) ? lower.digits[li] : 0;
+
+ // We can round down (truncate) if lower has a different digit than h or if
+ // lower is inclusive and is exactly the result of rounding down (i.e. we
+ // have reached the final digit of lower).
+ bool can_round_down =
+ (ld != hd) || //
+ (inclusive && ((li + 1) == ((int32_t)(lower.num_digits))));
+
+ // Calculate ud, the upper bound's digit, and update upper_delta.
+ uint8_t ud = (((uint32_t)ui) < upper.num_digits) ? upper.digits[ui] : 0;
+ if (upper_delta < 0) {
+ if ((hd + 1) < ud) {
+ // For example:
+ // h = 12345???
+ // upper = 12347???
+ upper_delta = +1;
+ } else if (hd != ud) {
+ // For example:
+ // h = 12345???
+ // upper = 12346???
+ upper_delta = +0;
+ }
+ } else if (upper_delta == 0) {
+ if ((hd != 9) || (ud != 0)) {
+ // For example:
+ // h = 1234598?
+ // upper = 1234600?
+ upper_delta = +1;
+ }
+ }
+
+ // We can round up if upper has a different digit than h and either upper
+ // is inclusive or upper is bigger than the result of rounding up.
+ bool can_round_up =
+ (upper_delta > 0) || //
+ ((upper_delta == 0) && //
+ (inclusive || ((ui + 1) < ((int32_t)(upper.num_digits)))));
+
+ // If we can round either way, round to nearest. If we can round only one
+ // way, do it. If we can't round, continue the loop.
+ if (can_round_down) {
+ if (can_round_up) {
+ wuffs_base__private_implementation__high_prec_dec__round_nearest(
+ h, hi + 1);
+ return;
+ } else {
+ wuffs_base__private_implementation__high_prec_dec__round_down(h,
+ hi + 1);
+ return;
+ }
+ } else {
+ if (can_round_up) {
+ wuffs_base__private_implementation__high_prec_dec__round_up(h, hi + 1);
+ return;
+ }
+ }
+ }
+}
+
// --------
// The wuffs_base__private_implementation__etc_powers_of_10 tables were printed
@@ -10547,11 +10484,737 @@
} while (0);
}
+// --------
+
+static inline size_t //
+wuffs_base__private_implementation__render_inf(wuffs_base__slice_u8 dst,
+ bool neg,
+ uint32_t options) {
+ if (neg) {
+ if (dst.len < 4) {
+ return 0;
+ }
+ wuffs_base__store_u32le__no_bounds_check(dst.ptr, 0x666E492D); // '-Inf'le.
+ return 4;
+ }
+
+ if (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN) {
+ if (dst.len < 4) {
+ return 0;
+ }
+ wuffs_base__store_u32le__no_bounds_check(dst.ptr, 0x666E492B); // '+Inf'le.
+ return 4;
+ }
+
+ if (dst.len < 3) {
+ return 0;
+ }
+ wuffs_base__store_u24le__no_bounds_check(dst.ptr, 0x666E49); // 'Inf'le.
+ return 3;
+}
+
+static inline size_t //
+wuffs_base__private_implementation__render_nan(wuffs_base__slice_u8 dst) {
+ if (dst.len < 3) {
+ return 0;
+ }
+ wuffs_base__store_u24le__no_bounds_check(dst.ptr, 0x4E614E); // 'NaN'le.
+ return 3;
+}
+
+static size_t //
+wuffs_base__private_implementation__high_prec_dec__render_exponent_absent(
+ wuffs_base__slice_u8 dst,
+ wuffs_base__private_implementation__high_prec_dec* h,
+ uint32_t precision,
+ uint32_t options) {
+ size_t n = (h->negative ||
+ (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN))
+ ? 1
+ : 0;
+ if (h->decimal_point <= 0) {
+ n += 1;
+ } else {
+ n += (size_t)(h->decimal_point);
+ }
+ if (precision > 0) {
+ n += precision + 1; // +1 for the '.'.
+ }
+
+ // Don't modify dst if the formatted number won't fit.
+ if (n > dst.len) {
+ return 0;
+ }
+
+ // Align-left or align-right.
+ uint8_t* ptr = (options & WUFFS_BASE__RENDER_NUMBER_XXX__ALIGN_RIGHT)
+ ? &dst.ptr[dst.len - n]
+ : &dst.ptr[0];
+
+ // Leading "±".
+ if (h->negative) {
+ *ptr++ = '-';
+ } else if (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN) {
+ *ptr++ = '+';
+ }
+
+ // Integral digits.
+ if (h->decimal_point <= 0) {
+ *ptr++ = '0';
+ } else {
+ uint32_t m =
+ wuffs_base__u32__min(h->num_digits, (uint32_t)(h->decimal_point));
+ uint32_t i = 0;
+ for (; i < m; i++) {
+ *ptr++ = (uint8_t)('0' | h->digits[i]);
+ }
+ for (; i < (uint32_t)(h->decimal_point); i++) {
+ *ptr++ = '0';
+ }
+ }
+
+ // Separator and then fractional digits.
+ if (precision > 0) {
+ *ptr++ =
+ (options & WUFFS_BASE__RENDER_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA)
+ ? ','
+ : '.';
+ uint32_t i = 0;
+ for (; i < precision; i++) {
+ uint32_t j = ((uint32_t)(h->decimal_point)) + i;
+ *ptr++ = (uint8_t)('0' | ((j < h->num_digits) ? h->digits[j] : 0));
+ }
+ }
+
+ return n;
+}
+
+static size_t //
+wuffs_base__private_implementation__high_prec_dec__render_exponent_present(
+ wuffs_base__slice_u8 dst,
+ wuffs_base__private_implementation__high_prec_dec* h,
+ uint32_t precision,
+ uint32_t options) {
+ int32_t exp = 0;
+ if (h->num_digits > 0) {
+ exp = h->decimal_point - 1;
+ }
+ bool negative_exp = exp < 0;
+ if (negative_exp) {
+ exp = -exp;
+ }
+
+ size_t n = (h->negative ||
+ (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN))
+ ? 4
+ : 3; // Mininum 3 bytes: first digit and then "e±".
+ if (precision > 0) {
+ n += precision + 1; // +1 for the '.'.
+ }
+ n += (exp < 100) ? 2 : 3;
+
+ // Don't modify dst if the formatted number won't fit.
+ if (n > dst.len) {
+ return 0;
+ }
+
+ // Align-left or align-right.
+ uint8_t* ptr = (options & WUFFS_BASE__RENDER_NUMBER_XXX__ALIGN_RIGHT)
+ ? &dst.ptr[dst.len - n]
+ : &dst.ptr[0];
+
+ // Leading "±".
+ if (h->negative) {
+ *ptr++ = '-';
+ } else if (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN) {
+ *ptr++ = '+';
+ }
+
+ // Integral digit.
+ if (h->num_digits > 0) {
+ *ptr++ = (uint8_t)('0' | h->digits[0]);
+ } else {
+ *ptr++ = '0';
+ }
+
+ // Separator and then fractional digits.
+ if (precision > 0) {
+ *ptr++ =
+ (options & WUFFS_BASE__RENDER_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA)
+ ? ','
+ : '.';
+ uint32_t i = 1;
+ uint32_t j = wuffs_base__u32__min(h->num_digits, precision + 1);
+ for (; i < j; i++) {
+ *ptr++ = (uint8_t)('0' | h->digits[i]);
+ }
+ for (; i <= precision; i++) {
+ *ptr++ = '0';
+ }
+ }
+
+ // Exponent: "e±" and then 2 or 3 digits.
+ *ptr++ = 'e';
+ *ptr++ = negative_exp ? '-' : '+';
+ if (exp < 10) {
+ *ptr++ = '0';
+ *ptr++ = (uint8_t)('0' | exp);
+ } else if (exp < 100) {
+ *ptr++ = (uint8_t)('0' | (exp / 10));
+ *ptr++ = (uint8_t)('0' | (exp % 10));
+ } else {
+ int32_t e = exp / 100;
+ exp -= e * 100;
+ *ptr++ = (uint8_t)('0' | e);
+ *ptr++ = (uint8_t)('0' | (exp / 10));
+ *ptr++ = (uint8_t)('0' | (exp % 10));
+ }
+
+ return n;
+}
+
+WUFFS_BASE__MAYBE_STATIC size_t //
+wuffs_base__render_number_f64(wuffs_base__slice_u8 dst,
+ double x,
+ uint32_t precision,
+ uint32_t options) {
+ // Decompose x (64 bits) into negativity (1 bit), base-2 exponent (11 bits
+ // with a -1023 bias) and mantissa (52 bits).
+ uint64_t bits = wuffs_base__ieee_754_bit_representation__from_f64(x);
+ bool neg = (bits >> 63) != 0;
+ int32_t exp2 = ((int32_t)(bits >> 52)) & 0x7FF;
+ uint64_t man = bits & 0x000FFFFFFFFFFFFFul;
+
+ // Apply the exponent bias and set the implicit top bit of the mantissa,
+ // unless x is subnormal. Also take care of Inf and NaN.
+ if (exp2 == 0x7FF) {
+ if (man != 0) {
+ return wuffs_base__private_implementation__render_nan(dst);
+ }
+ return wuffs_base__private_implementation__render_inf(dst, neg, options);
+ } else if (exp2 == 0) {
+ exp2 = -1022;
+ } else {
+ exp2 -= 1023;
+ man |= 0x0010000000000000ul;
+ }
+
+ // Ensure that precision isn't too large.
+ if (precision > 4095) {
+ precision = 4095;
+ }
+
+ // Convert from the (neg, exp2, man) tuple to an HPD.
+ wuffs_base__private_implementation__high_prec_dec h;
+ wuffs_base__private_implementation__high_prec_dec__assign(&h, man, neg);
+ if (h.num_digits > 0) {
+ wuffs_base__private_implementation__high_prec_dec__lshift(
+ &h, exp2 - 52); // 52 mantissa bits.
+ }
+
+ // Handle the "%e" and "%f" formats.
+ switch (options & (WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_ABSENT |
+ WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_PRESENT)) {
+ case WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_ABSENT: // The "%"f" format.
+ if (options & WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION) {
+ wuffs_base__private_implementation__high_prec_dec__round_just_enough(
+ &h, exp2, man);
+ int32_t p = ((int32_t)(h.num_digits)) - h.decimal_point;
+ precision = ((uint32_t)(wuffs_base__i32__max(0, p)));
+ } else {
+ wuffs_base__private_implementation__high_prec_dec__round_nearest(
+ &h, ((int32_t)precision) + h.decimal_point);
+ }
+ return wuffs_base__private_implementation__high_prec_dec__render_exponent_absent(
+ dst, &h, precision, options);
+
+ case WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_PRESENT: // The "%e" format.
+ if (options & WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION) {
+ wuffs_base__private_implementation__high_prec_dec__round_just_enough(
+ &h, exp2, man);
+ precision = (h.num_digits > 0) ? (h.num_digits - 1) : 0;
+ } else {
+ wuffs_base__private_implementation__high_prec_dec__round_nearest(
+ &h, ((int32_t)precision) + 1);
+ }
+ return wuffs_base__private_implementation__high_prec_dec__render_exponent_present(
+ dst, &h, precision, options);
+ }
+
+ // We have the "%g" format and so precision means the number of significant
+ // digits, not the number of digits after the decimal separator. Perform
+ // rounding and determine whether to use "%e" or "%f".
+ int32_t e_threshold = 0;
+ if (options & WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION) {
+ wuffs_base__private_implementation__high_prec_dec__round_just_enough(
+ &h, exp2, man);
+ precision = h.num_digits;
+ e_threshold = 6;
+ } else {
+ if (precision == 0) {
+ precision = 1;
+ }
+ wuffs_base__private_implementation__high_prec_dec__round_nearest(
+ &h, ((int32_t)precision));
+ e_threshold = ((int32_t)precision);
+ int32_t nd = ((int32_t)(h.num_digits));
+ if ((e_threshold > nd) && (nd >= h.decimal_point)) {
+ e_threshold = nd;
+ }
+ }
+
+ // Use the "%e" format if the exponent is large.
+ int32_t e = h.decimal_point - 1;
+ if ((e < -4) || (e_threshold <= e)) {
+ uint32_t p = wuffs_base__u32__min(precision, h.num_digits);
+ return wuffs_base__private_implementation__high_prec_dec__render_exponent_present(
+ dst, &h, (p > 0) ? (p - 1) : 0, options);
+ }
+
+ // Use the "%f" format otherwise.
+ int32_t p = ((int32_t)precision);
+ if (p > h.decimal_point) {
+ p = ((int32_t)(h.num_digits));
+ }
+ precision = ((uint32_t)(wuffs_base__i32__max(0, p - h.decimal_point)));
+ return wuffs_base__private_implementation__high_prec_dec__render_exponent_absent(
+ dst, &h, precision, options);
+}
+
#endif // !defined(WUFFS_CONFIG__MODULES) ||
// defined(WUFFS_CONFIG__MODULE__BASE) ||
// defined(WUFFS_CONFIG__MODULE__BASE__F64CONV)
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \
+ defined(WUFFS_CONFIG__MODULE__BASE__I64CONV)
+
+// ---------------- Integer
+
+// wuffs_base__parse_number__foo_digits entries are 0x00 for invalid digits,
+// and (0x80 | v) for valid digits, where v is the 4 bit value.
+
+static const uint8_t wuffs_base__parse_number__decimal_digits[256] = {
+ // 0 1 2 3 4 5 6 7
+ // 8 9 A B C D E F
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x00 ..= 0x07.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x08 ..= 0x0F.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x10 ..= 0x17.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x18 ..= 0x1F.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x20 ..= 0x27.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x28 ..= 0x2F.
+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, // 0x30 ..= 0x37. '0'-'7'.
+ 0x88, 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x38 ..= 0x3F. '8'-'9'.
+
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x40 ..= 0x47.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x48 ..= 0x4F.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x50 ..= 0x57.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x58 ..= 0x5F.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x60 ..= 0x67.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x68 ..= 0x6F.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x70 ..= 0x77.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x78 ..= 0x7F.
+
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x80 ..= 0x87.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x88 ..= 0x8F.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x90 ..= 0x97.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x98 ..= 0x9F.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xA0 ..= 0xA7.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xA8 ..= 0xAF.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xB0 ..= 0xB7.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xB8 ..= 0xBF.
+
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xC0 ..= 0xC7.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xC8 ..= 0xCF.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xD0 ..= 0xD7.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xD8 ..= 0xDF.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xE0 ..= 0xE7.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xE8 ..= 0xEF.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xF0 ..= 0xF7.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xF8 ..= 0xFF.
+ // 0 1 2 3 4 5 6 7
+ // 8 9 A B C D E F
+};
+
+static const uint8_t wuffs_base__parse_number__hexadecimal_digits[256] = {
+ // 0 1 2 3 4 5 6 7
+ // 8 9 A B C D E F
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x00 ..= 0x07.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x08 ..= 0x0F.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x10 ..= 0x17.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x18 ..= 0x1F.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x20 ..= 0x27.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x28 ..= 0x2F.
+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, // 0x30 ..= 0x37. '0'-'7'.
+ 0x88, 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x38 ..= 0x3F. '8'-'9'.
+
+ 0x00, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x00, // 0x40 ..= 0x47. 'A'-'F'.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x48 ..= 0x4F.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x50 ..= 0x57.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x58 ..= 0x5F.
+ 0x00, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x00, // 0x60 ..= 0x67. 'a'-'f'.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x68 ..= 0x6F.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x70 ..= 0x77.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x78 ..= 0x7F.
+
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x80 ..= 0x87.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x88 ..= 0x8F.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x90 ..= 0x97.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x98 ..= 0x9F.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xA0 ..= 0xA7.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xA8 ..= 0xAF.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xB0 ..= 0xB7.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xB8 ..= 0xBF.
+
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xC0 ..= 0xC7.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xC8 ..= 0xCF.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xD0 ..= 0xD7.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xD8 ..= 0xDF.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xE0 ..= 0xE7.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xE8 ..= 0xEF.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xF0 ..= 0xF7.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xF8 ..= 0xFF.
+ // 0 1 2 3 4 5 6 7
+ // 8 9 A B C D E F
+};
+
+// --------
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__result_i64 //
+wuffs_base__parse_number_i64(wuffs_base__slice_u8 s) {
+ uint8_t* p = s.ptr;
+ uint8_t* q = s.ptr + s.len;
+
+ for (; (p < q) && (*p == '_'); p++) {
+ }
+
+ bool negative = false;
+ if (p >= q) {
+ goto fail_bad_argument;
+ } else if (*p == '-') {
+ p++;
+ negative = true;
+ } else if (*p == '+') {
+ p++;
+ }
+
+ do {
+ wuffs_base__result_u64 r = wuffs_base__parse_number_u64(
+ wuffs_base__make_slice_u8(p, (size_t)(q - p)));
+ if (r.status.repr != NULL) {
+ wuffs_base__result_i64 ret;
+ ret.status.repr = r.status.repr;
+ ret.value = 0;
+ return ret;
+ } else if (negative) {
+ if (r.value > 0x8000000000000000) {
+ goto fail_out_of_bounds;
+ }
+ wuffs_base__result_i64 ret;
+ ret.status.repr = NULL;
+ ret.value = -(int64_t)(r.value);
+ return ret;
+ } else if (r.value > 0x7FFFFFFFFFFFFFFF) {
+ goto fail_out_of_bounds;
+ } else {
+ wuffs_base__result_i64 ret;
+ ret.status.repr = NULL;
+ ret.value = +(int64_t)(r.value);
+ return ret;
+ }
+ } while (0);
+
+fail_bad_argument:
+ do {
+ wuffs_base__result_i64 ret;
+ ret.status.repr = wuffs_base__error__bad_argument;
+ ret.value = 0;
+ return ret;
+ } while (0);
+
+fail_out_of_bounds:
+ do {
+ wuffs_base__result_i64 ret;
+ ret.status.repr = wuffs_base__error__out_of_bounds;
+ ret.value = 0;
+ return ret;
+ } while (0);
+}
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__result_u64 //
+wuffs_base__parse_number_u64(wuffs_base__slice_u8 s) {
+ uint8_t* p = s.ptr;
+ uint8_t* q = s.ptr + s.len;
+
+ for (; (p < q) && (*p == '_'); p++) {
+ }
+
+ if (p >= q) {
+ goto fail_bad_argument;
+
+ } else if (*p == '0') {
+ p++;
+ if (p >= q) {
+ goto ok_zero;
+ }
+ if (*p == '_') {
+ p++;
+ for (; p < q; p++) {
+ if (*p != '_') {
+ goto fail_bad_argument;
+ }
+ }
+ goto ok_zero;
+ }
+
+ if ((*p == 'x') || (*p == 'X')) {
+ p++;
+ for (; (p < q) && (*p == '_'); p++) {
+ }
+ if (p < q) {
+ goto hexadecimal;
+ }
+
+ } else if ((*p == 'd') || (*p == 'D')) {
+ p++;
+ for (; (p < q) && (*p == '_'); p++) {
+ }
+ if (p < q) {
+ goto decimal;
+ }
+ }
+
+ goto fail_bad_argument;
+ }
+
+decimal:
+ do {
+ uint64_t v = wuffs_base__parse_number__decimal_digits[*p++];
+ if (v == 0) {
+ goto fail_bad_argument;
+ }
+ v &= 0x0F;
+
+ // UINT64_MAX is 18446744073709551615, which is ((10 * max10) + max1).
+ const uint64_t max10 = 1844674407370955161u;
+ const uint8_t max1 = 5;
+
+ for (; p < q; p++) {
+ if (*p == '_') {
+ continue;
+ }
+ uint8_t digit = wuffs_base__parse_number__decimal_digits[*p];
+ if (digit == 0) {
+ goto fail_bad_argument;
+ }
+ digit &= 0x0F;
+ if ((v > max10) || ((v == max10) && (digit > max1))) {
+ goto fail_out_of_bounds;
+ }
+ v = (10 * v) + ((uint64_t)(digit));
+ }
+
+ wuffs_base__result_u64 ret;
+ ret.status.repr = NULL;
+ ret.value = v;
+ return ret;
+ } while (0);
+
+hexadecimal:
+ do {
+ uint64_t v = wuffs_base__parse_number__hexadecimal_digits[*p++];
+ if (v == 0) {
+ goto fail_bad_argument;
+ }
+ v &= 0x0F;
+
+ for (; p < q; p++) {
+ if (*p == '_') {
+ continue;
+ }
+ uint8_t digit = wuffs_base__parse_number__hexadecimal_digits[*p];
+ if (digit == 0) {
+ goto fail_bad_argument;
+ }
+ digit &= 0x0F;
+ if ((v >> 60) != 0) {
+ goto fail_out_of_bounds;
+ }
+ v = (v << 4) | ((uint64_t)(digit));
+ }
+
+ wuffs_base__result_u64 ret;
+ ret.status.repr = NULL;
+ ret.value = v;
+ return ret;
+ } while (0);
+
+ok_zero:
+ do {
+ wuffs_base__result_u64 ret;
+ ret.status.repr = NULL;
+ ret.value = 0;
+ return ret;
+ } while (0);
+
+fail_bad_argument:
+ do {
+ wuffs_base__result_u64 ret;
+ ret.status.repr = wuffs_base__error__bad_argument;
+ ret.value = 0;
+ return ret;
+ } while (0);
+
+fail_out_of_bounds:
+ do {
+ wuffs_base__result_u64 ret;
+ ret.status.repr = wuffs_base__error__out_of_bounds;
+ ret.value = 0;
+ return ret;
+ } while (0);
+}
+
+// --------
+
+// wuffs_base__render_number__first_hundred contains the decimal encodings of
+// the first one hundred numbers [0 ..= 99].
+static const uint8_t wuffs_base__render_number__first_hundred[200] = {
+ '0', '0', '0', '1', '0', '2', '0', '3', '0', '4', //
+ '0', '5', '0', '6', '0', '7', '0', '8', '0', '9', //
+ '1', '0', '1', '1', '1', '2', '1', '3', '1', '4', //
+ '1', '5', '1', '6', '1', '7', '1', '8', '1', '9', //
+ '2', '0', '2', '1', '2', '2', '2', '3', '2', '4', //
+ '2', '5', '2', '6', '2', '7', '2', '8', '2', '9', //
+ '3', '0', '3', '1', '3', '2', '3', '3', '3', '4', //
+ '3', '5', '3', '6', '3', '7', '3', '8', '3', '9', //
+ '4', '0', '4', '1', '4', '2', '4', '3', '4', '4', //
+ '4', '5', '4', '6', '4', '7', '4', '8', '4', '9', //
+ '5', '0', '5', '1', '5', '2', '5', '3', '5', '4', //
+ '5', '5', '5', '6', '5', '7', '5', '8', '5', '9', //
+ '6', '0', '6', '1', '6', '2', '6', '3', '6', '4', //
+ '6', '5', '6', '6', '6', '7', '6', '8', '6', '9', //
+ '7', '0', '7', '1', '7', '2', '7', '3', '7', '4', //
+ '7', '5', '7', '6', '7', '7', '7', '8', '7', '9', //
+ '8', '0', '8', '1', '8', '2', '8', '3', '8', '4', //
+ '8', '5', '8', '6', '8', '7', '8', '8', '8', '9', //
+ '9', '0', '9', '1', '9', '2', '9', '3', '9', '4', //
+ '9', '5', '9', '6', '9', '7', '9', '8', '9', '9', //
+};
+
+static size_t //
+wuffs_base__private_implementation__render_number_u64(wuffs_base__slice_u8 dst,
+ uint64_t x,
+ uint32_t options,
+ bool neg) {
+ uint8_t buf[WUFFS_BASE__U64__BYTE_LENGTH__MAX_INCL];
+ uint8_t* ptr = &buf[0] + sizeof(buf);
+
+ while (x >= 100) {
+ size_t index = (x % 100) * 2;
+ x /= 100;
+ uint8_t s0 = wuffs_base__render_number__first_hundred[index + 0];
+ uint8_t s1 = wuffs_base__render_number__first_hundred[index + 1];
+ ptr -= 2;
+ ptr[0] = s0;
+ ptr[1] = s1;
+ }
+
+ if (x < 10) {
+ ptr -= 1;
+ ptr[0] = (uint8_t)('0' + x);
+ } else {
+ size_t index = x * 2;
+ uint8_t s0 = wuffs_base__render_number__first_hundred[index + 0];
+ uint8_t s1 = wuffs_base__render_number__first_hundred[index + 1];
+ ptr -= 2;
+ ptr[0] = s0;
+ ptr[1] = s1;
+ }
+
+ if (neg) {
+ ptr -= 1;
+ ptr[0] = '-';
+ } else if (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN) {
+ ptr -= 1;
+ ptr[0] = '+';
+ }
+
+ size_t n = sizeof(buf) - ((size_t)(ptr - &buf[0]));
+ if (n > dst.len) {
+ return 0;
+ }
+ memcpy(dst.ptr + ((options & WUFFS_BASE__RENDER_NUMBER_XXX__ALIGN_RIGHT)
+ ? (dst.len - n)
+ : 0),
+ ptr, n);
+ return n;
+}
+
+WUFFS_BASE__MAYBE_STATIC size_t //
+wuffs_base__render_number_i64(wuffs_base__slice_u8 dst,
+ int64_t x,
+ uint32_t options) {
+ uint64_t u = (uint64_t)x;
+ bool neg = x < 0;
+ if (neg) {
+ u = 1 + ~u;
+ }
+ return wuffs_base__private_implementation__render_number_u64(dst, u, options,
+ neg);
+}
+
+WUFFS_BASE__MAYBE_STATIC size_t //
+wuffs_base__render_number_u64(wuffs_base__slice_u8 dst,
+ uint64_t x,
+ uint32_t options) {
+ return wuffs_base__private_implementation__render_number_u64(dst, x, options,
+ false);
+}
+
+// ---------------- Hexadecimal
+
+WUFFS_BASE__MAYBE_STATIC size_t //
+wuffs_base__hexadecimal__decode2(wuffs_base__slice_u8 dst,
+ wuffs_base__slice_u8 src) {
+ size_t src_len2 = src.len / 2;
+ size_t len = dst.len < src_len2 ? dst.len : src_len2;
+ uint8_t* d = dst.ptr;
+ uint8_t* s = src.ptr;
+ size_t n = len;
+
+ while (n--) {
+ *d = (uint8_t)((wuffs_base__parse_number__hexadecimal_digits[s[0]] << 4) |
+ (wuffs_base__parse_number__hexadecimal_digits[s[1]] & 0x0F));
+ d += 1;
+ s += 2;
+ }
+
+ return len;
+}
+
+WUFFS_BASE__MAYBE_STATIC size_t //
+wuffs_base__hexadecimal__decode4(wuffs_base__slice_u8 dst,
+ wuffs_base__slice_u8 src) {
+ size_t src_len4 = src.len / 4;
+ size_t len = dst.len < src_len4 ? dst.len : src_len4;
+ uint8_t* d = dst.ptr;
+ uint8_t* s = src.ptr;
+ size_t n = len;
+
+ while (n--) {
+ *d = (uint8_t)((wuffs_base__parse_number__hexadecimal_digits[s[2]] << 4) |
+ (wuffs_base__parse_number__hexadecimal_digits[s[3]] & 0x0F));
+ d += 1;
+ s += 4;
+ }
+
+ return len;
+}
+
+#endif // !defined(WUFFS_CONFIG__MODULES) ||
+ // defined(WUFFS_CONFIG__MODULE__BASE) ||
+ // defined(WUFFS_CONFIG__MODULE__BASE__I64CONV)
+
+#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \
defined(WUFFS_CONFIG__MODULE__BASE__PIXCONV)
// ---------------- Pixel Swizzler
@@ -12063,6 +12726,195 @@
// defined(WUFFS_CONFIG__MODULE__BASE) ||
// defined(WUFFS_CONFIG__MODULE__BASE__PIXCONV)
+#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \
+ defined(WUFFS_CONFIG__MODULE__BASE__UTF8)
+
+// ---------------- Unicode and UTF-8
+
+WUFFS_BASE__MAYBE_STATIC size_t //
+wuffs_base__utf_8__encode(wuffs_base__slice_u8 dst, uint32_t code_point) {
+ if (code_point <= 0x7F) {
+ if (dst.len >= 1) {
+ dst.ptr[0] = (uint8_t)(code_point);
+ return 1;
+ }
+
+ } else if (code_point <= 0x07FF) {
+ if (dst.len >= 2) {
+ dst.ptr[0] = (uint8_t)(0xC0 | ((code_point >> 6)));
+ dst.ptr[1] = (uint8_t)(0x80 | ((code_point >> 0) & 0x3F));
+ return 2;
+ }
+
+ } else if (code_point <= 0xFFFF) {
+ if ((dst.len >= 3) && ((code_point < 0xD800) || (0xDFFF < code_point))) {
+ dst.ptr[0] = (uint8_t)(0xE0 | ((code_point >> 12)));
+ dst.ptr[1] = (uint8_t)(0x80 | ((code_point >> 6) & 0x3F));
+ dst.ptr[2] = (uint8_t)(0x80 | ((code_point >> 0) & 0x3F));
+ return 3;
+ }
+
+ } else if (code_point <= 0x10FFFF) {
+ if (dst.len >= 4) {
+ dst.ptr[0] = (uint8_t)(0xF0 | ((code_point >> 18)));
+ dst.ptr[1] = (uint8_t)(0x80 | ((code_point >> 12) & 0x3F));
+ dst.ptr[2] = (uint8_t)(0x80 | ((code_point >> 6) & 0x3F));
+ dst.ptr[3] = (uint8_t)(0x80 | ((code_point >> 0) & 0x3F));
+ return 4;
+ }
+ }
+
+ return 0;
+}
+
+// wuffs_base__utf_8__byte_length_minus_1 is the byte length (minus 1) of a
+// UTF-8 encoded code point, based on the encoding's initial byte.
+// - 0x00 is 1-byte UTF-8 (ASCII).
+// - 0x01 is the start of 2-byte UTF-8.
+// - 0x02 is the start of 3-byte UTF-8.
+// - 0x03 is the start of 4-byte UTF-8.
+// - 0x40 is a UTF-8 tail byte.
+// - 0x80 is invalid UTF-8.
+//
+// RFC 3629 (UTF-8) gives this grammar for valid UTF-8:
+// UTF8-1 = %x00-7F
+// UTF8-2 = %xC2-DF UTF8-tail
+// UTF8-3 = %xE0 %xA0-BF UTF8-tail / %xE1-EC 2( UTF8-tail ) /
+// %xED %x80-9F UTF8-tail / %xEE-EF 2( UTF8-tail )
+// UTF8-4 = %xF0 %x90-BF 2( UTF8-tail ) / %xF1-F3 3( UTF8-tail ) /
+// %xF4 %x80-8F 2( UTF8-tail )
+// UTF8-tail = %x80-BF
+static const uint8_t wuffs_base__utf_8__byte_length_minus_1[256] = {
+ // 0 1 2 3 4 5 6 7
+ // 8 9 A B C D E F
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x00 ..= 0x07.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x08 ..= 0x0F.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x10 ..= 0x17.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x18 ..= 0x1F.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x20 ..= 0x27.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x28 ..= 0x2F.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x30 ..= 0x37.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x38 ..= 0x3F.
+
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x40 ..= 0x47.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x48 ..= 0x4F.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x50 ..= 0x57.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x58 ..= 0x5F.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x60 ..= 0x67.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x68 ..= 0x6F.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x70 ..= 0x77.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x78 ..= 0x7F.
+
+ 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0x80 ..= 0x87.
+ 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0x88 ..= 0x8F.
+ 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0x90 ..= 0x97.
+ 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0x98 ..= 0x9F.
+ 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0xA0 ..= 0xA7.
+ 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0xA8 ..= 0xAF.
+ 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0xB0 ..= 0xB7.
+ 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0xB8 ..= 0xBF.
+
+ 0x80, 0x80, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0xC0 ..= 0xC7.
+ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0xC8 ..= 0xCF.
+ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0xD0 ..= 0xD7.
+ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0xD8 ..= 0xDF.
+ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, // 0xE0 ..= 0xE7.
+ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, // 0xE8 ..= 0xEF.
+ 0x03, 0x03, 0x03, 0x03, 0x03, 0x80, 0x80, 0x80, // 0xF0 ..= 0xF7.
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xF8 ..= 0xFF.
+ // 0 1 2 3 4 5 6 7
+ // 8 9 A B C D E F
+};
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__utf_8__next__output //
+wuffs_base__utf_8__next(wuffs_base__slice_u8 s) {
+ if (s.len == 0) {
+ return wuffs_base__make_utf_8__next__output(0, 0);
+ }
+ uint32_t c = s.ptr[0];
+ switch (wuffs_base__utf_8__byte_length_minus_1[c & 0xFF]) {
+ case 0:
+ return wuffs_base__make_utf_8__next__output(c, 1);
+
+ case 1:
+ if (s.len < 2) {
+ break;
+ }
+ c = wuffs_base__load_u16le__no_bounds_check(s.ptr);
+ if ((c & 0xC000) != 0x8000) {
+ break;
+ }
+ c = (0x0007C0 & (c << 6)) | (0x00003F & (c >> 8));
+ return wuffs_base__make_utf_8__next__output(c, 2);
+
+ case 2:
+ if (s.len < 3) {
+ break;
+ }
+ c = wuffs_base__load_u24le__no_bounds_check(s.ptr);
+ if ((c & 0xC0C000) != 0x808000) {
+ break;
+ }
+ c = (0x00F000 & (c << 12)) | (0x000FC0 & (c >> 2)) |
+ (0x00003F & (c >> 16));
+ if ((c <= 0x07FF) || ((0xD800 <= c) && (c <= 0xDFFF))) {
+ break;
+ }
+ return wuffs_base__make_utf_8__next__output(c, 3);
+
+ case 3:
+ if (s.len < 4) {
+ break;
+ }
+ c = wuffs_base__load_u32le__no_bounds_check(s.ptr);
+ if ((c & 0xC0C0C000) != 0x80808000) {
+ break;
+ }
+ c = (0x1C0000 & (c << 18)) | (0x03F000 & (c << 4)) |
+ (0x000FC0 & (c >> 10)) | (0x00003F & (c >> 24));
+ if ((c <= 0xFFFF) || (0x110000 <= c)) {
+ break;
+ }
+ return wuffs_base__make_utf_8__next__output(c, 4);
+ }
+
+ return wuffs_base__make_utf_8__next__output(
+ WUFFS_BASE__UNICODE_REPLACEMENT_CHARACTER, 1);
+}
+
+WUFFS_BASE__MAYBE_STATIC size_t //
+wuffs_base__utf_8__longest_valid_prefix(wuffs_base__slice_u8 s) {
+ // TODO: possibly optimize the all-ASCII case (4 or 8 bytes at a time).
+ //
+ // TODO: possibly optimize this by manually inlining the
+ // wuffs_base__utf_8__next calls.
+ size_t original_len = s.len;
+ while (s.len > 0) {
+ wuffs_base__utf_8__next__output o = wuffs_base__utf_8__next(s);
+ if ((o.code_point > 0x7F) && (o.byte_length == 1)) {
+ break;
+ }
+ s.ptr += o.byte_length;
+ s.len -= o.byte_length;
+ }
+ return original_len - s.len;
+}
+
+WUFFS_BASE__MAYBE_STATIC size_t //
+wuffs_base__ascii__longest_valid_prefix(wuffs_base__slice_u8 s) {
+ // TODO: possibly optimize this by checking 4 or 8 bytes at a time.
+ uint8_t* original_ptr = s.ptr;
+ uint8_t* p = s.ptr;
+ uint8_t* q = s.ptr + s.len;
+ for (; (p != q) && ((*p & 0x80) == 0); p++) {
+ }
+ return (size_t)(p - original_ptr);
+}
+
+#endif // !defined(WUFFS_CONFIG__MODULES) ||
+ // defined(WUFFS_CONFIG__MODULE__BASE) ||
+ // defined(WUFFS_CONFIG__MODULE__BASE__UTF8)
+
#ifdef __cplusplus
} // extern "C"
#endif
@@ -12095,7 +12947,7 @@
wuffs_adler32__hasher* self,
size_t sizeof_star_self,
uint64_t wuffs_version,
- uint32_t initialize_flags){
+ uint32_t options){
if (!self) {
return wuffs_base__make_status(wuffs_base__error__bad_receiver);
}
@@ -12107,7 +12959,7 @@
return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
}
- if ((initialize_flags & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
+ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
// The whole point of this if-check is to detect an uninitialized *self.
// We disable the warning on GCC. Clang-5.0 does not have this warning.
#if !defined(__clang__) && defined(__GNUC__)
@@ -12121,9 +12973,9 @@
#pragma GCC diagnostic pop
#endif
} else {
- if ((initialize_flags & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
+ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
memset(self, 0, sizeof(*self));
- initialize_flags |= WUFFS_INITIALIZE__ALREADY_ZEROED;
+ options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
} else {
memset(&(self->private_impl), 0, sizeof(self->private_impl));
}
@@ -12252,9 +13104,9 @@
// ---------------- Status Codes Implementations
-const char* wuffs_bmp__error__bad_header = "#bmp: bad header";
-const char* wuffs_bmp__error__unsupported_bmp_file = "#bmp: unsupported BMP file";
-const char* wuffs_bmp__note__internal_note_short_read = "@bmp: internal note: short read";
+const char wuffs_bmp__error__bad_header[] = "#bmp: bad header";
+const char wuffs_bmp__error__unsupported_bmp_file[] = "#bmp: unsupported BMP file";
+const char wuffs_bmp__note__internal_note_short_read[] = "@bmp: internal note: short read";
// ---------------- Private Consts
@@ -12316,7 +13168,7 @@
wuffs_bmp__decoder* self,
size_t sizeof_star_self,
uint64_t wuffs_version,
- uint32_t initialize_flags){
+ uint32_t options){
if (!self) {
return wuffs_base__make_status(wuffs_base__error__bad_receiver);
}
@@ -12328,7 +13180,7 @@
return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
}
- if ((initialize_flags & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
+ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
// The whole point of this if-check is to detect an uninitialized *self.
// We disable the warning on GCC. Clang-5.0 does not have this warning.
#if !defined(__clang__) && defined(__GNUC__)
@@ -12342,9 +13194,9 @@
#pragma GCC diagnostic pop
#endif
} else {
- if ((initialize_flags & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
+ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
memset(self, 0, sizeof(*self));
- initialize_flags |= WUFFS_INITIALIZE__ALREADY_ZEROED;
+ options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
} else {
memset(&(self->private_impl), 0, sizeof(self->private_impl));
}
@@ -14114,7 +14966,7 @@
wuffs_crc32__ieee_hasher* self,
size_t sizeof_star_self,
uint64_t wuffs_version,
- uint32_t initialize_flags){
+ uint32_t options){
if (!self) {
return wuffs_base__make_status(wuffs_base__error__bad_receiver);
}
@@ -14126,7 +14978,7 @@
return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
}
- if ((initialize_flags & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
+ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
// The whole point of this if-check is to detect an uninitialized *self.
// We disable the warning on GCC. Clang-5.0 does not have this warning.
#if !defined(__clang__) && defined(__GNUC__)
@@ -14140,9 +14992,9 @@
#pragma GCC diagnostic pop
#endif
} else {
- if ((initialize_flags & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
+ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
memset(self, 0, sizeof(*self));
- initialize_flags |= WUFFS_INITIALIZE__ALREADY_ZEROED;
+ options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
} else {
memset(&(self->private_impl), 0, sizeof(self->private_impl));
}
@@ -14296,23 +15148,23 @@
// ---------------- Status Codes Implementations
-const char* wuffs_deflate__error__bad_huffman_code_over_subscribed = "#deflate: bad Huffman code (over-subscribed)";
-const char* wuffs_deflate__error__bad_huffman_code_under_subscribed = "#deflate: bad Huffman code (under-subscribed)";
-const char* wuffs_deflate__error__bad_huffman_code_length_count = "#deflate: bad Huffman code length count";
-const char* wuffs_deflate__error__bad_huffman_code_length_repetition = "#deflate: bad Huffman code length repetition";
-const char* wuffs_deflate__error__bad_huffman_code = "#deflate: bad Huffman code";
-const char* wuffs_deflate__error__bad_huffman_minimum_code_length = "#deflate: bad Huffman minimum code length";
-const char* wuffs_deflate__error__bad_block = "#deflate: bad block";
-const char* wuffs_deflate__error__bad_distance = "#deflate: bad distance";
-const char* wuffs_deflate__error__bad_distance_code_count = "#deflate: bad distance code count";
-const char* wuffs_deflate__error__bad_literal_length_code_count = "#deflate: bad literal/length code count";
-const char* wuffs_deflate__error__inconsistent_stored_block_length = "#deflate: inconsistent stored block length";
-const char* wuffs_deflate__error__missing_end_of_block_code = "#deflate: missing end-of-block code";
-const char* wuffs_deflate__error__no_huffman_codes = "#deflate: no Huffman codes";
-const char* wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state = "#deflate: internal error: inconsistent Huffman decoder state";
-const char* wuffs_deflate__error__internal_error_inconsistent_i_o = "#deflate: internal error: inconsistent I/O";
-const char* wuffs_deflate__error__internal_error_inconsistent_distance = "#deflate: internal error: inconsistent distance";
-const char* wuffs_deflate__error__internal_error_inconsistent_n_bits = "#deflate: internal error: inconsistent n_bits";
+const char wuffs_deflate__error__bad_huffman_code_over_subscribed[] = "#deflate: bad Huffman code (over-subscribed)";
+const char wuffs_deflate__error__bad_huffman_code_under_subscribed[] = "#deflate: bad Huffman code (under-subscribed)";
+const char wuffs_deflate__error__bad_huffman_code_length_count[] = "#deflate: bad Huffman code length count";
+const char wuffs_deflate__error__bad_huffman_code_length_repetition[] = "#deflate: bad Huffman code length repetition";
+const char wuffs_deflate__error__bad_huffman_code[] = "#deflate: bad Huffman code";
+const char wuffs_deflate__error__bad_huffman_minimum_code_length[] = "#deflate: bad Huffman minimum code length";
+const char wuffs_deflate__error__bad_block[] = "#deflate: bad block";
+const char wuffs_deflate__error__bad_distance[] = "#deflate: bad distance";
+const char wuffs_deflate__error__bad_distance_code_count[] = "#deflate: bad distance code count";
+const char wuffs_deflate__error__bad_literal_length_code_count[] = "#deflate: bad literal/length code count";
+const char wuffs_deflate__error__inconsistent_stored_block_length[] = "#deflate: inconsistent stored block length";
+const char wuffs_deflate__error__missing_end_of_block_code[] = "#deflate: missing end-of-block code";
+const char wuffs_deflate__error__no_huffman_codes[] = "#deflate: no Huffman codes";
+const char wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state[] = "#deflate: internal error: inconsistent Huffman decoder state";
+const char wuffs_deflate__error__internal_error_inconsistent_i_o[] = "#deflate: internal error: inconsistent I/O";
+const char wuffs_deflate__error__internal_error_inconsistent_distance[] = "#deflate: internal error: inconsistent distance";
+const char wuffs_deflate__error__internal_error_inconsistent_n_bits[] = "#deflate: internal error: inconsistent n_bits";
// ---------------- Private Consts
@@ -14445,7 +15297,7 @@
wuffs_deflate__decoder* self,
size_t sizeof_star_self,
uint64_t wuffs_version,
- uint32_t initialize_flags){
+ uint32_t options){
if (!self) {
return wuffs_base__make_status(wuffs_base__error__bad_receiver);
}
@@ -14457,7 +15309,7 @@
return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
}
- if ((initialize_flags & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
+ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
// The whole point of this if-check is to detect an uninitialized *self.
// We disable the warning on GCC. Clang-5.0 does not have this warning.
#if !defined(__clang__) && defined(__GNUC__)
@@ -14471,9 +15323,9 @@
#pragma GCC diagnostic pop
#endif
} else {
- if ((initialize_flags & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
+ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
memset(self, 0, sizeof(*self));
- initialize_flags |= WUFFS_INITIALIZE__ALREADY_ZEROED;
+ options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
} else {
memset(&(self->private_impl), 0, sizeof(self->private_impl));
}
@@ -16123,8 +16975,8 @@
// ---------------- Status Codes Implementations
-const char* wuffs_lzw__error__bad_code = "#lzw: bad code";
-const char* wuffs_lzw__error__internal_error_inconsistent_i_o = "#lzw: internal error: inconsistent I/O";
+const char wuffs_lzw__error__bad_code[] = "#lzw: bad code";
+const char wuffs_lzw__error__internal_error_inconsistent_i_o[] = "#lzw: internal error: inconsistent I/O";
// ---------------- Private Consts
@@ -16163,7 +17015,7 @@
wuffs_lzw__decoder* self,
size_t sizeof_star_self,
uint64_t wuffs_version,
- uint32_t initialize_flags){
+ uint32_t options){
if (!self) {
return wuffs_base__make_status(wuffs_base__error__bad_receiver);
}
@@ -16175,7 +17027,7 @@
return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
}
- if ((initialize_flags & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
+ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
// The whole point of this if-check is to detect an uninitialized *self.
// We disable the warning on GCC. Clang-5.0 does not have this warning.
#if !defined(__clang__) && defined(__GNUC__)
@@ -16189,9 +17041,9 @@
#pragma GCC diagnostic pop
#endif
} else {
- if ((initialize_flags & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
+ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
memset(self, 0, sizeof(*self));
- initialize_flags |= WUFFS_INITIALIZE__ALREADY_ZEROED;
+ options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
} else {
memset(&(self->private_impl), 0, sizeof(self->private_impl));
}
@@ -16649,13 +17501,13 @@
// ---------------- Status Codes Implementations
-const char* wuffs_gif__error__bad_extension_label = "#gif: bad extension label";
-const char* wuffs_gif__error__bad_frame_size = "#gif: bad frame size";
-const char* wuffs_gif__error__bad_graphic_control = "#gif: bad graphic control";
-const char* wuffs_gif__error__bad_header = "#gif: bad header";
-const char* wuffs_gif__error__bad_literal_width = "#gif: bad literal width";
-const char* wuffs_gif__error__bad_palette = "#gif: bad palette";
-const char* wuffs_gif__error__internal_error_inconsistent_ri_wi = "#gif: internal error: inconsistent ri/wi";
+const char wuffs_gif__error__bad_extension_label[] = "#gif: bad extension label";
+const char wuffs_gif__error__bad_frame_size[] = "#gif: bad frame size";
+const char wuffs_gif__error__bad_graphic_control[] = "#gif: bad graphic control";
+const char wuffs_gif__error__bad_header[] = "#gif: bad header";
+const char wuffs_gif__error__bad_literal_width[] = "#gif: bad literal width";
+const char wuffs_gif__error__bad_palette[] = "#gif: bad palette";
+const char wuffs_gif__error__internal_error_inconsistent_ri_wi[] = "#gif: internal error: inconsistent ri/wi";
// ---------------- Private Consts
@@ -16901,7 +17753,7 @@
wuffs_gif__config_decoder* self,
size_t sizeof_star_self,
uint64_t wuffs_version,
- uint32_t initialize_flags){
+ uint32_t options){
if (!self) {
return wuffs_base__make_status(wuffs_base__error__bad_receiver);
}
@@ -16913,7 +17765,7 @@
return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
}
- if ((initialize_flags & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
+ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
// The whole point of this if-check is to detect an uninitialized *self.
// We disable the warning on GCC. Clang-5.0 does not have this warning.
#if !defined(__clang__) && defined(__GNUC__)
@@ -16927,9 +17779,9 @@
#pragma GCC diagnostic pop
#endif
} else {
- if ((initialize_flags & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
+ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
memset(self, 0, sizeof(*self));
- initialize_flags |= WUFFS_INITIALIZE__ALREADY_ZEROED;
+ options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
} else {
memset(&(self->private_impl), 0, sizeof(self->private_impl));
}
@@ -16968,7 +17820,7 @@
wuffs_gif__decoder* self,
size_t sizeof_star_self,
uint64_t wuffs_version,
- uint32_t initialize_flags){
+ uint32_t options){
if (!self) {
return wuffs_base__make_status(wuffs_base__error__bad_receiver);
}
@@ -16980,7 +17832,7 @@
return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
}
- if ((initialize_flags & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
+ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
// The whole point of this if-check is to detect an uninitialized *self.
// We disable the warning on GCC. Clang-5.0 does not have this warning.
#if !defined(__clang__) && defined(__GNUC__)
@@ -16994,9 +17846,9 @@
#pragma GCC diagnostic pop
#endif
} else {
- if ((initialize_flags & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
+ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
memset(self, 0, sizeof(*self));
- initialize_flags |= WUFFS_INITIALIZE__ALREADY_ZEROED;
+ options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
} else {
memset(&(self->private_impl), 0, sizeof(self->private_impl));
}
@@ -17004,7 +17856,7 @@
{
wuffs_base__status z = wuffs_lzw__decoder__initialize(
- &self->private_data.f_lzw, sizeof(self->private_data.f_lzw), WUFFS_VERSION, initialize_flags);
+ &self->private_data.f_lzw, sizeof(self->private_data.f_lzw), WUFFS_VERSION, options);
if (z.repr) {
return z;
}
@@ -21129,10 +21981,10 @@
// ---------------- Status Codes Implementations
-const char* wuffs_gzip__error__bad_checksum = "#gzip: bad checksum";
-const char* wuffs_gzip__error__bad_compression_method = "#gzip: bad compression method";
-const char* wuffs_gzip__error__bad_encoding_flags = "#gzip: bad encoding flags";
-const char* wuffs_gzip__error__bad_header = "#gzip: bad header";
+const char wuffs_gzip__error__bad_checksum[] = "#gzip: bad checksum";
+const char wuffs_gzip__error__bad_compression_method[] = "#gzip: bad compression method";
+const char wuffs_gzip__error__bad_encoding_flags[] = "#gzip: bad encoding flags";
+const char wuffs_gzip__error__bad_header[] = "#gzip: bad header";
// ---------------- Private Consts
@@ -21161,7 +22013,7 @@
wuffs_gzip__decoder* self,
size_t sizeof_star_self,
uint64_t wuffs_version,
- uint32_t initialize_flags){
+ uint32_t options){
if (!self) {
return wuffs_base__make_status(wuffs_base__error__bad_receiver);
}
@@ -21173,7 +22025,7 @@
return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
}
- if ((initialize_flags & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
+ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
// The whole point of this if-check is to detect an uninitialized *self.
// We disable the warning on GCC. Clang-5.0 does not have this warning.
#if !defined(__clang__) && defined(__GNUC__)
@@ -21187,9 +22039,9 @@
#pragma GCC diagnostic pop
#endif
} else {
- if ((initialize_flags & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
+ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
memset(self, 0, sizeof(*self));
- initialize_flags |= WUFFS_INITIALIZE__ALREADY_ZEROED;
+ options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
} else {
memset(&(self->private_impl), 0, sizeof(self->private_impl));
}
@@ -21197,14 +22049,14 @@
{
wuffs_base__status z = wuffs_crc32__ieee_hasher__initialize(
- &self->private_data.f_checksum, sizeof(self->private_data.f_checksum), WUFFS_VERSION, initialize_flags);
+ &self->private_data.f_checksum, sizeof(self->private_data.f_checksum), WUFFS_VERSION, options);
if (z.repr) {
return z;
}
}
{
wuffs_base__status z = wuffs_deflate__decoder__initialize(
- &self->private_data.f_flate, sizeof(self->private_data.f_flate), WUFFS_VERSION, initialize_flags);
+ &self->private_data.f_flate, sizeof(self->private_data.f_flate), WUFFS_VERSION, options);
if (z.repr) {
return z;
}
@@ -21629,13 +22481,13 @@
// ---------------- Status Codes Implementations
-const char* wuffs_json__error__bad_c0_control_code = "#json: bad C0 control code";
-const char* wuffs_json__error__bad_utf_8 = "#json: bad UTF-8";
-const char* wuffs_json__error__bad_backslash_escape = "#json: bad backslash-escape";
-const char* wuffs_json__error__bad_input = "#json: bad input";
-const char* wuffs_json__error__unsupported_number_length = "#json: unsupported number length";
-const char* wuffs_json__error__unsupported_recursion_depth = "#json: unsupported recursion depth";
-const char* wuffs_json__error__internal_error_inconsistent_i_o = "#json: internal error: inconsistent I/O";
+const char wuffs_json__error__bad_c0_control_code[] = "#json: bad C0 control code";
+const char wuffs_json__error__bad_utf_8[] = "#json: bad UTF-8";
+const char wuffs_json__error__bad_backslash_escape[] = "#json: bad backslash-escape";
+const char wuffs_json__error__bad_input[] = "#json: bad input";
+const char wuffs_json__error__unsupported_number_length[] = "#json: unsupported number length";
+const char wuffs_json__error__unsupported_recursion_depth[] = "#json: unsupported recursion depth";
+const char wuffs_json__error__internal_error_inconsistent_i_o[] = "#json: internal error: inconsistent I/O";
// ---------------- Private Consts
@@ -21937,7 +22789,7 @@
wuffs_json__decoder* self,
size_t sizeof_star_self,
uint64_t wuffs_version,
- uint32_t initialize_flags){
+ uint32_t options){
if (!self) {
return wuffs_base__make_status(wuffs_base__error__bad_receiver);
}
@@ -21949,7 +22801,7 @@
return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
}
- if ((initialize_flags & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
+ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
// The whole point of this if-check is to detect an uninitialized *self.
// We disable the warning on GCC. Clang-5.0 does not have this warning.
#if !defined(__clang__) && defined(__GNUC__)
@@ -21963,9 +22815,9 @@
#pragma GCC diagnostic pop
#endif
} else {
- if ((initialize_flags & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
+ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
memset(self, 0, sizeof(*self));
- initialize_flags |= WUFFS_INITIALIZE__ALREADY_ZEROED;
+ options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
} else {
memset(&(self->private_impl), 0, sizeof(self->private_impl));
}
@@ -23827,7 +24679,7 @@
// ---------------- Status Codes Implementations
-const char* wuffs_wbmp__error__bad_header = "#wbmp: bad header";
+const char wuffs_wbmp__error__bad_header[] = "#wbmp: bad header";
// ---------------- Private Consts
@@ -23883,7 +24735,7 @@
wuffs_wbmp__decoder* self,
size_t sizeof_star_self,
uint64_t wuffs_version,
- uint32_t initialize_flags){
+ uint32_t options){
if (!self) {
return wuffs_base__make_status(wuffs_base__error__bad_receiver);
}
@@ -23895,7 +24747,7 @@
return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
}
- if ((initialize_flags & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
+ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
// The whole point of this if-check is to detect an uninitialized *self.
// We disable the warning on GCC. Clang-5.0 does not have this warning.
#if !defined(__clang__) && defined(__GNUC__)
@@ -23909,9 +24761,9 @@
#pragma GCC diagnostic pop
#endif
} else {
- if ((initialize_flags & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
+ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
memset(self, 0, sizeof(*self));
- initialize_flags |= WUFFS_INITIALIZE__ALREADY_ZEROED;
+ options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
} else {
memset(&(self->private_impl), 0, sizeof(self->private_impl));
}
@@ -24623,12 +25475,12 @@
// ---------------- Status Codes Implementations
-const char* wuffs_zlib__note__dictionary_required = "@zlib: dictionary required";
-const char* wuffs_zlib__error__bad_checksum = "#zlib: bad checksum";
-const char* wuffs_zlib__error__bad_compression_method = "#zlib: bad compression method";
-const char* wuffs_zlib__error__bad_compression_window_size = "#zlib: bad compression window size";
-const char* wuffs_zlib__error__bad_parity_check = "#zlib: bad parity check";
-const char* wuffs_zlib__error__incorrect_dictionary = "#zlib: incorrect dictionary";
+const char wuffs_zlib__note__dictionary_required[] = "@zlib: dictionary required";
+const char wuffs_zlib__error__bad_checksum[] = "#zlib: bad checksum";
+const char wuffs_zlib__error__bad_compression_method[] = "#zlib: bad compression method";
+const char wuffs_zlib__error__bad_compression_window_size[] = "#zlib: bad compression window size";
+const char wuffs_zlib__error__bad_parity_check[] = "#zlib: bad parity check";
+const char wuffs_zlib__error__incorrect_dictionary[] = "#zlib: incorrect dictionary";
// ---------------- Private Consts
@@ -24657,7 +25509,7 @@
wuffs_zlib__decoder* self,
size_t sizeof_star_self,
uint64_t wuffs_version,
- uint32_t initialize_flags){
+ uint32_t options){
if (!self) {
return wuffs_base__make_status(wuffs_base__error__bad_receiver);
}
@@ -24669,7 +25521,7 @@
return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
}
- if ((initialize_flags & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
+ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
// The whole point of this if-check is to detect an uninitialized *self.
// We disable the warning on GCC. Clang-5.0 does not have this warning.
#if !defined(__clang__) && defined(__GNUC__)
@@ -24683,9 +25535,9 @@
#pragma GCC diagnostic pop
#endif
} else {
- if ((initialize_flags & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
+ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
memset(self, 0, sizeof(*self));
- initialize_flags |= WUFFS_INITIALIZE__ALREADY_ZEROED;
+ options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
} else {
memset(&(self->private_impl), 0, sizeof(self->private_impl));
}
@@ -24693,21 +25545,21 @@
{
wuffs_base__status z = wuffs_adler32__hasher__initialize(
- &self->private_data.f_checksum, sizeof(self->private_data.f_checksum), WUFFS_VERSION, initialize_flags);
+ &self->private_data.f_checksum, sizeof(self->private_data.f_checksum), WUFFS_VERSION, options);
if (z.repr) {
return z;
}
}
{
wuffs_base__status z = wuffs_adler32__hasher__initialize(
- &self->private_data.f_dict_id_hasher, sizeof(self->private_data.f_dict_id_hasher), WUFFS_VERSION, initialize_flags);
+ &self->private_data.f_dict_id_hasher, sizeof(self->private_data.f_dict_id_hasher), WUFFS_VERSION, options);
if (z.repr) {
return z;
}
}
{
wuffs_base__status z = wuffs_deflate__decoder__initialize(
- &self->private_data.f_flate, sizeof(self->private_data.f_flate), WUFFS_VERSION, initialize_flags);
+ &self->private_data.f_flate, sizeof(self->private_data.f_flate), WUFFS_VERSION, options);
if (z.repr) {
return z;
}