#-------------------------------------------------------------------------------
# Name: detab.py
# Purpose: replace the tab character by several whitespace characters
# in C/C++ source/head files.
# Author: mayadong7349
# Created: 04/21/2012
# Copyright: (c) mayadong7349 2012
# Licence: GPL
#-------------------------------------------------------------------------------
#! /usr/bin/env python3
# -*- coding: utf-8 -*-
# Filename: detab.py
from os import rename
from os import strerror
from sys import stdin
from sys import stderr
from sys import argv
getln = stdin.readline
errmsg = stderr.write
def main():
print(r"""This program exchanges '\t' with several whitespace characters in your code files.
Usage: detab.py <file list>""")
if len(argv) < 2:
errmsg('No actions specified.')
else:
print('''How many whitespace characters you want(4 or 8 is especially recommanded) ?
Caution: If an invalid number is given, 4 will be taken by default.
''')
try:
num = int(getln())
except ValueError:
num = 4
for oldfile in argv[1:]:
newfile = oldfile
# errno = 0
try:
# rename the old file by adding a '.old' extension.
rename(oldfile, oldfile + '.old')
except OSError as err_type: # in Win32, you can also use WindowsError instead.
errmsg(str(err_type) + oldfile + '\n')
continue
oldfile += '.old'
# open file for reading
try:
fin = open(oldfile)
except IOError as err_type:
errmsg(str(err_type) + oldfile + '\n')
continue
# open file for writing
try:
fout = open(newfile, 'w')
except IOError as err_type:
errmsg(str(err_type) + newfile + '\n')
continue
# exchange '\t' with several whitespace characters in old file, and write into a new file
lines = (eachline.expandtabs(num) for eachline in fin)
for eachLine in fin:
fout.write(eachLine.expandtabs(num))
# close all files opened
fout.close()
fin.close()
print('Success: %s --> %s' % (oldfile, newfile))
if __name__ == '__main__':
main()