1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
|
#!/usr/bin/env python3
"""
#
# PROFIBUS - GSD file parser
#
# Copyright (c) 2016-2020 Michael Buesch <m@bues.ch>
#
# Licensed under the terms of the GNU General Public License version 2,
# or (at your option) any later version.
#
"""
from __future__ import division, absolute_import, print_function, unicode_literals
import sys
from pyprofibus.gsd.interp import GsdInterp, GsdError
import sys
import getopt
def usage():
print("GSD file parser")
print("")
print("Usage: gsdparser [OPTIONS] [ACTIONS] FILE.GSD")
print("")
print("FILE.GSD is the GSD file to parse.")
print("")
print("Options:")
print(" -o|--output FILE Write output to FILE instead of stdout.")
print(" -d|--debug Enable parser debugging (default off).")
print(" -h|--help Show this help.")
print("")
print("Actions:")
print(" -S|--summary Print a summary of the GSD file contents.")
print(" (The default, if no action is specified)")
print(" -D|--dump Dump the GSD data structure as Python code.")
print("")
print("Options for --dump:")
print(" --dump-strip Strip leading and trailing whitespace from strings.")
print(" --dump-notext Do not dump PrmText.")
print(" --dump-noextuserprmdata Discard all ExtUserPrmData and ExtUserPrmDataRef.")
print(" --dump-module NAME Only dump this module. (default: Dump all)")
print(" Can be specified more then once to dump multiple modules.")
def out(fd, text):
fd.write(text)
fd.flush()
def main():
opt_output = None
opt_debug = False
opt_dumpStrip = False
opt_dumpNoText = False
opt_dumpNoExtUserPrmData = False
opt_dumpModules = []
actions = []
try:
(opts, args) = getopt.getopt(sys.argv[1:],
"ho:dSD",
[ "help",
"output=",
"debug",
"summary",
"dump",
"dump-strip",
"dump-notext",
"dump-noextuserprmdata",
"dump-module=", ])
except getopt.GetoptError as e:
sys.stderr.write(str(e) + "\n")
usage()
return 1
for (o, v) in opts:
if o in ("-h", "--help"):
usage()
return 0
if o in ("-o", "--output"):
opt_output = v
if o in ("-d", "--debug"):
opt_debug = True
if o in ("-S", "--summary"):
actions.append( ("summary", None) )
if o in ("-D", "--dump"):
actions.append( ("dump", None) )
if o in ("--dump-strip", ):
opt_dumpStrip = True
if o in ("--dump-notext", ):
opt_dumpNoText = True
if o in ("--dump-noextuserprmdata", ):
opt_dumpNoExtUserPrmData = True
if o in ("--dump-module", ):
opt_dumpModules.append(v)
if len(args) != 1:
usage()
return 1
gsdFile = args[0]
if not actions:
actions = [ ("summary", None), ]
try:
if opt_output is None:
outFd = sys.stdout
else:
outFd = open(opt_output, "w", encoding="UTF-8")
except OSError as e:
sys.stderr.write("ERROR: %s\n" % str(e))
return 1
try:
interp = GsdInterp.fromFile(gsdFile, debug=opt_debug)
for action, v in actions:
if action == "summary":
out(outFd, str(interp))
elif action == "dump":
py = interp.dumpPy(stripStr=opt_dumpStrip,
noText=opt_dumpNoText,
noExtUserPrmData=opt_dumpNoExtUserPrmData,
modules=(opt_dumpModules or None))
out(outFd, py)
else:
assert(0)
except GsdError as e:
sys.stderr.write("ERROR: %s\n" % str(e))
return 1
except Exception as e:
sys.stderr.write("Exception: %s\n" % str(e))
return 1
finally:
if opt_output is not None:
outFd.flush()
outFd.close()
return 0
if __name__ == "__main__":
sys.exit(main())
|