mirror of
https://github.com/berkeleydb/libdb.git
synced 2024-11-17 01:26:25 +00:00
313 lines
7.2 KiB
Diff
313 lines
7.2 KiB
Diff
--- extfunc.c.orig 2010-04-09 09:30:28.000000000 +0200
|
|
+++ extfunc.c 2010-04-09 09:24:27.000000000 +0200
|
|
@@ -116,7 +116,6 @@
|
|
#define HAVE_COSH 1
|
|
#define HAVE_TANH 1
|
|
#define HAVE_LOG10 1
|
|
-#define HAVE_ISBLANK 1
|
|
#define SQLITE_SOUNDEX 1
|
|
#define HAVE_TRIM 1 /* LMH 2007-03-25 if sqlite has trim functions */
|
|
|
|
@@ -127,7 +126,6 @@
|
|
#include "sqlite3.h"
|
|
#endif
|
|
|
|
-#include <ctype.h>
|
|
/* relicoder */
|
|
#include <math.h>
|
|
#include <string.h>
|
|
@@ -160,40 +158,39 @@
|
|
typedef struct map{
|
|
node *base;
|
|
cmp_func cmp;
|
|
- short free;
|
|
} map;
|
|
|
|
/*
|
|
** creates a map given a comparison function
|
|
*/
|
|
-map map_make(cmp_func cmp);
|
|
+static map map_make(cmp_func cmp);
|
|
|
|
/*
|
|
** inserts the element e into map m
|
|
*/
|
|
-void map_insert(map *m, void *e);
|
|
+static void map_insert(map *m, void *e);
|
|
|
|
/*
|
|
** executes function iter over all elements in the map, in key increasing order
|
|
*/
|
|
-void map_iterate(map *m, map_iterator iter, void* p);
|
|
+static void map_iterate(map *m, map_iterator iter, void* p);
|
|
|
|
/*
|
|
** frees all memory used by a map
|
|
*/
|
|
-void map_destroy(map *m);
|
|
+static void map_destroy(map *m);
|
|
|
|
/*
|
|
** compares 2 integers
|
|
** to use with map_make
|
|
*/
|
|
-int int_cmp(const void *a, const void *b);
|
|
+static int int_cmp(const void *a, const void *b);
|
|
|
|
/*
|
|
** compares 2 doubles
|
|
** to use with map_make
|
|
*/
|
|
-int double_cmp(const void *a, const void *b);
|
|
+static int double_cmp(const void *a, const void *b);
|
|
|
|
#endif /* _MAP_H_ */
|
|
|
|
@@ -244,6 +241,26 @@
|
|
3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
|
|
};
|
|
|
|
+/*
|
|
+** Own (ASCII only) implementation of toupper(), tolower(),
|
|
+** and isalpha()
|
|
+*/
|
|
+
|
|
+static int toupper(int c){
|
|
+ if ((c>='a') && (c<='z')) return c-0x20;
|
|
+ return c;
|
|
+}
|
|
+
|
|
+static int tolower(int c){
|
|
+ if ((c>='A') && (c<='Z')) return c+0x20;
|
|
+ return c;
|
|
+}
|
|
+
|
|
+static int isalpha(int c){
|
|
+ if ((c>='A') && (c<='Z')) return 1;
|
|
+ if ((c>='a') && (c<='z')) return 1;
|
|
+ return 0;
|
|
+}
|
|
|
|
/*
|
|
** This table maps from the number of trailing bytes in a UTF-8 character
|
|
@@ -360,7 +377,7 @@
|
|
if (errno == 0) {\
|
|
sqlite3_result_double(context, val);\
|
|
} else {\
|
|
- sqlite3_result_error(context, strerror(errno), errno);\
|
|
+ sqlite3_result_error(context, "domain error", -1); \
|
|
}\
|
|
break;\
|
|
}\
|
|
@@ -555,7 +572,7 @@
|
|
if (errno == 0) {
|
|
sqlite3_result_double(context, val);
|
|
} else {
|
|
- sqlite3_result_error(context, strerror(errno), errno);
|
|
+ sqlite3_result_error(context, "domain error", -1);
|
|
}
|
|
}
|
|
}
|
|
@@ -620,7 +637,7 @@
|
|
assert( argc==1 );
|
|
switch( sqlite3_value_type(argv[0]) ){
|
|
case SQLITE_INTEGER: {
|
|
- i64 iVal = sqlite3_value_int64(argv[0]);
|
|
+ iVal = sqlite3_value_int64(argv[0]);
|
|
sqlite3_result_int64(context, iVal);
|
|
break;
|
|
}
|
|
@@ -645,7 +662,7 @@
|
|
assert( argc==1 );
|
|
switch( sqlite3_value_type(argv[0]) ){
|
|
case SQLITE_INTEGER: {
|
|
- i64 iVal = sqlite3_value_int64(argv[0]);
|
|
+ iVal = sqlite3_value_int64(argv[0]);
|
|
sqlite3_result_int64(context, iVal);
|
|
break;
|
|
}
|
|
@@ -704,16 +721,6 @@
|
|
}
|
|
}
|
|
|
|
-/*
|
|
-** Some systems (win32 among others) don't have an isblank function, this will emulate it.
|
|
-** This function is not UFT-8 safe since it only analyses a byte character.
|
|
-*/
|
|
-#ifndef HAVE_ISBLANK
|
|
-int isblank(char c){
|
|
- return( ' '==c || '\t'==c );
|
|
-}
|
|
-#endif
|
|
-
|
|
static void properFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
|
|
const unsigned char *z; /* input string */
|
|
unsigned char *zo; /* output string */
|
|
@@ -736,7 +743,7 @@
|
|
zt = zo;
|
|
|
|
while( (r = *(z++))!=0 ){
|
|
- if( isblank(r) ){
|
|
+ if( (r==' ') || (r=='\t') ){
|
|
c=1;
|
|
}else{
|
|
if( c==1 ){
|
|
@@ -1349,6 +1356,15 @@
|
|
sqlite3_free(rz);
|
|
}
|
|
|
|
+static void* xcalloc(size_t nmemb, size_t size){
|
|
+ void* ret = calloc(nmemb, size);
|
|
+ return ret;
|
|
+}
|
|
+
|
|
+static void xfree(void* p){
|
|
+ free(p);
|
|
+}
|
|
+
|
|
/*
|
|
** An instance of the following structure holds the context of a
|
|
** stdev() or variance() aggregate computation.
|
|
@@ -1424,7 +1440,7 @@
|
|
p = sqlite3_aggregate_context(context, sizeof(*p));
|
|
|
|
if( 0==(p->m) ){
|
|
- p->m = calloc(1, sizeof(map));
|
|
+ p->m = xcalloc(1, sizeof(map));
|
|
if( type==SQLITE_INTEGER ){
|
|
/* map will be used for integers */
|
|
*(p->m) = map_make(int_cmp);
|
|
@@ -1440,12 +1456,12 @@
|
|
|
|
if( 0==p->is_double ){
|
|
xi = sqlite3_value_int64(argv[0]);
|
|
- iptr = (i64*)calloc(1,sizeof(i64));
|
|
+ iptr = (i64*)xcalloc(1,sizeof(i64));
|
|
*iptr = xi;
|
|
map_insert(p->m, iptr);
|
|
}else{
|
|
xd = sqlite3_value_double(argv[0]);
|
|
- dptr = (double*)calloc(1,sizeof(double));
|
|
+ dptr = (double*)xcalloc(1,sizeof(double));
|
|
*dptr = xd;
|
|
map_insert(p->m, dptr);
|
|
}
|
|
@@ -1531,7 +1547,7 @@
|
|
if( p && p->m ){
|
|
map_iterate(p->m, modeIterate, p);
|
|
map_destroy(p->m);
|
|
- free(p->m);
|
|
+ xfree(p->m);
|
|
|
|
if( 1==p->mn ){
|
|
if( 0==p->is_double )
|
|
@@ -1552,7 +1568,7 @@
|
|
p->done=0;
|
|
map_iterate(p->m, medianIterate, p);
|
|
map_destroy(p->m);
|
|
- free(p->m);
|
|
+ xfree(p->m);
|
|
|
|
if( 0==p->is_double )
|
|
if( 1==p->mn )
|
|
@@ -1705,7 +1721,7 @@
|
|
** functions. This should be the only routine in this file with
|
|
** external linkage.
|
|
*/
|
|
-int RegisterExtensionFunctions(sqlite3 *db){
|
|
+static int RegisterExtensionFunctions(sqlite3 *db){
|
|
static const struct FuncDef {
|
|
char *zName;
|
|
signed char nArg;
|
|
@@ -1843,28 +1859,18 @@
|
|
}
|
|
#endif /* COMPILE_SQLITE_EXTENSIONS_AS_LOADABLE_MODULE */
|
|
|
|
-map map_make(cmp_func cmp){
|
|
+static map map_make(cmp_func cmp){
|
|
map r;
|
|
r.cmp=cmp;
|
|
r.base = 0;
|
|
-
|
|
return r;
|
|
}
|
|
|
|
-void* xcalloc(size_t nmemb, size_t size, char* s){
|
|
- void* ret = calloc(nmemb, size);
|
|
- return ret;
|
|
-}
|
|
-
|
|
-void xfree(void* p){
|
|
- free(p);
|
|
-}
|
|
-
|
|
-void node_insert(node** n, cmp_func cmp, void *e){
|
|
+static void node_insert(node** n, cmp_func cmp, void *e){
|
|
int c;
|
|
node* nn;
|
|
if(*n==0){
|
|
- nn = (node*)xcalloc(1,sizeof(node), "for node");
|
|
+ nn = (node*)xcalloc(1,sizeof(node));
|
|
nn->data = e;
|
|
nn->count = 1;
|
|
*n=nn;
|
|
@@ -1882,11 +1888,11 @@
|
|
}
|
|
}
|
|
|
|
-void map_insert(map *m, void *e){
|
|
+static void map_insert(map *m, void *e){
|
|
node_insert(&(m->base), m->cmp, e);
|
|
}
|
|
|
|
-void node_iterate(node *n, map_iterator iter, void* p){
|
|
+static void node_iterate(node *n, map_iterator iter, void* p){
|
|
if(n){
|
|
if(n->l)
|
|
node_iterate(n->l, iter, p);
|
|
@@ -1896,11 +1902,11 @@
|
|
}
|
|
}
|
|
|
|
-void map_iterate(map *m, map_iterator iter, void* p){
|
|
+static void map_iterate(map *m, map_iterator iter, void* p){
|
|
node_iterate(m->base, iter, p);
|
|
}
|
|
|
|
-void node_destroy(node *n){
|
|
+static void node_destroy(node *n){
|
|
if(0!=n){
|
|
xfree(n->data);
|
|
if(n->l)
|
|
@@ -1912,11 +1918,11 @@
|
|
}
|
|
}
|
|
|
|
-void map_destroy(map *m){
|
|
+static void map_destroy(map *m){
|
|
node_destroy(m->base);
|
|
}
|
|
|
|
-int int_cmp(const void *a, const void *b){
|
|
+static int int_cmp(const void *a, const void *b){
|
|
int64_t aa = *(int64_t *)(a);
|
|
int64_t bb = *(int64_t *)(b);
|
|
/* printf("cmp %d <=> %d\n",aa,bb); */
|
|
@@ -1928,7 +1934,7 @@
|
|
return 1;
|
|
}
|
|
|
|
-int double_cmp(const void *a, const void *b){
|
|
+static int double_cmp(const void *a, const void *b){
|
|
double aa = *(double *)(a);
|
|
double bb = *(double *)(b);
|
|
/* printf("cmp %d <=> %d\n",aa,bb); */
|
|
@@ -1940,8 +1946,4 @@
|
|
return 1;
|
|
}
|
|
|
|
-void print_elem(void *e, int64_t c, void* p){
|
|
- int ee = *(int*)(e);
|
|
- printf("%d => %lld\n", ee,c);
|
|
-}
|
|
|