Hi,
well after some ever further investigation of some bugs, I ended up
cleaning up the code, again. I also fixed some really heavy memory
leaks in csvToList and made it in general more stable.
Regards,
Patrick "Marex" Niklaus
diff --git a/plugins/ini.c b/plugins/ini.c
index c55d897..3dda8a8 100644
--- a/plugins/ini.c
+++ b/plugins/ini.c
@@ -143,9 +143,11 @@ static IniFileData *
iniGetFileDataFromFilename (CompDisplay *d,
const char *filename)
{
- int len, i;
- int pluginSep = 0, screenSep = 0;
- char *pluginStr, *screenStr;
+ int fnLen, length;
+ char *pluginSep;
+ char *screenSep;
+ char *pluginStr;
+ char *screenStr;
IniFileData *fd;
INI_DISPLAY (d);
@@ -153,35 +155,27 @@ iniGetFileDataFromFilename (CompDisplay *d,
if (!filename)
return NULL;
- len = strlen (filename);
+ fnLen = strlen(filename);
- if (len < (strlen(FILE_SUFFIX) + 2))
+ if (fnLen < (strlen(FILE_SUFFIX) + 2))
return NULL;
- if ((filename[0]=='.') || (filename[len-1]=='~'))
+ if ((filename[0] == '.') || (filename[fnLen-1] == '~'))
return NULL;
for (fd = id->fileData; fd; fd = fd->next)
if (strcmp (fd->filename, filename) == 0)
return fd;
- for (i=0; i<len; i++)
- {
- if (filename[i] == '-')
- {
- if (!pluginSep)
- pluginSep = i-1;
- else
- return NULL; /*found a second dash */
- }
- else if (filename[i] == '.')
- {
- if (!screenSep)
- screenSep = i-1;
- else
- return NULL; /*found a second dot */
- }
- }
+ /* the split point for the plugin name */
+ pluginSep = strrchr(filename, '-');
+ if (!pluginSep)
+ return NULL;
+
+ /* the split point for the screen name */
+ screenSep = strrchr(filename, '.');
+ if (!screenSep)
+ return NULL;
if (!pluginSep || !screenSep)
return NULL;
@@ -202,17 +196,12 @@ iniGetFileDataFromFilename (CompDisplay *d,
newFd->filename = strdup (filename);
- pluginStr = malloc (sizeof (char) * pluginSep + 1);
- screenStr = malloc (sizeof (char) * (screenSep - pluginSep) + 1);
-
- if (!pluginStr || !screenStr)
- return NULL;
-
- strncpy (pluginStr, filename, pluginSep + 1);
- pluginStr[pluginSep + 1] = '\0';
-
- strncpy (screenStr, &filename[pluginSep+2], (screenSep - pluginSep) + 1);
- screenStr[(screenSep - pluginSep) -1] = '\0';
+ /* get plugin and screen name */
+ length = strlen(filename) - strlen(pluginSep);
+ pluginStr = strndup(filename, length);
+ pluginSep++; /* skip the '-' */
+ length = strlen(pluginSep) - strlen(screenSep);
+ screenStr = strndup(pluginSep, length);
if (strcmp (pluginStr, CORE_NAME) == 0)
newFd->plugin = NULL;
@@ -330,7 +319,7 @@ iniGetFilename (CompDisplay *d,
if (fn)
{
sprintf (fn, "%s-%s%s",
- plugin?plugin:CORE_NAME, screenStr, FILE_SUFFIX);
+ plugin ? plugin : CORE_NAME, screenStr, FILE_SUFFIX);
*filename = strdup (fn);
@@ -348,48 +337,20 @@ iniGetFilename (CompDisplay *d,
static Bool
iniParseLine (char *line, char **optionName, char **optionValue)
{
- int pos = 0;
- int splitPos = 0;
- int endPos = 0;
- char tmpName[MAX_OPTION_LENGTH];
- char tmpValue[MAX_OPTION_LENGTH];
+ char *splitPos;
+ int length;
if (line[0] == '\0' || line[0] == '\n')
return FALSE;
- while (pos < strlen(line))
- {
- if (!splitPos && line[pos] == '=')
- splitPos = pos;
- if (line[pos] == '\n')
- {
- endPos = pos;
- break;
- }
- pos++;
- }
-
- if (splitPos && endPos)
- {
- tmpName[0] = '\0';
- tmpValue[0] = '\0';
-
- int i;
- for (i=0; i < splitPos; i++)
- tmpName[i] = line[i];
- tmpName[splitPos] = '\0';
-
- for (i=splitPos+1; i<endPos; i++)
- tmpValue[i - (splitPos+1)] = line[i];
- tmpValue[endPos - (splitPos+1)] = '\0';
-
- *optionName = strdup (tmpName);
- *optionValue = strdup (tmpValue);
- }
- else
- {
+ splitPos = strchr(line, '=');
+ if (!splitPos)
return FALSE;
- }
+
+ length = strlen(line) - strlen(splitPos);
+ *optionName = strndup(line, length);
+ splitPos++;
+ *optionValue = strndup(splitPos, strlen(splitPos)-1);
return TRUE;
}
@@ -397,53 +358,48 @@ iniParseLine (char *line, char **optionName, char **optionValue)
static Bool
csvToList (char *csv, CompListValue *list, CompOptionType type)
{
- char *csvtmp, *split, *item = NULL;
- int count = 1, i, itemLength;
+ char *splitStart = NULL;
+ char *splitEnd = NULL;
+ char *item = NULL;
+ int itemLength;
+ int count;
+ int i;
if (csv[0] == '\0')
{
list->nValue = 0;
return FALSE;
}
-
- csvtmp = strdup (csv);
- csvtmp = strchr (csv, ',');
-
- while (csvtmp)
- {
- csvtmp++; /* avoid the comma */
- count++;
- csvtmp = strchr (csvtmp, ',');
- }
-
+
+ int length = strlen(csv);
+ count = 1;
+ for (i = 0; i < length; i++)
+ if (csv[i] == ',' && i != length-1)
+ count++;
+
+ splitStart = csv;
list->value = malloc (sizeof (CompOptionValue) * count);
if (list->value)
{
- for (i=0; i<count; i++)
+ for (i = 0; i < count; i++)
{
- split = strchr (csv, ',');
- if (split)
+ splitEnd = strchr(splitStart, ',');
+
+ if (splitEnd)
{
- /* > 1 value */
- itemLength = strlen(csv) - strlen(split);
- item = realloc (item, sizeof (char) * (itemLength+1));
- strncpy (item, csv, itemLength);
- item[itemLength] = '\0';
- csv += itemLength + 1;
+ itemLength = strlen(splitStart) - strlen(splitEnd);
+ item = strndup(splitStart, itemLength);
}
- else
+ else // last value
{
- /* 1 value only */
- itemLength = strlen(csv);
- item = realloc (item, sizeof (char) * (itemLength+1));
- strncpy (item, csv, itemLength);
- item[itemLength] = '\0';
+ item = strdup(splitStart);
}
switch (type)
{
case CompOptionTypeString:
- list->value[i].s = strdup (item);
+ if (item[0] != '\0')
+ list->value[i].s = strdup (item);
break;
case CompOptionTypeBool:
if (item[0] != '\0')
@@ -464,13 +420,14 @@ csvToList (char *csv, CompListValue *list, CompOptionType type)
default:
break;
}
+
+ splitStart = ++splitEnd;
+ if (item)
+ free(item);
}
list->nValue = count;
}
- if (item)
- free (item);
-
return TRUE;
}
@@ -639,7 +596,7 @@ iniLoadOptionsFromFile (CompDisplay *d,
CompScreen *s = NULL;
CompPlugin *p = NULL;
Bool status = FALSE;
- Bool hv = FALSE;
+ Bool hasValue = FALSE;
CompOptionValue value;
if (plugin)
@@ -688,12 +645,13 @@ iniLoadOptionsFromFile (CompDisplay *d,
IniAction action;
action.realOptionName = NULL;
- Bool continueReading = FALSE;
- while (fgets (&tmp[0], MAX_OPTION_LENGTH, optionFile) != NULL)
+ Bool continueReading;
+ while (fgets (tmp, MAX_OPTION_LENGTH, optionFile) != NULL)
{
status = FALSE;
+ continueReading = FALSE;
- if (!iniParseLine (&tmp[0], &optionName, &optionValue))
+ if (!iniParseLine (tmp, &optionName, &optionValue))
{
fprintf(stderr,
"Ignoring line '%s' in %s %i\n", tmp, plugin, screen);
@@ -710,29 +668,29 @@ iniLoadOptionsFromFile (CompDisplay *d,
switch (o->type)
{
case CompOptionTypeBool:
- hv = TRUE;
+ hasValue = TRUE;
value.b = (Bool) atoi (optionValue);
break;
case CompOptionTypeInt:
- hv = TRUE;
+ hasValue = TRUE;
value.i = atoi (optionValue);
break;
case CompOptionTypeFloat:
- hv = TRUE;
+ hasValue = TRUE;
value.f = atof (optionValue);
break;
case CompOptionTypeString:
- hv = TRUE;
+ hasValue = TRUE;
value.s = strdup (optionValue);
break;
case CompOptionTypeColor:
- hv = stringToColor (optionValue, value.c);
+ hasValue = stringToColor (optionValue, value.c);
break;
case CompOptionTypeList:
- hv = csvToList (optionValue, &value.list, value.list.type);
+ hasValue = csvToList (optionValue, &value.list, value.list.type);
break;
case CompOptionTypeMatch:
- hv = TRUE;
+ hasValue = TRUE;
matchInit (&value.match);
matchAddFromString (&value.match, optionValue);
break;
@@ -740,7 +698,7 @@ iniLoadOptionsFromFile (CompDisplay *d,
break;
}
- if (hv)
+ if (hasValue)
{
if (plugin && p)
{
@@ -830,7 +788,6 @@ iniLoadOptionsFromFile (CompDisplay *d,
free (optionName);
if (optionValue)
free (optionValue);
- continueReading = FALSE;
}
return TRUE;
_______________________________________________
compiz mailing list
[EMAIL PROTECTED]
http://lists.freedesktop.org/mailman/listinfo/compiz