Code

add line number to Element
authorishmal <ishmal@users.sourceforge.net>
Sat, 3 Mar 2007 22:59:22 +0000 (22:59 +0000)
committerishmal <ishmal@users.sourceforge.net>
Sat, 3 Mar 2007 22:59:22 +0000 (22:59 +0000)
src/dom/minidom.cpp
src/dom/minidom.h

index 5afcfe5ee048596237f2068f96de5de3f62e2770..86ab36ce3ad0c6a5aeb5f4babc9486da68e20a2b 100644 (file)
@@ -136,11 +136,24 @@ static EntityEntry entities[] =
 
 
 
-void Parser::getLineAndColumn(long pos, long *lineNr, long *colNr)
+int Parser::countLines(int begin, int end)
 {
-    long line = 1;
-    long col  = 1;
-    for (long i=0 ; i<pos ; i++)
+    int count = 0;
+    for (int i=begin ; i<end ; i++)
+        {
+        XMLCh ch = parsebuf[i];
+        if (ch == '\n' || ch == '\r')
+            count++;
+        }
+    return count;
+}
+
+
+void Parser::getLineAndColumn(int pos, int *lineNr, int *colNr)
+{
+    int line = 1;
+    int col  = 1;
+    for (int i=0 ; i<pos ; i++)
         {
         XMLCh ch = parsebuf[i];
         if (ch == '\n' || ch == '\r')
@@ -159,8 +172,8 @@ void Parser::getLineAndColumn(long pos, long *lineNr, long *colNr)
 
 void Parser::error(char *fmt, ...)
 {
-    long lineNr;
-    long colNr;
+    int lineNr;
+    int colNr;
     getLineAndColumn(currentPosition, &lineNr, &colNr);
     va_list args;
     fprintf(stderr, "xml error at line %ld, column %ld:", lineNr, colNr);
@@ -172,7 +185,7 @@ void Parser::error(char *fmt, ...)
 
 
 
-int Parser::peek(long pos)
+int Parser::peek(int pos)
 {
     if (pos >= parselen)
         return -1;
@@ -184,7 +197,7 @@ int Parser::peek(long pos)
 
 
 
-int Parser::match(long p0, const char *text)
+int Parser::match(int p0, const char *text)
 {
     int p = p0;
     while (*text)
@@ -198,7 +211,7 @@ int Parser::match(long p0, const char *text)
 
 
 
-int Parser::skipwhite(long p)
+int Parser::skipwhite(int p)
 {
 
     while (p<parselen)
@@ -350,7 +363,7 @@ int Parser::parseDoctype(int p0)
     return p;
 }
 
-int Parser::parseElement(int p0, Element *par,int depth)
+int Parser::parseElement(int p0, Element *par,int lineNr)
 {
 
     int p = p0;
@@ -375,6 +388,7 @@ int Parser::parseElement(int p0, Element *par,int depth)
     //Add element to tree
     Element *n = new Element(openTagName);
     n->parent = par;
+    n->line = lineNr + countLines(p0, p);
     par->addChild(n);
 
     // Get attributes
@@ -468,7 +482,7 @@ int Parser::parseElement(int p0, Element *par,int depth)
         //# CHILD ELEMENT
         if (ch == '<')
             {
-            p2 = parseElement(p, n, depth+1);
+            p2 = parseElement(p, n, lineNr + countLines(p0, p));
             if (p2 == p)
                 {
                 /*
@@ -560,7 +574,7 @@ Element *Parser::parse(XMLCh *buf,int pos,int len)
     Element *rootNode = new Element("root");
     pos = parseVersion(pos);
     pos = parseDoctype(pos);
-    pos = parseElement(pos, rootNode, 0);
+    pos = parseElement(pos, rootNode, 1);
     return rootNode;
 }
 
index 30b53dd181893807f14f8f4542b212213d653a11..b1ad82f0759fd420c2560e5455171910691a7404 100644 (file)
@@ -82,6 +82,7 @@ class Element
 friend class Parser;
 
 public:
+
     Element()
         {
         parent = NULL;
@@ -127,6 +128,9 @@ public:
 
     std::vector<Element *> getChildren()
         { return children; }
+        
+    int getLine()
+        { return line; }
 
     std::vector<Element *> findElements(const DOMString &name);
 
@@ -170,6 +174,8 @@ protected:
 
     DOMString name;
     DOMString value;
+    
+    int line;
 
 };
 
@@ -180,6 +186,7 @@ protected:
 class Parser
 {
 public:
+
     Parser()
         { init(); }
 
@@ -226,15 +233,17 @@ private:
         currentPosition = 0;
         }
 
-    void getLineAndColumn(long pos, long *lineNr, long *colNr);
+    int countLines(int begin, int end);
+
+    void getLineAndColumn(int pos, int *lineNr, int *colNr);
 
     void error(char *fmt, ...);
 
-    int peek(long pos);
+    int peek(int pos);
 
-    int match(long pos, const char *text);
+    int match(int pos, const char *text);
 
-    int skipwhite(long p);
+    int skipwhite(int p);
 
     int getWord(int p0, DOMString &buf);
 
@@ -250,10 +259,10 @@ private:
 
     bool         keepGoing;
     Element      *currentNode;
-    long         parselen;
+    int          parselen;
     XMLCh        *parsebuf;
     DOMString    cdatabuf;
-    long         currentPosition;
+    int          currentPosition;
     int          colNr;