[Mesa-dev] [PATCH] util: require debug options to be separated by commas
Dan Nicholson
dbn.lists at gmail.com
Thu Jan 27 12:46:05 PST 2011
On Wed, Jan 26, 2011 at 3:17 AM, José Fonseca <jfonseca at vmware.com> wrote:
> On Mon, 2011-01-24 at 20:52 -0800, Marek Olšák wrote:
>> Let's assume there are two options with names such that one is a substring
>> of another. Previously, if we only specified the longer one as a debug option,
>> the shorter one would be considered specified as well (because of strstr).
>> This commit fixes it by checking that each option is surrounded by commas.
>>
>> (a regexp would be nicer, but this is not a performance critical code)
>> ---
>> src/gallium/auxiliary/util/u_debug.c | 39 +++++++++++++++++++++++++++++++++-
>> 1 files changed, 38 insertions(+), 1 deletions(-)
>>
>> diff --git a/src/gallium/auxiliary/util/u_debug.c b/src/gallium/auxiliary/util/u_debug.c
>> index 59b7613..8cf7660 100644
>> --- a/src/gallium/auxiliary/util/u_debug.c
>> +++ b/src/gallium/auxiliary/util/u_debug.c
>> @@ -180,6 +180,43 @@ debug_get_num_option(const char *name, long dfault)
>> return result;
>> }
>>
>> +static boolean str_has_option(const char *str, const char *name)
>> +{
>> + const char *substr;
>> +
>> + /* OPTION=all */
>> + if (!util_strcmp(str, "all")) {
>> + return TRUE;
>> + }
>> +
>> + /* OPTION=name */
>> + if (!util_strcmp(str, name)) {
>> + return TRUE;
>> + }
>> +
>> + substr = util_strstr(str, name);
>> +
>> + if (substr) {
>> + unsigned name_len = strlen(name);
>> +
>> + /* OPTION=name,... */
>> + if (substr == str && substr[name_len] == ',') {
>> + return TRUE;
>> + }
>> +
>> + /* OPTION=...,name */
>> + if (substr+name_len == str+strlen(str) && substr[-1] == ',') {
>> + return TRUE;
>> + }
>> +
>> + /* OPTION=...,name,... */
>> + if (substr[-1] == ',' && substr[name_len] == ',') {
>> + return TRUE;
>> + }
>> + }
>> +
>> + return FALSE;
>> +}
>
> Marek,
>
> The intention is good -- it would be nice to get options obeyed properly
> --, but this will fail to find "foo" in "OPTION=prefixfoosuffix,foo", so
> it's replacing a bug with another.
>
> I'd prefer we stop using strstr completely, and instead do:
> 1 - find the first ',' or '\0' in the string
> 2 - compare the previous characters with the option being searched, and
> return TRUE if matches
> 3 - if it was ',' go back to 1, but starting from character after ','.
> 4 - otherwise return FALSE
>
> It should be robust and almost the same amount of code.
You could also strtok pretty easily, but it can be a little
heavyweight if you're doing this repeatedly.
char *tmp, *tok;
tmp = strdup(str);
for (tok = strtok(tmp, ","); tok; tok = strtok(NULL, ",")) {
if (strcmp(tok, opt) == 0) {
free(tmp);
return TRUE;
}
}
free(tmp);
return FALSE;
--
Dan
More information about the mesa-dev
mailing list