Mercurial > kinput2.yaz
annotate 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 |
rev | line source |
---|---|
16
598fcbe482b5
imported patch 19_kinput2-v3.1-ruby.patch
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
1 /* $Id: ruby-c.c,v 1.2 2003/06/10 02:11:25 komatsu Exp $ */ |
598fcbe482b5
imported patch 19_kinput2-v3.1-ruby.patch
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
2 /* |
598fcbe482b5
imported patch 19_kinput2-v3.1-ruby.patch
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
3 * AUTHOR: Hiroyuki Komatsu <komatsu@taiyaki.org> http://taiyaki.org/ |
598fcbe482b5
imported patch 19_kinput2-v3.1-ruby.patch
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
4 * LICENSE: GPL2 |
598fcbe482b5
imported patch 19_kinput2-v3.1-ruby.patch
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
5 */ |
598fcbe482b5
imported patch 19_kinput2-v3.1-ruby.patch
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
6 |
598fcbe482b5
imported patch 19_kinput2-v3.1-ruby.patch
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
7 #include <stdarg.h> |
598fcbe482b5
imported patch 19_kinput2-v3.1-ruby.patch
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
8 #include "ruby-c.h" |
598fcbe482b5
imported patch 19_kinput2-v3.1-ruby.patch
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
9 #define RUBY_EVALF_BUF 1024 |
598fcbe482b5
imported patch 19_kinput2-v3.1-ruby.patch
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
10 |
598fcbe482b5
imported patch 19_kinput2-v3.1-ruby.patch
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
11 VALUE |
598fcbe482b5
imported patch 19_kinput2-v3.1-ruby.patch
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
12 ruby_eval (char *statement) |
598fcbe482b5
imported patch 19_kinput2-v3.1-ruby.patch
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
13 { |
598fcbe482b5
imported patch 19_kinput2-v3.1-ruby.patch
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
14 int state; |
598fcbe482b5
imported patch 19_kinput2-v3.1-ruby.patch
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
15 VALUE result; |
598fcbe482b5
imported patch 19_kinput2-v3.1-ruby.patch
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
16 |
598fcbe482b5
imported patch 19_kinput2-v3.1-ruby.patch
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
17 result = rb_eval_string_protect (statement, &state); |
598fcbe482b5
imported patch 19_kinput2-v3.1-ruby.patch
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
18 if (state) { |
598fcbe482b5
imported patch 19_kinput2-v3.1-ruby.patch
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
19 EXTERN VALUE ruby_errinfo; |
598fcbe482b5
imported patch 19_kinput2-v3.1-ruby.patch
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
20 |
598fcbe482b5
imported patch 19_kinput2-v3.1-ruby.patch
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
21 fprintf(stderr, "Eval Error in \"%s\"\n", statement); |
598fcbe482b5
imported patch 19_kinput2-v3.1-ruby.patch
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
22 fprintf(stderr, "%s\n", STR2CSTR(ruby_errinfo)); |
598fcbe482b5
imported patch 19_kinput2-v3.1-ruby.patch
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
23 } |
598fcbe482b5
imported patch 19_kinput2-v3.1-ruby.patch
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
24 return result; |
598fcbe482b5
imported patch 19_kinput2-v3.1-ruby.patch
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
25 } |
598fcbe482b5
imported patch 19_kinput2-v3.1-ruby.patch
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
26 |
598fcbe482b5
imported patch 19_kinput2-v3.1-ruby.patch
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
27 VALUE |
598fcbe482b5
imported patch 19_kinput2-v3.1-ruby.patch
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
28 ruby_evalf (char *statement_format, ...) |
598fcbe482b5
imported patch 19_kinput2-v3.1-ruby.patch
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
29 { |
598fcbe482b5
imported patch 19_kinput2-v3.1-ruby.patch
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
30 va_list ap; |
598fcbe482b5
imported patch 19_kinput2-v3.1-ruby.patch
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
31 char statement[RUBY_EVALF_BUF]; |
598fcbe482b5
imported patch 19_kinput2-v3.1-ruby.patch
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
32 int length; |
598fcbe482b5
imported patch 19_kinput2-v3.1-ruby.patch
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
33 |
598fcbe482b5
imported patch 19_kinput2-v3.1-ruby.patch
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
34 va_start (ap, statement_format); |
598fcbe482b5
imported patch 19_kinput2-v3.1-ruby.patch
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
35 length = vsnprintf (statement, RUBY_EVALF_BUF, statement_format, ap); |
598fcbe482b5
imported patch 19_kinput2-v3.1-ruby.patch
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
36 va_end (ap); |
598fcbe482b5
imported patch 19_kinput2-v3.1-ruby.patch
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
37 |
598fcbe482b5
imported patch 19_kinput2-v3.1-ruby.patch
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
38 if (length == -1) { /* Before glibc 2.0.6 */ |
598fcbe482b5
imported patch 19_kinput2-v3.1-ruby.patch
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
39 fprintf (stderr, "ruby_evalf: Error, Out of Buffer\n"); |
598fcbe482b5
imported patch 19_kinput2-v3.1-ruby.patch
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
40 fprintf (stderr, "Buffer size is %d\n", RUBY_EVALF_BUF); |
598fcbe482b5
imported patch 19_kinput2-v3.1-ruby.patch
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
41 return Qnil; |
598fcbe482b5
imported patch 19_kinput2-v3.1-ruby.patch
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
42 } else if (length > RUBY_EVALF_BUF -1) { /* C99 */ |
598fcbe482b5
imported patch 19_kinput2-v3.1-ruby.patch
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
43 VALUE result; |
598fcbe482b5
imported patch 19_kinput2-v3.1-ruby.patch
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
44 char *d_statement = malloc (sizeof (char) * length + 1); |
598fcbe482b5
imported patch 19_kinput2-v3.1-ruby.patch
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
45 va_start (ap, statement_format); |
598fcbe482b5
imported patch 19_kinput2-v3.1-ruby.patch
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
46 vsnprintf (d_statement, length + 1, statement_format, ap); |
598fcbe482b5
imported patch 19_kinput2-v3.1-ruby.patch
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
47 va_end (ap); |
598fcbe482b5
imported patch 19_kinput2-v3.1-ruby.patch
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
48 result = ruby_eval (d_statement); |
598fcbe482b5
imported patch 19_kinput2-v3.1-ruby.patch
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
49 free (d_statement); |
598fcbe482b5
imported patch 19_kinput2-v3.1-ruby.patch
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
50 return result; |
598fcbe482b5
imported patch 19_kinput2-v3.1-ruby.patch
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
51 } else { |
598fcbe482b5
imported patch 19_kinput2-v3.1-ruby.patch
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
52 return ruby_eval (statement); |
598fcbe482b5
imported patch 19_kinput2-v3.1-ruby.patch
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
53 } |
598fcbe482b5
imported patch 19_kinput2-v3.1-ruby.patch
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
54 } |
598fcbe482b5
imported patch 19_kinput2-v3.1-ruby.patch
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
55 |
598fcbe482b5
imported patch 19_kinput2-v3.1-ruby.patch
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
56 void |
598fcbe482b5
imported patch 19_kinput2-v3.1-ruby.patch
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
57 ruby_load (char *filename) |
598fcbe482b5
imported patch 19_kinput2-v3.1-ruby.patch
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
58 { |
598fcbe482b5
imported patch 19_kinput2-v3.1-ruby.patch
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
59 int state; |
598fcbe482b5
imported patch 19_kinput2-v3.1-ruby.patch
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
60 rb_load_protect (rb_str_new2 (filename), 0, &state); |
598fcbe482b5
imported patch 19_kinput2-v3.1-ruby.patch
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
61 if (state) { |
598fcbe482b5
imported patch 19_kinput2-v3.1-ruby.patch
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
62 fprintf(stderr, "Load Error for \"%s\"\n", filename); |
598fcbe482b5
imported patch 19_kinput2-v3.1-ruby.patch
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
63 fprintf(stderr, "%s\n", STR2CSTR(ruby_errinfo)); |
598fcbe482b5
imported patch 19_kinput2-v3.1-ruby.patch
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
64 } |
598fcbe482b5
imported patch 19_kinput2-v3.1-ruby.patch
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
65 } |