[7297] Fixed profession spells sorting in trainer spell list at client.
[getmangos.git] / dep / ACE_wrappers / ace / Capabilities.cpp
blob5d46e75472aa76a75ad780f293f90c9f43886c0d
1 #include "ace/Capabilities.h"
2 #include "ace/OS_NS_ctype.h"
3 #include "ace/OS_Memory.h"
4 #include "ace/OS_NS_string.h"
6 #if !defined (__ACE_INLINE__)
7 #include "ace/Capabilities.inl"
8 #endif /* !__ACE_INLINE__ */
10 #include "ace/OS_NS_stdio.h"
12 ACE_RCSID (ace,
13 Capabilities,
14 "$Id: Capabilities.cpp 80826 2008-03-04 14:51:23Z wotte $")
17 #define ACE_ESC ((ACE_TCHAR)0x1b)
19 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
21 ACE_CapEntry::~ACE_CapEntry (void)
25 ACE_Capabilities::ACE_Capabilities (void)
26 : caps_ ()
30 ACE_Capabilities::~ACE_Capabilities (void)
32 this->resetcaps ();
35 const ACE_TCHAR *
36 ACE_Capabilities::parse (const ACE_TCHAR *buf, ACE_TString &cap)
38 while (*buf != ACE_TEXT ('\0') && *buf != ACE_TEXT (','))
40 if (*buf == ACE_TEXT ('\\'))
42 ++buf;
43 if (*buf == ACE_TEXT ('E') || *buf == ACE_TEXT ('e'))
45 cap += ACE_ESC;
46 ++buf;
47 continue;
49 else if (*buf == ACE_TEXT ('r'))
51 cap += ACE_TEXT ('\r');
52 ++buf;
53 continue;
55 else if (*buf == ACE_TEXT ('n'))
57 cap += ACE_TEXT ('\n');
58 ++buf;
59 continue;
61 else if (*buf == ACE_TEXT ('t'))
63 cap += ACE_TEXT ('\t');
64 ++buf;
65 continue;
67 else if (*buf == ACE_TEXT ('\\'))
69 cap += *buf++;
70 continue;
72 if (ACE_OS::ace_isdigit(*buf))
74 // @@ UNICODE Does this work with unicode?
75 int oc = 0;
76 for (int i = 0;
77 i < 3 && *buf && ACE_OS::ace_isdigit (*buf);
78 i++)
79 oc = oc * 8 + (*buf++ - ACE_TEXT ('0'));
81 cap += (ACE_TCHAR) oc;
82 continue;
85 cap += *buf++;
87 return buf;
90 const ACE_TCHAR *
91 ACE_Capabilities::parse (const ACE_TCHAR *buf, int &cap)
93 int n = 0;
95 while (*buf && ACE_OS::ace_isdigit (*buf))
96 n = n * 10 + (*buf++ - ACE_TEXT ('0'));
98 cap = n;
100 return buf;
103 void
104 ACE_Capabilities::resetcaps (void)
106 for (CAPABILITIES_MAP::ITERATOR iter (this->caps_);
107 !iter.done ();
108 iter.advance ())
110 CAPABILITIES_MAP::ENTRY *entry = 0;
111 iter.next (entry);
112 delete entry->int_id_;
115 this->caps_.close ();
116 this->caps_.open ();
120 ACE_Capabilities::fillent (const ACE_TCHAR *buf)
122 this->resetcaps ();
123 while (*buf)
125 ACE_TString s;
126 int n;
127 ACE_TString name;
128 ACE_CapEntry *ce;
130 // Skip blanks
131 while (*buf && ACE_OS::ace_isspace(*buf)) buf++;
132 // If we get end of line return
134 if (*buf == ACE_TEXT ('\0'))
135 break;
137 if (*buf == ACE_TEXT ('#'))
139 while (*buf && *buf != ACE_TEXT ('\n'))
140 buf++;
141 if (*buf == ACE_TEXT ('\n'))
142 buf++;
143 continue;
145 while(*buf && *buf != ACE_TEXT ('=')
146 && *buf!= ACE_TEXT ('#')
147 && *buf != ACE_TEXT (','))
148 name += *buf++;
150 // If name is null.
151 switch (*buf)
153 case ACE_TEXT ('='):
154 // String property
155 buf = this->parse (buf + 1, s);
156 ACE_NEW_RETURN (ce,
157 ACE_StringCapEntry (s),
158 -1);
159 if (this->caps_.bind (name, ce) == -1)
161 delete ce;
162 return -1;
164 break;
165 case ACE_TEXT ('#'):
166 // Integer property
167 buf = this->parse (buf + 1, n);
168 ACE_NEW_RETURN (ce,
169 ACE_IntCapEntry (n),
170 -1);
171 if (this->caps_.bind (name, ce) == -1)
173 delete ce;
174 return -1;
176 break;
177 case ACE_TEXT (','):
178 // Boolean
179 ACE_NEW_RETURN (ce,
180 ACE_BoolCapEntry (1),
181 -1);
182 if (this->caps_.bind (name, ce) == -1)
184 delete ce;
185 return -1;
187 break;
188 default:
189 return 0;
192 if (*buf++ != ACE_TEXT (','))
193 return -1;
196 return 0;
200 ACE_Capabilities::is_entry (const ACE_TCHAR *name, const ACE_TCHAR *line)
202 for (;;)
204 // Skip blanks or irrelevant characters
205 while (*line && ACE_OS::ace_isspace(*line))
206 ++line;
208 // End of line reached
209 if (*line == ACE_TEXT ('\0'))
210 break;
212 // Build the entry name
213 ACE_TString nextname;
214 while (*line && *line != ACE_TEXT ('|') && *line != ACE_TEXT (','))
215 nextname += *line++;
217 // We have found the required entry?
218 if (ACE_OS::strcmp (nextname.c_str (), name) == 0)
219 return 1;
221 // Skip puntuaction char if neccesary.
222 if (*line == ACE_TEXT ('|') || *line == ACE_TEXT (','))
223 ++line;
224 else
226 ACE_DEBUG ((LM_DEBUG,
227 ACE_TEXT ("Invalid entry\n")));
228 break;
231 return 0;
235 ACE_Capabilities::getline (FILE *fp, ACE_TString &line)
237 int ch;
239 line.set (0, 0);
241 while ((ch = ACE_OS::fgetc (fp)) != EOF && ch != ACE_TEXT ('\n'))
242 line += (ACE_TCHAR) ch;
244 if (ch == EOF && line.length () == 0)
245 return -1;
246 else
247 return 0;
251 ACE_Capabilities::getval (const ACE_TCHAR *keyname, ACE_TString &val)
253 ACE_CapEntry* cap = 0;
254 if (this->caps_.find (keyname, cap) == -1)
255 return -1;
257 ACE_StringCapEntry *scap =
258 dynamic_cast<ACE_StringCapEntry *> (cap);
259 if (scap == 0)
260 return -1;
262 val = scap->getval ();
263 return 0;
267 ACE_Capabilities::getval (const ACE_TCHAR *keyname, int &val)
269 ACE_CapEntry *cap = 0;
270 if (this->caps_.find (keyname, cap) == -1)
271 return -1;
273 ACE_IntCapEntry *icap =
274 dynamic_cast<ACE_IntCapEntry *> (cap);
275 if (icap != 0)
277 val = icap->getval ();
278 return 0;
281 ACE_BoolCapEntry *bcap =
282 dynamic_cast<ACE_BoolCapEntry *> (cap);
284 if (bcap == 0)
285 return -1;
287 val = bcap->getval ();
288 return 0;
291 #if !defined (ACE_IS_SPLITTING)
292 static int
293 is_empty (const ACE_TCHAR *line)
295 while (*line && ACE_OS::ace_isspace (*line))
296 ++line;
298 return *line == ACE_TEXT ('\0') || *line == ACE_TEXT ('#');
301 static int
302 is_line (const ACE_TCHAR *line)
304 while (*line && ACE_OS::ace_isspace (*line))
305 ++line;
307 return *line != ACE_TEXT ('\0');
309 #endif /* !ACE_IS_SPLITTING */
312 ACE_Capabilities::getent (const ACE_TCHAR *fname, const ACE_TCHAR *name)
314 FILE *fp = ACE_OS::fopen (fname, ACE_TEXT ("r"));
316 if (fp == 0)
317 ACE_ERROR_RETURN ((LM_ERROR,
318 ACE_TEXT ("Can't open %s file\n"),
319 fname),
320 -1);
322 int done;
323 ACE_TString line;
325 while (0 == (done = (this->getline (fp, line) == -1))
326 && is_empty (line.c_str ()))
327 continue;
329 while (!done)
331 ACE_TString newline;
332 ACE_TString description;
334 while (0 == (done = (this->getline (fp, newline) == -1)))
335 if (is_line (newline.c_str ()))
336 description += newline;
337 else
338 break;
340 if (this->is_entry (name, line.c_str()))
342 ACE_OS::fclose (fp);
343 return this->fillent (description.c_str ());
346 line = newline;
347 while (!done && is_empty (line.c_str ()))
348 done = this->getline (fp, line) == -1;
351 ACE_OS::fclose (fp);
352 return -1;
355 ACE_END_VERSIONED_NAMESPACE_DECL