| // After editing this file, run "go generate" in this directory. |
| |
| #ifndef PUFFS_BASE_HEADER_H |
| #define PUFFS_BASE_HEADER_H |
| |
| // Copyright 2017 The Puffs 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> |
| |
| // Puffs requires a word size of at least 32 bits because it assumes that |
| // converting a u32 to usize will never overflow. For example, the size of a |
| // decoded image is often represented, explicitly or implicitly in an image |
| // file, as a u32, and it is convenient to compare that to a buffer size. |
| // |
| // Similarly, the word size is at most 64 bits because it assumes that |
| // converting a usize to u64 will never overflow. |
| #if __WORDSIZE < 32 |
| #error "Puffs requires a word size of at least 32 bits" |
| #elif __WORDSIZE > 64 |
| #error "Puffs requires a word size of at most 64 bits" |
| #endif |
| |
| // PUFFS_VERSION is the major.minor version number as a uint32. 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 PUFFS_VERSION (0x00001) |
| |
| // puffs_base_slice_u8 is a 1-dimensional buffer (a pointer and length). |
| // |
| // A value with all fields NULL or zero is a valid, empty slice. |
| typedef struct { |
| uint8_t* ptr; |
| size_t len; |
| } puffs_base_slice_u8; |
| |
| // puffs_base_buf1 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. |
| } puffs_base_buf1; |
| |
| // puffs_base_limit1 provides a limited view of a 1-dimensional byte stream: |
| // its first N bytes. That N can be greater than a buffer's current read or |
| // write capacity. N decreases naturally over time as bytes are read from or |
| // written to the stream. |
| // |
| // A value with all fields NULL or zero is a valid, unlimited view. |
| typedef struct puffs_base_limit1 { |
| uint64_t* ptr_to_len; // Pointer to N. |
| struct puffs_base_limit1* next; // Linked list of limits. |
| } puffs_base_limit1; |
| |
| typedef struct { |
| puffs_base_buf1* buf; |
| puffs_base_limit1 limit; |
| } puffs_base_reader1; |
| |
| typedef struct { |
| puffs_base_buf1* buf; |
| puffs_base_limit1 limit; |
| } puffs_base_writer1; |
| |
| #endif // PUFFS_BASE_HEADER_H |