summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c/mfluadir/otfcc/lib/support/bin-io.h
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/web2c/mfluadir/otfcc/lib/support/bin-io.h')
-rw-r--r--Build/source/texk/web2c/mfluadir/otfcc/lib/support/bin-io.h171
1 files changed, 171 insertions, 0 deletions
diff --git a/Build/source/texk/web2c/mfluadir/otfcc/lib/support/bin-io.h b/Build/source/texk/web2c/mfluadir/otfcc/lib/support/bin-io.h
new file mode 100644
index 00000000000..2df14b4506b
--- /dev/null
+++ b/Build/source/texk/web2c/mfluadir/otfcc/lib/support/bin-io.h
@@ -0,0 +1,171 @@
+#ifndef CARYLL_SUPPORT_BIN_IO_H
+#define CARYLL_SUPPORT_BIN_IO_H
+
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#ifndef INLINE
+#ifdef _MSC_VER
+#define INLINE __forceinline /* use __forceinline (VC++ specific) */
+#else
+#define INLINE inline /* use standard inline */
+#endif
+#endif
+
+static INLINE bool otfcc_check_endian(void) {
+ union {
+ uint8_t i1[2];
+ uint16_t i2;
+ } check_union = {.i2 = 1}; // if you don't have a new VC, upgrade it
+
+ return (check_union.i1[0] == 1);
+}
+
+static INLINE uint16_t otfcc_endian_convert16(uint16_t i) {
+ if (otfcc_check_endian()) {
+ union {
+ uint8_t i1[2];
+ uint16_t i2;
+ } src, des;
+
+ src.i2 = i;
+
+ des.i1[0] = src.i1[1];
+ des.i1[1] = src.i1[0];
+
+ return des.i2;
+ } else {
+ return i;
+ }
+}
+
+static INLINE uint32_t otfcc_endian_convert32(uint32_t i) {
+ if (otfcc_check_endian()) {
+ union {
+ uint8_t i1[4];
+ uint32_t i4;
+ } src, des;
+
+ src.i4 = i;
+
+ des.i1[0] = src.i1[3];
+ des.i1[1] = src.i1[2];
+ des.i1[2] = src.i1[1];
+ des.i1[3] = src.i1[0];
+
+ return des.i4;
+ } else {
+ return i;
+ }
+}
+
+static INLINE uint64_t otfcc_endian_convert64(uint64_t i) {
+ if (otfcc_check_endian()) {
+ union {
+ uint8_t i1[8];
+ uint64_t i8;
+ } src, des;
+
+ src.i8 = i;
+
+ des.i1[0] = src.i1[7];
+ des.i1[1] = src.i1[6];
+ des.i1[2] = src.i1[5];
+ des.i1[3] = src.i1[4];
+ des.i1[4] = src.i1[3];
+ des.i1[5] = src.i1[2];
+ des.i1[6] = src.i1[1];
+ des.i1[7] = src.i1[0];
+
+ return des.i8;
+ } else {
+ return i;
+ }
+}
+
+static INLINE uint16_t otfcc_get16u(FILE *file) {
+ uint16_t tmp;
+ size_t sizeRead = fread(&tmp, 2, 1, file);
+ if (!sizeRead) {
+ fprintf(stderr, "File corruption of terminated unexpectedly.\n");
+ exit(EXIT_FAILURE);
+ }
+ return otfcc_endian_convert16(tmp);
+}
+
+static INLINE uint32_t otfcc_get32u(FILE *file) {
+ uint32_t tmp;
+ size_t sizeRead = fread(&tmp, 4, 1, file);
+ if (!sizeRead) {
+ fprintf(stderr, "File corruption of terminated unexpectedly.\n");
+ exit(EXIT_FAILURE);
+ }
+ return otfcc_endian_convert32(tmp);
+}
+
+static INLINE uint64_t otfcc_get64u(FILE *file) {
+ uint64_t tmp;
+ size_t sizeRead = fread(&tmp, 8, 1, file);
+ if (!sizeRead) {
+ fprintf(stderr, "File corruption of terminated unexpectedly.\n");
+ exit(EXIT_FAILURE);
+ }
+ return otfcc_endian_convert64(tmp);
+}
+
+// data reader
+static INLINE uint8_t read_8u(const uint8_t *src) {
+ return src[0];
+}
+static INLINE uint16_t read_16u(const uint8_t *src) {
+ uint16_t b0 = ((uint16_t)src[0]) << 8;
+ uint16_t b1 = ((uint16_t)src[1]);
+ return (b0 | b1);
+}
+static INLINE uint32_t read_24u(const uint8_t *src) {
+ uint32_t b0 = ((uint32_t)src[0]) << 16;
+ uint32_t b1 = ((uint32_t)src[1]) << 8;
+ uint32_t b2 = ((uint32_t)src[2]);
+ return (b0 | b1 | b2);
+}
+static INLINE uint32_t read_32u(const uint8_t *src) {
+ uint32_t b0 = ((uint32_t)src[0]) << 24;
+ uint32_t b1 = ((uint32_t)src[1]) << 16;
+ uint32_t b2 = ((uint32_t)src[2]) << 8;
+ uint32_t b3 = ((uint32_t)src[3]);
+ return (b0 | b1 | b2 | b3);
+}
+static INLINE uint64_t read_64u(const uint8_t *src) {
+ uint64_t b0 = ((uint64_t)src[0]) << 56;
+ uint64_t b1 = ((uint64_t)src[1]) << 48;
+ uint64_t b2 = ((uint64_t)src[2]) << 40;
+ uint64_t b3 = ((uint64_t)src[3]) << 32;
+ uint64_t b4 = ((uint64_t)src[4]) << 24;
+ uint64_t b5 = ((uint64_t)src[5]) << 16;
+ uint64_t b6 = ((uint64_t)src[6]) << 8;
+ uint64_t b7 = ((uint64_t)src[7]);
+ return (b0 | b1 | b2 | b3 | b4 | b5 | b6 | b7);
+}
+static INLINE int8_t read_8s(const uint8_t *src) {
+ return (int8_t)read_8u(src);
+}
+static INLINE int16_t read_16s(const uint8_t *src) {
+ return (int16_t)read_16u(src);
+}
+static INLINE int32_t read_32s(const uint8_t *src) {
+ return (int32_t)read_32u(src);
+}
+static INLINE int64_t read_64s(const uint8_t *src) {
+ return (int64_t)read_64u(src);
+}
+
+static INLINE uint16_t be16(uint16_t x) {
+ return ((x & 0xff) << 8) | ((x & 0xFF00) >> 8);
+}
+static INLINE uint32_t be32(uint32_t x) {
+ return ((x & 0x000000ff) << 24) | ((x & 0x0000FF00) << 8) | ((x & 0x00FF0000) >> 8) |
+ ((x & 0xFF000000) >> 24);
+}
+
+#endif