source: appstream-generator/src/asgen/backends/debian/tagfile.d @ 4841

Last change on this file since 4841 was 4841, checked in by Juanma, 2 years ago

Initial release

File size: 2.9 KB
Line 
1/*
2 * Copyright (C) 2016 Matthias Klumpp <matthias@tenstral.net>
3 *
4 * Licensed under the GNU Lesser General Public License Version 3
5 *
6 * This program is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU Lesser General Public License as published by
8 * the Free Software Foundation, either version 3 of the license, or
9 * (at your option) any later version.
10 *
11 * This software is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 * GNU Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public License
17 * along with this software.  If not, see <http://www.gnu.org/licenses/>.
18 */
19
20module asgen.backends.debian.tagfile;
21
22import std.stdio;
23import std.string;
24import asgen.zarchive;
25import asgen.logging;
26
27
28final class TagFile
29{
30
31private:
32    string[] content;
33    uint pos;
34
35public:
36
37    this ()
38    {
39    }
40
41    void open (string fname)
42    {
43        content = null;
44        string data;
45
46        try {
47            data = decompressFile (fname);
48        } catch (Exception e) {
49            throw e;
50        }
51
52        content = splitLines (data);
53        pos = 0;
54    }
55
56    void first () {
57        pos = 0;
58    }
59
60    bool nextSection ()
61    {
62        bool breakNext = false;
63        auto clen = content.length;
64
65        if (pos >= clen)
66            return false;
67
68        uint i;
69        for (i = pos; i < clen; i++) {
70            if (content[i] == "") {
71                pos = i + 1;
72                breakNext = true;
73            } else if (breakNext) {
74                break;
75            }
76        }
77
78        // check if we reached the end of this file
79        if (i == clen)
80            pos = cast(uint) clen;
81
82        if (pos >= clen)
83            return false;
84
85        return true;
86    }
87
88    string readField (string name)
89    {
90        auto clen = content.length;
91
92        for (auto i = pos; i < clen; i++) {
93            if (content[i] == "")
94                break;
95
96            auto fdata = chompPrefix (content[i], name ~ ":");
97            if (fdata == content[i])
98                continue;
99
100            if ((i+1 >= clen)
101                || (!startsWith (content[i+1], " "))) {
102                    // we have a single-line field
103                    return strip (fdata);
104            } else {
105                // we have a multi-line field
106                auto fdata_ml = strip (fdata);
107                for (auto j = i+1; j < clen; j++) {
108                    auto slice = chompPrefix (content[j], " ");
109                    if (slice == content[j])
110                        break;
111
112                    if (fdata_ml == "")
113                        fdata_ml = slice;
114                    else
115                        fdata_ml ~= "\n" ~ slice;
116                }
117
118                return fdata_ml;
119            }
120        }
121
122        // we found nothing
123        return null;
124    }
125}
Note: See TracBrowser for help on using the repository browser.