CLI Argument Parser
CLI Argument Parser has been written in C, and simple parses command line arguments. I’ve used it for a few applications, and will continue to do so. Well, enough said really. Feel free to post comments, bug fixes, patches, suggestions, complaints etc.
I may recode this in C++ when I have the time, but for now, it’s in C. Enjoy.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 | /** * CLI Argument Parser * * @author reZo <reZo@rezolabs.com> * @license GNU General Public License * @version 14th April 2008 * * @bug -k=v && --key=value accepts x{1,} = chars */ /** * Prototype's */ #ifdef win32 #define snprintf sprintf_s #define strtok strtok_s #endif extern struct configuration configuration; void argumentShort (char *key, char *value); void argumentLong (char *key, char *value); #ifdef WIN32 void argumentWin32 (char *key, char *value); #endif void argumentUsageAndHelp (const char *programName); char *argumentGetKey (char *key); char *argumentGetValue (char *key); int arguments (int argc, char *argv[]); /** * Send argv[i] && argv[i+1] off to there correct parser's */ int arguments (int argc, char *argv[]) { if (argc == 1) argumentUsageAndHelp(argv[0]); int i; for (i = 1; i < argc; i++) { char *current = (char*) malloc(sizeof(char*) * strlen(argv[i])); snprintf(current, strlen(argv[i]), "%s", argv[i]); if (*(current) == '-' && *(current+1) == '-') argumentLong(argv[i], argv[i+1]); else if (*(current) == '-' && *(current+1) != '-') argumentShort(argv[i], argv[i+1]); #ifdef WIN32 else if (*(current) == '/') argumentWin32(argv[i], argv[i+1]); #endif } return 0; } /** * CLI usage and help */ void argumentUsageAndHelp (const char *programName) { fprintf(stderr, "usage: %s (options)\n\n", programName); #ifdef WIN32 fprintf(stderr, "Windows help\n"); #else fprintf(stderr, "Non Windows help\n"); #endif fprintf(stderr, "\nReport bugs to <reZo@rezolabs.com>\n"); exit(-1); } #ifdef WIN32 /** * Parse windows style CLI argument's */ void argumentWin32 (char *key, char *value) { if (strlen(key) <= 1) { fprintf(stderr, "Invalid CLI argument length (win32).\n"); exit(-1); } /** * Settings that do not require usage of value argument */ if (strncmp(key, "/?", 2) && strlen(key) == 2 && value == NULL) printf("%s argument with no value, setting to default\n", key); if (value == NULL) return; /** * Settings that require usage of value argument */ if (strncmp(key, "/example", 5) == 0 && strlen(key) == 8) printf("%s %s\n", key, value); } #endif /** * Parse short unix style CLI argument's * * @accept -k * -k value * -k=value */ void argumentShort (char *key, char *value) { if (strlen(key) <= 1) { fprintf(stderr, "Invalid CLI argument length (short).\n"); exit(-1); } /** * Settings that do not require usage of value argument */ if (strncmp(key, "-e", 2) == 0 && strlen(key) == 2 && value == NULL) printf("%s argument with no value, setting to default\n", key); /** * Check if we're dealing with -k=value if value is NULL */ if (value == NULL) { if (strchr(key, '=') != NULL) { value = argumentGetValue(key); key = argumentGetKey(key); } else return; } if (strncmp(key, "-e", 2) == 0 && strlen(key) == 2) printf("%s %s\n", key, value); } /** * Parse long unix style CLI argument's * * @accept --key * --key value * --key=value */ void argumentLong (char *key, char *value) { if (strlen(key) <= 2) { fprintf(stderr, "Invalid CLI argument length (long)\n"); exit(-1); } /** * Settings that do not require usage of value argument */ if (strncmp(key, "--example", 9) == 0 && strlen(key) == 9 && value == NULL) printf("%s with no value, setting to default\n", key); /** * Check if we're dealing with --key=value if value is NULL */ if (value == NULL) { if (strchr(key, '=') != NULL) { value = argumentGetValue(key); key = argumentGetKey(key); } else return; } if (strncmp(key, "--example", 6) == 0 && strlen(key) == 6) printf("%s %s\n", key, value); } /** * Extract key from -k=value or --key=value syntax */ char *argumentGetKey (char *key) { return strtok(key, "="); } /** * Extract value from -k=value or --key=value syntax */ char *argumentGetValue (char *key) { char *value; value = strtok(key, "="); value = strtok(NULL, "="); return value; } |

Comments(0)