IZP/Cviko7_2/main.c

94 lines
2.4 KiB
C
Raw Permalink Normal View History

2024-11-21 17:14:54 +01:00
#include "types.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#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;
}