18static VALUE rb_mDigest;
19static VALUE rb_mDigest_Instance;
20static VALUE rb_cDigest_Class;
21static VALUE rb_cDigest_Base;
23static ID id_reset, id_update, id_finish, id_digest, id_hexdigest, id_digest_length;
98hexencode_str_new(
VALUE str_digest)
105 static const char hex[] = {
106 '0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
107 'a',
'b',
'c',
'd',
'e',
'f'
121 unsigned char byte = digest[i];
123 p[i + i] = hex[
byte >> 4];
124 p[i + i + 1] = hex[
byte & 0x0f];
141 return hexencode_str_new(
str);
144NORETURN(
static void rb_digest_instance_method_unimpl(
VALUE self,
const char *method));
154rb_digest_instance_method_unimpl(
VALUE self,
const char *method)
174 rb_digest_instance_method_unimpl(self,
"update");
192rb_digest_instance_finish(
VALUE self)
194 rb_digest_instance_method_unimpl(self,
"finish");
208rb_digest_instance_reset(
VALUE self)
210 rb_digest_instance_method_unimpl(self,
"reset");
223rb_digest_instance_new(
VALUE self)
267rb_digest_instance_digest_bang(
VALUE self)
301 return hexencode_str_new(value);
312rb_digest_instance_hexdigest_bang(
VALUE self)
317 return hexencode_str_new(value);
327rb_digest_instance_to_s(
VALUE self)
339rb_digest_instance_inspect(
VALUE self)
342 size_t digest_len = 32;
368rb_digest_instance_equal(
VALUE self,
VALUE other)
373 str1 = rb_digest_instance_digest(0, 0, self);
374 str2 = rb_digest_instance_digest(0, 0, other);
376 str1 = rb_digest_instance_to_s(self);
402rb_digest_instance_digest_length(
VALUE self)
405 VALUE digest = rb_digest_instance_digest(0, 0, self);
420rb_digest_instance_length(
VALUE self)
434rb_digest_instance_block_length(
VALUE self)
436 rb_digest_instance_method_unimpl(self,
"block_length");
494rb_digest_class_init(
VALUE self)
541get_digest_base_metadata(
VALUE klass)
557 if (!RB_TYPE_P(obj,
T_DATA) || RTYPEDDATA_P(obj)) {
567#undef RUBY_UNTYPED_DATA_WARNING
568#define RUBY_UNTYPED_DATA_WARNING 0
571 if (!algo)
goto wrong;
589get_digest_obj_metadata(
VALUE obj)
610rb_digest_base_alloc(
VALUE klass)
616 if (klass == rb_cDigest_Base) {
620 algo = get_digest_base_metadata(klass);
624 algo_init(algo, pctx);
636 if (copy == obj)
return copy;
640 algo = get_digest_obj_metadata(copy);
641 if (algo != get_digest_obj_metadata(obj))
657rb_digest_base_reset(
VALUE self)
662 algo = get_digest_obj_metadata(self);
666 algo_init(algo, pctx);
684 algo = get_digest_obj_metadata(self);
697rb_digest_base_finish(
VALUE self)
703 algo = get_digest_obj_metadata(self);
711 algo_init(algo, pctx);
722rb_digest_base_digest_length(
VALUE self)
726 algo = get_digest_obj_metadata(self);
737rb_digest_base_block_length(
VALUE self)
741 algo = get_digest_obj_metadata(self);
755 id_digest_length =
rb_intern(
"digest_length");
756 id_metadata = rb_id_metadata();
768#ifdef HAVE_RB_EXT_RACTOR_SAFE
781 rb_define_method(rb_mDigest_Instance,
"update", rb_digest_instance_update, 1);
784 rb_define_method(rb_mDigest_Instance,
"reset", rb_digest_instance_reset, 0);
785 rb_define_method(rb_mDigest_Instance,
"digest_length", rb_digest_instance_digest_length, 0);
786 rb_define_method(rb_mDigest_Instance,
"block_length", rb_digest_instance_block_length, 0);
790 rb_define_method(rb_mDigest_Instance,
"inspect", rb_digest_instance_inspect, 0);
794 rb_define_method(rb_mDigest_Instance,
"digest", rb_digest_instance_digest, -1);
795 rb_define_method(rb_mDigest_Instance,
"digest!", rb_digest_instance_digest_bang, 0);
796 rb_define_method(rb_mDigest_Instance,
"hexdigest", rb_digest_instance_hexdigest, -1);
797 rb_define_method(rb_mDigest_Instance,
"hexdigest!", rb_digest_instance_hexdigest_bang, 0);
799 rb_define_method(rb_mDigest_Instance,
"length", rb_digest_instance_length, 0);
800 rb_define_method(rb_mDigest_Instance,
"size", rb_digest_instance_length, 0);
818 rb_define_method(rb_cDigest_Base,
"initialize_copy", rb_digest_base_copy, 1);
823 rb_define_method(rb_cDigest_Base,
"digest_length", rb_digest_base_digest_length, 0);
824 rb_define_method(rb_cDigest_Base,
"block_length", rb_digest_base_block_length, 0);
#define rb_define_method(klass, mid, func, arity)
Defines klass#mid.
#define rb_define_singleton_method(klass, mid, func, arity)
Defines klass.mid.
#define rb_define_module_function(klass, mid, func, arity)
Defines klass#mid and makes it a module function.
#define rb_define_private_method(klass, mid, func, arity)
Defines klass#mid and makes it private.
void Init_digest_base(void)
char str[HTML_ESCAPE_MAX_LEN+1]
#define RSTRING_LEN(string)
#define RSTRING_PTR(string)
VALUE rb_data_typed_object_zalloc(VALUE klass, size_t size, const rb_data_type_t *type)
void rb_include_module(VALUE klass, VALUE module)
VALUE rb_define_class_under(VALUE outer, const char *name, VALUE super)
Defines a class under the namespace of outer.
VALUE rb_define_module(const char *name)
VALUE rb_define_module_under(VALUE outer, const char *name)
int rb_scan_args(int argc, const VALUE *argv, const char *fmt,...)
void rb_raise(VALUE exc, const char *fmt,...)
VALUE rb_class_superclass(VALUE)
Returns the superclass of klass.
VALUE rb_cObject
Object class.
void rb_obj_call_init(VALUE obj, int argc, const VALUE *argv)
Calls initialize method of obj with the given arguments.
VALUE rb_obj_alloc(VALUE)
Allocates an instance of klass.
VALUE rb_obj_class(VALUE)
VALUE rb_obj_clone(VALUE)
Almost same as Object::clone.
VALUE rb_obj_is_kind_of(VALUE, VALUE)
Determines if obj is a kind of c.
VALUE rb_funcall(VALUE, ID, int,...)
Calls a method.
void rb_ext_ractor_safe(bool flag)
#define rb_str_new(str, len)
#define rb_usascii_str_new(str, len)
VALUE rb_str_buf_new(long)
VALUE rb_check_string_type(VALUE)
int rb_str_cmp(VALUE, VALUE)
VALUE rb_str_buf_append(VALUE, VALUE)
VALUE rb_ivar_get(VALUE, ID)
VALUE rb_ivar_defined(VALUE, ID)
void rb_define_alloc_func(VALUE, rb_alloc_func_t)
ID rb_intern(const char *)
#define Data_Get_Struct(obj, type, sval)
#define RTYPEDDATA_DATA(v)
#define RUBY_TYPED_DEFAULT_FREE
#define TypedData_Get_Struct(obj, type, data_type, sval)
@ RUBY_TYPED_FREE_IMMEDIATELY
@ RUBY_TYPED_WB_PROTECTED
const char * rb_obj_classname(VALUE)
size_t strlen(const char *)