/usr/share/doc/discover/api-reference/vendor-xml_8c-source.html is in libdiscover-dev 2.1.2-5.2ubuntu1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 | <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
<title>discover: /home/pere/src/debiancvs/pkg-discover/discover/trunk/lib/vendor-xml.c Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.4.2 -->
<div class="qindex"><a class="qindex" href="index.html">Main Page</a> | <a class="qindex" href="modules.html">Modules</a> | <a class="qindex" href="annotated.html">Data Structures</a> | <a class="qindex" href="dirs.html">Directories</a> | <a class="qindex" href="files.html">File List</a> | <a class="qindex" href="functions.html">Data Fields</a> | <a class="qindex" href="globals.html">Globals</a></div>
<div class="nav">
<a class="el" href="dir_000002.html">lib</a></div>
<h1>vendor-xml.c</h1><a href="vendor-xml_8c.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment">00001
00011 <span class="comment">/* $Progeny$</span>
00012 <span class="comment"> *</span>
00013 <span class="comment"> * AUTHOR: John R. Daily <jdaily@progeny.com></span>
00014 <span class="comment"> *</span>
00015 <span class="comment"> * Copyright 2002 Progeny Linux Systems, Inc.</span>
00016 <span class="comment"> * Copyright 2002 Hewlett-Packard Company</span>
00017 <span class="comment"> *</span>
00018 <span class="comment"> * Permission is hereby granted, free of charge, to any person obtaining a</span>
00019 <span class="comment"> * copy of this software and associated documentation files (the "Software"),</span>
00020 <span class="comment"> * to deal in the Software without restriction, including without limitation</span>
00021 <span class="comment"> * the rights to use, copy, modify, merge, publish, distribute, sublicense,</span>
00022 <span class="comment"> * and/or sell copies of the Software, and to permit persons to whom the</span>
00023 <span class="comment"> * Software is furnished to do so, subject to the following conditions:</span>
00024 <span class="comment"> *</span>
00025 <span class="comment"> * The above copyright notice and this permission notice shall be included in</span>
00026 <span class="comment"> * all copies or substantial portions of the Software.</span>
00027 <span class="comment"> *</span>
00028 <span class="comment"> * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR</span>
00029 <span class="comment"> * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,</span>
00030 <span class="comment"> * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL</span>
00031 <span class="comment"> * THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER</span>
00032 <span class="comment"> * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING</span>
00033 <span class="comment"> * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER</span>
00034 <span class="comment"> * DEALINGS IN THE SOFTWARE.</span>
00035 <span class="comment"> */</span>
00036
00037 <span class="preprocessor">#include "config.h"</span>
00038
00039 <span class="preprocessor">#include <sys/types.h></span>
00040
00041 <span class="preprocessor">#include <assert.h></span>
00042 <span class="preprocessor">#include <limits.h></span>
00043 <span class="preprocessor">#include <stdio.h></span>
00044 <span class="preprocessor">#include <string.h></span>
00045
00046 <span class="preprocessor">#include <expat.h></span>
00047
00048 <span class="preprocessor">#include <<a class="code" href="discover_8h.html">discover/discover.h</a>></span>
00049 <span class="preprocessor">#include <<a class="code" href="discover-xml_8h.html">discover/discover-xml.h</a>></span>
00050
00051 <span class="preprocessor">#include <discover/load-url.h></span>
00052 <span class="preprocessor">#include <discover/utils.h></span>
00053
00055 <span class="keyword">struct </span>discover_xml_vendor {
00056 <span class="keywordtype">char</span> *id;
00057 <span class="keywordtype">char</span> *name;
00058 <a class="code" href="group__types.html#ga6">discover_xml_vendor_t</a> *next;
00059 };
00060
00061 <span class="keyword">static</span> <a class="code" href="group__types.html#ga6">discover_xml_vendor_t</a> *vendors[<a class="code" href="group__types.html#ga14">BUS_COUNT</a>];
00062
00064 <span class="keyword">struct </span>context {
00065 <a class="code" href="group__types.html#ga6">discover_xml_vendor_t</a> **vlist;
00066
00067 <span class="keywordtype">int</span> unknown_level; <span class="comment">/* How deep are we into unknown XML tags? */</span>
00068 };
00069
00070 <span class="keyword">static</span> <span class="keywordtype">char</span> *known_vendor_elements[] = {
00071 <span class="stringliteral">"vendor"</span>,
00072 <span class="stringliteral">"vendor_list"</span>,
00073 NULL
00074 };
00075
00076
00077 <span class="keyword">static</span> <span class="keywordtype">bool</span>
00078 unknown_vendor_element(<span class="keyword">const</span> XML_Char * <span class="keyword">const</span> tag)
00079 {
00080 <span class="keywordtype">int</span> i;
00081 <span class="keywordflow">for</span> (i = 0; known_vendor_elements[i] != NULL; i++) {
00082 <span class="keywordflow">if</span> (strcmp(tag, known_vendor_elements[i]) == 0)
00083 <span class="keywordflow">return</span> <span class="keyword">false</span>;
00084 }
00085 <span class="keywordflow">return</span> <span class="keyword">true</span>;
00086 }
00087
00088 <span class="keyword">static</span> <span class="keywordtype">void</span>
00089 start_element(<span class="keywordtype">void</span> *ctx, <span class="keyword">const</span> XML_Char *name, <span class="keyword">const</span> XML_Char *attrs[])
00090 {
00091 <span class="keyword">struct </span>context *context = ctx;
00092 <span class="keywordtype">int</span> i;
00093 <span class="keywordtype">char</span> *vid, *vname;
00094 <a class="code" href="group__types.html#ga6">discover_xml_vendor_t</a> *next, **vlist;
00095
00096 assert(context != NULL);
00097 assert(name != NULL);
00098 assert(attrs != NULL);
00099
00100 <span class="keywordflow">if</span> (unknown_vendor_element(name)) {
00101 context->unknown_level++;
00102 <span class="keywordflow">return</span>;
00103 }
00104
00105 <span class="keywordflow">if</span> (context->unknown_level > 0) {
00106 <span class="keywordflow">return</span>;
00107 }
00108
00109 <span class="keywordflow">if</span> (strcmp(name, <span class="stringliteral">"vendor"</span>) == 0) {
00110 vid = vname = NULL;
00111 <span class="keywordflow">for</span> (i = 0; attrs[i]; i += 2) {
00112 <span class="keywordflow">if</span> (strcmp(attrs[i], <span class="stringliteral">"id"</span>) == 0) {
00113 vid = (<span class="keywordtype">char</span> *) attrs[i + 1];
00114 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (strcmp(attrs[i], <span class="stringliteral">"name"</span>) == 0) {
00115 vname = (<span class="keywordtype">char</span> *) attrs[i + 1];
00116 }
00117 }
00118
00119 assert(vid != NULL);
00120 assert(vname != NULL);
00121
00122 vlist = context->vlist;
00123 next = *vlist;
00124 *vlist = <a class="code" href="group__vendor__xml.html#ga7">discover_xml_vendor_new</a>();
00125 (*vlist)->id = _discover_xstrdup(vid);
00126 (*vlist)->name = _discover_xstrdup(vname);
00127 (*vlist)->next = next;
00128 }
00129 }
00130
00131 <span class="keyword">static</span> <span class="keywordtype">void</span>
00132 end_element(<span class="keywordtype">void</span> *ctx, <span class="keyword">const</span> XML_Char *name)
00133 {
00134 <span class="keyword">struct </span>context *context = ctx;
00135
00136 assert(context != NULL);
00137 assert(name != NULL);
00138
00139 <span class="keywordflow">if</span> (unknown_vendor_element(name)) {
00140 context->unknown_level--;
00141 <span class="keywordflow">return</span>;
00142 }
00143
00144 <span class="keywordflow">if</span> (context->unknown_level > 0) {
00145 <span class="keywordflow">return</span>;
00146 }
00147
00148 <span class="comment">/*</span>
00149 <span class="comment"> * We don't have any end tags to worry about, but if we did, they</span>
00150 <span class="comment"> * would be handled here.</span>
00151 <span class="comment"> */</span>
00152 }
00153
00166 <span class="comment">/* Sshh! Don't tell, but this doesn't actually do any merging at all.</span>
00167 <span class="comment"> * Instead, it simply inserts newer entries at the front of the list,</span>
00168 <span class="comment"> * meaning that vendor info found later supersedes info found earlier.</span>
00169 <span class="comment"> * This gives the illusion of merging, but potentially wastes memory</span>
00170 <span class="comment"> * with duplicates.</span>
00171 <span class="comment"> */</span>
00172 <span class="keywordtype">void</span>
<a name="l00173"></a><a class="code" href="group__vendor__xml.html#ga0">00173</a> <a class="code" href="group__vendor__xml.html#ga0">discover_xml_merge_vendor_url</a>(<a class="code" href="group__types.html#ga6">discover_xml_vendor_t</a> **vlist,
00174 <span class="keywordtype">char</span> *url, <a class="code" href="structdiscover__error.html">discover_error_t</a> *status)
00175 {
00176 XML_Parser parser;
00177 <span class="keyword">struct </span>context context;
00178
00179 assert(url != NULL);
00180 assert(status != NULL);
00181
00182 status-><a class="code" href="structdiscover__error.html#o0">code</a> = 0;
00183
00184 context.vlist = vlist;
00185 context.unknown_level = 0;
00186
00187 parser = XML_ParserCreate(NULL);
00188 XML_SetElementHandler(parser, start_element, end_element);
00189 XML_SetUserData(parser, &context);
00190
00191 <span class="keywordflow">if</span> (!_discover_load_url(url, parser)) {
00192 XML_ParserFree(parser);
00193 status-><a class="code" href="structdiscover__error.html#o0">code</a> = <a class="code" href="group__types.html#gga15a16">DISCOVER_EIO</a>;
00194 <span class="keywordflow">return</span>;
00195 }
00196
00197 <span class="keywordflow">if</span> (!XML_Parse(parser, <span class="stringliteral">""</span>, 0, 1)) {
00198 XML_ParserFree(parser);
00199 status-><a class="code" href="structdiscover__error.html#o0">code</a> = <a class="code" href="group__types.html#gga15a17">DISCOVER_EXML</a>;
00200 <span class="keywordflow">return</span>;
00201 }
00202
00203 XML_ParserFree(parser);
00204
00205 <span class="keywordflow">return</span>;
00206 }
00207
00214 <a class="code" href="group__types.html#ga6">discover_xml_vendor_t</a> *
<a name="l00215"></a><a class="code" href="group__vendor__xml.html#ga1">00215</a> <a class="code" href="group__vendor__xml.html#ga1">discover_xml_get_vendors</a>(<a class="code" href="group__types.html#ga16">discover_bus_t</a> bus, <a class="code" href="structdiscover__error.html">discover_error_t</a> *status)
00216 {
00217 <a class="code" href="group__types.html#ga7">discover_xml_url_t</a> *urls, *i;
00218 <span class="keywordtype">char</span> *url;
00219
00220 assert(status != NULL);
00221
00222 status-><a class="code" href="structdiscover__error.html#o0">code</a> = 0;
00223
00224 <span class="keywordflow">if</span> (!vendors[bus]) {
00225 urls = <a class="code" href="group__url__xml.html#ga2">discover_xml_get_data_urls</a>(bus, VENDOR_TYPE, status);
00226 <span class="keywordflow">if</span> (status-><a class="code" href="structdiscover__error.html#o0">code</a> != 0) {
00227 <span class="keywordflow">return</span> NULL;
00228 }
00229
00230 <span class="keywordflow">for</span> (i = urls;
00231 i;
00232 i = <a class="code" href="group__url__xml.html#ga10">discover_xml_url_get_next</a>(i)) {
00233 url = <a class="code" href="group__url__xml.html#ga6">discover_xml_url_get_url</a>(i);
00234 <a class="code" href="group__vendor__xml.html#ga0">discover_xml_merge_vendor_url</a>(&(vendors[bus]), url, status);
00235 <span class="keywordflow">if</span> (status-><a class="code" href="structdiscover__error.html#o0">code</a> != 0) {
00236 <span class="keywordflow">return</span> NULL;
00237 }
00238 }
00239 }
00240
00241 <span class="keywordflow">return</span> vendors[bus];
00242 }
00243
00247 <span class="keywordtype">void</span>
<a name="l00248"></a><a class="code" href="group__vendor__xml.html#ga2">00248</a> <a class="code" href="group__vendor__xml.html#ga2">discover_xml_free_vendors</a>(<span class="keywordtype">void</span>)
00249 {
00250 <span class="keywordtype">int</span> i;
00251 <span class="keywordflow">for</span> (i = 0; i < <a class="code" href="group__types.html#ga14">BUS_COUNT</a>; i++) {
00252 <a class="code" href="group__vendor__xml.html#ga8">discover_xml_vendor_free</a>(vendors[i]);
00253 vendors[i] = NULL;
00254 }
00255 }
00256
00263 <span class="keywordtype">char</span> *
<a name="l00264"></a><a class="code" href="group__vendor__xml.html#ga3">00264</a> <a class="code" href="group__vendor__xml.html#ga3">discover_xml_vendor_id2name</a>(<a class="code" href="group__types.html#ga6">discover_xml_vendor_t</a> *vendors, <span class="keywordtype">char</span> *<span class="keywordtype">id</span>)
00265 {
00266 <a class="code" href="group__types.html#ga6">discover_xml_vendor_t</a> *vendor;
00267 <span class="keywordtype">char</span> *name;
00268
00269 assert(vendors != NULL);
00270 assert(<span class="keywordtype">id</span> != NULL);
00271
00272 name = NULL;
00273
00274 <span class="keywordflow">for</span> (vendor = vendors;
00275 vendor;
00276 vendor = vendor->next) {
00277 <span class="keywordflow">if</span> (strcmp(<span class="keywordtype">id</span>, vendor->id) == 0) {
00278 name = vendor->name;
00279 <span class="keywordflow">break</span>;
00280 }
00281 }
00282
00283 <span class="keywordflow">return</span> name;
00284 }
00285
00289 <span class="keywordtype">char</span> *
<a name="l00290"></a><a class="code" href="group__vendor__xml.html#ga4">00290</a> <a class="code" href="group__vendor__xml.html#ga4">discover_xml_vendor_get_id</a>(<a class="code" href="group__types.html#ga6">discover_xml_vendor_t</a> *vendor)
00291 {
00292 assert(vendor != NULL);
00293
00294 <span class="keywordflow">return</span> vendor->id;
00295 }
00296
00300 <span class="keywordtype">char</span> *
<a name="l00301"></a><a class="code" href="group__vendor__xml.html#ga5">00301</a> <a class="code" href="group__vendor__xml.html#ga5">discover_xml_vendor_get_name</a>(<a class="code" href="group__types.html#ga6">discover_xml_vendor_t</a> *vendor)
00302 {
00303 assert(vendor != NULL);
00304
00305 <span class="keywordflow">return</span> vendor->name;
00306 }
00307
00311 <a class="code" href="group__types.html#ga6">discover_xml_vendor_t</a> *
<a name="l00312"></a><a class="code" href="group__vendor__xml.html#ga6">00312</a> <a class="code" href="group__vendor__xml.html#ga6">discover_xml_vendor_get_next</a>(<a class="code" href="group__types.html#ga6">discover_xml_vendor_t</a> *vendor)
00313 {
00314 assert(vendor != NULL);
00315
00316 <span class="keywordflow">return</span> vendor->next;
00317 }
00318
00322 <a class="code" href="group__types.html#ga6">discover_xml_vendor_t</a> *
<a name="l00323"></a><a class="code" href="group__vendor__xml.html#ga7">00323</a> <a class="code" href="group__vendor__xml.html#ga7">discover_xml_vendor_new</a>(<span class="keywordtype">void</span>)
00324 {
00325 <a class="code" href="group__types.html#ga6">discover_xml_vendor_t</a> *<span class="keyword">new</span>;
00326
00327 <span class="keyword">new</span> = _discover_xmalloc(<span class="keyword">sizeof</span>(<a class="code" href="group__types.html#ga6">discover_xml_vendor_t</a>));
00328
00329 <span class="keyword">new</span>->id = NULL;
00330 <span class="keyword">new</span>->name = NULL;
00331 <span class="keyword">new</span>->next = NULL;
00332
00333 <span class="keywordflow">return</span> <span class="keyword">new</span>;
00334 }
00335
00341 <span class="keywordtype">void</span>
<a name="l00342"></a><a class="code" href="group__vendor__xml.html#ga8">00342</a> <a class="code" href="group__vendor__xml.html#ga8">discover_xml_vendor_free</a>(<a class="code" href="group__types.html#ga6">discover_xml_vendor_t</a> *vendors)
00343 {
00344 <a class="code" href="group__types.html#ga6">discover_xml_vendor_t</a> *vendor, *last;
00345
00346 last = NULL;
00347
00348 <span class="keywordflow">for</span> (vendor = vendors;
00349 vendor;
00350 vendor = vendor->next) {
00351 <span class="keywordflow">if</span> (vendor->id) {
00352 free(vendor->id);
00353 }
00354
00355 <span class="keywordflow">if</span> (vendor->name) {
00356 free(vendor->name);
00357 }
00358
00359 <span class="keywordflow">if</span> (last) {
00360 free(last);
00361 }
00362 last = vendor;
00363 }
00364
00365 <span class="keywordflow">if</span> (last) {
00366 free(last);
00367 }
00368 }
00369
00372 <span class="comment">/*</span>
00373 <span class="comment"> * Local variables:</span>
00374 <span class="comment"> * c-file-style: "progeny"</span>
00375 <span class="comment"> * indent-tabs-mode: nil</span>
00376 <span class="comment"> * End:</span>
00377 <span class="comment"> */</span>
00378 <span class="comment">/* vim: set cin fo=tcroq sw=4 et sts=4 tw=75: */</span>
</pre></div><hr size="1"><address style="align: right;"><small>Generated on Thu Jul 28 03:38:00 2005 for discover by
<a href="http://www.doxygen.org/index.html">
<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.2 </small></address>
</body>
</html>
|