#include #include #include #include #include #include #include "dolmenu.h" #include "cfg.h" #include "util.h" wdm_entry_t *dolmenubuffer = NULL; u32 dolparameter = 1; static char *p; static char *pend; char *getnextstring() { char *temp = NULL; char *pos; char *posCR; while (true) { if (p >= pend) { return NULL; } pos = strchr(p, '\n'); if (pos == NULL) { temp = p; p = pend; return temp; } if (pos >= pend) { return NULL; } pos[0] = 0; posCR = strchr(p, '\r'); if (posCR != NULL && posCR < pos) { posCR[0] = 0; } temp = p; p = (char *)((u32)pos+1); if (temp[0] != '#') break; // Skip comments which start with # } return temp; } u32 getnextnumber() { char *temp = getnextstring(); if (temp == NULL || temp[0] == 0 || temp[0] == '\n' || temp[0] == '\r' || strlen(temp) == 0) { return 0; } else if (strlen(temp) > 2 && strncmp(temp, "0x", 2) == 0) { return strtol((char *)((u32)temp+2), NULL, 16); } else { return strtol(temp, NULL, 10); } } void copynextstring(char *output) { char *temp = getnextstring(); if (temp == NULL || temp[0] == 0 || temp[0] == '\n' || temp[0] == '\r' || strlen(temp) == 0) { strcpy(output, "?"); } else { strcpy(output, temp); } } void parse_dolmenubuffer(u32 index, u32 count, u32 parent) { u32 i; for (i = 0;i < count;i++) { dolmenubuffer[index + i].count = getnextnumber(); memset(dolmenubuffer[index + i].name, 0, 64); copynextstring(dolmenubuffer[index + i].name); memset(dolmenubuffer[index + i].dolname, 0, 32); copynextstring(dolmenubuffer[index + i].dolname); dolmenubuffer[index + i].parameter = getnextnumber(); dolmenubuffer[index + i].parent = parent; if (dolmenubuffer[index + i].count != 0) { parse_dolmenubuffer(index + i + 1, dolmenubuffer[index + i].count, index + i); i+=dolmenubuffer[index + i].count; } } } s32 createdolmenubuffer(u32 count) { u32 i; dolmenubuffer = memalign(32, sizeof(wdm_entry_t) * count); if (dolmenubuffer == NULL) { return -1; //error } for (i=0;i