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