* include/ruby/intern.h, sprintf.c (rb_str_catf, rb_str_vcatf): new

functions.  [ruby-dev:35597]

* string.c (rb_str_capacity): new function to return the capacity.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@18156 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2008-07-22 07:48:00 +00:00
parent e4d911fa98
commit 70b317b9da
6 changed files with 114 additions and 38 deletions

View File

@ -1,3 +1,10 @@
Tue Jul 22 16:47:57 2008 Nobuyoshi Nakada <nobu@ruby-lang.org>
* include/ruby/intern.h, sprintf.c (rb_str_catf, rb_str_vcatf): new
functions. [ruby-dev:35597]
* string.c (rb_str_capacity): new function to return the capacity.
Tue Jul 22 16:08:58 2008 NAKAMURA Usaku <usa@ruby-lang.org> Tue Jul 22 16:08:58 2008 NAKAMURA Usaku <usa@ruby-lang.org>
* ext/socket/socket.c (connect_blocking, socks_connect_blocking, * ext/socket/socket.c (connect_blocking, socks_connect_blocking,

View File

@ -185,20 +185,28 @@ listed below:
Creates a new tainted Ruby string from a C string. Creates a new tainted Ruby string from a C string.
rb_str_cat(VALUE str, const char *ptr, long len)
Appends len bytes of data from ptr to the Ruby string.
rb_sprintf(const char *format, ...) rb_sprintf(const char *format, ...)
rb_vsprintf(const char *format, va_list ap) rb_vsprintf(const char *format, va_list ap)
Creates a new Ruby string with printf(3) format. Creates a new Ruby string with printf(3) format.
rb_str_cat(VALUE str, const char *ptr, long len)
Appends len bytes of data from ptr to the Ruby string.
rb_str_cat2(VALUE str, const char* ptr) rb_str_cat2(VALUE str, const char* ptr)
Appends C string ptr to Ruby string str. This function is Appends C string ptr to Ruby string str. This function is
equivalent to rb_str_cat(str, ptr, strlen(ptr)). equivalent to rb_str_cat(str, ptr, strlen(ptr)).
rb_str_catf(VALUE str, const char* format, ...)
rb_str_vcatf(VALUE str, const char* format, va_list ap)
Appends C string format and successive arguments to Ruby string
str according to a printf-like format. These functions are
equivalent to rb_str_cat2(str, rb_sprintf(format, ...)) and
rb_str_cat2(str, rb_vsprintf(format, ap)), respectively.
Array functions Array functions
rb_ary_new() rb_ary_new()

View File

@ -107,25 +107,25 @@ FIXNUM
タを整数に変換する「NUM2INT()」というマクロがあります.この タを整数に変換する「NUM2INT()」というマクロがあります.この
マクロはデータタイプのチェック無しで使えます(整数に変換でき マクロはデータタイプのチェック無しで使えます(整数に変換でき
ない場合には例外が発生する).同様にチェック無しで使える変換 ない場合には例外が発生する).同様にチェック無しで使える変換
マクロはdoubleを取り出す「NUM2DBL()」があります マクロはdoubleを取り出す「NUM2DBL()」があります
char* を取り出す場合version 1.6 以前では「STR2CSTR()」とい char* を取り出す場合version 1.6 以前では「STR2CSTR()」とい
うマクロを使っていましたがこれは to_str() による暗黙の型変 うマクロを使っていましたがこれは to_str() による暗黙の型変
換結果が GC される可能性があるためversion 1.7 以降では 換結果が GC される可能性があるためversion 1.7 以降では
obsolete となり代わりに StringValue() と StringValuePtr() obsolete となり代わりに StringValue() と StringValuePtr()
を使う事を推奨していますStringValue(var) は var が String を使う事を推奨していますStringValue(var) は var が String
であれば何もせずそうでなければ var を var.to_str() の結果 であれば何もせずそうでなければ var を var.to_str() の結果
に置き換えるマクロStringValuePtr(var) は同様に var を に置き換えるマクロStringValuePtr(var) は同様に var を
String に置き換えてから var のバイト列表現に対する char* を String に置き換えてから var のバイト列表現に対する char* を
返すマクロです。var の内容を直接置き換える処理が入るので、 返すマクロですvar の内容を直接置き換える処理が入るので,
var は lvalue である必要があります var は lvalue である必要があります
またStringValuePtr() に類似した StringValueCStr() というマ またStringValuePtr() に類似した StringValueCStr() というマ
クロもありますStringValueCStr(var) は var を String に置き クロもありますStringValueCStr(var) は var を String に置き
換えてから var の文字列表現に対する char* を返します返され 換えてから var の文字列表現に対する char* を返します返され
る文字列の末尾には nul 文字が付加されます。なお、途中に nul る文字列の末尾には nul 文字が付加されます.なお,途中に nul
文字が含まれる場合は ArgumentError が発生します 文字が含まれる場合は ArgumentError が発生します
一方、StringValuePtr() では、末尾に nul 文字がある保証はなく、 一方StringValuePtr() では,末尾に nul 文字がある保証はなく,
途中に nul 文字が含まれている可能性もあります 途中に nul 文字が含まれている可能性もあります
それ以外のデータタイプは対応するCの構造体があります対応す それ以外のデータタイプは対応するCの構造体があります対応す
る構造体のあるVALUEはそのままキャスト(型変換)すれば構造体の る構造体のあるVALUEはそのままキャスト(型変換)すれば構造体の
@ -138,7 +138,7 @@ var
ruby.hでは構造体へキャストするマクロも「RXXXXX()」(全部大文 ruby.hでは構造体へキャストするマクロも「RXXXXX()」(全部大文
字にしたもの)という名前で提供されています(例: RSTRING()) 字にしたもの)という名前で提供されています(例: RSTRING())
構造体からデータを取り出すマクロが提供されています文字列 構造体からデータを取り出すマクロが提供されています文字列
strの長さを得るためには「RSTRING_LEN(str)」とし文字列strを strの長さを得るためには「RSTRING_LEN(str)」とし文字列strを
char*として得るためには「RSTRING_PTR(str)」とします.配列の char*として得るためには「RSTRING_PTR(str)」とします.配列の
場合にはそれぞれ「RARRAY_LEN(ary)」「RARRAY_PTR(ary)」と 場合にはそれぞれ「RARRAY_LEN(ary)」「RARRAY_PTR(ary)」と
@ -212,20 +212,29 @@ Ruby
Cの文字列から汚染マークが付加されたRubyの文字列を生成する Cの文字列から汚染マークが付加されたRubyの文字列を生成する
rb_str_cat(VALUE str, const char *ptr, long len)
Rubyの文字列strにlenバイトの文字列ptrを追加する
rb_sprintf(const char *format, ...) rb_sprintf(const char *format, ...)
rb_vsprintf(const char *format, va_list ap) rb_vsprintf(const char *format, va_list ap)
printf(3)のフォーマットにしたがってRubyの文字列を生成する Cの文字列formatと続く引数をprintf(3)のフォーマットにしたがって
整形しRubyの文字列を生成する
rb_str_cat(VALUE str, const char *ptr, long len)
Rubyの文字列strにlenバイトの文字列ptrを追加する
rb_str_cat2(VALUE str, const char* ptr) rb_str_cat2(VALUE str, const char* ptr)
Rubyの文字列strにCの文字列ptrを追加するこの関数の機能は Rubyの文字列strにCの文字列ptrを追加するこの関数の機能は
rb_str_cat(str, ptr, strlen(ptr))と同等である. rb_str_cat(str, ptr, strlen(ptr))と同等である.
rb_str_catf(VALUE str, const char* format, ...)
rb_str_vcatf(VALUE str, const char* format, va_list ap)
Cの文字列formatと続く引数をprintf(3)のフォーマットにしたがって
整形しRubyの文字列strに追加するこの関数の機能はそれぞれ
rb_str_cat2(str, rb_sprintf(format, ...)) や
rb_str_cat2(str, rb_vsprintf(format, ap)) と同等である.
配列に対する関数 配列に対する関数
rb_ary_new() rb_ary_new()
@ -348,20 +357,20 @@ private
void rb_define_global_function(const char *name, VALUE (*func)(), int argc) void rb_define_global_function(const char *name, VALUE (*func)(), int argc)
メソッドの別名を定義するための関数は以下の通りです メソッドの別名を定義するための関数は以下の通りです
void rb_define_alias(VALUE module, const char* new, const char* old); void rb_define_alias(VALUE module, const char* new, const char* old);
クラスメソッドallocateを定義したり削除したりするための関数は クラスメソッドallocateを定義したり削除したりするための関数は
以下の通りです 以下の通りです
void rb_define_alloc_func(VALUE klass, VALUE (*func)(VALUE klass)); void rb_define_alloc_func(VALUE klass, VALUE (*func)(VALUE klass));
void rb_undef_alloc_func(VALUE klass); void rb_undef_alloc_func(VALUE klass);
funcはクラスを引数として受け取って新しく割り当てられたイン funcはクラスを引数として受け取って新しく割り当てられたイン
スタンスを返さなくてはなりません。このインスタンスは、外部リ スタンスを返さなくてはなりません.このインスタンスは,外部リ
ソースなどを含まないできるだけ「空」のままにしておいたほう ソースなどを含まないできるだけ「空」のままにしておいたほう
がよいでしょう がよいでしょう
2.1.3 定数定義 2.1.3 定数定義
@ -748,9 +757,9 @@ Makefile
$LDFLAGS: リンク時に追加的に指定するフラグ(-Lなど) $LDFLAGS: リンク時に追加的に指定するフラグ(-Lなど)
$objs: リンクされるオブジェクトファイル名のリスト $objs: リンクされるオブジェクトファイル名のリスト
オブジェクトファイルのリストは通常はソースファイルを検索し オブジェクトファイルのリストは通常はソースファイルを検索し
て自動的に生成されますがmakeの途中でソースを生成するような て自動的に生成されますがmakeの途中でソースを生成するような
場合は明示的に指定する必要があります 場合は明示的に指定する必要があります
ライブラリをコンパイルする条件が揃わず,そのライブラリをコン ライブラリをコンパイルする条件が揃わず,そのライブラリをコン
パイルしない時にはcreate_makefileを呼ばなければMakefileは生 パイルしない時にはcreate_makefileを呼ばなければMakefileは生
@ -778,7 +787,7 @@ Makefile
としてください. としてください.
site_ruby ディレクトリでなく site_ruby ディレクトリでなく
vendor_ruby ディレクトリにインストールする場合には vendor_ruby ディレクトリにインストールする場合には
以下のように --vendor オプションを加えてください. 以下のように --vendor オプションを加えてください.
@ -1075,7 +1084,7 @@ char *rb_class2name(VALUE klass)
int rb_respond_to(VALUE obj, ID id) int rb_respond_to(VALUE obj, ID id)
objがidで示されるメソッドを持つかどうかを返す objがidで示されるメソッドを持つかどうかを返す
** インスタンス変数 ** インスタンス変数

View File

@ -523,6 +523,8 @@ void ruby_default_signal(int);
VALUE rb_f_sprintf(int, const VALUE*); VALUE rb_f_sprintf(int, const VALUE*);
PRINTF_ARGS(VALUE rb_sprintf(const char*, ...), 1, 2); PRINTF_ARGS(VALUE rb_sprintf(const char*, ...), 1, 2);
VALUE rb_vsprintf(const char*, va_list); VALUE rb_vsprintf(const char*, va_list);
PRINTF_ARGS(VALUE rb_str_catf(VALUE, const char*, ...), 2, 3);
VALUE rb_str_vcatf(VALUE, const char*, va_list);
VALUE rb_str_format(int, const VALUE *, VALUE); VALUE rb_str_format(int, const VALUE *, VALUE);
/* string.c */ /* string.c */
VALUE rb_str_new(const char*, long); VALUE rb_str_new(const char*, long);
@ -578,6 +580,7 @@ void rb_str_setter(VALUE, ID, VALUE*);
VALUE rb_str_intern(VALUE); VALUE rb_str_intern(VALUE);
VALUE rb_sym_to_s(VALUE); VALUE rb_sym_to_s(VALUE);
VALUE rb_str_length(VALUE); VALUE rb_str_length(VALUE);
size_t rb_str_capacity(VALUE);
#if defined __GNUC__ #if defined __GNUC__
#define rb_str_new2(str) __extension__ ( \ #define rb_str_new2(str) __extension__ ( \
{ \ { \

View File

@ -1115,3 +1115,38 @@ rb_sprintf(const char *format, ...)
return result; return result;
} }
VALUE
rb_str_vcatf(VALUE str, const char *fmt, va_list ap)
{
rb_printf_buffer f;
VALUE klass;
StringValue(str);
rb_str_modify(str);
f._flags = __SWR | __SSTR;
f._bf._size = 0;
f._w = rb_str_capacity(str);
f._bf._base = (unsigned char *)str;
f._p = (unsigned char *)RSTRING_END(str);
klass = RBASIC(str)->klass;
RBASIC(str)->klass = 0;
f.vwrite = ruby__sfvwrite;
BSD_vfprintf(&f, fmt, ap);
RBASIC(str)->klass = klass;
rb_str_resize(str, (char *)f._p - RSTRING_PTR(str));
return str;
}
VALUE
rb_str_catf(VALUE str, const char *format, ...)
{
va_list ap;
va_start(ap, format);
str = rb_str_vcatf(str, format, ap);
va_end(ap);
return str;
}

View File

@ -343,6 +343,20 @@ str_frozen_check(VALUE s)
} }
} }
size_t
rb_str_capacity(VALUE str)
{
if (STR_EMBED_P(str)) {
return RSTRING_EMBED_LEN_MAX;
}
else if (STR_NOCAPA_P(str)) {
return RSTRING(str)->as.heap.len;
}
else {
return RSTRING(str)->as.heap.aux.capa;
}
}
static inline VALUE static inline VALUE
str_alloc(VALUE klass) str_alloc(VALUE klass)
{ {