]> gitweb.hhaalo.de Git - sane-kds-s2000w-net.git/commitdiff
refactor option descriptor init
authorBastian Dehn <hhaalo@arcor.de>
Sat, 21 Mar 2026 16:20:58 +0000 (17:20 +0100)
committerBastian Dehn <hhaalo@arcor.de>
Sat, 21 Mar 2026 16:20:58 +0000 (17:20 +0100)
src/kds_s2000w_option_descriptors.c

index b4796636343e809a4d602d3fe455becaef6ff023..d6a31d16df46615b9336d63f153a2e74fa9a670d 100644 (file)
 option_descriptor_t** kds_s2000w_descriptors = NULL;
 uint8_t kds_s2000w_max_option_count = 0;
 
+option_descriptor_t* _kds_s2000w_option_descriptor_descriptor_init()
+{
+       option_descriptor_t* descriptor = malloc(sizeof(option_descriptor_t));
+       if (descriptor == NULL)
+               return NULL;
+
+       descriptor->descriptor = malloc(sizeof(SANE_Option_Descriptor));
+       if (descriptor->descriptor == NULL) {
+               free(descriptor);
+               return NULL;
+       }
+
+       return descriptor;
+}
+
 void _kds_s2000w_option_descriptor_descriptor_free(option_descriptor_t* descriptor)
 {
        if (descriptor == NULL)
@@ -44,7 +59,7 @@ void _kds_s2000w_option_descriptor_descriptor_free(option_descriptor_t* descript
 SANE_Status _kds_s2000w_option_descriptor_validate()
 {
        for (int i = 0; i < kds_s2000w_max_option_count; i++) {
-               if (kds_s2000w_descriptors[i]->descriptor == NULL) {
+               if (kds_s2000w_descriptors[i] == NULL) {
                        kds_s2000w_option_descriptors_free();
                        return SANE_STATUS_NO_MEM;
                }
@@ -53,20 +68,21 @@ SANE_Status _kds_s2000w_option_descriptor_validate()
        return SANE_STATUS_GOOD;
 }
 
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_num_options()
+option_descriptor_t* _kds_s2000w_option_descriptor_num_options()
 {
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
+       option_descriptor_t* descriptor = _kds_s2000w_option_descriptor_descriptor_init();
        if (descriptor == NULL)
                return NULL;
 
-       descriptor->name = SANE_NAME_NUM_OPTIONS;
-       descriptor->title = SANE_TITLE_NUM_OPTIONS;
-       descriptor->desc = SANE_DESC_NUM_OPTIONS;
-       descriptor->type = SANE_TYPE_INT;
-       descriptor->unit = SANE_UNIT_NONE;
-       descriptor->size = sizeof(SANE_Int);
-       descriptor->cap = SANE_CAP_SOFT_DETECT;
-       descriptor->constraint_type = SANE_CONSTRAINT_NONE;
+       descriptor->config_name = OPTION_COUNT;
+       descriptor->descriptor->name = SANE_NAME_NUM_OPTIONS;
+       descriptor->descriptor->title = SANE_TITLE_NUM_OPTIONS;
+       descriptor->descriptor->desc = SANE_DESC_NUM_OPTIONS;
+       descriptor->descriptor->type = SANE_TYPE_INT;
+       descriptor->descriptor->unit = SANE_UNIT_NONE;
+       descriptor->descriptor->size = sizeof(SANE_Int);
+       descriptor->descriptor->cap = SANE_CAP_SOFT_DETECT;
+       descriptor->descriptor->constraint_type = SANE_CONSTRAINT_NONE;
 
        return descriptor;
 }
@@ -74,91 +90,98 @@ SANE_Option_Descriptor* _kds_s2000w_option_descriptor_num_options()
 /*******************************************************************************
  * standard group
  ******************************************************************************/
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_standard_group()
+option_descriptor_t* _kds_s2000w_option_descriptor_standard_group()
 {
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
+       option_descriptor_t* descriptor = _kds_s2000w_option_descriptor_descriptor_init();
        if (descriptor == NULL)
                return NULL;
 
-       descriptor->name = SANE_NAME_STANDARD;
-       descriptor->title = SANE_TITLE_STANDARD;
-       descriptor->desc = SANE_DESC_STANDARD;
-       descriptor->type = SANE_TYPE_GROUP;
-       descriptor->unit = SANE_UNIT_NONE;
-       descriptor->size = 0;
-       descriptor->cap = SANE_CAP_SOFT_DETECT;
-       descriptor->constraint_type = SANE_CONSTRAINT_NONE;
+       descriptor->config_name = STANDARD_GROUP;
+       descriptor->descriptor->name = SANE_NAME_STANDARD;
+       descriptor->descriptor->title = SANE_TITLE_STANDARD;
+       descriptor->descriptor->desc = SANE_DESC_STANDARD;
+       descriptor->descriptor->type = SANE_TYPE_GROUP;
+       descriptor->descriptor->unit = SANE_UNIT_NONE;
+       descriptor->descriptor->size = 0;
+       descriptor->descriptor->cap = SANE_CAP_SOFT_DETECT;
+       descriptor->descriptor->constraint_type = SANE_CONSTRAINT_NONE;
 
        return descriptor;
 }
 
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_scan_source()
+option_descriptor_t* _kds_s2000w_option_descriptor_scan_source()
 {
+       option_descriptor_t* descriptor = _kds_s2000w_option_descriptor_descriptor_init();
+       if (descriptor == NULL)
+               return NULL;
+
        char** constraint = malloc(sizeof(SANE_String_Const*) * 4);
-       if (constraint == NULL)
+       if (constraint == NULL) {
+               _kds_s2000w_option_descriptor_descriptor_free(descriptor);
                return NULL;
+       }
 
        constraint[0] = "DocumentFeeder";
        constraint[1] = "Automatic";
        constraint[2] = "Flatbed";
        constraint[3] = NULL;
 
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
-       if (descriptor == NULL) {
-               free(constraint);
-               constraint = NULL;
-               return NULL;
-       }
-
-       descriptor->name = SANE_NAME_SCAN_SOURCE;
-       descriptor->title = SANE_TITLE_SCAN_SOURCE;
-       descriptor->desc = SANE_DESC_SCAN_SOURCE;
-       descriptor->type = SANE_TYPE_STRING;
-       descriptor->unit = SANE_UNIT_NONE;
-       descriptor->size = sizeof(SANE_String_Const*) * 4;
-       descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
-       descriptor->constraint_type = SANE_CONSTRAINT_STRING_LIST;
-       descriptor->constraint.string_list = (SANE_String_Const*) constraint;
+       descriptor->config_name = SCAN_SOURCE;
+       descriptor->descriptor->name = SANE_NAME_SCAN_SOURCE;
+       descriptor->descriptor->title = SANE_TITLE_SCAN_SOURCE;
+       descriptor->descriptor->desc = SANE_DESC_SCAN_SOURCE;
+       descriptor->descriptor->type = SANE_TYPE_STRING;
+       descriptor->descriptor->unit = SANE_UNIT_NONE;
+       descriptor->descriptor->size = sizeof(SANE_String_Const*) * 4;
+       descriptor->descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
+       descriptor->descriptor->constraint_type = SANE_CONSTRAINT_STRING_LIST;
+       descriptor->descriptor->constraint.string_list = (SANE_String_Const*) constraint;
 
        return descriptor;
 }
 
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_color_mode()
+option_descriptor_t* _kds_s2000w_option_descriptor_color_mode()
 {
+       option_descriptor_t* descriptor = _kds_s2000w_option_descriptor_descriptor_init();
+       if (descriptor == NULL)
+               return NULL;
+
        char** constraint = malloc(sizeof(SANE_String_Const*) * 4);
-       if (constraint == NULL)
+       if (constraint == NULL) {
+               _kds_s2000w_option_descriptor_descriptor_free(descriptor);
                return NULL;
+       }
 
        constraint[0] = "Color";
        constraint[1] = "Gray";
        constraint[2] = "BW";
        constraint[3] = NULL;
 
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
-       if (descriptor == NULL) {
-               free(constraint);
-               constraint = NULL;
-               return NULL;
-       }
-
-       descriptor->name = SANE_NAME_SCAN_MODE;
-       descriptor->title = SANE_TITLE_SCAN_MODE;
-       descriptor->desc = SANE_DESC_SCAN_MODE;
-       descriptor->type = SANE_TYPE_STRING;
-       descriptor->unit = SANE_UNIT_NONE;
-       descriptor->size = sizeof(SANE_String_Const*) * 4;
-       descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
-       descriptor->constraint_type = SANE_CONSTRAINT_STRING_LIST;
-       descriptor->constraint.string_list = (SANE_String_Const*) constraint;
+       descriptor->config_name = COLOR_MODE;
+       descriptor->descriptor->name = SANE_NAME_SCAN_MODE;
+       descriptor->descriptor->title = SANE_TITLE_SCAN_MODE;
+       descriptor->descriptor->desc = SANE_DESC_SCAN_MODE;
+       descriptor->descriptor->type = SANE_TYPE_STRING;
+       descriptor->descriptor->unit = SANE_UNIT_NONE;
+       descriptor->descriptor->size = sizeof(SANE_String_Const*) * 4;
+       descriptor->descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
+       descriptor->descriptor->constraint_type = SANE_CONSTRAINT_STRING_LIST;
+       descriptor->descriptor->constraint.string_list = (SANE_String_Const*) constraint;
 
        return descriptor;
 }
 
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_dpi()
+option_descriptor_t* _kds_s2000w_option_descriptor_dpi()
 {
+       option_descriptor_t* descriptor = _kds_s2000w_option_descriptor_descriptor_init();
+       if (descriptor == NULL)
+               return NULL;
+
        SANE_Word* constraint = malloc(sizeof(SANE_Word) * 6);
-       if (constraint == NULL)
+       if (constraint == NULL) {
+               _kds_s2000w_option_descriptor_descriptor_free(descriptor);
                return NULL;
+       }
 
        constraint[0] = 5;
        constraint[1] = 100;
@@ -167,52 +190,46 @@ SANE_Option_Descriptor* _kds_s2000w_option_descriptor_dpi()
        constraint[4] = 300;
        constraint[5] = 600;
 
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
-       if (descriptor == NULL) {
-               free(constraint);
-               constraint = NULL;
-               return NULL;
-       }
-
-       descriptor->name = SANE_NAME_SCAN_RESOLUTION;
-       descriptor->title = SANE_TITLE_SCAN_RESOLUTION;
-       descriptor->desc = SANE_DESC_SCAN_RESOLUTION;
-       descriptor->type = SANE_TYPE_INT;
-       descriptor->unit = SANE_UNIT_DPI;
-       descriptor->size = sizeof(SANE_Int);
-       descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
-       descriptor->constraint_type = SANE_CONSTRAINT_WORD_LIST;
-       descriptor->constraint.word_list = constraint;
+       descriptor->config_name = DPI;
+       descriptor->descriptor->name = SANE_NAME_SCAN_RESOLUTION;
+       descriptor->descriptor->title = SANE_TITLE_SCAN_RESOLUTION;
+       descriptor->descriptor->desc = SANE_DESC_SCAN_RESOLUTION;
+       descriptor->descriptor->type = SANE_TYPE_INT;
+       descriptor->descriptor->unit = SANE_UNIT_DPI;
+       descriptor->descriptor->size = sizeof(SANE_Int);
+       descriptor->descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
+       descriptor->descriptor->constraint_type = SANE_CONSTRAINT_WORD_LIST;
+       descriptor->descriptor->constraint.word_list = constraint;
 
        return descriptor;
 }
 
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_scanside()
+option_descriptor_t* _kds_s2000w_option_descriptor_scanside()
 {
+       option_descriptor_t* descriptor = _kds_s2000w_option_descriptor_descriptor_init();
+       if (descriptor == NULL)
+               return NULL;
+
        char** constraint = malloc(sizeof(SANE_String_Const*) * 3);
-       if (constraint == NULL)
+       if (constraint == NULL) {
+               _kds_s2000w_option_descriptor_descriptor_free(descriptor);
                return NULL;
+       }
 
        constraint[0] = "Simplex";
        constraint[1] = "Duplex";
        constraint[2] = NULL;
 
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
-       if (descriptor == NULL) {
-               free(constraint);
-               constraint = NULL;
-               return NULL;
-       }
-
-       descriptor->name = "scanside";
-       descriptor->title = "Duplex Mode";
-       descriptor->desc = "Duplex Mode";
-       descriptor->type = SANE_TYPE_STRING;
-       descriptor->unit = SANE_UNIT_NONE;
-       descriptor->size = sizeof(SANE_String_Const*) * 3;
-       descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
-       descriptor->constraint_type = SANE_CONSTRAINT_STRING_LIST;
-       descriptor->constraint.string_list = (SANE_String_Const*) constraint;
+       descriptor->config_name = SCAN_SIDE;
+       descriptor->descriptor->name = "scanside";
+       descriptor->descriptor->title = "Duplex Mode";
+       descriptor->descriptor->desc = "Duplex Mode";
+       descriptor->descriptor->type = SANE_TYPE_STRING;
+       descriptor->descriptor->unit = SANE_UNIT_NONE;
+       descriptor->descriptor->size = sizeof(SANE_String_Const*) * 3;
+       descriptor->descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
+       descriptor->descriptor->constraint_type = SANE_CONSTRAINT_STRING_LIST;
+       descriptor->descriptor->constraint.string_list = (SANE_String_Const*) constraint;
 
        return descriptor;
 }
@@ -220,29 +237,36 @@ SANE_Option_Descriptor* _kds_s2000w_option_descriptor_scanside()
 /*******************************************************************************
  * geometry group
  ******************************************************************************/
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_geometry_group()
+option_descriptor_t* _kds_s2000w_option_descriptor_geometry_group()
 {
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
+       option_descriptor_t* descriptor = _kds_s2000w_option_descriptor_descriptor_init();
        if (descriptor == NULL)
                return NULL;
 
-       descriptor->name = SANE_NAME_GEOMETRY;
-       descriptor->title = SANE_TITLE_GEOMETRY;
-       descriptor->desc = SANE_DESC_GEOMETRY;
-       descriptor->type = SANE_TYPE_GROUP;
-       descriptor->unit = SANE_UNIT_NONE;
-       descriptor->size = 0;
-       descriptor->cap = SANE_CAP_SOFT_DETECT;
-       descriptor->constraint_type = SANE_CONSTRAINT_NONE;
+       descriptor->config_name = GEOMETRY_GROUP;
+       descriptor->descriptor->name = SANE_NAME_GEOMETRY;
+       descriptor->descriptor->title = SANE_TITLE_GEOMETRY;
+       descriptor->descriptor->desc = SANE_DESC_GEOMETRY;
+       descriptor->descriptor->type = SANE_TYPE_GROUP;
+       descriptor->descriptor->unit = SANE_UNIT_NONE;
+       descriptor->descriptor->size = 0;
+       descriptor->descriptor->cap = SANE_CAP_SOFT_DETECT;
+       descriptor->descriptor->constraint_type = SANE_CONSTRAINT_NONE;
 
        return descriptor;
 }
 
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_cropping_mode()
+option_descriptor_t* _kds_s2000w_option_descriptor_cropping_mode()
 {
+       option_descriptor_t* descriptor = _kds_s2000w_option_descriptor_descriptor_init();
+       if (descriptor == NULL)
+               return NULL;
+
        char** constraint = malloc(sizeof(SANE_String_Const*) * 5);
-       if (constraint == NULL)
+       if (constraint == NULL) {
+               _kds_s2000w_option_descriptor_descriptor_free(descriptor);
                return NULL;
+       }
 
        constraint[0] = "AutomaticStraighten";
        constraint[1] = "Automatic";
@@ -250,172 +274,166 @@ SANE_Option_Descriptor* _kds_s2000w_option_descriptor_cropping_mode()
        constraint[3] = "Manual";
        constraint[4] = NULL;
 
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
-       if (descriptor == NULL) {
-               free(constraint);
-               constraint = NULL;
-               return NULL;
-       }
-
-       descriptor->name = "cropping-mode";
-       descriptor->title = "Cropping Mode";
-       descriptor->desc = "Cropping Mode";
-       descriptor->type = SANE_TYPE_STRING;
-       descriptor->unit = SANE_UNIT_NONE;
-       descriptor->size = sizeof(SANE_String_Const*) * 5;
-       descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
-       descriptor->constraint_type = SANE_CONSTRAINT_STRING_LIST;
-       descriptor->constraint.string_list = (SANE_String_Const*) constraint;
+       descriptor->config_name = CROPPING_MODE;
+       descriptor->descriptor->name = "cropping-mode";
+       descriptor->descriptor->title = "Cropping Mode";
+       descriptor->descriptor->desc = "Cropping Mode";
+       descriptor->descriptor->type = SANE_TYPE_STRING;
+       descriptor->descriptor->unit = SANE_UNIT_NONE;
+       descriptor->descriptor->size = sizeof(SANE_String_Const*) * 5;
+       descriptor->descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
+       descriptor->descriptor->constraint_type = SANE_CONSTRAINT_STRING_LIST;
+       descriptor->descriptor->constraint.string_list = (SANE_String_Const*) constraint;
 
        return descriptor;
 }
 
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_cropping_image()
+option_descriptor_t* _kds_s2000w_option_descriptor_cropping_image()
 {
+       option_descriptor_t* descriptor = _kds_s2000w_option_descriptor_descriptor_init();
+       if (descriptor == NULL)
+               return NULL;
+
        char** constraint = malloc(sizeof(SANE_String_Const*) * 3);
-       if (constraint == NULL)
+       if (constraint == NULL) {
+               _kds_s2000w_option_descriptor_descriptor_free(descriptor);
                return NULL;
+       }
 
        constraint[0] = "EntireDocument";
        constraint[1] = "PartialDocument";
        constraint[2] = NULL;
 
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
-       if (descriptor == NULL) {
-               free(constraint);
-               constraint = NULL;
-               return NULL;
-       }
-
-       descriptor->name = "cropping-image";
-       descriptor->title = "Cropping Image";
-       descriptor->desc = "Cropping Image";
-       descriptor->type = SANE_TYPE_STRING;
-       descriptor->unit = SANE_UNIT_NONE;
-       descriptor->size = sizeof(SANE_String_Const*) * 3;
-       descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
-       descriptor->constraint_type = SANE_CONSTRAINT_STRING_LIST;
-       descriptor->constraint.string_list = (SANE_String_Const*) constraint;
+       descriptor->config_name = CROPPING_IMAGE;
+       descriptor->descriptor->name = "cropping-image";
+       descriptor->descriptor->title = "Cropping Image";
+       descriptor->descriptor->desc = "Cropping Image";
+       descriptor->descriptor->type = SANE_TYPE_STRING;
+       descriptor->descriptor->unit = SANE_UNIT_NONE;
+       descriptor->descriptor->size = sizeof(SANE_String_Const*) * 3;
+       descriptor->descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
+       descriptor->descriptor->constraint_type = SANE_CONSTRAINT_STRING_LIST;
+       descriptor->descriptor->constraint.string_list = (SANE_String_Const*) constraint;
 
        return descriptor;
 }
 
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_image_offset_x()
+option_descriptor_t* _kds_s2000w_option_descriptor_image_offset_x()
 {
+       option_descriptor_t* descriptor = _kds_s2000w_option_descriptor_descriptor_init();
+       if (descriptor == NULL)
+               return NULL;
+
        SANE_Range* constraint = malloc(sizeof(SANE_Range));
-       if (constraint == NULL)
+       if (constraint == NULL) {
+               _kds_s2000w_option_descriptor_descriptor_free(descriptor);
                return NULL;
+       }
 
        constraint->min = 0;
        constraint->max = 2250;
        constraint->quant = 30;
 
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
-       if (descriptor == NULL) {
-               free(constraint);
-               constraint = NULL;
-               return NULL;
-       }
-
-       descriptor->name = SANE_NAME_SCAN_TL_X;
-       descriptor->title = SANE_TITLE_SCAN_TL_X;
-       descriptor->desc = SANE_DESC_SCAN_TL_X;
-       descriptor->type = SANE_TYPE_INT;
-       descriptor->unit = SANE_UNIT_PIXEL;
-       descriptor->size = sizeof(SANE_Int);
-       descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
-       descriptor->constraint_type = SANE_CONSTRAINT_RANGE;
-       descriptor->constraint.range = constraint;
+       descriptor->config_name = IMAGE_OFFSET_X;
+       descriptor->descriptor->name = SANE_NAME_SCAN_TL_X;
+       descriptor->descriptor->title = SANE_TITLE_SCAN_TL_X;
+       descriptor->descriptor->desc = SANE_DESC_SCAN_TL_X;
+       descriptor->descriptor->type = SANE_TYPE_INT;
+       descriptor->descriptor->unit = SANE_UNIT_PIXEL;
+       descriptor->descriptor->size = sizeof(SANE_Int);
+       descriptor->descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
+       descriptor->descriptor->constraint_type = SANE_CONSTRAINT_RANGE;
+       descriptor->descriptor->constraint.range = constraint;
 
        return descriptor;
 }
 
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_image_offset_y()
+option_descriptor_t* _kds_s2000w_option_descriptor_image_offset_y()
 {
+       option_descriptor_t* descriptor = _kds_s2000w_option_descriptor_descriptor_init();
+       if (descriptor == NULL)
+               return NULL;
+
        SANE_Range* constraint = malloc(sizeof(SANE_Range));
-       if (constraint == NULL)
+       if (constraint == NULL) {
+               _kds_s2000w_option_descriptor_descriptor_free(descriptor);
                return NULL;
+       }
 
        constraint->min = 0;
        constraint->max = 3900;
        constraint->quant = 30;
 
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
-       if (descriptor == NULL) {
-               free(constraint);
-               constraint = NULL;
-               return NULL;
-       }
-
-       descriptor->name = SANE_NAME_SCAN_TL_Y;
-       descriptor->title = SANE_TITLE_SCAN_TL_Y;
-       descriptor->desc = SANE_DESC_SCAN_TL_Y;
-       descriptor->type = SANE_TYPE_INT;
-       descriptor->unit = SANE_UNIT_PIXEL;
-       descriptor->size = sizeof(SANE_Int);
-       descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
-       descriptor->constraint_type = SANE_CONSTRAINT_RANGE;
-       descriptor->constraint.range = constraint;
+       descriptor->config_name = IMAGE_OFFSET_Y;
+       descriptor->descriptor->name = SANE_NAME_SCAN_TL_Y;
+       descriptor->descriptor->title = SANE_TITLE_SCAN_TL_Y;
+       descriptor->descriptor->desc = SANE_DESC_SCAN_TL_Y;
+       descriptor->descriptor->type = SANE_TYPE_INT;
+       descriptor->descriptor->unit = SANE_UNIT_PIXEL;
+       descriptor->descriptor->size = sizeof(SANE_Int);
+       descriptor->descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
+       descriptor->descriptor->constraint_type = SANE_CONSTRAINT_RANGE;
+       descriptor->descriptor->constraint.range = constraint;
 
        return descriptor;
 }
 
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_image_width()
+option_descriptor_t* _kds_s2000w_option_descriptor_image_width()
 {
+       option_descriptor_t* descriptor = _kds_s2000w_option_descriptor_descriptor_init();
+       if (descriptor == NULL)
+               return NULL;
+
        SANE_Range* constraint = malloc(sizeof(SANE_Range));
-       if (constraint == NULL)
+       if (constraint == NULL) {
+               _kds_s2000w_option_descriptor_descriptor_free(descriptor);
                return NULL;
+       }
 
        constraint->min = 300;
        constraint->max = 2550;
        constraint->quant = 30;
 
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
-       if (descriptor == NULL) {
-               free(constraint);
-               constraint = NULL;
-               return NULL;
-       }
-
-       descriptor->name = SANE_NAME_SCAN_BR_X;
-       descriptor->title = SANE_TITLE_SCAN_BR_X;
-       descriptor->desc = SANE_DESC_SCAN_BR_X;
-       descriptor->type = SANE_TYPE_INT;
-       descriptor->unit = SANE_UNIT_PIXEL;
-       descriptor->size = sizeof(SANE_Int);
-       descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
-       descriptor->constraint_type = SANE_CONSTRAINT_RANGE;
-       descriptor->constraint.range = constraint;
+       descriptor->config_name = IMAGE_WIDTH;
+       descriptor->descriptor->name = SANE_NAME_SCAN_BR_X;
+       descriptor->descriptor->title = SANE_TITLE_SCAN_BR_X;
+       descriptor->descriptor->desc = SANE_DESC_SCAN_BR_X;
+       descriptor->descriptor->type = SANE_TYPE_INT;
+       descriptor->descriptor->unit = SANE_UNIT_PIXEL;
+       descriptor->descriptor->size = sizeof(SANE_Int);
+       descriptor->descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
+       descriptor->descriptor->constraint_type = SANE_CONSTRAINT_RANGE;
+       descriptor->descriptor->constraint.range = constraint;
 
        return descriptor;
 }
 
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_image_height()
+option_descriptor_t* _kds_s2000w_option_descriptor_image_height()
 {
+       option_descriptor_t* descriptor = _kds_s2000w_option_descriptor_descriptor_init();
+       if (descriptor == NULL)
+               return NULL;
+
        SANE_Range* constraint = malloc(sizeof(SANE_Range));
-       if (constraint == NULL)
+       if (constraint == NULL) {
+               _kds_s2000w_option_descriptor_descriptor_free(descriptor);
                return NULL;
+       }
 
        constraint->min = 300;
        constraint->max = 4200;
        constraint->quant = 30;
 
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
-       if (descriptor == NULL) {
-               free(constraint);
-               constraint = NULL;
-               return NULL;
-       }
-
-       descriptor->name = SANE_NAME_SCAN_BR_Y;
-       descriptor->title = SANE_TITLE_SCAN_BR_Y;
-       descriptor->desc = SANE_DESC_SCAN_BR_Y;
-       descriptor->type = SANE_TYPE_INT;
-       descriptor->unit = SANE_UNIT_PIXEL;
-       descriptor->size = sizeof(SANE_Int);
-       descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
-       descriptor->constraint_type = SANE_CONSTRAINT_RANGE;
-       descriptor->constraint.range = constraint;
+       descriptor->config_name = IMAGE_HEIGHT;
+       descriptor->descriptor->name = SANE_NAME_SCAN_BR_Y;
+       descriptor->descriptor->title = SANE_TITLE_SCAN_BR_Y;
+       descriptor->descriptor->desc = SANE_DESC_SCAN_BR_Y;
+       descriptor->descriptor->type = SANE_TYPE_INT;
+       descriptor->descriptor->unit = SANE_UNIT_PIXEL;
+       descriptor->descriptor->size = sizeof(SANE_Int);
+       descriptor->descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
+       descriptor->descriptor->constraint_type = SANE_CONSTRAINT_RANGE;
+       descriptor->descriptor->constraint.range = constraint;
 
        return descriptor;
 }
@@ -423,142 +441,143 @@ SANE_Option_Descriptor* _kds_s2000w_option_descriptor_image_height()
 /*******************************************************************************
  * boldness smoothing group
  ******************************************************************************/
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_boldness_smoothing_group()
+option_descriptor_t* _kds_s2000w_option_descriptor_boldness_smoothing_group()
 {
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
+       option_descriptor_t* descriptor = _kds_s2000w_option_descriptor_descriptor_init();
        if (descriptor == NULL)
                return NULL;
 
-       descriptor->name = "boldness-smoothing";
-       descriptor->title = "Boldness / Smoothing Options";
-       descriptor->desc = "Foreground boldness Options and background smoothing options";
-       descriptor->type = SANE_TYPE_GROUP;
-       descriptor->unit = SANE_UNIT_NONE;
-       descriptor->size = 0;
-       descriptor->cap = SANE_CAP_SOFT_DETECT;
-       descriptor->constraint_type = SANE_CONSTRAINT_NONE;
+       descriptor->config_name = BOLDNESS_SMOOTHING_GROUP;
+       descriptor->descriptor->name = "boldness-smoothing";
+       descriptor->descriptor->title = "Boldness / Smoothing Options";
+       descriptor->descriptor->desc = "Foreground boldness Options and background smoothing options";
+       descriptor->descriptor->type = SANE_TYPE_GROUP;
+       descriptor->descriptor->unit = SANE_UNIT_NONE;
+       descriptor->descriptor->size = 0;
+       descriptor->descriptor->cap = SANE_CAP_SOFT_DETECT;
+       descriptor->descriptor->constraint_type = SANE_CONSTRAINT_NONE;
 
        return descriptor;
 }
 
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_foreground_boldness_mode()
+option_descriptor_t* _kds_s2000w_option_descriptor_foreground_boldness_mode()
 {
+       option_descriptor_t* descriptor = _kds_s2000w_option_descriptor_descriptor_init();
+       if (descriptor == NULL)
+               return NULL;
+
        char** constraint = malloc(sizeof(SANE_String_Const*) * 4);
-       if (constraint == NULL)
+       if (constraint == NULL) {
+               _kds_s2000w_option_descriptor_descriptor_free(descriptor);
                return NULL;
+       }
 
        constraint[0] = "None";
        constraint[1] = "AutomaticAdvanced";
        constraint[2] = "Automatic";
        constraint[3] = NULL;
 
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
-       if (descriptor == NULL) {
-               free(constraint);
-               constraint = NULL;
-               return NULL;
-       }
-
-       descriptor->name = "foreground-boldness-mode";
-       descriptor->title = "Foreground Boldness Mode";
-       descriptor->desc = "Foreground Boldness Mode";
-       descriptor->type = SANE_TYPE_STRING;
-       descriptor->unit = SANE_UNIT_NONE;
-       descriptor->size = sizeof(SANE_String_Const*) * 4;
-       descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
-       descriptor->constraint_type = SANE_CONSTRAINT_STRING_LIST;
-       descriptor->constraint.string_list = (SANE_String_Const*) constraint;
+       descriptor->config_name = FOREGROUND_BOLDNESS_MODE;
+       descriptor->descriptor->name = "foreground-boldness-mode";
+       descriptor->descriptor->title = "Foreground Boldness Mode";
+       descriptor->descriptor->desc = "Foreground Boldness Mode";
+       descriptor->descriptor->type = SANE_TYPE_STRING;
+       descriptor->descriptor->unit = SANE_UNIT_NONE;
+       descriptor->descriptor->size = sizeof(SANE_String_Const*) * 4;
+       descriptor->descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
+       descriptor->descriptor->constraint_type = SANE_CONSTRAINT_STRING_LIST;
+       descriptor->descriptor->constraint.string_list = (SANE_String_Const*) constraint;
 
        return descriptor;
 }
 
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_foreground_boldness_aggressiveness()
+option_descriptor_t* _kds_s2000w_option_descriptor_foreground_boldness_aggressiveness()
 {
+       option_descriptor_t* descriptor = _kds_s2000w_option_descriptor_descriptor_init();
+       if (descriptor == NULL)
+               return NULL;
+
        SANE_Range* constraint = malloc(sizeof(SANE_Range));
-       if (constraint == NULL)
+       if (constraint == NULL) {
+               _kds_s2000w_option_descriptor_descriptor_free(descriptor);
                return NULL;
+       }
 
        constraint->min = -10;
        constraint->max = 10;
        constraint->quant = 1;
 
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
-       if (descriptor == NULL) {
-               free(constraint);
-               constraint = NULL;
-               return NULL;
-       }
-
-       descriptor->name = "foreground-boldness-aggressiveness";
-       descriptor->title = "Foreground Boldness Aggressiveness";
-       descriptor->desc = "Foreground Boldness Aggressiveness";
-       descriptor->type = SANE_TYPE_INT;
-       descriptor->unit = SANE_UNIT_NONE;
-       descriptor->size = sizeof(SANE_Int);
-       descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
-       descriptor->constraint_type = SANE_CONSTRAINT_RANGE;
-       descriptor->constraint.range = constraint;
+       descriptor->config_name = FOREGROUND_BOLDNESS_AGGRESSIVENESS;
+       descriptor->descriptor->name = "foreground-boldness-aggressiveness";
+       descriptor->descriptor->title = "Foreground Boldness Aggressiveness";
+       descriptor->descriptor->desc = "Foreground Boldness Aggressiveness";
+       descriptor->descriptor->type = SANE_TYPE_INT;
+       descriptor->descriptor->unit = SANE_UNIT_NONE;
+       descriptor->descriptor->size = sizeof(SANE_Int);
+       descriptor->descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
+       descriptor->descriptor->constraint_type = SANE_CONSTRAINT_RANGE;
+       descriptor->descriptor->constraint.range = constraint;
 
        return descriptor;
 }
 
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_background_smoothing_mode()
+option_descriptor_t* _kds_s2000w_option_descriptor_background_smoothing_mode()
 {
+       option_descriptor_t* descriptor = _kds_s2000w_option_descriptor_descriptor_init();
+       if (descriptor == NULL)
+               return NULL;
+
        char** constraint = malloc(sizeof(SANE_String_Const*) * 4);
-       if (constraint == NULL)
+       if (constraint == NULL) {
+               _kds_s2000w_option_descriptor_descriptor_free(descriptor);
                return NULL;
+       }
 
        constraint[0] = "None";
        constraint[1] = "AutomaticAdvanced";
        constraint[2] = "Automatic";
        constraint[3] = NULL;
 
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
-       if (descriptor == NULL) {
-               free(constraint);
-               constraint = NULL;
-               return NULL;
-       }
-
-       descriptor->name = "background-smoothing-mode";
-       descriptor->title = "Background Smoothing Mode";
-       descriptor->desc = "Background Smoothing Mode";
-       descriptor->type = SANE_TYPE_STRING;
-       descriptor->unit = SANE_UNIT_NONE;
-       descriptor->size = sizeof(SANE_String_Const*) * 4;
-       descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
-       descriptor->constraint_type = SANE_CONSTRAINT_STRING_LIST;
-       descriptor->constraint.string_list = (SANE_String_Const*) constraint;
+       descriptor->config_name = BACKGROUND_SMOOTHING_MODE;
+       descriptor->descriptor->name = "background-smoothing-mode";
+       descriptor->descriptor->title = "Background Smoothing Mode";
+       descriptor->descriptor->desc = "Background Smoothing Mode";
+       descriptor->descriptor->type = SANE_TYPE_STRING;
+       descriptor->descriptor->unit = SANE_UNIT_NONE;
+       descriptor->descriptor->size = sizeof(SANE_String_Const*) * 4;
+       descriptor->descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
+       descriptor->descriptor->constraint_type = SANE_CONSTRAINT_STRING_LIST;
+       descriptor->descriptor->constraint.string_list = (SANE_String_Const*) constraint;
 
        return descriptor;
 }
 
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_background_smoothing_aggressiveness()
+option_descriptor_t* _kds_s2000w_option_descriptor_background_smoothing_aggressiveness()
 {
+       option_descriptor_t* descriptor = _kds_s2000w_option_descriptor_descriptor_init();
+       if (descriptor == NULL)
+               return NULL;
+
        SANE_Range* constraint = malloc(sizeof(SANE_Range));
-       if (constraint == NULL)
+       if (constraint == NULL) {
+               _kds_s2000w_option_descriptor_descriptor_free(descriptor);
                return NULL;
+       }
 
        constraint->min = -10;
        constraint->max = 10;
        constraint->quant = 1;
 
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
-       if (descriptor == NULL) {
-               free(constraint);
-               constraint = NULL;
-               return NULL;
-       }
-
-       descriptor->name = "background-smoothing-aggressiveness";
-       descriptor->title = "Background Smoothing Aggressiveness";
-       descriptor->desc = "Background Smoothing Aggressiveness";
-       descriptor->type = SANE_TYPE_INT;
-       descriptor->unit = SANE_UNIT_NONE;
-       descriptor->size = sizeof(SANE_Int);
-       descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
-       descriptor->constraint_type = SANE_CONSTRAINT_RANGE;
-       descriptor->constraint.range = constraint;
+       descriptor->config_name = BACKGROUND_SMOOTHING_AGGRESSIVENESS;
+       descriptor->descriptor->name = "background-smoothing-aggressiveness";
+       descriptor->descriptor->title = "Background Smoothing Aggressiveness";
+       descriptor->descriptor->desc = "Background Smoothing Aggressiveness";
+       descriptor->descriptor->type = SANE_TYPE_INT;
+       descriptor->descriptor->unit = SANE_UNIT_NONE;
+       descriptor->descriptor->size = sizeof(SANE_Int);
+       descriptor->descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
+       descriptor->descriptor->constraint_type = SANE_CONSTRAINT_RANGE;
+       descriptor->descriptor->constraint.range = constraint;
 
        return descriptor;
 }
@@ -566,29 +585,36 @@ SANE_Option_Descriptor* _kds_s2000w_option_descriptor_background_smoothing_aggre
 /*******************************************************************************
  * boldness color group
  ******************************************************************************/
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_boldness_color_group()
+option_descriptor_t* _kds_s2000w_option_descriptor_boldness_color_group()
 {
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
+       option_descriptor_t* descriptor = _kds_s2000w_option_descriptor_descriptor_init();
        if (descriptor == NULL)
                return NULL;
 
-       descriptor->name = "color-options";
-       descriptor->title = "Color Options";
-       descriptor->desc = "Color Options";
-       descriptor->type = SANE_TYPE_GROUP;
-       descriptor->unit = SANE_UNIT_NONE;
-       descriptor->size = 0;
-       descriptor->cap = SANE_CAP_SOFT_DETECT;
-       descriptor->constraint_type = SANE_CONSTRAINT_NONE;
+       descriptor->config_name = BOLDNESS_COLOR_GROUP;
+       descriptor->descriptor->name = "color-options";
+       descriptor->descriptor->title = "Color Options";
+       descriptor->descriptor->desc = "Color Options";
+       descriptor->descriptor->type = SANE_TYPE_GROUP;
+       descriptor->descriptor->unit = SANE_UNIT_NONE;
+       descriptor->descriptor->size = 0;
+       descriptor->descriptor->cap = SANE_CAP_SOFT_DETECT;
+       descriptor->descriptor->constraint_type = SANE_CONSTRAINT_NONE;
 
        return descriptor;
 }
 
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_color_drop()
+option_descriptor_t* _kds_s2000w_option_descriptor_color_drop()
 {
+       option_descriptor_t* descriptor = _kds_s2000w_option_descriptor_descriptor_init();
+       if (descriptor == NULL)
+               return NULL;
+
        char** constraint = malloc(sizeof(SANE_String_Const*) * 9);
-       if (constraint == NULL)
+       if (constraint == NULL) {
+               _kds_s2000w_option_descriptor_descriptor_free(descriptor);
                return NULL;
+       }
 
        constraint[0] = "None";
        constraint[1] = "Red";
@@ -600,152 +626,152 @@ SANE_Option_Descriptor* _kds_s2000w_option_descriptor_color_drop()
        constraint[7] = "Multiple";
        constraint[8] = NULL;
 
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
-       if (descriptor == NULL) {
-               free(constraint);
-               constraint = NULL;
-               return NULL;
-       }
-
-       descriptor->name = "color-drop-out";
-       descriptor->title = "Color Drop Out";
-       descriptor->desc = "Color Drop Out";
-       descriptor->type = SANE_TYPE_STRING;
-       descriptor->unit = SANE_UNIT_NONE;
-       descriptor->size = sizeof(SANE_String_Const) * 9;
-       descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
-       descriptor->constraint_type = SANE_CONSTRAINT_STRING_LIST;
-       descriptor->constraint.string_list = (SANE_String_Const*) constraint;
+       descriptor->config_name = COLOR_DROP_OUT;
+       descriptor->descriptor->name = "color-drop-out";
+       descriptor->descriptor->title = "Color Drop Out";
+       descriptor->descriptor->desc = "Color Drop Out";
+       descriptor->descriptor->type = SANE_TYPE_STRING;
+       descriptor->descriptor->unit = SANE_UNIT_NONE;
+       descriptor->descriptor->size = sizeof(SANE_String_Const) * 9;
+       descriptor->descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
+       descriptor->descriptor->constraint_type = SANE_CONSTRAINT_STRING_LIST;
+       descriptor->descriptor->constraint.string_list = (SANE_String_Const*) constraint;
 
        return descriptor;
 }
 
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_color_drop_out_aggressiveness()
+option_descriptor_t* _kds_s2000w_option_descriptor_color_drop_out_aggressiveness()
 {
+       option_descriptor_t* descriptor = _kds_s2000w_option_descriptor_descriptor_init();
+       if (descriptor == NULL)
+               return NULL;
+
        SANE_Range* constraint = malloc(sizeof(SANE_Range));
-       if (constraint == NULL)
+       if (constraint == NULL) {
+               _kds_s2000w_option_descriptor_descriptor_free(descriptor);
                return NULL;
+       }
 
        constraint->min = -10;
        constraint->max = 10;
        constraint->quant = 1;
 
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
-       if (descriptor == NULL) {
-               free(constraint);
-               constraint = NULL;
-               return NULL;
-       }
-
-       descriptor->name = "color-drop-out-aggressiveness";
-       descriptor->title = "Color Drop Out Aggressiveness";
-       descriptor->desc = "Color Drop Out Aggressiveness";
-       descriptor->type = SANE_TYPE_INT;
-       descriptor->unit = SANE_UNIT_NONE;
-       descriptor->size = sizeof(SANE_Int);
-       descriptor->cap = SANE_CAP_SOFT_DETECT;
-       descriptor->constraint_type = SANE_CONSTRAINT_RANGE;
-       descriptor->constraint.range = constraint;
+       descriptor->config_name = COLOR_DROP_OUT_AGGRESSIVENESS;
+       descriptor->descriptor->name = "color-drop-out-aggressiveness";
+       descriptor->descriptor->title = "Color Drop Out Aggressiveness";
+       descriptor->descriptor->desc = "Color Drop Out Aggressiveness";
+       descriptor->descriptor->type = SANE_TYPE_INT;
+       descriptor->descriptor->unit = SANE_UNIT_NONE;
+       descriptor->descriptor->size = sizeof(SANE_Int);
+       descriptor->descriptor->cap = SANE_CAP_SOFT_DETECT;
+       descriptor->descriptor->constraint_type = SANE_CONSTRAINT_RANGE;
+       descriptor->descriptor->constraint.range = constraint;
 
        return descriptor;
 }
 
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_color_auto_brightness_mode()
+option_descriptor_t* _kds_s2000w_option_descriptor_color_auto_brightness_mode()
 {
+       option_descriptor_t* descriptor = _kds_s2000w_option_descriptor_descriptor_init();
+       if (descriptor == NULL)
+               return NULL;
+
        char** constraint = malloc(sizeof(SANE_String_Const*) * 4);
-       if (constraint == NULL)
+       if (constraint == NULL) {
+               _kds_s2000w_option_descriptor_descriptor_free(descriptor);
                return NULL;
+       }
 
        constraint[0] = "None";
        constraint[1] = "Manual";
        constraint[2] = "Automatic";
        constraint[3] = NULL;
 
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
-       if (descriptor == NULL) {
-               free(constraint);
-               constraint = NULL;
-               return NULL;
-       }
-
-       descriptor->name = "color-auto-brightness-mode";
-       descriptor->title = "Color Auto Brightness Mode";
-       descriptor->desc = "Color Auto Brightness Mode";
-       descriptor->type = SANE_TYPE_STRING;
-       descriptor->unit = SANE_UNIT_NONE;
-       descriptor->size = sizeof(SANE_String_Const) * 4;
-       descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
-       descriptor->constraint_type = SANE_CONSTRAINT_STRING_LIST;
-       descriptor->constraint.string_list = (SANE_String_Const*) constraint;
+       descriptor->config_name = COLOR_AUTO_BRIGHTNESS_MODE;
+       descriptor->descriptor->name = "color-auto-brightness-mode";
+       descriptor->descriptor->title = "Color Auto Brightness Mode";
+       descriptor->descriptor->desc = "Color Auto Brightness Mode";
+       descriptor->descriptor->type = SANE_TYPE_STRING;
+       descriptor->descriptor->unit = SANE_UNIT_NONE;
+       descriptor->descriptor->size = sizeof(SANE_String_Const) * 4;
+       descriptor->descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
+       descriptor->descriptor->constraint_type = SANE_CONSTRAINT_STRING_LIST;
+       descriptor->descriptor->constraint.string_list = (SANE_String_Const*) constraint;
 
        return descriptor;
 }
 
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_color_brightness()
+option_descriptor_t* _kds_s2000w_option_descriptor_color_brightness()
 {
+       option_descriptor_t* descriptor = _kds_s2000w_option_descriptor_descriptor_init();
+       if (descriptor == NULL)
+               return NULL;
+
        SANE_Range* constraint = malloc(sizeof(SANE_Range));
-       if (constraint == NULL)
+       if (constraint == NULL) {
+               _kds_s2000w_option_descriptor_descriptor_free(descriptor);
                return NULL;
+       }
 
        constraint->min = -50;
        constraint->max = 50;
        constraint->quant = 1;
 
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
-       if (descriptor == NULL) {
-               free(constraint);
-               constraint = NULL;
-               return NULL;
-       }
-
-       descriptor->name = "color-brightness";
-       descriptor->title = "Color Brightness";
-       descriptor->desc = "Color Brightness";
-       descriptor->type = SANE_TYPE_INT;
-       descriptor->unit = SANE_UNIT_NONE;
-       descriptor->size = sizeof(SANE_Int);
-       descriptor->cap = SANE_CAP_SOFT_DETECT ;
-       descriptor->constraint_type = SANE_CONSTRAINT_RANGE;
-       descriptor->constraint.range = constraint;
+       descriptor->config_name = COLOR_BRIGHTNESS;
+       descriptor->descriptor->name = "color-brightness";
+       descriptor->descriptor->title = "Color Brightness";
+       descriptor->descriptor->desc = "Color Brightness";
+       descriptor->descriptor->type = SANE_TYPE_INT;
+       descriptor->descriptor->unit = SANE_UNIT_NONE;
+       descriptor->descriptor->size = sizeof(SANE_Int);
+       descriptor->descriptor->cap = SANE_CAP_SOFT_DETECT ;
+       descriptor->descriptor->constraint_type = SANE_CONSTRAINT_RANGE;
+       descriptor->descriptor->constraint.range = constraint;
 
        return descriptor;
 }
 
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_color_contrast()
+option_descriptor_t* _kds_s2000w_option_descriptor_color_contrast()
 {
+       option_descriptor_t* descriptor = _kds_s2000w_option_descriptor_descriptor_init();
+       if (descriptor == NULL)
+               return NULL;
+
        SANE_Range* constraint = malloc(sizeof(SANE_Range));
-       if (constraint == NULL)
+       if (constraint == NULL) {
+               _kds_s2000w_option_descriptor_descriptor_free(descriptor);
                return NULL;
+       }
 
        constraint->min = -50;
        constraint->max = 50;
        constraint->quant = 1;
 
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
-       if (descriptor == NULL) {
-               free(constraint);
-               constraint = NULL;
-               return NULL;
-       }
-
-       descriptor->name = "color-contrast";
-       descriptor->title = "Color Contrast";
-       descriptor->desc = "Color Contrast";
-       descriptor->type = SANE_TYPE_INT;
-       descriptor->unit = SANE_UNIT_NONE;
-       descriptor->size = sizeof(SANE_Int);
-       descriptor->cap = SANE_CAP_SOFT_DETECT ;
-       descriptor->constraint_type = SANE_CONSTRAINT_RANGE;
-       descriptor->constraint.range = constraint;
+       descriptor->config_name = COLOR_CONTRAST;
+       descriptor->descriptor->name = "color-contrast";
+       descriptor->descriptor->title = "Color Contrast";
+       descriptor->descriptor->desc = "Color Contrast";
+       descriptor->descriptor->type = SANE_TYPE_INT;
+       descriptor->descriptor->unit = SANE_UNIT_NONE;
+       descriptor->descriptor->size = sizeof(SANE_Int);
+       descriptor->descriptor->cap = SANE_CAP_SOFT_DETECT ;
+       descriptor->descriptor->constraint_type = SANE_CONSTRAINT_RANGE;
+       descriptor->descriptor->constraint.range = constraint;
 
        return descriptor;
 }
 
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_color_balance_mode()
+option_descriptor_t* _kds_s2000w_option_descriptor_color_balance_mode()
 {
+       option_descriptor_t* descriptor = _kds_s2000w_option_descriptor_descriptor_init();
+       if (descriptor == NULL)
+               return NULL;
+
        char** constraint = malloc(sizeof(SANE_String_Const*) * 5);
-       if (constraint == NULL)
+       if (constraint == NULL) {
+               _kds_s2000w_option_descriptor_descriptor_free(descriptor);
                return NULL;
+       }
 
        constraint[0] = "None";
        constraint[1] = "Manual";
@@ -753,151 +779,151 @@ SANE_Option_Descriptor* _kds_s2000w_option_descriptor_color_balance_mode()
        constraint[3] = "AutomaticAdvanced";
        constraint[4] = NULL;
 
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
-       if (descriptor == NULL) {
-               free(constraint);
-               constraint = NULL;
-               return NULL;
-       }
-
-       descriptor->name = "color-balance-mode";
-       descriptor->title = "Color Balance Mode";
-       descriptor->desc = "Color Balance Mode";
-       descriptor->type = SANE_TYPE_STRING;
-       descriptor->unit = SANE_UNIT_NONE;
-       descriptor->size = sizeof(SANE_String_Const*) * 5;
-       descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
-       descriptor->constraint_type = SANE_CONSTRAINT_STRING_LIST;
-       descriptor->constraint.string_list = (SANE_String_Const*) constraint;
+       descriptor->config_name = COLOR_BALANCE_MODE;
+       descriptor->descriptor->name = "color-balance-mode";
+       descriptor->descriptor->title = "Color Balance Mode";
+       descriptor->descriptor->desc = "Color Balance Mode";
+       descriptor->descriptor->type = SANE_TYPE_STRING;
+       descriptor->descriptor->unit = SANE_UNIT_NONE;
+       descriptor->descriptor->size = sizeof(SANE_String_Const*) * 5;
+       descriptor->descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
+       descriptor->descriptor->constraint_type = SANE_CONSTRAINT_STRING_LIST;
+       descriptor->descriptor->constraint.string_list = (SANE_String_Const*) constraint;
 
        return descriptor;
 }
 
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_color_balance_agressiveness()
+option_descriptor_t* _kds_s2000w_option_descriptor_color_balance_agressiveness()
 {
+       option_descriptor_t* descriptor = _kds_s2000w_option_descriptor_descriptor_init();
+       if (descriptor == NULL)
+               return NULL;
+
        SANE_Range* constraint = malloc(sizeof(SANE_Range));
-       if (constraint == NULL)
+       if (constraint == NULL) {
+               _kds_s2000w_option_descriptor_descriptor_free(descriptor);
                return NULL;
+       }
 
        constraint->min = -2;
        constraint->max = 2;
        constraint->quant = 1;
 
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
-       if (descriptor == NULL) {
-               free(constraint);
-               constraint = NULL;
-               return NULL;
-       }
-
-       descriptor->name = "color-balance-aggressiveness";
-       descriptor->title = "Color Balance Aggressiveness";
-       descriptor->desc = "Color Balance Aggressiveness";
-       descriptor->type = SANE_TYPE_INT;
-       descriptor->unit = SANE_UNIT_NONE;
-       descriptor->size = sizeof(SANE_Int);
-       descriptor->cap = SANE_CAP_SOFT_DETECT ;
-       descriptor->constraint_type = SANE_CONSTRAINT_RANGE;
-       descriptor->constraint.range = constraint;
+       descriptor->config_name = COLOR_BALANCE_AGGRESSIVENESS;
+       descriptor->descriptor->name = "color-balance-aggressiveness";
+       descriptor->descriptor->title = "Color Balance Aggressiveness";
+       descriptor->descriptor->desc = "Color Balance Aggressiveness";
+       descriptor->descriptor->type = SANE_TYPE_INT;
+       descriptor->descriptor->unit = SANE_UNIT_NONE;
+       descriptor->descriptor->size = sizeof(SANE_Int);
+       descriptor->descriptor->cap = SANE_CAP_SOFT_DETECT ;
+       descriptor->descriptor->constraint_type = SANE_CONSTRAINT_RANGE;
+       descriptor->descriptor->constraint.range = constraint;
 
        return descriptor;
 }
 
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_color_balance_red()
+option_descriptor_t* _kds_s2000w_option_descriptor_color_balance_red()
 {
+       option_descriptor_t* descriptor = _kds_s2000w_option_descriptor_descriptor_init();
+       if (descriptor == NULL)
+               return NULL;
+
        SANE_Range* constraint = malloc(sizeof(SANE_Range));
-       if (constraint == NULL)
+       if (constraint == NULL) {
+               _kds_s2000w_option_descriptor_descriptor_free(descriptor);
                return NULL;
+       }
 
        constraint->min = -50;
        constraint->max = 50;
        constraint->quant = 1;
 
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
-       if (descriptor == NULL) {
-               free(constraint);
-               constraint = NULL;
-               return NULL;
-       }
-
-       descriptor->name = "color-balance-red";
-       descriptor->title = "Color Balance Red";
-       descriptor->desc = "Color Balance Red";
-       descriptor->type = SANE_TYPE_INT;
-       descriptor->unit = SANE_UNIT_NONE;
-       descriptor->size = sizeof(SANE_Int);
-       descriptor->cap = SANE_CAP_SOFT_DETECT ;
-       descriptor->constraint_type = SANE_CONSTRAINT_RANGE;
-       descriptor->constraint.range = constraint;
+       descriptor->config_name = COLOR_BALANCE_RED;
+       descriptor->descriptor->name = "color-balance-red";
+       descriptor->descriptor->title = "Color Balance Red";
+       descriptor->descriptor->desc = "Color Balance Red";
+       descriptor->descriptor->type = SANE_TYPE_INT;
+       descriptor->descriptor->unit = SANE_UNIT_NONE;
+       descriptor->descriptor->size = sizeof(SANE_Int);
+       descriptor->descriptor->cap = SANE_CAP_SOFT_DETECT ;
+       descriptor->descriptor->constraint_type = SANE_CONSTRAINT_RANGE;
+       descriptor->descriptor->constraint.range = constraint;
 
        return descriptor;
 }
 
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_color_balance_green()
+option_descriptor_t* _kds_s2000w_option_descriptor_color_balance_green()
 {
+       option_descriptor_t* descriptor = _kds_s2000w_option_descriptor_descriptor_init();
+       if (descriptor == NULL)
+               return NULL;
+
        SANE_Range* constraint = malloc(sizeof(SANE_Range));
-       if (constraint == NULL)
+       if (constraint == NULL) {
+               _kds_s2000w_option_descriptor_descriptor_free(descriptor);
                return NULL;
+       }
 
        constraint->min = -50;
        constraint->max = 50;
        constraint->quant = 1;
 
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
-       if (descriptor == NULL) {
-               free(constraint);
-               constraint = NULL;
-               return NULL;
-       }
-
-       descriptor->name = "color-balance-green";
-       descriptor->title = "Color Balance Green";
-       descriptor->desc = "Color Balance Green";
-       descriptor->type = SANE_TYPE_INT;
-       descriptor->unit = SANE_UNIT_NONE;
-       descriptor->size = sizeof(SANE_Int);
-       descriptor->cap = SANE_CAP_SOFT_DETECT ;
-       descriptor->constraint_type = SANE_CONSTRAINT_RANGE;
-       descriptor->constraint.range = constraint;
+       descriptor->config_name = COLOR_BALANCE_GREEN;
+       descriptor->descriptor->name = "color-balance-green";
+       descriptor->descriptor->title = "Color Balance Green";
+       descriptor->descriptor->desc = "Color Balance Green";
+       descriptor->descriptor->type = SANE_TYPE_INT;
+       descriptor->descriptor->unit = SANE_UNIT_NONE;
+       descriptor->descriptor->size = sizeof(SANE_Int);
+       descriptor->descriptor->cap = SANE_CAP_SOFT_DETECT ;
+       descriptor->descriptor->constraint_type = SANE_CONSTRAINT_RANGE;
+       descriptor->descriptor->constraint.range = constraint;
 
        return descriptor;
 }
 
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_color_balance_blue()
+option_descriptor_t* _kds_s2000w_option_descriptor_color_balance_blue()
 {
+       option_descriptor_t* descriptor = _kds_s2000w_option_descriptor_descriptor_init();
+       if (descriptor == NULL)
+               return NULL;
+
        SANE_Range* constraint = malloc(sizeof(SANE_Range));
-       if (constraint == NULL)
+       if (constraint == NULL) {
+               _kds_s2000w_option_descriptor_descriptor_free(descriptor);
                return NULL;
+       }
 
        constraint->min = -50;
        constraint->max = 50;
        constraint->quant = 1;
 
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
-       if (descriptor == NULL) {
-               free(constraint);
-               constraint = NULL;
-               return NULL;
-       }
-
-       descriptor->name = "color-balance-blue";
-       descriptor->title = "Color Balance Blue";
-       descriptor->desc = "Color Balance Blue";
-       descriptor->type = SANE_TYPE_INT;
-       descriptor->unit = SANE_UNIT_NONE;
-       descriptor->size = sizeof(SANE_Int);
-       descriptor->cap = SANE_CAP_SOFT_DETECT ;
-       descriptor->constraint_type = SANE_CONSTRAINT_RANGE;
-       descriptor->constraint.range = constraint;
+       descriptor->config_name = COLOR_BALANCE_BLUE;
+       descriptor->descriptor->name = "color-balance-blue";
+       descriptor->descriptor->title = "Color Balance Blue";
+       descriptor->descriptor->desc = "Color Balance Blue";
+       descriptor->descriptor->type = SANE_TYPE_INT;
+       descriptor->descriptor->unit = SANE_UNIT_NONE;
+       descriptor->descriptor->size = sizeof(SANE_Int);
+       descriptor->descriptor->cap = SANE_CAP_SOFT_DETECT ;
+       descriptor->descriptor->constraint_type = SANE_CONSTRAINT_RANGE;
+       descriptor->descriptor->constraint.range = constraint;
 
        return descriptor;
 }
 
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_color_sharpen()
+option_descriptor_t* _kds_s2000w_option_descriptor_color_sharpen()
 {
+       option_descriptor_t* descriptor = _kds_s2000w_option_descriptor_descriptor_init();
+       if (descriptor == NULL)
+               return NULL;
+
        char** constraint = malloc(sizeof(SANE_String_Const*) * 5);
-       if (constraint == NULL)
+       if (constraint == NULL) {
+               _kds_s2000w_option_descriptor_descriptor_free(descriptor);
                return NULL;
+       }
 
        constraint[0] = "None";
        constraint[1] = "Normal";
@@ -905,70 +931,65 @@ SANE_Option_Descriptor* _kds_s2000w_option_descriptor_color_sharpen()
        constraint[3] = "Exaggerated";
        constraint[4] = NULL;
 
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
-       if (descriptor == NULL) {
-               free(constraint);
-               constraint = NULL;
-               return NULL;
-       }
-
-       descriptor->name = "color-sharpen";
-       descriptor->title = "Color Sharpen";
-       descriptor->desc = "Color Sharpen";
-       descriptor->type = SANE_TYPE_STRING;
-       descriptor->unit = SANE_UNIT_NONE;
-       descriptor->size = sizeof(SANE_String_Const*) * 5;
-       descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
-       descriptor->constraint_type = SANE_CONSTRAINT_STRING_LIST;
-       descriptor->constraint.string_list = (SANE_String_Const*) constraint;
+       descriptor->config_name = COLOR_SHARPEN;
+       descriptor->descriptor->name = "color-sharpen";
+       descriptor->descriptor->title = "Color Sharpen";
+       descriptor->descriptor->desc = "Color Sharpen";
+       descriptor->descriptor->type = SANE_TYPE_STRING;
+       descriptor->descriptor->unit = SANE_UNIT_NONE;
+       descriptor->descriptor->size = sizeof(SANE_String_Const*) * 5;
+       descriptor->descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
+       descriptor->descriptor->constraint_type = SANE_CONSTRAINT_STRING_LIST;
+       descriptor->descriptor->constraint.string_list = (SANE_String_Const*) constraint;
 
        return descriptor;
 }
 
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_binarization_contrast()
+option_descriptor_t* _kds_s2000w_option_descriptor_binarization_contrast()
 {
+       option_descriptor_t* descriptor = _kds_s2000w_option_descriptor_descriptor_init();
+       if (descriptor == NULL)
+               return NULL;
+
        SANE_Range* constraint = malloc(sizeof(SANE_Range));
-       if (constraint == NULL)
+       if (constraint == NULL) {
+               _kds_s2000w_option_descriptor_descriptor_free(descriptor);
                return NULL;
+       }
 
        constraint->min = -50;
        constraint->max = 50;
        constraint->quant = 1;
 
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
-       if (descriptor == NULL) {
-               free(constraint);
-               constraint = NULL;
-               return NULL;
-       }
-
-       descriptor->name = "binarization-contrast";
-       descriptor->title = "Binarization Contrast";
-       descriptor->desc = "Binarization Contrast";
-       descriptor->type = SANE_TYPE_INT;
-       descriptor->unit = SANE_UNIT_NONE;
-       descriptor->size = sizeof(SANE_Int);
-       descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
-       descriptor->constraint_type = SANE_CONSTRAINT_RANGE;
-       descriptor->constraint.range = constraint;
+       descriptor->config_name = BINARIZATION_CONTRAST;
+       descriptor->descriptor->name = "binarization-contrast";
+       descriptor->descriptor->title = "Binarization Contrast";
+       descriptor->descriptor->desc = "Binarization Contrast";
+       descriptor->descriptor->type = SANE_TYPE_INT;
+       descriptor->descriptor->unit = SANE_UNIT_NONE;
+       descriptor->descriptor->size = sizeof(SANE_Int);
+       descriptor->descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
+       descriptor->descriptor->constraint_type = SANE_CONSTRAINT_RANGE;
+       descriptor->descriptor->constraint.range = constraint;
 
        return descriptor;
 }
 
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_config_reset()
+option_descriptor_t* _kds_s2000w_option_descriptor_config_reset()
 {
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
+       option_descriptor_t* descriptor = _kds_s2000w_option_descriptor_descriptor_init();
        if (descriptor == NULL)
                return NULL;
 
-       descriptor->name = "config-reset";
-       descriptor->title = "Reset Config";
-       descriptor->desc = "Load default configuration from scanner";
-       descriptor->type = SANE_TYPE_BUTTON;
-       descriptor->unit = SANE_UNIT_NONE;
-       descriptor->size = 0;
-       descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
-       descriptor->constraint_type = SANE_CONSTRAINT_NONE;
+       descriptor->config_name = RESET;
+       descriptor->descriptor->name = "config-reset";
+       descriptor->descriptor->title = "Reset Config";
+       descriptor->descriptor->desc = "Load default configuration from scanner";
+       descriptor->descriptor->type = SANE_TYPE_BUTTON;
+       descriptor->descriptor->unit = SANE_UNIT_NONE;
+       descriptor->descriptor->size = 0;
+       descriptor->descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
+       descriptor->descriptor->constraint_type = SANE_CONSTRAINT_NONE;
 
        return descriptor;
 }
@@ -976,95 +997,104 @@ SANE_Option_Descriptor* _kds_s2000w_option_descriptor_config_reset()
 /*******************************************************************************
  * image processing group
  ******************************************************************************/
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_image_processing_group()
+option_descriptor_t* _kds_s2000w_option_descriptor_image_processing_group()
 {
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
+       option_descriptor_t* descriptor = _kds_s2000w_option_descriptor_descriptor_init();
        if (descriptor == NULL)
                return NULL;
 
-       descriptor->name = "image-processing-options";
-       descriptor->title = "Image Processing Options";
-       descriptor->desc = "Image Processing Options";
-       descriptor->type = SANE_TYPE_GROUP;
-       descriptor->unit = SANE_UNIT_NONE;
-       descriptor->size = 0;
-       descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_ADVANCED;
-       descriptor->constraint_type = SANE_CONSTRAINT_NONE;
+       descriptor->config_name = IMAGE_PROCESSING_GROUP;
+       descriptor->descriptor->name = "image-processing-options";
+       descriptor->descriptor->title = "Image Processing Options";
+       descriptor->descriptor->desc = "Image Processing Options";
+       descriptor->descriptor->type = SANE_TYPE_GROUP;
+       descriptor->descriptor->unit = SANE_UNIT_NONE;
+       descriptor->descriptor->size = 0;
+       descriptor->descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_ADVANCED;
+       descriptor->descriptor->constraint_type = SANE_CONSTRAINT_NONE;
 
        return descriptor;
 }
 
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_skip_blank_pages()
+option_descriptor_t* _kds_s2000w_option_descriptor_skip_blank_pages()
 {
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
+       option_descriptor_t* descriptor = _kds_s2000w_option_descriptor_descriptor_init();
        if (descriptor == NULL)
                return NULL;
 
-       descriptor->name = "skip-blank-pages";
-       descriptor->title = "Blank Blank Pages";
-       descriptor->desc = "Blank Blank Pages";
-       descriptor->type = SANE_TYPE_BOOL;
-       descriptor->unit = SANE_UNIT_NONE;
-       descriptor->size = sizeof(SANE_Bool);
-       descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT | SANE_CAP_ADVANCED;
-       descriptor->constraint_type = SANE_CONSTRAINT_NONE;
+       descriptor->config_name = SKIP_BLANK_PAGES;
+       descriptor->descriptor->name = "skip-blank-pages";
+       descriptor->descriptor->title = "Blank Blank Pages";
+       descriptor->descriptor->desc = "Blank Blank Pages";
+       descriptor->descriptor->type = SANE_TYPE_BOOL;
+       descriptor->descriptor->unit = SANE_UNIT_NONE;
+       descriptor->descriptor->size = sizeof(SANE_Bool);
+       descriptor->descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT | SANE_CAP_ADVANCED;
+       descriptor->descriptor->constraint_type = SANE_CONSTRAINT_NONE;
 
        return descriptor;
 }
 
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_skip_blank_page_content()
+option_descriptor_t* _kds_s2000w_option_descriptor_skip_blank_page_content()
 {
+       option_descriptor_t* descriptor = _kds_s2000w_option_descriptor_descriptor_init();
+       if (descriptor == NULL)
+               return NULL;
+
        SANE_Range* constraint = malloc(sizeof(SANE_Range));
-       if (constraint == NULL)
+       if (constraint == NULL) {
+               _kds_s2000w_option_descriptor_descriptor_free(descriptor);
                return NULL;
+       }
 
        constraint->min = 0;
        constraint->max = 100;
        constraint->quant = 1;
 
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
-       if (descriptor == NULL) {
-               free(constraint);
-               constraint = NULL;
-               return NULL;
-       }
-
-       descriptor->name = "skip-blank-page-content";
-       descriptor->title = "Skip Blank Page Content";
-       descriptor->desc = "Skip Blank Page Content";
-       descriptor->type = SANE_TYPE_INT;
-       descriptor->unit = SANE_UNIT_PERCENT;
-       descriptor->size = sizeof(SANE_Int);
-       descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT | SANE_CAP_ADVANCED;
-       descriptor->constraint_type = SANE_CONSTRAINT_RANGE;
-       descriptor->constraint.range = constraint;
+       descriptor->config_name = SKIP_BLANK_PAGES_CONTENT;
+       descriptor->descriptor->name = "skip-blank-page-content";
+       descriptor->descriptor->title = "Skip Blank Page Content";
+       descriptor->descriptor->desc = "Skip Blank Page Content";
+       descriptor->descriptor->type = SANE_TYPE_INT;
+       descriptor->descriptor->unit = SANE_UNIT_PERCENT;
+       descriptor->descriptor->size = sizeof(SANE_Int);
+       descriptor->descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT | SANE_CAP_ADVANCED;
+       descriptor->descriptor->constraint_type = SANE_CONSTRAINT_RANGE;
+       descriptor->descriptor->constraint.range = constraint;
 
        return descriptor;
 }
 
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_hole_fill()
+option_descriptor_t* _kds_s2000w_option_descriptor_hole_fill()
 {
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
+       option_descriptor_t* descriptor = _kds_s2000w_option_descriptor_descriptor_init();
        if (descriptor == NULL)
                return NULL;
 
-       descriptor->name = "hole-fill";
-       descriptor->title = "Hole Fill";
-       descriptor->desc = "Hole Fill";
-       descriptor->type = SANE_TYPE_BOOL;
-       descriptor->unit = SANE_UNIT_NONE;
-       descriptor->size = sizeof(SANE_Bool);
-       descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT | SANE_CAP_ADVANCED;
-       descriptor->constraint_type = SANE_CONSTRAINT_NONE;
+       descriptor->config_name = HOLE_FILL;
+       descriptor->descriptor->name = "hole-fill";
+       descriptor->descriptor->title = "Hole Fill";
+       descriptor->descriptor->desc = "Hole Fill";
+       descriptor->descriptor->type = SANE_TYPE_BOOL;
+       descriptor->descriptor->unit = SANE_UNIT_NONE;
+       descriptor->descriptor->size = sizeof(SANE_Bool);
+       descriptor->descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT | SANE_CAP_ADVANCED;
+       descriptor->descriptor->constraint_type = SANE_CONSTRAINT_NONE;
 
        return descriptor;
 }
 
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_post_scan_rotation()
+option_descriptor_t* _kds_s2000w_option_descriptor_post_scan_rotation()
 {
+       option_descriptor_t* descriptor = _kds_s2000w_option_descriptor_descriptor_init();
+       if (descriptor == NULL)
+               return NULL;
+
        char** constraint = malloc(sizeof(SANE_String_Const*) * 6);
-       if (constraint == NULL)
+       if (constraint == NULL) {
+               _kds_s2000w_option_descriptor_descriptor_free(descriptor);
                return NULL;
+       }
 
        constraint[0] = "None";
        constraint[1] = "Automatic";
@@ -1073,93 +1103,93 @@ SANE_Option_Descriptor* _kds_s2000w_option_descriptor_post_scan_rotation()
        constraint[4] = "Automatic270";
        constraint[5] = NULL;
 
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
-       if (descriptor == NULL) {
-               free(constraint);
-               constraint = NULL;
-               return NULL;
-       }
-
-       descriptor->name = "post-scan-rotation";
-       descriptor->title = "Post Scan Rotation";
-       descriptor->desc = "Post Scan Rotation";
-       descriptor->type = SANE_TYPE_STRING;
-       descriptor->unit = SANE_UNIT_NONE;
-       descriptor->size = sizeof(SANE_String_Const*) * 6;
-       descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT | SANE_CAP_ADVANCED;
-       descriptor->constraint_type = SANE_CONSTRAINT_STRING_LIST;
-       descriptor->constraint.string_list = (SANE_String_Const*) constraint;
+       descriptor->config_name = POST_SCAN_ROTATION;
+       descriptor->descriptor->name = "post-scan-rotation";
+       descriptor->descriptor->title = "Post Scan Rotation";
+       descriptor->descriptor->desc = "Post Scan Rotation";
+       descriptor->descriptor->type = SANE_TYPE_STRING;
+       descriptor->descriptor->unit = SANE_UNIT_NONE;
+       descriptor->descriptor->size = sizeof(SANE_String_Const*) * 6;
+       descriptor->descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT | SANE_CAP_ADVANCED;
+       descriptor->descriptor->constraint_type = SANE_CONSTRAINT_STRING_LIST;
+       descriptor->descriptor->constraint.string_list = (SANE_String_Const*) constraint;
 
        return descriptor;
 }
 
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_edge_fill()
+option_descriptor_t* _kds_s2000w_option_descriptor_edge_fill()
 {
+       option_descriptor_t* descriptor = _kds_s2000w_option_descriptor_descriptor_init();
+       if (descriptor == NULL)
+               return NULL;
+
        char** constraint = malloc(sizeof(SANE_String_Const*) * 4);
-       if (constraint == NULL)
+       if (constraint == NULL) {
+               _kds_s2000w_option_descriptor_descriptor_free(descriptor);
                return NULL;
+       }
 
        constraint[0] = "None";
        constraint[1] = "Automatic";
        constraint[2] = "AutomaticIncludeTears";
        constraint[3] = NULL;
 
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
-       if (descriptor == NULL) {
-               free(constraint);
-               constraint = NULL;
-               return NULL;
-       }
-
-       descriptor->name = "edge-fill";
-       descriptor->title = "Edge Fill";
-       descriptor->desc = "Edge Fill";
-       descriptor->type = SANE_TYPE_STRING;
-       descriptor->unit = SANE_UNIT_NONE;
-       descriptor->size = sizeof(SANE_String_Const*) * 4;
-       descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT | SANE_CAP_ADVANCED;
-       descriptor->constraint_type = SANE_CONSTRAINT_STRING_LIST;
-       descriptor->constraint.string_list = (SANE_String_Const*) constraint;
+       descriptor->config_name = EDGE_FILL;
+       descriptor->descriptor->name = "edge-fill";
+       descriptor->descriptor->title = "Edge Fill";
+       descriptor->descriptor->desc = "Edge Fill";
+       descriptor->descriptor->type = SANE_TYPE_STRING;
+       descriptor->descriptor->unit = SANE_UNIT_NONE;
+       descriptor->descriptor->size = sizeof(SANE_String_Const*) * 4;
+       descriptor->descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT | SANE_CAP_ADVANCED;
+       descriptor->descriptor->constraint_type = SANE_CONSTRAINT_STRING_LIST;
+       descriptor->descriptor->constraint.string_list = (SANE_String_Const*) constraint;
 
        return descriptor;
 }
 
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_image_border()
+option_descriptor_t* _kds_s2000w_option_descriptor_image_border()
 {
+       option_descriptor_t* descriptor = _kds_s2000w_option_descriptor_descriptor_init();
+       if (descriptor == NULL)
+               return NULL;
+
        char** constraint = malloc(sizeof(SANE_String_Const*) * 4);
-       if (constraint == NULL)
+       if (constraint == NULL) {
+               _kds_s2000w_option_descriptor_descriptor_free(descriptor);
                return NULL;
+       }
 
        constraint[0] = "None";
        constraint[1] = "Add";
        constraint[2] = "Remove";
        constraint[3] = NULL;
 
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
-       if (descriptor == NULL) {
-               free(constraint);
-               constraint = NULL;
-               return NULL;
-       }
-
-       descriptor->name = "image-border";
-       descriptor->title = "Image Border";
-       descriptor->desc = "Image Border";
-       descriptor->type = SANE_TYPE_STRING;
-       descriptor->unit = SANE_UNIT_NONE;
-       descriptor->size = sizeof(SANE_String_Const*) * 4;
-       descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT | SANE_CAP_ADVANCED;
-       descriptor->constraint_type = SANE_CONSTRAINT_STRING_LIST;
-       descriptor->constraint.string_list = (SANE_String_Const*) constraint;
+       descriptor->config_name = IMAGE_BORDER;
+       descriptor->descriptor->name = "image-border";
+       descriptor->descriptor->title = "Image Border";
+       descriptor->descriptor->desc = "Image Border";
+       descriptor->descriptor->type = SANE_TYPE_STRING;
+       descriptor->descriptor->unit = SANE_UNIT_NONE;
+       descriptor->descriptor->size = sizeof(SANE_String_Const*) * 4;
+       descriptor->descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT | SANE_CAP_ADVANCED;
+       descriptor->descriptor->constraint_type = SANE_CONSTRAINT_STRING_LIST;
+       descriptor->descriptor->constraint.string_list = (SANE_String_Const*) constraint;
 
        return descriptor;
 }
 
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_jpeg_quality()
+option_descriptor_t* _kds_s2000w_option_descriptor_jpeg_quality()
 {
+       option_descriptor_t* descriptor = _kds_s2000w_option_descriptor_descriptor_init();
+       if (descriptor == NULL)
+               return NULL;
+
        char** constraint = malloc(sizeof(SANE_String_Const*) * 6);
-       if (constraint == NULL)
+       if (constraint == NULL) {
+               _kds_s2000w_option_descriptor_descriptor_free(descriptor);
                return NULL;
+       }
 
        constraint[0] = "Draft";
        constraint[1] = "Good";
@@ -1168,22 +1198,16 @@ SANE_Option_Descriptor* _kds_s2000w_option_descriptor_jpeg_quality()
        constraint[4] = "Superior";
        constraint[5] = NULL;
 
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
-       if (descriptor == NULL) {
-               free(constraint);
-               constraint = NULL;
-               return NULL;
-       };
-
-       descriptor->name = "jpeg-quality";
-       descriptor->title = "Jpeg Quality";
-       descriptor->desc = "Jpeg Quality";
-       descriptor->type = SANE_TYPE_STRING;
-       descriptor->unit = SANE_UNIT_NONE;
-       descriptor->size = sizeof(SANE_String_Const*) * 6;
-       descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT | SANE_CAP_ADVANCED;
-       descriptor->constraint_type = SANE_CONSTRAINT_STRING_LIST;
-       descriptor->constraint.string_list = (SANE_String_Const*) constraint;
+       descriptor->config_name = JPEG_QUALITY;
+       descriptor->descriptor->name = "jpeg-quality";
+       descriptor->descriptor->title = "Jpeg Quality";
+       descriptor->descriptor->desc = "Jpeg Quality";
+       descriptor->descriptor->type = SANE_TYPE_STRING;
+       descriptor->descriptor->unit = SANE_UNIT_NONE;
+       descriptor->descriptor->size = sizeof(SANE_String_Const*) * 6;
+       descriptor->descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT | SANE_CAP_ADVANCED;
+       descriptor->descriptor->constraint_type = SANE_CONSTRAINT_STRING_LIST;
+       descriptor->descriptor->constraint.string_list = (SANE_String_Const*) constraint;
 
        return descriptor;
 }
@@ -1191,77 +1215,85 @@ SANE_Option_Descriptor* _kds_s2000w_option_descriptor_jpeg_quality()
 /*******************************************************************************
  * feeder group
  ******************************************************************************/
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_feeder_group()
+option_descriptor_t* _kds_s2000w_option_descriptor_feeder_group()
 {
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
+       option_descriptor_t* descriptor = _kds_s2000w_option_descriptor_descriptor_init();
        if (descriptor == NULL)
                return NULL;
 
-       descriptor->name = "feeder-options";
-       descriptor->title = "Feeder Options";
-       descriptor->desc = "Feeder Options";
-       descriptor->type = SANE_TYPE_GROUP;
-       descriptor->unit = SANE_UNIT_NONE;
-       descriptor->size = 0;
-       descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_ADVANCED;
-       descriptor->constraint_type = SANE_CONSTRAINT_NONE;
+       descriptor->config_name = FEEDER_GROUP;
+       descriptor->descriptor->name = "feeder-options";
+       descriptor->descriptor->title = "Feeder Options";
+       descriptor->descriptor->desc = "Feeder Options";
+       descriptor->descriptor->type = SANE_TYPE_GROUP;
+       descriptor->descriptor->unit = SANE_UNIT_NONE;
+       descriptor->descriptor->size = 0;
+       descriptor->descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_ADVANCED;
+       descriptor->descriptor->constraint_type = SANE_CONSTRAINT_NONE;
 
        return descriptor;
 }
 
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_autostart()
+option_descriptor_t* _kds_s2000w_option_descriptor_autostart()
 {
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
+       option_descriptor_t* descriptor = _kds_s2000w_option_descriptor_descriptor_init();
        if (descriptor == NULL)
                return NULL;
 
-       descriptor->name = "autostart";
-       descriptor->title = "Autostart";
-       descriptor->desc = "Autostart";
-       descriptor->type = SANE_TYPE_BOOL;
-       descriptor->unit = SANE_UNIT_NONE;
-       descriptor->size = sizeof(SANE_Bool);
-       descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT | SANE_CAP_ADVANCED;
-       descriptor->constraint_type = SANE_CONSTRAINT_NONE;
+       descriptor->config_name = AUTOSTART;
+       descriptor->descriptor->name = "autostart";
+       descriptor->descriptor->title = "Autostart";
+       descriptor->descriptor->desc = "Autostart";
+       descriptor->descriptor->type = SANE_TYPE_BOOL;
+       descriptor->descriptor->unit = SANE_UNIT_NONE;
+       descriptor->descriptor->size = sizeof(SANE_Bool);
+       descriptor->descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT | SANE_CAP_ADVANCED;
+       descriptor->descriptor->constraint_type = SANE_CONSTRAINT_NONE;
 
        return descriptor;
 }
 
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_max_document_length()
+option_descriptor_t* _kds_s2000w_option_descriptor_max_document_length()
 {
+       option_descriptor_t* descriptor = _kds_s2000w_option_descriptor_descriptor_init();
+       if (descriptor == NULL)
+               return NULL;
+
        SANE_Range* constraint = malloc(sizeof(SANE_Range));
-       if (constraint == NULL)
+       if (constraint == NULL) {
+               _kds_s2000w_option_descriptor_descriptor_free(descriptor);
                return NULL;
+       }
 
        constraint->min = 25;
        constraint->max = 400;
        constraint->quant = 1;
 
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
-       if (descriptor == NULL) {
-               free(constraint);
-               constraint = NULL;
-               return NULL;
-       };
-
-       descriptor->name = "max-document-length";
-       descriptor->title = "Max Document Length";
-       descriptor->desc = "Max Document Length";
-       descriptor->type = SANE_TYPE_INT;
-       descriptor->unit = SANE_UNIT_NONE;
-       descriptor->size = sizeof(SANE_Int);
-       descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT | SANE_CAP_ADVANCED;
-       descriptor->constraint_type = SANE_CONSTRAINT_RANGE;
-       descriptor->constraint.range = constraint;
+       descriptor->config_name = MAX_DOCUMENT_LENGTH;
+       descriptor->descriptor->name = "max-document-length";
+       descriptor->descriptor->title = "Max Document Length";
+       descriptor->descriptor->desc = "Max Document Length";
+       descriptor->descriptor->type = SANE_TYPE_INT;
+       descriptor->descriptor->unit = SANE_UNIT_NONE;
+       descriptor->descriptor->size = sizeof(SANE_Int);
+       descriptor->descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT | SANE_CAP_ADVANCED;
+       descriptor->descriptor->constraint_type = SANE_CONSTRAINT_RANGE;
+       descriptor->descriptor->constraint.range = constraint;
 
        return descriptor;
 }
 
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_transport_handling()
+option_descriptor_t* _kds_s2000w_option_descriptor_transport_handling()
 {
+       option_descriptor_t* descriptor = _kds_s2000w_option_descriptor_descriptor_init();
+       if (descriptor == NULL)
+               return NULL;
+
        char** constraint = malloc(sizeof(SANE_String_Const*) * 5);
-       if (constraint == NULL)
+       if (constraint == NULL) {
+               _kds_s2000w_option_descriptor_descriptor_free(descriptor);
                return NULL;
+       }
 
        constraint[0] = "Normal";
        constraint[1] = "ImprovedStacking";
@@ -1269,31 +1301,31 @@ SANE_Option_Descriptor* _kds_s2000w_option_descriptor_transport_handling()
        constraint[3] = "Special";
        constraint[4] = NULL;
 
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
-       if (descriptor == NULL) {
-               free(constraint);
-               constraint = NULL;
-               return NULL;
-       };
-
-       descriptor->name = "transport-handling";
-       descriptor->title = "Transport Handling";
-       descriptor->desc = "Transport Handling";
-       descriptor->type = SANE_TYPE_STRING;
-       descriptor->unit = SANE_UNIT_NONE;
-       descriptor->size = sizeof(SANE_String_Const*) * 5;
-       descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT | SANE_CAP_ADVANCED;
-       descriptor->constraint_type = SANE_CONSTRAINT_STRING_LIST;
-       descriptor->constraint.string_list = (SANE_String_Const*) constraint;
+       descriptor->config_name = TRANSPORT_HANDLING;
+       descriptor->descriptor->name = "transport-handling";
+       descriptor->descriptor->title = "Transport Handling";
+       descriptor->descriptor->desc = "Transport Handling";
+       descriptor->descriptor->type = SANE_TYPE_STRING;
+       descriptor->descriptor->unit = SANE_UNIT_NONE;
+       descriptor->descriptor->size = sizeof(SANE_String_Const*) * 5;
+       descriptor->descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT | SANE_CAP_ADVANCED;
+       descriptor->descriptor->constraint_type = SANE_CONSTRAINT_STRING_LIST;
+       descriptor->descriptor->constraint.string_list = (SANE_String_Const*) constraint;
 
        return descriptor;
 }
 
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_multifeed_sensitivity()
+option_descriptor_t* _kds_s2000w_option_descriptor_multifeed_sensitivity()
 {
+       option_descriptor_t* descriptor = _kds_s2000w_option_descriptor_descriptor_init();
+       if (descriptor == NULL)
+               return NULL;
+
        char** constraint = malloc(sizeof(SANE_String_Const*) * 5);
-       if (constraint == NULL)
+       if (constraint == NULL) {
+               _kds_s2000w_option_descriptor_descriptor_free(descriptor);
                return NULL;
+       }
 
        constraint[0] = "None";
        constraint[1] = "Low";
@@ -1301,113 +1333,107 @@ SANE_Option_Descriptor* _kds_s2000w_option_descriptor_multifeed_sensitivity()
        constraint[3] = "High";
        constraint[4] = NULL;
 
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
-       if (descriptor == NULL) {
-               free(constraint);
-               constraint = NULL;
-               return NULL;
-       };
-
-       descriptor->name = "multifeed-sensitivity";
-       descriptor->title = "Multifeed Sensitivity";
-       descriptor->desc = "Multifeed Sensitivity";
-       descriptor->type = SANE_TYPE_STRING;
-       descriptor->unit = SANE_UNIT_NONE;
-       descriptor->size = sizeof(SANE_String_Const*) * 5;
-       descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT | SANE_CAP_ADVANCED;
-       descriptor->constraint_type = SANE_CONSTRAINT_STRING_LIST;
-       descriptor->constraint.string_list = (SANE_String_Const*) constraint;
+       descriptor->config_name = MULTIFEED_SENSITIVITY;
+       descriptor->descriptor->name = "multifeed-sensitivity";
+       descriptor->descriptor->title = "Multifeed Sensitivity";
+       descriptor->descriptor->desc = "Multifeed Sensitivity";
+       descriptor->descriptor->type = SANE_TYPE_STRING;
+       descriptor->descriptor->unit = SANE_UNIT_NONE;
+       descriptor->descriptor->size = sizeof(SANE_String_Const*) * 5;
+       descriptor->descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT | SANE_CAP_ADVANCED;
+       descriptor->descriptor->constraint_type = SANE_CONSTRAINT_STRING_LIST;
+       descriptor->descriptor->constraint.string_list = (SANE_String_Const*) constraint;
 
        return descriptor;
 }
 
-SANE_Option_Descriptor *_kds_s2000w_option_descriptor_multifeed_response()
+option_descriptor_t *_kds_s2000w_option_descriptor_multifeed_response()
 {
+       option_descriptor_t* descriptor = _kds_s2000w_option_descriptor_descriptor_init();
+       if (descriptor == NULL)
+               return NULL;
+
        const char** constraint = malloc(sizeof(SANE_String_Const*) * 3);
-       if (constraint == NULL)
+       if (constraint == NULL) {
+               _kds_s2000w_option_descriptor_descriptor_free(descriptor);
                return NULL;
+       }
 
        constraint[0] = "Stop";
        constraint[1] = "StopAndGenerateImage";
        constraint[2] = NULL;
 
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
-       if (descriptor == NULL) {
-               free(constraint);
-               constraint = NULL;
-               return NULL;
-       };
-
-       descriptor->name = "multifeed-response";
-       descriptor->title = "Multifeed Response";
-       descriptor->desc = "Multifeed Response";
-       descriptor->type = SANE_TYPE_STRING;
-       descriptor->unit = SANE_UNIT_NONE;
-       descriptor->size = sizeof(SANE_String_Const*) * 3;
-       descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT | SANE_CAP_ADVANCED;
-       descriptor->constraint_type = SANE_CONSTRAINT_STRING_LIST;
-       descriptor->constraint.string_list = (SANE_String_Const*) constraint;
+       descriptor->config_name = MULTIFEED_RESPONSE;
+       descriptor->descriptor->name = "multifeed-response";
+       descriptor->descriptor->title = "Multifeed Response";
+       descriptor->descriptor->desc = "Multifeed Response";
+       descriptor->descriptor->type = SANE_TYPE_STRING;
+       descriptor->descriptor->unit = SANE_UNIT_NONE;
+       descriptor->descriptor->size = sizeof(SANE_String_Const*) * 3;
+       descriptor->descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT | SANE_CAP_ADVANCED;
+       descriptor->descriptor->constraint_type = SANE_CONSTRAINT_STRING_LIST;
+       descriptor->descriptor->constraint.string_list = (SANE_String_Const*) constraint;
 
        return descriptor;
 }
 
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_document_feeder_timeout()
+option_descriptor_t* _kds_s2000w_option_descriptor_document_feeder_timeout()
 {
+       option_descriptor_t* descriptor = _kds_s2000w_option_descriptor_descriptor_init();
+       if (descriptor == NULL)
+               return NULL;
+
        SANE_Range* constraint = malloc(sizeof(SANE_Range));
-       if (constraint == NULL)
+       if (constraint == NULL) {
+               _kds_s2000w_option_descriptor_descriptor_free(descriptor);
                return NULL;
+       }
 
        constraint->min = 0;
        constraint->max = 120;
        constraint->quant = 1;
 
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
-       if (descriptor == NULL) {
-               free(constraint);
-               constraint = NULL;
-               return NULL;
-       };
-
-       descriptor->name = "document-feeder-timeout";
-       descriptor->title = "Document Feeder Timeout";
-       descriptor->desc = "Document Feeder Timeout";
-       descriptor->type = SANE_TYPE_INT;
-       descriptor->unit = SANE_UNIT_NONE;
-       descriptor->size = sizeof(SANE_Int);
-       descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT | SANE_CAP_ADVANCED;
-       descriptor->constraint_type = SANE_CONSTRAINT_RANGE;
-       descriptor->constraint.range = constraint;
+       descriptor->config_name = DOCUMENT_FEEDER_TIMEOUT;
+       descriptor->descriptor->name = "document-feeder-timeout";
+       descriptor->descriptor->title = "Document Feeder Timeout";
+       descriptor->descriptor->desc = "Document Feeder Timeout";
+       descriptor->descriptor->type = SANE_TYPE_INT;
+       descriptor->descriptor->unit = SANE_UNIT_NONE;
+       descriptor->descriptor->size = sizeof(SANE_Int);
+       descriptor->descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT | SANE_CAP_ADVANCED;
+       descriptor->descriptor->constraint_type = SANE_CONSTRAINT_RANGE;
+       descriptor->descriptor->constraint.range = constraint;
 
        return descriptor;
 }
 
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_document_feeder_timeout_response()
+option_descriptor_t* _kds_s2000w_option_descriptor_document_feeder_timeout_response()
 {
+       option_descriptor_t* descriptor = _kds_s2000w_option_descriptor_descriptor_init();
+       if (descriptor == NULL)
+               return NULL;
+
        char** constraint = malloc(sizeof(SANE_String_Const*) * 4);
-       if (constraint == NULL)
+       if (constraint == NULL) {
+               _kds_s2000w_option_descriptor_descriptor_free(descriptor);
                return NULL;
+       }
 
        constraint[0] = "Stop";
        constraint[1] = "Pause";
        constraint[2] = "PauseAndWait";
        constraint[3] = NULL;
 
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
-       if (descriptor == NULL) {
-               free(constraint);
-               constraint = NULL;
-               return NULL;
-       };
-
-       descriptor->name = "document-feeder-timeout-response";
-       descriptor->title = "Document Feeder Timeout Response";
-       descriptor->desc = "Document Feeder Timeout Response";
-       descriptor->type = SANE_TYPE_STRING;
-       descriptor->unit = SANE_UNIT_NONE;
-       descriptor->size = sizeof(SANE_String_Const*) * 4;
-       descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT | SANE_CAP_ADVANCED;
-       descriptor->constraint_type = SANE_CONSTRAINT_STRING_LIST;
-       descriptor->constraint.string_list = (SANE_String_Const*) constraint;
+       descriptor->config_name = DOCUMENT_FEEDER_TIMEOUT_RESPONSE;
+       descriptor->descriptor->name = "document-feeder-timeout-response";
+       descriptor->descriptor->title = "Document Feeder Timeout Response";
+       descriptor->descriptor->desc = "Document Feeder Timeout Response";
+       descriptor->descriptor->type = SANE_TYPE_STRING;
+       descriptor->descriptor->unit = SANE_UNIT_NONE;
+       descriptor->descriptor->size = sizeof(SANE_String_Const*) * 4;
+       descriptor->descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT | SANE_CAP_ADVANCED;
+       descriptor->descriptor->constraint_type = SANE_CONSTRAINT_STRING_LIST;
+       descriptor->descriptor->constraint.string_list = (SANE_String_Const*) constraint;
 
        return descriptor;
 }
@@ -1427,40 +1453,18 @@ SANE_Status _kds_s2000w_option_descriptors_init_min_profile()
                kds_s2000w_descriptors[i] = NULL;
        }
 
-       for (int i = 0; i < kds_s2000w_max_option_count; i++) {
-               kds_s2000w_descriptors[i] = malloc(sizeof(option_descriptor_t));
-               if (kds_s2000w_descriptors[i] == NULL) {
-                       kds_s2000w_option_descriptors_free(kds_s2000w_descriptors);
-                       kds_s2000w_descriptors = NULL;
-                       return SANE_STATUS_NO_MEM;
-               }
-               kds_s2000w_descriptors[i]->descriptor = NULL;
-       }
-
-       kds_s2000w_descriptors[0]->config_name = OPTION_COUNT;
-       kds_s2000w_descriptors[0]->descriptor = _kds_s2000w_option_descriptor_num_options();
-       kds_s2000w_descriptors[1]->config_name = STANDARD_GROUP;
-       kds_s2000w_descriptors[1]->descriptor = _kds_s2000w_option_descriptor_standard_group();
-       kds_s2000w_descriptors[2]->config_name = COLOR_MODE;
-       kds_s2000w_descriptors[2]->descriptor = _kds_s2000w_option_descriptor_color_mode();
-       kds_s2000w_descriptors[3]->config_name = DPI;
-       kds_s2000w_descriptors[3]->descriptor = _kds_s2000w_option_descriptor_dpi();
-       kds_s2000w_descriptors[4]->config_name = SCAN_SIDE;
-       kds_s2000w_descriptors[4]->descriptor = _kds_s2000w_option_descriptor_scanside();
-       kds_s2000w_descriptors[5]->config_name = BOLDNESS_COLOR_GROUP;
-       kds_s2000w_descriptors[5]->descriptor = _kds_s2000w_option_descriptor_boldness_color_group();
-       kds_s2000w_descriptors[6]->config_name = COLOR_DROP_OUT;
-       kds_s2000w_descriptors[6]->descriptor = _kds_s2000w_option_descriptor_color_drop();
-       kds_s2000w_descriptors[7]->config_name = RESET;
-       kds_s2000w_descriptors[7]->descriptor = _kds_s2000w_option_descriptor_config_reset();
-       kds_s2000w_descriptors[8]->config_name = IMAGE_PROCESSING_GROUP;
-       kds_s2000w_descriptors[8]->descriptor = _kds_s2000w_option_descriptor_image_processing_group();
-       kds_s2000w_descriptors[9]->config_name = SKIP_BLANK_PAGES;
-       kds_s2000w_descriptors[9]->descriptor = _kds_s2000w_option_descriptor_skip_blank_pages();
-       kds_s2000w_descriptors[10]->config_name = FEEDER_GROUP;
-       kds_s2000w_descriptors[10]->descriptor = _kds_s2000w_option_descriptor_feeder_group();
-       kds_s2000w_descriptors[11]->config_name = AUTOSTART;
-       kds_s2000w_descriptors[11]->descriptor = _kds_s2000w_option_descriptor_autostart();
+       kds_s2000w_descriptors[0] = _kds_s2000w_option_descriptor_num_options();;
+       kds_s2000w_descriptors[1] = _kds_s2000w_option_descriptor_standard_group();
+       kds_s2000w_descriptors[2] = _kds_s2000w_option_descriptor_color_mode();
+       kds_s2000w_descriptors[3] = _kds_s2000w_option_descriptor_dpi();
+       kds_s2000w_descriptors[4] = _kds_s2000w_option_descriptor_scanside();
+       kds_s2000w_descriptors[5] = _kds_s2000w_option_descriptor_boldness_color_group();
+       kds_s2000w_descriptors[6] = _kds_s2000w_option_descriptor_color_drop();
+       kds_s2000w_descriptors[7] = _kds_s2000w_option_descriptor_config_reset();
+       kds_s2000w_descriptors[8] = _kds_s2000w_option_descriptor_image_processing_group();
+       kds_s2000w_descriptors[9] = _kds_s2000w_option_descriptor_skip_blank_pages();
+       kds_s2000w_descriptors[10] = _kds_s2000w_option_descriptor_feeder_group();
+       kds_s2000w_descriptors[11] = _kds_s2000w_option_descriptor_autostart();
 
        return _kds_s2000w_option_descriptor_validate();
 }
@@ -1477,68 +1481,32 @@ SANE_Status _kds_s2000w_option_descriptors_init_230802_v1_0_36_profile()
                kds_s2000w_descriptors[i] = NULL;
        }
 
-       for (int i = 0; i < kds_s2000w_max_option_count; i++) {
-               kds_s2000w_descriptors[i] = malloc(sizeof(option_descriptor_t));
-               if (kds_s2000w_descriptors[i] == NULL) {
-                       kds_s2000w_option_descriptors_free(kds_s2000w_descriptors);
-                       kds_s2000w_descriptors = NULL;
-                       return SANE_STATUS_NO_MEM;
-               }
-               kds_s2000w_descriptors[i]->descriptor = NULL;
-       }
-
-       kds_s2000w_descriptors[0]->config_name = OPTION_COUNT;
-       kds_s2000w_descriptors[0]->descriptor = _kds_s2000w_option_descriptor_num_options();
-       kds_s2000w_descriptors[1]->config_name = STANDARD_GROUP;
-       kds_s2000w_descriptors[1]->descriptor = _kds_s2000w_option_descriptor_standard_group();
-       kds_s2000w_descriptors[2]->config_name = SCAN_SOURCE;
-       kds_s2000w_descriptors[2]->descriptor = _kds_s2000w_option_descriptor_scan_source();
-       kds_s2000w_descriptors[3]->config_name = COLOR_MODE;
-       kds_s2000w_descriptors[3]->descriptor = _kds_s2000w_option_descriptor_color_mode();
-       kds_s2000w_descriptors[4]->config_name = DPI;
-       kds_s2000w_descriptors[4]->descriptor = _kds_s2000w_option_descriptor_dpi();
-       kds_s2000w_descriptors[5]->config_name = SCAN_SIDE;
-       kds_s2000w_descriptors[5]->descriptor = _kds_s2000w_option_descriptor_scanside();
-       kds_s2000w_descriptors[6]->config_name = BOLDNESS_SMOOTHING_GROUP;
-       kds_s2000w_descriptors[6]->descriptor = _kds_s2000w_option_descriptor_boldness_smoothing_group();
-       kds_s2000w_descriptors[7]->config_name = FOREGROUND_BOLDNESS_MODE;
-       kds_s2000w_descriptors[7]->descriptor = _kds_s2000w_option_descriptor_foreground_boldness_mode();
-       kds_s2000w_descriptors[8]->config_name = FOREGROUND_BOLDNESS_AGGRESSIVENESS;
-       kds_s2000w_descriptors[8]->descriptor = _kds_s2000w_option_descriptor_foreground_boldness_aggressiveness();
-       kds_s2000w_descriptors[9]->config_name = BACKGROUND_SMOOTHING_MODE;
-       kds_s2000w_descriptors[9]->descriptor = _kds_s2000w_option_descriptor_background_smoothing_mode();
-       kds_s2000w_descriptors[10]->config_name = BACKGROUND_SMOOTHING_AGGRESSIVENESS;
-       kds_s2000w_descriptors[10]->descriptor = _kds_s2000w_option_descriptor_background_smoothing_aggressiveness();
-       kds_s2000w_descriptors[11]->config_name = BOLDNESS_COLOR_GROUP;
-       kds_s2000w_descriptors[11]->descriptor = _kds_s2000w_option_descriptor_boldness_color_group();
-       kds_s2000w_descriptors[12]->config_name = COLOR_DROP_OUT;
-       kds_s2000w_descriptors[12]->descriptor = _kds_s2000w_option_descriptor_color_drop();
-       kds_s2000w_descriptors[13]->config_name = COLOR_DROP_OUT_AGGRESSIVENESS;
-       kds_s2000w_descriptors[13]->descriptor = _kds_s2000w_option_descriptor_color_drop_out_aggressiveness();
-       kds_s2000w_descriptors[14]->config_name = COLOR_AUTO_BRIGHTNESS_MODE;
-       kds_s2000w_descriptors[14]->descriptor = _kds_s2000w_option_descriptor_color_auto_brightness_mode();
-       kds_s2000w_descriptors[15]->config_name = COLOR_BALANCE_MODE;
-       kds_s2000w_descriptors[15]->descriptor = _kds_s2000w_option_descriptor_color_balance_mode();
-       kds_s2000w_descriptors[16]->config_name = COLOR_BALANCE_AGGRESSIVENESS;
-       kds_s2000w_descriptors[16]->descriptor = _kds_s2000w_option_descriptor_color_balance_agressiveness();
-       kds_s2000w_descriptors[17]->config_name = COLOR_BALANCE_RED;
-       kds_s2000w_descriptors[17]->descriptor = _kds_s2000w_option_descriptor_color_balance_red();
-       kds_s2000w_descriptors[18]->config_name = COLOR_BALANCE_GREEN;
-       kds_s2000w_descriptors[18]->descriptor = _kds_s2000w_option_descriptor_color_balance_green();
-       kds_s2000w_descriptors[19]->config_name = COLOR_BALANCE_BLUE;
-       kds_s2000w_descriptors[19]->descriptor = _kds_s2000w_option_descriptor_color_balance_blue();
-       kds_s2000w_descriptors[20]->config_name = BINARIZATION_CONTRAST;
-       kds_s2000w_descriptors[20]->descriptor = _kds_s2000w_option_descriptor_binarization_contrast();
-       kds_s2000w_descriptors[21]->config_name = RESET;
-       kds_s2000w_descriptors[21]->descriptor = _kds_s2000w_option_descriptor_config_reset();
-       kds_s2000w_descriptors[22]->config_name = IMAGE_PROCESSING_GROUP;
-       kds_s2000w_descriptors[22]->descriptor = _kds_s2000w_option_descriptor_image_processing_group();
-       kds_s2000w_descriptors[23]->config_name = SKIP_BLANK_PAGES;
-       kds_s2000w_descriptors[23]->descriptor = _kds_s2000w_option_descriptor_skip_blank_pages();
-       kds_s2000w_descriptors[24]->config_name = FEEDER_GROUP;
-       kds_s2000w_descriptors[24]->descriptor = _kds_s2000w_option_descriptor_feeder_group();
-       kds_s2000w_descriptors[25]->config_name = AUTOSTART;
-       kds_s2000w_descriptors[25]->descriptor = _kds_s2000w_option_descriptor_autostart();
+       kds_s2000w_descriptors[0] = _kds_s2000w_option_descriptor_num_options();
+       kds_s2000w_descriptors[1] = _kds_s2000w_option_descriptor_standard_group();
+       kds_s2000w_descriptors[2] = _kds_s2000w_option_descriptor_scan_source();
+       kds_s2000w_descriptors[3] = _kds_s2000w_option_descriptor_color_mode();
+       kds_s2000w_descriptors[4] = _kds_s2000w_option_descriptor_dpi();
+       kds_s2000w_descriptors[5] = _kds_s2000w_option_descriptor_scanside();
+       kds_s2000w_descriptors[6] = _kds_s2000w_option_descriptor_boldness_smoothing_group();
+       kds_s2000w_descriptors[7] = _kds_s2000w_option_descriptor_foreground_boldness_mode();
+       kds_s2000w_descriptors[8] = _kds_s2000w_option_descriptor_foreground_boldness_aggressiveness();
+       kds_s2000w_descriptors[9] = _kds_s2000w_option_descriptor_background_smoothing_mode();
+       kds_s2000w_descriptors[10] = _kds_s2000w_option_descriptor_background_smoothing_aggressiveness();
+       kds_s2000w_descriptors[11] = _kds_s2000w_option_descriptor_boldness_color_group();
+       kds_s2000w_descriptors[12] = _kds_s2000w_option_descriptor_color_drop();
+       kds_s2000w_descriptors[13] = _kds_s2000w_option_descriptor_color_drop_out_aggressiveness();
+       kds_s2000w_descriptors[14] = _kds_s2000w_option_descriptor_color_auto_brightness_mode();
+       kds_s2000w_descriptors[15] = _kds_s2000w_option_descriptor_color_balance_mode();
+       kds_s2000w_descriptors[16] = _kds_s2000w_option_descriptor_color_balance_agressiveness();
+       kds_s2000w_descriptors[17] = _kds_s2000w_option_descriptor_color_balance_red();
+       kds_s2000w_descriptors[18] = _kds_s2000w_option_descriptor_color_balance_green();
+       kds_s2000w_descriptors[19] = _kds_s2000w_option_descriptor_color_balance_blue();
+       kds_s2000w_descriptors[20] = _kds_s2000w_option_descriptor_binarization_contrast();
+       kds_s2000w_descriptors[21] = _kds_s2000w_option_descriptor_config_reset();
+       kds_s2000w_descriptors[22] = _kds_s2000w_option_descriptor_image_processing_group();
+       kds_s2000w_descriptors[23] = _kds_s2000w_option_descriptor_skip_blank_pages();
+       kds_s2000w_descriptors[24] = _kds_s2000w_option_descriptor_feeder_group();
+       kds_s2000w_descriptors[25] = _kds_s2000w_option_descriptor_autostart();
 
        return _kds_s2000w_option_descriptor_validate();
 }
@@ -1555,112 +1523,54 @@ SANE_Status _kds_s2000w_option_descriptors_init_full_profile()
                kds_s2000w_descriptors[i] = NULL;
        }
 
-       for (int i = 0; i < kds_s2000w_max_option_count; i++) {
-               kds_s2000w_descriptors[i] = malloc(sizeof(option_descriptor_t));
-               if (kds_s2000w_descriptors[i] == NULL) {
-                       kds_s2000w_option_descriptors_free(kds_s2000w_descriptors);
-                       kds_s2000w_descriptors = NULL;
-                       return SANE_STATUS_NO_MEM;
-               }
-               kds_s2000w_descriptors[i]->descriptor = NULL;
-       }
-
-       kds_s2000w_descriptors[0]->config_name = OPTION_COUNT;
-       kds_s2000w_descriptors[0]->descriptor = _kds_s2000w_option_descriptor_num_options();
-       kds_s2000w_descriptors[1]->config_name = STANDARD_GROUP;
-       kds_s2000w_descriptors[1]->descriptor = _kds_s2000w_option_descriptor_standard_group();
-       kds_s2000w_descriptors[2]->config_name = SCAN_SOURCE;
-       kds_s2000w_descriptors[2]->descriptor = _kds_s2000w_option_descriptor_scan_source();
-       kds_s2000w_descriptors[3]->config_name = COLOR_MODE;
-       kds_s2000w_descriptors[3]->descriptor = _kds_s2000w_option_descriptor_color_mode();
-       kds_s2000w_descriptors[4]->config_name = DPI;
-       kds_s2000w_descriptors[4]->descriptor = _kds_s2000w_option_descriptor_dpi();
-       kds_s2000w_descriptors[5]->config_name = SCAN_SIDE;
-       kds_s2000w_descriptors[5]->descriptor = _kds_s2000w_option_descriptor_scanside();
-       kds_s2000w_descriptors[6]->config_name = GEOMETRY_GROUP;
-       kds_s2000w_descriptors[6]->descriptor = _kds_s2000w_option_descriptor_geometry_group();
-       kds_s2000w_descriptors[7]->config_name = CROPPING_MODE;
-       kds_s2000w_descriptors[7]->descriptor = _kds_s2000w_option_descriptor_cropping_mode();
-       kds_s2000w_descriptors[8]->config_name = CROPPING_IMAGE;
-       kds_s2000w_descriptors[8]->descriptor = _kds_s2000w_option_descriptor_cropping_image();
-       kds_s2000w_descriptors[9]->config_name = IMAGE_OFFSET_X;
-       kds_s2000w_descriptors[9]->descriptor = _kds_s2000w_option_descriptor_image_offset_x();
-       kds_s2000w_descriptors[10]->config_name = IMAGE_OFFSET_Y;
-       kds_s2000w_descriptors[10]->descriptor = _kds_s2000w_option_descriptor_image_offset_y();
-       kds_s2000w_descriptors[11]->config_name = IMAGE_WIDTH;
-       kds_s2000w_descriptors[11]->descriptor = _kds_s2000w_option_descriptor_image_width();
-       kds_s2000w_descriptors[12]->config_name = IMAGE_HEIGHT;
-       kds_s2000w_descriptors[12]->descriptor = _kds_s2000w_option_descriptor_image_height();
-       kds_s2000w_descriptors[13]->config_name = BOLDNESS_SMOOTHING_GROUP;
-       kds_s2000w_descriptors[13]->descriptor = _kds_s2000w_option_descriptor_boldness_smoothing_group();
-       kds_s2000w_descriptors[14]->config_name = FOREGROUND_BOLDNESS_MODE;
-       kds_s2000w_descriptors[14]->descriptor = _kds_s2000w_option_descriptor_foreground_boldness_mode();
-       kds_s2000w_descriptors[15]->config_name = FOREGROUND_BOLDNESS_AGGRESSIVENESS;
-       kds_s2000w_descriptors[15]->descriptor = _kds_s2000w_option_descriptor_foreground_boldness_aggressiveness();
-       kds_s2000w_descriptors[16]->config_name = BACKGROUND_SMOOTHING_MODE;
-       kds_s2000w_descriptors[16]->descriptor = _kds_s2000w_option_descriptor_background_smoothing_mode();
-       kds_s2000w_descriptors[17]->config_name = BACKGROUND_SMOOTHING_AGGRESSIVENESS;
-       kds_s2000w_descriptors[17]->descriptor = _kds_s2000w_option_descriptor_background_smoothing_aggressiveness();
-       kds_s2000w_descriptors[18]->config_name = BOLDNESS_COLOR_GROUP;
-       kds_s2000w_descriptors[18]->descriptor = _kds_s2000w_option_descriptor_boldness_color_group();
-       kds_s2000w_descriptors[19]->config_name = COLOR_DROP_OUT;
-       kds_s2000w_descriptors[19]->descriptor = _kds_s2000w_option_descriptor_color_drop();
-       kds_s2000w_descriptors[20]->config_name = COLOR_DROP_OUT_AGGRESSIVENESS;
-       kds_s2000w_descriptors[20]->descriptor = _kds_s2000w_option_descriptor_color_drop_out_aggressiveness();
-       kds_s2000w_descriptors[21]->config_name = COLOR_AUTO_BRIGHTNESS_MODE;
-       kds_s2000w_descriptors[21]->descriptor = _kds_s2000w_option_descriptor_color_auto_brightness_mode();
-       kds_s2000w_descriptors[22]->config_name = COLOR_BRIGHTNESS;
-       kds_s2000w_descriptors[22]->descriptor = _kds_s2000w_option_descriptor_color_brightness();
-       kds_s2000w_descriptors[23]->config_name = COLOR_CONTRAST;
-       kds_s2000w_descriptors[23]->descriptor = _kds_s2000w_option_descriptor_color_contrast();
-       kds_s2000w_descriptors[24]->config_name = COLOR_BALANCE_MODE;
-       kds_s2000w_descriptors[24]->descriptor = _kds_s2000w_option_descriptor_color_balance_mode();
-       kds_s2000w_descriptors[25]->config_name = COLOR_BALANCE_AGGRESSIVENESS;
-       kds_s2000w_descriptors[25]->descriptor = _kds_s2000w_option_descriptor_color_balance_agressiveness();
-       kds_s2000w_descriptors[26]->config_name = COLOR_BALANCE_RED;
-       kds_s2000w_descriptors[26]->descriptor = _kds_s2000w_option_descriptor_color_balance_red();
-       kds_s2000w_descriptors[27]->config_name = COLOR_BALANCE_GREEN;
-       kds_s2000w_descriptors[27]->descriptor = _kds_s2000w_option_descriptor_color_balance_green();
-       kds_s2000w_descriptors[28]->config_name = COLOR_BALANCE_BLUE;
-       kds_s2000w_descriptors[28]->descriptor = _kds_s2000w_option_descriptor_color_balance_blue();
-       kds_s2000w_descriptors[29]->config_name = COLOR_SHARPEN;
-       kds_s2000w_descriptors[29]->descriptor = _kds_s2000w_option_descriptor_color_sharpen();
-       kds_s2000w_descriptors[30]->config_name = BINARIZATION_CONTRAST;
-       kds_s2000w_descriptors[30]->descriptor = _kds_s2000w_option_descriptor_binarization_contrast();
-       kds_s2000w_descriptors[31]->config_name = RESET;
-       kds_s2000w_descriptors[31]->descriptor = _kds_s2000w_option_descriptor_config_reset();
-       kds_s2000w_descriptors[32]->config_name = IMAGE_PROCESSING_GROUP;
-       kds_s2000w_descriptors[32]->descriptor = _kds_s2000w_option_descriptor_image_processing_group();
-       kds_s2000w_descriptors[33]->config_name = SKIP_BLANK_PAGES;
-       kds_s2000w_descriptors[33]->descriptor = _kds_s2000w_option_descriptor_skip_blank_pages();
-       kds_s2000w_descriptors[34]->config_name = SKIP_BLANK_PAGES_CONTENT;
-       kds_s2000w_descriptors[34]->descriptor = _kds_s2000w_option_descriptor_skip_blank_page_content();
-       kds_s2000w_descriptors[35]->config_name = HOLE_FILL;
-       kds_s2000w_descriptors[35]->descriptor = _kds_s2000w_option_descriptor_hole_fill();
-       kds_s2000w_descriptors[36]->config_name = POST_SCAN_ROTATION;
-       kds_s2000w_descriptors[36]->descriptor = _kds_s2000w_option_descriptor_post_scan_rotation();
-       kds_s2000w_descriptors[37]->config_name = EDGE_FILL;
-       kds_s2000w_descriptors[37]->descriptor = _kds_s2000w_option_descriptor_edge_fill();
-       kds_s2000w_descriptors[38]->config_name = IMAGE_BORDER;
-       kds_s2000w_descriptors[38]->descriptor = _kds_s2000w_option_descriptor_image_border();
-       kds_s2000w_descriptors[39]->config_name = JPEG_QUALITY;
-       kds_s2000w_descriptors[39]->descriptor = _kds_s2000w_option_descriptor_jpeg_quality();
-       kds_s2000w_descriptors[40]->config_name = FEEDER_GROUP;
-       kds_s2000w_descriptors[40]->descriptor = _kds_s2000w_option_descriptor_feeder_group();
-       kds_s2000w_descriptors[41]->config_name = AUTOSTART;
-       kds_s2000w_descriptors[41]->descriptor = _kds_s2000w_option_descriptor_autostart();
-       kds_s2000w_descriptors[42]->config_name = MAX_DOCUMENT_LENGTH;
-       kds_s2000w_descriptors[42]->descriptor = _kds_s2000w_option_descriptor_max_document_length();
-       kds_s2000w_descriptors[43]->config_name = TRANSPORT_HANDLING;
-       kds_s2000w_descriptors[43]->descriptor = _kds_s2000w_option_descriptor_transport_handling();
-       kds_s2000w_descriptors[44]->config_name = MULTIFEED_SENSITIVITY;
-       kds_s2000w_descriptors[44]->descriptor = _kds_s2000w_option_descriptor_multifeed_sensitivity();
-       kds_s2000w_descriptors[45]->config_name = MULTIFEED_RESPONSE;
-       kds_s2000w_descriptors[45]->descriptor = _kds_s2000w_option_descriptor_multifeed_response();
-       kds_s2000w_descriptors[46]->config_name = DOCUMENT_FEEDER_TIMEOUT;
-       kds_s2000w_descriptors[46]->descriptor = _kds_s2000w_option_descriptor_document_feeder_timeout();
-       kds_s2000w_descriptors[47]->config_name = DOCUMENT_FEEDER_TIMEOUT_RESPONSE;
-       kds_s2000w_descriptors[47]->descriptor = _kds_s2000w_option_descriptor_document_feeder_timeout_response();
+       kds_s2000w_descriptors[0] = _kds_s2000w_option_descriptor_num_options();
+       kds_s2000w_descriptors[1] = _kds_s2000w_option_descriptor_standard_group();
+       kds_s2000w_descriptors[2] = _kds_s2000w_option_descriptor_scan_source();
+       kds_s2000w_descriptors[3] = _kds_s2000w_option_descriptor_color_mode();
+       kds_s2000w_descriptors[4] = _kds_s2000w_option_descriptor_dpi();
+       kds_s2000w_descriptors[5] = _kds_s2000w_option_descriptor_scanside();
+       kds_s2000w_descriptors[6] = _kds_s2000w_option_descriptor_geometry_group();
+       kds_s2000w_descriptors[7] = _kds_s2000w_option_descriptor_cropping_mode();
+       kds_s2000w_descriptors[8] = _kds_s2000w_option_descriptor_cropping_image();
+       kds_s2000w_descriptors[9] = _kds_s2000w_option_descriptor_image_offset_x();
+       kds_s2000w_descriptors[10] = _kds_s2000w_option_descriptor_image_offset_y();
+       kds_s2000w_descriptors[11] = _kds_s2000w_option_descriptor_image_width();
+       kds_s2000w_descriptors[12] = _kds_s2000w_option_descriptor_image_height();
+       kds_s2000w_descriptors[13] = _kds_s2000w_option_descriptor_boldness_smoothing_group();
+       kds_s2000w_descriptors[14] = _kds_s2000w_option_descriptor_foreground_boldness_mode();
+       kds_s2000w_descriptors[15] = _kds_s2000w_option_descriptor_foreground_boldness_aggressiveness();
+       kds_s2000w_descriptors[16] = _kds_s2000w_option_descriptor_background_smoothing_mode();
+       kds_s2000w_descriptors[17] = _kds_s2000w_option_descriptor_background_smoothing_aggressiveness();
+       kds_s2000w_descriptors[18] = _kds_s2000w_option_descriptor_boldness_color_group();
+       kds_s2000w_descriptors[19] = _kds_s2000w_option_descriptor_color_drop();
+       kds_s2000w_descriptors[20] = _kds_s2000w_option_descriptor_color_drop_out_aggressiveness();
+       kds_s2000w_descriptors[21] = _kds_s2000w_option_descriptor_color_auto_brightness_mode();
+       kds_s2000w_descriptors[22] = _kds_s2000w_option_descriptor_color_brightness();
+       kds_s2000w_descriptors[23] = _kds_s2000w_option_descriptor_color_contrast();
+       kds_s2000w_descriptors[24] = _kds_s2000w_option_descriptor_color_balance_mode();
+       kds_s2000w_descriptors[25] = _kds_s2000w_option_descriptor_color_balance_agressiveness();
+       kds_s2000w_descriptors[26] = _kds_s2000w_option_descriptor_color_balance_red();
+       kds_s2000w_descriptors[27] = _kds_s2000w_option_descriptor_color_balance_green();
+       kds_s2000w_descriptors[28] = _kds_s2000w_option_descriptor_color_balance_blue();
+       kds_s2000w_descriptors[29] = _kds_s2000w_option_descriptor_color_sharpen();
+       kds_s2000w_descriptors[30] = _kds_s2000w_option_descriptor_binarization_contrast();
+       kds_s2000w_descriptors[31] = _kds_s2000w_option_descriptor_config_reset();
+       kds_s2000w_descriptors[32] = _kds_s2000w_option_descriptor_image_processing_group();
+       kds_s2000w_descriptors[33] = _kds_s2000w_option_descriptor_skip_blank_pages();
+       kds_s2000w_descriptors[34] = _kds_s2000w_option_descriptor_skip_blank_page_content();
+       kds_s2000w_descriptors[35] = _kds_s2000w_option_descriptor_hole_fill();
+       kds_s2000w_descriptors[36] = _kds_s2000w_option_descriptor_post_scan_rotation();
+       kds_s2000w_descriptors[37] = _kds_s2000w_option_descriptor_edge_fill();
+       kds_s2000w_descriptors[38] = _kds_s2000w_option_descriptor_image_border();
+       kds_s2000w_descriptors[39] = _kds_s2000w_option_descriptor_jpeg_quality();
+       kds_s2000w_descriptors[40] = _kds_s2000w_option_descriptor_feeder_group();
+       kds_s2000w_descriptors[41] = _kds_s2000w_option_descriptor_autostart();
+       kds_s2000w_descriptors[42] = _kds_s2000w_option_descriptor_max_document_length();
+       kds_s2000w_descriptors[43] = _kds_s2000w_option_descriptor_transport_handling();
+       kds_s2000w_descriptors[44] = _kds_s2000w_option_descriptor_multifeed_sensitivity();
+       kds_s2000w_descriptors[45] = _kds_s2000w_option_descriptor_multifeed_response();
+       kds_s2000w_descriptors[46] = _kds_s2000w_option_descriptor_document_feeder_timeout();
+       kds_s2000w_descriptors[47] = _kds_s2000w_option_descriptor_document_feeder_timeout_response();
 
        return _kds_s2000w_option_descriptor_validate();
 }