count(...)
public
Each other_str parameter defines a set of characters to count. The intersection of these sets defines
the characters to count in str.
Any other_str that starts with a caret (^) is negated. The
sequence c1—c2 means all characters between c1 and c2.
a = "hello world"
a.count "lo"
a.count "lo", "o"
a.count "hello", "^l"
a.count "ej-m"
Show source
/*
* call-seq:
* str.count([other_str]+) => fixnum
*
* Each <i>other_str</i> parameter defines a set of characters to count. The
* intersection of these sets defines the characters to count in
* <i>str</i>. Any <i>other_str</i> that starts with a caret (^) is
* negated. The sequence c1--c2 means all characters between c1 and c2.
*
* a = "hello world"
* a.count "lo"
* a.count "lo", "o"
* a.count "hello", "^l"
* a.count "ej-m"
*/
static VALUE
rb_str_count(argc, argv, str)
int argc;
VALUE *argv;
VALUE str;
{
char table[256];
char *s, *send;
int init = 1;
int i;
if (argc < 1) {
rb_raise(rb_eArgError, "wrong number of arguments");
}
for (i=0; i<argc; i++) {
VALUE s = argv[i];
StringValue(s);
tr_setup_table(s, table, init);
init = 0;
}
s = RSTRING(str)->ptr;
if (!s || RSTRING(str)->len == 0) return INT2FIX(0);
send = s + RSTRING(str)->len;
i = 0;
while (s < send) {
if (table[*s++ & 0xff]) {
i++;
}
}
return INT2NUM(i);
}