From 72925919677baf3c0ebff3672afd4fbb977e6421 Mon Sep 17 00:00:00 2001 From: glx Date: Sun, 6 Jan 2019 16:36:44 +0100 Subject: Add: generate_widget.vbs to allow script_window.hpp enums generation for users unable to run bash/gawk scripts --- src/script/api/generate_widget.vbs | 192 +++++++++++++++++++++++++++++++++++++ 1 file changed, 192 insertions(+) create mode 100644 src/script/api/generate_widget.vbs diff --git a/src/script/api/generate_widget.vbs b/src/script/api/generate_widget.vbs new file mode 100644 index 000000000..0bd38bb29 --- /dev/null +++ b/src/script/api/generate_widget.vbs @@ -0,0 +1,192 @@ +Option Explicit + +' $Id$ +' +' This file is part of OpenTTD. +' OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. +' OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +' See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . + +Dim FSO, filename, skiptillend, eof +Set FSO = CreateObject("Scripting.FileSystemObject") + +filename = "script_window.hpp" +skiptillend = False +eof = vbCrLf + +If Not FSO.FileExists(filename) Then + WScript.Echo filename & " not found" + WScript.Quit 1 +End If + +Function GetFiles(pattern) + Dim parent, re, files, f + Set files = CreateObject("Scripting.Dictionary") + Set re = New RegExp + + parent = FSO.GetParentFolderName(pattern) + pattern = FSO.GetFileName(pattern) + + ' Convert pattern to a valid regex + re.Global = True + re.Pattern = "\." + pattern = re.Replace(pattern, "\.") + re.Pattern = "\*" + pattern = re.Replace(pattern, ".*") + re.Pattern = pattern + + ' Get the file list + For Each f In FSO.GetFolder(parent).Files + If re.Test(f.Path) Then + f = parent & "/" & f.Name + files.Add f, f + End If + Next + + ' Sort the file list + Set GetFiles = CreateObject("Scripting.Dictionary") + While files.Count <> 0 + Dim first + first = "" + For Each f in files + If first = "" Or StrComp(first, f) = 1 Then first = f + Next + GetFiles.Add first, first + files.Remove(First) + Wend +End Function + +Sub Generate(line, file) + Dim re, add_indent, enum_pattern, file_pattern, f, active, active_comment, comment, rm_indent + Set re = New RegExp + + re.Global = True + re.Pattern = "[^ ]*" + add_indent = re.Replace(line, "") + re.Global = False + re.Pattern = ".*@enum *" + line = Split(re.Replace(line, "")) + enum_pattern = line(0) + file_pattern = line(1) + For Each f In GetFiles(file_pattern).Items + active = 0 + active_comment = 0 + comment = "" + file.Write add_indent & "/* automatically generated from " & f & " */" & eof + Set f = FSO.OpenTextFile(f, 1) + While Not f.AtEndOfStream + re.Pattern = rm_indent + line = re.Replace(f.ReadLine, "") + + ' Remember possible doxygen comment before enum declaration + re.Pattern = "/\*\*" + If active = 0 And re.Test(line) Then + comment = add_indent & line + active_comment = 1 + ElseIf active_comment = 1 Then + comment = comment & vbCrLf & add_indent & line + End If + + ' Check for enum match + re.Pattern = "^ *enum *" & enum_pattern & " *\{" + If re.Test(line) Then + re.Global = True + re.Pattern = "[^ ]*" + rm_indent = re.Replace(line, "") + re.Global = False + active = 1 + If active_comment > 0 Then file.Write comment & eof + active_comment = 0 + comment = "" + End If + + ' Forget doxygen comment, if no enum follows + If active_comment = 2 And line <> "" Then + active_comment = 0 + comment = "" + End If + re.Pattern = "\*/" + If active_comment = 1 And re.Test(line) Then active_comment = 2 + + If active <> 0 Then + re.Pattern = "^ *[A-Za-z0-9_]* *[,=]" + If re.Test(line) Then + Dim parts + ' Transform enum values + re.Pattern = " *=[^,]*" + line = re.Replace(line, "") + re.Pattern = " *//" + line = re.Replace(line, " //") + + re.Pattern = "^( *)([A-Za-z0-9_]+),(.*)" + Set parts = re.Execute(line) + + With parts.Item(0).SubMatches + If .Item(2) = "" Then + file.Write add_indent & .Item(0) & .Item(1) & String(45 - Len(.Item(1)), " ") & "= ::" & .Item(1) & "," & eof + Else + file.Write add_indent & .Item(0) & .Item(1) & String(45 - Len(.Item(1)), " ") & "= ::" & .Item(1) & "," & String(44 - Len(.Item(1)), " ") & .Item(2) & eof + End If + End With + ElseIf line = "" Then + file.Write eof + Else + file.Write add_indent & line & eof + End If + End If + + re.Pattern = "^ *\};" + If re.Test(line) Then + If active <> 0 Then file.Write eof + active = 0 + End If + Wend + f.Close + Next +End Sub + +Sub Parse(line, file) + Dim re + Set re = New RegExp + + re.pattern = "@enum" + If re.Test(line) Then + file.Write line & eof + Generate line, file + skiptillend = True + Exit Sub + End If + + re.pattern = "@endenum" + If re.Test(line) Then + file.Write line & eof + skiptillend = False + Exit Sub + End If + + If Not skiptillend Then + file.Write line & eof + End If +End Sub + +Dim file, source, lines, i + +WScript.Echo "Starting to parse " & filename +Set file = FSO.OpenTextFile(filename, 1) +If Not file.AtEndOfStream Then + source = file.ReadAll +End IF +file.Close + +lines = Split(source, eof) +If UBound(lines) = 0 Then + eof = vbLf + lines = Split(source, eof) +End If + +Set file = FSO.OpenTextFile(filename, 2) +For i = LBound(lines) To UBound(lines) - 1 ' Split adds an extra line, we must ignore it + Parse lines(i), file +Next +file.Close +WScript.Echo "Done" -- cgit v1.2.3-54-g00ecf