/* AMX Mod X * * by the AMX Mod X Development Team * originally developed by OLO * * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * 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, write to the Free Software Foundation, * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * In addition, as a special exception, the author gives permission to * link the code of this program with the Half-Life Game Engine ("HL * Engine") and Modified Game Libraries ("MODs") developed by Valve, * L.L.C ("Valve"). You must obey the GNU General Public License in all * respects for all of the code used other than the HL Engine and MODs * from Valve. If you modify this file, you may extend this exception * to your version of the file, but you are not obligated to do so. If * you do not wish to do so, delete this exception statement from your * version. */ #include #include #include #include "amxmodx.h" #include "CVault.h" #include "CFile.h" // ***************************************************** // class Vault // ***************************************************** bool Vault::exists( const char* k ) { if ( *k == 0 ) return false; return *find( k ) != 0; } void Vault::put( const char* k, const char* v ) { if ( *k == 0 ) return; if ( *v == 0 ) { remove( k ); return; } Obj** a = find( k ); if ( *a ) { (*a)->value.assign(v); (*a)->number = atoi( v ); } else *a = new Obj( k , v ); } Vault::Obj::Obj( const char* k, const char* v): key(k) , value(v) , next(0) { number = atoi(v); } Vault::Obj** Vault::find( const char* n ) { Obj** a = &head; while( *a ) { if ( strcmp((*a)->key.c_str(), n) == 0 ) return a; a = &(*a)->next; } return a; } int Vault::get_number( const char* n ) { if ( *n == 0 ) return 0; Obj* b = *find( n ); if ( b == 0 ) return 0; return b->number; } const char* Vault::get( const char* n ) { if ( *n == 0 ) return ""; Obj* b = *find( n ); if ( b == 0 ) return ""; return b->value.c_str(); } void Vault::clear() { while ( head ) { Obj* a = head->next; delete head; head = a; } } void Vault::remove( const char* n ) { Obj** b = find( n ); if ( *b == 0 ) return; Obj* a = (*b)->next; delete *b; *b = a; } void Vault::setSource( const char* n ) { path.assign(n); } bool Vault::loadVault( ) { if ( path.empty() ) return false; clear(); File a( path.c_str() , "r" ); if ( !a ) return false; const int sz = 512; char value[sz+1]; char key[sz+1]; while ( a >> key && a.skipWs() && a.getline( value , sz ) ) { if ( isalpha ( *key ) ) put( key, value ); } return true; } bool Vault::saveVault( ) { if ( path.empty() ) return false; File a( path.c_str() , "w" ); if ( !a ) return false; a << "; Don't modify!" << '\n'; for (Obj* b = head; b ;b = b->next) a << b->key << '\t' << b->value << '\n'; return true; }