rua 0.3.3-mswin32 → 0.3.5-mswin32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.txt +5 -0
- data/ext/rua.c +138 -1
- data/lib/i386-mswin32/rua.so +0 -0
- metadata +2 -2
data/README.txt
CHANGED
@@ -27,6 +27,7 @@ http://storehouse.sakura.ne.jp/rua/
|
|
27
27
|
class MyClass; end
|
28
28
|
|
29
29
|
rua = Rua.new(:all)
|
30
|
+
#rua.external_charset = Rua::SJIS
|
30
31
|
#rua.openlibs(:base, :package, :string)
|
31
32
|
#rua.secure = false
|
32
33
|
rua.abort_by_error = false
|
@@ -93,3 +94,7 @@ http://storehouse.sakura.ne.jp/rua/
|
|
93
94
|
p co.resume('x', 'y')
|
94
95
|
|
95
96
|
p rua.f.info.to_hash
|
97
|
+
|
98
|
+
== Notice
|
99
|
+
=== License for Lua 5.0 and later versions
|
100
|
+
Copyright (c) 1994-2007 Lua.org, PUC-Rio.
|
data/ext/rua.c
CHANGED
@@ -7,6 +7,8 @@ __declspec(dllexport) void Init_rua(void);
|
|
7
7
|
|
8
8
|
#include <stddef.h>
|
9
9
|
#include <string.h>
|
10
|
+
#include <malloc.h>
|
11
|
+
#include <errno.h>
|
10
12
|
|
11
13
|
#include "ruby.h"
|
12
14
|
|
@@ -14,11 +16,18 @@ __declspec(dllexport) void Init_rua(void);
|
|
14
16
|
#include "lualib.h"
|
15
17
|
#include "lauxlib.h"
|
16
18
|
|
19
|
+
#include "iconv.h"
|
20
|
+
|
17
21
|
#include "rua.h"
|
18
22
|
|
19
|
-
#define VERSION
|
23
|
+
#define VERSION "0.3.5"
|
20
24
|
#define REF_RBOBJ "self"
|
21
25
|
|
26
|
+
#define ICONV_JIS "ISO-2022-JP"
|
27
|
+
#define ICONV_SJIS "SJIS"
|
28
|
+
#define ICONV_EUC "eucJP"
|
29
|
+
#define ICONV_UTF8 "UTF-8"
|
30
|
+
|
22
31
|
static const char *insecure_methods[] = {
|
23
32
|
"__id__",
|
24
33
|
"__send__",
|
@@ -87,6 +96,10 @@ void Init_rua() {
|
|
87
96
|
|
88
97
|
rb_define_alloc_func(Rua, rua_alloc);
|
89
98
|
rb_define_const(Rua, "VERSION", rb_str_new2(VERSION));
|
99
|
+
rb_define_const(Rua, "JIS", rb_str_new2(ICONV_JIS));
|
100
|
+
rb_define_const(Rua, "SJIS", rb_str_new2(ICONV_SJIS));
|
101
|
+
rb_define_const(Rua, "EUC", rb_str_new2(ICONV_EUC));
|
102
|
+
//rb_define_const(Rua, "UTF8", rb_str_new2(ICONV_UTF8));
|
90
103
|
rb_define_private_method(Rua, "initialize", rua_initialize, -1);
|
91
104
|
rb_define_method(Rua, "openlibs", rua_openlibs, -1);
|
92
105
|
rb_define_method(Rua, "eval", rua_eval, 1);
|
@@ -98,6 +111,8 @@ void Init_rua() {
|
|
98
111
|
rb_define_method(Rua, "abort_by_error=", rua_set_abort_by_error, 1);
|
99
112
|
rb_define_method(Rua, "wrap_error", rua_get_wrap_error, 0);
|
100
113
|
rb_define_method(Rua, "wrap_error=", rua_set_wrap_error, 1);
|
114
|
+
rb_define_method(Rua, "external_charset", rua_get_external_charset, 0);
|
115
|
+
rb_define_method(Rua, "external_charset=", rua_set_external_charset, 1);
|
101
116
|
rb_define_method(Rua, "error_handler", rua_get_error_handler, 0);
|
102
117
|
rb_define_method(Rua, "error_handler=", rua_set_error_handler, 1);
|
103
118
|
rb_define_method(Rua, "method_missing", rua_method_missing, -1);
|
@@ -147,6 +162,7 @@ static VALUE rua_alloc(VALUE klass) {
|
|
147
162
|
p->R->rua = Qnil;
|
148
163
|
p->R->refs = Qnil;
|
149
164
|
p->R->error_handler = Qnil;
|
165
|
+
p->R->external_charset = Qnil;
|
150
166
|
p->R->secure = 1;
|
151
167
|
p->R->abort_by_error = 1;
|
152
168
|
p->R->wrap_error = 1;
|
@@ -157,6 +173,7 @@ static void rua_mark(struct rua *p) {
|
|
157
173
|
rb_gc_mark(p->R->rua);
|
158
174
|
rb_gc_mark(p->R->refs);
|
159
175
|
rb_gc_mark(p->R->error_handler);
|
176
|
+
rb_gc_mark(p->R->external_charset);
|
160
177
|
}
|
161
178
|
|
162
179
|
static void rua_free(struct rua *p) {
|
@@ -182,6 +199,7 @@ static VALUE rua_initialize(int argc, VALUE *argv, VALUE self) {
|
|
182
199
|
p->R->rua = self;
|
183
200
|
p->R->refs = rb_hash_new();
|
184
201
|
p->R->error_handler = Qnil;
|
202
|
+
p->R->external_charset = Qnil;
|
185
203
|
p->R->secure = 1;
|
186
204
|
p->R->abort_by_error = 1;
|
187
205
|
p->R->wrap_error = 1;
|
@@ -257,6 +275,11 @@ static VALUE rua_eval(VALUE self, VALUE str) {
|
|
257
275
|
|
258
276
|
Check_Type(str, T_STRING);
|
259
277
|
Data_Get_Struct(self, struct rua, p);
|
278
|
+
|
279
|
+
if (!NIL_P(p->R->external_charset)) {
|
280
|
+
str = rua_iconv(ICONV_UTF8, StringValuePtr(p->R->external_charset), str);
|
281
|
+
}
|
282
|
+
|
260
283
|
pretop = lua_gettop(p->L);
|
261
284
|
luaL_loadstring(p->L, StringValuePtr(str));
|
262
285
|
|
@@ -396,6 +419,34 @@ static VALUE rua_set_wrap_error(VALUE self, VALUE wrap_error) {
|
|
396
419
|
return Qnil;
|
397
420
|
}
|
398
421
|
|
422
|
+
/**
|
423
|
+
* get external character set.
|
424
|
+
*/
|
425
|
+
static VALUE rua_get_external_charset(VALUE self) {
|
426
|
+
struct rua *p;
|
427
|
+
|
428
|
+
Data_Get_Struct(self, struct rua, p);
|
429
|
+
return p->R->external_charset;
|
430
|
+
}
|
431
|
+
|
432
|
+
/**
|
433
|
+
* set external character set.
|
434
|
+
*/
|
435
|
+
static VALUE rua_set_external_charset(VALUE self, VALUE external_charset) {
|
436
|
+
struct rua *p;
|
437
|
+
|
438
|
+
Data_Get_Struct(self, struct rua, p);
|
439
|
+
|
440
|
+
if (NIL_P(external_charset)) {
|
441
|
+
p->R->external_charset = Qnil;
|
442
|
+
} else {
|
443
|
+
Check_Type(external_charset, T_STRING);
|
444
|
+
p->R->external_charset = external_charset;
|
445
|
+
}
|
446
|
+
|
447
|
+
return Qnil;
|
448
|
+
}
|
449
|
+
|
399
450
|
/**
|
400
451
|
* get error handler.
|
401
452
|
*/
|
@@ -458,6 +509,7 @@ static void rua_ref_mark(struct rua_ref *p) {
|
|
458
509
|
rb_gc_mark(p->R->rua);
|
459
510
|
rb_gc_mark(p->R->refs);
|
460
511
|
rb_gc_mark(p->R->error_handler);
|
512
|
+
rb_gc_mark(p->R->external_charset);
|
461
513
|
}
|
462
514
|
|
463
515
|
static void rua_ref_free(struct rua_ref *p) {
|
@@ -797,6 +849,11 @@ static VALUE rua_torbval(lua_State *L, int idx, struct rua_state *R) {
|
|
797
849
|
|
798
850
|
case LUA_TSTRING:
|
799
851
|
rbval = rb_str_new2(lua_tostring(L, idx));
|
852
|
+
|
853
|
+
if (!NIL_P(R->external_charset)) {
|
854
|
+
rbval = rua_iconv(StringValuePtr(R->external_charset), ICONV_UTF8, rbval);
|
855
|
+
}
|
856
|
+
|
800
857
|
break;
|
801
858
|
|
802
859
|
case LUA_TTABLE:
|
@@ -884,6 +941,10 @@ static void rua_pushrbval(lua_State *L, VALUE rbval, struct rua_state *R) {
|
|
884
941
|
break;
|
885
942
|
|
886
943
|
case T_STRING:
|
944
|
+
if (!NIL_P(R->external_charset)) {
|
945
|
+
rbval = rua_iconv(ICONV_UTF8, StringValuePtr(R->external_charset), rbval);
|
946
|
+
}
|
947
|
+
|
887
948
|
lua_pushstring(L, StringValuePtr(rbval));
|
888
949
|
break;
|
889
950
|
|
@@ -917,6 +978,7 @@ static void rua_pushrbval(lua_State *L, VALUE rbval, struct rua_state *R) {
|
|
917
978
|
lua_pushlightuserdata(L, (void *) rbval);
|
918
979
|
lua_pushlightuserdata(L, R);
|
919
980
|
lua_pushcclosure(L, rua_proc_call, 2);
|
981
|
+
rua_set_finalizer(L, -1, rbval, R);
|
920
982
|
} else {
|
921
983
|
rua_newtable_from_obj(L, rbval, R);
|
922
984
|
}
|
@@ -967,6 +1029,7 @@ static void rua_newtable_from_obj(lua_State *L, VALUE obj, struct rua_state *R)
|
|
967
1029
|
|
968
1030
|
lua_pushstring(L, REF_RBOBJ);
|
969
1031
|
lua_pushlightuserdata(L, (void *) obj);
|
1032
|
+
rua_set_finalizer(L, -1, obj, R);
|
970
1033
|
lua_rawset(L, tblidx);
|
971
1034
|
rb_hash_aset(R->refs, obj, Qtrue);
|
972
1035
|
|
@@ -1149,3 +1212,77 @@ static const char *rua_classname_ptr(VALUE v) {
|
|
1149
1212
|
|
1150
1213
|
return StringValuePtr(klassname);
|
1151
1214
|
}
|
1215
|
+
|
1216
|
+
static void rua_set_finalizer(lua_State *L, int idx, VALUE rbobj, struct rua_state *R) {
|
1217
|
+
int pretop, objidx, tblidx;
|
1218
|
+
|
1219
|
+
pretop = lua_gettop(L);
|
1220
|
+
lua_pushvalue(L, idx);
|
1221
|
+
objidx = lua_gettop(L);
|
1222
|
+
|
1223
|
+
if (!lua_getmetatable(L, objidx)) {
|
1224
|
+
lua_newtable(L);
|
1225
|
+
lua_setmetatable(L, objidx);
|
1226
|
+
lua_getmetatable(L, objidx);
|
1227
|
+
}
|
1228
|
+
|
1229
|
+
tblidx = lua_gettop(L);
|
1230
|
+
lua_pushstring(L, "__gc");
|
1231
|
+
|
1232
|
+
lua_pushlightuserdata(L, (void *) rbobj);
|
1233
|
+
lua_pushlightuserdata(L, R);
|
1234
|
+
lua_pushcclosure(L, rua_finalize_rbobj, 2);
|
1235
|
+
|
1236
|
+
lua_rawset(L, tblidx);
|
1237
|
+
lua_pop(L, lua_gettop(L) - pretop);
|
1238
|
+
}
|
1239
|
+
|
1240
|
+
static int rua_finalize_rbobj(lua_State *L) {
|
1241
|
+
struct rua_state *R;
|
1242
|
+
VALUE rbobj;
|
1243
|
+
|
1244
|
+
if (lua_gettop(L) > 0) {
|
1245
|
+
rbobj = (VALUE) lua_touserdata(L, lua_upvalueindex(1));
|
1246
|
+
R = (struct rua_state *) lua_touserdata(L, lua_upvalueindex(2));
|
1247
|
+
|
1248
|
+
if (rbobj) {
|
1249
|
+
rb_hash_delete(R->refs, rbobj);
|
1250
|
+
}
|
1251
|
+
}
|
1252
|
+
|
1253
|
+
return 0;
|
1254
|
+
}
|
1255
|
+
|
1256
|
+
static VALUE rua_iconv(const char *to, const char *from, VALUE in) {
|
1257
|
+
VALUE out;
|
1258
|
+
iconv_t cd;
|
1259
|
+
char *cin, *cout, *pcout;
|
1260
|
+
size_t cin_len, cout_len;
|
1261
|
+
|
1262
|
+
cd = iconv_open(to, from);
|
1263
|
+
|
1264
|
+
if ((int) cd == -1) {
|
1265
|
+
rb_warn("%s (%s, %s)", to, from, strerror(errno));
|
1266
|
+
return Qnil;
|
1267
|
+
}
|
1268
|
+
|
1269
|
+
cin = StringValuePtr(in);
|
1270
|
+
cin_len = strlen(cin);
|
1271
|
+
cout_len = cin_len * 3 + 1;
|
1272
|
+
cout = pcout = alloca(sizeof(char) * cout_len);
|
1273
|
+
|
1274
|
+
if (iconv(cd, &cin, &cin_len, &pcout, &cout_len) == -1) {
|
1275
|
+
rb_warn("%s (%s, %s)", to, from, strerror(errno));
|
1276
|
+
iconv_close(cd);
|
1277
|
+
return Qnil;
|
1278
|
+
}
|
1279
|
+
|
1280
|
+
*pcout = '\0';
|
1281
|
+
out = rb_str_new2(cout);
|
1282
|
+
|
1283
|
+
if (iconv_close(cd) != 0) {
|
1284
|
+
rb_warn("%s (%s, %s)", to, from, strerror(errno));
|
1285
|
+
}
|
1286
|
+
|
1287
|
+
return out;
|
1288
|
+
}
|
data/lib/i386-mswin32/rua.so
CHANGED
Binary file
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.2
|
|
3
3
|
specification_version: 1
|
4
4
|
name: rua
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.3.
|
7
|
-
date: 2007-
|
6
|
+
version: 0.3.5
|
7
|
+
date: 2007-12-10 00:00:00 +09:00
|
8
8
|
summary: Rua is a library for using Lua under Ruby.
|
9
9
|
require_paths:
|
10
10
|
- lib/i386-mswin32
|