1 /*
2 * Copyright 2001-2004 Brandon Long
3 * All Rights Reserved.
4 *
5 * ClearSilver Templating System
6 *
7 * This code is made available under the terms of the ClearSilver License.
8 * http://www.clearsilver.net/license.hdf
9 *
10 */
11
12 #include "cs_config.h"
13
14 #include <time.h>
15 #include <stdarg.h>
16 #include <stdlib.h>
17 #include <ctype.h>
18 #include <sys/time.h>
19 #include <sys/types.h>
20 #include <string.h>
21 #include <unistd.h>
22 #include "neo_misc.h"
23 #include "neo_err.h"
24
ne_vwarn(const char * fmt,va_list ap)25 void ne_vwarn (const char *fmt, va_list ap)
26 {
27 char tbuf[20];
28 char buf[1024];
29 struct tm my_tm;
30 time_t now;
31 int len;
32
33 now = time(NULL);
34
35 localtime_r(&now, &my_tm);
36
37 strftime(tbuf, sizeof(tbuf), "%m/%d %T", &my_tm);
38
39 vsnprintf (buf, sizeof(buf), fmt, ap);
40 len = strlen(buf);
41 while (len && isspace (buf[len-1])) buf[--len] = '\0';
42 fprintf (stderr, "[%s] %s\n", tbuf, buf);
43 }
44
ne_warn(const char * fmt,...)45 void ne_warn (const char *fmt, ...)
46 {
47 va_list ap;
48 va_start (ap, fmt);
49 ne_vwarn (fmt, ap);
50 va_end (ap);
51 }
52
53 static int LogLevel = 0;
54
ne_set_log(int level)55 void ne_set_log (int level)
56 {
57 LogLevel = level;
58 }
59
ne_log(int level,const char * fmt,...)60 void ne_log (int level, const char *fmt, ...)
61 {
62 va_list ap;
63
64 if (LogLevel >= level)
65 {
66 va_start (ap, fmt);
67 ne_vwarn (fmt, ap);
68 va_end (ap);
69 }
70 }
71
python_string_hash(const char * s)72 UINT32 python_string_hash (const char *s)
73 {
74 int len=0;
75 register UINT32 x;
76
77 x = *s << 7;
78 while(*s != 0) {
79 x = (1000003*x) ^ *s;
80 s++;
81 len++;
82 }
83 x ^= len;
84 if(x == -1) x = -2;
85 return x;
86 }
87
ne_stream4(UINT8 * dest,UINT32 num)88 UINT8 *ne_stream4 (UINT8 *dest, UINT32 num)
89 {
90 dest[0] = num & 0xFF;
91 dest[1] = (num >> 8) & 0xFF;
92 dest[2] = (num >> 16) & 0xFF;
93 dest[3] = (num >> 24) & 0xFF;
94
95 return dest + 4;
96 }
97
ne_stream2(UINT8 * dest,UINT16 num)98 UINT8 *ne_stream2 (UINT8 *dest, UINT16 num)
99 {
100 dest[0] = num & 0xFF;
101 dest[1] = (num >> 8) & 0xFF;
102
103 return dest + 2;
104 }
105
ne_unstream4(UINT32 * pnum,UINT8 * src)106 UINT8 *ne_unstream4 (UINT32 *pnum, UINT8 *src)
107 {
108 *pnum = src[0] | (src[1] << 8) | (src[2] << 16) | (src[3] << 24);
109
110 return src + 4;
111 }
112
ne_unstream2(UINT16 * pnum,UINT8 * src)113 UINT8 *ne_unstream2 (UINT16 *pnum, UINT8 *src)
114 {
115 *pnum = src[0] | (src[1] << 8);
116
117 return src + 2;
118 }
119
120 /* This handles strings of less than 256 bytes */
ne_unstream_str(char * s,int l,UINT8 * src)121 UINT8 *ne_unstream_str (char *s, int l, UINT8 *src)
122 {
123 UINT8 sl;
124
125 sl = src[0];
126 if (sl > l)
127 sl = l;
128 memcpy (s, src+1, sl);
129 s[l-1] = '\0';
130 return src+sl+1;
131 }
132
ne_stream_str(UINT8 * dest,const char * s,int l)133 UINT8 *ne_stream_str (UINT8 *dest, const char *s, int l)
134 {
135 if (l > 255)
136 {
137 ne_warn("WARNING: calling ne_stream_str with l>255");
138 l = 255;
139 }
140 dest[0] = l;
141 memcpy (dest+1, s, l);
142 return dest+l+1;
143 }
144
145 #ifndef HAVE_GETTIMEOFDAY
146
147 /* Ok, if we don't have gettimeofday, they only get second resolution */
ne_timef(void)148 double ne_timef (void) {
149 return time(NULL);
150 }
151
152 #else
153
ne_timef(void)154 double ne_timef (void)
155 {
156 double f = 0;
157 struct timeval tv;
158 int ret;
159
160 ret = gettimeofday(&tv, NULL);
161 if (ret == 0)
162 {
163 f = tv.tv_sec + (tv.tv_usec / 1000000.0);
164 }
165 return f;
166 }
167 #endif
168
169 static const UINT32 CRCTable[256] = {
170 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F,
171 0xE963A535, 0x9E6495A3, 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,
172 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, 0x1DB71064, 0x6AB020F2,
173 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
174 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9,
175 0xFA0F3D63, 0x8D080DF5, 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,
176 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, 0x35B5A8FA, 0x42B2986C,
177 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
178 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423,
179 0xCFBA9599, 0xB8BDA50F, 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,
180 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, 0x76DC4190, 0x01DB7106,
181 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
182 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D,
183 0x91646C97, 0xE6635C01, 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,
184 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, 0x65B0D9C6, 0x12B7E950,
185 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
186 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7,
187 0xA4D1C46D, 0xD3D6F4FB, 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,
188 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, 0x5005713C, 0x270241AA,
189 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
190 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81,
191 0xB7BD5C3B, 0xC0BA6CAD, 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,
192 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, 0xE3630B12, 0x94643B84,
193 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
194 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB,
195 0x196C3671, 0x6E6B06E7, 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,
196 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, 0xD6D6A3E8, 0xA1D1937E,
197 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
198 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55,
199 0x316E8EEF, 0x4669BE79, 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,
200 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, 0xC5BA3BBE, 0xB2BD0B28,
201 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
202 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F,
203 0x72076785, 0x05005713, 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,
204 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, 0x86D3D2D4, 0xF1D4E242,
205 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
206 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69,
207 0x616BFFD3, 0x166CCF45, 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,
208 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, 0xAED16A4A, 0xD9D65ADC,
209 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
210 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693,
211 0x54DE5729, 0x23D967BF, 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,
212 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D
213 };
214
ne_crc(UINT8 * data,UINT32 bytes)215 UINT32 ne_crc (UINT8 *data, UINT32 bytes)
216 {
217 UINT32 crc, i;
218
219 crc = (UINT32)-1;
220
221 for(i = 0; i < bytes; i++, data++)
222 crc = ((crc >> 8) & 0xFFFFFF) ^ CRCTable[((crc ^ *data) & 0xFF)];
223
224 crc = ~crc;
225
226 return crc;
227 }
228
229