Fixed addition of empty parameters in certain situations.
Improved the output of get_driver_settings_string(). Small cleanup. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@3516 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -30,6 +30,8 @@
|
|||||||
#define MAX_SETTINGS_LEVEL 8
|
#define MAX_SETTINGS_LEVEL 8
|
||||||
|
|
||||||
#define CONTINUE_PARAMETER 1
|
#define CONTINUE_PARAMETER 1
|
||||||
|
#define NO_PARAMETER 2
|
||||||
|
|
||||||
|
|
||||||
typedef struct settings_handle {
|
typedef struct settings_handle {
|
||||||
void *first_buffer;
|
void *first_buffer;
|
||||||
@@ -107,9 +109,11 @@ get_word(char **_pos, char **_word, bool allowNewLine)
|
|||||||
pos++;
|
pos++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pos[0] == '}') {
|
if (pos[0] == '}' || pos[0] == '\0') {
|
||||||
|
// if we just read some white space before an end of a
|
||||||
|
// parameter, this is just no parameter at all
|
||||||
*_pos = pos;
|
*_pos = pos;
|
||||||
return B_NO_ERROR;
|
return NO_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Read in a word - might contain escaped (\) spaces, or it
|
// Read in a word - might contain escaped (\) spaces, or it
|
||||||
@@ -227,44 +231,53 @@ parse_parameter(struct driver_parameter *parameter, char **_pos, int32 level)
|
|||||||
|
|
||||||
|
|
||||||
static status_t
|
static status_t
|
||||||
parse_parameters(struct driver_parameter **parameters, int *count, char **pos, int32 level)
|
parse_parameters(struct driver_parameter **_parameters, int *_count, char **_pos, int32 level)
|
||||||
{
|
{
|
||||||
if (level > MAX_SETTINGS_LEVEL)
|
if (level > MAX_SETTINGS_LEVEL)
|
||||||
return B_LINK_LIMIT;
|
return B_LINK_LIMIT;
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
struct driver_parameter *newArray, *parameter;
|
struct driver_parameter parameter;
|
||||||
|
struct driver_parameter *newArray;
|
||||||
status_t status;
|
status_t status;
|
||||||
newArray = realloc(*parameters, (*count + 1) * sizeof(struct driver_parameter));
|
|
||||||
if (newArray == NULL)
|
|
||||||
return B_NO_MEMORY;
|
|
||||||
|
|
||||||
parameter = &newArray[*count];
|
status = parse_parameter(¶meter, _pos, level);
|
||||||
|
|
||||||
status = parse_parameter(parameter, pos, level);
|
|
||||||
if (status < B_OK)
|
if (status < B_OK)
|
||||||
return status;
|
return status;
|
||||||
|
|
||||||
*parameters = newArray;
|
if (status != NO_PARAMETER) {
|
||||||
(*count)++;
|
driver_parameter *newParameter;
|
||||||
|
|
||||||
// check for level beginning and end
|
newArray = realloc(*_parameters, (*_count + 1) * sizeof(struct driver_parameter));
|
||||||
if (**pos == '{') {
|
if (newArray == NULL)
|
||||||
// if we go a level deeper, just start all over again...
|
return B_NO_MEMORY;
|
||||||
(*pos)++;
|
|
||||||
status = parse_parameters(¶meter->parameters, ¶meter->parameter_count, pos, level + 1);
|
memcpy(&newArray[*_count], ¶meter, sizeof(struct driver_parameter));
|
||||||
if (status < B_OK)
|
newParameter = &newArray[*_count];
|
||||||
return status;
|
|
||||||
|
*_parameters = newArray;
|
||||||
|
(*_count)++;
|
||||||
|
|
||||||
|
// check for level beginning and end
|
||||||
|
if (**_pos == '{') {
|
||||||
|
// if we go a level deeper, just start all over again...
|
||||||
|
(*_pos)++;
|
||||||
|
status = parse_parameters(&newParameter->parameters,
|
||||||
|
&newParameter->parameter_count, _pos, level + 1);
|
||||||
|
if (status < B_OK)
|
||||||
|
return status;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if ((**pos == '}' && level > 0)
|
|
||||||
|| (**pos == '\0' && level == 0)) {
|
if ((**_pos == '}' && level > 0)
|
||||||
|
|| (**_pos == '\0' && level == 0)) {
|
||||||
// take the closing bracket from the stack
|
// take the closing bracket from the stack
|
||||||
(*pos)++;
|
(*_pos)++;
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
// obviously, something has gone wrong
|
// obviously, something has gone wrong
|
||||||
if (**pos == '}' || **pos == '\0')
|
if (**_pos == '}' || **_pos == '\0')
|
||||||
return B_ERROR;
|
return B_ERROR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -434,13 +447,14 @@ put_parameter(char **_buffer, size_t *_bufferSize, struct driver_parameter *para
|
|||||||
|
|
||||||
for (i = 0; i < parameter->parameter_count; i++) {
|
for (i = 0; i < parameter->parameter_count; i++) {
|
||||||
put_parameter(_buffer, _bufferSize, ¶meter->parameters[i], level + 1, flat);
|
put_parameter(_buffer, _bufferSize, ¶meter->parameters[i], level + 1, flat);
|
||||||
|
|
||||||
if (parameter->parameters[i].parameter_count == 0)
|
if (parameter->parameters[i].parameter_count == 0)
|
||||||
put_char(_buffer, _bufferSize, flat ? ';' : '\n');
|
put_string(_buffer, _bufferSize, flat ? "; " : "\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!flat)
|
if (!flat)
|
||||||
put_level_space(_buffer, _bufferSize, level);
|
put_level_space(_buffer, _bufferSize, level);
|
||||||
put_char(_buffer, _bufferSize, '}');
|
put_string(_buffer, _bufferSize, flat ? "}" : "}\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
return *_bufferSize >= 0;
|
return *_bufferSize >= 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user