]> gitweb.hhaalo.de Git - sane-kds-s2000w-net.git/commitdiff
allocate all option descriptor space
authorBastian Dehn <hhaalo@arcor.de>
Sat, 27 Jan 2024 14:14:41 +0000 (15:14 +0100)
committerBastian Dehn <hhaalo@arcor.de>
Sat, 27 Jan 2024 14:14:41 +0000 (15:14 +0100)
src/kds_s2000w_net.c

index cc17776eb5b9374610626918362a4fa6d88fbfbf..0be1f5e8017a0951e9e312f615d8f883daf3bf3c 100644 (file)
@@ -4,8 +4,10 @@
 #include <sane/sane.h>
 #include "kds_s2000w_handler.h"
 
+#define MAX_OPTION_COUNT 23
+
 typedef struct {
-       SANE_Option_Descriptor** option_descriptors;
+       SANE_Option_Descriptor* option_descriptors;
        int length;
 } option_descriptors;
 
@@ -15,17 +17,12 @@ option_descriptors option_descriptor_array;
 
 void _init_option_descriptor_array()
 {
-       option_descriptor_array.option_descriptors = malloc(sizeof(SANE_Option_Descriptor**));
-       option_descriptor_array.option_descriptors[0] = NULL;
-       option_descriptor_array.length = 0;
+       option_descriptor_array.option_descriptors = malloc(sizeof(SANE_Option_Descriptor) * MAX_OPTION_COUNT);
+       option_descriptor_array.length = MAX_OPTION_COUNT;
 }
 
 void _free_option_descriptor_array()
 {
-       for (int i = 0; i < option_descriptor_array.length; i++) {
-               free(option_descriptor_array.option_descriptors[i]);
-               option_descriptor_array.option_descriptors[i] = NULL;
-       }
        free(option_descriptor_array.option_descriptors);
        option_descriptor_array.option_descriptors = NULL;
 }
@@ -93,266 +90,192 @@ void _sane_kds_s2000w_net_close(SANE_Handle handle)
 const SANE_Option_Descriptor* _sane_kds_s2000w_net_get_option_descriptor(
        SANE_Handle handle, SANE_Int option)
 {
-       if (option_descriptor_array.length < (option + 1)) {
-               option_descriptor_array.option_descriptors[option] = NULL;
-               option_descriptor_array.length++;
-       }
-
        switch (option) {
                case 0:
-                       free(option_descriptor_array.option_descriptors[option]);
-                       option_descriptor_array.option_descriptors[option] = NULL;
-                       option_descriptor_array.option_descriptors[option] = malloc(sizeof(SANE_Option_Descriptor));
-                       option_descriptor_array.option_descriptors[option]->name = "";
-                       option_descriptor_array.option_descriptors[option]->title = "option number count";
-                       option_descriptor_array.option_descriptors[option]->desc = "available number of options";
-                       option_descriptor_array.option_descriptors[option]->unit = SANE_UNIT_NONE;
-                       option_descriptor_array.option_descriptors[option]->cap = SANE_CAP_SOFT_DETECT;
-                       option_descriptor_array.option_descriptors[option]->constraint_type = SANE_CONSTRAINT_NONE;
-                       option_descriptor_array.option_descriptors[option]->constraint.string_list = NULL;
+                       option_descriptor_array.option_descriptors[option].name = "";
+                       option_descriptor_array.option_descriptors[option].title = "option number count";
+                       option_descriptor_array.option_descriptors[option].desc = "available number of options";
+                       option_descriptor_array.option_descriptors[option].unit = SANE_UNIT_NONE;
+                       option_descriptor_array.option_descriptors[option].cap = SANE_CAP_SOFT_DETECT;
+                       option_descriptor_array.option_descriptors[option].constraint_type = SANE_CONSTRAINT_NONE;
+                       option_descriptor_array.option_descriptors[option].constraint.string_list = NULL;
                        break;
                case 1:
-                       free(option_descriptor_array.option_descriptors[option]);
-                       option_descriptor_array.option_descriptors[option] = NULL;
-                       option_descriptor_array.option_descriptors[option] = malloc(sizeof(SANE_Option_Descriptor));
-                       option_descriptor_array.option_descriptors[option]->name = "resolution";
-                       option_descriptor_array.option_descriptors[option]->title = "resolution";
-                       option_descriptor_array.option_descriptors[option]->desc = "resolution";
-                       option_descriptor_array.option_descriptors[option]->unit = SANE_UNIT_DPI;
-                       option_descriptor_array.option_descriptors[option]->cap = SANE_CAP_SOFT_DETECT;
-                       option_descriptor_array.option_descriptors[option]->constraint_type = SANE_CONSTRAINT_NONE;
-                       option_descriptor_array.option_descriptors[option]->constraint.string_list = NULL;
+                       option_descriptor_array.option_descriptors[option].name = "resolution";
+                       option_descriptor_array.option_descriptors[option].title = "resolution";
+                       option_descriptor_array.option_descriptors[option].desc = "resolution";
+                       option_descriptor_array.option_descriptors[option].unit = SANE_UNIT_DPI;
+                       option_descriptor_array.option_descriptors[option].cap = SANE_CAP_SOFT_DETECT;
+                       option_descriptor_array.option_descriptors[option].constraint_type = SANE_CONSTRAINT_NONE;
+                       option_descriptor_array.option_descriptors[option].constraint.string_list = NULL;
                        break;
                case 2:
-                       free(option_descriptor_array.option_descriptors[option]);
-                       option_descriptor_array.option_descriptors[option] = NULL;
-                       option_descriptor_array.option_descriptors[option] = malloc(sizeof(SANE_Option_Descriptor));
-                       option_descriptor_array.option_descriptors[option]->name = "scanside";
-                       option_descriptor_array.option_descriptors[option]->title = "scanside";
-                       option_descriptor_array.option_descriptors[option]->desc = "scanside";
-                       option_descriptor_array.option_descriptors[option]->cap = SANE_CAP_SOFT_DETECT;
-                       option_descriptor_array.option_descriptors[option]->constraint_type = SANE_CONSTRAINT_NONE;
-                       option_descriptor_array.option_descriptors[option]->constraint.string_list = NULL;
+                       option_descriptor_array.option_descriptors[option].name = "scanside";
+                       option_descriptor_array.option_descriptors[option].title = "scanside";
+                       option_descriptor_array.option_descriptors[option].desc = "scanside";
+                       option_descriptor_array.option_descriptors[option].cap = SANE_CAP_SOFT_DETECT;
+                       option_descriptor_array.option_descriptors[option].constraint_type = SANE_CONSTRAINT_NONE;
+                       option_descriptor_array.option_descriptors[option].constraint.string_list = NULL;
                        break;
                case 3:
-                       free(option_descriptor_array.option_descriptors[option]);
-                       option_descriptor_array.option_descriptors[option] = NULL;
-                       option_descriptor_array.option_descriptors[option] = malloc(sizeof(SANE_Option_Descriptor));
-                       option_descriptor_array.option_descriptors[option]->name = "colormode";
-                       option_descriptor_array.option_descriptors[option]->title = "colormode";
-                       option_descriptor_array.option_descriptors[option]->desc = "colormode";
-                       option_descriptor_array.option_descriptors[option]->cap = SANE_CAP_SOFT_DETECT;
-                       option_descriptor_array.option_descriptors[option]->constraint_type = SANE_CONSTRAINT_NONE;
-                       option_descriptor_array.option_descriptors[option]->constraint.string_list = NULL;
+                       option_descriptor_array.option_descriptors[option].name = "colormode";
+                       option_descriptor_array.option_descriptors[option].title = "colormode";
+                       option_descriptor_array.option_descriptors[option].desc = "colormode";
+                       option_descriptor_array.option_descriptors[option].cap = SANE_CAP_SOFT_DETECT;
+                       option_descriptor_array.option_descriptors[option].constraint_type = SANE_CONSTRAINT_NONE;
+                       option_descriptor_array.option_descriptors[option].constraint.string_list = NULL;
                        break;
                case 4:
-                       free(option_descriptor_array.option_descriptors[option]);
-                       option_descriptor_array.option_descriptors[option] = NULL;
-                       option_descriptor_array.option_descriptors[option] = malloc(sizeof(SANE_Option_Descriptor));
-                       option_descriptor_array.option_descriptors[option]->name = "skipblankpages";
-                       option_descriptor_array.option_descriptors[option]->title = "skipblankpages";
-                       option_descriptor_array.option_descriptors[option]->desc = "skipblankpages";
-                       option_descriptor_array.option_descriptors[option]->cap = SANE_CAP_SOFT_DETECT;
-                       option_descriptor_array.option_descriptors[option]->constraint_type = SANE_CONSTRAINT_NONE;
-                       option_descriptor_array.option_descriptors[option]->constraint.string_list = NULL;
+                       option_descriptor_array.option_descriptors[option].name = "skipblankpages";
+                       option_descriptor_array.option_descriptors[option].title = "skipblankpages";
+                       option_descriptor_array.option_descriptors[option].desc = "skipblankpages";
+                       option_descriptor_array.option_descriptors[option].cap = SANE_CAP_SOFT_DETECT;
+                       option_descriptor_array.option_descriptors[option].constraint_type = SANE_CONSTRAINT_NONE;
+                       option_descriptor_array.option_descriptors[option].constraint.string_list = NULL;
                        break;
                case 5:
-                       free(option_descriptor_array.option_descriptors[option]);
-                       option_descriptor_array.option_descriptors[option] = NULL;
-                       option_descriptor_array.option_descriptors[option] = malloc(sizeof(SANE_Option_Descriptor));
-                       option_descriptor_array.option_descriptors[option]->name = "autostart";
-                       option_descriptor_array.option_descriptors[option]->title = "autostart";
-                       option_descriptor_array.option_descriptors[option]->desc = "autostart";
-                       option_descriptor_array.option_descriptors[option]->cap = SANE_CAP_SOFT_DETECT;
-                       option_descriptor_array.option_descriptors[option]->constraint_type = SANE_CONSTRAINT_NONE;
-                       option_descriptor_array.option_descriptors[option]->constraint.string_list = NULL;
+                       option_descriptor_array.option_descriptors[option].name = "autostart";
+                       option_descriptor_array.option_descriptors[option].title = "autostart";
+                       option_descriptor_array.option_descriptors[option].desc = "autostart";
+                       option_descriptor_array.option_descriptors[option].cap = SANE_CAP_SOFT_DETECT;
+                       option_descriptor_array.option_descriptors[option].constraint_type = SANE_CONSTRAINT_NONE;
+                       option_descriptor_array.option_descriptors[option].constraint.string_list = NULL;
                        break;
                case 6:
-                       free(option_descriptor_array.option_descriptors[option]);
-                       option_descriptor_array.option_descriptors[option] = NULL;
-                       option_descriptor_array.option_descriptors[option] = malloc(sizeof(SANE_Option_Descriptor));
-                       option_descriptor_array.option_descriptors[option]->name = "colordrop";
-                       option_descriptor_array.option_descriptors[option]->title = "colordrop";
-                       option_descriptor_array.option_descriptors[option]->desc = "colordrop";
-                       option_descriptor_array.option_descriptors[option]->cap = SANE_CAP_SOFT_DETECT;
-                       option_descriptor_array.option_descriptors[option]->constraint_type = SANE_CONSTRAINT_NONE;
-                       option_descriptor_array.option_descriptors[option]->constraint.string_list = NULL;
+                       option_descriptor_array.option_descriptors[option].name = "colordrop";
+                       option_descriptor_array.option_descriptors[option].title = "colordrop";
+                       option_descriptor_array.option_descriptors[option].desc = "colordrop";
+                       option_descriptor_array.option_descriptors[option].cap = SANE_CAP_SOFT_DETECT;
+                       option_descriptor_array.option_descriptors[option].constraint_type = SANE_CONSTRAINT_NONE;
+                       option_descriptor_array.option_descriptors[option].constraint.string_list = NULL;
                        break;
                case 7:
-                       free(option_descriptor_array.option_descriptors[option]);
-                       option_descriptor_array.option_descriptors[option] = NULL;
-                       option_descriptor_array.option_descriptors[option] = malloc(sizeof(SANE_Option_Descriptor));
-                       option_descriptor_array.option_descriptors[option]->name = "colordropoutaggressiveness";
-                       option_descriptor_array.option_descriptors[option]->title = "colordropoutaggressiveness";
-                       option_descriptor_array.option_descriptors[option]->desc = "colordropoutaggressiveness";
-                       option_descriptor_array.option_descriptors[option]->cap = SANE_CAP_SOFT_DETECT;
-                       option_descriptor_array.option_descriptors[option]->constraint_type = SANE_CONSTRAINT_NONE;
-                       option_descriptor_array.option_descriptors[option]->constraint.string_list = NULL;
+                       option_descriptor_array.option_descriptors[option].name = "colordropoutaggressiveness";
+                       option_descriptor_array.option_descriptors[option].title = "colordropoutaggressiveness";
+                       option_descriptor_array.option_descriptors[option].desc = "colordropoutaggressiveness";
+                       option_descriptor_array.option_descriptors[option].cap = SANE_CAP_SOFT_DETECT;
+                       option_descriptor_array.option_descriptors[option].constraint_type = SANE_CONSTRAINT_NONE;
+                       option_descriptor_array.option_descriptors[option].constraint.string_list = NULL;
                        break;
                case 8:
-                       free(option_descriptor_array.option_descriptors[option]);
-                       option_descriptor_array.option_descriptors[option] = NULL;
-                       option_descriptor_array.option_descriptors[option] = malloc(sizeof(SANE_Option_Descriptor));
-                       option_descriptor_array.option_descriptors[option]->name = "outputtype";
-                       option_descriptor_array.option_descriptors[option]->title = "outputtype";
-                       option_descriptor_array.option_descriptors[option]->desc = "outputtype";
-                       option_descriptor_array.option_descriptors[option]->cap = SANE_CAP_SOFT_DETECT;
-                       option_descriptor_array.option_descriptors[option]->constraint_type = SANE_CONSTRAINT_NONE;
-                       option_descriptor_array.option_descriptors[option]->constraint.string_list = NULL;
+                       option_descriptor_array.option_descriptors[option].name = "outputtype";
+                       option_descriptor_array.option_descriptors[option].title = "outputtype";
+                       option_descriptor_array.option_descriptors[option].desc = "outputtype";
+                       option_descriptor_array.option_descriptors[option].cap = SANE_CAP_SOFT_DETECT;
+                       option_descriptor_array.option_descriptors[option].constraint_type = SANE_CONSTRAINT_NONE;
+                       option_descriptor_array.option_descriptors[option].constraint.string_list = NULL;
                        break;
                case 9:
-                       free(option_descriptor_array.option_descriptors[option]);
-                       option_descriptor_array.option_descriptors[option] = NULL;
-                       option_descriptor_array.option_descriptors[option] = malloc(sizeof(SANE_Option_Descriptor));
-                       option_descriptor_array.option_descriptors[option]->name = "colorautobrightnessmode";
-                       option_descriptor_array.option_descriptors[option]->title = "colorautobrightnessmode";
-                       option_descriptor_array.option_descriptors[option]->desc = "colorautobrightnessmode";
-                       option_descriptor_array.option_descriptors[option]->cap = SANE_CAP_SOFT_DETECT;
-                       option_descriptor_array.option_descriptors[option]->constraint_type = SANE_CONSTRAINT_NONE;
-                       option_descriptor_array.option_descriptors[option]->constraint.string_list = NULL;
+                       option_descriptor_array.option_descriptors[option].name = "colorautobrightnessmode";
+                       option_descriptor_array.option_descriptors[option].title = "colorautobrightnessmode";
+                       option_descriptor_array.option_descriptors[option].desc = "colorautobrightnessmode";
+                       option_descriptor_array.option_descriptors[option].cap = SANE_CAP_SOFT_DETECT;
+                       option_descriptor_array.option_descriptors[option].constraint_type = SANE_CONSTRAINT_NONE;
+                       option_descriptor_array.option_descriptors[option].constraint.string_list = NULL;
                        break;
                case 10:
-                       free(option_descriptor_array.option_descriptors[option]);
-                       option_descriptor_array.option_descriptors[option] = NULL;
-                       option_descriptor_array.option_descriptors[option] = malloc(sizeof(SANE_Option_Descriptor));
-                       option_descriptor_array.option_descriptors[option]->name = "colorbalancemode";
-                       option_descriptor_array.option_descriptors[option]->title = "colorbalancemode";
-                       option_descriptor_array.option_descriptors[option]->desc = "colorbalancemode";
-                       option_descriptor_array.option_descriptors[option]->cap = SANE_CAP_SOFT_DETECT;
-                       option_descriptor_array.option_descriptors[option]->constraint_type = SANE_CONSTRAINT_NONE;
-                       option_descriptor_array.option_descriptors[option]->constraint.string_list = NULL;
+                       option_descriptor_array.option_descriptors[option].name = "colorbalancemode";
+                       option_descriptor_array.option_descriptors[option].title = "colorbalancemode";
+                       option_descriptor_array.option_descriptors[option].desc = "colorbalancemode";
+                       option_descriptor_array.option_descriptors[option].cap = SANE_CAP_SOFT_DETECT;
+                       option_descriptor_array.option_descriptors[option].constraint_type = SANE_CONSTRAINT_NONE;
+                       option_descriptor_array.option_descriptors[option].constraint.string_list = NULL;
                        break;
                case 11:
-                       free(option_descriptor_array.option_descriptors[option]);
-                       option_descriptor_array.option_descriptors[option] = NULL;
-                       option_descriptor_array.option_descriptors[option] = malloc(sizeof(SANE_Option_Descriptor));
-                       option_descriptor_array.option_descriptors[option]->name = "colorbalanceaggressiveness";
-                       option_descriptor_array.option_descriptors[option]->title = "colorbalanceaggressiveness";
-                       option_descriptor_array.option_descriptors[option]->desc = "colorbalanceaggressiveness";
-                       option_descriptor_array.option_descriptors[option]->cap = SANE_CAP_SOFT_DETECT;
-                       option_descriptor_array.option_descriptors[option]->constraint_type = SANE_CONSTRAINT_NONE;
-                       option_descriptor_array.option_descriptors[option]->constraint.string_list = NULL;
+                       option_descriptor_array.option_descriptors[option].name = "colorbalanceaggressiveness";
+                       option_descriptor_array.option_descriptors[option].title = "colorbalanceaggressiveness";
+                       option_descriptor_array.option_descriptors[option].desc = "colorbalanceaggressiveness";
+                       option_descriptor_array.option_descriptors[option].cap = SANE_CAP_SOFT_DETECT;
+                       option_descriptor_array.option_descriptors[option].constraint_type = SANE_CONSTRAINT_NONE;
+                       option_descriptor_array.option_descriptors[option].constraint.string_list = NULL;
                        break;
                case 12:
-                       free(option_descriptor_array.option_descriptors[option]);
-                       option_descriptor_array.option_descriptors[option] = NULL;
-                       option_descriptor_array.option_descriptors[option] = malloc(sizeof(SANE_Option_Descriptor));
-                       option_descriptor_array.option_descriptors[option]->name = "colorbalancered";
-                       option_descriptor_array.option_descriptors[option]->title = "colorbalancered";
-                       option_descriptor_array.option_descriptors[option]->desc = "colorbalancered";
-                       option_descriptor_array.option_descriptors[option]->cap = SANE_CAP_SOFT_DETECT;
-                       option_descriptor_array.option_descriptors[option]->constraint_type = SANE_CONSTRAINT_NONE;
-                       option_descriptor_array.option_descriptors[option]->constraint.string_list = NULL;
+                       option_descriptor_array.option_descriptors[option].name = "colorbalancered";
+                       option_descriptor_array.option_descriptors[option].title = "colorbalancered";
+                       option_descriptor_array.option_descriptors[option].desc = "colorbalancered";
+                       option_descriptor_array.option_descriptors[option].cap = SANE_CAP_SOFT_DETECT;
+                       option_descriptor_array.option_descriptors[option].constraint_type = SANE_CONSTRAINT_NONE;
+                       option_descriptor_array.option_descriptors[option].constraint.string_list = NULL;
                        break;
                case 13:
-                       free(option_descriptor_array.option_descriptors[option]);
-                       option_descriptor_array.option_descriptors[option] = NULL;
-                       option_descriptor_array.option_descriptors[option] = malloc(sizeof(SANE_Option_Descriptor));
-                       option_descriptor_array.option_descriptors[option]->name = "colorbalancegreen";
-                       option_descriptor_array.option_descriptors[option]->title = "colorbalancegreen";
-                       option_descriptor_array.option_descriptors[option]->desc = "colorbalancegreen";
-                       option_descriptor_array.option_descriptors[option]->cap = SANE_CAP_SOFT_DETECT;
-                       option_descriptor_array.option_descriptors[option]->constraint_type = SANE_CONSTRAINT_NONE;
-                       option_descriptor_array.option_descriptors[option]->constraint.string_list = NULL;
+                       option_descriptor_array.option_descriptors[option].name = "colorbalancegreen";
+                       option_descriptor_array.option_descriptors[option].title = "colorbalancegreen";
+                       option_descriptor_array.option_descriptors[option].desc = "colorbalancegreen";
+                       option_descriptor_array.option_descriptors[option].cap = SANE_CAP_SOFT_DETECT;
+                       option_descriptor_array.option_descriptors[option].constraint_type = SANE_CONSTRAINT_NONE;
+                       option_descriptor_array.option_descriptors[option].constraint.string_list = NULL;
                        break;
                case 14:
-                       free(option_descriptor_array.option_descriptors[option]);
-                       option_descriptor_array.option_descriptors[option] = NULL;
-                       option_descriptor_array.option_descriptors[option] = malloc(sizeof(SANE_Option_Descriptor));
-                       option_descriptor_array.option_descriptors[option]->name = "colorbalanceblue";
-                       option_descriptor_array.option_descriptors[option]->title = "colorbalanceblue";
-                       option_descriptor_array.option_descriptors[option]->desc = "colorbalanceblue";
-                       option_descriptor_array.option_descriptors[option]->cap = SANE_CAP_SOFT_DETECT;
-                       option_descriptor_array.option_descriptors[option]->constraint_type = SANE_CONSTRAINT_NONE;
-                       option_descriptor_array.option_descriptors[option]->constraint.string_list = NULL;
+                       option_descriptor_array.option_descriptors[option].name = "colorbalanceblue";
+                       option_descriptor_array.option_descriptors[option].title = "colorbalanceblue";
+                       option_descriptor_array.option_descriptors[option].desc = "colorbalanceblue";
+                       option_descriptor_array.option_descriptors[option].cap = SANE_CAP_SOFT_DETECT;
+                       option_descriptor_array.option_descriptors[option].constraint_type = SANE_CONSTRAINT_NONE;
+                       option_descriptor_array.option_descriptors[option].constraint.string_list = NULL;
                        break;
                case 15:
-                       free(option_descriptor_array.option_descriptors[option]);
-                       option_descriptor_array.option_descriptors[option] = NULL;
-                       option_descriptor_array.option_descriptors[option] = malloc(sizeof(SANE_Option_Descriptor));
-                       option_descriptor_array.option_descriptors[option]->name = "foregroundboldnessmode";
-                       option_descriptor_array.option_descriptors[option]->title = "foregroundboldnessmode";
-                       option_descriptor_array.option_descriptors[option]->desc = "foregroundboldnessmode";
-                       option_descriptor_array.option_descriptors[option]->cap = SANE_CAP_SOFT_DETECT;
-                       option_descriptor_array.option_descriptors[option]->constraint_type = SANE_CONSTRAINT_NONE;
-                       option_descriptor_array.option_descriptors[option]->constraint.string_list = NULL;
+                       option_descriptor_array.option_descriptors[option].name = "foregroundboldnessmode";
+                       option_descriptor_array.option_descriptors[option].title = "foregroundboldnessmode";
+                       option_descriptor_array.option_descriptors[option].desc = "foregroundboldnessmode";
+                       option_descriptor_array.option_descriptors[option].cap = SANE_CAP_SOFT_DETECT;
+                       option_descriptor_array.option_descriptors[option].constraint_type = SANE_CONSTRAINT_NONE;
+                       option_descriptor_array.option_descriptors[option].constraint.string_list = NULL;
                        break;
                case 16:
-                       free(option_descriptor_array.option_descriptors[option]);
-                       option_descriptor_array.option_descriptors[option] = NULL;
-                       option_descriptor_array.option_descriptors[option] = malloc(sizeof(SANE_Option_Descriptor));
-                       option_descriptor_array.option_descriptors[option]->name = "foregroundboldnessaggressiveness";
-                       option_descriptor_array.option_descriptors[option]->title = "foregroundboldnessaggressiveness";
-                       option_descriptor_array.option_descriptors[option]->desc = "foregroundboldnessaggressiveness";
-                       option_descriptor_array.option_descriptors[option]->cap = SANE_CAP_SOFT_DETECT;
-                       option_descriptor_array.option_descriptors[option]->constraint_type = SANE_CONSTRAINT_NONE;
-                       option_descriptor_array.option_descriptors[option]->constraint.string_list = NULL;
+                       option_descriptor_array.option_descriptors[option].name = "foregroundboldnessaggressiveness";
+                       option_descriptor_array.option_descriptors[option].title = "foregroundboldnessaggressiveness";
+                       option_descriptor_array.option_descriptors[option].desc = "foregroundboldnessaggressiveness";
+                       option_descriptor_array.option_descriptors[option].cap = SANE_CAP_SOFT_DETECT;
+                       option_descriptor_array.option_descriptors[option].constraint_type = SANE_CONSTRAINT_NONE;
+                       option_descriptor_array.option_descriptors[option].constraint.string_list = NULL;
                        break;
                case 17:
-                       free(option_descriptor_array.option_descriptors[option]);
-                       option_descriptor_array.option_descriptors[option] = NULL;
-                       option_descriptor_array.option_descriptors[option] = malloc(sizeof(SANE_Option_Descriptor));
-                       option_descriptor_array.option_descriptors[option]->name = "backgroundsmoothingmode";
-                       option_descriptor_array.option_descriptors[option]->title = "backgroundsmoothingmode";
-                       option_descriptor_array.option_descriptors[option]->desc = "backgroundsmoothingmode";
-                       option_descriptor_array.option_descriptors[option]->cap = SANE_CAP_SOFT_DETECT;
-                       option_descriptor_array.option_descriptors[option]->constraint_type = SANE_CONSTRAINT_NONE;
-                       option_descriptor_array.option_descriptors[option]->constraint.string_list = NULL;
+                       option_descriptor_array.option_descriptors[option].name = "backgroundsmoothingmode";
+                       option_descriptor_array.option_descriptors[option].title = "backgroundsmoothingmode";
+                       option_descriptor_array.option_descriptors[option].desc = "backgroundsmoothingmode";
+                       option_descriptor_array.option_descriptors[option].cap = SANE_CAP_SOFT_DETECT;
+                       option_descriptor_array.option_descriptors[option].constraint_type = SANE_CONSTRAINT_NONE;
+                       option_descriptor_array.option_descriptors[option].constraint.string_list = NULL;
                        break;
                case 18:
-                       free(option_descriptor_array.option_descriptors[option]);
-                       option_descriptor_array.option_descriptors[option] = NULL;
-                       option_descriptor_array.option_descriptors[option] = malloc(sizeof(SANE_Option_Descriptor));
-                       option_descriptor_array.option_descriptors[option]->name = "backgroundsmoothingaggressiveness";
-                       option_descriptor_array.option_descriptors[option]->title = "backgroundsmoothingaggressiveness";
-                       option_descriptor_array.option_descriptors[option]->desc = "backgroundsmoothingaggressiveness";
-                       option_descriptor_array.option_descriptors[option]->cap = SANE_CAP_SOFT_DETECT;
-                       option_descriptor_array.option_descriptors[option]->constraint_type = SANE_CONSTRAINT_NONE;
-                       option_descriptor_array.option_descriptors[option]->constraint.string_list = NULL;
+                       option_descriptor_array.option_descriptors[option].name = "backgroundsmoothingaggressiveness";
+                       option_descriptor_array.option_descriptors[option].title = "backgroundsmoothingaggressiveness";
+                       option_descriptor_array.option_descriptors[option].desc = "backgroundsmoothingaggressiveness";
+                       option_descriptor_array.option_descriptors[option].cap = SANE_CAP_SOFT_DETECT;
+                       option_descriptor_array.option_descriptors[option].constraint_type = SANE_CONSTRAINT_NONE;
+                       option_descriptor_array.option_descriptors[option].constraint.string_list = NULL;
                        break;
                case 19:
-                       free(option_descriptor_array.option_descriptors[option]);
-                       option_descriptor_array.option_descriptors[option] = NULL;
-                       option_descriptor_array.option_descriptors[option] = malloc(sizeof(SANE_Option_Descriptor));
-                       option_descriptor_array.option_descriptors[option]->name = "binarizationmode";
-                       option_descriptor_array.option_descriptors[option]->title = "binarizationmode";
-                       option_descriptor_array.option_descriptors[option]->desc = "binarizationmode";
-                       option_descriptor_array.option_descriptors[option]->cap = SANE_CAP_SOFT_DETECT;
-                       option_descriptor_array.option_descriptors[option]->constraint_type = SANE_CONSTRAINT_NONE;
-                       option_descriptor_array.option_descriptors[option]->constraint.string_list = NULL;
+                       option_descriptor_array.option_descriptors[option].name = "binarizationmode";
+                       option_descriptor_array.option_descriptors[option].title = "binarizationmode";
+                       option_descriptor_array.option_descriptors[option].desc = "binarizationmode";
+                       option_descriptor_array.option_descriptors[option].cap = SANE_CAP_SOFT_DETECT;
+                       option_descriptor_array.option_descriptors[option].constraint_type = SANE_CONSTRAINT_NONE;
+                       option_descriptor_array.option_descriptors[option].constraint.string_list = NULL;
                        break;
                case 20:
-                       free(option_descriptor_array.option_descriptors[option]);
-                       option_descriptor_array.option_descriptors[option] = NULL;
-                       option_descriptor_array.option_descriptors[option] = malloc(sizeof(SANE_Option_Descriptor));
-                       option_descriptor_array.option_descriptors[option]->name = "binarizationcontrast";
-                       option_descriptor_array.option_descriptors[option]->title = "binarizationcontrast";
-                       option_descriptor_array.option_descriptors[option]->desc = "binarizationcontrast";
-                       option_descriptor_array.option_descriptors[option]->cap = SANE_CAP_SOFT_DETECT;
-                       option_descriptor_array.option_descriptors[option]->constraint_type = SANE_CONSTRAINT_NONE;
-                       option_descriptor_array.option_descriptors[option]->constraint.string_list = NULL;
+                       option_descriptor_array.option_descriptors[option].name = "binarizationcontrast";
+                       option_descriptor_array.option_descriptors[option].title = "binarizationcontrast";
+                       option_descriptor_array.option_descriptors[option].desc = "binarizationcontrast";
+                       option_descriptor_array.option_descriptors[option].cap = SANE_CAP_SOFT_DETECT;
+                       option_descriptor_array.option_descriptors[option].constraint_type = SANE_CONSTRAINT_NONE;
+                       option_descriptor_array.option_descriptors[option].constraint.string_list = NULL;
                        break;
                case 21:
-                       free(option_descriptor_array.option_descriptors[option]);
-                       option_descriptor_array.option_descriptors[option] = NULL;
-                       option_descriptor_array.option_descriptors[option] = malloc(sizeof(SANE_Option_Descriptor));
-                       option_descriptor_array.option_descriptors[option]->name = "maxdocumentlength";
-                       option_descriptor_array.option_descriptors[option]->title = "maxdocumentlength";
-                       option_descriptor_array.option_descriptors[option]->desc = "maxdocumentlength";
-                       option_descriptor_array.option_descriptors[option]->cap = SANE_CAP_SOFT_DETECT;
-                       option_descriptor_array.option_descriptors[option]->constraint_type = SANE_CONSTRAINT_NONE;
-                       option_descriptor_array.option_descriptors[option]->constraint.string_list = NULL;
+                       option_descriptor_array.option_descriptors[option].name = "maxdocumentlength";
+                       option_descriptor_array.option_descriptors[option].title = "maxdocumentlength";
+                       option_descriptor_array.option_descriptors[option].desc = "maxdocumentlength";
+                       option_descriptor_array.option_descriptors[option].cap = SANE_CAP_SOFT_DETECT;
+                       option_descriptor_array.option_descriptors[option].constraint_type = SANE_CONSTRAINT_NONE;
+                       option_descriptor_array.option_descriptors[option].constraint.string_list = NULL;
                        break;
                case 22:
-                       free(option_descriptor_array.option_descriptors[option]);
-                       option_descriptor_array.option_descriptors[option] = NULL;
-                       option_descriptor_array.option_descriptors[option] = malloc(sizeof(SANE_Option_Descriptor));
-                       option_descriptor_array.option_descriptors[option]->name = "scansource";
-                       option_descriptor_array.option_descriptors[option]->title = "scansource";
-                       option_descriptor_array.option_descriptors[option]->desc = "ScanSoscansourceurce";
-                       option_descriptor_array.option_descriptors[option]->cap = SANE_CAP_SOFT_DETECT;
-                       option_descriptor_array.option_descriptors[option]->constraint_type = SANE_CONSTRAINT_NONE;
-                       option_descriptor_array.option_descriptors[option]->constraint.string_list = NULL;
+                       option_descriptor_array.option_descriptors[option].name = "scansource";
+                       option_descriptor_array.option_descriptors[option].title = "scansource";
+                       option_descriptor_array.option_descriptors[option].desc = "ScanSoscansourceurce";
+                       option_descriptor_array.option_descriptors[option].cap = SANE_CAP_SOFT_DETECT;
+                       option_descriptor_array.option_descriptors[option].constraint_type = SANE_CONSTRAINT_NONE;
+                       option_descriptor_array.option_descriptors[option].constraint.string_list = NULL;
                        break;
                default:
                        return NULL;
@@ -374,8 +297,8 @@ const SANE_Option_Descriptor* _sane_kds_s2000w_net_get_option_descriptor(
                case 18:
                case 20:
                case 21:
-                       option_descriptor_array.option_descriptors[option]->type = SANE_TYPE_INT;
-                       option_descriptor_array.option_descriptors[option]->size = sizeof(SANE_Int);
+                       option_descriptor_array.option_descriptors[option].type = SANE_TYPE_INT;
+                       option_descriptor_array.option_descriptors[option].size = sizeof(SANE_Int);
                        break;
                case 2:
                case 3:
@@ -387,16 +310,16 @@ const SANE_Option_Descriptor* _sane_kds_s2000w_net_get_option_descriptor(
                case 17:
                case 19:
                case 22:
-                       option_descriptor_array.option_descriptors[option]->type = SANE_TYPE_STRING;
-                       option_descriptor_array.option_descriptors[option]->unit = SANE_UNIT_NONE;
-                       option_descriptor_array.option_descriptors[option]->size = sizeof(SANE_String) * 50;
+                       option_descriptor_array.option_descriptors[option].type = SANE_TYPE_STRING;
+                       option_descriptor_array.option_descriptors[option].unit = SANE_UNIT_NONE;
+                       option_descriptor_array.option_descriptors[option].size = sizeof(SANE_String) * 50;
                        break;
                default:
                        return NULL;
                        break;
        }
 
-       return option_descriptor_array.option_descriptors[option];
+       return &option_descriptor_array.option_descriptors[option];
 }
 
 SANE_Status _sane_kds_s2000w_net_control_option(SANE_Handle handle,