summaryrefslogtreecommitdiff
path: root/dist/api_err.py
blob: 7ad645d108c68401c835a02cf73532769861e40e (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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# Output C #defines for errors into wiredtiger.in and the associated error
# message code in strerror.c.

import re, textwrap

import api_data
from dist import compare_srcfile

# Update the #defines in the wiredtiger.in file.
tmp_file = '__tmp'
tfile = open(tmp_file, 'w')
skip = 0
for line in open('../src/include/wiredtiger.in', 'r'):
	if not skip:
		tfile.write(line)
	if line.count('Error return section: END'):
		tfile.write(line)
		skip = 0
	elif line.count('Error return section: BEGIN'):
		tfile.write(' */\n')
		skip = 1

		# We don't want our error returns to conflict with any other
		# package, so use an uncommon range, specifically, -31,800 to
		# -31,999.
		v = -31800
		for err in api_data.errors:
			if 'undoc' in err.flags:
				tfile.write('/*! @cond internal */\n')
			tfile.write('/*!%s.%s */\n' %
			    (('\n * ' if err.long_desc else ' ') + err.desc[0].upper() + err.desc[1:],
			    ''.join('\n * ' + l for l in textwrap.wrap(textwrap.dedent(err.long_desc).strip(), 77)) + '\n' if err.long_desc else ''))
			tfile.write('#define\t%s\t%d\n' % (err.name, v))
			v -= 1
			if 'undoc' in err.flags:
				tfile.write('/*! @endcond */\n')
		tfile.write('/*\n')
tfile.close()
compare_srcfile(tmp_file, '../src/include/wiredtiger.in')

# Output the wiredtiger_strerror code.
tmp_file = '__tmp'
tfile = open(tmp_file, 'w')
tfile.write('''/* DO NOT EDIT: automatically built by dist/api_err.py. */

#include "wt_internal.h"

/*
 * wiredtiger_strerror --
 *	Return a string for any error value.
 */
const char *
wiredtiger_strerror(int error)
{
	static char errbuf[64];
	char *p;

	if (error == 0)
		return ("Successful return: 0");

	switch (error) {
''')

for err in api_data.errors:
	tfile.write('\tcase ' + err.name + ':\n')
	tfile.write('\t\treturn ("' + err.name + ': ' + err.desc + '");\n')

tfile.write('''\
	default:
		if (error > 0 && (p = strerror(error)) != NULL)
			return (p);
		break;
	}

	/*
	 * !!!
	 * Not thread-safe, but this is never supposed to happen.
	 */
	(void)snprintf(errbuf, sizeof(errbuf), "Unknown error: %d", error);
	return (errbuf);
}
''')
tfile.close()
compare_srcfile(tmp_file, '../src/api/api_strerror.c')

# Update the error documentation block.
tmp_file = '__tmp'
tfile = open(tmp_file, 'w')
skip = 0
for line in open('../src/docs/error.dox', 'r'):
	if not skip:
		tfile.write(line)
	if line.count('IGNORE_BUILT_BY_API_ERR_END'):
		tfile.write(line)
		skip = 0
	elif line.count('IGNORE_BUILT_BY_API_ERR_BEGIN'):
		tfile.write('@endif\n\n')
		skip = 1

		for err in api_data.errors:
			if 'undoc' in err.flags:
				continue
			tfile.write(
			    '@par <code>' + err.name.upper() + '</code>\n' +
			    " ".join(err.long_desc.split()) + '\n\n')
tfile.close()
compare_srcfile(tmp_file, '../src/docs/error.dox')