You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
193 lines
4.9 KiB
Plaintext
193 lines
4.9 KiB
Plaintext
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"
|