#include <kernel/config.h>
#include <wchar.h>
#include <stdlib.h>
#include <string.h>
const char* cfgGetToken(const char* str, char* out, size_t max, const char* ctrl)
{
unsigned char map[32];
int count;
const char* start;
for (count = 0; count < 32; count++)
map[count] = 0;
do {
map[*ctrl >> 3] |= (1 << (*ctrl & 7));
} while (*ctrl++);
while ( (map[*str >> 3] & (1 << (*str & 7))) && *str )
str++;
if (*str == '\n' ||
*str == 0)
return NULL;
start = str;
for ( ; *str ; str++ )
{
if ( map[*str >> 3] & (1 << (*str & 7)) )
{
*out++ = '\0';
break;
}
*out = *str;
out++;
}
return str;
}
hashtable_t* cfgParseStrLine(const char** line)
{
hashtable_t* hash;
const char* delims = "\r\t= ";
hashelem_t elem;
size_t size;
char token[256];
const char* str;
wchar_t* wide;
hash = hashCreate(31);
while ((str = cfgGetToken(*line, token, countof(token), delims)))
{
*line = str;
if (*token == '#')
{
while (**line != '\n' &&
**line)
(*line)++;
break;
}
wide = malloc(sizeof(wchar_t) * (strlen(token) + 1));
size = mbstowcs(wide, token, strlen(token) + 1);
wide[size] = 0;
elem.str = wide;
if (**line == '=')
{
*line = cfgGetToken(*line, token, countof(token), delims);
elem.data = malloc(sizeof(wchar_t) * (strlen(token) + 1));
size = mbstowcs((wchar_t*) elem.data, token, strlen(token) + 1);
((wchar_t*) elem.data)[size] = 0;
}
else
elem.data = NULL;
hashInsert(hash, &elem);
}
(*line)++;
return hash;
}
void cfgDeleteItem(hashelem_t *e)
{
free((void*) e->str);
free(e->data);
}
void cfgDeleteTable(hashtable_t* hash)
{
hashList(hash, cfgDeleteItem);
free(hash->table);
free(hash);
}