#ifndef __NETBYTES_H #define __NETBYTES_H #ifdef __cplusplus extern "C" { #endif #include #include #include #include #include #include #include /* types that are supported */ #define NBT_NONE 0x00 /* maybe not yet prepared type */ #define NBT_U8 0x01 /* single unsigned 8 bits */ #define NBT_U8ARRAY 0x02 /* u8 array */ #define NBT_U16 0x03 /* unsigned 16 bit */ #define NBT_U16ARRAY 0x04 /* u16 array */ #define NBT_U32 0x05 /* unsigned 32 bit */ #define NBT_U32ARRAY 0x06 /* u32 array */ #define NBT_U64 0x07 /* unsigned 64 bit */ #define NBT_U64ARRAY 0x08 /* u64 array */ #define NBT_I8 0x09 /* signed 8 bits */ #define NBT_I8ARRAY 0x0A /* i8 array */ #define NBT_I16 0x0B /* signed 16bits */ #define NBT_I16ARRAY 0x0C /* i16 array */ #define NBT_I32 0x0D /* signed 32 bits */ #define NBT_I32ARRAY 0x0E /* i32 array */ #define NBT_I64 0x0F /* signed 64 bits */ #define NBT_I64ARRAY 0x10 /* i64 array */ #define NBT_F16 0x11 /**/ #define NBT_F32 0x12 /**/ #define NBT_F64 0x13 /**/ #define NBT_F80 0x14 /**/ #define NBT_NULL 0x15 /* official empty type */ #define NBT_LIST 0x16 /* list of data */ /* data typed used */ #define __NBT_SIZE uint32_t #define __NBT_TYPED uint8_t #define __NBT_U8ARR_LEN uint16_t #define __NBT_U16ARR_LEN uint16_t #define __NBT_U32ARR_LEN uint16_t #define __NBT_U64ARR_LEN uint16_t #define __NBT_MINIMAL_SIZE (sizeof(__NBT_SIZE)) #define __NBT_MAX_TYPES (256) //creating netbyte structure typedef struct __attribute__((packed)) __nb_type { __NBT_TYPED type; uint8_t *nb_val; } __nb_type ; typedef struct __attribute__((packed)) netbyte_store { __NBT_SIZE size; int count; __nb_type types[__NBT_MAX_TYPES]; } netbyte_store; typedef struct __attribute__((packed)) nb_u8 { __NBT_TYPED type; uint8_t val; } nb_u8; typedef struct __attribute__((packed)) nb_u8arr { __NBT_TYPED type; __NBT_U8ARR_LEN len; uint8_t *val; } nb_u8arr; /*-----------------*/ typedef struct __attribute__((packed)) nb_u16 { __NBT_TYPED type; uint16_t val; } nb_u16; typedef struct __attribute__((packed)) nb_u16arr { __NBT_TYPED type; __NBT_U16ARR_LEN len; uint16_t *val; } nb_u16arr; /*-----------------*/ typedef struct __attribute__((packed)) nb_u32 { __NBT_TYPED type; uint32_t val; } nb_u32; typedef struct __attribute__((packed)) nb_u32arr { __NBT_TYPED type; __NBT_U32ARR_LEN len; uint32_t *val; } nb_u32arr; /*------------------*/ typedef struct __attribute__((packed)) nb_u64 { __NBT_TYPED type; uint64_t val; } nb_u64; typedef struct __attribute__((packed)) nb_u64arr { __NBT_TYPED type; __NBT_U64ARR_LEN len; uint64_t *val; } nb_u64arr; //loading/parsing netbyte structure typedef struct __attribute__((packed)) netbyte_load { __NBT_SIZE size; uint8_t *buf; } netbyte_load; typedef struct nb_tok { int sign; int type_size; int len; int arr; } nb_tok; typedef struct nb_tok_arr { int size; int len; nb_tok *tok; } nb_tok_arr; int nb_u8_create( nb_u8 *s, uint8_t val ); int nb_u8arr_create( nb_u8arr *s, __NBT_U8ARR_LEN len, uint8_t *val ); int nb_u16_create( nb_u16 *s, uint16_t val ); int nb_u16arr_create( nb_u16arr *s, __NBT_U16ARR_LEN len, uint16_t *val ); int nb_u32_create( nb_u32 *s, uint32_t val ); int nb_u32arr_create( nb_u32arr *s, __NBT_U32ARR_LEN len, uint32_t *val ); int nb_u64_create( nb_u64 *s, uint64_t val ); int nb_u64arr_create( nb_u64arr *s, __NBT_U64ARR_LEN len, uint64_t *val ); int nb_init( netbyte_store *store ); int nb_add_u8( netbyte_store *store, nb_u8 *u8 ); int nb_add_u8arr( netbyte_store *store, nb_u8arr *u8arr ); int nb_add_u16( netbyte_store *store, nb_u16 *u16 ); int nb_add_u16arr( netbyte_store *store, nb_u16arr *u16arr ); int nb_add_u32( netbyte_store *store, nb_u32 *u32 ); int nb_add_u32arr( netbyte_store *store, nb_u32arr *u32arr ); int nb_add_u64( netbyte_store *store, nb_u64 *u64 ); int nb_add_u64arr( netbyte_store *store, nb_u64arr *u64arr ); uint8_t *nb_create( netbyte_store *store ); int nb_free(netbyte_store *store); int nb_load( netbyte_store *store, uint8_t *data ); int nb_count( netbyte_store *store ); int nb_type( netbyte_store *store, int count, __NBT_TYPED **type ); int nb_val( netbyte_store *store, int count, __nb_type **type ); int nb_fread( netbyte_store *store, int fd); /*check if data may contain full netbyte buffer*/ int nb_check_buf(uint8_t *data, int len, int *detected_size); //print all all values in netbyte string int nb_print(netbyte_store *store); /* check if netbyte matches particular format -1 err 1 not match 0 match */ int nb_match(netbyte_store *store, nb_tok_arr *pattern); #define SIGN_UNSIGNED 1 #define SIGN_SIGNED 2 nb_tok_arr *nb_tok_create(int size); int nb_tok_add(nb_tok_arr *arr, int sign, int type_size, int len, int farr); void nb_tok_destroy(nb_tok_arr *arr); int nb_parse(char *str, nb_tok_arr *arr); #ifdef __cplusplus } #endif #endif