void freeParsedArguments(parsedargs_t* pa) { if (pa->arg) {free(pa->arg);} if (pa->kv_args) { for(int i=0;i<pa->kv_cnt;i++) { free(pa->kv_args[i].keyvalue); } free(pa->kv_args); } initParsedArguments(pa); }
void rrd_graph_script( int argc, char *argv[], image_desc_t *const im, int optno) { int i; /* and now handle the things*/ parsedargs_t pa; initParsedArguments(&pa); /* loop arguments */ for (i = optno; i < argc; i++) { /* release parsed args - avoiding late cleanups*/ freeParsedArguments(&pa); /* processed parsed args */ if (parseArguments(argv[i],&pa)) { return; } /* dumpArguments(&pa); */ /* now let us handle the field based on the first command or cmd=...*/ char*cmd=NULL; /* and try to get via cmd */ char* t=getKeyValueArgument("cmd",255,&pa); if (t) { cmd=t; } else if ((t=getKeyValueArgument("pos0",255,&pa))) { cmd=t; } else { rrd_set_error("no command set in argument %s",pa.arg_orig); freeParsedArguments(&pa); return; } /* convert to enum but handling LINE special*/ enum gf_en gf = (enum gf_en) -1; gf=gf_conv(cmd); if ((int)gf == -1) { if (strncmp("LINE",cmd,4)==0) { gf=GF_LINE; addToArguments(&pa,NULL,"linewidth",cmd+4,0); } else { rrd_set_error("'%s' is not a valid function name in %s", cmd,pa.arg_orig ); return; } } /* now we can handle the commands */ int r=0; switch (gf) { case GF_XAXIS: r=parse_axis(gf,&pa,im); break; case GF_YAXIS: r=parse_axis(gf,&pa,im); break; case GF_DEF: r=parse_def(gf,&pa,im); break; case GF_CDEF: r=parse_cvdef(gf,&pa,im); break; case GF_VDEF: r=parse_cvdef(gf,&pa,im); break; case GF_LINE: r=parse_line(gf,&pa,im); break; case GF_AREA: r=parse_area(gf,&pa,im); break; case GF_PRINT: r=parse_gprint(gf,&pa,im); break; case GF_GPRINT: r=parse_gprint(gf,&pa,im); break; case GF_COMMENT: r=parse_comment(gf,&pa,im); break; case GF_HRULE: r=parse_hvrule(gf,&pa,im); break; case GF_VRULE: r=parse_hvrule(gf,&pa,im); break; case GF_STACK: r=parse_stack(gf,&pa,im); break; case GF_TICK: r=parse_tick(gf,&pa,im); break; case GF_TEXTALIGN: r=parse_textalign(gf,&pa,im); break; case GF_SHIFT: r=parse_shift(gf,&pa,im); break; case GF_XPORT: r=parse_xport(gf,&pa,im); break; /* unsupported types right now */ } /* handle the return error case */ if (r) { freeParsedArguments(&pa); return;} /* check for unprocessed keyvalue args */ char *s; if ((s=checkUnusedValues(&pa))) { /* set error message */ rrd_set_error("Unused Arguments \"%s\" in command : %s",s,pa.arg_orig); free(s); /* exit early */ freeParsedArguments(&pa); return; } } /* finally free arguments */ freeParsedArguments(&pa); }
int parseArguments(const char* origarg, parsedargs_t* pa) { initParsedArguments(pa); /* now assign a copy */ pa->arg=strdup(origarg); if (!pa->arg) { rrd_set_error("Could not allocate memory");return -1; } pa->arg_orig=origarg; /* first split arg into : */ char c; int cnt=0; int poscnt=0; char* pos=pa->arg; char* field=pos; do { c=*pos; if (! field) { field=pos;cnt++;} switch (c) { /* if the char is a backslash, then this escapes the next one */ case '\\': if (pos[1] == ':') { /* move up the rest of the string to eat the backslash */ memmove(pos,pos+1,strlen(pos+1)+1); } break; case 0: case ':': { /* null and : separate the string */ *pos=0; /* flag to say we are positional */ //int ispos=0; /* handle the case where we have got an = */ /* find equal sign */ char* equal=field; for (equal=field;(*equal)&&(*equal!='=');equal++) { ; } /* if we are on position 1 then check for position 0 to be [CV]?DEV */ int checkforkeyvalue=1; /* nw define key to use */ char* keyvalue=strdup(field); char *key,*value; if ((*equal=='=') && (checkforkeyvalue)) { *equal=0; key=field; value=equal+1; } else { if ((poscnt>0)&&(strcmp(field,"STACK")==0)) { key="stack"; value="1"; } else if ((poscnt>0)&&(strcmp(field,"strftime")==0)) { key="strftime"; value="1"; } else if ((poscnt>0)&&(strcmp(field,"dashes")==0)) { key="dashes"; value="5,5"; } else if ((poscnt>0)&&(strcmp(field,"valstrftime")==0)) { key="vformatter"; value="timestamp"; } else if ((poscnt>0)&&(strcmp(field,"valstrfduration")==0)) { key="vformatter"; value="duration"; } else if ((poscnt>0)&&(strcmp(field,"skipscale")==0)) { key="skipscale"; value="1"; } else { if (poscnt>9) { rrd_set_error("too many positional arguments"); freeParsedArguments(pa); return -1; } key=poskeys[poscnt]; poscnt++; //ispos=poscnt; value=field; } } /* do some synonym translations */ if (strcmp(key,"label")==0) { key="legend"; } if (strcmp(key,"colour")==0) { key="color"; } if (strcmp(key,"colour2")==0) { key="color2"; } /* add to fields */ if (addToArguments(pa,keyvalue,key,value,cnt)) { freeParsedArguments(pa); return -1; } /* and reset field */ field=NULL; } break; default: break; } /* and step to next one byte */ pos++; } while (c); /* and return OK */ return 0; }
void freeParsedArguments(parsedargs_t* pa) { if (pa->arg) {free(pa->arg);} if (pa->kv_args) {free(pa->kv_args);} initParsedArguments(pa); }