summaryrefslogtreecommitdiffstats
path: root/debian/uncrustify-trinity/uncrustify-trinity-0.74.0/scripts/make_punctuator_table.py
diff options
context:
space:
mode:
Diffstat (limited to 'debian/uncrustify-trinity/uncrustify-trinity-0.74.0/scripts/make_punctuator_table.py')
-rwxr-xr-xdebian/uncrustify-trinity/uncrustify-trinity-0.74.0/scripts/make_punctuator_table.py189
1 files changed, 189 insertions, 0 deletions
diff --git a/debian/uncrustify-trinity/uncrustify-trinity-0.74.0/scripts/make_punctuator_table.py b/debian/uncrustify-trinity/uncrustify-trinity-0.74.0/scripts/make_punctuator_table.py
new file mode 100755
index 00000000..f3d90081
--- /dev/null
+++ b/debian/uncrustify-trinity/uncrustify-trinity-0.74.0/scripts/make_punctuator_table.py
@@ -0,0 +1,189 @@
+#! /usr/bin/env python
+#
+# Creates a possibly faster lookup table for tokens, etc.
+#
+# @author Ben Gardner
+# @author Matthew Woehlke
+# @license GPL v2+
+#
+import argparse
+import os
+import sys
+
+
+# -----------------------------------------------------------------------------
+def scan_file(file_path):
+ cur_token = ''
+ token_idx = 0
+ args = []
+
+ fd = open(file_path, 'r')
+ for line in fd:
+ line = line.strip()
+ if line.startswith('static const chunk_tag_t'):
+ idx = line.find('[')
+ if idx > 0:
+ cur_token = line[25:idx].strip()
+ token_idx = 0
+ else:
+ if len(cur_token) > 0:
+ idx1 = line.find('{')
+ idx2 = line.find('CT_')
+ if idx1 >= 0 and idx2 > idx1:
+ tok = line[idx1 + 1:idx2].strip()
+ if tok.startswith('R"'):
+ pos_paren_open = tok.find('(')
+ pos_paren_close = tok.rfind(')')
+
+ if pos_paren_open == -1 or pos_paren_close == -1:
+ sys.stderr.write(
+ 'raw string parenthesis not found\n')
+ sys.exit(-1)
+
+ tok = tok[pos_paren_open+1:pos_paren_close]
+ else:
+ tok = tok[1:-2] # strip off open quotes and commas
+ args.append([tok, '%s[%d]' % (cur_token, token_idx)])
+ token_idx += 1
+ return args
+
+
+# -----------------------------------------------------------------------------
+def build_table(db, prev, arr):
+ # do the current level first
+ k = sorted(db)
+ if len(k) <= 0:
+ return
+ k.sort()
+
+ start_idx = len(arr)
+ num_left = len(k)
+
+ for i in k:
+ en = db[i]
+ # [ char, full-string, left-in-group, next_index, table-entry ]
+ num_left -= 1
+ arr.append([en[0], prev + en[0], num_left, 0, en[2]])
+
+ # update the one-up level index
+ if len(prev) > 0:
+ for idx in range(0, len(arr)):
+ if arr[idx][1] == prev:
+ arr[idx][3] = start_idx
+ break
+
+ # Now do each sub level
+ for i in k:
+ en = db[i]
+ build_table(en[3], prev + en[0], arr)
+
+
+# -----------------------------------------------------------------------------
+def add_to_db(entry, db_top):
+ """
+ find or create the entry for the first char
+ """
+ strng = entry[0]
+ db_cur = db_top
+ for idx in range(0, len(strng)):
+ if not strng[idx] in db_cur:
+ db_cur[strng[idx]] = [strng[idx], 0, None, {}]
+
+ dbe = db_cur[strng[idx]]
+
+ if idx == len(strng) - 1:
+ dbe[2] = entry
+ else:
+ db_cur = dbe[3]
+
+
+# -----------------------------------------------------------------------------
+def quote(s):
+ return '\'{}\''.format(s)
+
+
+# -----------------------------------------------------------------------------
+def escape(s):
+ return quote(s.replace('\'', '\\\''))
+
+
+# -----------------------------------------------------------------------------
+def write_entry(out, max_len, ch, left_in_group, next_idx, tag, idx, tok):
+ out.write(
+ ' {{ {:>4}, {:>3d}, {:>3d}, {:{}} }}, // {:3d}: {}'.format(
+ ch, left_in_group, next_idx, tag, max_len, idx, tok).rstrip())
+ out.write('\n')
+
+
+# -----------------------------------------------------------------------------
+def main():
+ parser = argparse.ArgumentParser(description='Generate punctuator_table.h')
+ parser.add_argument('output', type=str,
+ help='location of punctuator_table.h to write')
+ parser.add_argument('header', type=str,
+ help='location of symbols_table.h to read')
+ args = parser.parse_args()
+
+ root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+ pl = scan_file(args.header)
+ pl.sort()
+
+ db = {}
+ for a in pl:
+ add_to_db(a, db)
+
+ arr = []
+ build_table(db, '', arr)
+
+ max_len = len('nullptr')
+ for i in arr:
+ rec = i[4]
+ if rec is not None and (len(rec[1]) + 1) > max_len:
+ max_len = len(rec[1]) + 1
+
+ in_name = os.path.basename(args.header)
+ out_name = os.path.basename(args.output)
+ guard = out_name.replace('.', '_').upper()
+
+ with open(args.output, 'wt') as out:
+ out.write(
+ '/**\n'
+ ' * @file {out_name}\n'
+ ' * Automatically generated by <code>{script}</code>\n'
+ ' * from {in_name}.\n'
+ ' */\n'
+ '\n'
+ '#ifndef SRC_{guard}_\n'
+ '#define SRC_{guard}_\n'
+ '\n'
+ '// *INDENT-OFF*\n'
+ 'static const lookup_entry_t punc_table[] =\n'
+ '{{\n'.format(
+ in_name=in_name, out_name=out_name, guard=guard,
+ script=os.path.relpath(__file__, root)))
+
+ idx = 0
+
+ for i in arr:
+ rec = i[4]
+ if len(i[0]) == 0:
+ write_entry(out, max_len, '0', '0', '0', 'nullptr', idx, '')
+ elif rec is None:
+ write_entry(out, max_len, escape(i[0]), i[2], i[3],
+ 'nullptr', idx, quote(i[1]))
+ else:
+ write_entry(out, max_len, escape(i[0]), i[2], i[3],
+ '&' + rec[1], idx, quote(i[1]))
+ idx += 1
+
+ out.write(
+ '}};\n'
+ '// *INDENT-ON*\n'
+ '\n'
+ '#endif /* SRC_{guard}_ */\n'.format(guard=guard))
+
+# %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+if __name__ == '__main__':
+ main()