From 5a38286415fdd7d3d236177c25c9b3976aad2d61 Mon Sep 17 00:00:00 2001 From: lifegpc Date: Sun, 17 Oct 2021 10:48:39 +0800 Subject: [PATCH] add format_pc --- format_pc.py | 100 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 format_pc.py diff --git a/format_pc.py b/format_pc.py new file mode 100644 index 0000000..6e47367 --- /dev/null +++ b/format_pc.py @@ -0,0 +1,100 @@ +# format_pc.py +# v1.0.0 +# (C) 2020 lifegpc +# The repo location: https://github.com/lifegpc/pythonscript +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +from platform import system +from os.path import exists, abspath +from os import remove, rename +import sys +from re import compile, IGNORECASE +from typing import Dict + + +REG = compile(r'\${([a-z_]+)}', IGNORECASE) +REG2 = compile(r'/([a-z])/', IGNORECASE) +REG3 = compile(r'^(Name|Description|Version|Requires|Requires.private|Conflicts|Cflags):', IGNORECASE) # noqa: E501 +REG4 = compile(r'^Libs(\.private)?:', IGNORECASE) + + +def replace_v(inp: str, vd: Dict[str, str]) -> str: + re = REG.search(inp) + while re is not None: + k = re.groups()[0] + v = vd[k] if k in vd else '' + inp = inp.replace(re.group(), v) + re = REG.search(inp) + return inp + + +def format_path(inp: str) -> str: + if system() == "Windows": + re = REG2.search(inp) + if re is None: + return abspath(inp).replace("\\", "/") + else: + return abspath(inp.replace(re.group(), re.groups()[0].upper() + ":/")).replace("\\", "/") # noqa: E501 + return inp + + +def format_lib(inp: str) -> str: + li = inp.split(" ") + o = '' + for i in li: + s = i.strip() + if s.endswith(".lib"): + o += f' -l{s[:-4]}' + elif s.startswith("-libpath:"): + p = format_path(s[9:]) + o += f' -L{p}' + else: + o += f' {s}' + return o + + +def parse_pc(fn: str): + if not exists(fn): + return + with open(fn, 'r', encoding='UTF-8') as f: + t = f.read() + li = t.splitlines(False) + vd = {} + if exists(fn + '.tmp'): + remove(fn + '.tmp') + with open(fn + '.tmp', 'w', encoding='UTF-8') as f: + for i in li: + s = i.strip() + if s.startswith("#") or len(s) == 0: + f.write(i + '\n') + elif REG3.search(s) is not None: + f.write(i + '\n') + elif REG4.search(s) is not None: + ll = s.split(':', 1) + v = replace_v(ll[1], vd) + v = format_lib(v) + f.write(f"{ll[0]}:{v}\n") + elif s.find('=') > -1: + ll = s.split('=', 1) + v = replace_v(ll[1], vd) + v = format_path(v) + vd[ll[0]] = v + f.write(f"{ll[0]}={v}\n") + remove(fn) + rename(fn + '.tmp', fn) + print(f'formated {fn}') + + +for i in sys.argv[1:]: + parse_pc(i)