Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| c255185084 | |||
| 24800d69d5 |
157
otp.c
157
otp.c
@@ -2300,7 +2300,7 @@ void simple_entropy_mix(unsigned char* urandom_buffer, size_t buffer_size,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Enhanced input function for filename with directory separation
|
// Enhanced input function with editable pre-filled text
|
||||||
int get_filename_with_default(const char* prompt, const char* default_path, char* result, size_t result_size) {
|
int get_filename_with_default(const char* prompt, const char* default_path, char* result, size_t result_size) {
|
||||||
// Find the last directory separator
|
// Find the last directory separator
|
||||||
char* last_slash = strrchr(default_path, '/');
|
char* last_slash = strrchr(default_path, '/');
|
||||||
@@ -2324,33 +2324,168 @@ int get_filename_with_default(const char* prompt, const char* default_path, char
|
|||||||
filename[sizeof(filename) - 1] = '\0';
|
filename[sizeof(filename) - 1] = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
// Display the enhanced prompt with directory and filename separated by colon
|
// Setup terminal for raw input
|
||||||
printf("\n%s\n%s: %s", prompt, directory, filename);
|
struct termios orig_termios;
|
||||||
|
if (tcgetattr(STDIN_FILENO, &orig_termios) != 0) {
|
||||||
|
// Fallback to simple input if terminal control fails
|
||||||
|
printf("\n%s\n%s: ", prompt, directory);
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
|
|
||||||
char input_buffer[512];
|
char input_buffer[512];
|
||||||
if (!fgets(input_buffer, sizeof(input_buffer), stdin)) {
|
if (!fgets(input_buffer, sizeof(input_buffer), stdin)) {
|
||||||
return 1; // Error reading input
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Remove newline
|
|
||||||
input_buffer[strcspn(input_buffer, "\n")] = 0;
|
input_buffer[strcspn(input_buffer, "\n")] = 0;
|
||||||
|
|
||||||
// If user just pressed Enter, use the default filename
|
|
||||||
if (strlen(input_buffer) == 0) {
|
if (strlen(input_buffer) == 0) {
|
||||||
strncpy(result, default_path, result_size - 1);
|
strncpy(result, default_path, result_size - 1);
|
||||||
result[result_size - 1] = '\0';
|
|
||||||
} else {
|
} else {
|
||||||
// Combine directory with user input
|
|
||||||
if (strlen(directory) > 0) {
|
if (strlen(directory) > 0) {
|
||||||
snprintf(result, result_size, "%s%s", directory, input_buffer);
|
snprintf(result, result_size, "%s%s", directory, input_buffer);
|
||||||
} else {
|
} else {
|
||||||
strncpy(result, input_buffer, result_size - 1);
|
strncpy(result, input_buffer, result_size - 1);
|
||||||
result[result_size - 1] = '\0';
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
result[result_size - 1] = '\0';
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
return 0; // Success
|
// Set up raw terminal mode
|
||||||
|
struct termios raw_termios = orig_termios;
|
||||||
|
raw_termios.c_lflag &= ~(ECHO | ICANON);
|
||||||
|
raw_termios.c_cc[VMIN] = 1;
|
||||||
|
raw_termios.c_cc[VTIME] = 0;
|
||||||
|
|
||||||
|
if (tcsetattr(STDIN_FILENO, TCSANOW, &raw_termios) != 0) {
|
||||||
|
// Fallback if terminal setup fails
|
||||||
|
printf("\n%s\n%s: ", prompt, directory);
|
||||||
|
fflush(stdout);
|
||||||
|
|
||||||
|
char input_buffer[512];
|
||||||
|
if (!fgets(input_buffer, sizeof(input_buffer), stdin)) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
input_buffer[strcspn(input_buffer, "\n")] = 0;
|
||||||
|
|
||||||
|
if (strlen(input_buffer) == 0) {
|
||||||
|
strncpy(result, default_path, result_size - 1);
|
||||||
|
} else {
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Display prompt and directory
|
||||||
|
printf("\n%s\n%s", prompt, directory);
|
||||||
|
fflush(stdout);
|
||||||
|
|
||||||
|
// Initialize editing buffer with default filename
|
||||||
|
char edit_buffer[512];
|
||||||
|
strncpy(edit_buffer, filename, sizeof(edit_buffer) - 1);
|
||||||
|
edit_buffer[sizeof(edit_buffer) - 1] = '\0';
|
||||||
|
int cursor_pos = strlen(edit_buffer);
|
||||||
|
int buffer_len = cursor_pos;
|
||||||
|
|
||||||
|
// Display initial filename
|
||||||
|
printf("%s", edit_buffer);
|
||||||
|
fflush(stdout);
|
||||||
|
|
||||||
|
// Main editing loop
|
||||||
|
int c;
|
||||||
|
while ((c = getchar()) != EOF) {
|
||||||
|
if (c == '\n' || c == '\r') {
|
||||||
|
// Enter key - accept input
|
||||||
|
break;
|
||||||
|
} else if (c == 127 || c == 8) {
|
||||||
|
// Backspace/Delete
|
||||||
|
if (cursor_pos > 0) {
|
||||||
|
// Move everything after cursor one position left
|
||||||
|
memmove(&edit_buffer[cursor_pos - 1], &edit_buffer[cursor_pos], buffer_len - cursor_pos + 1);
|
||||||
|
cursor_pos--;
|
||||||
|
buffer_len--;
|
||||||
|
|
||||||
|
// Redraw line: move cursor to start of filename area, clear to end, redraw buffer
|
||||||
|
printf("\r%s\033[K%s", directory, edit_buffer);
|
||||||
|
|
||||||
|
// Position cursor correctly
|
||||||
|
if (cursor_pos < buffer_len) {
|
||||||
|
printf("\033[%dD", buffer_len - cursor_pos);
|
||||||
|
}
|
||||||
|
fflush(stdout);
|
||||||
|
}
|
||||||
|
} else if (c == 27) {
|
||||||
|
// Escape sequence (arrow keys, etc.)
|
||||||
|
int c1 = getchar();
|
||||||
|
int c2 = getchar();
|
||||||
|
if (c1 == '[') {
|
||||||
|
if (c2 == 'C' && cursor_pos < buffer_len) {
|
||||||
|
// Right arrow
|
||||||
|
cursor_pos++;
|
||||||
|
printf("\033[1C");
|
||||||
|
fflush(stdout);
|
||||||
|
} else if (c2 == 'D' && cursor_pos > 0) {
|
||||||
|
// Left arrow
|
||||||
|
cursor_pos--;
|
||||||
|
printf("\033[1D");
|
||||||
|
fflush(stdout);
|
||||||
|
} else if (c2 == 'H') {
|
||||||
|
// Home key
|
||||||
|
printf("\033[%dD", cursor_pos);
|
||||||
|
cursor_pos = 0;
|
||||||
|
fflush(stdout);
|
||||||
|
} else if (c2 == 'F') {
|
||||||
|
// End key
|
||||||
|
printf("\033[%dC", buffer_len - cursor_pos);
|
||||||
|
cursor_pos = buffer_len;
|
||||||
|
fflush(stdout);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (c >= 32 && c <= 126) {
|
||||||
|
// Printable character
|
||||||
|
if (buffer_len < (int)sizeof(edit_buffer) - 1) {
|
||||||
|
// Move everything after cursor one position right
|
||||||
|
memmove(&edit_buffer[cursor_pos + 1], &edit_buffer[cursor_pos], buffer_len - cursor_pos + 1);
|
||||||
|
edit_buffer[cursor_pos] = c;
|
||||||
|
cursor_pos++;
|
||||||
|
buffer_len++;
|
||||||
|
|
||||||
|
// Redraw from cursor position
|
||||||
|
printf("%c", c);
|
||||||
|
if (cursor_pos < buffer_len) {
|
||||||
|
// Print remaining characters and move cursor back
|
||||||
|
printf("%s\033[%dD", &edit_buffer[cursor_pos], buffer_len - cursor_pos);
|
||||||
|
}
|
||||||
|
fflush(stdout);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Ignore other control characters
|
||||||
|
}
|
||||||
|
|
||||||
|
// Restore terminal
|
||||||
|
tcsetattr(STDIN_FILENO, TCSANOW, &orig_termios);
|
||||||
|
printf("\n");
|
||||||
|
|
||||||
|
// Construct final result
|
||||||
|
if (buffer_len == 0) {
|
||||||
|
// Empty input, use default
|
||||||
|
strncpy(result, default_path, result_size - 1);
|
||||||
|
} else {
|
||||||
|
// Combine directory with edited filename
|
||||||
|
edit_buffer[buffer_len] = '\0';
|
||||||
|
if (strlen(directory) > 0) {
|
||||||
|
snprintf(result, result_size, "%s%s", directory, edit_buffer);
|
||||||
|
} else {
|
||||||
|
strncpy(result, edit_buffer, result_size - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result[result_size - 1] = '\0';
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Editor and file manager implementations
|
// Editor and file manager implementations
|
||||||
|
|||||||
7
test_file.txt.otp.asc
Normal file
7
test_file.txt.otp.asc
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
-----BEGIN OTP MESSAGE-----
|
||||||
|
Version: v0.2.29
|
||||||
|
Pad-ChkSum: d0d4a489354348b08d8c7b324814d8c50010042e9da47f2c973f32a16a09101b
|
||||||
|
Pad-Offset: 57
|
||||||
|
|
||||||
|
05S8GfS0tFfczNMUz0xrieFGoPSREM4uo5QhFGoBCcOzjfTXTDMt3hRtAQ==
|
||||||
|
-----END OTP MESSAGE-----
|
||||||
BIN
toc.txt.otp
Normal file
BIN
toc.txt.otp
Normal file
Binary file not shown.
Reference in New Issue
Block a user