* merged some more missing bits
[ntk/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 #ifdef __GNUG__
12 #pragma implementation "apt-pkg/debrecords.h"
13 #endif
14 #include <apt-pkg/debrecords.h>
15 #include <apt-pkg/strutl.h>
16 #include <apt-pkg/error.h>
17 #include <langinfo.h>
18 /*}}}*/
19
20 // RecordParser::debRecordParser - Constructor /*{{{*/
21 // ---------------------------------------------------------------------
22 /* */
23 debRecordParser::debRecordParser(string FileName,pkgCache &Cache) :
24 File(FileName,FileFd::ReadOnly),
25 Tags(&File,Cache.Head().MaxVerFileSize + 200)
26 {
27 }
28 /*}}}*/
29 // RecordParser::Jump - Jump to a specific record /*{{{*/
30 // ---------------------------------------------------------------------
31 /* */
32 bool debRecordParser::Jump(pkgCache::VerFileIterator const &Ver)
33 {
34 return Tags.Jump(Section,Ver->Offset);
35 }
36 bool debRecordParser::Jump(pkgCache::DescFileIterator const &Desc)
37 {
38 return Tags.Jump(Section,Desc->Offset);
39 }
40 /*}}}*/
41 // RecordParser::FileName - Return the archive filename on the site /*{{{*/
42 // ---------------------------------------------------------------------
43 /* */
44 string debRecordParser::FileName()
45 {
46 return Section.FindS("Filename");
47 }
48 /*}}}*/
49 // RecordParser::Name - Return the package name /*{{{*/
50 // ---------------------------------------------------------------------
51 /* */
52 string debRecordParser::Name()
53 {
54 return Section.FindS("Package");
55 }
56 /*}}}*/
57 // RecordParser::MD5Hash - Return the archive hash /*{{{*/
58 // ---------------------------------------------------------------------
59 /* */
60 string debRecordParser::MD5Hash()
61 {
62 return Section.FindS("MD5Sum");
63 }
64 /*}}}*/
65 // RecordParser::SHA1Hash - Return the archive hash /*{{{*/
66 // ---------------------------------------------------------------------
67 /* */
68 string debRecordParser::SHA1Hash()
69 {
70 return Section.FindS("SHA1");
71 }
72 /*}}}*/
73 // RecordParser::Maintainer - Return the maintainer email /*{{{*/
74 // ---------------------------------------------------------------------
75 /* */
76 string debRecordParser::Maintainer()
77 {
78 return Section.FindS("Maintainer");
79 }
80 /*}}}*/
81 // RecordParser::ShortDesc - Return a 1 line description /*{{{*/
82 // ---------------------------------------------------------------------
83 /* */
84 string debRecordParser::ShortDesc()
85 {
86 string Res = LongDesc();
87 string::size_type Pos = Res.find('\n');
88 if (Pos == string::npos)
89 return Res;
90 return string(Res,0,Pos);
91 }
92 /*}}}*/
93 // RecordParser::LongDesc - Return a longer description /*{{{*/
94 // ---------------------------------------------------------------------
95 /* */
96 string debRecordParser::LongDesc()
97 {
98 string orig, dest;
99 char *codeset = nl_langinfo(CODESET);
100
101 if (!Section.FindS("Description").empty())
102 orig = Section.FindS("Description").c_str();
103 else
104 orig = Section.FindS(("Description-" + pkgIndexFile::LanguageCode()).c_str()).c_str();
105
106 if (strcmp(codeset,"UTF-8") != 0) {
107 UTF8ToCodeset(codeset, orig, &dest);
108 orig = dest;
109 }
110
111 return orig;
112 }
113 /*}}}*/
114
115 static const char *SourceVerSeparators = " ()";
116
117 // RecordParser::SourcePkg - Return the source package name if any /*{{{*/
118 // ---------------------------------------------------------------------
119 /* */
120 string debRecordParser::SourcePkg()
121 {
122 string Res = Section.FindS("Source");
123 string::size_type Pos = Res.find_first_of(SourceVerSeparators);
124 if (Pos == string::npos)
125 return Res;
126 return string(Res,0,Pos);
127 }
128 /*}}}*/
129 // RecordParser::SourceVer - Return the source version number if present /*{{{*/
130 // ---------------------------------------------------------------------
131 /* */
132 string debRecordParser::SourceVer()
133 {
134 string Pkg = Section.FindS("Source");
135 string::size_type Pos = Pkg.find_first_of(SourceVerSeparators);
136 if (Pos == string::npos)
137 return "";
138
139 string::size_type VerStart = Pkg.find_first_not_of(SourceVerSeparators, Pos);
140 if(VerStart == string::npos)
141 return "";
142
143 string::size_type VerEnd = Pkg.find_first_of(SourceVerSeparators, VerStart);
144 if(VerEnd == string::npos)
145 // Corresponds to the case of, e.g., "foo (1.2" without a closing
146 // paren. Be liberal and guess what it means.
147 return string(Pkg, VerStart);
148 else
149 return string(Pkg, VerStart, VerEnd - VerStart);
150 }
151 /*}}}*/
152 // RecordParser::GetRec - Return the whole record /*{{{*/
153 // ---------------------------------------------------------------------
154 /* */
155 void debRecordParser::GetRec(const char *&Start,const char *&Stop)
156 {
157 Section.GetSection(Start,Stop);
158 }
159 /*}}}*/