forked from cachelot/cachelot
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathnew_header
executable file
·99 lines (78 loc) · 2.71 KB
/
new_header
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
#!/usr/bin/env python
import sys
import os.path
DEFAULT_HEADER_EXT = '.h'
# used for header include guard #ifndef PREFIX_THE_HEADER_POSTFIX [...]
HEADER_GUARD_PREFIX = 'CACHELOT_'
HEADER_GUARD_POSTFIX = '_H_INCLUDED'
NAMESPACE_NAME = 'cachelot'
# HEADER FILE TEMPLATE ##################################################
def HEADER_FILE_TEMPLATE(guard):
if (NAMESPACE_NAME != ''):
namespace_decl = """\
namespace {namespace} {{
// Just write code
}} // namespace {namespace}""".format(namespace = NAMESPACE_NAME)
else:
namespace_decl = """ // Write whatever you want here"""
return """\
#ifndef {guard}
#define {guard}
//
// (C) Copyright 2015 Iurii Krasnoshchok
//
// Distributed under the terms of Simplified BSD License
// see LICENSE file
/// @ingroup <?doxygroup?>
/// @{{
{optional_namespace_declaration}
/// @}}
#endif // {guard}
""".format(guard = guard, optional_namespace_declaration = namespace_decl)
#########################################################################
def validate_filename(filename):
import string
valid_chars = frozenset('-_.{ascii}{digits}'.format(ascii = string.ascii_letters, digits = string.digits))
for char in filename:
if (not char in valid_chars): raise ValueError('Invalid character "%c" in filename' % (char,))
def case2underscore(src):
from re import findall
fres = findall('([a-z])([A-Z][a-z])', src)
result = src
for r in fres:
s = r[0] + r[1]
result = result.replace(r[0] + r[1], r[0]+'_'+r[1].lower())
return result.rstrip('\n')
def guard_from_filename(header_fname):
guard = header_fname.strip('_ ')
guard = case2underscore(guard)
return HEADER_GUARD_PREFIX + guard.upper() + HEADER_GUARD_POSTFIX
def generate_cxx_header(fullname):
directory = os.path.dirname(fullname)
filename = os.path.basename(fullname)
validate_filename(filename)
filename, ext = os.path.splitext(filename)
if not ext:
ext = DEFAULT_HEADER_EXT
guard = guard_from_filename(filename)
filename += ext
return (os.path.join(directory, filename), HEADER_FILE_TEMPLATE(guard))
def usage():
my_name = os.path.basename(sys.argv[0])
print('usage: ' + my_name + ' HeaderName ')
sys.exit(1)
def main():
if len(sys.argv) != 2:
usage()
filename, filedata = generate_cxx_header(sys.argv[1])
try:
if (os.path.exists(filename)):
sys.stderr.write('Error: file "%s" already exists' % (filename))
sys.exit(1)
f = open(filename, 'w')
f.write(filedata)
f.close()
except IOError as e:
sys.stderr.write( 'Error: failed to open file "%s" for write (%s)\n' % (filename, str(e)) )
if __name__ == "__main__":
main()