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

ASP3, TINET, mbed を更新

File:
1 edited

Legend:

Unmodified
Added
Removed
  • EcnlProtoTool/trunk/asp3_dcre/cfg/pass1.rb

    r360 r429  
    44#
    55#  Copyright (C) 2015 by FUJI SOFT INCORPORATED, JAPAN
    6 #  Copyright (C) 2015-2017 by Embedded and Real-Time Systems Laboratory
     6#  Copyright (C) 2015-2018 by Embedded and Real-Time Systems Laboratory
    77#              Graduate School of Information Science, Nagoya Univ., JAPAN
    88#
     
    3636#  の責任を負わない.
    3737#
    38 #  $Id$
     38#  $Id: pass1.rb 165 2019-01-11 01:29:47Z ertl-hiro $
    3939#
    4040
     
    6161  "LONG_MAX"  => { EXPR: "LONG_MAX",  SIGNED: true },
    6262  "LONG_MIN"  => { EXPR: "LONG_MIN",  SIGNED: true },
    63   "ULONG_MAX" => { EXPR: "ULONG_MAX" }
     63  "ULONG_MAX" => { EXPR: "ULONG_MAX" },
     64  "SIL_ENDIAN_BIG" \
     65        => { EXPR: "true", BOOL: true, CONDITION: "defined(SIL_ENDIAN_BIG)" },
     66  "SIL_ENDIAN_LITTLE" \
     67        => { EXPR: "true", BOOL: true, CONDITION: "defined(SIL_ENDIAN_LITTLE)" }
    6468}
    6569
     
    6872#
    6973$apiDefinition = { "INCLUDE" =>
    70   { :PARAM => [ { :NAME => :file, :STRING => true }]}}
     74  { :PARAM => [ { :NAME => :file, :STRING_LITERAL => true }]}}
    7175
    7276#
     
    121125            apiParam[:EXPTYPE] = "signed_t"
    122126            apiParam[:SIGNED] = true
     127          when "^"                                      # ポインタ整数定数式パラメータ
     128            apiParam[:EXPTYPE] = "uintptr_t"
     129            apiParam[:INTPTR] = true
    123130          when "&"                                      # 一般整数定数式パラメータ
    124131            # do nothing
    125132          when "$"                                      # 文字列定数式パラメータ
    126133            apiParam[:STRING] = true
     134            apiParam[:EXPTYPE] = "char *"
    127135          else
    128136            error_exit("`#{param}' is invalid")
     
    171179                                                { skip_blanks: true, skip_lines: /^#/ })
    172180    symvalCsv.each do |record|
     181      symbol = {}
     182
    173183      # 変数名
    174184      if record[0].nil?
    175185        error_exit("invalid variable name in " \
    176186                                                "`#{symvalTableFileName}:#{symvalCsv.to_io.lineno}'")
    177       end
    178 
    179       symbol = {}
    180       variable = record[0]
     187      elsif /^(.+)\[(.+)\]$/ =~ record[0]
     188        variable = $1
     189        symbol[:NUMSTRVAR] = $2
     190      else
     191        variable = record[0]
     192      end
    181193
    182194      # 式
     
    192204        when /^[bB]/                            # 真偽値
    193205          symbol[:BOOL] = true
     206        when /^[iI]/                            # ポインタ整数値
     207          symbol[:INTPTR] = true
    194208        when /^[uU]/                            # 符号無し整数値
    195209          # 何も設定しない
     
    367381    skipSpace(cfgFile, withinApi)
    368382    if @line.nil?                                                       # ファイル末であればエラー終了
    369       error_exit("unexpexced end-of-file")
     383      error_exit("#{cfgFile.getFileName}: unexpeced end-of-file")
    370384    end
    371385  end
     
    472486    end
    473487
    474     if apiParam.has_key?(:STRING)
     488    if apiParam.has_key?(:STRING_LITERAL)
    475489      return(param.unquote)
    476490    else
     
    604618        # プリプロセッサディレクティブを読む
    605619        case @line
    606         when /^#include\b(.*)$/
    607           $includeFiles.push($1.strip)
    608         when /^#(ifdef|ifndef|if|endif|else|elif)\b/
    609           directive = { :DIRECTIVE => @line.strip }
     620        when /^#(include|ifdef|ifndef|if|endif|else|elif)\b/
     621          directive = {}
     622          directive[:DIRECTIVE] = @line.strip
     623          directive[:_FILE_] = cfgFile.getFileName
     624          directive[:_LINE_] = cfgFile.getLineNo
    610625          $cfgFileInfo.push(directive)
    611626        else
     
    619634        case apiName
    620635        when "KERNEL_DOMAIN"
    621           if $supportDomain.nil?
     636          if !$supportDomain
    622637            parse_warning(cfgFile, "`KERNEL_DOMAIN' is not supported")
    623638          end
     
    629644          @@nestDC.push("domain")
    630645        when "DOMAIN"
    631           if $supportDomain.nil?
     646          if !$supportDomain
    632647            parse_warning(cfgFile, "`DOMAIN' is not supported")
    633648          end
     
    655670          @@nestDC.push("domain")
    656671        when "CLASS"
    657           if $supportClass.nil?
     672          if !$supportClass
    658673            parse_warning(cfgFile, "`CLASS' is not supported")
    659674          end
     
    676691              includeFilePath = SearchFilePath(staticApi[:file])
    677692              if includeFilePath.nil?
    678                 parse_error(cfgFile, "`#{staticApi[:file]}' not found")
     693                error = {}
     694                error[:DIRECTIVE] = "#error '#{staticApi[:file]}' not found."
     695                error[:_FILE_] = cfgFile.getFileName
     696                error[:_LINE_] = cfgFile.getLineNo
     697                $cfgFileInfo.push(error)
    679698              else
    680699                $dependencyFiles.push(includeFilePath)
     
    694713              $cfgFileInfo.push(staticApi)
    695714            end
     715
     716            # ";"を読む
     717            skipToToken(cfgFile, false)         # 次の文字まで読み飛ばす
     718            if (/^\;(.*)$/ =~ @line)
     719              @line = $1
     720            else
     721              parse_error(cfgFile, "`;' expected after static API")
     722            end
    696723          else
    697724            parse_error(cfgFile, "unknown static API: #{apiName}")
     
    727754  #
    728755  def self.OutLineNumber(cfgInfo)
    729     @cfg1Out.add("#line #{cfgInfo[:_LINE_]} \"#{cfgInfo[:_FILE_].gsub('\\', '/')}\"")
     756    @cfg1Out.add("#line #{cfgInfo[:_LINE_]} \"#{cfgInfo[:_FILE_]}\"")
    730757  end
    731758
     
    734761  #
    735762  def self.OutClassLineNumber(cfgInfo)
    736     @cfg1Out.add("#line #{cfgInfo[:CLASS_LINE_]} \"#{cfgInfo[:CLASS_FILE_].gsub('\\', '/')}\"")
     763    @cfg1Out.add("#line #{cfgInfo[:CLASS_LINE_]} \"#{cfgInfo[:CLASS_FILE_]}\"")
    737764  end
    738765
     
    763790EOS
    764791
    765     # インクルードヘッダファイル
    766     $includeFiles.each do |file|
    767       @cfg1Out.add("#include #{file}")
     792    # インクルードディレクティブ(#include)の生成
     793    $cfgFileInfo.each do |cfgInfo|
     794      if cfgInfo.has_key?(:DIRECTIVE)
     795        OutLineNumber(cfgInfo)
     796        @cfg1Out.add(cfgInfo[:DIRECTIVE])
     797      end
    768798    end
    769799
     
    780810#include "#{CFG1_OUT_TARGET_H}"
    781811
    782 #if defined(SIL_ENDIAN_BIG) && defined(SIL_ENDIAN_LITTLE)
    783 #error Both SIL_ENDIAN_BIG and SIL_ENDIAN_LITTLE are defined.
    784 #endif
    785 #if !defined(SIL_ENDIAN_BIG) && !defined(SIL_ENDIAN_LITTLE)
    786 #error Neither SIL_ENDIAN_BIG nor SIL_ENDIAN_LITTLE is defined.
    787 #endif
    788 
    789812const uint32_t #{CFG1_MAGIC_NUM} = 0x12345678;
    790813const uint32_t #{CFG1_SIZEOF_SIGNED} = sizeof(signed_t);
     814const uint32_t #{CFG1_SIZEOF_INTPTR} = sizeof(intptr_t);
     815const uint32_t #{CFG1_SIZEOF_CHARPTR} = sizeof(char *);
    791816EOS
    792817
    793818    # 値取得シンボルの処理
    794819    $symbolValueTable.each do |symbolName, symbolData|
    795       if symbolData.has_key?(:BOOL) || symbolData.has_key?(:SIGNED)
     820      if symbolData.has_key?(:BOOL)
     821        type = "signed_t"
     822      elsif symbolData.has_key?(:INTPTR)
     823        type = "uintptr_t"
     824      elsif symbolData.has_key?(:SIGNED)
    796825        type = "signed_t"
    797826      else
     
    825854    $cfgFileInfo.each do |cfgInfo|
    826855      if cfgInfo.has_key?(:DIRECTIVE)
    827         @cfg1Out.add2(cfgInfo[:DIRECTIVE])
     856        # 条件ディレクティブを出力
     857        if cfgInfo[:DIRECTIVE] =~ /^#(ifdef|ifndef|if|endif|else|elif)\b/
     858          OutLineNumber(cfgInfo)
     859          @cfg1Out.add2(cfgInfo[:DIRECTIVE])
     860        end
    828861      else
    829862        apiDef = $apiDefinition[cfgInfo[:APINAME]]
     
    882915  $cfgFileInfo = []
    883916  $dependencyFiles = $configFileNames.dup
    884   $includeFiles = []
    885917  $domainId = { "TDOM_KERNEL" => -1, "TDOM_NONE" => -2 }
    886918  $configFileNames.each do |configFileName|
     
    939971  #  パス2に引き渡す情報をファイルに生成
    940972  #
    941   if $omitOutputDb.nil?
     973  if !$omitOutputDb
    942974    db = PStore.new(CFG1_OUT_DB)
    943975    db.transaction do
     
    945977      db[:symbolValueTable] = $symbolValueTable
    946978      db[:cfgFileInfo] = $cfgFileInfo
    947       db[:includeFiles] = $includeFiles
    948979      db[:domainId] = $domainId
    949980    end
Note: See TracChangeset for help on using the changeset viewer.