summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorglx <glx@openttd.org>2019-01-06 16:36:44 +0100
committerglx22 <glx22@users.noreply.github.com>2019-01-23 19:44:43 +0100
commit72925919677baf3c0ebff3672afd4fbb977e6421 (patch)
tree504dad48b50d8199939d01dacf24e204648cc30c
parent636fcc2cc02d502f6e0ebddf7fc2d1d2c60f0cb8 (diff)
downloadopenttd-72925919677baf3c0ebff3672afd4fbb977e6421.tar.xz
Add: generate_widget.vbs to allow script_window.hpp enums generation for users unable to run bash/gawk scripts
-rw-r--r--src/script/api/generate_widget.vbs192
1 files changed, 192 insertions, 0 deletions
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 <http://www.gnu.org/licenses/>.
+
+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"