/// Kernel command line code, extremely slow, extremely unsafe, extremely painful #include #include #define POOL_SIZE 0x800 #define SLOT_COUNT 0x40 c8 CmdlineMemoryPool[POOL_SIZE] = {}; c8* CmdlineKeys[SLOT_COUNT] = {}; c8* CmdlineValues[SLOT_COUNT] = {}; u32 CmdlineEntryCount = 0; void CmdlineParse(const c8* CommandLine) { enum PARSE_STATE { PSWS, PSKey, PSValue }; int PoolPosition = 0; int SlotPosition = 0; c8* KeyStart = 0; c8* ValueStart = 0; enum PARSE_STATE State = PSWS; for (int i = 0; CommandLine[i] != 0; i++) { switch (State) { case PSWS: { if (!(CommandLine[i] == '\n' ||CommandLine[i] == '\r' ||CommandLine[i] == ' ')) { State = PSKey; KeyStart = CmdlineMemoryPool + PoolPosition; } else continue; } case PSKey: { if (CommandLine[i] == '=') { State = PSValue; CmdlineKeys[SlotPosition] = KeyStart; CmdlineMemoryPool[PoolPosition++] = 0; ValueStart = CmdlineMemoryPool + PoolPosition; continue; } else CmdlineMemoryPool[PoolPosition++] = CommandLine[i]; continue; } case PSValue: { if (CommandLine[i] == '\n' ||CommandLine[i] == '\r' ||CommandLine[i] == ' ') { State = PSWS; CmdlineValues[SlotPosition++] = ValueStart; CmdlineMemoryPool[PoolPosition++] = 0; } else CmdlineMemoryPool[PoolPosition++] = CommandLine[i]; } } } if (State == PSValue) CmdlineValues[SlotPosition++] = ValueStart; CmdlineEntryCount = SlotPosition; } const c8* CmdlineGet(const c8* Param) { for (int i = 0; i < CmdlineEntryCount; i++) { for (int j = 0; Param[j - 1] != 0; j++) { if (CmdlineKeys[i][j] != Param[j]) goto next; } return CmdlineValues[i]; next: } return 0; }