GCC Code Coverage Report


Directory: ./
File: pdserv-1.1.0/src/msrproto/Attribute.cpp
Date: 2026-09-27 04:07:30
Exec Total Coverage
Lines: 0 94 0.0%
Branches: 0 166 0.0%

Line Branch Exec Source
1 /*****************************************************************************
2 *
3 * $Id$
4 *
5 * Copyright 2010 Richard Hacker (lerichi at gmx dot net)
6 *
7 * This file is part of the pdserv library.
8 *
9 * The pdserv library is free software: you can redistribute it and/or modify
10 * it under the terms of the GNU Lesser General Public License as published
11 * by the Free Software Foundation, either version 3 of the License, or (at
12 * your option) any later version.
13 *
14 * The pdserv library is distributed in the hope that it will be useful, but
15 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
16 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
17 * License for more details.
18 *
19 * You should have received a copy of the GNU Lesser General Public License
20 * along with the pdserv library. If not, see <http://www.gnu.org/licenses/>.
21 *
22 *****************************************************************************/
23
24 #include "Attribute.h"
25
26 #include <cstring>
27 #include <algorithm>
28 #include <sstream>
29 #include <locale>
30
31 using namespace MsrProto;
32
33 /////////////////////////////////////////////////////////////////////////////
34 ✗ void Attr::clear()
35 {
36 ✗ id = 0;
37 ✗ _id.clear();
38 ✗ attrMap.clear();
39 }
40
41 /////////////////////////////////////////////////////////////////////////////
42 ✗ void Attr::adjust(ptrdiff_t delta)
43 {
44 ✗ for (AttrMap::iterator it = attrMap.begin(); it != attrMap.end(); it++) {
45 ✗ it->second.name += delta;
46 ✗ it->second.value += delta;
47 }
48 }
49
50 /////////////////////////////////////////////////////////////////////////////
51 ✗ void Attr::insert(const char *name)
52 {
53 //cout << "Binary attribute: Name=" << std::string(name, nameLen) << endl;
54 ✗ AttrPtrs a = {name, 0};
55 ✗ attrMap.insert(std::pair<size_t,AttrPtrs>(strlen(name), a));
56 }
57
58 /////////////////////////////////////////////////////////////////////////////
59 ✗ void Attr::insert(const char *name, char *value)
60 {
61 //cout << "Value attribute: Name=" << std::string(name, nameLen)
62 //<< ", Value=" << std::string(value, valueLen)
63 //<< endl;
64 ✗ size_t len = strlen(name);
65
66 ✗ if (len == 2 and !strncmp(name, "id", 2)) {
67 ✗ _id.assign(value);
68 ✗ id = &_id;
69 ✗ return;
70 }
71
72 ✗ AttrPtrs a = {name, value};
73 ✗ attrMap.insert(std::pair<size_t,AttrPtrs>(len, a));
74 }
75
76 /////////////////////////////////////////////////////////////////////////////
77 ✗ bool Attr::find(const char *name, char * &value) const
78 {
79 ✗ size_t len = strlen(name);
80 std::pair<AttrMap::const_iterator, AttrMap::const_iterator>
81 ✗ ret(attrMap.equal_range(len));
82
83 ✗ for (AttrMap::const_iterator it(ret.first); it != ret.second; it++) {
84 ✗ if (!strncasecmp(name, it->second.name, len)) {
85 ✗ value = it->second.value;
86 ✗ return true;
87 }
88 }
89
90 ✗ return false;
91 }
92
93 /////////////////////////////////////////////////////////////////////////////
94 ✗ bool Attr::isEqual(const char *name, const char *s) const
95 {
96 ✗ char *value;
97
98 ✗ if (find(name, value) and value)
99 ✗ return !strcasecmp(value, s);
100
101 ✗ return false;
102 }
103
104 /////////////////////////////////////////////////////////////////////////////
105 ✗ bool Attr::isTrue(const char *name) const
106 {
107 ✗ char *value;
108
109 ✗ if (!(find(name, value)))
110 ✗ return false;
111
112 // Binary attribute, e.g <xsad sync>
113 ✗ if (!value)
114 ✗ return true;
115
116 ✗ size_t len = strlen(value);
117
118 // Binary attribute, e.g <xsad sync=1 >
119 ✗ if (len == 1)
120 ✗ return *value == '1';
121
122 // Binary attribute, e.g <xsad sync="true">
123 ✗ if (len == 4)
124 ✗ return !strncasecmp(value, "true", 4);
125
126 // Binary attribute, e.g <xsad sync='on'/>
127 ✗ if (len == 2)
128 ✗ return !strncasecmp(value, "on", 2);
129
130 ✗ return false;
131 }
132
133 /////////////////////////////////////////////////////////////////////////////
134 ✗ bool Attr::getString(const char *name, std::string &s) const
135 {
136 ✗ char *value;
137
138 ✗ s.clear();
139
140 ✗ if (!(find(name, value)) or !value)
141 ✗ return false;
142
143 ✗ char *pptr, *eptr = value + strlen(value);
144 ✗ while ((pptr = std::find(value, eptr, '&')) != eptr) {
145 ✗ s.append(value, pptr - value);
146 ✗ size_t len = eptr - pptr;
147 ✗ if (len > 4 and !strncmp(pptr, "&gt;", 4)) {
148 ✗ s.append(1, '>');
149 ✗ value = pptr + 4;
150 }
151 ✗ else if (len > 4 and !strncmp(pptr, "&lt;", 4)) {
152 ✗ s.append(1, '<');
153 ✗ value = pptr + 4;
154 }
155 ✗ else if (len > 5 and !strncmp(pptr, "&amp;", 5)) {
156 ✗ s.append(1, '&');
157 ✗ value = pptr + 5;
158 }
159 ✗ else if (len > 6 and !strncmp(pptr, "&quot;", 6)) {
160 ✗ s.append(1, '"');
161 ✗ value = pptr + 6;
162 }
163 ✗ else if (len > 6 and !strncmp(pptr, "&apos;", 6)) {
164 ✗ s.append(1, '\'');
165 ✗ value = pptr + 6;
166 }
167 else {
168 ✗ s.append(1, '&');
169 ✗ value = pptr + 1;
170 }
171 }
172
173 ✗ s.append(value, eptr - value);
174 ✗ return true;
175 }
176
177 /////////////////////////////////////////////////////////////////////////////
178 ✗ bool Attr::getUnsigned(const char *name, unsigned int &i) const
179 {
180 ✗ char *value;
181
182 ✗ if (!(find(name, value)) or !value)
183 ✗ return false;
184
185 ✗ i = strtoul(value, 0, 0);
186 ✗ return true;
187 }
188
189 /////////////////////////////////////////////////////////////////////////////
190 ✗ bool Attr::getUnsignedList(const char *name,
191 std::list<unsigned int> &intList) const
192 {
193 ✗ char *value;
194
195 ✗ if (!(find(name, value)) or !value)
196 ✗ return false;
197
198 ✗ std::istringstream is(value);
199 ✗ is.imbue(std::locale::classic());
200
201 ✗ while (is) {
202 ✗ unsigned int i;
203 ✗ char comma;
204
205 ✗ is >> i;
206 ✗ if (is)
207 ✗ intList.push_back(i);
208 ✗ is >> comma;
209 }
210
211 ✗ return true;
212 }
213