@@ -18,17 +18,40 @@ c_crc_crc32(mrbc_vm *vm, mrbc_value v[], int argc)
1818 SET_INT_RETURN (0 );
1919 return ;
2020 } else if (string .tt != MRBC_TT_STRING ) {
21- mrbc_raise (vm , MRBC_CLASS (TypeError ), "string expected " );
21+ mrbc_raise (vm , MRBC_CLASS (TypeError ), "Expected a String type for the first argument " );
2222 return ;
2323 }
2424 uint32_t crc_value = generate_crc32 ((uint8_t * )string .string -> data , (size_t )string .string -> size , (uint32_t )crc );
2525 SET_INT_RETURN (crc_value );
2626}
2727
28+ /*
29+ * CRC.crc32_from_address(address, length, crc = nil) -> Integer
30+ */
31+ static void
32+ c_crc_crc32_from_address (mrbc_vm * vm , mrbc_value v [], int argc )
33+ {
34+ uintptr_t address = (uintptr_t )GET_INT_ARG (1 );
35+ if (address == 0 ) {
36+ mrbc_raise (vm , MRBC_CLASS (ArgumentError ), "Address must not be NULL" );
37+ return ;
38+ }
39+ mrbc_int_t length = GET_INT_ARG (2 );
40+ mrbc_int_t crc ;
41+ if (argc < 3 ) {
42+ crc = 0 ;
43+ } else {
44+ crc = GET_INT_ARG (3 );
45+ }
46+ uint32_t crc_value = generate_crc32 ((uint8_t * )address , (size_t )length , (uint32_t )crc );
47+ SET_INT_RETURN (crc_value );
48+ }
49+
2850void
2951mrbc_crc_init (mrbc_vm * vm )
3052{
3153 mrbc_class * module_CRC = mrbc_define_module (vm , "CRC" );
3254
3355 mrbc_define_method (vm , module_CRC , "crc32" , c_crc_crc32 );
56+ mrbc_define_method (vm , module_CRC , "crc32_from_address" , c_crc_crc32_from_address );
3457}
0 commit comments