Clusterfuck
Jump to navigation
Jump to search
- This is still a work in progress. It may be changed in the future.
Clusterfuck is a heavily added-to version of Brainfuck. This specification is not finished yet.
Language Overview
Clusterfuck uses the a predefined 2d matrix for its storage array - the array has a predefined finite size and either wraps or does not wrap (depending on settings). Each cell is a byte long and either wraps or does not wrap depending on settings.
| Command | Description |
|---|---|
>
|
Move the pointer to the right |
<
|
Move the pointer to the left |
v
|
Move the pointer down |
^
|
Move the pointer up |
+
|
Increment the memory cell under the pointer |
-
|
Decrement the memory cell under the pointer |
.
|
Output the character signified by the cell under the pointer |
,
|
Input a character and store it in the cell under the pointer |
[
|
Jump past the matching ] if the cell under the pointer is 0
|
]
|
Jump back to the matching [ if the cell under the first pointer is not 0
|
{
|
Jump past the matching { if the cell under the pointer is not 0
|
}
|
Jump back to the matching } if the cell under the first pointer is 0
|
Implementation Notes
- Newlines are *always* \x10
- The data matrix must be at least 256 by 256 but can be larger.
- Each cell must range from 0 to 255 (an unsigned byte)
Current (Unfinished) Implementation
#include <stdio.h>
#include
#define MAXCODESIZE 65536
#define COLS 65536
#define ROWS 256
#define CP ( cp + ( COLS * rp ) )
int data[ROWS * COLS], cp, rp;
char code[MAXCODESIZE]; int codep, codelength;
int jmp_t[MAXCODESIZE]; // [ ] { }
int mem_t[256]; // (
int ret_t[256], retp; // )
void loadprogram(char *filename)
{
FILE *prog;
if(!(prog = fopen(filename, "r"))) fprintf(stderr,"Can't open the file %s.\n", filename),exit(1);
codelength = fread(code, 1, MAXCODESIZE, prog);
fclose(prog);
}
void matchbrackets()
{
int stack[MAXCODESIZE];
int stackp = 0;
for(codep=0; codep<codelength; codep++)
{
switch( code[codep] ){
case '{':
case '[':
stack[stackp++]=codep; break;
case '}':
case ']':
if(stackp==0) fprintf(stderr,"Unmatched ']' at byte %d.", codep), exit(1);
else
{
--stackp;
jmp_t[codep] = stack[stackp];
jmp_t[stack[stackp]] = codep;
}
}
}
if(stackp>0) fprintf(stderr,"Unmatched '[' at byte %d.", stack[--stackp]), exit(1);
}
void execute()
{
int c;
for(codep=0;codep<codelength;codep++)
{
switch(code[codep])
{
case '+': data[CP]++; break;
case '-': data[CP]--; break;
case '<': cp--; break;
case '>': cp++; break;
case 'v': rp++; break;
case '^': rp--; break;
case ',': if((c=getchar())!=EOF) data[CP]= (c=='\n'?10:c); break;
case '.': putchar(data[CP]==10?'\n':data[CP]); break;
case '[': if(!data[CP]) codep = jmp_t[codep]; break;
case ']': if( data[CP]) codep = jmp_t[codep]; break;
case '{': if( data[CP]) codep = jmp_t[codep]; break;
case '}': if(!data[CP]) codep = jmp_t[codep]; break;
/*
// This little bit still doesnt quite work right... dunno why, recursion most likely.
case '(':
mem_t[ data[CP] ] = codep + 1;
while( code[codep] != ')' ) codep++;
break;
case ')':
codep = ret_t[ retp-- ];
break;
case '&':
ret_t[ retp++ ] = codep;
codep = mem_t[ data[CP] ];
break;
*/
}
}
}
int main(int argc, char **argv)
{
if (argc > 2) fprintf(stderr, "Too many arguments.\n"), exit(1);
if (argc < 2) fprintf(stderr, "I need a program filename.\n"), exit(1);
loadprogram(argv[1]);
matchbrackets();
execute();
exit(0);
}