1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* ext/tk/tcltklib.c: refactoring - extract ruby string <->

tcl object conversion as get_str_from_obj and get_obj_from_str.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@8918 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
ocean 2005-08-04 15:26:05 +00:00
parent 7c2dad9c1f
commit 6c8633ab99
2 changed files with 82 additions and 211 deletions

View file

@ -1,3 +1,8 @@
Fri Aug 5 00:25:12 2005 Hirokazu Yamamoto <ocean@m2.ccsnet.ne.jp>
* ext/tk/tcltklib.c: refactoring - extract ruby string <->
tcl object conversion as get_str_from_obj and get_obj_from_str.
Fri Aug 5 00:19:33 2005 Nobuyoshi Nakada <nobu@ruby-lang.org>
* enumerator.c (Init_Enumerator): provided features should have

View file

@ -5613,64 +5613,76 @@ ip_has_mainwindow_p(self)
}
}
/*** ruby string <=> tcl object ***/
#if TCL_MAJOR_VERSION >= 8
static VALUE
get_str_from_obj(obj)
Tcl_Obj *obj;
{
int len, binary = 0;
const char *s;
volatile VALUE str;
#if TCL_MAJOR_VERSION == 8 && TCL_MINOR_VERSION == 0
s = Tcl_GetStringFromObj(obj, &len);
#else /* TCL_VERSION >= 8.1 */
if (Tcl_GetCharLength(obj) != Tcl_UniCharLen(Tcl_GetUnicode(obj))) {
/* possibly binary string */
s = Tcl_GetByteArrayFromObj(obj, &len);
binary = 1;
} else {
/* possibly text string */
s = Tcl_GetStringFromObj(obj, &len);
}
#endif
str = s ? rb_str_new(s, len) : rb_str_new2("");
if (binary) rb_ivar_set(str, ID_at_enc, rb_str_new2("binary"));
return str;
}
static Tcl_Obj *
get_obj_from_str(str)
VALUE str;
{
const char *s = StringValuePtr(str);
#if TCL_MAJOR_VERSION == 8 && TCL_MINOR_VERSION == 0
return Tcl_NewStringObj(s, RSTRING(str)->len);
#else /* TCL_VERSION >= 8.1 */
VALUE enc = rb_attr_get(str, ID_at_enc);
if (!NIL_P(enc) && strcmp(StringValuePtr(enc), "binary") == 0) {
/* binary string */
return Tcl_NewByteArrayObj(s, RSTRING(str)->len);
} else if (strlen(s) != RSTRING(str)->len) {
/* probably binary string */
return Tcl_NewByteArrayObj(s, RSTRING(str)->len);
} else {
/* probably text string */
return Tcl_NewStringObj(s, RSTRING(str)->len);
}
#endif
}
#endif /* ruby string <=> tcl object */
static VALUE
ip_get_result_string_obj(interp)
Tcl_Interp *interp;
{
#if TCL_MAJOR_VERSION >= 8
int len;
char *s;
# if TCL_MAJOR_VERSION == 8 && TCL_MINOR_VERSION == 0
s = Tcl_GetStringFromObj(Tcl_GetObjResult(interp), &len);
if (s == (char*)NULL) {
return rb_tainted_str_new2("");
} else {
return(rb_tainted_str_new(s, len));
}
# else /* TCL_VERSION >= 8.1 */
Tcl_Obj *retObj;
volatile VALUE strval;
Tcl_Obj *retobj = Tcl_GetObjResult(interp);
int thr_crit_bup;
Tcl_IncrRefCount(retobj);
thr_crit_bup = rb_thread_critical;
rb_thread_critical = Qtrue;
if (Tcl_GetCharLength(retobj) != Tcl_UniCharLen(Tcl_GetUnicode(retobj))) {
/* possibly binary string */
s = Tcl_GetByteArrayFromObj(retobj, &len);
if (s == (char*)NULL) {
strval = rb_tainted_str_new2("");
} else {
strval = rb_tainted_str_new(s, len);
}
rb_ivar_set(strval, ID_at_enc, rb_str_new2("binary"));
} else {
/* possibly text string */
s = Tcl_GetStringFromObj(retobj, &len);
if (s == (char*)NULL) {
strval = rb_tainted_str_new2("");
} else {
strval = rb_tainted_str_new(s, len);
}
}
rb_thread_critical = thr_crit_bup;
Tcl_DecrRefCount(retobj);
return(strval);
# endif
#else /* TCL_MAJOR_VERSION < 8 */
return(rb_tainted_str_new2(interp->result));
retObj = Tcl_GetObjResult(interp);
Tcl_IncrRefCount(retObj);
strval = get_str_from_obj(retObj);
OBJ_TAINT(strval);
Tcl_DecrRefCount(retObj);
return strval;
#else
return rb_tainted_str_new2(interp->result);
#endif
}
/* call Tcl/Tk functions on the eventloop thread */
static VALUE
callq_safelevel_handler(arg, callq)
@ -6971,15 +6983,12 @@ alloc_invoke_arguments(argc, argv)
VALUE *argv;
{
int i;
VALUE v;
char *s;
int thr_crit_bup;
#if TCL_MAJOR_VERSION >= 8
Tcl_Obj **av = (Tcl_Obj **)NULL;
Tcl_Obj *resultPtr;
Tcl_Obj **av;
#else /* TCL_MAJOR_VERSION < 8 */
char **av = (char **)NULL;
char **av;
#endif
thr_crit_bup = rb_thread_critical;
@ -6987,42 +6996,20 @@ alloc_invoke_arguments(argc, argv)
/* memory allocation */
#if TCL_MAJOR_VERSION >= 8
av = (Tcl_Obj **)ALLOC_N(Tcl_Obj *, argc+1);
av = ALLOC_N(Tcl_Obj *, argc+1);
for (i = 0; i < argc; ++i) {
VALUE enc;
v = argv[i];
s = StringValuePtr(v);
# if TCL_MAJOR_VERSION == 8 && TCL_MINOR_VERSION == 0
av[i] = Tcl_NewStringObj(s, RSTRING(v)->len);
# else /* TCL_VERSION >= 8.1 */
enc = rb_attr_get(v, ID_at_enc);
if (!NIL_P(enc) && strcmp(StringValuePtr(enc), "binary") == 0) {
/* binary string */
av[i] = Tcl_NewByteArrayObj(s, RSTRING(v)->len);
} else if (strlen(s) != RSTRING(v)->len) {
/* probably binary string */
av[i] = Tcl_NewByteArrayObj(s, RSTRING(v)->len);
} else {
/* probably text string */
av[i] = Tcl_NewStringObj(s, RSTRING(v)->len);
}
# endif
av[i] = get_obj_from_str(argv[i]);
Tcl_IncrRefCount(av[i]);
}
av[argc] = (Tcl_Obj *)NULL;
av[argc] = NULL;
#else /* TCL_MAJOR_VERSION < 8 */
/* string interface */
av = (char **)ALLOC_N(char *, argc+1);
av = ALLOC_N(char *, argc+1);
for (i = 0; i < argc; ++i) {
v = argv[i];
s = StringValuePtr(v);
av[i] = ALLOC_N(char, strlen(s)+1);
strcpy(av[i], s);
av[i] = strdup(StringValuePtr(argv[i]));
}
av[argc] = (char *)NULL;
av[argc] = NULL;
#endif
rb_thread_critical = thr_crit_bup;
@ -7325,8 +7312,6 @@ ip_get_variable2_core(interp, argc, argv)
#if TCL_MAJOR_VERSION >= 8
{
Tcl_Obj *ret;
char *s;
int len;
volatile VALUE strval;
thr_crit_bup = rb_thread_critical;
@ -7354,36 +7339,14 @@ ip_get_variable2_core(interp, argc, argv)
}
Tcl_IncrRefCount(ret);
# if TCL_MAJOR_VERSION == 8 && TCL_MINOR_VERSION == 0
s = Tcl_GetStringFromObj(ret, &len);
strval = rb_tainted_str_new(s, len);
strval = get_str_from_obj(ret);
OBJ_TAINT(strval);
Tcl_DecrRefCount(ret);
/* Tcl_Release(ptr->ip); */
rbtk_release_ip(ptr);
rb_thread_critical = thr_crit_bup;
return(strval);
# else /* TCL_VERSION >= 8.1 */
if (Tcl_GetCharLength(ret)
!= Tcl_UniCharLen(Tcl_GetUnicode(ret))) {
/* possibly binary string */
s = Tcl_GetByteArrayFromObj(ret, &len);
strval = rb_tainted_str_new(s, len);
rb_ivar_set(strval, ID_at_enc, rb_tainted_str_new2("binary"));
} else {
/* possibly text string */
s = Tcl_GetStringFromObj(ret, &len);
strval = rb_tainted_str_new(s, len);
}
Tcl_DecrRefCount(ret);
/* Tcl_Release(ptr->ip); */
rbtk_release_ip(ptr);
rb_thread_critical = thr_crit_bup;
return(strval);
# endif
}
#else /* TCL_MAJOR_VERSION < 8 */
{
@ -7482,36 +7445,12 @@ ip_set_variable2_core(interp, argc, argv)
#if TCL_MAJOR_VERSION >= 8
{
Tcl_Obj *valobj, *ret;
char *s;
int len;
volatile VALUE strval;
thr_crit_bup = rb_thread_critical;
rb_thread_critical = Qtrue;
# if TCL_MAJOR_VERSION == 8 && TCL_MINOR_VERSION == 0
valobj = Tcl_NewStringObj(RSTRING(value)->ptr,
RSTRING(value)->len);
# else /* TCL_VERSION >= 8.1 */
{
VALUE enc = rb_attr_get(value, ID_at_enc);
if (!NIL_P(enc) && strcmp(StringValuePtr(enc), "binary") == 0) {
/* binary string */
valobj = Tcl_NewByteArrayObj(RSTRING(value)->ptr,
RSTRING(value)->len);
} else if (strlen(RSTRING(value)->ptr) != RSTRING(value)->len) {
/* probably binary string */
valobj = Tcl_NewByteArrayObj(RSTRING(value)->ptr,
RSTRING(value)->len);
} else {
/* probably text string */
valobj = Tcl_NewStringObj(RSTRING(value)->ptr,
RSTRING(value)->len);
}
}
# endif
valobj = get_obj_from_str(value);
Tcl_IncrRefCount(valobj);
/* ip is deleted? */
@ -7539,24 +7478,10 @@ ip_set_variable2_core(interp, argc, argv)
}
Tcl_IncrRefCount(ret);
# if TCL_MAJOR_VERSION == 8 && TCL_MINOR_VERSION == 0
s = Tcl_GetStringFromObj(ret, &len);
strval = rb_tainted_str_new(s, len);
# else /* TCL_VERSION >= 8.1 */
if (Tcl_GetCharLength(ret) != Tcl_UniCharLen(Tcl_GetUnicode(ret))) {
/* possibly binary string */
s = Tcl_GetByteArrayFromObj(ret, &len);
strval = rb_tainted_str_new(s, len);
rb_ivar_set(strval, ID_at_enc, rb_str_new2("binary"));
} else {
/* possibly text string */
s = Tcl_GetStringFromObj(ret, &len);
strval = rb_tainted_str_new(s, len);
}
# endif
strval = get_str_from_obj(ret);
OBJ_TAINT(strval);
Tcl_DecrRefCount(ret);
/* Tcl_Release(ptr->ip); */
rbtk_release_ip(ptr);
rb_thread_critical = thr_crit_bup;
@ -7583,11 +7508,8 @@ ip_set_variable2_core(interp, argc, argv)
return rb_exc_new2(rb_eRuntimeError, ptr->ip->result);
}
Tcl_IncrRefCount(ret);
strval = rb_tainted_str_new2(ret);
Tcl_DecrRefCount(ret);
/* Tcl_Release(ptr->ip); */
rbtk_release_ip(ptr);
rb_thread_critical = thr_crit_bup;
@ -7806,39 +7728,7 @@ lib_split_tklist_core(ip_obj, list_str)
Tcl_Obj **objv;
int thr_crit_bup;
# if 1
# if TCL_MAJOR_VERSION == 8 && TCL_MINOR_VERSION == 0
listobj = Tcl_NewStringObj(RSTRING(list_str)->ptr,
RSTRING(list_str)->len);
# else /* TCL_VERSION >= 8.1 */
thr_crit_bup = rb_thread_critical;
rb_thread_critical = Qtrue;
{
VALUE enc = rb_attr_get(list_str, ID_at_enc);
if (!NIL_P(enc) && strcmp(StringValuePtr(enc), "binary") == 0) {
/* binary string */
listobj = Tcl_NewByteArrayObj(RSTRING(list_str)->ptr,
RSTRING(list_str)->len);
} else if (strlen(RSTRING(list_str)->ptr)
!= RSTRING(list_str)->len) {
/* probably binary string */
listobj = Tcl_NewByteArrayObj(RSTRING(list_str)->ptr,
RSTRING(list_str)->len);
} else {
/* probably text string */
listobj = Tcl_NewStringObj(RSTRING(list_str)->ptr,
RSTRING(list_str)->len);
}
}
rb_thread_critical = thr_crit_bup;
# endif
# else
listobj = Tcl_NewStringObj(RSTRING(list_str)->ptr,
RSTRING(list_str)->len);
# endif
listobj = get_obj_from_str(list_str);
Tcl_IncrRefCount(listobj);
@ -7866,31 +7756,7 @@ lib_split_tklist_core(ip_obj, list_str)
old_gc = rb_gc_disable();
for(idx = 0; idx < objc; idx++) {
char *str;
int len;
# if 1
# if TCL_MAJOR_VERSION == 8 && TCL_MINOR_VERSION == 0
str = Tcl_GetStringFromObj(objv[idx], &len);
elem = rb_str_new(str, len);
# else /* TCL_VERSION >= 8.1 */
if (Tcl_GetCharLength(objv[idx])
!= Tcl_UniCharLen(Tcl_GetUnicode(objv[idx]))) {
/* possibly binary string */
str = Tcl_GetByteArrayFromObj(objv[idx], &len);
elem = rb_str_new(str, len);
rb_ivar_set(elem, ID_at_enc, rb_tainted_str_new2("binary"));
} else {
/* possibly text string */
str = Tcl_GetStringFromObj(objv[idx], &len);
elem = rb_str_new(str, len);
}
# endif
# else
str = Tcl_GetStringFromObj(objv[idx], &len);
elem = rb_str_new(str, len);
# endif
elem = get_str_from_obj(objv[idx]);
if (taint_flag) OBJ_TAINT(elem);
RARRAY(ary)->ptr[idx] = elem;
}