Ignore:
Timestamp:
Aug 23, 2017, 9:27:43 AM (7 years ago)
Author:
coas-nagasima
Message:

文字コードを設定

Location:
EcnlProtoTool/trunk/asp3_dcre/tecsgen/tecslib/plugin/lib
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • EcnlProtoTool/trunk/asp3_dcre/tecsgen/tecslib/plugin/lib/GenHRP2Marshaler.rb

    • Property svn:mime-type changed from text/x-ruby to text/x-ruby;charset=UTF-8
    r270 r321  
    66#   Copyright (C) 2008-2014 by TOPPERS Project
    77#--
    8 #   ä¸Šè¨˜è‘—作権è€
    9 ã¯ï¼Œä»¥ä¸‹ã®(1)~(4)の条件を満たす場合に限り,本ソフトウェ
    10 #   ã‚¢ï¼ˆæœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã‚’改変したものを含む.以下同じ)を使用・複製・改
    11 #   å¤‰ãƒ»å†é
    12 å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
    13 #   (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
    14 #       æ¨©è¡¨ç¤ºï¼Œã“の利用条件および下記の無保証規定が,そのままの形でソー
    15 #       ã‚¹ã‚³ãƒ¼ãƒ‰ä¸­ã«å«ã¾ã‚Œã¦ã„ること.
    16 #   (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
    17 #       ç”¨ã§ãã‚‹å½¢ã§å†é
    18 å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é
    19 å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
    20 #       è€
    21 ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ãªã©ï¼‰ã«ï¼Œä¸Šè¨˜ã®è‘—作権表示,この利用条件および下記
    22 #       ã®ç„¡ä¿è¨¼è¦å®šã‚’掲載すること.
    23 #   (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
    24 #       ç”¨ã§ããªã„形で再é
    25 å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
    26 #       ã¨ï¼Ž
    27 #     (a) 再é
    28 å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€
    29 ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ãªã©ï¼‰ã«ï¼Œä¸Šè¨˜ã®è‘—
    30 #         ä½œæ¨©è¡¨ç¤ºï¼Œã“の利用条件および下記の無保証規定を掲載すること.
    31 #     (b) 再é
    32 å¸ƒã®å½¢æ
    33 ‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
    34 #         å ±å‘Šã™ã‚‹ã“と.
    35 #   (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
    36 #       å®³ã‹ã‚‰ã‚‚,上記著作権è€
    37 ãŠã‚ˆã³TOPPERSプロジェクトをå
    38 è²¬ã™ã‚‹ã“と.
    39 #       ã¾ãŸï¼Œæœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã®ãƒ¦ãƒ¼ã‚¶ã¾ãŸã¯ã‚¨ãƒ³ãƒ‰ãƒ¦ãƒ¼ã‚¶ã‹ã‚‰ã®ã„かなる理
    40 #       ç”±ã«åŸºã¥ãè«‹æ±‚からも,上記著作権è€
    41 ãŠã‚ˆã³TOPPERSプロジェクトを
    42 #       å
    43 è²¬ã™ã‚‹ã“と.
     8#   上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
     9#   ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
     10#   変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
     11#   (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
     12#       権表示,この利用条件および下記の無保証規定が,そのままの形でソー
     13#       スコード中に含まれていること.
     14#   (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
     15#       用できる形で再配布する場合には,再配布に伴うドキュメント(利用
     16#       者マニュアルなど)に,上記の著作権表示,この利用条件および下記
     17#       の無保証規定を掲載すること.
     18#   (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
     19#       用できない形で再配布する場合には,次のいずれかの条件を満たすこ
     20#       と.
     21#     (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
     22#         作権表示,この利用条件および下記の無保証規定を掲載すること.
     23#     (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
     24#         報告すること.
     25#   (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
     26#       害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
     27#       また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
     28#       由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
     29#       免責すること.
    4430
    45 #   æœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã¯ï¼Œç„¡ä¿è¨¼ã§æä¾›ã•ã‚Œã¦ã„るものである.上記著作権è€
    46 ãŠ
    47 #   ã‚ˆã³TOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
    48 #   ã«å¯¾ã™ã‚‹é©åˆæ€§ã‚‚含めて,いかなる保証も行わない.また,本ソフトウェ
    49 #   ã‚¢ã®åˆ©ç”¨ã«ã‚ˆã‚Šç›´æŽ¥çš„または間接的に生じたいかなる損害に関しても,そ
    50 #   ã®è²¬ä»»ã‚’負わない.
     31#   本ソフトウェアは,無保証で提供されているものである.上記著作権者お
     32#   よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
     33#   に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
     34#   アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
     35#   の責任を負わない.
    5136
    5237#++
    5338
    54 #プラグインオプション用変数
     39#プラグインオプション用変数
    5540#@task_priority:: Integer
    5641#@channelCelltype:: String
     
    5944module GenTransparentMarshaler
    6045
    61   # プラグイン引数名と Proc
     46  # プラグイン引数名と Proc
    6247  RPCPluginArgProc = {
    6348    "taskPriority"    => Proc.new { |obj,rhs| obj.set_taskPriority rhs },
     
    6853  }
    6954
    70   #=== プラグイン引数 taskPriority のチェック
     55  #=== プラグイン引数 taskPriority のチェック
    7156  def set_taskPriority( rhs )
    7257    @task_priority = rhs
    7358  end
    7459
    75   #=== プラグイン引数 channelCelltype のチェック
     60  #=== プラグイン引数 channelCelltype のチェック
    7661  def set_channelCelltype( rhs )
    7762    @channelCelltype = rhs.to_sym
     
    8570  end
    8671
    87   #=== プラグイン引数 TDRCelltype のチェック
     72  #=== プラグイン引数 TDRCelltype のチェック
    8873  def set_TDRCelltype( rhs )
    8974    @TDRCelltype = rhs.to_sym
     
    9782  end
    9883
    99   #=== プラグイン引数 channelCellName のチェック
     84  #=== プラグイン引数 channelCellName のチェック
    10085  def set_channelCellName( rhs )
    10186    @channelCellName = rhs
     
    10792  end
    10893
    109   #=== プラグイン引数 PPAllocatorSize のチェック
     94  #=== プラグイン引数 PPAllocatorSize のチェック
    11095  def set_PPAllocatorSize( rhs )
    11196    @PPAllocatorSize = rhs
    11297  end
    11398
    114   #=== marshaler のセルタイプ名を設定する
     99  #=== marshaler のセルタイプ名を設定する
    115100  def initialize_transparent_marshaler cell_name
    116101    @task_priority = 8
     
    134119
    135120    f = CFile.open( @marshaler_celltype_file_name, "w" )
    136     # 同じå†
    137 å®¹ã‚’二度書く可能性あり (AppFile は不可)
     121    # 同じ内容を二度書く可能性あり (AppFile は不可)
    138122
    139123    # modified by ishikawa
     
    163147  end
    164148
    165   #===  受け口関数の本体コードを生成(頭部と末尾は別途出力)
    166   #ct_name:: Symbol    (through プラグインで生成された) セルタイプ名 .Symbol として送られてくる(らしい)
     149  #===  受け口関数の本体コードを生成(頭部と末尾は別途出力)
     150  #ct_name:: Symbol    (through プラグインで生成された) セルタイプ名 .Symbol として送られてくる(らしい)
    167151  def gen_ep_func_body( file, b_singleton, ct_name, global_ct_name, sig_name, ep_name, func_name, func_global_name, func_type, params )
    168152
    169     # unmarshaler クラスか?
     153    # unmarshaler クラスか?
    170154    if ct_name == @unmarshaler_celltype_name.to_sym then
    171155      gen_ep_func_body_unmarshal( file, b_singleton, ct_name, global_ct_name, sig_name, ep_name, func_name, func_global_name, func_type, params )
     
    175159  end
    176160
    177   #===  marshal コードの生成
     161  #===  marshal コードの生成
    178162  def gen_ep_func_body_marshal( file, b_singleton, ct_name, global_ct_name, sig_name, ep_name, func_name, func_global_name, func_type, params )
    179163
     
    181165    b_ret_er = false
    182166
    183     # 関数の戻り値のå
    184 ƒã®åž‹ã‚’å¾—ã‚‹(typedef されている場合)
     167    # 関数の戻り値の元の型を得る(typedef されている場合)
    185168    type = func_type.get_type.get_original_type
    186169
    187     # 戻り値記憶用の変数を出力(void 型の関数では出力しない)
     170    # 戻り値記憶用の変数を出力(void 型の関数では出力しない)
    188171    if ! type.kind_of?( VoidType ) then
    189172      if func_type.get_type.kind_of?( DefinedType ) && ( func_type.get_type.get_type_str == "ER" || func_type.get_type.get_type_str == "ER_INT" ) then
     
    200183    file.print( "    FLGPTN  flgptn;\n" )
    201184
    202     # 呼びå
    203 ˆã® signature を取り出す
     185    # 呼び先の signature を取り出す
    204186    signature = @signature
    205187
    206     # 関数 ID (整数値)
     188    # 関数 ID (整数値)
    207189    func_id = signature.get_id_from_func_name( func_name )
    208190    file.print( "    int16_t  func_id_ = #{func_id};    /* id of #{func_name}: #{func_id} */\n" )
     
    210192    file.print( "    uint8_t  msg[256];\n" )
    211193
    212     # シングルトンでないか?
     194    # シングルトンでないか?
    213195    if ! b_singleton then
    214196
    215       # singleton でなければ p_cellcb 取得コードを出力
     197      # singleton でなければ p_cellcb 取得コードを出力
    216198      file.print <<EOT
    217199    #{ct_name}_CB *p_cellcb;
     
    221203EOT
    222204
    223       # エラーを返すか?
     205      # エラーを返すか?
    224206      if b_ret_er then
    225207        file.print <<EOT
     
    231213        file.print <<EOT
    232214    }else{
    233         /* エラー処理コードをここに記述 */
    234     }
    235 EOT
    236       end
    237     end
    238 
    239     # channel lock コード
     215        /* エラー処理コードをここに記述 */
     216    }
     217EOT
     218      end
     219    end
     220
     221    # channel lock コード
    240222    file.print <<EOT
    241223    ///* Channel Lock */
     
    246228
    247229=begin
    248     # SOP を送信
    249     file.print "    /* SOPの送出 */\n"
     230    # SOP を送信
     231    file.print "    /* SOPの送出 */\n"
    250232    file.print "    if( ( ercd_ = cTDR_sendSOP( true ) ) != E_OK )\n"
    251233    file.print "      goto error_reset;\n"
    252234=end
    253235
    254     # func_id を送信
    255     file.print "    /* 関数 id の送出 */\n"
     236    # func_id を送信
     237    file.print "    /* 関数 id の送出 */\n"
    256238=begin
    257239    file.print "    if( ( ercd_ = cTDR_putInt16( func_id_ ) ) != E_OK )\n"
     
    263245    # p "#{ct_name}, #{sig_name}, #{func_name}, #{func_global_name}"
    264246
    265     b_get = false    # marshal なら put
     247    b_get = false    # marshal なら put
    266248    b_marshal = true  # marshal
    267249
    268     # in 方向のå
    269 ¥å‡ºåŠ›ã‚’出力
     250    # in 方向の入出力を出力
    270251    @index = 2
    271     file.print "    /* å
    272 ¥åŠ›å¼•æ•°é€å‡º */\n"
     252    file.print "    /* 入力引数送出 */\n"
    273253    print_params( params, file, 1, b_marshal, b_get, true, func_type.is_oneway? )
    274254    print_params( params, file, 1, b_marshal, b_get, false, func_type.is_oneway? )
     
    280260=end
    281261
    282     file.print "    /* EOPの送出(パケットの掃きだし) */\n"
     262    file.print "    /* EOPの送出(パケットの掃きだし) */\n"
    283263    if ! func_type.is_oneway? then
    284264      b_continue = "true"
     
    315295
    316296    if( b_void == false )then
    317       # 呼びå
    318 ƒã«æˆ»ã‚Šå€¤ã‚’リターン
     297      # 呼び元に戻り値をリターン
    319298      file.print( "    cMessageBuffer_receive(&retval_);\n" )
    320299      file.print( "    return retval_;\n" )
     
    332311EOT
    333312
    334     # channel lock コード
     313    # channel lock コード
    335314    file.print <<EOT
    336315    ///* Channel Lock */
     
    341320
    342321    if( b_ret_er != false )then
    343       # 呼びå
    344 ƒã«æˆ»ã‚Šå€¤ã‚’リターン
     322      # 呼び元に戻り値をリターン
    345323      file.print( "    return ercd_;\n" )
    346324    else
     
    350328  end
    351329
    352   #===  unmarshal コードの生成
     330  #===  unmarshal コードの生成
    353331  def gen_ep_func_body_unmarshal( file, b_singleton, ct_name, global_ct_name, sig_name, ep_name, func_name, func_global_name, func_type, params )
    354332
     
    356334    b_ret_er = false
    357335
    358     # func_id を得るコードを生成
     336    # func_id を得るコードを生成
    359337    file.print <<EOT
    360338
     
    377355        file.print <<EOT
    378356    }else{
    379         /* エラー処理コードをここに記述 */
     357        /* エラー処理コードをここに記述 */
    380358    }
    381359EOT
     
    387365
    388366#if 0
    389     /* SOPのチェック */
     367    /* SOPのチェック */
    390368    if( (ercd_=cTDR_receiveSOP( false )) != E_OK )
    391369        goto error_reset;
    392     /* func_id の取得 */
     370    /* func_id の取得 */
    393371    if( (ercd_=cTDR_getInt16( &func_id_ )) != E_OK )
    394372        goto error_reset;
     
    405383EOT
    406384
    407     # 呼びå
    408 ˆã® signature を取り出す
     385    # 呼び先の signature を取り出す
    409386    # port = @celltype.find( @next_cell_port_name )
    410387    # signature = port.get_signature
    411388    signature = @signature
    412389
    413     # through の signature に含まれる すべての関数について
     390    # through の signature に含まれる すべての関数について
    414391    signature.get_function_head_array.each { |f|
    415392      f_name = f.get_name
     
    417394      id = signature.get_id_from_func_name( f_name )
    418395
    419       # 関数は返り値を持つか?
     396      # 関数は返り値を持つか?
    420397      if f_type.get_type.kind_of?( VoidType ) then
    421398        b_void = true
     
    424401      end
    425402
    426       # パケットの終わりをチェック(未受け取りのデータが残っていないかチェック)
     403      # パケットの終わりをチェック(未受け取りのデータが残っていないかチェック)
    427404      file.print "    case #{id}:       /*** #{f_name} ***/ \n"
    428405      file.print "        if( tTransparentUnmarshaler_#{@signature.get_name}_#{f_name}() != E_OK )\n"
     
    433410
    434411    if @PPAllocatorSize then
    435       ppallocator_dealloc_str = "    /* PPAllocator のすべてを解放 */\n    cPPAllocator_dealloc_all();"
     412      ppallocator_dealloc_str = "    /* PPAllocator のすべてを解放 */\n    cPPAllocator_dealloc_all();"
    436413    else
    437414      ppallocator_dealloc_str = ""
     
    441418    file.print <<EOT
    442419    default:
    443 #if 0 // deleted by ishikawa: tSysLogが未実è£
    444 
     420#if 0 // deleted by ishikawa: tSysLogが未実装
    445421        syslog(LOG_INFO, "unmarshaler task: ERROR: unknown func_id: %d", func_id_ );
    446422#endif /* 0 */
     
    463439
    464440  # IN b_marshal, b_get
    465   #  b_marshal = true  && b_get == false   :  マーシャラでå
    466 ¥åŠ›å¼•æ•°é€å‡º
    467   #  b_marshal = true  && b_get == true    :  マーシャラで出力引数受取
    468   #  b_marshal = false && b_get == true    :  アンマーシャラでå
    469 ¥åŠ›å¼•æ•°å—取
    470   #  b_marshal = false && b_get == get     :  アンマーシャラで出力引数送出
     441  #  b_marshal = true  && b_get == false   :  マーシャラで入力引数送出
     442  #  b_marshal = true  && b_get == true    :  マーシャラで出力引数受取
     443  #  b_marshal = false && b_get == true    :  アンマーシャラで入力引数受取
     444  #  b_marshal = false && b_get == get     :  アンマーシャラで出力引数送出
    471445  def print_params( params, file, nest, b_marshal, b_get, b_referenced, b_oneway = false )
    472446    params.each{ |param|
     
    479453      type = param.get_type
    480454      if b_oneway && dir == :IN && type.get_original_type.kind_of?( PtrType ) || type.get_original_type.kind_of?( ArrayType ) then
    481         # oneway, in, PtrType の場合コピー
     455        # oneway, in, PtrType の場合コピー
    482456        alloc_cp = "cPPAllocator_alloc"
    483457        alloc_cp_extra = nil
     
    501475  end
    502476
    503   #=== コピーしない引数渡しコードの出力
     477  #=== コピーしない引数渡しコードの出力
    504478  def print_param_nc( name, type, file, nest, b_marshal, outer, outer2, b_get )
    505479    indent = "    " * ( nest + 1 )
     
    521495        when :SIGNED
    522496          if bit_size == -1 || bit_size == -11 then
    523             # signed char の場合、signed を指定する
     497            # signed char の場合、signed を指定する
    524498            signC = "S"
    525499            sign  = "s"
     
    640614
    641615
    642   #=== PREAMBLE 部のコード生成
    643   # アンマーシャラセルタイプの場合、アンマーシャラ関数のプロトタイプ宣言を生成
     616  #=== PREAMBLE 部のコード生成
     617  # アンマーシャラセルタイプの場合、アンマーシャラ関数のプロトタイプ宣言を生成
    644618  def gen_preamble file, b_singleton, ct_name, global_name
    645619    if ct_name != @unmarshaler_celltype_name.to_sym then
     
    647621    end
    648622
    649     file.print "/* アンマーシャラ関数のプロトタイプ宣言 */\n"
    650     # signature に含まれる すべての関数について
     623    file.print "/* アンマーシャラ関数のプロトタイプ宣言 */\n"
     624    # signature に含まれる すべての関数について
    651625    @signature.get_function_head_array.each { |f|
    652626      f_name = f.get_name
     
    660634  end
    661635
    662   #=== POSTAMBLE 部のコード生成
    663   # アンマーシャラセルタイプの場合、アンマーシャラ関数の生成
     636  #=== POSTAMBLE 部のコード生成
     637  # アンマーシャラセルタイプの場合、アンマーシャラ関数の生成
    664638  def gen_postamble file, b_singleton, ct_name, global_name
    665639    if ct_name != @unmarshaler_celltype_name.to_sym then
     
    667641    end
    668642
    669     file.print "\n/*** アンマーシャラ関数 ***/\n\n"
     643    file.print "\n/*** アンマーシャラ関数 ***/\n\n"
    670644    @signature.get_function_head_array.each { |f|
    671645      f_name = f.get_name
     
    673647      id = @signature.get_id_from_func_name( f_name )
    674648
    675       # 関数は返り値を持つか?
     649      # 関数は返り値を持つか?
    676650      if f_type.get_type.kind_of?( VoidType ) then
    677651        b_void = true
     
    691665      file.print "      ER  ercd_;\n"
    692666
    693       # 引数を受取る変数の定義
     667      # 引数を受取る変数の定義
    694668      param_list = f.get_declarator.get_type.get_paramlist.get_items
    695669           # FuncHead->  Decl->    FuncType->ParamList
     
    706680        end
    707681
    708         type_str = type.get_type_str.gsub( /\bconst\b */, "" ) # "const" を外す
     682        type_str = type.get_type_str.gsub( /\bconst\b */, "" ) # "const" を外す
    709683
    710684        file.printf( "    %-12s %s%s%s%s;\n", type_str, aster, name, aster2, type.get_type_str_post )
    711685      }
    712686
    713       # 戻り値を受け取る変数の定義
     687      # 戻り値を受け取る変数の定義
    714688      if ! b_void then
    715689        if f.is_oneway? then
    716           retval_ptr = ""   # oneway の場合、受け取るが捨てられる
     690          retval_ptr = ""   # oneway の場合、受け取るが捨てられる
    717691        else
    718692          # =begin ishikawa modified
     
    724698      end
    725699
    726       # in 方向のå
    727 ¥å‡ºåŠ›ã‚’å
    728 ¥åŠ›
    729       file.print "\n        /* å
    730 ¥åŠ›å¼•æ•°å—取 */\n"
    731       b_get = true    # unmarshal では get
     700      # in 方向の入出力を入力
     701      file.print "\n        /* 入力引数受取 */\n"
     702      b_get = true    # unmarshal では get
    732703      b_marshal  = false
    733704      @index = 2
     
    740711      end
    741712=end
    742       # パケットの受信完了
    743       # mikan 本当は、対象関数を呼出す後に実施したい.呼出しパケットの使用終わりを宣言する目的として
    744       file.print "        /* パケット終わりをチェック */\n"
     713      # パケットの受信完了
     714      # mikan 本当は、対象関数を呼出す後に実施したい.呼出しパケットの使用終わりを宣言する目的として
     715      file.print "        /* パケット終わりをチェック */\n"
    745716      if ! f.is_oneway? then
    746717        b_continue = "true"
     
    752723      file.print "        goto error_reset;\n\n"
    753724=end
    754       # 対象関数を呼出す
    755       file.print "    /* 対象関数の呼出し */\n"
     725      # 対象関数を呼出す
     726      file.print "    /* 対象関数の呼出し */\n"
    756727      if b_void then
    757728        file.print( "    cServerCall_#{f_name}(" )
     
    768739      file.print( " );\n" )
    769740
    770       # 戻り値、出力引数の受取コードの生成
     741      # 戻り値、出力引数の受取コードの生成
    771742
    772743      if ! b_void && ! f.is_oneway? then
     
    775746
    776747      end
    777       # oneway の場合出力、戻り値が無く、受取をå¾
    778 ãŸãªã„(非同期な呼出し)
     748      # oneway の場合出力、戻り値が無く、受取を待たない(非同期な呼出し)
    779749      if ! f.is_oneway? then
    780750        file.print <<EOT
    781     /* 関数処理の終了を通知 */
     751    /* 関数処理の終了を通知 */
    782752    if( ( ercd_ = cEventflag_set( 0x01 ) ) != E_OK ){
    783753      goto error_reset;
  • EcnlProtoTool/trunk/asp3_dcre/tecsgen/tecslib/plugin/lib/GenOpaqueMarshaler.rb

    • Property svn:mime-type changed from text/x-ruby to text/x-ruby;charset=UTF-8
    r270 r321  
    66#   Copyright (C) 2008-2014 by TOPPERS Project
    77#--
    8 #   ä¸Šè¨˜è‘—作権è€
    9 ã¯ï¼Œä»¥ä¸‹ã®(1)~(4)の条件を満たす場合に限り,本ソフトウェ
    10 #   ã‚¢ï¼ˆæœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã‚’改変したものを含む.以下同じ)を使用・複製・改
    11 #   å¤‰ãƒ»å†é
    12 å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
    13 #   (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
    14 #       æ¨©è¡¨ç¤ºï¼Œã“の利用条件および下記の無保証規定が,そのままの形でソー
    15 #       ã‚¹ã‚³ãƒ¼ãƒ‰ä¸­ã«å«ã¾ã‚Œã¦ã„ること.
    16 #   (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
    17 #       ç”¨ã§ãã‚‹å½¢ã§å†é
    18 å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é
    19 å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
    20 #       è€
    21 ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ãªã©ï¼‰ã«ï¼Œä¸Šè¨˜ã®è‘—作権表示,この利用条件および下記
    22 #       ã®ç„¡ä¿è¨¼è¦å®šã‚’掲載すること.
    23 #   (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
    24 #       ç”¨ã§ããªã„形で再é
    25 å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
    26 #       ã¨ï¼Ž
    27 #     (a) 再é
    28 å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€
    29 ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ãªã©ï¼‰ã«ï¼Œä¸Šè¨˜ã®è‘—
    30 #         ä½œæ¨©è¡¨ç¤ºï¼Œã“の利用条件および下記の無保証規定を掲載すること.
    31 #     (b) 再é
    32 å¸ƒã®å½¢æ
    33 ‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
    34 #         å ±å‘Šã™ã‚‹ã“と.
    35 #   (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
    36 #       å®³ã‹ã‚‰ã‚‚,上記著作権è€
    37 ãŠã‚ˆã³TOPPERSプロジェクトをå
    38 è²¬ã™ã‚‹ã“と.
    39 #       ã¾ãŸï¼Œæœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã®ãƒ¦ãƒ¼ã‚¶ã¾ãŸã¯ã‚¨ãƒ³ãƒ‰ãƒ¦ãƒ¼ã‚¶ã‹ã‚‰ã®ã„かなる理
    40 #       ç”±ã«åŸºã¥ãè«‹æ±‚からも,上記著作権è€
    41 ãŠã‚ˆã³TOPPERSプロジェクトを
    42 #       å
    43 è²¬ã™ã‚‹ã“と.
     8#   上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
     9#   ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
     10#   変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
     11#   (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
     12#       権表示,この利用条件および下記の無保証規定が,そのままの形でソー
     13#       スコード中に含まれていること.
     14#   (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
     15#       用できる形で再配布する場合には,再配布に伴うドキュメント(利用
     16#       者マニュアルなど)に,上記の著作権表示,この利用条件および下記
     17#       の無保証規定を掲載すること.
     18#   (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
     19#       用できない形で再配布する場合には,次のいずれかの条件を満たすこ
     20#       と.
     21#     (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
     22#         作権表示,この利用条件および下記の無保証規定を掲載すること.
     23#     (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
     24#         報告すること.
     25#   (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
     26#       害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
     27#       また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
     28#       由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
     29#       免責すること.
    4430
    45 #   æœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã¯ï¼Œç„¡ä¿è¨¼ã§æä¾›ã•ã‚Œã¦ã„るものである.上記著作権è€
    46 ãŠ
    47 #   ã‚ˆã³TOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
    48 #   ã«å¯¾ã™ã‚‹é©åˆæ€§ã‚‚含めて,いかなる保証も行わない.また,本ソフトウェ
    49 #   ã‚¢ã®åˆ©ç”¨ã«ã‚ˆã‚Šç›´æŽ¥çš„または間接的に生じたいかなる損害に関しても,そ
    50 #   ã®è²¬ä»»ã‚’負わない.
     31#   本ソフトウェアは,無保証で提供されているものである.上記著作権者お
     32#   よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
     33#   に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
     34#   アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
     35#   の責任を負わない.
    5136
    52 #   $Id: GenOpaqueMarshaler.rb 1011 2016-07-11 02:20:01Z coas-nagasima $
     37#   $Id$
    5338#++
    5439
    5540#== GenOpaqueMarshaler
    56 # OpaqueRPCPlugin, sharedOpaqueRPCPlugin å
    57 ±é€šã®è¦ç´ ã‚’集めたモジュール
     41# OpaqueRPCPlugin, sharedOpaqueRPCPlugin 共通の要素を集めたモジュール
    5842module GenOpaqueMarshaler
    5943
    60   # プラグイン引数名と Proc
     44  # プラグイン引数名と Proc
    6145  RPCPluginArgProc = {
    6246    "clientChannelCelltype" => Proc.new { |obj,rhs| obj.set_clientChannelCelltype rhs },
     
    7963  }
    8064
    81   ##### プラグイン引数チェック関数
    82 
    83   #=== プラグイン引数 taskPriority のチェック
     65  ##### プラグイン引数チェック関数
     66
     67  #=== プラグイン引数 taskPriority のチェック
    8468  def set_taskPriority( rhs )
    8569    @taskPriority = rhs
    8670  end
    8771
    88   #=== プラグイン引数 serverChannelCelltype のチェック
     72  #=== プラグイン引数 serverChannelCelltype のチェック
    8973  def set_serverChannelCelltype( rhs )
    9074    @serverChannelCelltype = rhs.to_sym
     
    9882  end
    9983
    100   #=== プラグイン引数 clientChannelCelltype のチェック
     84  #=== プラグイン引数 clientChannelCelltype のチェック
    10185  def set_clientChannelCelltype( rhs )
    10286    @clientChannelCelltype = rhs.to_sym
     
    11094  end
    11195
    112   #=== プラグイン引数 serverChannelCell のチェック
     96  #=== プラグイン引数 serverChannelCell のチェック
    11397  def set_serverChannelCell( rhs )
    11498    @serverChannelCell = rhs.to_sym
    115     # ChannelCell はプラグインで生成されるため、ここではチェックできない
     99    # ChannelCell はプラグインで生成されるため、ここではチェックできない
    116100    # path = [ "::", @serverChannelCell ]
    117101    # obj = Namespace.find( path )
     
    121105  end
    122106
    123   #=== プラグイン引数 clientChannelCell のチェック
     107  #=== プラグイン引数 clientChannelCell のチェック
    124108  def set_clientChannelCell( rhs )
    125109    @clientChannelCell = rhs.to_sym
    126     # ChannelCell はプラグインで生成されるため、ここではチェックできない
     110    # ChannelCell はプラグインで生成されるため、ここではチェックできない
    127111    # path = [ "::", @clientChannelCell ]
    128112    # obj = Namespace.find( path )
     
    132116  end
    133117
    134   #=== プラグイン引数 serverChannelInitializer のチェック
     118  #=== プラグイン引数 serverChannelInitializer のチェック
    135119  def set_serverChannelInitializer( rhs )
    136120    @serverChannelInitializer = rhs.to_sym
    137121  end
    138122
    139   #=== プラグイン引数 clientChannelInitializer のチェック
     123  #=== プラグイン引数 clientChannelInitializer のチェック
    140124  def set_clientChannelInitializer( rhs )
    141125    @clientChannelInitializer = rhs.to_sym
    142126  end
    143127
    144   #=== タスクタイプ taskCellype のチェック
     128  #=== タスクタイプ taskCellype のチェック
    145129  def set_taskCelltype( rhs )
    146130    @taskCelltype = rhs.to_sym
     
    154138  end
    155139
    156   #=== タスクタイプ stack\size のチェック
     140  #=== タスクタイプ stack\size のチェック
    157141  def set_stackSize( rhs )
    158142    @stackSize = rhs
    159143  end
    160144
    161   #=== プラグイン引数 PPAllocatorSize のチェック
     145  #=== プラグイン引数 PPAllocatorSize のチェック
    162146  def set_PPAllocatorSize( rhs )
    163147    @PPAllocatorSize = rhs
    164148  end
    165149
    166   #=== プラグイン引数 TDRCelltype のチェック
     150  #=== プラグイン引数 TDRCelltype のチェック
    167151  def set_TDRCelltype( rhs )
    168152    @TDRCelltype = rhs.to_sym
     
    176160  end
    177161
    178   #=== プラグイン引数 substituteAllocator のチェック
    179   # オプション引数が、以下の形式であることをチェック
     162  #=== プラグイン引数 substituteAllocator のチェック
     163  # オプション引数が、以下の形式であることをチェック
    180164  #     substituteAllocator(Alloc.eAlloc=>Subst.eAlloc,Alloc2.eAlloc=>Subst2.eAlloc)
    181165  def set_substituteAllocator( rhs )
    182     #str::String : 破壊される(マッチした残りになる)。str.empty? で空になったことをチェックできる
    183     #regexp::Regexp : 期å¾
    184 ã™ã‚‹ãƒˆãƒ¼ã‚¯ãƒ³ã«ãƒžãƒƒãƒã™ã‚‹æ­£è¦è¡¨ç¾ã€‚ "\A" 出始める
    185     #expected::String: 期å¾
    186 ã™ã‚‹ãƒˆãƒ¼ã‚¯ãƒ³ã€regexp が出現しなかった場合にエラーメッセージとして表示
     166    #str::String : 破壊される(マッチした残りになる)。str.empty? で空になったことをチェックできる
     167    #regexp::Regexp : 期待するトークンにマッチする正規表現。 "\A" 出始める
     168    #expected::String: 期待するトークン、regexp が出現しなかった場合にエラーメッセージとして表示
    187169    def optparse (str,regexp,expected)
    188170      str.strip!
     
    198180    ident_rexpr = /\A(\w[\w\d]*)/
    199181
    200     # "Alloc.eAlloc=>CAlloc.eAlloc" の形式になっていることをチェック
     182    # "Alloc.eAlloc=>CAlloc.eAlloc" の形式になっていることをチェック
    201183    while true
    202184      lhs_alloc_cell = optparse( opt, ident_rexpr, "allocator cell name" )
     
    221203      break if ! rhs_alloc_ent
    222204
    223 #  ここでは、右辺のチェックはできない。右辺のセルは前方参ç
    224 §ã¨ãªã‚‹
     205#  ここでは、右辺のチェックはできない。右辺のセルは前方参照となる
    225206#      path = [ "::", rhs_alloc_cell.to_sym ]   # mikan namespace
    226207#      obj = Namespace.find( path )
     
    229210#      else
    230211#        ct = obj.get_celltype
    231 #        if ct #  nil なら既にエラー
     212#        if ct #  nil なら既にエラー
    232213#          ent = ct.find rhs_alloc_ent
    233214#          if ! ent.instance_of? Port || ent.get_port_type != :ENTRY || ent.get_signature == nil || ! ent.get_signature.is_allocator?
     
    250231  end
    251232
    252   #=== プラグイン引数 noServerChannelOpenerCode のチェック
     233  #=== プラグイン引数 noServerChannelOpenerCode のチェック
    253234  def set_noServerChannelOpenerCode( rhs )
    254235    rhs = rhs.to_sym
     
    262243  end
    263244
    264   #=== プラグイン引数 clientSemaphoreCelltype のチェック
     245  #=== プラグイン引数 clientSemaphoreCelltype のチェック
    265246  def set_clientSemaphoreCelltype rhs
    266247    @semaphoreCelltype = rhs.to_sym
     
    272253  end
    273254
    274   #=== プラグイン引数 clientSemaphoreInitializer のチェック
     255  #=== プラグイン引数 clientSemaphoreInitializer のチェック
    275256  def set_clientSemaphoreInitializer rhs
    276257    @semaphoreInitializer = rhs.to_sym
    277258  end
    278259
    279   #=== プラグイン引数 clientErrorHandler のチェック
     260  #=== プラグイン引数 clientErrorHandler のチェック
    280261  def set_clientErrorHandler rhs
    281262    @clientErrorHandler = rhs.to_sym
    282263  end
    283264
    284   #=== プラグイン引数 serverErrorHandler のチェック
     265  #=== プラグイン引数 serverErrorHandler のチェック
    285266  def set_serverErrorHandler rhs
    286267    @serverErrorHandler = rhs.to_sym
     
    288269
    289270
    290   #===  セルの名前を得る
    291   # ThroughPlugin::get_cell_name plugin.rb をオーバーライド
     271  #===  セルの名前を得る
     272  # ThroughPlugin::get_cell_name plugin.rb をオーバーライド
    292273  def get_cell_name
    293274    @cell_name
     
    295276  end
    296277
    297   #=== marshaler のセルタイプ名を設定する
     278  #=== marshaler のセルタイプ名を設定する
    298279  def initialize_opaque_marshaler
    299280
    300     # オプション設定される変数のデフォルトを設定
     281    # オプション設定される変数のデフォルトを設定
    301282    @taskPriority = 11
    302283    @stackSize  = 4096
     
    309290    @taskCelltype = :"tTask"
    310291    @PPAllocatorSize = nil
    311     # @TDRCelltype  = :"tTDR"   # "tNBOTDR" に変更の予定
     292    # @TDRCelltype  = :"tTDR"   # "tNBOTDR" に変更の予定
    312293    @TDRCelltype  = :"tNBOTDR"
    313294    @substituteAllocator = {}
     
    324305    @marshaler_celltype_file_name = "#{$gen}/#{@marshaler_celltype_name}.cdl"
    325306
    326     # signature で対応できないものをチェック
     307    # signature で対応できないものをチェック
    327308    @signature.each_param{ |func_decl, param_decl|
    328309      if param_decl.get_direction == :OUT then
     
    337318  end
    338319
    339   #=== GenOpaqueMarshaler# Opener Code の生成時のチェック
     320  #=== GenOpaqueMarshaler# Opener Code の生成時のチェック
    340321  def check_opener_code
    341     # サーバーチャンネルセルタイプが entry sServerChannelOpener eOpener を持つかどうかをチェック
    342     # mikan entry か (call でないか) をチェックしていない
     322    # サーバーチャンネルセルタイプが entry sServerChannelOpener eOpener を持つかどうかをチェック
     323    # mikan entry か (call でないか) をチェックしていない
    343324    # scct = Namespace.find ["::", @serverChannelCelltype] # mikan namespace
    344325    nsp = NamespacePath.analyze( @serverChannelCelltype.to_s )
     
    360341  end
    361342
    362   #=== GenOpaqueMarshaler# PPAllocator のå¿
    363 è¦æ€§ã‚’チェックする
     343  #=== GenOpaqueMarshaler# PPAllocator の必要性をチェックする
    364344  def check_PPAllocator
    365345    if @signature.need_PPAllocator?(true) then
     
    374354  def gen_marshaler_celltype
    375355    f = CFile.open( @marshaler_celltype_file_name, "w" )
    376     # 同じå†
    377 å®¹ã‚’二度書く可能性あり (AppFile は不可)
     356    # 同じ内容を二度書く可能性あり (AppFile は不可)
    378357
    379358    if @PPAllocatorSize then
     
    404383  end
    405384
    406   #===  受け口関数の本体コードを生成(頭部と末尾は別途出力)
    407   #ct_name:: Symbol    (through プラグインで生成された) セルタイプ名 .Symbol として送られてくる(らしい)
     385  #===  受け口関数の本体コードを生成(頭部と末尾は別途出力)
     386  #ct_name:: Symbol    (through プラグインで生成された) セルタイプ名 .Symbol として送られてくる(らしい)
    408387  def gen_ep_func_body( file, b_singleton, ct_name, global_ct_name, sig_name, ep_name, func_name, func_global_name, func_type, params )
    409388
    410     # unmarshaler クラスか?
     389    # unmarshaler クラスか?
    411390    if ct_name == @unmarshaler_celltype_name.to_sym then
    412391      gen_ep_func_body_unmarshal( file, b_singleton, ct_name, global_ct_name, sig_name, ep_name, func_name, func_global_name, func_type, params )
     
    416395  end
    417396
    418   #===  marshal コードの生成
     397  #===  marshal コードの生成
    419398  def gen_ep_func_body_marshal( file, b_singleton, ct_name, global_ct_name, sig_name, ep_name, func_name, func_global_name, func_type, params )
    420399
     
    422401    b_ret_er = false
    423402
    424     # 関数の戻り値のå
    425 ƒã®åž‹ã‚’å¾—ã‚‹(typedef されている場合)
     403    # 関数の戻り値の元の型を得る(typedef されている場合)
    426404    type = func_type.get_type.get_original_type
    427405
    428     # 戻り値記憶用の変数を出力(void 型の関数では出力しない)
     406    # 戻り値記憶用の変数を出力(void 型の関数では出力しない)
    429407    if ! type.is_void? then
    430408      file.print( "\t#{func_type.get_type.get_type_str}\t\tretval_;\n" )
     
    439417    file.print( "\tint16_t\tstate_;\n" )
    440418
    441     # 関数 ID (整数値)
     419    # 関数 ID (整数値)
    442420    func_id = "FUNCID_#{@signature.get_global_name}_#{func_name}".upcase
    443421    fid = @signature.get_id_from_func_name( func_name )
    444422    file.print( "\tint16_t\tfunc_id_ = #{func_id};      /* (id of '#{func_name}') = #{fid}*/\n" )
    445423
    446     # シングルトンでないか?
     424    # シングルトンでないか?
    447425    if ! b_singleton then
    448426
    449       # singleton でなければ p_cellcb 取得コードを出力
     427      # singleton でなければ p_cellcb 取得コードを出力
    450428      file.print <<EOT
    451429        #{ct_name}_CB *p_cellcb;
     
    455433EOT
    456434
    457       # エラーを返すか?
     435      # エラーを返すか?
    458436      if b_ret_er then
    459437        file.print <<EOT
     
    465443        file.print <<EOT
    466444        }else{
    467                 /* エラー処理コードをここに記述 */
     445                /* エラー処理コードをここに記述 */
    468446        }
    469447
     
    481459    end
    482460
    483     # channel lock コード
     461    # channel lock コード
    484462    file.print <<EOT
    485463
     
    490468EOT
    491469
    492     # SOP を送信
    493     file.print "        /* SOPの送出 */\n"
     470    # SOP を送信
     471    file.print "        /* SOPの送出 */\n"
    494472    file.print "        SET_RPC_STATE( state_, RPCSTATE_CLIENT_SEND_SOP );\n"
    495473    file.print "        if( ( ercd_ = cTDR_sendSOP( true ) ) != E_OK )\n"
    496474    file.print "                goto error_reset;\n"
    497475
    498     # func_id を送信
    499     file.print "        /* 関数 id の送出 */\n"
     476    # func_id を送信
     477    file.print "        /* 関数 id の送出 */\n"
    500478    file.print "        if( ( ercd_ = cTDR_putInt16( func_id_ ) ) != E_OK )\n"
    501479    file.print "                goto error_reset;\n"
     
    504482    # p "#{ct_name}, #{sig_name}, #{func_name}, #{func_global_name}"
    505483
    506     b_get = false    # marshal なら put
     484    b_get = false    # marshal なら put
    507485    b_marshal = true  # marshal
    508486
    509     # in 方向のå
    510 ¥å‡ºåŠ›ã‚’出力
     487    # in 方向の入出力を出力
    511488    if func_type.has_inward? then
    512       file.print "      /* å
    513 ¥åŠ›å¼•æ•°é€å‡º */\n"
     489      file.print "      /* 入力引数送出 */\n"
    514490      file.print "      SET_RPC_STATE( state_, RPCSTATE_CLIENT_SEND_BODY );\n"
    515491      print_params( params, file, 1, b_marshal, b_get, true, "eClientEntry", func_name )
     
    523499      b_continue = "false"
    524500    end
    525     file.print "        /* EOPの送出(パケットの掃きだし) */\n"
     501    file.print "        /* EOPの送出(パケットの掃きだし) */\n"
    526502    file.print "        SET_RPC_STATE( state_, RPCSTATE_CLIENT_SEND_EOP );\n"
    527503    file.print "        if( (ercd_=cTDR_sendEOP(#{b_continue})) != E_OK )\n"
    528504    file.print "                goto error_reset;\n\n"
    529505
    530     # send のメモリをデアロケート
     506    # send のメモリをデアロケート
    531507    if func_type.has_send? then
    532508      file.print "      /* dealloc send parameter while executing */\n"
     
    539515    if ! func_type.is_oneway? then
    540516
    541       file.print "      /* パケットの始まりをチェック */\n"
     517      file.print "      /* パケットの始まりをチェック */\n"
    542518      file.print "      SET_RPC_STATE( state_, RPCSTATE_CLIENT_RECV_SOP );\n"
    543519      file.print "      if( (ercd_=cTDR_receiveSOP( true )) != E_OK )\n"
    544520      file.print "              goto error_reset;\n"
    545521
    546       b_get = true     # marshaler は get
    547       file.print "      /* 戻り値の受け取り */\n"
     522      b_get = true     # marshaler get
     523      file.print "      /* 戻り値の受け取り */\n"
    548524      print_param( "retval_", func_type.get_type, file, 1, :RETURN, nil, nil, b_marshal, b_get )
    549525
     
    557533        indent = "      " * indent_level
    558534
    559         file.print "#{indent}/* 出力値の受け取り */\n"
     535        file.print "#{indent}/* 出力値の受け取り */\n"
    560536        file.print "#{indent}SET_RPC_STATE( state_, RPCSTATE_CLIENT_RECV_BODY );\n"
    561537        print_params( params, file, indent_level, b_marshal, b_get, true, "eClientEntry", func_name )
     
    567543      end
    568544
    569       file.print "\n    /* パケットの終わりをチェック */\n"
     545      file.print "\n    /* パケットの終わりをチェック */\n"
    570546      file.print "      SET_RPC_STATE( state_, RPCSTATE_CLIENT_RECV_EOP );\n"
    571547      file.print "      if( (ercd_=cTDR_receiveEOP(false)) != E_OK )\n"  # b_continue = false
     
    574550    end # ! func_type.is_oneway?
    575551
    576     # channel lock コード
     552    # channel lock コード
    577553    file.print <<EOT
    578554        /* Channel Unlock */
     
    583559
    584560    if( b_void == false )then
    585       # 呼びå
    586 ƒã«æˆ»ã‚Šå€¤ã‚’リターン
     561      # 呼び元に戻り値をリターン
    587562      file.print( "     return retval_;\n" )
    588563    else
     
    594569error_reset:
    595570EOT
    596     # send のメモリをデアロケート
     571    # send のメモリをデアロケート
    597572    if func_type.has_send? then
    598573      file.print "      /* dealloc send parameter */\n"
     
    603578    end
    604579
    605     # receive のメモリをデアロケート
     580    # receive のメモリをデアロケート
    606581    if func_type.has_receive? then
    607582      file.print( "     /* receive parameter */\n" )
     
    615590EOT
    616591
    617     # channel lock コード
     592    # channel lock コード
    618593    file.print <<EOT
    619594        /* Channel Unlock */
     
    626601
    627602    if( b_ret_er != false )then
    628       # 呼びå
    629 ƒã«æˆ»ã‚Šå€¤ã‚’リターン
     603      # 呼び元に戻り値をリターン
    630604      file.print( "     return ERCD( E_RPC, MERCD( ercd_ ) );\n" )
    631605    else
     
    635609  end
    636610
    637   #===  unmarshal コードの生成
     611  #===  unmarshal コードの生成
    638612  def gen_ep_func_body_unmarshal( file, b_singleton, ct_name, global_ct_name, sig_name, ep_name, func_name, func_global_name, func_type, params )
    639613
    640614    b_ret_er = true
    641615
    642     # func_id を得るコードを生成
     616    # func_id を得るコードを生成
    643617    file.print <<EOT
    644618
     
    662636        file.print <<EOT
    663637        }else{
    664                 /* エラー処理コードをここに記述 */
     638                /* エラー処理コードをここに記述 */
    665639        }
    666640EOT
     
    673647#endif
    674648
    675         /* SOPのチェック */
     649        /* SOPのチェック */
    676650        SET_RPC_STATE( state_, RPCSTATE_SERVER_RECV_SOP );
    677651        if( (ercd_=cTDR_receiveSOP( false )) != E_OK )
    678652                goto error_reset;
    679         /* func_id の取得 */
     653        /* func_id の取得 */
    680654        if( (ercd_=cTDR_getInt16( &func_id_ )) != E_OK )
    681655                goto error_reset;
     
    687661EOT
    688662
    689     # signature に含まれる すべての関数について
     663    # signature に含まれる すべての関数について
    690664    @signature.get_function_head_array.each { |f|
    691665      f_name = f.get_name
     
    701675
    702676    if @PPAllocatorSize then
    703       ppallocator_dealloc_str = "       /* PPAllocator のすべてを解放 */\n       cPPAllocator_dealloc_all();"
     677      ppallocator_dealloc_str = "       /* PPAllocator のすべてを解放 */\n     cPPAllocator_dealloc_all();"
    704678    else
    705679      ppallocator_dealloc_str = ""
     
    724698  end
    725699
    726   #=== PREAMBLE 部のコード生成
    727   # アンマーシャラセルタイプの場合、アンマーシャラ関数のプロトタイプ宣言を生成
     700  #=== PREAMBLE 部のコード生成
     701  # アンマーシャラセルタイプの場合、アンマーシャラ関数のプロトタイプ宣言を生成
    728702  def gen_preamble file, b_singleton, ct_name, global_name
    729703    if ct_name != @unmarshaler_celltype_name.to_sym then
     
    731705    end
    732706
    733     # string.h の include (memset, strlen のため)
     707    # string.h の include (memset, strlen のため)
    734708    file.print "/* header file (strlen, memset) */\n"
    735709    file.print "#include\t<string.h>\n\n"
    736710
    737     file.print "/* アンマーシャラ関数のプロトタイプ宣言 */\n"
    738     # signature に含まれる すべての関数について
     711    file.print "/* アンマーシャラ関数のプロトタイプ宣言 */\n"
     712    # signature に含まれる すべての関数について
    739713    @signature.get_function_head_array.each { |f|
    740714      f_name = f.get_name
     
    746720  end
    747721
    748   #=== POSTAMBLE 部のコード生成
    749   # アンマーシャラセルタイプの場合、個ã€
    750 ã®ã‚¢ãƒ³ãƒžãƒ¼ã‚·ãƒ£ãƒ©é–¢æ•°ã®ç”Ÿæˆ
     722  #=== POSTAMBLE 部のコード生成
     723  # アンマーシャラセルタイプの場合、個々のアンマーシャラ関数の生成
    751724  def gen_postamble file, b_singleton, ct_name, global_name
    752725    if ct_name != @unmarshaler_celltype_name.to_sym then
     
    754727    end
    755728
    756     file.print "\n/*** アンマーシャラ関数 ***/\n\n"
     729    file.print "\n/*** アンマーシャラ関数 ***/\n\n"
    757730    @signature.get_function_head_array.each { |f|
    758731      f_name = f.get_name
     
    760733      id = @signature.get_id_from_func_name( f_name )
    761734
    762       # 関数は返り値を持つか?
     735      # 関数は返り値を持つか?
    763736      b_ret_er = false
    764737      init_retval = ""
     
    784757      file.print "      ER      ercd_;\n"
    785758
    786       # 引数を受取る変数の定義
     759      # 引数を受取る変数の定義
    787760      params = f.get_declarator.get_type.get_paramlist.get_items
    788761           # FuncHead->  Decl->    FuncType->ParamList
     
    793766        dir = par.get_direction
    794767        if( dir == :RECEIVE )then
    795           # type は PtrType で、それを取り除いた型
     768          # type は PtrType で、それを取り除いた型
    796769          type = type.get_type
    797770        end
     
    811784        end
    812785
    813         type_str = type.get_type_str.gsub( /\bconst\b */, "" ) # "const" を外す
     786        type_str = type.get_type_str.gsub( /\bconst\b */, "" ) # "const" を外す
    814787        file.printf( "  %-12s %s%s%s%s%s;\n", type_str, aster, name, aster2, type.get_type_str_post, init )
    815788
     
    823796      end
    824797
    825       # in 方向のå
    826 ¥å‡ºåŠ›ã‚’å
    827 ¥åŠ›
    828       file.print "\n    /* å
    829 ¥åŠ›å¼•æ•°å—取 */\n"
     798      # in 方向の入出力を入力
     799      file.print "\n    /* 入力引数受取 */\n"
    830800      file.print "      SET_RPC_STATE( *state_, RPCSTATE_SERVER_RECV_BODY );\n"
    831       b_get = true    # unmarshal では get
     801      b_get = true    # unmarshal では get
    832802      b_marshal  = false
    833803      print_params( params, file, 1, b_marshal, b_get, true, "cServerCall", f_name )
     
    836806
    837807
    838       # パケットの受信完了
    839       file.print "      /* パケット終わりをチェック */\n"
     808      # パケットの受信完了
     809      file.print "      /* パケット終わりをチェック */\n"
    840810      file.print "      SET_RPC_STATE( *state_, RPCSTATE_SERVER_RECV_EOP );\n"
    841811      if ! f_type.is_oneway? then
     
    847817      file.print "              goto error_reset;\n\n"
    848818
    849       # out のメモリをアロケート
     819      # out のメモリをアロケート
    850820      dir = :OUT; alloc_cp = "cPPAllocator_alloc"; alloc_cp_extra = nil; nest = 1
    851821      alloc_for_out_params( params, file, nest, dir, alloc_cp, alloc_cp_extra )
    852822
    853       # 対象関数を呼出す
    854       file.print "      /* 対象関数の呼出し */\n"
     823      # 対象関数を呼出す
     824      file.print "      /* 対象関数の呼出し */\n"
    855825      file.print "      SET_RPC_STATE( *state_, RPCSTATE_SERVER_EXEC );\n"
    856826      if b_void then
     
    871841      file.print( " );\n" )
    872842
    873       # 戻り値、出力引数の受取コードの生成
    874 
    875       # oneway の場合出力、戻り値が無く、受取をå¾
    876 ãŸãªã„(非同期な呼出し)
     843      # 戻り値、出力引数の受取コードの生成
     844
     845      # oneway の場合出力、戻り値が無く、受取を待たない(非同期な呼出し)
    877846      if ! f.is_oneway? then
    878847
    879         file.print "\n  /* SOPの送出 */\n"
     848        file.print "\n  /* SOPの送出 */\n"
    880849        file.print "    SET_RPC_STATE( *state_, RPCSTATE_SERVER_SEND_SOP );\n"
    881850
     
    883852        file.print "            goto error_reset;\n"
    884853
    885         b_get = false     # unmarshaler は put
     854        b_get = false     # unmarshaler put
    886855        if( ! b_void )then
    887           file.print "  /* 戻り値の送出 */\n"
     856          file.print "  /* 戻り値の送出 */\n"
    888857          print_param( "retval_", f_type.get_type, file, 1, :RETURN, nil, nil, b_marshal, b_get )
    889858        end
     
    898867          indent = "    " * indent_level
    899868
    900           file.print "#{indent}/* 出力値の送出 */\n"
     869          file.print "#{indent}/* 出力値の送出 */\n"
    901870          file.print "#{indent}SET_RPC_STATE( *state_, RPCSTATE_SERVER_SEND_BODY );\n"
    902871          print_params( params, file, indent_level, b_marshal, b_get, true, "cServerCall", f_name )
    903872          print_params( params, file, indent_level, b_marshal, b_get, false, "cServerCall", f_name )
    904873
    905           # receive のメモリをデアロケート
     874          # receive のメモリをデアロケート
    906875          if f_type.has_receive? then
    907876            file.print "#{indent}/* dealloc receive parameter */\n"
     
    915884        end
    916885
    917         file.print "    /* パケットの終わり(掃きだし) */\n"
     886        file.print "    /* パケットの終わり(掃きだし) */\n"
    918887        file.print "    SET_RPC_STATE( *state_, RPCSTATE_SERVER_SEND_EOP );\n"
    919888        file.print "    if( (ercd_=cTDR_sendEOP(false)) != E_OK )\n"  # b_continue = false
     
    926895error_reset:
    927896EOT
    928       # send のリセット用デアロケート
     897      # send のリセット用デアロケート
    929898      if f_type.has_send? then
    930899        file.print "    /* dealloc send parameter */\n"
     
    935904      end
    936905
    937       # receive のメモリをデアロケート
     906      # receive のメモリをデアロケート
    938907      if f_type.has_receive? && b_ret_er then
    939908        file.print "    /* dealloc receive parameter */\n"
     
    947916      file.print "}\n\n"
    948917
    949       # ここ(個ã€
    950 ã®é–¢æ•°ï¼‰ã§ã¯ã‚¨ãƒ©ãƒ¼ãƒãƒ³ãƒ‰ãƒ©ãƒ¼ã¯å‘¼ã³å‡ºã•ãªã„。呼びå
    951 ƒï¼ˆã‚µãƒ¼ãƒãƒ¼ã®ãƒ¡ã‚¤ãƒ³é–¢æ•°ï¼‰ã§å‘¼ã³å‡ºã™ã€‚
     918      # ここ(個々の関数)ではエラーハンドラーは呼び出さない。呼び元(サーバーのメイン関数)で呼び出す。
    952919    }
    953920  end
     
    956923  #b_marshal:: bool
    957924  #b_get:: bool
    958   #  b_marshal = true  && b_get == false   :  マーシャラでå
    959 ¥åŠ›å¼•æ•°é€å‡º
    960   #  b_marshal = true  && b_get == true    :  マーシャラで出力引数受取
    961   #  b_marshal = false && b_get == false   :  アンマーシャラでå
    962 ¥åŠ›å¼•æ•°å—取
    963   #  b_marshal = false && b_get == true    :  アンマーシャラで出力引数送出
    964   #b_referenced:: size_is, count_is, string で参ç
    965 §ã•ã‚Œã¦ã„るものを出力
     925  #  b_marshal = true  && b_get == false   :  マーシャラで入力引数送出
     926  #  b_marshal = true  && b_get == true    :  マーシャラで出力引数受取
     927  #  b_marshal = false && b_get == false   :  アンマーシャラで入力引数受取
     928  #  b_marshal = false && b_get == true    :  アンマーシャラで出力引数送出
     929  #b_referenced:: size_is, count_is, string で参照されているものを出力
    966930  def print_params( params, file, nest, b_marshal, b_get, b_referenced, port_name, func_name )
    967931    params.each{ |param|
     
    986950        case dir
    987951        when :OUT, :INOUT
    988           alloc_cp = nil        # inout の b_get==true&&b_marsha==true のときアロケータコードは不用
     952          alloc_cp = nil        # inout の b_get==true&&b_marsha==true のときアロケータコードは不用
    989953          alloc_cp_extra = nil
    990954          print_param( param.get_name, param.get_type, file, nest, dir, nil, nil, b_marshal, b_get, alloc_cp, alloc_cp_extra )
     
    993957          alloc_cp_extra = nil
    994958          if b_get then
    995             outer = "(*"         # マーシャラ側では、ポインタが (send と比べ) 一つ多い
     959            outer = "(*"         # マーシャラ側では、ポインタが (send と比べ) 一つ多い
    996960            outer2 = ")"
    997961          else
    998             outer = nil          # アンマーシャラ側では、ポインタが一つ外されている
     962            outer = nil          # アンマーシャラ側では、ポインタが一つ外されている
    999963            outer2 = nil
    1000964          end
     
    1006970  end
    1007971
    1008   #=== アロケータコードを生成 (out のアンマーシャラ用)
     972  #=== アロケータコードを生成 (out のアンマーシャラ用)
    1009973  def alloc_for_out_params( params, file, nest, dir, alloc_cp, alloc_cp_extra )
    1010974    params.each{ |param|
     
    1016980  end
    1017981
    1018   #=== アロケータコードを生成 (out のアンマーシャラ用個別パラメータの生成)
     982  #=== アロケータコードを生成 (out のアンマーシャラ用個別パラメータの生成)
    1019983  def alloc_for_out_param( name, type, file, nest, outer, outer2, alloc_cp, alloc_cp_extra )
    1020984    org_type = type.get_original_type
     
    1029993      count = type.get_count; size = type.get_size; string = type.get_string
    1030994      if count || size || string then
    1031         loop_counter_type = IntType.new(16)   # mikan 方を size_is, count_is の引数の型とする
     995        loop_counter_type = IntType.new(16)   # mikan 方を size_is, count_is の引数の型とする
    1032996        if count then
    1033997          len = type.get_count.to_s
     
    10421006        end
    10431007
    1044         # size_is に max 指定がある場合、length が max をè¶
    1045 ãˆã¦ã„るかチェックするコードを生成
     1008        # size_is に max 指定がある場合、length が max を超えているかチェックするコードを生成
    10461009        if org_type.get_max != nil && string == nil then
    10471010          file.print "#{indent}if( #{len} > #{type.get_max} ){\t/* GenOpaqueMarshaler max check 2 */\n"
     
    10821045  end
    10831046
    1084   #=== 引数の一括デアロケートコードの生成
    1085   # send:マーシャラの最後、receive:アンマーシャラの最後で一括して引数をデアロケートする
     1047  #=== 引数の一括デアロケートコードの生成
     1048  # send:マーシャラの最後、receive:アンマーシャラの最後で一括して引数をデアロケートする
    10861049  def dealloc_for_params( params, file, nest, dir, dealloc_cp, b_reset = false )
    10871050    if b_reset then
     
    10971060        aster = ""
    10981061        if dir == :RECEIVE then
    1099           type = type.get_type.get_original_type   # ポインタを一つ外す
     1062          type = type.get_type.get_original_type   # ポインタを一つ外す
    11001063          if b_reset then
    11011064            aster = "*"
     
    11181081  end
    11191082
    1120   #== out で nullable な引数のæƒ
    1121 å ±ã‚’渡す
    1122   # out nullable の場合、in, send, receive のように、値を渡す直前ではなく、呼出し時に渡す
     1083  #== out で nullable な引数の情報を渡す
     1084  # out nullable の場合、in, send, receive のように、値を渡す直前ではなく、呼出し時に渡す
    11231085  def  print_out_nullable( params, file, nest, b_marshal );
    11241086    indent = "\t" * nest
     
    11301092        file.print "#{indent}\tgoto error_reset;\n"
    11311093      else
    1132         # 呼びå
    1133 ˆã¯ alloc_for_out_param で nullable の対応する
     1094        # 呼び先は alloc_for_out_param で nullable の対応する
    11341095        file.print "#{indent}if( (ercd_=cTDR_getInt8( &b_#{param.get_name}_null_)) != E_OK )\n"
    11351096        file.print "#{indent}\tgoto error_reset;\n"
  • EcnlProtoTool/trunk/asp3_dcre/tecsgen/tecslib/plugin/lib/GenParamCopy.rb

    • Property svn:mime-type changed from text/x-ruby to text/x-ruby;charset=UTF-8
    r270 r321  
    66#   Copyright (C) 2008-2014 by TOPPERS Project
    77#--
    8 #   ä¸Šè¨˜è‘—作権è€
    9 ã¯ï¼Œä»¥ä¸‹ã®(1)~(4)の条件を満たす場合に限り,本ソフトウェ
    10 #   ã‚¢ï¼ˆæœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã‚’改変したものを含む.以下同じ)を使用・複製・改
    11 #   å¤‰ãƒ»å†é
    12 å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
    13 #   (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
    14 #       æ¨©è¡¨ç¤ºï¼Œã“の利用条件および下記の無保証規定が,そのままの形でソー
    15 #       ã‚¹ã‚³ãƒ¼ãƒ‰ä¸­ã«å«ã¾ã‚Œã¦ã„ること.
    16 #   (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
    17 #       ç”¨ã§ãã‚‹å½¢ã§å†é
    18 å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é
    19 å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
    20 #       è€
    21 ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ãªã©ï¼‰ã«ï¼Œä¸Šè¨˜ã®è‘—作権表示,この利用条件および下記
    22 #       ã®ç„¡ä¿è¨¼è¦å®šã‚’掲載すること.
    23 #   (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
    24 #       ç”¨ã§ããªã„形で再é
    25 å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
    26 #       ã¨ï¼Ž
    27 #     (a) 再é
    28 å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€
    29 ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ãªã©ï¼‰ã«ï¼Œä¸Šè¨˜ã®è‘—
    30 #         ä½œæ¨©è¡¨ç¤ºï¼Œã“の利用条件および下記の無保証規定を掲載すること.
    31 #     (b) 再é
    32 å¸ƒã®å½¢æ
    33 ‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
    34 #         å ±å‘Šã™ã‚‹ã“と.
    35 #   (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
    36 #       å®³ã‹ã‚‰ã‚‚,上記著作権è€
    37 ãŠã‚ˆã³TOPPERSプロジェクトをå
    38 è²¬ã™ã‚‹ã“と.
    39 #       ã¾ãŸï¼Œæœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã®ãƒ¦ãƒ¼ã‚¶ã¾ãŸã¯ã‚¨ãƒ³ãƒ‰ãƒ¦ãƒ¼ã‚¶ã‹ã‚‰ã®ã„かなる理
    40 #       ç”±ã«åŸºã¥ãè«‹æ±‚からも,上記著作権è€
    41 ãŠã‚ˆã³TOPPERSプロジェクトを
    42 #       å
    43 è²¬ã™ã‚‹ã“と.
     8#   上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
     9#   ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
     10#   変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
     11#   (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
     12#       権表示,この利用条件および下記の無保証規定が,そのままの形でソー
     13#       スコード中に含まれていること.
     14#   (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
     15#       用できる形で再配布する場合には,再配布に伴うドキュメント(利用
     16#       者マニュアルなど)に,上記の著作権表示,この利用条件および下記
     17#       の無保証規定を掲載すること.
     18#   (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
     19#       用できない形で再配布する場合には,次のいずれかの条件を満たすこ
     20#       と.
     21#     (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
     22#         作権表示,この利用条件および下記の無保証規定を掲載すること.
     23#     (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
     24#         報告すること.
     25#   (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
     26#       害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
     27#       また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
     28#       由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
     29#       免責すること.
    4430
    45 #   æœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã¯ï¼Œç„¡ä¿è¨¼ã§æä¾›ã•ã‚Œã¦ã„るものである.上記著作権è€
    46 ãŠ
    47 #   ã‚ˆã³TOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
    48 #   ã«å¯¾ã™ã‚‹é©åˆæ€§ã‚‚含めて,いかなる保証も行わない.また,本ソフトウェ
    49 #   ã‚¢ã®åˆ©ç”¨ã«ã‚ˆã‚Šç›´æŽ¥çš„または間接的に生じたいかなる損害に関しても,そ
    50 #   ã®è²¬ä»»ã‚’負わない.
     31#   本ソフトウェアは,無保証で提供されているものである.上記著作権者お
     32#   よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
     33#   に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
     34#   アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
     35#   の責任を負わない.
    5136
    52 #   $Id: GenParamCopy.rb 1011 2016-07-11 02:20:01Z coas-nagasima $
     37#   $Id$
    5338#++
    5439
    5540#= ParamCopy
    5641#
    57 # パラメータコピーするマーシャラ/アンマーシャラコードを生成するメソッド print_param を提供する.
    58 # RPCPlugin, OpaqueRPCPlugin に include される.
    59 # RPCPlugin (トランスペアレント) では、oneway 関数で in のポインタ引数の場合に限って print_param が用いられる.
     42# パラメータコピーするマーシャラ/アンマーシャラコードを生成するメソッド print_param を提供する.
     43# RPCPlugin, OpaqueRPCPlugin に include される.
     44# RPCPlugin (トランスペアレント) では、oneway 関数で in のポインタ引数の場合に限って print_param が用いられる.
    6045#
    6146module  GenParamCopy
    6247
    63   #=== 引数の転送コードを生成
     48  #=== 引数の転送コードを生成
    6449
    6550  def print_param( name, type, file, nest, dir, outer, outer2, b_marshal, b_get, alloc_cp = nil, alloc_cp_extra = nil, name_list = nil )
     
    7661EOT
    7762        if ( dir == :SEND || dir == :RECEIVE ) && type.get_type.has_pointer? then
    78           # send, receive の場合は、エラーリセットに備え NULL にする
     63          # send, receive の場合は、エラーリセットに備え NULL にする
    7964          file.print <<EOT
    8065#{indent}memset( (void *)#{outer}#{name}#{outer2}#{alloc_cp_extra}, 0, sizeof(#{type.get_type.get_type_str}#{type.get_type.get_type_str_post})*(#{size_str});   /* GenParamCopy Alloc1 */
     
    10388        when :SIGNED
    10489          if bit_size == -1 || bit_size == -11 then
    105             sign = "S"   # signed char の場合のみ S がつく
     90            sign = "S"   # signed char の場合のみ S がつく
    10691          else
    10792            sign = ""
     
    156141        nest = print_nullable_pre( name, type, file, nest, dir, outer, outer2, b_marshal, b_get )
    157142        indent = "\t" * nest
    158         loop_counter_type = IntType.new(32)   # mikan 型を size_is, count_is の引数の型とする
     143        loop_counter_type = IntType.new(32)   # mikan 型を size_is, count_is の引数の型とする
    159144        file.print "#{indent}{\t/* GenParamCopy 4 */\n"
    160145        file.print "#{indent}   #{loop_counter_type.get_type_str}  i__#{nest}, length__#{nest};\n"
     
    168153            count_str = count.to_str( name_list, outer, outer2 )
    169154          else
    170             # size_is はå¿
    171 é ˆ. count_is はオプション
     155            # size_is は必須. count_is はオプション
    172156            count_str = size_str
    173157          end
    174158          file.print "#{indent} length__#{nest} = #{count_str};\t/* GenParamCopy 5 */\n"
    175159
    176           # size_is に max 指定がある場合、length が max をè¶
    177 ãˆã¦ã„るかチェックするコードを生成
    178               # alloc_cp == nil のとき dir は INOUT, OUT のはず (条件が冗長)。試験が終わっているので、次回見直し時に外す
     160          # size_is に max 指定がある場合、length が max を超えているかチェックするコードを生成
     161              # alloc_cp == nil のとき dir は INOUT, OUT のはず (条件が冗長)。試験が終わっているので、次回見直し時に外す
    179162          if b_get && type.get_max != nil && ! ( ( dir == :INOUT || dir == :OUT ) && alloc_cp == nil ) then
    180163            file.print "#{indent}       if( length__#{nest} > #{type.get_max.to_s} ){\t/* GenParamCopy max check 1 */\n"
     
    202185              file.print "#{indent}     length__#{nest} = STRLEN#{b_size}(#{outer}#{name}#{outer2})+1;\t/* GenParamCopy 7 */\n"
    203186            end
    204             size_str = "length__#{nest}"     # string の場合、strnlen 以上の領域を確保しない
     187            size_str = "length__#{nest}"     # string の場合、strnlen 以上の領域を確保しない
    205188          else
    206189            if ( dir == :INOUT ) then
    207190              if ( string.instance_of? Expression ) then
    208191                len = string.to_str( name_list, outer, outer2 )
    209                 size_str = "#{len}"              # string(len) の場合 len を確保する
     192                size_str = "#{len}"              # string(len) の場合 len を確保する
    210193              else
    211194                raise "unsuscripted string used for inout parameter #{name}"
    212195              end
    213196            else
    214               size_str = "length__#{nest}"     # string の場合、strnlen 以上の領域を確保しない
     197              size_str = "length__#{nest}"     # string の場合、strnlen 以上の領域を確保しない
    215198            end
    216199          end
     
    224207EOT
    225208          if ( dir == :SEND || dir == :RECEIVE ) && type.get_type.has_pointer? then
    226             # send, receive の場合は、エラーリセットに備え NULL にする
     209            # send, receive の場合は、エラーリセットに備え NULL にする
    227210            file.print <<EOT
    228211#{indent}       memset( (void *)#{outer}#{name}#{outer2}#{alloc_cp_extra}, 0, sizeof(#{type.get_type.get_type_str}#{type.get_type.get_type_str_post})*(#{size_str}) );   /* GenParamCopy Alloc2 */
     
    251234EOT
    252235          if ( dir == :SEND || dir == :RECEIVE ) && type.get_type.has_pointer? then
    253             # send, receive の場合は、エラーリセットに備え NULL にする
     236            # send, receive の場合は、エラーリセットに備え NULL にする
    254237            file.print <<EOT
    255238#{indent}memset( (void *)#{outer}#{name}#{outer2}#{alloc_cp_extra}, 0, sizeof(#{type.get_type.get_type_str}#{type.get_type.get_type_str_post}) );   /* GenParamCopy Alloc3 */
     
    286269        size_str = subsc.to_str( name_list, outer, outer2 )
    287270
    288         loop_counter_type = IntType.new(32)   # mikan 型を size_is, count_is の引数の型とする
     271        loop_counter_type = IntType.new(32)   # mikan 型を size_is, count_is の引数の型とする
    289272        file.print "#{indent}{\t/* GenParamCopy 11 */\n"
    290273        file.print "#{indent}   #{loop_counter_type.get_type_str}  i__#{nest}, length__#{nest} = #{size_str};\n"
     
    302285    if type.is_nullable? then
    303286      indent = "        " * nest
    304       if dir == :OUT then  # OUT の場合 print_out_nullable で NULL かどうかのæƒ
    305 å ±ã‚’渡す
     287      if dir == :OUT then  # OUT の場合 print_out_nullable で NULL かどうかの情報を渡す
    306288        # 'null or not' is sent in the function 'print_out_nullable'
    307289        if b_get then
     
    321303#{indent}       if( ! b_null_ ){
    322304EOT
    323           else # dir = :INOUT, b_marshal = true, b_get = true の場合、NULL かどうかのæƒ
    324 å ±ã‚’渡さない
     305          else # dir = :INOUT, b_marshal = true, b_get = true の場合、NULL かどうかの情報を渡さない
    325306            file.print <<EOT
    326307#{indent}       int8_t  b_null_ = (#{outer}#{name}#{outer2} == NULL);\t/* GenParamCopy Null 21 */
     
    335316
    336317          if ! ( dir == :INOUT && b_marshal == false ) then
    337             # dir = :INOUT, b_marshal = false, b_get = false の場合
     318            # dir = :INOUT, b_marshal = false, b_get = false の場合
    338319            file.print <<EOT
    339320#{indent}       if((ercd_=cTDR_putInt8( b_null_ )) != E_OK )\t/* GenParamCopy Null 32 */
     
    355336  def print_nullable_post( name, type, file, nest, dir, outer, outer2, b_marshal, b_get )
    356337    if type.is_nullable? then
    357       if dir == :OUT then  # OUT の場合 print_out_nullable で NULL かどうかのæƒ
    358 å ±ã‚’渡す
     338      if dir == :OUT then  # OUT の場合 print_out_nullable で NULL かどうかの情報を渡す
    359339        nest -= 1
    360340        indent = "      " * nest
     
    371351#{indent}       }  /* ! b_null_ */
    372352EOT
    373           else # dir = :INOUT, b_marshal = true   # inout の out 方向
     353          else # dir = :INOUT, b_marshal = true   # inout の out 方向
    374354            file.print "#{indent}       }  /* ! b_null_  GenParamCopy Null 52 */\n"
    375355          end
  • EcnlProtoTool/trunk/asp3_dcre/tecsgen/tecslib/plugin/lib/GenTransparentMarshaler.rb

    • Property svn:mime-type changed from text/x-ruby to text/x-ruby;charset=UTF-8
    r270 r321  
    66#   Copyright (C) 2008-2014 by TOPPERS Project
    77#--
    8 #   ä¸Šè¨˜è‘—作権è€
    9 ã¯ï¼Œä»¥ä¸‹ã®(1)~(4)の条件を満たす場合に限り,本ソフトウェ
    10 #   ã‚¢ï¼ˆæœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã‚’改変したものを含む.以下同じ)を使用・複製・改
    11 #   å¤‰ãƒ»å†é
    12 å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
    13 #   (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
    14 #       æ¨©è¡¨ç¤ºï¼Œã“の利用条件および下記の無保証規定が,そのままの形でソー
    15 #       ã‚¹ã‚³ãƒ¼ãƒ‰ä¸­ã«å«ã¾ã‚Œã¦ã„ること.
    16 #   (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
    17 #       ç”¨ã§ãã‚‹å½¢ã§å†é
    18 å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é
    19 å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
    20 #       è€
    21 ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ãªã©ï¼‰ã«ï¼Œä¸Šè¨˜ã®è‘—作権表示,この利用条件および下記
    22 #       ã®ç„¡ä¿è¨¼è¦å®šã‚’掲載すること.
    23 #   (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
    24 #       ç”¨ã§ããªã„形で再é
    25 å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
    26 #       ã¨ï¼Ž
    27 #     (a) 再é
    28 å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€
    29 ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ãªã©ï¼‰ã«ï¼Œä¸Šè¨˜ã®è‘—
    30 #         ä½œæ¨©è¡¨ç¤ºï¼Œã“の利用条件および下記の無保証規定を掲載すること.
    31 #     (b) 再é
    32 å¸ƒã®å½¢æ
    33 ‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
    34 #         å ±å‘Šã™ã‚‹ã“と.
    35 #   (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
    36 #       å®³ã‹ã‚‰ã‚‚,上記著作権è€
    37 ãŠã‚ˆã³TOPPERSプロジェクトをå
    38 è²¬ã™ã‚‹ã“と.
    39 #       ã¾ãŸï¼Œæœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã®ãƒ¦ãƒ¼ã‚¶ã¾ãŸã¯ã‚¨ãƒ³ãƒ‰ãƒ¦ãƒ¼ã‚¶ã‹ã‚‰ã®ã„かなる理
    40 #       ç”±ã«åŸºã¥ãè«‹æ±‚からも,上記著作権è€
    41 ãŠã‚ˆã³TOPPERSプロジェクトを
    42 #       å
    43 è²¬ã™ã‚‹ã“と.
     8#   上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
     9#   ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
     10#   変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
     11#   (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
     12#       権表示,この利用条件および下記の無保証規定が,そのままの形でソー
     13#       スコード中に含まれていること.
     14#   (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
     15#       用できる形で再配布する場合には,再配布に伴うドキュメント(利用
     16#       者マニュアルなど)に,上記の著作権表示,この利用条件および下記
     17#       の無保証規定を掲載すること.
     18#   (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
     19#       用できない形で再配布する場合には,次のいずれかの条件を満たすこ
     20#       と.
     21#     (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
     22#         作権表示,この利用条件および下記の無保証規定を掲載すること.
     23#     (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
     24#         報告すること.
     25#   (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
     26#       害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
     27#       また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
     28#       由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
     29#       免責すること.
    4430
    45 #   æœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã¯ï¼Œç„¡ä¿è¨¼ã§æä¾›ã•ã‚Œã¦ã„るものである.上記著作権è€
    46 ãŠ
    47 #   ã‚ˆã³TOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
    48 #   ã«å¯¾ã™ã‚‹é©åˆæ€§ã‚‚含めて,いかなる保証も行わない.また,本ソフトウェ
    49 #   ã‚¢ã®åˆ©ç”¨ã«ã‚ˆã‚Šç›´æŽ¥çš„または間接的に生じたいかなる損害に関しても,そ
    50 #   ã®è²¬ä»»ã‚’負わない.
     31#   本ソフトウェアは,無保証で提供されているものである.上記著作権者お
     32#   よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
     33#   に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
     34#   アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
     35#   の責任を負わない.
    5136
    52 #   $Id: GenTransparentMarshaler.rb 1011 2016-07-11 02:20:01Z coas-nagasima $
     37#   $Id$
    5338#++
    5439
    55 #プラグインオプション用変数
     40#プラグインオプション用変数
    5641#@task_priority:: Integer
    5742#@channelCelltype:: String
     
    6045module GenTransparentMarshaler
    6146
    62   # プラグイン引数名と Proc
     47  # プラグイン引数名と Proc
    6348  RPCPluginArgProc = {
    6449    "taskPriority"    => Proc.new { |obj,rhs| obj.set_taskPriority rhs },
     
    6954  }
    7055
    71   #=== プラグイン引数 taskPriority のチェック
     56  #=== プラグイン引数 taskPriority のチェック
    7257  def set_taskPriority( rhs )
    7358    @task_priority = rhs
    7459  end
    7560
    76   #=== プラグイン引数 channelCelltype のチェック
     61  #=== プラグイン引数 channelCelltype のチェック
    7762  def set_channelCelltype( rhs )
    7863    @channelCelltype = rhs.to_sym
     
    8671  end
    8772
    88   #=== プラグイン引数 TDRCelltype のチェック
     73  #=== プラグイン引数 TDRCelltype のチェック
    8974  def set_TDRCelltype( rhs )
    9075    @TDRCelltype = rhs.to_sym
     
    9883  end
    9984
    100   #=== プラグイン引数 channelCellName のチェック
     85  #=== プラグイン引数 channelCellName のチェック
    10186  def set_channelCellName( rhs )
    10287    @channelCellName = rhs
     
    10893  end
    10994
    110   #=== プラグイン引数 PPAllocatorSize のチェック
     95  #=== プラグイン引数 PPAllocatorSize のチェック
    11196  def set_PPAllocatorSize( rhs )
    11297    @PPAllocatorSize = rhs
    11398  end
    11499
    115   #=== marshaler のセルタイプ名を設定する
     100  #=== marshaler のセルタイプ名を設定する
    116101  def initialize_transparent_marshaler cell_name
    117102    @task_priority = 8
     
    135120
    136121    f = CFile.open( @marshaler_celltype_file_name, "w" )
    137     # 同じå†
    138 å®¹ã‚’二度書く可能性あり (AppFile は不可)
     122    # 同じ内容を二度書く可能性あり (AppFile は不可)
    139123
    140124    f.print <<EOT
     
    157141  end
    158142
    159   #===  受け口関数の本体コードを生成(頭部と末尾は別途出力)
    160   #ct_name:: Symbol    (through プラグインで生成された) セルタイプ名 .Symbol として送られてくる(らしい)
     143  #===  受け口関数の本体コードを生成(頭部と末尾は別途出力)
     144  #ct_name:: Symbol    (through プラグインで生成された) セルタイプ名 .Symbol として送られてくる(らしい)
    161145  def gen_ep_func_body( file, b_singleton, ct_name, global_ct_name, sig_name, ep_name, func_name, func_global_name, func_type, params )
    162146
    163     # unmarshaler クラスか?
     147    # unmarshaler クラスか?
    164148    if ct_name == @unmarshaler_celltype_name.to_sym then
    165149      gen_ep_func_body_unmarshal( file, b_singleton, ct_name, global_ct_name, sig_name, ep_name, func_name, func_global_name, func_type, params )
     
    169153  end
    170154
    171   #===  marshal コードの生成
     155  #===  marshal コードの生成
    172156  def gen_ep_func_body_marshal( file, b_singleton, ct_name, global_ct_name, sig_name, ep_name, func_name, func_global_name, func_type, params )
    173157
     
    175159    b_ret_er = false
    176160
    177     # 関数の戻り値のå
    178 ƒã®åž‹ã‚’å¾—ã‚‹(typedef されている場合)
     161    # 関数の戻り値の元の型を得る(typedef されている場合)
    179162    type = func_type.get_type.get_original_type
    180163
    181     # 戻り値記憶用の変数を出力(void 型の関数では出力しない)
     164    # 戻り値記憶用の変数を出力(void 型の関数では出力しない)
    182165    if ! type.is_void? then
    183166      if func_type.get_type.kind_of?( DefinedType ) && ( func_type.get_type.get_type_str == "ER" || func_type.get_type.get_type_str == "ER_INT" ) then
     
    194177    file.print( "    FLGPTN  flgptn;\n" )
    195178
    196     # 呼びå
    197 ˆã® signature を取り出す
     179    # 呼び先の signature を取り出す
    198180    signature = @signature
    199181
    200     # 関数 ID (整数値)
     182    # 関数 ID (整数値)
    201183    func_id = signature.get_id_from_func_name( func_name )
    202184    file.print( "    int16_t  func_id_ = #{func_id};    /* id of #{func_name}: #{func_id} */\n" )
    203185
    204     # シングルトンでないか?
     186    # シングルトンでないか?
    205187    if ! b_singleton then
    206188
    207       # singleton でなければ p_cellcb 取得コードを出力
     189      # singleton でなければ p_cellcb 取得コードを出力
    208190      file.print <<EOT
    209191    #{ct_name}_CB *p_cellcb;
     
    213195EOT
    214196
    215       # エラーを返すか?
     197      # エラーを返すか?
    216198      if b_ret_er then
    217199        file.print <<EOT
     
    223205        file.print <<EOT
    224206    }else{
    225         /* エラー処理コードをここに記述 */
    226     }
    227 EOT
    228       end
    229     end
    230 
    231     # channel lock コード
     207        /* エラー処理コードをここに記述 */
     208    }
     209EOT
     210      end
     211    end
     212
     213    # channel lock コード
    232214    file.print <<EOT
    233215    /* Channel Lock */
     
    237219EOT
    238220
    239     # SOP を送信
    240     file.print "    /* SOPの送出 */\n"
     221    # SOP を送信
     222    file.print "    /* SOPの送出 */\n"
    241223    file.print "    if( ( ercd_ = cTDR_sendSOP( true ) ) != E_OK )\n"
    242224    file.print "      goto error_reset;\n"
    243225
    244     # func_id を送信
    245     file.print "    /* 関数 id の送出 */\n"
     226    # func_id を送信
     227    file.print "    /* 関数 id の送出 */\n"
    246228    file.print "    if( ( ercd_ = cTDR_putInt16( func_id_ ) ) != E_OK )\n"
    247229    file.print "        goto error_reset;\n"
     
    250232    # p "#{ct_name}, #{sig_name}, #{func_name}, #{func_global_name}"
    251233
    252     b_get = false    # marshal なら put
     234    b_get = false    # marshal なら put
    253235    b_marshal = true  # marshal
    254236
    255     # in 方向のå
    256 ¥å‡ºåŠ›ã‚’出力
    257     file.print "    /* å
    258 ¥åŠ›å¼•æ•°é€å‡º */\n"
     237    # in 方向の入出力を出力
     238    file.print "    /* 入力引数送出 */\n"
    259239    print_params( params, file, 1, b_marshal, b_get, true, func_type.is_oneway? )
    260240    print_params( params, file, 1, b_marshal, b_get, false, func_type.is_oneway? )
     
    264244    end
    265245
    266     file.print "    /* EOPの送出(パケットの掃きだし) */\n"
     246    file.print "    /* EOPの送出(パケットの掃きだし) */\n"
    267247    if ! func_type.is_oneway? then
    268248      b_continue = "true"
     
    293273
    294274    if( b_void == false )then
    295       # 呼びå
    296 ƒã«æˆ»ã‚Šå€¤ã‚’リターン
     275      # 呼び元に戻り値をリターン
    297276      file.print( "    return retval_;\n" )
    298277    else
     
    307286EOT
    308287
    309     # channel lock コード
     288    # channel lock コード
    310289    file.print <<EOT
    311290    /* Channel Lock */
     
    316295
    317296    if( b_ret_er != false )then
    318       # 呼びå
    319 ƒã«æˆ»ã‚Šå€¤ã‚’リターン
     297      # 呼び元に戻り値をリターン
    320298      file.print( "    return ercd_;\n" )
    321299    else
     
    325303  end
    326304
    327   #===  unmarshal コードの生成
     305  #===  unmarshal コードの生成
    328306  def gen_ep_func_body_unmarshal( file, b_singleton, ct_name, global_ct_name, sig_name, ep_name, func_name, func_global_name, func_type, params )
    329307
     
    331309    b_ret_er = false
    332310
    333     # func_id を得るコードを生成
     311    # func_id を得るコードを生成
    334312    file.print <<EOT
    335313
     
    352330        file.print <<EOT
    353331    }else{
    354         /* エラー処理コードをここに記述 */
     332        /* エラー処理コードをここに記述 */
    355333    }
    356334EOT
     
    359337    file.print <<EOT
    360338
    361     /* SOPのチェック */
     339    /* SOPのチェック */
    362340    if( (ercd_=cTDR_receiveSOP( false )) != E_OK )
    363341        goto error_reset;
    364     /* func_id の取得 */
     342    /* func_id の取得 */
    365343    if( (ercd_=cTDR_getInt16( &func_id_ )) != E_OK )
    366344        goto error_reset;
     
    372350EOT
    373351
    374     # 呼びå
    375 ˆã® signature を取り出す
     352    # 呼び先の signature を取り出す
    376353    # port = @celltype.find( @next_cell_port_name )
    377354    # signature = port.get_signature
    378355    signature = @signature
    379356
    380     # through の signature に含まれる すべての関数について
     357    # through の signature に含まれる すべての関数について
    381358    signature.get_function_head_array.each { |f|
    382359      f_name = f.get_name
     
    384361      id = signature.get_id_from_func_name( f_name )
    385362
    386       # 関数は返り値を持つか?
     363      # 関数は返り値を持つか?
    387364      if f_type.get_type.is_void? then
    388365        b_void = true
     
    391368      end
    392369
    393       # パケットの終わりをチェック(未受け取りのデータが残っていないかチェック)
     370      # パケットの終わりをチェック(未受け取りのデータが残っていないかチェック)
    394371      file.print "    case #{id}:       /*** #{f_name} ***/ \n"
    395372      file.print "        if( tTransparentUnmarshaler_#{@signature.get_global_name}_#{f_name}() != E_OK )\n"
     
    400377
    401378    if @PPAllocatorSize then
    402       ppallocator_dealloc_str = "    /* PPAllocator のすべてを解放 */\n    cPPAllocator_dealloc_all();"
     379      ppallocator_dealloc_str = "    /* PPAllocator のすべてを解放 */\n    cPPAllocator_dealloc_all();"
    403380    else
    404381      ppallocator_dealloc_str = ""
     
    422399
    423400  # IN b_marshal, b_get
    424   #  b_marshal = true  && b_get == false   :  マーシャラでå
    425 ¥åŠ›å¼•æ•°é€å‡º
    426   #  b_marshal = true  && b_get == true    :  マーシャラで出力引数受取
    427   #  b_marshal = false && b_get == true    :  アンマーシャラでå
    428 ¥åŠ›å¼•æ•°å—取
    429   #  b_marshal = false && b_get == get     :  アンマーシャラで出力引数送出
     401  #  b_marshal = true  && b_get == false   :  マーシャラで入力引数送出
     402  #  b_marshal = true  && b_get == true    :  マーシャラで出力引数受取
     403  #  b_marshal = false && b_get == true    :  アンマーシャラで入力引数受取
     404  #  b_marshal = false && b_get == get     :  アンマーシャラで出力引数送出
    430405  def print_params( params, file, nest, b_marshal, b_get, b_referenced, b_oneway = false )
    431406    params.each{ |param|
     
    438413      type = param.get_type
    439414      if b_oneway && dir == :IN && type.get_original_type.kind_of?( PtrType ) || type.get_original_type.kind_of?( ArrayType ) then
    440         # oneway, in, PtrType の場合コピー
     415        # oneway, in, PtrType の場合コピー
    441416        alloc_cp = "cPPAllocator_alloc"
    442417        alloc_cp_extra = nil
     
    460435  end
    461436
    462   #=== コピーしない引数渡しコードの出力
     437  #=== コピーしない引数渡しコードの出力
    463438  def print_param_nc( name, type, file, nest, b_marshal, outer, outer2, b_get )
    464439    indent = "    " * ( nest + 1 )
     
    480455        when :SIGNED
    481456          if bit_size == -1 || bit_size == -11 then
    482             # signed char の場合、signed を指定する
     457            # signed char の場合、signed を指定する
    483458            signC = "S"
    484459            sign  = "s"
     
    573548
    574549
    575   #=== PREAMBLE 部のコード生成
    576   # アンマーシャラセルタイプの場合、アンマーシャラ関数のプロトタイプ宣言を生成
     550  #=== PREAMBLE 部のコード生成
     551  # アンマーシャラセルタイプの場合、アンマーシャラ関数のプロトタイプ宣言を生成
    577552  def gen_preamble file, b_singleton, ct_name, global_name
    578553    if ct_name != @unmarshaler_celltype_name.to_sym then
     
    580555    end
    581556
    582     file.print "/* アンマーシャラ関数のプロトタイプ宣言 */\n"
    583     # signature に含まれる すべての関数について
     557    file.print "/* アンマーシャラ関数のプロトタイプ宣言 */\n"
     558    # signature に含まれる すべての関数について
    584559    @signature.get_function_head_array.each { |f|
    585560      f_name = f.get_name
     
    591566  end
    592567
    593   #=== POSTAMBLE 部のコード生成
    594   # アンマーシャラセルタイプの場合、アンマーシャラ関数の生成
     568  #=== POSTAMBLE 部のコード生成
     569  # アンマーシャラセルタイプの場合、アンマーシャラ関数の生成
    595570  def gen_postamble file, b_singleton, ct_name, global_name
    596571    if ct_name != @unmarshaler_celltype_name.to_sym then
     
    598573    end
    599574
    600     file.print "\n/*** アンマーシャラ関数 ***/\n\n"
     575    file.print "\n/*** アンマーシャラ関数 ***/\n\n"
    601576    @signature.get_function_head_array.each { |f|
    602577      f_name = f.get_name
     
    604579      id = @signature.get_id_from_func_name( f_name )
    605580
    606       # 関数は返り値を持つか?
     581      # 関数は返り値を持つか?
    607582      if f_type.get_type.is_void? then
    608583        b_void = true
     
    623598      file.print "      CELLCB  *p_cellcb;\n"
    624599
    625       # 引数を受取る変数の定義
     600      # 引数を受取る変数の定義
    626601      param_list = f.get_declarator.get_type.get_paramlist.get_items
    627602           # FuncHead->  Decl->    FuncType->ParamList
     
    638613        end
    639614
    640         type_str = type.get_type_str.gsub( /\bconst\b */, "" ) # "const" を外す
     615        type_str = type.get_type_str.gsub( /\bconst\b */, "" ) # "const" を外す
    641616
    642617        file.printf( "    %-12s %s%s%s%s;\n", type_str, aster, name, aster2, type.get_type_str_post )
    643618      }
    644619
    645       # 戻り値を受け取る変数の定義
     620      # 戻り値を受け取る変数の定義
    646621      if ! b_void then
    647622        if f.is_oneway? then
    648           retval_ptr = ""   # oneway の場合、受け取るが捨てられる
     623          retval_ptr = ""   # oneway の場合、受け取るが捨てられる
    649624        else
    650625          retval_ptr = "*"
     
    653628      end
    654629
    655       # in 方向のå
    656 ¥å‡ºåŠ›ã‚’å
    657 ¥åŠ›
    658       file.print "\n        /* å
    659 ¥åŠ›å¼•æ•°å—取 */\n"
    660       b_get = true    # unmarshal では get
     630      # in 方向の入出力を入力
     631      file.print "\n        /* 入力引数受取 */\n"
     632      b_get = true    # unmarshal では get
    661633      b_marshal  = false
    662634      print_params( param_list, file, 1, b_marshal, b_get, true, f.is_oneway? )
     
    667639      end
    668640
    669       # パケットの受信完了
    670       # mikan 本当は、対象関数を呼出す後に実施したい.呼出しパケットの使用終わりを宣言する目的として
    671       file.print "        /* パケット終わりをチェック */\n"
     641      # パケットの受信完了
     642      # mikan 本当は、対象関数を呼出す後に実施したい.呼出しパケットの使用終わりを宣言する目的として
     643      file.print "        /* パケット終わりをチェック */\n"
    672644      if ! f.is_oneway? then
    673645        b_continue = "true"
     
    678650      file.print "        goto error_reset;\n\n"
    679651
    680       # 対象関数を呼出す
    681       file.print "    /* 対象関数の呼出し */\n"
     652      # 対象関数を呼出す
     653      file.print "    /* 対象関数の呼出し */\n"
    682654      if b_void then
    683655        file.print( "    cServerCall_#{f_name}(" )
     
    694666      file.print( " );\n" )
    695667
    696       # 戻り値、出力引数の受取コードの生成
    697 
    698       # oneway の場合出力、戻り値が無く、受取をå¾
    699 ãŸãªã„(非同期な呼出し)
     668      # 戻り値、出力引数の受取コードの生成
     669
     670      # oneway の場合出力、戻り値が無く、受取を待たない(非同期な呼出し)
    700671      if ! f.is_oneway? then
    701672        file.print <<EOT
    702     /* 関数処理の終了を通知 */
     673    /* 関数処理の終了を通知 */
    703674    if( ( ercd_ = cEventflag_set( 0x01 ) ) != E_OK ){
    704675      goto error_reset;
Note: See TracChangeset for help on using the changeset viewer.