plugins/admin-flatfile/admin-overrides.sp
author Nicholas Hastings <skamonkey@gmail.com>
Sun Mar 17 11:39:04 2013 -0400 (2013-03-17)
changeset 3833 7563b32966af
parent 2289 44045ead61cd
permissions -rw-r--r--
Moved PCRE_STATIC def in Regex ext to extension instead of modifying pcre header (bug 5593).
ds@1330
     1
/**
ds@1330
     2
 * vim: set ts=4 :
ds@1330
     3
 * =============================================================================
ds@1330
     4
 * SourceMod Admin File Reader Plugin
ds@1330
     5
 * Reads overrides from the admin_levels.cfg file.  Do not compile
ds@1330
     6
 * this directly.
dvander@444
     7
 *
ds@1947
     8
 * SourceMod (C)2004-2008 AlliedModders LLC.  All rights reserved.
ds@1330
     9
 * =============================================================================
dvander@444
    10
 *
ds@1330
    11
 * This program is free software; you can redistribute it and/or modify it under
ds@1330
    12
 * the terms of the GNU General Public License, version 3.0, as published by the
ds@1330
    13
 * Free Software Foundation.
dvander@444
    14
 * 
ds@1330
    15
 * This program is distributed in the hope that it will be useful, but WITHOUT
ds@1330
    16
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
ds@1330
    17
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
ds@1330
    18
 * details.
ds@1330
    19
 *
ds@1330
    20
 * You should have received a copy of the GNU General Public License along with
ds@1330
    21
 * this program.  If not, see <http://www.gnu.org/licenses/>.
ds@908
    22
 *
ds@1330
    23
 * As a special exception, AlliedModders LLC gives you permission to link the
ds@1330
    24
 * code of this program (as well as its derivative works) to "Half-Life 2," the
ds@1330
    25
 * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
ds@1330
    26
 * by the Valve Corporation.  You must obey the GNU General Public License in
ds@1330
    27
 * all respects for all other code used.  Additionally, AlliedModders LLC grants
ds@1330
    28
 * this exception to all derivative works.  AlliedModders LLC defines further
ds@1330
    29
 * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
ds@1330
    30
 * or <http://www.sourcemod.net/license.php>.
ds@1330
    31
 *
ds@1330
    32
 * Version: $Id$
dvander@444
    33
 */
dvander@444
    34
dvander@437
    35
#define OVERRIDE_STATE_NONE			0
dvander@437
    36
#define OVERRIDE_STATE_LEVELS		1
dvander@437
    37
#define OVERRIDE_STATE_OVERRIDES	2
dvander@437
    38
dvander@1314
    39
static Handle:g_hOldOverrideParser = INVALID_HANDLE;
dvander@1314
    40
static Handle:g_hNewOverrideParser = INVALID_HANDLE;
dvander@437
    41
static g_OverrideState = OVERRIDE_STATE_NONE;
dvander@437
    42
dvander@1314
    43
public SMCResult:ReadOldOverrides_NewSection(Handle:smc, const String:name[], bool:opt_quotes)
dvander@437
    44
{
dvander@442
    45
	if (g_IgnoreLevel)
dvander@437
    46
	{
dvander@442
    47
		g_IgnoreLevel++;
dvander@442
    48
		return SMCParse_Continue;
dvander@437
    49
	}
dvander@437
    50
	
dvander@437
    51
	if (g_OverrideState == OVERRIDE_STATE_NONE)
dvander@437
    52
	{
dvander@437
    53
		if (StrEqual(name, "Levels"))
dvander@437
    54
		{
dvander@437
    55
			g_OverrideState = OVERRIDE_STATE_LEVELS;
dvander@442
    56
		} else {
dvander@442
    57
			g_IgnoreLevel++;
dvander@437
    58
		}
dvander@437
    59
	} else if (g_OverrideState == OVERRIDE_STATE_LEVELS) {
dvander@437
    60
		if (StrEqual(name, "Overrides"))
dvander@437
    61
		{
dvander@437
    62
			g_OverrideState = OVERRIDE_STATE_OVERRIDES;
dvander@442
    63
		} else {
dvander@442
    64
			g_IgnoreLevel++;
dvander@437
    65
		}
dvander@442
    66
	} else {
dvander@442
    67
		g_IgnoreLevel++;
dvander@437
    68
	}
dvander@437
    69
	
dvander@437
    70
	return SMCParse_Continue;
dvander@437
    71
}
dvander@437
    72
dvander@1314
    73
public SMCResult:ReadNewOverrides_NewSection(Handle:smc, const String:name[], bool:opt_quotes)
dvander@1314
    74
{
dvander@1314
    75
	if (g_IgnoreLevel)
dvander@1314
    76
	{
dvander@1314
    77
		g_IgnoreLevel++;
dvander@1314
    78
		return SMCParse_Continue;
dvander@1314
    79
	}
dvander@1314
    80
	
dvander@1314
    81
	if (g_OverrideState == OVERRIDE_STATE_NONE)
dvander@1314
    82
	{
dvander@1314
    83
		if (StrEqual(name, "Overrides"))
dvander@1314
    84
		{
dvander@1314
    85
			g_OverrideState = OVERRIDE_STATE_OVERRIDES;
dvander@1314
    86
		} else {
dvander@1314
    87
			g_IgnoreLevel++;
dvander@1314
    88
		}
dvander@1314
    89
	} else {
dvander@1314
    90
		g_IgnoreLevel++;
dvander@1314
    91
	}
dvander@1314
    92
	
dvander@1314
    93
	return SMCParse_Continue;
dvander@1314
    94
}
dvander@1314
    95
dvander@437
    96
public SMCResult:ReadOverrides_KeyValue(Handle:smc, 
dvander@437
    97
										const String:key[], 
dvander@437
    98
										const String:value[], 
dvander@437
    99
										bool:key_quotes, 
dvander@437
   100
										bool:value_quotes)
dvander@437
   101
{
dvander@442
   102
	if (g_OverrideState != OVERRIDE_STATE_OVERRIDES
dvander@442
   103
		|| g_IgnoreLevel)
dvander@437
   104
	{
dvander@437
   105
		return SMCParse_Continue;
dvander@437
   106
	}
dvander@437
   107
	
dvander@1298
   108
	new flags = ReadFlagString(value);
dvander@437
   109
	
dvander@437
   110
	if (key[0] == '@')
dvander@437
   111
	{
dvander@439
   112
		AddCommandOverride(key[1], Override_CommandGroup, flags);
dvander@437
   113
	} else {
dvander@439
   114
		AddCommandOverride(key, Override_Command, flags);
dvander@437
   115
	}
dvander@437
   116
	
dvander@437
   117
	return SMCParse_Continue;
dvander@437
   118
}
dvander@437
   119
dvander@1314
   120
public SMCResult:ReadOldOverrides_EndSection(Handle:smc)
dvander@437
   121
{
dvander@442
   122
	/* If we're ignoring, skip out */
dvander@442
   123
	if (g_IgnoreLevel)
dvander@442
   124
	{
dvander@442
   125
		g_IgnoreLevel--;
dvander@442
   126
		return SMCParse_Continue;
dvander@442
   127
	}
dvander@442
   128
	
dvander@437
   129
	if (g_OverrideState == OVERRIDE_STATE_LEVELS)
dvander@437
   130
	{
dvander@437
   131
		g_OverrideState = OVERRIDE_STATE_NONE;
dvander@437
   132
	} else if (g_OverrideState == OVERRIDE_STATE_OVERRIDES) {
dvander@437
   133
		/* We're totally done parsing */
dvander@437
   134
		g_OverrideState = OVERRIDE_STATE_LEVELS;
dvander@437
   135
		return SMCParse_Halt;
dvander@437
   136
	}
dvander@437
   137
	
dvander@437
   138
	return SMCParse_Continue;
dvander@437
   139
}
dvander@437
   140
dvander@1314
   141
public SMCResult:ReadNewOverrides_EndSection(Handle:smc)
dvander@437
   142
{
dvander@1314
   143
	/* If we're ignoring, skip out */
dvander@1314
   144
	if (g_IgnoreLevel)
dvander@1314
   145
	{
dvander@1314
   146
		g_IgnoreLevel--;
dvander@1314
   147
		return SMCParse_Continue;
dvander@1314
   148
	}
dvander@1314
   149
	
dvander@1314
   150
	if (g_OverrideState == OVERRIDE_STATE_OVERRIDES)
dvander@437
   151
	{
dvander@1314
   152
		g_OverrideState = OVERRIDE_STATE_NONE;
dvander@1314
   153
	}
dvander@1314
   154
	
dvander@1314
   155
	return SMCParse_Continue;
dvander@1314
   156
}
dvander@1314
   157
dvander@1432
   158
public SMCResult:ReadOverrides_CurrentLine(Handle:smc, const String:line[], lineno)
dvander@1432
   159
{
dvander@1432
   160
	g_CurrentLine = lineno;
dvander@1432
   161
	
dvander@1432
   162
	return SMCParse_Continue;
dvander@1432
   163
}
dvander@1432
   164
dvander@1314
   165
static InitializeOverrideParsers()
dvander@1314
   166
{
dvander@1314
   167
	if (g_hOldOverrideParser == INVALID_HANDLE)
dvander@1314
   168
	{
dvander@1314
   169
		g_hOldOverrideParser = SMC_CreateParser();
dvander@1314
   170
		SMC_SetReaders(g_hOldOverrideParser,
dvander@1314
   171
					   ReadOldOverrides_NewSection,
dvander@437
   172
					   ReadOverrides_KeyValue,
dvander@1314
   173
					   ReadOldOverrides_EndSection);
dvander@1432
   174
		SMC_SetRawLine(g_hOldOverrideParser, ReadOverrides_CurrentLine);
dvander@1314
   175
	}
dvander@1314
   176
	if (g_hNewOverrideParser == INVALID_HANDLE)
dvander@1314
   177
	{
dvander@1314
   178
		g_hNewOverrideParser = SMC_CreateParser();
dvander@1314
   179
		SMC_SetReaders(g_hNewOverrideParser,
dvander@1314
   180
					   ReadNewOverrides_NewSection,
dvander@1314
   181
					   ReadOverrides_KeyValue,
dvander@1314
   182
					   ReadNewOverrides_EndSection);
dvander@1432
   183
		SMC_SetRawLine(g_hNewOverrideParser, ReadOverrides_CurrentLine);
dvander@437
   184
	}
dvander@437
   185
}
dvander@437
   186
dvander@1314
   187
InternalReadOverrides(Handle:parser, const String:file[])
dvander@437
   188
{
dvander@1314
   189
	BuildPath(Path_SM, g_Filename, sizeof(g_Filename), file);
dvander@437
   190
	
dvander@437
   191
	/* Set states */
dvander@442
   192
	InitGlobalStates();
dvander@437
   193
	g_OverrideState = OVERRIDE_STATE_NONE;
dvander@437
   194
		
dvander@1314
   195
	new SMCError:err = SMC_ParseFile(parser, g_Filename);
dvander@437
   196
	if (err != SMCError_Okay)
dvander@437
   197
	{
dvander@437
   198
		decl String:buffer[64];
dvander@437
   199
		if (SMC_GetErrorString(err, buffer, sizeof(buffer)))
dvander@437
   200
		{
dvander@442
   201
			ParseError("%s", buffer);
dvander@437
   202
		} else {
dvander@442
   203
			ParseError("Fatal parse error");
dvander@437
   204
		}
dvander@437
   205
	}
dvander@437
   206
}
dvander@1314
   207
dvander@1314
   208
ReadOverrides()
dvander@1314
   209
{
dvander@1314
   210
	InitializeOverrideParsers();
dvander@1314
   211
	InternalReadOverrides(g_hOldOverrideParser, "configs/admin_levels.cfg");
dvander@1314
   212
	InternalReadOverrides(g_hNewOverrideParser, "configs/admin_overrides.cfg");
dvander@1314
   213
}