&(p1)
click to toggle source
static VALUE
bdb_sary_and(VALUE obj, VALUE y)
{
return rb_funcall(bdb_sary_to_a(obj), rb_intern("&"), 1, y);
}
*(p1)
click to toggle source
static VALUE
bdb_sary_times(VALUE obj, VALUE y)
{
return rb_funcall(bdb_sary_to_a(obj), rb_intern("*"), 1, y);
}
+(p1)
click to toggle source
static VALUE
bdb_sary_plus(VALUE obj, VALUE y)
{
return rb_ary_plus(bdb_sary_to_a(obj), y);
}
-(p1)
click to toggle source
static VALUE
bdb_sary_diff(VALUE obj, VALUE y)
{
return rb_funcall(bdb_sary_to_a(obj), rb_intern("-"), 1, y);
}
<<(p1)
click to toggle source
static VALUE
bdb_sary_push(VALUE obj, VALUE y)
{
bdb_DB *dbst;
VALUE tmp[2];
GetDB(obj, dbst);
tmp[0] = INT2NUM(dbst->len);
tmp[1] = y;
bdb_put(2, tmp, obj);
dbst->len++;
return obj;
}
<=>(p1)
click to toggle source
static VALUE
bdb_sary_cmp(VALUE obj, VALUE obj2)
{
bdb_DB *dbst, *dbst2 = 0;
VALUE a, a2, tmp, ary;
long i, len;
if (obj == obj2) return INT2FIX(0);
GetDB(obj, dbst);
len = dbst->len;
if (!rb_obj_is_kind_of(obj2, bdb_cRecnum)) {
obj2 = rb_convert_type(obj2, T_ARRAY, "Array", "to_ary");
if (len > RARRAY_LEN(obj2)) {
len = RARRAY_LEN(obj2);
}
ary = Qtrue;
}
else {
GetDB(obj2, dbst2);
len = dbst->len;
if (len > dbst2->len) {
len = dbst2->len;
}
ary = Qfalse;
}
for (i = 0; i < len; i++) {
tmp = INT2NUM(i);
a = bdb_get(1, &tmp, obj);
if (ary) {
a2 = RARRAY_PTR(obj2)[i];
}
else {
a2 = bdb_get(1, &tmp, obj2);
}
tmp = rb_funcall(a, id_cmp, 1, a2);
if (tmp != INT2FIX(0)) {
return tmp;
}
}
len = dbst->len - ary?RARRAY_LEN(obj2):dbst2->len;
if (len == 0) return INT2FIX(0);
if (len > 0) return INT2FIX(1);
return INT2FIX(-1);
}
[](p1, p2 = v2)
click to toggle source
static VALUE
bdb_sary_aref(int argc, VALUE *argv, VALUE obj)
{
VALUE arg1, arg2;
long beg, len;
bdb_DB *dbst;
GetDB(obj, dbst);
if (rb_scan_args(argc, argv, "11", &arg1, &arg2) == 2) {
beg = NUM2LONG(arg1);
len = NUM2LONG(arg2);
if (beg < 0) {
beg = dbst->len + beg;
}
return bdb_sary_subseq(obj, beg, len);
}
if (FIXNUM_P(arg1)) {
return bdb_sary_entry(obj, arg1);
}
else if (TYPE(arg1) == T_BIGNUM) {
rb_raise(rb_eIndexError, "index too big");
}
else {
switch (rb_range_beg_len(arg1, &beg, &len, dbst->len, 0)) {
case Qfalse:
break;
case Qnil:
return Qnil;
default:
return bdb_sary_subseq(obj, beg, len);
}
}
return bdb_sary_entry(obj, arg1);
}
[]=(*args)
click to toggle source
static VALUE
bdb_sary_aset(int argc, VALUE *argv, VALUE obj)
{
long beg, len;
bdb_DB *dbst;
GetDB(obj, dbst);
if (argc == 3) {
bdb_sary_replace(obj, NUM2LONG(argv[0]), NUM2LONG(argv[1]), argv[2]);
return argv[2];
}
if (argc != 2) {
rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)", argc);
}
if (FIXNUM_P(argv[0])) {
beg = FIX2LONG(argv[0]);
goto fixnum;
}
else if (rb_range_beg_len(argv[0], &beg, &len, dbst->len, 1)) {
bdb_sary_replace(obj, beg, len, argv[1]);
return argv[1];
}
if (TYPE(argv[0]) == T_BIGNUM) {
rb_raise(rb_eIndexError, "index too big");
}
beg = NUM2LONG(argv[0]);
fixnum:
if (beg < 0) {
beg += dbst->len;
if (beg < 0) {
rb_raise(rb_eIndexError, "index %ld out of array",
beg - dbst->len);
}
}
if (beg > dbst->len) {
VALUE nargv[2];
int i;
nargv[1] = Qnil;
for (i = dbst->len; i < beg; i++) {
nargv[0] = INT2NUM(i);
bdb_put(2, nargv, obj);
dbst->len++;
}
}
argv[0] = INT2NUM(beg);
bdb_put(2, argv, obj);
dbst->len++;
return argv[1];
}
at(p1)
click to toggle source
static VALUE
bdb_sary_at(VALUE obj, VALUE pos)
{
return bdb_sary_entry(obj, pos);
}
clear(*args)
click to toggle source
static VALUE
bdb_sary_clear(int argc, VALUE *argv, VALUE obj)
{
bdb_DB *dbst;
VALUE g;
int flags = 0;
if (argc && TYPE(argv[argc - 1]) == T_HASH) {
VALUE f = argv[argc - 1];
if ((g = rb_hash_aref(f, rb_intern("flags"))) != RHASH(f)->ifnone ||
(g = rb_hash_aref(f, rb_str_new2("flags"))) != RHASH(f)->ifnone) {
flags = NUM2INT(g);
}
argc--;
}
if (argc == 1) {
flags = NUM2INT(argv[0]);
}
g = INT2FIX(flags);
bdb_clear(1, &g, obj);
GetDB(obj, dbst);
dbst->len = 0;
return obj;
}
collect(*args)
click to toggle source
static VALUE
bdb_sary_collect(int argc, VALUE *argv, VALUE obj)
{
if (!rb_block_given_p()) {
return bdb_sary_to_a(obj);
}
return bdb_each_kvc(argc, argv, obj, DB_NEXT, rb_ary_new(), BDB_ST_VALUE);
}
collect!(*args)
click to toggle source
static VALUE
bdb_sary_collect_bang(int argc, VALUE *argv, VALUE obj)
{
return bdb_each_kvc(argc, argv, obj, DB_NEXT, Qtrue, BDB_ST_VALUE);
}
compact()
click to toggle source
static VALUE
bdb_sary_compact(VALUE obj)
{
return rb_funcall(bdb_sary_to_a(obj), rb_intern("compact!"), 0, 0);
}
compact!()
click to toggle source
static VALUE
bdb_sary_compact_bang(VALUE obj)
{
bdb_DB *dbst;
long i, j;
VALUE tmp;
GetDB(obj, dbst);
j = dbst->len;
for (i = 0; i < dbst->len; ) {
tmp = INT2NUM(i);
tmp = bdb_get(1, &tmp, obj);
if (NIL_P(tmp)) {
bdb_del(obj, INT2NUM(i));
dbst->len--;
}
else {
i++;
}
}
if (dbst->len == j) return Qnil;
return obj;
}
concat(p1)
click to toggle source
static VALUE
bdb_sary_concat(VALUE obj, VALUE y)
{
bdb_DB *dbst;
long i;
VALUE tmp[2];
y = rb_convert_type(y, T_ARRAY, "Array", "to_ary");
GetDB(obj, dbst);
for (i = 0; i < RARRAY_LEN(y); i++) {
tmp[0] = INT2NUM(dbst->len);
tmp[1] = RARRAY_PTR(y)[i];
bdb_put(2, tmp, obj);
dbst->len++;
}
return obj;
}
db_get(p1, p2 = v2)
click to toggle source
static VALUE
bdb_sary_aref(int argc, VALUE *argv, VALUE obj)
{
VALUE arg1, arg2;
long beg, len;
bdb_DB *dbst;
GetDB(obj, dbst);
if (rb_scan_args(argc, argv, "11", &arg1, &arg2) == 2) {
beg = NUM2LONG(arg1);
len = NUM2LONG(arg2);
if (beg < 0) {
beg = dbst->len + beg;
}
return bdb_sary_subseq(obj, beg, len);
}
if (FIXNUM_P(arg1)) {
return bdb_sary_entry(obj, arg1);
}
else if (TYPE(arg1) == T_BIGNUM) {
rb_raise(rb_eIndexError, "index too big");
}
else {
switch (rb_range_beg_len(arg1, &beg, &len, dbst->len, 0)) {
case Qfalse:
break;
case Qnil:
return Qnil;
default:
return bdb_sary_subseq(obj, beg, len);
}
}
return bdb_sary_entry(obj, arg1);
}
db_put(*args)
click to toggle source
static VALUE
bdb_sary_aset(int argc, VALUE *argv, VALUE obj)
{
long beg, len;
bdb_DB *dbst;
GetDB(obj, dbst);
if (argc == 3) {
bdb_sary_replace(obj, NUM2LONG(argv[0]), NUM2LONG(argv[1]), argv[2]);
return argv[2];
}
if (argc != 2) {
rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)", argc);
}
if (FIXNUM_P(argv[0])) {
beg = FIX2LONG(argv[0]);
goto fixnum;
}
else if (rb_range_beg_len(argv[0], &beg, &len, dbst->len, 1)) {
bdb_sary_replace(obj, beg, len, argv[1]);
return argv[1];
}
if (TYPE(argv[0]) == T_BIGNUM) {
rb_raise(rb_eIndexError, "index too big");
}
beg = NUM2LONG(argv[0]);
fixnum:
if (beg < 0) {
beg += dbst->len;
if (beg < 0) {
rb_raise(rb_eIndexError, "index %ld out of array",
beg - dbst->len);
}
}
if (beg > dbst->len) {
VALUE nargv[2];
int i;
nargv[1] = Qnil;
for (i = dbst->len; i < beg; i++) {
nargv[0] = INT2NUM(i);
bdb_put(2, nargv, obj);
dbst->len++;
}
}
argv[0] = INT2NUM(beg);
bdb_put(2, argv, obj);
dbst->len++;
return argv[1];
}
delete(p1)
click to toggle source
static VALUE
bdb_sary_delete(VALUE obj, VALUE item)
{
bdb_DB *dbst;
long i1, i2;
VALUE tmp, a;
GetDB(obj, dbst);
i2 = dbst->len;
for (i1 = 0; i1 < dbst->len;) {
tmp = INT2NUM(i1);
a = bdb_get(1, &tmp, obj);
if (rb_equal(a, item)) {
bdb_del(obj, INT2NUM(i1));
dbst->len--;
}
else {
i1++;
}
}
if (dbst->len == i2) {
if (rb_block_given_p()) {
return rb_yield(item);
}
return Qnil;
}
return item;
}
delete_at(p1)
click to toggle source
static VALUE
bdb_sary_delete_at_m(VALUE obj, VALUE a)
{
bdb_DB *dbst;
long pos;
VALUE tmp;
VALUE del = Qnil;
GetDB(obj, dbst);
pos = NUM2INT(a);
if (pos >= dbst->len) return Qnil;
if (pos < 0) pos += dbst->len;
if (pos < 0) return Qnil;
tmp = INT2NUM(pos);
del = bdb_get(1, &tmp, obj);
bdb_del(obj, tmp);
dbst->len--;
return del;
}
delete_if()
click to toggle source
static VALUE
bdb_sary_delete_if(VALUE obj)
{
bdb_sary_reject_bang(obj);
return obj;
}
empty?()
click to toggle source
static VALUE
bdb_sary_empty_p(VALUE obj)
{
bdb_DB *dbst;
GetDB(obj, dbst);
if (dbst->len < 0) rb_raise(bdb_eFatal, "Invalid BDB::Recnum");
return (dbst->len)?Qfalse:Qtrue;
}
fetch(p1, p2 = v2)
click to toggle source
static VALUE
bdb_sary_fetch(int argc, VALUE *argv, VALUE obj)
{
VALUE pos, ifnone;
bdb_DB *dbst;
long idx;
GetDB(obj, dbst);
rb_scan_args(argc, argv, "11", &pos, &ifnone);
idx = NUM2LONG(pos);
if (idx < 0) {
idx += dbst->len;
}
if (idx < 0 || dbst->len <= idx) {
return ifnone;
}
pos = INT2NUM(idx);
return bdb_get(1, &pos, obj);
}
fill(p1, p2 = v2, p3 = v3)
click to toggle source
static VALUE
bdb_sary_fill(int argc, VALUE *argv, VALUE obj)
{
VALUE item, arg1, arg2, tmp[2];
long beg, len, i;
bdb_DB *dbst;
GetDB(obj, dbst);
rb_scan_args(argc, argv, "12", &item, &arg1, &arg2);
switch (argc) {
case 1:
len = dbst->len;
beg = 0;
break;
case 2:
if (rb_range_beg_len(arg1, &beg, &len, dbst->len, 1)) {
break;
}
/* fall through */
case 3:
beg = NIL_P(arg1)?0:NUM2LONG(arg1);
if (beg < 0) {
beg += dbst->len;
if (beg < 0) beg = 0;
}
len = NIL_P(arg2)?dbst->len - beg:NUM2LONG(arg2);
break;
}
tmp[1] = item;
for (i = 0; i < len; i++) {
tmp[0] = INT2NUM(i + beg);
bdb_put(2, tmp, obj);
if ((i + beg) >= dbst->len) dbst->len++;
}
return obj;
}
filter(*args)
click to toggle source
static VALUE
bdb_sary_filter(int argc, VALUE *argv, VALUE obj)
{
rb_warn("BDB::Recnum#filter is deprecated; use BDB::Recnum#collect!");
return bdb_sary_collect_bang(argc, argv, obj);
}
first()
click to toggle source
static VALUE
bdb_sary_first(VALUE obj)
{
bdb_DB *dbst;
VALUE tmp;
GetDB(obj, dbst);
tmp = INT2NUM(0);
return bdb_get(1, &tmp, obj);
}
get(p1, p2 = v2)
click to toggle source
static VALUE
bdb_sary_aref(int argc, VALUE *argv, VALUE obj)
{
VALUE arg1, arg2;
long beg, len;
bdb_DB *dbst;
GetDB(obj, dbst);
if (rb_scan_args(argc, argv, "11", &arg1, &arg2) == 2) {
beg = NUM2LONG(arg1);
len = NUM2LONG(arg2);
if (beg < 0) {
beg = dbst->len + beg;
}
return bdb_sary_subseq(obj, beg, len);
}
if (FIXNUM_P(arg1)) {
return bdb_sary_entry(obj, arg1);
}
else if (TYPE(arg1) == T_BIGNUM) {
rb_raise(rb_eIndexError, "index too big");
}
else {
switch (rb_range_beg_len(arg1, &beg, &len, dbst->len, 0)) {
case Qfalse:
break;
case Qnil:
return Qnil;
default:
return bdb_sary_subseq(obj, beg, len);
}
}
return bdb_sary_entry(obj, arg1);
}
indexes(*args)
click to toggle source
static VALUE
bdb_sary_indexes(int argc, VALUE *argv, VALUE obj)
{
#if HAVE_RB_ARY_VALUES_AT
rb_warn("Recnum#%s is deprecated; use Recnum#values_at",
#if HAVE_RB_FRAME_THIS_FUNC
rb_id2name(rb_frame_this_func()));
#else
rb_id2name(rb_frame_last_func()));
#endif
#endif
return bdb_sary_values_at(argc, argv, obj);
}
indices(*args)
click to toggle source
static VALUE
bdb_sary_indexes(int argc, VALUE *argv, VALUE obj)
{
#if HAVE_RB_ARY_VALUES_AT
rb_warn("Recnum#%s is deprecated; use Recnum#values_at",
#if HAVE_RB_FRAME_THIS_FUNC
rb_id2name(rb_frame_this_func()));
#else
rb_id2name(rb_frame_last_func()));
#endif
#endif
return bdb_sary_values_at(argc, argv, obj);
}
insert(*args)
click to toggle source
static VALUE
bdb_sary_insert(int argc, VALUE *argv, VALUE obj)
{
long pos;
if (argc < 2) {
rb_raise(rb_eArgError, "wrong number of arguments(at least 2)");
}
pos = NUM2LONG(argv[0]);
if (pos == -1) {
bdb_DB *dbst;
GetDB(obj, dbst);
pos = dbst->len;
}
else if (pos < 0) {
pos++;
}
bdb_sary_replace(obj, pos, 0, rb_ary_new4(argc-1, argv+1));
return obj;
}
last()
click to toggle source
static VALUE
bdb_sary_last(VALUE obj)
{
bdb_DB *dbst;
VALUE tmp;
GetDB(obj, dbst);
if (!dbst->len) return Qnil;
tmp = INT2NUM(dbst->len);
return bdb_get(1, &tmp, obj);
}
length()
click to toggle source
static VALUE
bdb_sary_length(VALUE obj)
{
bdb_DB *dbst;
GetDB(obj, dbst);
if (dbst->len < 0) rb_raise(bdb_eFatal, "Invalid BDB::Recnum");
return INT2NUM(dbst->len);
}
map()
click to toggle source
static VALUE
bdb_sary_collect(int argc, VALUE *argv, VALUE obj)
{
if (!rb_block_given_p()) {
return bdb_sary_to_a(obj);
}
return bdb_each_kvc(argc, argv, obj, DB_NEXT, rb_ary_new(), BDB_ST_VALUE);
}
map!(*args)
click to toggle source
static VALUE
bdb_sary_collect_bang(int argc, VALUE *argv, VALUE obj)
{
return bdb_each_kvc(argc, argv, obj, DB_NEXT, Qtrue, BDB_ST_VALUE);
}
nitems()
click to toggle source
static VALUE
bdb_sary_nitems(VALUE obj)
{
bdb_DB *dbst;
long i, j;
VALUE tmp;
GetDB(obj, dbst);
j = 0;
for (i = 0; i < dbst->len; ) {
tmp = INT2NUM(i);
tmp = bdb_get(1, &tmp, obj);
if (!NIL_P(tmp)) j++;
}
return INT2NUM(j);
}
pop()
click to toggle source
static VALUE
bdb_sary_pop(VALUE obj)
{
VALUE res;
bdb_DB *dbst;
GetDB(obj, dbst);
if (dbst->len == 0) return Qnil;
res = bdb_intern_shift_pop(obj, DB_LAST, 1);
return res;
}
push(*args)
click to toggle source
static VALUE
bdb_sary_push_m(int argc, VALUE *argv, VALUE obj)
{
bdb_DB *dbst;
long i;
VALUE tmp[2];
if (argc == 0) {
rb_raise(rb_eArgError, "wrong # of arguments(at least 1)");
}
if (argc > 0) {
GetDB(obj, dbst);
for (i = 0; i < argc; i++) {
tmp[0] = INT2NUM(dbst->len);
tmp[1] = argv[i];
bdb_put(2, tmp, obj);
dbst->len++;
}
}
return obj;
}
put(*args)
click to toggle source
static VALUE
bdb_sary_aset(int argc, VALUE *argv, VALUE obj)
{
long beg, len;
bdb_DB *dbst;
GetDB(obj, dbst);
if (argc == 3) {
bdb_sary_replace(obj, NUM2LONG(argv[0]), NUM2LONG(argv[1]), argv[2]);
return argv[2];
}
if (argc != 2) {
rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)", argc);
}
if (FIXNUM_P(argv[0])) {
beg = FIX2LONG(argv[0]);
goto fixnum;
}
else if (rb_range_beg_len(argv[0], &beg, &len, dbst->len, 1)) {
bdb_sary_replace(obj, beg, len, argv[1]);
return argv[1];
}
if (TYPE(argv[0]) == T_BIGNUM) {
rb_raise(rb_eIndexError, "index too big");
}
beg = NUM2LONG(argv[0]);
fixnum:
if (beg < 0) {
beg += dbst->len;
if (beg < 0) {
rb_raise(rb_eIndexError, "index %ld out of array",
beg - dbst->len);
}
}
if (beg > dbst->len) {
VALUE nargv[2];
int i;
nargv[1] = Qnil;
for (i = dbst->len; i < beg; i++) {
nargv[0] = INT2NUM(i);
bdb_put(2, nargv, obj);
dbst->len++;
}
}
argv[0] = INT2NUM(beg);
bdb_put(2, argv, obj);
dbst->len++;
return argv[1];
}
reject!()
click to toggle source
static VALUE
bdb_sary_reject_bang(VALUE obj)
{
bdb_DB *dbst;
long i1, i2;
VALUE tmp, a;
GetDB(obj, dbst);
i2 = dbst->len;
for (i1 = 0; i1 < dbst->len;) {
tmp = INT2NUM(i1);
a = bdb_get(1, &tmp, obj);
if (!RTEST(rb_yield(a))) {
i1++;
continue;
}
bdb_del(obj, tmp);
dbst->len--;
}
if (dbst->len == i2) return Qnil;
return obj;
}
replace(p1)
click to toggle source
static VALUE
bdb_sary_replace_m(VALUE obj, VALUE obj2)
{
bdb_DB *dbst;
GetDB(obj, dbst);
obj2 = rb_convert_type(obj2, T_ARRAY, "Array", "to_ary");
bdb_sary_replace(obj, 0, dbst->len, obj2);
return obj;
}
reverse()
click to toggle source
static VALUE
bdb_sary_reverse_m(VALUE obj)
{
return bdb_to_type(obj, rb_ary_new(), Qnil);
}
reverse!()
click to toggle source
static VALUE
bdb_sary_reverse_bang(VALUE obj)
{
long i, j;
bdb_DB *dbst;
VALUE tmp[2], interm;
GetDB(obj, dbst);
if (dbst->len <= 1) return obj;
i = 0;
j = dbst->len - 1;
while (i < j) {
tmp[0] = INT2NUM(i);
interm = bdb_get(1, tmp, obj);
tmp[0] = INT2NUM(j);
tmp[1] = bdb_get(1, tmp, obj);
tmp[0] = INT2NUM(i);
bdb_put(2, tmp, obj);
tmp[0] = INT2NUM(j);
tmp[1] = interm;
bdb_put(2, tmp, obj);
i++; j--;
}
return obj;
}
rindex(p1)
click to toggle source
static VALUE
bdb_sary_rindex(VALUE obj, VALUE a)
{
return bdb_internal_value(obj, a, Qtrue, DB_PREV);
}
select(*args)
click to toggle source
static VALUE
bdb_sary_select(int argc, VALUE *argv, VALUE obj)
{
VALUE result;
long i;
if (rb_block_given_p()) {
if (argc > 0) {
rb_raise(rb_eArgError, "wrong number arguments(%d for 0)", argc);
}
return bdb_each_kvc(argc, argv, obj, DB_NEXT, rb_ary_new(), BDB_ST_SELECT);
}
#if HAVE_RB_ARY_VALUES_AT
rb_warn("Recnum#select(index..) is deprecated; use Recnum#values_at");
#endif
result = rb_ary_new();
for (i = 0; i < argc; i++) {
rb_ary_push(result, bdb_sary_fetch(1, argv + i, obj));
}
return result;
}
shift()
click to toggle source
static VALUE
bdb_sary_shift(VALUE obj)
{
VALUE res;
bdb_DB *dbst;
GetDB(obj, dbst);
if (dbst->len == 0) return Qnil;
res = bdb_intern_shift_pop(obj, DB_FIRST, 1);
return res;
}
slice(p1, p2 = v2)
click to toggle source
static VALUE
bdb_sary_aref(int argc, VALUE *argv, VALUE obj)
{
VALUE arg1, arg2;
long beg, len;
bdb_DB *dbst;
GetDB(obj, dbst);
if (rb_scan_args(argc, argv, "11", &arg1, &arg2) == 2) {
beg = NUM2LONG(arg1);
len = NUM2LONG(arg2);
if (beg < 0) {
beg = dbst->len + beg;
}
return bdb_sary_subseq(obj, beg, len);
}
if (FIXNUM_P(arg1)) {
return bdb_sary_entry(obj, arg1);
}
else if (TYPE(arg1) == T_BIGNUM) {
rb_raise(rb_eIndexError, "index too big");
}
else {
switch (rb_range_beg_len(arg1, &beg, &len, dbst->len, 0)) {
case Qfalse:
break;
case Qnil:
return Qnil;
default:
return bdb_sary_subseq(obj, beg, len);
}
}
return bdb_sary_entry(obj, arg1);
}
slice!(p1, p2 = v2)
click to toggle source
static VALUE
bdb_sary_slice_bang(int argc, VALUE *argv, VALUE obj)
{
VALUE arg1, arg2;
long pos, len;
bdb_DB *dbst;
GetDB(obj, dbst);
if (rb_scan_args(argc, argv, "11", &arg1, &arg2) == 2) {
pos = NUM2LONG(arg1);
len = NUM2LONG(arg2);
delete_pos_len:
if (pos < 0) {
pos = dbst->len + pos;
}
arg2 = bdb_sary_subseq(obj, pos, len);
bdb_sary_replace(obj, pos, len, Qnil);
return arg2;
}
if (!FIXNUM_P(arg1) && rb_range_beg_len(arg1, &pos, &len, dbst->len, 1)) {
goto delete_pos_len;
}
pos = NUM2LONG(arg1);
if (pos >= dbst->len) return Qnil;
if (pos < 0) pos += dbst->len;
if (pos < 0) return Qnil;
arg1 = INT2NUM(pos);
arg2 = bdb_sary_at(obj, arg1);
if (bdb_del(obj, arg1) != Qnil) dbst->len--;
return arg2;
}
store(*args)
click to toggle source
static VALUE
bdb_sary_aset(int argc, VALUE *argv, VALUE obj)
{
long beg, len;
bdb_DB *dbst;
GetDB(obj, dbst);
if (argc == 3) {
bdb_sary_replace(obj, NUM2LONG(argv[0]), NUM2LONG(argv[1]), argv[2]);
return argv[2];
}
if (argc != 2) {
rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)", argc);
}
if (FIXNUM_P(argv[0])) {
beg = FIX2LONG(argv[0]);
goto fixnum;
}
else if (rb_range_beg_len(argv[0], &beg, &len, dbst->len, 1)) {
bdb_sary_replace(obj, beg, len, argv[1]);
return argv[1];
}
if (TYPE(argv[0]) == T_BIGNUM) {
rb_raise(rb_eIndexError, "index too big");
}
beg = NUM2LONG(argv[0]);
fixnum:
if (beg < 0) {
beg += dbst->len;
if (beg < 0) {
rb_raise(rb_eIndexError, "index %ld out of array",
beg - dbst->len);
}
}
if (beg > dbst->len) {
VALUE nargv[2];
int i;
nargv[1] = Qnil;
for (i = dbst->len; i < beg; i++) {
nargv[0] = INT2NUM(i);
bdb_put(2, nargv, obj);
dbst->len++;
}
}
argv[0] = INT2NUM(beg);
bdb_put(2, argv, obj);
dbst->len++;
return argv[1];
}
to_a()
click to toggle source
static VALUE
bdb_sary_to_a(VALUE obj)
{
return bdb_to_type(obj, rb_ary_new(), Qfalse);
}
to_ary()
click to toggle source
static VALUE
bdb_sary_to_a(VALUE obj)
{
return bdb_to_type(obj, rb_ary_new(), Qfalse);
}
unshift(*args)
click to toggle source
static VALUE
bdb_sary_unshift_m(int argc, VALUE *argv, VALUE obj)
{
bdb_DB *dbst;
VALUE tmp[2];
long i;
if (argc == 0) {
rb_raise(rb_eArgError, "wrong # of arguments(at least 1)");
}
if (argc > 0) {
/* ++ */
GetDB(obj, dbst);
for (i = dbst->len - 1; i >= 0; i++) {
tmp[0] = INT2NUM(i);
tmp[1] = bdb_get(1, tmp, obj);
tmp[0] = INT2NUM(i + argc);
bdb_put(2, tmp, obj);
}
for (i = 0; i < argc; i++) {
tmp[0] = INT2NUM(i);
tmp[1] = argv[i];
bdb_put(2, tmp, obj);
dbst->len++;
}
}
return obj;
}
values_at(*args)
click to toggle source
static VALUE
bdb_sary_values_at(int argc, VALUE *argv, VALUE obj)
{
VALUE result;
long i;
result = rb_ary_new();
for (i = 0; i < argc; i++) {
rb_ary_push(result, bdb_sary_fetch(1, argv + i, obj));
}
return result;
}
|(p1)
click to toggle source
static VALUE
bdb_sary_or(VALUE obj, VALUE y)
{
return rb_funcall(bdb_sary_to_a(obj), rb_intern("|"), 1, y);
}