summaryrefslogtreecommitdiff
path: root/qdbm/myconf.c
diff options
context:
space:
mode:
Diffstat (limited to 'qdbm/myconf.c')
-rw-r--r--qdbm/myconf.c1113
1 files changed, 0 insertions, 1113 deletions
diff --git a/qdbm/myconf.c b/qdbm/myconf.c
deleted file mode 100644
index 1d1f7a7c..00000000
--- a/qdbm/myconf.c
+++ /dev/null
@@ -1,1113 +0,0 @@
-/*************************************************************************************************
- * Emulation of system calls
- * Copyright (C) 2000-2007 Mikio Hirabayashi
- * This file is part of QDBM, Quick Database Manager.
- * QDBM is free software; you can redistribute it and/or modify it under the terms of the GNU
- * Lesser General Public License as published by the Free Software Foundation; either version
- * 2.1 of the License or any later version. QDBM is distributed in the hope that it will be
- * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
- * details.
- * You should have received a copy of the GNU Lesser General Public License along with QDBM; if
- * not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- * 02111-1307 USA.
- *************************************************************************************************/
-
-
-#include "myconf.h"
-
-
-
-/*************************************************************************************************
- * for dosish filesystems
- *************************************************************************************************/
-
-
-#if defined(_SYS_MSVC_) || defined(_SYS_MINGW_) || defined(_SYS_CYGWIN_)
-
-
-#define DOSPATHBUFSIZ 8192
-
-
-int _qdbm_win32_lstat(const char *pathname, struct stat *buf){
- char pbuf[DOSPATHBUFSIZ], *p;
- int inode;
- if(stat(pathname, buf) == -1) return -1;
- if(GetFullPathName(pathname, DOSPATHBUFSIZ, pbuf, &p) != 0){
- inode = 11003;
- for(p = pbuf; *p != '\0'; p++){
- inode = inode * 31 + *(unsigned char *)p;
- }
- buf->st_ino = (inode * 911) & 0x7FFF;
- }
- return 0;
-}
-
-
-#endif
-
-
-
-/*************************************************************************************************
- * for POSIX thread
- *************************************************************************************************/
-
-
-#if defined(MYPTHREAD)
-
-
-#include <pthread.h>
-
-
-#define PTKEYMAX 8
-
-
-struct { void *ptr; pthread_key_t key; } _qdbm_ptkeys[PTKEYMAX];
-int _qdbm_ptknum = 0;
-
-
-static void *_qdbm_gettsd(void *ptr, int size, const void *initval);
-
-
-void *_qdbm_settsd(void *ptr, int size, const void *initval){
- static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
- char *val;
- if((val = _qdbm_gettsd(ptr, size, initval)) != NULL) return val;
- if(pthread_mutex_lock(&mutex) != 0) return NULL;
- if((val = _qdbm_gettsd(ptr, size, initval)) != NULL){
- pthread_mutex_unlock(&mutex);
- return val;
- }
- if(_qdbm_ptknum >= PTKEYMAX){
- pthread_mutex_unlock(&mutex);
- return NULL;
- }
- _qdbm_ptkeys[_qdbm_ptknum].ptr = ptr;
- if(pthread_key_create(&(_qdbm_ptkeys[_qdbm_ptknum].key), free) != 0){
- pthread_mutex_unlock(&mutex);
- return NULL;
- }
- if(!(val = malloc(size))){
- pthread_key_delete(_qdbm_ptkeys[_qdbm_ptknum].key);
- pthread_mutex_unlock(&mutex);
- return NULL;
- }
- memcpy(val, initval, size);
- if(pthread_setspecific(_qdbm_ptkeys[_qdbm_ptknum].key, val) != 0){
- free(val);
- pthread_key_delete(_qdbm_ptkeys[_qdbm_ptknum].key);
- pthread_mutex_unlock(&mutex);
- return NULL;
- }
- _qdbm_ptknum++;
- pthread_mutex_unlock(&mutex);
- return val;
-}
-
-
-static void *_qdbm_gettsd(void *ptr, int size, const void *initval){
- char *val;
- int i;
- for(i = 0; i < _qdbm_ptknum; i++){
- if(_qdbm_ptkeys[i].ptr == ptr){
- if(!(val = pthread_getspecific(_qdbm_ptkeys[i].key))){
- if(!(val = malloc(size))) return NULL;
- memcpy(val, initval, size);
- if(pthread_setspecific(_qdbm_ptkeys[i].key, val) != 0){
- free(val);
- return NULL;
- }
- }
- return val;
- }
- }
- return NULL;
-}
-
-
-#endif
-
-
-
-/*************************************************************************************************
- * for systems without mmap
- *************************************************************************************************/
-
-
-#if defined(_SYS_MSVC_) || defined(_SYS_MINGW_)
-
-
-#define MMFDESCMAX 2048
-
-
-struct { void *start; HANDLE handle; } mmhandles[MMFDESCMAX];
-int mmhnum = 0;
-CRITICAL_SECTION mmcsec;
-
-
-static void _qdbm_delete_mmap_env(void);
-
-
-void *_qdbm_mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset){
- static volatile long first = TRUE;
- static volatile long ready = FALSE;
- HANDLE handle;
- int i;
- if(InterlockedExchange((void *)&first, FALSE)){
- InitializeCriticalSection(&mmcsec);
- atexit(_qdbm_delete_mmap_env);
- InterlockedExchange((void *)&ready, TRUE);
- }
- while(!InterlockedCompareExchange((void *)&ready, TRUE, TRUE)){
- Sleep(1);
- }
- if(fd < 0 || flags & MAP_FIXED) return MAP_FAILED;
- if(!(handle = CreateFileMapping((HANDLE)_get_osfhandle(fd), NULL,
- (prot & PROT_WRITE) ? PAGE_READWRITE : PAGE_READONLY,
- 0, length, NULL))) return MAP_FAILED;
- if(!(start = MapViewOfFile(handle, (prot & PROT_WRITE) ? FILE_MAP_WRITE : FILE_MAP_READ,
- 0, 0, length))){
- CloseHandle(handle);
- return MAP_FAILED;
- }
- EnterCriticalSection(&mmcsec);
- if(mmhnum >= MMFDESCMAX - 1){
- UnmapViewOfFile(start);
- CloseHandle(handle);
- LeaveCriticalSection(&mmcsec);
- return MAP_FAILED;
- }
- for(i = 0; i < MMFDESCMAX; i++){
- if(!mmhandles[i].start){
- mmhandles[i].start = start;
- mmhandles[i].handle = handle;
- break;
- }
- }
- mmhnum++;
- LeaveCriticalSection(&mmcsec);
- return start;
-}
-
-
-int _qdbm_munmap(void *start, size_t length){
- HANDLE handle;
- int i;
- EnterCriticalSection(&mmcsec);
- handle = NULL;
- for(i = 0; i < MMFDESCMAX; i++){
- if(mmhandles[i].start == start){
- handle = mmhandles[i].handle;
- mmhandles[i].start = NULL;
- mmhandles[i].handle = NULL;
- break;
- }
- }
- if(!handle){
- LeaveCriticalSection(&mmcsec);
- return -1;
- }
- mmhnum--;
- LeaveCriticalSection(&mmcsec);
- if(!UnmapViewOfFile(start)){
- CloseHandle(handle);
- return -1;
- }
- if(!CloseHandle(handle)) return -1;
- return 0;
-}
-
-
-int _qdbm_msync(const void *start, size_t length, int flags){
- if(!FlushViewOfFile(start, length)) return -1;
- return 0;
-}
-
-
-static void _qdbm_delete_mmap_env(void){
- DeleteCriticalSection(&mmcsec);
-}
-
-
-#elif defined(_SYS_FREEBSD_) || defined(_SYS_NETBSD_) || defined(_SYS_OPENBSD_) || \
- defined(_SYS_AIX_) || defined(_SYS_RISCOS_) || defined(MYNOMMAP)
-
-
-void *_qdbm_mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset){
- char *buf, *wp;
- int rv, rlen;
- if(flags & MAP_FIXED) return MAP_FAILED;
- if(lseek(fd, SEEK_SET, offset) == -1) return MAP_FAILED;
- if(!(buf = malloc(sizeof(int) * 3 + length))) return MAP_FAILED;
- wp = buf;
- *(int *)wp = fd;
- wp += sizeof(int);
- *(int *)wp = offset;
- wp += sizeof(int);
- *(int *)wp = prot;
- wp += sizeof(int);
- rlen = 0;
- while((rv = read(fd, wp + rlen, length - rlen)) > 0){
- rlen += rv;
- }
- if(rv == -1 || rlen != length){
- free(buf);
- return MAP_FAILED;
- }
- return wp;
-}
-
-
-int _qdbm_munmap(void *start, size_t length){
- char *buf, *rp;
- int fd, offset, prot, rv, wlen;
- buf = (char *)start - sizeof(int) * 3;
- rp = buf;
- fd = *(int *)rp;
- rp += sizeof(int);
- offset = *(int *)rp;
- rp += sizeof(int);
- prot = *(int *)rp;
- rp += sizeof(int);
- if(prot & PROT_WRITE){
- if(lseek(fd, offset, SEEK_SET) == -1){
- free(buf);
- return -1;
- }
- wlen = 0;
- while(wlen < (int)length){
- rv = write(fd, rp + wlen, length - wlen);
- if(rv == -1){
- if(errno == EINTR) continue;
- free(buf);
- return -1;
- }
- wlen += rv;
- }
- }
- free(buf);
- return 0;
-}
-
-
-int _qdbm_msync(const void *start, size_t length, int flags){
- char *buf, *rp;
- int fd, offset, prot, rv, wlen;
- buf = (char *)start - sizeof(int) * 3;
- rp = buf;
- fd = *(int *)rp;
- rp += sizeof(int);
- offset = *(int *)rp;
- rp += sizeof(int);
- prot = *(int *)rp;
- rp += sizeof(int);
- if(prot & PROT_WRITE){
- if(lseek(fd, offset, SEEK_SET) == -1) return -1;
- wlen = 0;
- while(wlen < (int)length){
- rv = write(fd, rp + wlen, length - wlen);
- if(rv == -1){
- if(errno == EINTR) continue;
- return -1;
- }
- wlen += rv;
- }
- }
- return 0;
-}
-
-
-#endif
-
-
-
-/*************************************************************************************************
- * for reentrant time routines
- *************************************************************************************************/
-
-
-#if defined(_SYS_LINUX_) || defined(_SYS_FREEBSD_) || defined(_SYS_OPENBSD_) || \
- defined(_SYS_NETBSD_) || defined(_SYS_SUNOS_) || defined(_SYS_HPUX_) || \
- defined(_SYS_MACOSX_) || defined(_SYS_CYGWIN_)
-
-
-struct tm *_qdbm_gmtime(const time_t *timep, struct tm *result){
- return gmtime_r(timep, result);
-}
-
-
-struct tm *_qdbm_localtime(const time_t *timep, struct tm *result){
- return localtime_r(timep, result);
-}
-
-
-# else
-
-
-struct tm *_qdbm_gmtime(const time_t *timep, struct tm *result){
- return gmtime(timep);
-}
-
-
-struct tm *_qdbm_localtime(const time_t *timep, struct tm *result){
- return localtime(timep);
-}
-
-
-# endif
-
-
-
-/*************************************************************************************************
- * for systems without times
- *************************************************************************************************/
-
-
-#if defined(_SYS_MSVC_) || defined(_SYS_MINGW_)
-
-
-clock_t _qdbm_times(struct tms *buf){
- buf->tms_utime = clock();
- buf->tms_stime = 0;
- buf->tms_cutime = 0;
- buf->tms_cstime = 0;
- return 0;
-}
-
-
-#endif
-
-
-
-/*************************************************************************************************
- * for Win32
- *************************************************************************************************/
-
-
-#if defined(_SYS_MSVC_) || defined(_SYS_MINGW_)
-
-
-#define WINLOCKWAIT 100
-
-
-int _qdbm_win32_fcntl(int fd, int cmd, struct flock *lock){
- HANDLE fh;
- DWORD opt;
- OVERLAPPED ol;
- fh = (HANDLE)_get_osfhandle(fd);
- opt = (cmd == F_SETLK) ? LOCKFILE_FAIL_IMMEDIATELY : 0;
- if(lock->l_type == F_WRLCK) opt |= LOCKFILE_EXCLUSIVE_LOCK;
- memset(&ol, 0, sizeof(OVERLAPPED));
- ol.Offset = INT_MAX;
- ol.OffsetHigh = 0;
- ol.hEvent = 0;
- if(!LockFileEx(fh, opt, 0, 1, 0, &ol)){
- if(GetLastError() == ERROR_CALL_NOT_IMPLEMENTED){
- while(TRUE){
- if(LockFile(fh, 0, 0, 1, 0)) return 0;
- Sleep(WINLOCKWAIT);
- }
- }
- return -1;
- }
- return 0;
-}
-
-
-#endif
-
-
-#if defined(_SYS_MSVC_)
-
-
-DIR *_qdbm_win32_opendir(const char *name){
- char expr[8192];
- int len;
- DIR *dir;
- HANDLE fh;
- WIN32_FIND_DATA data;
- len = strlen(name);
- if(len > 0 && name[len-1] == MYPATHCHR){
- sprintf(expr, "%s*", name);
- } else {
- sprintf(expr, "%s%c*", name, MYPATHCHR);
- }
- if((fh = FindFirstFile(expr, &data)) == INVALID_HANDLE_VALUE) return NULL;
- if(!(dir = malloc(sizeof(DIR)))){
- FindClose(fh);
- return NULL;
- }
- dir->fh = fh;
- dir->data = data;
- dir->first = TRUE;
- return dir;
-}
-
-
-int _qdbm_win32_closedir(DIR *dir){
- if(!FindClose(dir->fh)){
- free(dir);
- return -1;
- }
- free(dir);
- return 0;
-}
-
-
-struct dirent *_qdbm_win32_readdir(DIR *dir){
- if(dir->first){
- sprintf(dir->de.d_name, "%s", dir->data.cFileName);
- dir->first = FALSE;
- return &(dir->de);
- }
- if(!FindNextFile(dir->fh, &(dir->data))) return NULL;
- sprintf(dir->de.d_name, "%s", dir->data.cFileName);
- return &(dir->de);
-}
-
-
-#endif
-
-
-
-/*************************************************************************************************
- * for checking information of the system
- *************************************************************************************************/
-
-
-#if defined(_SYS_LINUX_)
-
-
-int _qdbm_vmemavail(size_t size){
- char buf[4096], *rp;
- int fd, rv, bsiz;
- double avail;
- if((fd = open("/proc/meminfo", O_RDONLY, 00644)) == -1) return TRUE;
- rv = TRUE;
- if((bsiz = read(fd, buf, sizeof(buf) - 1)) > 0){
- buf[bsiz] = '\0';
- avail = -1;
- if((rp = strstr(buf, "MemFree:")) != NULL){
- rp = strchr(rp, ':') + 1;
- avail = strtod(rp, NULL) * 1024.0;
- if((rp = strstr(buf, "SwapFree:")) != NULL){
- rp = strchr(rp, ':') + 1;
- avail += strtod(rp, NULL) * 1024.0;
- }
- if(size >= avail) rv = FALSE;
- }
- }
- close(fd);
- return rv;
-}
-
-
-#elif defined(_SYS_MSVC_) || defined(_SYS_MINGW_) || defined(_SYS_CYGWIN_)
-
-
-int _qdbm_vmemavail(size_t size){
- MEMORYSTATUS sbuf;
- sbuf.dwLength = sizeof(MEMORYSTATUS);
- GlobalMemoryStatus(&sbuf);
- return size < sbuf.dwAvailVirtual;
-}
-
-
-#else
-
-
-int _qdbm_vmemavail(size_t size){
- return TRUE;
-}
-
-
-#endif
-
-
-
-/*************************************************************************************************
- * for ZLIB
- *************************************************************************************************/
-
-
-#if defined(MYZLIB)
-
-
-#include <zlib.h>
-
-#define ZLIBBUFSIZ 8192
-
-
-static char *_qdbm_deflate_impl(const char *ptr, int size, int *sp, int mode);
-static char *_qdbm_inflate_impl(const char *ptr, int size, int *sp, int mode);
-static unsigned int _qdbm_getcrc_impl(const char *ptr, int size);
-
-
-char *(*_qdbm_deflate)(const char *, int, int *, int) = _qdbm_deflate_impl;
-char *(*_qdbm_inflate)(const char *, int, int *, int) = _qdbm_inflate_impl;
-unsigned int (*_qdbm_getcrc)(const char *, int) = _qdbm_getcrc_impl;
-
-
-static char *_qdbm_deflate_impl(const char *ptr, int size, int *sp, int mode){
- z_stream zs;
- char *buf, *swap;
- unsigned char obuf[ZLIBBUFSIZ];
- int rv, asiz, bsiz, osiz;
- if(size < 0) size = strlen(ptr);
- zs.zalloc = Z_NULL;
- zs.zfree = Z_NULL;
- zs.opaque = Z_NULL;
- switch(mode){
- case _QDBM_ZMRAW:
- if(deflateInit2(&zs, 5, Z_DEFLATED, -15, 7, Z_DEFAULT_STRATEGY) != Z_OK)
- return NULL;
- break;
- case _QDBM_ZMGZIP:
- if(deflateInit2(&zs, 6, Z_DEFLATED, 15 + 16, 9, Z_DEFAULT_STRATEGY) != Z_OK)
- return NULL;
- break;
- default:
- if(deflateInit2(&zs, 6, Z_DEFLATED, 15, 8, Z_DEFAULT_STRATEGY) != Z_OK)
- return NULL;
- break;
- }
- asiz = size + 16;
- if(asiz < ZLIBBUFSIZ) asiz = ZLIBBUFSIZ;
- if(!(buf = malloc(asiz))){
- deflateEnd(&zs);
- return NULL;
- }
- bsiz = 0;
- zs.next_in = (unsigned char *)ptr;
- zs.avail_in = size;
- zs.next_out = obuf;
- zs.avail_out = ZLIBBUFSIZ;
- while((rv = deflate(&zs, Z_FINISH)) == Z_OK){
- osiz = ZLIBBUFSIZ - zs.avail_out;
- if(bsiz + osiz > asiz){
- asiz = asiz * 2 + osiz;
- if(!(swap = realloc(buf, asiz))){
- free(buf);
- deflateEnd(&zs);
- return NULL;
- }
- buf = swap;
- }
- memcpy(buf + bsiz, obuf, osiz);
- bsiz += osiz;
- zs.next_out = obuf;
- zs.avail_out = ZLIBBUFSIZ;
- }
- if(rv != Z_STREAM_END){
- free(buf);
- deflateEnd(&zs);
- return NULL;
- }
- osiz = ZLIBBUFSIZ - zs.avail_out;
- if(bsiz + osiz + 1 > asiz){
- asiz = asiz * 2 + osiz;
- if(!(swap = realloc(buf, asiz))){
- free(buf);
- deflateEnd(&zs);
- return NULL;
- }
- buf = swap;
- }
- memcpy(buf + bsiz, obuf, osiz);
- bsiz += osiz;
- buf[bsiz] = '\0';
- if(mode == _QDBM_ZMRAW) bsiz++;
- *sp = bsiz;
- deflateEnd(&zs);
- return buf;
-}
-
-
-static char *_qdbm_inflate_impl(const char *ptr, int size, int *sp, int mode){
- z_stream zs;
- char *buf, *swap;
- unsigned char obuf[ZLIBBUFSIZ];
- int rv, asiz, bsiz, osiz;
- zs.zalloc = Z_NULL;
- zs.zfree = Z_NULL;
- zs.opaque = Z_NULL;
- switch(mode){
- case _QDBM_ZMRAW:
- if(inflateInit2(&zs, -15) != Z_OK) return NULL;
- break;
- case _QDBM_ZMGZIP:
- if(inflateInit2(&zs, 15 + 16) != Z_OK) return NULL;
- break;
- default:
- if(inflateInit2(&zs, 15) != Z_OK) return NULL;
- break;
- }
- asiz = size * 2 + 16;
- if(asiz < ZLIBBUFSIZ) asiz = ZLIBBUFSIZ;
- if(!(buf = malloc(asiz))){
- inflateEnd(&zs);
- return NULL;
- }
- bsiz = 0;
- zs.next_in = (unsigned char *)ptr;
- zs.avail_in = size;
- zs.next_out = obuf;
- zs.avail_out = ZLIBBUFSIZ;
- while((rv = inflate(&zs, Z_NO_FLUSH)) == Z_OK){
- osiz = ZLIBBUFSIZ - zs.avail_out;
- if(bsiz + osiz >= asiz){
- asiz = asiz * 2 + osiz;
- if(!(swap = realloc(buf, asiz))){
- free(buf);
- inflateEnd(&zs);
- return NULL;
- }
- buf = swap;
- }
- memcpy(buf + bsiz, obuf, osiz);
- bsiz += osiz;
- zs.next_out = obuf;
- zs.avail_out = ZLIBBUFSIZ;
- }
- if(rv != Z_STREAM_END){
- free(buf);
- inflateEnd(&zs);
- return NULL;
- }
- osiz = ZLIBBUFSIZ - zs.avail_out;
- if(bsiz + osiz >= asiz){
- asiz = asiz * 2 + osiz;
- if(!(swap = realloc(buf, asiz))){
- free(buf);
- inflateEnd(&zs);
- return NULL;
- }
- buf = swap;
- }
- memcpy(buf + bsiz, obuf, osiz);
- bsiz += osiz;
- buf[bsiz] = '\0';
- if(sp) *sp = bsiz;
- inflateEnd(&zs);
- return buf;
-}
-
-
-static unsigned int _qdbm_getcrc_impl(const char *ptr, int size){
- int crc;
- if(size < 0) size = strlen(ptr);
- crc = crc32(0, Z_NULL, 0);
- return crc32(crc, (unsigned char *)ptr, size);
-}
-
-
-#else
-
-
-char *(*_qdbm_deflate)(const char *, int, int *, int) = NULL;
-char *(*_qdbm_inflate)(const char *, int, int *, int) = NULL;
-unsigned int (*_qdbm_getcrc)(const char *, int) = NULL;
-
-
-#endif
-
-
-
-/*************************************************************************************************
- * for LZO
- *************************************************************************************************/
-
-
-#if defined(MYLZO)
-
-
-#include <lzo/lzo1x.h>
-
-
-static char *_qdbm_lzoencode_impl(const char *ptr, int size, int *sp);
-static char *_qdbm_lzodecode_impl(const char *ptr, int size, int *sp);
-
-
-int _qdbm_lzo_init = FALSE;
-char *(*_qdbm_lzoencode)(const char *, int, int *) = _qdbm_lzoencode_impl;
-char *(*_qdbm_lzodecode)(const char *, int, int *) = _qdbm_lzodecode_impl;
-
-
-static char *_qdbm_lzoencode_impl(const char *ptr, int size, int *sp){
- char wrkmem[LZO1X_1_MEM_COMPRESS];
- lzo_bytep buf;
- lzo_uint bsiz;
- if(!_qdbm_lzo_init){
- if(lzo_init() != LZO_E_OK) return NULL;
- _qdbm_lzo_init = TRUE;
- }
- if(size < 0) size = strlen(ptr);
- if(!(buf = malloc(size + size / 16 + 80))) return NULL;
- if(lzo1x_1_compress((lzo_bytep)ptr, size, buf, &bsiz, wrkmem) != LZO_E_OK){
- free(buf);
- return NULL;
- }
- buf[bsiz] = '\0';
- *sp = bsiz;
- return (char *)buf;
-}
-
-
-static char *_qdbm_lzodecode_impl(const char *ptr, int size, int *sp){
- lzo_bytep buf;
- lzo_uint bsiz;
- int rat, rv;
- if(!_qdbm_lzo_init){
- if(lzo_init() != LZO_E_OK) return NULL;
- _qdbm_lzo_init = TRUE;
- }
- rat = 6;
- while(TRUE){
- bsiz = (size + 256) * rat + 3;
- if(!(buf = malloc(bsiz + 1))) return NULL;
- rv = lzo1x_decompress_safe((lzo_bytep)(ptr), size, buf, &bsiz, NULL);
- if(rv == LZO_E_OK){
- break;
- } else if(rv == LZO_E_OUTPUT_OVERRUN){
- free(buf);
- rat *= 2;
- } else {
- free(buf);
- return NULL;
- }
- }
- buf[bsiz] = '\0';
- if(sp) *sp = bsiz;
- return (char *)buf;
-}
-
-
-#else
-
-
-char *(*_qdbm_lzoencode)(const char *, int, int *) = NULL;
-char *(*_qdbm_lzodecode)(const char *, int, int *) = NULL;
-
-
-#endif
-
-
-
-/*************************************************************************************************
- * for BZIP2
- *************************************************************************************************/
-
-
-#if defined(MYBZIP)
-
-
-#include <bzlib.h>
-
-#define BZIPBUFSIZ 8192
-
-
-static char *_qdbm_bzencode_impl(const char *ptr, int size, int *sp);
-static char *_qdbm_bzdecode_impl(const char *ptr, int size, int *sp);
-
-
-char *(*_qdbm_bzencode)(const char *, int, int *) = _qdbm_bzencode_impl;
-char *(*_qdbm_bzdecode)(const char *, int, int *) = _qdbm_bzdecode_impl;
-
-
-static char *_qdbm_bzencode_impl(const char *ptr, int size, int *sp){
- bz_stream zs;
- char *buf, *swap, obuf[BZIPBUFSIZ];
- int rv, asiz, bsiz, osiz;
- if(size < 0) size = strlen(ptr);
- zs.bzalloc = NULL;
- zs.bzfree = NULL;
- zs.opaque = NULL;
- if(BZ2_bzCompressInit(&zs, 9, 0, 30) != BZ_OK) return NULL;
- asiz = size + 16;
- if(asiz < BZIPBUFSIZ) asiz = BZIPBUFSIZ;
- if(!(buf = malloc(asiz))){
- BZ2_bzCompressEnd(&zs);
- return NULL;
- }
- bsiz = 0;
- zs.next_in = (char *)ptr;
- zs.avail_in = size;
- zs.next_out = obuf;
- zs.avail_out = BZIPBUFSIZ;
- while((rv = BZ2_bzCompress(&zs, BZ_FINISH)) == BZ_FINISH_OK){
- osiz = BZIPBUFSIZ - zs.avail_out;
- if(bsiz + osiz > asiz){
- asiz = asiz * 2 + osiz;
- if(!(swap = realloc(buf, asiz))){
- free(buf);
- BZ2_bzCompressEnd(&zs);
- return NULL;
- }
- buf = swap;
- }
- memcpy(buf + bsiz, obuf, osiz);
- bsiz += osiz;
- zs.next_out = obuf;
- zs.avail_out = BZIPBUFSIZ;
- }
- if(rv != BZ_STREAM_END){
- free(buf);
- BZ2_bzCompressEnd(&zs);
- return NULL;
- }
- osiz = BZIPBUFSIZ - zs.avail_out;
- if(bsiz + osiz + 1 > asiz){
- asiz = asiz * 2 + osiz;
- if(!(swap = realloc(buf, asiz))){
- free(buf);
- BZ2_bzCompressEnd(&zs);
- return NULL;
- }
- buf = swap;
- }
- memcpy(buf + bsiz, obuf, osiz);
- bsiz += osiz;
- buf[bsiz] = '\0';
- *sp = bsiz;
- BZ2_bzCompressEnd(&zs);
- return buf;
-}
-
-
-static char *_qdbm_bzdecode_impl(const char *ptr, int size, int *sp){
- bz_stream zs;
- char *buf, *swap, obuf[BZIPBUFSIZ];
- int rv, asiz, bsiz, osiz;
- zs.bzalloc = NULL;
- zs.bzfree = NULL;
- zs.opaque = NULL;
- if(BZ2_bzDecompressInit(&zs, 0, 0) != BZ_OK) return NULL;
- asiz = size * 2 + 16;
- if(asiz < BZIPBUFSIZ) asiz = BZIPBUFSIZ;
- if(!(buf = malloc(asiz))){
- BZ2_bzDecompressEnd(&zs);
- return NULL;
- }
- bsiz = 0;
- zs.next_in = (char *)ptr;
- zs.avail_in = size;
- zs.next_out = obuf;
- zs.avail_out = BZIPBUFSIZ;
- while((rv = BZ2_bzDecompress(&zs)) == BZ_OK){
- osiz = BZIPBUFSIZ - zs.avail_out;
- if(bsiz + osiz >= asiz){
- asiz = asiz * 2 + osiz;
- if(!(swap = realloc(buf, asiz))){
- free(buf);
- BZ2_bzDecompressEnd(&zs);
- return NULL;
- }
- buf = swap;
- }
- memcpy(buf + bsiz, obuf, osiz);
- bsiz += osiz;
- zs.next_out = obuf;
- zs.avail_out = BZIPBUFSIZ;
- }
- if(rv != BZ_STREAM_END){
- free(buf);
- BZ2_bzDecompressEnd(&zs);
- return NULL;
- }
- osiz = BZIPBUFSIZ - zs.avail_out;
- if(bsiz + osiz >= asiz){
- asiz = asiz * 2 + osiz;
- if(!(swap = realloc(buf, asiz))){
- free(buf);
- BZ2_bzDecompressEnd(&zs);
- return NULL;
- }
- buf = swap;
- }
- memcpy(buf + bsiz, obuf, osiz);
- bsiz += osiz;
- buf[bsiz] = '\0';
- if(sp) *sp = bsiz;
- BZ2_bzDecompressEnd(&zs);
- return buf;
-}
-
-
-#else
-
-
-char *(*_qdbm_bzencode)(const char *, int, int *) = NULL;
-char *(*_qdbm_bzdecode)(const char *, int, int *) = NULL;
-
-
-#endif
-
-
-
-/*************************************************************************************************
- * for ICONV
- *************************************************************************************************/
-
-
-#if defined(MYICONV)
-
-
-#include <iconv.h>
-
-#define ICONVCHECKSIZ 32768
-#define ICONVMISSMAX 256
-#define ICONVALLWRAT 0.001
-
-
-static char *_qdbm_iconv_impl(const char *ptr, int size,
- const char *icode, const char *ocode, int *sp, int *mp);
-static const char *_qdbm_encname_impl(const char *ptr, int size);
-static int _qdbm_encmiss(const char *ptr, int size, const char *icode, const char *ocode);
-
-
-char *(*_qdbm_iconv)(const char *, int, const char *, const char *,
- int *, int *) = _qdbm_iconv_impl;
-const char *(*_qdbm_encname)(const char *, int) = _qdbm_encname_impl;
-
-
-static char *_qdbm_iconv_impl(const char *ptr, int size,
- const char *icode, const char *ocode, int *sp, int *mp){
- iconv_t ic;
- char *obuf, *wp, *rp;
- size_t isiz, osiz;
- int miss;
- if(size < 0) size = strlen(ptr);
- isiz = size;
- if((ic = iconv_open(ocode, icode)) == (iconv_t)-1) return NULL;
- osiz = isiz * 5;
- if(!(obuf = malloc(osiz + 1))){
- iconv_close(ic);
- return NULL;
- }
- wp = obuf;
- rp = (char *)ptr;
- miss = 0;
- while(isiz > 0){
- if(iconv(ic, (void *)&rp, &isiz, &wp, &osiz) == -1){
- if(errno == EILSEQ && (*rp == 0x5c || *rp == 0x7e)){
- *wp = *rp;
- wp++;
- rp++;
- isiz--;
- } else if(errno == EILSEQ || errno == EINVAL){
- rp++;
- isiz--;
- miss++;
- } else {
- break;
- }
- }
- }
- *wp = '\0';
- if(iconv_close(ic) == -1){
- free(obuf);
- return NULL;
- }
- if(sp) *sp = wp - obuf;
- if(mp) *mp = miss;
- return obuf;
-}
-
-
-static const char *_qdbm_encname_impl(const char *ptr, int size){
- const char *hypo;
- int i, miss, cr;
- if(size < 0) size = strlen(ptr);
- if(size > ICONVCHECKSIZ) size = ICONVCHECKSIZ;
- if(size >= 2 && (!memcmp(ptr, "\xfe\xff", 2) || !memcmp(ptr, "\xff\xfe", 2))) return "UTF-16";
- for(i = 0; i < size - 1; i += 2){
- if(ptr[i] == 0 && ptr[i+1] != 0) return "UTF-16BE";
- if(ptr[i+1] == 0 && ptr[i] != 0) return "UTF-16LE";
- }
- for(i = 0; i < size - 3; i++){
- if(ptr[i] == 0x1b){
- i++;
- if(ptr[i] == '(' && strchr("BJHI", ptr[i+1])) return "ISO-2022-JP";
- if(ptr[i] == '$' && strchr("@B(", ptr[i+1])) return "ISO-2022-JP";
- }
- }
- if(_qdbm_encmiss(ptr, size, "US-ASCII", "UTF-16BE") < 1) return "US-ASCII";
- if(_qdbm_encmiss(ptr, size, "UTF-8", "UTF-16BE") < 1) return "UTF-8";
- hypo = NULL;
- cr = FALSE;
- for(i = 0; i < size; i++){
- if(ptr[i] == 0xd){
- cr = TRUE;
- break;
- }
- }
- if(cr){
- if((miss = _qdbm_encmiss(ptr, size, "Shift_JIS", "EUC-JP")) < 1) return "Shift_JIS";
- if(!hypo && miss / (double)size <= ICONVALLWRAT) hypo = "Shift_JIS";
- if((miss = _qdbm_encmiss(ptr, size, "EUC-JP", "UTF-16BE")) < 1) return "EUC-JP";
- if(!hypo && miss / (double)size <= ICONVALLWRAT) hypo = "EUC-JP";
- } else {
- if((miss = _qdbm_encmiss(ptr, size, "EUC-JP", "UTF-16BE")) < 1) return "EUC-JP";
- if(!hypo && miss / (double)size <= ICONVALLWRAT) hypo = "EUC-JP";
- if((miss = _qdbm_encmiss(ptr, size, "Shift_JIS", "EUC-JP")) < 1) return "Shift_JIS";
- if(!hypo && miss / (double)size <= ICONVALLWRAT) hypo = "Shift_JIS";
- }
- if((miss = _qdbm_encmiss(ptr, size, "UTF-8", "UTF-16BE")) < 1) return "UTF-8";
- if(!hypo && miss / (double)size <= ICONVALLWRAT) hypo = "UTF-8";
- if((miss = _qdbm_encmiss(ptr, size, "CP932", "UTF-16BE")) < 1) return "CP932";
- if(!hypo && miss / (double)size <= ICONVALLWRAT) hypo = "CP932";
- return hypo ? hypo : "ISO-8859-1";
-}
-
-
-static int _qdbm_encmiss(const char *ptr, int size, const char *icode, const char *ocode){
- iconv_t ic;
- char obuf[ICONVCHECKSIZ], *wp, *rp;
- size_t isiz, osiz;
- int miss;
- isiz = size;
- if((ic = iconv_open(ocode, icode)) == (iconv_t)-1) return ICONVMISSMAX;
- miss = 0;
- rp = (char *)ptr;
- while(isiz > 0){
- osiz = ICONVCHECKSIZ;
- wp = obuf;
- if(iconv(ic, (void *)&rp, &isiz, &wp, &osiz) == -1){
- if(errno == EILSEQ || errno == EINVAL){
- rp++;
- isiz--;
- miss++;
- if(miss >= ICONVMISSMAX) break;
- } else {
- break;
- }
- }
- }
- if(iconv_close(ic) == -1) return ICONVMISSMAX;
- return miss;
-}
-
-
-#else
-
-
-char *(*_qdbm_iconv)(const char *, int, const char *, const char *, int *, int *) = NULL;
-const char *(*_qdbm_encname)(const char *, int) = NULL;
-
-
-#endif
-
-
-
-/*************************************************************************************************
- * common settings
- *************************************************************************************************/
-
-
-int _qdbm_dummyfunc(void){
- return 0;
-}
-
-
-
-/* END OF FILE */