From cfadb53fa9f150c6997d36bce23e4ae1e859d313 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Kl=C3=A9ger?= Date: Tue, 7 Oct 2025 09:39:43 +0200 Subject: [PATCH] ex-03: Added solution for rgb converter --- exercise-03-rgb/main.c | 90 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 exercise-03-rgb/main.c diff --git a/exercise-03-rgb/main.c b/exercise-03-rgb/main.c new file mode 100644 index 0000000..47cd4bf --- /dev/null +++ b/exercise-03-rgb/main.c @@ -0,0 +1,90 @@ +#include +#include +#include +#include +#include + +#ifdef __PROGTEST__ +#define debug(...) ((void)0) +#else +#define debug(fmt, ...) fprintf(stdout, "[DEBUG %s:%d %s()] " fmt "\n", __FILE__, __LINE__, __func__, ##__VA_ARGS__) +#endif + +bool is_numeric(const char* str) { + if(*str == '\0') return false; + + for(;*str; str++) { + if(!isdigit(*str)) + return false; + } + return true; +} + +int invalid_input() { + printf("Nespravny vstup.\n"); + return EXIT_FAILURE; +} + +int main() { + char* input = NULL; + size_t len; + + int rgb[3]; + + printf("Zadejte barvu v RGB formatu:\n"); + + ssize_t chars_read = getline(&input, &len, stdin); + + if(chars_read == -1) { + printf("Failed to read from stdin\n"); + return EXIT_FAILURE; + } + + char* dst = input; + for(char * src = input; *src; src++) { + if(!isspace(*src)) { + *dst++ = *src; + } + } + *dst = '\0'; + + int trimmed_len = strlen(input); + if(strncmp(input, "rgb(", 4) != 0 || input[trimmed_len - 1] != ')') { + debug("%s not in rgb(xxx) format", input); + return invalid_input(); + } + + input[trimmed_len - 1] = '\0'; + char* slice = input + 4; + + char* token = strtok(slice, ","); + + for(int i = 0; i < 3; i++) { + if(token == NULL) { + debug("Too few numbers"); + return invalid_input(); + } + if(!is_numeric(token)) { + debug("%s is not a number", token); + return invalid_input(); + } + + int parsed = atoi(token); + + if(parsed < 0 || parsed > 255) { + debug("%d out of RGB range", parsed); + return invalid_input(); + } + + rgb[i] = parsed; + token = strtok(NULL, ","); + } + + if(token != NULL) { + debug("Too many numbers"); + return invalid_input(); + } + + printf("#%02X%02X%02X\n", rgb[0], rgb[1], rgb[2]); + return EXIT_SUCCESS; +}