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()