| #ifndef WUFFS_CRC32_H |
| #define WUFFS_CRC32_H |
| |
| // Code generated by wuffs-c. DO NOT EDIT. |
| |
| #ifndef WUFFS_BASE_HEADER_H |
| #define WUFFS_BASE_HEADER_H |
| |
| // Copyright 2017 The Wuffs Authors. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // https://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| #include <stdbool.h> |
| #include <stdint.h> |
| #include <string.h> |
| |
| // Wuffs assumes that: |
| // - converting a uint32_t to a size_t will never overflow. |
| // - converting a size_t to a uint64_t will never overflow. |
| #if (__WORDSIZE != 32) && (__WORDSIZE != 64) |
| #error "Wuffs requires a word size of either 32 or 64 bits" |
| #endif |
| |
| // WUFFS_VERSION is the major.minor version number as a uint32_t. The major |
| // number is the high 16 bits. The minor number is the low 16 bits. |
| // |
| // The intention is to bump the version number at least on every API / ABI |
| // backwards incompatible change. |
| // |
| // For now, the API and ABI are simply unstable and can change at any time. |
| // |
| // TODO: don't hard code this in base-header.h. |
| #define WUFFS_VERSION ((uint32_t)0x00001) |
| |
| // wuffs_base__empty_struct is used when a Wuffs function returns an empty |
| // struct. In C, if a function f returns void, you can't say "x = f()", but in |
| // Wuffs, if a function g returns empty, you can say "y = g()". |
| typedef struct { |
| } wuffs_base__empty_struct; |
| |
| // ---------------- Numeric Types |
| |
| // Flicks are a unit of time. One flick (frame-tick) is 1 / 705_600_000 of a |
| // second. See https://github.com/OculusVR/Flicks |
| typedef uint64_t wuffs_base__flicks; |
| |
| #define WUFFS_BASE__FLICKS_PER_SECOND ((uint64_t)705600000) |
| #define WUFFS_BASE__FLICKS_PER_MILLISECOND ((uint64_t)705600) |
| |
| // -------- |
| |
| static inline uint8_t wuffs_base__u8__min(uint8_t x, uint8_t y) { |
| return x < y ? x : y; |
| } |
| |
| static inline uint8_t wuffs_base__u8__max(uint8_t x, uint8_t y) { |
| return x > y ? x : y; |
| } |
| |
| static inline uint16_t wuffs_base__u16__min(uint16_t x, uint16_t y) { |
| return x < y ? x : y; |
| } |
| |
| static inline uint16_t wuffs_base__u16__max(uint16_t x, uint16_t y) { |
| return x > y ? x : y; |
| } |
| |
| static inline uint32_t wuffs_base__u32__min(uint32_t x, uint32_t y) { |
| return x < y ? x : y; |
| } |
| |
| static inline uint32_t wuffs_base__u32__max(uint32_t x, uint32_t y) { |
| return x > y ? x : y; |
| } |
| |
| static inline uint64_t wuffs_base__u64__min(uint64_t x, uint64_t y) { |
| return x < y ? x : y; |
| } |
| |
| static inline uint64_t wuffs_base__u64__max(uint64_t x, uint64_t y) { |
| return x > y ? x : y; |
| } |
| |
| // -------- |
| |
| // Saturating arithmetic (sat_add, sat_sub) branchless bit-twiddling algorithms |
| // are per https://locklessinc.com/articles/sat_arithmetic/ |
| // |
| // It is important that the underlying types are unsigned integers, as signed |
| // integer arithmetic overflow is undefined behavior in C. |
| |
| static inline uint8_t wuffs_base__u8__sat_add(uint8_t x, uint8_t y) { |
| uint8_t res = x + y; |
| res |= -(res < x); |
| return res; |
| } |
| |
| static inline uint8_t wuffs_base__u8__sat_sub(uint8_t x, uint8_t y) { |
| uint8_t res = x - y; |
| res &= -(res <= x); |
| return res; |
| } |
| |
| static inline uint16_t wuffs_base__u16__sat_add(uint16_t x, uint16_t y) { |
| uint16_t res = x + y; |
| res |= -(res < x); |
| return res; |
| } |
| |
| static inline uint16_t wuffs_base__u16__sat_sub(uint16_t x, uint16_t y) { |
| uint16_t res = x - y; |
| res &= -(res <= x); |
| return res; |
| } |
| |
| static inline uint32_t wuffs_base__u32__sat_add(uint32_t x, uint32_t y) { |
| uint32_t res = x + y; |
| res |= -(res < x); |
| return res; |
| } |
| |
| static inline uint32_t wuffs_base__u32__sat_sub(uint32_t x, uint32_t y) { |
| uint32_t res = x - y; |
| res &= -(res <= x); |
| return res; |
| } |
| |
| static inline uint64_t wuffs_base__u64__sat_add(uint64_t x, uint64_t y) { |
| uint64_t res = x + y; |
| res |= -(res < x); |
| return res; |
| } |
| |
| static inline uint64_t wuffs_base__u64__sat_sub(uint64_t x, uint64_t y) { |
| uint64_t res = x - y; |
| res &= -(res <= x); |
| return res; |
| } |
| |
| // -------- |
| |
| // Clang also defines "__GNUC__". |
| |
| static inline uint16_t wuffs_base__u16__byte_swapped(uint16_t x) { |
| #if defined(__GNUC__) |
| return __builtin_bswap16(x); |
| #else |
| return (x >> 8) | (x << 8); |
| #endif |
| } |
| |
| static inline uint32_t wuffs_base__u32__byte_swapped(uint32_t x) { |
| #if defined(__GNUC__) |
| return __builtin_bswap32(x); |
| #else |
| static const uint32_t mask8 = 0x00FF00FF; |
| x = ((x >> 8) & mask8) | ((x & mask8) << 8); |
| return (x >> 16) | (x << 16); |
| #endif |
| } |
| |
| static inline uint64_t wuffs_base__u64__byte_swapped(uint64_t x) { |
| #if defined(__GNUC__) |
| return __builtin_bswap64(x); |
| #else |
| static const uint64_t mask8 = 0x00FF00FF00FF00FF; |
| static const uint64_t mask16 = 0x0000FFFF0000FFFF; |
| x = ((x >> 8) & mask8) | ((x & mask8) << 8); |
| x = ((x >> 16) & mask16) | ((x & mask16) << 16); |
| return (x >> 32) | (x << 32); |
| #endif |
| } |
| |
| // ---------------- Slices and Tables |
| |
| // WUFFS_BASE__SLICE is a 1-dimensional buffer. |
| // |
| // A value with all fields NULL or zero is a valid, empty slice. |
| #define WUFFS_BASE__SLICE(T) \ |
| struct { \ |
| T* ptr; \ |
| size_t len; \ |
| } |
| |
| // WUFFS_BASE__TABLE is a 2-dimensional buffer. |
| // |
| // A value with all fields NULL or zero is a valid, empty table. |
| #define WUFFS_BASE__TABLE(T) \ |
| struct { \ |
| T* ptr; \ |
| size_t width; \ |
| size_t height; \ |
| size_t stride; \ |
| } |
| |
| typedef WUFFS_BASE__SLICE(uint8_t) wuffs_base__slice_u8; |
| typedef WUFFS_BASE__SLICE(uint16_t) wuffs_base__slice_u16; |
| typedef WUFFS_BASE__SLICE(uint32_t) wuffs_base__slice_u32; |
| typedef WUFFS_BASE__SLICE(uint64_t) wuffs_base__slice_u64; |
| |
| typedef WUFFS_BASE__TABLE(uint8_t) wuffs_base__table_u8; |
| typedef WUFFS_BASE__TABLE(uint16_t) wuffs_base__table_u16; |
| typedef WUFFS_BASE__TABLE(uint32_t) wuffs_base__table_u32; |
| typedef WUFFS_BASE__TABLE(uint64_t) wuffs_base__table_u64; |
| |
| // ---------------- Ranges and Rects |
| |
| // Ranges are either inclusive ("range_ii") or exclusive ("range_ie") on the |
| // high end. Both the "ii" and "ie" flavors are useful in practice. |
| // |
| // The "ei" and "ee" flavors also exist in theory, but aren't widely used. In |
| // Wuffs, the low end is always inclusive. |
| // |
| // The "ii" (closed interval) flavor is useful when refining e.g. "the set of |
| // all uint32_t values" to a contiguous subset: "uint32_t values in the closed |
| // interval [M, N]", for uint32_t values M and N. An unrefined type (in other |
| // words, the set of all uint32_t values) is not representable in the "ie" |
| // flavor because if N equals ((1<<32) - 1) then (N + 1) will overflow. |
| // |
| // On the other hand, the "ie" (half-open interval) flavor is recommended by |
| // Dijkstra's "Why numbering should start at zero" at |
| // http://www.cs.utexas.edu/users/EWD/ewd08xx/EWD831.PDF and a further |
| // discussion of motivating rationale is at |
| // https://www.quora.com/Why-are-Python-ranges-half-open-exclusive-instead-of-closed-inclusive |
| // |
| // For example, with "ie", the number of elements in "uint32_t values in the |
| // half-open interval [M, N)" is equal to max(0, N-M). Furthermore, that number |
| // of elements (in one dimension, a length, in two dimensions, a width or |
| // height) is itself representable as a uint32_t without overflow, again for |
| // uint32_t values M and N. In the contrasting "ii" flavor, the length of the |
| // closed interval [0, (1<<32) - 1] is 1<<32, which cannot be represented as a |
| // uint32_t. In Wuffs, because of this potential overflow, the "ie" flavor has |
| // length / width / height methods, but the "ii" flavor does not. |
| // |
| // It is valid for min > max (for range_ii) or for min >= max (for range_ie), |
| // in which case the range is empty. There are multiple representations of an |
| // empty range. |
| |
| typedef struct { |
| uint32_t min_inclusive; |
| uint32_t max_inclusive; |
| } wuffs_base__range_ii_u32; |
| |
| static inline bool wuffs_base__range_ii_u32__is_empty( |
| wuffs_base__range_ii_u32 r) { |
| return r.min_inclusive > r.max_inclusive; |
| } |
| |
| static inline bool wuffs_base__range_ii_u32__contains( |
| wuffs_base__range_ii_u32 r, |
| uint32_t x) { |
| return (r.min_inclusive <= x) && (x <= r.max_inclusive); |
| } |
| |
| static inline wuffs_base__range_ii_u32 wuffs_base__range_ii_u32__intersection( |
| wuffs_base__range_ii_u32 r, |
| wuffs_base__range_ii_u32 s) { |
| r.min_inclusive = wuffs_base__u32__max(r.min_inclusive, s.min_inclusive); |
| r.max_inclusive = wuffs_base__u32__min(r.max_inclusive, s.max_inclusive); |
| return r; |
| } |
| |
| static inline wuffs_base__range_ii_u32 wuffs_base__range_ii_u32__union( |
| wuffs_base__range_ii_u32 r, |
| wuffs_base__range_ii_u32 s) { |
| if (wuffs_base__range_ii_u32__is_empty(r)) { |
| return s; |
| } |
| if (wuffs_base__range_ii_u32__is_empty(s)) { |
| return r; |
| } |
| r.min_inclusive = wuffs_base__u32__min(r.min_inclusive, s.min_inclusive); |
| r.max_inclusive = wuffs_base__u32__max(r.max_inclusive, s.max_inclusive); |
| return r; |
| } |
| |
| // -------- |
| |
| typedef struct { |
| uint32_t min_inclusive; |
| uint32_t max_exclusive; |
| } wuffs_base__range_ie_u32; |
| |
| static inline bool wuffs_base__range_ie_u32__is_empty( |
| wuffs_base__range_ie_u32 r) { |
| return r.min_inclusive >= r.max_exclusive; |
| } |
| |
| static inline bool wuffs_base__range_ie_u32__contains( |
| wuffs_base__range_ie_u32 r, |
| uint32_t x) { |
| return (r.min_inclusive <= x) && (x < r.max_exclusive); |
| } |
| |
| static inline wuffs_base__range_ie_u32 wuffs_base__range_ie_u32__intersection( |
| wuffs_base__range_ie_u32 r, |
| wuffs_base__range_ie_u32 s) { |
| r.min_inclusive = wuffs_base__u32__max(r.min_inclusive, s.min_inclusive); |
| r.max_exclusive = wuffs_base__u32__min(r.max_exclusive, s.max_exclusive); |
| return r; |
| } |
| |
| static inline wuffs_base__range_ie_u32 wuffs_base__range_ie_u32__union( |
| wuffs_base__range_ie_u32 r, |
| wuffs_base__range_ie_u32 s) { |
| if (wuffs_base__range_ie_u32__is_empty(r)) { |
| return s; |
| } |
| if (wuffs_base__range_ie_u32__is_empty(s)) { |
| return r; |
| } |
| r.min_inclusive = wuffs_base__u32__min(r.min_inclusive, s.min_inclusive); |
| r.max_exclusive = wuffs_base__u32__max(r.max_exclusive, s.max_exclusive); |
| return r; |
| } |
| |
| static inline uint32_t wuffs_base__range_ie_u32__length( |
| wuffs_base__range_ie_u32 r) { |
| return wuffs_base__u32__sat_sub(r.max_exclusive, r.min_inclusive); |
| } |
| |
| // -------- |
| |
| typedef struct { |
| uint64_t min_inclusive; |
| uint64_t max_inclusive; |
| } wuffs_base__range_ii_u64; |
| |
| static inline bool wuffs_base__range_ii_u64__is_empty( |
| wuffs_base__range_ii_u64 r) { |
| return r.min_inclusive > r.max_inclusive; |
| } |
| |
| static inline bool wuffs_base__range_ii_u64__contains( |
| wuffs_base__range_ii_u64 r, |
| uint64_t x) { |
| return (r.min_inclusive <= x) && (x <= r.max_inclusive); |
| } |
| |
| static inline wuffs_base__range_ii_u64 wuffs_base__range_ii_u64__intersection( |
| wuffs_base__range_ii_u64 r, |
| wuffs_base__range_ii_u64 s) { |
| r.min_inclusive = wuffs_base__u64__max(r.min_inclusive, s.min_inclusive); |
| r.max_inclusive = wuffs_base__u64__min(r.max_inclusive, s.max_inclusive); |
| return r; |
| } |
| |
| static inline wuffs_base__range_ii_u64 wuffs_base__range_ii_u64__union( |
| wuffs_base__range_ii_u64 r, |
| wuffs_base__range_ii_u64 s) { |
| if (wuffs_base__range_ii_u64__is_empty(r)) { |
| return s; |
| } |
| if (wuffs_base__range_ii_u64__is_empty(s)) { |
| return r; |
| } |
| r.min_inclusive = wuffs_base__u64__min(r.min_inclusive, s.min_inclusive); |
| r.max_inclusive = wuffs_base__u64__max(r.max_inclusive, s.max_inclusive); |
| return r; |
| } |
| |
| // -------- |
| |
| typedef struct { |
| uint64_t min_inclusive; |
| uint64_t max_exclusive; |
| } wuffs_base__range_ie_u64; |
| |
| static inline bool wuffs_base__range_ie_u64__is_empty( |
| wuffs_base__range_ie_u64 r) { |
| return r.min_inclusive >= r.max_exclusive; |
| } |
| |
| static inline bool wuffs_base__range_ie_u64__contains( |
| wuffs_base__range_ie_u64 r, |
| uint64_t x) { |
| return (r.min_inclusive <= x) && (x < r.max_exclusive); |
| } |
| |
| static inline wuffs_base__range_ie_u64 wuffs_base__range_ie_u64__intersection( |
| wuffs_base__range_ie_u64 r, |
| wuffs_base__range_ie_u64 s) { |
| r.min_inclusive = wuffs_base__u64__max(r.min_inclusive, s.min_inclusive); |
| r.max_exclusive = wuffs_base__u64__min(r.max_exclusive, s.max_exclusive); |
| return r; |
| } |
| |
| static inline wuffs_base__range_ie_u64 wuffs_base__range_ie_u64__union( |
| wuffs_base__range_ie_u64 r, |
| wuffs_base__range_ie_u64 s) { |
| if (wuffs_base__range_ie_u64__is_empty(r)) { |
| return s; |
| } |
| if (wuffs_base__range_ie_u64__is_empty(s)) { |
| return r; |
| } |
| r.min_inclusive = wuffs_base__u64__min(r.min_inclusive, s.min_inclusive); |
| r.max_exclusive = wuffs_base__u64__max(r.max_exclusive, s.max_exclusive); |
| return r; |
| } |
| |
| static inline uint64_t wuffs_base__range_ie_u64__length( |
| wuffs_base__range_ie_u64 r) { |
| return wuffs_base__u64__sat_sub(r.max_exclusive, r.min_inclusive); |
| } |
| |
| // -------- |
| |
| // wuffs_base__rect_ii_u32 is a rectangle (a 2-dimensional range) on the |
| // integer grid. The "ii" means that the bounds are inclusive on the low end |
| // and inclusive on the high end. It contains all points (x, y) such that |
| // ((min_inclusive_x <= x) && (x <= max_inclusive_x)) and likewise for y. |
| // |
| // It is valid for min > max, in which case the rectangle is empty. There are |
| // multiple representations of an empty rectangle. |
| // |
| // The X and Y axes increase right and down. |
| typedef struct { |
| uint32_t min_inclusive_x; |
| uint32_t min_inclusive_y; |
| uint32_t max_inclusive_x; |
| uint32_t max_inclusive_y; |
| } wuffs_base__rect_ii_u32; |
| |
| static inline bool wuffs_base__rect_ii_u32__is_empty( |
| wuffs_base__rect_ii_u32 r) { |
| return (r.min_inclusive_x > r.max_inclusive_x) || |
| (r.min_inclusive_y > r.max_inclusive_y); |
| } |
| |
| static inline bool wuffs_base__rect_ii_u32__contains(wuffs_base__rect_ii_u32 r, |
| uint32_t x, |
| uint32_t y) { |
| return (r.min_inclusive_x <= x) && (x <= r.max_inclusive_x) && |
| (r.min_inclusive_y <= y) && (y <= r.max_inclusive_y); |
| } |
| |
| static inline wuffs_base__rect_ii_u32 wuffs_base__rect_ii_u32__intersection( |
| wuffs_base__rect_ii_u32 r, |
| wuffs_base__rect_ii_u32 s) { |
| r.min_inclusive_x = |
| wuffs_base__u32__max(r.min_inclusive_x, s.min_inclusive_x); |
| r.min_inclusive_y = |
| wuffs_base__u32__max(r.min_inclusive_y, s.min_inclusive_y); |
| r.max_inclusive_x = |
| wuffs_base__u32__min(r.max_inclusive_x, s.max_inclusive_x); |
| r.max_inclusive_y = |
| wuffs_base__u32__min(r.max_inclusive_y, s.max_inclusive_y); |
| return r; |
| } |
| |
| static inline wuffs_base__rect_ii_u32 wuffs_base__rect_ii_u32__union( |
| wuffs_base__rect_ii_u32 r, |
| wuffs_base__rect_ii_u32 s) { |
| if (wuffs_base__rect_ii_u32__is_empty(r)) { |
| return s; |
| } |
| if (wuffs_base__rect_ii_u32__is_empty(s)) { |
| return r; |
| } |
| r.min_inclusive_x = |
| wuffs_base__u32__min(r.min_inclusive_x, s.min_inclusive_x); |
| r.min_inclusive_y = |
| wuffs_base__u32__min(r.min_inclusive_y, s.min_inclusive_y); |
| r.max_inclusive_x = |
| wuffs_base__u32__max(r.max_inclusive_x, s.max_inclusive_x); |
| r.max_inclusive_y = |
| wuffs_base__u32__max(r.max_inclusive_y, s.max_inclusive_y); |
| return r; |
| } |
| |
| // -------- |
| |
| // wuffs_base__rect_ie_u32 is a rectangle (a 2-dimensional range) on the |
| // integer grid. The "ie" means that the bounds are inclusive on the low end |
| // and exclusive on the high end. It contains all points (x, y) such that |
| // ((min_inclusive_x <= x) && (x < max_exclusive_x)) and likewise for y. |
| // |
| // It is valid for min >= max, in which case the rectangle is empty. There are |
| // multiple representations of an empty rectangle, including a value with all |
| // fields zero. |
| // |
| // The X and Y axes increase right and down. |
| typedef struct { |
| uint32_t min_inclusive_x; |
| uint32_t min_inclusive_y; |
| uint32_t max_exclusive_x; |
| uint32_t max_exclusive_y; |
| } wuffs_base__rect_ie_u32; |
| |
| static inline bool wuffs_base__rect_ie_u32__is_empty( |
| wuffs_base__rect_ie_u32 r) { |
| return (r.min_inclusive_x >= r.max_exclusive_x) || |
| (r.min_inclusive_y >= r.max_exclusive_y); |
| } |
| |
| static inline bool wuffs_base__rect_ie_u32__contains(wuffs_base__rect_ie_u32 r, |
| uint32_t x, |
| uint32_t y) { |
| return (r.min_inclusive_x <= x) && (x < r.max_exclusive_x) && |
| (r.min_inclusive_y <= y) && (y < r.max_exclusive_y); |
| } |
| |
| static inline wuffs_base__rect_ie_u32 wuffs_base__rect_ie_u32__intersection( |
| wuffs_base__rect_ie_u32 r, |
| wuffs_base__rect_ie_u32 s) { |
| r.min_inclusive_x = |
| wuffs_base__u32__max(r.min_inclusive_x, s.min_inclusive_x); |
| r.min_inclusive_y = |
| wuffs_base__u32__max(r.min_inclusive_y, s.min_inclusive_y); |
| r.max_exclusive_x = |
| wuffs_base__u32__min(r.max_exclusive_x, s.max_exclusive_x); |
| r.max_exclusive_y = |
| wuffs_base__u32__min(r.max_exclusive_y, s.max_exclusive_y); |
| return r; |
| } |
| |
| static inline wuffs_base__rect_ie_u32 wuffs_base__rect_ie_u32__union( |
| wuffs_base__rect_ie_u32 r, |
| wuffs_base__rect_ie_u32 s) { |
| if (wuffs_base__rect_ie_u32__is_empty(r)) { |
| return s; |
| } |
| if (wuffs_base__rect_ie_u32__is_empty(s)) { |
| return r; |
| } |
| r.min_inclusive_x = |
| wuffs_base__u32__min(r.min_inclusive_x, s.min_inclusive_x); |
| r.min_inclusive_y = |
| wuffs_base__u32__min(r.min_inclusive_y, s.min_inclusive_y); |
| r.max_exclusive_x = |
| wuffs_base__u32__max(r.max_exclusive_x, s.max_exclusive_x); |
| r.max_exclusive_y = |
| wuffs_base__u32__max(r.max_exclusive_y, s.max_exclusive_y); |
| return r; |
| } |
| |
| static inline uint32_t wuffs_base__rect_ie_u32__width( |
| wuffs_base__rect_ie_u32 r) { |
| return wuffs_base__u32__sat_sub(r.max_exclusive_x, r.min_inclusive_x); |
| } |
| |
| static inline uint32_t wuffs_base__rect_ie_u32__height( |
| wuffs_base__rect_ie_u32 r) { |
| return wuffs_base__u32__sat_sub(r.max_exclusive_y, r.min_inclusive_y); |
| } |
| |
| // ---------------- I/O |
| |
| // wuffs_base__io_buffer is a 1-dimensional buffer (a pointer and length), plus |
| // additional indexes into that buffer, plus an opened / closed flag. |
| // |
| // A value with all fields NULL or zero is a valid, empty buffer. |
| typedef struct { |
| uint8_t* ptr; // Pointer. |
| size_t len; // Length. |
| size_t wi; // Write index. Invariant: wi <= len. |
| size_t ri; // Read index. Invariant: ri <= wi. |
| bool closed; // No further writes are expected. |
| } wuffs_base__io_buffer; |
| |
| typedef struct { |
| // Do not access the private_impl's fields directly. There is no API/ABI |
| // compatibility or safety guarantee if you do so. |
| struct { |
| wuffs_base__io_buffer* buf; |
| // The bounds values are typically NULL, when created by the Wuffs public |
| // API. NULL means that the callee substitutes the implicit bounds derived |
| // from buf. |
| uint8_t* bounds[2]; |
| } private_impl; |
| } wuffs_base__io_reader; |
| |
| typedef struct { |
| // Do not access the private_impl's fields directly. There is no API/ABI |
| // compatibility or safety guarantee if you do so. |
| struct { |
| wuffs_base__io_buffer* buf; |
| // The bounds values are typically NULL, when created by the Wuffs public |
| // API. NULL means that the callee substitutes the implicit bounds derived |
| // from buf. |
| uint8_t* bounds[2]; |
| } private_impl; |
| } wuffs_base__io_writer; |
| |
| static inline wuffs_base__slice_u8 wuffs_base__io_buffer__readable( |
| wuffs_base__io_buffer* buf) { |
| if (buf) { |
| return ((wuffs_base__slice_u8){ |
| .ptr = buf->ptr + buf->ri, |
| .len = buf->wi - buf->ri, |
| }); |
| } |
| return ((wuffs_base__slice_u8){}); |
| } |
| |
| static inline wuffs_base__io_reader wuffs_base__io_buffer__reader( |
| wuffs_base__io_buffer* buf) { |
| wuffs_base__io_reader ret = ((wuffs_base__io_reader){}); |
| ret.private_impl.buf = buf; |
| return ret; |
| } |
| |
| static inline wuffs_base__slice_u8 wuffs_base__io_buffer__writable( |
| wuffs_base__io_buffer* buf) { |
| if (buf) { |
| return ((wuffs_base__slice_u8){ |
| .ptr = buf->ptr + buf->wi, |
| .len = buf->len - buf->wi, |
| }); |
| } |
| return ((wuffs_base__slice_u8){}); |
| } |
| |
| static inline wuffs_base__io_writer wuffs_base__io_buffer__writer( |
| wuffs_base__io_buffer* buf) { |
| wuffs_base__io_writer ret = ((wuffs_base__io_writer){}); |
| ret.private_impl.buf = buf; |
| return ret; |
| } |
| |
| // ---------------- Images |
| |
| // wuffs_base__pixel_format encodes the format of the bytes that constitute an |
| // image frame's pixel data. Its bits: |
| // - bit 31 is reserved. |
| // - bits 30 .. 28 encodes color (and channel order, in terms of memory). |
| // - bits 27 .. 26 are reserved. |
| // - bits 25 .. 24 encodes transparency. |
| // - bit 23 indicates big-endian/MSB-first (as opposed to little/LSB). |
| // - bit 22 indicates floating point (as opposed to integer). |
| // - bits 21 .. 20 are the number of planes, minus 1. Zero means packed. |
| // - bits 19 .. 16 encodes the number of bits (depth) in an index value. |
| // Zero means direct, not palette-indexed. |
| // - bits 15 .. 12 encodes the number of bits (depth) in the 3rd channel. |
| // - bits 11 .. 8 encodes the number of bits (depth) in the 2nd channel. |
| // - bits 7 .. 4 encodes the number of bits (depth) in the 1st channel. |
| // - bits 3 .. 0 encodes the number of bits (depth) in the 0th channel. |
| // |
| // The bit fields of a wuffs_base__pixel_format are not independent. For |
| // example, the number of planes should not be greater than the number of |
| // channels. Similarly, bits 15..4 are unused (and should be zero) if bits |
| // 31..24 (color and transparency) together imply only 1 channel (gray, no |
| // alpha) and floating point samples should mean a bit depth of 16, 32 or 64. |
| // |
| // Formats hold between 1 and 4 channels. For example: Y (1 channel: gray), YA |
| // (2 channels: gray and alpha), BGR (3 channels: blue, green, red) or CMYK (4 |
| // channels: cyan, magenta, yellow, black). |
| // |
| // For direct formats with N > 1 channels, those channels can be laid out in |
| // either 1 (packed) or N (planar) planes. For example, RGBA data is usually |
| // packed, but YUV data is usually planar, due to chroma subsampling (for |
| // details, see the wuffs_base__pixel_subsampling type). For indexed formats, |
| // the palette (always 256 × 4 bytes) holds up to 4 packed bytes of color data |
| // per index value, and there is only 1 plane (for the index). The distance |
| // between successive palette elements is always 4 bytes. |
| // |
| // The color field is encoded in 3 bits: |
| // - 0 means A (Alpha). |
| // - 1 means Y or YA (Gray, Alpha). |
| // - 2 means BGR, BGRX or BGRA (Blue, Green, Red, X-padding or Alpha). |
| // - 3 means RGB, RGBX or RGBA (Red, Green, Blue, X-padding or Alpha). |
| // - 4 means YUV or YUVA (Luma, Chroma-blue, Chroma-red, Alpha). |
| // - 5 means CMY or CMYK (Cyan, Magenta, Yellow, Black). |
| // - all other values are reserved. |
| // |
| // In Wuffs, channels are given in memory order, regardless of endianness, |
| // since the C type for the pixel data is an array of bytes, not an array of |
| // uint32_t. For example, packed BGRA with 8 bits per channel means that the |
| // bytes in memory are always Blue, Green, Red then Alpha. On big-endian |
| // systems, that is the uint32_t 0xBBGGRRAA. On little-endian, 0xAARRGGBB. |
| // |
| // When the color field (3 bits) encodes multiple options, the transparency |
| // field (2 bits) distinguishes them: |
| // - 0 means fully opaque, no extra channels |
| // - 1 means fully opaque, one extra channel (X or K, padding or black). |
| // - 2 means one extra alpha channel, other channels are non-premultiplied. |
| // - 3 means one extra alpha channel, other channels are premultiplied. |
| // |
| // The zero wuffs_base__pixel_format value is an invalid pixel format, as it is |
| // invalid to combine the zero color (alpha only) with the zero transparency. |
| // |
| // Bit depth is encoded in 4 bits: |
| // - 0 means the channel or index is unused. |
| // - x means a bit depth of x, for x in the range 1..8. |
| // - 9 means a bit depth of 10. |
| // - 10 means a bit depth of 12. |
| // - 11 means a bit depth of 16. |
| // - 12 means a bit depth of 24. |
| // - 13 means a bit depth of 32. |
| // - 14 means a bit depth of 48. |
| // - 15 means a bit depth of 64. |
| // |
| // For example, wuffs_base__pixel_format 0x3280BBBB is a natural format for |
| // decoding a PNG image - network byte order (also known as big-endian), |
| // packed, non-premultiplied alpha - that happens to be 16-bit-depth truecolor |
| // with alpha (RGBA). In memory order: |
| // |
| // ptr+0 ptr+1 ptr+2 ptr+3 ptr+4 ptr+5 ptr+6 ptr+7 |
| // Rhi Rlo Ghi Glo Bhi Blo Ahi Alo |
| // |
| // For example, the value wuffs_base__pixel_format 0x20000565 means BGR with no |
| // alpha or padding, 5/6/5 bits for blue/green/red, packed 2 bytes per pixel, |
| // laid out LSB-first in memory order: |
| // |
| // ptr+0........... ptr+1........... |
| // MSB LSB MSB LSB |
| // G₂G₁G₀B₄B₃B₂B₁B₀ R₄R₃R₂R₁R₀G₅G₄G₃ |
| // |
| // On little-endian systems (but not big-endian), this Wuffs pixel format value |
| // (0x20000565) corresponds to the Cairo library's CAIRO_FORMAT_RGB16_565, the |
| // SDL2 (Simple DirectMedia Layer 2) library's SDL_PIXELFORMAT_RGB565 and the |
| // Skia library's kRGB_565_SkColorType. Note BGR in Wuffs versus RGB in the |
| // other libraries. |
| // |
| // Regardless of endianness, this Wuffs pixel format value (0x20000565) |
| // corresponds to the V4L2 (Video For Linux 2) library's V4L2_PIX_FMT_RGB565 |
| // and the Wayland-DRM library's WL_DRM_FORMAT_RGB565. |
| // |
| // Different software libraries name their pixel formats (and especially their |
| // channel order) either according to memory layout or as bits of a native |
| // integer type like uint32_t. The two conventions differ because of a system's |
| // endianness. As mentioned earlier, Wuffs pixel formats are always in memory |
| // order. More detail of other software libraries' naming conventions is in the |
| // Pixel Format Guide at https://afrantzis.github.io/pixel-format-guide/ |
| // |
| // Do not manipulate these bits directly; they are private implementation |
| // details. Use methods such as wuffs_base__pixel_format__num_planes instead. |
| typedef uint32_t wuffs_base__pixel_format; |
| |
| // Common 8-bit-depth pixel formats. This list is not exhaustive; not all valid |
| // wuffs_base__pixel_format values are present. |
| |
| #define WUFFS_BASE__PIXEL_FORMAT__INVALID ((wuffs_base__pixel_format)0x00000000) |
| |
| #define WUFFS_BASE__PIXEL_FORMAT__A ((wuffs_base__pixel_format)0x02000008) |
| |
| #define WUFFS_BASE__PIXEL_FORMAT__Y ((wuffs_base__pixel_format)0x10000008) |
| #define WUFFS_BASE__PIXEL_FORMAT__YA_NONPREMUL \ |
| ((wuffs_base__pixel_format)0x12000008) |
| #define WUFFS_BASE__PIXEL_FORMAT__YA_PREMUL \ |
| ((wuffs_base__pixel_format)0x13000008) |
| |
| #define WUFFS_BASE__PIXEL_FORMAT__BGR ((wuffs_base__pixel_format)0x20000888) |
| #define WUFFS_BASE__PIXEL_FORMAT__BGRX ((wuffs_base__pixel_format)0x21008888) |
| #define WUFFS_BASE__PIXEL_FORMAT__BGRX_INDEXED \ |
| ((wuffs_base__pixel_format)0x21088888) |
| #define WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL \ |
| ((wuffs_base__pixel_format)0x22008888) |
| #define WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_INDEXED \ |
| ((wuffs_base__pixel_format)0x22088888) |
| #define WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL \ |
| ((wuffs_base__pixel_format)0x23008888) |
| |
| #define WUFFS_BASE__PIXEL_FORMAT__RGB ((wuffs_base__pixel_format)0x30000888) |
| #define WUFFS_BASE__PIXEL_FORMAT__RGBX ((wuffs_base__pixel_format)0x31008888) |
| #define WUFFS_BASE__PIXEL_FORMAT__RGBX_INDEXED \ |
| ((wuffs_base__pixel_format)0x31088888) |
| #define WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL \ |
| ((wuffs_base__pixel_format)0x32008888) |
| #define WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL_INDEXED \ |
| ((wuffs_base__pixel_format)0x32088888) |
| #define WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL \ |
| ((wuffs_base__pixel_format)0x33008888) |
| |
| #define WUFFS_BASE__PIXEL_FORMAT__YUV ((wuffs_base__pixel_format)0x40200888) |
| #define WUFFS_BASE__PIXEL_FORMAT__YUVK ((wuffs_base__pixel_format)0x41308888) |
| #define WUFFS_BASE__PIXEL_FORMAT__YUVA_NONPREMUL \ |
| ((wuffs_base__pixel_format)0x42308888) |
| |
| #define WUFFS_BASE__PIXEL_FORMAT__CMY ((wuffs_base__pixel_format)0x50200888) |
| #define WUFFS_BASE__PIXEL_FORMAT__CMYK ((wuffs_base__pixel_format)0x51308888) |
| |
| static inline bool wuffs_base__pixel_format__is_valid( |
| wuffs_base__pixel_format f) { |
| return f != 0; |
| } |
| |
| static inline bool wuffs_base__pixel_format__is_indexed( |
| wuffs_base__pixel_format f) { |
| return ((f >> 16) & 0x0F) != 0; |
| } |
| |
| #define WUFFS_BASE__PIXEL_FORMAT__NUM_PLANES_MAX 4 |
| |
| static inline uint32_t wuffs_base__pixel_format__num_planes( |
| wuffs_base__pixel_format f) { |
| return f ? (((f >> 20) & 0x03) + 1) : 0; |
| } |
| |
| typedef struct { |
| wuffs_base__table_u8 planes[WUFFS_BASE__PIXEL_FORMAT__NUM_PLANES_MAX]; |
| } wuffs_base__pixel_buffer; |
| |
| // -------- |
| |
| // wuffs_base__pixel_subsampling encodes the mapping of pixel space coordinates |
| // (x, y) to pixel buffer indices (i, j). That mapping can differ for each |
| // plane p. For a depth of 8 bits (1 byte), the p'th plane's sample starts at |
| // (planes[p].ptr + (j * planes[p].stride) + i). |
| // |
| // For packed pixel formats, the mapping is trivial: i = x and j = y. For |
| // planar pixel formats, the mapping can differ due to chroma subsampling. For |
| // example, consider a three plane YUV pixel format with 4:2:2 subsampling. For |
| // the luma (Y) channel, there is one sample for every pixel, but for the |
| // chroma (U, V) channels, there is one sample for every two pixels: pairs of |
| // horizontally adjacent pixels form one macropixel, i = x / 2 and j == y. In |
| // general, for a given p: |
| // - i = (x + bias_x) >> shift_x. |
| // - j = (y + bias_y) >> shift_y. |
| // where biases and shifts are in the range 0..3 and 0..2 respectively. |
| // |
| // In general, the biases will be zero after decoding an image. However, making |
| // a sub-image may change the bias, since the (x, y) coordinates are relative |
| // to the sub-image's top-left origin, but the backing pixel buffers were |
| // created relative to the original image's origin. |
| // |
| // For each plane p, each of those four numbers (biases and shifts) are encoded |
| // in two bits, which combine to form an 8 bit unsigned integer: |
| // |
| // e_p = (bias_x << 6) | (shift_x << 4) | (bias_y << 2) | (shift_y << 0) |
| // |
| // Those e_p values (e_0 for the first plane, e_1 for the second plane, etc) |
| // combine to form a wuffs_base__pixel_subsampling value: |
| // |
| // pixsub = (e_3 << 24) | (e_2 << 16) | (e_1 << 8) | (e_0 << 0) |
| // |
| // Do not manipulate these bits directly; they are private implementation |
| // details. Use methods such as wuffs_base__pixel_subsampling__bias_x instead. |
| typedef uint32_t wuffs_base__pixel_subsampling; |
| |
| #define WUFFS_BASE__PIXEL_SUBSAMPLING__NONE ((wuffs_base__pixel_subsampling)0) |
| |
| #define WUFFS_BASE__PIXEL_SUBSAMPLING__444 \ |
| ((wuffs_base__pixel_subsampling)0x000000) |
| #define WUFFS_BASE__PIXEL_SUBSAMPLING__440 \ |
| ((wuffs_base__pixel_subsampling)0x010100) |
| #define WUFFS_BASE__PIXEL_SUBSAMPLING__422 \ |
| ((wuffs_base__pixel_subsampling)0x101000) |
| #define WUFFS_BASE__PIXEL_SUBSAMPLING__420 \ |
| ((wuffs_base__pixel_subsampling)0x111100) |
| #define WUFFS_BASE__PIXEL_SUBSAMPLING__411 \ |
| ((wuffs_base__pixel_subsampling)0x202000) |
| #define WUFFS_BASE__PIXEL_SUBSAMPLING__410 \ |
| ((wuffs_base__pixel_subsampling)0x212100) |
| |
| static inline uint32_t wuffs_base__pixel_subsampling__bias_x( |
| wuffs_base__pixel_subsampling s, |
| uint32_t plane) { |
| uint32_t shift = ((plane & 0x03) * 8) + 6; |
| return (s >> shift) & 0x03; |
| } |
| |
| static inline uint32_t wuffs_base__pixel_subsampling__shift_x( |
| wuffs_base__pixel_subsampling s, |
| uint32_t plane) { |
| uint32_t shift = ((plane & 0x03) * 8) + 4; |
| return (s >> shift) & 0x03; |
| } |
| |
| static inline uint32_t wuffs_base__pixel_subsampling__bias_y( |
| wuffs_base__pixel_subsampling s, |
| uint32_t plane) { |
| uint32_t shift = ((plane & 0x03) * 8) + 2; |
| return (s >> shift) & 0x03; |
| } |
| |
| static inline uint32_t wuffs_base__pixel_subsampling__shift_y( |
| wuffs_base__pixel_subsampling s, |
| uint32_t plane) { |
| uint32_t shift = ((plane & 0x03) * 8) + 0; |
| return (s >> shift) & 0x03; |
| } |
| |
| // -------- |
| |
| typedef struct { |
| // Do not access the private_impl's fields directly. There is no API/ABI |
| // compatibility or safety guarantee if you do so. |
| struct { |
| wuffs_base__pixel_format pixfmt; |
| wuffs_base__pixel_subsampling pixsub; |
| uint32_t width; |
| uint32_t height; |
| uint32_t num_loops; |
| } private_impl; |
| } wuffs_base__image_config; |
| |
| // TODO: Should this function return bool? An error type? |
| static inline void wuffs_base__image_config__initialize( |
| wuffs_base__image_config* c, |
| wuffs_base__pixel_format pixfmt, |
| wuffs_base__pixel_subsampling pixsub, |
| uint32_t width, |
| uint32_t height, |
| uint32_t num_loops) { |
| if (!c) { |
| return; |
| } |
| if (pixfmt) { |
| uint64_t wh = ((uint64_t)width) * ((uint64_t)height); |
| // TODO: handle things other than 1 byte per pixel. |
| if (wh <= ((uint64_t)SIZE_MAX)) { |
| c->private_impl.pixfmt = pixfmt; |
| c->private_impl.pixsub = pixsub; |
| c->private_impl.width = width; |
| c->private_impl.height = height; |
| c->private_impl.num_loops = num_loops; |
| return; |
| } |
| } |
| *c = ((wuffs_base__image_config){}); |
| } |
| |
| static inline void wuffs_base__image_config__invalidate( |
| wuffs_base__image_config* c) { |
| if (c) { |
| *c = ((wuffs_base__image_config){}); |
| } |
| } |
| |
| static inline bool wuffs_base__image_config__is_valid( |
| wuffs_base__image_config* c) { |
| return c && c->private_impl.pixfmt; |
| } |
| |
| static inline wuffs_base__pixel_format wuffs_base__image_config__pixel_format( |
| wuffs_base__image_config* c) { |
| return c ? c->private_impl.pixfmt : 0; |
| } |
| |
| static inline wuffs_base__pixel_subsampling |
| wuffs_base__image_config__pixel_subsampling(wuffs_base__image_config* c) { |
| return c ? c->private_impl.pixsub : 0; |
| } |
| |
| static inline uint32_t wuffs_base__image_config__width( |
| wuffs_base__image_config* c) { |
| return c ? c->private_impl.width : 0; |
| } |
| |
| static inline uint32_t wuffs_base__image_config__height( |
| wuffs_base__image_config* c) { |
| return c ? c->private_impl.height : 0; |
| } |
| |
| static inline uint32_t wuffs_base__image_config__num_loops( |
| wuffs_base__image_config* c) { |
| return c ? c->private_impl.num_loops : 0; |
| } |
| |
| // TODO: this is the right API for planar (not packed) pixbufs? Should it allow |
| // decoding into a color model different from the format's intrinsic one? For |
| // example, decoding a JPEG image straight to RGBA instead of to YCbCr? |
| static inline size_t wuffs_base__image_config__pixbuf_size( |
| wuffs_base__image_config* c) { |
| if (c) { |
| uint64_t wh = |
| ((uint64_t)c->private_impl.width) * ((uint64_t)c->private_impl.height); |
| // TODO: handle things other than 1 byte per pixel. |
| return (size_t)wh; |
| } |
| return 0; |
| } |
| |
| // -------- |
| |
| typedef struct { |
| // Do not access the private_impl's fields directly. There is no API/ABI |
| // compatibility or safety guarantee if you do so. |
| struct { |
| wuffs_base__image_config config; |
| uint32_t loop_count; // 0-based count of the current loop. |
| wuffs_base__pixel_buffer pixbuf; |
| // TODO: color spaces. |
| wuffs_base__rect_ie_u32 dirty_rect; |
| wuffs_base__flicks duration; |
| uint8_t palette[1024]; |
| } private_impl; |
| } wuffs_base__image_buffer; |
| |
| static inline void wuffs_base__image_buffer__set_from_pixbuf( |
| wuffs_base__image_buffer* b, |
| wuffs_base__image_config config, |
| wuffs_base__pixel_buffer pixbuf) { |
| if (!b) { |
| return; |
| } |
| *b = ((wuffs_base__image_buffer){}); |
| b->private_impl.config = config; |
| b->private_impl.pixbuf = pixbuf; |
| } |
| |
| // TODO: Should this function return bool? An error type? |
| static inline void wuffs_base__image_buffer__set_from_slice( |
| wuffs_base__image_buffer* b, |
| wuffs_base__image_config config, |
| wuffs_base__slice_u8 pixbuf_memory) { |
| if (!b) { |
| return; |
| } |
| *b = ((wuffs_base__image_buffer){}); |
| // TODO: don't assume 1 byte per pixel. Don't assume packed. |
| uint64_t wh = ((uint64_t)config.private_impl.width) * |
| ((uint64_t)config.private_impl.height); |
| if (wh > pixbuf_memory.len) { |
| return; |
| } |
| b->private_impl.config = config; |
| wuffs_base__table_u8* tab = &b->private_impl.pixbuf.planes[0]; |
| tab->ptr = pixbuf_memory.ptr; |
| tab->width = config.private_impl.width; |
| tab->height = config.private_impl.height; |
| tab->stride = config.private_impl.width; |
| } |
| |
| static inline void wuffs_base__image_buffer__update( |
| wuffs_base__image_buffer* b, |
| wuffs_base__rect_ie_u32 dirty_rect, |
| wuffs_base__flicks duration, |
| uint8_t* palette_ptr, |
| size_t palette_len) { |
| if (!b) { |
| return; |
| } |
| b->private_impl.dirty_rect = dirty_rect; |
| b->private_impl.duration = duration; |
| if (palette_ptr) { |
| memmove(b->private_impl.palette, palette_ptr, |
| palette_len <= 1024 ? palette_len : 1024); |
| } |
| } |
| |
| // wuffs_base__image_buffer__loop returns whether the image decoder should loop |
| // back to the beginning of the animation, assuming that we've reached the end |
| // of the encoded stream. If so, it increments b's count of the animation loops |
| // played so far. |
| static inline bool wuffs_base__image_buffer__loop(wuffs_base__image_buffer* b) { |
| if (!b) { |
| return false; |
| } |
| uint32_t n = b->private_impl.config.private_impl.num_loops; |
| if (n == 0) { |
| return true; |
| } |
| if (b->private_impl.loop_count < n - 1) { |
| b->private_impl.loop_count++; |
| return true; |
| } |
| return false; |
| } |
| |
| // wuffs_base__image_buffer__dirty_rect returns an upper bound for what part of |
| // this frame's pixels differs from the previous frame. |
| static inline wuffs_base__rect_ie_u32 wuffs_base__image_buffer__dirty_rect( |
| wuffs_base__image_buffer* b) { |
| return b ? b->private_impl.dirty_rect : ((wuffs_base__rect_ie_u32){0}); |
| } |
| |
| // wuffs_base__image_buffer__duration returns the amount of time to display |
| // this frame. Zero means to display forever - a still (non-animated) image. |
| static inline wuffs_base__flicks wuffs_base__image_buffer__duration( |
| wuffs_base__image_buffer* b) { |
| return b ? b->private_impl.duration : 0; |
| } |
| |
| // wuffs_base__image_buffer__palette returns the palette that the pixel data |
| // can index. The backing array is inside b and has length 1024. |
| static inline uint8_t* wuffs_base__image_buffer__palette( |
| wuffs_base__image_buffer* b) { |
| return b ? b->private_impl.palette : NULL; |
| } |
| |
| static inline wuffs_base__table_u8 wuffs_base__image_buffer__plane( |
| wuffs_base__image_buffer* b, |
| uint32_t p) { |
| return (b && (p < WUFFS_BASE__PIXEL_FORMAT__NUM_PLANES_MAX)) |
| ? b->private_impl.pixbuf.planes[p] |
| : ((wuffs_base__table_u8){}); |
| } |
| |
| #endif // WUFFS_BASE_HEADER_H |
| |
| // ---------------- Use Declarations |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| // ---------------- Status Codes |
| |
| // Status codes are int32_t values. Its bits: |
| // - bit 31 (the sign bit) indicates unrecoverable-ness: an error. |
| // - bits 30 .. 10 are the packageid: a namespace. |
| // - bits 9 .. 8 are reserved. |
| // - bits 7 .. 0 are a package-namespaced numeric code. |
| // |
| // Do not manipulate these bits directly; they are private implementation |
| // details. Use methods such as wuffs_crc32__status__is_error instead. |
| typedef int32_t wuffs_crc32__status; |
| |
| #define wuffs_crc32__packageid 810620 // 0x000C5E7C |
| |
| #define WUFFS_CRC32__STATUS_OK 0 // 0x00000000 |
| #define WUFFS_CRC32__ERROR_BAD_WUFFS_VERSION -2147483647 // 0x80000001 |
| #define WUFFS_CRC32__ERROR_BAD_RECEIVER -2147483646 // 0x80000002 |
| #define WUFFS_CRC32__ERROR_BAD_ARGUMENT -2147483645 // 0x80000003 |
| #define WUFFS_CRC32__ERROR_INITIALIZER_NOT_CALLED -2147483644 // 0x80000004 |
| #define WUFFS_CRC32__ERROR_INVALID_I_O_OPERATION -2147483643 // 0x80000005 |
| #define WUFFS_CRC32__ERROR_CLOSED_FOR_WRITES -2147483642 // 0x80000006 |
| #define WUFFS_CRC32__ERROR_UNEXPECTED_EOF -2147483641 // 0x80000007 |
| #define WUFFS_CRC32__SUSPENSION_SHORT_READ 8 // 0x00000008 |
| #define WUFFS_CRC32__SUSPENSION_SHORT_WRITE 9 // 0x00000009 |
| #define WUFFS_CRC32__ERROR_CANNOT_RETURN_A_SUSPENSION -2147483638 // 0x8000000A |
| #define WUFFS_CRC32__ERROR_INVALID_CALL_SEQUENCE -2147483637 // 0x8000000B |
| #define WUFFS_CRC32__SUSPENSION_END_OF_DATA 12 // 0x0000000C |
| |
| bool wuffs_crc32__status__is_error(wuffs_crc32__status s); |
| |
| const char* wuffs_crc32__status__string(wuffs_crc32__status s); |
| |
| // ---------------- Public Consts |
| |
| // ---------------- Structs |
| |
| typedef struct { |
| // Do not access the private_impl's fields directly. There is no API/ABI |
| // compatibility or safety guarantee if you do so. Instead, use the |
| // wuffs_crc32__ieee_hasher__etc functions. |
| // |
| // In C++, these fields would be "private", but C does not support that. |
| // |
| // It is a struct, not a struct*, so that it can be stack allocated. |
| struct { |
| wuffs_crc32__status status; |
| uint32_t magic; |
| |
| uint32_t f_state; |
| |
| } private_impl; |
| } wuffs_crc32__ieee_hasher; |
| |
| // ---------------- Public Initializer Prototypes |
| |
| // wuffs_crc32__ieee_hasher__initialize is an initializer function. |
| // |
| // It should be called before any other wuffs_crc32__ieee_hasher__* function. |
| // |
| // Pass WUFFS_VERSION and 0 for wuffs_version and for_internal_use_only. |
| void wuffs_crc32__ieee_hasher__initialize(wuffs_crc32__ieee_hasher* self, |
| uint32_t wuffs_version, |
| uint32_t for_internal_use_only); |
| |
| // ---------------- Public Function Prototypes |
| |
| uint32_t wuffs_crc32__ieee_hasher__update(wuffs_crc32__ieee_hasher* self, |
| wuffs_base__slice_u8 a_x); |
| |
| #ifdef __cplusplus |
| } // extern "C" |
| #endif |
| |
| #endif // WUFFS_CRC32_H |
| |
| // C HEADER ENDS HERE. |
| |
| #ifndef WUFFS_BASE_IMPL_H |
| #define WUFFS_BASE_IMPL_H |
| |
| // Copyright 2017 The Wuffs Authors. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // https://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| #define WUFFS_BASE__IGNORE_POTENTIALLY_UNUSED_VARIABLE(x) (void)(x) |
| |
| // WUFFS_BASE__MAGIC is a magic number to check that initializers are called. |
| // It's not foolproof, given C doesn't automatically zero memory before use, |
| // but it should catch 99.99% of cases. |
| // |
| // Its (non-zero) value is arbitrary, based on md5sum("wuffs"). |
| #define WUFFS_BASE__MAGIC ((uint32_t)0x3CCB6C71) |
| |
| // WUFFS_BASE__ALREADY_ZEROED is passed from a container struct's initializer |
| // to a containee struct's initializer when the container has already zeroed |
| // the containee's memory. |
| // |
| // Its (non-zero) value is arbitrary, based on md5sum("zeroed"). |
| #define WUFFS_BASE__ALREADY_ZEROED ((uint32_t)0x68602EF1) |
| |
| // Denote intentional fallthroughs for -Wimplicit-fallthrough. |
| // |
| // The order matters here. Clang also defines "__GNUC__". |
| #if defined(__clang__) && __cplusplus >= 201103L |
| #define WUFFS_BASE__FALLTHROUGH [[clang::fallthrough]] |
| #elif !defined(__clang__) && defined(__GNUC__) && (__GNUC__ >= 7) |
| #define WUFFS_BASE__FALLTHROUGH __attribute__((fallthrough)) |
| #else |
| #define WUFFS_BASE__FALLTHROUGH |
| #endif |
| |
| // Use switch cases for coroutine suspension points, similar to the technique |
| // in https://www.chiark.greenend.org.uk/~sgtatham/coroutines.html |
| // |
| // We use trivial macros instead of an explicit assignment and case statement |
| // so that clang-format doesn't get confused by the unusual "case"s. |
| #define WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0 case 0:; |
| #define WUFFS_BASE__COROUTINE_SUSPENSION_POINT(n) \ |
| coro_susp_point = n; \ |
| WUFFS_BASE__FALLTHROUGH; \ |
| case n:; |
| |
| #define WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(n) \ |
| if (status < 0) { \ |
| goto exit; \ |
| } else if (status == 0) { \ |
| goto ok; \ |
| } \ |
| coro_susp_point = n; \ |
| goto suspend; \ |
| case n:; |
| |
| // Clang also defines "__GNUC__". |
| #if defined(__GNUC__) |
| #define WUFFS_BASE__LIKELY(expr) (__builtin_expect(!!(expr), 1)) |
| #define WUFFS_BASE__UNLIKELY(expr) (__builtin_expect(!!(expr), 0)) |
| #else |
| #define WUFFS_BASE__LIKELY(expr) (expr) |
| #define WUFFS_BASE__UNLIKELY(expr) (expr) |
| #endif |
| |
| // Uncomment this #include for printf-debugging. |
| // #include <stdio.h> |
| |
| // The helpers below are functions, instead of macros, because their arguments |
| // can be an expression that we shouldn't evaluate more than once. |
| // |
| // They are in base-impl.h and hence copy/pasted into every generated C file, |
| // instead of being in some "base.c" file, since a design goal is that users of |
| // the generated C code can often just #include a single .c file, such as |
| // "gif.c", without having to additionally include or otherwise build and link |
| // a "base.c" file. |
| // |
| // They are static, so that linking multiple wuffs .o files won't complain about |
| // duplicate function definitions. |
| // |
| // They are explicitly marked inline, even if modern compilers don't use the |
| // inline attribute to guide optimizations such as inlining, to avoid the |
| // -Wunused-function warning, and we like to compile with -Wall -Werror. |
| |
| // ---------------- Numeric Types |
| |
| static inline uint16_t wuffs_base__load_u16be(uint8_t* p) { |
| return ((uint16_t)(p[0]) << 8) | ((uint16_t)(p[1]) << 0); |
| } |
| |
| static inline uint16_t wuffs_base__load_u16le(uint8_t* p) { |
| return ((uint16_t)(p[0]) << 0) | ((uint16_t)(p[1]) << 8); |
| } |
| |
| static inline uint32_t wuffs_base__load_u32be(uint8_t* p) { |
| return ((uint32_t)(p[0]) << 24) | ((uint32_t)(p[1]) << 16) | |
| ((uint32_t)(p[2]) << 8) | ((uint32_t)(p[3]) << 0); |
| } |
| |
| static inline uint32_t wuffs_base__load_u32le(uint8_t* p) { |
| return ((uint32_t)(p[0]) << 0) | ((uint32_t)(p[1]) << 8) | |
| ((uint32_t)(p[2]) << 16) | ((uint32_t)(p[3]) << 24); |
| } |
| |
| static inline uint64_t wuffs_base__load_u64be(uint8_t* p) { |
| return ((uint64_t)(p[0]) << 56) | ((uint64_t)(p[1]) << 48) | |
| ((uint64_t)(p[2]) << 40) | ((uint64_t)(p[3]) << 32) | |
| ((uint64_t)(p[4]) << 24) | ((uint64_t)(p[5]) << 16) | |
| ((uint64_t)(p[6]) << 8) | ((uint64_t)(p[7]) << 0); |
| } |
| |
| static inline uint64_t wuffs_base__load_u64le(uint8_t* p) { |
| return ((uint64_t)(p[0]) << 0) | ((uint64_t)(p[1]) << 8) | |
| ((uint64_t)(p[2]) << 16) | ((uint64_t)(p[3]) << 24) | |
| ((uint64_t)(p[4]) << 32) | ((uint64_t)(p[5]) << 40) | |
| ((uint64_t)(p[6]) << 48) | ((uint64_t)(p[7]) << 56); |
| } |
| |
| // -------- |
| |
| static inline void wuffs_base__u8__sat_add_indirect(uint8_t* x, uint8_t y) { |
| *x = wuffs_base__u8__sat_add(*x, y); |
| } |
| |
| static inline void wuffs_base__u8__sat_sub_indirect(uint8_t* x, uint8_t y) { |
| *x = wuffs_base__u8__sat_sub(*x, y); |
| } |
| |
| static inline void wuffs_base__u16__sat_add_indirect(uint16_t* x, uint16_t y) { |
| *x = wuffs_base__u16__sat_add(*x, y); |
| } |
| |
| static inline void wuffs_base__u16__sat_sub_indirect(uint16_t* x, uint16_t y) { |
| *x = wuffs_base__u16__sat_sub(*x, y); |
| } |
| |
| static inline void wuffs_base__u32__sat_add_indirect(uint32_t* x, uint32_t y) { |
| *x = wuffs_base__u32__sat_add(*x, y); |
| } |
| |
| static inline void wuffs_base__u32__sat_sub_indirect(uint32_t* x, uint32_t y) { |
| *x = wuffs_base__u32__sat_sub(*x, y); |
| } |
| |
| static inline void wuffs_base__u64__sat_add_indirect(uint64_t* x, uint64_t y) { |
| *x = wuffs_base__u64__sat_add(*x, y); |
| } |
| |
| static inline void wuffs_base__u64__sat_sub_indirect(uint64_t* x, uint64_t y) { |
| *x = wuffs_base__u64__sat_sub(*x, y); |
| } |
| |
| // ---------------- Slices and Tables |
| |
| static inline wuffs_base__slice_u8 wuffs_base__slice_u8__subslice_i( |
| wuffs_base__slice_u8 s, |
| uint64_t i) { |
| if ((i <= SIZE_MAX) && (i <= s.len)) { |
| return ((wuffs_base__slice_u8){ |
| .ptr = s.ptr + i, |
| .len = s.len - i, |
| }); |
| } |
| return ((wuffs_base__slice_u8){}); |
| } |
| |
| static inline wuffs_base__slice_u8 wuffs_base__slice_u8__subslice_j( |
| wuffs_base__slice_u8 s, |
| uint64_t j) { |
| if ((j <= SIZE_MAX) && (j <= s.len)) { |
| return ((wuffs_base__slice_u8){.ptr = s.ptr, .len = j}); |
| } |
| return ((wuffs_base__slice_u8){}); |
| } |
| |
| static inline wuffs_base__slice_u8 wuffs_base__slice_u8__subslice_ij( |
| wuffs_base__slice_u8 s, |
| uint64_t i, |
| uint64_t j) { |
| if ((i <= j) && (j <= SIZE_MAX) && (j <= s.len)) { |
| return ((wuffs_base__slice_u8){ |
| .ptr = s.ptr + i, |
| .len = j - i, |
| }); |
| } |
| return ((wuffs_base__slice_u8){}); |
| } |
| |
| // wuffs_base__slice_u8__prefix returns up to the first up_to bytes of s. |
| static inline wuffs_base__slice_u8 wuffs_base__slice_u8__prefix( |
| wuffs_base__slice_u8 s, |
| uint64_t up_to) { |
| if ((uint64_t)(s.len) > up_to) { |
| s.len = up_to; |
| } |
| return s; |
| } |
| |
| // wuffs_base__slice_u8__suffix returns up to the last up_to bytes of s. |
| static inline wuffs_base__slice_u8 wuffs_base__slice_u8__suffix( |
| wuffs_base__slice_u8 s, |
| uint64_t up_to) { |
| if ((uint64_t)(s.len) > up_to) { |
| s.ptr += (uint64_t)(s.len) - up_to; |
| s.len = up_to; |
| } |
| return s; |
| } |
| |
| // wuffs_base__slice_u8__copy_from_slice calls memmove(dst.ptr, src.ptr, |
| // length) where length is the minimum of dst.len and src.len. |
| // |
| // Passing a wuffs_base__slice_u8 with all fields NULL or zero (a valid, empty |
| // slice) is valid and results in a no-op. |
| static inline uint64_t wuffs_base__slice_u8__copy_from_slice( |
| wuffs_base__slice_u8 dst, |
| wuffs_base__slice_u8 src) { |
| size_t length = dst.len < src.len ? dst.len : src.len; |
| if (length > 0) { |
| memmove(dst.ptr, src.ptr, length); |
| } |
| return length; |
| } |
| |
| // -------- |
| |
| static inline wuffs_base__slice_u8 wuffs_base__table_u8__linearize( |
| wuffs_base__table_u8 t) { |
| if (t.width == t.stride) { |
| return ((wuffs_base__slice_u8){ |
| .ptr = t.ptr, |
| .len = t.width * t.height, |
| }); |
| } |
| return ((wuffs_base__slice_u8){}); |
| } |
| |
| // ---------------- Ranges and Rects |
| |
| static inline wuffs_base__empty_struct |
| wuffs_base__rect_ii_u32__set_min_inclusive_x(wuffs_base__rect_ii_u32* r, |
| uint32_t x) { |
| r->min_inclusive_x = x; |
| return ((wuffs_base__empty_struct){}); |
| } |
| |
| static inline wuffs_base__empty_struct |
| wuffs_base__rect_ii_u32__set_min_inclusive_y(wuffs_base__rect_ii_u32* r, |
| uint32_t y) { |
| r->min_inclusive_y = y; |
| return ((wuffs_base__empty_struct){}); |
| } |
| |
| static inline wuffs_base__empty_struct |
| wuffs_base__rect_ii_u32__set_max_inclusive_x(wuffs_base__rect_ii_u32* r, |
| uint32_t x) { |
| r->max_inclusive_x = x; |
| return ((wuffs_base__empty_struct){}); |
| } |
| |
| static inline wuffs_base__empty_struct |
| wuffs_base__rect_ii_u32__set_max_inclusive_y(wuffs_base__rect_ii_u32* r, |
| uint32_t y) { |
| r->max_inclusive_y = y; |
| return ((wuffs_base__empty_struct){}); |
| } |
| |
| // -------- |
| |
| static inline wuffs_base__empty_struct |
| wuffs_base__rect_ie_u32__set_min_inclusive_x(wuffs_base__rect_ie_u32* r, |
| uint32_t x) { |
| r->min_inclusive_x = x; |
| return ((wuffs_base__empty_struct){}); |
| } |
| |
| static inline wuffs_base__empty_struct |
| wuffs_base__rect_ie_u32__set_min_inclusive_y(wuffs_base__rect_ie_u32* r, |
| uint32_t y) { |
| r->min_inclusive_y = y; |
| return ((wuffs_base__empty_struct){}); |
| } |
| |
| static inline wuffs_base__empty_struct |
| wuffs_base__rect_ie_u32__set_max_exclusive_x(wuffs_base__rect_ie_u32* r, |
| uint32_t x) { |
| r->max_exclusive_x = x; |
| return ((wuffs_base__empty_struct){}); |
| } |
| |
| static inline wuffs_base__empty_struct |
| wuffs_base__rect_ie_u32__set_max_exclusive_y(wuffs_base__rect_ie_u32* r, |
| uint32_t y) { |
| r->max_exclusive_y = y; |
| return ((wuffs_base__empty_struct){}); |
| } |
| |
| // ---------------- I/O |
| |
| static inline bool wuffs_base__io_buffer__is_valid(wuffs_base__io_buffer buf) { |
| return (buf.ptr || (buf.len == 0)) && (buf.len >= buf.wi) && |
| (buf.wi >= buf.ri); |
| } |
| |
| static inline bool wuffs_base__io_reader__is_eof(wuffs_base__io_reader o) { |
| wuffs_base__io_buffer* buf = o.private_impl.buf; |
| return buf && buf->closed && (buf->ptr + buf->wi == o.private_impl.bounds[1]); |
| } |
| |
| static inline bool wuffs_base__io_reader__is_valid(wuffs_base__io_reader o) { |
| wuffs_base__io_buffer* buf = o.private_impl.buf; |
| // Note: if making this function public (i.e. moving it to base-header.h), it |
| // also needs to allow NULL (i.e. implicit, callee-calculated) bounds. |
| return buf ? ((buf->ptr <= o.private_impl.bounds[0]) && |
| (o.private_impl.bounds[0] <= o.private_impl.bounds[1]) && |
| (o.private_impl.bounds[1] <= buf->ptr + buf->len)) |
| : ((o.private_impl.bounds[0] == NULL) && |
| (o.private_impl.bounds[1] == NULL)); |
| } |
| |
| static inline bool wuffs_base__io_writer__is_valid(wuffs_base__io_writer o) { |
| wuffs_base__io_buffer* buf = o.private_impl.buf; |
| // Note: if making this function public (i.e. moving it to base-header.h), it |
| // also needs to allow NULL (i.e. implicit, callee-calculated) bounds. |
| return buf ? ((buf->ptr <= o.private_impl.bounds[0]) && |
| (o.private_impl.bounds[0] <= o.private_impl.bounds[1]) && |
| (o.private_impl.bounds[1] <= buf->ptr + buf->len)) |
| : ((o.private_impl.bounds[0] == NULL) && |
| (o.private_impl.bounds[1] == NULL)); |
| } |
| |
| static inline uint32_t wuffs_base__io_writer__copy_from_history32( |
| uint8_t** ptr_ptr, |
| uint8_t* start, |
| uint8_t* end, |
| uint32_t distance, |
| uint32_t length) { |
| if (!distance) { |
| return 0; |
| } |
| uint8_t* ptr = *ptr_ptr; |
| if ((size_t)(ptr - start) < (size_t)(distance)) { |
| return 0; |
| } |
| start = ptr - distance; |
| size_t n = end - ptr; |
| if ((size_t)(length) > n) { |
| length = n; |
| } else { |
| n = length; |
| } |
| // TODO: unrolling by 3 seems best for the std/deflate benchmarks, but that |
| // is mostly because 3 is the minimum length for the deflate format. This |
| // function implementation shouldn't overfit to that one format. Perhaps the |
| // copy_from_history32 Wuffs method should also take an unroll hint argument, |
| // and the cgen can look if that argument is the constant expression '3'. |
| // |
| // See also wuffs_base__io_writer__copy_from_history32__bco below. |
| // |
| // Alternatively, or additionally, have a sloppy_copy_from_history32 method |
| // that copies 8 bytes at a time, possibly writing more than length bytes? |
| for (; n >= 3; n -= 3) { |
| *ptr++ = *start++; |
| *ptr++ = *start++; |
| *ptr++ = *start++; |
| } |
| for (; n; n--) { |
| *ptr++ = *start++; |
| } |
| *ptr_ptr = ptr; |
| return length; |
| } |
| |
| // wuffs_base__io_writer__copy_from_history32__bco is a Bounds Check Optimized |
| // version of the wuffs_base__io_writer__copy_from_history32 function above. |
| // The caller needs to prove that: |
| // - distance > 0 |
| // - distance <= (*ptr_ptr - start) |
| // - length <= (end - *ptr_ptr) |
| static inline uint32_t wuffs_base__io_writer__copy_from_history32__bco( |
| uint8_t** ptr_ptr, |
| uint8_t* start, |
| uint8_t* end, |
| uint32_t distance, |
| uint32_t length) { |
| uint8_t* ptr = *ptr_ptr; |
| start = ptr - distance; |
| uint32_t n = length; |
| for (; n >= 3; n -= 3) { |
| *ptr++ = *start++; |
| *ptr++ = *start++; |
| *ptr++ = *start++; |
| } |
| for (; n; n--) { |
| *ptr++ = *start++; |
| } |
| *ptr_ptr = ptr; |
| return length; |
| } |
| |
| static inline uint32_t wuffs_base__io_writer__copy_from_reader32( |
| uint8_t** ptr_ioptr_w, |
| uint8_t* iobounds1_w, |
| uint8_t** ptr_ioptr_r, |
| uint8_t* iobounds1_r, |
| uint32_t length) { |
| uint8_t* ioptr_w = *ptr_ioptr_w; |
| size_t n = length; |
| if (n > iobounds1_w - ioptr_w) { |
| n = iobounds1_w - ioptr_w; |
| } |
| uint8_t* ioptr_r = *ptr_ioptr_r; |
| if (n > iobounds1_r - ioptr_r) { |
| n = iobounds1_r - ioptr_r; |
| } |
| if (n > 0) { |
| memmove(ioptr_w, ioptr_r, n); |
| *ptr_ioptr_w += n; |
| *ptr_ioptr_r += n; |
| } |
| return n; |
| } |
| |
| static inline uint64_t wuffs_base__io_writer__copy_from_slice( |
| uint8_t** ptr_ioptr_w, |
| uint8_t* iobounds1_w, |
| wuffs_base__slice_u8 src) { |
| uint8_t* ioptr_w = *ptr_ioptr_w; |
| size_t n = src.len; |
| if (n > iobounds1_w - ioptr_w) { |
| n = iobounds1_w - ioptr_w; |
| } |
| if (n > 0) { |
| memmove(ioptr_w, src.ptr, n); |
| *ptr_ioptr_w += n; |
| } |
| return n; |
| } |
| |
| static inline uint32_t wuffs_base__io_writer__copy_from_slice32( |
| uint8_t** ptr_ioptr_w, |
| uint8_t* iobounds1_w, |
| wuffs_base__slice_u8 src, |
| uint32_t length) { |
| uint8_t* ioptr_w = *ptr_ioptr_w; |
| size_t n = src.len; |
| if (n > length) { |
| n = length; |
| } |
| if (n > iobounds1_w - ioptr_w) { |
| n = iobounds1_w - ioptr_w; |
| } |
| if (n > 0) { |
| memmove(ioptr_w, src.ptr, n); |
| *ptr_ioptr_w += n; |
| } |
| return n; |
| } |
| |
| static inline wuffs_base__empty_struct wuffs_base__io_reader__set_limit( |
| wuffs_base__io_reader* o, |
| uint8_t* ioptr_r, |
| uint64_t limit) { |
| if (o && ((o->private_impl.bounds[1] - ioptr_r) > limit)) { |
| o->private_impl.bounds[1] = ioptr_r + limit; |
| } |
| return ((wuffs_base__empty_struct){}); |
| } |
| |
| static inline wuffs_base__empty_struct wuffs_base__io_reader__set_mark( |
| wuffs_base__io_reader* o, |
| uint8_t* mark) { |
| o->private_impl.bounds[0] = mark; |
| return ((wuffs_base__empty_struct){}); |
| } |
| |
| static inline wuffs_base__empty_struct wuffs_base__io_writer__set( |
| wuffs_base__io_writer* o, |
| wuffs_base__io_buffer* b, |
| uint8_t** ioptr1_ptr, |
| uint8_t** ioptr2_ptr, |
| wuffs_base__slice_u8 s) { |
| b->ptr = s.ptr; |
| b->len = s.len; |
| b->wi = 0; |
| b->ri = 0; |
| b->closed = false; |
| o->private_impl.buf = b; |
| o->private_impl.bounds[0] = s.ptr; |
| o->private_impl.bounds[1] = s.ptr + s.len; |
| *ioptr1_ptr = s.ptr; |
| *ioptr2_ptr = s.ptr + s.len; |
| return ((wuffs_base__empty_struct){}); |
| } |
| |
| static inline wuffs_base__empty_struct wuffs_base__io_writer__set_mark( |
| wuffs_base__io_writer* o, |
| uint8_t* mark) { |
| o->private_impl.bounds[0] = mark; |
| return ((wuffs_base__empty_struct){}); |
| } |
| |
| static const char* wuffs_base__status__strings[13] = { |
| "ok", |
| "bad wuffs version", |
| "bad receiver", |
| "bad argument", |
| "initializer not called", |
| "invalid I/O operation", |
| "closed for writes", |
| "unexpected EOF", |
| "short read", |
| "short write", |
| "cannot return a suspension", |
| "invalid call sequence", |
| "end of data", |
| }; |
| |
| #endif // WUFFS_BASE_IMPL_H |
| |
| // ---------------- Status Codes Implementations |
| |
| bool wuffs_crc32__status__is_error(wuffs_crc32__status s) { |
| return s < 0; |
| } |
| |
| const char* wuffs_crc32__status__strings[0] = {}; |
| |
| const char* wuffs_crc32__status__string(wuffs_crc32__status s) { |
| const char** a = NULL; |
| uint32_t n = 0; |
| switch ((s >> 10) & 0x1FFFFF) { |
| case 0: |
| a = wuffs_base__status__strings; |
| n = 13; |
| break; |
| case wuffs_crc32__packageid: |
| a = wuffs_crc32__status__strings; |
| n = 0; |
| break; |
| } |
| uint32_t i = s & 0xFF; |
| return i < n ? a[i] : "unknown status"; |
| } |
| |
| // ---------------- Private Consts |
| |
| static const uint32_t wuffs_crc32__ieee_table[8][256] = { |
| { |
| 0, 1996959894, 3993919788, 2567524794, 124634137, 1886057615, |
| 3915621685, 2657392035, 249268274, 2044508324, 3772115230, 2547177864, |
| 162941995, 2125561021, 3887607047, 2428444049, 498536548, 1789927666, |
| 4089016648, 2227061214, 450548861, 1843258603, 4107580753, 2211677639, |
| 325883990, 1684777152, 4251122042, 2321926636, 335633487, 1661365465, |
| 4195302755, 2366115317, 997073096, 1281953886, 3579855332, 2724688242, |
| 1006888145, 1258607687, 3524101629, 2768942443, 901097722, 1119000684, |
| 3686517206, 2898065728, 853044451, 1172266101, 3705015759, 2882616665, |
| 651767980, 1373503546, 3369554304, 3218104598, 565507253, 1454621731, |
| 3485111705, 3099436303, 671266974, 1594198024, 3322730930, 2970347812, |
| 795835527, 1483230225, 3244367275, 3060149565, 1994146192, 31158534, |
| 2563907772, 4023717930, 1907459465, 112637215, 2680153253, 3904427059, |
| 2013776290, 251722036, 2517215374, 3775830040, 2137656763, 141376813, |
| 2439277719, 3865271297, 1802195444, 476864866, 2238001368, 4066508878, |
| 1812370925, 453092731, 2181625025, 4111451223, 1706088902, 314042704, |
| 2344532202, 4240017532, 1658658271, 366619977, 2362670323, 4224994405, |
| 1303535960, 984961486, 2747007092, 3569037538, 1256170817, 1037604311, |
| 2765210733, 3554079995, 1131014506, 879679996, 2909243462, 3663771856, |
| 1141124467, 855842277, 2852801631, 3708648649, 1342533948, 654459306, |
| 3188396048, 3373015174, 1466479909, 544179635, 3110523913, 3462522015, |
| 1591671054, 702138776, 2966460450, 3352799412, 1504918807, 783551873, |
| 3082640443, 3233442989, 3988292384, 2596254646, 62317068, 1957810842, |
| 3939845945, 2647816111, 81470997, 1943803523, 3814918930, 2489596804, |
| 225274430, 2053790376, 3826175755, 2466906013, 167816743, 2097651377, |
| 4027552580, 2265490386, 503444072, 1762050814, 4150417245, 2154129355, |
| 426522225, 1852507879, 4275313526, 2312317920, 282753626, 1742555852, |
| 4189708143, 2394877945, 397917763, 1622183637, 3604390888, 2714866558, |
| 953729732, 1340076626, 3518719985, 2797360999, 1068828381, 1219638859, |
| 3624741850, 2936675148, 906185462, 1090812512, 3747672003, 2825379669, |
| 829329135, 1181335161, 3412177804, 3160834842, 628085408, 1382605366, |
| 3423369109, 3138078467, 570562233, 1426400815, 3317316542, 2998733608, |
| 733239954, 1555261956, 3268935591, 3050360625, 752459403, 1541320221, |
| 2607071920, 3965973030, 1969922972, 40735498, 2617837225, 3943577151, |
| 1913087877, 83908371, 2512341634, 3803740692, 2075208622, 213261112, |
| 2463272603, 3855990285, 2094854071, 198958881, 2262029012, 4057260610, |
| 1759359992, 534414190, 2176718541, 4139329115, 1873836001, 414664567, |
| 2282248934, 4279200368, 1711684554, 285281116, 2405801727, 4167216745, |
| 1634467795, 376229701, 2685067896, 3608007406, 1308918612, 956543938, |
| 2808555105, 3495958263, 1231636301, 1047427035, 2932959818, 3654703836, |
| 1088359270, 936918000, 2847714899, 3736837829, 1202900863, 817233897, |
| 3183342108, 3401237130, 1404277552, 615818150, 3134207493, 3453421203, |
| 1423857449, 601450431, 3009837614, 3294710456, 1567103746, 711928724, |
| 3020668471, 3272380065, 1510334235, 755167117, |
| }, |
| { |
| 0, 421212481, 842424962, 724390851, 1684849924, 2105013317, |
| 1448781702, 1329698503, 3369699848, 3519200073, 4210026634, 3824474571, |
| 2897563404, 3048111693, 2659397006, 2274893007, 1254232657, 1406739216, |
| 2029285587, 1643069842, 783210325, 934667796, 479770071, 92505238, |
| 2182846553, 2600511768, 2955803355, 2838940570, 3866582365, 4285295644, |
| 3561045983, 3445231262, 2508465314, 2359236067, 2813478432, 3198777185, |
| 4058571174, 3908292839, 3286139684, 3670389349, 1566420650, 1145479147, |
| 1869335592, 1987116393, 959540142, 539646703, 185010476, 303839341, |
| 3745920755, 3327985586, 3983561841, 4100678960, 3140154359, 2721170102, |
| 2300350837, 2416418868, 396344571, 243568058, 631889529, 1018359608, |
| 1945336319, 1793607870, 1103436669, 1490954812, 4034481925, 3915546180, |
| 3259968903, 3679722694, 2484439553, 2366552896, 2787371139, 3208174018, |
| 950060301, 565965900, 177645455, 328046286, 1556873225, 1171730760, |
| 1861902987, 2011255754, 3132841300, 2745199637, 2290958294, 2442530455, |
| 3738671184, 3352078609, 3974232786, 4126854035, 1919080284, 1803150877, |
| 1079293406, 1498383519, 370020952, 253043481, 607678682, 1025720731, |
| 1711106983, 2095471334, 1472923941, 1322268772, 26324643, 411738082, |
| 866634785, 717028704, 2904875439, 3024081134, 2668790573, 2248782444, |
| 3376948395, 3495106026, 4219356713, 3798300520, 792689142, 908347575, |
| 487136116, 68299317, 1263779058, 1380486579, 2036719216, 1618931505, |
| 3890672638, 4278043327, 3587215740, 3435896893, 2206873338, 2593195963, |
| 2981909624, 2829542713, 998479947, 580430090, 162921161, 279890824, |
| 1609522511, 1190423566, 1842954189, 1958874764, 4082766403, 3930137346, |
| 3245109441, 3631694208, 2536953671, 2385372678, 2768287173, 3155920004, |
| 1900120602, 1750776667, 1131931800, 1517083097, 355290910, 204897887, |
| 656092572, 1040194781, 3113746450, 2692952403, 2343461520, 2461357009, |
| 3723805974, 3304059991, 4022511508, 4141455061, 2919742697, 3072101800, |
| 2620513899, 2234183466, 3396041197, 3547351212, 4166851439, 3779471918, |
| 1725839073, 2143618976, 1424512099, 1307796770, 45282277, 464110244, |
| 813994343, 698327078, 3838160568, 4259225593, 3606301754, 3488152955, |
| 2158586812, 2578602749, 2996767038, 2877569151, 740041904, 889656817, |
| 506086962, 120682355, 1215357364, 1366020341, 2051441462, 1667084919, |
| 3422213966, 3538019855, 4190942668, 3772220557, 2945847882, 3062702859, |
| 2644537544, 2226864521, 52649286, 439905287, 823476164, 672009861, |
| 1733269570, 2119477507, 1434057408, 1281543041, 2167981343, 2552493150, |
| 3004082077, 2853541596, 3847487515, 4233048410, 3613549209, 3464057816, |
| 1239502615, 1358593622, 2077699477, 1657543892, 764250643, 882293586, |
| 532408465, 111204816, 1585378284, 1197851309, 1816695150, 1968414767, |
| 974272232, 587794345, 136598634, 289367339, 2527558116, 2411481253, |
| 2760973158, 3179948583, 4073438432, 3956313505, 3237863010, 3655790371, |
| 347922877, 229101820, 646611775, 1066513022, 1892689081, 1774917112, |
| 1122387515, 1543337850, 3697634229, 3313392372, 3998419255, 4148705398, |
| 3087642289, 2702352368, 2319436851, 2468674930, |
| }, |
| { |
| 0, 29518391, 59036782, 38190681, 118073564, 114017003, |
| 76381362, 89069189, 236147128, 265370511, 228034006, 206958561, |
| 152762724, 148411219, 178138378, 190596925, 472294256, 501532999, |
| 530741022, 509615401, 456068012, 451764635, 413917122, 426358261, |
| 305525448, 334993663, 296822438, 275991697, 356276756, 352202787, |
| 381193850, 393929805, 944588512, 965684439, 1003065998, 973863097, |
| 1061482044, 1049003019, 1019230802, 1023561829, 912136024, 933002607, |
| 903529270, 874031361, 827834244, 815125939, 852716522, 856752605, |
| 611050896, 631869351, 669987326, 640506825, 593644876, 580921211, |
| 551983394, 556069653, 712553512, 733666847, 704405574, 675154545, |
| 762387700, 749958851, 787859610, 792175277, 1889177024, 1901651959, |
| 1931368878, 1927033753, 2006131996, 1985040171, 1947726194, 1976933189, |
| 2122964088, 2135668303, 2098006038, 2093965857, 2038461604, 2017599123, |
| 2047123658, 2076625661, 1824272048, 1836991623, 1866005214, 1861914857, |
| 1807058540, 1786244187, 1748062722, 1777547317, 1655668488, 1668093247, |
| 1630251878, 1625932113, 1705433044, 1684323811, 1713505210, 1742760333, |
| 1222101792, 1226154263, 1263738702, 1251046777, 1339974652, 1310460363, |
| 1281013650, 1301863845, 1187289752, 1191637167, 1161842422, 1149379777, |
| 1103966788, 1074747507, 1112139306, 1133218845, 1425107024, 1429406311, |
| 1467333694, 1454888457, 1408811148, 1379576507, 1350309090, 1371438805, |
| 1524775400, 1528845279, 1499917702, 1487177649, 1575719220, 1546255107, |
| 1584350554, 1605185389, 3778354048, 3774312887, 3803303918, 3816007129, |
| 3862737756, 3892238699, 3854067506, 3833203973, 4012263992, 4007927823, |
| 3970080342, 3982554209, 3895452388, 3924658387, 3953866378, 3932773565, |
| 4245928176, 4241609415, 4271336606, 4283762345, 4196012076, 4225268251, |
| 4187931714, 4166823541, 4076923208, 4072833919, 4035198246, 4047918865, |
| 4094247316, 4123732899, 4153251322, 4132437965, 3648544096, 3636082519, |
| 3673983246, 3678331705, 3732010428, 3753090955, 3723829714, 3694611429, |
| 3614117080, 3601426159, 3572488374, 3576541825, 3496125444, 3516976691, |
| 3555094634, 3525581405, 3311336976, 3298595879, 3336186494, 3340255305, |
| 3260503756, 3281337595, 3251864226, 3222399125, 3410866088, 3398419871, |
| 3368647622, 3372945905, 3427010420, 3448139075, 3485520666, 3456284973, |
| 2444203584, 2423127159, 2452308526, 2481530905, 2527477404, 2539934891, |
| 2502093554, 2497740997, 2679949304, 2659102159, 2620920726, 2650438049, |
| 2562027300, 2574714131, 2603727690, 2599670141, 2374579504, 2353749767, |
| 2383274334, 2412743529, 2323684844, 2336421851, 2298759554, 2294686645, |
| 2207933576, 2186809023, 2149495014, 2178734801, 2224278612, 2236720739, |
| 2266437690, 2262135309, 2850214048, 2820717207, 2858812622, 2879680249, |
| 2934667388, 2938704459, 2909776914, 2897069605, 2817622296, 2788420399, |
| 2759153014, 2780249921, 2700618180, 2704950259, 2742877610, 2730399645, |
| 3049550800, 3020298727, 3057690558, 3078802825, 2999835404, 3004150075, |
| 2974355298, 2961925461, 3151438440, 3121956959, 3092510214, 3113327665, |
| 3168701108, 3172786307, 3210370778, 3197646061, |
| }, |
| { |
| 0, 3099354981, 2852767883, 313896942, 2405603159, 937357362, |
| 627793884, 2648127673, 3316918511, 2097696650, 1874714724, 3607201537, |
| 1255587768, 4067088605, 3772741427, 1482887254, 1343838111, 3903140090, |
| 4195393300, 1118632049, 3749429448, 1741137837, 1970407491, 3452858150, |
| 2511175536, 756094997, 1067759611, 2266550430, 449832999, 2725482306, |
| 2965774508, 142231497, 2687676222, 412010587, 171665333, 2995192016, |
| 793786473, 2548850444, 2237264098, 1038456711, 1703315409, 3711623348, |
| 3482275674, 1999841343, 3940814982, 1381529571, 1089329165, 4166106984, |
| 4029413537, 1217896388, 1512189994, 3802027855, 2135519222, 3354724499, |
| 3577784189, 1845280792, 899665998, 2367928107, 2677414085, 657096608, |
| 3137160985, 37822588, 284462994, 2823350519, 2601801789, 598228824, |
| 824021174, 2309093331, 343330666, 2898962447, 3195996129, 113467524, |
| 1587572946, 3860600759, 4104763481, 1276501820, 3519211397, 1769898208, |
| 2076913422, 3279374443, 3406630818, 1941006535, 1627703081, 3652755532, |
| 1148164341, 4241751952, 3999682686, 1457141531, 247015245, 3053797416, |
| 2763059142, 470583459, 2178658330, 963106687, 735213713, 2473467892, |
| 992409347, 2207944806, 2435792776, 697522413, 3024379988, 217581361, |
| 508405983, 2800865210, 4271038444, 1177467017, 1419450215, 3962007554, |
| 1911572667, 3377213406, 3690561584, 1665525589, 1799331996, 3548628985, |
| 3241568279, 2039091058, 3831314379, 1558270126, 1314193216, 4142438437, |
| 2928380019, 372764438, 75645176, 3158189981, 568925988, 2572515393, |
| 2346768303, 861712586, 3982079547, 1441124702, 1196457648, 4293663189, |
| 1648042348, 3666298377, 3358779879, 1888390786, 686661332, 2421291441, |
| 2196002399, 978858298, 2811169155, 523464422, 226935048, 3040519789, |
| 3175145892, 100435649, 390670639, 2952089162, 841119475, 2325614998, |
| 2553003640, 546822429, 2029308235, 3225988654, 3539796416, 1782671013, |
| 4153826844, 1328167289, 1570739863, 3844338162, 1298864389, 4124540512, |
| 3882013070, 1608431339, 3255406162, 2058742071, 1744848601, 3501990332, |
| 2296328682, 811816591, 584513889, 2590678532, 129869501, 3204563416, |
| 2914283062, 352848211, 494030490, 2781751807, 3078325777, 264757620, |
| 2450577869, 715964072, 941166918, 2158327331, 3636881013, 1618608400, |
| 1926213374, 3396585883, 1470427426, 4011365959, 4255988137, 1158766284, |
| 1984818694, 3471935843, 3695453837, 1693991400, 4180638033, 1100160564, |
| 1395044826, 3952793279, 3019491049, 189112716, 435162722, 2706139399, |
| 1016811966, 2217162459, 2526189877, 774831696, 643086745, 2666061564, |
| 2354934034, 887166583, 2838900430, 294275499, 54519365, 3145957664, |
| 3823145334, 1532818963, 1240029693, 4048895640, 1820460577, 3560857924, |
| 3331051178, 2117577167, 3598663992, 1858283101, 2088143283, 3301633750, |
| 1495127663, 3785470218, 4078182116, 1269332353, 332098007, 2876706482, |
| 3116540252, 25085497, 2628386432, 605395429, 916469259, 2384220526, |
| 2254837415, 1054503362, 745528876, 2496903497, 151290352, 2981684885, |
| 2735556987, 464596510, 1137851976, 4218313005, 3923506883, 1365741990, |
| 3434129695, 1946996346, 1723425172, 3724871409, |
| }, |
| { |
| 0, 1029712304, 2059424608, 1201699536, 4118849216, 3370159984, |
| 2403399072, 2988497936, 812665793, 219177585, 1253054625, 2010132753, |
| 3320900865, 4170237105, 3207642721, 2186319825, 1625331586, 1568718386, |
| 438355170, 658566482, 2506109250, 2818578674, 4020265506, 3535817618, |
| 1351670851, 1844508147, 709922595, 389064339, 2769320579, 2557498163, |
| 3754961379, 3803185235, 3250663172, 4238411444, 3137436772, 2254525908, |
| 876710340, 153198708, 1317132964, 1944187668, 4054934725, 3436268917, |
| 2339452837, 3054575125, 70369797, 961670069, 2129760613, 1133623509, |
| 2703341702, 2621542710, 3689016294, 3867263574, 1419845190, 1774270454, |
| 778128678, 318858390, 2438067015, 2888948471, 3952189479, 3606153623, |
| 1691440519, 1504803895, 504432359, 594620247, 1492342857, 1704161785, |
| 573770537, 525542041, 2910060169, 2417219385, 3618876905, 3939730521, |
| 1753420680, 1440954936, 306397416, 790849880, 2634265928, 2690882808, |
| 3888375336, 3668168600, 940822475, 91481723, 1121164459, 2142483739, |
| 3448989963, 4042473659, 3075684971, 2318603227, 140739594, 889433530, |
| 1923340138, 1338244826, 4259521226, 3229813626, 2267247018, 3124975642, |
| 2570221389, 2756861693, 3824297005, 3734113693, 1823658381, 1372780605, |
| 376603373, 722643805, 2839690380, 2485261628, 3548540908, 4007806556, |
| 1556257356, 1638052860, 637716780, 459464860, 4191346895, 3300051327, |
| 2199040943, 3195181599, 206718479, 825388991, 1989285231, 1274166495, |
| 3382881038, 4106388158, 3009607790, 2382549470, 1008864718, 21111934, |
| 1189240494, 2072147742, 2984685714, 2357631266, 3408323570, 4131834434, |
| 1147541074, 2030452706, 1051084082, 63335554, 2174155603, 3170292451, |
| 4216760371, 3325460867, 1947622803, 1232499747, 248909555, 867575619, |
| 3506841360, 3966111392, 2881909872, 2527485376, 612794832, 434546784, |
| 1581699760, 1663499008, 3782634705, 3692447073, 2612412337, 2799048193, |
| 351717905, 697754529, 1849071985, 1398190273, 1881644950, 1296545318, |
| 182963446, 931652934, 2242328918, 3100053734, 4284967478, 3255255942, |
| 1079497815, 2100821479, 983009079, 133672583, 3050795671, 2293717799, |
| 3474399735, 4067887175, 281479188, 765927844, 1778867060, 1466397380, |
| 3846680276, 3626469220, 2676489652, 2733102084, 548881365, 500656741, |
| 1517752501, 1729575173, 3577210133, 3898068133, 2952246901, 2459410373, |
| 3910527195, 3564487019, 2480257979, 2931134987, 479546907, 569730987, |
| 1716854139, 1530213579, 3647316762, 3825568426, 2745561210, 2663766474, |
| 753206746, 293940330, 1445287610, 1799716618, 2314567513, 3029685993, |
| 4080348217, 3461678473, 2088098201, 1091956777, 112560889, 1003856713, |
| 3112514712, 2229607720, 3276105720, 4263857736, 1275433560, 1902492648, |
| 918929720, 195422344, 685033439, 364179055, 1377080511, 1869921551, |
| 3713294623, 3761522863, 2811507327, 2599689167, 413436958, 633644462, |
| 1650777982, 1594160846, 3978570462, 3494118254, 2548332990, 2860797966, |
| 1211387997, 1968470509, 854852413, 261368461, 3182753437, 2161434413, |
| 3346310653, 4195650637, 2017729436, 1160000044, 42223868, 1071931724, |
| 2378480988, 2963576044, 4144295484, 3395602316, |
| }, |
| { |
| 0, 3411858341, 1304994059, 2257875630, 2609988118, 1355649459, |
| 3596215069, 486879416, 3964895853, 655315400, 2711298918, 1791488195, |
| 2009251963, 3164476382, 973758832, 4048990933, 64357019, 3364540734, |
| 1310630800, 2235723829, 2554806413, 1394316072, 3582976390, 517157411, |
| 4018503926, 618222419, 2722963965, 1762783832, 1947517664, 3209171269, |
| 970744811, 4068520014, 128714038, 3438335635, 1248109629, 2167961496, |
| 2621261600, 1466012805, 3522553387, 447296910, 3959392091, 547575038, |
| 2788632144, 1835791861, 1886307661, 3140622056, 1034314822, 4143626211, |
| 75106221, 3475428360, 1236444838, 2196665603, 2682996155, 1421317662, |
| 3525567664, 427767573, 3895035328, 594892389, 2782995659, 1857943406, |
| 1941489622, 3101955187, 1047553757, 4113347960, 257428076, 3288652233, |
| 1116777319, 2311878850, 2496219258, 1603640287, 3640781169, 308099796, |
| 3809183745, 676813732, 2932025610, 1704983215, 2023410199, 3016104370, |
| 894593820, 4262377657, 210634999, 3352484690, 1095150076, 2316991065, |
| 2535410401, 1547934020, 3671583722, 294336591, 3772615322, 729897279, |
| 2903845777, 1716123700, 2068629644, 2953845545, 914647431, 4258839074, |
| 150212442, 3282623743, 1161604689, 2388688372, 2472889676, 1480171241, |
| 3735940167, 368132066, 3836185911, 805002898, 2842635324, 1647574937, |
| 2134298401, 3026852996, 855535146, 4188192143, 186781121, 3229539940, |
| 1189784778, 2377547631, 2427670487, 1542429810, 3715886812, 371670393, |
| 3882979244, 741170185, 2864262823, 1642462466, 2095107514, 3082559007, |
| 824732849, 4201955092, 514856152, 3589064573, 1400419795, 2552522358, |
| 2233554638, 1316849003, 3370776517, 62202976, 4075001525, 968836368, |
| 3207280574, 1954014235, 1769133219, 2720925446, 616199592, 4024870413, |
| 493229635, 3594175974, 1353627464, 2616354029, 2264355925, 1303087088, |
| 3409966430, 6498043, 4046820398, 979978123, 3170710821, 2007099008, |
| 1789187640, 2717386141, 661419827, 3962610838, 421269998, 3527459403, |
| 1423225061, 2676515648, 2190300152, 1238466653, 3477467891, 68755798, |
| 4115633027, 1041448998, 3095868040, 1943789869, 1860096405, 2776760880, |
| 588673182, 3897205563, 449450869, 3516317904, 1459794558, 2623431131, |
| 2170245475, 1242006214, 3432247400, 131015629, 4137259288, 1036337853, |
| 3142660115, 1879958454, 1829294862, 2790523051, 549483013, 3952910752, |
| 300424884, 3669282065, 1545650111, 2541513754, 2323209378, 1092980487, |
| 3350330793, 216870412, 4256931033, 921128828, 2960342482, 2066738807, |
| 1714085583, 2910195050, 736264132, 3770592353, 306060335, 3647131530, |
| 1610005796, 2494197377, 2309971513, 1123257756, 3295149874, 255536279, |
| 4268596802, 892423655, 3013951305, 2029645036, 1711070292, 2929725425, |
| 674528607, 3815288570, 373562242, 3709388839, 1535949449, 2429577516, |
| 2379569556, 1183418929, 3223189663, 188820282, 4195850735, 827017802, |
| 3084859620, 2089020225, 1636228089, 2866415708, 743340786, 3876759895, |
| 361896217, 3738094268, 1482340370, 2466671543, 2382584591, 1163888810, |
| 3284924932, 144124321, 4190215028, 849168593, 3020503679, 2136336858, |
| 1649465698, 2836138695, 798521449, 3838094284, |
| }, |
| { |
| 0, 2792819636, 2543784233, 837294749, 4098827283, 1379413927, |
| 1674589498, 3316072078, 871321191, 2509784531, 2758827854, 34034938, |
| 3349178996, 1641505216, 1346337629, 4131942633, 1742642382, 3249117050, |
| 4030828007, 1446413907, 2475800797, 904311657, 68069876, 2725880384, |
| 1412551337, 4064729373, 3283010432, 1708771380, 2692675258, 101317902, |
| 937551763, 2442587175, 3485284764, 1774858792, 1478633653, 4266992385, |
| 1005723023, 2642744891, 2892827814, 169477906, 4233263099, 1512406095, |
| 1808623314, 3451546982, 136139752, 2926205020, 2676114113, 972376437, |
| 2825102674, 236236518, 1073525883, 2576072655, 1546420545, 4200303349, |
| 3417542760, 1841601500, 2609703733, 1039917185, 202635804, 2858742184, |
| 1875103526, 3384067218, 4166835727, 1579931067, 1141601657, 3799809741, |
| 3549717584, 1977839588, 2957267306, 372464350, 668680259, 2175552503, |
| 2011446046, 3516084394, 3766168119, 1175200131, 2209029901, 635180217, |
| 338955812, 2990736784, 601221559, 2242044419, 3024812190, 306049834, |
| 3617246628, 1911408144, 1074125965, 3866285881, 272279504, 3058543716, |
| 2275784441, 567459149, 3832906691, 1107462263, 1944752874, 3583875422, |
| 2343980261, 767641425, 472473036, 3126744696, 2147051766, 3649987394, |
| 3899029983, 1309766251, 3092841090, 506333494, 801510315, 2310084639, |
| 1276520081, 3932237093, 3683203000, 2113813516, 3966292011, 1243601823, |
| 2079834370, 3716205238, 405271608, 3192979340, 2411259153, 701492901, |
| 3750207052, 2045810168, 1209569125, 4000285905, 734575199, 2378150379, |
| 3159862134, 438345922, 2283203314, 778166598, 529136603, 3120492655, |
| 2086260449, 3660498261, 3955679176, 1303499900, 3153699989, 495890209, |
| 744928700, 2316418568, 1337360518, 3921775410, 3626602927, 2120129051, |
| 4022892092, 1237286280, 2018993941, 3726666913, 461853231, 3186645403, |
| 2350400262, 711936178, 3693557851, 2052076527, 1270360434, 3989775046, |
| 677911624, 2384402428, 3220639073, 427820757, 1202443118, 3789347034, |
| 3493118535, 1984154099, 3018127229, 362020041, 612099668, 2181885408, |
| 1950653705, 3526596285, 3822816288, 1168934804, 2148251930, 645706414, |
| 395618355, 2984485767, 544559008, 2248295444, 3085590153, 295523645, |
| 3560598451, 1917673479, 1134918298, 3855773998, 328860103, 3052210803, |
| 2214924526, 577903450, 3889505748, 1101147744, 1883911421, 3594338121, |
| 3424493451, 1785369663, 1535282850, 4260726038, 944946072, 2653270060, |
| 2949491377, 163225861, 4294103532, 1501944408, 1752023237, 3457862513, |
| 196998655, 2915761739, 2619532502, 978710370, 2881684293, 229902577, |
| 1012666988, 2586515928, 1603020630, 4193987810, 3356702335, 1852063179, |
| 2553040162, 1046169238, 263412747, 2848217023, 1818454321, 3390333573, |
| 4227627032, 1569420204, 60859927, 2782375331, 2487203646, 843627658, |
| 4159668740, 1368951216, 1617990445, 3322386585, 810543216, 2520310724, |
| 2815490393, 27783917, 3288386659, 1652017111, 1402985802, 4125677310, |
| 1685994201, 3255382381, 4091620336, 1435902020, 2419138250, 910562686, |
| 128847843, 2715354199, 1469150398, 4058414858, 3222168983, 1719234083, |
| 2749255853, 94984985, 876691844, 2453031472, |
| }, |
| { |
| 0, 3433693342, 1109723005, 2391738339, 2219446010, 1222643300, |
| 3329165703, 180685081, 3555007413, 525277995, 2445286600, 1567235158, |
| 1471092047, 2600801745, 361370162, 3642757804, 2092642603, 2953916853, |
| 1050555990, 4063508168, 4176560081, 878395215, 3134470316, 1987983410, |
| 2942184094, 1676945920, 3984272867, 567356797, 722740324, 3887998202, |
| 1764827929, 2778407815, 4185285206, 903635656, 3142804779, 2012833205, |
| 2101111980, 2979425330, 1058630609, 4088621903, 714308067, 3862526333, |
| 1756790430, 2753330688, 2933487385, 1651734407, 3975966820, 542535930, |
| 2244825981, 1231508451, 3353891840, 188896414, 25648519, 3442302233, |
| 1134713594, 2399689316, 1445480648, 2592229462, 336416693, 3634843435, |
| 3529655858, 516441772, 2420588879, 1559052753, 698204909, 3845636723, |
| 1807271312, 2803025166, 2916600855, 1635634313, 4025666410, 593021940, |
| 4202223960, 919787974, 3093159461, 1962401467, 2117261218, 2996361020, |
| 1008193759, 4038971457, 1428616134, 2576151384, 386135227, 3685348389, |
| 3513580860, 499580322, 2471098945, 1608776415, 2260985971, 1248454893, |
| 3303468814, 139259792, 42591881, 3458459159, 1085071860, 2349261162, |
| 3505103035, 474062885, 2463016902, 1583654744, 1419882049, 2550902495, |
| 377792828, 3660491170, 51297038, 3483679632, 1093385331, 2374089965, |
| 2269427188, 1273935210, 3311514249, 164344343, 2890961296, 1627033870, |
| 4000683757, 585078387, 672833386, 3836780532, 1782552599, 2794821769, |
| 2142603813, 3005188795, 1032883544, 4047146438, 4227826911, 928351297, |
| 3118105506, 1970307900, 1396409818, 2677114180, 287212199, 3719594553, |
| 3614542624, 467372990, 2505346141, 1509854403, 2162073199, 1282711281, |
| 3271268626, 240228748, 76845205, 3359543307, 1186043880, 2317064054, |
| 796964081, 3811226735, 1839575948, 2702160658, 2882189835, 1734392469, |
| 3924802934, 625327592, 4234522436, 818917338, 3191908409, 1927981223, |
| 2016387518, 3028656416, 973776579, 4137723485, 2857232268, 1726474002, |
| 3899187441, 616751215, 772270454, 3803048424, 1814228491, 2693328533, |
| 2041117753, 3036871847, 999160644, 4146592730, 4259508931, 826864221, |
| 3217552830, 1936586016, 3606501031, 442291769, 2496909786, 1484378436, |
| 1388107869, 2652297411, 278519584, 3694387134, 85183762, 3384397196, |
| 1194773103, 2342308593, 2170143720, 1307820918, 3279733909, 265733131, |
| 2057717559, 3054258089, 948125770, 4096344276, 4276898253, 843467091, |
| 3167309488, 1885556270, 2839764098, 1709792284, 3949353983, 667704161, |
| 755585656, 3785577190, 1865176325, 2743489947, 102594076, 3401021058, |
| 1144549729, 2291298815, 2186770662, 1325234296, 3228729243, 215514885, |
| 3589828009, 424832311, 2547870420, 1534552650, 1370645331, 2635621325, |
| 328688686, 3745342640, 2211456353, 1333405183, 3254067740, 224338562, |
| 127544219, 3408931589, 1170156774, 2299866232, 1345666772, 2627681866, |
| 303053225, 3736746295, 3565105198, 416624816, 2522494803, 1525692365, |
| 4285207626, 868291796, 3176010551, 1910772649, 2065767088, 3079346734, |
| 956571085, 4121828691, 747507711, 3760459617, 1856702594, 2717976604, |
| 2831417605, 1684930971, 3940615800, 642451174, |
| }, |
| }; |
| |
| // ---------------- Private Initializer Prototypes |
| |
| // ---------------- Private Function Prototypes |
| |
| // ---------------- Initializer Implementations |
| |
| void wuffs_crc32__ieee_hasher__initialize(wuffs_crc32__ieee_hasher* self, |
| uint32_t wuffs_version, |
| uint32_t for_internal_use_only) { |
| if (!self) { |
| return; |
| } |
| if (wuffs_version != WUFFS_VERSION) { |
| self->private_impl.status = WUFFS_CRC32__ERROR_BAD_WUFFS_VERSION; |
| return; |
| } |
| if (for_internal_use_only != WUFFS_BASE__ALREADY_ZEROED) { |
| memset(self, 0, sizeof(*self)); |
| } |
| self->private_impl.magic = WUFFS_BASE__MAGIC; |
| } |
| |
| // ---------------- Function Implementations |
| |
| // -------- func ieee_hasher.update |
| |
| uint32_t wuffs_crc32__ieee_hasher__update(wuffs_crc32__ieee_hasher* self, |
| wuffs_base__slice_u8 a_x) { |
| if (!self) { |
| return 0; |
| } |
| if (self->private_impl.magic != WUFFS_BASE__MAGIC) { |
| self->private_impl.status = WUFFS_CRC32__ERROR_INITIALIZER_NOT_CALLED; |
| } |
| if (self->private_impl.status < 0) { |
| return 0; |
| } |
| |
| uint32_t v_s; |
| |
| v_s = (4294967295 ^ self->private_impl.f_state); |
| { |
| wuffs_base__slice_u8 i_slice_p = a_x; |
| wuffs_base__slice_u8 v_p = i_slice_p; |
| v_p.len = 8; |
| uint8_t* i_end0_p = i_slice_p.ptr + (i_slice_p.len / 64) * 64; |
| while (v_p.ptr < i_end0_p) { |
| v_s ^= |
| ((((uint32_t)(v_p.ptr[0])) << 0) | (((uint32_t)(v_p.ptr[1])) << 8) | |
| (((uint32_t)(v_p.ptr[2])) << 16) | (((uint32_t)(v_p.ptr[3])) << 24)); |
| v_s = (wuffs_crc32__ieee_table[0][v_p.ptr[7]] ^ |
| wuffs_crc32__ieee_table[1][v_p.ptr[6]] ^ |
| wuffs_crc32__ieee_table[2][v_p.ptr[5]] ^ |
| wuffs_crc32__ieee_table[3][v_p.ptr[4]] ^ |
| wuffs_crc32__ieee_table[4][(255 & (v_s >> 24))] ^ |
| wuffs_crc32__ieee_table[5][(255 & (v_s >> 16))] ^ |
| wuffs_crc32__ieee_table[6][(255 & (v_s >> 8))] ^ |
| wuffs_crc32__ieee_table[7][(255 & (v_s >> 0))]); |
| v_p.ptr += 8; |
| v_s ^= |
| ((((uint32_t)(v_p.ptr[0])) << 0) | (((uint32_t)(v_p.ptr[1])) << 8) | |
| (((uint32_t)(v_p.ptr[2])) << 16) | (((uint32_t)(v_p.ptr[3])) << 24)); |
| v_s = (wuffs_crc32__ieee_table[0][v_p.ptr[7]] ^ |
| wuffs_crc32__ieee_table[1][v_p.ptr[6]] ^ |
| wuffs_crc32__ieee_table[2][v_p.ptr[5]] ^ |
| wuffs_crc32__ieee_table[3][v_p.ptr[4]] ^ |
| wuffs_crc32__ieee_table[4][(255 & (v_s >> 24))] ^ |
| wuffs_crc32__ieee_table[5][(255 & (v_s >> 16))] ^ |
| wuffs_crc32__ieee_table[6][(255 & (v_s >> 8))] ^ |
| wuffs_crc32__ieee_table[7][(255 & (v_s >> 0))]); |
| v_p.ptr += 8; |
| v_s ^= |
| ((((uint32_t)(v_p.ptr[0])) << 0) | (((uint32_t)(v_p.ptr[1])) << 8) | |
| (((uint32_t)(v_p.ptr[2])) << 16) | (((uint32_t)(v_p.ptr[3])) << 24)); |
| v_s = (wuffs_crc32__ieee_table[0][v_p.ptr[7]] ^ |
| wuffs_crc32__ieee_table[1][v_p.ptr[6]] ^ |
| wuffs_crc32__ieee_table[2][v_p.ptr[5]] ^ |
| wuffs_crc32__ieee_table[3][v_p.ptr[4]] ^ |
| wuffs_crc32__ieee_table[4][(255 & (v_s >> 24))] ^ |
| wuffs_crc32__ieee_table[5][(255 & (v_s >> 16))] ^ |
| wuffs_crc32__ieee_table[6][(255 & (v_s >> 8))] ^ |
| wuffs_crc32__ieee_table[7][(255 & (v_s >> 0))]); |
| v_p.ptr += 8; |
| v_s ^= |
| ((((uint32_t)(v_p.ptr[0])) << 0) | (((uint32_t)(v_p.ptr[1])) << 8) | |
| (((uint32_t)(v_p.ptr[2])) << 16) | (((uint32_t)(v_p.ptr[3])) << 24)); |
| v_s = (wuffs_crc32__ieee_table[0][v_p.ptr[7]] ^ |
| wuffs_crc32__ieee_table[1][v_p.ptr[6]] ^ |
| wuffs_crc32__ieee_table[2][v_p.ptr[5]] ^ |
| wuffs_crc32__ieee_table[3][v_p.ptr[4]] ^ |
| wuffs_crc32__ieee_table[4][(255 & (v_s >> 24))] ^ |
| wuffs_crc32__ieee_table[5][(255 & (v_s >> 16))] ^ |
| wuffs_crc32__ieee_table[6][(255 & (v_s >> 8))] ^ |
| wuffs_crc32__ieee_table[7][(255 & (v_s >> 0))]); |
| v_p.ptr += 8; |
| v_s ^= |
| ((((uint32_t)(v_p.ptr[0])) << 0) | (((uint32_t)(v_p.ptr[1])) << 8) | |
| (((uint32_t)(v_p.ptr[2])) << 16) | (((uint32_t)(v_p.ptr[3])) << 24)); |
| v_s = (wuffs_crc32__ieee_table[0][v_p.ptr[7]] ^ |
| wuffs_crc32__ieee_table[1][v_p.ptr[6]] ^ |
| wuffs_crc32__ieee_table[2][v_p.ptr[5]] ^ |
| wuffs_crc32__ieee_table[3][v_p.ptr[4]] ^ |
| wuffs_crc32__ieee_table[4][(255 & (v_s >> 24))] ^ |
| wuffs_crc32__ieee_table[5][(255 & (v_s >> 16))] ^ |
| wuffs_crc32__ieee_table[6][(255 & (v_s >> 8))] ^ |
| wuffs_crc32__ieee_table[7][(255 & (v_s >> 0))]); |
| v_p.ptr += 8; |
| v_s ^= |
| ((((uint32_t)(v_p.ptr[0])) << 0) | (((uint32_t)(v_p.ptr[1])) << 8) | |
| (((uint32_t)(v_p.ptr[2])) << 16) | (((uint32_t)(v_p.ptr[3])) << 24)); |
| v_s = (wuffs_crc32__ieee_table[0][v_p.ptr[7]] ^ |
| wuffs_crc32__ieee_table[1][v_p.ptr[6]] ^ |
| wuffs_crc32__ieee_table[2][v_p.ptr[5]] ^ |
| wuffs_crc32__ieee_table[3][v_p.ptr[4]] ^ |
| wuffs_crc32__ieee_table[4][(255 & (v_s >> 24))] ^ |
| wuffs_crc32__ieee_table[5][(255 & (v_s >> 16))] ^ |
| wuffs_crc32__ieee_table[6][(255 & (v_s >> 8))] ^ |
| wuffs_crc32__ieee_table[7][(255 & (v_s >> 0))]); |
| v_p.ptr += 8; |
| v_s ^= |
| ((((uint32_t)(v_p.ptr[0])) << 0) | (((uint32_t)(v_p.ptr[1])) << 8) | |
| (((uint32_t)(v_p.ptr[2])) << 16) | (((uint32_t)(v_p.ptr[3])) << 24)); |
| v_s = (wuffs_crc32__ieee_table[0][v_p.ptr[7]] ^ |
| wuffs_crc32__ieee_table[1][v_p.ptr[6]] ^ |
| wuffs_crc32__ieee_table[2][v_p.ptr[5]] ^ |
| wuffs_crc32__ieee_table[3][v_p.ptr[4]] ^ |
| wuffs_crc32__ieee_table[4][(255 & (v_s >> 24))] ^ |
| wuffs_crc32__ieee_table[5][(255 & (v_s >> 16))] ^ |
| wuffs_crc32__ieee_table[6][(255 & (v_s >> 8))] ^ |
| wuffs_crc32__ieee_table[7][(255 & (v_s >> 0))]); |
| v_p.ptr += 8; |
| v_s ^= |
| ((((uint32_t)(v_p.ptr[0])) << 0) | (((uint32_t)(v_p.ptr[1])) << 8) | |
| (((uint32_t)(v_p.ptr[2])) << 16) | (((uint32_t)(v_p.ptr[3])) << 24)); |
| v_s = (wuffs_crc32__ieee_table[0][v_p.ptr[7]] ^ |
| wuffs_crc32__ieee_table[1][v_p.ptr[6]] ^ |
| wuffs_crc32__ieee_table[2][v_p.ptr[5]] ^ |
| wuffs_crc32__ieee_table[3][v_p.ptr[4]] ^ |
| wuffs_crc32__ieee_table[4][(255 & (v_s >> 24))] ^ |
| wuffs_crc32__ieee_table[5][(255 & (v_s >> 16))] ^ |
| wuffs_crc32__ieee_table[6][(255 & (v_s >> 8))] ^ |
| wuffs_crc32__ieee_table[7][(255 & (v_s >> 0))]); |
| v_p.ptr += 8; |
| } |
| v_p.len = 8; |
| uint8_t* i_end1_p = i_slice_p.ptr + (i_slice_p.len / 8) * 8; |
| while (v_p.ptr < i_end1_p) { |
| v_s ^= |
| ((((uint32_t)(v_p.ptr[0])) << 0) | (((uint32_t)(v_p.ptr[1])) << 8) | |
| (((uint32_t)(v_p.ptr[2])) << 16) | (((uint32_t)(v_p.ptr[3])) << 24)); |
| v_s = (wuffs_crc32__ieee_table[0][v_p.ptr[7]] ^ |
| wuffs_crc32__ieee_table[1][v_p.ptr[6]] ^ |
| wuffs_crc32__ieee_table[2][v_p.ptr[5]] ^ |
| wuffs_crc32__ieee_table[3][v_p.ptr[4]] ^ |
| wuffs_crc32__ieee_table[4][(255 & (v_s >> 24))] ^ |
| wuffs_crc32__ieee_table[5][(255 & (v_s >> 16))] ^ |
| wuffs_crc32__ieee_table[6][(255 & (v_s >> 8))] ^ |
| wuffs_crc32__ieee_table[7][(255 & (v_s >> 0))]); |
| v_p.ptr += 8; |
| } |
| v_p.len = 1; |
| uint8_t* i_end2_p = i_slice_p.ptr + (i_slice_p.len / 1) * 1; |
| while (v_p.ptr < i_end2_p) { |
| v_s = |
| (wuffs_crc32__ieee_table[0][(((uint8_t)((v_s & 255))) ^ v_p.ptr[0])] ^ |
| (v_s >> 8)); |
| v_p.ptr += 1; |
| } |
| } |
| self->private_impl.f_state = (4294967295 ^ v_s); |
| return self->private_impl.f_state; |
| } |