diff options
| author | Daniel Bovensiepen <[email protected]> | 2012-09-19 07:27:07 +0900 |
|---|---|---|
| committer | Daniel Bovensiepen <[email protected]> | 2012-09-19 07:27:07 +0900 |
| commit | c6a520c6b5362e26cb9d741eed08f4fc3426b3ad (patch) | |
| tree | 05955125080e5e4d3b19809bda7fdfa7d02f2197 /mrbgems/g/md5_zwo/src/mrb_md5.c | |
| parent | ac235e25e54c55784b175cf9e66b8db89a54bd44 (diff) | |
| download | mruby-c6a520c6b5362e26cb9d741eed08f4fc3426b3ad.tar.gz mruby-c6a520c6b5362e26cb9d741eed08f4fc3426b3ad.zip | |
Built generator for an variable amount of gems
Diffstat (limited to 'mrbgems/g/md5_zwo/src/mrb_md5.c')
| -rw-r--r-- | mrbgems/g/md5_zwo/src/mrb_md5.c | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/mrbgems/g/md5_zwo/src/mrb_md5.c b/mrbgems/g/md5_zwo/src/mrb_md5.c new file mode 100644 index 000000000..6df453b0e --- /dev/null +++ b/mrbgems/g/md5_zwo/src/mrb_md5.c @@ -0,0 +1,56 @@ +#include <mruby.h> +#include <mruby/string.h> +#include "md5.h" + +static struct RClass *_class_md5; + +/********************************************************* + * main + *********************************************************/ + +static char +nr2char(int n) { + if (0 <= n && n <= 9) { + return '0' + n; + } else { + return 'a' + n - 10; + } +} + +static mrb_value +mrb_md5_hex(mrb_state *mrb, mrb_value self) +{ + md5_state_t pms; + md5_byte_t digest[16]; + md5_byte_t digest_hex[33]; + mrb_value arg; + int i; + + mrb_get_args(mrb, "o", &arg); + if (mrb_nil_p(arg) || mrb_type(arg) != MRB_TT_STRING) { + mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid argument"); + } + + md5_init(&pms); + md5_append(&pms, (const md5_byte_t*) RSTRING_PTR(arg), RSTRING_CAPA(arg)); + md5_finish(&pms, digest); + + + for (i = 0; i < 16; i++) { + digest_hex[i*2+0] = nr2char((digest[i] >> 4) & 0xf); + digest_hex[i*2+1] = nr2char(digest[i] & 0x0f); + } + digest_hex[32] = 0; + + return mrb_str_new(mrb, (char*) digest_hex, 32); +} + +/********************************************************* + * register + *********************************************************/ + +void +mrb_md5_gem_init(mrb_state* mrb) { + _class_md5 = mrb_define_module(mrb, "MD5"); + mrb_define_class_method(mrb, _class_md5, "md5_hex", mrb_md5_hex, ARGS_REQ(1)); +} |
