123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- #!/usr/bin/env python
- import re
- import sys
- import os
- from string import Template
- if len(sys.argv) == 2:
- SRC_DIR = sys.argv[1]
- else:
- SRC_DIR = "../../src/"
- class Structure:
- def __init__(self, string):
- (self.struct, self.flags, self.values) = string.split(":")
- class SetterGetter:
- def __init__(self, string):
- (function, params, self.value) = string.split(":")
- self.function = function.strip("()")
- self.params = [int(a) for a in params.split(",")]
- cmd = "grep -h coccinelle ../../src/*[ch] | sed -e 's/.*coccinelle: \(.*\) \*\//\1/'"
- struct_list = []
- setter_getter_list = []
- dirList = os.listdir(SRC_DIR)
- for fname in dirList:
- if re.search("\.[ch]$", fname):
- for line in open(os.path.join(SRC_DIR, fname)):
- if "coccinelle:" in line:
- m = re.search("coccinelle: (.*) \*\/", line)
- if "()" not in m.group(1):
- struct = Structure(m.group(1))
- struct_list.append(struct)
- else:
- function = SetterGetter(m.group(1))
- setter_getter_list.append(function)
- header = "@flags@"
- body = []
- # Handle setter and getter
- setter_getter = [x.function for x in setter_getter_list]
- if len(setter_getter):
- header += "\nidentifier NotSetterGetter !~ \"^(%s)$\";" % ("|".join(setter_getter))
- i = 0
- for struct in struct_list:
- header += """
- %s *struct%d;
- identifier struct_flags%d =~ "^(?!%s).+";""" % (struct.struct, i, i, struct.values)
- body.append("""
- struct%d->%s@p1 |= struct_flags%d
- |
- struct%d->%s@p1 & struct_flags%d
- |
- struct%d->%s@p1 &= ~struct_flags%d
- """ % (i, struct.flags, i, i, struct.flags, i, i, struct.flags, i))
- i += 1
- print(header)
- print("position p1;")
- print("@@")
- print("")
- print("""
- NotSetterGetter(...)
- {
- <...
- """)
- print("")
- print("(" + "|".join(body) + ")")
- print("")
- print("""
- ...>
- }
- @script:python@
- p1 << flags.p1;
- @@
- print "Invalid usage of flags field at %s:%s, flags value is incorrect (wrong family)." % (p1[0].file, p1[0].line)
- import sys
- sys.exit(1)""")
- i = 1
- setter_template = """
- @settergetter${i}@
- identifier SetterGetter =~ "${function}";
- identifier f_flags =~ "^(?!${value}).+";
- identifier ${params_line};
- position p1;
- @@
- SetterGetter@p1(${prefix_param}f_flags${suffix_param})
- @script:python@
- p1 << settergetter${i}.p1;
- @@
- print "Invalid usage of ${function} at %s:%s, flags value is incorrect (wrong family)." % (p1[0].file, p1[0].line)
- import sys
- sys.exit(1)
- """
- for sg in setter_getter_list:
- prefix_param = ""
- for index in list(range(1, sg.params[1])):
- prefix_param += "param%d, " % (index)
- if sg.params[1] < sg.params[0]:
- suffix_param = ", " + ", ".join(["param%d" % (index + 1) for index in list(range(sg.params[1], sg.params[0]))])
- else:
- suffix_param = ""
- params_elts = list(range(1, sg.params[1])) + list(range(sg.params[1] + 1, sg.params[0] + 1))
- params_line = ", ".join(["param%d" % (x) for x in params_elts])
- print(Template(setter_template).substitute(i=i, function=sg.function, value=sg.value,
- prefix_param=prefix_param, suffix_param=suffix_param, params_line=params_line))
- i += 1
|