aboutsummaryrefslogtreecommitdiffstats
path: root/prism/pack.h
diff options
context:
space:
mode:
authorKevin Newton <kddnewton@gmail.com>2023-09-27 12:22:36 -0400
committerKevin Newton <kddnewton@gmail.com>2023-09-27 13:57:38 -0400
commit8ab56869a64fdccc094f4a83c6367fb23b72d38b (patch)
tree46ef2bd5c51d5b7f923eda6a60edefc7a08200db /prism/pack.h
parent7e0971eb5d679bb6219abb0ec238139aa6502c5a (diff)
downloadruby-8ab56869a64fdccc094f4a83c6367fb23b72d38b.tar.gz
Rename YARP filepaths to prism filepaths
Diffstat (limited to 'prism/pack.h')
-rw-r--r--prism/pack.h141
1 files changed, 141 insertions, 0 deletions
diff --git a/prism/pack.h b/prism/pack.h
new file mode 100644
index 0000000000..9d6204bf7b
--- /dev/null
+++ b/prism/pack.h
@@ -0,0 +1,141 @@
+#ifndef YARP_PACK_H
+#define YARP_PACK_H
+
+#include "yarp/defines.h"
+
+#include <stdint.h>
+#include <stdlib.h>
+
+typedef enum yp_pack_version {
+ YP_PACK_VERSION_3_2_0
+} yp_pack_version;
+
+typedef enum yp_pack_variant {
+ YP_PACK_VARIANT_PACK,
+ YP_PACK_VARIANT_UNPACK
+} yp_pack_variant;
+
+typedef enum yp_pack_type {
+ YP_PACK_SPACE,
+ YP_PACK_COMMENT,
+ YP_PACK_INTEGER,
+ YP_PACK_UTF8,
+ YP_PACK_BER,
+ YP_PACK_FLOAT,
+ YP_PACK_STRING_SPACE_PADDED,
+ YP_PACK_STRING_NULL_PADDED,
+ YP_PACK_STRING_NULL_TERMINATED,
+ YP_PACK_STRING_MSB,
+ YP_PACK_STRING_LSB,
+ YP_PACK_STRING_HEX_HIGH,
+ YP_PACK_STRING_HEX_LOW,
+ YP_PACK_STRING_UU,
+ YP_PACK_STRING_MIME,
+ YP_PACK_STRING_BASE64,
+ YP_PACK_STRING_FIXED,
+ YP_PACK_STRING_POINTER,
+ YP_PACK_MOVE,
+ YP_PACK_BACK,
+ YP_PACK_NULL,
+ YP_PACK_END
+} yp_pack_type;
+
+typedef enum yp_pack_signed {
+ YP_PACK_UNSIGNED,
+ YP_PACK_SIGNED,
+ YP_PACK_SIGNED_NA
+} yp_pack_signed;
+
+typedef enum yp_pack_endian {
+ YP_PACK_AGNOSTIC_ENDIAN,
+ YP_PACK_LITTLE_ENDIAN, // aka 'VAX', or 'V'
+ YP_PACK_BIG_ENDIAN, // aka 'network', or 'N'
+ YP_PACK_NATIVE_ENDIAN,
+ YP_PACK_ENDIAN_NA
+} yp_pack_endian;
+
+typedef enum yp_pack_size {
+ YP_PACK_SIZE_SHORT,
+ YP_PACK_SIZE_INT,
+ YP_PACK_SIZE_LONG,
+ YP_PACK_SIZE_LONG_LONG,
+ YP_PACK_SIZE_8,
+ YP_PACK_SIZE_16,
+ YP_PACK_SIZE_32,
+ YP_PACK_SIZE_64,
+ YP_PACK_SIZE_P,
+ YP_PACK_SIZE_NA
+} yp_pack_size;
+
+typedef enum yp_pack_length_type {
+ YP_PACK_LENGTH_FIXED,
+ YP_PACK_LENGTH_MAX,
+ YP_PACK_LENGTH_RELATIVE, // special case for unpack @*
+ YP_PACK_LENGTH_NA
+} yp_pack_length_type;
+
+typedef enum yp_pack_encoding {
+ YP_PACK_ENCODING_START,
+ YP_PACK_ENCODING_ASCII_8BIT,
+ YP_PACK_ENCODING_US_ASCII,
+ YP_PACK_ENCODING_UTF_8
+} yp_pack_encoding;
+
+typedef enum yp_pack_result {
+ YP_PACK_OK,
+ YP_PACK_ERROR_UNSUPPORTED_DIRECTIVE,
+ YP_PACK_ERROR_UNKNOWN_DIRECTIVE,
+ YP_PACK_ERROR_LENGTH_TOO_BIG,
+ YP_PACK_ERROR_BANG_NOT_ALLOWED,
+ YP_PACK_ERROR_DOUBLE_ENDIAN
+} yp_pack_result;
+
+// Parse a single directive from a pack or unpack format string.
+//
+// Parameters:
+// - [in] yp_pack_version version the version of Ruby
+// - [in] yp_pack_variant variant pack or unpack
+// - [in out] const char **format the start of the next directive to parse
+// on calling, and advanced beyond the parsed directive on return, or as
+// much of it as was consumed until an error was encountered
+// - [in] const char *format_end the end of the format string
+// - [out] yp_pack_type *type the type of the directive
+// - [out] yp_pack_signed *signed_type
+// whether the value is signed
+// - [out] yp_pack_endian *endian the endianness of the value
+// - [out] yp_pack_size *size the size of the value
+// - [out] yp_pack_length_type *length_type
+// what kind of length is specified
+// - [out] size_t *length the length of the directive
+// - [in out] yp_pack_encoding *encoding
+// takes the current encoding of the string
+// which would result from parsing the whole format string, and returns a
+// possibly changed directive - the encoding should be
+// YP_PACK_ENCODING_START when yp_pack_parse is called for the first
+// directive in a format string
+//
+// Return:
+// - YP_PACK_OK on success
+// - YP_PACK_ERROR_* on error
+//
+// Notes:
+// Consult Ruby documentation for the meaning of directives.
+YP_EXPORTED_FUNCTION yp_pack_result
+yp_pack_parse(
+ yp_pack_variant variant_arg,
+ const char **format,
+ const char *format_end,
+ yp_pack_type *type,
+ yp_pack_signed *signed_type,
+ yp_pack_endian *endian,
+ yp_pack_size *size,
+ yp_pack_length_type *length_type,
+ uint64_t *length,
+ yp_pack_encoding *encoding
+);
+
+// YARP abstracts sizes away from the native system - this converts an abstract
+// size to a native size.
+YP_EXPORTED_FUNCTION size_t yp_size_to_native(yp_pack_size size);
+
+#endif