]> mj.ucw.cz Git - libucw.git/commitdiff
Config parser: Added a new operation `:reset', which is a shorthand
authorMartin Mares <mj@ucw.cz>
Thu, 19 Feb 2009 16:15:32 +0000 (17:15 +0100)
committerMartin Mares <mj@ucw.cz>
Thu, 19 Feb 2009 16:15:32 +0000 (17:15 +0100)
for `:clear' and `:append'.

I am not too confident about the name ... does anybody have a better idea?

ucw/conf-input.c
ucw/conf-intr.c
ucw/conf-test.cf
ucw/getopt.h

index 86a092c1024b223136c9ec7a1c838e1bcdbcc914..09d21c839c341a1af58ed0317943b7ee6159aac7 100644 (file)
@@ -255,7 +255,7 @@ parse_fastbuf(const char *name_fb, struct fastbuf *fb, uns depth)
                    default: op = OP_ALL;
                  }; break;
        case 'p': op = OP_PREPEND; break;
-       case 'r': op = OP_REMOVE; break;
+       case 'r': op = (c[1] && Clocase(c[2]) == 'm') ? OP_REMOVE : OP_RESET; break;
        case 'e': op = OP_EDIT; break;
        case 'b': op = OP_BEFORE; break;
        default: op = OP_SET; break;
index dcde639a4af7892e6991e7d99134b732d0917851..deae4505cc93470ed9235407a3c19c21528c16ab 100644 (file)
@@ -519,6 +519,21 @@ find_item(struct cf_section *curr_sec, const char *name, char **msg, void **ptr)
   }
 }
 
+static char *
+interpret_add(char *name, struct cf_item *item, int number, char **pars, int *takenp, void *ptr, enum cf_operation op)
+{
+  switch (item->cls) {
+    case CC_DYNAMIC:
+      return interpret_add_dynamic(item, number, pars, takenp, ptr, op);
+    case CC_LIST:
+      return interpret_add_list(item, number, pars, takenp, ptr, op);
+    case CC_BITMAP:
+      return interpret_add_bitmap(item, number, pars, takenp, ptr, op);
+    default:
+      return cf_printf("Operation %s not supported on attribute %s", cf_op_names[op], name);
+  }
+}
+
 char *
 cf_interpret_line(char *name, enum cf_operation op, int number, char **pars)
 {
@@ -541,18 +556,22 @@ cf_interpret_line(char *name, enum cf_operation op, int number, char **pars)
   op &= OP_MASK;
 
   int taken = 0;               // process as many parameters as possible
-  if (op == OP_CLEAR || op == OP_ALL)
-    msg = interpret_set_all(item, ptr, op);
-  else if (op == OP_SET)
-    msg = interpret_set_item(item, number, pars, &taken, ptr, 1);
-  else if (item->cls == CC_DYNAMIC)
-    msg = interpret_add_dynamic(item, number, pars, &taken, ptr, op);
-  else if (item->cls == CC_LIST)
-    msg = interpret_add_list(item, number, pars, &taken, ptr, op);
-  else if (item->cls == CC_BITMAP)
-    msg = interpret_add_bitmap(item, number, pars, &taken, ptr, op);
-  else
-    return cf_printf("Operation %s not supported on attribute %s", cf_op_names[op], name);
+  switch (op) {
+    case OP_CLEAR:
+    case OP_ALL:
+      msg = interpret_set_all(item, ptr, op);
+      break;
+    case OP_SET:
+      msg = interpret_set_item(item, number, pars, &taken, ptr, 1);
+      break;
+    case OP_RESET:
+      msg = interpret_set_all(item, ptr, OP_CLEAR);
+      if (!msg)
+       msg = interpret_add(name, item, number, pars, &taken, ptr, OP_APPEND);
+      break;
+    default:
+      msg = interpret_add(name, item, number, pars, &taken, ptr, op);
+  }
   if (msg)
     return msg;
   if (taken < number)
index 51bacd4a069fcee08fdd9e9a281af549d2136119..d533af4cd81ffe58883d0171481f7ca196fdbd7c 100644 (file)
@@ -34,7 +34,7 @@ Top { \
 
 unknown.ignored :-)
 
-top.slaves     cairns gpua 7 7 -10% +10%
+top.slaves:reset       cairns gpua 7 7 -10% +10%
 top.slaves     daintree rafc 4 5 -171%
 top.slaves     coogee pum 9 8
 top.slaves:prepend     {name=bondi; level=\
index c9daf24d4820a2f080875fa1045c027086e8b4e5..5fe66cead34d435eb0d67a2d1044052f51d2e631 100644 (file)
@@ -63,7 +63,7 @@ int cf_set(const char *string);
  * described in <<config:operations,configuration syntax>>.
  **/
 #define CF_OPERATIONS T(CLOSE) T(SET) T(CLEAR) T(ALL) \
-  T(APPEND) T(PREPEND) T(REMOVE) T(EDIT) T(AFTER) T(BEFORE) T(COPY)
+  T(APPEND) T(PREPEND) T(REMOVE) T(EDIT) T(AFTER) T(BEFORE) T(COPY) T(RESET)
   /* Closing brace finishes previous block.
    * Basic attributes (static, dynamic, parsed) can be used with SET.
    * Dynamic arrays can be used with SET, APPEND, PREPEND.