Annotation of embedaddon/rsync/zlib/zutil.c, revision 1.1

1.1     ! misho       1: /* zutil.c -- target dependent utility functions for the compression library
        !             2:  * Copyright (C) 1995-2005 Jean-loup Gailly.
        !             3:  * For conditions of distribution and use, see copyright notice in zlib.h
        !             4:  */
        !             5: 
        !             6: /* @(#) $Id$ */
        !             7: 
        !             8: #include "zutil.h"
        !             9: 
        !            10: #ifndef NO_DUMMY_DECL
        !            11: struct internal_state      {int dummy;}; /* for buggy compilers */
        !            12: #endif
        !            13: 
        !            14: const char * const z_errmsg[10] = {
        !            15: "need dictionary",     /* Z_NEED_DICT       2  */
        !            16: "stream end",          /* Z_STREAM_END      1  */
        !            17: "",                    /* Z_OK              0  */
        !            18: "file error",          /* Z_ERRNO         (-1) */
        !            19: "stream error",        /* Z_STREAM_ERROR  (-2) */
        !            20: "data error",          /* Z_DATA_ERROR    (-3) */
        !            21: "insufficient memory", /* Z_MEM_ERROR     (-4) */
        !            22: "buffer error",        /* Z_BUF_ERROR     (-5) */
        !            23: "incompatible version",/* Z_VERSION_ERROR (-6) */
        !            24: ""};
        !            25: 
        !            26: 
        !            27: const char * ZEXPORT zlibVersion()
        !            28: {
        !            29:     return ZLIB_VERSION;
        !            30: }
        !            31: 
        !            32: uLong ZEXPORT zlibCompileFlags()
        !            33: {
        !            34:     uLong flags;
        !            35: 
        !            36:     flags = 0;
        !            37:     switch (sizeof(uInt)) {
        !            38:     case 2:     break;                         /* CONSTANT CONDITION */
        !            39:     case 4:     flags += 1;     break;         /* CONSTANT CONDITION */
        !            40:     case 8:     flags += 2;     break;         /* CONSTANT CONDITION */
        !            41:     default:    flags += 3;
        !            42:     }
        !            43:     switch (sizeof(uLong)) {
        !            44:     case 2:     break;                         /* CONSTANT CONDITION */
        !            45:     case 4:     flags += 1 << 2;        break; /* CONSTANT CONDITION */
        !            46:     case 8:     flags += 2 << 2;        break; /* CONSTANT CONDITION */
        !            47:     default:    flags += 3 << 2;
        !            48:     }
        !            49:     switch (sizeof(voidpf)) {
        !            50:     case 2:     break;                         /* CONSTANT CONDITION */
        !            51:     case 4:     flags += 1 << 4;        break; /* CONSTANT CONDITION */
        !            52:     case 8:     flags += 2 << 4;        break; /* CONSTANT CONDITION */
        !            53:     default:    flags += 3 << 4;
        !            54:     }
        !            55:     switch (sizeof(z_off_t)) {
        !            56:     case 2:     break;                         /* CONSTANT CONDITION */
        !            57:     case 4:     flags += 1 << 6;        break; /* CONSTANT CONDITION */
        !            58:     case 8:     flags += 2 << 6;        break; /* CONSTANT CONDITION */
        !            59:     default:    flags += 3 << 6;
        !            60:     }
        !            61: #ifdef DEBUG
        !            62:     flags += 1 << 8;
        !            63: #endif
        !            64: #if defined(ASMV) || defined(ASMINF)
        !            65:     flags += 1 << 9;
        !            66: #endif
        !            67: #ifdef ZLIB_WINAPI
        !            68:     flags += 1 << 10;
        !            69: #endif
        !            70: #ifdef BUILDFIXED
        !            71:     flags += 1 << 12;
        !            72: #endif
        !            73: #ifdef DYNAMIC_CRC_TABLE
        !            74:     flags += 1 << 13;
        !            75: #endif
        !            76: #ifdef NO_GZCOMPRESS
        !            77:     flags += 1L << 16;
        !            78: #endif
        !            79: #ifdef NO_GZIP
        !            80:     flags += 1L << 17;
        !            81: #endif
        !            82: #ifdef PKZIP_BUG_WORKAROUND
        !            83:     flags += 1L << 20;
        !            84: #endif
        !            85: #ifdef FASTEST
        !            86:     flags += 1L << 21;
        !            87: #endif
        !            88: #ifdef STDC
        !            89: #  ifdef NO_vsnprintf
        !            90:         flags += 1L << 25;
        !            91: #    ifdef HAS_vsprintf_void
        !            92:         flags += 1L << 26;
        !            93: #    endif
        !            94: #  else
        !            95: #    ifdef HAS_vsnprintf_void
        !            96:         flags += 1L << 26;
        !            97: #    endif
        !            98: #  endif
        !            99: #else
        !           100:         flags += 1L << 24;
        !           101: #  ifdef NO_snprintf
        !           102:         flags += 1L << 25;
        !           103: #    ifdef HAS_sprintf_void
        !           104:         flags += 1L << 26;
        !           105: #    endif
        !           106: #  else
        !           107: #    ifdef HAS_snprintf_void
        !           108:         flags += 1L << 26;
        !           109: #    endif
        !           110: #  endif
        !           111: #endif
        !           112:     return flags;
        !           113: }
        !           114: 
        !           115: #ifdef DEBUG
        !           116: 
        !           117: #  ifndef verbose
        !           118: #    define verbose 0
        !           119: #  endif
        !           120: int z_verbose = verbose;
        !           121: 
        !           122: void z_error (m)
        !           123:     char *m;
        !           124: {
        !           125:     fprintf(stderr, "%s\n", m);
        !           126:     exit(1);
        !           127: }
        !           128: #endif
        !           129: 
        !           130: /* exported to allow conversion of error code to string for compress() and
        !           131:  * uncompress()
        !           132:  */
        !           133: const char * ZEXPORT zError(err)
        !           134:     int err;
        !           135: {
        !           136:     return ERR_MSG(err);
        !           137: }
        !           138: 
        !           139: #if defined(_WIN32_WCE)
        !           140:     /* The Microsoft C Run-Time Library for Windows CE doesn't have
        !           141:      * errno.  We define it as a global variable to simplify porting.
        !           142:      * Its value is always 0 and should not be used.
        !           143:      */
        !           144:     int errno = 0;
        !           145: #endif
        !           146: 
        !           147: #ifndef HAVE_MEMCPY
        !           148: 
        !           149: void zmemcpy(dest, source, len)
        !           150:     Bytef* dest;
        !           151:     const Bytef* source;
        !           152:     uInt  len;
        !           153: {
        !           154:     if (len == 0) return;
        !           155:     do {
        !           156:         *dest++ = *source++; /* ??? to be unrolled */
        !           157:     } while (--len != 0);
        !           158: }
        !           159: 
        !           160: int zmemcmp(s1, s2, len)
        !           161:     const Bytef* s1;
        !           162:     const Bytef* s2;
        !           163:     uInt  len;
        !           164: {
        !           165:     uInt j;
        !           166: 
        !           167:     for (j = 0; j < len; j++) {
        !           168:         if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1;
        !           169:     }
        !           170:     return 0;
        !           171: }
        !           172: 
        !           173: void zmemzero(dest, len)
        !           174:     Bytef* dest;
        !           175:     uInt  len;
        !           176: {
        !           177:     if (len == 0) return;
        !           178:     do {
        !           179:         *dest++ = 0;  /* ??? to be unrolled */
        !           180:     } while (--len != 0);
        !           181: }
        !           182: #endif
        !           183: 
        !           184: 
        !           185: #ifdef SYS16BIT
        !           186: 
        !           187: #ifdef __TURBOC__
        !           188: /* Turbo C in 16-bit mode */
        !           189: 
        !           190: #  define MY_ZCALLOC
        !           191: 
        !           192: /* Turbo C malloc() does not allow dynamic allocation of 64K bytes
        !           193:  * and farmalloc(64K) returns a pointer with an offset of 8, so we
        !           194:  * must fix the pointer. Warning: the pointer must be put back to its
        !           195:  * original form in order to free it, use zcfree().
        !           196:  */
        !           197: 
        !           198: #define MAX_PTR 10
        !           199: /* 10*64K = 640K */
        !           200: 
        !           201: local int next_ptr = 0;
        !           202: 
        !           203: typedef struct ptr_table_s {
        !           204:     voidpf org_ptr;
        !           205:     voidpf new_ptr;
        !           206: } ptr_table;
        !           207: 
        !           208: local ptr_table table[MAX_PTR];
        !           209: /* This table is used to remember the original form of pointers
        !           210:  * to large buffers (64K). Such pointers are normalized with a zero offset.
        !           211:  * Since MSDOS is not a preemptive multitasking OS, this table is not
        !           212:  * protected from concurrent access. This hack doesn't work anyway on
        !           213:  * a protected system like OS/2. Use Microsoft C instead.
        !           214:  */
        !           215: 
        !           216: voidpf zcalloc (voidpf opaque, unsigned items, unsigned size)
        !           217: {
        !           218:     voidpf buf = opaque; /* just to make some compilers happy */
        !           219:     ulg bsize = (ulg)items*size;
        !           220: 
        !           221:     /* If we allocate less than 65520 bytes, we assume that farmalloc
        !           222:      * will return a usable pointer which doesn't have to be normalized.
        !           223:      */
        !           224:     if (bsize < 65520L) {
        !           225:         buf = farmalloc(bsize);
        !           226:         if (*(ush*)&buf != 0) return buf;
        !           227:     } else {
        !           228:         buf = farmalloc(bsize + 16L);
        !           229:     }
        !           230:     if (buf == NULL || next_ptr >= MAX_PTR) return NULL;
        !           231:     table[next_ptr].org_ptr = buf;
        !           232: 
        !           233:     /* Normalize the pointer to seg:0 */
        !           234:     *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4;
        !           235:     *(ush*)&buf = 0;
        !           236:     table[next_ptr++].new_ptr = buf;
        !           237:     return buf;
        !           238: }
        !           239: 
        !           240: void  zcfree (voidpf opaque, voidpf ptr)
        !           241: {
        !           242:     int n;
        !           243:     if (*(ush*)&ptr != 0) { /* object < 64K */
        !           244:         farfree(ptr);
        !           245:         return;
        !           246:     }
        !           247:     /* Find the original pointer */
        !           248:     for (n = 0; n < next_ptr; n++) {
        !           249:         if (ptr != table[n].new_ptr) continue;
        !           250: 
        !           251:         farfree(table[n].org_ptr);
        !           252:         while (++n < next_ptr) {
        !           253:             table[n-1] = table[n];
        !           254:         }
        !           255:         next_ptr--;
        !           256:         return;
        !           257:     }
        !           258:     ptr = opaque; /* just to make some compilers happy */
        !           259:     Assert(0, "zcfree: ptr not found");
        !           260: }
        !           261: 
        !           262: #endif /* __TURBOC__ */
        !           263: 
        !           264: 
        !           265: #ifdef M_I86
        !           266: /* Microsoft C in 16-bit mode */
        !           267: 
        !           268: #  define MY_ZCALLOC
        !           269: 
        !           270: #if (!defined(_MSC_VER) || (_MSC_VER <= 600))
        !           271: #  define _halloc  halloc
        !           272: #  define _hfree   hfree
        !           273: #endif
        !           274: 
        !           275: voidpf zcalloc (voidpf opaque, unsigned items, unsigned size)
        !           276: {
        !           277:     if (opaque) opaque = 0; /* to make compiler happy */
        !           278:     return _halloc((long)items, size);
        !           279: }
        !           280: 
        !           281: void  zcfree (voidpf opaque, voidpf ptr)
        !           282: {
        !           283:     if (opaque) opaque = 0; /* to make compiler happy */
        !           284:     _hfree(ptr);
        !           285: }
        !           286: 
        !           287: #endif /* M_I86 */
        !           288: 
        !           289: #endif /* SYS16BIT */
        !           290: 
        !           291: 
        !           292: #ifndef MY_ZCALLOC /* Any system without a special alloc function */
        !           293: 
        !           294: #ifndef STDC
        !           295: extern voidp  malloc OF((uInt size));
        !           296: extern voidp  calloc OF((uInt items, uInt size));
        !           297: extern void   free   OF((voidpf ptr));
        !           298: #endif
        !           299: 
        !           300: voidpf zcalloc (opaque, items, size)
        !           301:     voidpf opaque;
        !           302:     unsigned items;
        !           303:     unsigned size;
        !           304: {
        !           305:     if (opaque) items += size - size; /* make compiler happy */
        !           306:     return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) :
        !           307:                               (voidpf)calloc(items, size);
        !           308: }
        !           309: 
        !           310: void  zcfree (opaque, ptr)
        !           311:     voidpf opaque;
        !           312:     voidpf ptr;
        !           313: {
        !           314:     free(ptr);
        !           315:     if (opaque) return; /* make compiler happy */
        !           316: }
        !           317: 
        !           318: #endif /* MY_ZCALLOC */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>