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
|
<!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>LibU: buf.c Source File</title>
<link href="kl.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.3.9.1 -->
<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="files.html">File List</a> | <a class="qindex" href="functions.html">Data Fields</a></div>
<div class="nav">
<a class="el" href="dir_000000.html">src</a></div>
<h1>buf.c</h1><div class="fragment"><pre class="fragment">00001 <span class="comment">/* </span>
00002 <span class="comment"> * Copyright (c) 2005, 2006 by KoanLogic s.r.l. - All rights reserved. </span>
00003 <span class="comment"> */</span>
00004
00005 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span> rcsid[] =
00006 <span class="stringliteral">"$Id: buf.c,v 1.1 2006/05/28 15:39:43 tat Exp $"</span>;
00007
00008 <span class="preprocessor">#include <sys/types.h></span>
00009 <span class="preprocessor">#include <sys/stat.h></span>
00010 <span class="preprocessor">#include <unistd.h></span>
00011 <span class="preprocessor">#include <u/libu.h></span>
00012 <span class="preprocessor">#include <u/buf.h></span>
00013
00014 <span class="keyword">struct </span>u_buf_s
00015 {
00016 <span class="keywordtype">char</span> *data;
00017 size_t size, len;
00018 };
00019
<a name="l00035"></a><a class="code" href="group__string.html#ga2">00035</a> <span class="keywordtype">int</span> <a class="code" href="group__string.html#ga2">u_buf_reserve</a>(u_buf_t *ubuf, size_t size)
00036 {
00037 <span class="keywordtype">char</span> *nbuf;
00038
00039 dbg_err_if(ubuf == NULL);
00040
00041 <span class="keywordflow">if</span>(size <= ubuf->size)
00042 <span class="keywordflow">return</span> 0; <span class="comment">/* nothing to do */</span>
00043
00044 <span class="comment">/* size plus 1 char to store a '\0' */</span>
00045 nbuf = <a class="code" href="group__alloc.html#ga3">u_realloc</a>(ubuf->data, size+1);
00046 dbg_err_if(nbuf == NULL);
00047
00048 <span class="comment">/* buffer data will always be zero-terminated (but the len field will not</span>
00049 <span class="comment"> * count the last '\0') */</span>
00050 nbuf[size] = 0;
00051
00052 ubuf->data = (<span class="keywordtype">void</span>*)nbuf;
00053 ubuf->size = size;
00054
00055 <span class="keywordflow">return</span> 0;
00056 err:
00057 <span class="keywordflow">return</span> ~0;
00058 }
00059
<a name="l00072"></a><a class="code" href="group__string.html#ga3">00072</a> <span class="keywordtype">int</span> <a class="code" href="group__string.html#ga3">u_buf_append</a>(u_buf_t *ubuf, <span class="keywordtype">void</span> *data, size_t size)
00073 {
00074 dbg_err_if(ubuf == NULL);
00075 dbg_err_if(data == NULL);
00076 dbg_err_if(size == 0);
00077
00078 <span class="keywordflow">if</span>(ubuf->size - ubuf->len < size)
00079 { <span class="comment">/* buffer too small, need to resize */</span>
00080 dbg_err_if(<a class="code" href="group__string.html#ga2">u_buf_reserve</a>(ubuf, ubuf->size + ubuf->len + 2*size));
00081 }
00082
00083 memcpy(ubuf->data + ubuf->len, data, size);
00084 ubuf->len += size;
00085
00086 <span class="comment">/* zero term the buffer so it can be used (when applicable) as a string */</span>
00087 ubuf->data[ubuf->len] = 0;
00088
00089 <span class="keywordflow">return</span> 0;
00090 err:
00091 <span class="keywordflow">return</span> ~0;
00092 }
00093
<a name="l00104"></a><a class="code" href="group__string.html#ga4">00104</a> <span class="keywordtype">int</span> <a class="code" href="group__string.html#ga4">u_buf_load</a>(u_buf_t *ubuf, <span class="keywordtype">char</span> *filename)
00105 {
00106 <span class="keyword">enum</span> { BUFSZ = 4096 };
00107 <span class="keyword">struct </span>stat st;
00108 <span class="keywordtype">char</span> buf[BUFSZ];
00109 FILE *fp = NULL;
00110
00111 dbg_err_if(ubuf == NULL);
00112 dbg_err_if(filename == NULL);
00113
00114 dbg_err_if(stat(filename, &st));
00115
00116 <span class="comment">/* clear the current data */</span>
00117 dbg_err_if(<a class="code" href="group__string.html#ga8">u_buf_clear</a>(ubuf));
00118
00119 <span class="comment">/* be sure to have a big enough buffer */</span>
00120 dbg_err_if(<a class="code" href="group__string.html#ga2">u_buf_reserve</a>(ubuf, st.st_size));
00121
00122 warn_err_sif((fp = fopen(filename, <span class="stringliteral">"r"</span>)) == NULL);
00123
00124 <span class="comment">/* fill the buffer with the whole file content */</span>
00125 dbg_err_if(fread(ubuf->data, st.st_size, 1, fp) == 0);
00126 ubuf->len = st.st_size;
00127
00128 fclose(fp);
00129
00130 <span class="keywordflow">return</span> 0;
00131 err:
00132 <span class="keywordflow">if</span>(fp)
00133 fclose(fp);
00134 <span class="keywordflow">return</span> ~0;
00135 }
00136
<a name="l00151"></a><a class="code" href="group__string.html#ga5">00151</a> <span class="keywordtype">int</span> <a class="code" href="group__string.html#ga5">u_buf_detach</a>(u_buf_t *ubuf)
00152 {
00153 dbg_err_if(ubuf == NULL);
00154
00155 ubuf->data = NULL;
00156 ubuf->size = 0;
00157 ubuf->len = 0;
00158
00159 <span class="keywordflow">return</span> 0;
00160 err:
00161 <span class="keywordflow">return</span> ~0;
00162 }
00163
<a name="l00173"></a><a class="code" href="group__string.html#ga6">00173</a> size_t <a class="code" href="group__string.html#ga6">u_buf_size</a>(u_buf_t *ubuf)
00174 {
00175 dbg_err_if(ubuf == NULL);
00176
00177 <span class="keywordflow">return</span> ubuf->size;
00178 err:
00179 <span class="keywordflow">return</span> 0;
00180 }
00181
<a name="l00191"></a><a class="code" href="group__string.html#ga7">00191</a> size_t <a class="code" href="group__string.html#ga7">u_buf_len</a>(u_buf_t *ubuf)
00192 {
00193 dbg_err_if(ubuf == NULL);
00194
00195 <span class="keywordflow">return</span> ubuf->len;
00196 err:
00197 <span class="keywordflow">return</span> 0;
00198 }
00199
<a name="l00210"></a><a class="code" href="group__string.html#ga8">00210</a> <span class="keywordtype">int</span> <a class="code" href="group__string.html#ga8">u_buf_clear</a>(u_buf_t *ubuf)
00211 {
00212 dbg_err_if(ubuf == NULL);
00213
00214 ubuf->len = 0;
00215
00216 <span class="keywordflow">return</span> 0;
00217 err:
00218 <span class="keywordflow">return</span> ~0;
00219 }
00220
<a name="l00233"></a><a class="code" href="group__string.html#ga9">00233</a> <span class="keywordtype">int</span> <a class="code" href="group__string.html#ga9">u_buf_set</a>(u_buf_t *ubuf, <span class="keywordtype">void</span> *data, size_t size)
00234 {
00235 dbg_err_if(ubuf == NULL);
00236 dbg_err_if(data == NULL);
00237 dbg_err_if(size == 0);
00238
00239 dbg_err_if(<a class="code" href="group__string.html#ga8">u_buf_clear</a>(ubuf));
00240
00241 dbg_err_if(<a class="code" href="group__string.html#ga3">u_buf_append</a>(ubuf, data, size));
00242
00243 <span class="keywordflow">return</span> 0;
00244 err:
00245 <span class="keywordflow">return</span> ~0;
00246 }
00247
<a name="l00257"></a><a class="code" href="group__string.html#ga10">00257</a> <span class="keywordtype">void</span>* <a class="code" href="group__string.html#ga10">u_buf_ptr</a>(u_buf_t *ubuf)
00258 {
00259 dbg_err_if(ubuf == NULL);
00260
00261 <span class="keywordflow">return</span> ubuf->data;
00262 err:
00263 <span class="keywordflow">return</span> NULL;
00264 }
00265
<a name="l00275"></a><a class="code" href="group__string.html#ga11">00275</a> <span class="keywordtype">int</span> <a class="code" href="group__string.html#ga11">u_buf_free</a>(u_buf_t *ubuf)
00276 {
00277 dbg_err_if(ubuf == NULL);
00278
00279 <span class="keywordflow">if</span>(ubuf->data)
00280 <a class="code" href="group__alloc.html#ga4">u_free</a>(ubuf->data);
00281
00282 <span class="keywordflow">return</span> 0;
00283 err:
00284 <span class="keywordflow">return</span> ~0;
00285 }
00286
<a name="l00296"></a><a class="code" href="group__string.html#ga12">00296</a> <span class="keywordtype">int</span> <a class="code" href="group__string.html#ga12">u_buf_create</a>(u_buf_t **pubuf)
00297 {
00298 u_buf_t *ubuf = NULL;
00299
00300 dbg_err_if(pubuf == NULL);
00301
00302 ubuf = (u_buf_t*)<a class="code" href="group__alloc.html#ga2">u_zalloc</a>(<span class="keyword">sizeof</span>(u_buf_t));
00303 dbg_err_if(ubuf == NULL);
00304
00305 *pubuf = ubuf;
00306
00307 <span class="keywordflow">return</span> 0;
00308 err:
00309 <span class="keywordflow">return</span> ~0;
00310 }
00311
</pre></div><hr>
<div>
<div style="text-align:left">
<a href="http://www.koanlogic.com/kl/cont/gb/html/products.html">←Products</a>
</div>
<div style="text-align:center;">
© 2005-2006 - <a href="http://www.koanlogic.com">KoanLogic S.r.l.</a> - All rights reserved
</div>
</div>
</body>
</html>
|