Exemple #1
0
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;
}