| OLD | NEW |
| 1 /* Copyright (c) 2010 The Chromium OS Authors. All rights reserved. | 1 /* Copyright (c) 2010 The Chromium OS Authors. All rights reserved. |
| 2 * Use of this source code is governed by a BSD-style license that can be | 2 * Use of this source code is governed by a BSD-style license that can be |
| 3 * found in the LICENSE file. | 3 * found in the LICENSE file. |
| 4 * | 4 * |
| 5 * Update GPT attribute bits. | 5 * Update GPT attribute bits. |
| 6 */ | 6 */ |
| 7 #include <getopt.h> | 7 #include <getopt.h> |
| 8 #include <stdint.h> |
| 8 #include <stdio.h> | 9 #include <stdio.h> |
| 9 #include <stdlib.h> | 10 #include <stdlib.h> |
| 10 #include "cgpt.h" | 11 #include "cgpt.h" |
| 11 #include "utility.h" | 12 #include "utility.h" |
| 12 | 13 |
| 13 /* Special validator. Set 'integer' as 1 to indicate the option is present. */ | 14 /* Special validator. Set 'integer' as 1 to indicate the option is present. */ |
| 14 int AssignTrue(const char *argument, void *pointer, void *integer) { | 15 int AssignTrue(const char *argument, void *pointer, void *integer) { |
| 15 *(int*)integer = 1; | 16 *(int*)integer = 1; |
| 16 return CGPT_OK; | 17 return CGPT_OK; |
| 17 } | 18 } |
| 18 | 19 |
| 20 /* Special validator. Copy string to 'parsed' with max 'valid_range' bytes. */ |
| 21 int CopyString(const char *argument, void *max_len, void *dst) { |
| 22 memcpy(dst, argument, (intptr_t)max_len); |
| 23 return CGPT_OK; |
| 24 } |
| 25 |
| 19 /* Validator function. Returns 1 if 'argument' is between 'max' and 'min' | 26 /* Validator function. Returns 1 if 'argument' is between 'max' and 'min' |
| 20 * in 'valid_range'. */ | 27 * in 'valid_range'. */ |
| 21 int InNumberRange(const char *argument, void *valid_range, void *parsed) { | 28 int InNumberRange(const char *argument, void *valid_range, void *parsed) { |
| 22 struct number_range *range = valid_range; | 29 struct number_range *range = valid_range; |
| 23 char *endptr; | 30 char *endptr; |
| 24 int number; | 31 int number; |
| 25 | 32 |
| 26 assert(valid_range); | |
| 27 | |
| 28 number = strtol(argument, &endptr, 10); | 33 number = strtol(argument, &endptr, 10); |
| 29 if (*endptr) { | 34 if (*endptr) { |
| 30 printf("[ERROR] argument '%s' is not a number.\n", argument); | 35 printf("[ERROR] argument '%s' is not a number.\n", argument); |
| 31 return CGPT_FAILED; | 36 return CGPT_FAILED; |
| 32 } | 37 } |
| 33 | 38 |
| 34 if (number < range->min) { | 39 if (range) { |
| 35 printf("[ERROR] argument is too small (min is %d, but you gave: %d).\n", | 40 if (number < range->min) { |
| 36 range->min, number); | 41 printf("[ERROR] argument is too small (min is %d, but you gave: %d).\n", |
| 37 return CGPT_FAILED; | 42 range->min, number); |
| 38 } else if (number > range->max) { | 43 return CGPT_FAILED; |
| 39 printf("[ERROR] argument is too large (max is %d, but you gave: %d).\n", | 44 } else if (number > range->max) { |
| 40 range->max, number); | 45 printf("[ERROR] argument is too large (max is %d, but you gave: %d).\n", |
| 41 return CGPT_FAILED; | 46 range->max, number); |
| 47 return CGPT_FAILED; |
| 48 } else { |
| 49 if (parsed) *(int*)parsed = number; |
| 50 return CGPT_OK; |
| 51 } |
| 42 } else { | 52 } else { |
| 53 /* no range to check, assign integer. */ |
| 43 if (parsed) *(int*)parsed = number; | 54 if (parsed) *(int*)parsed = number; |
| 44 return CGPT_OK; | 55 return CGPT_OK; |
| 45 } | 56 } |
| 46 } | 57 } |
| 47 | 58 |
| 48 void ShowOptions(const struct option *opts, | 59 void ShowOptions(const struct option *opts, |
| 49 const struct option_details *details, | 60 const struct option_details *details, |
| 50 const int num) { | 61 const int num) { |
| 51 int i; | 62 int i; |
| 52 for (i = 0; i < num; ++i) { | 63 for (i = 0; i < num; ++i) { |
| 53 char buf[32]; | 64 char buf[32]; |
| 65 if (!opts[i].name) break; |
| 54 snprintf(buf, sizeof(buf), "--%s %s", opts[i].name, | 66 snprintf(buf, sizeof(buf), "--%s %s", opts[i].name, |
| 55 opts[i].has_arg ? "ARG" : ""); | 67 opts[i].has_arg ? "ARG" : ""); |
| 56 printf(" %-20s (-%c) %s\n", buf, opts[i].val, details[i].comment); | 68 printf(" %-20s (-%c) %s\n", buf, opts[i].val, details[i].comment); |
| 57 } | 69 } |
| 58 } | 70 } |
| 59 | 71 |
| 60 int HandleOptions(const int argc, | 72 int HandleOptions(const int argc, |
| 61 char *const *argv, | 73 char *const *argv, |
| 62 const char *short_options, | 74 const char *short_options, |
| 63 const int option_count, | 75 const int option_count, |
| 64 const struct option *options, | 76 const struct option *options, |
| 65 const struct option_details *details) { | 77 const struct option_details *details) { |
| 66 while (1) { | 78 while (1) { |
| 67 int index; | 79 int index; |
| 68 int option; | 80 int option; |
| 69 | 81 |
| 70 /* We assume every short option has an entry in long option (for validator). | 82 /* We assume every short option has an entry in long option (for validator). |
| 71 * So please add corresponding entry in attribute_options if you add short | 83 * So please add corresponding entry in attribute_options if you add short |
| 72 * option. */ | 84 * option. */ |
| 73 index = NOT_INITED; | 85 index = NOT_INITED; |
| 74 option = getopt_long(argc, argv, short_options, options, &index); | 86 option = getopt_long(argc, argv, short_options, options, &index); |
| 75 if (option == -1) { | 87 if (option == -1) { |
| 76 break; | 88 break; |
| 77 } else if (option == 0) { | 89 } else if (option == 0) { |
| 78 /* option 'val' has been saved in 'flag'. We do nothing here. */ | 90 /* option 'val' has been saved in 'flag'. We do nothing here. */ |
| 91 } else if (option == ':') { |
| 92 printf("[ERROR] Missing parameter for option.\n"); |
| 93 ShowOptions(options, details, option_count); |
| 94 return CGPT_FAILED; |
| 95 } else if (option == '?') { |
| 96 printf("[ERROR] unknown option name: %s\n", argv[optind - 1]); |
| 97 ShowOptions(options, details, option_count); |
| 98 return CGPT_FAILED; |
| 79 } else { | 99 } else { |
| 80 /* Short option doesn't update 'index'. We search whole array to find out | 100 /* Short option doesn't update 'index'. We search whole array to find out |
| 81 * the corresponding long option. */ | 101 * the corresponding long option. */ |
| 82 if (index == NOT_INITED) { | 102 if (index == NOT_INITED) { |
| 83 for (index = 0; index < option_count; ++index) | 103 for (index = 0; index < option_count; ++index) |
| 84 if (option == options[index].val) break; | 104 if (option == options[index].val) break; |
| 85 /* assumes every short option has a corresponding long option. */ | 105 /* assumes every short option has a corresponding long option. */ |
| 86 assert(index < option_count); | 106 assert(index < option_count); |
| 87 } | 107 } |
| 88 assert(option == options[index].val); | 108 assert(option == options[index].val); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 122 printf("[ERROR] DriveOpen(%s) error!\n", drive_path); | 142 printf("[ERROR] DriveOpen(%s) error!\n", drive_path); |
| 123 return CGPT_FAILED; | 143 return CGPT_FAILED; |
| 124 } | 144 } |
| 125 } else { | 145 } else { |
| 126 printf("[ERROR] One (and only one) non-option argument is required.\n"); | 146 printf("[ERROR] One (and only one) non-option argument is required.\n"); |
| 127 return CGPT_FAILED; | 147 return CGPT_FAILED; |
| 128 } | 148 } |
| 129 | 149 |
| 130 return CGPT_OK; | 150 return CGPT_OK; |
| 131 } | 151 } |
| OLD | NEW |