c2r 1.0.0__cp311-cp311-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
c2r/__init__.py ADDED
@@ -0,0 +1 @@
1
+ from .cli import main
c2r/cli.py ADDED
@@ -0,0 +1,115 @@
1
+ import click
2
+ import os
3
+ import sys
4
+ import shutil
5
+ import subprocess
6
+ from pathlib import Path
7
+
8
+ # Try to import the Rust extension
9
+ try:
10
+ import c2r_core as c2r
11
+ except ImportError:
12
+ # If not installed via maturin/pip, try local build for dev
13
+ sys.path.append(os.getcwd())
14
+ try:
15
+ import c2r_core as c2r
16
+ except ImportError:
17
+ print("Error: c2r_core Rust extension not found.")
18
+ print("Please run `maturin develop` or `cargo build`.")
19
+ if os.path.exists("c2r_core.so"):
20
+ import c2r_core as c2r
21
+ else:
22
+ print("Critical: Rust backend missing.")
23
+
24
+ @click.group()
25
+ def main():
26
+ """Ferrum: Industrial C++ to Rust Transpiler"""
27
+ pass
28
+
29
+ @main.command()
30
+ @click.argument('input_path', type=click.Path(exists=True))
31
+ @click.option('-o', '--output', 'output_path', type=click.Path(), required=True, help="Output directory for the Rust project")
32
+ def migrate(input_path, output_path):
33
+ """Migrate a C++ project or file to a Rust Cargo project."""
34
+
35
+ input_path = Path(input_path)
36
+ output_path = Path(output_path)
37
+
38
+ click.echo(f"šŸš€ Starting Migration: {input_path} -> {output_path}")
39
+
40
+ try:
41
+ c2r.init_logging()
42
+ except:
43
+ pass
44
+
45
+ reconstructor = c2r.Reconstructor()
46
+
47
+ if not output_path.exists():
48
+ output_path.mkdir(parents=True)
49
+ click.echo(f"Created output directory: {output_path}")
50
+
51
+ src_dir = output_path / "src"
52
+ src_dir.mkdir(exist_ok=True)
53
+
54
+ models_dir = src_dir / "models"
55
+ models_dir.mkdir(exist_ok=True)
56
+
57
+ utils_dir = src_dir / "utils"
58
+ utils_dir.mkdir(exist_ok=True)
59
+
60
+ tests_dir = output_path / "tests"
61
+ tests_dir.mkdir(exist_ok=True)
62
+
63
+ # Updated Cargo.toml template with production crates
64
+ cargo_toml = f"""[package]
65
+ name = "{output_path.name}"
66
+ version = "0.1.0"
67
+ edition = "2021"
68
+
69
+ [dependencies]
70
+ parking_lot = "0.12"
71
+ serde = {{ version = "1.0", features = ["derive"] }}
72
+ serde_json = "1.0"
73
+ thiserror = "1.0"
74
+ tokio = {{ version = "1", features = ["full"] }}
75
+ anyhow = "1.0"
76
+ lazy_static = "1.4"
77
+ """
78
+ with open(output_path / "Cargo.toml", "w") as f:
79
+ f.write(cargo_toml)
80
+ click.echo("Generated Cargo.toml")
81
+
82
+ files_to_process = []
83
+ if input_path.is_file():
84
+ files_to_process.append(input_path)
85
+ else:
86
+ files_to_process.extend(input_path.glob("**/*.cpp"))
87
+ files_to_process.extend(input_path.glob("**/*.h"))
88
+
89
+ main_rs_content = "// Ferrum Generated Main Entry\n\nfn main() {\n println!(\"Hello from Ferrum migrated code!\");\n}\n"
90
+
91
+ for cpp_file in files_to_process:
92
+ click.echo(f"Processing {cpp_file.name}...")
93
+ with open(cpp_file, "r") as f:
94
+ code = f.read()
95
+
96
+ rust_code = reconstructor.translate(code)
97
+
98
+ # Heuristic: if file is named main.cpp, it's main.rs
99
+ if "main" in cpp_file.name.lower():
100
+ main_rs_content = rust_code
101
+ else:
102
+ model_name = cpp_file.stem.lower() + ".rs"
103
+ with open(models_dir / model_name, "w") as f:
104
+ f.write(rust_code)
105
+ click.echo(f" -> Generated models/{model_name}")
106
+
107
+ with open(src_dir / "main.rs", "w") as f:
108
+ f.write(main_rs_content)
109
+ click.echo("Generated src/main.rs")
110
+
111
+ click.echo("\nāœ… Migration Complete. Your Rust project is ready.")
112
+ click.echo(f"Run: cd {output_path} && cargo build")
113
+
114
+ if __name__ == '__main__':
115
+ main()
@@ -0,0 +1,94 @@
1
+ Metadata-Version: 2.4
2
+ Name: c2r
3
+ Version: 1.0.0
4
+ Classifier: Programming Language :: Rust
5
+ Classifier: Programming Language :: Python :: Implementation :: CPython
6
+ Classifier: Programming Language :: Python :: Implementation :: PyPy
7
+ Classifier: Programming Language :: Python :: 3
8
+ Classifier: License :: OSI Approved :: MIT License
9
+ Classifier: Operating System :: POSIX :: Linux
10
+ Classifier: Operating System :: MacOS :: MacOS X
11
+ Classifier: Operating System :: Microsoft :: Windows
12
+ Requires-Dist: click
13
+ Summary: Deterministic C++ to Rust Transpiler with Industrial-Grade Static Analysis
14
+ Author-email: Ferrum Team <dev@ferrum.io>
15
+ License: MIT
16
+ Requires-Python: >=3.8
17
+ Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM
18
+
19
+ # c2r: The Industrial C++ to Rust Transpiler
20
+
21
+ **c2r** (formerly Ferrum) is a deterministic, static-analysis driven tool designed to migrate legacy C++ codebases to idiomatic, safe Rust. Unlike LLM-based solutions that hallucinate, c2r uses rigorous mathematical models to prove ownership and lifetimes.
22
+
23
+ ## šŸš€ Features
24
+
25
+ * **Deterministic Translation**: No AI guessing. Uses Steensgaard's and Andersen's analysis for aliasing.
26
+ * **Ownership Reconstruction**: Infers `Box<T>`, `Arc<T>`, `Rc<T>` based on usage patterns.
27
+ * **Thread Safety Analysis**: Automatically detects data races and injects `Arc<Mutex<T>>`.
28
+ * **Cycle Detection**: Identifies reference cycles (SCCs) and suggests `Weak<T>` or `RefCell<T>`.
29
+ * **Smart Pointers**: Maps `std::unique_ptr` and `std::shared_ptr` to Rust equivalents.
30
+ * **Safety Audit**: Reports a "Safety Score" indicating the ratio of safe/unsafe code generated.
31
+
32
+ ## šŸ“¦ Installation
33
+
34
+ c2r is available as a Python package with a high-performance Rust backend.
35
+
36
+ ```bash
37
+ pip install c2r
38
+ ```
39
+
40
+ ## šŸ›  Usage
41
+
42
+ c2r provides a CLI to migrate projects.
43
+
44
+ ### Migrate a Project
45
+
46
+ ```bash
47
+ c2r migrate ./legacy_cpp_project -o ./new_rust_project
48
+ ```
49
+
50
+ This command will:
51
+ 1. Analyze all `.cpp` and `.h` files in the input directory.
52
+ 2. Generate a valid Cargo project structure (`src/models`, `src/utils`).
53
+ 3. Create a `Cargo.toml` with necessary production dependencies (`tokio`, `serde`, `parking_lot`).
54
+ 4. Transpile the code, resolving include dependencies and type definitions.
55
+
56
+ ## šŸš€ Publishing to PyPI
57
+
58
+ To publish a new version of `c2r`, ensure you have `maturin` installed.
59
+
60
+ 1. **Build Release Artifacts**:
61
+ ```bash
62
+ maturin build --release
63
+ ```
64
+
65
+ 2. **Publish to PyPI**:
66
+ ```bash
67
+ maturin publish
68
+ ```
69
+
70
+ ## šŸ— Architecture
71
+
72
+ c2r operates on a multi-pass architecture:
73
+
74
+ 1. **Ingestion (Industrial Frontend)**: Simulates Clang AST parsing to generate a Property-Oriented Intermediate Representation (PIIR).
75
+ 2. **Points-To Analysis**:
76
+ * **Steensgaard ($O(N \alpha(N))$)**: Fast partitioning of memory regions.
77
+ * **Andersen ($O(N^3)$)**: Precise subset-based constraint solving for aliasing.
78
+ 3. **Region Inference (Tofte-Talpin)**: Infers lifetimes (`'a`) and scopes.
79
+ 4. **Cycle Detection**: Detects Strongly Connected Components using Tarjan's algorithm concepts.
80
+ 5. **Thread Safety Pass**: Simulates execution flow to detect concurrent mutations.
81
+ 6. **Code Generation**: Uses `syn` and `quote` to construct a valid Rust AST.
82
+
83
+ ## šŸ“Š Benchmarks
84
+
85
+ c2r includes a built-in benchmarking harness to verify the scalability of its analysis algorithms.
86
+
87
+ * **100 Pointers**: ~0.2ms
88
+ * **1,000 Pointers**: ~2.2ms
89
+ * **5,000 Pointers**: ~11.4ms
90
+
91
+ ## šŸ“„ License
92
+
93
+ MIT License.
94
+
@@ -0,0 +1,8 @@
1
+ c2r\__init__.py,sha256=ucQESw8DmMUlgbIvhowpcUSqVmdq9NvqLm_U5RE1nuA,22
2
+ c2r\cli.py,sha256=Dc9JKOA9fR1GhzoSnViYHav8jRNC_nWqpjK0Cmux8Bo,3390
3
+ c2r-1.0.0.dist-info\METADATA,sha256=rmNPR6mlaCHuuYyl9veN-Z4bGI_b2kkt0xlHAxKvLC8,3476
4
+ c2r-1.0.0.dist-info\WHEEL,sha256=X79LywvMB9iCuFHu88xBAFTJDhRqJi6Yh9hhoCI9jao,97
5
+ c2r-1.0.0.dist-info\entry_points.txt,sha256=bUGIN_7y_IZymC9EXuRhEzwdCkdDz9VEYpatKro6kTU,35
6
+ c2r_core\__init__.py,sha256=2sQzOqoWTXAyeQMssALXGlR2daKyZoxUBFRzUTfZ8lU,115
7
+ c2r_core\c2r_core.cp311-win_amd64.pyd,sha256=rSRg9eP_xi4Zra6rdfD4UVT9nS2hWGflXUpo05PjVpw,2232832
8
+ c2r-1.0.0.dist-info\RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: maturin (1.11.5)
3
+ Root-Is-Purelib: false
4
+ Tag: cp311-cp311-win_amd64
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ c2r=c2r.cli:main
c2r_core/__init__.py ADDED
@@ -0,0 +1,5 @@
1
+ from .c2r_core import *
2
+
3
+ __doc__ = c2r_core.__doc__
4
+ if hasattr(c2r_core, "__all__"):
5
+ __all__ = c2r_core.__all__
Binary file