public:
void Reset(FileFd * const pFd, unsigned long long const pSize)
{
- Fd = pFd;
+ if (Buffer != NULL)
+ free(Buffer);
Buffer = NULL;
+ Fd = pFd;
Start = NULL;
End = NULL;
Done = false;
Size = pSize;
}
- pkgTagFilePrivate(FileFd * const pFd, unsigned long long const Size)
+ pkgTagFilePrivate(FileFd * const pFd, unsigned long long const Size) : Buffer(NULL)
{
Reset(pFd, Size);
}
bool Done;
unsigned long long iOffset;
unsigned long long Size;
+
+ ~pkgTagFilePrivate()
+ {
+ if (Buffer != NULL)
+ free(Buffer);
+ }
};
class pkgTagSectionPrivate
/* */
pkgTagFile::~pkgTagFile()
{
- free(d->Buffer);
delete d;
}
/*}}}*/
pkgTagSection::pkgTagSection()
: Section(0), d(new pkgTagSectionPrivate()), Stop(0)
{
-#if APT_PKG_ABI < 413
- TagCount = 0;
- memset(&Indexes, 0, sizeof(Indexes));
-#endif
memset(&AlphaIndexes, 0, sizeof(AlphaIndexes));
}
APT_IGNORE_DEPRECATED_POP
/*}}}*/
// TagSection::Scan - Scan for the end of the header information /*{{{*/
-#if APT_PKG_ABI < 413
-bool pkgTagSection::Scan(const char *Start,unsigned long MaxLength)
-{
- return Scan(Start, MaxLength, true);
-}
-#endif
bool pkgTagSection::Scan(const char *Start,unsigned long MaxLength, bool const Restart)
{
Section = Start;
}
d->Tags.reserve(0x100);
}
-#if APT_PKG_ABI >= 413
unsigned int TagCount = d->Tags.size();
-#else
- APT_IGNORE_DEPRECATED(TagCount = d->Tags.size();)
-#endif
if (Stop == 0)
return false;
return true;
// Start a new index and add it to the hash
- if (isspace(Stop[0]) == 0)
+ if (isspace_ascii(Stop[0]) == 0)
{
// store the last found tag
if (lastTagData.EndTag != 0)
lastTagData.NextInBucket = AlphaIndexes[lastTagHash];
APT_IGNORE_DEPRECATED_PUSH
AlphaIndexes[lastTagHash] = TagCount;
-#if APT_PKG_ABI < 413
- if (d->Tags.size() < sizeof(Indexes)/sizeof(Indexes[0]))
- Indexes[d->Tags.size()] = lastTagData.StartTag;
-#endif
APT_IGNORE_DEPRECATED_POP
d->Tags.push_back(lastTagData);
}
// find the end of the tag (which might or might not be the colon)
char const * EndTag = Colon;
--EndTag;
- for (; EndTag > Stop && isspace(*EndTag) != 0; --EndTag)
+ for (; EndTag > Stop && isspace_ascii(*EndTag) != 0; --EndTag)
;
++EndTag;
lastTagData.EndTag = EndTag - Section;
lastTagHash = AlphaHash(Stop, EndTag - Stop);
// find the beginning of the value
Stop = Colon + 1;
- for (; isspace(*Stop) != 0; ++Stop);
+ for (; isspace_ascii(*Stop) != 0; ++Stop)
+ if (*Stop == '\n' && Stop[1] != ' ')
+ break;
if (Stop >= End)
return false;
lastTagData.StartValue = Stop - Section;
if (AlphaIndexes[lastTagHash] != 0)
lastTagData.NextInBucket = AlphaIndexes[lastTagHash];
APT_IGNORE_DEPRECATED(AlphaIndexes[lastTagHash] = TagCount;)
-#if APT_PKG_ABI < 413
- APT_IGNORE_DEPRECATED(Indexes[d->Tags.size()] = lastTagData.StartTag;)
-#endif
d->Tags.push_back(lastTagData);
}
pkgTagSectionPrivate::TagData const td(Stop - Section);
-#if APT_PKG_ABI < 413
- APT_IGNORE_DEPRECATED(Indexes[d->Tags.size()] = td.StartTag;)
-#endif
d->Tags.push_back(td);
TrimRecord(false,End);
return true;
}
/*}}}*/
// TagSection::Exists - return True if a tag exists /*{{{*/
-#if APT_PKG_ABI >= 413
bool pkgTagSection::Exists(const char* const Tag) const
-#else
-bool pkgTagSection::Exists(const char* const Tag)
-#endif
{
unsigned int tmp;
return Find(Tag, tmp);
if (unlikely(Start > End))
return _error->Error("Internal parsing error");
- for (; isspace(End[-1]) != 0 && End > Start; --End);
+ for (; isspace_ascii(End[-1]) != 0 && End > Start; --End);
return true;
}
if (unlikely(Start > End))
return "";
- for (; isspace(End[-1]) != 0 && End > Start; --End);
+ for (; isspace_ascii(End[-1]) != 0 && End > Start; --End);
return std::string(Start, End - Start);
}
return Default;
strncpy(S,Start,Stop-Start);
S[Stop - Start] = 0;
-
+
+ errno = 0;
char *End;
signed long Result = strtol(S,&End,10);
+ if (errno == ERANGE ||
+ Result < std::numeric_limits<int>::min() || Result > std::numeric_limits<int>::max()) {
+ errno = ERANGE;
+ _error->Error(_("Cannot convert %s to integer: out of range"), S);
+ }
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 * const Tag, uint8_t &Flags,
+ uint8_t const Flag) const
+{
+ const char *Start;
+ const char *Stop;
+ if (Find(Tag,Start,Stop) == false)
+ return true;
+ return FindFlag(Flags, Flag, Start, Stop);
+}
+bool pkgTagSection::FindFlag(uint8_t &Flags, uint8_t const Flag,
+ char const* const Start, char const* const Stop)
+{
+ switch (StringToBool(string(Start, Stop)))
+ {
+ case 0:
+ Flags &= ~Flag;
+ return true;
+
+ case 1:
+ Flags |= Flag;
+ return true;
+
+ default:
+ _error->Warning("Unknown flag value: %s",string(Start,Stop).c_str());
+ return true;
+ }
+ return true;
+}
bool pkgTagSection::FindFlag(const char *Tag,unsigned long &Flags,
unsigned long Flag) const
{
}
static bool WriteTag(FileFd &File, std::string Tag, std::string const &Value)
{
- if (Value.empty() || isspace(Value[0]) != 0)
+ if (Value.empty() || isspace_ascii(Value[0]) != 0)
Tag.append(":");
else
Tag.append(": ");
}
/*}}}*/
+void pkgUserTagSection::TrimRecord(bool /*BeforeRecord*/, const char* &End)/*{{{*/
+{
+ for (; Stop < End && (Stop[0] == '\n' || Stop[0] == '\r' || Stop[0] == '#'); Stop++)
+ if (Stop[0] == '#')
+ Stop = (const char*) memchr(Stop,'\n',End-Stop);
+}
+ /*}}}*/
+
#include "tagfile-order.c"
// TFRewrite - Rewrite a control record /*{{{*/
Visited[J] |= 2;
if (Rewrite[J].Rewrite != 0 && Rewrite[J].Rewrite[0] != 0)
{
- if (isspace(Rewrite[J].Rewrite[0]))
+ if (isspace_ascii(Rewrite[J].Rewrite[0]))
fprintf(Output,"%s:%s\n",Rewrite[J].NewTag,Rewrite[J].Rewrite);
else
fprintf(Output,"%s: %s\n",Rewrite[J].NewTag,Rewrite[J].Rewrite);
Visited[J] |= 2;
if (Rewrite[J].Rewrite != 0 && Rewrite[J].Rewrite[0] != 0)
{
- if (isspace(Rewrite[J].Rewrite[0]))
+ if (isspace_ascii(Rewrite[J].Rewrite[0]))
fprintf(Output,"%s:%s\n",Rewrite[J].NewTag,Rewrite[J].Rewrite);
else
fprintf(Output,"%s: %s\n",Rewrite[J].NewTag,Rewrite[J].Rewrite);
if (Rewrite[J].Rewrite != 0 && Rewrite[J].Rewrite[0] != 0)
{
- if (isspace(Rewrite[J].Rewrite[0]))
+ if (isspace_ascii(Rewrite[J].Rewrite[0]))
fprintf(Output,"%s:%s\n",Rewrite[J].NewTag,Rewrite[J].Rewrite);
else
fprintf(Output,"%s: %s\n",Rewrite[J].NewTag,Rewrite[J].Rewrite);