Class: Array

Inherits:
Object
  • Object
show all
Defined in:
(unknown)

Instance Method Summary collapse

Instance Method Details

#bencodeObject

Array#bencode



82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# File 'ext/b_encode/b_encode.c', line 82

static VALUE
rb_ary_bencode(VALUE ary) {
    long len = RARRAY_LEN(ary);
    VALUE b_entries[len];

    int total_len = 0;
    ID bencode_method_sym = rb_intern("bencode");
    for (int i = 0; i < len; i++) {
        VALUE val      = rb_ary_entry(ary, i);
        VALUE bencoded = rb_funcall(val, bencode_method_sym, 0);
        total_len      += RSTRING_LEN(bencoded);
        b_entries[i]   = bencoded;
    }

    // "l"<contents>"e"
    VALUE str = rb_str_new(NULL, total_len + 2);
    char *ptr = RSTRING_PTR(str);

    ptr[0] = 'l';
    
    int offset = 1;
    for (int i = 0; i < len; i++) {
        VALUE entry = b_entries[i];
        int e_len   = RSTRING_LEN(entry);
        memcpy(ptr + offset, RSTRING_PTR(entry), e_len);
        offset += e_len;
    }
    
    ptr[total_len + 1] = 'e';

    return str;
}