gasList2lst のソースコード
#!
# coding: utf-8
# Copyright (C) 2016 TOPS SYSTEMS
### @file gasList2lst.py
### @brief gas List to LST with symbols file convertor
###
### GASが出力するリストファイルの
### ①フォームフィードキャラクタを削除
### ②ファイル末にシミュレーション停止用シンボルテーブルを挿入
###
###
### Contact: izumida@topscom.co.jp
###
### @author: M.Izumida
### @date: March 22, 2017
###
## v01r01 Newly created
##
# Written for Python 2.7 (NOT FOR 3.x)
#=======================================================================
# インポート宣言
from __future__ import division
import sys
import re
import argparse
import os
from datetime import datetime
#=======================================================================
# バージョン文字列
versionSTR = "gasList2lst.py v01r01 Tops Systems (pgm by mpi)"
#=======================================================================
# 共通サブルーチン
#-------------------------------------------------------------------
def errPrint(mes):
"""errPrint.
エラー出力へのメッセージ表示
後の始末はその後で別に書くこと
"""
sys.stderr.write(mes)
sys.stderr.write('\n')
#-------------------------------------------------------------------
def stdExceptionHandler(mes):
"""standard Exception Handler.
エラーメッセージを送出し、デバッグのための情報を出力する
"""
errPrint("Exception Captured: " + str(mes))
errPrint("0:" + str(sys.exc_info()[0]))
errPrint("1:" + str(sys.exc_info()[1]))
errPrint("2:" + str(sys.exc_info()[2]))
#-------------------------------------------------------------------
def tryIntParse(st, dval, radix=10):
"""try Parse string to Integer
文字列stをパースして整数化できれば値を返す、できなければデフォルト値dvalを返す
"""
try:
work = int(st, radix)
except:
return dval
return work
#-------------------------------------------------------------------
def repExt(fname, newext):
"""Relpace Extension
fnameの拡張子部分をnewextでリプレースした文字列を返す
"""
tempName, ext = os.path.splitext(os.path.basename(fname))
return tempName + newext
#=======================================================================
# LSTファイルリーダライタクラス
[ドキュメント]class lstReaderWriter:
"""LST File Reader/Writer Class.
gas形式LSTファイルを読み取って修正して出力するクラス
"""
#--------------------------------------------------------------------
def __init__(self, fnamIN, fnamOUT):
"""LST File Reader Writer Constructor
コンストラクタ
"""
self.iFname = fnamIN # 読み込むファイル名
self.oFname = fnamOUT # 書き出すファイル名
# 一次保存用バッファ
self.bufList = []
#デバッグ
self.debug = False
self.verbose = False
#--------------------------------------------------------------------
[ドキュメント] def read(self):
"""read method
ファイルから行をリードして処理するメソッド
"""
nLine = 1
try:
with open(self.iFname, 'r') as f:
for line in f:
if self.rLine(line):
break
nLine += 1
except:
stdExceptionHandler("ERROR: in file reading = " + self.iFname + " line#=" + str(nLine))
return False
return True
#--------------------------------------------------------------------
[ドキュメント] def rLine(self, lin):
"""Read Line method
読み取った1行を処理するメソッド
常にFalseを返す。
(エラーが定義されたらTrueを返す)
"""
if ord(lin[0])==12:
if self.verbose:
print lin
self.writeLine(lin[1:-1])
else:
self.writeLine(lin[0:-1])
#--------------------------------------------------------------------
[ドキュメント] def save(self):
"""buffer Writer
バッファのライタ.
書き込み成功すれば真を返す。
"""
try:
with open(self.oFname, 'w') as f:
for lin in self.bufList:
f.write(lin)
f.write("\n")
f.write("\f40000404 TERMINATE_FAILURE 40000406 TERMINATE_FAILUREB 4000040A TERMINATE_FAIL_AD \n")
f.write("40000408 TERMINATE_FAIL_AI 4000040E TERMINATE_FAIL_BD 4000040C TERMINATE_FAIL_BI \n")
f.write("40000412 TERMINATE_FAIL_DF 40000410 TERMINATE_FAIL_IL 40000400 TERMINATE_SUCCESS \n")
f.write("40000402 TERMINATE_SUCCESSB 4000042C TERMINATE_BRK \n")
f.write("
")
except:
stdExceptionHandler("Error: writing LST file = " + self.oFname)
return False
return True
#--------------------------------------------------------------------
[ドキュメント] def writeLine(self, lin, opt=False):
"""write line to buffer
行を直接バッファへ書き込むためのメソッド.
opt=Trueなら行コメントとする
"""
if opt:
lin = "#" + lin
self.bufList.append(lin)
return
#=======================================================================
# メインプログラム
def main():
"""main.
メインプログラム
"""
#-----------------------------------------------------------------------
# コマンドラインオプション処理
#
parser = argparse.ArgumentParser(description='gasList2lst.')
parser.add_argument('--GAS', nargs=1, help='Specify GAS LST file name.')
parser.add_argument('--LST', nargs=1, help='Specify output LST file name.')
parser.add_argument('-d', dest='debug', help='Debug mode, print debug information.', action='store_true', default=False)
parser.add_argument('-v', dest='verbose', help='Verbose mode.', action='store_true', default=False)
parser.add_argument('-V', dest='VERSION', help='Show Version, then exit', action='store_true', default=False)
args = parser.parse_args()
#-----------------------------------------------------------------------
# Version 表示
#
print versionSTR
if args.VERSION:
sys.exit(0)
#-----------------------------------------------------------------------
# ファイル名処理
#
if args.GAS is None:
errPrint('ERROR: NO input LST file!!!')
sys.exit(1)
else:
inFname = args.GAS[0]
if not os.path.isfile(inFname):
errPrint('ERROR: LST file, NOT EXIST.')
sys.exit(1)
if args.LST is None:
outFname = "work.lst"
else:
outFname = args.LST[0]
#-----------------------------------------------------------------------
# パラメータ処理
#-----------------------------------------------------------------------
# 実処理
#
lst = lstReaderWriter(inFname, outFname)
lst.verbose = args.verbose
lst.debug = args.debug
#
if lst.read():
if not lst.save():
sys.exit(1)
else:
sys.exit(1)
#終了メッセージ
today = datetime.today()
print " "
print today.strftime("FINISH: %Y/%m/%d %H:%M:%S")
#-----------------------------------------------------------------------
# 正常終了
#
sys.exit(0)
#=======================================================================
# メインプログラムの起動
if __name__ == "__main__":
main()