You cannot 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
2.6 KiB
C

#define STDIN 0
#define STDERR 2
// set upper limit of all data values to be 255
char data[9999];
char *bracketPositions[99];
char *instructionPointer = data;
char *dataPointer = data + 5000;
char **currentBracket = bracketPositions;
char bracketFlag;
char command;
int main() {
// For each character read from STDIN
for (
// Read up to 4000 commands into the first 400 slots of data
read(STDIN, instructionPointer, 4000);
// Set command to the value at instructionPointer for every loop and
// check that command is not 0, else end the loop
(command = *instructionPointer);
// Increment instructionPointer on every loop
instructionPointer++
) {
// if command == ']',
command - ']' || (
// if bracketFlag <= 1,
bracketFlag > 1 ||
// if value at dataPointer is not zero,
(instructionPointer = *dataPointer
// set instructionPointer to value at pointer currentBracket
? *currentBracket
// else, decrement currentBracket (and keep
// instructionPointer as instructionPointer)
: (--currentBracket, instructionPointer)
),
// if bracketFlag is not 0, decrement bracketFlag
!bracketFlag || bracketFlag--
),
// if command == '[',
command - '[' ||
// increment bracketFlag. if bracketFlag pre-increment is zero,
bracketFlag++ ||
// increment currentBracket and set value at currentBracket to
// the instructionPointer
(*++currentBracket = instructionPointer),
// if bracketFlag is zero,
bracketFlag || (
// Because value at dataPointer is a char, value will wrap around if
// it reaches below 0 or above 255
// Increment value at dataPointer if command is '+'
*dataPointer += command == '+',
// Decrement value at dataPointer if command is '-'
*dataPointer -= command == '-',
// Increment dataPointer if command is '>'
dataPointer += command == '>',
// Decrement dataPointer if command is '<'
dataPointer -= command == '<',
// If command is '.', write 1 command at datapointer to STDERR
command - '.' || write(STDERR, dataPointer, 1),
// If command is ',', read 1 command to datapointer from STDERR
command - ',' || read(STDERR, dataPointer, 1)
);
}
}