]> git.saurik.com Git - apt.git/blame - apt-pkg/deb/debrecords.cc
merged from the debian-experimental2 branch
[apt.git] / apt-pkg / deb / debrecords.cc
CommitLineData
f55ece0e
AL
1// -*- mode: cpp; mode: fold -*-
2// Description /*{{{*/
a7c835af 3// $Id: debrecords.cc,v 1.10 2001/03/13 06:51:46 jgg Exp $
f55ece0e
AL
4/* ######################################################################
5
6 Debian Package Records - Parser for debian package records
7
8 ##################################################################### */
9 /*}}}*/
10// Include Files /*{{{*/
f55ece0e 11#include <apt-pkg/debrecords.h>
a52f938b 12#include <apt-pkg/strutl.h>
f55ece0e 13#include <apt-pkg/error.h>
45df0ad2 14#include <apt-pkg/aptconfiguration.h>
a52f938b 15#include <langinfo.h>
f55ece0e
AL
16 /*}}}*/
17
18// RecordParser::debRecordParser - Constructor /*{{{*/
19// ---------------------------------------------------------------------
20/* */
b2e465d6 21debRecordParser::debRecordParser(string FileName,pkgCache &Cache) :
c4fc2fd7 22 File(FileName,FileFd::ReadOnlyGzip),
63b528a4
MV
23 Tags(&File, std::max(Cache.Head().MaxVerFileSize,
24 Cache.Head().MaxDescFileSize) + 200)
f55ece0e
AL
25{
26}
27 /*}}}*/
28// RecordParser::Jump - Jump to a specific record /*{{{*/
29// ---------------------------------------------------------------------
30/* */
03e39e59 31bool debRecordParser::Jump(pkgCache::VerFileIterator const &Ver)
f55ece0e
AL
32{
33 return Tags.Jump(Section,Ver->Offset);
a52f938b
OS
34}
35bool debRecordParser::Jump(pkgCache::DescFileIterator const &Desc)
36{
37 return Tags.Jump(Section,Desc->Offset);
f55ece0e
AL
38}
39 /*}}}*/
7e798dd7
AL
40// RecordParser::FileName - Return the archive filename on the site /*{{{*/
41// ---------------------------------------------------------------------
42/* */
43string debRecordParser::FileName()
44{
7974b907 45 return Section.FindS("Filename");
7e798dd7
AL
46}
47 /*}}}*/
b2e465d6
AL
48// RecordParser::Name - Return the package name /*{{{*/
49// ---------------------------------------------------------------------
50/* */
51string debRecordParser::Name()
52{
53 return Section.FindS("Package");
54}
55 /*}}}*/
f27b4a70
OS
56// RecordParser::Homepage - Return the package homepage /*{{{*/
57// ---------------------------------------------------------------------
58/* */
59string debRecordParser::Homepage()
60{
61 return Section.FindS("Homepage");
62}
63 /*}}}*/
7e798dd7
AL
64// RecordParser::MD5Hash - Return the archive hash /*{{{*/
65// ---------------------------------------------------------------------
66/* */
67string debRecordParser::MD5Hash()
68{
a7c835af
AL
69 return Section.FindS("MD5Sum");
70}
71 /*}}}*/
72// RecordParser::SHA1Hash - Return the archive hash /*{{{*/
73// ---------------------------------------------------------------------
74/* */
75string debRecordParser::SHA1Hash()
76{
59b46c41 77 return Section.FindS("SHA1");
7e798dd7
AL
78}
79 /*}}}*/
d9b9e9e2 80// RecordParser::SHA256Hash - Return the archive hash /*{{{*/
495e5cb2
MV
81// ---------------------------------------------------------------------
82/* */
83string debRecordParser::SHA256Hash()
84{
85 return Section.FindS("SHA256");
86}
87 /*}}}*/
d9b9e9e2
MV
88// RecordParser::SHA512Hash - Return the archive hash /*{{{*/
89// ---------------------------------------------------------------------
90/* */
91string debRecordParser::SHA512Hash()
92{
93 return Section.FindS("SHA512");
94}
95 /*}}}*/
7e798dd7
AL
96// RecordParser::Maintainer - Return the maintainer email /*{{{*/
97// ---------------------------------------------------------------------
98/* */
99string debRecordParser::Maintainer()
100{
7974b907 101 return Section.FindS("Maintainer");
7e798dd7
AL
102}
103 /*}}}*/
75bda619
MV
104// RecordParser::RecordField - Return the value of an arbitrary field /*{{*/
105// ---------------------------------------------------------------------
106/* */
107string debRecordParser::RecordField(const char *fieldName)
108{
109 return Section.FindS(fieldName);
110}
111
112 /*}}}*/
7e798dd7
AL
113// RecordParser::ShortDesc - Return a 1 line description /*{{{*/
114// ---------------------------------------------------------------------
115/* */
116string debRecordParser::ShortDesc()
117{
a52f938b 118 string Res = LongDesc();
7e798dd7
AL
119 string::size_type Pos = Res.find('\n');
120 if (Pos == string::npos)
121 return Res;
122 return string(Res,0,Pos);
123}
124 /*}}}*/
125// RecordParser::LongDesc - Return a longer description /*{{{*/
126// ---------------------------------------------------------------------
127/* */
128string debRecordParser::LongDesc()
129{
a52f938b 130 string orig, dest;
a52f938b
OS
131
132 if (!Section.FindS("Description").empty())
133 orig = Section.FindS("Description").c_str();
45df0ad2
DK
134 else
135 {
136 vector<string> const lang = APT::Configuration::getLanguages();
137 for (vector<string>::const_iterator l = lang.begin();
138 orig.empty() && l != lang.end(); l++)
139 orig = Section.FindS(string("Description-").append(*l).c_str());
140 }
a52f938b 141
45df0ad2 142 char const * const codeset = nl_langinfo(CODESET);
a52f938b
OS
143 if (strcmp(codeset,"UTF-8") != 0) {
144 UTF8ToCodeset(codeset, orig, &dest);
145 orig = dest;
146 }
147
148 return orig;
7e798dd7
AL
149}
150 /*}}}*/
c2f2b862
MV
151
152static const char *SourceVerSeparators = " ()";
153
04f232fc 154// RecordParser::SourcePkg - Return the source package name if any /*{{{*/
36375005
AL
155// ---------------------------------------------------------------------
156/* */
157string debRecordParser::SourcePkg()
158{
04f232fc 159 string Res = Section.FindS("Source");
c2f2b862 160 string::size_type Pos = Res.find_first_of(SourceVerSeparators);
04f232fc
AL
161 if (Pos == string::npos)
162 return Res;
163 return string(Res,0,Pos);
36375005
AL
164}
165 /*}}}*/
c2f2b862
MV
166// RecordParser::SourceVer - Return the source version number if present /*{{{*/
167// ---------------------------------------------------------------------
168/* */
169string debRecordParser::SourceVer()
170{
171 string Pkg = Section.FindS("Source");
172 string::size_type Pos = Pkg.find_first_of(SourceVerSeparators);
173 if (Pos == string::npos)
174 return "";
175
176 string::size_type VerStart = Pkg.find_first_not_of(SourceVerSeparators, Pos);
177 if(VerStart == string::npos)
178 return "";
179
180 string::size_type VerEnd = Pkg.find_first_of(SourceVerSeparators, VerStart);
181 if(VerEnd == string::npos)
182 // Corresponds to the case of, e.g., "foo (1.2" without a closing
183 // paren. Be liberal and guess what it means.
184 return string(Pkg, VerStart);
185 else
186 return string(Pkg, VerStart, VerEnd - VerStart);
187}
188 /*}}}*/
b2e465d6
AL
189// RecordParser::GetRec - Return the whole record /*{{{*/
190// ---------------------------------------------------------------------
191/* */
192void debRecordParser::GetRec(const char *&Start,const char *&Stop)
193{
194 Section.GetSection(Start,Stop);
195}
196 /*}}}*/