in lsvmutils/conf.c [78:212]
int ParseConf(
const char* text,
unsigned long textSize,
ConfCallback callback,
void* callbackData,
unsigned int* errorLine,
Error* err)
{
int status = 0;
const char* line;
const char* textEnd;
unsigned int lineNum = 0;
char* namePtr = NULL;
char* valuePtr = NULL;
/* Check parameters */
if (!text || !textSize || !errorLine || !err)
{
SetErr(err, TCS("invalid parameter"));
status = -1;
goto done;
}
/* Set pointer to the end of the text */
textEnd = text + textSize;
/* Clear error state */
*errorLine = 0;
ClearErr(err);
/* Process lines of the format NAME=SHA1:SHA256 */
while ((line = _GetLine(&text, textEnd)))
{
const char* p = line;
const char* end = text;
const char* name = NULL;
UINTN nameLen = 0;
const char* value = NULL;
UINTN valueLen = 0;
/* Increment the line number */
lineNum++;
/* Strip horizontal whitespace */
p = _SkipWhitespace(p, end);
/* Skip blank lines and comment lines */
if (p == end || *p == '#')
continue;
/* Remove trailing whitespace */
while (end != p && Isspace(end[-1]))
end--;
/* Recognize the name: [A-Za-z_][A-Za-z_0-9] */
{
const char* start = p;
p = _SkipIdentifier(p, end);
if (p == start)
{
SetErr(err, TCS("expected name"));
status = -1;
goto done;
}
/* Save the name */
name = start;
nameLen = p - start;
}
/* Expect a '=' */
{
p = _SkipWhitespace(p, end);
if (p == end || *p++ != '=')
{
SetErr(err, TCS("syntax error: expected '='"));
status = -1;
goto done;
}
p = _SkipWhitespace(p, end);
}
/* Get the value */
{
value = p;
valueLen = end - p;
}
/* Invoke the callback */
if (callback)
{
if (!(namePtr = Strndup(name, nameLen)))
{
SetErr(err, TCS("out of memory"));
status = -1;
goto done;
}
if (!(valuePtr = Strndup(value, valueLen)))
{
SetErr(err, TCS("out of memory"));
status = -1;
goto done;
}
if ((*callback)(namePtr, valuePtr, callbackData, err) != 0)
{
status = -1;
goto done;
}
Free(namePtr);
namePtr = NULL;
Free(valuePtr);
valuePtr = NULL;
}
}
done:
if (status != 0)
*errorLine = lineNum;
if (namePtr)
Free(namePtr);
if (valuePtr)
Free(valuePtr);
return status;
}