Mercurial > repo
comparison interps/egobf/src/bfi.c @ 996:859f9b4339e6
<Gregor> tar xf egobot.tar.xz
author | HackBot |
---|---|
date | Sun, 09 Dec 2012 19:30:08 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
995:6883f5911eb7 | 996:859f9b4339e6 |
---|---|
1 /* | |
2 * Copyright (c) 2005 Gregor Richards | |
3 * | |
4 * This file is part of egobfi. | |
5 * | |
6 * egobfi is free software; you can redistribute it and/or modify | |
7 * it under the terms of the GNU General Public License as published by | |
8 * the Free Software Foundation; either version 2 of the License, or | |
9 * (at your option) any later version. | |
10 * | |
11 * egobfi is distributed in the hope that it will be useful, | |
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 * GNU General Public License for more details. | |
15 * | |
16 * You should have received a copy of the GNU General Public License | |
17 * along with egobfi; if not, write to the Free Software | |
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | |
19 */ | |
20 | |
21 #include "../config.h" | |
22 | |
23 #include <errno.h> | |
24 #include <stdio.h> | |
25 #include <stdlib.h> | |
26 #include <string.h> | |
27 | |
28 #ifdef HAVE_WCHAR_H | |
29 #include <wchar.h> | |
30 #endif | |
31 | |
32 #include "bfi.h" | |
33 #include "egobfi.h" | |
34 | |
35 void bf_interpret() | |
36 { | |
37 int input, cur, iseof; | |
38 struct bfi *bfic; | |
39 | |
40 while (prog[pptr].cmd != FIN) { | |
41 /*printf("%d\n", pptr);*/ | |
42 bfic = prog + pptr; | |
43 switch (bfic->cmd) { | |
44 case ADD: | |
45 *mptr += bfic->arg1; | |
46 pptr++; | |
47 break; | |
48 | |
49 case RHT: | |
50 mptr += bfic->arg1; | |
51 CHKMSZ(mptr) | |
52 pptr++; | |
53 break; | |
54 | |
55 case LPO: | |
56 if (*mptr) { | |
57 /* if it's true, go into the loop */ | |
58 pptr++; | |
59 } else { | |
60 /* if it's false, jump to the end */ | |
61 pptr = bfic->arg1 + 1; | |
62 } | |
63 break; | |
64 | |
65 case LPC: | |
66 /* just jump to the beginning */ | |
67 pptr = bfic->arg1; | |
68 break; | |
69 | |
70 case OUT: | |
71 /* output a character */ | |
72 #ifdef HAVE_WCHAR_H | |
73 if (unicode) { | |
74 putwchar(*mptr); | |
75 } else { | |
76 putchar(*mptr); | |
77 } | |
78 #else | |
79 putchar(*mptr); | |
80 #endif | |
81 | |
82 fflush(stdout); | |
83 pptr++; | |
84 break; | |
85 | |
86 case INP: | |
87 /* input a character */ | |
88 iseof = 0; | |
89 #ifdef HAVE_WCHAR_H | |
90 if (unicode) { | |
91 input = (int) getwchar(); | |
92 iseof = (input == (int) WEOF); | |
93 } else { | |
94 input = getchar(); | |
95 iseof = (input == EOF); | |
96 } | |
97 #else | |
98 input = getchar(); | |
99 iseof = (input == EOF); | |
100 #endif | |
101 | |
102 if (iseof) { | |
103 switch (eof) { | |
104 case 0: | |
105 *mptr = 0; | |
106 break; | |
107 | |
108 case -1: | |
109 *mptr = -1; | |
110 break; | |
111 } | |
112 } else { | |
113 *mptr = input; | |
114 } | |
115 pptr++; | |
116 break; | |
117 | |
118 case DBG: | |
119 pptr++; | |
120 if (debug) { | |
121 cur = mptr - mem - 10; | |
122 if (cur < 0) cur = 0; | |
123 printf("%d:", cur); | |
124 for (; cur < mptr - mem + 40; cur++) { | |
125 if (cur == mptr - mem) putchar('*'); | |
126 CHKMSZ(mem + cur) | |
127 printf("%d|", (int) mem[cur]); | |
128 } | |
129 putchar('\n'); | |
130 } | |
131 break; | |
132 | |
133 /* INTERNAL COMMANDS */ | |
134 case ZRO: | |
135 *mptr = 0; | |
136 pptr++; | |
137 break; | |
138 | |
139 case ADDTO: | |
140 CHKMSZ(mptr + bfic->arg1) | |
141 mptr[bfic->arg1] += bfic->arg2 * *mptr; | |
142 *mptr = 0; | |
143 pptr++; | |
144 break; | |
145 | |
146 default: | |
147 pptr++; | |
148 } | |
149 } | |
150 } | |
151 |