#include #include #include #ifndef unix #include #endif #include #include "lib.h" #include "lib.c" struct { int x; int y; char format[MAXFORMAT+1]; int duljinad; char tekst[MAXFORMAT+1]; } maska[MAXPOLJA]; int npolja = 0, ukupno = 0; char zapis[MAXBUF+1]; void prikazi (void) { int i, poz; int varint; long varlong; float varfloat; double vardouble; char polje[MAXFORMAT]; // sscanf ("97.", "%lf", &vardouble); clear (); for (i = 0, poz = 0; i < npolja; i++) { /* ne moze zbog call by value! printf (maska[i].format, &zapis[poz]); */ if (strstr (maska[i].format, "ld")) { memcpy (&varlong, &zapis[poz], sizeof (long)); sprintf (polje, maska[i].format, varlong); } else if (strstr (maska[i].format, "d")) { memcpy (&varint, &zapis[poz], sizeof (int)); sprintf (polje, maska[i].format, varint); } else if (strstr (maska[i].format, "lf")) { memcpy (&vardouble, &zapis[poz], sizeof (double)); sprintf (polje, maska[i].format, vardouble); } else if (strstr (maska[i].format, "f")) { memcpy (&varfloat, &zapis[poz], sizeof (float)); sprintf (polje, maska[i].format, varfloat); } else { sprintf (polje, maska[i].format, &zapis[poz]); } move (maska[i].x, maska[i].y); addstr (maska[i].tekst); addstr (" "); addstr (polje); poz += maska[i].duljinad; } refresh (); } void main (int argc, char *argv[]) { FILE *fi; int c; // sscanf ("1.", "%lf", &vardouble); if (argc != 3) fatal ("Neispravan broj argumenata!\n"); if ((fi = fopen (argv[2], "r")) == NULL) fatal ("Ne mogu otvoriti datoteku s opisom maske \"%s\"\n", argv[2]); while (npolja < MAXPOLJA && fscanf (fi, "%d %d %s %d %80[^\n]", &maska[npolja].x, &maska[npolja].y, maska[npolja].format, &maska[npolja].duljinad, maska[npolja].tekst) == 5) { translate (maska[npolja].format, "\\n", "\n"); ukupno += maska[npolja].duljinad; npolja++; } fclose (fi); if ((fi = fopen (argv[1], "r")) == NULL) fatal ("Ne mogu otvoriti ulaznu datoteku \"%s\"\n", argv[1]); initcurses (); while (1) { if (fread (zapis, ukupno, 1, fi) == 1) { prikazi (); } c = getch (); #ifndef unix if (c == 0 ) c = 255+getch (); #endif tracex ("%x\n", c); switch (c) { case KEY_ESCAPE: endcurses (); fclose (fi); exit (1); case KEY_NPAGE: break; case KEY_PPAGE: if (ftell (fi) - 2l * ukupno >= 0) /* BC ode u negativno!!! */ fseek (fi, -2l * ukupno, SEEK_CUR); else fseek (fi, 0l, SEEK_SET); tracex ("pos=%ld\n", ftell (fi)); break; } } }