Ignore:
Timestamp:
Jul 3, 2020, 7:19:17 PM (4 years ago)
Author:
coas-nagasima
Message:

ASP3, TINET, mbed を更新

File:
1 edited

Legend:

Unmodified
Added
Removed
  • EcnlProtoTool/trunk/asp3_dcre/tecsgen/tecs/mruby/nMruby_tMrubyProc.c

    r321 r429  
    11/*
    2  * This file comes from mruby. (renamed from tools/mruby/mruby.c)
    3  * This file is distributed under ruby's license. (not under TOPPERS license)
    4  *   see https://github.com/mruby/mruby
    5  * A little modification is done to to call initializer registering TECS components.
     2 *   Copyright (C) 2008-2017 by TOPPERS Project
    63 *
    7  * このファイルは、mruby のものです。
    8  * mruby のライセンスのもとで、配布されます。(TOPPERS ライセンスではありません)
    9  *  参照:  https://github.com/mruby/mruby
    10  * TECS コンポーネントを登録する初期化子を呼ぶため、少しの修正がなされています。
     4 *  上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
     5 *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
     6 *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
     7 *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
     8 *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
     9 *      スコード中に含まれていること.
     10 *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
     11 *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
     12 *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
     13 *      の無保証規定を掲載すること.
     14 *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
     15 *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
     16 *      と.
     17 *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
     18 *        作権表示,この利用条件および下記の無保証規定を掲載すること.
     19 *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
     20 *        報告すること.
     21 *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
     22 *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
     23 *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
     24 *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
     25 *      免責すること.
     26 *
     27 *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
     28 *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
     29 *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
     30 *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
     31 *  の責任を負わない.
     32 *
     33 *  @(#) $Id$
    1134 */
    1235
    13 #include "nMruby_tMrubyProc_tecsgen.h"
     36/*
     37 * 以前の nMruby_tMrubyProc.c は、mruby の本体に含まれていた
     38 *    mrbgems/mruby-bin-mruby/tools/mruby/mruby.c
     39 * をベースに TECS のコードを足していたが、TOPPERS ライセンスと異なるため
     40 * 新たに書き下ろした。(小さなコードのため、概ね似たようなものになるが。
     41 */
    1442
    1543#include <stdio.h>
     
    1745#include <string.h>
    1846#include "mruby.h"
     47#include "mruby/string.h"
    1948#include "mruby/array.h"
    2049#include "mruby/compile.h"
     
    2251#include "mruby/variable.h"
    2352
    24 #ifndef ENABLE_STDIO
    25 static void
    26 p(mrb_state *mrb, mrb_value obj)
    27 {
    28   obj = mrb_funcall(mrb, obj, "inspect", 0);
    29   fwrite(RSTRING_PTR(obj), RSTRING_LEN(obj), 1, stdout);
    30   putc('\n', stdout);
    31 }
    32 #else
    33 #define p(mrb,obj) mrb_p(mrb,obj)
     53/* #[<PREAMBLE>]#
     54 * Don't edit the comments between #[<...>]# and #[</...>]#
     55 * These comment are used by tecsmerege when merging.
     56 *
     57 * attr access macro #_CAAM_#
     58 * mrb              mrb_state*       VAR_mrb         
     59 *
     60 * call port function #_TCPF_#
     61 * call port: cInit signature: nMruby_sInitializeBridge context:task optional:true
     62 *   bool_t     is_cInit_joined()                     check if joined
     63 *   void           cInit_initializeBridge( const mrb_state* mrb );
     64 *
     65 * #[</PREAMBLE>]# */
     66
     67/* プロトタイプ宣言や変数の定義をここに書きます #_PAC_# */
     68#include "nMruby_tMrubyProc_tecsgen.h"
     69
     70#ifndef E_OK
     71#define E_OK    0               /* success */
     72#define E_ID    (-18)   /* illegal ID */
    3473#endif
    3574
    36 void mrb_show_version(mrb_state *);
    37 void mrb_show_copyright(mrb_state *);
     75/* 受け口関数 #_TEPF_# */
     76/* #[<ENTRY_PORT>]# eMain
     77 * entry port: eMain
     78 * signature:  nPosix_sMain
     79 * context:    task
     80 * #[</ENTRY_PORT>]# */
    3881
    39 struct _args {
    40   FILE *rfp;
    41   char* cmdline;
    42   mrb_bool fname        : 1;
    43   mrb_bool mrbfile      : 1;
    44   mrb_bool check_syntax : 1;
    45   mrb_bool verbose      : 1;
    46   int argc;
    47   char** argv;
    48 };
     82/* #[<ENTRY_FUNC>]# eMain_main
     83 * name:         eMain_main
     84 * global_name:  nMruby_tMrubyProc_eMain_main
     85 * oneway:       false
     86 * #[</ENTRY_FUNC>]# */
     87int
     88eMain_main(CELLIDX idx, int argc, const char** argv)
     89{
     90        CELLCB  *p_cellcb;
     91  mrb_state *mrb;
     92  mrbc_context* context;
     93  if (VALID_IDX(idx)) {
     94                p_cellcb = GET_CELLCB(idx);
     95        }
     96        else {
     97                /* エラー処理コードをここに記述します */
     98      return -1;
     99        } /* end if VALID_IDX(idx) */
    49100
    50 static void
    51 usage(const char *name)
    52 {
    53   static const char *const usage_msg[] = {
    54   "switches:",
    55   "-b           load and execute RiteBinary (mrb) file",
    56   "-c           check syntax only",
    57   "-e 'command' one line of script",
    58   "-v           print version number, then run in verbose mode",
    59   "--verbose    run in verbose mode",
    60   "--version    print the version",
    61   "--copyright  print the copyright",
    62   NULL
    63   };
    64   const char *const *p = usage_msg;
     101        /* ここに処理本体を記述します #_TEFB_# */
     102  if (argc != 2) {
     103      printf("usage: %s script.rb\n", argv[0]);
     104      goto error_return;
     105  }
     106  mrb = mrb_open();
     107  if( mrb == 0 ){
     108      printf("%s: mrb_open() failed\n", argv[0]);
     109      goto error_return;
     110  }
     111  context = mrbc_context_new(mrb);
     112  if (context == 0) {
     113      printf("%s: mrbc_context_new() failed\n", argv[0]);
     114      goto error_close;
     115  }
    65116
    66   printf("Usage: %s [switches] programfile\n", name);
    67   while (*p)
    68     printf("  %s\n", *p++);
     117  /*--------   ARGV   ----------*/
     118  {
     119      mrb_value ARGV = mrb_ary_new_capa(mrb, argc);
     120      int  i;
     121      for (i = 0; i < argc; i++) {
     122          mrb_ary_push(mrb, ARGV, mrb_str_new_cstr(mrb, argv[i]));
     123      }
     124      mrb_define_global_const(mrb, "ARGV", ARGV);
     125  }
     126  /*--------   $0   ----------*/
     127  {
     128      mrb_sym zero_sym = mrb_intern_lit(mrb, "$0");
     129      mrbc_filename(mrb, context, argv[0]);
     130      mrb_gv_set(mrb, zero_sym, mrb_str_new_cstr(mrb, argv[0]));
     131  }
     132
     133  /* ------- register TECS bridge classes -------*/
     134  if (is_cInit_joined()) {
     135      cInit_initializeBridge(mrb);
     136  }
     137
     138  /*--------  load .rb file -------*/
     139  {
     140      FILE *file = fopen(argv[1], "r");
     141      if (file == NULL) {
     142          printf("file not found: %s\n", argv[1]);
     143          goto error_free;
     144      }
     145
     146      mrb_value val = mrb_load_file_cxt(mrb, file, context);
     147      if (mrb->exc) {
     148          if(! mrb_undef_p(val)){
     149              mrb_print_error(mrb);
     150          }
     151      }
     152  }
     153
     154  /*---------- success case --------*/
     155  mrbc_context_free(mrb, context);
     156  mrb_close( mrb );
     157  return 0;
     158
     159  /*---------- error case ----------*/
     160error_free:
     161  mrbc_context_free(mrb, context);
     162error_close:
     163  mrb_close( mrb );
     164error_return:
     165
     166  return -1;
    69167}
    70168
    71 static int
    72 parse_args(mrb_state *mrb, int argc, char **argv, struct _args *args)
    73 {
    74   char **origargv = argv;
    75   static const struct _args args_zero = { 0 };
    76 
    77   *args = args_zero;
    78 
    79   for (argc--,argv++; argc > 0; argc--,argv++) {
    80     char *item;
    81     if (argv[0][0] != '-') break;
    82 
    83     if (strlen(*argv) <= 1) {
    84       argc--; argv++;
    85       args->rfp = stdin;
    86       break;
    87     }
    88 
    89     item = argv[0] + 1;
    90     switch (*item++) {
    91     case 'b':
    92       args->mrbfile = TRUE;
    93       break;
    94     case 'c':
    95       args->check_syntax = TRUE;
    96       break;
    97     case 'e':
    98       if (item[0]) {
    99         goto append_cmdline;
    100       }
    101       else if (argc > 1) {
    102         argc--; argv++;
    103         item = argv[0];
    104 append_cmdline:
    105         if (!args->cmdline) {
    106           size_t buflen;
    107           char *buf;
    108 
    109           buflen = strlen(item) + 1;
    110           buf = (char *)mrb_malloc(mrb, buflen);
    111           memcpy(buf, item, buflen);
    112           args->cmdline = buf;
    113         }
    114         else {
    115           size_t cmdlinelen;
    116           size_t itemlen;
    117 
    118           cmdlinelen = strlen(args->cmdline);
    119           itemlen = strlen(item);
    120           args->cmdline =
    121             (char *)mrb_realloc(mrb, args->cmdline, cmdlinelen + itemlen + 2);
    122           args->cmdline[cmdlinelen] = '\n';
    123           memcpy(args->cmdline + cmdlinelen + 1, item, itemlen + 1);
    124         }
    125       }
    126       else {
    127         printf("%s: No code specified for -e\n", *origargv);
    128         return EXIT_SUCCESS;
    129       }
    130       break;
    131     case 'v':
    132       if (!args->verbose) mrb_show_version(mrb);
    133       args->verbose = TRUE;
    134       break;
    135     case '-':
    136       if (strcmp((*argv) + 2, "version") == 0) {
    137         mrb_show_version(mrb);
    138         exit(EXIT_SUCCESS);
    139       }
    140       else if (strcmp((*argv) + 2, "verbose") == 0) {
    141         args->verbose = TRUE;
    142         break;
    143       }
    144       else if (strcmp((*argv) + 2, "copyright") == 0) {
    145         mrb_show_copyright(mrb);
    146         exit(EXIT_SUCCESS);
    147       }
    148     default:
    149       return EXIT_FAILURE;
    150     }
    151   }
    152 
    153   if (args->rfp == NULL && args->cmdline == NULL) {
    154     if (*argv == NULL) args->rfp = stdin;
    155     else {
    156       args->rfp = fopen(argv[0], args->mrbfile ? "rb" : "r");
    157       if (args->rfp == NULL) {
    158         printf("%s: Cannot open program file. (%s)\n", *origargv, *argv);
    159         return EXIT_FAILURE;
    160       }
    161       args->fname = TRUE;
    162       args->cmdline = argv[0];
    163       argc--; argv++;
    164     }
    165   }
    166   args->argv = (char **)mrb_realloc(mrb, args->argv, sizeof(char*) * (argc + 1));
    167   memcpy(args->argv, argv, (argc+1) * sizeof(char*));
    168   args->argc = argc;
    169 
    170   return EXIT_SUCCESS;
    171 }
    172 
    173 static void
    174 cleanup(mrb_state *mrb, struct _args *args)
    175 {
    176   if (args->rfp && args->rfp != stdin)
    177     fclose(args->rfp);
    178   if (args->cmdline && !args->fname)
    179     mrb_free(mrb, args->cmdline);
    180   if (args->argv)
    181     mrb_free(mrb, args->argv);
    182   mrb_close(mrb);
    183 }
    184 
    185 int
    186 // main(int argc, char **argv)
    187 eMain_main( CELLIDX idx, int argc, const char **argv)
    188 
    189 {
    190   CELLCB   *p_cellcb = GET_CELLCB( idx );
    191   mrb_state *mrb = mrb_open();
    192   int n = -1;
    193   int i;
    194   struct _args args;
    195   mrb_value ARGV;
    196   mrbc_context *c;
    197   mrb_value v;
    198   mrb_sym zero_sym;
    199 
    200   cInit_initializeBridge( mrb );    // TECS
    201 
    202 
    203   if (mrb == NULL) {
    204     fputs("Invalid mrb_state, exiting mruby\n", stderr);
    205     return EXIT_FAILURE;
    206   }
    207 
    208   n = parse_args(mrb, argc, (char **)argv, &args);
    209   if (n == EXIT_FAILURE || (args.cmdline == NULL && args.rfp == NULL)) {
    210     cleanup(mrb, &args);
    211     usage(argv[0]);
    212     return n;
    213   }
    214 
    215   ARGV = mrb_ary_new_capa(mrb, args.argc);
    216   for (i = 0; i < args.argc; i++) {
    217     mrb_ary_push(mrb, ARGV, mrb_str_new_cstr(mrb, args.argv[i]));
    218   }
    219   mrb_define_global_const(mrb, "ARGV", ARGV);
    220 
    221   c = mrbc_context_new(mrb);
    222   if (args.verbose)
    223     c->dump_result = TRUE;
    224   if (args.check_syntax)
    225     c->no_exec = TRUE;
    226 
    227   /* Set $0 */
    228   zero_sym = mrb_intern_lit(mrb, "$0");
    229   if (args.rfp) {
    230     char *cmdline;
    231     cmdline = args.cmdline ? args.cmdline : "-";
    232     mrbc_filename(mrb, c, cmdline);
    233     mrb_gv_set(mrb, zero_sym, mrb_str_new_cstr(mrb, cmdline));
    234   }
    235   else {
    236     mrbc_filename(mrb, c, "-e");
    237     mrb_gv_set(mrb, zero_sym, mrb_str_new_lit(mrb, "-e"));
    238   }
    239 
    240   /* Load program */
    241   if (args.mrbfile) {
    242     v = mrb_load_irep_file_cxt(mrb, args.rfp, c);
    243   }
    244   else if (args.rfp) {
    245     v = mrb_load_file_cxt(mrb, args.rfp, c);
    246   }
    247   else {
    248     v = mrb_load_string_cxt(mrb, args.cmdline, c);
    249   }
    250 
    251   mrbc_context_free(mrb, c);
    252   if (mrb->exc) {
    253     if (!mrb_undef_p(v)) {
    254       mrb_print_error(mrb);
    255     }
    256     n = -1;
    257   }
    258   else if (args.check_syntax) {
    259     printf("Syntax OK\n");
    260   }
    261   cleanup(mrb, &args);
    262 
    263   return n == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
    264 }
     169/* #[<POSTAMBLE>]#
     170 *   Put non-entry functions below.
     171 * #[</POSTAMBLE>]#*/
Note: See TracChangeset for help on using the changeset viewer.