github.com/archlabjp/eeslism-go@v0.0.0-20231109122333-4bb7bfcdf292/eeslism/eespre.go (about)

     1  package eeslism
     2  
     3  import (
     4  	"bufio"
     5  	"fmt"
     6  	"io"
     7  	"os"
     8  	"path/filepath"
     9  	"strings"
    10  
    11  	"golang.org/x/exp/slices"
    12  )
    13  
    14  /*        注釈文の除去             */
    15  
    16  // Eesprera removes comments from the input file.
    17  func Eesprera(file string) string {
    18  	// 設定ファイルを開く
    19  	fi, err := os.Open(file)
    20  	if err != nil {
    21  		wd, _ := os.Getwd()
    22  		fmt.Printf(wd)
    23  		fmt.Printf("File not found '%s'\n", file)
    24  		os.Exit(1)
    25  	}
    26  	defer fi.Close()
    27  
    28  	// 注釈文の除去語の設定ファイルを作成
    29  	RET := strings.TrimSuffix(file, filepath.Ext(file))
    30  	fb := new(strings.Builder)
    31  
    32  	scanner := bufio.NewScanner(fi)
    33  
    34  	// 各行を処理
    35  	for scanner.Scan() {
    36  		processedLine := processLine(scanner.Text())
    37  		if processedLine != "" {
    38  			_, err := fb.WriteString(processedLine + "\n")
    39  			if err != nil {
    40  				panic(err)
    41  			}
    42  		}
    43  	}
    44  
    45  	if err := scanner.Err(); err != nil {
    46  		panic(err)
    47  	}
    48  	// var s string
    49  	// var c byte
    50  	// for scanner.Scan() {
    51  	// 	s = scanner.Text()
    52  
    53  	// 	if s == "!" {
    54  	// 		//改行するまで読み進める
    55  	// 		for _, err := fmt.Fscanf(fi, "%c", &c); err == nil && c != '\n'; _, err = fmt.Fscanf(fi, "%c", &c) {
    56  	// 		}
    57  	// 	} else {
    58  	// 		if s == " " {
    59  	// 			//全角スペースは半角に置き換える
    60  	// 			fmt.Fprint(fb, "  \n")
    61  	// 		} else if s != "" {
    62  	// 			fmt.Fprintf(fb, " %s ", strings.TrimSpace(s))
    63  	// 		}
    64  
    65  	// 		if s == ";" || strings.HasSuffix(s, ";") {
    66  	// 			fmt.Fprintln(fb)
    67  	// 		} else if s == "#" || strings.HasSuffix(s, "#") {
    68  	// 			fmt.Fprintln(fb)
    69  	// 		} else if s == "*" || strings.HasSuffix(s, "*") {
    70  	// 			fmt.Fprintln(fb)
    71  	// 		} else if s == "*debug" {
    72  	// 			DEBUG = true
    73  	// 		} else {
    74  	// 			fmt.Fprintln(fb)
    75  	// 		}
    76  	// 	}
    77  	// }
    78  
    79  	// fmt.Fprintln(fb, " ")
    80  
    81  	//互換性のために出力
    82  	fbo, err := os.Create(strings.Join([]string{RET, "bdata0.ewk"}, ""))
    83  	if err != nil {
    84  		fmt.Println("Error creating file: ", err)
    85  	} else {
    86  		fmt.Fprint(fbo, fb)
    87  	}
    88  	defer fbo.Close()
    89  
    90  	return fb.String()
    91  }
    92  
    93  func processLine(line string) string {
    94  	// "!"以降を削除
    95  	if index := strings.Index(line, "!"); index != -1 {
    96  		line = line[:index]
    97  	}
    98  	return line
    99  }
   100  
   101  /* ---------------------------------------------------------- */
   102  
   103  /*              スケジュ-ルデ-タファイルの作成    */
   104  
   105  // Eespre creates a schedule data file.
   106  // 入力:
   107  //   bdata0: コメント除去済みの入力テキスト
   108  // 出力:
   109  //   (1) %s または %sn から始まる論理行を除いた入力テキスト -> bdata.ewk
   110  //   (2) %sから始まる論理行のみを収録したテキスト -> schtba.ewk
   111  //   (3) %snから始まる論理行のみを収録したテキスト -> schenma.ewk
   112  //   (4) WEEKデータセット -> week.ewk
   113  func Eespre(bdata0 string, Ipath string, key *int) (string, string, string, string) {
   114  	fi := strings.NewReader(bdata0) //bdata0.ewk 相当
   115  
   116  	syspth := 0
   117  	syscmp := 0
   118  
   119  	Syscheck(fi, &syspth, &syscmp)
   120  
   121  	fb := new(strings.Builder)  //bdata.ewk 相当
   122  	fs := new(strings.Builder)  //schtba.ewk 相当 => %s を拾う
   123  	fsn := new(strings.Builder) //schenma.ewk 相当 => %sn を拾う
   124  	fw := new(strings.Builder)  //week.ewk 相当
   125  
   126  	var st int
   127  
   128  	var section_marker = []string{"TITLE", "GDAT", "RUN", "PRINT", "SCHTB", "EXSRF", "PCM",
   129  		"WALL", "WINDOW", "SUNBRK", "ROOM", "RESI", "APPL", "VENT", "SYSCMP", "SYSPTH", "CONTL"}
   130  
   131  	// %s, %sn を先に分離しておく。
   132  	// 理由: 微妙な位置にある場合にうまく分離できない。
   133  	tokens := NewEeTokens(bdata0)
   134  	sb := new(strings.Builder)
   135  	for !tokens.IsEnd() {
   136  
   137  		line := tokens.GetLogicalLine()
   138  		if line[0] == "*" {
   139  			sb.WriteString("*\n")
   140  			line = line[1:]
   141  		}
   142  
   143  		if slices.Contains(section_marker, line[0]) {
   144  			sb.WriteString(line[0])
   145  			sb.WriteString("\n")
   146  			line = line[1:]
   147  		}
   148  
   149  		if line[0] == "%s" {
   150  			for _, item := range line[1:] {
   151  				fmt.Fprintf(fs, "%s ", item)
   152  			}
   153  			fs.WriteString(";\n")
   154  		} else if line[0] == "%sn" {
   155  			for _, item := range line[1:] {
   156  				fmt.Fprintf(fsn, "%s ", item)
   157  			}
   158  			fsn.WriteString(";\n")
   159  		} else {
   160  			for _, item := range line {
   161  				fmt.Fprintf(sb, "%s ", item)
   162  			}
   163  			sb.WriteString(";\n")
   164  		}
   165  	}
   166  
   167  	// トークン分割
   168  	tokens = NewEeTokens(sb.String())
   169  	for !tokens.IsEnd() {
   170  
   171  		s := tokens.GetToken()
   172  		if s == "\n" {
   173  			continue
   174  		}
   175  
   176  		// 壁体の材料定義リストを指定
   177  		if strings.HasPrefix(s, "wbmlist=") {
   178  			if st = strings.IndexRune(s, ';'); st != -1 {
   179  				s = s[:st+1]
   180  			} else {
   181  				fmt.Fscanf(fi, "%*s")
   182  			}
   183  
   184  			Fbmlist = s[8:]
   185  		} else if s == "WEEK" {
   186  			*key = 1
   187  			line := tokens.GetLogicalLine()
   188  			for _, item := range line {
   189  				fmt.Fprintf(fw, "%s ", item)
   190  			}
   191  			fw.WriteByte(';')
   192  		} else if s == "*" {
   193  			fb.WriteString("*\n")
   194  		} else {
   195  			fb.WriteString(s)
   196  			line := tokens.GetLogicalLine()
   197  
   198  			for _, item := range line {
   199  				fmt.Fprintf(fb, " %s", item)
   200  			}
   201  
   202  			fb.WriteString(" ; \n")
   203  		}
   204  	}
   205  
   206  	fmt.Fprintln(fb, "")
   207  	//fb.Seek(0, 1)
   208  
   209  	fmt.Fprintln(fb, " *")
   210  	fmt.Fprintln(fw, "")
   211  	fmt.Fprintln(fs, "*")
   212  	fmt.Fprintln(fsn, "*")
   213  
   214  	// ファイルに保存する(互換性のため)
   215  	fbo, err := os.Create(strings.Join([]string{Ipath, "bdata.ewk"}, ""))
   216  	if err != nil {
   217  		fmt.Println("Error creating file: ", err)
   218  	} else {
   219  		fmt.Fprint(fbo, fb)
   220  		defer fbo.Close()
   221  	}
   222  
   223  	// SCHTBデータセット
   224  	fso, err := os.Create(strings.Join([]string{Ipath, "schtba.ewk"}, ""))
   225  	if err != nil {
   226  		fmt.Println("Error creating file: ", err)
   227  	} else {
   228  		fmt.Fprint(fso, fs)
   229  		defer fso.Close()
   230  	}
   231  
   232  	// SCHNMAデータセット
   233  	fsno, err := os.Create(strings.Join([]string{Ipath, "schnma.ewk"}, ""))
   234  	if err != nil {
   235  		fmt.Println("Error creating file: ", err)
   236  	} else {
   237  		fmt.Fprint(fsno, fsn)
   238  		defer fsno.Close()
   239  	}
   240  
   241  	// WEEKデータセット
   242  	fwo, err := os.Create(strings.Join([]string{Ipath, "week.ewk"}, ""))
   243  	if err != nil {
   244  		fmt.Println("Error creating file: ", err)
   245  	} else {
   246  		fmt.Fprint(fwo, fw)
   247  		defer fwo.Close()
   248  	}
   249  
   250  	return fb.String(), fs.String(), fsn.String(), fw.String()
   251  }
   252  
   253  /******************************************************************/
   254  
   255  func Syscheck(fi io.ReadSeeker, syspth *int, syscmp *int) {
   256  	var s string
   257  	for _, err := fmt.Fscanf(fi, "%s", &s); err == nil; _, err = fmt.Fscanf(fi, "%s", &s) {
   258  		if s == "SYSPTH" {
   259  			*syspth = 1
   260  		} else if s == "SYSCMP" {
   261  			*syscmp = 1
   262  		}
   263  	}
   264  	fi.Seek(0, 0)
   265  }