]> git.saurik.com Git - apt.git/blob - apt-pkg/deb/debrecords.cc
fix crash when P.Arch() was used but the cache got remapped
[apt.git] / apt-pkg / deb / debrecords.cc
1 // -*- mode: cpp; mode: fold -*-
2 // Description /*{{{*/
3 // $Id: debrecords.cc,v 1.10 2001/03/13 06:51:46 jgg Exp $
4 /* ######################################################################
5
6 Debian Package Records - Parser for debian package records
7
8 ##################################################################### */
9 /*}}}*/
10 // Include Files /*{{{*/
11 #include <apt-pkg/debrecords.h>
12 #include <apt-pkg/strutl.h>
13 #include <apt-pkg/error.h>
14 #include <apt-pkg/aptconfiguration.h>
15 #include <langinfo.h>
16 /*}}}*/
17
18 // RecordParser::debRecordParser - Constructor /*{{{*/
19 // ---------------------------------------------------------------------
20 /* */
21 debRecordParser::debRecordParser(string FileName,pkgCache &Cache) :
22 File(FileName,FileFd::ReadOnlyGzip),
23 Tags(&File, std::max(Cache.Head().MaxVerFileSize,
24 Cache.Head().MaxDescFileSize) + 200)
25 {
26 }
27 /*}}}*/
28 // RecordParser::Jump - Jump to a specific record /*{{{*/
29 // ---------------------------------------------------------------------
30 /* */
31 bool debRecordParser::Jump(pkgCache::VerFileIterator const &Ver)
32 {
33 return Tags.Jump(Section,Ver->Offset);
34 }
35 bool debRecordParser::Jump(pkgCache::DescFileIterator const &Desc)
36 {
37 return Tags.Jump(Section,Desc->Offset);
38 }
39 /*}}}*/
40 // RecordParser::FileName - Return the archive filename on the site /*{{{*/
41 // ---------------------------------------------------------------------
42 /* */
43 string debRecordParser::FileName()
44 {
45 return Section.FindS("Filename");
46 }
47 /*}}}*/
48 // RecordParser::Name - Return the package name /*{{{*/
49 // ---------------------------------------------------------------------
50 /* */
51 string debRecordParser::Name()
52 {
53 return Section.FindS("Package");
54 }
55 /*}}}*/
56 // RecordParser::Homepage - Return the package homepage /*{{{*/
57 // ---------------------------------------------------------------------
58 /* */
59 string debRecordParser::Homepage()
60 {
61 return Section.FindS("Homepage");
62 }
63 /*}}}*/
64 // RecordParser::MD5Hash - Return the archive hash /*{{{*/
65 // ---------------------------------------------------------------------
66 /* */
67 string debRecordParser::MD5Hash()
68 {
69 return Section.FindS("MD5Sum");
70 }
71 /*}}}*/
72 // RecordParser::SHA1Hash - Return the archive hash /*{{{*/
73 // ---------------------------------------------------------------------
74 /* */
75 string debRecordParser::SHA1Hash()
76 {
77 return Section.FindS("SHA1");
78 }
79 /*}}}*/
80 // RecordParser::SHA256Hash - Return the archive hash /*{{{*/
81 // ---------------------------------------------------------------------
82 /* */
83 string debRecordParser::SHA256Hash()
84 {
85 return Section.FindS("SHA256");
86 }
87 /*}}}*/
88 // RecordParser::SHA512Hash - Return the archive hash /*{{{*/
89 // ---------------------------------------------------------------------
90 /* */
91 string debRecordParser::SHA512Hash()
92 {
93 return Section.FindS("SHA512");
94 }
95 /*}}}*/
96 // RecordParser::Maintainer - Return the maintainer email /*{{{*/
97 // ---------------------------------------------------------------------
98 /* */
99 string debRecordParser::Maintainer()
100 {
101 return Section.FindS("Maintainer");
102 }
103 /*}}}*/
104 // RecordParser::RecordField - Return the value of an arbitrary field /*{{*/
105 // ---------------------------------------------------------------------
106 /* */
107 string debRecordParser::RecordField(const char *fieldName)
108 {
109 return Section.FindS(fieldName);
110 }
111
112 /*}}}*/
113 // RecordParser::ShortDesc - Return a 1 line description /*{{{*/
114 // ---------------------------------------------------------------------
115 /* */
116 string debRecordParser::ShortDesc()
117 {
118 string Res = LongDesc();
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 /* */
128 string debRecordParser::LongDesc()
129 {
130 string orig, dest;
131
132 if (!Section.FindS("Description").empty())
133 orig = Section.FindS("Description").c_str();
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 }
141
142 char const * const codeset = nl_langinfo(CODESET);
143 if (strcmp(codeset,"UTF-8") != 0) {
144 UTF8ToCodeset(codeset, orig, &dest);
145 orig = dest;
146 }
147
148 return orig;
149 }
150 /*}}}*/
151
152 static const char *SourceVerSeparators = " ()";
153
154 // RecordParser::SourcePkg - Return the source package name if any /*{{{*/
155 // ---------------------------------------------------------------------
156 /* */
157 string debRecordParser::SourcePkg()
158 {
159 string Res = Section.FindS("Source");
160 string::size_type Pos = Res.find_first_of(SourceVerSeparators);
161 if (Pos == string::npos)
162 return Res;
163 return string(Res,0,Pos);
164 }
165 /*}}}*/
166 // RecordParser::SourceVer - Return the source version number if present /*{{{*/
167 // ---------------------------------------------------------------------
168 /* */
169 string 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 /*}}}*/
189 // RecordParser::GetRec - Return the whole record /*{{{*/
190 // ---------------------------------------------------------------------
191 /* */
192 void debRecordParser::GetRec(const char *&Start,const char *&Stop)
193 {
194 Section.GetSection(Start,Stop);
195 }
196 /*}}}*/