-
Notifications
You must be signed in to change notification settings - Fork 0
/
btoc.c
81 lines (71 loc) · 1.76 KB
/
btoc.c
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
#include <stdio.h>
const char *head = "#include <stdio.h>\n"
"static char array[30000]={0};"
"static char *p=array;"
"char inp;"
"int main(void){";
int unmatched (char c, char *prog)
{
fprintf(stderr, "\nError: unmatched '%c' in %s\n", c, prog);
return 1;
}
int main (int argc, char *argv[])
{
const char *m;
unsigned int depth;
FILE *fp;
char c;
if (argc == 2) {
if ((fp = fopen(argv[1], "r")) == NULL) {
printf("Error: can't read file %s\n", argv[1]);
return 1;
}
} else if (argc == 1) {
fp = stdin;
} else {
printf("Usage: %s <brainfuck_source_file>\n", argv[0]);
return 1;
}
depth = 0;
printf("%s", head);
while((c = fgetc(fp)) != EOF) {
switch (c) {
case '.':
m = "putchar(*p);";
break;
case ',':
m = "inp=getchar();if(inp>0)*p=inp;";
break;
case '[':
m = "while(*p){";
++depth;
break;
case ']':
if (depth == 0)
return unmatched(']', argv[1]);
m = "}";
--depth;
break;
case '>':
m = "++p;";
break;
case '<':
m = "--p;";
break;
case '+':
m = "++*p;";
break;
case '-':
m = "--*p;";
break;
default:
continue;
}
printf("%s", m);
}
fclose(fp);
if (depth != 0)
return unmatched('[', argv[1]);
printf("return 0;}\n");
return 0;
}