Az alábbi letöltési lehetőségek közül választhatsz: (
segítség)
Típus: text/plain
Tartalmaz szöveget
Karakterkódolás: us-ascii
Méret: 2 KB
#include <stdio.h>
#include <conio.h>
typedef unsigned char byte;
#define CodeSize 65536
#define DataSize 30000
byte Code[CodeSize], Data[DataSize];
bool Read (const char *);
void Init (void);
bool Run (void);
void PrintCode (void);
void PrintData (void);
int main (int AN, char * Args []) {
if (AN < 1)
return 1;
if (!Read(Args[1]))
return 1;
Init();
Run();
scanf("\n");
return 0;
}
bool Read (const char * FN) {
FILE * F = fopen(FN, "r");
char X[9] = "<>+-.,[]", C;
int I, N = 0;
if (!F)
return false;
while (!feof(F)) {
C = getc(F);
for (I = 0; I < 8; I++)
if (X[I] == C)
break;
if (I < 8)
Code[N++] = C;
}
Code[N] = 0;
fclose(F);
return true;
}
void Init (void) {
for (int I = 0; I < DataSize; I++)
Data[I] = 0;
}
bool Run (void) {
int DP = 0, CP = 0, Bracket;
while (Code[CP]) {
switch (Code[CP++]) {
case '>':
DP++;
if (DP >= DataSize) {
printf("Run-time error #1: pointer overflow.\n");
return false;
}
break;
case '<':
DP--;
if (DP < 0) {
printf("Run-time error #2: pointer underflow.\n");
return false;
}
break;
case '+':
Data[DP]++;
break;
case '-':
Data[DP]--;
break;
case '.':
putc(Data[DP], stdout);
break;
case ',':
Data[DP] = getch();
break;
case '[':
if (Data[DP])
break;
Bracket = 1;
while (Code[CP]) {
if (Code[CP] == '[')
Bracket++;
if (Code[CP] == ']') {
Bracket--;
if (Bracket == 0) {
CP++;
break;
}
}
CP++;
}
if (Bracket)
printf("Run-time error #3: opening bracket '[' found without closing bracket ']'.");
break;
case ']':
while (CP > 0) {
Bracket = 1;
if (Code[CP] == ']')
Bracket++;
if (Code[CP] == '[') {
Bracket--;
if (Bracket == 0)
break;
}
CP--;
}
if (Bracket)
printf("Run-time error #4: closing bracket '[' found without opening bracket ']'.");
break;
}
}
return true;
}
void PrintCode (void) {
for (int I = 0; Code[I]; I++)
printf("%c", Code[I]);
printf("\n");
}
void PrintData (int N = DataSize) {
for (int I = 0; I < N; I++)
printf("%c", Data[I]);
printf("\n");
}