New cmp funtion to get sorted integer arrays
This commit is contained in:
parent
8db182a303
commit
7d28858a70
202
src/cw/cfg.c
202
src/cw/cfg.c
@ -7,19 +7,73 @@
|
|||||||
#include "cfg.h"
|
#include "cfg.h"
|
||||||
#include "val.h"
|
#include "val.h"
|
||||||
|
|
||||||
static int cmp(const void *k1,const void*k2){
|
static const char *nextc(const char *s)
|
||||||
|
{
|
||||||
|
while (isdigit(*s))
|
||||||
|
s++;
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int cmp0(const char *s1, const char *s2)
|
||||||
|
{
|
||||||
|
|
||||||
|
const char *d1, *d2;
|
||||||
|
int i1, i2, i;
|
||||||
|
|
||||||
|
d1 = strchr(s1, '.');
|
||||||
|
if (d1 == NULL)
|
||||||
|
return strcmp(s1, s2);
|
||||||
|
|
||||||
|
d2 = strchr(s2, '.');
|
||||||
|
if (d2 == NULL)
|
||||||
|
return strcmp(s1, s2);
|
||||||
|
|
||||||
|
if ((d1 - s1) != (d2 - s2))
|
||||||
|
return strcmp(s1, s2);
|
||||||
|
|
||||||
|
if (strncmp(s1, s2, (d1 - s1)) != 0)
|
||||||
|
return strcmp(s1, s2);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if (isdigit(d1[1])) {
|
||||||
|
i1 = atoi(d1 + 1);
|
||||||
|
} else {
|
||||||
|
return cmp0(d1 + 1, d2 + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isdigit(d2[1])) {
|
||||||
|
i2 = atoi(d2 + 1);
|
||||||
|
} else {
|
||||||
|
return cmp0(d1 + 1, d2 + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
i = i1 - i2;
|
||||||
|
if (i == 0) {
|
||||||
|
return cmp0(nextc(d1 + 1), nextc(d2 + 1));
|
||||||
|
}
|
||||||
|
return i;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static int cmp(const void *k1, const void *k2)
|
||||||
|
{
|
||||||
struct cw_Cfg_entry *e1, *e2;
|
struct cw_Cfg_entry *e1, *e2;
|
||||||
e1 = (struct cw_Cfg_entry *) k1;
|
e1 = (struct cw_Cfg_entry *) k1;
|
||||||
e2 = (struct cw_Cfg_entry *) k2;
|
e2 = (struct cw_Cfg_entry *) k2;
|
||||||
return strcmp(e1->key,e2->key);
|
|
||||||
|
|
||||||
|
return cmp0(e1->key, e2->key);
|
||||||
|
/* return strcmp(e1->key,e2->key);*/
|
||||||
}
|
}
|
||||||
|
|
||||||
static void del(void *ptr)
|
static void del(void *ptr)
|
||||||
{
|
{
|
||||||
struct cw_Cfg_entry *e;
|
struct cw_Cfg_entry *e;
|
||||||
e = (struct cw_Cfg_entry *) ptr;
|
e = (struct cw_Cfg_entry *) ptr;
|
||||||
free(e->key);
|
free((void *) e->key);
|
||||||
free(e->val);
|
free((void *) e->val);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -38,7 +92,7 @@ int cw_cfg_set(cw_Cfg_t * cfg,const char *key, const char *val)
|
|||||||
return 0;
|
return 0;
|
||||||
e.val = cw_strdup(val);
|
e.val = cw_strdup(val);
|
||||||
if (!e.val) {
|
if (!e.val) {
|
||||||
free(e.key);
|
free((void *) e.key);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
void *rc = mavl_replace(cfg, &e, &replaced);
|
void *rc = mavl_replace(cfg, &e, &replaced);
|
||||||
@ -52,7 +106,7 @@ int cw_cfg_set(cw_Cfg_t * cfg,const char *key, const char *val)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char * cw_cfg_get(cw_Cfg_t * cfg, char *key, const char *def)
|
const char *cw_cfg_get(cw_Cfg_t * cfg, const char *key, const char *def)
|
||||||
{
|
{
|
||||||
struct cw_Cfg_entry e, *r;
|
struct cw_Cfg_entry e, *r;
|
||||||
e.key = key;
|
e.key = key;
|
||||||
@ -63,11 +117,6 @@ const char * cw_cfg_get(cw_Cfg_t * cfg, char *key, const char *def)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
uint16_t cw_cfg_get_word(cw_Cfg_t * cfg, char *key)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void cw_cfg_dump(cw_Cfg_t * cfg)
|
void cw_cfg_dump(cw_Cfg_t * cfg)
|
||||||
{
|
{
|
||||||
@ -107,13 +156,13 @@ static int get_char(struct parser *p)
|
|||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void unget_char(struct parser *p,int c){
|
static void unget_char(struct parser *p, int c)
|
||||||
|
{
|
||||||
ungetc(c, p->f);
|
ungetc(c, p->f);
|
||||||
if (c == '\n') {
|
if (c == '\n') {
|
||||||
p->line--;
|
p->line--;
|
||||||
p->pos = p->prevpos;
|
p->pos = p->prevpos;
|
||||||
}
|
} else
|
||||||
else
|
|
||||||
p->pos--;
|
p->pos--;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -210,7 +259,8 @@ static int read_key (struct parser *p, char *key, int max_len)
|
|||||||
|
|
||||||
n = 0;
|
n = 0;
|
||||||
while (c != EOF && n < max_len) {
|
while (c != EOF && n < max_len) {
|
||||||
if (!p->quote && !isalnum(c) && !strchr("._/-()@#|{}[]\\",c)/*strchr(": \t\n\a",c)*/){
|
if (!p->quote && !isalnum(c)
|
||||||
|
&& !strchr("._/-()@#|{}[]\\", c) /*strchr(": \t\n\a",c) */ ) {
|
||||||
unget_char(p, c);
|
unget_char(p, c);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -233,10 +283,13 @@ static int skip_to_colon(FILE *f,struct parser * p)
|
|||||||
if (c != ':') {
|
if (c != ':') {
|
||||||
if (c == '\n') {
|
if (c == '\n') {
|
||||||
unget_char(p, c);
|
unget_char(p, c);
|
||||||
sprintf(p->error,"Error at line %d, pos %d: Unexpected EOL, collon expected.", p->line, p->pos);
|
sprintf(p->error,
|
||||||
|
"Error at line %d, pos %d: Unexpected EOL, collon expected.",
|
||||||
|
p->line, p->pos);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
sprintf(p->error,"Error at line %d, pos %d: Collon expected.", p->line, p->pos);
|
sprintf(p->error, "Error at line %d, pos %d: Collon expected.",
|
||||||
|
p->line, p->pos);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
@ -244,7 +297,8 @@ static int skip_to_colon(FILE *f,struct parser * p)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
static int read_val(struct parser *p, char *val, int max_len){
|
static int read_val(struct parser *p, char *val, int max_len)
|
||||||
|
{
|
||||||
int c, n, quote;
|
int c, n, quote;
|
||||||
if (!skip_to_colon(p->f, p))
|
if (!skip_to_colon(p->f, p))
|
||||||
return -1;
|
return -1;
|
||||||
@ -252,8 +306,7 @@ static int read_val(struct parser *p, char *val, int max_len){
|
|||||||
if (c == '"') {
|
if (c == '"') {
|
||||||
quote = 1;
|
quote = 1;
|
||||||
c = get_char(p);
|
c = get_char(p);
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
quote = 0;
|
quote = 0;
|
||||||
}
|
}
|
||||||
n = 0;
|
n = 0;
|
||||||
@ -379,7 +432,7 @@ static int cw_cfg_get_next_idx(cw_Cfg_t * cfg, const char *key, int n)
|
|||||||
{
|
{
|
||||||
char ikey[CW_CFG_MAX_KEY_LEN];
|
char ikey[CW_CFG_MAX_KEY_LEN];
|
||||||
struct cw_Cfg_entry search, *result;
|
struct cw_Cfg_entry search, *result;
|
||||||
char *d;
|
const char *d;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
sprintf(ikey, "%s.%d", key, n);
|
sprintf(ikey, "%s.%d", key, n);
|
||||||
@ -419,12 +472,96 @@ static int cw_cfg_get_next_idx(cw_Cfg_t * cfg, const char *key, int n)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void cw_cfg_iterate(cw_Cfg_t * cfg)
|
|
||||||
|
|
||||||
|
static void pcb(char *dst, struct mavlnode *node)
|
||||||
|
{
|
||||||
|
struct cw_Cfg_entry *e = mavlnode_dataptr(node);
|
||||||
|
sprintf(dst, "%s", e->key);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void cw_cfg_iter_init(cw_Cfg_t * cfg, struct cw_Cfg_iter *cfi, const char *base)
|
||||||
|
{
|
||||||
|
struct cw_Cfg_entry search;
|
||||||
|
search.key = base;
|
||||||
|
|
||||||
|
mavliter_init(&(cfi->it), cfg);
|
||||||
|
mavliter_seek(&(cfi->it), &search, 0);
|
||||||
|
cfi->base = base;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const char *cw_cfg_iter_next(struct cw_Cfg_iter *cfi, const char *key)
|
||||||
|
{
|
||||||
|
struct cw_Cfg_entry *e;
|
||||||
|
int bl, kl;
|
||||||
|
const char *d;
|
||||||
|
|
||||||
|
e = mavliter_get(&(cfi->it));
|
||||||
|
if (e == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
|
||||||
|
bl = strlen(cfi->base);
|
||||||
|
kl = strlen(e->key);
|
||||||
|
|
||||||
|
if (bl > kl)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (bl == kl) {
|
||||||
|
if (strcmp(cfi->base, e->key) != 0)
|
||||||
|
return NULL;
|
||||||
|
else {
|
||||||
|
mavliter_next(&(cfi->it));
|
||||||
|
return e->val;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
d = strchr(e->key, '.');
|
||||||
|
if (d == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (d - e->key != bl)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (strncmp(cfi->base, e->key, bl) != 0)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
mavliter_next(&(cfi->it));
|
||||||
|
return e->val;
|
||||||
|
}
|
||||||
|
|
||||||
|
void cw_cfg_iterate(cw_Cfg_t * cfg, const char *key)
|
||||||
{
|
{
|
||||||
printf("Iterate\n");
|
printf("Iterate\n");
|
||||||
struct cw_Cfg_entry *e;
|
struct cw_Cfg_entry *e;
|
||||||
struct cw_Cfg_entry search;
|
struct cw_Cfg_entry search;
|
||||||
search.key="actube/listen";
|
search.key = key;
|
||||||
|
struct mavliter it;
|
||||||
|
struct mavlnode *first;
|
||||||
|
|
||||||
|
mavl_print(cfg,pcb,180);
|
||||||
|
|
||||||
|
printf("SEEK TO %s\n", search.key);
|
||||||
|
|
||||||
|
struct cw_Cfg_iter cfi;
|
||||||
|
cw_cfg_iter_init(cfg, &cfi, key);
|
||||||
|
const char *kee;
|
||||||
|
|
||||||
|
while ((kee = cw_cfg_iter_next(&cfi, NULL)) != NULL) {
|
||||||
|
printf("KEY===%s\n", kee);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
return;
|
||||||
|
|
||||||
|
|
||||||
|
mavliter_init(&it, cfg);
|
||||||
|
mavliter_seek(&it, &search, 0);
|
||||||
|
struct cw_Cfg_entry *en;
|
||||||
|
return;
|
||||||
|
|
||||||
int i = 0;
|
int i = 0;
|
||||||
i = cw_cfg_get_next_idx(cfg, "actube/listen", i);
|
i = cw_cfg_get_next_idx(cfg, "actube/listen", i);
|
||||||
@ -451,3 +588,22 @@ void cw_cfg_iterate(cw_Cfg_t * cfg)
|
|||||||
printf("%s : %s\n", e->key, e->val);
|
printf("%s : %s\n", e->key, e->val);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int cw_cfg_get_bool(cw_Cfg_t * cfg, const char * key, const char *def)
|
||||||
|
{
|
||||||
|
struct cw_Val v;
|
||||||
|
const char *s = cw_cfg_get(cfg,key,def);
|
||||||
|
CW_TYPE_BOOL->from_str(&v,s);
|
||||||
|
return v.val.boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t cw_cfg_get_word(cw_Cfg_t * cfg, char *key, const char * def)
|
||||||
|
{
|
||||||
|
struct cw_Val v;
|
||||||
|
const char *s = cw_cfg_get(cfg,key,def);
|
||||||
|
CW_TYPE_WORD->from_str(&v,s);
|
||||||
|
return v.val.word;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
18
src/cw/cfg.h
18
src/cw/cfg.h
@ -14,11 +14,23 @@ int cw_cfg_read_from_file(FILE * file, cw_Cfg_t * cfg);
|
|||||||
int cw_cfg_load(const char *filename,cw_Cfg_t * cfg);
|
int cw_cfg_load(const char *filename,cw_Cfg_t * cfg);
|
||||||
|
|
||||||
struct cw_Cfg_entry{
|
struct cw_Cfg_entry{
|
||||||
char *key;
|
const char *key;
|
||||||
char *val;
|
const char *val;
|
||||||
};
|
};
|
||||||
|
|
||||||
const char * cw_cfg_get(cw_Cfg_t * cfg, char *key, const char *def);
|
|
||||||
|
struct cw_Cfg_iter{
|
||||||
|
struct mavliter it;
|
||||||
|
const char *base;
|
||||||
|
};
|
||||||
|
|
||||||
|
const char * cw_cfg_get(cw_Cfg_t * cfg, const char *key, const char *def);
|
||||||
|
|
||||||
|
const char *cw_cfg_iter_next(struct cw_Cfg_iter *cfi, const char *key);
|
||||||
|
void cw_cfg_iter_init(cw_Cfg_t * cfg, struct cw_Cfg_iter *cfi, const char *base);
|
||||||
|
|
||||||
|
int cw_cfg_get_bool(cw_Cfg_t * cfg, const char * key, const char *def);
|
||||||
|
uint16_t cw_cfg_get_word(cw_Cfg_t * cfg, char *key, const char * def);
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user