- initial import of revision 374 from cnc
[apt.git] / apt-pkg / tagfile.h
1 // -*- mode: cpp; mode: fold -*-
2 // Description                                                          /*{{{*/
3 // $Id: tagfile.h,v 1.20 2003/05/19 17:13:57 doogie Exp $
4 /* ######################################################################
5
6    Fast scanner for RFC-822 type header information
7    
8    This parser handles Debian package files (and others). Their form is
9    RFC-822 type header fields in groups separated by a blank line.
10    
11    The parser reads the file and provides methods to step linearly
12    over it or to jump to a pre-recorded start point and read that record.
13    
14    A second class is used to perform pre-parsing of the record. It works
15    by indexing the start of each header field and providing lookup 
16    functions for header fields.
17    
18    ##################################################################### */
19                                                                         /*}}}*/
20 #ifndef PKGLIB_TAGFILE_H
21 #define PKGLIB_TAGFILE_H
22
23 #ifdef __GNUG__
24 #pragma interface "apt-pkg/tagfile.h"
25 #endif 
26
27 #include <apt-pkg/fileutl.h>
28 #include <stdio.h>
29     
30 class pkgTagSection
31 {
32    const char *Section;
33    const char *Stop;
34    
35    // We have a limit of 256 tags per section.
36    unsigned short Indexes[256];
37    unsigned short AlphaIndexes[0x100];
38    
39    unsigned int TagCount;
40      
41    public:
42    
43    inline bool operator ==(const pkgTagSection &rhs) {return Section == rhs.Section;};
44    inline bool operator !=(const pkgTagSection &rhs) {return Section != rhs.Section;};
45    
46    bool Find(const char *Tag,const char *&Start, const char *&End) const;
47    bool Find(const char *Tag,unsigned &Pos) const;
48    string FindS(const char *Tag) const;
49    signed int FindI(const char *Tag,signed long Default = 0) const ;
50    bool FindFlag(const char *Tag,unsigned long &Flags,
51                  unsigned long Flag) const;
52    bool Scan(const char *Start,unsigned long MaxLength);
53    inline unsigned long size() const {return Stop - Section;};
54    void Trim();
55    
56    inline unsigned int Count() const {return TagCount;};
57    inline void Get(const char *&Start,const char *&Stop,unsigned int I) const
58                    {Start = Section + Indexes[I]; Stop = Section + Indexes[I+1];}
59             
60    inline void GetSection(const char *&Start,const char *&Stop) const
61    {
62       Start = Section;
63       Stop = this->Stop;
64    };
65    
66    pkgTagSection() : Section(0), Stop(0) {};
67 };
68
69 class pkgTagFile
70 {
71    FileFd &Fd;
72    char *Buffer;
73    char *Start;
74    char *End;
75    bool Done;
76    unsigned long iOffset;
77    unsigned long Size;
78    
79    bool Fill();
80    
81    public:
82
83    bool Step(pkgTagSection &Section);
84    inline unsigned long Offset() {return iOffset;};
85    bool Jump(pkgTagSection &Tag,unsigned long Offset);
86
87    pkgTagFile(FileFd *F,unsigned long Size = 32*1024);
88    ~pkgTagFile();
89 };
90
91 /* This is the list of things to rewrite. The rewriter
92    goes through and changes or adds each of these headers
93    to suit. A zero forces the header to be erased, an empty string
94    causes the old value to be used. (rewrite rule ignored) */
95 struct TFRewriteData
96 {
97    const char *Tag;
98    const char *Rewrite;
99    const char *NewTag;
100 };
101 extern const char **TFRewritePackageOrder;
102 extern const char **TFRewriteSourceOrder;
103
104 bool TFRewrite(FILE *Output,pkgTagSection const &Tags,const char *Order[],
105                TFRewriteData *Rewrite);
106
107 #endif