X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=ucw%2Fconf-intr.c;h=deae4505cc93470ed9235407a3c19c21528c16ab;hb=a1fdee4766b969fd0786e3286ce878a2a1142bbd;hp=f7b678e155dd8d4058a922e4204e0b230a0c3abb;hpb=031256ad2e123eec58521f8e3eb9496c197641d2;p=libucw.git diff --git a/ucw/conf-intr.c b/ucw/conf-intr.c index f7b678e1..deae4505 100644 --- a/ucw/conf-intr.c +++ b/ucw/conf-intr.c @@ -228,6 +228,8 @@ interpret_add_list(struct cf_item *item, int number, char **pars, int *processed static char * interpret_add_bitmap(struct cf_item *item, int number, char **pars, int *processed, u32 *ptr, enum cf_operation op) { + if (op == OP_PREPEND || op == OP_APPEND) + op = OP_SET; if (op != OP_SET && op != OP_REMOVE) return cf_printf("Cannot apply operation %s on a bitmap", cf_op_names[op]); else if (item->type != CT_INT && item->type != CT_LOOKUP) @@ -517,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) { @@ -539,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) @@ -576,7 +597,7 @@ cf_find_item(const char *name, struct cf_item *item) } char * -cf_write_item(struct cf_item *item, enum cf_operation op, int number, char **pars) +cf_modify_item(struct cf_item *item, enum cf_operation op, int number, char **pars) { char *msg; int taken = 0; @@ -590,12 +611,19 @@ cf_write_item(struct cf_item *item, enum cf_operation op, int number, char **par break; case OP_APPEND: case OP_PREPEND: - if (item->cls == CC_DYNAMIC) - msg = interpret_add_dynamic(item, number, pars, &taken, item->ptr, op); - else if (item->cls == CC_LIST) - msg = interpret_add_list(item, number, pars, &taken, item->ptr, op); - else - return "The attribute does not support append/prepend"; + switch (item->cls) { + case CC_DYNAMIC: + msg = interpret_add_dynamic(item, number, pars, &taken, item->ptr, op); + break; + case CC_LIST: + msg = interpret_add_list(item, number, pars, &taken, item->ptr, op); + break; + case CC_BITMAP: + msg = interpret_add_bitmap(item, number, pars, &taken, item->ptr, op); + break; + default: + return "The attribute does not support append/prepend"; + } break; case OP_REMOVE: if (item->cls == CC_BITMAP)