X-Git-Url: https://git.bzium.org/embe/choinka.git/blobdiff_plain/abbd11b06b1428651fb054661ec2475632701037..HEAD:/choinka.c diff --git a/choinka.c b/choinka.c index c02dc72..4865cff 100644 --- a/choinka.c +++ b/choinka.c @@ -1,10 +1,14 @@ +#include +#include #include #include #include #include +#include #define A_POGRUBIONY (1 << 0) +#define KOLOR_BRAK -1 #define KOLOR_CZARNY 0 #define KOLOR_CZERWONY 1 #define KOLOR_ZIELONY 2 @@ -29,6 +33,7 @@ static atrybut const bombki[] = { }; static int const ile_b = sizeof bombki / sizeof *bombki; +static atrybut const spacja = {0, KOLOR_BRAK}; static atrybut const choinka = {0, KOLOR_ZIELONY}; static atrybut const podstawa = {0, KOLOR_BRAZOWY}; static atrybut const podpis = {A_POGRUBIONY, KOLOR_CZERWONY}; @@ -36,16 +41,16 @@ static atrybut const gwiazdka = {A_POGRUBIONY, KOLOR_BRAZOWY}; static void inicjuj_rng() { - unsigned ziarno = 0; - FILE* f = fopen("/dev/urandom", "rb"); - if (f != NULL) { - unsigned nowe_ziarno; - if (fread(&nowe_ziarno, sizeof nowe_ziarno, 1, f) == 1) { - ziarno = nowe_ziarno; + bool ok = false; + unsigned ziarno; + int f = open("/dev/urandom", O_RDONLY); + if (f != -1) { + if (read(f, &ziarno, sizeof ziarno) == sizeof ziarno) { + ok = true; } - fclose(f); + close(f); } - if (ziarno == 0) { + if (!ok) { ziarno = time(NULL); } srand(ziarno); @@ -71,11 +76,14 @@ static void ustaw(atrybut const* attr) if ((attr->attr & A_POGRUBIONY) != 0) { putp(enter_bold_mode); } - putp(tparm(set_a_foreground, attr->kolor)); + if (attr->kolor != KOLOR_BRAK) { + putp(tparm(set_a_foreground, attr->kolor)); + } } int main() { + setvbuf(stdout, NULL, _IOFBF, BUFSIZ); inicjuj_rng(); setupterm(NULL, 1, NULL); atrybut const* kolor = &choinka; @@ -86,6 +94,7 @@ int main() if (c >= 'a' && c <= 'z') akt = &podpis; if (c == '.') akt = &bombki[rand() % ile_b]; if (c == '*') akt = &gwiazdka; + if (c == ' ' || c == '\n') akt = &spacja; if (c == ']') kolor = &choinka; ustaw(akt); putchar(c);