/* 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; }