cfg framework: group instance support in the script
authorMiklos Tirpak <miklos@iptel.org>
Wed, 29 Sep 2010 14:40:30 +0000 (16:40 +0200)
committerMiklos Tirpak <miklos@iptel.org>
Wed, 29 Sep 2010 14:40:30 +0000 (16:40 +0200)
Variables within group instances can be set from the script,
for example:

tm[2].reparse_invite = 0;
tm[2].default_reason = "New reason";

Any assignmnet within a group instance creates the entire instance if
it does not exist yet.
Note: does not work with core variables yet.

cfg.y
cfg/cfg.c
cfg/cfg.h

diff --git a/cfg.y b/cfg.y
index d98372d..c43792b 100644 (file)
--- a/cfg.y
+++ b/cfg.y
@@ -1632,6 +1632,16 @@ cfg_var:
        | cfg_var_id DOT cfg_var_id EQUAL error { 
                yyerror("number or string expected"); 
        }
+       | cfg_var_id LBRACK NUMBER RBRACK DOT cfg_var_id EQUAL NUMBER {
+               if (cfg_ginst_var_int($1, $3, $6, $8)) {
+                       yyerror("variable cannot be added to the group instance");
+               }
+       }
+       | cfg_var_id LBRACK NUMBER RBRACK DOT cfg_var_id EQUAL STRING {
+               if (cfg_ginst_var_string($1, $3, $6, $8)) {
+                       yyerror("variable cannot be added to the group instance");
+               }
+       }
        ;
 
 module_stm:
index 88a34b2..2d0f640 100644 (file)
--- a/cfg/cfg.c
+++ b/cfg/cfg.c
@@ -227,6 +227,56 @@ int cfg_declare_str(char *group_name, char *var_name, char *val, char *descr)
        return 0;
 }
 
+/* Add a varibale to a group instance with integer type.
+ * The group instance is created if it does not exist.
+ * wrapper function for new_add_var()
+ */
+int cfg_ginst_var_int(char *group_name, unsigned int group_id, char *var_name,
+                       int val)
+{
+       str     gname, vname;
+
+       gname.s = group_name;
+       gname.len = strlen(group_name);
+       vname.s = var_name;
+       vname.len = strlen(var_name);
+
+       return new_add_var(&gname, group_id, &vname,
+                       (void *)(long)val, CFG_VAR_INT);
+}
+
+/* Add a varibale to a group instance with string type.
+ * The group instance is created if it does not exist.
+ * wrapper function for new_add_var()
+ */
+int cfg_ginst_var_string(char *group_name, unsigned int group_id, char *var_name,
+                       char *val)
+{
+       str     gname, vname;
+
+       gname.s = group_name;
+       gname.len = strlen(group_name);
+       vname.s = var_name;
+       vname.len = strlen(var_name);
+
+       return new_add_var(&gname, group_id, &vname,
+                       (void *)val, CFG_VAR_STRING);
+}
+
+/* Create a new group instance.
+ * wrapper function for new_add_var()
+ */
+int cfg_new_ginst(char *group_name, unsigned int group_id)
+{
+       str     gname;
+
+       gname.s = group_name;
+       gname.len = strlen(group_name);
+
+       return new_add_var(&gname, group_id, NULL /* var */,
+                       NULL /* val */, 0 /* type */);
+}
+
 /* returns the handle of a cfg group */
 void **cfg_get_handle(char *gname)
 {
index 8691805..b196d26 100644 (file)
--- a/cfg/cfg.h
+++ b/cfg/cfg.h
@@ -87,6 +87,25 @@ int cfg_declare_int(char *group_name, char *var_name,
 /* declares a single variable with str type */
 int cfg_declare_str(char *group_name, char *var_name, char *val, char *descr);
 
+/* Add a varibale to a group instance with integer type.
+ * The group instance is created if it does not exist.
+ * wrapper function for new_add_var()
+ */
+int cfg_ginst_var_int(char *group_name, unsigned int group_id, char *var_name,
+                       int val);
+
+/* Add a varibale to a group instance with string type.
+ * The group instance is created if it does not exist.
+ * wrapper function for new_add_var()
+ */
+int cfg_ginst_var_string(char *group_name, unsigned int group_id, char *var_name,
+                       char *val);
+
+/* Create a new group instance.
+ * wrapper function for new_add_var()
+ */
+int cfg_new_ginst(char *group_name, unsigned int group_id);
+
 /* returns the handle of a cfg group */
 void **cfg_get_handle(char *gname);