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 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 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 55 void ne_set_log (int level) 56 { 57 LogLevel = level; 58 } 59 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 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 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 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 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 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 */ 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 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 */ 148 double ne_timef (void) { 149 return time(NULL); 150 } 151 152 #else 153 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 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