1aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley/* Copyright (c) 2014, Google Inc. 2aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley * 3aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley * Permission to use, copy, modify, and/or distribute this software for any 4aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley * purpose with or without fee is hereby granted, provided that the above 5aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley * copyright notice and this permission notice appear in all copies. 6aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley * 7aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 8aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 9aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 10aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 11aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION 12aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 13aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ 14aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley 15aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley#include <string> 16aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley#include <vector> 17aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley#include <map> 18aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley 19aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley#include <string.h> 20aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley 21aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley#include "internal.h" 22aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley 23aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley 24aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langleybool ParseKeyValueArguments(std::map<std::string, std::string> *out_args, 25aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley const std::vector<std::string> &args, 26aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley const struct argument *templates) { 27aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley out_args->clear(); 28aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley 29aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley for (size_t i = 0; i < args.size(); i++) { 30aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley const std::string &arg = args[i]; 31aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley const struct argument *templ = nullptr; 32aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley for (size_t j = 0; templates[j].name[0] != 0; j++) { 33aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley if (strcmp(arg.c_str(), templates[j].name) == 0) { 34aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley templ = &templates[j]; 35aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley break; 36aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley } 37aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley } 38aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley 39aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley if (templ == nullptr) { 40aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley fprintf(stderr, "Unknown argument: %s\n", arg.c_str()); 41aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley return false; 42aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley } 43aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley 44aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley if (i + 1 >= args.size()) { 45aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley fprintf(stderr, "Missing argument for option: %s\n", arg.c_str()); 46aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley return false; 47aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley } 48aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley 49aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley if (out_args->find(arg) != out_args->end()) { 50aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley fprintf(stderr, "Duplicate value given for: %s\n", arg.c_str()); 51aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley return false; 52aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley } 53aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley 54aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley (*out_args)[arg] = args[++i]; 55aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley } 56aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley 57aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley for (size_t j = 0; templates[j].name[0] != 0; j++) { 58aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley const struct argument *templ = &templates[j]; 59aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley if (templ->required && out_args->find(templ->name) == out_args->end()) { 60aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley fprintf(stderr, "Missing value for required argument: %s\n", templ->name); 61aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley return false; 62aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley } 63aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley } 64aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley 65aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley return true; 66aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley} 67aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley 68aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langleyvoid PrintUsage(const struct argument *templates) { 69aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley for (size_t i = 0; templates[i].name[0] != 0; i++) { 70aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley const struct argument *templ = &templates[i]; 71aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley fprintf(stderr, "%s\t%s\n", templ->name, templ->description); 72aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley } 73aacec17a630eacfb8023a4a3075f0ea51629eb98Adam Langley} 74