mirror of https://github.com/abinit/abinit.git
146 lines
4.9 KiB
Python
Executable File
146 lines
4.9 KiB
Python
Executable File
#!/usr/bin/env python
|
|
# coding: utf-8
|
|
"""
|
|
This script replaces strings in the source files. See replace_string function.
|
|
"""
|
|
import sys
|
|
import os
|
|
|
|
TOPDIR = os.path.dirname(os.path.realpath(__file__))
|
|
|
|
|
|
def source_paths_from_abinit_src(top=None):
|
|
"""
|
|
Return list with absolute paths of source files extracted from abinit.src
|
|
"""
|
|
import imp
|
|
source_paths = []
|
|
black_list = ["m_build_info.F90", "m_optim_dumper.F90", os.path.basename(__file__)]
|
|
if top is None: top = TOPDIR
|
|
for root, dirs, files in os.walk(top):
|
|
files = [f for f in files if f == "abinit.src"]
|
|
if not files: continue
|
|
assert len(files) == 1
|
|
abinit_src = os.path.join(root, "abinit.src")
|
|
mod = imp.load_source(abinit_src, abinit_src)
|
|
if hasattr(mod, "sources"):
|
|
source_paths.extend((os.path.join(root, s) for s in mod.sources if s not in black_list))
|
|
|
|
return source_paths
|
|
|
|
|
|
def all_source_files(top=None, types=("fortran", "c", "h")):
|
|
"""
|
|
Return list with the absolute paths of all the files in the project, exclude binary files
|
|
or files that should not be modified.
|
|
"""
|
|
if top is None: top = TOPDIR
|
|
ext_list = []
|
|
if "fortran" in types: ext_list += [".F90", ".f90", "finc"]
|
|
if "c" in types: ext_list += [".c"]
|
|
if "h" in types: ext_list += [ ".h"]
|
|
def select_basename(f):
|
|
if any(f.endswith(b) for b in ext_list): return True
|
|
if f == os.path.basename(__file__): return False
|
|
return False
|
|
|
|
all_files = []
|
|
for root, dirs, files in os.walk(top):
|
|
all_files.extend(os.path.join(root, f) for f in files if select_basename(f))
|
|
return all_files
|
|
|
|
|
|
def replace_string(s):
|
|
"""
|
|
Main entry point for users.
|
|
Change old2new dict to replace old_expression with new one
|
|
using replace method of python string.
|
|
"""
|
|
old2new = {
|
|
# Malloc/free macros
|
|
#"ABI_ALLOCATE(": "ABI_MALLOC(",
|
|
#"ABI_DEALLOCATE(": "ABI_FREE(",
|
|
#"ABI_DATATYPE_ALLOCATE(": "ABI_MALLOC(",
|
|
#"ABI_DATATYPE_DEALLOCATE(": "ABI_FREE(",
|
|
#"ABI_STAT_ALLOCATE(": "ABI_STAT_MALLOC(",
|
|
#"ABI_DATATYPE_ALLOCATE_SCALAR(": "ABI_MALLOC_TYPE_SCALAR(",
|
|
#"ABI_DATATYPE_DEALLOCATE_SCALAR(": "ABI_FREE(",
|
|
# Logging macros
|
|
#"MSG_COMMENT(": "ABI_COMMENT(",
|
|
#"MSG_WARNING(": "ABI_WARNING(",
|
|
#"MSG_COMMENT_UNIT(": "ABI_COMMENT_UNIT(",
|
|
#"MSG_WARNING_UNIT(": "ABI_WARNING_UNIT(",
|
|
#"MSG_ERROR(": "ABI_ERROR(",
|
|
#"MSG_ERROR_CLASS(": "ABI_ERROR_CLASS(",
|
|
#"MSG_BUG(": "ABI_BUG(",
|
|
#"MSG_STOP(": "ABI_STOP(",
|
|
#"MSG_ERROR_NODUMP(": "ABI_ERROR_NODUMP(",
|
|
#"MSG_ERROR_NOSTOP(": "ABI_ERROR_NOSTOP(",
|
|
#"MSG_WARNING_IF(": "ABI_WARNING_IF(",
|
|
"use iso_c_binding": "use, intrinsic :: iso_c_binding",
|
|
"USE ISO_C_BINDING": "use, intrinsic :: iso_c_binding",
|
|
"USE iso_c_binding": "use, intrinsic :: iso_c_binding",
|
|
"use ISO_C_BINDING": "use, intrinsic :: iso_c_binding",
|
|
}
|
|
|
|
#old2new = {
|
|
# "LIBPAW_COMMENT(": "ABI_COMMENT(",
|
|
# "LIBPAW_WARNING(": "ABI_WARNING(",
|
|
# "LIBPAW_COMMENT_UNIT(": "ABI_COMMENT_UNIT(",
|
|
# "LIBPAW_WARNING_UNIT(": "ABI_WARNING_UNIT(",
|
|
# "LIBPAW_ERROR(": "ABI_ERROR(",
|
|
# "LIBPAW_ERROR_CLASS(": "ABI_ERROR_CLASS(",
|
|
# "LIBPAW_BUG(": "ABI_BUG(",
|
|
# "LIBPAW_STOP(": "ABI_STOP(",
|
|
# "LIBPAW_ERROR_NODUMP(": "ABI_ERROR_NODUMP(",
|
|
# "LIBPAW_ERROR_NOSTOP(": "ABI_ERROR_NOSTOP(",
|
|
# "LIBPAW_WARNING_IF(": "ABI_WARNING_IF(",
|
|
#}
|
|
## invert mapping
|
|
#old2new = {v:k for k, v in old2new.items()}
|
|
|
|
# This is just to print the table in github md format.
|
|
#from tabulate import tabulate
|
|
#print(str(tabulate(old2new.items(), headers=["OLD", "NEW"], tablefmt="github")))
|
|
#raise RuntimeError("Just to print table.")
|
|
|
|
for old, new in old2new.items():
|
|
s = s.replace(old, new)
|
|
|
|
return s
|
|
|
|
|
|
def main():
|
|
|
|
if "-h" in sys.argv or "--help" in sys.argv:
|
|
print(" Usage: change_source.py [DIR]")
|
|
print(" to replace strings in all source files inside DIR")
|
|
print(" If DIR not provided, uses current directory.")
|
|
return 0
|
|
|
|
#for path in all_files():
|
|
#for path in source_paths_from_abinit_src():
|
|
#for path in all_source_files(types=("fortran", "c", "h")):
|
|
top_list = []
|
|
if len(sys.argv) > 1:
|
|
top_list.append(sys.argv[1])
|
|
print("Replacing strings in files inside directory:", sys.argv[1])
|
|
else:
|
|
top_list = ["src", "shared"]
|
|
|
|
for top in top_list:
|
|
for path in all_source_files(top=top, types=("fortran", "h", "c")):
|
|
print("Replacing strings in:", path)
|
|
with open(path, "rt") as fh:
|
|
old_s = fh.read()
|
|
s = replace_string(old_s)
|
|
if s != old_s:
|
|
with open(path, "wt") as fh:
|
|
fh.write(s)
|
|
|
|
return 0
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|