working apt-get source
[ntk/apt.git] / apt-pkg / deb / debsrcrecords.cc
1 // -*- mode: cpp; mode: fold -*-
2 // Description /*{{{*/
3 // $Id: debsrcrecords.cc,v 1.3 1999/04/07 05:30:18 jgg Exp $
4 /* ######################################################################
5
6 Debian Source Package Records - Parser implementation for Debian style
7 source indexes
8
9 ##################################################################### */
10 /*}}}*/
11 // Include Files /*{{{*/
12 #ifdef __GNUG__
13 #pragma implementation "apt-pkg/debsrcrecords.h"
14 #endif
15
16 #include <apt-pkg/debsrcrecords.h>
17 #include <apt-pkg/error.h>
18 #include <apt-pkg/strutl.h>
19 /*}}}*/
20
21 // SrcRecordParser::Binaries - Return the binaries field /*{{{*/
22 // ---------------------------------------------------------------------
23 /* This member parses the binaries field into a pair of class arrays and
24 returns a list of strings representing all of the components of the
25 binaries field. The returned array need not be freed and will be
26 reused by the next Binaries function call. */
27 const char **debSrcRecordParser::Binaries()
28 {
29 string Bins = Sect.FindS("Binary");
30 char *Buf = Buffer;
31 unsigned int Bin = 0;
32 if (Bins.empty() == true)
33 return 0;
34
35 // Strip any leading spaces
36 string::const_iterator Start = Bins.begin();
37 for (; Start != Bins.end() && isspace(*Start) != 0; Start++);
38
39 string::const_iterator Pos = Start;
40 while (Pos != Bins.end())
41 {
42 // Skip to the next ','
43 for (; Pos != Bins.end() && *Pos != ','; Pos++);
44
45 // Back remove spaces
46 string::const_iterator End = Pos;
47 for (; End > Start && (End[-1] == ',' || isspace(End[-1]) != 0); End--);
48
49 // Stash the string
50 memcpy(Buf,Start,End-Start);
51 StaticBinList[Bin] = Buf;
52 Bin++;
53 Buf += End-Start;
54 *Buf++ = 0;
55
56 // Advance pos
57 for (; Pos != Bins.end() && (*Pos == ',' || isspace(*Pos) != 0); Pos++);
58 Start = Pos;
59 }
60
61 StaticBinList[Bin] = 0;
62 return StaticBinList;
63 }
64 /*}}}*/
65 // SrcRecordParser::Files - Return a list of files for this source /*{{{*/
66 // ---------------------------------------------------------------------
67 /* This parses the list of files and returns it, each file is required to have
68 a complete source package */
69 bool debSrcRecordParser::Files(vector<pkgSrcRecords::File> &List)
70 {
71 List.erase(List.begin(),List.end());
72
73 string Files = Sect.FindS("Files");
74 if (Files.empty() == true)
75 return false;
76
77 // Stash the / terminated directory prefix
78 string Base = Sect.FindS("Directory");
79 if (Base.empty() == false && Base[Base.length()-1] != '/')
80 Base += '/';
81
82 // Iterate over the entire list grabbing each triplet
83 const char *C = Files.c_str();
84 while (*C != 0)
85 {
86 pkgSrcRecords::File F;
87 string Size;
88
89 // Parse each of the elements
90 if (ParseQuoteWord(C,F.MD5Hash) == false ||
91 ParseQuoteWord(C,Size) == false ||
92 ParseQuoteWord(C,F.Path) == false)
93 return _error->Error("Error parsing file record");
94
95 // Parse the size and append the directory
96 F.Size = atoi(Size.c_str());
97 F.Path = Base + F.Path;
98 List.push_back(F);
99 }
100
101 return true;
102 }
103 /*}}}*/