diff options
author | Michael Vogt <michael.vogt@ubuntu.com> | 2010-07-29 16:18:10 +0200 |
---|---|---|
committer | Michael Vogt <michael.vogt@ubuntu.com> | 2010-07-29 16:18:10 +0200 |
commit | 15240f4b681ca35c669d2b2e6e34f8ee3f6c06d9 (patch) | |
tree | 4139050e3c2f00650a0d316c971c4e7b8aba3e58 /apt-pkg/tagfile.h | |
parent | 34904390bd6901f3de90249938baa0b875873534 (diff) | |
parent | 1b8ba3ba050f01db27f1ddc0e5b280b2fccd9fb9 (diff) |
merged with the debian-experimental-ma branch
Diffstat (limited to 'apt-pkg/tagfile.h')
-rw-r--r-- | apt-pkg/tagfile.h | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/apt-pkg/tagfile.h b/apt-pkg/tagfile.h index 321329a23..6891c1d81 100644 --- a/apt-pkg/tagfile.h +++ b/apt-pkg/tagfile.h @@ -33,7 +33,18 @@ class pkgTagSection unsigned int AlphaIndexes[0x100]; unsigned int TagCount; - + + /* This very simple hash function for the last 8 letters gives + very good performance on the debian package files */ + inline static unsigned long AlphaHash(const char *Text, const char *End = 0) + { + unsigned long Res = 0; + for (; Text != End && *Text != ':' && *Text != 0; Text++) + Res = ((unsigned long)(*Text) & 0xDF) ^ (Res << 1); + return Res & 0xFF; + } + + protected: const char *Stop; @@ -46,6 +57,7 @@ class pkgTagSection bool Find(const char *Tag,unsigned &Pos) const; string FindS(const char *Tag) const; signed int FindI(const char *Tag,signed long Default = 0) const ; + unsigned long long FindULL(const char *Tag, unsigned long long const &Default = 0) const; bool FindFlag(const char *Tag,unsigned long &Flags, unsigned long Flag) const; bool Scan(const char *Start,unsigned long MaxLength); @@ -54,6 +66,8 @@ class pkgTagSection virtual void TrimRecord(bool BeforeRecord, const char* &End); inline unsigned int Count() const {return TagCount;}; + inline bool Exists(const char* const Tag) {return AlphaIndexes[AlphaHash(Tag)] != 0;} + inline void Get(const char *&Start,const char *&Stop,unsigned int I) const {Start = Section + Indexes[I]; Stop = Section + Indexes[I+1];} |