initial commit, lordsawar source, slightly modified
[lordsawar] / src / namelist.cpp
1 //  Copyright (C) 2009, Ben Asselstine
2 //
3 //  This program is free software; you can redistribute it and/or modify
4 //  it under the terms of the GNU General Public License as published by
5 //  the Free Software Foundation; either version 3 of the License, or
6 //  (at your option) any later version.
7 //
8 //  This program is distributed in the hope that it will be useful,
9 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
10 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 //  GNU Library General Public License for more details.
12 //
13 //  You should have received a copy of the GNU General Public License
14 //  along with this program; if not, write to the Free Software
15 //  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 
16 //  02110-1301, USA.
17
18 #include <iostream>
19 #include <expat.h>
20 #include <sigc++/functors/mem_fun.h>
21
22 #include "namelist.h"
23 #include "File.h"
24
25 using namespace std;
26
27 #define debug(x) {cerr<<__FILE__<<": "<<__LINE__<<": "<<x<<endl<<flush;}
28 //#define debug(x)
29
30
31 NameList::NameList(std::string filename, std::string item_tag)
32 {
33   d_item_tag = item_tag;
34   XML_Helper helper(File::getMiscFile(filename), ios::in, false);
35
36   helper.registerTag(d_item_tag, sigc::mem_fun((*this), &NameList::load));
37
38   if (!helper.parse())
39     {
40       std::cerr << "Error, while loading a name from  " << filename <<std::endl <<std::flush;
41       exit(-1);
42     }
43
44   return;
45 }
46
47 NameList::~NameList()
48 {
49 }
50
51 bool NameList::load(std::string tag, XML_Helper *helper)
52 {
53   if (tag == d_item_tag)
54     {
55       std::string name;
56       helper->getData(name, "name");
57       push_back(name); 
58     }
59   return true;
60 }
61
62 std::string NameList::popRandomName()
63 {
64   std::string name;
65   if (empty())
66     return "";
67   int randno = rand() % size();
68   name = (*this)[randno];
69
70   NameList::iterator it = std::find(begin(), end(), name);
71   if (it != end())
72     erase(it);
73
74   return name;
75 }
76