89 lines
1.8 KiB
C
89 lines
1.8 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <unistd.h>
|
|
#include "script_to_dts.h"
|
|
|
|
struct script *script;
|
|
|
|
int script_parse(const char *script_name)
|
|
{
|
|
int i;
|
|
int type;
|
|
int value[8];
|
|
char mainkey[32], subkey[32];
|
|
struct script_section *s = NULL;
|
|
|
|
script = script_new();
|
|
dictionary *d = iniparser_load(script_name);
|
|
if (d == NULL) {
|
|
return -1;
|
|
}
|
|
for (i = 0; i < d->size; i++) {
|
|
if (!d->key[i])
|
|
continue;
|
|
if (d->val[i]) {
|
|
type = iniparser_get_str2int(d->val[i], value);
|
|
if (type == -1) {
|
|
printf("[%s][%d]script change check subkey (%s) type failed.\n",
|
|
__func__, __LINE__, d->key[i]);
|
|
}
|
|
if (!(sscanf(d->key[i], "%[^:]:%[^\n]", mainkey, subkey) == 2)) {
|
|
return -1;
|
|
}
|
|
switch (type) {
|
|
case DATA_TYPE_SINGLE_WORD_HEX:
|
|
{
|
|
if (!script_single_hex_entry_new(s, subkey, value[0]))
|
|
return -1;
|
|
};
|
|
break;
|
|
case DATA_TYPE_SINGLE_WORD_DEC:
|
|
{
|
|
if (!script_single_dec_entry_new(s, subkey, value[0]))
|
|
return -1;
|
|
|
|
};
|
|
break;
|
|
case DATA_TYPE_STRING:
|
|
{
|
|
if (!script_string_entry_new(s, subkey, strlen(d->val[i]), (char *)(d->val[i])+1))
|
|
return -1;
|
|
};
|
|
break;
|
|
case DATA_TYPE_GPIO:
|
|
{
|
|
unsigned int port;
|
|
unsigned int port_num;
|
|
int v[4];
|
|
port = value[0];
|
|
port_num = value[1];
|
|
v[0] = value[2];
|
|
v[1] = value[3];
|
|
v[2] = value[4];
|
|
v[3] = value[5];
|
|
if (!script_gpio_entry_new(s, subkey, port, port_num, v))
|
|
return -1;
|
|
};
|
|
break;
|
|
case DATA_EMPTY:
|
|
if (!script_null_entry_new(s, subkey))
|
|
return -1;
|
|
break;
|
|
default:
|
|
printf("ERROR: Unknow section type\n");
|
|
return -1;
|
|
}
|
|
} else {
|
|
/* mainkey */
|
|
if ((s = script_section_new(script, d->key[i])) == NULL) {
|
|
return -1;
|
|
}
|
|
}
|
|
}
|
|
iniparser_freedict(d);
|
|
return 0;
|
|
|
|
}
|
|
|