From 07bda15c26aed3a5aacd6c9b80933509d8adcc91 Mon Sep 17 00:00:00 2001 From: Intel A80486DX2-66 Date: Sat, 20 Jul 2024 18:52:00 +0300 Subject: [PATCH] add C_code_chars_count.py --- python-programming/C_code_chars_count.py | 49 ++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 python-programming/C_code_chars_count.py diff --git a/python-programming/C_code_chars_count.py b/python-programming/C_code_chars_count.py new file mode 100644 index 0000000..4a0b52c --- /dev/null +++ b/python-programming/C_code_chars_count.py @@ -0,0 +1,49 @@ +#!/usr/bin/python3 + +# C_code_chars_count.py +# +# Author: Intel A80486DX2-66 +# License: Creative Commons Zero 1.0 Universal or Unlicense +# SPDX-License-Identifier: CC0-1.0 OR Unlicense + +from os.path import basename +from sys import argv +import re + +comment_stripping_regex = \ + re.compile(r"(?:\/\*(?:[^*]|[\n]|(?:\*+(?:[^*\/]|\n])))*\*+\/)|(?:\/\/.*)", + re.MULTILINE | re.DOTALL) + + +def count_code_size(lines, **strip): + if not strip: + strip["comments"] = True + strip["empty_lines"] = True + + old_size = sum(len(line) for line in lines) + + if strip["empty_lines"]: + lines = [line for line in lines if line.strip()] + if strip["comments"]: + lines = re.sub(comment_stripping_regex, "", "\n".join(lines)) \ + .replace("\n", "") + + new_size = sum(len(line) for line in lines) + return [new_size, old_size] + + +if __name__ == "__main__": + if len(argv) < 2: + print(f"Usage: {basename(argv[0])} ") + exit(1) + + with open(argv[1], "r", encoding="utf-8-sig") as file: + code_chars, all_chars = count_code_size(file.read().splitlines()) + + percent_of_code = (code_chars * 100) / all_chars + display_percent_of_code = "(%.2f%%)" % percent_of_code + print("Code characters:", code_chars, display_percent_of_code) + + percent_of_coms = ((all_chars - code_chars) * 100) / all_chars + display_percent_of_coms = "(%.2f%% of comments)" % percent_of_coms + print("All characters:", all_chars, display_percent_of_coms)