core/AdminCache.cpp
changeset 4081 241d291414e9
parent 4077 01e607ae37f0
child 4139 de7d1cd00703
     1.1 --- a/core/AdminCache.cpp	Sun Aug 25 14:04:01 2013 -0700
     1.2 +++ b/core/AdminCache.cpp	Sun Aug 25 21:39:07 2013 -0700
     1.3 @@ -218,19 +218,14 @@
     1.4  
     1.5  AdminCache::AdminCache()
     1.6  {
     1.7 -	m_pCmdOverrides = sm_trie_create();
     1.8 -	m_pCmdGrpOverrides = sm_trie_create();
     1.9  	m_pStrings = new BaseStringTable(1024);
    1.10  	m_pMemory = m_pStrings->GetMemTable();
    1.11  	m_FreeGroupList = m_FirstGroup = m_LastGroup = INVALID_GROUP_ID;
    1.12  	m_FreeUserList = m_FirstUser = m_LastUser = INVALID_ADMIN_ID;
    1.13 -	m_pGroups = sm_trie_create();
    1.14  	m_pCacheFwd = NULL;
    1.15  	m_FirstGroup = -1;
    1.16 -	m_pAuthTables = sm_trie_create();
    1.17  	m_InvalidatingAdmins = false;
    1.18  	m_destroying = false;
    1.19 -	m_pLevelNames = sm_trie_create();
    1.20  }
    1.21  
    1.22  AdminCache::~AdminCache()
    1.23 @@ -239,27 +234,15 @@
    1.24  	DumpAdminCache(AdminCache_Overrides, false);
    1.25  	DumpAdminCache(AdminCache_Groups, false);
    1.26  
    1.27 -	sm_trie_destroy(m_pCmdGrpOverrides);
    1.28 -	sm_trie_destroy(m_pCmdOverrides);
    1.29 -
    1.30 -	if (m_pGroups)
    1.31 -	{
    1.32 -		sm_trie_destroy(m_pGroups);
    1.33 -	}
    1.34 -
    1.35 -	List<AuthMethod>::iterator iter;
    1.36 +	List<AuthMethod *>::iterator iter;
    1.37  	for (iter=m_AuthMethods.begin();
    1.38  		 iter!=m_AuthMethods.end();
    1.39  		 iter++)
    1.40  	{
    1.41 -		sm_trie_destroy((*iter).table);
    1.42 +		delete *iter;
    1.43  	}
    1.44  
    1.45 -	sm_trie_destroy(m_pAuthTables);
    1.46 -
    1.47  	delete m_pStrings;
    1.48 -
    1.49 -	sm_trie_destroy(m_pLevelNames);
    1.50  }
    1.51  
    1.52  void AdminCache::OnSourceModStartup(bool late)
    1.53 @@ -332,66 +315,39 @@
    1.54  
    1.55  void AdminCache::NameFlag(const char *str, AdminFlag flag)
    1.56  {
    1.57 -	sm_trie_insert(m_pLevelNames, str, (void *)flag);
    1.58 +	m_LevelNames.insert(str, flag);
    1.59  }
    1.60  
    1.61  bool AdminCache::FindFlag(const char *str, AdminFlag *pFlag)
    1.62  {
    1.63 -	void *obj;
    1.64 -	if (!sm_trie_retrieve(m_pLevelNames, str, &obj))
    1.65 -	{
    1.66 -		return false;
    1.67 -	}
    1.68 -
    1.69 -	if (pFlag)
    1.70 -	{
    1.71 -		*pFlag = (AdminFlag)(int)obj;
    1.72 -	}
    1.73 -
    1.74 -	return true;
    1.75 +	return m_LevelNames.retrieve(str, pFlag);
    1.76  }
    1.77  
    1.78  void AdminCache::AddCommandOverride(const char *cmd, OverrideType type, FlagBits flags)
    1.79  {
    1.80 -	Trie *pTrie = NULL;
    1.81 +	FlagMap *map;
    1.82  	if (type == Override_Command)
    1.83 -	{
    1.84 -		pTrie = m_pCmdOverrides;
    1.85 -	} else if (type == Override_CommandGroup) {
    1.86 -		pTrie = m_pCmdGrpOverrides;
    1.87 -	} else {
    1.88 +		map = &m_CmdOverrides;
    1.89 +	else if (type == Override_CommandGroup)
    1.90 +		map = &m_CmdGrpOverrides;
    1.91 +	else
    1.92  		return;
    1.93 -	}
    1.94  
    1.95 -	sm_trie_insert(pTrie, cmd, (void *)(unsigned int)flags);
    1.96 -
    1.97 +	map->insert(cmd, flags);
    1.98  	g_ConCmds.UpdateAdminCmdFlags(cmd, type, flags, false);
    1.99  }
   1.100  
   1.101  bool AdminCache::GetCommandOverride(const char *cmd, OverrideType type, FlagBits *pFlags)
   1.102  {
   1.103 -	Trie *pTrie = NULL;
   1.104 -
   1.105 +	FlagMap *map;
   1.106  	if (type == Override_Command)
   1.107 -	{
   1.108 -		pTrie = m_pCmdOverrides;
   1.109 -	} else if (type == Override_CommandGroup) {
   1.110 -		pTrie = m_pCmdGrpOverrides;
   1.111 -	} else {
   1.112 +		map = &m_CmdOverrides;
   1.113 +	else if (type == Override_CommandGroup)
   1.114 +		map = &m_CmdGrpOverrides;
   1.115 +	else
   1.116  		return false;
   1.117 -	}
   1.118  
   1.119 -	void *object;
   1.120 -	if (sm_trie_retrieve(pTrie, cmd, &object))
   1.121 -	{
   1.122 -		if (pFlags)
   1.123 -		{
   1.124 -			*pFlags = (FlagBits)object;
   1.125 -		}
   1.126 -		return true;
   1.127 -	}
   1.128 -
   1.129 -	return false;
   1.130 +	return map->retrieve(cmd, pFlags);
   1.131  }
   1.132  
   1.133  void AdminCache::UnsetCommandOverride(const char *cmd, OverrideType type)
   1.134 @@ -406,36 +362,22 @@
   1.135  
   1.136  void AdminCache::_UnsetCommandGroupOverride(const char *group)
   1.137  {
   1.138 -	if (!m_pCmdGrpOverrides)
   1.139 -	{
   1.140 -		return;
   1.141 -	}
   1.142 -
   1.143 -	sm_trie_delete(m_pCmdGrpOverrides, group);
   1.144 -
   1.145 +	m_CmdGrpOverrides.remove(group);
   1.146  	g_ConCmds.UpdateAdminCmdFlags(group, Override_CommandGroup, 0, true);
   1.147  }
   1.148  
   1.149  void AdminCache::_UnsetCommandOverride(const char *cmd)
   1.150  {
   1.151 -	if (!m_pCmdOverrides)
   1.152 -	{
   1.153 -		return;
   1.154 -	}
   1.155 -
   1.156 -	sm_trie_delete(m_pCmdOverrides, cmd);
   1.157 -
   1.158 +	m_CmdOverrides.remove(cmd);
   1.159  	g_ConCmds.UpdateAdminCmdFlags(cmd, Override_Command, 0, true);
   1.160  }
   1.161  
   1.162  void AdminCache::DumpCommandOverrideCache(OverrideType type)
   1.163  {
   1.164 -	if (type == Override_Command && m_pCmdOverrides)
   1.165 -	{
   1.166 -		sm_trie_clear(m_pCmdOverrides);
   1.167 -	} else if (type == Override_CommandGroup && m_pCmdGrpOverrides) {
   1.168 -		sm_trie_clear(m_pCmdGrpOverrides);
   1.169 -	}
   1.170 +	if (type == Override_Command)
   1.171 +		m_CmdOverrides.clear();
   1.172 +	else if (type == Override_CommandGroup)
   1.173 +		m_CmdGrpOverrides.clear();
   1.174  }
   1.175  
   1.176  AdminId AdminCache::CreateAdmin(const char *name)
   1.177 @@ -499,10 +441,8 @@
   1.178  
   1.179  GroupId AdminCache::AddGroup(const char *group_name)
   1.180  {
   1.181 -	if (sm_trie_retrieve(m_pGroups, group_name, NULL))
   1.182 -	{
   1.183 +	if (m_Groups.contains(group_name))
   1.184  		return INVALID_GROUP_ID;
   1.185 -	}
   1.186  
   1.187  	GroupId id;
   1.188  	AdminGroup *pGroup;
   1.189 @@ -541,27 +481,19 @@
   1.190  	pGroup = (AdminGroup *)m_pMemory->GetAddress(id);
   1.191  	pGroup->nameidx = nameidx;
   1.192  
   1.193 -	sm_trie_insert(m_pGroups, group_name, (void *)id);
   1.194 -
   1.195 +	m_Groups.insert(group_name, id);
   1.196  	return id;
   1.197  }
   1.198  
   1.199  GroupId AdminCache::FindGroupByName(const char *group_name)
   1.200  {
   1.201 -	void *object;
   1.202 -
   1.203 -	if (!sm_trie_retrieve(m_pGroups, group_name, &object))
   1.204 -	{
   1.205 +	GroupId id;
   1.206 +	if (!m_Groups.retrieve(group_name, &id))
   1.207  		return INVALID_GROUP_ID;
   1.208 -	}
   1.209  
   1.210 -	GroupId id = (GroupId)object;
   1.211  	AdminGroup *pGroup = (AdminGroup *)m_pMemory->GetAddress(id);
   1.212 -
   1.213  	if (!pGroup || pGroup->magic != GRP_MAGIC_SET)
   1.214 -	{
   1.215  		return INVALID_GROUP_ID;
   1.216 -	}
   1.217  
   1.218  	return id;
   1.219  }
   1.220 @@ -771,25 +703,21 @@
   1.221  		return;
   1.222  	}
   1.223  
   1.224 -	Trie *pTrie = NULL;
   1.225 +	OverrideMap *map;
   1.226  	if (type == Override_Command)
   1.227  	{
   1.228  		if (pGroup->pCmdTable == NULL)
   1.229 -		{
   1.230 -			pGroup->pCmdTable = sm_trie_create();
   1.231 -		}
   1.232 -		pTrie = pGroup->pCmdTable;
   1.233 +			pGroup->pCmdTable = new OverrideMap();
   1.234 +		map = pGroup->pCmdTable;
   1.235  	} else if (type == Override_CommandGroup) {
   1.236  		if (pGroup->pCmdGrpTable == NULL)
   1.237 -		{
   1.238 -			pGroup->pCmdGrpTable = sm_trie_create();
   1.239 -		}
   1.240 -		pTrie = pGroup->pCmdGrpTable;
   1.241 +			pGroup->pCmdGrpTable = new OverrideMap();
   1.242 +		map = pGroup->pCmdGrpTable;
   1.243  	} else {
   1.244  		return;
   1.245  	}
   1.246  
   1.247 -	sm_trie_insert(pTrie, name, (void *)(int)rule);
   1.248 +	map->insert(name, rule);
   1.249  }
   1.250  
   1.251  bool AdminCache::GetGroupCommandOverride(GroupId id, const char *name, OverrideType type, OverrideRule *pRule)
   1.252 @@ -800,48 +728,33 @@
   1.253  		return false;
   1.254  	}
   1.255  
   1.256 -	Trie *pTrie = NULL;
   1.257 +	OverrideMap *map;
   1.258  	if (type == Override_Command)
   1.259  	{
   1.260  		if (pGroup->pCmdTable == NULL)
   1.261 -		{
   1.262  			return false;
   1.263 -		}
   1.264 -		pTrie = pGroup->pCmdTable;
   1.265 +		map = pGroup->pCmdTable;
   1.266  	} else if (type == Override_CommandGroup) {
   1.267  		if (pGroup->pCmdGrpTable == NULL)
   1.268 -		{
   1.269  			return false;
   1.270 -		}
   1.271 -		pTrie = pGroup->pCmdGrpTable;
   1.272 +		map = pGroup->pCmdGrpTable;
   1.273  	} else {
   1.274  		return false;
   1.275  	}
   1.276  
   1.277 -	void *object;
   1.278 -	if (!sm_trie_retrieve(pTrie, name, &object))
   1.279 -	{
   1.280 -		return false;
   1.281 -	}
   1.282 -
   1.283 -	if (pRule)
   1.284 -	{
   1.285 -		*pRule = (OverrideRule)(int)object;
   1.286 -	}
   1.287 -	
   1.288 -	return true;
   1.289 +	return map->retrieve(name, pRule);
   1.290  }
   1.291  
   1.292 -Trie *AdminCache::GetMethodByIndex(unsigned int index)
   1.293 +AuthMethod *AdminCache::GetMethodByIndex(unsigned int index)
   1.294  {
   1.295 -	List<AuthMethod>::iterator iter;
   1.296 +	List<AuthMethod *>::iterator iter;
   1.297  	for (iter=m_AuthMethods.begin();
   1.298  		 iter!=m_AuthMethods.end();
   1.299  		 iter++)
   1.300  	{
   1.301  		if (index-- == 0)
   1.302  		{
   1.303 -			return (*iter).table;
   1.304 +			return *iter;
   1.305  		}
   1.306  	}
   1.307  
   1.308 @@ -885,11 +798,9 @@
   1.309  	/* Unlink from auth tables */
   1.310  	if (pUser->auth.identidx != -1)
   1.311  	{
   1.312 -		Trie *pTrie = GetMethodByIndex(pUser->auth.index);
   1.313 -		if (pTrie)
   1.314 -		{
   1.315 -			sm_trie_delete(pTrie, m_pStrings->GetString(pUser->auth.identidx));
   1.316 -		}
   1.317 +		AuthMethod *method = GetMethodByIndex(pUser->auth.index);
   1.318 +		if (method)
   1.319 +			method->identities.remove(m_pStrings->GetString(pUser->auth.identidx));
   1.320  	}
   1.321  
   1.322  	/* Clear table counts */
   1.323 @@ -918,7 +829,7 @@
   1.324  	}
   1.325  
   1.326  	const char *str = m_pStrings->GetString(pGroup->nameidx);
   1.327 -	sm_trie_delete(m_pGroups, str);
   1.328 +	m_Groups.remove(str);
   1.329  
   1.330  	/* Unlink from the live dbllink list */
   1.331  	if (id == m_FirstGroup && id == m_LastGroup)
   1.332 @@ -940,17 +851,11 @@
   1.333  		pOther->prev_grp = pGroup->prev_grp;
   1.334  	}
   1.335  
   1.336 -	/* Free any used memory to be safe */
   1.337 -	if (pGroup->pCmdGrpTable)
   1.338 -	{
   1.339 -		sm_trie_destroy(pGroup->pCmdGrpTable);
   1.340 -		pGroup->pCmdGrpTable = NULL;
   1.341 -	}
   1.342 -	if (pGroup->pCmdTable)
   1.343 -	{
   1.344 -		sm_trie_destroy(pGroup->pCmdTable);
   1.345 -		pGroup->pCmdTable = NULL;
   1.346 -	}
   1.347 +	/* Free any used memory */
   1.348 +	delete pGroup->pCmdGrpTable;
   1.349 +	pGroup->pCmdGrpTable = NULL;
   1.350 +	delete pGroup->pCmdTable;
   1.351 +	pGroup->pCmdTable = NULL;
   1.352  
   1.353  	/* Link into the free list */
   1.354  	pGroup->magic = GRP_MAGIC_UNSET;
   1.355 @@ -1002,7 +907,7 @@
   1.356  	m_FreeGroupList = -1;
   1.357  
   1.358  	/* Nuke reverse lookups */
   1.359 -	sm_trie_clear(m_pGroups);
   1.360 +	m_Groups.clear();
   1.361  
   1.362  	/* Free memory on groups */
   1.363  	GroupId cur = m_FirstGroup;
   1.364 @@ -1011,14 +916,8 @@
   1.365  	{
   1.366  		pGroup = (AdminGroup *)m_pMemory->GetAddress(cur);
   1.367  		assert(pGroup->magic == GRP_MAGIC_SET);
   1.368 -		if (pGroup->pCmdGrpTable)
   1.369 -		{
   1.370 -			sm_trie_destroy(pGroup->pCmdGrpTable);
   1.371 -		}
   1.372 -		if (pGroup->pCmdTable)
   1.373 -		{
   1.374 -			sm_trie_destroy(pGroup->pCmdTable);
   1.375 -		}
   1.376 +		delete pGroup->pCmdGrpTable;
   1.377 +		delete pGroup->pCmdTable;
   1.378  		cur = pGroup->next_grp;
   1.379  	}
   1.380  
   1.381 @@ -1043,20 +942,12 @@
   1.382  
   1.383  void AdminCache::RegisterAuthIdentType(const char *name)
   1.384  {
   1.385 -	if (sm_trie_retrieve(m_pAuthTables, name, NULL))
   1.386 -	{
   1.387 +	if (m_AuthTables.contains(name))
   1.388  		return;
   1.389 -	}
   1.390 -
   1.391 -	Trie *pAuth = sm_trie_create();
   1.392  
   1.393 -	AuthMethod method;
   1.394 -	method.name.assign(name);
   1.395 -	method.table = pAuth;
   1.396 -
   1.397 +	AuthMethod *method = new AuthMethod(name);
   1.398  	m_AuthMethods.push_back(method);
   1.399 -
   1.400 -	sm_trie_insert(m_pAuthTables, name, pAuth);
   1.401 +	m_AuthTables.insert(name, method);
   1.402  }
   1.403  
   1.404  void AdminCache::InvalidateAdminCache(bool unlink_admins)
   1.405 @@ -1067,12 +958,12 @@
   1.406  		g_Players.ClearAllAdmins();
   1.407  	}
   1.408  	/* Wipe the identity cache first */
   1.409 -	List<AuthMethod>::iterator iter;
   1.410 +	List<AuthMethod *>::iterator iter;
   1.411  	for (iter=m_AuthMethods.begin();
   1.412  		 iter!=m_AuthMethods.end();
   1.413  		 iter++)
   1.414  	{
   1.415 -		sm_trie_clear((*iter).table);
   1.416 +		(*iter)->identities.clear();
   1.417  	}
   1.418  	
   1.419  	if (unlink_admins)
   1.420 @@ -1152,13 +1043,13 @@
   1.421  
   1.422  bool AdminCache::GetMethodIndex(const char *name, unsigned int *_index)
   1.423  {
   1.424 -	List<AuthMethod>::iterator iter;
   1.425 +	List<AuthMethod *>::iterator iter;
   1.426  	unsigned int index = 0;
   1.427  	for (iter=m_AuthMethods.begin();
   1.428  		 iter!=m_AuthMethods.end();
   1.429  		 iter++,index++)
   1.430  	{
   1.431 -		if ((*iter).name.compare(name) == 0)
   1.432 +		if ((*iter)->name.compare(name) == 0)
   1.433  		{
   1.434  			*_index = index;
   1.435  			return true;
   1.436 @@ -1181,11 +1072,9 @@
   1.437  		return false;
   1.438  	}
   1.439  
   1.440 -	Trie *pTable;
   1.441 -	if (!sm_trie_retrieve(m_pAuthTables, auth, (void **)&pTable))
   1.442 -	{
   1.443 +	AuthMethod *method;
   1.444 +	if (!m_AuthTables.retrieve(auth, &method))
   1.445  		return false;
   1.446 -	}
   1.447  
   1.448  	/* If the id was a steam id strip off the STEAM_*: part */
   1.449  	if (strcmp(auth, "steam") == 0 && strncmp(ident, "STEAM_", 6) == 0)
   1.450 @@ -1193,10 +1082,8 @@
   1.451  		ident += 8;
   1.452  	}
   1.453  
   1.454 -	if (sm_trie_retrieve(pTable, ident, NULL))
   1.455 -	{
   1.456 +	if (method->identities.contains(ident))
   1.457  		return false;
   1.458 -	}
   1.459  
   1.460  	int i_ident = m_pStrings->AddString(ident);
   1.461  
   1.462 @@ -1204,16 +1091,14 @@
   1.463  	pUser->auth.identidx = i_ident;
   1.464  	GetMethodIndex(auth, &pUser->auth.index);
   1.465  
   1.466 -	return sm_trie_insert(pTable, ident, (void **)id);
   1.467 +	return method->identities.insert(ident, id);
   1.468  }
   1.469  
   1.470  AdminId AdminCache::FindAdminByIdentity(const char *auth, const char *identity)
   1.471  {
   1.472 -	Trie *pTable;
   1.473 -	if (!sm_trie_retrieve(m_pAuthTables, auth, (void **)&pTable))
   1.474 -	{
   1.475 +	AuthMethod *method;
   1.476 +	if (!m_AuthTables.retrieve(auth, &method))
   1.477  		return INVALID_ADMIN_ID;
   1.478 -	}
   1.479  
   1.480  	/* If the id was a steam id strip off the STEAM_*: part */
   1.481  	if (strcmp(auth, "steam") == 0 && strncmp(identity, "STEAM_", 6) == 0)
   1.482 @@ -1221,13 +1106,10 @@
   1.483  		identity += 8;
   1.484  	}
   1.485  
   1.486 -	void *object;
   1.487 -	if (!sm_trie_retrieve(pTable, identity, &object))
   1.488 -	{
   1.489 +	AdminId id;
   1.490 +	if (!method->identities.retrieve(identity, &id))
   1.491  		return INVALID_ADMIN_ID;
   1.492 -	}
   1.493 -
   1.494 -	return (AdminId)object;
   1.495 +	return id;
   1.496  }
   1.497  
   1.498  void AdminCache::SetAdminFlag(AdminId id, AdminFlag flag, bool enabled)
   1.499 @@ -1797,56 +1679,30 @@
   1.500  	return g_ConCmds.CheckClientCommandAccess(client, cmd, bits) ? 1 : 0;
   1.501  }
   1.502  
   1.503 -void iterator_glob_basic_override(Trie *pTrie, const char *key, void **value, void *data)
   1.504 +void iterator_glob_basic_override(FILE *fp, const char *key, FlagBits flags)
   1.505  {
   1.506 -	FILE *fp;
   1.507 -	int flags;
   1.508  	char flagstr[64];
   1.509 -
   1.510 -	fp = (FILE *)data;
   1.511 -	flags = (int)*value;
   1.512  	g_Admins.FillFlagString(flags, flagstr, sizeof(flagstr));
   1.513 -
   1.514  	fprintf(fp, "\t\"%s\"\t\t\"%s\"\n", key, flagstr);
   1.515  }
   1.516  
   1.517 -void iterator_glob_grp_override(Trie *pTrie, const char *key, void **value, void *data)
   1.518 +void iterator_glob_grp_override(FILE *fp, const char *key, FlagBits flags)
   1.519  {
   1.520 -	FILE *fp;
   1.521 -	int flags;
   1.522  	char flagstr[64];
   1.523 -
   1.524 -	fp = (FILE *)data;
   1.525 -	flags = (int)*value;
   1.526  	g_Admins.FillFlagString(flags, flagstr, sizeof(flagstr));
   1.527 -
   1.528  	fprintf(fp, "\t\"@%s\"\t\t\"%s\"\n", key, flagstr);
   1.529  }
   1.530  
   1.531 -void iterator_group_basic_override(Trie *pTrie, const char *key, void **value, void *data)
   1.532 +void iterator_group_basic_override(FILE *fp, const char *key, OverrideRule rule)
   1.533  {
   1.534 -	FILE *fp;
   1.535 -	int flags;
   1.536 -	char flagstr[64];
   1.537 -
   1.538 -	fp = (FILE *)data;
   1.539 -	flags = (int)*value;
   1.540 -	g_Admins.FillFlagString(flags, flagstr, sizeof(flagstr));
   1.541 -
   1.542 -	fprintf(fp, "\t\t\t\"%s\"\t\t\"%s\"\n", key, flagstr);
   1.543 +	const char *str = (rule == Command_Allow) ? "allow" : "deny";
   1.544 +	fprintf(fp, "\t\t\t\"%s\"\t\t\"%s\"\n", key, str);
   1.545  }
   1.546  
   1.547 -void iterator_group_grp_override(Trie *pTrie, const char *key, void **value, void *data)
   1.548 +void iterator_group_grp_override(FILE *fp, const char *key, OverrideRule rule)
   1.549  {
   1.550 -	FILE *fp;
   1.551 -	int flags;
   1.552 -	char flagstr[64];
   1.553 -
   1.554 -	fp = (FILE *)data;
   1.555 -	flags = (int)*value;
   1.556 -	g_Admins.FillFlagString(flags, flagstr, sizeof(flagstr));
   1.557 -
   1.558 -	fprintf(fp, "\t\t\t\"@%s\"\t\t\"%s\"\n", key, flagstr);
   1.559 +	const char *str = (rule == Command_Allow) ? "allow" : "deny";
   1.560 +	fprintf(fp, "\t\t\t\"@%s\"\t\t\"%s\"\n", key, str);
   1.561  }
   1.562  
   1.563  void AdminCache::DumpCache(FILE *fp)
   1.564 @@ -1904,19 +1760,13 @@
   1.565  		fprintf(fp, "\n\t\t\"Overrides\"\n\t\t{\n");
   1.566  		if (pGroup->pCmdGrpTable != NULL)
   1.567  		{
   1.568 -			sm_trie_bad_iterator(pGroup->pCmdGrpTable, 
   1.569 -				name_buffer,
   1.570 -				sizeof(name_buffer),
   1.571 -				iterator_group_grp_override,
   1.572 -				fp);
   1.573 +			for (OverrideMap::iterator iter = pGroup->pCmdTable->iter(); !iter.empty(); iter.next())
   1.574 +				iterator_group_grp_override(fp, iter->key.chars(), iter->value);
   1.575  		}
   1.576  		if (pGroup->pCmdTable != NULL)
   1.577  		{
   1.578 -			sm_trie_bad_iterator(pGroup->pCmdTable, 
   1.579 -				name_buffer,
   1.580 -				sizeof(name_buffer),
   1.581 -				iterator_group_basic_override,
   1.582 -				fp);
   1.583 +			for (OverrideMap::iterator iter = pGroup->pCmdTable->iter(); !iter.empty(); iter.next())
   1.584 +				iterator_group_basic_override(fp, iter->key.chars(), iter->value);
   1.585  		}
   1.586  		fprintf(fp, "\t\t}\n");
   1.587  
   1.588 @@ -1990,22 +1840,10 @@
   1.589  	fprintf(fp, "}\n\n");
   1.590  
   1.591  	fprintf(fp, "\"Overrides\"\n{\n");
   1.592 -	if (m_pCmdGrpOverrides != NULL)
   1.593 -	{
   1.594 -		sm_trie_bad_iterator(m_pCmdGrpOverrides,
   1.595 -			name_buffer,
   1.596 -			sizeof(name_buffer),
   1.597 -			iterator_glob_grp_override,
   1.598 -			fp);
   1.599 -	}
   1.600 -	if (m_pCmdOverrides != NULL)
   1.601 -	{
   1.602 -		sm_trie_bad_iterator(m_pCmdOverrides,
   1.603 -			name_buffer, 
   1.604 -			sizeof(name_buffer), 
   1.605 -			iterator_glob_basic_override, 
   1.606 -			fp);
   1.607 -	}
   1.608 +	for (FlagMap::iterator iter = m_CmdGrpOverrides.iter(); !iter.empty(); iter.next())
   1.609 +		iterator_glob_grp_override(fp, iter->key.chars(), iter->value);
   1.610 +	for (FlagMap::iterator iter = m_CmdOverrides.iter(); !iter.empty(); iter.next())
   1.611 +		iterator_glob_basic_override(fp, iter->key.chars(), iter->value);
   1.612  	fprintf(fp, "}\n");
   1.613  }
   1.614  
   1.615 @@ -2037,14 +1875,14 @@
   1.616  
   1.617  const char *AdminCache::GetMethodName(unsigned int index)
   1.618  {
   1.619 -	List<AuthMethod>::iterator iter;
   1.620 +	List<AuthMethod *>::iterator iter;
   1.621  	for (iter=m_AuthMethods.begin();
   1.622  		iter!=m_AuthMethods.end();
   1.623  		iter++)
   1.624  	{
   1.625  		if (index-- == 0)
   1.626  		{
   1.627 -			return (*iter).name.c_str();
   1.628 +			return (*iter)->name.c_str();
   1.629  		}
   1.630  	}
   1.631