mirror of
https://github.com/Unidata/netcdf-c.git
synced 2024-11-21 03:13:42 +08:00
176 lines
5.4 KiB
C
176 lines
5.4 KiB
C
#ifndef AST_RUNTIME_H
|
|
#define AST_RUNTIME_H
|
|
|
|
/* These may already be defined */
|
|
#ifdef HAVE_STDINT_H
|
|
#include <stdint.h>
|
|
#else
|
|
typedef unsigned char uint8_t;
|
|
typedef unsigned short uint16_t;
|
|
typedef unsigned int uint32_t;
|
|
typedef unsigned long long uint64_t;
|
|
typedef char int8_t;
|
|
typedef short int16_t;
|
|
typedef int int32_t;
|
|
typedef long long int64_t;
|
|
#endif
|
|
|
|
#ifndef HAVE_STDBOOL_H
|
|
#define true 1
|
|
#define false 0
|
|
#define TRUE 1
|
|
#define FALSE 0
|
|
#endif
|
|
|
|
typedef unsigned int bool_t;
|
|
|
|
typedef struct bytes_t{
|
|
size_t nbytes;
|
|
unsigned char* bytes;
|
|
} bytes_t;
|
|
|
|
/* Define a null value for bytes_t */
|
|
extern bytes_t bytes_t_null;
|
|
|
|
/* Define error codes */
|
|
typedef int ast_err;
|
|
#define AST_NOERR 0
|
|
#define AST_EOF (-1)
|
|
#define AST_ENOMEM (-2)
|
|
#define AST_EFAIL (-3)
|
|
#define AST_EIO (-4)
|
|
#define AST_ECURL (-5)
|
|
|
|
/* Define primitive types enum */
|
|
typedef enum ast_sort {
|
|
ast_double,
|
|
ast_float,
|
|
ast_int32,
|
|
ast_int64,
|
|
ast_uint32,
|
|
ast_uint64,
|
|
ast_sint32,
|
|
ast_sint64,
|
|
ast_fixed32,
|
|
ast_fixed64,
|
|
ast_sfixed32,
|
|
ast_sfixed64,
|
|
ast_string,
|
|
ast_bytes,
|
|
ast_bool,
|
|
ast_enum,
|
|
ast_message
|
|
} ast_sort;
|
|
|
|
/* Define wiretypes */
|
|
typedef enum ast_wiretype {
|
|
ast_varint = 0, /* int32, int64, uint32, uint64, sint32, sint64, bool, enum*/
|
|
ast_64bit = 1, /* fixed64, sfixed64, double*/
|
|
ast_counted = 2, /* Length-delimited: string, bytes, embedded messages, packed repeated fields*/
|
|
ast_startgroup = 3, /* Start group (deprecated) */
|
|
ast_endgroup = 4, /* end group (deprecated) */
|
|
ast_32bit = 5, /* fixed32, sfixed32, float*/
|
|
} ast_wiretype;
|
|
|
|
/* Define the field modes */
|
|
typedef enum ast_fieldmode {
|
|
ast_required = 0,
|
|
ast_optional = 1,
|
|
ast_repeated = 2,
|
|
} ast_fieldmode;
|
|
|
|
/* Max depth of the message tree */
|
|
#define MAX_STACK_SIZE 1024
|
|
|
|
typedef enum ast_iomode {AST_READ, AST_WRITE, AST_FREE} ast_iomode;
|
|
|
|
/* Forward */
|
|
typedef struct ast_runtime_ops ast_runtime_ops;
|
|
|
|
typedef struct ast_runtime {
|
|
unsigned long long uid; /* unique number identifying who created runtime object: e.g. bytesio */
|
|
ast_iomode mode; /* Write/Read/Free (WRF) */
|
|
ast_runtime_ops* ops;
|
|
void* stream; /* data representing stream */
|
|
int err;
|
|
} ast_runtime;
|
|
|
|
struct ast_runtime_ops {
|
|
size_t (*write)(ast_runtime*,size_t,uint8_t*); /* writes stream n bytes at a time */
|
|
size_t (*read)(ast_runtime*,size_t,uint8_t*); /* reads stream n bytes at a time */
|
|
ast_err (*mark)(ast_runtime*,size_t); /* limit reads to n bytes */
|
|
ast_err (*unmark)(ast_runtime*); /* restore previous markn limit */
|
|
ast_err (*reclaim)(ast_runtime*); /* reclaim this runtime instance */
|
|
void* (*alloc)(ast_runtime*,size_t); /* allocate & clear memory chunk */
|
|
void (*free)(ast_runtime*,void*); /* free allocated memory */
|
|
};
|
|
|
|
/* Wrappers for rt->mark and unmark */
|
|
extern ast_err ast_mark(ast_runtime* rt, size_t avail);
|
|
extern ast_err ast_unmark(ast_runtime* rt);
|
|
extern void* ast_alloc(ast_runtime*,size_t); /* allocated zero'd memory */
|
|
extern void ast_free(ast_runtime*,void*);
|
|
|
|
extern size_t ast_ctypesize(ast_runtime* rt, ast_sort sort);
|
|
|
|
/* Define the primitive W/R/F functions */
|
|
|
|
extern ast_err ast_read_primitive(ast_runtime*, const ast_sort, const int fieldno, void* val);
|
|
extern ast_err ast_write_primitive(ast_runtime*, const ast_sort, const int fieldno, const void* val);
|
|
|
|
extern ast_err ast_read_enum(ast_runtime*, const ast_sort, const int fieldno, void* val);
|
|
|
|
extern ast_err ast_read_primitive_packed(ast_runtime*, const ast_sort, const int fieldno, void* val);
|
|
extern ast_err ast_write_primitive_packed(ast_runtime*, const ast_sort, const int fieldno, const void* val);
|
|
|
|
/* Append + extend a REPEAT field */
|
|
extern ast_err ast_repeat_append(ast_runtime*,ast_sort,void*,void*);
|
|
|
|
/* Procedure to write out tag */
|
|
extern ast_err ast_write_tag(ast_runtime*, const unsigned int, const unsigned int);
|
|
|
|
/* Procedure to write out count */
|
|
extern ast_err ast_write_size(ast_runtime*, const size_t);
|
|
|
|
/* Procedure to extract tags */
|
|
extern ast_err ast_read_tag(ast_runtime* rt, uint32_t* wiretypep, uint32_t* fieldnop);
|
|
|
|
/* Procedure to extract count */
|
|
extern ast_err ast_read_size(ast_runtime* rt, size_t* countp);
|
|
|
|
/* Procedure to skip an unknown field */
|
|
extern ast_err ast_skip_field(ast_runtime* rt, int wiretype, int fieldno);
|
|
|
|
/* Reclaim a runtime instance */
|
|
extern ast_err ast_reclaim(ast_runtime* rt);
|
|
#define ast_close ast_reclaim /*alias*/
|
|
|
|
/* Reclaim an allocated string or bytes_t */
|
|
extern ast_err ast_reclaim_string(ast_runtime* rt, char* value);
|
|
extern ast_err ast_reclaim_bytes(ast_runtime* rt, bytes_t* value);
|
|
|
|
/* Procedure to calulate size of a tag */
|
|
extern size_t ast_get_tagsize(ast_runtime*,ast_sort,int);
|
|
|
|
/* Procedure to calulate size of a value */
|
|
extern size_t ast_get_size(ast_runtime*, ast_sort, void*);
|
|
|
|
/**************************************************/
|
|
/* Misc. */
|
|
extern const char* ast_strerror(ast_err err);
|
|
extern void ast_logset(int tf);
|
|
extern void ast_log(const char* fmt, ...);
|
|
|
|
|
|
/**************************************************/
|
|
/* IO */
|
|
/**************************************************/
|
|
|
|
extern ast_runtime_ops ast_runtime_getopts(ast_runtime*);
|
|
extern ast_err ast_runtime_setopts(ast_runtime*, ast_runtime_ops*);
|
|
|
|
/* Create a runtime readers and writers backed by a byte buffer */
|
|
extern ast_err ast_runtime_bytes(void* buffer, size_t bufferlen, ast_iomode, ast_runtime** astp);
|
|
|
|
#endif /*AST_RUNTIME_H*/
|