You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
68 lines
1.6 KiB
68 lines
1.6 KiB
#include <unistd.h>
|
|
|
|
#define STDIN 0
|
|
#define STDERR 2
|
|
|
|
char data[9999];
|
|
char *bracketPositions[99];
|
|
char *instructionPointer = data;
|
|
char *dataPointer = data + 5000;
|
|
char **currentBracket = bracketPositions;
|
|
char bracketFlag;
|
|
char command;
|
|
|
|
int main() {
|
|
read(STDIN, instructionPointer, 4000);
|
|
|
|
command = *instructionPointer;
|
|
|
|
while (command != 0) {
|
|
if (command == ']') {
|
|
if (bracketFlag <= 1) {
|
|
if (*dataPointer != 0) {
|
|
instructionPointer = *currentBracket;
|
|
} else {
|
|
currentBracket--;
|
|
}
|
|
}
|
|
if (bracketFlag != 0) {
|
|
bracketFlag--;
|
|
}
|
|
}
|
|
|
|
if (command == '[') {
|
|
bracketFlag++;
|
|
if (bracketFlag == 1) {
|
|
currentBracket++;
|
|
*currentBracket = instructionPointer;
|
|
}
|
|
}
|
|
|
|
if (bracketFlag == 0) {
|
|
switch (command) {
|
|
case '+':
|
|
*dataPointer += 1;
|
|
break;
|
|
case '-':
|
|
*dataPointer -= 1;
|
|
break;
|
|
case '>':
|
|
dataPointer += 1;
|
|
break;
|
|
case '<':
|
|
dataPointer -= 1;
|
|
break;
|
|
case '.':
|
|
write(STDERR, dataPointer, 1);
|
|
break;
|
|
case ',':
|
|
read(STDERR, dataPointer, 1);
|
|
break;
|
|
}
|
|
}
|
|
|
|
instructionPointer++;
|
|
command = *instructionPointer;
|
|
}
|
|
}
|