summaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2019-09-18 10:41:05 -0400
committerNick Mathewson <nickm@torproject.org>2019-09-23 08:48:53 -0400
commit0b367f3386b0ec25f85716001690c95ae2e78c4d (patch)
tree5fd4dd65ffa54cb6b2820c12e81f83551de0fdee /scripts
parente6c5b248aea3e70e78e60648b10b30daa14f0802 (diff)
downloadtor-0b367f3386b0ec25f85716001690c95ae2e78c4d.tar.gz
tor-0b367f3386b0ec25f85716001690c95ae2e78c4d.zip
Add comments to annotate_ifdef_directives
Diffstat (limited to 'scripts')
-rwxr-xr-xscripts/maint/annotate_ifdef_directives40
1 files changed, 38 insertions, 2 deletions
diff --git a/scripts/maint/annotate_ifdef_directives b/scripts/maint/annotate_ifdef_directives
index ca267a865e..15121652d7 100755
--- a/scripts/maint/annotate_ifdef_directives
+++ b/scripts/maint/annotate_ifdef_directives
@@ -2,21 +2,54 @@
# Copyright (c) 2017-2019, The Tor Project, Inc.
# See LICENSE for licensing information
+# This script iterates over a list of C files. For each file, it looks at the
+# #if/#else C macros, and annotates them with comments explaining what they
+# match.
+#
+# For example, it replaces this:
+#
+# #ifdef HAVE_OCELOT
+# // 500 lines of ocelot code
+# #endif
+#
+# with this:
+#
+# #ifdef HAVE_OCELOT
+# // 500 lines of ocelot code
+# #endif /* defined(HAVE_OCELOT) */
+#
+# Note that only #else and #endif lines are annotated. Existing comments
+# on those lines are removed.
+
import re
+# Any block with fewer than this many lines does not need annotations.
LINE_OBVIOUSNESS_LIMIT = 4
class Problem(Exception):
pass
def uncomment(s):
+ """
+ Remove existing trailing comments from an #else or #endif line.
+ """
s = re.sub(r'//.*','',s)
s = re.sub(r'/\*.*','',s)
return s.strip()
def translate(f_in, f_out):
- whole_file = []
+ """
+ Read a file from f_in, and write its annotated version to f_out.
+ """
+ # A stack listing our current if/else state. Each member of the stack
+ # is a list of directives. Each directive is a 3-tuple of
+ # (command, rest, lineno)
+ # where "command" is one of if/ifdef/ifndef/else/elif, and where
+ # "rest" is an expression in a format suitable for use with #if, and where
+ # lineno is the line number where the directive occurred.
stack = []
+ # the stack element corresponding to the top level of the file.
+ whole_file = []
cur_level = whole_file
lineno = 0
for line in f_in:
@@ -24,6 +57,7 @@ def translate(f_in, f_out):
m = re.match(r'\s*#\s*(if|ifdef|ifndef|else|endif|elif)\b\s*(.*)',
line)
if not m:
+ # no directive, so we can just write it out.
f_out.write(line)
continue
command,rest = m.groups()
@@ -43,6 +77,8 @@ def translate(f_in, f_out):
cur_level = new_level
f_out.write(line)
elif command in ("else", "elif"):
+ # We stay at the same level on the stack. If we have an #else,
+ # we comment it.
if len(cur_level) == 0 or cur_level[-1][0] == 'else':
raise Problem("Unexpected #%s on %d"% (command,lineno))
if (len(cur_level) == 1 and command == 'else' and
@@ -52,6 +88,7 @@ def translate(f_in, f_out):
f_out.write(line)
cur_level.append((command, rest, lineno))
else:
+ # We pop one element on the stack, and comment an endif.
assert command == 'endif'
if len(stack) == 0:
raise Problem("Unmatched #%s on %s"% (command,lineno))
@@ -71,4 +108,3 @@ for fn in sys.argv[1:]:
with open(fn+"_OUT", 'w') as output_file:
translate(open(fn, 'r'), output_file)
os.rename(fn+"_OUT", fn)
-