206 lines
8.6 KiB
Python
206 lines
8.6 KiB
Python
#!/usr/bin/python
|
|
#----------------------------------------------------------------------------#
|
|
# #
|
|
# ozz-animation is hosted at http://github.com/guillaumeblanc/ozz-animation #
|
|
# and distributed under the MIT License (MIT). #
|
|
# #
|
|
# Copyright (c) Guillaume Blanc #
|
|
# #
|
|
# Permission is hereby granted, free of charge, to any person obtaining a #
|
|
# copy of this software and associated documentation files (the "Software"), #
|
|
# to deal in the Software without restriction, including without limitation #
|
|
# the rights to use, copy, modify, merge, publish, distribute, sublicense, #
|
|
# and/or sell copies of the Software, and to permit persons to whom the #
|
|
# Software is furnished to do so, subject to the following conditions: #
|
|
# #
|
|
# The above copyright notice and this permission notice shall be included in #
|
|
# all copies or substantial portions of the Software. #
|
|
# #
|
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR #
|
|
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, #
|
|
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL #
|
|
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER #
|
|
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING #
|
|
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER #
|
|
# DEALINGS IN THE SOFTWARE. #
|
|
# #
|
|
#----------------------------------------------------------------------------#
|
|
|
|
import os, glob
|
|
import sys
|
|
import itertools
|
|
import string
|
|
import re
|
|
import time
|
|
|
|
def recurse_files(_folder, _filter):
|
|
# Iterate files.
|
|
for i in glob.iglob(os.path.join(_folder, _filter)):
|
|
yield i
|
|
# Iterate folders...
|
|
for i in glob.iglob(os.path.join(_folder, '*/')):
|
|
#... and recurse them.
|
|
for j in recurse_files(i, _filter):
|
|
if j.find('\\extern\\') == -1 and j.find('/extern/') == -1 and j.find('\\build\\') == -1 and j.find('/build/') == -1 and j.find('\\src_fused\\') == -1 and j.find('/src_fused/') == -1:
|
|
yield j
|
|
|
|
license_text = "\
|
|
//----------------------------------------------------------------------------//\n\
|
|
// //\n\
|
|
// ozz-animation is hosted at http://github.com/guillaumeblanc/ozz-animation //\n\
|
|
// and distributed under the MIT License (MIT). //\n\
|
|
// //\n\
|
|
// Copyright (c) Guillaume Blanc //\n\
|
|
// //\n\
|
|
// Permission is hereby granted, free of charge, to any person obtaining a //\n\
|
|
// copy of this software and associated documentation files (the \"Software\"), //\n\
|
|
// to deal in the Software without restriction, including without limitation //\n\
|
|
// the rights to use, copy, modify, merge, publish, distribute, sublicense, //\n\
|
|
// and/or sell copies of the Software, and to permit persons to whom the //\n\
|
|
// Software is furnished to do so, subject to the following conditions: //\n\
|
|
// //\n\
|
|
// The above copyright notice and this permission notice shall be included in //\n\
|
|
// all copies or substantial portions of the Software. //\n\
|
|
// //\n\
|
|
// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR //\n\
|
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, //\n\
|
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL //\n\
|
|
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER //\n\
|
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING //\n\
|
|
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER //\n\
|
|
// DEALINGS IN THE SOFTWARE. //\n\
|
|
// //\n\
|
|
//----------------------------------------------------------------------------//\n\
|
|
\n\
|
|
#"
|
|
|
|
def process_file(_file, _is_h):
|
|
# Read
|
|
fr = open(_file, 'rt')
|
|
if fr == None:
|
|
print "Failed to read file " + _file
|
|
return False
|
|
|
|
text = fr.read();
|
|
fr.close()
|
|
|
|
# Prepares output
|
|
output = ""
|
|
modified = False;
|
|
|
|
# Test for a valid license
|
|
find_license = string.find(text, license_text)
|
|
if find_license == -1:
|
|
# Replaces license up to the first '#'
|
|
first_define = string.find(text, '#')
|
|
if first_define != -1:
|
|
output = license_text + text[first_define + 1:]
|
|
else:
|
|
output = license_text + text
|
|
modified = True
|
|
else:
|
|
output = text
|
|
|
|
# '#' must be found as it is part of the license
|
|
first_define = string.find(output, '#')
|
|
|
|
if _is_h:
|
|
# Test for a valid #define GUARD
|
|
|
|
# Removes pragma once
|
|
pragma_once = '#pragma once'
|
|
pragma_found = string.find(output[first_define:], pragma_once)
|
|
if pragma_found == 0:
|
|
output = output[:first_define] + output[first_define + len(pragma_once):]
|
|
modified = True
|
|
|
|
# Prepares #define GUARD
|
|
guard = string.upper(_file)
|
|
to_replace = ['/', '\\', '.', '-']
|
|
for i in to_replace:
|
|
guard = string.replace(guard, i, '_')
|
|
to_remove = ['INCLUDE_', 'SRC_']
|
|
for i in to_remove:
|
|
guard = string.replace(guard, i, '')
|
|
guard = 'OZZ_' + guard + '_'
|
|
guard = re.sub('_+', '_', guard)
|
|
|
|
header = '#ifndef ' + guard + '\n' + '#define ' + guard + '\n'
|
|
footer = '#endif // ' + guard + '\n'
|
|
|
|
# Test for a valid header/footer
|
|
found_match = re.search('^#ifndef (?P<found_guard>.+)\n^#define (?P=found_guard)\n(.*\n)*^#endif // (?P=found_guard)',
|
|
output[first_define:],
|
|
re.MULTILINE);
|
|
if found_match == None:
|
|
output = output[:first_define] + header + output[first_define:]
|
|
if not output.endswith('\n'):
|
|
output += '\n'
|
|
output += footer;
|
|
modified = True
|
|
elif found_match.group('found_guard') != guard:
|
|
output = string.replace(output, found_match.group('found_guard'), guard)
|
|
modified = True
|
|
|
|
# Needs at least 1 \n
|
|
if not output.endswith('\n'):
|
|
output += '\n'
|
|
|
|
# remove \n after guard begin
|
|
guard_pos = output.find(header) + len(header) - 1
|
|
if not output.startswith('\n\n', guard_pos):
|
|
output = output[:guard_pos] + '\n' + output[guard_pos:]
|
|
modified = True
|
|
while output.startswith('\n\n\n', guard_pos):
|
|
output = output[:guard_pos] + output[guard_pos+1:]
|
|
modified = True
|
|
|
|
# remove \n before guard end
|
|
guard_pos = output.find(footer)
|
|
while output.endswith('\n\n', 0, guard_pos):
|
|
output = output[:guard_pos-1] + output[guard_pos:]
|
|
guard_pos = output.find(footer)
|
|
modified = True
|
|
|
|
# must end with a single \n
|
|
if not output.endswith('\n'):
|
|
output += '\n'
|
|
modified = True
|
|
else:
|
|
while output.endswith('\n\n'):
|
|
output = output[:len(output) - 1]
|
|
modified = True
|
|
|
|
# Write
|
|
if modified:
|
|
fw = open(_file, 'wt')
|
|
if fw == None:
|
|
print "Failed to write file " + _file
|
|
modified = False
|
|
fw.write(output)
|
|
fw.close()
|
|
print _file + ' modified'
|
|
|
|
return modified
|
|
|
|
def process_h(_file):
|
|
return process_file(_file, True)
|
|
|
|
def process_cc(_file):
|
|
return process_file(_file, False)
|
|
|
|
def main():
|
|
# Process .h
|
|
for i in recurse_files('../../', '*.h'):
|
|
process_h(i)
|
|
# Process .cc
|
|
for i in recurse_files('../../', '*.cc'):
|
|
process_cc(i)
|
|
#
|
|
print 'Terminated'
|
|
|
|
while 1:
|
|
time.sleep(10)
|
|
|
|
main()
|