]> gitweb.hhaalo.de Git - sane-kds-s2000w-net.git/commitdiff
change init descriptory array on stack
authorBastian Dehn <hhaalo@arcor.de>
Sun, 10 Mar 2024 13:21:13 +0000 (14:21 +0100)
committerBastian Dehn <hhaalo@arcor.de>
Sun, 10 Mar 2024 13:21:13 +0000 (14:21 +0100)
src/kds_s2000w_option_descriptors.c

index 72210575d673ea711e098278ecdcc66caa36e654..db3097be3dd913844ffc1ca49cc8b17bb10dad2b 100644 (file)
@@ -3,7 +3,7 @@
 #include "kds_s2000w_option_descriptors.h"
 #include "kds_s2000w_debug.h"
 
-SANE_Option_Descriptor** descriptor_array = NULL;
+SANE_Option_Descriptor descriptor_array[MAX_OPTION_COUNT];
 
 SANE_Word constraint_dpi[] = {2, 200, 300};
 SANE_Word constraint_depth[] = {2, 1, 8};
@@ -26,147 +26,147 @@ SANE_String_Const* constraint_binarization_mode = NULL;
 SANE_String_Const* constraint_max_document_length = NULL;
 SANE_String_Const* constraint_scan_source = NULL;
 
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_standard_group()
+SANE_Option_Descriptor _kds_s2000w_option_descriptor_standard_group()
 {
        debug_printf(ALL, "kds_s2000w_option_descriptor_standard_group");
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
+       SANE_Option_Descriptor descriptor;
 
-       descriptor->name = SANE_NAME_STANDARD;
-       descriptor->title = SANE_TITLE_STANDARD;
-       descriptor->desc = SANE_DESC_STANDARD;
-       descriptor->unit = SANE_UNIT_NONE;
-       descriptor->cap = SANE_CAP_SOFT_DETECT;
-       descriptor->constraint_type = SANE_CONSTRAINT_NONE;
-       descriptor->type = SANE_TYPE_GROUP;
-       descriptor->size = 0;
+       descriptor.name = SANE_NAME_STANDARD;
+       descriptor.title = SANE_TITLE_STANDARD;
+       descriptor.desc = SANE_DESC_STANDARD;
+       descriptor.unit = SANE_UNIT_NONE;
+       descriptor.cap = SANE_CAP_SOFT_DETECT;
+       descriptor.constraint_type = SANE_CONSTRAINT_NONE;
+       descriptor.type = SANE_TYPE_GROUP;
+       descriptor.size = 0;
 
        return descriptor;
 }
 
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_geometry_group()
+SANE_Option_Descriptor _kds_s2000w_option_descriptor_geometry_group()
 {
        debug_printf(ALL, "kds_s2000w_option_descriptor_scan_area_group");
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
+       SANE_Option_Descriptor descriptor;
 
-       descriptor->name = SANE_NAME_GEOMETRY;
-       descriptor->title = SANE_TITLE_GEOMETRY;
-       descriptor->desc = SANE_DESC_GEOMETRY;
-       descriptor->unit = SANE_UNIT_NONE;
-       descriptor->cap = SANE_CAP_SOFT_DETECT;
-       descriptor->constraint_type = SANE_CONSTRAINT_NONE;
-       descriptor->type = SANE_TYPE_GROUP;
-       descriptor->size = 0;
+       descriptor.name = SANE_NAME_GEOMETRY;
+       descriptor.title = SANE_TITLE_GEOMETRY;
+       descriptor.desc = SANE_DESC_GEOMETRY;
+       descriptor.unit = SANE_UNIT_NONE;
+       descriptor.cap = SANE_CAP_SOFT_DETECT;
+       descriptor.constraint_type = SANE_CONSTRAINT_NONE;
+       descriptor.type = SANE_TYPE_GROUP;
+       descriptor.size = 0;
 
        return descriptor;
 }
 
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_num_options()
+SANE_Option_Descriptor _kds_s2000w_option_descriptor_num_options()
 {
        debug_printf(ALL, "kds_s2000w_option_descriptor_num_options");
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
+       SANE_Option_Descriptor descriptor;
 
-       descriptor->name = SANE_NAME_NUM_OPTIONS;
-       descriptor->title = SANE_TITLE_NUM_OPTIONS;
-       descriptor->desc = SANE_DESC_NUM_OPTIONS;
-       descriptor->unit = SANE_UNIT_NONE;
-       descriptor->cap = SANE_CAP_SOFT_DETECT;
-       descriptor->constraint_type = SANE_CONSTRAINT_NONE;
-       descriptor->type = SANE_TYPE_INT;
-       descriptor->size = sizeof(SANE_Int);
+       descriptor.name = SANE_NAME_NUM_OPTIONS;
+       descriptor.title = SANE_TITLE_NUM_OPTIONS;
+       descriptor.desc = SANE_DESC_NUM_OPTIONS;
+       descriptor.unit = SANE_UNIT_NONE;
+       descriptor.cap = SANE_CAP_SOFT_DETECT;
+       descriptor.constraint_type = SANE_CONSTRAINT_NONE;
+       descriptor.type = SANE_TYPE_INT;
+       descriptor.size = sizeof(SANE_Int);
 
        return descriptor;
 }
 
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_dpi()
+SANE_Option_Descriptor _kds_s2000w_option_descriptor_dpi()
 {
        debug_printf(ALL, "kds_s2000w_option_descriptor_dpi");
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
-
-       descriptor->name = SANE_NAME_SCAN_RESOLUTION;
-       descriptor->title = SANE_TITLE_SCAN_RESOLUTION;
-       descriptor->desc = SANE_DESC_SCAN_RESOLUTION;
-       descriptor->unit = SANE_UNIT_DPI;
-       descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
-       descriptor->constraint_type = SANE_CONSTRAINT_WORD_LIST;
-       descriptor->constraint.word_list = constraint_dpi;
-       descriptor->type = SANE_TYPE_INT;
-       descriptor->size = sizeof(SANE_Int);
+       SANE_Option_Descriptor descriptor;
+
+       descriptor.name = SANE_NAME_SCAN_RESOLUTION;
+       descriptor.title = SANE_TITLE_SCAN_RESOLUTION;
+       descriptor.desc = SANE_DESC_SCAN_RESOLUTION;
+       descriptor.unit = SANE_UNIT_DPI;
+       descriptor.cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
+       descriptor.constraint_type = SANE_CONSTRAINT_WORD_LIST;
+       descriptor.constraint.word_list = constraint_dpi;
+       descriptor.type = SANE_TYPE_INT;
+       descriptor.size = sizeof(SANE_Int);
 
        return descriptor;
 }
 
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_scanside()
+SANE_Option_Descriptor _kds_s2000w_option_descriptor_scanside()
 {
        debug_printf(ALL, "kds_s2000w_option_descriptor_scanside");
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
+       SANE_Option_Descriptor descriptor;
 
-       descriptor->name = "scanside";
-       descriptor->title = "Duplex Mode";
-       descriptor->desc = "Duplex Mode";
-       descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
-       descriptor->constraint_type = SANE_CONSTRAINT_STRING_LIST;
+       descriptor.name = "scanside";
+       descriptor.title = "Duplex Mode";
+       descriptor.desc = "Duplex Mode";
+       descriptor.cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
+       descriptor.constraint_type = SANE_CONSTRAINT_STRING_LIST;
        constraint_scanside = malloc(sizeof(char*) * 3);
        constraint_scanside[0] = "Simplex";
        constraint_scanside[1] = "Duplex";
        constraint_scanside[2] = NULL;
-       descriptor->constraint.string_list = constraint_scanside;
-       descriptor->type = SANE_TYPE_STRING;
-       descriptor->unit = SANE_UNIT_NONE;
-       descriptor->size = sizeof(SANE_String) * 50;
+       descriptor.constraint.string_list = constraint_scanside;
+       descriptor.type = SANE_TYPE_STRING;
+       descriptor.unit = SANE_UNIT_NONE;
+       descriptor.size = sizeof(SANE_String) * 50;
 
        return descriptor;
 }
 
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_color_mode()
+SANE_Option_Descriptor _kds_s2000w_option_descriptor_color_mode()
 {
        debug_printf(ALL, "kds_s2000w_option_descriptor_color_mode");
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
+       SANE_Option_Descriptor descriptor;
 
-       descriptor->name = SANE_NAME_SCAN_MODE;
-       descriptor->title = SANE_TITLE_SCAN_MODE;
-       descriptor->desc = SANE_DESC_SCAN_MODE;
-       descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
-       descriptor->constraint_type = SANE_CONSTRAINT_STRING_LIST;
+       descriptor.name = SANE_NAME_SCAN_MODE;
+       descriptor.title = SANE_TITLE_SCAN_MODE;
+       descriptor.desc = SANE_DESC_SCAN_MODE;
+       descriptor.cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
+       descriptor.constraint_type = SANE_CONSTRAINT_STRING_LIST;
        constraint_colormode = malloc(sizeof(char*) * 4);
        constraint_colormode[0] = "Color";
        constraint_colormode[1] = "Gray";
        constraint_colormode[2] = "BW";
        constraint_colormode[3] = NULL;
-       descriptor->constraint.string_list = constraint_colormode;
-       descriptor->type = SANE_TYPE_STRING;
-       descriptor->unit = SANE_UNIT_NONE;
-       descriptor->size = sizeof(SANE_String) * 50;
+       descriptor.constraint.string_list = constraint_colormode;
+       descriptor.type = SANE_TYPE_STRING;
+       descriptor.unit = SANE_UNIT_NONE;
+       descriptor.size = sizeof(SANE_String) * 50;
 
        return descriptor;
 }
 
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_skip_blank_pages()
+SANE_Option_Descriptor _kds_s2000w_option_descriptor_skip_blank_pages()
 {
        debug_printf(ALL, "kds_s2000w_option_descriptor_skip_blank_pages");
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
+       SANE_Option_Descriptor descriptor;
 
-       descriptor->name = "skip-blank-pages";
-       descriptor->title = "Blank Image Deletion Mode";
-       descriptor->desc = "Blank Image Deletion Mode";
-       descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
-       descriptor->constraint_type = SANE_CONSTRAINT_NONE;
-       descriptor->type = SANE_TYPE_BOOL;
-       descriptor->unit = SANE_UNIT_NONE;
-       descriptor->size = sizeof(SANE_Bool);
+       descriptor.name = "skip-blank-pages";
+       descriptor.title = "Blank Image Deletion Mode";
+       descriptor.desc = "Blank Image Deletion Mode";
+       descriptor.cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
+       descriptor.constraint_type = SANE_CONSTRAINT_NONE;
+       descriptor.type = SANE_TYPE_BOOL;
+       descriptor.unit = SANE_UNIT_NONE;
+       descriptor.size = sizeof(SANE_Bool);
 
        return descriptor;
 }
 
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_color_drop()
+SANE_Option_Descriptor _kds_s2000w_option_descriptor_color_drop()
 {
        debug_printf(ALL, "kds_s2000w_option_descriptor_color_drop");
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
+       SANE_Option_Descriptor descriptor;
 
-       descriptor->name = "colordrop";
-       descriptor->title = "colordrop";
-       descriptor->desc = "colordrop";
-       descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
-       descriptor->constraint_type = SANE_CONSTRAINT_STRING_LIST;
+       descriptor.name = "colordrop";
+       descriptor.title = "colordrop";
+       descriptor.desc = "colordrop";
+       descriptor.cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
+       descriptor.constraint_type = SANE_CONSTRAINT_STRING_LIST;
        constraint_colordrop = malloc(sizeof(char*) * 9);
        constraint_colordrop[0] = "None";
        constraint_colordrop[1] = "Red";
@@ -177,325 +177,325 @@ SANE_Option_Descriptor* _kds_s2000w_option_descriptor_color_drop()
        constraint_colordrop[6] = "Predominant";
        constraint_colordrop[7] = "Multiple";
        constraint_colordrop[8] = NULL;
-       descriptor->constraint.string_list = constraint_colordrop;
-       descriptor->type = SANE_TYPE_STRING;
-       descriptor->unit = SANE_UNIT_NONE;
-       descriptor->size = sizeof(SANE_String) * 50;
+       descriptor.constraint.string_list = constraint_colordrop;
+       descriptor.type = SANE_TYPE_STRING;
+       descriptor.unit = SANE_UNIT_NONE;
+       descriptor.size = sizeof(SANE_String) * 50;
 
        return descriptor;
 }
 
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_color_drop_out_aggressiveness()
+SANE_Option_Descriptor _kds_s2000w_option_descriptor_color_drop_out_aggressiveness()
 {
        debug_printf(ALL, "kds_s2000w_option_descriptor_color_drop_out_aggressiveness");
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
-
-       descriptor->name = "colordropoutaggressiveness";
-       descriptor->title = "colordropoutaggressiveness";
-       descriptor->desc = "colordropoutaggressiveness";
-       descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
-       descriptor->constraint_type = SANE_CONSTRAINT_RANGE;
-       descriptor->constraint.range = &constraint_color_drop_out_aggressiveness_range;
-       descriptor->type = SANE_TYPE_INT;
-       descriptor->unit = SANE_UNIT_NONE;
-       descriptor->size = sizeof(SANE_Int);
+       SANE_Option_Descriptor descriptor;
+
+       descriptor.name = "colordropoutaggressiveness";
+       descriptor.title = "colordropoutaggressiveness";
+       descriptor.desc = "colordropoutaggressiveness";
+       descriptor.cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
+       descriptor.constraint_type = SANE_CONSTRAINT_RANGE;
+       descriptor.constraint.range = &constraint_color_drop_out_aggressiveness_range;
+       descriptor.type = SANE_TYPE_INT;
+       descriptor.unit = SANE_UNIT_NONE;
+       descriptor.size = sizeof(SANE_Int);
 
        return descriptor;
 }
 
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_color_auto_brightness_mode()
+SANE_Option_Descriptor _kds_s2000w_option_descriptor_color_auto_brightness_mode()
 {
        debug_printf(ALL, "kds_s2000w_option_descriptor_color_auto_brightness_mode");
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
+       SANE_Option_Descriptor descriptor;
 
-       descriptor->name = "colorautobrightnessmode";
-       descriptor->title = "colorautobrightnessmode";
-       descriptor->desc = "colorautobrightnessmode";
-       descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
-       descriptor->constraint_type = SANE_CONSTRAINT_STRING_LIST;
+       descriptor.name = "colorautobrightnessmode";
+       descriptor.title = "colorautobrightnessmode";
+       descriptor.desc = "colorautobrightnessmode";
+       descriptor.cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
+       descriptor.constraint_type = SANE_CONSTRAINT_STRING_LIST;
        constraint_color_auto_brightnessmode = malloc(sizeof(char*) * 3);
        constraint_color_auto_brightnessmode[0] = "None";
        constraint_color_auto_brightnessmode[1] = "Automatic";
        constraint_color_auto_brightnessmode[2] = NULL;
-       descriptor->constraint.string_list = constraint_color_auto_brightnessmode;
-       descriptor->type = SANE_TYPE_STRING;
-       descriptor->unit = SANE_UNIT_NONE;
-       descriptor->size = sizeof(SANE_String) * 50;
+       descriptor.constraint.string_list = constraint_color_auto_brightnessmode;
+       descriptor.type = SANE_TYPE_STRING;
+       descriptor.unit = SANE_UNIT_NONE;
+       descriptor.size = sizeof(SANE_String) * 50;
 
        return descriptor;
 }
 
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_color_balance_mode()
+SANE_Option_Descriptor _kds_s2000w_option_descriptor_color_balance_mode()
 {
        debug_printf(ALL, "kds_s2000w_option_descriptor_color_balance_mode");
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
+       SANE_Option_Descriptor descriptor;
 
-       descriptor->name = "colorbalancemode";
-       descriptor->title = "colorbalancemode";
-       descriptor->desc = "colorbalancemode";
-       descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
-       descriptor->constraint_type = SANE_CONSTRAINT_STRING_LIST;
+       descriptor.name = "colorbalancemode";
+       descriptor.title = "colorbalancemode";
+       descriptor.desc = "colorbalancemode";
+       descriptor.cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
+       descriptor.constraint_type = SANE_CONSTRAINT_STRING_LIST;
        constraint_color_balance_mode = malloc(sizeof(char*) * 5);
        constraint_color_balance_mode[0] = "None";
        constraint_color_balance_mode[1] = "Manual";
        constraint_color_balance_mode[2] = "Automatic";
        constraint_color_balance_mode[3] = "AutomaticAdvanced";
        constraint_color_balance_mode[4] = NULL;
-       descriptor->constraint.string_list = constraint_color_balance_mode;
-       descriptor->type = SANE_TYPE_STRING;
-       descriptor->unit = SANE_UNIT_NONE;
-       descriptor->size = sizeof(SANE_String) * 50;
+       descriptor.constraint.string_list = constraint_color_balance_mode;
+       descriptor.type = SANE_TYPE_STRING;
+       descriptor.unit = SANE_UNIT_NONE;
+       descriptor.size = sizeof(SANE_String) * 50;
 
        return descriptor;
 }
 
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_color_balancea_agressiveness()
+SANE_Option_Descriptor _kds_s2000w_option_descriptor_color_balancea_agressiveness()
 {
        debug_printf(ALL, "kds_s2000w_option_descriptor_color_balancea_agressiveness");
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
-
-       descriptor->name = "colorbalanceaggressiveness";
-       descriptor->title = "colorbalanceaggressiveness";
-       descriptor->desc = "colorbalanceaggressiveness";
-       descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
-       descriptor->constraint_type = SANE_CONSTRAINT_RANGE;
-       descriptor->constraint.range = &constraint_color_balance_aggressiveness;
-       descriptor->type = SANE_TYPE_INT;
-       descriptor->unit = SANE_UNIT_NONE;
-       descriptor->size = sizeof(SANE_Int);
+       SANE_Option_Descriptor descriptor;
+
+       descriptor.name = "colorbalanceaggressiveness";
+       descriptor.title = "colorbalanceaggressiveness";
+       descriptor.desc = "colorbalanceaggressiveness";
+       descriptor.cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
+       descriptor.constraint_type = SANE_CONSTRAINT_RANGE;
+       descriptor.constraint.range = &constraint_color_balance_aggressiveness;
+       descriptor.type = SANE_TYPE_INT;
+       descriptor.unit = SANE_UNIT_NONE;
+       descriptor.size = sizeof(SANE_Int);
 
        return descriptor;
 }
 
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_color_balance_red()
+SANE_Option_Descriptor _kds_s2000w_option_descriptor_color_balance_red()
 {
        debug_printf(ALL, "kds_s2000w_option_descriptor_color_balance_red");
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
-
-       descriptor->name = "colorbalancered";
-       descriptor->title = "colorbalancered";
-       descriptor->desc = "colorbalancered";
-       descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
-       descriptor->constraint_type = SANE_CONSTRAINT_RANGE;
-       descriptor->constraint.range = &constraint_color_balance_red;
-       descriptor->type = SANE_TYPE_INT;
-       descriptor->unit = SANE_UNIT_NONE;
-       descriptor->size = sizeof(SANE_Int);
+       SANE_Option_Descriptor descriptor;
+
+       descriptor.name = "colorbalancered";
+       descriptor.title = "colorbalancered";
+       descriptor.desc = "colorbalancered";
+       descriptor.cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
+       descriptor.constraint_type = SANE_CONSTRAINT_RANGE;
+       descriptor.constraint.range = &constraint_color_balance_red;
+       descriptor.type = SANE_TYPE_INT;
+       descriptor.unit = SANE_UNIT_NONE;
+       descriptor.size = sizeof(SANE_Int);
 
        return descriptor;
 }
 
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_color_balance_green()
+SANE_Option_Descriptor _kds_s2000w_option_descriptor_color_balance_green()
 {
        debug_printf(ALL, "kds_s2000w_option_descriptor_color_balance_green");
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
-
-       descriptor->name = "colorbalancegreen";
-       descriptor->title = "colorbalancegreen";
-       descriptor->desc = "colorbalancegreen";
-       descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
-       descriptor->constraint_type = SANE_CONSTRAINT_RANGE;
-       descriptor->constraint.range = &constraint_color_balance_green;
-       descriptor->type = SANE_TYPE_INT;
-       descriptor->unit = SANE_UNIT_NONE;
-       descriptor->size = sizeof(SANE_Int);
+       SANE_Option_Descriptor descriptor;
+
+       descriptor.name = "colorbalancegreen";
+       descriptor.title = "colorbalancegreen";
+       descriptor.desc = "colorbalancegreen";
+       descriptor.cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
+       descriptor.constraint_type = SANE_CONSTRAINT_RANGE;
+       descriptor.constraint.range = &constraint_color_balance_green;
+       descriptor.type = SANE_TYPE_INT;
+       descriptor.unit = SANE_UNIT_NONE;
+       descriptor.size = sizeof(SANE_Int);
 
        return descriptor;
 }
 
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_color_balance_blue()
+SANE_Option_Descriptor _kds_s2000w_option_descriptor_color_balance_blue()
 {
        debug_printf(ALL, "kds_s2000w_option_descriptor_color_balance_blue");
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
-
-       descriptor->name = "color-balance-blue";
-       descriptor->title = "colorbalanceblue";
-       descriptor->desc = "colorbalanceblue";
-       descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
-       descriptor->constraint_type = SANE_CONSTRAINT_RANGE;
-       descriptor->constraint.range = &constraint_color_balance_blue;
-       descriptor->type = SANE_TYPE_INT;
-       descriptor->unit = SANE_UNIT_NONE;
-       descriptor->size = sizeof(SANE_Int);
+       SANE_Option_Descriptor descriptor;
+
+       descriptor.name = "color-balance-blue";
+       descriptor.title = "colorbalanceblue";
+       descriptor.desc = "colorbalanceblue";
+       descriptor.cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
+       descriptor.constraint_type = SANE_CONSTRAINT_RANGE;
+       descriptor.constraint.range = &constraint_color_balance_blue;
+       descriptor.type = SANE_TYPE_INT;
+       descriptor.unit = SANE_UNIT_NONE;
+       descriptor.size = sizeof(SANE_Int);
 
        return descriptor;
 }
 
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_foreground_boldness_mode()
+SANE_Option_Descriptor _kds_s2000w_option_descriptor_foreground_boldness_mode()
 {
        debug_printf(ALL, "kds_s2000w_option_descriptor_foreground_boldness_mode");
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
+       SANE_Option_Descriptor descriptor;
 
-       descriptor->name = "foreground-boldness-mode";
-       descriptor->title = "Foreground Boldness Mode";
-       descriptor->desc = "Foreground Boldness Mode";
-       descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
-       descriptor->constraint_type = SANE_CONSTRAINT_STRING_LIST;
+       descriptor.name = "foreground-boldness-mode";
+       descriptor.title = "Foreground Boldness Mode";
+       descriptor.desc = "Foreground Boldness Mode";
+       descriptor.cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
+       descriptor.constraint_type = SANE_CONSTRAINT_STRING_LIST;
        constraint_foreground_boldness_mode = malloc(sizeof(char*) * 4);
        constraint_foreground_boldness_mode[0] = "None";
        constraint_foreground_boldness_mode[1] = "AutomaticAdvanced";
        constraint_foreground_boldness_mode[2] = "Automatic";
        constraint_foreground_boldness_mode[3] = NULL;
-       descriptor->constraint.string_list = constraint_foreground_boldness_mode;
-       descriptor->type = SANE_TYPE_STRING;
-       descriptor->unit = SANE_UNIT_NONE;
-       descriptor->size = sizeof(SANE_String) * 50;
+       descriptor.constraint.string_list = constraint_foreground_boldness_mode;
+       descriptor.type = SANE_TYPE_STRING;
+       descriptor.unit = SANE_UNIT_NONE;
+       descriptor.size = sizeof(SANE_String) * 50;
 
        return descriptor;
 }
 
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_foreground_boldness_aggressiveness()
+SANE_Option_Descriptor _kds_s2000w_option_descriptor_foreground_boldness_aggressiveness()
 {
        debug_printf(ALL, "kds_s2000w_option_descriptor_foreground_boldness_aggressiveness");
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
-
-       descriptor->name = "foreground-boldness-aggressiveness";
-       descriptor->title = "Foreground Boldness Mode";
-       descriptor->desc = "Foreground Boldness Mode";
-       descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
-       descriptor->constraint_type = SANE_CONSTRAINT_RANGE;
-       descriptor->constraint.range = &constraint_foreground_boldness_aggressiveness;
-       descriptor->type = SANE_TYPE_INT;
-       descriptor->unit = SANE_UNIT_NONE;
-       descriptor->size = sizeof(SANE_Int);
+       SANE_Option_Descriptor descriptor;
+
+       descriptor.name = "foreground-boldness-aggressiveness";
+       descriptor.title = "Foreground Boldness Mode";
+       descriptor.desc = "Foreground Boldness Mode";
+       descriptor.cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
+       descriptor.constraint_type = SANE_CONSTRAINT_RANGE;
+       descriptor.constraint.range = &constraint_foreground_boldness_aggressiveness;
+       descriptor.type = SANE_TYPE_INT;
+       descriptor.unit = SANE_UNIT_NONE;
+       descriptor.size = sizeof(SANE_Int);
 
        return descriptor;
 }
 
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_background_smoothing_mode()
+SANE_Option_Descriptor _kds_s2000w_option_descriptor_background_smoothing_mode()
 {
        debug_printf(ALL, "kds_s2000w_option_descriptor_background_smoothing_mode");
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
+       SANE_Option_Descriptor descriptor;
 
-       descriptor->name = "background-smoothing-mode";
-       descriptor->title = "Background Smoothing Mode";
-       descriptor->desc = "Background Smoothing Mode";
-       descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
-       descriptor->constraint_type = SANE_CONSTRAINT_STRING_LIST;
+       descriptor.name = "background-smoothing-mode";
+       descriptor.title = "Background Smoothing Mode";
+       descriptor.desc = "Background Smoothing Mode";
+       descriptor.cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
+       descriptor.constraint_type = SANE_CONSTRAINT_STRING_LIST;
        constraint_background_smoothing_mode = malloc(sizeof(char*) * 4);
        constraint_background_smoothing_mode[0] = "None";
        constraint_background_smoothing_mode[1] = "AutomaticAdvanced";
        constraint_background_smoothing_mode[2] = "Automatic";
        constraint_background_smoothing_mode[3] = NULL;
-       descriptor->constraint.string_list = constraint_background_smoothing_mode;
-       descriptor->type = SANE_TYPE_STRING;
-       descriptor->unit = SANE_UNIT_NONE;
-       descriptor->size = sizeof(SANE_String) * 50;
+       descriptor.constraint.string_list = constraint_background_smoothing_mode;
+       descriptor.type = SANE_TYPE_STRING;
+       descriptor.unit = SANE_UNIT_NONE;
+       descriptor.size = sizeof(SANE_String) * 50;
 
        return descriptor;
 }
 
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_background_smoothing_aggressiveness()
+SANE_Option_Descriptor _kds_s2000w_option_descriptor_background_smoothing_aggressiveness()
 {
        debug_printf(ALL, "kds_s2000w_option_descriptor_background_smoothing_aggressiveness");
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
-
-       descriptor->name = "background-smoothing-aggressiveness";
-       descriptor->title = "Background Smoothing Aggressivenes";
-       descriptor->desc = "Background Smoothing Aggressivenes";
-       descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
-       descriptor->constraint_type = SANE_CONSTRAINT_RANGE;
-       descriptor->constraint.range = &constraint_background_smoothing_aggressivness;
-       descriptor->type = SANE_TYPE_INT;
-       descriptor->unit = SANE_UNIT_NONE;
-       descriptor->size = sizeof(SANE_Int);
+       SANE_Option_Descriptor descriptor;
+
+       descriptor.name = "background-smoothing-aggressiveness";
+       descriptor.title = "Background Smoothing Aggressivenes";
+       descriptor.desc = "Background Smoothing Aggressivenes";
+       descriptor.cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
+       descriptor.constraint_type = SANE_CONSTRAINT_RANGE;
+       descriptor.constraint.range = &constraint_background_smoothing_aggressivness;
+       descriptor.type = SANE_TYPE_INT;
+       descriptor.unit = SANE_UNIT_NONE;
+       descriptor.size = sizeof(SANE_Int);
 
        return descriptor;
 }
 
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_binarization_contrast()
+SANE_Option_Descriptor _kds_s2000w_option_descriptor_binarization_contrast()
 {
        debug_printf(ALL, "kds_s2000w_option_descriptor_binarization_contrast");
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
-
-       descriptor->name = SANE_NAME_CONTRAST;
-       descriptor->title = SANE_TITLE_CONTRAST;
-       descriptor->desc = SANE_DESC_CONTRAST;
-       descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
-       descriptor->constraint_type = SANE_CONSTRAINT_RANGE;
-       descriptor->constraint.range = &constraint_binarization_contrast;
-       descriptor->type = SANE_TYPE_INT;
-       descriptor->unit = SANE_UNIT_NONE;
-       descriptor->size = sizeof(SANE_Int);
+       SANE_Option_Descriptor descriptor;
+
+       descriptor.name = SANE_NAME_CONTRAST;
+       descriptor.title = SANE_TITLE_CONTRAST;
+       descriptor.desc = SANE_DESC_CONTRAST;
+       descriptor.cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
+       descriptor.constraint_type = SANE_CONSTRAINT_RANGE;
+       descriptor.constraint.range = &constraint_binarization_contrast;
+       descriptor.type = SANE_TYPE_INT;
+       descriptor.unit = SANE_UNIT_NONE;
+       descriptor.size = sizeof(SANE_Int);
 
        return descriptor;
 }
 
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_max_document_length()
+SANE_Option_Descriptor _kds_s2000w_option_descriptor_max_document_length()
 {
        debug_printf(ALL, "kds_s2000w_option_descriptor_max_document_length");
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
+       SANE_Option_Descriptor descriptor;
 
-       descriptor->name = "maxdocumentlength";
-       descriptor->title = "maxdocumentlength";
-       descriptor->desc = "maxdocumentlength";
-       descriptor->cap = SANE_CAP_SOFT_DETECT;
-       descriptor->constraint_type = SANE_CONSTRAINT_STRING_LIST;
+       descriptor.name = "maxdocumentlength";
+       descriptor.title = "maxdocumentlength";
+       descriptor.desc = "maxdocumentlength";
+       descriptor.cap = SANE_CAP_SOFT_DETECT;
+       descriptor.constraint_type = SANE_CONSTRAINT_STRING_LIST;
        constraint_max_document_length = malloc(sizeof(char*) * 2);
        constraint_max_document_length[0] = "#NoPrimaryControl#";
        constraint_max_document_length[1] = NULL;
-       descriptor->constraint.string_list = constraint_max_document_length;
-       descriptor->type = SANE_TYPE_INT;
-       descriptor->unit = SANE_UNIT_NONE;
-       descriptor->size = sizeof(SANE_Int);
+       descriptor.constraint.string_list = constraint_max_document_length;
+       descriptor.type = SANE_TYPE_INT;
+       descriptor.unit = SANE_UNIT_NONE;
+       descriptor.size = sizeof(SANE_Int);
 
        return descriptor;
 }
 
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_scan_source()
+SANE_Option_Descriptor _kds_s2000w_option_descriptor_scan_source()
 {
        debug_printf(ALL, "kds_s2000w_option_descriptor_scan_source");
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
+       SANE_Option_Descriptor descriptor;
 
-       descriptor->name = SANE_NAME_SCAN_SOURCE;
-       descriptor->title = SANE_TITLE_SCAN_SOURCE;
-       descriptor->desc = SANE_DESC_SCAN_SOURCE;
-       descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
-       descriptor->constraint_type = SANE_CONSTRAINT_STRING_LIST;
+       descriptor.name = SANE_NAME_SCAN_SOURCE;
+       descriptor.title = SANE_TITLE_SCAN_SOURCE;
+       descriptor.desc = SANE_DESC_SCAN_SOURCE;
+       descriptor.cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
+       descriptor.constraint_type = SANE_CONSTRAINT_STRING_LIST;
        constraint_scan_source = malloc(sizeof(char*) * 4);
        constraint_scan_source[0] = "DocumentFeeder";
        constraint_scan_source[1] = "Automatic";
        constraint_scan_source[2] = "Flatbed";
        constraint_scan_source[3] = NULL;
-       descriptor->constraint.string_list = constraint_scan_source;
-       descriptor->type = SANE_TYPE_STRING;
-       descriptor->unit = SANE_UNIT_NONE;
-       descriptor->size = sizeof(SANE_String) * 50;
+       descriptor.constraint.string_list = constraint_scan_source;
+       descriptor.type = SANE_TYPE_STRING;
+       descriptor.unit = SANE_UNIT_NONE;
+       descriptor.size = sizeof(SANE_String) * 50;
 
        return descriptor;
 }
 
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_config_reset()
+SANE_Option_Descriptor _kds_s2000w_option_descriptor_config_reset()
 {
        debug_printf(ALL, "kds_s2000w_option_descriptor_config_reset");
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
+       SANE_Option_Descriptor descriptor;
 
-       descriptor->name = "config-reset";
-       descriptor->title = "Konfiguration zuruecksetzen";
-       descriptor->desc = "Laedt die default Konfiguration des Scanners";
-       descriptor->cap = SANE_CAP_SOFT_SELECT;
-       descriptor->constraint_type = SANE_CONSTRAINT_NONE;
-       descriptor->type = SANE_TYPE_BUTTON;
-       descriptor->unit = SANE_UNIT_NONE;
-       descriptor->size = 0;
+       descriptor.name = "config-reset";
+       descriptor.title = "Konfiguration zuruecksetzen";
+       descriptor.desc = "Laedt die default Konfiguration des Scanners";
+       descriptor.cap = SANE_CAP_SOFT_SELECT;
+       descriptor.constraint_type = SANE_CONSTRAINT_NONE;
+       descriptor.type = SANE_TYPE_BUTTON;
+       descriptor.unit = SANE_UNIT_NONE;
+       descriptor.size = 0;
 
        return descriptor;
 }
 
-SANE_Option_Descriptor* _kds_s2000w_option_descriptor_depth()
+SANE_Option_Descriptor _kds_s2000w_option_descriptor_depth()
 {
        debug_printf(ALL, "kds_s2000w_option_descriptor_depth");
-       SANE_Option_Descriptor* descriptor = malloc(sizeof(SANE_Option_Descriptor));
-
-       descriptor->name = SANE_NAME_BIT_DEPTH;
-       descriptor->title = SANE_TITLE_BIT_DEPTH;
-       descriptor->desc = SANE_DESC_BIT_DEPTH;
-       descriptor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
-       descriptor->constraint_type = SANE_CONSTRAINT_WORD_LIST;
-       descriptor->constraint.word_list = constraint_depth;
-       descriptor->type = SANE_TYPE_INT;
-       descriptor->unit = SANE_UNIT_NONE;
-       descriptor->size = sizeof(SANE_Int);
+       SANE_Option_Descriptor descriptor;
+
+       descriptor.name = SANE_NAME_BIT_DEPTH;
+       descriptor.title = SANE_TITLE_BIT_DEPTH;
+       descriptor.desc = SANE_DESC_BIT_DEPTH;
+       descriptor.cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
+       descriptor.constraint_type = SANE_CONSTRAINT_WORD_LIST;
+       descriptor.constraint.word_list = constraint_depth;
+       descriptor.type = SANE_TYPE_INT;
+       descriptor.unit = SANE_UNIT_NONE;
+       descriptor.size = sizeof(SANE_Int);
 
        return descriptor;
 }
@@ -503,7 +503,6 @@ SANE_Option_Descriptor* _kds_s2000w_option_descriptor_depth()
 void kds_s2000w_option_descriptor_init_option_descriptors()
 {
        debug_printf(ALL, "kds_s2000w_option_descriptor_init_option_descriptors");
-       descriptor_array = malloc(sizeof(SANE_Option_Descriptor*) * MAX_OPTION_COUNT);
 
        descriptor_array[0] = _kds_s2000w_option_descriptor_num_options();
        descriptor_array[1] = _kds_s2000w_option_descriptor_standard_group();
@@ -554,18 +553,10 @@ void kds_s2000w_option_descriptor_free_option_descriptors()
        constraint_max_document_length = NULL;
        free(constraint_scan_source);
        constraint_scan_source = NULL;
-
-       for (int i = 0; i < MAX_OPTION_COUNT; i++) {
-               free(descriptor_array[i]);
-               descriptor_array[i] = NULL;
-       }
-
-       free(descriptor_array);
-       descriptor_array = NULL;
 }
 
 SANE_Option_Descriptor* kds_s2000w_option_get_descriptor(int option)
 {
        debug_printf(ALL, "kds_s2000w_option_get_descriptor");
-       return descriptor_array[option];
+       return &descriptor_array[option];
 }
\ No newline at end of file