Index: pkpgcounter/trunk/pdlanalyzer/tiff.py
===================================================================
--- pkpgcounter/trunk/pdlanalyzer/tiff.py (revision 217)
+++ pkpgcounter/trunk/pdlanalyzer/tiff.py (revision 217)
@@ -0,0 +1,83 @@
+#! /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 TIFFParser(pdlparser.PDLParser) :
+    """A parser for TIFF documents."""
+    def getJobSize(self) :
+        """Counts pages in a TIFF document.
+        """
+        infileno = self.infile.fileno()
+        minfile = mmap.mmap(infileno, os.fstat(infileno)[6], prot=mmap.PROT_READ, flags=mmap.MAP_SHARED)
+        pagecount = 0
+        littleendian = (chr(0x49)*2) + chr(0x2a) + chr(0)
+        bigendian = (chr(0x4d)*2) + chr(0) + chr(0x2a)
+        if minfile[:4] == littleendian :
+            integerbyteorder = "<I"
+            shortbyteorder = "<H"
+        else :    
+            integerbyteorder = ">I"
+            shortbyteorder = ">H"
+        pos = 4    
+        try :    
+            nextifdoffset = unpack(integerbyteorder, minfile[pos:pos+4])[0]
+            while nextifdoffset :
+                direntrycount = unpack(shortbyteorder, minfile[nextifdoffset:nextifdoffset+2])[0]
+                pos = nextifdoffset + 2 + (direntrycount * 12)
+                nextifdoffset = unpack(integerbyteorder, minfile[pos:pos+4])[0]
+                pagecount += 1
+        except IndexError :            
+            pass
+        minfile.close()
+        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 = TIFFParser(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 216)
+++ pkpgcounter/trunk/pdlanalyzer/analyzer.py (revision 217)
@@ -23,5 +23,5 @@
 import tempfile
 
-from pdlanalyzer import version, pdlparser, postscript, pdf, pcl345, pclxl, escp2, dvi
+from pdlanalyzer import version, pdlparser, postscript, pdf, pcl345, pclxl, escp2, dvi, tiff
 
 KILOBYTE = 1024    
@@ -58,4 +58,5 @@
             psyco.bind(pclxl.PCLXLParser.getJobSize)
             psyco.bind(dvi.DVIParser.getJobSize)
+            psyco.bind(tiff.TIFFParser.getJobSize)
         
     def getJobSize(self) :    
@@ -181,5 +182,16 @@
         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))
+                sys.stderr.write("%s is a DVI file\n" % str(self.filename))
+            return 1
+        else :    
+            return 0
+            
+    def isTIFF(self, sdata, edata) :        
+        """Returns 1 if data is TIFF, else 0."""
+        littleendian = (chr(0x49)*2) + chr(0x2a) + chr(0)
+        bigendian = (chr(0x4d)*2) + chr(0) + chr(0x2a)
+        if sdata[:4] in (littleendian, bigendian) :
+            if self.debug :  
+                sys.stderr.write("%s is a TIFF file\n" % str(self.filename))
             return 1
         else :    
@@ -200,18 +212,22 @@
             lastblock = ""
         self.infile.seek(0)
-        if self.isPostScript(firstblock, lastblock) :
-            return postscript.PostScriptParser
-        elif self.isPCLXL(firstblock, lastblock) :    
-            return pclxl.PCLXLParser
-        elif self.isPDF(firstblock, lastblock) :    
-            return pdf.PDFParser
-        elif self.isPCL(firstblock, lastblock) :    
-            return pcl345.PCL345Parser
-        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."
+        if not firstblock :
+            sys.stderr.write("ERROR: input file %s is empty !\n" % str(self.filename))
+        else :    
+            if self.isPostScript(firstblock, lastblock) :
+                return postscript.PostScriptParser
+            elif self.isPCLXL(firstblock, lastblock) :    
+                return pclxl.PCLXLParser
+            elif self.isPDF(firstblock, lastblock) :    
+                return pdf.PDFParser
+            elif self.isPCL(firstblock, lastblock) :    
+                return pcl345.PCL345Parser
+            elif self.isESCP2(firstblock, lastblock) :    
+                return escp2.ESCP2Parser
+            elif self.isDVI(firstblock, lastblock) :    
+                return dvi.DVIParser
+            elif self.isTIFF(firstblock, lastblock) :
+                return tiff.TIFFParser
+        raise pdlparser.PDLParserError, "Analysis of first data block failed."
             
 def main() :    
Index: pkpgcounter/trunk/pdlanalyzer/version.py
===================================================================
--- pkpgcounter/trunk/pdlanalyzer/version.py (revision 216)
+++ pkpgcounter/trunk/pdlanalyzer/version.py (revision 217)
@@ -20,5 +20,5 @@
 #
 
-__version__ = "1.51"
+__version__ = "1.52"
 
 __doc__ = """pkpgcounter : a generic Page Description Languages parser."""
Index: pkpgcounter/trunk/NEWS
===================================================================
--- pkpgcounter/trunk/NEWS (revision 216)
+++ pkpgcounter/trunk/NEWS (revision 217)
@@ -22,4 +22,8 @@
 pkpgcounter News :
    
+  * 1.52 : 
+  
+    - Basic support for the TIFF format.
+    
   * 1.51 : 
   
