return len;
 }
 
+static int argconfig_set_opt_val(enum argconfig_types type, union argconfig_val *opt_val, void *val)
+{
+       switch (type) {
+       case CFG_FLAG:
+               *(bool *)val = opt_val->bool_val;
+               break;
+       case CFG_LONG_SUFFIX:
+               *(uint64_t *)val = opt_val->long_suffix;
+               break;
+       case CFG_POSITIVE:
+               *(uint32_t *)val = opt_val->positive;
+               break;
+       case CFG_INT:
+               *(int *)val = opt_val->int_val;
+               break;
+       case CFG_LONG:
+               *(unsigned long *)val = opt_val->long_val;
+               break;
+       case CFG_DOUBLE:
+               *(double *)val = opt_val->double_val;
+               break;
+       case CFG_BYTE:
+               *(uint8_t *)val = opt_val->byte;
+               break;
+       case CFG_SHORT:
+               *(uint16_t *)val = opt_val->short_val;
+               break;
+       case CFG_INCREMENT:
+               *(int *)val = opt_val->increment;
+               break;
+       case CFG_STRING:
+               *(char **)val = opt_val->string;
+               break;
+       default:
+               break;
+       }
+
+       return 0;
+}
+
 static int argconfig_parse_val(struct argconfig_commandline_options *s, struct option *option,
                               int index)
 {
                val_len = argconfig_get_val_len(s->opt_val, v->str);
                if (strncasecmp(str, v->str, len > val_len ? len : val_len))
                        continue;
-               switch (v->type) {
-               case CFG_FLAG:
-                       *(bool *)val = v->val.bool_val;
-                       break;
-               case CFG_LONG_SUFFIX:
-                       *(uint64_t *)val = v->val.long_suffix;
-                       break;
-               case CFG_POSITIVE:
-                       *(uint32_t *)val = v->val.positive;
-                       break;
-               case CFG_INT:
-                       *(int *)val = v->val.int_val;
-                       break;
-               case CFG_LONG:
-                       *(unsigned long *)val = v->val.long_val;
-                       break;
-               case CFG_DOUBLE:
-                       *(double *)val = v->val.double_val;
-                       break;
-               case CFG_BYTE:
-                       *(uint8_t *)val = v->val.byte;
-                       break;
-               case CFG_SHORT:
-                       *(uint16_t *)val = v->val.short_val;
-                       break;
-               case CFG_INCREMENT:
-                       *(int *)val = v->val.increment;
-                       break;
-               case CFG_STRING:
-                       *(char **)val = v->val.string;
-                       break;
-               default:
-                       break;
-               }
-               return 0;
+               return argconfig_set_opt_val(v->type, &v->val, val);
        }
 
        return argconfig_parse_type(s, option, index, s->opt_val->type);