summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/mpl/preprocessed/pp.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/boost/libs/mpl/preprocessed/pp.py')
-rw-r--r--src/boost/libs/mpl/preprocessed/pp.py256
1 files changed, 256 insertions, 0 deletions
diff --git a/src/boost/libs/mpl/preprocessed/pp.py b/src/boost/libs/mpl/preprocessed/pp.py
new file mode 100644
index 00000000..24bfd27e
--- /dev/null
+++ b/src/boost/libs/mpl/preprocessed/pp.py
@@ -0,0 +1,256 @@
+
+# Copyright Aleksey Gurtovoy 2001-2004
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+#
+# See http://www.boost.org/libs/mpl for documentation.
+
+# $Id$
+# $Date$
+# $Revision$
+
+import fileinput
+import os
+import re
+import string
+import sys
+
+if_else = lambda a,b,c:(a and [b] or [c])[0]
+max_len = 79
+ident = 4
+
+def nearest_ident_pos(text):
+ return (len(text)/ident) * ident
+
+def block_format(limits, text, first_sep=' ', sep=',', need_last_ident=1 ):
+ if sep == ',' and string.find( text, '<' ) != -1:
+ sep = '%s ' % sep
+
+ words = string.split(
+ string.join( string.split( text ), ' ' )
+ , sep
+ )
+
+ s = ' ' * limits[0]
+ max_len = limits[1]
+ return '%s\n%s' \
+ % (
+ reduce(
+ lambda t,w,max_len=max_len,s=s,sep=sep:
+ if_else(t[1] + len(w) < max_len
+ , ('%s%s%s'% (t[0],t[2],w), t[1]+len(w)+len(t[2]), sep)
+ , ('%s\n%s%s%s'% (t[0],s,sep,w), len(s)+len(w)+len(sep), sep)
+ )
+ , words
+ , (s,len(s)+len(first_sep),first_sep)
+ )[0]
+ , if_else(need_last_ident,s,'')
+ )
+
+def handle_args( match ):
+ if re.compile('^\s*(typedef|struct|static)\s+.*?$').match(match.group(0)):
+ return match.group(0)
+
+ return '%s'\
+ % block_format(
+ (nearest_ident_pos(match.group(1)),max_len)
+ , match.group(3)
+ , match.group(2)
+ , ','
+ , 0
+ )
+
+
+def handle_inline_args(match):
+ if len(match.group(0)) < max_len:
+ return match.group(0)
+
+ if match.group(9) == None:
+ return '%s%s<\n%s>\n'\
+ % (
+ match.group(1)
+ , match.group(3)
+ , block_format(
+ (nearest_ident_pos(match.group(1))+ident,max_len)
+ , match.group(4)
+ )
+ )
+
+ return '%s%s<\n%s>\n%s%s'\
+ % (
+ match.group(1)
+ , match.group(3)
+ , block_format(
+ (nearest_ident_pos(match.group(1))+ident,max_len-len(match.group(9)))
+ , match.group(4)
+ )
+ , string.replace(match.group(1),',',' ')
+ , match.group(9)
+ )
+
+def handle_simple_list(match):
+ if match.group(1) == 'template':
+ return match.group(0)
+
+ single_arg = re.compile('^\s*(\w|\d)+\s*$').match(match.group(2))
+ return if_else(single_arg,'%s<%s>','%s< %s >') %\
+ (
+ match.group(1)
+ , string.join(string.split(match.group(2)), '')
+ )
+
+def handle_static(match):
+ if len(match.group(0)) < max_len:
+ return match.group(0)
+
+ (first_sep,sep) = if_else(string.find(match.group(0),'+') == -1, (' ',' '),(' ','+'))
+ return '%s%s\n%s%s' %\
+ (
+ match.group(1)
+ , string.join(string.split(match.group(2)), ' ')
+ , block_format(
+ (nearest_ident_pos(match.group(1))+ident,max_len)
+ , match.group(4)
+ , first_sep
+ , sep
+ )
+ , match.group(5)
+ )
+
+def handle_typedefs(match):
+ if string.count(match.group(2), ';') == 1:
+ return match.group(0)
+
+ join_sep = ';\n%s' % match.group(1)
+
+ return '%s%s\n' \
+ % (
+ match.group(1)
+ , string.join(map(string.strip, string.split(match.group(2), ';')), join_sep)
+ )
+
+def fix_angle_brackets( match ):
+ return ' '.join( ''.join( match.group(1).split( ' ' ) ) ) + match.group(3)
+
+
+class pretty:
+ def __init__(self, name):
+ self.output = open(name, "w")
+ self.prev_line = ''
+
+ self.re_copyright_start = re.compile( r'^// Copyright .*$' )
+ self.re_copyright_end = re.compile( r'^// See .* for documentation.$' )
+ self.reading_copyright = 0
+ self.copyright = None
+
+ self.re_header_name_comment = re.compile(
+ r'^\s*//\s+\$[I]d:\s+(.*?%s\.hpp)\s+[^$]+[$]$'
+ % os.path.splitext( name )[0]
+ )
+
+ self.header_was_written = 0
+
+ self.re_junk = re.compile(r'^\s*(#|//[^/]|////).*$')
+ self.re_c_comment_start = re.compile(r'^\s*/\*.*')
+ self.re_c_comment_end = re.compile(r'^.*\*/\s*$')
+ self.inside_c_comment = 0
+
+ self.re_empty_line = re.compile(r'^\s*$')
+ self.re_comma = re.compile(r'(\S+)\s*,\s*')
+ self.re_assign = re.compile(r'(\S+[^<|^!|^>])\s*(=+)\s*(\S+)')
+ self.re_marked_empty_comment = re.compile(r'^\s*//\s*$')
+ self.re_typedef = re.compile(r'^\s+typedef\s+.*?;$')
+ self.re_nsl = re.compile(r'^(\s+typedef\s+.*?;|\s*(private|public):\s*|\s*{\s*|\s*(\w|\d|,)+\s*)$')
+ self.re_templ_decl = re.compile(r'^(\s*template\s*<\s*.*?|\s*(private|public):\s*)$')
+ self.re_type_const = re.compile(r'(const)\s+((unsigned|signed)?(bool|char|short|int|long))')
+ #self.re_templ_args = re.compile(r'^(\s*)(, | {2})((.*::.*?,?)+)\s*$')
+ self.re_templ_args = re.compile(r'^(\s*)(, | {2})((\s*(\w+)(\s+|::)\w+\s*.*?,?)+)\s*$')
+ self.re_inline_templ_args = re.compile(
+ r'^(\s+(,|:\s+)?|struct\s+)(\w+)\s*<((\s*(typename\s+)?\w+\s*(=\s*.*|<(\s*\w+\s*,?)+>\s*)?,?)+)\s*>\s+((struct|class).*?)?$'
+ )
+
+ self.re_simple_list = re.compile(r'(\w+)\s*<((\w|,| |-)+)>')
+ self.re_static_const = re.compile(r'(\s*)((BOOST_STATIC_CONSTANT\(\s*\w+,\s*|enum\s*\w*\s*{\s*)value\s*=)(.*?)([}|\)];)$')
+ self.re_typedefs = re.compile(r'(\s*)((\s*typedef\s*.*?;)+)\s*$')
+ self.re_fix_angle_brackets = re.compile( r'(>(\s*>)+)(,|\n$)' )
+ self.re_closing_curly_brace = re.compile(r'^(}|struct\s+\w+);\s*$')
+ self.re_namespace_scope_templ = re.compile(r'^template\s*<\s*$')
+ self.re_namespace = re.compile(r'^\n?namespace\s+\w+\s*{\s*\n?$')
+
+ def process(self, line):
+ if self.reading_copyright:
+ if not self.re_copyright_end.match( line ):
+ self.copyright += line
+ return
+
+ self.reading_copyright = 0
+
+ if not self.header_was_written and self.re_copyright_start.match( line ):
+ self.copyright = line
+ self.reading_copyright = 1
+ return
+
+ # searching for header line
+ if not self.header_was_written:
+ if self.re_header_name_comment.match( line ):
+ self.header_was_written = 1
+ match = self.re_header_name_comment.match( line )
+ self.output.write( \
+ '\n%s\n' \
+ '// *Preprocessed* version of the main "%s" header\n' \
+ '// -- DO NOT modify by hand!\n\n' \
+ % ( self.copyright, match.group(1) )
+ )
+ return
+
+ # skipping preprocessor directives, comments, etc.
+ if self.re_junk.match(line):
+ return
+
+ if self.inside_c_comment or self.re_c_comment_start.match(line):
+ self.inside_c_comment = not self.re_c_comment_end.match(line)
+ return
+
+ # restoring some empty lines
+ if self.re_templ_decl.match(line) and self.re_typedef.match(self.prev_line) \
+ or not self.re_empty_line.match(line) and self.re_closing_curly_brace.match(self.prev_line) \
+ or not self.re_empty_line.match(self.prev_line) \
+ and ( self.re_namespace_scope_templ.match(line) \
+ or self.re_namespace.match(line) and not self.re_namespace.match(self.prev_line) \
+ ):
+ line = '\n%s' % line
+
+ # removing excessive empty lines
+ if self.re_empty_line.match(line):
+ if self.re_empty_line.match(self.prev_line) or not self.header_was_written:
+ return
+
+ # skip empty line after typedef
+ if self.re_nsl.match(self.prev_line):
+ return
+
+ # formatting
+ line = self.re_comma.sub( r'\1, ', line )
+ line = self.re_assign.sub( r'\1 \2 \3', line )
+ line = self.re_marked_empty_comment.sub( r'\n', line )
+ line = self.re_type_const.sub( r'\2 \1', line )
+ line = self.re_templ_args.sub( handle_args, line )
+ line = self.re_inline_templ_args.sub( handle_inline_args, line )
+ line = self.re_simple_list.sub( handle_simple_list, line)
+ line = self.re_static_const.sub( handle_static, line )
+ line = self.re_typedefs.sub( handle_typedefs, line )
+ line = self.re_fix_angle_brackets.sub( fix_angle_brackets, line )
+
+ # write the output
+ self.output.write(line)
+ self.prev_line = line
+
+def main( src, dest ):
+ p = pretty( os.path.basename( dest ) )
+ for line in fileinput.input( src ):
+ p.process(line)
+
+if __name__ == '__main__':
+ main( sys.argv[1], sys.argv[2] )