1*4882a593Smuzhiyun
2*4882a593Smuzhiyun
3*4882a593Smuzhiyun #include <sys/types.h>
4*4882a593Smuzhiyun #include <sys/ipc.h>
5*4882a593Smuzhiyun
6*4882a593Smuzhiyun #include <ctype.h>
7*4882a593Smuzhiyun #include <errno.h>
8*4882a593Smuzhiyun #include <string.h>
9*4882a593Smuzhiyun #include <stdlib.h>
10*4882a593Smuzhiyun #include <stdio.h>
11*4882a593Smuzhiyun
12*4882a593Smuzhiyun //#include "shm.h"
13*4882a593Smuzhiyun #include "script.h"
14*4882a593Smuzhiyun #include "debug.h"
15*4882a593Smuzhiyun
16*4882a593Smuzhiyun
17*4882a593Smuzhiyun #define DATA_TYPE_SINGLE_WORD 1
18*4882a593Smuzhiyun #define DATA_TYPE_STRING 2
19*4882a593Smuzhiyun #define DATA_TYPE_MULTI_WORD 3
20*4882a593Smuzhiyun #define DATA_TYPE_GPIO 4
21*4882a593Smuzhiyun
22*4882a593Smuzhiyun struct script_head
23*4882a593Smuzhiyun {
24*4882a593Smuzhiyun int mainkey_cnt;
25*4882a593Smuzhiyun int version[3];
26*4882a593Smuzhiyun };
27*4882a593Smuzhiyun
28*4882a593Smuzhiyun struct script_mainkey
29*4882a593Smuzhiyun {
30*4882a593Smuzhiyun char name[32];
31*4882a593Smuzhiyun int length;
32*4882a593Smuzhiyun int offset;
33*4882a593Smuzhiyun };
34*4882a593Smuzhiyun
35*4882a593Smuzhiyun struct script_subkey
36*4882a593Smuzhiyun {
37*4882a593Smuzhiyun char name[32];
38*4882a593Smuzhiyun int offset;
39*4882a593Smuzhiyun int pattern;
40*4882a593Smuzhiyun };
41*4882a593Smuzhiyun
42*4882a593Smuzhiyun static char *script_buf = NULL;
43*4882a593Smuzhiyun static int mainkey_cnt = 0;
44*4882a593Smuzhiyun
init_script(char * buf)45*4882a593Smuzhiyun int init_script(char* buf)
46*4882a593Smuzhiyun {
47*4882a593Smuzhiyun #if 0
48*4882a593Smuzhiyun script_buf = shmat(shmid, 0, 0);
49*4882a593Smuzhiyun if (script_buf == (void *)-1) {
50*4882a593Smuzhiyun db_error("script: attach the share memory segment failed(%s)\n",
51*4882a593Smuzhiyun strerror(errno));
52*4882a593Smuzhiyun return -1;
53*4882a593Smuzhiyun }
54*4882a593Smuzhiyun #else
55*4882a593Smuzhiyun script_buf = buf;
56*4882a593Smuzhiyun #endif
57*4882a593Smuzhiyun struct script_head *head = (struct script_head *)script_buf;
58*4882a593Smuzhiyun
59*4882a593Smuzhiyun mainkey_cnt = head->mainkey_cnt;
60*4882a593Smuzhiyun db_debug("script: main key count #%d\n", mainkey_cnt);
61*4882a593Smuzhiyun db_msg("script: V%d.%d.%d\n", head->version[0],
62*4882a593Smuzhiyun head->version[1], head->version[2]);
63*4882a593Smuzhiyun
64*4882a593Smuzhiyun return 0;
65*4882a593Smuzhiyun }
66*4882a593Smuzhiyun
deinit_script(void)67*4882a593Smuzhiyun void deinit_script(void)
68*4882a593Smuzhiyun {
69*4882a593Smuzhiyun if (script_buf) {
70*4882a593Smuzhiyun // shmdt(script_buf);
71*4882a593Smuzhiyun script_buf = NULL;
72*4882a593Smuzhiyun }
73*4882a593Smuzhiyun
74*4882a593Smuzhiyun mainkey_cnt = 0;
75*4882a593Smuzhiyun }
76*4882a593Smuzhiyun
script_mainkey_cnt(void)77*4882a593Smuzhiyun int script_mainkey_cnt(void)
78*4882a593Smuzhiyun {
79*4882a593Smuzhiyun return mainkey_cnt;
80*4882a593Smuzhiyun }
81*4882a593Smuzhiyun
script_mainkey_name(int idx,char * name)82*4882a593Smuzhiyun int script_mainkey_name(int idx, char *name)
83*4882a593Smuzhiyun {
84*4882a593Smuzhiyun struct script_mainkey *mainkey;
85*4882a593Smuzhiyun
86*4882a593Smuzhiyun if (script_buf == NULL) {
87*4882a593Smuzhiyun return -1;
88*4882a593Smuzhiyun }
89*4882a593Smuzhiyun
90*4882a593Smuzhiyun mainkey = (struct script_mainkey *)(script_buf + sizeof(struct script_head) +
91*4882a593Smuzhiyun idx * sizeof(struct script_mainkey));
92*4882a593Smuzhiyun
93*4882a593Smuzhiyun strncpy(name, mainkey->name, 32);
94*4882a593Smuzhiyun
95*4882a593Smuzhiyun return 0;
96*4882a593Smuzhiyun }
97*4882a593Smuzhiyun
script_fetch(char * main_name,char * sub_name,int value[],int count)98*4882a593Smuzhiyun int script_fetch(char *main_name, char *sub_name, int value[], int count)
99*4882a593Smuzhiyun {
100*4882a593Smuzhiyun int i, j;
101*4882a593Smuzhiyun struct script_mainkey *mainkey;
102*4882a593Smuzhiyun struct script_subkey *subkey;
103*4882a593Smuzhiyun int pattern, wordcnt;
104*4882a593Smuzhiyun
105*4882a593Smuzhiyun /* check parameter */
106*4882a593Smuzhiyun if (script_buf == NULL) {
107*4882a593Smuzhiyun return -1;
108*4882a593Smuzhiyun }
109*4882a593Smuzhiyun
110*4882a593Smuzhiyun if (main_name == NULL || sub_name == NULL) {
111*4882a593Smuzhiyun return -1;
112*4882a593Smuzhiyun }
113*4882a593Smuzhiyun
114*4882a593Smuzhiyun if (value == NULL) {
115*4882a593Smuzhiyun return -1;
116*4882a593Smuzhiyun }
117*4882a593Smuzhiyun
118*4882a593Smuzhiyun memset(value, 0, sizeof(int) * count);
119*4882a593Smuzhiyun
120*4882a593Smuzhiyun /* search main key */
121*4882a593Smuzhiyun for (i = 0; i < mainkey_cnt; i++) {
122*4882a593Smuzhiyun mainkey = (struct script_mainkey *)(script_buf +
123*4882a593Smuzhiyun sizeof(struct script_head) + i * sizeof(struct script_mainkey));
124*4882a593Smuzhiyun if (strncmp(mainkey->name, main_name, 31)) {
125*4882a593Smuzhiyun continue;
126*4882a593Smuzhiyun }
127*4882a593Smuzhiyun
128*4882a593Smuzhiyun /* search sub key */
129*4882a593Smuzhiyun for (j = 0; j < mainkey->length; j++) {
130*4882a593Smuzhiyun subkey = (struct script_subkey *)(script_buf +
131*4882a593Smuzhiyun (mainkey->offset << 2) +
132*4882a593Smuzhiyun (j * sizeof(struct script_subkey)));
133*4882a593Smuzhiyun if (strncmp(subkey->name, sub_name, 31)) {
134*4882a593Smuzhiyun continue;
135*4882a593Smuzhiyun }
136*4882a593Smuzhiyun
137*4882a593Smuzhiyun pattern = (subkey->pattern >> 16) & 0xffff;
138*4882a593Smuzhiyun wordcnt = subkey->pattern & 0xffff;
139*4882a593Smuzhiyun
140*4882a593Smuzhiyun switch (pattern) {
141*4882a593Smuzhiyun case DATA_TYPE_SINGLE_WORD:
142*4882a593Smuzhiyun value[0] = *(int *)(script_buf + (subkey->offset << 2));
143*4882a593Smuzhiyun break;
144*4882a593Smuzhiyun
145*4882a593Smuzhiyun case DATA_TYPE_STRING:
146*4882a593Smuzhiyun if (wordcnt == 0)
147*4882a593Smuzhiyun break;
148*4882a593Smuzhiyun
149*4882a593Smuzhiyun if (wordcnt > count)
150*4882a593Smuzhiyun wordcnt = count;
151*4882a593Smuzhiyun
152*4882a593Smuzhiyun memcpy((char *)value, script_buf + (subkey->offset << 2),
153*4882a593Smuzhiyun wordcnt << 2);
154*4882a593Smuzhiyun break;
155*4882a593Smuzhiyun
156*4882a593Smuzhiyun case DATA_TYPE_GPIO:
157*4882a593Smuzhiyun db_debug("%s: L%d fix me\n", __func__, __LINE__);
158*4882a593Smuzhiyun break;
159*4882a593Smuzhiyun
160*4882a593Smuzhiyun default:
161*4882a593Smuzhiyun db_debug("%s: L%d fix me\n", __func__, __LINE__);
162*4882a593Smuzhiyun break;
163*4882a593Smuzhiyun }
164*4882a593Smuzhiyun
165*4882a593Smuzhiyun return 0;
166*4882a593Smuzhiyun }
167*4882a593Smuzhiyun }
168*4882a593Smuzhiyun
169*4882a593Smuzhiyun return -1;
170*4882a593Smuzhiyun }
171