* returns number of tokens
* dst must be as long as src
*/
-static int vg_console_tokenize( const char *src, char *dst, const char *args[8] )
+static int vg_console_tokenize( const char *src, char *dst, const char *args[32] )
{
int arg_count = 0,
in_token = 0;
in_token = 0;
- if( arg_count == 8 )
+ if( arg_count == 32 )
break;
}
else
void vg_execute_console_input( const char *cmd, bool silent, bool cheat_override )
{
char temp[512];
- char const *args[8];
+ char const *args[32];
int arg_count = vg_console_tokenize( cmd, temp, args );
if( arg_count == 0 )
return;
char temp[128];
- const char *args[8];
+ const char *args[32];
int token_count = vg_console_tokenize( vg_console.input, temp, args );
if( !token_count ) return;
}
}
+void vg_db_tree_iter_init( vg_db *db, vg_tree_iter *iter, u64 tree_addr )
+{
+ iter->depth = 0;
+ iter->key = 0;
+ iter->value = 0;
+ iter->has_next = 0;
+
+ struct vg_db_address_tree tree;
+ vg_db_read( db, tree_addr, &tree, sizeof(tree) );
+
+ /* go to far left */
+ u64 t_offset = tree.root_node_offset;
+ while( t_offset )
+ {
+ iter->route[ iter->depth ] = t_offset;
+ vg_db_address_node *t_node = &iter->route_nodes[ iter->depth ];
+ vg_db_read( db, t_offset, t_node, sizeof(vg_db_address_node) );
+ t_offset = t_node->left_offset;
+ iter->depth ++;
+ iter->has_next = 1;
+ }
+}
+
+bool vg_db_tree_iter( vg_db *db, vg_tree_iter *iter )
+{
+ if( iter->has_next )
+ {
+ vg_db_address_node *t_node = &iter->route_nodes[ iter->depth-1 ];
+ iter->key = t_node->key;
+ iter->value = t_node->value;
+
+ /* right once, then left all way */
+ if( t_node->right_offset )
+ {
+ u64 t_offset = t_node->right_offset;
+ while( t_offset )
+ {
+ iter->route[ iter->depth ] = t_offset;
+ vg_db_address_node *t_node = &iter->route_nodes[ iter->depth ];
+ vg_db_read( db, t_offset, t_node, sizeof(vg_db_address_node) );
+ t_offset = t_node->left_offset;
+ iter->depth ++;
+ }
+ }
+ else
+ {
+ u64 t_offset = iter->route[ iter->depth-1 ];
+ while(1)
+ {
+ iter->depth --;
+ if( iter->depth == 0 )
+ {
+ iter->has_next = 0;
+ break;
+ }
+
+ if( iter->route_nodes[ iter->depth-1 ].left_offset == t_offset )
+ break;
+ else
+ t_offset = iter->route[ iter->depth-1 ];
+ }
+ }
+
+ return 1;
+ }
+ else return 0;
+}
+
/* Randomized skiplist
* ------------------------------------------------------------------------------------------------------------------ */
/* Dumb table
* ------------------------------------------------------------------------------------------------------------------ */
-void vg_db_dumb_table_init( vg_db *db, u64 table_address, u32 structure_size, u32 max_entries )
+void vg_db_table_init( vg_db *db, u64 table_address, u32 structure_size, u32 max_entries )
{
- vg_db_dumb_table table;
+ vg_db_table table;
vg_db_read( db, table_address, &table, sizeof(table) );
if( table.array_address == 0 )
{
}
}
-u16 vg_db_dumb_table_count( vg_db *db, u64 table_address )
+u16 vg_db_table_count( vg_db *db, u64 table_address )
{
u16 count;
- vg_db_read( db, table_address + offsetof(vg_db_dumb_table,current_entries), &count, sizeof(count) );
+ vg_db_read( db, table_address + offsetof(vg_db_table,current_entries), &count, sizeof(count) );
return count;
}
-u64 vg_db_dumb_table_get( vg_db *db, u64 table_address, u16 index )
+u64 vg_db_table_get( vg_db *db, u64 table_address, u16 index )
{
- vg_db_dumb_table table;
+ vg_db_table table;
vg_db_read( db, table_address, &table, sizeof(table) );
return table.array_address + (u64)index * (u64)table.structure_size;
}
-u64 vg_db_dumb_table_append( vg_db *db, u64 table_address )
+u64 vg_db_table_append( vg_db *db, u64 table_address )
{
- vg_db_dumb_table table;
+ vg_db_table table;
vg_db_read( db, table_address, &table, sizeof(table) );
if( table.current_entries < table.max_entries )
{
typedef struct vg_db_address_cluster vg_db_address_cluster;
typedef struct vg_db_address_node vg_db_address_node;
typedef struct vg_db_address_tree vg_db_address_tree;
-typedef struct vg_db_dumb_table vg_db_dumb_table;
+typedef struct vg_db_table vg_db_table;
typedef struct vg_db_skip vg_db_skip;
typedef struct vg_db_skipper vg_db_skipper;
+typedef struct vg_tree_iter vg_tree_iter;
struct vg_db_address_tree
{
u64 root_node_offset, last_node_offset;
};
-struct vg_db_dumb_table
+struct vg_db_address_cluster
+{
+ u16 count;
+ struct vg_db_address_node
+ {
+ u64 left_offset, right_offset;
+ u64 key, value;
+ u32 level;
+ }
+ entries[];
+};
+
+struct vg_tree_iter
+{
+ u64 route[32];
+ vg_db_address_node route_nodes[32];
+ u32 depth;
+ bool has_next;
+
+ u64 key, value;
+};
+
+struct vg_db_table
{
u16 max_entries, current_entries;
u32 structure_size;
vg_db_address_tree address_tree;
};
-struct vg_db_address_cluster
-{
- u16 count;
- struct vg_db_address_node
- {
- u64 left_offset, right_offset;
- u64 key, value;
- u32 level;
- }
- entries[];
-};
-
struct vg_db_skip
{
u16 links[7];
void vg_db_tree_init( vg_db *db, u64 tree_address );
void vg_db_tree_map( vg_db *db, u64 tree_address, u64 key, u64 value );
u64 vg_db_translate( vg_db *db, u64 tree_address, u64 key );
+void vg_db_tree_iter_init( vg_db *db, vg_tree_iter *iter, u64 tree_addr );
+bool vg_db_tree_iter( vg_db *db, vg_tree_iter *iter );
/* Dumb table - Just an array in virtual address space */
-void vg_db_dumb_table_init( vg_db *db, u64 table_address, u32 structure_size, u32 max_entries );
-u16 vg_db_dumb_table_count( vg_db *db, u64 table_address );
-u64 vg_db_dumb_table_get( vg_db *db, u64 table_address, u16 index );
-u64 vg_db_dumb_table_append( vg_db *db, u64 table_address );
+void vg_db_table_init( vg_db *db, u64 table_address, u32 structure_size, u32 max_entries );
+u16 vg_db_table_count( vg_db *db, u64 table_address );
+u64 vg_db_table_get( vg_db *db, u64 table_address, u16 index );
+u64 vg_db_table_append( vg_db *db, u64 table_address );
/* Skipper - For indexing and sorting a dumb table */
typedef struct vg_skipper_context vg_skipper_context;
#define PRINTF_v3f( V3 ) "%.4f %.4f %.4f\n", V3[0], V3[1], V3[2]
#define PRINTF_v4f( V4 ) "%.4f %.4f %.4f %.4f\n", V4[0], V4[1], V4[2], V4[3]
+/* fuck off you stupid fucks */
#ifdef _WIN32
#define PRINTF_U64 "%llu"
+ #define PRINTF_X64 "%llx"
#else
#define PRINTF_U64 "%lu"
+ #define PRINTF_X64 "%lx"
#endif
#ifdef VG_ENGINE