diff options
Diffstat (limited to 'qdbm/cabin.h')
-rw-r--r-- | qdbm/cabin.h | 1544 |
1 files changed, 1544 insertions, 0 deletions
diff --git a/qdbm/cabin.h b/qdbm/cabin.h new file mode 100644 index 00000000..230ec150 --- /dev/null +++ b/qdbm/cabin.h @@ -0,0 +1,1544 @@ +/************************************************************************************************* + * The utitlity API of QDBM + * 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. + *************************************************************************************************/ + + +#ifndef _CABIN_H /* duplication check */ +#define _CABIN_H + +#if defined(__cplusplus) /* export for C++ */ +extern "C" { +#endif + + +#include <stdlib.h> +#include <time.h> + + +#if defined(_MSC_VER) && !defined(QDBM_INTERNAL) && !defined(QDBM_STATIC) +#define MYEXTERN extern __declspec(dllimport) +#else +#define MYEXTERN extern +#endif + + + +/************************************************************************************************* + * API + *************************************************************************************************/ + + +#define CB_DATUMUNIT 12 /* allocation unit size of a datum handle */ +#define CB_LISTUNIT 64 /* allocation unit number of a list handle */ +#define CB_MAPBNUM 4093 /* bucket size of a map handle */ + +typedef struct { /* type of structure for a basic datum */ + char *dptr; /* pointer to the region */ + int dsize; /* size of the region */ + int asize; /* size of the allocated region */ +} CBDATUM; + +typedef struct { /* type of structure for an element of a list */ + char *dptr; /* pointer to the region */ + int dsize; /* size of the effective region */ +} CBLISTDATUM; + +typedef struct { /* type of structure for a list */ + CBLISTDATUM *array; /* array of data */ + int anum; /* number of the elements of the array */ + int start; /* start index of using elements */ + int num; /* number of using elements */ +} CBLIST; + +typedef struct _CBMAPDATUM { /* type of structure for an element of a map */ + int ksiz; /* size of the region of the key */ + int vsiz; /* size of the region of the value */ + int hash; /* second hash value */ + struct _CBMAPDATUM *left; /* pointer to the left child */ + struct _CBMAPDATUM *right; /* pointer to the right child */ + struct _CBMAPDATUM *prev; /* pointer to the previous element */ + struct _CBMAPDATUM *next; /* pointer to the next element */ +} CBMAPDATUM; + +typedef struct { /* type of structure for a map */ + CBMAPDATUM **buckets; /* bucket array */ + CBMAPDATUM *first; /* pointer to the first element */ + CBMAPDATUM *last; /* pointer to the last element */ + CBMAPDATUM *cur; /* pointer to the current element */ + int bnum; /* number of buckets */ + int rnum; /* number of records */ +} CBMAP; + +typedef struct { /* type of structure for a heap */ + char *base; /* base pointer */ + char *swap; /* region for swapping */ + int size; /* size of each record */ + int num; /* currnet number of records */ + int max; /* maximum number of records */ + int(*compar)(const void *, const void *); /* comparing function */ +} CBHEAP; + + +/* Call back function for handling a fatal error. + The argument specifies the error message. The initial value of this variable is `NULL'. + If the value is `NULL', the default function is called when a fatal error occurs. A fatal + error occurs when memory allocation is failed. */ +MYEXTERN void (*cbfatalfunc)(const char *); + + +/* Allocate a region on memory. + `size' specifies the size of the region. + The return value is the pointer to the allocated region. + Because the region of the return value is allocated with the `malloc' call, it should be + released with the `free' call if it is no longer in use. */ +void *cbmalloc(size_t size); + + +/* Re-allocate a region on memory. + `ptr' specifies the pointer to a region. + `size' specifies the size of the region. + The return value is the pointer to the re-allocated region. + Because the region of the return value is allocated with the `realloc' call, it should be + released with the `free' call if it is no longer in use. */ +void *cbrealloc(void *ptr, size_t size); + + +/* Duplicate a region on memory. + `ptr' specifies the pointer to a region. + `size' specifies the size of the region. If it is negative, the size is assigned with + `strlen(ptr)'. + The return value is the pointer to the allocated region of the duplicate. + Because an additional zero code is appended at the end of the region of the return value, + the return value can be treated as a character string. Because the region of the return + value is allocated with the `malloc' call, it should be released with the `free' call if + it is no longer in use. */ +char *cbmemdup(const char *ptr, int size); + + +/* Free a region on memory. + `ptr' specifies the pointer to a region. If it is `NULL', this function has no effect. + Although this function is just a wrapper of `free' call, this is useful in applications using + another package of the `malloc' series. */ +void cbfree(void *ptr); + + +/* Register the pointer or handle of an object to the global garbage collector. + `ptr' specifies the pointer or handle of an object. + `func' specifies the pointer to a function to release resources of the object. Its argument + is the pointer or handle of the object to release. + This function assures that resources of an object are released when the process exits + normally by returning from the `main' function or calling the `exit' function. */ +void cbglobalgc(void *ptr, void (*func)(void *)); + + +/* Exercise the global garbage collector explicitly. + Note that you should not use objects registered to the global garbage collector any longer + after calling this function. Because the global garbage collecter is initialized and you + can register new objects into it. */ +void cbggcsweep(void); + + +/* Check availability of allocation of the virtual memory. + `size' specifies the size of region to be allocated newly. + The return value is true if allocation should be success, or false if not. */ +int cbvmemavail(size_t size); + + +/* Sort an array using insert sort. + `base' spacifies the pointer to an array. + `nmemb' specifies the number of elements of the array. + `size' specifies the size of each element. + `compar' specifies the pointer to comparing function. The two arguments specify the pointers + of elements. The comparing function should returns positive if the former is big, negative + if the latter is big, 0 if both are equal. + Insert sort is useful only if most elements have been sorted already. */ +void cbisort(void *base, int nmemb, int size, int(*compar)(const void *, const void *)); + + +/* Sort an array using shell sort. + `base' spacifies the pointer to an array. + `nmemb' specifies the number of elements of the array. + `size' specifies the size of each element. + `compar' specifies the pointer to comparing function. The two arguments specify the pointers + of elements. The comparing function should returns positive if the former is big, negative + if the latter is big, 0 if both are equal. + If most elements have been sorted, shell sort may be faster than heap sort or quick sort. */ +void cbssort(void *base, int nmemb, int size, int(*compar)(const void *, const void *)); + + +/* Sort an array using heap sort. + `base' spacifies the pointer to an array. + `nmemb' specifies the number of elements of the array. + `size' specifies the size of each element. + `compar' specifies the pointer to comparing function. The two arguments specify the pointers + of elements. The comparing function should returns positive if the former is big, negative + if the latter is big, 0 if both are equal. + Although heap sort is robust against bias of input, quick sort is faster in most cases. */ +void cbhsort(void *base, int nmemb, int size, int(*compar)(const void *, const void *)); + + +/* Sort an array using quick sort. + `base' spacifies the pointer to an array. + `nmemb' specifies the number of elements of the array. + `size' specifies the size of each element. + `compar' specifies the pointer to comparing function. The two arguments specify the pointers + of elements. The comparing function should returns positive if the former is big, negative + if the latter is big, 0 if both are equal. + Being sensitive to bias of input, quick sort is the fastest sorting algorithm. */ +void cbqsort(void *base, int nmemb, int size, int(*compar)(const void *, const void *)); + + +/* Compare two strings with case insensitive evaluation. + `astr' specifies the pointer of one string. + `astr' specifies the pointer of the other string. + The return value is positive if the former is big, negative if the latter is big, 0 if both + are equivalent. + Upper cases and lower cases of alphabets in ASCII code are not distinguished. */ +int cbstricmp(const char *astr, const char *bstr); + + +/* Check whether a string begins with a key. + `str' specifies the pointer of a target string. + `key' specifies the pointer of a forward matching key string. + The return value is true if the target string begins with the key, else, it is false. */ +int cbstrfwmatch(const char *str, const char *key); + + +/* Check whether a string begins with a key, with case insensitive evaluation. + `str' specifies the pointer of a target string. + `key' specifies the pointer of a forward matching key string. + The return value is true if the target string begins with the key, else, it is false. + Upper cases and lower cases of alphabets in ASCII code are not distinguished. */ +int cbstrfwimatch(const char *str, const char *key); + + +/* Check whether a string ends with a key. + `str' specifies the pointer of a target string. + `key' specifies the pointer of a backward matching key string. + The return value is true if the target string ends with the key, else, it is false. */ +int cbstrbwmatch(const char *str, const char *key); + + +/* Check whether a string ends with a key, with case insensitive evaluation. + `str' specifies the pointer of a target string. + `key' specifies the pointer of a backward matching key string. + The return value is true if the target string ends with the key, else, it is false. + Upper cases and lower cases of alphabets in ASCII code are not distinguished. */ +int cbstrbwimatch(const char *str, const char *key); + + +/* Locate a substring in a string using KMP method. + `haystack' specifies the pointer of a target string. + `needle' specifies the pointer of a substring to be found. + The return value is the pointer to the beginning of the substring or `NULL' if the substring + is not found. + In most cases, `strstr' as a built-in function of the compiler is faster than this function. */ +char *cbstrstrkmp(const char *haystack, const char *needle); + + +/* Locate a substring in a string using BM method. + `haystack' specifies the pointer of a target string. + `needle' specifies the pointer of a substring to be found. + The return value is the pointer to the beginning of the substring or `NULL' if the substring + is not found. + In most cases, `strstr' as a built-in function of the compiler is faster than this function. */ +char *cbstrstrbm(const char *haystack, const char *needle); + + +/* Convert the letters of a string to upper case. + `str' specifies the pointer of a string to convert. + The return value is the pointer to the string. */ +char *cbstrtoupper(char *str); + + +/* Convert the letters of a string to lower case. + `str' specifies the pointer of a string to convert. + The return value is the pointer to the string. */ +char *cbstrtolower(char *str); + + +/* Cut space characters at head or tail of a string. + `str' specifies the pointer of a string to convert. + The return value is the pointer to the string. */ +char *cbstrtrim(char *str); + + +/* Squeeze space characters in a string and trim it. + `str' specifies the pointer of a string to convert. + The return value is the pointer to the string. */ +char *cbstrsqzspc(char *str); + + +/* Count the number of characters in a string of UTF-8. + `str' specifies the pointer of a string of UTF-8. + The return value is the number of characters in the string. */ +int cbstrcountutf(const char *str); + + +/* Cut a string of UTF-8 at the specified number of characters. + `str' specifies the pointer of a string of UTF-8. + `num' specifies the number of characters to be kept. + The return value is the pointer to the string. */ +char *cbstrcututf(char *str, int num); + + +/* Get a datum handle. + `ptr' specifies the pointer to the region of the initial content. If it is `NULL', an empty + datum is created. + `size' specifies the size of the region. If it is negative, the size is assigned with + `strlen(ptr)'. + The return value is a datum handle. */ +CBDATUM *cbdatumopen(const char *ptr, int size); + + +/* Copy a datum. + `datum' specifies a datum handle. + The return value is a new datum handle. */ +CBDATUM *cbdatumdup(const CBDATUM *datum); + + +/* Free a datum handle. + `datum' specifies a datum handle. + Because the region of a closed handle is released, it becomes impossible to use the handle. */ +void cbdatumclose(CBDATUM *datum); + + +/* Concatenate a datum and a region. + `datum' specifies a datum handle. + `ptr' specifies the pointer to the region to be appended. + `size' specifies the size of the region. If it is negative, the size is assigned with + `strlen(ptr)'. */ +void cbdatumcat(CBDATUM *datum, const char *ptr, int size); + + +/* Get the pointer of the region of a datum. + `datum' specifies a datum handle. + The return value is the pointer of the region of a datum. + Because an additional zero code is appended at the end of the region of the return value, + the return value can be treated as a character string. */ +const char *cbdatumptr(const CBDATUM *datum); + + +/* Get the size of the region of a datum. + `datum' specifies a datum handle. + The return value is the size of the region of a datum. */ +int cbdatumsize(const CBDATUM *datum); + + +/* Change the size of the region of a datum. + `datum' specifies a datum handle. + `size' specifies the new size of the region. + If the new size is bigger than the one of old, the surplus region is filled with zero codes. */ +void cbdatumsetsize(CBDATUM *datum, int size); + + +/* Perform formatted output into a datum. + `format' specifies a printf-like format string. + The conversion character `%' can be used with such flag characters as `s', `d', `o', `u', + `x', `X', `c', `e', `E', `f', `g', `G', `@', `?', `:', `%'. `@' works as with `s' but escapes + meta characters of XML. `?' works as with `s' but escapes meta characters of URL. `:' works + as with `s' but performs MIME encoding as UTF-8. The other conversion character work as with + each original. */ +void cbdatumprintf(CBDATUM *datum, const char *format, ...); + + +/* Convert a datum to an allocated region. + `datum' specifies a datum handle. + `sp' specifies the pointer to a variable to which the size of the region of the return + value is assigned. If it is `NULL', it is not used. + The return value is the pointer to the region of the datum. + Because an additional zero code is appended at the end of the region of the return value, + the return value can be treated as a character string. Because the region of the return + value is allocated with the `malloc' call, it should be released with the `free' call if it + is no longer in use. Because the region of the original datam is released, it should not be + released again. */ +char *cbdatumtomalloc(CBDATUM *datum, int *sp); + + +/* Get a list handle. + The return value is a list handle. */ +CBLIST *cblistopen(void); + + +/* Copy a list. + `list' specifies a list handle. + The return value is a new list handle. */ +CBLIST *cblistdup(const CBLIST *list); + + +/* Close a list handle. + `list' specifies a list handle. + Because the region of a closed handle is released, it becomes impossible to use the handle. */ +void cblistclose(CBLIST *list); + + +/* Get the number of elements of a list. + `list' specifies a list handle. + The return value is the number of elements of the list. */ +int cblistnum(const CBLIST *list); + + +/* Get the pointer to the region of an element of a list. + `list' specifies a list handle. + `index' specifies the index of an element. + `sp' specifies the pointer to a variable to which the size of the region of the return + value is assigned. If it is `NULL', it is not used. + The return value is the pointer to the region of the value. + Because an additional zero code is appended at the end of the region of the return value, + the return value can be treated as a character string. If `index' is equal to or more than + the number of elements, the return value is `NULL'. */ +const char *cblistval(const CBLIST *list, int index, int *sp); + + +/* Add an element at the end of a list. + `list' specifies a list handle. + `ptr' specifies the pointer to the region of an element. + `size' specifies the size of the region. If it is negative, the size is assigned with + `strlen(ptr)'. */ +void cblistpush(CBLIST *list, const char *ptr, int size); + + +/* Remove an element of the end of a list. + `list' specifies a list handle. + `sp' specifies the pointer to a variable to which the size of the region of the return + value is assigned. If it is `NULL', it is not used. + The return value is the pointer to the region of the value. + Because an additional zero code is appended at the end of the region of the return value, + the return value can be treated as a character string. Because the region of the return + value is allocated with the `malloc' call, it should be released with the `free' call if it + is no longer in use. If the list is empty, the return value is `NULL'. */ +char *cblistpop(CBLIST *list, int *sp); + + +/* Add an element at the top of a list. + `list' specifies a list handle. + `ptr' specifies the pointer to the region of an element. + `size' specifies the size of the region. If it is negative, the size is assigned with + `strlen(ptr)'. */ +void cblistunshift(CBLIST *list, const char *ptr, int size); + + +/* Remove an element of the top of a list. + `list' specifies a list handle. + `sp' specifies the pointer to a variable to which the size of the region of the return + value is assigned. If it is `NULL', it is not used. + The return value is the pointer to the region of the value. + Because an additional zero code is appended at the end of the region of the return value, + the return value can be treated as a character string. Because the region of the return + value is allocated with the `malloc' call, it should be released with the `free' call if it + is no longer in use. If the list is empty, the return value is `NULL'. */ +char *cblistshift(CBLIST *list, int *sp); + + +/* Add an element at the specified location of a list. + `list' specifies a list handle. + `index' specifies the index of an element. + `ptr' specifies the pointer to the region of the element. + `size' specifies the size of the region. If it is negative, the size is assigned with + `strlen(ptr)'. */ +void cblistinsert(CBLIST *list, int index, const char *ptr, int size); + + +/* Remove an element at the specified location of a list. + `list' specifies a list handle. + `index' specifies the index of an element. + `sp' specifies the pointer to a variable to which the size of the region of the return + value is assigned. If it is `NULL', it is not used. + The return value is the pointer to the region of the value. + Because an additional zero code is appended at the end of the region of the return value, + the return value can be treated as a character string. Because the region of the return + value is allocated with the `malloc' call, it should be released with the `free' call if it + is no longer in use. If `index' is equal to or more than the number of elements, no element + is removed and the return value is `NULL'. */ +char *cblistremove(CBLIST *list, int index, int *sp); + + +/* Overwrite an element at the specified location of a list. + `list' specifies a list handle. + `index' specifies the index of an element. + `ptr' specifies the pointer to the region of the new content. + `size' specifies the size of the new content. If it is negative, the size is assigned with + `strlen(ptr)'. + If `index' is equal to or more than the number of elements, this function has no effect. */ +void cblistover(CBLIST *list, int index, const char *ptr, int size); + + +/* Sort elements of a list in lexical order. + `list' specifies a list handle. + Quick sort is used for sorting. */ +void cblistsort(CBLIST *list); + + +/* Search a list for an element using liner search. + `list' specifies a list handle. + `ptr' specifies the pointer to the region of a key. + `size' specifies the size of the region. If it is negative, the size is assigned with + `strlen(ptr)'. + The return value is the index of a corresponding element or -1 if there is no corresponding + element. If two or more elements corresponds, the former returns. */ +int cblistlsearch(const CBLIST *list, const char *ptr, int size); + + +/* Search a list for an element using binary search. + `list' specifies a list handle. It should be sorted in lexical order. + `ptr' specifies the pointer to the region of a key. + `size' specifies the size of the region. If it is negative, the size is assigned with + `strlen(ptr)'. + The return value is the index of a corresponding element or -1 if there is no corresponding + element. If two or more elements corresponds, which returns is not defined. */ +int cblistbsearch(const CBLIST *list, const char *ptr, int size); + + +/* Serialize a list into a byte array. + `list' specifies a list handle. + `sp' specifies the pointer to a variable to which the size of the region of the return + value is assigned. + The return value is the pointer to the region of the result serial region. + Because the region of the return value is allocated with the `malloc' call, it should be + released with the `free' call if it is no longer in use. */ +char *cblistdump(const CBLIST *list, int *sp); + + +/* Redintegrate a serialized list. + `ptr' specifies the pointer to a byte array. + `size' specifies the size of the region. + The return value is a new list handle. */ +CBLIST *cblistload(const char *ptr, int size); + + +/* Get a map handle. + The return value is a map handle. */ +CBMAP *cbmapopen(void); + + +/* Copy a map. + `map' specifies a map handle. + The return value is a new map handle. + The iterator of the source map is initialized. */ +CBMAP *cbmapdup(CBMAP *map); + + +/* Close a map handle. + `map' specifies a map handle. + Because the region of a closed handle is released, it becomes impossible to use the handle. */ +void cbmapclose(CBMAP *map); + + +/* Store a record into a map. + `map' specifies a map handle. + `kbuf' specifies the pointer to the region of a key. + `ksiz' specifies the size of the region of the key. If it is negative, the size is assigned + with `strlen(kbuf)'. + `vbuf' specifies the pointer to the region of a value. + `vsiz' specifies the size of the region of the value. If it is negative, the size is + assigned with `strlen(vbuf)'. + `over' specifies whether the value of the duplicated record is overwritten or not. + If `over' is false and the key is duplicated, the return value is false, else, it is true. */ +int cbmapput(CBMAP *map, const char *kbuf, int ksiz, const char *vbuf, int vsiz, int over); + + +/* Concatenate a value at the end of the value of the existing record. + `map' specifies a map handle. + `kbuf' specifies the pointer to the region of a key. + `ksiz' specifies the size of the region of the key. If it is negative, the size is assigned + with `strlen(kbuf)'. + `vbuf' specifies the pointer to the region of a value. + `vsiz' specifies the size of the region of the value. If it is negative, the size is + assigned with `strlen(vbuf)'. + If there is no corresponding record, a new record is created. */ +void cbmapputcat(CBMAP *map, const char *kbuf, int ksiz, const char *vbuf, int vsiz); + + +/* Delete a record in a map. + `map' specifies a map handle. + `kbuf' specifies the pointer to the region of a key. + `ksiz' specifies the size of the region of the key. If it is negative, the size is assigned + with `strlen(kbuf)'. + If successful, the return value is true. False is returned when no record corresponds to + the specified key. */ +int cbmapout(CBMAP *map, const char *kbuf, int ksiz); + + +/* Retrieve a record in a map. + `map' specifies a map handle. + `kbuf' specifies the pointer to the region of a key. + `ksiz' specifies the size of the region of the key. If it is negative, the size is assigned + with `strlen(kbuf)'. + `sp' specifies the pointer to a variable to which the size of the region of the return + value is assigned. If it is `NULL', it is not used. + If successful, the return value is the pointer to the region of the value of the + corresponding record. `NULL' is returned when no record corresponds. + Because an additional zero code is appended at the end of the region of the return value, + the return value can be treated as a character string. */ +const char *cbmapget(const CBMAP *map, const char *kbuf, int ksiz, int *sp); + + +/* Move a record to the edge of a map. + `map' specifies a map handle. + `kbuf' specifies the pointer to the region of a key. + `ksiz' specifies the size of the region of the key. If it is negative, the size is assigned + with `strlen(kbuf)'. + `head' specifies the destination which is head if it is true or tail if else. + If successful, the return value is true. False is returned when no record corresponds to + the specified key. */ +int cbmapmove(CBMAP *map, const char *kbuf, int ksiz, int head); + + +/* Initialize the iterator of a map. + `map' specifies a map handle. + The iterator is used in order to access the key of every record stored in a map. */ +void cbmapiterinit(CBMAP *map); + + +/* Get the next key of the iterator of a map. + `map' specifies a map handle. + `sp' specifies the pointer to a variable to which the size of the region of the return + value is assigned. If it is `NULL', it is not used. + If successful, the return value is the pointer to the region of the next key, else, it is + `NULL'. `NULL' is returned when no record is to be get out of the iterator. + Because an additional zero code is appended at the end of the region of the return value, + the return value can be treated as a character string. The order of iteration is assured + to be the same of the one of storing. */ +const char *cbmapiternext(CBMAP *map, int *sp); + + +/* Get the value binded to the key fetched from the iterator of a map. + `kbuf' specifies the pointer to the region of a iteration key. + `sp' specifies the pointer to a variable to which the size of the region of the return + value is assigned. If it is `NULL', it is not used. + The return value is the pointer to the region of the value of the corresponding record. + Because an additional zero code is appended at the end of the region of the return value, + the return value can be treated as a character string. */ +const char *cbmapiterval(const char *kbuf, int *sp); + + +/* Get the number of the records stored in a map. + `map' specifies a map handle. + The return value is the number of the records stored in the map. */ +int cbmaprnum(const CBMAP *map); + + +/* Get the list handle contains all keys in a map. + `map' specifies a map handle. + The return value is the list handle contains all keys in the map. + Because the handle of the return value is opened with the function `cblistopen', it should + be closed with the function `cblistclose' if it is no longer in use. */ +CBLIST *cbmapkeys(CBMAP *map); + + +/* Get the list handle contains all values in a map. + `map' specifies a map handle. + The return value is the list handle contains all values in the map. + Because the handle of the return value is opened with the function `cblistopen', it should + be closed with the function `cblistclose' if it is no longer in use. */ +CBLIST *cbmapvals(CBMAP *map); + + +/* Serialize a map into a byte array. + `map' specifies a map handle. + `sp' specifies the pointer to a variable to which the size of the region of the return + value is assigned. + The return value is the pointer to the region of the result serial region. + Because the region of the return value is allocated with the `malloc' call, it should be + released with the `free' call if it is no longer in use. */ +char *cbmapdump(CBMAP *map, int *sp); + + +/* Redintegrate a serialized map. + `ptr' specifies the pointer to a byte array. + `size' specifies the size of the region. + The return value is a new map handle. */ +CBMAP *cbmapload(const char *ptr, int size); + + +/* Extract a record from a serialized map. + `ptr' specifies the pointer to a byte array. + `size' specifies the size of the region. + `kbuf' specifies the pointer to the region of a key. + `ksiz' specifies the size of the region of the key. If it is negative, the size is assigned + with `strlen(kbuf)'. + `sp' specifies the pointer to a variable to which the size of the region of the return + value is assigned. If it is `NULL', it is not used. + If successful, the return value is the pointer to the region of the value of the + corresponding record. `NULL' is returned when no record corresponds. + Because an additional zero code is appended at the end of the region of the return value, + the return value can be treated as a character string. */ +char *cbmaploadone(const char *ptr, int size, const char *kbuf, int ksiz, int *sp); + + +/* Get a heap handle. + `size' specifies the size of each record. + `max' specifies the maximum number of records in the heap. + `compar' specifies the pointer to comparing function. The two arguments specify the pointers + of records. The comparing function should returns positive if the former is big, negative + if the latter is big, 0 if both are equal. + The return value is a heap handle. */ +CBHEAP *cbheapopen(int size, int max, int(*compar)(const void *, const void *)); + + +/* Copy a heap. + `heap' specifies a heap handle. + The return value is a new heap handle. */ +CBHEAP *cbheapdup(CBHEAP *heap); + + +/* Close a heap handle. + `heap' specifies a heap handle. + Because the region of a closed handle is released, it becomes impossible to use the handle. */ +void cbheapclose(CBHEAP *heap); + + +/* Get the number of the records stored in a heap. + `heap' specifies a heap handle. + The return value is the number of the records stored in the heap. */ +int cbheapnum(CBHEAP *heap); + + +/* Insert a record into a heap. + `heap' specifies a heap handle. + `ptr' specifies the pointer to the region of a record. + The return value is true if the record is added, else false. + If the new record is bigger than the biggest existing regord, the new record is not added. + If the new record is added and the number of records exceeds the maximum number, the biggest + existing record is removed. */ +int cbheapinsert(CBHEAP *heap, const void *ptr); + + +/* Get the pointer to the region of a record in a heap. + `heap' specifies a heap handle. + `index' specifies the index of a record. + The return value is the pointer to the region of the record. + If `index' is equal to or more than the number of records, the return value is `NULL'. Note + that records are organized by the nagative order the comparing function. */ +const void *cbheapval(CBHEAP *heap, int index); + + +/* Convert a heap to an allocated region. + `heap' specifies a heap handle. + `np' specifies the pointer to a variable to which the number of records of the return value + is assigned. If it is `NULL', it is not used. + The return value is the pointer to the region of the heap. Records are sorted. + Because the region of the return value is allocated with the `malloc' call, it should be + released with the `free' call if it is no longer in use. Because the region of the original + heap is released, it should not be released again. */ +void *cbheaptomalloc(CBHEAP *heap, int *np); + + +/* Allocate a formatted string on memory. + `format' specifies a printf-like format string. The conversion character `%' can be used + with such flag characters as `d', `o', `u', `x', `X', `e', `E', `f', `g', `G', `c', `s', and + `%'. Specifiers of the field length and the precision can be put between the conversion + characters and the flag characters. The specifiers consist of decimal characters, `.', `+', + `-', and the space character. + The other arguments are used according to the format string. + The return value is the pointer to the allocated region of the result string. Because the + region of the return value is allocated with the `malloc' call, it should be released with + the `free' call if it is no longer in use. */ +char *cbsprintf(const char *format, ...); + + +/* Replace some patterns in a string. + `str' specifies the pointer to a source string. + `pairs' specifies the handle of a map composed of pairs of replacement. The key of each pair + specifies a pattern before replacement and its value specifies the pattern after replacement. + The return value is the pointer to the allocated region of the result string. + Because the region of the return value is allocated with the `malloc' call, it should be + released with the `free' call if it is no longer in use. */ +char *cbreplace(const char *str, CBMAP *pairs); + + +/* Make a list by splitting a serial datum. + `ptr' specifies the pointer to the region of the source content. + `size' specifies the size of the region. If it is negative, the size is assigned with + `strlen(ptr)'. + `delim' specifies a string containing delimiting characters. If it is `NULL', zero code is + used as a delimiter. + The return value is a list handle. + If two delimiters are successive, it is assumed that an empty element is between the two. + Because the handle of the return value is opened with the function `cblistopen', it should + be closed with the function `cblistclose'. */ +CBLIST *cbsplit(const char *ptr, int size, const char *delim); + + +/* Read whole data of a file. + `name' specifies the name of a file. If it is `NULL', the standard input is specified. + `sp' specifies the pointer to a variable to which the size of the region of the return + value is assigned. If it is `NULL', it is not used. + The return value is the pointer to the allocated region of the read data. Because an + additional zero code is appended at the end of the region of the return value, the return + value can be treated as a character string. Because the region of the return value is + allocated with the `malloc' call, it should be released with the `free' call if it is no + longer in use. */ +char *cbreadfile(const char *name, int *sp); + + +/* Write a serial datum into a file. + `name specifies the name of a file. If it is `NULL', the standard output is specified. + `ptr' specifies the pointer to the region of the source content. + `size' specifies the size of the region. If it is negative, the size is assigned with + `strlen(ptr)'. + If successful, the return value is true, else, it is false. + If the file exists, it is overwritten. Else, a new file is created. */ +int cbwritefile(const char *name, const char *ptr, int size); + + +/* Read every line of a file. + `name' specifies the name of a file. If it is `NULL', the standard input is specified. + The return value is a list handle of the lines if successful, else it is NULL. Line + separators are cut out. Because the handle of the return value is opened with the function + `cblistopen', it should be closed with the function `cblistclose' if it is no longer in use. */ +CBLIST *cbreadlines(const char *name); + + +/* Read names of files in a directory. + `name' specifies the name of a directory. + The return value is a list handle of names if successful, else it is NULL. + Because the handle of the return value is opened with the function `cblistopen', it should + be closed with the function `cblistclose' if it is no longer in use. */ +CBLIST *cbdirlist(const char *name); + + +/* Get the status of a file or a directory. + `name' specifies the name of a file or a directory. + `dirp' specifies the pointer to a variable to which whether the file is a directory is + assigned. If it is `NULL', it is not used. + `sizep' specifies the pointer to a variable to which the size of the file is assigned. If it + is `NULL', it is not used. + `mtimep' specifies the pointer to a variable to which the last modified time of the file is + assigned. If it is `NULL', it is not used. + If successful, the return value is true, else, false. False is returned when the file does + not exist or the permission is denied. */ +int cbfilestat(const char *name, int *isdirp, int *sizep, time_t *mtimep); + + +/* Remove a file or a directory and its sub ones recursively. + `name' specifies the name of a file or a directory. + If successful, the return value is true, else, false. False is returned when the file does + not exist or the permission is denied. */ +int cbremove(const char *name); + + +/* Break up a URL into elements. + `str' specifies the pointer to a string of URL. + The return value is a map handle. Each key of the map is the name of an element. The key + "self" specifies the URL itself. The key "scheme" specifies the scheme. The key "host" + specifies the host of the server. The key "port" specifies the port number of the server. + The key "authority" specifies the authority information. The key "path" specifies the path + of the resource. The key "file" specifies the file name without the directory section. The + key "query" specifies the query string. The key "fragment" specifies the fragment string. + Supported schema are HTTP, HTTPS, FTP, and FILE. Absolute URL and relative URL are supported. + Because the handle of the return value is opened with the function `cbmapopen', it should + be closed with the function `cbmapclose' if it is no longer in use. */ +CBMAP *cburlbreak(const char *str); + + +/* Resolve a relative URL with another absolute URL. + `base' specifies an absolute URL of a base location. + `target' specifies a URL to be resolved. + The return value is a resolved URL. If the target URL is relative, a new URL of relative + location from the base location is returned. Else, a copy of the target URL is returned. + Because the region of the return value is allocated with the `malloc' call, it should be + released with the `free' call if it is no longer in use. */ +char *cburlresolve(const char *base, const char *target); + + +/* Encode a serial object with URL encoding. + `ptr' specifies the pointer to a region. + `size' specifies the size of the region. If it is negative, the size is assigned with + `strlen(ptr)'. + The return value is the pointer to the result string. + Because the region of the return value is allocated with the `malloc' call, it should be + released with the `free' call if it is no longer in use. */ +char *cburlencode(const char *ptr, int size); + + +/* Decode a string encoded with URL encoding. + `str' specifies the pointer to an encoded string. + `sp' specifies the pointer to a variable to which the size of the region of the return + value is assigned. If it is `NULL', it is not used. + The return value is the pointer to the region of the result. + Because an additional zero code is appended at the end of the region of the return value, + the return value can be treated as a character string. Because the region of the return + value is allocated with the `malloc' call, it should be released with the `free' call if + it is no longer in use. */ +char *cburldecode(const char *str, int *sp); + + +/* Encode a serial object with Base64 encoding. + `ptr' specifies the pointer to a region. + `size' specifies the size of the region. If it is negative, the size is assigned with + `strlen(ptr)'. + The return value is the pointer to the result string. + Because the region of the return value is allocated with the `malloc' call, it should be + released with the `free' call if it is no longer in use. */ +char *cbbaseencode(const char *ptr, int size); + + +/* Decode a string encoded with Base64 encoding. + `str' specifies the pointer to an encoded string. + `sp' specifies the pointer to a variable to which the size of the region of the return + value is assigned. If it is `NULL', it is not used. + The return value is the pointer to the region of the result. + Because an additional zero code is appended at the end of the region of the return value, + the return value can be treated as a character string. Because the region of the return + value is allocated with the `malloc' call, it should be released with the `free' call if + it is no longer in use. */ +char *cbbasedecode(const char *str, int *sp); + + +/* Encode a serial object with quoted-printable encoding. + `ptr' specifies the pointer to a region. + `size' specifies the size of the region. If it is negative, the size is assigned with + `strlen(ptr)'. + The return value is the pointer to the result string. + Because the region of the return value is allocated with the `malloc' call, it should be + released with the `free' call if it is no longer in use. */ +char *cbquoteencode(const char *ptr, int size); + + +/* Decode a string encoded with quoted-printable encoding. + `str' specifies the pointer to an encoded string. + `sp' specifies the pointer to a variable to which the size of the region of the return + value is assigned. If it is `NULL', it is not used. + The return value is the pointer to the region of the result. + Because an additional zero code is appended at the end of the region of the return value, + the return value can be treated as a character string. Because the region of the return + value is allocated with the `malloc' call, it should be released with the `free' call if + it is no longer in use. */ +char *cbquotedecode(const char *str, int *sp); + + +/* Split a string of MIME into headers and the body. + `ptr' specifies the pointer to the region of MIME data. + `size' specifies the size of the region. If it is negative, the size is assigned with + `strlen(ptr)'. + `attrs' specifies a map handle to store attributes. If it is `NULL', it is not used. Each + key of the map is an attribute name uncapitalized. + `sp' specifies the pointer to a variable to which the size of the region of the return + value is assigned. If it is `NULL', it is not used. + The return value is the pointer of the body data. + If the content type is defined, the attribute map has the key "TYPE" specifying the type. If + the character encoding is defined, the key "CHARSET" specifies the encoding name. If the + boundary string of multipart is defined, the key "BOUNDARY" specifies the string. If the + content disposition is defined, the key "DISPOSITION" specifies the direction. If the file + name is defined, the key "FILENAME" specifies the name. If the attribute name is defined, + the key "NAME" specifies the name. Because the region of the return value is allocated with + the `malloc' call, it should be released with the `free' call if it is no longer in use. */ +char *cbmimebreak(const char *ptr, int size, CBMAP *attrs, int *sp); + + +/* Split multipart data of MIME into its parts. + `ptr' specifies the pointer to the region of multipart data of MIME. + `size' specifies the size of the region. If it is negative, the size is assigned with + `strlen(ptr)'. + `boundary' specifies the pointer to the region of the boundary string. + The return value is a list handle. Each element of the list is the string of a part. + Because the handle of the return value is opened with the function `cblistopen', it should + be closed with the function `cblistclose' if it is no longer in use. */ +CBLIST *cbmimeparts(const char *ptr, int size, const char *boundary); + + +/* Encode a string with MIME encoding. + `str' specifies the pointer to a string. + `encname' specifies a string of the name of the character encoding. + The return value is the pointer to the result string. + `base' specifies whether to use Base64 encoding. If it is false, quoted-printable is used. + Because the region of the return value is allocated with the `malloc' call, it should be + released with the `free' call if it is no longer in use. */ +char *cbmimeencode(const char *str, const char *encname, int base); + + +/* Decode a string encoded with MIME encoding. + `str' specifies the pointer to an encoded string. + `enp' specifies the pointer to a region into which the name of encoding is written. If it is + `NULL', it is not used. The size of the buffer should be equal to or more than 32 bytes. + The return value is the pointer to the result string. + Because the region of the return value is allocated with the `malloc' call, it should be + released with the `free' call if it is no longer in use. */ +char *cbmimedecode(const char *str, char *enp); + + +/* Split a string of CSV into rows. + `str' specifies the pointer to the region of an CSV string. + The return value is a list handle. Each element of the list is a string of a row. + Because the handle of the return value is opened with the function `cblistopen', it should + be closed with the function `cblistclose' if it is no longer in use. The character encoding + of the input string should be US-ASCII, UTF-8, ISO-8859-*, EUC-*, or Shift_JIS. Being + compatible with MS-Excel, these functions for CSV can handle cells including such meta + characters as comma, between double quotation marks. */ +CBLIST *cbcsvrows(const char *str); + + +/* Split the string of a row of CSV into cells. + `str' specifies the pointer to the region of a row of CSV. + The return value is a list handle. Each element of the list is the unescaped string of a + cell of the row. + Because the handle of the return value is opened with the function `cblistopen', it should + be closed with the function `cblistclose' if it is no longer in use. */ +CBLIST *cbcsvcells(const char *str); + + +/* Escape a string with the meta characters of CSV. + `str' specifies the pointer to the region of a string. + The return value is the pointer to the escaped string sanitized of meta characters. + Because the region of the return value is allocated with the `malloc' call, it should be + released with the `free' call if it is no longer in use. */ +char *cbcsvescape(const char *str); + + +/* Unescape a string with the escaped meta characters of CSV. + `str' specifies the pointer to the region of a string with meta characters. + The return value is the pointer to the unescaped string. + Because the region of the return value is allocated with the `malloc' call, it should be + released with the `free' call if it is no longer in use. */ +char *cbcsvunescape(const char *str); + + +/* Split a string of XML into tags and text sections. + `str' specifies the pointer to the region of an XML string. + `cr' specifies whether to remove comments. + The return value is a list handle. Each element of the list is the string of a tag or a + text section. + Because the handle of the return value is opened with the function `cblistopen', it should + be closed with the function `cblistclose' if it is no longer in use. The character encoding + of the input string should be US-ASCII, UTF-8, ISO-8859-*, EUC-*, or Shift_JIS. Because + these functions for XML are not XML parser with validation check, it can handle also HTML + and SGML. */ +CBLIST *cbxmlbreak(const char *str, int cr); + + +/* Get the map of attributes of an XML tag. + `str' specifies the pointer to the region of a tag string. + The return value is a map handle. Each key of the map is the name of an attribute. Each + value is unescaped. You can get the name of the tag with the key of an empty string. + Because the handle of the return value is opened with the function `cbmapopen', it should + be closed with the function `cbmapclose' if it is no longer in use. */ +CBMAP *cbxmlattrs(const char *str); + + +/* Escape a string with the meta characters of XML. + `str' specifies the pointer to the region of a string. + The return value is the pointer to the escaped string sanitized of meta characters. + This function converts only `&', `<', `>', and `"'. Because the region of the return value + is allocated with the `malloc' call, it should be released with the `free' call if it is no + longer in use. */ +char *cbxmlescape(const char *str); + + +/* Unescape a string with the entity references of XML. + `str' specifies the pointer to the region of a string with meta characters. + The return value is the pointer to the unescaped string. + This function restores only `&', `<', `>', and `"'. Because the region of the + return value is allocated with the `malloc' call, it should be released with the `free' call + if it is no longer in use. */ +char *cbxmlunescape(const char *str); + + +/* Compress a serial object with ZLIB. + `ptr' specifies the pointer to a region. + `size' specifies the size of the region. If it is negative, the size is assigned with + `strlen(ptr)'. + `sp' specifies the pointer to a variable to which the size of the region of the return + value is assigned. + If successful, the return value is the pointer to the result object, else, it is `NULL'. + Because the region of the return value is allocated with the `malloc' call, it should be + released with the `free' call if it is no longer in use. This function is available only if + QDBM was built with ZLIB enabled. */ +char *cbdeflate(const char *ptr, int size, int *sp); + + +/* Decompress a serial object compressed with ZLIB. + `ptr' specifies the pointer to a region. + `size' specifies the size of the region. + `sp' specifies the pointer to a variable to which the size of the region of the return + value is assigned. If it is `NULL', it is not used. + If successful, the return value is the pointer to the result object, else, it is `NULL'. + Because an additional zero code is appended at the end of the region of the return value, + the return value can be treated as a character string. Because the region of the return + value is allocated with the `malloc' call, it should be released with the `free' call if it + is no longer in use. This function is available only if QDBM was built with ZLIB enabled. */ +char *cbinflate(const char *ptr, int size, int *sp); + + +/* Compress a serial object with GZIP. + `ptr' specifies the pointer to a region. + `size' specifies the size of the region. If it is negative, the size is assigned with + `strlen(ptr)'. + `sp' specifies the pointer to a variable to which the size of the region of the return + value is assigned. + If successful, the return value is the pointer to the result object, else, it is `NULL'. + Because the region of the return value is allocated with the `malloc' call, it should be + released with the `free' call if it is no longer in use. This function is available only if + QDBM was built with ZLIB enabled. */ +char *cbgzencode(const char *ptr, int size, int *sp); + + +/* Decompress a serial object compressed with GZIP. + `ptr' specifies the pointer to a region. + `size' specifies the size of the region. + `sp' specifies the pointer to a variable to which the size of the region of the return + value is assigned. If it is `NULL', it is not used. + If successful, the return value is the pointer to the result object, else, it is `NULL'. + Because an additional zero code is appended at the end of the region of the return value, + the return value can be treated as a character string. Because the region of the return + value is allocated with the `malloc' call, it should be released with the `free' call if it + is no longer in use. This function is available only if QDBM was built with ZLIB enabled. */ +char *cbgzdecode(const char *ptr, int size, int *sp); + + +/* Get the CRC32 checksum of a serial object. + `ptr' specifies the pointer to a region. + `size' specifies the size of the region. If it is negative, the size is assigned with + `strlen(ptr)'. + The return value is the CRC32 checksum of the object. + This function is available only if QDBM was built with ZLIB enabled. */ +unsigned int cbgetcrc(const char *ptr, int size); + + +/* Compress a serial object with LZO. + `ptr' specifies the pointer to a region. + `size' specifies the size of the region. If it is negative, the size is assigned with + `strlen(ptr)'. + `sp' specifies the pointer to a variable to which the size of the region of the return + value is assigned. + If successful, the return value is the pointer to the result object, else, it is `NULL'. + Because the region of the return value is allocated with the `malloc' call, it should be + released with the `free' call if it is no longer in use. This function is available only if + QDBM was built with LZO enabled. */ +char *cblzoencode(const char *ptr, int size, int *sp); + + +/* Decompress a serial object compressed with LZO. + `ptr' specifies the pointer to a region. + `size' specifies the size of the region. + `sp' specifies the pointer to a variable to which the size of the region of the return + value is assigned. If it is `NULL', it is not used. + If successful, the return value is the pointer to the result object, else, it is `NULL'. + Because an additional zero code is appended at the end of the region of the return value, + the return value can be treated as a character string. Because the region of the return + value is allocated with the `malloc' call, it should be released with the `free' call if it + is no longer in use. This function is available only if QDBM was built with LZO enabled. */ +char *cblzodecode(const char *ptr, int size, int *sp); + + +/* Compress a serial object with BZIP2. + `ptr' specifies the pointer to a region. + `size' specifies the size of the region. If it is negative, the size is assigned with + `strlen(ptr)'. + `sp' specifies the pointer to a variable to which the size of the region of the return + value is assigned. + If successful, the return value is the pointer to the result object, else, it is `NULL'. + Because the region of the return value is allocated with the `malloc' call, it should be + released with the `free' call if it is no longer in use. This function is available only if + QDBM was built with LZO enabled. */ +char *cbbzencode(const char *ptr, int size, int *sp); + + +/* Decompress a serial object compressed with BZIP2. + `ptr' specifies the pointer to a region. + `size' specifies the size of the region. + `sp' specifies the pointer to a variable to which the size of the region of the return + value is assigned. If it is `NULL', it is not used. + If successful, the return value is the pointer to the result object, else, it is `NULL'. + Because an additional zero code is appended at the end of the region of the return value, + the return value can be treated as a character string. Because the region of the return + value is allocated with the `malloc' call, it should be released with the `free' call if it + is no longer in use. This function is available only if QDBM was built with LZO enabled. */ +char *cbbzdecode(const char *ptr, int size, int *sp); + + +/* Convert the character encoding of a string. + `ptr' specifies the pointer to a region. + `size' specifies the size of the region. If it is negative, the size is assigned with + `strlen(ptr)'. + `icode' specifies the name of encoding of the input string. + `ocode' specifies the name of encoding of the output string. + `sp' specifies the pointer to a variable to which the size of the region of the return + value is assigned. If it is `NULL', it is not used. + `mp' specifies the pointer to a variable to which the number of missing characters by failure + of conversion is assigned. If it is `NULL', it is not used. + If successful, the return value is the pointer to the result object, else, it is `NULL'. + Because an additional zero code is appended at the end of the region of the return value, + the return value can be treated as a character string. Because the region of the return + value is allocated with the `malloc' call, it should be released with the `free' call if it + is no longer in use. This function is available only if QDBM was built with ICONV enabled. */ +char *cbiconv(const char *ptr, int size, const char *icode, const char *ocode, int *sp, int *mp); + + +/* Detect the encoding of a string automatically. + `ptr' specifies the pointer to a region. + `size' specifies the size of the region. If it is negative, the size is assigned with + `strlen(ptr)'. + The return value is the string of the encoding name of the string. + As it stands, US-ASCII, ISO-2022-JP, Shift_JIS, CP932, EUC-JP, UTF-8, UTF-16, UTF-16BE, + and UTF-16LE are supported. If none of them matches, ISO-8859-1 is selected. This function + is available only if QDBM was built with ICONV enabled. */ +const char *cbencname(const char *ptr, int size); + + +/* Get the jet lag of the local time in seconds. + The return value is the jet lag of the local time in seconds. */ +int cbjetlag(void); + + +/* Get the Gregorian calendar of a time. + `t' specifies a source time. If it is negative, the current time is specified. + `jl' specifies the jet lag of a location in seconds. + `yearp' specifies the pointer to a variable to which the year is assigned. If it is `NULL', + it is not used. + `monp' specifies the pointer to a variable to which the month is assigned. If it is `NULL', + it is not used. 1 means January and 12 means December. + `dayp' specifies the pointer to a variable to which the day of the month is assigned. If it + is `NULL', it is not used. + `hourp' specifies the pointer to a variable to which the hours is assigned. If it is `NULL', + it is not used. + `minp' specifies the pointer to a variable to which the minutes is assigned. If it is `NULL', + it is not used. + `secp' specifies the pointer to a variable to which the seconds is assigned. If it is `NULL', + it is not used. */ +void cbcalendar(time_t t, int jl, int *yearp, int *monp, int *dayp, + int *hourp, int *minp, int *secp); + + +/* Get the day of week of a date. + `year' specifies the year of a date. + `mon' specifies the month of the date. + `day' specifies the day of the date. + The return value is the day of week of the date. 0 means Sunday and 6 means Saturday. */ +int cbdayofweek(int year, int mon, int day); + + +/* Get the string for a date in W3CDTF. + `t' specifies a source time. If it is negative, the current time is specified. + `jl' specifies the jet lag of a location in seconds. + The return value is the string of the date in W3CDTF (YYYY-MM-DDThh:mm:ddTZD). + Because the region of the return value is allocated with the `malloc' call, it should be + released with the `free' call if it is no longer in use. */ +char *cbdatestrwww(time_t t, int jl); + + +/* Get the string for a date in RFC 1123 format. + `t' specifies a source time. If it is negative, the current time is specified. + `jl' specifies the jet lag of a location in seconds. + The return value is the string of the date in RFC 1123 format (Wdy, DD-Mon-YYYY hh:mm:dd TZD). + Because the region of the return value is allocated with the `malloc' call, it should be + released with the `free' call if it is no longer in use. */ +char *cbdatestrhttp(time_t t, int jl); + + +/* Get the time value of a date string in decimal, hexadecimal, W3CDTF, or RFC 822 (1123). + `str' specifies a date string in decimal, hexadecimal, W3CDTF, or RFC 822 (1123). + The return value is the time value of the date or -1 if the format is invalid. + Decimal can be trailed by "s" for in seconds, "m" for in minutes, "h" for in hours, + and "d" for in days. */ +time_t cbstrmktime(const char *str); + + +/* Get user and system processing times. + `usrp' specifies the pointer to a variable to which the user processing time is assigned. + If it is `NULL', it is not used. The unit of time is seconds. + `sysp' specifies the pointer to a variable to which the system processing time is assigned. + If it is `NULL', it is not used. The unit of time is seconds. */ +void cbproctime(double *usrp, double *sysp); + + +/* Ensure that the standard I/O is binary mode. + This function is useful for applications on dosish file systems. */ +void cbstdiobin(void); + + + +/************************************************************************************************* + * features for experts + *************************************************************************************************/ + + +/* Show error message on the standard error output and exit. + `message' specifies an error message. + This function does not return. */ +void *cbmyfatal(const char *message); + + +/* Create a datum handle from an allocated region. + `ptr' specifies the pointer to the region of an element. The region should be allocated with + malloc and it is released by the function. + `size' specifies the size of the region. */ +CBDATUM *cbdatumopenbuf(char *ptr, int size); + + +/* Set a buffer to a datum handle. + `ptr' specifies the pointer to the region of an element. The region should be allocated with + malloc and it is released by the function. + `size' specifies the size of the region. */ +void cbdatumsetbuf(CBDATUM *datum, char *ptr, int size); + + +/* Add an allocated element at the end of a list. + `list' specifies a list handle. + `ptr' specifies the pointer to the region of an element. The region should be allocated with + malloc and it is released by the function. + `size' specifies the size of the region. */ +void cblistpushbuf(CBLIST *list, char *ptr, int size); + + +/* Get a map handle with specifying the number of buckets. + `bnum' specifies the number of buckets. + The return value is a map handle. */ +CBMAP *cbmapopenex(int bnum); + + +/* Alias of `cbmalloc'. */ +#define CB_MALLOC(CB_ptr, CB_size) \ + (((CB_ptr) = malloc(CB_size)) ? (CB_ptr) : cbmyfatal("out of memory")) + + +/* Alias of `cbrealloc'. */ +#define CB_REALLOC(CB_ptr, CB_size) \ + (((CB_ptr) = realloc((CB_ptr), (CB_size))) ? (CB_ptr) : cbmyfatal("out of memory")) + + +/* Alias of `cbmemdup'. + However, `size' should not be negative. */ +#define CB_MEMDUP(CB_res, CB_ptr, CB_size) \ + do { \ + CB_MALLOC((CB_res), (CB_size) + 1); \ + memcpy((CB_res), (CB_ptr), (CB_size)); \ + (CB_res)[(CB_size)] = '\0'; \ + } while(FALSE) + + +/* Get the size of padding bytes for pointer alignment. + `hsiz' specifies the header size of the object. + The return value is the size of padding bytes. */ +#define CB_ALIGNPAD(CB_hsiz) \ + (((CB_hsiz | ~-(int)sizeof(void *)) + 1) - CB_hsiz) + + +/* Alias of `cbdatumopen'. + However, no dafault data is specified. */ +#define CB_DATUMOPEN(CB_datum) \ + do { \ + CB_MALLOC((CB_datum), sizeof(*(CB_datum))); \ + CB_MALLOC((CB_datum)->dptr, CB_DATUMUNIT); \ + (CB_datum)->dptr[0] = '\0'; \ + (CB_datum)->dsize = 0; \ + (CB_datum)->asize = CB_DATUMUNIT; \ + } while(FALSE) + + +/* Alias of `cbdatumopen'. + However, `size' should not be negative. */ +#define CB_DATUMOPEN2(CB_datum, CB_ptr, CB_size) \ + do { \ + CB_DATUMOPEN((CB_datum)); \ + CB_DATUMCAT((CB_datum), (CB_ptr), (CB_size)); \ + } while(FALSE) + + +/* Alias of `cbdatumclose'. */ +#define CB_DATUMCLOSE(CB_datum) \ + do { \ + free((CB_datum)->dptr); \ + free((CB_datum)); \ + } while(FALSE) + + +/* Alias of `cbdatumcat'. + However, `size' should not be negative. */ +#define CB_DATUMCAT(CB_datum, CB_ptr, CB_size) \ + do { \ + if((CB_datum)->dsize + (CB_size) >= (CB_datum)->asize){ \ + (CB_datum)->asize = (CB_datum)->asize * 2 + (CB_size) + 1; \ + CB_REALLOC((CB_datum)->dptr, (CB_datum)->asize); \ + } \ + memcpy((CB_datum)->dptr + (CB_datum)->dsize, (CB_ptr), (CB_size)); \ + (CB_datum)->dsize += (CB_size); \ + (CB_datum)->dptr[(CB_datum)->dsize] = '\0'; \ + } while(FALSE) + + +/* Alias of `cbdatumptr'. */ +#define CB_DATUMPTR(CB_datum) ((const char *)((CB_datum)->dptr)) + + +/* Alias of `cbdatumsize'. */ +#define CB_DATUMSIZE(CB_datum) ((int)((CB_datum)->dsize)) + + +/* Alias of `cbdatumsetsize'. */ +#define CB_DATUMSETSIZE(CB_datum, CB_size) \ + do { \ + if((CB_size) <= (CB_datum)->dsize){ \ + (CB_datum)->dsize = (CB_size); \ + (CB_datum)->dptr[(CB_size)] = '\0'; \ + } else { \ + if((CB_size) >= (CB_datum)->asize){ \ + (CB_datum)->asize = (CB_datum)->asize * 2 + (CB_size) + 1; \ + CB_REALLOC((CB_datum)->dptr, (CB_datum)->asize); \ + } \ + memset((CB_datum)->dptr + (CB_datum)->dsize, 0, ((CB_size) - (CB_datum)->dsize) + 1); \ + (CB_datum)->dsize = (CB_size); \ + } \ + } while(FALSE) + + +/* Alias of `cbdatumtomalloc'. */ +#define CB_DATUMTOMALLOC(CB_datum, CB_ptr, CB_size) \ + do { \ + (CB_ptr) = (CB_datum)->dptr; \ + (CB_size) = (CB_datum)->dsize; \ + free((CB_datum)); \ + } while(FALSE) + + +/* Alias of `cblistopen'. */ +#define CB_LISTOPEN(CB_list) \ + do { \ + CB_MALLOC((CB_list), sizeof(*(CB_list))); \ + (CB_list)->anum = CB_LISTUNIT; \ + CB_MALLOC((CB_list)->array, sizeof((CB_list)->array[0]) * (CB_list)->anum); \ + (CB_list)->start = 0; \ + (CB_list)->num = 0; \ + } while(FALSE) + + +/* Alias of `cblistopen'. + However, `anum' is specified for the number of initial allocated elements. */ +#define CB_LISTOPEN2(CB_list, CB_anum) \ + do { \ + CB_MALLOC((CB_list), sizeof(*(CB_list))); \ + (CB_list)->anum = (CB_anum) > 4 ? (CB_anum) : 4; \ + CB_MALLOC((CB_list)->array, sizeof((CB_list)->array[0]) * (CB_list)->anum); \ + (CB_list)->start = 0; \ + (CB_list)->num = 0; \ + } while(FALSE) + + +/* Alias of `cblistclose'. */ +#define CB_LISTCLOSE(CB_list) \ + do { \ + int _CB_i, _CB_end; \ + _CB_end = (CB_list)->start + (CB_list)->num; \ + for(_CB_i = (CB_list)->start; _CB_i < _CB_end; _CB_i++){ \ + free((CB_list)->array[_CB_i].dptr); \ + } \ + free((CB_list)->array); \ + free((CB_list)); \ + } while(FALSE) + + +/* Alias of `cblistnum'. */ +#define CB_LISTNUM(CB_list) \ + ((int)((CB_list)->num)) + + +/* Alias of `cblistval'. + However, `sp' is ignored. */ +#define CB_LISTVAL(CB_list, CB_index) \ + ((const char *)((CB_list)->array[(CB_list)->start+(CB_index)].dptr)) + + +/* Alias of `cblistval'. + However, `size' is used instead of `sp'. */ +#define CB_LISTVAL2(CB_list, CB_index, CB_size) \ + ((CB_size) = (CB_list)->array[(CB_list)->start+(CB_index)].dsize, \ + (const char *)((CB_list)->array[(CB_list)->start+(CB_index)].dptr)) + + +/* Alias of `cblistpush'. + However, `size' should not be negative. */ +#define CB_LISTPUSH(CB_list, CB_ptr, CB_size) \ + do { \ + int _CB_index; \ + _CB_index = (CB_list)->start + (CB_list)->num; \ + if(_CB_index >= (CB_list)->anum){ \ + (CB_list)->anum *= 2; \ + CB_REALLOC((CB_list)->array, (CB_list)->anum * sizeof((CB_list)->array[0])); \ + } \ + CB_MALLOC((CB_list)->array[_CB_index].dptr, \ + ((CB_size) < CB_DATUMUNIT ? CB_DATUMUNIT : (CB_size)) + 1); \ + memcpy((CB_list)->array[_CB_index].dptr, (CB_ptr), (CB_size)); \ + (CB_list)->array[_CB_index].dptr[(CB_size)] = '\0'; \ + (CB_list)->array[_CB_index].dsize = (CB_size); \ + (CB_list)->num++; \ + } while(FALSE) + + +/* Remove and free an element of the end of a list. + `list' specifies a list handle. */ +#define CB_LISTDROP(CB_list) \ + do { \ + if((CB_list)->num > 0){ \ + free((CB_list)->array[(CB_list)->start+(CB_list)->num-1].dptr); \ + (CB_list)->num--; \ + } \ + } while(FALSE) + + +/* Alias of `cblistinsert'. + However, `index' is not checked and `size' should not be negative. */ +#define CB_LISTINSERT(CB_list, CB_index, CB_ptr, CB_size) \ + do { \ + int _CB_index = (CB_index); \ + _CB_index += (CB_list)->start; \ + if((CB_list)->start + (CB_list)->num >= (CB_list)->anum){ \ + (CB_list)->anum *= 2; \ + CB_REALLOC((CB_list)->array, (CB_list)->anum * sizeof((CB_list)->array[0])); \ + } \ + memmove((CB_list)->array + _CB_index + 1, (CB_list)->array + _CB_index, \ + sizeof((CB_list)->array[0]) * ((CB_list)->start + (CB_list)->num - _CB_index)); \ + CB_MEMDUP((CB_list)->array[_CB_index].dptr, (CB_ptr), (CB_size)); \ + (CB_list)->array[_CB_index].dsize = (CB_size); \ + (CB_list)->num++; \ + } while(FALSE) + + +/* Alias of `cblistpushbuf'. */ +#define CB_LISTPUSHBUF(CB_list, CB_ptr, CB_size) \ + do{ \ + int _CB_index; \ + _CB_index = (CB_list)->start + (CB_list)->num; \ + if(_CB_index >= (CB_list)->anum){ \ + (CB_list)->anum *= 2; \ + CB_REALLOC((CB_list)->array, (CB_list)->anum * sizeof((CB_list)->array[0])); \ + } \ + (CB_list)->array[_CB_index].dptr = (CB_ptr); \ + (CB_list)->array[_CB_index].dsize = (CB_size); \ + (CB_list)->num++; \ + } while(FALSE) \ + + +/* Alias of `cbmapiterval'. + However, `size' is used instead of `sp'. */ +#define CB_MAPITERVAL(CB_vbuf, CB_kbuf, CB_vsiz) \ + do { \ + CBMAPDATUM *_CB_datum; \ + _CB_datum = (CBMAPDATUM *)((CB_kbuf) - sizeof(*_CB_datum)); \ + (CB_vsiz) = _CB_datum->vsiz; \ + (CB_vbuf) = (char *)_CB_datum + sizeof(*_CB_datum) + \ + _CB_datum->ksiz + CB_ALIGNPAD(_CB_datum->ksiz); \ + } while(FALSE) + + + +#undef MYEXTERN + +#if defined(__cplusplus) /* export for C++ */ +} +#endif + +#endif /* duplication check */ + + +/* END OF FILE */ |