Skip to content

Commit

Permalink
core: added #!defexp ID STM preprocessor directive
Browse files Browse the repository at this point in the history
- abity to set a defined it to the result of snexpr statement
- example:

  #!define ADDR 127.0.0.1
  #!defexp SIPURI "sip:" + ADDR + ":5060"
  • Loading branch information
miconda committed Sep 20, 2022
1 parent 1fd075c commit 411fb39
Show file tree
Hide file tree
Showing 3 changed files with 88 additions and 10 deletions.
37 changes: 27 additions & 10 deletions src/core/cfg.lex
Expand Up @@ -575,6 +575,7 @@ IFEXP ifexp
ENDIF endif
TRYDEF "trydefine"|"trydef"
REDEF "redefine"|"redef"
DEFEXP defexp
DEFENV defenv
DEFENVS defenvs
TRYDEFENV trydefenv
Expand Down Expand Up @@ -1339,6 +1340,10 @@ IMPORTFILE "import_file"
ksr_cfg_print_part(yytext);
pp_define_set_type(KSR_PPDEF_REDEF);
state = DEFINE_S; BEGIN(DEFINE_ID); }
<INITIAL,CFGPRINTMODE>{PREP_START}{DEFEXP}{EAT_ABLE}+ { count();
ksr_cfg_print_part(yytext);
pp_define_set_type(KSR_PPDEF_DEFEXP);
state = DEFINE_S; BEGIN(DEFINE_ID); }
<DEFINE_ID>{ID}{MINUS} { count();
ksr_cfg_print_part(yytext);
LM_CRIT(
Expand Down Expand Up @@ -2107,6 +2112,7 @@ int pp_define(int len, const char *text)
int pp_define_set(int len, char *text, int mode)
{
int ppos;
char *sval = NULL;

if(pp_define_index == -2) {
/* #!trydef that should be ignored */
Expand Down Expand Up @@ -2144,17 +2150,28 @@ int pp_define_set(int len, char *text, int mode)
return -1;
}

pp_defines[ppos].value.s = (char*)pkg_malloc(len+1);
if (pp_defines[ppos].value.s == NULL) {
LM_ERR("no more memory to define %.*s [%d]\n",
pp_defines[ppos].name.len,
pp_defines[ppos].name.s, ppos);
return -1;
}
if(pp_defines[ppos].dtype == KSR_PPDEF_DEFEXP) {
sval = pp_defexp_eval(text, len);
if(sval==NULL) {
LM_NOTICE("no value returned to set the defexp [%.*s]\n",
pp_defines[ppos].name.len, pp_defines[ppos].name.s);
return 0;
}
pp_defines[ppos].value.s = sval;
pp_defines[ppos].value.len = strlen(sval);
} else {
pp_defines[ppos].value.s = (char*)pkg_malloc(len+1);
if (pp_defines[ppos].value.s == NULL) {
LM_ERR("no more memory to define %.*s [%d]\n",
pp_defines[ppos].name.len,
pp_defines[ppos].name.s, ppos);
return -1;
}

memcpy(pp_defines[ppos].value.s, text, len);
pp_defines[ppos].value.s[len] = '\0';
pp_defines[ppos].value.len = len;
memcpy(pp_defines[ppos].value.s, text, len);
pp_defines[ppos].value.s[len] = '\0';
pp_defines[ppos].value.len = len;
}
LM_DBG("### setting define ID [%.*s] value [%.*s] (mode: %d)\n",
pp_defines[ppos].name.len,
pp_defines[ppos].name.s,
Expand Down
59 changes: 59 additions & 0 deletions src/core/ppcfg.c
Expand Up @@ -461,4 +461,63 @@ void pp_ifexp_eval(char *exval, int exlen)
snexpr_destroy(e, &vars);
}

char *pp_defexp_eval(char *exval, int exlen)
{
str exstr;
struct snexpr_var_list vars = {0};
struct snexpr *e = NULL;
struct snexpr *result = NULL;
str sval = STR_NULL;
char *res = NULL;

exstr.s = exval;
exstr.len = exlen;
trim(&exstr);

LM_DBG("evaluating [%.*s]\n", exstr.len, exstr.s);

e = snexpr_create(exstr.s, exstr.len, &vars, NULL, pp_snexpr_defval);
if(e == NULL) {
LM_ERR("failed to create expression [%.*s]\n", exstr.len, exstr.s);
return NULL;
}

result = snexpr_eval(e);

if(result==NULL) {
LM_ERR("expression evaluation [%.*s] is null\n", exstr.len, exstr.s);
goto end;
}

if(result->type == SNE_OP_CONSTNUM) {
LM_DBG("expression number result: %g\n", result->param.num.nval);
sval.s = int2str((long)result->param.num.nval, &sval.len);
if(sval.s==NULL) {
goto done;
}
} else if(result->type == SNE_OP_CONSTSTZ) {
if(result->param.stz.sval==NULL) {
LM_DBG("expression string result is null\n");
goto done;
}
LM_DBG("expression string result: [%s]\n", result->param.stz.sval);
sval.s = result->param.stz.sval;
sval.len = strlen(result->param.stz.sval);
}

res = (char*)pkg_malloc(sval.len + 1);
if(res==NULL) {
PKG_MEM_ERROR;
goto done;
}
memcpy(res, sval.s, sval.len);
res[sval.len] = '\0';

done:
snexpr_result_free(result);
end:
snexpr_destroy(e, &vars);
return res;
}

/* vi: set ts=4 sw=4 tw=79:ai:cindent: */
2 changes: 2 additions & 0 deletions src/core/ppcfg.h
Expand Up @@ -34,6 +34,7 @@
#define KSR_PPDEF_DEFINE 0
#define KSR_PPDEF_TRYDEF 1
#define KSR_PPDEF_REDEF 2
#define KSR_PPDEF_DEFEXP 3

typedef struct ksr_ppdefine {
str name;
Expand Down Expand Up @@ -67,6 +68,7 @@ void ksr_cfg_print_initial_state(void);

void pp_ifexp_eval(char *exval, int exlen);
void pp_ifexp_state(int state);
char *pp_defexp_eval(char *exval, int exlen);

#endif /*_PPCFG_H_*/

Expand Down

0 comments on commit 411fb39

Please sign in to comment.