Home | History | Annotate | Download | only in util
      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