summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/g/md5/src/mrb_md5.c
diff options
context:
space:
mode:
Diffstat (limited to 'mrbgems/g/md5/src/mrb_md5.c')
-rw-r--r--mrbgems/g/md5/src/mrb_md5.c56
1 files changed, 56 insertions, 0 deletions
diff --git a/mrbgems/g/md5/src/mrb_md5.c b/mrbgems/g/md5/src/mrb_md5.c
new file mode 100644
index 000000000..6df453b0e
--- /dev/null
+++ b/mrbgems/g/md5/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));
+}