#include "vg_kv.h"
-void vg_kvs_init( vg_kvs *kvs, vg_stack_allocator *stack )
-{
- vg_zero_mem( kvs, sizeof(vg_kvs) );
- kvs->stack = stack;
-}
-
static vg_kv *vg_kvs_newkv( vg_kvs *kvs )
{
void *kv_page;
return kv;
}
-static u32 vg_kv_string_append( vg_kvs *kvs, const char *string )
+void vg_kvs_init( vg_kvs *kvs, vg_stack_allocator *stack )
+{
+ vg_zero_mem( kvs, sizeof(vg_kvs) );
+ kvs->stack = stack;
+
+ vg_kv *root_kv = vg_kvs_newkv( kvs );
+ kvs->root_offset = vg_stack_offset( kvs->stack, root_kv );
+}
+
+static u32 vg_kv_string_append( vg_kvs *kvs, c8 *string )
{
if( string == NULL )
return 0;
return vg_stack_offset( kvs->stack, buf );
}
-u32 vg_kv_append( vg_kvs *kvs, u32 parent_offset, const char *key, const char *value )
+u32 vg_kv_append( vg_kvs *kvs, u32 parent_offset, c8 *key, c8 *value )
{
vg_kv *kv = vg_kvs_newkv( kvs );
u32 key_offset = vg_kv_string_append( kvs, key ),
return kv_offset;
}
-void vg_kv_parser_init( vg_kv_parser *parser, vg_kvs *out_kvs )
+void vg_kv_parser_init( vg_kv_parser *parser, vg_kvs *out_kvs, u32 root_offset )
{
+ VG_ASSERT( out_kvs->stack );
+ VG_ASSERT( out_kvs->kv_page_count );
+
vg_zero_mem( parser, sizeof(vg_kv_parser) );
parser->kvs = out_kvs;
-
- vg_kv *root_kv = vg_kvs_newkv( parser->kvs );
- out_kvs->root_offset = vg_stack_offset( parser->kvs->stack, root_kv );
- parser->frame_stack[0].frame_offset = out_kvs->root_offset;
+ parser->frame_stack[0].frame_offset = root_offset;
}
void vg_kv_link( vg_kv_parser *parser, u32 offset, u32 depth )
parser->frame_stack[ depth ].latest_child_offset = offset;
}
-void vg_kv_parse_buffer( vg_kv_parser *parser, const char *buffer, u32 buffer_length )
+void vg_kv_parse_buffer( vg_kv_parser *parser, c8 *buffer, u32 buffer_length )
{
if( buffer_length == 0 )
buffer_length = 0xffffffff;
return (kv->key_info >> 30) & 0x3;
}
-const char *vg_kv_key( vg_kvs *kvs, u32 kv_offset, u32 *out_length )
+c8 *vg_kv_key( vg_kvs *kvs, u32 kv_offset, u32 *out_length )
{
vg_kv *kv = vg_stack_pointer( kvs->stack, kv_offset );
*out_length = (kv->key_info >> 20) & 0x3FF;
return (*out_length)? vg_stack_pointer( kvs->stack, kv->key_offset ): NULL;
}
-const char *vg_kv_value( vg_kvs *kvs, u32 kv_offset, u32 *out_length )
+c8 *vg_kv_value( vg_kvs *kvs, u32 kv_offset, u32 *out_length )
{
if( vg_kv_type( kvs, kv_offset ) == 0x0 )
return NULL;
else return 0;
}
-u32 vg_kv_find( vg_kvs *kvs, u32 root_offset, const char *key )
+u32 vg_kv_find( vg_kvs *kvs, u32 root_offset, c8 *key )
{
u32 hash = vg_strdjb2( key );
u32 child_offset = vg_kv_child( kvs, root_offset, 0 );
{
vg_kv *kv = vg_stack_pointer( kvs->stack, child_offset );
u32 key_length;
- const char *child_key = vg_kv_key( kvs, child_offset, &key_length );
+ c8 *child_key = vg_kv_key( kvs, child_offset, &key_length );
if( ((kv->key_info ^ hash) & 0xFFFFF) == 0 )
{
u32 key_length;
- const char *child_key = vg_kv_key( kvs, child_offset, &key_length );
+ c8 *child_key = vg_kv_key( kvs, child_offset, &key_length );
if( child_key )
{
for( u32 i=0; i<key_length; i ++ )
fputc( ' ', w->fp );
}
-static void vg_kv_write_string( vg_kv_write *w, const char *string, u32 length )
+static void vg_kv_write_string( vg_kv_write *w, c8 *string, u32 length )
{
if( length == 0 )
length = 0xffffffff;
if( delim ) fputc( delim, w->fp );
}
-void vg_kv_write_block( vg_kv_write *w, const char *name, u32 name_length )
+void vg_kv_write_block( vg_kv_write *w, c8 *name, u32 name_length )
{
vg_kv_write_indent( w );
if( name )
fputc( '\n', w->fp );
}
-void vg_kv_write_kv( vg_kv_write *w, const char *key, u32 key_len, const char *value, u32 value_len )
+void vg_kv_write_kv( vg_kv_write *w, c8 *key, u32 key_len, c8 *value, u32 value_len )
{
vg_kv_write_indent( w );
vg_kv_write_string( w, key, key_len );
VG_ASSERT( vg_kv_type( kvs, root_offset ) == 0x0 );
u32 root_len;
- const char *root_str = vg_kv_key( kvs, root_offset, &root_len );
+ c8 *root_str = vg_kv_key( kvs, root_offset, &root_len );
vg_kv_write_block( w, root_str, root_len );
u32 child_offset = vg_kv_child( kvs, root_offset, 0 );
else
{
u32 key_len;
- const char *key_str = vg_kv_key( kvs, child_offset, &key_len );
+ c8 *key_str = vg_kv_key( kvs, child_offset, &key_len );
u32 value_len;
- const char *value_str = vg_kv_value( kvs, child_offset, &value_len );
+ c8 *value_str = vg_kv_value( kvs, child_offset, &value_len );
if( key_str && value_str )
vg_kv_write_kv( w, key_str, key_len, value_str, value_len );
#define VG_KV_PAGE_COUNT 32
-/* define VG_KV_SUPPORT_LEGACY_MSG to automatically convert from old vg_msg stream to plain text KVs */
+/* define VG_MSG_TO_KVS to automatically convert from old vg_msg stream to plain text KVs */
typedef struct vg_kv vg_kv;
typedef struct vg_kvs vg_kvs;
*
* vg_kv_parse_buffer takes a text buffer, if its null terminated, buffer_length can be 0
*/
-void vg_kv_parser_init( vg_kv_parser *parser, vg_kvs *out_kvs );
-void vg_kv_parse_buffer( vg_kv_parser *parser, const char *buffer, u32 buffer_length );
+void vg_kv_parser_init( vg_kv_parser *parser, vg_kvs *out_kvs, u32 root_offset );
+void vg_kv_parse_buffer( vg_kv_parser *parser, c8 *buffer, u32 buffer_length );
void vg_kv_link( vg_kv_parser *parser, u32 offset, u32 depth );
/* returns the type of this KV.
u32 vg_kv_type( vg_kvs *kvs, u32 kv_offset );
/* get key / values associated with KV pair or only key for a frame. */
-const char *vg_kv_key( vg_kvs *kvs, u32 kv_offset, u32 *out_length );
-const char *vg_kv_value( vg_kvs *kvs, u32 kv_offset, u32 *out_length );
+c8 *vg_kv_key( vg_kvs *kvs, u32 kv_offset, u32 *out_length );
+c8 *vg_kv_value( vg_kvs *kvs, u32 kv_offset, u32 *out_length );
/* get the child KV at index, returns 0 if out of range */
u32 vg_kv_child( vg_kvs *kvs, u32 root_offset, u32 index );
u32 vg_kv_next( vg_kvs *kvs, u32 kv_offset );
-u32 vg_kv_find( vg_kvs *kvs, u32 root_offset, const char *key );
+u32 vg_kv_find( vg_kvs *kvs, u32 root_offset, c8 *key );
/* editing kvs
* if value is NULL, it appends a named frame
* if both key and value are set, it appends a KV pair
* returns the new KV offset
*/
-u32 vg_kv_append( vg_kvs *kvs, u32 parent_offset, const char *key, const char *value );
+u32 vg_kv_append( vg_kvs *kvs, u32 parent_offset, c8 *key, c8 *value );
/* Writing KV files. w should be initialized with depth 0, and fp to a valid C stream pointer */
-void vg_kv_write_block( vg_kv_write *w, const char *name, u32 name_length );
+void vg_kv_write_block( vg_kv_write *w, c8 *name, u32 name_length );
void vg_kv_end_block( vg_kv_write *w );
-void vg_kv_write_kv( vg_kv_write *w, const char *key, u32 key_len, const char *value, u32 value_len );
+void vg_kv_write_kv( vg_kv_write *w, c8 *key, u32 key_len, c8 *value, u32 value_len );
/* Just for analysis */
void vg_kv_parser_print_info( vg_kv_parser *parser );
u32 stat_memory_strings,
stat_source_characters;
- char token0_deliminator;
- char *token0_buffer;
+ c8 token0_deliminator;
+ c8 *token0_buffer;
u32 depth;
struct
#include <string.h>
#include <stdio.h>
+#if !defined( VG_MSG_TO_KVS )
/* write a buffer from msg, rang checked. */
void vg_msg_wbuf( vg_msg *msg, u8 *buf, u32 len )
{
msg->buf[ msg->cur.co ++ ] = buf[i];
}
}
+#endif
/* read a buffer from msg, rang checked. */
void vg_msg_rbuf( vg_msg *msg, u8 *buf, u32 len )
}
}
+#if !defined( VG_MSG_TO_KVS )
/* write null terminated string to stream */
void vg_msg_wstr( vg_msg *msg, const char *str )
{
if( !str[i] ) break;
}
}
+#endif
/* read null terminated string, range check and generate hash (djb2) */
const char *vg_msg_rstr( vg_msg *msg, u32 *djb2 )
return str;
}
+#if !defined( VG_MSG_TO_KVS )
/* begin a new frame in message stream */
void vg_msg_frame( vg_msg *msg, const char *name )
{
vg_msg_wbuf( msg, (u8 *)(&len), 4 );
vg_msg_wbuf( msg, bin, len );
}
+#endif
u32 vg_msg_cmd_array_count( u8 code )
{
return ((count-1)<<2);
}
+#if !defined( VG_MSG_TO_KVS )
/* write a sized type */
void vg_msg_wkvnum( vg_msg *msg, const char *key, u8 type, u8 count, void *data )
{
vg_msg_wstr( msg, key );
vg_msg_wbuf( msg, data, vg_msg_cmd_bytecount(code) );
}
+#endif
void vg_msg_init( vg_msg *msg, u8 *buffer, u32 len )
{
return 1;
}
+#if !defined( VG_MSG_TO_KVS )
/* move through the frame(and subframes) until we fall out of it */
int vg_msg_skip_frame( vg_msg *msg )
{
msg->cur = orig;
return 0;
}
+#endif
/*
* Convert any type integral type to u64
return (f64)vg_msg_cast_to_i64( src, src_base, src_size );
}
+#if !defined( VG_MSG_TO_KVS )
/*
* Convert any full integral type code to another
* Passing in non-integral codes is undefined
}
}
}
+#endif
/*
* search in current level from cursor, to find kv cmd
return 0;
}
+#if !defined( VG_MSG_TO_KVS )
/*
* Read a integral KV out to dst, and perform conversion if needed
* dst is always defined, if its not found its set to 0
else
return NULL;
}
+#endif
+#if !defined( VG_MSG_TO_KVS )
int vg_msg_getkvvecf( vg_msg *msg, const char *key, u8 type,
void *v, void *default_value )
{
}
}
}
+#endif
-#ifdef VG_LEGACY_MSG_TO_KVS
+#if defined( VG_MSG_TO_KVS )
#include "vg_kv.h"
-void vg_kvs_append_from_legacy_msg2( vg_kvs *kvs, u32 root, void *buffer, u32 len, vg_stack_allocator *stack )
+bool vg_kvs_append_from_legacy_msg2( vg_kvs *kvs, u32 root, void *buffer, u32 len, vg_stack_allocator *stack )
{
vg_msg b;
vg_msg_init( &b, buffer, len );
if( i+1!=count )
vg_strcatch( &format_str, ' ' );
}
+
+ if( !vg_strgood( &value_str ) )
+ return 0;
+
vg_kv_append( kvs, frame_stack[frame_depth], cmd.key, formatted );
}
}
}
+
+ return 1;
}
#endif