diff -r 000000000000 -r b7aa2b626807 plugins/admin-flatfile/admin-overrides.sp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plugins/admin-flatfile/admin-overrides.sp Sun Mar 30 07:00:22 2008 +0000 @@ -0,0 +1,213 @@ +/** + * vim: set ts=4 : + * ============================================================================= + * SourceMod Admin File Reader Plugin + * Reads overrides from the admin_levels.cfg file. Do not compile + * this directly. + * + * SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved. + * ============================================================================= + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 3.0, as published by the + * Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + * + * As a special exception, AlliedModders LLC gives you permission to link the + * code of this program (as well as its derivative works) to "Half-Life 2," the + * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software + * by the Valve Corporation. You must obey the GNU General Public License in + * all respects for all other code used. Additionally, AlliedModders LLC grants + * this exception to all derivative works. AlliedModders LLC defines further + * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), + * or . + * + * Version: $Id$ + */ + +#define OVERRIDE_STATE_NONE 0 +#define OVERRIDE_STATE_LEVELS 1 +#define OVERRIDE_STATE_OVERRIDES 2 + +static Handle:g_hOldOverrideParser = INVALID_HANDLE; +static Handle:g_hNewOverrideParser = INVALID_HANDLE; +static g_OverrideState = OVERRIDE_STATE_NONE; + +public SMCResult:ReadOldOverrides_NewSection(Handle:smc, const String:name[], bool:opt_quotes) +{ + if (g_IgnoreLevel) + { + g_IgnoreLevel++; + return SMCParse_Continue; + } + + if (g_OverrideState == OVERRIDE_STATE_NONE) + { + if (StrEqual(name, "Levels")) + { + g_OverrideState = OVERRIDE_STATE_LEVELS; + } else { + g_IgnoreLevel++; + } + } else if (g_OverrideState == OVERRIDE_STATE_LEVELS) { + if (StrEqual(name, "Overrides")) + { + g_OverrideState = OVERRIDE_STATE_OVERRIDES; + } else { + g_IgnoreLevel++; + } + } else { + g_IgnoreLevel++; + } + + return SMCParse_Continue; +} + +public SMCResult:ReadNewOverrides_NewSection(Handle:smc, const String:name[], bool:opt_quotes) +{ + if (g_IgnoreLevel) + { + g_IgnoreLevel++; + return SMCParse_Continue; + } + + if (g_OverrideState == OVERRIDE_STATE_NONE) + { + if (StrEqual(name, "Overrides")) + { + g_OverrideState = OVERRIDE_STATE_OVERRIDES; + } else { + g_IgnoreLevel++; + } + } else { + g_IgnoreLevel++; + } + + return SMCParse_Continue; +} + +public SMCResult:ReadOverrides_KeyValue(Handle:smc, + const String:key[], + const String:value[], + bool:key_quotes, + bool:value_quotes) +{ + if (g_OverrideState != OVERRIDE_STATE_OVERRIDES + || g_IgnoreLevel) + { + return SMCParse_Continue; + } + + new flags = ReadFlagString(value); + + if (key[0] == '@') + { + AddCommandOverride(key[1], Override_CommandGroup, flags); + } else { + AddCommandOverride(key, Override_Command, flags); + } + + return SMCParse_Continue; +} + +public SMCResult:ReadOldOverrides_EndSection(Handle:smc) +{ + /* If we're ignoring, skip out */ + if (g_IgnoreLevel) + { + g_IgnoreLevel--; + return SMCParse_Continue; + } + + if (g_OverrideState == OVERRIDE_STATE_LEVELS) + { + g_OverrideState = OVERRIDE_STATE_NONE; + } else if (g_OverrideState == OVERRIDE_STATE_OVERRIDES) { + /* We're totally done parsing */ + g_OverrideState = OVERRIDE_STATE_LEVELS; + return SMCParse_Halt; + } + + return SMCParse_Continue; +} + +public SMCResult:ReadNewOverrides_EndSection(Handle:smc) +{ + /* If we're ignoring, skip out */ + if (g_IgnoreLevel) + { + g_IgnoreLevel--; + return SMCParse_Continue; + } + + if (g_OverrideState == OVERRIDE_STATE_OVERRIDES) + { + g_OverrideState = OVERRIDE_STATE_NONE; + } + + return SMCParse_Continue; +} + +public SMCResult:ReadOverrides_CurrentLine(Handle:smc, const String:line[], lineno) +{ + g_CurrentLine = lineno; + + return SMCParse_Continue; +} + +static InitializeOverrideParsers() +{ + if (g_hOldOverrideParser == INVALID_HANDLE) + { + g_hOldOverrideParser = SMC_CreateParser(); + SMC_SetReaders(g_hOldOverrideParser, + ReadOldOverrides_NewSection, + ReadOverrides_KeyValue, + ReadOldOverrides_EndSection); + SMC_SetRawLine(g_hOldOverrideParser, ReadOverrides_CurrentLine); + } + if (g_hNewOverrideParser == INVALID_HANDLE) + { + g_hNewOverrideParser = SMC_CreateParser(); + SMC_SetReaders(g_hNewOverrideParser, + ReadNewOverrides_NewSection, + ReadOverrides_KeyValue, + ReadNewOverrides_EndSection); + SMC_SetRawLine(g_hNewOverrideParser, ReadOverrides_CurrentLine); + } +} + +InternalReadOverrides(Handle:parser, const String:file[]) +{ + BuildPath(Path_SM, g_Filename, sizeof(g_Filename), file); + + /* Set states */ + InitGlobalStates(); + g_OverrideState = OVERRIDE_STATE_NONE; + + new SMCError:err = SMC_ParseFile(parser, g_Filename); + if (err != SMCError_Okay) + { + decl String:buffer[64]; + if (SMC_GetErrorString(err, buffer, sizeof(buffer))) + { + ParseError("%s", buffer); + } else { + ParseError("Fatal parse error"); + } + } +} + +ReadOverrides() +{ + InitializeOverrideParsers(); + InternalReadOverrides(g_hOldOverrideParser, "configs/admin_levels.cfg"); + InternalReadOverrides(g_hNewOverrideParser, "configs/admin_overrides.cfg"); +}