ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/libspf/docs/API/doxygen/html/macro_8c-source.html
Revision: 1.1
Committed: Tue Nov 13 00:51:26 2007 UTC (18 years, 10 months ago) by root
Content type: text/html
Branch: MAIN
CVS Tags: HEAD
Log Message:
initial import of libspf-1.0.0-p5 from freebsd ports

File Contents

# Content
1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
2 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
3 <title>libSPF v1.0: macro.c Source File</title>
4 <link href="doxygen.css" rel="stylesheet" type="text/css">
5 </head><body>
6 <!-- Generated by Doxygen 1.3.8 -->
7 <div class="qindex"> <form class="search" action="search.php" method="get">
8 <a class="qindex" href="main.html">Main&nbsp;Page</a> | <a class="qindex" href="annotated.html">Data&nbsp;Structures</a> | <a class="qindex" href="files.html">File&nbsp;List</a> | <a class="qindex" href="functions.html">Data&nbsp;Fields</a> | <a class="qindex" href="globals.html">Globals</a> | <span class="search"><u>S</u>earch&nbsp;for&nbsp;<input class="search" type="text" name="query" value="" size="20" accesskey="s"/></span></form></div>
9 <h1>macro.c</h1><a href="macro_8c.html">Go to the documentation of this file.</a><pre class="fragment"><div>00001 <span class="comment">/* libspf - Sender Policy Framework library</span>
10 00002 <span class="comment">*</span>
11 00003 <span class="comment">* ANSI C implementation of spf-draft-200405.txt</span>
12 00004 <span class="comment">*</span>
13 00005 <span class="comment">* Author: James Couzens &lt;jcouzens@codeshare.ca&gt;</span>
14 00006 <span class="comment">* Author: Sean Comeau &lt;scomeau@obscurity.org&gt;</span>
15 00007 <span class="comment">*</span>
16 00008 <span class="comment">* File: util.c</span>
17 00009 <span class="comment">* Desc: Utility functions</span>
18 00010 <span class="comment">*</span>
19 00011 <span class="comment">* License:</span>
20 00012 <span class="comment">*</span>
21 00013 <span class="comment">* The libspf Software License, Version 1.0</span>
22 00014 <span class="comment">*</span>
23 00015 <span class="comment">* Copyright (c) 2004 James Couzens &amp; Sean Comeau All rights</span>
24 00016 <span class="comment">* reserved.</span>
25 00017 <span class="comment">*</span>
26 00018 <span class="comment">* Redistribution and use in source and binary forms, with or without</span>
27 00019 <span class="comment">* modification, are permitted provided that the following conditions</span>
28 00020 <span class="comment">* are met:</span>
29 00021 <span class="comment">*</span>
30 00022 <span class="comment">* 1. Redistributions of source code must retain the above copyright</span>
31 00023 <span class="comment">* notice, this list of conditions and the following disclaimer.</span>
32 00024 <span class="comment">*</span>
33 00025 <span class="comment">* 2. Redistributions in binary form must reproduce the above copyright</span>
34 00026 <span class="comment">* notice, this list of conditions and the following disclaimer in</span>
35 00027 <span class="comment">* the documentation and/or other materials provided with the</span>
36 00028 <span class="comment">* distribution.</span>
37 00029 <span class="comment">*</span>
38 00030 <span class="comment">* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED</span>
39 00031 <span class="comment">* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES</span>
40 00032 <span class="comment">* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE</span>
41 00033 <span class="comment">* DISCLAIMED. IN NO EVENT SHALL THE AUTHORS MAKING USE OF THIS LICESEN</span>
42 00034 <span class="comment">* OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,</span>
43 00035 <span class="comment">* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT</span>
44 00036 <span class="comment">* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF</span>
45 00037 <span class="comment">* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND</span>
46 00038 <span class="comment">* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,</span>
47 00039 <span class="comment">* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT</span>
48 00040 <span class="comment">* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF</span>
49 00041 <span class="comment">* SUCH DAMAGE.</span>
50 00042 <span class="comment">*</span>
51 00043 <span class="comment">*/</span>
52 00044
53 00045 <span class="preprocessor">#include "<a class="code" href="spf_8h.html">spf.h</a>"</span>
54 00046 <span class="preprocessor">#include "<a class="code" href="dns_8h.html">dns.h</a>"</span>
55 00047 <span class="preprocessor">#include "<a class="code" href="macro_8h.html">macro.h</a>"</span>
56 00048 <span class="preprocessor">#include "<a class="code" href="util_8h.html">util.h</a>"</span>
57 00049
58 00050
59 00051 <span class="comment">/* MACRO_expand</span>
60 00052 <span class="comment">*</span>
61 00053 <span class="comment">* Author: Sean Comeau &lt;scomeau@obscurity.org&gt;</span>
62 00054 <span class="comment">* Author: James Couzens &lt;jcouzens@codeshare.ca&gt;</span>
63 00055 <span class="comment">*</span>
64 00056 <span class="comment">* Date: 01/18/04</span>
65 00057 <span class="comment">* Updated: 06/29/04 Roger Moser &lt;Roger.Moser@pamho.net&gt;</span>
66 00058 <span class="comment">*</span>
67 00059 <span class="comment">* Desc:</span>
68 00060 <span class="comment">* Walks a string of macros tokenizing and expanding them along the</span>
69 00061 <span class="comment">* way, each token being inserted as a node into a linked list. Once the</span>
70 00062 <span class="comment">* walk is complete the list is walked and the nodes are copied back out</span>
71 00063 <span class="comment">* in the order they were added as expanded macros into a string which is</span>
72 00064 <span class="comment">* then passed back to the calling function.</span>
73 00065 <span class="comment">*</span>
74 00066 <span class="comment">* MACRO_freebuf is removed and I moved the code inside of this function since</span>
75 00067 <span class="comment">* before calling it, it was being walked anyway to copy out each string into</span>
76 00068 <span class="comment">* the return buffer, so now it just free's directly after and then destructs.</span>
77 00069 <span class="comment">*</span>
78 00070 <span class="comment">*/</span>
79 <a name="l00071"></a><a class="code" href="macro_8h.html#a1">00071</a> <span class="keywordtype">char</span> *<a class="code" href="macro_8h.html#a1">MACRO_expand</a>(<a class="code" href="structpeer__info__s.html">peer_info_t</a> *p, <span class="keyword">const</span> <span class="keywordtype">char</span> *s)
80 00072 {
81 00073 <span class="keyword">const</span> <span class="keywordtype">char</span> * <span class="keyword">const</span> macro_p = <span class="stringliteral">"%"</span>; <span class="comment">/* % (literal) */</span>
82 00074 <span class="keyword">const</span> <span class="keywordtype">char</span> * <span class="keyword">const</span> macro_d = <span class="stringliteral">"%20"</span>; <span class="comment">/* "URL" space */</span>
83 00075 <span class="keyword">const</span> <span class="keywordtype">char</span> * <span class="keyword">const</span> macro_u = <span class="stringliteral">" "</span>; <span class="comment">/* whitespace */</span>
84 00076
85 00077 <span class="keywordtype">char</span> *buf; <span class="comment">/* return buffer */</span>
86 00078 <span class="keywordtype">char</span> *ptr; <span class="comment">/* working pointer */</span>
87 00079 <span class="keywordtype">char</span> *cp; <span class="comment">/* working pointer */</span>
88 00080 <span class="keywordtype">char</span> *macro;
89 00081 <span class="keywordtype">char</span> *s_macro; <span class="comment">/* single char macro */</span>
90 00082
91 00083 <a class="code" href="structstrbuf__s.html">strbuf_t</a> *master; <span class="comment">/* list pointers */</span>
92 00084 <a class="code" href="structstrbuf__node__s.html">strbuf_node_t</a> *c_node; <span class="comment">/* c_node node */</span>
93 00085 <a class="code" href="structstrbuf__node__s.html">strbuf_node_t</a> *kill_node; <span class="comment">/* temp node used in destruct */</span>
94 00086
95 00087 size_t len; <span class="comment">/* leng of passed string */</span>
96 00088 size_t i = 0; <span class="comment">/* index on a str */</span>
97 00089 size_t length = 0; <span class="comment">/* overall len of expanded str */</span>
98 00090
99 00091
100 00092 <span class="keywordflow">if</span> (s == NULL)
101 00093 {
102 00094 <a class="code" href="util_8h.html#a13">xepprintf</a>(<span class="stringliteral">"Passed a NULL string. Abort!\n"</span>);
103 00095 <span class="keywordflow">return</span>(NULL);
104 00096 }
105 00097
106 00098 len = strlen(s);
107 00099 ptr = cp = <a class="code" href="util_8h.html#a8">xstrndup</a>(s, (len + 1));
108 00100
109 00101 master = <a class="code" href="util_8h.html#a4">xmalloc</a>(<a class="code" href="util_8h.html#a3">SIZEOF</a>(<a class="code" href="structstrbuf__s.html">strbuf_t</a>));
110 00102 master-&gt;<a class="code" href="structstrbuf__s.html#o0">head</a> = NULL;
111 00103 master-&gt;<a class="code" href="structstrbuf__s.html#o1">elements</a> = 0;
112 00104 length = 0;
113 00105
114 00106 <span class="keywordflow">while</span> (*ptr)
115 00107 {
116 00108 <span class="comment">/*</span>
117 00109 <span class="comment"> * This works by moving through the string and replacing non-essential</span>
118 00110 <span class="comment"> * elements with NULL chars until the character designating an expansion</span>
119 00111 <span class="comment"> * mechanism is found. The character is then sent off to MACRO_process</span>
120 00112 <span class="comment"> * for expansion</span>
121 00113 <span class="comment"> */</span>
122 00114 <span class="keywordflow">if</span> (*ptr == <span class="charliteral">'%'</span>) <span class="comment">/* start of macro */</span>
123 00115 {
124 00116 <span class="keywordflow">switch</span> (*(ptr + 1))
125 00117 {
126 00118 <span class="keywordflow">case</span> <span class="charliteral">'%'</span>:
127 00119
128 00120 <span class="comment">/* convert %% into % */</span>
129 00121 <span class="keywordflow">if</span> (<a class="code" href="macro_8h.html#a4">MACRO_addbuf</a>(master, (<span class="keywordtype">char</span> *)macro_p, 1) == <a class="code" href="spf_8h.html#a87a49">SPF_FALSE</a>)
130 00122 {
131 00123 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"Unable to allocate list node with (%c)!\n"</span>, macro_p);
132 00124
133 00125 <span class="keywordflow">return</span>(NULL);
134 00126 }
135 00127
136 00128 ptr += 2;
137 00129 length++;
138 00130 <span class="keywordflow">break</span>;
139 00131
140 00132 <span class="keywordflow">case</span> <span class="charliteral">'_'</span>:
141 00133
142 00134 <span class="comment">/* convert %_ to a white space */</span>
143 00135 <span class="keywordflow">if</span> (<a class="code" href="macro_8h.html#a4">MACRO_addbuf</a>(master, (<span class="keywordtype">char</span> *)macro_u, 1) == <a class="code" href="spf_8h.html#a87a49">SPF_FALSE</a>)
144 00136 {
145 00137 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"Unable to allocate list node with (%c)!\n"</span>, macro_u);
146 00138
147 00139 <span class="keywordflow">return</span>(NULL);
148 00140 }
149 00141
150 00142 ptr += 2;
151 00143 length++;
152 00144 <span class="keywordflow">break</span>;
153 00145
154 00146 <span class="keywordflow">case</span> <span class="charliteral">'-'</span>:
155 00147
156 00148 <span class="comment">/* convert %- into URL encoded '%20' */</span>
157 00149 <span class="keywordflow">if</span> (<a class="code" href="macro_8h.html#a4">MACRO_addbuf</a>(master, (<span class="keywordtype">char</span> *)macro_d, 3) == <a class="code" href="spf_8h.html#a87a49">SPF_FALSE</a>)
158 00150 {
159 00151 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"Unable to allocate list node with (%s)!\n"</span>, macro_d);
160 00152
161 00153 <span class="keywordflow">return</span>(NULL);
162 00154 }
163 00155
164 00156 ptr += 2;
165 00157 length += 3;
166 00158 <span class="keywordflow">break</span>;
167 00159
168 00160 <span class="keywordflow">case</span> <span class="charliteral">'{'</span>:
169 00161
170 00162 *ptr++ = <span class="charliteral">'\0'</span>; <span class="comment">/* % */</span>
171 00163 *ptr++ = <span class="charliteral">'\0'</span>; <span class="comment">/* { */</span>
172 00164
173 00165 <span class="keywordflow">if</span> ((i = <a class="code" href="util_8h.html#a35">UTIL_index</a>(ptr, <span class="charliteral">'}'</span>)) == 0)
174 00166 {
175 00167 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"'}' Invalid Macro (%c)\n"</span>, *(s + 1));
176 00168
177 00169 <span class="keywordflow">return</span>(NULL); <span class="comment">/* not closed, invalid macro */</span>
178 00170 }
179 00171
180 00172 *(ptr + i) = <span class="charliteral">'\0'</span>; <span class="comment">/* } */</span>
181 00173
182 00174 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"Actual macro (%s)\n"</span>, ptr);
183 00175 <span class="keywordflow">if</span> ((macro = <a class="code" href="macro_8h.html#a2">MACRO_process</a>(p, ptr, (i + 1))) == NULL)
184 00176 {
185 00177 <a class="code" href="util_8h.html#a13">xepprintf</a>(<span class="stringliteral">"macro process returned null!\n"</span>);
186 00178 }
187 00179 <span class="keywordflow">else</span>
188 00180 {
189 00181 length += strlen(macro);
190 00182 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"Macro expanded to: (%s) %i bytes\n"</span>, macro,
191 00183 strlen(macro));
192 00184
193 00185 <span class="keywordflow">if</span> (<a class="code" href="macro_8h.html#a4">MACRO_addbuf</a>(master, macro, strlen(macro)) == <a class="code" href="spf_8h.html#a87a49">SPF_FALSE</a>)
194 00186 {
195 00187 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"Unable to allocate list node with (%s)!\n"</span>, macro);
196 00188 <a class="code" href="util_8h.html#a6">xfree</a>(macro);
197 00189
198 00190 <span class="keywordflow">return</span>(NULL); <span class="comment">/* not closed, invalid macro */</span>
199 00191 }
200 00192 <a class="code" href="util_8h.html#a6">xfree</a>(macro);
201 00193 }
202 00194 ptr += i;
203 00195 <span class="keywordflow">break</span>;
204 00196
205 00197 <span class="keywordflow">default</span>:
206 00198
207 00199 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"ERROR: Invalid macro. (%s) Abort!\n"</span>, *(ptr + 1));
208 00200
209 00201 <span class="comment">/* need cleanup function call perhaps */</span>
210 00202 <span class="keywordflow">return</span>(NULL);
211 00203 <span class="keywordflow">break</span>;
212 00204
213 00205 } <span class="comment">/* switch */</span>
214 00206 } <span class="comment">/* if */</span>
215 00207 <span class="keywordflow">else</span>
216 00208 {
217 00209 <span class="keywordflow">if</span> ((i = <a class="code" href="util_8h.html#a35">UTIL_index</a>(ptr, <span class="charliteral">'%'</span>)) == 0)
218 00210 {
219 00211 <span class="keywordflow">while</span> (*(ptr + i))
220 00212 {
221 00213 i++;
222 00214 }
223 00215 s_macro = <a class="code" href="util_8h.html#a4">xmalloc</a>(i + 1);
224 00216 memcpy(s_macro, ptr, (i + 1));
225 00217 }
226 00218 <span class="keywordflow">else</span>
227 00219 {
228 00220 s_macro = <a class="code" href="util_8h.html#a4">xmalloc</a>(i + 1);
229 00221 memcpy(s_macro, ptr, i);
230 00222 }
231 00223
232 00224 length += i;
233 00225
234 00226 <span class="keywordflow">if</span> (<a class="code" href="macro_8h.html#a4">MACRO_addbuf</a>(master, s_macro, (i + 1)) == <a class="code" href="spf_8h.html#a87a49">SPF_FALSE</a>)
235 00227 {
236 00228 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"Unable to allocate list node with (%s)!\n"</span>, s_macro);
237 00229
238 00230 <span class="keywordflow">return</span>(NULL);
239 00231 }
240 00232
241 00233 ptr += (i - 1);
242 00234 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"Freeing s_macro temp buf (%s)\n"</span>, s_macro);
243 00235 <a class="code" href="util_8h.html#a6">xfree</a>(s_macro);
244 00236 }
245 00237 ptr++;
246 00238 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"Remaining buffer (%s)\n"</span>, ptr);
247 00239 } <span class="comment">/* while */</span>
248 00240
249 00241 <a class="code" href="util_8h.html#a9">xprintf</a>(<span class="stringliteral">"Allocated %i bytes for return buf\n"</span>, length);
250 00242 buf = <a class="code" href="util_8h.html#a4">xmalloc</a>(length + 1);
251 00243
252 00244 c_node = master-&gt;<a class="code" href="structstrbuf__s.html#o0">head</a>;
253 00245 <span class="keywordflow">while</span> (c_node != NULL)
254 00246 {
255 00247 kill_node = c_node;
256 00248
257 00249 <span class="keywordflow">if</span> (kill_node-&gt;<a class="code" href="structstrbuf__node__s.html#o0">len</a> &gt; 1)
258 00250 {
259 00251 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"NODE: (%s) LEN: %i\n"</span>, kill_node-&gt;<a class="code" href="structstrbuf__node__s.html#o1">s</a>, kill_node-&gt;<a class="code" href="structstrbuf__node__s.html#o0">len</a>);
260 00252 }
261 00253 <span class="keywordflow">else</span>
262 00254 {
263 00255 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"NODE: (%c) LEN: %i\n"</span>, kill_node-&gt;<a class="code" href="structstrbuf__node__s.html#o1">s</a>, kill_node-&gt;<a class="code" href="structstrbuf__node__s.html#o0">len</a>);
264 00256 }
265 00257
266 00258 strncat(buf, kill_node-&gt;<a class="code" href="structstrbuf__node__s.html#o1">s</a>, kill_node-&gt;<a class="code" href="structstrbuf__node__s.html#o0">len</a>);
267 00259 <a class="code" href="util_8h.html#a6">xfree</a>(kill_node-&gt;<a class="code" href="structstrbuf__node__s.html#o1">s</a>);
268 00260 c_node = c_node-&gt;next;
269 00261 <a class="code" href="util_8h.html#a6">xfree</a>(kill_node);
270 00262 }
271 00263
272 00264 <a class="code" href="util_8h.html#a6">xfree</a>(cp);
273 00265 <a class="code" href="util_8h.html#a6">xfree</a>(master);
274 00266
275 00267 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"Returning expanded macro: (%s)\n"</span>, buf);
276 00268
277 00269 <span class="keywordflow">return</span>(buf);
278 00270 }
279 00271
280 00272
281 00273 <span class="comment">/* MACRO_process</span>
282 00274 <span class="comment">*</span>
283 00275 <span class="comment">* Author: James Couzens &lt;jcouzens@codeshare.ca&gt;</span>
284 00276 <span class="comment">*</span>
285 00277 <span class="comment">* Date: 01/21/04</span>
286 00278 <span class="comment">*</span>
287 00279 <span class="comment">* Desc:</span>
288 00280 <span class="comment">* This function takes a NULL terminated string containing only one</span>
289 00281 <span class="comment">* macro. It returns a new string containing whatever that macro expanded to.</span>
290 00282 <span class="comment">* Returns NULL if the macro can not be expanded.</span>
291 00283 <span class="comment">*</span>
292 00284 <span class="comment">* exists:%{ir}.%{l1r+-}._spf.%{d}</span>
293 00285 <span class="comment">*</span>
294 00286 <span class="comment">* Date: 08/??/04 - Travis Anderson &lt;tanderson@codeshare.ca&gt;</span>
295 00287 <span class="comment">*</span>
296 00288 <span class="comment">* Desc:</span>
297 00289 <span class="comment">* Fixed problematic 'p' macro with the addition of new DNS function</span>
298 00290 <span class="comment">* DNS_check_client_reverse.</span>
299 00291 <span class="comment">*</span>
300 00292 <span class="comment">* Date: 09/11/04 - James Couzens &lt;jcouzens@codeshare.ca&gt;</span>
301 00293 <span class="comment">*</span>
302 00294 <span class="comment">* Desc:</span>
303 00295 <span class="comment">* Removed strlen calls originally intended for replacement</span>
304 00296 <span class="comment">* with either a generic limit (SPF_MAX_STR), or a more stringent limit safely</span>
305 00297 <span class="comment">* imposed upon the malloc.</span>
306 00298 <span class="comment">* </span>
307 00299 <span class="comment">*</span>
308 00300 <span class="comment">*/</span>
309 <a name="l00301"></a><a class="code" href="macro_8h.html#a2">00301</a> <span class="keywordtype">char</span> *<a class="code" href="macro_8h.html#a2">MACRO_process</a>(<a class="code" href="structpeer__info__s.html">peer_info_t</a> *p, <span class="keywordtype">char</span> *macro, <span class="keyword">const</span> size_t size)
310 00302 {
311 00303 <span class="keywordtype">int</span> c; <span class="comment">/* stores a lower case version of the macro if necessary */</span>
312 00304
313 00305 size_t i; <span class="comment">/* utility for string lengths */</span>
314 00306
315 00307 <span class="keywordtype">char</span> *rev_addr; <span class="comment">/* used by p macro */</span>
316 00308
317 00309
318 00310 <span class="keywordflow">if</span> (macro == NULL)
319 00311 {
320 00312 <a class="code" href="util_8h.html#a13">xepprintf</a>(<span class="stringliteral">"Passed a NULL string. Abort!\n"</span>);
321 00313
322 00314 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a87a49">SPF_FALSE</a>);
323 00315 }
324 00316
325 00317 <a class="code" href="util_8h.html#a9">xprintf</a>(<span class="stringliteral">"called with (%s) and len: %i\n"</span>,macro, size);
326 00318
327 00319 rev_addr = NULL;
328 00320 i = 0;
329 00321
330 00322 <span class="keywordflow">if</span> (isupper(*macro))
331 00323 {
332 00324 c = tolower(*macro);
333 00325 }
334 00326 <span class="keywordflow">else</span>
335 00327 {
336 00328 c = *macro;
337 00329 }
338 00330
339 00331 <span class="keywordflow">switch</span> (c)
340 00332 {
341 00333 <span class="comment">/* */</span>
342 00334 <span class="keywordflow">case</span> <span class="charliteral">'d'</span>:
343 00335 <span class="keywordflow">if</span> (*(macro + 1))
344 00336 {
345 00337 <span class="keywordflow">return</span>(<a class="code" href="macro_8h.html#a3">MACRO_eatmore</a>(macro, p-&gt;<a class="code" href="structpeer__info__s.html#o15">current_domain</a>));
346 00338 }
347 00339 <span class="keywordflow">else</span>
348 00340 {
349 00341 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"macro 'd' expands to: (%s)\n"</span>,
350 00342 p-&gt;<a class="code" href="structpeer__info__s.html#o15">current_domain</a>);
351 00343
352 00344 <span class="keywordflow">return</span>(<a class="code" href="util_8h.html#a8">xstrndup</a>(p-&gt;<a class="code" href="structpeer__info__s.html#o15">current_domain</a>, <a class="code" href="spf_8h.html#a5">SPF_MAX_STR</a>));
353 00345 }
354 00346 <span class="comment">/* */</span>
355 00347 <span class="keywordflow">case</span> <span class="charliteral">'h'</span>:
356 00348 <span class="keywordflow">if</span> (*(macro + 1))
357 00349 {
358 00350 <span class="keywordflow">return</span>(<a class="code" href="macro_8h.html#a3">MACRO_eatmore</a>(macro, p-&gt;<a class="code" href="structpeer__info__s.html#o8">helo</a>));
359 00351 }
360 00352 <span class="keywordflow">else</span>
361 00353 {
362 00354 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"macro 'h' expands to: (%s)\n"</span>, p-&gt;<a class="code" href="structpeer__info__s.html#o8">helo</a>);
363 00355
364 00356 <span class="keywordflow">if</span> (p-&gt;<a class="code" href="structpeer__info__s.html#o8">helo</a> != NULL)
365 00357 {
366 00358 <span class="keywordflow">return</span>(<a class="code" href="util_8h.html#a8">xstrndup</a>(p-&gt;<a class="code" href="structpeer__info__s.html#o8">helo</a>, <a class="code" href="spf_8h.html#a13">SPF_MAX_ENV_HELO</a>));
367 00359 }
368 00360 <span class="keywordflow">else</span>
369 00361 {
370 00362 <span class="keywordflow">return</span>(<a class="code" href="util_8h.html#a8">xstrndup</a>(p-&gt;<a class="code" href="structpeer__info__s.html#o9">ehlo</a>, <a class="code" href="spf_8h.html#a13">SPF_MAX_ENV_HELO</a>));
371 00363 }
372 00364 }
373 00365 <span class="comment">/* */</span>
374 00366 <span class="keywordflow">case</span> <span class="charliteral">'i'</span>:
375 00367 <span class="keywordflow">if</span> (*(macro + 1))
376 00368 {
377 00369 <span class="keywordflow">return</span>(<a class="code" href="macro_8h.html#a3">MACRO_eatmore</a>(macro, p-&gt;<a class="code" href="structpeer__info__s.html#o17">r_ip</a>));
378 00370 }
379 00371 <span class="keywordflow">else</span>
380 00372 {
381 00373 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"macro 'i' expands to: (%s)\n"</span>, p-&gt;<a class="code" href="structpeer__info__s.html#o17">r_ip</a>);
382 00374
383 00375 <span class="keywordflow">return</span>(<a class="code" href="util_8h.html#a8">xstrndup</a>(p-&gt;<a class="code" href="structpeer__info__s.html#o17">r_ip</a>, <a class="code" href="spf_8h.html#a11">SPF_MAX_IP_ADDR</a>));
384 00376 }
385 00377 <span class="comment">/* */</span>
386 00378 <span class="keywordflow">case</span> <span class="charliteral">'l'</span>:
387 00379 <span class="keywordflow">if</span> (*(macro + 1))
388 00380 {
389 00381 <span class="keywordflow">return</span>(<a class="code" href="macro_8h.html#a3">MACRO_eatmore</a>(macro, p-&gt;<a class="code" href="structpeer__info__s.html#o21">local_part</a>));
390 00382 }
391 00383 <span class="keywordflow">else</span>
392 00384 {
393 00385 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"macro 'l' expands to: (%s)\n"</span>, p-&gt;<a class="code" href="structpeer__info__s.html#o21">local_part</a>);
394 00386
395 00387 <span class="keywordflow">return</span>(<a class="code" href="util_8h.html#a8">xstrndup</a>(p-&gt;<a class="code" href="structpeer__info__s.html#o21">local_part</a>, <a class="code" href="spf_8h.html#a7">SPF_MAX_LOCAL_PART</a>));
396 00388 }
397 00389 <span class="comment">/* */</span>
398 00390 <span class="keywordflow">case</span> <span class="charliteral">'o'</span>:
399 00391 <span class="keywordflow">if</span> (*(macro + 1))
400 00392 {
401 00393 <span class="keywordflow">return</span>(<a class="code" href="macro_8h.html#a3">MACRO_eatmore</a>(macro, p-&gt;<a class="code" href="structpeer__info__s.html#o15">current_domain</a>));
402 00394 }
403 00395 <span class="keywordflow">else</span>
404 00396 {
405 00397 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"macro 'o' expands to: (%s)\n"</span>,
406 00398 p-&gt;<a class="code" href="structpeer__info__s.html#o15">current_domain</a>);
407 00399
408 00400 <span class="keywordflow">return</span>(<a class="code" href="util_8h.html#a8">xstrndup</a>(p-&gt;<a class="code" href="structpeer__info__s.html#o15">current_domain</a>, <a class="code" href="spf_8h.html#a5">SPF_MAX_STR</a>));
409 00401 }
410 00402 <span class="comment">/* */</span>
411 00403 <span class="keywordflow">case</span> <span class="charliteral">'p'</span>:
412 00404 <span class="keywordflow">if</span> (<a class="code" href="dns_8h.html#a13">DNS_check_client_reverse</a>(p) == <a class="code" href="spf_8h.html#a87a49">SPF_FALSE</a>)
413 00405 {
414 00406 p-&gt;<a class="code" href="structpeer__info__s.html#o18">r_vhname</a> = <a class="code" href="util_8h.html#a4">xmalloc</a>(8);
415 00407 snprintf(p-&gt;<a class="code" href="structpeer__info__s.html#o18">r_vhname</a>, 8, <span class="stringliteral">"unknown"</span>);
416 00408 }
417 00409
418 00410 <span class="keywordflow">if</span> (*(macro + 1))
419 00411 {
420 00412 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"macro 'p' expands to: (%s)\n"</span>, p-&gt;<a class="code" href="structpeer__info__s.html#o18">r_vhname</a>);
421 00413
422 00414 <span class="keywordflow">return</span>(<a class="code" href="macro_8h.html#a3">MACRO_eatmore</a>(macro, p-&gt;<a class="code" href="structpeer__info__s.html#o18">r_vhname</a>));
423 00415 }
424 00416 <span class="keywordflow">else</span>
425 00417 {
426 00418 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"macro 'p' expands to: (%s)\n"</span>, p-&gt;<a class="code" href="structpeer__info__s.html#o18">r_vhname</a>);
427 00419
428 00420 <span class="keywordflow">return</span>(<a class="code" href="util_8h.html#a8">xstrndup</a>(p-&gt;<a class="code" href="structpeer__info__s.html#o18">r_vhname</a>, <a class="code" href="spf_8h.html#a5">SPF_MAX_STR</a>));
429 00421 }
430 00422 <span class="comment">/* */</span>
431 00423 <span class="keywordflow">case</span> <span class="charliteral">'s'</span>:
432 00424
433 00425 <span class="keywordflow">if</span> ((p-&gt;<a class="code" href="structpeer__info__s.html#o19">cur_eaddr</a> != NULL) || p-&gt;<a class="code" href="structpeer__info__s.html#o19">cur_eaddr</a>)
434 00426 {
435 00427 <a class="code" href="util_8h.html#a6">xfree</a>(p-&gt;<a class="code" href="structpeer__info__s.html#o19">cur_eaddr</a>);
436 00428 }
437 00429
438 00430 <a class="code" href="util_8h.html#a9">xprintf</a>(<span class="stringliteral">"local-part: (%s); current domain: (%s)\n"</span>,
439 00431 p-&gt;<a class="code" href="structpeer__info__s.html#o21">local_part</a>, p-&gt;<a class="code" href="structpeer__info__s.html#o15">current_domain</a>);
440 00432 i = ((strlen(p-&gt;<a class="code" href="structpeer__info__s.html#o21">local_part</a>) + strlen(p-&gt;<a class="code" href="structpeer__info__s.html#o15">current_domain</a>) + 2));
441 00433 p-&gt;<a class="code" href="structpeer__info__s.html#o19">cur_eaddr</a> = <a class="code" href="util_8h.html#a4">xmalloc</a>(i);
442 00434 snprintf(p-&gt;<a class="code" href="structpeer__info__s.html#o19">cur_eaddr</a>, i, <span class="stringliteral">"%s@%s"</span>,
443 00435 p-&gt;<a class="code" href="structpeer__info__s.html#o21">local_part</a>, p-&gt;<a class="code" href="structpeer__info__s.html#o15">current_domain</a>);
444 00436
445 00437 <span class="keywordflow">if</span> (*(macro + 1))
446 00438 {
447 00439 <span class="keywordflow">return</span>(<a class="code" href="macro_8h.html#a3">MACRO_eatmore</a>(macro, p-&gt;<a class="code" href="structpeer__info__s.html#o19">cur_eaddr</a>));
448 00440 }
449 00441 <span class="keywordflow">else</span>
450 00442 {
451 00443 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"macro 's' expands to: (%s)\n"</span>, p-&gt;<a class="code" href="structpeer__info__s.html#o19">cur_eaddr</a>);
452 00444
453 00445 <span class="keywordflow">return</span>(<a class="code" href="util_8h.html#a8">xstrndup</a>(p-&gt;<a class="code" href="structpeer__info__s.html#o19">cur_eaddr</a>, <a class="code" href="spf_8h.html#a5">SPF_MAX_STR</a>));
454 00446 }
455 00447 <span class="comment">/* */</span>
456 00448 <span class="keywordflow">case</span> <span class="charliteral">'t'</span>:
457 00449 <span class="keywordflow">if</span> (*(macro + 1))
458 00450 {
459 00451 <span class="keywordflow">return</span>(<a class="code" href="macro_8h.html#a3">MACRO_eatmore</a>(macro, p-&gt;<a class="code" href="structpeer__info__s.html#o22">utc_time</a>));
460 00452 }
461 00453 <span class="keywordflow">else</span>
462 00454 {
463 00455 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"macro 't' expands to: (%s)\n"</span>, p-&gt;<a class="code" href="structpeer__info__s.html#o22">utc_time</a>);
464 00456
465 00457 <span class="keywordflow">return</span>(<a class="code" href="util_8h.html#a8">xstrndup</a>(p-&gt;<a class="code" href="structpeer__info__s.html#o22">utc_time</a>, <a class="code" href="spf_8h.html#a10">SPF_MAX_UTC_TIME</a>));
466 00458 }
467 00459 <span class="comment">/* */</span>
468 00460 <span class="keywordflow">case</span> <span class="charliteral">'v'</span>:
469 00461 <span class="keywordflow">if</span> (*(macro + 1))
470 00462 {
471 00463 <span class="keywordflow">return</span>(<a class="code" href="macro_8h.html#a3">MACRO_eatmore</a>(macro, p-&gt;<a class="code" href="structpeer__info__s.html#o20">ip_ver</a>));
472 00464 }
473 00465 <span class="keywordflow">else</span>
474 00466 {
475 00467 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"macro 'v' expands to: (%s)\n"</span>, p-&gt;<a class="code" href="structpeer__info__s.html#o20">ip_ver</a>);
476 00468 <span class="keywordflow">return</span>(<a class="code" href="util_8h.html#a8">xstrndup</a>(p-&gt;<a class="code" href="structpeer__info__s.html#o20">ip_ver</a>, <a class="code" href="spf_8h.html#a11">SPF_MAX_IP_ADDR</a>));
477 00469 }
478 00470 <span class="comment">/* */</span>
479 00471 <span class="keywordflow">case</span> <span class="charliteral">'x'</span>:
480 00472 <span class="keywordflow">if</span> (size &gt; 1)
481 00473 {
482 00474 <span class="keywordflow">if</span> (*(macro + 1) == <span class="charliteral">'R'</span> || *(macro + 1) == <span class="charliteral">'r'</span>)
483 00475 {
484 00476 <span class="keywordflow">return</span>(<a class="code" href="util_8h.html#a8">xstrndup</a>(p-&gt;<a class="code" href="structpeer__info__s.html#o16">mta_hname</a>, <a class="code" href="spf_8h.html#a14">SPF_MAX_HNAME</a>));
485 00477 }
486 00478 }
487 00479 <span class="keywordflow">break</span>;
488 00480
489 00481 <span class="keywordflow">default</span>:
490 00482 <span class="keywordflow">return</span>(<a class="code" href="util_8h.html#a8">xstrndup</a>(macro, <a class="code" href="spf_8h.html#a5">SPF_MAX_STR</a>));
491 00483 } <span class="comment">/* switch */</span>
492 00484
493 00485 <span class="keywordflow">return</span>(NULL);
494 00486 }
495 00487
496 00488
497 00489 <span class="comment">/* MACRO_eatmore</span>
498 00490 <span class="comment">*</span>
499 00491 <span class="comment">* Author: James Couzens &lt;jcouzens@codeshare.ca&gt;</span>
500 00492 <span class="comment">*</span>
501 00493 <span class="comment">* Date: 01/22/04</span>
502 00494 <span class="comment">* Date: 07/02/04 James Couzens &lt;jcouzens@codeshare.ca&gt; (compiler warnings)</span>
503 00495 <span class="comment">*</span>
504 00496 <span class="comment">* Desc:</span>
505 00497 <span class="comment">* This function is called whenever a macro is more than one character</span>
506 00498 <span class="comment">* long and so we have to 'eatmore' ;-) macro is the unexpanded macro and</span>
507 00499 <span class="comment">* s is the expanded string of the original macro would have been returned as</span>
508 00500 <span class="comment">* had it been single. Returns the expanded macro using dynamically allocated</span>
509 00501 <span class="comment">* memory upon success and in the process will FREE s after allocating more</span>
510 00502 <span class="comment">* memory (if necessary) and copying it over. Returns NULL upon failure.</span>
511 00503 <span class="comment">*</span>
512 00504 <span class="comment">*/</span>
513 <a name="l00505"></a><a class="code" href="macro_8h.html#a3">00505</a> <span class="keywordtype">char</span> *<a class="code" href="macro_8h.html#a3">MACRO_eatmore</a>(<span class="keywordtype">char</span> *macro, <span class="keywordtype">char</span> *s)
514 00506 {
515 00507 size_t i; <span class="comment">/* how much of the buffer we are using */</span>
516 00508
517 00509 <span class="keywordtype">char</span> delim; <span class="comment">/* marco is a delimiter modifier */</span>
518 00510
519 00511 <span class="keywordtype">char</span> *cp; <span class="comment">/* working pointer */</span>
520 00512 <span class="keywordtype">char</span> *buf; <span class="comment">/* return buffer */</span>
521 00513 <span class="keywordtype">char</span> *rev_str; <span class="comment">/* temporary buffer */</span>
522 00514 <span class="keywordtype">char</span> *d_buf; <span class="comment">/* temporary buffer */</span>
523 00515
524 00516 u_int8_t n_dot; <span class="comment">/* number of 'delimiter' items in a string */</span>
525 00517 u_int8_t rev; <span class="comment">/* string to be reversed */</span>
526 00518 u_int8_t digit; <span class="comment">/* macro is a digit modifier */</span>
527 00519
528 00520
529 00521 <span class="keywordflow">if</span> (macro == NULL)
530 00522 {
531 00523 <a class="code" href="util_8h.html#a13">xepprintf</a>(<span class="stringliteral">"Passed a NULL string. Abort!\n"</span>);
532 00524 <span class="keywordflow">return</span>(NULL);
533 00525 }
534 00526
535 00527 <a class="code" href="util_8h.html#a9">xprintf</a>(<span class="stringliteral">"Called with macro (%s) and string (%s)\n"</span>, macro, s);
536 00528
537 00529 <span class="comment">/* need a proper value for this not just SPF_MAX_MACRO need to know the MAXIMUM</span>
538 00530 <span class="comment"> * expandable length of a macro. */</span>
539 00531
540 00532 cp = macro;
541 00533 rev = 0;
542 00534 digit = 0;
543 00535 delim = <span class="charliteral">'.'</span>;
544 00536 buf = NULL;
545 00537 rev_str = NULL;
546 00538
547 00539 <span class="keywordflow">while</span> (*cp)
548 00540 {
549 00541 <span class="keywordflow">if</span> (isdigit(*cp))
550 00542 {
551 00543 digit = atoi(cp);
552 00544 }
553 00545 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="util_8h.html#a39">UTIL_is_spf_delim</a>(*cp) == <a class="code" href="spf_8h.html#a87a50">SPF_TRUE</a>)
554 00546 {
555 00547 delim = *cp;
556 00548 }
557 00549 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((*cp == <span class="charliteral">'r'</span>) || (*cp == <span class="charliteral">'R'</span>))
558 00550 {
559 00551 rev = 1;
560 00552 }
561 00553 cp++;
562 00554 }
563 00555
564 00556 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"mac:(%s) r:(%i) dig:(%i) dlm: (%c)\n"</span>,
565 00557 macro, rev, digit, delim);
566 00558
567 00559 i = 0;
568 00560 <span class="comment">/* reverse the string */</span>
569 00561 <span class="keywordflow">if</span> (rev == 1)
570 00562 {
571 00563 <span class="comment">/*delim = '.';*/</span>
572 00564 rev_str = <a class="code" href="util_8h.html#a56">UTIL_reverse</a>(s, delim);
573 00565 s = NULL;
574 00566 }
575 00567
576 00568 <span class="keywordflow">if</span> (s == NULL)
577 00569 {
578 00570 cp = rev_str;
579 00571 }
580 00572 <span class="keywordflow">else</span>
581 00573 {
582 00574 cp = s;
583 00575 }
584 00576
585 00577 <span class="comment">/* exercise digit modifier on string */</span>
586 00578 <span class="keywordflow">if</span> (digit &gt; 0)
587 00579 {
588 00580 n_dot = <a class="code" href="util_8h.html#a38">UTIL_count_delim</a>(cp, delim);
589 00581
590 00582 <span class="keywordflow">if</span> (digit &gt; n_dot)
591 00583 {
592 00584 digit = n_dot;
593 00585 }
594 00586
595 00587 <span class="keywordflow">if</span> ((d_buf = <a class="code" href="util_8h.html#a37">UTIL_split_strr</a>(cp, delim, digit)) != NULL)
596 00588 {
597 00589 i = strlen(d_buf);
598 00590 }
599 00591 <span class="keywordflow">else</span>
600 00592 {
601 00593 d_buf = cp;
602 00594 i = strlen(d_buf);
603 00595 }
604 00596
605 00597 buf = <a class="code" href="util_8h.html#a4">xmalloc</a>(i + 1);
606 00598 memcpy(buf, d_buf, (i + 1));
607 00599
608 00600 <span class="keywordflow">if</span> (d_buf != cp)
609 00601 {
610 00602 <a class="code" href="util_8h.html#a6">xfree</a>(d_buf);
611 00603 }
612 00604 }
613 00605 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (rev == 1)
614 00606 {
615 00607 buf = <a class="code" href="util_8h.html#a8">xstrndup</a>(rev_str, <a class="code" href="spf_8h.html#a4">SPF_MAX_MACRO</a>);
616 00608 }
617 00609
618 00610 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"Returning (%s) (%i bytes)\n"</span>, buf, strlen(buf));
619 00611
620 00612 <span class="keywordflow">if</span> (rev == 1)
621 00613 {
622 00614 <a class="code" href="util_8h.html#a6">xfree</a>(rev_str);
623 00615 }
624 00616
625 00617 <span class="keywordflow">return</span>(buf);
626 00618 }
627 00619
628 00620
629 00621 <span class="comment">/* MACRO_addbuf</span>
630 00622 <span class="comment">*</span>
631 00623 <span class="comment">* Author: Sean Comeau &lt;scomeau@obscurity.org&gt;</span>
632 00624 <span class="comment">* Author: James Couznes &lt;jcouzens@codeshare.ca&gt;</span>
633 00625 <span class="comment">*</span>
634 00626 <span class="comment">* Date: 01/18/04</span>
635 00627 <span class="comment">* Updated: 01/24/04</span>
636 00628 <span class="comment">*</span>
637 00629 <span class="comment">*</span>
638 00630 <span class="comment">* Desc:</span>
639 00631 <span class="comment">* Appends nodes to a master list which is passed of type</span>
640 00632 <span class="comment">* strbuf_t. The nodes are of type strbuf_node_t and appended on</span>
641 00633 <span class="comment">* the end and the list is reordered to reflect this. Returns</span>
642 00634 <span class="comment">* SPF_TRUE upon success and SPF_FALSE</span>
643 00635 <span class="comment">* upon failure.</span>
644 00636 <span class="comment">*</span>
645 00637 <span class="comment">*/</span>
646 <a name="l00638"></a><a class="code" href="macro_8h.html#a4">00638</a> <a class="code" href="spf_8h.html#a35">SPF_BOOL</a> <a class="code" href="macro_8h.html#a4">MACRO_addbuf</a>(<a class="code" href="structstrbuf__s.html">strbuf_t</a> *master, <span class="keywordtype">char</span> *s, size_t size)
647 00639 {
648 00640 <a class="code" href="structstrbuf__node__s.html">strbuf_node_t</a> *c_node = NULL; <span class="comment">/* c_node working node */</span>
649 00641 <a class="code" href="structstrbuf__node__s.html">strbuf_node_t</a> *new_node = NULL; <span class="comment">/* newly allocated node */</span>
650 00642 <a class="code" href="structstrbuf__node__s.html">strbuf_node_t</a> *prev_node = NULL; <span class="comment">/* previous working node */</span>
651 00643
652 00644
653 00645 <span class="keywordflow">if</span> (s == NULL)
654 00646 {
655 00647 <a class="code" href="util_8h.html#a13">xepprintf</a>(<span class="stringliteral">"Passed a NULL string. Abort!\n"</span>);
656 00648
657 00649 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a87a49">SPF_FALSE</a>);
658 00650 }
659 00651
660 00652 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"Called with (%s) %i (%i) bytes.\n"</span>, s, size, strlen(s));
661 00653
662 00654 new_node = <a class="code" href="util_8h.html#a4">xmalloc</a>(<a class="code" href="util_8h.html#a3">SIZEOF</a>(<a class="code" href="structstrbuf__node__s.html">strbuf_node_t</a>));
663 00655 new_node-&gt;<a class="code" href="structstrbuf__node__s.html#o1">s</a> = <a class="code" href="util_8h.html#a4">xmalloc</a>(size + 1);
664 00656
665 00657 strncpy(new_node-&gt;<a class="code" href="structstrbuf__node__s.html#o1">s</a>, s, size);
666 00658 new_node-&gt;<a class="code" href="structstrbuf__node__s.html#o0">len</a> = size;
667 00659 new_node-&gt;<a class="code" href="structstrbuf__node__s.html#o2">next</a> = NULL;
668 00660
669 00661 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"Added (%s) to node of len: %i)\n"</span>, new_node-&gt;<a class="code" href="structstrbuf__node__s.html#o1">s</a>,
670 00662 new_node-&gt;<a class="code" href="structstrbuf__node__s.html#o0">len</a>);
671 00663
672 00664 prev_node = NULL;
673 00665 c_node = master-&gt;<a class="code" href="structstrbuf__s.html#o0">head</a>;
674 00666
675 00667 <span class="comment">/* reorder the list with the NEW element on the end */</span>
676 00668 <span class="keywordflow">while</span> (c_node != NULL)
677 00669 {
678 00670 prev_node = c_node;
679 00671 c_node = c_node-&gt;<a class="code" href="structstrbuf__node__s.html#o2">next</a>;
680 00672 }
681 00673
682 00674 <span class="keywordflow">if</span> (prev_node != NULL)
683 00675 {
684 00676 new_node-&gt;<a class="code" href="structstrbuf__node__s.html#o2">next</a> = prev_node-&gt;<a class="code" href="structstrbuf__node__s.html#o2">next</a>;
685 00677 prev_node-&gt;<a class="code" href="structstrbuf__node__s.html#o2">next</a> = new_node;
686 00678 }
687 00679 <span class="keywordflow">else</span>
688 00680 {
689 00681 master-&gt;<a class="code" href="structstrbuf__s.html#o0">head</a> = new_node;
690 00682 }
691 00683
692 00684 master-&gt;<a class="code" href="structstrbuf__s.html#o1">elements</a>++;
693 00685
694 00686 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a87a50">SPF_TRUE</a>);
695 00687 }
696 00688
697 00689 <span class="comment">/* end macro.c */</span>
698 00690
699 </div></pre><hr size="1"><address style="align: right;"><small>Generated on Thu Sep 16 18:10:46 2004 for libSPF v1.0 by
700 <a href="http://www.doxygen.org/index.html">
701 <img src="doxygen.png" alt="doxygen" align="middle" border=0 ></a> 1.3.8 </small></address>
702 </body>
703 </html>