summaryrefslogtreecommitdiff
path: root/dist/api_flags.py
blob: 34a440b071bd14f67c78dc4d86676c7369470782 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# Read the api_flags file and output a C header file using the minimum
# number of distinct bits to ensure flags don't collide.
#
# The format of the api_flags file:
#	Name (usually a method name)
#	<tab>	Flag

import os, re, sys
from dist import compare_srcfile

# Load the flags dictionary.
import api_data
flags = api_data.flags

flag_cnt = {}		# Dictionary [flag] : [reference count]
flag_name = {}		# Dictionary [flag] : [name ...]
name_mask = {}		# Dictionary [name] : [used flag mask]

# Step through the flags dictionary and build our local dictionaries.
for method in flags.items():
	name_mask[method[0]] = 0x0
	for flag in method[1]:
		if flag == '__NONE__':
			continue
		if flag not in flag_cnt:
			flag_cnt[flag] = 1
			flag_name[flag] = []
		else:
			flag_cnt[flag] += 1
		flag_name[flag].append(method[0])

# Create list of possible bit masks.
bits = [2 ** i for i in range(0, 32)]

# Walk the list of flags in reverse, sorted-by-reference count order.  For
# each flag, find a bit that's not currently in use by any method using the
# flag.
flag_bit = {}		# Dictionary [flag] : [bit value]
for f in sorted(flag_cnt.items(),\
    key = lambda k_v : (k_v[1], k_v[0]), reverse = True):
	mask = 0xffffffff
	for m in flag_name[f[0]]:
		mask &= ~name_mask[m]
	if mask == 0:
		print >>sys.stder, "api_flags: ran out of flags at " + m + " method",
		sys.exit(1)
	for b in bits:
		if mask & b:
			mask = b
			break
	flag_bit[f[0]] = mask
	for m in flag_name[f[0]]:
		name_mask[m] |= mask

# Print out the flag masks in hex.
#	Assumes tab stops set to 8 characters.
flag_info = ''
for f in sorted(flag_cnt.items()):
	flag_info += "#define\tWT_%s%s%#010x\n" %\
	    (f[0],\
	    "\t" * max(1, 6 - int((len('WT_') + len(f[0])) / 8)),\
	    flag_bit[f[0]])

# Update the wiredtiger.in file with the flags information.
tmp_file = '__tmp'
tfile = open(tmp_file, 'w')
skip = 0
for line in open('../src/include/api.h', 'r'):
	if skip:
		if line.count('API flags section: END'):
			tfile.write('/*\n' + line)
			skip = 0
	else:
		tfile.write(line)
	if line.count('API flags section: BEGIN'):
		skip = 1
		tfile.write(' */\n')
		tfile.write(flag_info)
tfile.close()
compare_srcfile(tmp_file, '../src/include/api.h')