# -*- coding: utf-8 -*- # # TECS Generator # Generator for TOPPERS Embedded Component System # # Copyright (C) 2008-2014 by TOPPERS Project #-- # 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ # ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改 # 変・再配布(以下,利用と呼ぶ)することを無償で許諾する. # (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 # 権表示,この利用条件および下記の無保証規定が,そのままの形でソー # スコード中に含まれていること. # (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 # 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 # 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 # の無保証規定を掲載すること. # (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 # 用できない形で再配布する場合には,次のいずれかの条件を満たすこ # と. # (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 # 作権表示,この利用条件および下記の無保証規定を掲載すること. # (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに # 報告すること. # (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 # 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. # また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理 # 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを # 免責すること. # # 本ソフトウェアは,無保証で提供されているものである.上記著作権者お # よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的 # に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ # アの利用により直接的または間接的に生じたいかなる損害に関しても,そ # の責任を負わない. # # $Id$ #++ #= ParamCopy # # パラメータコピーするマーシャラ/アンマーシャラコードを生成するメソッド print_param を提供する. # RPCPlugin, OpaqueRPCPlugin に include される. # RPCPlugin (トランスペアレント) では、oneway 関数で in のポインタ引数の場合に限って print_param が用いられる. # module GenParamCopy #=== 引数の転送コードを生成 def print_param( name, type, file, nest, dir, outer, outer2, b_marshal, b_get, alloc_cp = nil, alloc_cp_extra = nil, name_list = nil ) if type.get_original_type.kind_of?( ArrayType ) && b_get && dir != :OUT then indent = " " * nest subsc = type.get_subscript if subsc == nil raise "Unsubscripted Array Not Supported" else size_str = subsc.to_str( name_list, outer, outer2 ) file.print < #{type.get_max.to_s} ){\t/* GenParamCopy max check 1 */\n" file.print "#{indent} ercd_ = E_PAR;\n" file.print "#{indent} goto error_reset;\n" file.print "#{indent} }\n" end else # if string then case type.get_type.get_bit_size when -1 # char_t b_size = 8 when 8, 16, 32, 64 # intN_t, uintN_t b_size = type.get_type.get_bit_size else cdl_error( "R9999 $1: string specifier cannot be specified to '$2' in current implementation", name, type.get_type.get_type_str + type.get_type.get_type_str_post ) end if ! b_get then if string.instance_of? Expression then len = string.to_str( name_list, outer, outer2 ) file.print "#{indent} length__#{nest} = STRNLEN#{b_size}(#{outer}#{name}#{outer2},(#{len}-1))+1;\t/* GenParamCopy 6 */\n" file.print "#{indent} if( length__#{nest} < #{len})\tlength__#{nest} += 1;\n" else file.print "#{indent} length__#{nest} = STRLEN#{b_size}(#{outer}#{name}#{outer2})+1;\t/* GenParamCopy 7 */\n" end size_str = "length__#{nest}" # string の場合、strnlen 以上の領域を確保しない else if ( dir == :INOUT ) then if ( string.instance_of? Expression ) then len = string.to_str( name_list, outer, outer2 ) size_str = "#{len}" # string(len) の場合 len を確保する else raise "unsuscripted string used for inout parameter #{name}" end else size_str = "length__#{nest}" # string の場合、strnlen 以上の領域を確保しない end end print_param0( "length__#{nest}", loop_counter_type, file, nest + 1, dir, nil, nil, b_marshal, b_get ) end if b_get && ( dir == :IN || dir == :INOUT || dir == :SEND || dir == :RECEIVE ) && alloc_cp then file.print <