Start C++ rewrite.
This commit is contained in:
115
docs/CONSTANTS_REFACTORING.md
Normal file
115
docs/CONSTANTS_REFACTORING.md
Normal file
@@ -0,0 +1,115 @@
|
||||
# Constants Refactoring Documentation
|
||||
|
||||
## Overview
|
||||
This document describes the refactoring of #defines and common constants into a single centralized header file for Kyle's Editor (ke).
|
||||
|
||||
## Changes Made
|
||||
|
||||
### 1. Created `ke_constants.h`
|
||||
A new header file was created to centralize all common constants and preprocessor definitions used throughout the project.
|
||||
|
||||
**Location**: `/Users/kyle/src/ke2/ke_constants.h`
|
||||
|
||||
**Contents**:
|
||||
- **Version Information**: `KE_VERSION` - Editor version string
|
||||
- **Terminal Sequences**: `ESCSEQ` - ANSI escape sequence prefix
|
||||
- **Keyboard Macros**: `CTRL_KEY(key)` - Control key combination macro
|
||||
- **Display Constants**:
|
||||
- `TAB_STOP` (8) - Tab stop width
|
||||
- `MSG_TIMEO` (3) - Message timeout in seconds
|
||||
- **Memory Management**: `INITIAL_CAPACITY` (64) - Initial buffer capacity
|
||||
- **Keyboard Modes**:
|
||||
- `MODE_NORMAL` (0) - Normal editing mode
|
||||
- `MODE_KCOMMAND` (1) - Command mode (^k commands)
|
||||
- `MODE_ESCAPE` (2) - Escape key handling mode
|
||||
- **Kill Ring Operations**:
|
||||
- `KILLRING_NO_OP` (0) - No operation
|
||||
- `KILLRING_APPEND` (1) - Append deleted characters
|
||||
- `KILLRING_PREPEND` (2) - Prepend deleted characters
|
||||
- `KILLING_SET` (3) - Set killring to deleted character
|
||||
- `KILLRING_FLUSH` (4) - Clear the killring
|
||||
- **Legacy Initializers**: `ABUF_INIT` - C struct initializer for append buffer
|
||||
|
||||
### 2. Updated `main.c`
|
||||
- Added `#include "ke_constants.h"` at the top with other includes
|
||||
- Removed all duplicate #define statements that were moved to the constants header
|
||||
- Eliminated the duplicate `TAB_STOP` definition (was defined twice on lines 36 and 50)
|
||||
- Cleaned up approximately 30+ lines of redundant definitions
|
||||
|
||||
### 3. Updated `erow.cpp`
|
||||
- Added `#include "ke_constants.h"` with extern "C" linkage for C++ compatibility
|
||||
- Removed local `constexpr int TAB_STOP = 8` definition
|
||||
- Now uses the centralized `TAB_STOP` constant from `ke_constants.h`
|
||||
|
||||
## Benefits
|
||||
|
||||
1. **Single Source of Truth**: All constants are now defined in one location, making them easier to maintain and modify
|
||||
2. **Eliminated Duplication**: Removed duplicate definitions (e.g., TAB_STOP was defined twice in main.c)
|
||||
3. **Better Organization**: Constants are grouped logically by category with clear comments
|
||||
4. **Cross-Language Compatibility**: Header works with both C (main.c) and C++ (erow.cpp) code
|
||||
5. **Easier Maintenance**: Future changes to constants only need to be made in one place
|
||||
6. **Improved Readability**: Cleaner source files with less clutter from #define statements
|
||||
|
||||
## Build System Compatibility
|
||||
|
||||
Both build systems have been tested and verified to work correctly:
|
||||
|
||||
### Makefile Build
|
||||
```bash
|
||||
make clean
|
||||
make
|
||||
```
|
||||
Successfully compiles all files (main.c, abuf.cpp, erow.cpp) and links the executable.
|
||||
|
||||
### CMake Build
|
||||
```bash
|
||||
cd cmake-build-debug
|
||||
cmake --build . --clean-first
|
||||
```
|
||||
Successfully builds the project with all components.
|
||||
|
||||
## Header Guard
|
||||
The header uses standard include guards:
|
||||
```c
|
||||
#ifndef KE_CONSTANTS_H
|
||||
#define KE_CONSTANTS_H
|
||||
...
|
||||
#endif /* KE_CONSTANTS_H */
|
||||
```
|
||||
|
||||
## C/C++ Interoperability
|
||||
When including in C++ files, use extern "C" linkage:
|
||||
```cpp
|
||||
extern "C" {
|
||||
#include "ke_constants.h"
|
||||
}
|
||||
```
|
||||
|
||||
This ensures proper linkage and prevents name mangling issues.
|
||||
|
||||
## Future Considerations
|
||||
|
||||
1. **Additional Constants**: As the project grows, any new constants should be added to `ke_constants.h` rather than being scattered across source files
|
||||
2. **Namespacing**: For C++ constants, consider creating a dedicated C++ header with namespaced constants
|
||||
3. **Type Safety**: For C++ code, consider using `constexpr` or `inline constexpr` variables in a C++ header for better type safety
|
||||
4. **Documentation**: Keep this document updated as new constants are added or modified
|
||||
|
||||
## Testing
|
||||
|
||||
All compilation tests passed:
|
||||
- ✅ Makefile build: Clean compilation with no errors or warnings
|
||||
- ✅ CMake build: Clean compilation with no errors or warnings
|
||||
- ✅ All source files (C and C++) successfully include and use the constants
|
||||
- ✅ No duplicate definition errors
|
||||
- ✅ Proper linkage between C and C++ components
|
||||
|
||||
## Related Files
|
||||
|
||||
- `ke_constants.h` - The new constants header (created)
|
||||
- `main.c` - Updated to use new header (modified)
|
||||
- `erow.cpp` - Updated to use new header (modified)
|
||||
- `Makefile` - No changes required (working)
|
||||
- `CMakeLists.txt` - No changes required (working)
|
||||
|
||||
## Date
|
||||
November 24, 2025
|
||||
109
docs/CPP17_CONVERSION.md
Normal file
109
docs/CPP17_CONVERSION.md
Normal file
@@ -0,0 +1,109 @@
|
||||
# C++17 Conversion Documentation
|
||||
|
||||
## Overview
|
||||
This document describes the initial conversion of the ke2 project from C to C++17 standards, starting with the `abuf` and `erow` structures as requested.
|
||||
|
||||
## Converted Components
|
||||
|
||||
### 1. abuf (Append Buffer)
|
||||
**Original C Structure (main.c:69-73):**
|
||||
```c
|
||||
struct abuf {
|
||||
char *b;
|
||||
int len;
|
||||
int cap;
|
||||
};
|
||||
```
|
||||
|
||||
**C++17 Implementation (abuf.hpp, abuf.cpp):**
|
||||
- Converted to a modern C++ class using RAII principles
|
||||
- Uses `std::string` as the internal buffer for automatic memory management
|
||||
- Implements move semantics (deleted copy operations)
|
||||
- Uses C++17 features:
|
||||
- `std::string_view` for efficient string parameters
|
||||
- `[[nodiscard]]` attributes for better safety
|
||||
- `noexcept` specifications where appropriate
|
||||
- No manual memory management required - destructor automatically handled by std::string
|
||||
|
||||
**Key Improvements:**
|
||||
- Automatic memory cleanup (RAII)
|
||||
- Exception-safe
|
||||
- No memory leaks possible
|
||||
- More efficient with move semantics
|
||||
- Type-safe with modern C++ idioms
|
||||
|
||||
### 2. erow (Editor Row)
|
||||
**Original C Structure (main.c:79-87):**
|
||||
```c
|
||||
struct erow {
|
||||
char *line;
|
||||
char *render;
|
||||
int size;
|
||||
int rsize;
|
||||
int cap;
|
||||
};
|
||||
```
|
||||
|
||||
**C++17 Implementation (erow.hpp, erow.cpp):**
|
||||
- Converted to a C++ class with proper encapsulation
|
||||
- Uses `std::string` for both `line` and `render` buffers
|
||||
- Implements move semantics (deleted copy operations)
|
||||
- All manual memory management replaced with RAII
|
||||
- Retains all original functionality:
|
||||
- UTF-8 character handling with `mbrtowc` and `wcwidth`
|
||||
- Tab expansion (TAB_STOP = 8)
|
||||
- Control character rendering as `\xx`
|
||||
- Cursor-to-render and render-to-cursor position conversions
|
||||
|
||||
**Key Improvements:**
|
||||
- Automatic memory cleanup for both line and render buffers
|
||||
- No malloc/free/realloc needed
|
||||
- Exception-safe operations
|
||||
- Better encapsulation with private members
|
||||
- Modern C++ method naming conventions
|
||||
|
||||
## Build System Updates
|
||||
|
||||
### Makefile
|
||||
- Added C++ compiler support (g++)
|
||||
- Added CXXFLAGS with `-std=c++17`
|
||||
- Modified build rules to compile C and C++ separately
|
||||
- Updated to link with C++ compiler
|
||||
- Enhanced clean target to remove object files
|
||||
|
||||
### CMakeLists.txt
|
||||
- Changed project language from `C` to `C CXX`
|
||||
- Added `CMAKE_CXX_STANDARD 17` and `CMAKE_CXX_STANDARD_REQUIRED ON`
|
||||
- Added C++ compiler flags matching C flags
|
||||
- Updated executable target to include `abuf.cpp` and `erow.cpp`
|
||||
- Maintained backward compatibility with existing C code (main.c)
|
||||
|
||||
## Compilation Testing
|
||||
Both build systems have been tested and verified:
|
||||
- ✅ Makefile: Successfully compiles with `make`
|
||||
- ✅ CMake: Successfully configures and builds
|
||||
- ✅ Object files generated correctly for all C++ sources
|
||||
- ✅ No compilation warnings or errors
|
||||
|
||||
## C++17 Features Used
|
||||
1. **std::string** - Modern string class with automatic memory management
|
||||
2. **std::string_view** - Efficient non-owning string references (C++17)
|
||||
3. **[[nodiscard]]** - Compiler warnings for ignored return values (C++17)
|
||||
4. **noexcept** - Exception specifications for optimization
|
||||
5. **default/delete** - Explicit control over special member functions
|
||||
6. **Move semantics** - Efficient resource transfer
|
||||
7. **constexpr** - Compile-time constants (TAB_STOP)
|
||||
|
||||
## Next Steps
|
||||
The project now has a foundation for further C++17 conversion:
|
||||
- Additional structures can be converted following the same patterns
|
||||
- Consider converting more C code to C++ classes
|
||||
- Potential for using more STL containers (std::vector for dynamic arrays)
|
||||
- Opportunity to use smart pointers for other memory management
|
||||
- Can leverage more C++17 features (std::optional, structured bindings, etc.)
|
||||
|
||||
## Compatibility
|
||||
- The new C++ code coexists with existing C code (main.c)
|
||||
- Both can be compiled together and linked successfully
|
||||
- The conversion maintains the original functionality
|
||||
- No changes required to existing C code at this stage
|
||||
Reference in New Issue
Block a user