Sat, 19 Oct 2019 10:47:46 +0200
add first metadata sync test
/* * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * * Copyright 2018 Olaf Wintermann. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include "optparser.h" #include "sopt.h" void cmd_args_free(CmdArgs *args) { if(args) { ucx_map_free(args->options); free(args->argv); free(args); } } CmdArgs* cmd_parse_args(int argc, char **argv) { CmdArgs *a = malloc(sizeof(CmdArgs)); a->options = ucx_map_new(16); a->argv = calloc(argc, sizeof(char*)); a->argc = 0; const char *NOARG = ""; char *option = NULL; char optchar = 0; for(int i=0;i<argc;i++) { char *arg = argv[i]; size_t len = strlen(arg); if(len > 1 && arg[0] == '-') { for(int c=1;c<len;c++) { if (option) { fprintf(stderr, "Missing argument for option -%c\n\n", optchar); cmd_args_free(a); return NULL; } switch(arg[c]) { default: { fprintf(stderr, "Unknown option -%c\n\n", arg[c]); cmd_args_free(a); return NULL; } case 'v': { ucx_map_cstr_put(a->options, "verbose", NOARG); break; } case 'k': { option = "key"; optchar = 'k'; break; } case 'p': { ucx_map_cstr_put(a->options, "plain", NOARG); break; } case 'c': { ucx_map_cstr_put(a->options, "crypt", NOARG); break; } case 'a': { ucx_map_cstr_put(a->options, "all", NOARG); break; } case 'l': { ucx_map_cstr_put(a->options, "list", NOARG); break; } case 'd': { ucx_map_cstr_put(a->options, "date", NOARG); break; } case 't': { ucx_map_cstr_put(a->options, "type", NOARG); break; } case 'R': { ucx_map_cstr_put(a->options, "recursive", NOARG); break; } case 'O': { ucx_map_cstr_put(a->options, "override", NOARG); break; } case 'i': { ucx_map_cstr_put(a->options, "insecure", NOARG); break; } case 'N': { ucx_map_cstr_put(a->options, "noinput", NOARG); break; } case 'e': { ucx_map_cstr_put(a->options, "extended", NOARG); break; } case 'x': { ucx_map_cstr_put(a->options, "xml", NOARG); break; } case 'F': { option = "finfo"; optchar = 'F'; break; } case 'S': { // undocumented hidden feature ucx_map_cstr_put(a->options, "structure", NOARG); break; } case 'K': { ucx_map_cstr_put(a->options, "keep", NOARG); break; } case 'o': { option = "output"; optchar = 'o'; break; } case 'u': { option = "update"; optchar = 'u'; break; } case 'n': { option = "namespace"; optchar = 'n'; break; } case 'L': { option = "lock"; optchar = 'L'; break; } case 'T': { option = "timeout"; optchar = 'T'; break; } /* case 'P': { option = "progressfile"; optchar = 'F'; break; } */ case 'V': { option = "version"; optchar = 'V'; break; } } } } else if(option) { ucx_map_cstr_put(a->options, option, arg); option = NULL; } else { a->argv[a->argc++] = arg; } } if(option) { fprintf(stderr, "Missing argument for option -%c\n\n", optchar); cmd_args_free(a); return NULL; } return a; } char* cmd_getoption(CmdArgs *arg, char *name) { return ucx_map_cstr_get(arg->options, name); }