From 04b3fcb479f5aaae06d18b315a8bdc8c298f4eae Mon Sep 17 00:00:00 2001 From: admin Date: Tue, 5 Aug 2025 11:28:41 +0200 Subject: removed clustering --- src/glautils/fgla.c | 88 +++++++++++++++++++++++++---------------------------- src/glautils/fgla.d | 7 +++++ 2 files changed, 49 insertions(+), 46 deletions(-) create mode 100644 src/glautils/fgla.d (limited to 'src/glautils') 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 #include #include -#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] \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 -- cgit v1.2.3