4 #include "HexXmlTree.hxx"
8 enum { HEND_FILE = -2, HEND_LINE = -1, CRLF = 13 };
10 // ====================================================== Constructeur
11 XmlTree::XmlTree (const string& nom, XmlTree* dad)
25 // ====================================================== Destructeur
29 // ====================================================== findChild
30 XmlTree* XmlTree::findChild (const string& nom)
32 for (int nro = 0 ; nro<nbr_items ; nro++)
34 if (nom == tab_items [nro]->item_name)
35 return tab_items [nro];
39 // ====================================================== findAttribute
40 int XmlTree::findAttribute (const string& nom)
42 for (int nro = 0 ; nro<nbr_attributs ; nro++)
44 if (nom == tab_attributs [nro])
49 // ====================================================== findValue
50 const string& XmlTree::findValue (const string& nom)
52 for (int nro = 0 ; nro<nbr_attributs ; nro++)
54 if (nom == tab_attributs [nro])
55 return tab_values [nro];
59 // ====================================================== parseFile
60 int XmlTree::parseFile (const string& ficnom)
67 fic_xml = fopen (ficnom.c_str(), "r");
71 enum EnumEtat { M_PREMS, M_BALISE_OUVERTE, M_NEUTRE };
72 EnumEtat etat = M_PREMS;
76 string nom, valeur, foo;
77 while ((item_lu=readItem (nom)) != M_NONE)
82 item_lu = getItem (nom, M_IDENT);
86 node = node -> addChild (nom);
87 etat = M_BALISE_OUVERTE;
91 if (etat != M_BALISE_OUVERTE)
92 putError (" balise ouverte");
97 if (etat == M_BALISE_OUVERTE)
98 putError (" balise ouverte");
99 getItem (nom, M_IDENT);
100 getItem (foo, M_END);
101 node = node -> getParent ();
105 if (etat != M_BALISE_OUVERTE)
106 putError (" balise deja fermee");
107 node = node -> getParent ();
112 getItem (valeur, M_EQUALS);
113 getItem (valeur, M_STRING);
114 node -> addAttribut (nom, valeur);
117 case M_COMMENT : goTo ("-->");
120 case M_PROLOG : goTo ("?>");
128 putError ("Item incorrect");
133 // ====================================================== getItem
134 EnumItem XmlTree::getItem (string& value, EnumItem waited)
136 EnumItem item = readItem (value);
140 putError ("Erreur de sequence");
143 // ====================================================== readItem
144 EnumItem XmlTree::readItem (string& value)
150 if (fic_pos>=len_buffer)
158 char car = fic_buffer [fic_pos++];
169 else if (isalpha (car))
175 char ncar = fic_pos >= len_buffer ? ' ' : fic_buffer [fic_pos];
176 if (car=='/' && ncar == '>')
186 return M_BEGIN_CLOSE;
204 // ====================================================== getIdent
205 int XmlTree::getIdent (string& ident)
209 for (int nc=fic_pos-1; nc<len_buffer ; nc++)
211 char car = fic_buffer[nc];
214 ident.push_back (car);
223 fic_pos = len_buffer;
226 // ====================================================== goTo
227 int XmlTree::goTo (cpchar ouca)
229 int nbc = strlen (ouca) - 1;
233 while ((car = getChar ()) != EOF)
245 // ====================================================== getString
246 int XmlTree::getString (string& chaine)
251 while ((car = getChar ()) != EOF)
255 chaine.push_back (car);
260 // ====================================================== getChar
261 int XmlTree::getChar ()
265 if (fic_pos<len_buffer)
268 return fic_buffer [fic_pos-1];
270 int ier = readLine ();
277 // ====================================================== readLine
278 int XmlTree::readLine ()
284 if (fic_xml==NULL || feof (fic_xml))
289 while (ier==HEND_LINE)
291 int carac = fgetc (fic_xml);
292 if (carac==EOL || carac==CRLF)
298 fic_buffer.push_back (carac);
301 else if (len_buffer > 0)
308 // ====================================================== putError
309 void XmlTree::putError (cpchar mess)
311 printf (" ***** Erreur : %s\n", mess);
312 printf (" +++ Derniere ligne lue : nro %d, %deme caractere\n",
314 printf ("%s\n", fic_buffer.c_str());
317 // ====================================================== addChild
318 XmlTree* XmlTree::addChild (const string& nom)
320 XmlTree* child = new XmlTree (nom, this);
321 tab_items.push_back (child);
325 // ====================================================== addAttribut
326 void XmlTree::addAttribut (const string& nom, const string& value)
328 tab_attributs.push_back (nom);
329 tab_values .push_back (value);
331 // printf (" %s = %s\n", nom.c_str(), value.c_str());
333 // ====================================================== dump
334 void XmlTree::dump (int niveau)
337 for (int niv=0 ; niv<niveau ; niv++)
340 cout << marge << item_name << endl;
342 for (int nc=0 ; nc<nbr_attributs ; nc++)
344 cout << marge << " : "
345 << tab_attributs [nc] << " = '" << tab_values [nc]
349 for (int nc=0 ; nc<nbr_items ; nc++)
351 tab_items [nc]->dump (niveau+1);