|
|
@ -14,6 +14,7 @@ |
|
|
|
#include<config.h> |
|
|
|
|
|
|
|
#include <apt-pkg/tagfile.h> |
|
|
|
#include <apt-pkg/tagfile-keys.h> |
|
|
|
#include <apt-pkg/error.h> |
|
|
|
#include <apt-pkg/strutl.h> |
|
|
|
#include <apt-pkg/fileutl.h> |
|
|
@ -512,7 +513,8 @@ bool pkgTagSection::Scan(const char *Start,unsigned long MaxLength, bool const R |
|
|
|
|
|
|
|
pkgTagSectionPrivate::TagData lastTagData(0); |
|
|
|
lastTagData.EndTag = 0; |
|
|
|
unsigned long lastTagHash = 0; |
|
|
|
Key lastTagKey = Key::Unknown; |
|
|
|
unsigned int lastTagHash = 0; |
|
|
|
while (Stop < End) |
|
|
|
{ |
|
|
|
TrimRecord(true,End); |
|
|
@ -528,11 +530,15 @@ bool pkgTagSection::Scan(const char *Start,unsigned long MaxLength, bool const R |
|
|
|
// store the last found tag
|
|
|
|
if (lastTagData.EndTag != 0) |
|
|
|
{ |
|
|
|
if (BetaIndexes[lastTagHash] != 0) |
|
|
|
lastTagData.NextInBucket = BetaIndexes[lastTagHash]; |
|
|
|
APT_IGNORE_DEPRECATED_PUSH |
|
|
|
BetaIndexes[lastTagHash] = TagCount; |
|
|
|
APT_IGNORE_DEPRECATED_POP |
|
|
|
if (lastTagKey != Key::Unknown) { |
|
|
|
AlphaIndexes[static_cast<size_t>(lastTagKey)] = TagCount; |
|
|
|
} else { |
|
|
|
if (BetaIndexes[lastTagHash] != 0) |
|
|
|
lastTagData.NextInBucket = BetaIndexes[lastTagHash]; |
|
|
|
APT_IGNORE_DEPRECATED_PUSH |
|
|
|
BetaIndexes[lastTagHash] = TagCount; |
|
|
|
APT_IGNORE_DEPRECATED_POP |
|
|
|
} |
|
|
|
d->Tags.push_back(lastTagData); |
|
|
|
} |
|
|
|
|
|
|
@ -549,7 +555,9 @@ bool pkgTagSection::Scan(const char *Start,unsigned long MaxLength, bool const R |
|
|
|
; |
|
|
|
++EndTag; |
|
|
|
lastTagData.EndTag = EndTag - Section; |
|
|
|
lastTagHash = BetaHash(Stop, EndTag - Stop); |
|
|
|
lastTagKey = pkgTagHash(Stop, EndTag - Stop); |
|
|
|
if (lastTagKey == Key::Unknown) |
|
|
|
lastTagHash = BetaHash(Stop, EndTag - Stop); |
|
|
|
// find the beginning of the value
|
|
|
|
Stop = Colon + 1; |
|
|
|
for (; Stop < End && isspace_ascii(*Stop) != 0; ++Stop) |
|
|
@ -574,9 +582,13 @@ bool pkgTagSection::Scan(const char *Start,unsigned long MaxLength, bool const R |
|
|
|
{ |
|
|
|
if (lastTagData.EndTag != 0) |
|
|
|
{ |
|
|
|
if (BetaIndexes[lastTagHash] != 0) |
|
|
|
lastTagData.NextInBucket = BetaIndexes[lastTagHash]; |
|
|
|
APT_IGNORE_DEPRECATED(BetaIndexes[lastTagHash] = TagCount;) |
|
|
|
if (lastTagKey != Key::Unknown) { |
|
|
|
AlphaIndexes[static_cast<size_t>(lastTagKey)] = TagCount; |
|
|
|
} else { |
|
|
|
if (BetaIndexes[lastTagHash] != 0) |
|
|
|
lastTagData.NextInBucket = BetaIndexes[lastTagHash]; |
|
|
|
APT_IGNORE_DEPRECATED(BetaIndexes[lastTagHash] = TagCount;) |
|
|
|
} |
|
|
|
d->Tags.push_back(lastTagData); |
|
|
|
} |
|
|
|
|
|
|
@ -620,10 +632,20 @@ bool pkgTagSection::Exists(StringView Tag) const |
|
|
|
// TagSection::Find - Locate a tag /*{{{*/
|
|
|
|
// ---------------------------------------------------------------------
|
|
|
|
/* This searches the section for a tag that matches the given string. */ |
|
|
|
bool pkgTagSection::Find(Key key,unsigned int &Pos) const |
|
|
|
{ |
|
|
|
auto Bucket = AlphaIndexes[static_cast<size_t>(key)]; |
|
|
|
Pos = Bucket - 1; |
|
|
|
return Bucket != 0; |
|
|
|
} |
|
|
|
bool pkgTagSection::Find(StringView TagView,unsigned int &Pos) const |
|
|
|
{ |
|
|
|
const char * const Tag = TagView.data(); |
|
|
|
size_t const Length = TagView.length(); |
|
|
|
auto key = pkgTagHash(Tag, Length); |
|
|
|
if (key != Key::Unknown) |
|
|
|
return Find(key, Pos); |
|
|
|
|
|
|
|
unsigned int Bucket = BetaIndexes[BetaHash(Tag, Length)]; |
|
|
|
if (Bucket == 0) |
|
|
|
return false; |
|
|
@ -663,6 +685,12 @@ bool pkgTagSection::Find(StringView Tag,const char *&Start, |
|
|
|
{ |
|
|
|
unsigned int Pos; |
|
|
|
return Find(Tag, Pos) && FindInternal(Pos, Start, End); |
|
|
|
} |
|
|
|
bool pkgTagSection::Find(Key key,const char *&Start, |
|
|
|
const char *&End) const |
|
|
|
{ |
|
|
|
unsigned int Pos; |
|
|
|
return Find(key, Pos) && FindInternal(Pos, Start, End); |
|
|
|
} |
|
|
|
/*}}}*/ |
|
|
|
// TagSection::FindS - Find a string /*{{{*/
|
|
|
@ -673,6 +701,14 @@ StringView pkgTagSection::Find(StringView Tag) const |
|
|
|
if (Find(Tag,Start,End) == false) |
|
|
|
return StringView(); |
|
|
|
return StringView(Start, End - Start); |
|
|
|
} |
|
|
|
StringView pkgTagSection::Find(Key key) const |
|
|
|
{ |
|
|
|
const char *Start; |
|
|
|
const char *End; |
|
|
|
if (Find(key,Start,End) == false) |
|
|
|
return StringView(); |
|
|
|
return StringView(Start, End - Start); |
|
|
|
} |
|
|
|
/*}}}*/ |
|
|
|
// TagSection::FindRawS - Find a string /*{{{*/
|
|
|
@ -692,6 +728,11 @@ StringView pkgTagSection::FindRaw(StringView Tag) const |
|
|
|
{ |
|
|
|
unsigned int Pos; |
|
|
|
return Find(Tag, Pos) ? FindRawInternal(Pos) : ""; |
|
|
|
} |
|
|
|
StringView pkgTagSection::FindRaw(Key key) const |
|
|
|
{ |
|
|
|
unsigned int Pos; |
|
|
|
return Find(key, Pos) ? FindRawInternal(Pos) : ""; |
|
|
|
} |
|
|
|
/*}}}*/ |
|
|
|
// TagSection::FindI - Find an integer /*{{{*/
|
|
|
@ -723,6 +764,12 @@ signed int pkgTagSection::FindIInternal(unsigned int Pos,signed long Default) co |
|
|
|
return Default; |
|
|
|
return Result; |
|
|
|
} |
|
|
|
signed int pkgTagSection::FindI(Key key,signed long Default) const |
|
|
|
{ |
|
|
|
unsigned int Pos; |
|
|
|
|
|
|
|
return Find(key, Pos) ? FindIInternal(Pos) : Default; |
|
|
|
} |
|
|
|
signed int pkgTagSection::FindI(StringView Tag,signed long Default) const |
|
|
|
{ |
|
|
|
unsigned int Pos; |
|
|
@ -753,6 +800,12 @@ unsigned long long pkgTagSection::FindULLInternal(unsigned int Pos, unsigned lon |
|
|
|
return Default; |
|
|
|
return Result; |
|
|
|
} |
|
|
|
unsigned long long pkgTagSection::FindULL(Key key, unsigned long long const &Default) const |
|
|
|
{ |
|
|
|
unsigned int Pos; |
|
|
|
|
|
|
|
return Find(key, Pos) ? FindULLInternal(Pos, Default) : Default; |
|
|
|
} |
|
|
|
unsigned long long pkgTagSection::FindULL(StringView Tag, unsigned long long const &Default) const |
|
|
|
{ |
|
|
|
unsigned int Pos; |
|
|
@ -770,6 +823,11 @@ bool pkgTagSection::FindBInternal(unsigned int Pos, bool Default) const |
|
|
|
return Default; |
|
|
|
return StringToBool(string(Start, Stop)); |
|
|
|
} |
|
|
|
bool pkgTagSection::FindB(Key key, bool Default) const |
|
|
|
{ |
|
|
|
unsigned int Pos; |
|
|
|
return Find(key, Pos) ? FindBInternal(Pos, Default): Default; |
|
|
|
} |
|
|
|
bool pkgTagSection::FindB(StringView Tag, bool Default) const |
|
|
|
{ |
|
|
|
unsigned int Pos; |
|
|
@ -788,6 +846,14 @@ bool pkgTagSection::FindFlagInternal(unsigned int Pos, uint8_t &Flags, |
|
|
|
return true; |
|
|
|
return FindFlag(Flags, Flag, Start, Stop); |
|
|
|
} |
|
|
|
bool pkgTagSection::FindFlag(Key key, uint8_t &Flags, |
|
|
|
uint8_t const Flag) const |
|
|
|
{ |
|
|
|
unsigned int Pos; |
|
|
|
if (Find(key,Pos) == false) |
|
|
|
return true; |
|
|
|
return FindFlagInternal(Pos, Flags, Flag); |
|
|
|
} |
|
|
|
bool pkgTagSection::FindFlag(StringView Tag, uint8_t &Flags, |
|
|
|
uint8_t const Flag) const |
|
|
|
{ |
|
|
@ -824,6 +890,12 @@ bool pkgTagSection::FindFlagInternal(unsigned int Pos,unsigned long &Flags, |
|
|
|
return true; |
|
|
|
return FindFlag(Flags, Flag, Start, Stop); |
|
|
|
} |
|
|
|
bool pkgTagSection::FindFlag(Key key,unsigned long &Flags, |
|
|
|
unsigned long Flag) const |
|
|
|
{ |
|
|
|
unsigned int Pos; |
|
|
|
return Find(key, Pos) ? FindFlagInternal(Pos, Flags, Flag) : true; |
|
|
|
} |
|
|
|
bool pkgTagSection::FindFlag(StringView Tag,unsigned long &Flags, |
|
|
|
unsigned long Flag) const |
|
|
|
{ |
|
|
|