原有的adrv9025 代理框架很好用,在其原有的平台上做改进
char ***rows = calloc(16, sizeof(char *));
for (int32_t i = 0; i < 16; i++) {
rows[i] = calloc(sizeof(char *), 10);
for (int32_t j = 0; j < 11; j++) {
rows[i][j] = calloc(1, 128);
sprintf(rows[i][j], "Hello World");
}
}
for (int32_t i = 0; i < 16; i++) {
printf("row:%d ", i);
for (int32_t j = 0; j < 11; j++) {
printf("[col:%d %s] ", j, rows[i][j]);
}
printf("\n");
}
return 0;
将字符串 分成行列
指针存储地址,指针本身的大小,和几级指针没有关系,不同类型的指针,只是方便形成数组时,自动按照字长,分割出来
/*example override stmt cache functions*/
static inline int32_t __attribute__((__unused__))
stmt2cache(struct sqlite3_stmt *stmt, struct cacheList *node) {
struct cache *pnode = container_of(&node, struct cache, list);
if (pnode == 0 || node == 0) {
return -1;
}
node->para.id.u32 =
(uint32_t)strtol((const char *)sqlite3_column_text(stmt, 0), 0, 16);
memcpy(node->para.name, (const char *)sqlite3_column_text(stmt, 1),
strlen((const char *)sqlite3_column_text(stmt, 1)));
memcpy(node->para.mode, (const char *)sqlite3_column_text(stmt, 2),
strlen((const char *)sqlite3_column_text(stmt, 3)));
memcpy(node->para.type, (const char *)sqlite3_column_text(stmt, 3),
strlen((const char *)sqlite3_column_text(stmt, 3)));
node->para.coef = (float)sqlite3_column_double(stmt, 4);
node->para.len = (uint32_t)sqlite3_column_int(stmt, 5);
memcpy(node->para.value, (const char *)sqlite3_column_text(stmt, 6),
strlen((const char *)sqlite3_column_text(stmt, 6)));
node->para.attr = (uint8_t)sqlite3_column_int(stmt, 9);
return 0;
}
// Only For MCPA
static inline int32_t __attribute__((__unused__))
serdes2str(char *buf, struct cache2para *ca) {
if (buf == 0 || ca == 0) {
return -2;
}
bzero(buf, strlen(buf));
sprintf(buf, "\"0x%04X\",\"%s\",\"%s\",\"%s\",%f,%d,\"%s\",%d,%d,%d",
ca->id.u32, ca->name, ca->mode, ca->type, ca->coef, ca->len,
ca->value, ca->minThrehold, ca->maxThrehold, ca->attr);
return 0;
}
static inline int32_t __attribute__((__unused__))
stmt_common(struct sqlite3_stmt *stmt, void *args) {
struct cacheList *newNode = ((struct cache *)args)->list;
struct LIST_NODE *root = &((struct cache *)args)->root;
struct cache *_cache = (struct cache *)args;
newNode = (struct cacheList *)calloc(sizeof(struct cacheList), 1);
if (newNode == 0) {
return -2;
}
newNode->serdes2str = _cache->serdes2str4cacheList;
_cache->deserdes2stmt4list(stmt, newNode);
list_add_tail(&newNode->node, root);
return 0;
}
int32_t Example(void) {
static struct SQLITE3_BASE_INFO rmu_db = {.db_path =
"/mnt/flash/config/drurmu.db"};
static struct SQLITE3_DEV rmu_dev = {.info = &rmu_db};
static struct cache CACHE[] = {{.cacheName = "MCPC 32bit IDX",
.dev = &rmu_dev,
.db_table = "rmu",
.updateValueName = "V0",
.indexType = "str2hex16bitBIG",
.root = {&CACHE[0].root, &CACHE[0].root},
.deserdes2stmt4list = stmt2cache,
.serdes2str4cacheList = serdes2str}};
for (int32_t i = 0; i < ARRAY_SIZE(CACHE); i++) {
if (SQLITE3_OPEN(CACHE[i].dev) == -9) {
printf("%s\n", CACHE[i].dev->errMsg);
return 0;
}
if (SQLITE3_DESERDES_TABLE(CACHE[i].dev, CACHE[i].db_table, stmt_common,
&CACHE[i])) {
printf("error:%s\n", sqlite3_errmsg(CACHE[i].dev->handle));
}
}
const struct cacheList *cur = 0;
for (int32_t i = 0; i < 0xFFFF; i++) {
cur = cacheSectionSearch(&CACHE[0], i);
if (cur == 0) {
continue;
}
printf("index:%08x name:%s value:%s %s\n", i, cur->para.name,
cur->para.value, CACHE[0].indexType);
if (cacheSectionUpdate(&CACHE[0], i, "hello world") < 0) {
printf("update error:%s \n", sqlite3_errmsg(CACHE[0].dev->handle));
}
cur = cacheSectionSearch(&CACHE[0], i);
printf("index:%08x name:%s value:%s\n", i, cur->para.name, cur->para.value);
}
cacheSectionDelete(&CACHE[0], 0x2);
struct cacheList *insertList = newcacheList(0x2, "HelloInsertMode", "RW", "1",
"data", 1.0, 1, serdes2str);
cacheSectionPush(&CACHE[0], insertList);
return 0;
}