#include "types.h" #include #include #include #ifndef TEST_BUILD int main(int argc, char *argv[]) { // konfigurace programu Config config = { .xFlag = false, .yFlag = false, .sValue = NULL, .nValue = 10}; // TODO: 2. odpovídajícím způsobem zavolejte funkci parse_args bool parse = parse_args(argv, argc, &config); // TODO: 3. v případě chyby zpracování vypište obsah // globální proměnné usage na chybový výstup // a ukončente program s chybovým kódem 1 if (!parse) { printf("%s", usage); return 1; } return 0; } #endif /** * Zpracuje argumenty příkazové řádky programu. * Výsledky ukládá do struktury Config z parametrů metody. * * Duplicity žádných přepínačů nejsou dovoleny. * * Hlavičky žádných funkcí NEMĚŇTE! * * @param arguments pole argumentů z CLI * @param argumentCount velikost pole argumentů * @param config ukazatel na výstupní konfiguraci * * @returns hodnotu true při úspěšném zpracování, false jinak */ bool parse_args(char **arguments, int argumentCount, Config *config) { // TODO: 1. implementujte funkci dle specifikace zadání // a chování jednotlivých přepínačů config->nValue = 10; config->sValue = NULL; bool valid = true; bool hasN = false; for (int i = 0; i < argumentCount; i++) { if (strcmp(arguments[i], "-x") == 0) { if (config->yFlag || config->xFlag) { valid = false; break; } config->xFlag = true; } else if (strcmp(arguments[i], "-y") == 0) { if (config->yFlag || config->xFlag) { valid = false; break; } config->yFlag = true; } else if (strcmp(arguments[i], "-n") == 0) { if (i + 1 >= argumentCount || hasN) { valid = false; break; } for (unsigned int argIndex = 0; argIndex < strlen(arguments[i + 1]); argIndex++) { if (!(arguments[i + 1][argIndex] >= '0' && arguments[i + 1][argIndex] <= '9')) { valid = false; break; } } if (!valid) { break; } config->nValue = atoi(arguments[i + 1]); hasN = true; } else if (strcmp(arguments[i], "-s") == 0) { if (config->sValue != NULL) { valid = false; break; } config->sValue = arguments[i + 1]; } } if (config->sValue == NULL || !valid) { return false; } return true; }