Version v0.2.29 - implemented enhanced filename input with directory/filename separation

This commit is contained in:
2025-08-13 10:47:08 -04:00
parent f118c23c60
commit 7e50727163

65
otp.c
View File

@@ -99,6 +99,9 @@ int handle_text_encrypt(void);
int handle_file_encrypt(void);
int handle_smart_decrypt(void);
// Enhanced input functions
int get_filename_with_default(const char* prompt, const char* default_path, char* result, size_t result_size);
void print_usage(const char* program_name);
int main(int argc, char* argv[]) {
@@ -2297,6 +2300,59 @@ void simple_entropy_mix(unsigned char* urandom_buffer, size_t buffer_size,
}
}
// Enhanced input function for filename with directory separation
int get_filename_with_default(const char* prompt, const char* default_path, char* result, size_t result_size) {
// Find the last directory separator
char* last_slash = strrchr(default_path, '/');
char directory[1024] = "";
char filename[512] = "";
if (last_slash) {
// Extract directory path
size_t dir_len = last_slash - default_path + 1; // Include the trailing slash
if (dir_len < sizeof(directory)) {
strncpy(directory, default_path, dir_len);
directory[dir_len] = '\0';
}
// Extract filename
strncpy(filename, last_slash + 1, sizeof(filename) - 1);
filename[sizeof(filename) - 1] = '\0';
} else {
// No directory separator, treat as filename only
strncpy(filename, default_path, sizeof(filename) - 1);
filename[sizeof(filename) - 1] = '\0';
}
// Display the enhanced prompt with directory and filename separated by colon
printf("\n%s\n%s: %s", prompt, directory, filename);
fflush(stdout);
char input_buffer[512];
if (!fgets(input_buffer, sizeof(input_buffer), stdin)) {
return 1; // Error reading input
}
// Remove newline
input_buffer[strcspn(input_buffer, "\n")] = 0;
// If user just pressed Enter, use the default filename
if (strlen(input_buffer) == 0) {
strncpy(result, default_path, result_size - 1);
result[result_size - 1] = '\0';
} else {
// Combine directory with user input
if (strlen(directory) > 0) {
snprintf(result, result_size, "%s%s", directory, input_buffer);
} else {
strncpy(result, input_buffer, result_size - 1);
result[result_size - 1] = '\0';
}
}
return 0; // Success
}
// Editor and file manager implementations
char* get_preferred_editor(void) {
@@ -2567,17 +2623,14 @@ int handle_file_encrypt(void) {
snprintf(default_output, sizeof(default_output), "%s.otp", input_file);
}
// Ask for output filename with pre-filled default
printf("\nOutput filename [%s]: ", default_output);
// Use enhanced input function for output filename
char output_file[512];
if (!fgets(output_file, sizeof(output_file), stdin)) {
if (get_filename_with_default("Output filename:", default_output, output_file, sizeof(output_file)) != 0) {
printf("Error: Failed to read input\n");
return 1;
}
output_file[strcspn(output_file, "\n")] = 0;
// Use default if user just pressed Enter
const char* output_filename = (strlen(output_file) > 0) ? output_file : default_output;
const char* output_filename = output_file;
return encrypt_file(pad_input, input_file, output_filename, ascii_armor);
}