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
|
<!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>KLone: date.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="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_000000.html">src</a> / <a class="el" href="dir_000001.html">libutils</a></div>
<h1>date.c</h1><a href="date_8c.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment">00001 <span class="comment">/*</span>
00002 <span class="comment"> * Copyright (c) 2005, 2006 by KoanLogic s.r.l. <http://www.koanlogic.com></span>
00003 <span class="comment"> * All rights reserved.</span>
00004 <span class="comment"> *</span>
00005 <span class="comment"> * This file is part of KLone, and as such it is subject to the license stated</span>
00006 <span class="comment"> * in the LICENSE file which you have received as part of this distribution.</span>
00007 <span class="comment"> *</span>
00008 <span class="comment"> * $Id: date.c,v 1.9 2006/04/22 13:14:46 tat Exp $</span>
00009 <span class="comment"> */</span>
00010
00011 <span class="preprocessor">#include <stdlib.h></span>
00012 <span class="preprocessor">#include <stdio.h></span>
00013 <span class="preprocessor">#include <time.h></span>
00014 <span class="preprocessor">#include <ctype.h></span>
00015 <span class="preprocessor">#include <fcntl.h></span>
00016 <span class="preprocessor">#include <unistd.h></span>
00017 <span class="preprocessor">#include <dirent.h></span>
00018 <span class="preprocessor">#include <sys/stat.h></span>
00019 <span class="preprocessor">#include <<a class="code" href="klone_8h.html">klone/klone.h</a>></span>
00020 <span class="preprocessor">#include <<a class="code" href="os_8h.html">klone/os.h</a>></span>
00021 <span class="preprocessor">#include <<a class="code" href="utils_8h.html">klone/utils.h</a>></span>
00022
<a name="l00028"></a><a class="code" href="group__u__t.html#ga0">00028</a> <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="group__u__t.html#ga0">days3</a>[] = {
00029 <span class="stringliteral">"Sun"</span>, <span class="stringliteral">"Mon"</span>, <span class="stringliteral">"Tue"</span>, <span class="stringliteral">"Wed"</span>, <span class="stringliteral">"Thu"</span>, <span class="stringliteral">"Fri"</span>, <span class="stringliteral">"Sat"</span>
00030 };
<a name="l00031"></a><a class="code" href="group__u__t.html#ga1">00031</a> <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="group__u__t.html#ga1">days</a>[] = {
00032 <span class="stringliteral">"Sunday"</span>, <span class="stringliteral">"Monday"</span>, <span class="stringliteral">"Tuesday"</span>, <span class="stringliteral">"Wednesday"</span>, <span class="stringliteral">"Thursday"</span>, <span class="stringliteral">"Friday"</span>,
00033 <span class="stringliteral">"Saturday"</span>, <span class="stringliteral">"Sunday"</span>
00034 };
<a name="l00035"></a><a class="code" href="group__u__t.html#ga2">00035</a> <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="group__u__t.html#ga2">months</a>[] = {
00036 <span class="stringliteral">"Jan"</span>, <span class="stringliteral">"Feb"</span>, <span class="stringliteral">"Mar"</span>, <span class="stringliteral">"Apr"</span>, <span class="stringliteral">"May"</span>, <span class="stringliteral">"Jun"</span>,
00037 <span class="stringliteral">"Jul"</span>, <span class="stringliteral">"Aug"</span>, <span class="stringliteral">"Sep"</span>, <span class="stringliteral">"Oct"</span>, <span class="stringliteral">"Nov"</span>, <span class="stringliteral">"Dec"</span>
00038 };
00039
00040 <span class="keyword">static</span> <span class="keywordtype">int</span> month_idx(<span class="keyword">const</span> <span class="keywordtype">char</span> *mon)
00041 {
00042 <span class="keywordtype">int</span> i;
00043
00044 dbg_return_if (mon == NULL, -1);
00045
00046 <span class="keywordflow">for</span>(i = 0; i < 12; ++i)
00047 <span class="keywordflow">if</span>(strcasecmp(months[i], mon) == 0)
00048 <span class="keywordflow">return</span> i;
00049
00050 <span class="keywordflow">return</span> -1;
00051 }
00052
<a name="l00065"></a><a class="code" href="group__u__t.html#ga5">00065</a> <span class="keywordtype">int</span> <a class="code" href="group__u__t.html#ga5">u_asctime_to_tt</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *str, time_t *tp)
00066 {
00067 <span class="keyword">enum</span> { BUFSZ = 64 };
00068 <span class="keywordtype">char</span> wday[BUFSZ], mon[BUFSZ];
00069 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> day, year, hour, min, sec;
00070 <span class="keyword">struct </span>tm tm;
00071 <span class="keywordtype">int</span> i;
00072
00073 dbg_return_if (str == NULL, ~0);
00074 dbg_return_if (tp == NULL, ~0);
00075 dbg_return_if (strlen(str) >= BUFSZ, ~0);
00076
00077 dbg_err_if((i = sscanf(str, <span class="stringliteral">"%s %s %u %u:%u:%u %u"</span>, wday,
00078 mon, &day, &hour, &min, &sec, &year)) != 7);
00079
00080 memset(&tm, 0, <span class="keyword">sizeof</span>(<span class="keyword">struct</span> tm));
00081
00082 <span class="comment">/* time */</span>
00083 tm.tm_sec = sec; tm.tm_min = min; tm.tm_hour = hour;
00084
00085 <span class="comment">/* date */</span>
00086 tm.tm_mday = day;
00087 tm.tm_mon = month_idx(mon);
00088 tm.tm_year = year - 1900;
00089
00090 dbg_err_if(tm.tm_mon < 0);
00091
00092 *tp = timegm(&tm);
00093
00094 <span class="keywordflow">return</span> 0;
00095 err:
00096 <span class="keywordflow">return</span> ~0;
00097 }
00098
<a name="l00111"></a><a class="code" href="group__u__t.html#ga6">00111</a> <span class="keywordtype">int</span> <a class="code" href="group__u__t.html#ga6">u_rfc850_to_tt</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *str, time_t *tp)
00112 {
00113 <span class="keyword">enum</span> { BUFSZ = 64 };
00114 <span class="keywordtype">char</span> wday[BUFSZ], mon[BUFSZ], tzone[BUFSZ];
00115 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> day, year, hour, min, sec;
00116 <span class="keyword">struct </span>tm tm;
00117 <span class="keywordtype">int</span> i;
00118 <span class="keywordtype">char</span> c;
00119
00120 dbg_return_if (str == NULL, ~0);
00121 dbg_return_if (tp == NULL, ~0);
00122 dbg_return_if (strlen(str) >= BUFSZ, ~0);
00123
00124 dbg_err_if((i = sscanf(str, <span class="stringliteral">"%[^,], %u%c%[^-]%c%u %u:%u:%u %s"</span>, wday,
00125 &day, &c, mon, &c, &year, &hour, &min, &sec, tzone)) != 10);
00126
00127 memset(&tm, 0, <span class="keyword">sizeof</span>(<span class="keyword">struct</span> tm));
00128
00129 <span class="comment">/* time */</span>
00130 tm.tm_sec = sec; tm.tm_min = min; tm.tm_hour = hour;
00131
00132 <span class="comment">/* date */</span>
00133 tm.tm_mday = day;
00134 tm.tm_mon = month_idx(mon);
00135 tm.tm_year = year - 1900;
00136
00137 dbg_err_if(tm.tm_mon < 0);
00138
00139 <span class="preprocessor">#ifdef HAVE_TMZONE</span>
00140 <span class="preprocessor"></span> <span class="comment">/* time zone */</span>
00141 tm.tm_zone = tzone;
00142 <span class="preprocessor">#endif</span>
00143 <span class="preprocessor"></span>
00144 *tp = timegm(&tm);
00145
00146 <span class="keywordflow">return</span> 0;
00147 err:
00148 <span class="keywordflow">return</span> ~0;
00149 }
00150
<a name="l00163"></a><a class="code" href="group__u__t.html#ga7">00163</a> <span class="keywordtype">int</span> <a class="code" href="group__u__t.html#ga7">u_rfc822_to_tt</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *str, time_t *tp)
00164 {
00165 <span class="keyword">enum</span> { BUFSZ = 64 };
00166 <span class="keywordtype">char</span> wday[BUFSZ], mon[BUFSZ], tzone[BUFSZ];
00167 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> day, year, hour, min, sec;
00168 <span class="keyword">struct </span>tm tm;
00169
00170 dbg_return_if (str == NULL, ~0);
00171 dbg_return_if (tp == NULL, ~0);
00172 dbg_return_if (strlen(str) >= BUFSZ, ~0);
00173
00174 dbg_err_if(sscanf(str, <span class="stringliteral">"%[^,], %u %s %u %u:%u:%u %s"</span>, wday,
00175 &day, mon, &year, &hour, &min, &sec, tzone) != 8);
00176
00177 memset(&tm, 0, <span class="keyword">sizeof</span>(<span class="keyword">struct</span> tm));
00178
00179 <span class="comment">/* time */</span>
00180 tm.tm_sec = sec; tm.tm_min = min; tm.tm_hour = hour;
00181
00182 <span class="comment">/* date */</span>
00183 tm.tm_mday = day;
00184 tm.tm_mon = month_idx(mon);
00185 tm.tm_year = year - 1900;
00186
00187 dbg_err_if(tm.tm_mon < 0);
00188
00189 <span class="preprocessor">#ifdef HAVE_TMZONE</span>
00190 <span class="preprocessor"></span> <span class="comment">/* time zone */</span>
00191 tm.tm_zone = tzone;
00192 <span class="preprocessor">#endif</span>
00193 <span class="preprocessor"></span>
00194 *tp = timegm(&tm);
00195
00196 <span class="keywordflow">return</span> 0;
00197 err:
00198 <span class="keywordflow">return</span> ~0;
00199 }
00200
<a name="l00213"></a><a class="code" href="group__u__t.html#ga8">00213</a> <span class="keywordtype">int</span> <a class="code" href="group__u__t.html#ga8">u_httpdate_to_tt</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *str, time_t *tp)
00214 {
00215 dbg_return_if (str == NULL, ~0);
00216 dbg_return_if (tp == NULL, ~0);
00217 dbg_return_if (strlen(str) < 4, ~0);
00218
00219 <span class="keywordflow">if</span>(str[3] == <span class="charliteral">','</span>)
00220 <span class="keywordflow">return</span> <a class="code" href="group__u__t.html#ga7">u_rfc822_to_tt</a>(str, tp);
00221 <span class="keywordflow">else</span> <span class="keywordflow">if</span>(str[3] == <span class="charliteral">' '</span>)
00222 <span class="keywordflow">return</span> <a class="code" href="group__u__t.html#ga5">u_asctime_to_tt</a>(str, tp);
00223
00224 <span class="keywordflow">return</span> <a class="code" href="group__u__t.html#ga6">u_rfc850_to_tt</a>(str, tp);
00225 }
00226
<a name="l00241"></a><a class="code" href="group__u__t.html#ga9">00241</a> <span class="keywordtype">int</span> <a class="code" href="group__u__t.html#ga9">u_tt_to_rfc822</a>(<span class="keywordtype">char</span> dst[], time_t ts)
00242 {
00243 <span class="keyword">enum</span> { RFC822_DATE_BUFSZ = 32 };
00244 <span class="keywordtype">char</span> buf[RFC822_DATE_BUFSZ];
00245 <span class="keyword">struct </span>tm tm;
00246
00247 dbg_return_if (dst == NULL, ~0);
00248
00249 <span class="preprocessor">#ifdef OS_WIN</span>
00250 <span class="preprocessor"></span> memcpy(&tm, gmtime(&ts), <span class="keyword">sizeof</span>(tm));
00251 <span class="preprocessor">#else</span>
00252 <span class="preprocessor"></span> dbg_err_if(gmtime_r(&ts, &tm) == NULL);
00253 <span class="preprocessor">#endif</span>
00254 <span class="preprocessor"></span>
00255 dbg_err_if(tm.tm_wday > 6 || tm.tm_wday < 0);
00256 dbg_err_if(tm.tm_mon > 11 || tm.tm_mon < 0);
00257
00258 dbg_err_if(u_snprintf(buf, RFC822_DATE_BUFSZ,
00259 <span class="stringliteral">"%s, %02u %s %02u %02u:%02u:%02u GMT"</span>,
00260 <a class="code" href="group__u__t.html#ga0">days3</a>[tm.tm_wday],
00261 tm.tm_mday, <a class="code" href="group__u__t.html#ga2">months</a>[tm.tm_mon], tm.tm_year + 1900,
00262 tm.tm_hour, tm.tm_min, tm.tm_sec));
00263
00264 <span class="comment">/* copy out */</span>
00265 u_sstrncpy(dst, buf, RFC822_DATE_BUFSZ - 1);
00266
00267 <span class="keywordflow">return</span> 0;
00268 err:
00269 <span class="keywordflow">return</span> ~0;
00270 }
00271
</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>
|