123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- // Script to edit control_*.c for refactored control reply output functions
- @ initialize:python @
- @@
- import re
- from coccilib.report import *
- # reply strings "NNN-foo", "NNN+foo", "NNN foo", etc.
- r = re.compile(r'^"(\d+)([ +-])(.*)\\r\\n"$')
- # Generate name of function to call based on which separator character
- # comes between the numeric code and the text
- def idname(sep, base):
- if sep == '+':
- return base + "datareply"
- elif sep == '-':
- return base + "midreply"
- else:
- return base + "endreply"
- # Generate the actual replacements used by the rules
- def gen(s, base, p):
- pos = p[0]
- print_report(pos, "%s %s" % (base, s))
- m = r.match(s)
- if m is None:
- # String not correct format, so fail match
- cocci.include_match(False)
- print_report(pos, "BAD STRING %s" % s)
- return
- code, sep, s1 = m.groups()
- if r'\r\n' in s1:
- # Extra CRLF in string, so fail match
- cocci.include_match(False)
- print_report(pos, "extra CRLF in string %s" % s)
- return
- coccinelle.code = code
- # Need a string that is a single C token, because Coccinelle only allows
- # "identifiers" to be output from Python scripts?
- coccinelle.body = '"%s"' % s1
- coccinelle.id = idname(sep, base)
- return
- @ match @
- identifier f;
- position p;
- expression E;
- constant s;
- @@
- (
- connection_printf_to_buf@f@p(E, s, ...)
- |
- connection_write_str_to_buf@f@p(s, E)
- )
- @ script:python sc1 @
- s << match.s;
- p << match.p;
- f << match.f;
- id;
- body;
- code;
- @@
- if f == 'connection_printf_to_buf':
- gen(s, 'control_printf_', p)
- elif f == 'connection_write_str_to_buf':
- gen(s, 'control_write_', p)
- else:
- raise(ValueError("%s: %s" % (f, s)))
- @ replace @
- constant match.s;
- expression match.E;
- identifier match.f;
- identifier sc1.body, sc1.id, sc1.code;
- @@
- (
- -connection_write_str_to_buf@f(s, E)
- +id(E, code, body)
- |
- -connection_printf_to_buf@f(E, s
- +id(E, code, body
- , ...)
- )
|