blob: 816db4cc0b06c45329ebf0a8e459f3075c2748f4 [file] [log] [blame]
danielk1977998b56c2004-05-06 23:37:52 +00001/*
2** 2001 September 15
3**
4** The author disclaims copyright to this source code. In place of
5** a legal notice, here is a blessing:
6**
7** May you do good and not evil.
8** May you find forgiveness for yourself and forgive others.
9** May you share freely, never taking more than you give.
10**
11*************************************************************************
12** Code for testing the utf.c module in SQLite. This code
13** is not included in the SQLite library. It is used for automated
danielk1977295ba552004-05-19 10:34:51 +000014** testing of the SQLite library. Specifically, the code in this file
15** is used for testing the SQLite routines for converting between
16** the various supported unicode encodings.
danielk1977998b56c2004-05-06 23:37:52 +000017**
danielk1977295ba552004-05-19 10:34:51 +000018** $Id: test5.c,v 1.4 2004/05/19 10:34:53 danielk1977 Exp $
danielk1977998b56c2004-05-06 23:37:52 +000019*/
20#include "sqliteInt.h"
21#include "tcl.h"
22#include <stdlib.h>
23#include <string.h>
24
25/*
danielk1977295ba552004-05-19 10:34:51 +000026** Return the number of bytes up to and including the first pair of
27** 0x00 bytes in *pStr.
danielk1977998b56c2004-05-06 23:37:52 +000028*/
29static int utf16_length(const unsigned char *pZ){
30 const unsigned char *pC1 = pZ;
31 const unsigned char *pC2 = pZ+1;
32 while( *pC1 || *pC2 ){
33 pC1 += 2;
34 pC2 += 2;
35 }
36 return (pC1-pZ)+2;
37}
38
39static int sqlite_utf8to16le(
40 void * clientData,
41 Tcl_Interp *interp,
42 int objc,
43 Tcl_Obj *CONST objv[]
44){
45 unsigned char *out;
46 unsigned char *in;
47 Tcl_Obj *res;
48
49 if( objc!=2 ){
50 Tcl_AppendResult(interp, "wrong # args: should be \"",
51 Tcl_GetStringFromObj(objv[0], 0), "<utf-8 encoded-string>", 0);
52 return TCL_ERROR;
53 }
54
danielk1977295ba552004-05-19 10:34:51 +000055 in = Tcl_GetString(objv[1]);
danielk1977998b56c2004-05-06 23:37:52 +000056 out = (unsigned char *)sqlite3utf8to16le(in, -1);
danielk1977697e6e22004-05-07 01:50:37 +000057 res = Tcl_NewByteArrayObj(out, utf16_length(out));
danielk1977295ba552004-05-19 10:34:51 +000058 sqliteFree(out);
danielk1977998b56c2004-05-06 23:37:52 +000059
60 Tcl_SetObjResult(interp, res);
61
62 return TCL_OK;
63}
64
65static int sqlite_utf8to16be(
66 void * clientData,
67 Tcl_Interp *interp,
68 int objc,
69 Tcl_Obj *CONST objv[]
70){
71 unsigned char *out;
72 unsigned char *in;
73 Tcl_Obj *res;
74
75 if( objc!=2 ){
76 Tcl_AppendResult(interp, "wrong # args: should be \"",
77 Tcl_GetStringFromObj(objv[0], 0), "<utf-8 encoded-string>", 0);
78 return TCL_ERROR;
79 }
80
81 in = Tcl_GetByteArrayFromObj(objv[1], 0);
danielk1977295ba552004-05-19 10:34:51 +000082 in = Tcl_GetString(objv[1]);
danielk1977998b56c2004-05-06 23:37:52 +000083 out = (unsigned char *)sqlite3utf8to16be(in, -1);
danielk1977697e6e22004-05-07 01:50:37 +000084 res = Tcl_NewByteArrayObj(out, utf16_length(out));
danielk1977998b56c2004-05-06 23:37:52 +000085 sqliteFree(out);
86
87 Tcl_SetObjResult(interp, res);
88
89 return TCL_OK;
90}
91
92static int sqlite_utf16to16le(
93 void * clientData,
94 Tcl_Interp *interp,
95 int objc,
96 Tcl_Obj *CONST objv[]
97){
98 unsigned char *out;
99 unsigned char *in;
100 int in_len;
101 Tcl_Obj *res;
102
103 if( objc!=2 ){
104 Tcl_AppendResult(interp, "wrong # args: should be \"",
105 Tcl_GetStringFromObj(objv[0], 0), "<utf-16 encoded-string>", 0);
106 return TCL_ERROR;
107 }
108
109 in = Tcl_GetByteArrayFromObj(objv[1], &in_len);
110 out = (unsigned char *)sqliteMalloc(in_len);
111 memcpy(out, in, in_len);
112
113 sqlite3utf16to16le(out, -1);
danielk1977697e6e22004-05-07 01:50:37 +0000114 res = Tcl_NewByteArrayObj(out, utf16_length(out));
danielk1977998b56c2004-05-06 23:37:52 +0000115 sqliteFree(out);
116
117 Tcl_SetObjResult(interp, res);
118
119 return TCL_OK;
120}
121
122static int sqlite_utf16to16be(
123 void * clientData,
124 Tcl_Interp *interp,
125 int objc,
126 Tcl_Obj *CONST objv[]
127){
128 unsigned char *out;
129 unsigned char *in;
130 int in_len;
131 Tcl_Obj *res;
132
133 if( objc!=2 ){
134 Tcl_AppendResult(interp, "wrong # args: should be \"",
135 Tcl_GetStringFromObj(objv[0], 0), "<utf-16 encoded-string>", 0);
136 return TCL_ERROR;
137 }
138
139 in = Tcl_GetByteArrayFromObj(objv[1], &in_len);
140 out = (unsigned char *)sqliteMalloc(in_len);
141 memcpy(out, in, in_len);
142
143 sqlite3utf16to16be(out, -1);
danielk1977697e6e22004-05-07 01:50:37 +0000144 res = Tcl_NewByteArrayObj(out, utf16_length(out));
danielk1977998b56c2004-05-06 23:37:52 +0000145 sqliteFree(out);
146
147 Tcl_SetObjResult(interp, res);
148
149 return TCL_OK;
150}
151
152static int sqlite_utf16to8(
153 void * clientData,
154 Tcl_Interp *interp,
155 int objc,
156 Tcl_Obj *CONST objv[]
157){
158 unsigned char *out;
159 unsigned char *in;
160 Tcl_Obj *res;
161
162 if( objc!=2 ){
163 Tcl_AppendResult(interp, "wrong # args: should be \"",
danielk1977295ba552004-05-19 10:34:51 +0000164 Tcl_GetStringFromObj(objv[0], 0), " <utf-16 encoded-string>", 0);
danielk1977998b56c2004-05-06 23:37:52 +0000165 return TCL_ERROR;
166 }
167
168 in = Tcl_GetByteArrayFromObj(objv[1], 0);
169 out = sqlite3utf16to8(in, -1);
danielk1977295ba552004-05-19 10:34:51 +0000170 res = Tcl_NewByteArrayObj(out, strlen(out)+1);
danielk1977998b56c2004-05-06 23:37:52 +0000171 sqliteFree(out);
172
173 Tcl_SetObjResult(interp, res);
174
175 return TCL_OK;
176}
177
danielk1977295ba552004-05-19 10:34:51 +0000178/*
179** The first argument is a TCL UTF-8 string. Return the byte array
180** object with the encoded representation of the string, including
181** the NULL terminator.
182*/
183static int binarize(
184 void * clientData,
185 Tcl_Interp *interp,
186 int objc,
187 Tcl_Obj *CONST objv[]
188){
189 int len;
190 char *bytes;
191 Tcl_Obj *pRet;
192 assert(objc==2);
193
194 bytes = Tcl_GetStringFromObj(objv[1], &len);
195 pRet = Tcl_NewByteArrayObj(bytes, len+1);
196 Tcl_SetObjResult(interp, pRet);
197 return TCL_OK;
198}
199
danielk1977998b56c2004-05-06 23:37:52 +0000200
201/*
202** Register commands with the TCL interpreter.
203*/
204int Sqlitetest5_Init(Tcl_Interp *interp){
205 static struct {
206 char *zName;
danielk1977295ba552004-05-19 10:34:51 +0000207 Tcl_ObjCmdProc *xProc;
danielk1977998b56c2004-05-06 23:37:52 +0000208 } aCmd[] = {
danielk1977295ba552004-05-19 10:34:51 +0000209 { "sqlite_utf16to8", (Tcl_ObjCmdProc*)sqlite_utf16to8 },
210 { "sqlite_utf8to16le", (Tcl_ObjCmdProc*)sqlite_utf8to16le },
211 { "sqlite_utf8to16be", (Tcl_ObjCmdProc*)sqlite_utf8to16be },
212 { "sqlite_utf16to16le", (Tcl_ObjCmdProc*)sqlite_utf16to16le },
213 { "sqlite_utf16to16be", (Tcl_ObjCmdProc*)sqlite_utf16to16be },
214 { "binarize", (Tcl_ObjCmdProc*)binarize }
danielk1977998b56c2004-05-06 23:37:52 +0000215 };
216 int i;
217 for(i=0; i<sizeof(aCmd)/sizeof(aCmd[0]); i++){
danielk1977295ba552004-05-19 10:34:51 +0000218 Tcl_CreateObjCommand(interp, aCmd[i].zName, aCmd[i].xProc, 0, 0);
danielk1977998b56c2004-05-06 23:37:52 +0000219 }
220
221 return TCL_OK;
222}
danielk19774adee202004-05-08 08:23:19 +0000223
224
225