+#include <fcntl.h>
+#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <term.h>
#include <time.h>
+#include <unistd.h>
#define A_POGRUBIONY (1 << 0)
+#define KOLOR_BRAK -1
#define KOLOR_CZARNY 0
#define KOLOR_CZERWONY 1
#define KOLOR_ZIELONY 2
};
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};
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);
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;
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);