int main(int argc, char *argv[]) { if (argc < 2) display_usage(NULL); if (arg_matches(argv[1], "ls")) { commands_ls_hosts(); } else if (arg_matches(argv[1], "rm")) { if (argc != 3) display_usage("Host required"); commands_rm_host(argv[2]); } else if (arg_matches(argv[1], "version")) { printf("Version "VERSION "\n"); } else if (arg_matches(argv[1], "help")) { display_usage(NULL); } else { display_usage(argv[1]); } return 0; }
arg_options *parse_args(int argc, char **argv) { if (argc >= 2 && arg_matches(argv[1], "--help", "-h")) { print_usage(0); } arg_options *args = (arg_options*) malloc(sizeof(arg_options)); CHECK_MEM(args); if (argc < 2) { print_missing_argument("mode"); } if (arg_matches(argv[1], "gen", 0)) { // SNOWFLAKE_GEN args->mode = SNOWFLAKE_GEN; // required args args->gen.output = 0; int output_set = 0; // optional args args->gen.impl = BSP; args->gen.num_particles = -1; args->gen.symmetry_degree = 6; args->gen.symmetry_type = NONE; args->gen.silent = 0; int argi = 2; while (argi < argc) { if (arg_matches(argv[argi], "--num-particles", "-n")) { check_enough_parameters(argv[argi], argc, argi, 1); args->gen.num_particles = atoi(argv[argi+1]); argi += 2; } else if (arg_matches(argv[argi], "--output", "-o")) { check_enough_parameters(argv[argi], argc, argi, 1); args->gen.output = (char*) realloc(args->gen.output, strlen(argv[argi+1]) + 1); CHECK_MEM(args->gen.output); strcpy(args->gen.output, argv[argi+1]); output_set = 1; argi += 2; } else if (arg_matches(argv[argi], "--impl", 0)) { check_enough_parameters(argv[argi], argc, argi, 1); if (arg_matches(argv[argi+1], "BSP", 0)) { args->gen.impl = BSP; } else if (arg_matches(argv[argi+1], "LINEAR", 0)) { args->gen.impl = LINEAR; } else { print_unrecognised_argument(argv[argi+1]); } argi += 2; } else if (arg_matches(argv[argi], "--symmetry-degree", "-d")) { check_enough_parameters(argv[argi], argc, argi, 1); args->gen.symmetry_degree = atoi(argv[argi+1]); argi += 2; } else if (arg_matches(argv[argi], "--symmetry-type", "-t")) { check_enough_parameters(argv[argi], argc, argi, 1); if (arg_matches(argv[argi+1], "none", 0)) { args->gen.symmetry_type = NONE; } else if (arg_matches(argv[argi+1], "rotational", 0)) { args->gen.symmetry_type = ROTATIONAL; } else if (arg_matches(argv[argi+1], "full", 0)) { args->gen.symmetry_type = FULL; } else { print_unrecognised_argument(argv[argi+1]); } argi += 2; } else if (arg_matches(argv[argi], "--silent", "-s")) { args->gen.silent = 1; argi += 1; } else { print_unrecognised_argument(argv[argi]); } } if (!output_set) { print_missing_argument("--output"); } } else if (arg_matches(argv[1], "render", 0)) { // RENDER args->mode = RENDER; // required args args->render.input = 0; int input_set = 0; // optional args args->render.output = 0; int output_set = 0; args->render.colorize = 0; args->render.movie = 0; args->render.num_frames = 0; int num_frames_set = 0; args->render.silent = 0; int argi = 2; while (argi < argc) { if (arg_matches(argv[argi], "--output", "-o")) { check_enough_parameters(argv[argi], argc, argi, 1); args->render.output = (char*) realloc(args->render.output, strlen(argv[argi+1]) + 1); CHECK_MEM(args->render.output); strcpy(args->render.output, argv[argi+1]); output_set = 1; argi += 2; } else if (arg_matches(argv[argi], "--input", "-i")) { check_enough_parameters(argv[argi], argc, argi, 1); args->render.input = (char*) realloc(args->render.input, strlen(argv[argi+1]) + 1); CHECK_MEM(args->render.input); strcpy(args->render.input, argv[argi+1]); input_set = 1; argi += 2; } else if (arg_matches(argv[argi], "--colorize", "-c")) { args->render.colorize = 1; argi += 1; } else if (arg_matches(argv[argi], "--movie", "-m")) { args->render.movie = 1; argi += 1; } else if (arg_matches(argv[argi], "--frames", "-f")) { check_enough_parameters(argv[argi], argc, argi, 1); args->render.num_frames = atoi(argv[argi+1]); num_frames_set = 1; argi += 2; } else if (arg_matches(argv[argi], "--silent", "-s")) { args->render.silent = 1; argi += 1; } else { print_unrecognised_argument(argv[argi]); } } if (!input_set) { print_missing_argument("--input"); } if (!output_set) { args->render.output = replace_extension(args->render.input, "png"); } if (args->render.movie && !num_frames_set) { print_missing_argument("--frames"); } } else if (arg_matches(argv[1], "tests", 0)) { // TESTS args->mode = TESTS; // optional args args->tests.impl = BSP; int argi = 2; while (argi < argc) { if (arg_matches(argv[argi], "--impl", 0)) { check_enough_parameters(argv[argi], argc, argi, 1); if (arg_matches(argv[argi+1], "BSP", 0)) { args->tests.impl = BSP; } else if (arg_matches(argv[argi+1], "LINEAR", 0)) { args->tests.impl = LINEAR; } else { print_unrecognised_argument(argv[argi+1]); } argi += 2; } else { print_unrecognised_argument(argv[argi]); } } } else { print_unrecognised_argument(argv[1]); } return args; }