Add blocks API
parent
f0713d7fc1
commit
a6761bf271
|
@ -1,3 +1,14 @@
|
|||
#pragma once
|
||||
#include "system.h"
|
||||
|
||||
#define BLOCKS_ERROR_NONE +0x0000
|
||||
#define BLOCKS_ERROR_OUTOFMEM -0x0001
|
||||
#define BLOCKS_ERROR_NOTFOUND -0x0002
|
||||
#define BLOCKS_ERROR_INVALID -0x0003
|
||||
|
||||
int32_t blocks_init(void);
|
||||
int32_t blocks_destroy(void);
|
||||
|
||||
// persisting buffer
|
||||
char *blocks_get_name(uint32_t id);
|
||||
uint32_t blocks_get_flags(uint32_t id);
|
||||
|
|
|
@ -1,3 +1,50 @@
|
|||
#include "blocks.h"
|
||||
#include "zpl.h"
|
||||
|
||||
// todo: csv parsing + utils
|
||||
|
||||
#define BLOCK_NAMELEN 80
|
||||
|
||||
typedef struct {
|
||||
uint32_t id;
|
||||
char name[BLOCK_NAMELEN];
|
||||
uint32_t flags;
|
||||
} block;
|
||||
|
||||
static block *blocks = NULL;
|
||||
static uint32_t blocks_count = 0;
|
||||
|
||||
int blocks_comparer(void const *a, void const *b) {
|
||||
block *ba = (block*)a;
|
||||
uint32_t bb = *(uint32_t*)b;
|
||||
return ba->id < bb ? -1 : ba->id > bb;
|
||||
}
|
||||
|
||||
static block *blocks_find(uint32_t id) {
|
||||
ZPL_ASSERT_NOT_NULL(blocks);
|
||||
int32_t index = zpl_binary_search((void*)blocks, blocks_count, sizeof(block), (void*)&id, blocks_comparer);
|
||||
ZPL_ASSERT_MSG(index != -1, "block could not be found");
|
||||
return &blocks[index];
|
||||
}
|
||||
|
||||
int32_t blocks_init(void) {
|
||||
// todo read csv by lines, linecount-1 == blocks_count
|
||||
// preallocate and assign values
|
||||
return BLOCKS_ERROR_NONE;
|
||||
}
|
||||
|
||||
int32_t blocks_destroy(void) {
|
||||
ZPL_ASSERT_NOT_NULL(blocks);
|
||||
zpl_mfree(blocks);
|
||||
return BLOCKS_ERROR_NONE;
|
||||
}
|
||||
|
||||
char *blocks_get_name(uint32_t id) {
|
||||
ZPL_ASSERT_NOT_NULL(blocks);
|
||||
return blocks_find(id)->name;
|
||||
}
|
||||
|
||||
uint32_t blocks_get_flags(uint32_t id) {
|
||||
ZPL_ASSERT_NOT_NULL(blocks);
|
||||
return blocks_find(id)->flags;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue