X-Git-Url: https://git.saurik.com/apt.git/blobdiff_plain/c7b5ce1cf17ebbf845b58ce33956251176d471b2..a3eaf9544039a9adfef159e8185f376f19b15c68:/apt-pkg/tagfile.cc?ds=inline diff --git a/apt-pkg/tagfile.cc b/apt-pkg/tagfile.cc index 7f2bf6b1d..97e5c244a 100644 --- a/apt-pkg/tagfile.cc +++ b/apt-pkg/tagfile.cc @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: tagfile.cc,v 1.18 1998/12/08 05:24:41 jgg Exp $ +// $Id: tagfile.cc,v 1.25 1999/07/03 06:45:40 jgg Exp $ /* ###################################################################### Fast scanner for RFC-822 type header information @@ -17,6 +17,7 @@ #include #include +#include #include #include @@ -34,6 +35,14 @@ pkgTagFile::pkgTagFile(FileFd &Fd,unsigned long Size) : Fd(Fd), Size(Size) Fill(); } /*}}}*/ +// pkgTagFile::~pkgTagFile - Destructor /*{{{*/ +// --------------------------------------------------------------------- +/* */ +pkgTagFile::~pkgTagFile() +{ + delete [] Buffer; +} + /*}}}*/ // TagFile::Step - Advance to the next section /*{{{*/ // --------------------------------------------------------------------- /* If the Section Scanner fails we refill the buffer and try again. */ @@ -45,7 +54,7 @@ bool pkgTagFile::Step(pkgTagSection &Tag) return false; if (Tag.Scan(Start,End - Start) == false) - return _error->Error("Unable to parse package file %s",Fd.Name().c_str()); + return _error->Error("Unable to parse package file %s (1)",Fd.Name().c_str()); } Start += Tag.size(); iOffset += Tag.size(); @@ -115,11 +124,22 @@ bool pkgTagFile::Jump(pkgTagSection &Tag,unsigned long Offset) return false; End = Start = Buffer; + if (Fill() == false) + return false; + + if (Tag.Scan(Start,End - Start) == true) + return true; + + // This appends a double new line (for the real eof handling) if (Fill() == false) return false; if (Tag.Scan(Start,End - Start) == false) - return _error->Error("Unable to parse package file"); + { + cout << string(Start,End) << endl; + return _error->Error("Unable to parse package file %s (2)",Fd.Name().c_str()); + } + return true; } /*}}}*/ @@ -138,8 +158,9 @@ bool pkgTagSection::Scan(const char *Start,unsigned long MaxLength) return false; TagCount = 0; - while (TagCount < sizeof(Indexes)/sizeof(Indexes[0])) + while (TagCount < sizeof(Indexes)/sizeof(Indexes[0]) && Stop < End) { + // Start a new index and add it to the hash if (isspace(Stop[0]) == 0) { Indexes[TagCount++] = Stop - Section; @@ -153,9 +174,11 @@ bool pkgTagSection::Scan(const char *Start,unsigned long MaxLength) if (Stop == 0) return false; - for (; Stop[1] == '\r' && Stop < End; Stop++); + + for (; Stop[1] == '\r' && Stop+1 < End; Stop++); - if (Stop[1] == '\n') + // Double newline marks the end of the record + if (Stop+1 < End && Stop[1] == '\n') { Indexes[TagCount] = Stop - Section; for (; (Stop[0] == '\n' || Stop[0] == '\r') && Stop < End; Stop++); @@ -164,7 +187,7 @@ bool pkgTagSection::Scan(const char *Start,unsigned long MaxLength) Stop++; } - + return false; } /*}}}*/ @@ -200,9 +223,12 @@ bool pkgTagSection::Find(const char *Tag,const char *&Start, // Strip off the gunk from the start end Start = C; End = Section + Indexes[I+1]; + if (Start >= End) + return _error->Error("Internal parsing error"); + for (; (isspace(*Start) != 0 || *Start == ':') && Start < End; Start++); for (; isspace(End[-1]) != 0 && End > Start; End--); - + return true; } @@ -225,14 +251,52 @@ string pkgTagSection::FindS(const char *Tag) // TagSection::FindI - Find an integer /*{{{*/ // --------------------------------------------------------------------- /* */ -unsigned int pkgTagSection::FindI(const char *Tag) +signed int pkgTagSection::FindI(const char *Tag,signed long Default) { const char *Start; - const char *End; - if (Find(Tag,Start,End) == false) - return 0; + const char *Stop; + if (Find(Tag,Start,Stop) == false) + return Default; + + // Copy it into a temp buffer so we can use strtol + char S[300]; + if ((unsigned)(Stop - Start) >= sizeof(S)) + return Default; + strncpy(S,Start,Stop-Start); + S[Stop - Start] = 0; + + char *End; + signed long Result = strtol(S,&End,10); + if (S == End) + return Default; + return Result; +} + /*}}}*/ +// TagSection::FindFlag - Locate a yes/no type flag /*{{{*/ +// --------------------------------------------------------------------- +/* The bits marked in Flag are masked on/off in Flags */ +bool pkgTagSection::FindFlag(const char *Tag,unsigned long &Flags, + unsigned long Flag) +{ + const char *Start; + const char *Stop; + if (Find(Tag,Start,Stop) == false) + return true; - return atoi(string(Start,End).c_str()); + switch (StringToBool(string(Start,Stop))) + { + case 0: + Flags &= ~Flag; + return true; + + case 1: + Flags |= Flag; + return true; + + default: + _error->Warning("Unknown flag value"); + return true; + } + return true; } /*}}}*/ -