Ignore:
Timestamp:
May 22, 2019, 10:03:37 PM (5 years ago)
Author:
coas-nagasima
Message:

ビルドが通るよう更新

Location:
azure_iot_hub/trunk/asp3_dcre/tecsgen/tecslib/plugin/lib
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • azure_iot_hub/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
    r388 r389  
    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#   $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    # modified by ishikawa
     
    164148  end
    165149
    166   #===  受け口関数の本体コードを生成(頭部と末尾は別途出力)
    167   #ct_name:: Symbol    (through プラグインで生成された) セルタイプ名 .Symbol として送られてくる(らしい)
     150  #===  受け口関数の本体コードを生成(頭部と末尾は別途出力)
     151  #ct_name:: Symbol    (through プラグインで生成された) セルタイプ名 .Symbol として送られてくる(らしい)
    168152  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 )
    169153
    170     # unmarshaler クラスか?
     154    # unmarshaler クラスか?
    171155    if ct_name == @unmarshaler_celltype_name.to_sym then
    172156      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 )
     
    176160  end
    177161
    178   #===  marshal コードの生成
     162  #===  marshal コードの生成
    179163  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 )
    180164
     
    182166    b_ret_er = false
    183167
    184     # 関数の戻り値のå
    185 ƒã®åž‹ã‚’å¾—ã‚‹(typedef されている場合)
     168    # 関数の戻り値の元の型を得る(typedef されている場合)
    186169    type = func_type.get_type.get_original_type
    187170
    188     # 戻り値記憶用の変数を出力(void 型の関数では出力しない)
     171    # 戻り値記憶用の変数を出力(void 型の関数では出力しない)
    189172    if ! type.kind_of?( VoidType ) then
    190173      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
     
    201184    file.print( "    FLGPTN  flgptn;\n" )
    202185
    203     # 呼びå
    204 ˆã® signature を取り出す
     186    # 呼び先の signature を取り出す
    205187    signature = @signature
    206188
    207     # 関数 ID (整数値)
     189    # 関数 ID (整数値)
    208190    func_id = signature.get_id_from_func_name( func_name )
    209191    file.print( "    int16_t  func_id_ = #{func_id};    /* id of #{func_name}: #{func_id} */\n" )
     
    211193    file.print( "    uint8_t  msg[256];\n" )
    212194
    213     # シングルトンでないか?
     195    # シングルトンでないか?
    214196    if ! b_singleton then
    215197
    216       # singleton でなければ p_cellcb 取得コードを出力
     198      # singleton でなければ p_cellcb 取得コードを出力
    217199      file.print <<EOT
    218200    #{ct_name}_CB *p_cellcb;
     
    222204EOT
    223205
    224       # エラーを返すか?
     206      # エラーを返すか?
    225207      if b_ret_er then
    226208        file.print <<EOT
     
    232214        file.print <<EOT
    233215    }else{
    234         /* エラー処理コードをここに記述 */
    235     }
    236 EOT
    237       end
    238     end
    239 
    240     # channel lock コード
     216        /* エラー処理コードをここに記述 */
     217    }
     218EOT
     219      end
     220    end
     221
     222    # channel lock コード
    241223    file.print <<EOT
    242224    ///* Channel Lock */
     
    247229
    248230=begin
    249     # SOP を送信
    250     file.print "    /* SOPの送出 */\n"
     231    # SOP を送信
     232    file.print "    /* SOPの送出 */\n"
    251233    file.print "    if( ( ercd_ = cTDR_sendSOP( true ) ) != E_OK )\n"
    252234    file.print "      goto error_reset;\n"
    253235=end
    254236
    255     # func_id を送信
    256     file.print "    /* 関数 id の送出 */\n"
     237    # func_id を送信
     238    file.print "    /* 関数 id の送出 */\n"
    257239=begin
    258240    file.print "    if( ( ercd_ = cTDR_putInt16( func_id_ ) ) != E_OK )\n"
     
    264246    # p "#{ct_name}, #{sig_name}, #{func_name}, #{func_global_name}"
    265247
    266     b_get = false    # marshal なら put
     248    b_get = false    # marshal なら put
    267249    b_marshal = true  # marshal
    268250
    269     # in 方向のå
    270 ¥å‡ºåŠ›ã‚’出力
     251    # in 方向の入出力を出力
    271252    @index = 2
    272     file.print "    /* å
    273 ¥åŠ›å¼•æ•°é€å‡º */\n"
     253    file.print "    /* 入力引数送出 */\n"
    274254    print_params( params, file, 1, b_marshal, b_get, true, func_type.is_oneway? )
    275255    print_params( params, file, 1, b_marshal, b_get, false, func_type.is_oneway? )
     
    281261=end
    282262
    283     file.print "    /* EOPの送出(パケットの掃きだし) */\n"
     263    file.print "    /* EOPの送出(パケットの掃きだし) */\n"
    284264    if ! func_type.is_oneway? then
    285265      b_continue = "true"
     
    316296
    317297    if( b_void == false )then
    318       # 呼びå
    319 ƒã«æˆ»ã‚Šå€¤ã‚’リターン
     298      # 呼び元に戻り値をリターン
    320299      file.print( "    cMessageBuffer_receive(&retval_);\n" )
    321300      file.print( "    return retval_;\n" )
     
    333312EOT
    334313
    335     # channel lock コード
     314    # channel lock コード
    336315    file.print <<EOT
    337316    ///* Channel Lock */
     
    342321
    343322    if( b_ret_er != false )then
    344       # 呼びå
    345 ƒã«æˆ»ã‚Šå€¤ã‚’リターン
     323      # 呼び元に戻り値をリターン
    346324      file.print( "    return ercd_;\n" )
    347325    else
     
    351329  end
    352330
    353   #===  unmarshal コードの生成
     331  #===  unmarshal コードの生成
    354332  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 )
    355333
     
    357335    b_ret_er = false
    358336
    359     # func_id を得るコードを生成
     337    # func_id を得るコードを生成
    360338    file.print <<EOT
    361339
     
    378356        file.print <<EOT
    379357    }else{
    380         /* エラー処理コードをここに記述 */
     358        /* エラー処理コードをここに記述 */
    381359    }
    382360EOT
     
    388366
    389367#if 0
    390     /* SOPのチェック */
     368    /* SOPのチェック */
    391369    if( (ercd_=cTDR_receiveSOP( false )) != E_OK )
    392370        goto error_reset;
    393     /* func_id の取得 */
     371    /* func_id の取得 */
    394372    if( (ercd_=cTDR_getInt16( &func_id_ )) != E_OK )
    395373        goto error_reset;
     
    406384EOT
    407385
    408     # 呼びå
    409 ˆã® signature を取り出す
     386    # 呼び先の signature を取り出す
    410387    # port = @celltype.find( @next_cell_port_name )
    411388    # signature = port.get_signature
    412389    signature = @signature
    413390
    414     # through の signature に含まれる すべての関数について
     391    # through の signature に含まれる すべての関数について
    415392    signature.get_function_head_array.each { |f|
    416393      f_name = f.get_name
     
    418395      id = signature.get_id_from_func_name( f_name )
    419396
    420       # 関数は返り値を持つか?
     397      # 関数は返り値を持つか?
    421398      if f_type.get_type.kind_of?( VoidType ) then
    422399        b_void = true
     
    425402      end
    426403
    427       # パケットの終わりをチェック(未受け取りのデータが残っていないかチェック)
     404      # パケットの終わりをチェック(未受け取りのデータが残っていないかチェック)
    428405      file.print "    case #{id}:       /*** #{f_name} ***/ \n"
    429406      file.print "        if( tTransparentUnmarshaler_#{@signature.get_name}_#{f_name}() != E_OK )\n"
     
    434411
    435412    if @PPAllocatorSize then
    436       ppallocator_dealloc_str = "    /* PPAllocator のすべてを解放 */\n    cPPAllocator_dealloc_all();"
     413      ppallocator_dealloc_str = "    /* PPAllocator のすべてを解放 */\n    cPPAllocator_dealloc_all();"
    437414    else
    438415      ppallocator_dealloc_str = ""
     
    442419    file.print <<EOT
    443420    default:
    444 #if 0 // deleted by ishikawa: tSysLogが未実è£
    445 
     421#if 0 // deleted by ishikawa: tSysLogが未実装
    446422        syslog(LOG_INFO, "unmarshaler task: ERROR: unknown func_id: %d", func_id_ );
    447423#endif /* 0 */
     
    464440
    465441  # IN b_marshal, b_get
    466   #  b_marshal = true  && b_get == false   :  マーシャラでå
    467 ¥åŠ›å¼•æ•°é€å‡º
    468   #  b_marshal = true  && b_get == true    :  マーシャラで出力引数受取
    469   #  b_marshal = false && b_get == true    :  アンマーシャラでå
    470 ¥åŠ›å¼•æ•°å—取
    471   #  b_marshal = false && b_get == get     :  アンマーシャラで出力引数送出
     442  #  b_marshal = true  && b_get == false   :  マーシャラで入力引数送出
     443  #  b_marshal = true  && b_get == true    :  マーシャラで出力引数受取
     444  #  b_marshal = false && b_get == true    :  アンマーシャラで入力引数受取
     445  #  b_marshal = false && b_get == get     :  アンマーシャラで出力引数送出
    472446  def print_params( params, file, nest, b_marshal, b_get, b_referenced, b_oneway = false )
    473447    params.each{ |param|
     
    480454      type = param.get_type
    481455      if b_oneway && dir == :IN && type.get_original_type.kind_of?( PtrType ) || type.get_original_type.kind_of?( ArrayType ) then
    482         # oneway, in, PtrType の場合コピー
     456        # oneway, in, PtrType の場合コピー
    483457        alloc_cp = "cPPAllocator_alloc"
    484458        alloc_cp_extra = nil
     
    502476  end
    503477
    504   #=== コピーしない引数渡しコードの出力
     478  #=== コピーしない引数渡しコードの出力
    505479  def print_param_nc( name, type, file, nest, b_marshal, outer, outer2, b_get )
    506480    indent = "    " * ( nest + 1 )
     
    522496        when :SIGNED
    523497          if bit_size == -1 || bit_size == -11 then
    524             # signed char の場合、signed を指定する
     498            # signed char の場合、signed を指定する
    525499            signC = "S"
    526500            sign  = "s"
     
    641615
    642616
    643   #=== PREAMBLE 部のコード生成
    644   # アンマーシャラセルタイプの場合、アンマーシャラ関数のプロトタイプ宣言を生成
     617  #=== PREAMBLE 部のコード生成
     618  # アンマーシャラセルタイプの場合、アンマーシャラ関数のプロトタイプ宣言を生成
    645619  def gen_preamble file, b_singleton, ct_name, global_name
    646620    if ct_name != @unmarshaler_celltype_name.to_sym then
     
    648622    end
    649623
    650     file.print "/* アンマーシャラ関数のプロトタイプ宣言 */\n"
    651     # signature に含まれる すべての関数について
     624    file.print "/* アンマーシャラ関数のプロトタイプ宣言 */\n"
     625    # signature に含まれる すべての関数について
    652626    @signature.get_function_head_array.each { |f|
    653627      f_name = f.get_name
     
    661635  end
    662636
    663   #=== POSTAMBLE 部のコード生成
    664   # アンマーシャラセルタイプの場合、アンマーシャラ関数の生成
     637  #=== POSTAMBLE 部のコード生成
     638  # アンマーシャラセルタイプの場合、アンマーシャラ関数の生成
    665639  def gen_postamble file, b_singleton, ct_name, global_name
    666640    if ct_name != @unmarshaler_celltype_name.to_sym then
     
    668642    end
    669643
    670     file.print "\n/*** アンマーシャラ関数 ***/\n\n"
     644    file.print "\n/*** アンマーシャラ関数 ***/\n\n"
    671645    @signature.get_function_head_array.each { |f|
    672646      f_name = f.get_name
     
    674648      id = @signature.get_id_from_func_name( f_name )
    675649
    676       # 関数は返り値を持つか?
     650      # 関数は返り値を持つか?
    677651      if f_type.get_type.kind_of?( VoidType ) then
    678652        b_void = true
     
    692666      file.print "      ER  ercd_;\n"
    693667
    694       # 引数を受取る変数の定義
     668      # 引数を受取る変数の定義
    695669      param_list = f.get_declarator.get_type.get_paramlist.get_items
    696670           # FuncHead->  Decl->    FuncType->ParamList
     
    707681        end
    708682
    709         type_str = type.get_type_str.gsub( /\bconst\b */, "" ) # "const" を外す
     683        type_str = type.get_type_str.gsub( /\bconst\b */, "" ) # "const" を外す
    710684
    711685        file.printf( "    %-12s %s%s%s%s;\n", type_str, aster, name, aster2, type.get_type_str_post )
    712686      }
    713687
    714       # 戻り値を受け取る変数の定義
     688      # 戻り値を受け取る変数の定義
    715689      if ! b_void then
    716690        if f.is_oneway? then
    717           retval_ptr = ""   # oneway の場合、受け取るが捨てられる
     691          retval_ptr = ""   # oneway の場合、受け取るが捨てられる
    718692        else
    719693          # =begin ishikawa modified
     
    725699      end
    726700
    727       # in 方向のå
    728 ¥å‡ºåŠ›ã‚’å
    729 ¥åŠ›
    730       file.print "\n        /* å
    731 ¥åŠ›å¼•æ•°å—取 */\n"
    732       b_get = true    # unmarshal では get
     701      # in 方向の入出力を入力
     702      file.print "\n        /* 入力引数受取 */\n"
     703      b_get = true    # unmarshal では get
    733704      b_marshal  = false
    734705      @index = 2
     
    741712      end
    742713=end
    743       # パケットの受信完了
    744       # mikan 本当は、対象関数を呼出す後に実施したい.呼出しパケットの使用終わりを宣言する目的として
    745       file.print "        /* パケット終わりをチェック */\n"
     714      # パケットの受信完了
     715      # mikan 本当は、対象関数を呼出す後に実施したい.呼出しパケットの使用終わりを宣言する目的として
     716      file.print "        /* パケット終わりをチェック */\n"
    746717      if ! f.is_oneway? then
    747718        b_continue = "true"
     
    753724      file.print "        goto error_reset;\n\n"
    754725=end
    755       # 対象関数を呼出す
    756       file.print "    /* 対象関数の呼出し */\n"
     726      # 対象関数を呼出す
     727      file.print "    /* 対象関数の呼出し */\n"
    757728      if b_void then
    758729        file.print( "    cServerCall_#{f_name}(" )
     
    769740      file.print( " );\n" )
    770741
    771       # 戻り値、出力引数の受取コードの生成
     742      # 戻り値、出力引数の受取コードの生成
    772743
    773744      if ! b_void && ! f.is_oneway? then
     
    776747
    777748      end
    778       # oneway の場合出力、戻り値が無く、受取をå¾
    779 ãŸãªã„(非同期な呼出し)
     749      # oneway の場合出力、戻り値が無く、受取を待たない(非同期な呼出し)
    780750      if ! f.is_oneway? then
    781751        file.print <<EOT
    782     /* 関数処理の終了を通知 */
     752    /* 関数処理の終了を通知 */
    783753    if( ( ercd_ = cEventflag_set( 0x01 ) ) != E_OK ){
    784754      goto error_reset;
  • azure_iot_hub/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
    r388 r389  
    66#   Copyright (C) 2008-2018 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#   $Id$
     
    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
     
    492470EOT
    493471
    494     # SOP を送信
    495     file.print "        /* SOPの送出 */\n"
     472    # SOP を送信
     473    file.print "        /* SOPの送出 */\n"
    496474    file.print "        SET_RPC_STATE( state_, RPCSTATE_CLIENT_SEND_SOP );\n"
    497475    file.print "        if( ( ercd_ = cTDR_sendSOP( true ) ) != E_OK )\n"
    498476    file.print "                goto error_reset;\n"
    499477
    500     # func_id を送信
    501     file.print "        /* 関数 id の送出 */\n"
     478    # func_id を送信
     479    file.print "        /* 関数 id の送出 */\n"
    502480    file.print "        if( ( ercd_ = cTDR_putInt16( func_id_ ) ) != E_OK )\n"
    503481    file.print "                goto error_reset;\n"
     
    506484    # p "#{ct_name}, #{sig_name}, #{func_name}, #{func_global_name}"
    507485
    508     b_get = false    # marshal なら put
     486    b_get = false    # marshal なら put
    509487    b_marshal = true  # marshal
    510488
    511     # in 方向のå
    512 ¥å‡ºåŠ›ã‚’出力
     489    # in 方向の入出力を出力
    513490    if func_type.has_inward? then
    514       file.print "      /* å
    515 ¥åŠ›å¼•æ•°é€å‡º */\n"
     491      file.print "      /* 入力引数送出 */\n"
    516492      file.print "      SET_RPC_STATE( state_, RPCSTATE_CLIENT_SEND_BODY );\n"
    517493      print_params( params, file, 1, b_marshal, b_get, true, "eClientEntry", func_name )
     
    525501      b_continue = "false"
    526502    end
    527     file.print "        /* EOPの送出(パケットの掃きだし) */\n"
     503    file.print "        /* EOPの送出(パケットの掃きだし) */\n"
    528504    file.print "        SET_RPC_STATE( state_, RPCSTATE_CLIENT_SEND_EOP );\n"
    529505    file.print "        if( (ercd_=cTDR_sendEOP(#{b_continue})) != E_OK )\n"
    530506    file.print "                goto error_reset;\n\n"
    531507
    532     # send のメモリをデアロケート
     508    # send のメモリをデアロケート
    533509    if func_type.has_send? then
    534510      file.print "      /* dealloc send parameter while executing */\n"
     
    541517    if ! func_type.is_oneway? then
    542518
    543       file.print "      /* パケットの始まりをチェック */\n"
     519      file.print "      /* パケットの始まりをチェック */\n"
    544520      file.print "      SET_RPC_STATE( state_, RPCSTATE_CLIENT_RECV_SOP );\n"
    545521      file.print "      if( (ercd_=cTDR_receiveSOP( true )) != E_OK )\n"
    546522      file.print "              goto error_reset;\n"
    547523
    548       b_get = true     # marshaler は get
    549       file.print "      /* 戻り値の受け取り */\n"
     524      b_get = true     # marshaler get
     525      file.print "      /* 戻り値の受け取り */\n"
    550526      print_param( "retval_", func_type.get_type, file, 1, :RETURN, nil, nil, b_marshal, b_get )
    551527
     
    559535        indent = "      " * indent_level
    560536
    561         file.print "#{indent}/* 出力値の受け取り */\n"
     537        file.print "#{indent}/* 出力値の受け取り */\n"
    562538        file.print "#{indent}SET_RPC_STATE( state_, RPCSTATE_CLIENT_RECV_BODY );\n"
    563539        print_params( params, file, indent_level, b_marshal, b_get, true, "eClientEntry", func_name )
     
    569545      end
    570546
    571       file.print "\n    /* パケットの終わりをチェック */\n"
     547      file.print "\n    /* パケットの終わりをチェック */\n"
    572548      file.print "      SET_RPC_STATE( state_, RPCSTATE_CLIENT_RECV_EOP );\n"
    573549      file.print "      if( (ercd_=cTDR_receiveEOP(false)) != E_OK )\n"  # b_continue = false
     
    576552    end # ! func_type.is_oneway?
    577553
    578     # channel lock コード
     554    # channel lock コード
    579555    file.print <<EOT
    580556        /* Channel Unlock */
     
    593569
    594570    if( b_void == false )then
    595       # 呼びå
    596 ƒã«æˆ»ã‚Šå€¤ã‚’リターン
     571      # 呼び元に戻り値をリターン
    597572      file.print( "     return retval_;\n" )
    598573    else
     
    604579error_reset:
    605580EOT
    606     # send のメモリをデアロケート
     581    # send のメモリをデアロケート
    607582    if func_type.has_send? then
    608583      file.print "      /* dealloc send parameter */\n"
     
    613588    end
    614589
    615     # receive のメモリをデアロケート
     590    # receive のメモリをデアロケート
    616591    if func_type.has_receive? then
    617592      file.print( "     /* receive parameter */\n" )
     
    625600EOT
    626601
    627     # channel lock コード
     602    # channel lock コード
    628603    file.print <<EOT
    629604        /* Channel Unlock */
     
    636611
    637612    if( b_ret_er != false )then
    638       # 呼びå
    639 ƒã«æˆ»ã‚Šå€¤ã‚’リターン
     613      # 呼び元に戻り値をリターン
    640614      file.print( "     return ERCD( E_RPC, MERCD( ercd_ ) );\n" )
    641615    else
     
    645619  end
    646620
    647   #===  unmarshal コードの生成
     621  #===  unmarshal コードの生成
    648622  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 )
    649623
    650624    b_ret_er = true
    651625
    652     # func_id を得るコードを生成
     626    # func_id を得るコードを生成
    653627    file.print <<EOT
    654628
     
    672646        file.print <<EOT
    673647        }else{
    674                 /* エラー処理コードをここに記述 */
     648                /* エラー処理コードをここに記述 */
    675649        }
    676650EOT
     
    683657#endif
    684658
    685         /* SOPのチェック */
     659        /* SOPのチェック */
    686660        SET_RPC_STATE( state_, RPCSTATE_SERVER_RECV_SOP );
    687661        if( (ercd_=cTDR_receiveSOP( false )) != E_OK )
    688662                goto error_reset;
    689         /* func_id の取得 */
     663        /* func_id の取得 */
    690664        if( (ercd_=cTDR_getInt16( &func_id_ )) != E_OK )
    691665                goto error_reset;
     
    697671EOT
    698672
    699     # signature に含まれる すべての関数について
     673    # signature に含まれる すべての関数について
    700674    @signature.get_function_head_array.each { |f|
    701675      f_name = f.get_name
     
    711685
    712686    if @PPAllocatorSize then
    713       ppallocator_dealloc_str = "       /* PPAllocator のすべてを解放 */\n       cPPAllocator_dealloc_all();"
     687      ppallocator_dealloc_str = "       /* PPAllocator のすべてを解放 */\n     cPPAllocator_dealloc_all();"
    714688    else
    715689      ppallocator_dealloc_str = ""
     
    734708  end
    735709
    736   #=== PREAMBLE 部のコード生成
    737   # アンマーシャラセルタイプの場合、アンマーシャラ関数のプロトタイプ宣言を生成
     710  #=== PREAMBLE 部のコード生成
     711  # アンマーシャラセルタイプの場合、アンマーシャラ関数のプロトタイプ宣言を生成
    738712  def gen_preamble file, b_singleton, ct_name, global_name
    739713    if ct_name != @unmarshaler_celltype_name.to_sym then
     
    741715    end
    742716
    743     # string.h の include (memset, strlen のため)
     717    # string.h の include (memset, strlen のため)
    744718    file.print "/* header file (strlen, memset) */\n"
    745719    file.print "#include\t<string.h>\n\n"
    746720
    747     file.print "/* アンマーシャラ関数のプロトタイプ宣言 */\n"
    748     # signature に含まれる すべての関数について
     721    file.print "/* アンマーシャラ関数のプロトタイプ宣言 */\n"
     722    # signature に含まれる すべての関数について
    749723    @signature.get_function_head_array.each { |f|
    750724      f_name = f.get_name
     
    756730  end
    757731
    758   #=== POSTAMBLE 部のコード生成
    759   # アンマーシャラセルタイプの場合、個ã€
    760 ã®ã‚¢ãƒ³ãƒžãƒ¼ã‚·ãƒ£ãƒ©é–¢æ•°ã®ç”Ÿæˆ
     732  #=== POSTAMBLE 部のコード生成
     733  # アンマーシャラセルタイプの場合、個々のアンマーシャラ関数の生成
    761734  def gen_postamble file, b_singleton, ct_name, global_name
    762735    if ct_name != @unmarshaler_celltype_name.to_sym then
     
    764737    end
    765738
    766     file.print "\n/*** アンマーシャラ関数 ***/\n\n"
     739    file.print "\n/*** アンマーシャラ関数 ***/\n\n"
    767740    @signature.get_function_head_array.each { |f|
    768741      f_name = f.get_name
     
    770743      id = @signature.get_id_from_func_name( f_name )
    771744
    772       # 関数は返り値を持つか?
     745      # 関数は返り値を持つか?
    773746      b_ret_er = false
    774747      init_retval = ""
     
    794767      file.print "      ER      ercd_;\n"
    795768
    796       # 引数を受取る変数の定義
     769      # 引数を受取る変数の定義
    797770      params = f.get_declarator.get_type.get_paramlist.get_items
    798771           # FuncHead->  Decl->    FuncType->ParamList
     
    803776        dir = par.get_direction
    804777        if( dir == :RECEIVE )then
    805           # type は PtrType で、それを取り除いた型
     778          # type は PtrType で、それを取り除いた型
    806779          type = type.get_type
    807780        end
     
    821794        end
    822795
    823         type_str = type.get_type_str.gsub( /\bconst\b */, "" ) # "const" を外す
     796        type_str = type.get_type_str.gsub( /\bconst\b */, "" ) # "const" を外す
    824797        file.printf( "  %-12s %s%s%s%s%s;\n", type_str, aster, name, aster2, type.get_type_str_post, init )
    825798
     
    833806      end
    834807
    835       # in 方向のå
    836 ¥å‡ºåŠ›ã‚’å
    837 ¥åŠ›
    838       file.print "\n    /* å
    839 ¥åŠ›å¼•æ•°å—取 */\n"
     808      # in 方向の入出力を入力
     809      file.print "\n    /* 入力引数受取 */\n"
    840810      file.print "      SET_RPC_STATE( *state_, RPCSTATE_SERVER_RECV_BODY );\n"
    841       b_get = true    # unmarshal では get
     811      b_get = true    # unmarshal では get
    842812      b_marshal  = false
    843813      print_params( params, file, 1, b_marshal, b_get, true, "cServerCall", f_name )
     
    846816
    847817
    848       # パケットの受信完了
    849       file.print "      /* パケット終わりをチェック */\n"
     818      # パケットの受信完了
     819      file.print "      /* パケット終わりをチェック */\n"
    850820      file.print "      SET_RPC_STATE( *state_, RPCSTATE_SERVER_RECV_EOP );\n"
    851821      if ! f_type.is_oneway? then
     
    857827      file.print "              goto error_reset;\n\n"
    858828
    859       # out のメモリをアロケート
     829      # out のメモリをアロケート
    860830      dir = :OUT; alloc_cp = "cPPAllocator_alloc"; alloc_cp_extra = nil; nest = 1
    861831      alloc_for_out_params( params, file, nest, dir, alloc_cp, alloc_cp_extra )
    862832
    863       # 対象関数を呼出す
    864       file.print "      /* 対象関数の呼出し */\n"
     833      # 対象関数を呼出す
     834      file.print "      /* 対象関数の呼出し */\n"
    865835      file.print "      SET_RPC_STATE( *state_, RPCSTATE_SERVER_EXEC );\n"
    866836      if b_void then
     
    881851      file.print( " );\n" )
    882852
    883       # 戻り値、出力引数の受取コードの生成
    884 
    885       # oneway の場合出力、戻り値が無く、受取をå¾
    886 ãŸãªã„(非同期な呼出し)
     853      # 戻り値、出力引数の受取コードの生成
     854
     855      # oneway の場合出力、戻り値が無く、受取を待たない(非同期な呼出し)
    887856      if ! f.is_oneway? then
    888857
    889         file.print "\n  /* SOPの送出 */\n"
     858        file.print "\n  /* SOPの送出 */\n"
    890859        file.print "    SET_RPC_STATE( *state_, RPCSTATE_SERVER_SEND_SOP );\n"
    891860
     
    893862        file.print "            goto error_reset;\n"
    894863
    895         b_get = false     # unmarshaler は put
     864        b_get = false     # unmarshaler put
    896865        if( ! b_void )then
    897           file.print "  /* 戻り値の送出 */\n"
     866          file.print "  /* 戻り値の送出 */\n"
    898867          print_param( "retval_", f_type.get_type, file, 1, :RETURN, nil, nil, b_marshal, b_get )
    899868        end
     
    908877          indent = "    " * indent_level
    909878
    910           file.print "#{indent}/* 出力値の送出 */\n"
     879          file.print "#{indent}/* 出力値の送出 */\n"
    911880          file.print "#{indent}SET_RPC_STATE( *state_, RPCSTATE_SERVER_SEND_BODY );\n"
    912881          print_params( params, file, indent_level, b_marshal, b_get, true, "cServerCall", f_name )
    913882          print_params( params, file, indent_level, b_marshal, b_get, false, "cServerCall", f_name )
    914883
    915           # receive のメモリをデアロケート
     884          # receive のメモリをデアロケート
    916885          if f_type.has_receive? then
    917886            file.print "#{indent}/* dealloc receive parameter */\n"
     
    925894        end
    926895
    927         file.print "    /* パケットの終わり(掃きだし) */\n"
     896        file.print "    /* パケットの終わり(掃きだし) */\n"
    928897        file.print "    SET_RPC_STATE( *state_, RPCSTATE_SERVER_SEND_EOP );\n"
    929898        file.print "    if( (ercd_=cTDR_sendEOP(false)) != E_OK )\n"  # b_continue = false
     
    936905error_reset:
    937906EOT
    938       # send のリセット用デアロケート
     907      # send のリセット用デアロケート
    939908      if f_type.has_send? then
    940909        file.print "    /* dealloc send parameter */\n"
     
    945914      end
    946915
    947       # receive のメモリをデアロケート
     916      # receive のメモリをデアロケート
    948917      if f_type.has_receive? && b_ret_er then
    949918        file.print "    /* dealloc receive parameter */\n"
     
    957926      file.print "}\n\n"
    958927
    959       # ここ(個ã€
    960 ã®é–¢æ•°ï¼‰ã§ã¯ã‚¨ãƒ©ãƒ¼ãƒãƒ³ãƒ‰ãƒ©ãƒ¼ã¯å‘¼ã³å‡ºã•ãªã„。呼びå
    961 ƒï¼ˆã‚µãƒ¼ãƒãƒ¼ã®ãƒ¡ã‚¤ãƒ³é–¢æ•°ï¼‰ã§å‘¼ã³å‡ºã™ã€‚
     928      # ここ(個々の関数)ではエラーハンドラーは呼び出さない。呼び元(サーバーのメイン関数)で呼び出す。
    962929    }
    963930  end
     
    966933  #b_marshal:: bool
    967934  #b_get:: bool
    968   #  b_marshal = true  && b_get == false   :  マーシャラでå
    969 ¥åŠ›å¼•æ•°é€å‡º
    970   #  b_marshal = true  && b_get == true    :  マーシャラで出力引数受取
    971   #  b_marshal = false && b_get == false   :  アンマーシャラでå
    972 ¥åŠ›å¼•æ•°å—取
    973   #  b_marshal = false && b_get == true    :  アンマーシャラで出力引数送出
    974   #b_referenced:: size_is, count_is, string で参ç
    975 §ã•ã‚Œã¦ã„るものを出力
     935  #  b_marshal = true  && b_get == false   :  マーシャラで入力引数送出
     936  #  b_marshal = true  && b_get == true    :  マーシャラで出力引数受取
     937  #  b_marshal = false && b_get == false   :  アンマーシャラで入力引数受取
     938  #  b_marshal = false && b_get == true    :  アンマーシャラで出力引数送出
     939  #b_referenced:: size_is, count_is, string で参照されているものを出力
    976940  def print_params( params, file, nest, b_marshal, b_get, b_referenced, port_name, func_name )
    977941    params.each{ |param|
     
    996960        case dir
    997961        when :OUT, :INOUT
    998           alloc_cp = nil        # inout の b_get==true&&b_marsha==true のときアロケータコードは不用
     962          alloc_cp = nil        # inout の b_get==true&&b_marsha==true のときアロケータコードは不用
    999963          alloc_cp_extra = nil
    1000964          print_param( param.get_name, param.get_type, file, nest, dir, nil, nil, b_marshal, b_get, alloc_cp, alloc_cp_extra )
     
    1003967          alloc_cp_extra = nil
    1004968          if b_get then
    1005             outer = "(*"         # マーシャラ側では、ポインタが (send と比べ) 一つ多い
     969            outer = "(*"         # マーシャラ側では、ポインタが (send と比べ) 一つ多い
    1006970            outer2 = ")"
    1007971          else
    1008             outer = nil          # アンマーシャラ側では、ポインタが一つ外されている
     972            outer = nil          # アンマーシャラ側では、ポインタが一つ外されている
    1009973            outer2 = nil
    1010974          end
     
    1016980  end
    1017981
    1018   #=== アロケータコードを生成 (out のアンマーシャラ用)
     982  #=== アロケータコードを生成 (out のアンマーシャラ用)
    1019983  def alloc_for_out_params( params, file, nest, dir, alloc_cp, alloc_cp_extra )
    1020984    params.each{ |param|
     
    1026990  end
    1027991
    1028   #=== アロケータコードを生成 (out のアンマーシャラ用個別パラメータの生成)
     992  #=== アロケータコードを生成 (out のアンマーシャラ用個別パラメータの生成)
    1029993  def alloc_for_out_param( name, type, file, nest, outer, outer2, alloc_cp, alloc_cp_extra )
    1030994    org_type = type.get_original_type
     
    10391003      count = type.get_count; size = type.get_size; string = type.get_string
    10401004      if count || size || string then
    1041         loop_counter_type = IntType.new(16)   # mikan 方を size_is, count_is の引数の型とする
     1005        loop_counter_type = IntType.new(16)   # mikan 方を size_is, count_is の引数の型とする
    10421006        if count then
    10431007          len = type.get_count.to_s
     
    10521016        end
    10531017
    1054         # size_is に max 指定がある場合、length が max をè¶
    1055 ãˆã¦ã„るかチェックするコードを生成
     1018        # size_is に max 指定がある場合、length が max を超えているかチェックするコードを生成
    10561019        if org_type.get_max != nil && string == nil then
    10571020          file.print "#{indent}if( #{len} > #{type.get_max} ){\t/* GenOpaqueMarshaler max check 2 */\n"
     
    10921055  end
    10931056
    1094   #=== 引数の一括デアロケートコードの生成
    1095   # send:マーシャラの最後、receive:アンマーシャラの最後で一括して引数をデアロケートする
     1057  #=== 引数の一括デアロケートコードの生成
     1058  # send:マーシャラの最後、receive:アンマーシャラの最後で一括して引数をデアロケートする
    10961059  def dealloc_for_params( params, file, nest, dir, dealloc_cp, b_reset = false )
    10971060    if b_reset then
     
    11071070        aster = ""
    11081071        if dir == :RECEIVE then
    1109           type = type.get_type.get_original_type   # ポインタを一つ外す
     1072          type = type.get_type.get_original_type   # ポインタを一つ外す
    11101073          if b_reset then
    11111074            aster = "*"
     
    11281091  end
    11291092
    1130   #== out で nullable な引数のæƒ
    1131 å ±ã‚’渡す
    1132   # out nullable の場合、in, send, receive のように、値を渡す直前ではなく、呼出し時に渡す
     1093  #== out で nullable な引数の情報を渡す
     1094  # out nullable の場合、in, send, receive のように、値を渡す直前ではなく、呼出し時に渡す
    11331095  def  print_out_nullable( params, file, nest, b_marshal );
    11341096    indent = "\t" * nest
     
    11401102        file.print "#{indent}\tgoto error_reset;\n"
    11411103      else
    1142         # 呼びå
    1143 ˆã¯ alloc_for_out_param で nullable の対応する
     1104        # 呼び先は alloc_for_out_param で nullable の対応する
    11441105        file.print "#{indent}if( (ercd_=cTDR_getInt8( &b_#{param.get_name}_null_)) != E_OK )\n"
    11451106        file.print "#{indent}\tgoto error_reset;\n"
  • azure_iot_hub/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
    r388 r389  
    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#   $Id$
     
    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
  • azure_iot_hub/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
    r388 r389  
    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#   $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 = ""
     
    423400
    424401  # IN b_marshal, b_get
    425   #  b_marshal = true  && b_get == false   :  マーシャラでå
    426 ¥åŠ›å¼•æ•°é€å‡º
    427   #  b_marshal = true  && b_get == true    :  マーシャラで出力引数受取
    428   #  b_marshal = false && b_get == true    :  アンマーシャラでå
    429 ¥åŠ›å¼•æ•°å—取
    430   #  b_marshal = false && b_get == get     :  アンマーシャラで出力引数送出
     402  #  b_marshal = true  && b_get == false   :  マーシャラで入力引数送出
     403  #  b_marshal = true  && b_get == true    :  マーシャラで出力引数受取
     404  #  b_marshal = false && b_get == true    :  アンマーシャラで入力引数受取
     405  #  b_marshal = false && b_get == get     :  アンマーシャラで出力引数送出
    431406  def print_params( params, file, nest, b_marshal, b_get, b_referenced, b_oneway = false )
    432407    params.each{ |param|
     
    439414      type = param.get_type
    440415      if b_oneway && dir == :IN && type.get_original_type.kind_of?( PtrType ) || type.get_original_type.kind_of?( ArrayType ) then
    441         # oneway, in, PtrType の場合コピー
     416        # oneway, in, PtrType の場合コピー
    442417        alloc_cp = "cPPAllocator_alloc"
    443418        alloc_cp_extra = nil
     
    461436  end
    462437
    463   #=== コピーしない引数渡しコードの出力
     438  #=== コピーしない引数渡しコードの出力
    464439  def print_param_nc( name, type, file, nest, b_marshal, outer, outer2, b_get )
    465440    indent = "    " * ( nest + 1 )
     
    481456        when :SIGNED
    482457          if bit_size == -1 || bit_size == -11 then
    483             # signed char の場合、signed を指定する
     458            # signed char の場合、signed を指定する
    484459            signC = "S"
    485460            sign  = "s"
     
    574549
    575550
    576   #=== PREAMBLE 部のコード生成
    577   # アンマーシャラセルタイプの場合、アンマーシャラ関数のプロトタイプ宣言を生成
     551  #=== PREAMBLE 部のコード生成
     552  # アンマーシャラセルタイプの場合、アンマーシャラ関数のプロトタイプ宣言を生成
    578553  def gen_preamble file, b_singleton, ct_name, global_name
    579554    if ct_name != @unmarshaler_celltype_name.to_sym then
     
    581556    end
    582557
    583     file.print "/* アンマーシャラ関数のプロトタイプ宣言 */\n"
    584     # signature に含まれる すべての関数について
     558    file.print "/* アンマーシャラ関数のプロトタイプ宣言 */\n"
     559    # signature に含まれる すべての関数について
    585560    @signature.get_function_head_array.each { |f|
    586561      f_name = f.get_name
     
    592567  end
    593568
    594   #=== POSTAMBLE 部のコード生成
    595   # アンマーシャラセルタイプの場合、アンマーシャラ関数の生成
     569  #=== POSTAMBLE 部のコード生成
     570  # アンマーシャラセルタイプの場合、アンマーシャラ関数の生成
    596571  def gen_postamble file, b_singleton, ct_name, global_name
    597572    if ct_name != @unmarshaler_celltype_name.to_sym then
     
    599574    end
    600575
    601     file.print "\n/*** アンマーシャラ関数 ***/\n\n"
     576    file.print "\n/*** アンマーシャラ関数 ***/\n\n"
    602577    @signature.get_function_head_array.each { |f|
    603578      f_name = f.get_name
     
    605580      id = @signature.get_id_from_func_name( f_name )
    606581
    607       # 関数は返り値を持つか?
     582      # 関数は返り値を持つか?
    608583      if f_type.get_type.is_void? then
    609584        b_void = true
     
    624599      file.print "      CELLCB  *p_cellcb;\n"
    625600
    626       # 引数を受取る変数の定義
     601      # 引数を受取る変数の定義
    627602      param_list = f.get_declarator.get_type.get_paramlist.get_items
    628603           # FuncHead->  Decl->    FuncType->ParamList
     
    639614        end
    640615
    641         type_str = type.get_type_str.gsub( /\bconst\b */, "" ) # "const" を外す
     616        type_str = type.get_type_str.gsub( /\bconst\b */, "" ) # "const" を外す
    642617
    643618        file.printf( "    %-12s %s%s%s%s;\n", type_str, aster, name, aster2, type.get_type_str_post )
    644619      }
    645620
    646       # 戻り値を受け取る変数の定義
     621      # 戻り値を受け取る変数の定義
    647622      if ! b_void then
    648623        if f.is_oneway? then
    649           retval_ptr = ""   # oneway の場合、受け取るが捨てられる
     624          retval_ptr = ""   # oneway の場合、受け取るが捨てられる
    650625        else
    651626          retval_ptr = "*"
     
    654629      end
    655630
    656       # in 方向のå
    657 ¥å‡ºåŠ›ã‚’å
    658 ¥åŠ›
    659       file.print "\n        /* å
    660 ¥åŠ›å¼•æ•°å—取 */\n"
    661       b_get = true    # unmarshal では get
     631      # in 方向の入出力を入力
     632      file.print "\n        /* 入力引数受取 */\n"
     633      b_get = true    # unmarshal では get
    662634      b_marshal  = false
    663635      print_params( param_list, file, 1, b_marshal, b_get, true, f.is_oneway? )
     
    668640      end
    669641
    670       # パケットの受信完了
    671       # mikan 本当は、対象関数を呼出す後に実施したい.呼出しパケットの使用終わりを宣言する目的として
    672       file.print "        /* パケット終わりをチェック */\n"
     642      # パケットの受信完了
     643      # mikan 本当は、対象関数を呼出す後に実施したい.呼出しパケットの使用終わりを宣言する目的として
     644      file.print "        /* パケット終わりをチェック */\n"
    673645      if ! f.is_oneway? then
    674646        b_continue = "true"
     
    679651      file.print "        goto error_reset;\n\n"
    680652
    681       # 対象関数を呼出す
    682       file.print "    /* 対象関数の呼出し */\n"
     653      # 対象関数を呼出す
     654      file.print "    /* 対象関数の呼出し */\n"
    683655      if b_void then
    684656        file.print( "    cServerCall_#{f_name}(" )
     
    695667      file.print( " );\n" )
    696668
    697       # 戻り値、出力引数の受取コードの生成
    698 
    699       # oneway の場合出力、戻り値が無く、受取をå¾
    700 ãŸãªã„(非同期な呼出し)
     669      # 戻り値、出力引数の受取コードの生成
     670
     671      # oneway の場合出力、戻り値が無く、受取を待たない(非同期な呼出し)
    701672      if ! f.is_oneway? then
    702673        file.print <<EOT
    703     /* 関数処理の終了を通知 */
     674    /* 関数処理の終了を通知 */
    704675    if( ( ercd_ = cEventflag_set( 0x01 ) ) != E_OK ){
    705676      goto error_reset;
  • azure_iot_hub/trunk/asp3_dcre/tecsgen/tecslib/plugin/lib/MrubyBridgeCelltypePluginModule.rb

    • Property svn:mime-type changed from text/x-ruby to text/x-ruby;charset=UTF-8
    r388 r389  
    66#   Copyright (C) 2008-2011 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#   $Id$
    5338#++
    5439
    55 #== celltype プラグインのå
    56 ±é€šã®è¦ªã‚¯ãƒ©ã‚¹
     40#== celltype プラグインの共通の親クラス
    5741module MrubyBridgeCelltypePluginModule
    5842
    59   # プラグイン引数名 => Proc
     43  # プラグイン引数名 => Proc
    6044  MrubyBridgePluginArgProc = {
    6145      "ignoreUnsigned" => Proc.new { |obj,rhs| obj.set_ignoreUnsigned rhs },
     
    7155  @@count = 1
    7256
    73   #celltype::     Celltype        セルタイプ(インスタンス)
     57  #celltype::     Celltype        セルタイプ(インスタンス)
    7458  def initialize( celltype, option )
    7559    dbgPrint "#{self.class.name}: initialzie: #{celltype.get_name}\n"
     
    9377  end
    9478
    95   #=== 新しいセル
    96   #cell::        Cell            セル
     79  #=== 新しいセル
     80  #cell::        Cell            セル
    9781  #
    98   # celltype プラグインを指定されたセルタイプのセルが生成された
    99   # セルタイププラグインに対する新しいセルの報告
    100   # generate 文により呼び出された場合、それまでに定義された cell については、initialize のタイミングで呼び出される
     82  # celltype プラグインを指定されたセルタイプのセルが生成された
     83  # セルタイププラグインに対する新しいセルの報告
     84  # generate 文により呼び出された場合、それまでに定義された cell については、initialize のタイミングで呼び出される
    10185  def new_cell( cell )
    10286    dbgPrint "MrubyBridgeCelltypePluginModule: new_cell: #{cell.get_name}\n"
    10387
    104     return if @cell_list.include? cell   # この行は、本来不要のはず
    105     if TECSGEN.post_coded?               # post_code 以降のセルは対象から外す
     88    return if @cell_list.include? cell   # この行は、本来不要のはず
     89    if TECSGEN.post_coded?               # post_code 以降のセルは対象から外す
    10690      cdl_info( "I9999 MrubyBridgeCelltypePlugin: $1 is excluded because cell generated after post_coded", cell.get_name )
    10791      return
     
    146130  end
    147131
    148 ### 意味解析段階で呼び出されるメソッド ###
    149   #===  CDL ファイルの生成
    150   #      typedef, signature, celltype, cell のコードを生成
    151   #      重複して生成してはならない
    152   #      すでに生成されている場合は出力しないこと。
    153   #      もしくは同名の import により、重複を避けること。
    154   #file::        FILE       ç”Ÿæˆã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«
     132### 意味解析段階で呼び出されるメソッド ###
     133  #===  CDL ファイルの生成
     134  #      typedef, signature, celltype, cell のコードを生成
     135  #      重複して生成してはならない
     136  #      すでに生成されている場合は出力しないこと。
     137  #      もしくは同名の import により、重複を避けること。
     138  #file::        FILE       生成するファイル
    155139  def gen_cdl_file file
    156 #   ã“の段階で呼びだすと generate 文が呼び出される前のセルのみの出力となる
     140#   この段階で呼びだすと generate 文が呼び出される前のセルのみの出力となる
    157141   
    158142#    dbgPrint "MrubyBridgeCelltypePlugin: gen_cdl_file: #{@celltype.get_name}\n"
     
    175159  end
    176160
    177   #=== tCelltype_factory.h に挿å
    178 ¥ã™ã‚‹ã‚³ãƒ¼ãƒ‰ã‚’生成する
    179   # file 以外の他のファイルにファクトリコードを生成してもよい
    180   # セルタイププラグインが指定されたセルタイプのみ呼び出される
     161  #=== tCelltype_factory.h に挿入するコードを生成する
     162  # file 以外の他のファイルにファクトリコードを生成してもよい
     163  # セルタイププラグインが指定されたセルタイプのみ呼び出される
    181164  def gen_factory file
    182165  end
     
    187170
    188171  @@b_gen_post_code_called = false
    189   #=== 後ろの CDL コードを生成
    190   #プラグインの後ろの CDL コードを生成
     172  #=== 後ろの CDL コードを生成
     173  #プラグインの後ろの CDL コードを生成
    191174  #file:: File:
    192175  def self.gen_post_code( file )
     
    198181    end
    199182
    200 #    この段階で生成すると、同じポストコードで出力される mruby の初期化コードに反映されない
     183#    この段階で生成すると、同じポストコードで出力される mruby の初期化コードに反映されない
    201184   
    202 #    # MrubyBridgeCelltypePlugin の生成する generate 文は、
     185#    # MrubyBridgeCelltypePlugin の生成する generate 文は、
    203186#    fn2 = "#{$gen}/tmp_MrubyBridgeCelltypePlugin_post.cdl"
    204187#    f2 = File.open( fn2, "w" )
    205 #    # 複数のプラグインの post_code が一つのファイルに含まれるため、以下のような見出しをつけること
     188#    # 複数のプラグインの post_code が一つのファイルに含まれるため、以下のような見出しをつけること
    206189#    dbgPrint "MrubyBridgeCelltypePlugin: gen_post_code\n"
    207190#    f2.print "/* '#{self.name}' post code */\n"
     
    219202  end
    220203
    221   #=== プラグイン引数
    222 
    223   #=== プラグイン引数 ignoreUnsigned
     204  #=== プラグイン引数
     205
     206  #=== プラグイン引数 ignoreUnsigned
    224207  def set_ignoreUnsigned rhs
    225208    if rhs == "true" || rhs == nil then
     
    256239  end
    257240
    258   #=== プラグイン引数 exclude_port_func
     241  #=== プラグイン引数 exclude_port_func
    259242  def set_exclude_port_func rhs
    260243    port_funcs = rhs.split ','
     
    287270  end
    288271
    289   #=== プラグイン引数 auto_exclude
     272  #=== プラグイン引数 auto_exclude
    290273  def set_auto_exclude rhs
    291274    # print "MrubyBridgeCellPlugin: auto_exclude=#{rhs}\n"
Note: See TracChangeset for help on using the changeset viewer.