You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
179 lines
5.5 KiB
179 lines
5.5 KiB
// -*- mode: cpp; mode: fold -*-
|
|
// Description /*{{{*/
|
|
// $Id: debrecords.cc,v 1.10 2001/03/13 06:51:46 jgg Exp $
|
|
/* ######################################################################
|
|
|
|
Debian Package Records - Parser for debian package records
|
|
|
|
##################################################################### */
|
|
/*}}}*/
|
|
// Include Files /*{{{*/
|
|
#include <apt-pkg/debrecords.h>
|
|
#include <apt-pkg/strutl.h>
|
|
#include <apt-pkg/error.h>
|
|
#include <apt-pkg/aptconfiguration.h>
|
|
#include <langinfo.h>
|
|
/*}}}*/
|
|
|
|
// RecordParser::debRecordParser - Constructor /*{{{*/
|
|
// ---------------------------------------------------------------------
|
|
/* */
|
|
debRecordParser::debRecordParser(string FileName,pkgCache &Cache) :
|
|
File(FileName,FileFd::ReadOnlyGzip),
|
|
Tags(&File, std::max(Cache.Head().MaxVerFileSize,
|
|
Cache.Head().MaxDescFileSize) + 200)
|
|
{
|
|
}
|
|
/*}}}*/
|
|
// RecordParser::Jump - Jump to a specific record /*{{{*/
|
|
// ---------------------------------------------------------------------
|
|
/* */
|
|
bool debRecordParser::Jump(pkgCache::VerFileIterator const &Ver)
|
|
{
|
|
return Tags.Jump(Section,Ver->Offset);
|
|
}
|
|
bool debRecordParser::Jump(pkgCache::DescFileIterator const &Desc)
|
|
{
|
|
return Tags.Jump(Section,Desc->Offset);
|
|
}
|
|
/*}}}*/
|
|
// RecordParser::FileName - Return the archive filename on the site /*{{{*/
|
|
// ---------------------------------------------------------------------
|
|
/* */
|
|
string debRecordParser::FileName()
|
|
{
|
|
return Section.FindS("Filename");
|
|
}
|
|
/*}}}*/
|
|
// RecordParser::Name - Return the package name /*{{{*/
|
|
// ---------------------------------------------------------------------
|
|
/* */
|
|
string debRecordParser::Name()
|
|
{
|
|
return Section.FindS("Package");
|
|
}
|
|
/*}}}*/
|
|
// RecordParser::Homepage - Return the package homepage /*{{{*/
|
|
// ---------------------------------------------------------------------
|
|
/* */
|
|
string debRecordParser::Homepage()
|
|
{
|
|
return Section.FindS("Homepage");
|
|
}
|
|
/*}}}*/
|
|
// RecordParser::MD5Hash - Return the archive hash /*{{{*/
|
|
// ---------------------------------------------------------------------
|
|
/* */
|
|
string debRecordParser::MD5Hash()
|
|
{
|
|
return Section.FindS("MD5Sum");
|
|
}
|
|
/*}}}*/
|
|
// RecordParser::SHA1Hash - Return the archive hash /*{{{*/
|
|
// ---------------------------------------------------------------------
|
|
/* */
|
|
string debRecordParser::SHA1Hash()
|
|
{
|
|
return Section.FindS("SHA1");
|
|
}
|
|
/*}}}*/
|
|
// RecordParser::SHA1Hash - Return the archive hash /*{{{*/
|
|
// ---------------------------------------------------------------------
|
|
/* */
|
|
string debRecordParser::SHA256Hash()
|
|
{
|
|
return Section.FindS("SHA256");
|
|
}
|
|
/*}}}*/
|
|
// RecordParser::Maintainer - Return the maintainer email /*{{{*/
|
|
// ---------------------------------------------------------------------
|
|
/* */
|
|
string debRecordParser::Maintainer()
|
|
{
|
|
return Section.FindS("Maintainer");
|
|
}
|
|
/*}}}*/
|
|
// RecordParser::ShortDesc - Return a 1 line description /*{{{*/
|
|
// ---------------------------------------------------------------------
|
|
/* */
|
|
string debRecordParser::ShortDesc()
|
|
{
|
|
string Res = LongDesc();
|
|
string::size_type Pos = Res.find('\n');
|
|
if (Pos == string::npos)
|
|
return Res;
|
|
return string(Res,0,Pos);
|
|
}
|
|
/*}}}*/
|
|
// RecordParser::LongDesc - Return a longer description /*{{{*/
|
|
// ---------------------------------------------------------------------
|
|
/* */
|
|
string debRecordParser::LongDesc()
|
|
{
|
|
string orig, dest;
|
|
|
|
if (!Section.FindS("Description").empty())
|
|
orig = Section.FindS("Description").c_str();
|
|
else
|
|
{
|
|
vector<string> const lang = APT::Configuration::getLanguages();
|
|
for (vector<string>::const_iterator l = lang.begin();
|
|
orig.empty() && l != lang.end(); l++)
|
|
orig = Section.FindS(string("Description-").append(*l).c_str());
|
|
}
|
|
|
|
char const * const codeset = nl_langinfo(CODESET);
|
|
if (strcmp(codeset,"UTF-8") != 0) {
|
|
UTF8ToCodeset(codeset, orig, &dest);
|
|
orig = dest;
|
|
}
|
|
|
|
return orig;
|
|
}
|
|
/*}}}*/
|
|
|
|
static const char *SourceVerSeparators = " ()";
|
|
|
|
// RecordParser::SourcePkg - Return the source package name if any /*{{{*/
|
|
// ---------------------------------------------------------------------
|
|
/* */
|
|
string debRecordParser::SourcePkg()
|
|
{
|
|
string Res = Section.FindS("Source");
|
|
string::size_type Pos = Res.find_first_of(SourceVerSeparators);
|
|
if (Pos == string::npos)
|
|
return Res;
|
|
return string(Res,0,Pos);
|
|
}
|
|
/*}}}*/
|
|
// RecordParser::SourceVer - Return the source version number if present /*{{{*/
|
|
// ---------------------------------------------------------------------
|
|
/* */
|
|
string debRecordParser::SourceVer()
|
|
{
|
|
string Pkg = Section.FindS("Source");
|
|
string::size_type Pos = Pkg.find_first_of(SourceVerSeparators);
|
|
if (Pos == string::npos)
|
|
return "";
|
|
|
|
string::size_type VerStart = Pkg.find_first_not_of(SourceVerSeparators, Pos);
|
|
if(VerStart == string::npos)
|
|
return "";
|
|
|
|
string::size_type VerEnd = Pkg.find_first_of(SourceVerSeparators, VerStart);
|
|
if(VerEnd == string::npos)
|
|
// Corresponds to the case of, e.g., "foo (1.2" without a closing
|
|
// paren. Be liberal and guess what it means.
|
|
return string(Pkg, VerStart);
|
|
else
|
|
return string(Pkg, VerStart, VerEnd - VerStart);
|
|
}
|
|
/*}}}*/
|
|
// RecordParser::GetRec - Return the whole record /*{{{*/
|
|
// ---------------------------------------------------------------------
|
|
/* */
|
|
void debRecordParser::GetRec(const char *&Start,const char *&Stop)
|
|
{
|
|
Section.GetSection(Start,Stop);
|
|
}
|
|
/*}}}*/
|
|
|