[PATCH setxkbmap] Data refactored: list_t introduced to keep list and its sizes together.

Van de Bugger van.de.bugger at gmail.com
Sun Feb 13 14:45:23 PST 2011


In older code there were 3 separate global variables: szOptions, numOptions,
and options. All 3 variables are related: options is a list (array) of items,
szOptions is the allocated size and numOptions is the number of used elements.
3 more variables (szInclPath, numInclPath, inclPath) represent another list.

list_t structure combines related info (pointer to array, allocated size, and
number of used elements) together.

Few functions changed to accept list_t argument instead of separated list and sizes.
---
 setxkbmap.c |  122 ++++++++++++++++++++++++++++++----------------------------
 1 files changed, 63 insertions(+), 59 deletions(-)

diff --git a/setxkbmap.c b/setxkbmap.c
index ddf3440..be3c262 100644
--- a/setxkbmap.c
+++ b/setxkbmap.c
@@ -131,13 +131,18 @@ static XkbRF_RulesPtr rules = NULL;
 static XkbRF_VarDefsRec rdefs;
 
 static Bool clearOptions = False;
-static int szOptions = 0;
-static int numOptions = 0;
-static char **options = NULL;
 
-static int szInclPath = 0;
-static int numInclPath = 0;
-static char **inclPath = NULL;
+struct list {
+	char ** item;	/* Array of items. */
+	int     sz;     /* Size of array. */
+	int     num;    /* Number of used elements. */
+};
+
+typedef struct list list_t;
+
+static list_t options = { NULL, 0, 0 };
+
+static list_t inclPath = { NULL, 0, 0 };
 
 static XkbDescPtr xkb = NULL;
 
@@ -165,7 +170,7 @@ static int deviceSpec = XkbUseCoreKbd;
 
 /***====================================================================***/
 
-Bool addToList(int *sz, int *num, char ***listIn, char *newVal);
+Bool addToList(list_t * list, char *newVal);
 void usage(int argc, char **argv);
 void dumpNames(Bool wantRules, Bool wantCNames);
 void trySetString(setting_t * setting, char *newVal, int src);
@@ -174,9 +179,8 @@ int parseArgs(int argc, char **argv);
 Bool getDisplay(int argc, char **argv);
 Bool getServerValues(void);
 FILE *findFileInPath(char *name, char *subdir);
-Bool addStringToOptions(char *opt_str, int *sz_opts, int *num_opts,
-                        char ***opts);
-char *stringFromOptions(char *orig, int numNew, char **newOpts);
+Bool addStringToOptions(char *opt_str, list_t * opts);
+char *stringFromOptions(char *orig, list_t * newOpts);
 Bool applyConfig(char *name);
 Bool applyRules(void);
 Bool applyComponentNames(void);
@@ -184,44 +188,45 @@ void printKeymap(void);
 
 /***====================================================================***/
 
+/*
+    If newVal is NULL or empty string, the list is cleared.
+    Otherwise newVal is added to the end of the list (if it is not present in the list yet).
+*/
+
 Bool
-addToList(int *sz, int *num, char ***listIn, char *newVal)
+addToList(list_t * list, char *newVal)
 {
     register int i;
-    char **list;
 
     if ((!newVal) || (!newVal[0]))
     {
-        *num = 0;
+        list->num = 0;
         return True;
     }
-    list = *listIn;
-    for (i = 0; i < *num; i++)
+    for (i = 0; i < list->num; i++)
     {
-        if (streq(list[i], newVal))
+        if (streq(list->item[i], newVal))
             return True;
     }
-    if ((list == NULL) || (*sz < 1))
+    if ((list->item == NULL) || (list->sz < 1))
     {
-        *num = 0;
-        *sz = 4;
-        list = (char **) calloc(*sz, sizeof(char *));
-        *listIn = list;
+        list->num = 0;
+        list->sz = 4;
+        list->item = (char **) calloc(list->sz, sizeof(char *));
     }
-    else if (*num >= *sz)
+    else if (list->num >= list->sz)
     {
-        *sz *= 2;
-        list = (char **) realloc(list, (*sz) * sizeof(char *));
-        *listIn = list;
+        list->sz *= 2;
+        list->item = (char **) realloc(list->item, (list->sz) * sizeof(char *));
     }
-    if (!list)
+    if (!list->item)
     {
         ERR("Internal Error! Allocation failure in add to list!\n");
         ERR("                Exiting.\n");
         exit(-1);
     }
-    list[*num] = strdup(newVal);
-    (*num) = (*num) + 1;
+    list->item[list->num] = strdup(newVal);
+    list->num += 1;
     return True;
 }
 
@@ -269,9 +274,9 @@ dumpNames(Bool wantRules, Bool wantCNames)
             MSG1("layout:     %s\n", settings.layout.value);
         if (settings.variant.value)
             MSG1("variant:    %s\n", settings.variant.value);
-        if (options)
+        if (options.item)
         {
-            char *opt_str = stringFromOptions(NULL, numOptions, options);
+            char *opt_str = stringFromOptions(NULL, &options);
             MSG1("options:    %s\n", opt_str);
             free(opt_str);
         }
@@ -382,8 +387,8 @@ parseArgs(int argc, char **argv)
     unsigned present;
 
     ok = True;
-    addToList(&szInclPath, &numInclPath, &inclPath, ".");
-    addToList(&szInclPath, &numInclPath, &inclPath, DFLT_XKB_CONFIG_ROOT);
+    addToList(&inclPath, ".");
+    addToList(&inclPath, DFLT_XKB_CONFIG_ROOT);
     for (i = 1; (i < argc) && ok; i++)
     {
         if (argv[i][0] != '-')
@@ -395,7 +400,7 @@ parseArgs(int argc, char **argv)
             else if (!settings.variant.src)
                 trySetString(&settings.variant, argv[i], FROM_CMD_LINE);
             else
-                ok = addToList(&szOptions, &numOptions, &options, argv[i]);
+                ok = addToList(&options, argv[i]);
         }
         else if (streq(argv[i], "-compat"))
             ok = setOptString(&i, argc, argv, &settings.compat, FROM_CMD_LINE);
@@ -422,13 +427,13 @@ parseArgs(int argc, char **argv)
         else if (streq(argv[i], "-I")) /* space between -I and path */
         {
             if ( ++i < argc )
-                ok = addToList(&szInclPath, &numInclPath, &inclPath, argv[i]);
+                ok = addToList(&inclPath, argv[i]);
             else
                 VMSG(0, "No directory specified on the command line\n"
                      "Trailing -I option ignored\n");
         }
         else if (strpfx(argv[i], "-I")) /* no space between -I and path */
-            ok = addToList(&szInclPath, &numInclPath, &inclPath, &argv[i][2]);
+            ok = addToList(&inclPath, &argv[i][2]);
         else if (streq(argv[i], "-keycodes"))
             ok = setOptString(&i, argc, argv, &settings.keycodes, FROM_CMD_LINE);
         else if (streq(argv[i], "-keymap"))
@@ -443,13 +448,13 @@ parseArgs(int argc, char **argv)
                 || (argv[i + 1][0] == '-'))
             {
                 clearOptions = True;
-                ok = addToList(&szOptions, &numOptions, &options, "");
+                ok = addToList(&options, "");
                 if (i < argc - 1 && argv[i + 1][0] == '\0')
                     i++;
             }
             else
             {
-                ok = addToList(&szOptions, &numOptions, &options, argv[++i]);
+                ok = addToList(&options, argv[++i]);
             }
         }
         else if (streq(argv[i], "-print"))
@@ -606,7 +611,7 @@ getServerValues(void)
         trySetString(&settings.variant, vd.variant, FROM_SERVER);
     if ((vd.options) && (!clearOptions))
     {
-        addStringToOptions(vd.options, &szOptions, &numOptions, &options);
+        addStringToOptions(vd.options, &options);
         XFree(vd.options);
     }
     return True;
@@ -628,12 +633,12 @@ findFileInPath(char *name, char *subdir)
             MSG2("%s file %s\n", (fp ? "Found" : "Didn't find"), name);
         return fp;
     }
-    for (i = 0; (i < numInclPath); i++)
+    for (i = 0; (i < inclPath.num); i++)
     {
-        if (snprintf(buf, PATH_MAX, "%s/%s%s", inclPath[i], subdir, name) >=
+        if (snprintf(buf, PATH_MAX, "%s/%s%s", inclPath.item[i], subdir, name) >=
             PATH_MAX)
         {
-            VMSG3(0, "Path too long (%s/%s%s). Ignored.\n", inclPath[i],
+            VMSG3(0, "Path too long (%s/%s%s). Ignored.\n", inclPath.item[i],
                   subdir, name);
             continue;
         }
@@ -649,7 +654,7 @@ findFileInPath(char *name, char *subdir)
 /***====================================================================***/
 
 Bool
-addStringToOptions(char *opt_str, int *sz_opts, int *num_opts, char ***opts)
+addStringToOptions(char *opt_str, list_t * opts)
 {
     char *tmp, *str, *next;
     Bool ok = True;
@@ -664,7 +669,7 @@ addStringToOptions(char *opt_str, int *sz_opts, int *num_opts, char ***opts)
             *next = '\0';
             next++;
         }
-        ok = addToList(sz_opts, num_opts, opts, tmp) && ok;
+        ok = addToList(opts, tmp) && ok;
     }
     free(str);
     return ok;
@@ -673,7 +678,7 @@ addStringToOptions(char *opt_str, int *sz_opts, int *num_opts, char ***opts)
 /***====================================================================***/
 
 char *
-stringFromOptions(char *orig, int numNew, char **newOpts)
+stringFromOptions(char *orig, list_t * newOpts)
 {
     int len, i, nOut;
 
@@ -681,10 +686,10 @@ stringFromOptions(char *orig, int numNew, char **newOpts)
         len = strlen(orig) + 1;
     else
         len = 0;
-    for (i = 0; i < numNew; i++)
+    for (i = 0; i < newOpts->num; i++)
     {
-        if (newOpts[i])
-            len += strlen(newOpts[i]) + 1;
+        if (newOpts->item[i])
+            len += strlen(newOpts->item[i]) + 1;
     }
     if (len < 1)
         return NULL;
@@ -708,17 +713,17 @@ stringFromOptions(char *orig, int numNew, char **newOpts)
         }
         nOut = 0;
     }
-    for (i = 0; i < numNew; i++)
+    for (i = 0; i < newOpts->num; i++)
     {
-        if (!newOpts[i])
+        if (!newOpts->item[i])
             continue;
         if (nOut > 0)
         {
             strcat(orig, ",");
-            strcat(orig, newOpts[i]);
+            strcat(orig, newOpts->item[i]);
         }
         else
-            strcpy(orig, newOpts[i]);
+            strcpy(orig, newOpts->item[i]);
         nOut++;
     }
     return orig;
@@ -763,8 +768,7 @@ applyConfig(char *name)
     }
     if (cfgResult.options)
     {
-        addStringToOptions(cfgResult.options, &szOptions, &numOptions,
-                           &options);
+        addStringToOptions(cfgResult.options, &options);
         cfgResult.options = NULL;
     }
     if (cfgResult.keymap)
@@ -818,7 +822,7 @@ applyRules(void)
     char *rfName;
 
     if (settings.model.src || settings.layout.src || settings.variant.src
-        || options)
+        || options.item)
     {
         char buf[PATH_MAX];
         XkbComponentNamesRec rnames;
@@ -829,9 +833,9 @@ applyRules(void)
         rdefs.model = settings.model.value;
         rdefs.layout = settings.layout.value;
         rdefs.variant = settings.variant.value;
-        if (options)
+        if (options.item)
             rdefs.options =
-                stringFromOptions(rdefs.options, numOptions, options);
+                stringFromOptions(rdefs.options, &options);
 
         if (settings.rules.src)
             rfName = settings.rules.value;
@@ -846,13 +850,13 @@ applyRules(void)
         {
             /* try to load rules files from all include paths until the first
              * we succeed with */
-            for (i = 0; (i < numInclPath) && (!rules); i++)
+            for (i = 0; (i < inclPath.num) && (!rules); i++)
             {
                 if (snprintf(buf, PATH_MAX, "%s/rules/%s",
-                             inclPath[i], rfName) >= PATH_MAX)
+                             inclPath.item[i], rfName) >= PATH_MAX)
                 {
                     VMSG2(0, "Path too long (%s/rules/%s). Ignored.\n",
-                          inclPath[i], rfName);
+                          inclPath.item[i], rfName);
                     continue;
                 }
                 rules = XkbRF_Load(buf, settings.locale.value, True, True);
-- 
1.7.4





More information about the xorg-devel mailing list