Skip to content

Commit 18b840e

Browse files
Merge branch 'main' into cli_parser
2 parents 4e8b019 + b880673 commit 18b840e

File tree

11 files changed

+1513
-2
lines changed

11 files changed

+1513
-2
lines changed

code/logic/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ set(TEST_CODE
1414
output.c
1515
soap.c
1616
stream.c
17+
keyboard.c
1718
)
1819

1920
# Create the library target

code/logic/fossil/io/error.h

Lines changed: 182 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,188 @@ const char *fossil_io_what(fossil_status_t error_code);
183183

184184
#ifdef __cplusplus
185185
}
186+
187+
#include <exception>
188+
189+
/**
190+
* This namespace provides a set of functions for handling input and output operations.
191+
*/
192+
namespace fossil {
193+
/**
194+
* This namespace provides a set of functions for handling input and output operations.
195+
*/
196+
namespace io {
197+
/**
198+
* Enum class for error codes.
199+
*/
200+
enum class ErrorCode {
201+
// Success and General Errors
202+
OK = FOSSIL_ERROR_OK,
203+
NULL_POINTER = FOSSIL_ERROR_NULL_POINTER,
204+
INVALID_ARGUMENT = FOSSIL_ERROR_INVALID_ARGUMENT,
205+
TYPE_MISMATCH = FOSSIL_ERROR_TYPE_MISMATCH,
206+
INVALID_OPERATION = FOSSIL_ERROR_INVALID_OPERATION,
207+
UNKNOWN = FOSSIL_ERROR_UNKNOWN,
208+
CUSTOM = FOSSIL_ERROR_CUSTOM,
209+
INTERNAL = FOSSIL_ERROR_INTERNAL,
210+
UNKNOWN_ERROR_CODE = FOSSIL_ERROR_UNKNOWN_ERROR_CODE,
211+
212+
// Arithmetic Errors
213+
OVERFLOW_INT = FOSSIL_ERROR_OVERFLOW_INT,
214+
UNDERFLOW_INT = FOSSIL_ERROR_UNDERFLOW_INT,
215+
OVERFLOW_FLOAT = FOSSIL_ERROR_OVERFLOW_FLOAT,
216+
UNDERFLOW_FLOAT = FOSSIL_ERROR_UNDERFLOW_FLOAT,
217+
DIVISION_BY_ZERO = FOSSIL_ERROR_DIVISION_BY_ZERO,
218+
INVALID_CAST = FOSSIL_ERROR_INVALID_CAST,
219+
220+
// Memory Errors
221+
OUT_OF_MEMORY = FOSSIL_ERROR_OUT_OF_MEMORY,
222+
MEMORY_CORRUPTION = FOSSIL_ERROR_MEMORY_CORRUPTION,
223+
BUFFER_OVERFLOW = FOSSIL_ERROR_BUFFER_OVERFLOW,
224+
BUFFER_UNDERFLOW = FOSSIL_ERROR_BUFFER_UNDERFLOW,
225+
BUFFER_OVERFLOW_STR = FOSSIL_ERROR_BUFFER_OVERFLOW_STR,
226+
BUFFER_OVERFLOW_FMT = FOSSIL_ERROR_BUFFER_OVERFLOW_FMT,
227+
BUFFER_OVERFLOW_FILE = FOSSIL_ERROR_BUFFER_OVERFLOW_FILE,
228+
BUFFER_OVERFLOW_NET = FOSSIL_ERROR_BUFFER_OVERFLOW_NET,
229+
BUFFER_OVERFLOW_CMD = FOSSIL_ERROR_BUFFER_OVERFLOW_CMD,
230+
BUFFER_OVERFLOW_ENV = FOSSIL_ERROR_BUFFER_OVERFLOW_ENV,
231+
MEMORY_LEAK = FOSSIL_ERROR_MEMORY_LEAK,
232+
MEMORY_ALLOCATION_FAILURE = FOSSIL_ERROR_MEMORY_ALLOCATION_FAILURE,
233+
MEMORY_ALIGNMENT_ISSUE = FOSSIL_ERROR_MEMORY_ALIGNMENT_ISSUE,
234+
235+
// File and I/O Errors
236+
FILE_CORRUPTION = FOSSIL_ERROR_FILE_CORRUPTION,
237+
FILE_NOT_FOUND = FOSSIL_ERROR_FILE_NOT_FOUND,
238+
DIRECTORY_NOT_FOUND = FOSSIL_ERROR_DIRECTORY_NOT_FOUND,
239+
TOO_MANY_OPEN_FILES = FOSSIL_ERROR_TOO_MANY_OPEN_FILES,
240+
IO = FOSSIL_ERROR_IO,
241+
UNSUPPORTED_OPERATION = FOSSIL_ERROR_UNSUPPORTED_OPERATION,
242+
PIPE = FOSSIL_ERROR_PIPE,
243+
SYSTEM_CALL_FAILED = FOSSIL_ERROR_SYSTEM_CALL_FAILED,
244+
PERMISSION_DENIED = FOSSIL_ERROR_PERMISSION_DENIED,
245+
READ_ONLY_FILESYSTEM = FOSSIL_ERROR_READ_ONLY_FILESYSTEM,
246+
FILE_LOCK_FAILED = FOSSIL_ERROR_FILE_LOCK_FAILED,
247+
FILE_WRITE_FAILED = FOSSIL_ERROR_FILE_WRITE_FAILED,
248+
FILE_READ_FAILED = FOSSIL_ERROR_FILE_READ_FAILED,
249+
FILE_SEEK_FAILED = FOSSIL_ERROR_FILE_SEEK_FAILED,
250+
FILE_CLOSE_FAILED = FOSSIL_ERROR_FILE_CLOSE_FAILED,
251+
FILE_TRUNCATE_FAILED = FOSSIL_ERROR_FILE_TRUNCATE_FAILED,
252+
FILE_TOO_LARGE = FOSSIL_ERROR_FILE_TOO_LARGE,
253+
DEVICE_NOT_READY = FOSSIL_ERROR_DEVICE_NOT_READY,
254+
DEVICE_REMOVED = FOSSIL_ERROR_DEVICE_REMOVED,
255+
256+
// Resource and Process Errors
257+
RESOURCE_UNAVAILABLE = FOSSIL_ERROR_RESOURCE_UNAVAILABLE,
258+
BUSY = FOSSIL_ERROR_BUSY,
259+
DEADLOCK = FOSSIL_ERROR_DEADLOCK,
260+
INTERRUPTED = FOSSIL_ERROR_INTERRUPTED,
261+
LIMIT_REACHED = FOSSIL_ERROR_LIMIT_REACHED,
262+
PROCESS = FOSSIL_ERROR_PROCESS,
263+
PROCESS_CREATION_FAILED = FOSSIL_ERROR_PROCESS_CREATION_FAILED,
264+
PROCESS_EXITED_WITH_ERROR = FOSSIL_ERROR_PROCESS_EXITED_WITH_ERROR,
265+
PROCESS_TIMEOUT = FOSSIL_ERROR_PROCESS_TIMEOUT,
266+
RESOURCE_DEPLETION = FOSSIL_ERROR_RESOURCE_DEPLETION,
267+
THREAD_CREATION_FAILED = FOSSIL_ERROR_THREAD_CREATION_FAILED,
268+
THREAD_TERMINATION_FAILED = FOSSIL_ERROR_THREAD_TERMINATION_FAILED,
269+
270+
// Hardware Errors
271+
HARDWARE_FAILURE = FOSSIL_ERROR_HARDWARE_FAILURE,
272+
HARD_DISK_FAILURE = FOSSIL_ERROR_HARD_DISK_FAILURE,
273+
GPU_FAILURE = FOSSIL_ERROR_GPU_FAILURE,
274+
CPU_OVERHEAT = FOSSIL_ERROR_CPU_OVERHEAT,
275+
MEMORY_FAILURE = FOSSIL_ERROR_MEMORY_FAILURE,
276+
HARDWARE_OVERLOAD = FOSSIL_ERROR_HARDWARE_OVERLOAD,
277+
DEVICE_TIMEOUT = FOSSIL_ERROR_DEVICE_TIMEOUT,
278+
POWER_SUPPLY_FAILURE = FOSSIL_ERROR_POWER_SUPPLY_FAILURE,
279+
280+
// Network Errors
281+
NETWORK_FAILURE = FOSSIL_ERROR_NETWORK_FAILURE,
282+
TIMEOUT = FOSSIL_ERROR_TIMEOUT,
283+
UNKNOWN_HOST = FOSSIL_ERROR_UNKNOWN_HOST,
284+
CONNECTION_REFUSED = FOSSIL_ERROR_CONNECTION_REFUSED,
285+
NETWORK_UNREACHABLE = FOSSIL_ERROR_NETWORK_UNREACHABLE,
286+
PROTOCOL = FOSSIL_ERROR_PROTOCOL,
287+
CONNECTION_RESET = FOSSIL_ERROR_CONNECTION_RESET,
288+
DNS_RESOLUTION_FAILED = FOSSIL_ERROR_DNS_RESOLUTION_FAILED,
289+
NETWORK_CONGESTION = FOSSIL_ERROR_NETWORK_CONGESTION,
290+
BANDWIDTH_EXCEEDED = FOSSIL_ERROR_BANDWIDTH_EXCEEDED,
291+
FIREWALL_BLOCKED = FOSSIL_ERROR_FIREWALL_BLOCKED,
292+
SSL_HANDSHAKE_FAILED = FOSSIL_ERROR_SSL_HANDSHAKE_FAILED,
293+
CERTIFICATE_EXPIRED = FOSSIL_ERROR_CERTIFICATE_EXPIRED,
294+
CERTIFICATE_REVOKED = FOSSIL_ERROR_CERTIFICATE_REVOKED,
295+
296+
// Security Errors
297+
SQL_INJECTION = FOSSIL_ERROR_SQL_INJECTION,
298+
XSS_ATTACK = FOSSIL_ERROR_XSS_ATTACK,
299+
CSRF_ATTACK = FOSSIL_ERROR_CSRF_ATTACK,
300+
FORMAT_STRING_ATTACK = FOSSIL_ERROR_FORMAT_STRING_ATTACK,
301+
CRYPTOGRAPHIC_WEAKNESS = FOSSIL_ERROR_CRYPTOGRAPHIC_WEAKNESS,
302+
INSECURE_RANDOMNESS = FOSSIL_ERROR_INSECURE_RANDOMNESS,
303+
INSECURE_CONFIGURATION = FOSSIL_ERROR_INSECURE_CONFIGURATION,
304+
INSECURE_DESERIALIZATION = FOSSIL_ERROR_INSECURE_DESERIALIZATION,
305+
INSECURE_FILE_HANDLING = FOSSIL_ERROR_INSECURE_FILE_HANDLING,
306+
INSECURE_TEMPORARY_FILES = FOSSIL_ERROR_INSECURE_TEMPORARY_FILES,
307+
INSECURE_COMMUNICATION = FOSSIL_ERROR_INSECURE_COMMUNICATION,
308+
INSECURE_AUTHENTICATION = FOSSIL_ERROR_INSECURE_AUTHENTICATION,
309+
INSECURE_ACCESS_CONTROL = FOSSIL_ERROR_INSECURE_ACCESS_CONTROL,
310+
SESSION_HIJACKING = FOSSIL_ERROR_SESSION_HIJACKING,
311+
DATA_TAMPERING = FOSSIL_ERROR_DATA_TAMPERING,
312+
MAN_IN_THE_MIDDLE_ATTACK = FOSSIL_ERROR_MAN_IN_THE_MIDDLE_ATTACK,
313+
PRIVILEGE_ESCALATION = FOSSIL_ERROR_PRIVILEGE_ESCALATION,
314+
315+
// User-Related and External Errors
316+
USER_ABORT = FOSSIL_ERROR_USER_ABORT,
317+
SIGNAL = FOSSIL_ERROR_SIGNAL,
318+
USER_INPUT_TOO_LARGE = FOSSIL_ERROR_USER_INPUT_TOO_LARGE,
319+
USER_INPUT_INVALID_FORMAT = FOSSIL_ERROR_USER_INPUT_INVALID_FORMAT,
320+
USER_PERMISSION_REJECTED = FOSSIL_ERROR_USER_PERMISSION_REJECTED,
321+
322+
// Database Errors
323+
DATABASE_CONNECTION_FAILED = FOSSIL_ERROR_DATABASE_CONNECTION_FAILED,
324+
DATABASE_QUERY_FAILED = FOSSIL_ERROR_DATABASE_QUERY_FAILED,
325+
DATABASE_TIMEOUT = FOSSIL_ERROR_DATABASE_TIMEOUT,
326+
DATABASE_CORRUPTION = FOSSIL_ERROR_DATABASE_CORRUPTION,
327+
DATABASE_DEADLOCK = FOSSIL_ERROR_DATABASE_DEADLOCK,
328+
DATABASE_LOCK_FAILED = FOSSIL_ERROR_DATABASE_LOCK_FAILED,
329+
330+
// Serialization and Deserialization Errors
331+
SERIALIZATION_FAILED = FOSSIL_ERROR_SERIALIZATION_FAILED,
332+
DESERIALIZATION_FAILED = FOSSIL_ERROR_DESERIALIZATION_FAILED,
333+
INVALID_SERIALIZATION_FORMAT = FOSSIL_ERROR_INVALID_SERIALIZATION_FORMAT,
334+
DATA_CORRUPTION = FOSSIL_ERROR_DATA_CORRUPTION,
335+
336+
// Miscellaneous Errors
337+
INDEX_OUT_OF_BOUNDS = FOSSIL_ERROR_INDEX_OUT_OF_BOUNDS,
338+
FORMAT = FOSSIL_ERROR_FORMAT,
339+
INCOMPATIBLE_VERSION = FOSSIL_ERROR_INCOMPATIBLE_VERSION,
340+
JSON_PARSING_FAILED = FOSSIL_ERROR_JSON_PARSING_FAILED,
341+
XML_PARSING_FAILED = FOSSIL_ERROR_XML_PARSING_FAILED,
342+
YAML_PARSING_FAILED = FOSSIL_ERROR_YAML_PARSING_FAILED,
343+
INVALID_CHECKSUM = FOSSIL_ERROR_INVALID_CHECKSUM,
344+
TIMER_EXPIRED = FOSSIL_ERROR_TIMER_EXPIRED
345+
};
346+
347+
/**
348+
* Exception class for handling errors.
349+
*/
350+
class Error : public std::exception {
351+
public:
352+
explicit Error(ErrorCode code) : code_(code) {}
353+
354+
const char* what() const noexcept override {
355+
return fossil_io_what(static_cast<fossil_status_t>(code_));
356+
}
357+
358+
ErrorCode code() const noexcept {
359+
return code_;
360+
}
361+
362+
private:
363+
ErrorCode code_;
364+
};
365+
}
366+
}
367+
186368
#endif
187369

188370
#endif /* FOSSIL_IO_FRAMEWORK_H */

code/logic/fossil/io/framework.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#define FOSSIL_IO_FRAMEWORK_H
1616

1717
// Include the necessary headers
18+
#include "keyboard.h"
1819
#include "output.h"
1920
#include "input.h"
2021
#include "error.h"

code/logic/fossil/io/keyboard.h

Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
/*
2+
* -----------------------------------------------------------------------------
3+
* Project: Fossil Logic
4+
*
5+
* This file is part of the Fossil Logic project, which aims to develop high-
6+
* performance, cross-platform applications and libraries. The code contained
7+
* herein is subject to the terms and conditions defined in the project license.
8+
*
9+
* Author: Michael Gene Brockus (Dreamer)
10+
*
11+
* Copyright (C) 2024 Fossil Logic. All rights reserved.
12+
* -----------------------------------------------------------------------------
13+
*/
14+
#ifndef FOSSIL_IO_KEYBOARD_H
15+
#define FOSSIL_IO_KEYBOARD_H
16+
17+
#include <stdint.h>
18+
#include <stddef.h>
19+
20+
#ifdef __cplusplus
21+
extern "C" {
22+
#endif
23+
24+
// Define a keyboard event structure
25+
typedef struct {
26+
int shift; // 1 if Shift is pressed, 0 otherwise
27+
int ctrl; // 1 if Ctrl is pressed, 0 otherwise
28+
int alt; // 1 if Alt is pressed, 0 otherwise
29+
char key; // The character of the key pressed
30+
} fossil_io_keyboard_event_t;
31+
32+
// Define a callback type for key events
33+
typedef void (*fossil_io_keyboard_callback_t)(fossil_io_keyboard_event_t event);
34+
35+
/**
36+
* Initialize the keyboard library.
37+
* Sets up any platform-specific configurations.
38+
*/
39+
void fossil_io_keyboard_init(void);
40+
41+
/**
42+
* Shut down the keyboard library.
43+
* Cleans up any platform-specific configurations.
44+
*/
45+
void fossil_io_keyboard_shutdown(void);
46+
47+
/**
48+
* Clear all keybindings from the library.
49+
*/
50+
void fossil_io_keyboard_clear_bindings(void);
51+
52+
/**
53+
* Register a keybinding with the library.
54+
*
55+
* @param event The keyboard event to bind to.
56+
* @param callback The callback function to call when the event occurs.
57+
*/
58+
void fossil_io_keyboard_register_binding(fossil_io_keyboard_event_t event, fossil_io_keyboard_callback_t callback);
59+
60+
/**
61+
* Unregister a keybinding with the library.
62+
*
63+
* @param event The keyboard event to unbind.
64+
*/
65+
void fossil_io_keyboard_unregister_binding(fossil_io_keyboard_event_t event);
66+
67+
/**
68+
* Poll for keyboard events and trigger any registered callbacks.
69+
* This function should be called in the main loop of the application.
70+
*/
71+
void fossil_io_keyboard_poll_events(void);
72+
73+
#ifdef __cplusplus
74+
}
75+
76+
/**
77+
* C++ wrapper for the SOAP API.
78+
*/
79+
namespace fossil {
80+
81+
/**
82+
* Namespace for I/O operations.
83+
*/
84+
namespace io {
85+
/**
86+
* Class for interacting with the keyboard.
87+
*/
88+
class keyboard {
89+
public:
90+
/**
91+
* Initialize the keyboard library.
92+
* Sets up any platform-specific configurations.
93+
*/
94+
static void init() {
95+
fossil_io_keyboard_init();
96+
}
97+
98+
/**
99+
* Shut down the keyboard library.
100+
* Cleans up any platform-specific configurations.
101+
*/
102+
static void shutdown() {
103+
fossil_io_keyboard_shutdown();
104+
}
105+
106+
/**
107+
* Clear all keybindings from the library.
108+
*/
109+
static void clear_bindings() {
110+
fossil_io_keyboard_clear_bindings();
111+
}
112+
113+
/**
114+
* Register a keybinding with the library.
115+
*
116+
* @param event The keyboard event to bind to.
117+
* @param callback The callback function to call when the event occurs.
118+
*/
119+
static void register_binding(fossil_io_keyboard_event_t event, fossil_io_keyboard_callback_t callback) {
120+
fossil_io_keyboard_register_binding(event, callback);
121+
}
122+
123+
/**
124+
* Unregister a keybinding with the library.
125+
*
126+
* @param event The keyboard event to unbind.
127+
*/
128+
static void unregister_binding(fossil_io_keyboard_event_t event) {
129+
fossil_io_keyboard_unregister_binding(event);
130+
}
131+
132+
/**
133+
* Poll for keyboard events and trigger any registered callbacks.
134+
* This function should be called in the main loop of the application.
135+
*/
136+
static void poll_events() {
137+
fossil_io_keyboard_poll_events();
138+
}
139+
};
140+
}
141+
}
142+
143+
#endif
144+
145+
#endif /* FOSSIL_IO_FRAMEWORK_H */

0 commit comments

Comments
 (0)