diff options
Diffstat (limited to 'src/glautils')
-rw-r--r-- | src/glautils/fgla.c | 88 | ||||
-rw-r--r-- | src/glautils/fgla.d | 7 |
2 files changed, 49 insertions, 46 deletions
diff --git a/src/glautils/fgla.c b/src/glautils/fgla.c index baf2fef..c8cd139 100644 --- a/src/glautils/fgla.c +++ b/src/glautils/fgla.c @@ -15,25 +15,26 @@ #include <stdlib.h>
#include <string.h>
#include <ctype.h>
-#include "glass_data.h"
-#include "glamacdef.h"
+#include "glamac/data/glass_data.h"
+#include "glamac/core/glamacdef.h"
+#include "glautils/fgla.h"
-// Security constants
-#define MAX_SEARCH_TERM_LEN 256
-#define MAX_GLASS_NAME_LEN 256
-#define MAX_CATALOG_COUNT 10
-#define MAX_NORMALIZED_LEN 512
-#define GLASS_CODE_LEN 6
+// Use constants from header
+#define MAX_SEARCH_TERM_LEN FGLA_MAX_SEARCH_TERM_LEN
+#define MAX_GLASS_NAME_LEN FGLA_MAX_GLASS_NAME_LEN
+#define MAX_CATALOG_COUNT FGLA_MAX_CATALOG_COUNT
+#define MAX_NORMALIZED_LEN FGLA_MAX_NORMALIZED_LEN
+#define GLASS_CODE_LEN FGLA_GLASS_CODE_LEN
-// Output format types
-typedef enum {
- OUTPUT_CSV = 0,
- OUTPUT_TABLE = 1,
- OUTPUT_JSON = 2
-} OutputFormat;
+// Use output format types from header
+typedef FglaOutputFormat OutputFormat;
+#define OUTPUT_CSV FGLA_OUTPUT_CSV
+#define OUTPUT_TABLE FGLA_OUTPUT_TABLE
+#define OUTPUT_JSON FGLA_OUTPUT_JSON
// Function to safely convert string to lowercase with length limit
-void to_lowercase_safe(char* str, size_t max_len) {
+// Functions are now always non-static since they're declared in the header
+void fgla_to_lowercase_safe(char* str, size_t max_len) {
if (!str) return;
for (size_t i = 0; i < max_len && str[i]; i++) {
@@ -42,7 +43,7 @@ void to_lowercase_safe(char* str, size_t max_len) { }
// Function to safely normalize string by removing dashes and converting to lowercase
-int normalize_string_safe(const char* input, char* output, size_t output_size) {
+int fgla_normalize_string_safe(const char* input, char* output, size_t output_size) {
if (!input || !output || output_size < 2) return -1;
size_t input_len = strnlen(input, MAX_GLASS_NAME_LEN);
@@ -58,7 +59,7 @@ int normalize_string_safe(const char* input, char* output, size_t output_size) { }
// Function to safely check if needle is found in haystack (case-insensitive, dash-insensitive)
-int contains_substring_safe(const char* haystack, const char* needle) {
+int fgla_contains_substring_safe(const char* haystack, const char* needle) {
if (!haystack || !needle) return 0;
// Validate input lengths
@@ -80,8 +81,8 @@ int contains_substring_safe(const char* haystack, const char* needle) { }
// Create normalized copies (lowercase, no dashes)
- if (normalize_string_safe(haystack, haystack_normalized, h_len + 1) != 0 ||
- normalize_string_safe(needle, needle_normalized, n_len + 1) != 0) {
+ if (fgla_normalize_string_safe(haystack, haystack_normalized, h_len + 1) != 0 ||
+ fgla_normalize_string_safe(needle, needle_normalized, n_len + 1) != 0) {
free(haystack_normalized);
free(needle_normalized);
return 0;
@@ -96,7 +97,7 @@ int contains_substring_safe(const char* haystack, const char* needle) { }
// Function to check if manufacturer matches any of the specified catalogs
-int matches_catalog(const char* manufacturer, const char* catalog_list[], int catalog_count) {
+int fgla_matches_catalog(const char* manufacturer, const char* catalog_list[], int catalog_count) {
if (catalog_count == 0) return 1; // No filter = show all
for (int i = 0; i < catalog_count; i++) {
@@ -109,7 +110,7 @@ int matches_catalog(const char* manufacturer, const char* catalog_list[], int ca }
// Function to validate search term input
-int validate_search_term(const char* term) {
+int fgla_validate_search_term(const char* term) {
if (!term) return 0;
size_t len = strnlen(term, MAX_SEARCH_TERM_LEN);
@@ -130,7 +131,7 @@ int validate_search_term(const char* term) { // Function to check if a search term is a glass code pattern
// Glass code pattern: exactly 6 characters, contains only digits and/or 'x'
-int is_glass_code_pattern(const char* term) {
+int fgla_is_glass_code_pattern(const char* term) {
if (!term) return 0;
size_t len = strnlen(term, GLASS_CODE_LEN + 1);
@@ -148,7 +149,7 @@ int is_glass_code_pattern(const char* term) { // Function to safely check if a glass code matches a pattern
// Pattern can contain 'x' as wildcards, or be an exact 6-digit match
-int matches_glass_code_pattern_safe(const char* glass_code, const char* pattern) {
+int fgla_matches_glass_code_pattern_safe(const char* glass_code, const char* pattern) {
if (!glass_code || !pattern) return 0;
size_t code_len = strnlen(glass_code, 20); // Glass codes can be longer than 6
@@ -193,7 +194,7 @@ int matches_glass_code_pattern_safe(const char* glass_code, const char* pattern) }
}
-void print_usage(const char* program_name) {
+void fgla_print_usage(const char* program_name) {
printf("fgla - Find Glass utility\n");
printf("Usage: %s [OPTIONS] <search_term>\n", program_name);
printf("\n");
@@ -217,16 +218,9 @@ void print_usage(const char* program_name) { }
// Error handling with detailed messages
-typedef enum {
- FGLA_SUCCESS = 0,
- FGLA_ERROR_INVALID_ARGS = 1,
- FGLA_ERROR_INVALID_SEARCH_TERM = 2,
- FGLA_ERROR_NO_DATABASE = 3,
- FGLA_ERROR_NO_MATCHES = 4,
- FGLA_ERROR_MEMORY = 5
-} FglaResult;
+// Use FglaResult from header
-void print_error_with_suggestion(FglaResult error, const char* context) {
+void fgla_print_error_with_suggestion(FglaResult error, const char* context) {
switch (error) {
case FGLA_ERROR_INVALID_SEARCH_TERM:
fprintf(stderr, "Error: Invalid search term '%s'\n", context ? context : "");
@@ -323,6 +317,7 @@ void print_footer(OutputFormat format) { }
}
+#ifndef TEST_BUILD
int main(int argc, char* argv[]) {
const char* search_term = NULL;
const char* catalog_list[MAX_CATALOG_COUNT]; // Support up to MAX_CATALOG_COUNT catalogs
@@ -361,7 +356,7 @@ int main(int argc, char* argv[]) { }
if (catalog_count == 0) {
fprintf(stderr, "Error: -c option requires at least one catalog name\n");
- print_usage(argv[0]);
+ fgla_print_usage(argv[0]);
return FGLA_ERROR_INVALID_ARGS;
}
} else if (strcmp(argv[i], "-f") == 0) {
@@ -369,7 +364,7 @@ int main(int argc, char* argv[]) { i++; // Skip -f
if (i >= argc) {
fprintf(stderr, "Error: -f option requires a format argument\n");
- print_usage(argv[0]);
+ fgla_print_usage(argv[0]);
return FGLA_ERROR_INVALID_ARGS;
}
@@ -386,12 +381,12 @@ int main(int argc, char* argv[]) { i++;
} else if (argv[i][0] == '-') {
fprintf(stderr, "Error: Unknown option '%s'\n", argv[i]);
- print_usage(argv[0]);
+ fgla_print_usage(argv[0]);
return FGLA_ERROR_INVALID_ARGS;
} else {
if (search_term != NULL) {
fprintf(stderr, "Error: Multiple search terms not allowed\n");
- print_usage(argv[0]);
+ fgla_print_usage(argv[0]);
return FGLA_ERROR_INVALID_ARGS;
}
search_term = argv[i];
@@ -402,13 +397,13 @@ int main(int argc, char* argv[]) { catalog_list[catalog_count] = NULL; // NULL-terminate the list
if (search_term == NULL) {
- print_usage(argv[0]);
+ fgla_print_usage(argv[0]);
return FGLA_ERROR_INVALID_ARGS;
}
// Validate search term
- if (!validate_search_term(search_term)) {
- print_error_with_suggestion(FGLA_ERROR_INVALID_SEARCH_TERM, search_term);
+ if (!fgla_validate_search_term(search_term)) {
+ fgla_print_error_with_suggestion(FGLA_ERROR_INVALID_SEARCH_TERM, search_term);
return FGLA_ERROR_INVALID_SEARCH_TERM;
}
@@ -431,7 +426,7 @@ int main(int argc, char* argv[]) { }
if (!successful_path) {
- print_error_with_suggestion(FGLA_ERROR_NO_DATABASE, NULL);
+ fgla_print_error_with_suggestion(FGLA_ERROR_NO_DATABASE, NULL);
fprintf(stderr, "Tried these locations:\n");
for (int i = 0; json_paths[i]; i++) {
fprintf(stderr, " - %s\n", json_paths[i]);
@@ -447,7 +442,7 @@ int main(int argc, char* argv[]) { u32 found_count = 0;
// Determine search type
- int is_glass_code_search = is_glass_code_pattern(search_term);
+ int is_glass_code_search = fgla_is_glass_code_pattern(search_term);
// Pre-allocate matches array for performance - estimate max size across all catalogs
u32* matching_indices = malloc(10000 * sizeof(u32)); // Generous allocation for all glasses
@@ -478,18 +473,18 @@ int main(int argc, char* argv[]) { if (is_glass_code_search) {
// Glass code pattern search
const char* glass_code = (const char*)glass->glass_code;
- if (glass_code && matches_glass_code_pattern_safe(glass_code, search_term)) {
+ if (glass_code && fgla_matches_glass_code_pattern_safe(glass_code, search_term)) {
matches = 1;
}
} else {
// Name search
- if (contains_substring_safe(glass_name, search_term)) {
+ if (fgla_contains_substring_safe(glass_name, search_term)) {
matches = 1;
}
}
// Check if this glass matches the search term and catalog filter
- if (matches && matches_catalog((const char*)glass->manufacturer, catalog_list, catalog_count)) {
+ if (matches && fgla_matches_catalog((const char*)glass->manufacturer, catalog_list, catalog_count)) {
matching_indices[found_count] = i;
matching_catalogs[found_count] = catalog_idx;
found_count++;
@@ -499,7 +494,7 @@ int main(int argc, char* argv[]) { // Output results
if (found_count == 0) {
- print_error_with_suggestion(FGLA_ERROR_NO_MATCHES, search_term);
+ fgla_print_error_with_suggestion(FGLA_ERROR_NO_MATCHES, search_term);
free(matching_indices);
free(matching_catalogs);
cleanup_glass_data();
@@ -536,3 +531,4 @@ int main(int argc, char* argv[]) { return FGLA_SUCCESS;
}
+#endif /* TEST_BUILD */
diff --git a/src/glautils/fgla.d b/src/glautils/fgla.d new file mode 100644 index 0000000..69b10cd --- /dev/null +++ b/src/glautils/fgla.d @@ -0,0 +1,7 @@ +fgla.o fgla.d: ../src/glautils/fgla.c ../include/glamac/data/glass_data.h \ + ../include/glamac/data/../core/glamacdef.h \ + ../include/glamac/data/../core/glamac_errors.h \ + ../include/glamac/data/../core/glamacdef.h \ + ../include/glamac/data/../core/security.h \ + ../include/glamac/core/glamacdef.h ../include/glautils/fgla.h \ + ../include/glamac/core/security.h |