diff lib/ruby-c.c @ 16:598fcbe482b5

imported patch 19_kinput2-v3.1-ruby.patch
author Yoshiki Yazawa <yaz@honeyplanet.jp>
date Mon, 08 Mar 2010 20:38:17 +0900
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/ruby-c.c	Mon Mar 08 20:38:17 2010 +0900
@@ -0,0 +1,65 @@
+/* $Id: ruby-c.c,v 1.2 2003/06/10 02:11:25 komatsu Exp $ */
+/*
+ * AUTHOR:  Hiroyuki Komatsu <komatsu@taiyaki.org> http://taiyaki.org/
+ * LICENSE: GPL2
+ */
+
+#include <stdarg.h>
+#include "ruby-c.h"
+#define RUBY_EVALF_BUF 1024
+
+VALUE
+ruby_eval (char *statement)
+{
+    int state;
+    VALUE result;
+
+    result = rb_eval_string_protect (statement,  &state);
+    if (state) {
+	EXTERN VALUE ruby_errinfo;
+
+	fprintf(stderr, "Eval Error in \"%s\"\n", statement);
+	fprintf(stderr, "%s\n", STR2CSTR(ruby_errinfo));
+    }
+    return result;
+}
+
+VALUE
+ruby_evalf (char *statement_format, ...)
+{
+    va_list ap;
+    char statement[RUBY_EVALF_BUF];
+    int length;
+
+    va_start (ap, statement_format);
+    length = vsnprintf (statement, RUBY_EVALF_BUF, statement_format, ap);
+    va_end (ap);
+
+    if (length == -1) { /* Before glibc 2.0.6 */
+	fprintf (stderr, "ruby_evalf: Error, Out of Buffer\n");
+	fprintf (stderr, "Buffer size is %d\n", RUBY_EVALF_BUF);
+	return Qnil;
+    } else if (length > RUBY_EVALF_BUF -1) { /* C99 */
+	VALUE result;
+	char *d_statement = malloc (sizeof (char) * length + 1);
+	va_start (ap, statement_format);
+	vsnprintf (d_statement, length + 1, statement_format, ap);
+	va_end (ap);
+	result = ruby_eval (d_statement);
+	free (d_statement);
+	return result;
+    } else {
+	return ruby_eval (statement);
+    }
+}
+
+void
+ruby_load (char *filename)
+{
+    int state;
+    rb_load_protect (rb_str_new2 (filename), 0, &state);
+    if (state) {
+	fprintf(stderr, "Load Error for \"%s\"\n", filename);
+	fprintf(stderr, "%s\n", STR2CSTR(ruby_errinfo));
+    }
+}