Compare commits
3 Commits
50cbe63591
...
1355c16cd4
Author | SHA1 | Date |
---|---|---|
prpr | 1355c16cd4 | |
prpr | f64d0ac615 | |
prpr | 5529d6f3f3 |
28
Makefile
28
Makefile
|
@ -1,24 +1,20 @@
|
|||
|
||||
MAKE=make
|
||||
|
||||
CFLAGS=-g
|
||||
CFLAGS=-g -fPIC
|
||||
DEFS=-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_REENTRANT -D_THREAD_SAFE -D_GNU_SOURCE
|
||||
#WARN=-Wall -Wunused
|
||||
WARN=-Wall -Wunused
|
||||
|
||||
all: lib
|
||||
LIBFILE=xconv.so
|
||||
|
||||
lib:
|
||||
gcc ${CFLAGS} ${DEFS} -shared -ldl -lpthread -fPIC xconv.c -o libxconv.so -lxconv
|
||||
.PHONY: all clean install
|
||||
|
||||
all: $(LIBFILE)
|
||||
|
||||
$(LIBFILE): xconv.c
|
||||
@echo " $<"
|
||||
@$(CC) $(CFLAGS) $(WARN) $(DEFS) -shared -ldl -lpthread -lxconv -o $@ $<
|
||||
|
||||
clean:
|
||||
rm -f core *.o *.so
|
||||
rm -f *.so
|
||||
|
||||
install: all
|
||||
strip libxconv.so
|
||||
mkdir -p /mod/lib/sql
|
||||
cp libxconv.so /mod/lib/sql/xconv.so
|
||||
|
||||
.c.o:
|
||||
@echo " $<"
|
||||
@$(CC) $(CFLAGS) ${WARN} ${DEFS} ${INCS} -c $< -o $@
|
||||
|
||||
strip $(LIBFILE) -o /mod/lib/sql/$(LIBFILE)
|
||||
|
|
2
test
2
test
|
@ -7,7 +7,7 @@ set s "home made p\303at\302e"
|
|||
hexdump $s
|
||||
|
||||
set db [sqlite3.open ":memory:"]
|
||||
$db extension /mod/lib/sql/libqxconv.so
|
||||
$db extension /mod/lib/sql/xconv.so
|
||||
set ret [$db query {select xconv('%s') as xconv} $s]
|
||||
lassign [lindex $ret 0] x t
|
||||
|
||||
|
|
60
xconv.c
60
xconv.c
|
@ -2,7 +2,6 @@
|
|||
* xconv.c -- An SQLite3 C extension that uses libxconv to convert from
|
||||
* ISO 6937 to UTF-8.
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <sqlite3ext.h>
|
||||
|
@ -22,28 +21,79 @@ sqlite_xconv(sqlite3_context *c, int argc, sqlite3_value **argv)
|
|||
return;
|
||||
}
|
||||
|
||||
dlen = strlen(src) + 20;
|
||||
dlen = strlen(src) * 2 + 14;
|
||||
if (!(dst = (char *)malloc(dlen)))
|
||||
{
|
||||
sqlite3_result_error(c, "malloc() failed", -1);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if (!xconv(src, dst, dlen))
|
||||
{
|
||||
free(dst);
|
||||
dst = strdup(src);
|
||||
}
|
||||
|
||||
sqlite3_result_text(c, dst, -1, free);
|
||||
}
|
||||
|
||||
void
|
||||
sqlite_utf8conv(sqlite3_context *c, int argc, sqlite3_value **argv)
|
||||
{
|
||||
char *src, *dst;
|
||||
|
||||
if (argc != 1 || !(src = (char *)sqlite3_value_text(argv[0])))
|
||||
{
|
||||
sqlite3_result_error(c, "utf8conv requires 1 parameter", -1);
|
||||
return;
|
||||
}
|
||||
|
||||
if (src[0] == 0x10)
|
||||
{
|
||||
if (src[1] == 'i' && src[2] == '7')
|
||||
{
|
||||
size_t dlen;
|
||||
|
||||
src += 3;
|
||||
dlen = strlen(src) * 2 + 14;
|
||||
if (!(dst = (char *)malloc(dlen)))
|
||||
{
|
||||
sqlite3_result_error(c, "malloc() failed", -1);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!xconv(src, dst, dlen))
|
||||
{
|
||||
free(dst);
|
||||
dst = strdup(src);
|
||||
}
|
||||
}
|
||||
else
|
||||
dst = strdup("");
|
||||
}
|
||||
else
|
||||
{
|
||||
if (*src < 0x20)
|
||||
src += *src == 0x1F ? 2 : 1;
|
||||
|
||||
dst = strdup(src);
|
||||
}
|
||||
|
||||
sqlite3_result_text(c, dst, -1, free);
|
||||
}
|
||||
|
||||
int sqlite3_xconv_init(sqlite3 *db, char **err,
|
||||
const sqlite3_api_routines *api)
|
||||
{
|
||||
SQLITE_EXTENSION_INIT2(api);
|
||||
int rc1, rc2;
|
||||
|
||||
return sqlite3_create_function(db, "xconv", 1,
|
||||
SQLITE_EXTENSION_INIT2(api);
|
||||
rc1 = sqlite3_create_function(db, "xconv", 1,
|
||||
SQLITE_UTF8 | SQLITE_DETERMINISTIC, NULL,
|
||||
sqlite_xconv, NULL, NULL);
|
||||
rc2 = sqlite3_create_function(db, "utf8conv", 1,
|
||||
SQLITE_UTF8 | SQLITE_DETERMINISTIC, NULL,
|
||||
sqlite_utf8conv, NULL, NULL);
|
||||
return rc1 != SQLITE_OK && rc2 != SQLITE_OK ? rc1 : SQLITE_OK;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue