1
0
mirror of https://github.com/ARM-software/workload-automation.git synced 2024-10-06 19:01:15 +01:00
workload-automation/wlauto/workloads/rt_app/workgen

237 lines
5.3 KiB
Plaintext
Raw Normal View History

2015-06-12 17:10:21 +01:00
#!/usr/bin/env python
import os
import sys
import getopt
import subprocess
import signal
import re
def check_unikid_json(infile, outfile, verbose=0):
if not os.path.exists(infile):
print "WARN: %s does not exist", infile
try:
fi = open(infile, "r")
except IOError:
print "WARN: Unable to open %s", infile
sys.exit(2)
lines = fi.readlines()
fi.close()
try:
fo = open(outfile, "w+")
except IOError:
print "WARN: Unable to open %s", f
sys.exit(2)
curid = 1
refcount = 0
idlist = {}
myid = []
for myline in lines:
if "{" in myline:
refcount += 1
myid.append(curid)
curid = 1
idlist[refcount] = {}
if "}" in myline:
del idlist[refcount]
curid = myid.pop()
refcount -= 1
try:
key_id, value = myline.split(":", 1)
except ValueError:
fo.write(myline)
continue
key_id = key_id.strip('\"\t\n\r ')
value = value.strip(',\"\t\n\r ')
if key_id in idlist[refcount]:
newkey_id = key_id + str(curid)
while newkey_id in idlist[refcount]:
curid += 1
newkey_id = key_id + str(curid)
if verbose:
print "level ", refcount, " : key ", key_id, " changed into ", newkey_id
myline = myline.replace(key_id, newkey_id, 1)
key_id = newkey_id
idlist[refcount][key_id] = value
fo.write(myline)
fo.close()
return
def check_suspend_json(infile, outfile, verbose=0):
if not os.path.exists(infile):
print "WARN: %s does not exist", infile
try:
fi = open(infile, "r")
except IOError:
print "WARN: Unable to open %s", infile
sys.exit(2)
lines = fi.readlines()
fi.close()
try:
fo = open(outfile, "w+")
except IOError:
print "WARN: Unable to open %s", f
sys.exit(2)
taskobj = 0
curid = ""
for myline in lines:
exception = 0
key_id = "exception"
try:
key_id, value = myline.split(":", 1)
except ValueError:
if "suspend" in myline:
key_id = "suspend"
exception = 1
key_id = key_id.strip('\"\t\n\r ')
if not "tasks" in key_id and \
taskobj == 0:
fo.write(myline)
continue
if "{" in myline:
taskobj += 1
if taskobj == 2:
curid = key_id
if "}" in myline:
taskobj -= 1
if "suspend" in key_id and \
exception == 1:
if verbose:
print "value ", curid, " added to suspend key"
if "," in myline:
myline = myline.replace(",", " : " + "\"" + curid + "\",", 1)
else:
myline = myline.replace("\n", " : " + "\"" + curid + "\"\n", 1)
fo.write(myline)
fo.close()
return
# remove trailing commas that may appear after closing
# brackets and last entries in every section
def remove_trailing_commas(outfile):
try:
f = open(outfile, 'r+')
except IOError:
print "WARN: Unable to open %s", f
sys.exit(2)
lines = f.read()
check_last_entry_regex = r'(.),(\n\s*})'
check_end_bracket_regex = r'(}),(\n\s*})'
lines = re.sub(check_last_entry_regex, r'\g<1>\g<2>', lines)
lines = re.sub(check_end_bracket_regex, r'\g<1>\g<2>', lines)
f.seek(0)
f.write(lines)
f.truncate()
f.close()
return
# Search for comments to remove
def comment_remover(text):
def replacer(match):
s = match.group(0)
if s.startswith('/'):
return " " # note: a space and not an empty string
else:
return s
pattern = re.compile(
r'//.*?$|/\*.*?\*/|\'(?:\\.|[^\\\'])*\'|"(?:\\.|[^\\"])*"',
re.DOTALL | re.MULTILINE)
return re.sub(pattern, replacer, text)
# Remove all comments inside the file
def remove_all_comments(outfile):
try:
f = open(outfile, 'r+')
except IOError:
print "WARN: Unable to open %s", f
sys.exit(2)
lines = f.read()
lines = comment_remover(lines)
f.seek(0)
f.write(lines)
f.truncate()
f.close()
return
if __name__ == '__main__':
def handleSigTERM(signum, frame):
sys.exit()
signal.signal(signal.SIGTERM, handleSigTERM)
signal.signal(signal.SIGINT, handleSigTERM)
outfile = "unikid.json"
selfupdate = 0
verbose = 0
dry_run = False
try:
opts, args = getopt.getopt(sys.argv[1:], "o:avd")
except getopt.GetoptError as err:
print str(err) # will print something like "option -a not recognized"
sys.exit(2)
for o, a in opts:
if o == "-o":
outfile = a
if o == "-a":
selfupdate = 1
if o == "-v":
verbose = 1
if o == "-d":
dry_run = True
for f in args:
if selfupdate:
outfile = f
check_suspend_json(f, outfile)
check_unikid_json(outfile, outfile)
remove_trailing_commas(outfile)
remove_all_comments(outfile)
if not dry_run:
subprocess.call(["rt-app", outfile])