Exemple #1
0
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);
}
Exemple #2
0
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);
}
Exemple #3
0
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);
}