Index: pkpgcounter/trunk/pdlanalyzer/dvi.py
===================================================================
--- pkpgcounter/trunk/pdlanalyzer/dvi.py (revision 216)
+++ pkpgcounter/trunk/pdlanalyzer/dvi.py (revision 216)
@@ -0,0 +1,85 @@
+#! /usr/bin/env python
+# -*- coding: ISO-8859-15 -*-
+#
+# pkpgcounter : a generic Page Description Language parser
+#
+# (c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# $Id$
+#
+
+import sys
+import os
+import mmap
+from struct import unpack
+
+from pdlanalyzer import pdlparser
+
+class DVIParser(pdlparser.PDLParser) :
+    """A parser for DVI documents."""
+    def getJobSize(self) :
+        """Counts pages in a DVI document.
+        
+           Algorithm by Jerome Alet.
+           
+           The documentation used for this was :
+         
+           http://www.math.umd.edu/~asnowden/comp-cont/dvi.html
+        """
+        infileno = self.infile.fileno()
+        minfile = mmap.mmap(infileno, os.fstat(infileno)[6], prot=mmap.PROT_READ, flags=mmap.MAP_SHARED)
+        pagecount = 0
+        pos = -1
+        eofchar = chr(0xdf)
+        postchar = chr(0xf8)
+        try :
+            while minfile[pos] == eofchar :
+                pos -= 1
+            idbyte = minfile[pos]    
+            if idbyte != minfile[1] :
+                raise IndexError, "Invalid DVI file."
+            pos = unpack(">I", minfile[pos - 4:pos])[0]
+            if minfile[pos] != postchar :
+                raise IndexError, "Invalid DVI file."
+            pagecount = unpack(">H", minfile[pos + 27: pos + 29])[0]
+        except IndexError : # EOF ?
+            minfile.close() # reached EOF
+        return pagecount
+        
+def test() :        
+    """Test function."""
+    if (len(sys.argv) < 2) or ((not sys.stdin.isatty()) and ("-" not in sys.argv[1:])) :
+        sys.argv.append("-")
+    totalsize = 0    
+    for arg in sys.argv[1:] :
+        if arg == "-" :
+            infile = sys.stdin
+            mustclose = 0
+        else :    
+            infile = open(arg, "rb")
+            mustclose = 1
+        try :
+            parser = DVIParser(infile, debug=1)
+            totalsize += parser.getJobSize()
+        except pdlparser.PDLParserError, msg :    
+            sys.stderr.write("ERROR: %s\n" % msg)
+            sys.stderr.flush()
+        if mustclose :    
+            infile.close()
+    print "%s" % totalsize
+    
+if __name__ == "__main__" :    
+    test()
Index: pkpgcounter/trunk/pdlanalyzer/analyzer.py
===================================================================
--- pkpgcounter/trunk/pdlanalyzer/analyzer.py (revision 211)
+++ pkpgcounter/trunk/pdlanalyzer/analyzer.py (revision 216)
@@ -23,5 +23,5 @@
 import tempfile
 
-from pdlanalyzer import version, pdlparser, postscript, pdf, pcl345, pclxl, escp2
+from pdlanalyzer import version, pdlparser, postscript, pdf, pcl345, pclxl, escp2, dvi
 
 KILOBYTE = 1024    
@@ -57,4 +57,5 @@
             psyco.bind(pcl345.PCL345Parser.getJobSize)
             psyco.bind(pclxl.PCLXLParser.getJobSize)
+            psyco.bind(dvi.DVIParser.getJobSize)
         
     def getJobSize(self) :    
@@ -172,4 +173,13 @@
             if self.debug :  
                 sys.stderr.write("%s is an ESC/P2 file\n" % str(self.filename))
+            return 1
+        else :    
+            return 0
+            
+    def isDVI(self, sdata, edata) :        
+        """Returns 1 if data is DVI, else 0."""
+        if (ord(sdata[0]) == 0xf7) and (ord(edata[-1]) == 0xdf) :
+            if self.debug :  
+                sys.stderr.write("%s is an DVI file\n" % str(self.filename))
             return 1
         else :    
@@ -200,4 +210,6 @@
         elif self.isESCP2(firstblock, lastblock) :    
             return escp2.ESCP2Parser
+        elif self.isDVI(firstblock, lastblock) :    
+            return dvi.DVIParser
         else :    
             raise pdlparser.PDLParserError, "Analysis of first data block failed."
Index: pkpgcounter/trunk/pdlanalyzer/version.py
===================================================================
--- pkpgcounter/trunk/pdlanalyzer/version.py (revision 211)
+++ pkpgcounter/trunk/pdlanalyzer/version.py (revision 216)
@@ -20,5 +20,5 @@
 #
 
-__version__ = "1.50"
+__version__ = "1.51"
 
 __doc__ = """pkpgcounter : a generic Page Description Languages parser."""
Index: pkpgcounter/trunk/NEWS
===================================================================
--- pkpgcounter/trunk/NEWS (revision 211)
+++ pkpgcounter/trunk/NEWS (revision 216)
@@ -22,4 +22,8 @@
 pkpgcounter News :
    
+  * 1.51 : 
+  
+    - Basic support for the DVI format.
+    
   * 1.50 :
   
