diff options
author | Christian C <cc@localhost> | 2025-03-06 14:50:16 -0800 |
---|---|---|
committer | Christian C <cc@localhost> | 2025-03-06 14:50:16 -0800 |
commit | fa4a17e9ab5b55f8b8da3d52ee05ae62dde2e3a8 (patch) | |
tree | 3e42b073035039b53574f778f674b4d15b99bbe4 /src | |
parent | cdc6326b8353f3c325b35ed45f9049484824efae (diff) |
Better command line arguments
Diffstat (limited to 'src')
-rw-r--r-- | src/main.c | 127 |
1 files changed, 93 insertions, 34 deletions
@@ -1,5 +1,6 @@ #include <stdio.h> #include <stdlib.h> +#include <unistd.h> #ifdef VISUAL #include <raylib.h> @@ -22,11 +23,56 @@ #define N_DILATIONS 10 -#define MIN_AREA 200 -#define MIN_PERIMETER 50 +#define MIN_AREA 500 +#define MIN_PERIMETER 0 int main(int argc, char** argv) { + char opt; + char* directory = NULL; + char* png_file = "../out.png"; + char* bin_file = "../out.bin"; + bool_t silent = FALSE; + while ((opt = getopt(argc, argv, "d:b:p:s")) != -1) { + switch (opt) { + case 's': + silent = TRUE; + break; + case 'd': + if (!silent) { + printf("Parse Directory: %s\n", optarg); + } + directory = optarg; + break; + case 'b': + if (!silent) { + printf("Bin File: %s\n", optarg); + } + bin_file = optarg; + break; + case 'p': + if (!silent) { + printf("PNG File: %s\n", optarg); + } + png_file = optarg; + break; + case ':': + if (!silent) { + printf("Option requires value\n"); + } + break; + case '?': + if (!silent) { + printf("Unknown option: %c\n", optopt); + } + break; + } + } + if (!silent) { + for (;optind < argc; optind++) { + printf("Extra arguments: %s\n", argv[optind]); + } + } TIME(ts_g_start); struct AVLNode* root = NULL; //----------------------------------------------- @@ -37,11 +83,11 @@ int main(int argc, char** argv) uint16_t starting_label = 1; uint16_t *masks = NULL; // Expect a directory to be passed as the first argument - if (argc > 1) { + if (directory != NULL) { // Ensure the directory exists - if (is_directory(argv[1])) { + if (is_directory(directory)) { // List files in the ddirectory - file_list = list_directory(argv[1]); + file_list = list_directory(directory); if (file_list) { size_t index = 0; // For each file @@ -59,12 +105,14 @@ int main(int argc, char** argv) // 2. Find contiguous regions // 3. Combine with current total mask // 4. Free up allocations made in this process - char* fpath = full_path(argv[1], fname); + char* fpath = full_path(directory, fname); if (fpath == NULL) { free(file_list[index++]); continue; } - printf("Loading %s...\n", fpath); + if (!silent) { + printf("Loading %s...\n", fpath); + } uint16_t *file_labels = tif_to_labels(fpath, &width, &height, &starting_label); if (file_labels == NULL) { free(fpath); @@ -105,8 +153,10 @@ int main(int argc, char** argv) labels = masks; masks = temp; free(labels); - printf("%u labels found\n", starting_label-1); - printf("Mask dimensions: %u %u\n", width, height); + if (!silent) { + printf("%u labels found\n", starting_label-1); + printf("Mask dimensions: %u %u\n", width, height); + } // Get the area/ perimeter of each label root = NULL; TIME(ts_info_start); @@ -121,11 +171,15 @@ int main(int argc, char** argv) } } TIME(ts_info_end); - printf("Information retrieval took %f ms\n", 1000*diff_time(&ts_info_end, &ts_info_start)); + if (!silent) { + printf("Information retrieval took %f ms\n", 1000*diff_time(&ts_info_end, &ts_info_start)); + } #ifdef AVL_INFO - printf("Inorder traversal of AVL tree: "); - print_label(root); - printf("\n"); + if (!silent) { + printf("Inorder traversal of AVL tree: "); + print_label(root); + printf("\n"); + } #endif TIME(ts_filter_start); // Get the smallest labels @@ -141,7 +195,9 @@ int main(int argc, char** argv) } } TIME(ts_filter_end); - printf("Removing small labels took %f ms\n", 1000*diff_time(&ts_filter_end, &ts_filter_start)); + if (!silent) { + printf("Removing small labels took %f ms\n", 1000*diff_time(&ts_filter_end, &ts_filter_start)); + } free_avl_tree(small_label_tree); free_avl_tree_nodes(root); @@ -165,8 +221,10 @@ int main(int argc, char** argv) labels = masks; masks = temp; free(labels); - printf("%u remaining labels found\n", starting_label-1); - printf("Mask dimensions: %u %u\n", width, height); + if (!silent) { + printf("%u remaining labels found\n", starting_label-1); + printf("Mask dimensions: %u %u\n", width, height); + } // Regenerate information after relabeling root = NULL; for (size_t y = 0; y < height; y++) { @@ -180,9 +238,11 @@ int main(int argc, char** argv) } } #ifdef AVL_INFO - printf("Inorder traversal of AVL tree: "); - print_label(root); - printf("\n"); + if (!silent) { + printf("Inorder traversal of AVL tree: "); + print_label(root); + printf("\n"); + } #endif free_avl_tree_nodes(root); @@ -194,7 +254,9 @@ int main(int argc, char** argv) masks = new_labels; } TIME(ts_end); - printf("Closing up took %f ms\n", 1000*diff_time(&ts_end, &ts_start)); + if (!silent) { + printf("Closing up took %f ms\n", 1000*diff_time(&ts_end, &ts_start)); + } //----------------------------------------------- #ifdef VISUAL @@ -279,32 +341,29 @@ int main(int argc, char** argv) masks[x + y*width] >>= 4; } } - write_array("../out.bin", masks, width*height*sizeof(uint16_t)); + struct bitmap_t* bitmap = uint16_to_bitmap(masks, width, height); + if (bitmap != NULL) { + save_png(bitmap, png_file); + free(bitmap); + } + write_array(bin_file, masks, width*height*sizeof(uint16_t)); free(masks); } CloseWindow(); #else if (masks != NULL) { struct bitmap_t* bitmap = uint16_to_bitmap(masks, width, height); - char* png_name = "../out.png"; - char* bin_name = "../out.bin"; if (bitmap != NULL) { - if (argc > 3) { - save_png(bitmap, argv[3]); - } else { - save_png(bitmap, png_name); - } + save_png(bitmap, png_file); free(bitmap); } - if (argc > 2) { - write_array(argv[2], masks, width*height*sizeof(uint16_t)); - } else { - write_array(bin_name, masks, width*height*sizeof(uint16_t)); - } + write_array(bin_file, masks, width*height*sizeof(uint16_t)); free(masks); } #endif TIME(ts_g_end); - printf("Finished in %f ms\n", 1000*diff_time(&ts_g_end, &ts_g_start)); + if (!silent) { + printf("Finished in %f ms\n", 1000*diff_time(&ts_g_end, &ts_g_start)); + } return 0; } |