K
Wenn ich Dein Problem richtig verstanden habe, dann liegt der große Zeitverbrauch daran, daß Du, um eine Systemvariable zu füllen, jedesmal (fast) die ganze Konfigurationsdatei sequentiell durchkämmst. So korrekt?
Daher folgender Vorschlag:
- Speichere zu jeder Deiner Systemvariablen ihre Bezeichnung (char*), so wie sie in der Konfigurationsdatei auftauchen soll, und ihren Typ (z. B. string [char*] oder numerisch [unsigned, short, ...])
- Bilde daraus ein sortiertes Array
- Lies die Datei zeilenweise ein
- Parse die Zeile in Variablenname und Wert
- Versuche per binärer Suche, den Variablennamen im Array zu finden
- Fülle die Variable gemäß ihrem Typ mit dem gelesenen Wert
BOOL DateiLesen(const char* datei, PIDSTAT_TYPE pidStat)
{
char zeile[ZEILE_SIZE];
char* varname;
char* wert;
FILE* file = fopen(datei, "r");
if(!file)
return FALSE;
while(fgets(zeile, ZEILE_SIZE, file))
if(ZeileParsen(zeile, &varname, &wert))
SystemVarFuellen(pidStat, varname, wert);
fclose(file);
return TRUE;
}
typedef enum _VarType
{
VAR_CHAR,
VAR_UNSIGNED,
VAR_SHORT,
VAR_LONG,
VAR_STRING
} VarType;
typedef struct _VarInfo
{
const char* name;
void* elem;
VarType type;
} VarInfo;
BOOL SystemVarFuellen(PIDSTAT_TYPE pidStat, char* varname, char* wert)
{
static VarInfo vars[] =
{
{ "CapInh", &pidStat->inh, VAR_STRING },
{ "CapPrm", &pidStat->prm, VAR_STRING },
{ "Name", &pidStat->comm, VAR_STRING },
{ "State", &pidStat->state, VAR_STRING },
{ "Uid", &pidStat->Uid, VAR_UNSIGNED },
{ "VmRSS", &pidStat->rss, VAR_UNSIGNED },
{ "VmSize", &pidStat->vsize, VAR_UNSIGNED },
/* etc. */
};
unsigned arrsize = sizeof(vars) / sizeof(VarInfo);
VarInfo* var = BinaereSuche(varname, vars, arrsize);
if(!var)
return FALSE;
switch(var->type)
{
case VAR_STRING:
strcpy(*((char**) var->elem), wert);
return TRUE;
case VAR_UNSIGNED:
*((unsigned*) var->elem) = (unsigned) atoi(wert);
return TRUE;
/* etc. */
}
return FALSE;
}