import os import re def add_doxygen_stubs(directory): for root, _, files in os.walk(directory): for file in files: if file.endswith(('.h', '.cpp')): filepath = os.path.join(root, file) process_file(filepath) def process_file(filepath): with open(filepath, 'r') as f: content = f.read() lines = content.split('\n') new_lines = [] in_block_comment = False func_regex = re.compile(r'^([\w\s\*]+)\s+(\w+)\s*\((.*?)\)\s*(?:{|;)') struct_regex = re.compile(r'^(?:typedef\s+)?(?:struct|enum|union)\s+(\w+)?\s*(?:{|;)') i = 0 while i < len(lines): line = lines[i] if '/*' in line: in_block_comment = True if '*/' in line: in_block_comment = False stripped = line.strip() prev_is_doc = i > 0 and (lines[i-1].strip().startswith('*/') or lines[i-1].strip().startswith('///')) if not in_block_comment and not prev_is_doc and not stripped.startswith('//') and not stripped.startswith('#') and stripped: m_func = func_regex.match(line) if m_func and 'typedef' not in line and 'return' not in line and 'else' not in line: ret_type, func_name, args = m_func.groups() if func_name not in ('if', 'while', 'for', 'switch', 'return', 'sizeof'): new_lines.append('/**') new_lines.append(f' * @brief {func_name}') if args and args.strip() != 'void': arg_parts = args.split(',') for arg in arg_parts: arg_name = arg.strip().split()[-1].replace('*', '').replace('&', '') if arg_name and arg_name != '...': new_lines.append(f' * @param {arg_name} Description for {arg_name}') if ret_type.strip() != 'void' and 'void' not in ret_type: new_lines.append(' * @return Description of return value') new_lines.append(' */') else: m_struct = struct_regex.match(line) if m_struct: name = m_struct.group(1) or "anonymous" new_lines.append('/**') new_lines.append(f' * @brief {name}') new_lines.append(' */') new_lines.append(line) i += 1 with open(filepath, 'w') as f: f.write('\n'.join(new_lines)) if __name__ == '__main__': add_doxygen_stubs('/home/fabiorafaelcoutada/portugalfuturista/universalisos/kernel/src')