24 lines
1.8 KiB
Markdown
24 lines
1.8 KiB
Markdown
|
7
|
||
|
|
||
|
## Bugs
|
||
|
- The history file path is not expanded from `~` to the full home directory path.
|
||
|
- `read_history` and `write_history` may encounter errors without handling them, e.g., file permissions or missing history file.
|
||
|
- The check on `if(!(data || *data)){` in `line_read()` might lead to a potential null pointer dereference if `readline` returns null.
|
||
|
|
||
|
## Optimizations
|
||
|
- Use `getenv("HOME")` or `wordexp` to properly expand the tilde (`~`) to the full path of the user's home directory.
|
||
|
- Add error handling for `read_history` and `write_history` calls.
|
||
|
- Use `if(data == NULL || *data == '\0'){` in `line_read()` to handle potential null addresses safely.
|
||
|
|
||
|
## Good points
|
||
|
- Implements command completion which enhances user experience.
|
||
|
- Utilizes the `readline` library effectively for command-line interaction.
|
||
|
- Code is modular and functions are appropriately separated by concerns.
|
||
|
|
||
|
## Summary
|
||
|
The code provides a basic command-line interface with features for command completion and history storage using the `readline` library. It does a commendable job on keeping possible commands and their completion minimalistic and straightforward. However, it encounters issues with the handling of user home directory paths in the context of a history file and lacks robust error handling concerning file operations for command history. Proper checks against null pointers need implementation to ensure more stable execution.
|
||
|
|
||
|
## Open source alternatives
|
||
|
- GNU Readline: The library is already being used but reviewing the full set of its capabilities can further optimize command-line interaction with line editing and custom completers.
|
||
|
- `clap`: While mostly known for CLI parsing in Rust apps, its approach can inspire improvements in arguments handling.
|
||
|
- `Linenoise`: A small, portable GNU Readline replacement for C.
|