#include #include #include #include #include #include #include //#include "shm.h" #include "script.h" #include "debug.h" #define DATA_TYPE_SINGLE_WORD 1 #define DATA_TYPE_STRING 2 #define DATA_TYPE_MULTI_WORD 3 #define DATA_TYPE_GPIO 4 struct script_head { int mainkey_cnt; int version[3]; }; struct script_mainkey { char name[32]; int length; int offset; }; struct script_subkey { char name[32]; int offset; int pattern; }; static char *script_buf = NULL; static int mainkey_cnt = 0; int init_script(char* buf) { #if 0 script_buf = shmat(shmid, 0, 0); if (script_buf == (void *)-1) { db_error("script: attach the share memory segment failed(%s)\n", strerror(errno)); return -1; } #else script_buf = buf; #endif struct script_head *head = (struct script_head *)script_buf; mainkey_cnt = head->mainkey_cnt; db_debug("script: main key count #%d\n", mainkey_cnt); db_msg("script: V%d.%d.%d\n", head->version[0], head->version[1], head->version[2]); return 0; } void deinit_script(void) { if (script_buf) { // shmdt(script_buf); script_buf = NULL; } mainkey_cnt = 0; } int script_mainkey_cnt(void) { return mainkey_cnt; } int script_mainkey_name(int idx, char *name) { struct script_mainkey *mainkey; if (script_buf == NULL) { return -1; } mainkey = (struct script_mainkey *)(script_buf + sizeof(struct script_head) + idx * sizeof(struct script_mainkey)); strncpy(name, mainkey->name, 32); return 0; } int script_fetch(char *main_name, char *sub_name, int value[], int count) { int i, j; struct script_mainkey *mainkey; struct script_subkey *subkey; int pattern, wordcnt; /* check parameter */ if (script_buf == NULL) { return -1; } if (main_name == NULL || sub_name == NULL) { return -1; } if (value == NULL) { return -1; } memset(value, 0, sizeof(int) * count); /* search main key */ for (i = 0; i < mainkey_cnt; i++) { mainkey = (struct script_mainkey *)(script_buf + sizeof(struct script_head) + i * sizeof(struct script_mainkey)); if (strncmp(mainkey->name, main_name, 31)) { continue; } /* search sub key */ for (j = 0; j < mainkey->length; j++) { subkey = (struct script_subkey *)(script_buf + (mainkey->offset << 2) + (j * sizeof(struct script_subkey))); if (strncmp(subkey->name, sub_name, 31)) { continue; } pattern = (subkey->pattern >> 16) & 0xffff; wordcnt = subkey->pattern & 0xffff; switch (pattern) { case DATA_TYPE_SINGLE_WORD: value[0] = *(int *)(script_buf + (subkey->offset << 2)); break; case DATA_TYPE_STRING: if (wordcnt == 0) break; if (wordcnt > count) wordcnt = count; memcpy((char *)value, script_buf + (subkey->offset << 2), wordcnt << 2); break; case DATA_TYPE_GPIO: db_debug("%s: L%d fix me\n", __func__, __LINE__); break; default: db_debug("%s: L%d fix me\n", __func__, __LINE__); break; } return 0; } } return -1; }