summaryrefslogtreecommitdiffstats
path: root/šola/p2/dn/DN02b_63230317.c
blob: ebaa36438f11b6f83ae0fd148f9dba6c847c9e1b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include <stdio.h>
#include <stdbool.h>
#define ČAKAM 1
#define PRVI 0
#define NIČLA 2
#define ŠTEVILKE 3
#define OCTAL 4
#define HEX1 5
#define BIN1 6
#define HEX 7
#define BIN 8
int main (void) {
	int stanje = PRVI;
	int znak = 0;
	while (true) {
		znak = getchar();
		if (stanje == HEX || stanje == BIN || stanje == ŠTEVILKE || stanje == NIČLA) { // term za * stanja
			if (znak == EOF || znak == '\n')
				goto pravilno_in_konec;
			if (znak == ' ')
				goto pravilno;
		}
		switch (stanje) {
			case ČAKAM:
				if (znak == EOF || znak == '\n')
					goto konec;
				if (znak == ' ') {
					stanje = PRVI;
					continue;
				}
				continue;
			case PRVI:
				if (znak == '0') {
					stanje = NIČLA;
					continue;
				}
				if (znak <= '9' && znak >= '1') {
					stanje = ŠTEVILKE;
					continue;
				}
				goto napaka;
			case NIČLA:
				if (znak <= '7' && znak >= '0') {
					stanje = OCTAL;
					continue;
				}
				if (znak == 'x') {
					stanje = HEX1;
					continue;
				}
				if (znak == 'b') {
					stanje = BIN1;
					continue;
				}
				goto napaka;
			case OCTAL:
				if (znak <= '7' && znak >= '0')
					continue;
				goto napaka;
			case HEX1:
				if ((znak <= '9' && znak >= '0') || (znak <= 'F' && znak >= 'A')) {
					stanje = HEX;
					continue;
				}
				goto napaka;
			case HEX:
				if ((znak <= '9' && znak >= '0') || (znak <= 'F' && znak >= 'A'))
					continue;
				goto napaka;
			case BIN1:
				if (znak == '0' || znak == '1') {
					stanje = BIN;
					continue;
				}
				goto napaka;
			case BIN:
				if (znak == '0' || znak == '1')
					continue;
				goto napaka;
			case ŠTEVILKE:
				if (znak <= '9' && znak >= '0')
					continue;
				goto napaka;
		}
		continue;
		pravilno:
		putchar('1');
		goto terminator_check;
		napaka:
		putchar('0');
		terminator_check:
		stanje = ČAKAM;
		if (znak == ' ')
			stanje = PRVI;
		if (znak == '\n')
			goto konec;
		continue;
		pravilno_in_konec:
		putchar('1');
		konec:
		putchar('\n');
		return 0;
	}
	return 1;
}