Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <string.h>
- //#define DEBUG
- #define MVR '>'
- #define MVL '<'
- #define INC '+'
- #define DEC '-'
- #define OUT '.'
- #define RIN ','
- #define OLP '['
- #define CLP ']'
- char* readall(FILE* ifp);
- void clean(char* buffer);
- /*
- * The 'stack' will store data from the BF program
- * 'sp' points to current "selected" "variable"
- * The 'jumpstack' keeps track of `[` to track loops
- * 'ip' points to instruction in the program
- */
- unsigned char stack[200] = { 0 };
- int sp = 0;
- unsigned char jumpstack[50];
- int ip = 0;
- char op;
- int main(int argc, char *argv[]) {
- if ( argc != 2 ) {
- printf("Usage: %s inputfile\n", argv[0]);
- return 1;
- }
- char* fname = argv[1];
- FILE* ifp;
- char* buffer;
- /*
- * Check if file exists
- * Exit if not
- */
- if ( access( fname, F_OK ) == -1 ) {
- printf("No such file: %s\n", fname);
- return 1;
- } else if ( access( fname, R_OK ) == -1 ) {
- printf("You do not have permission to read file: %s\n", fname);
- return 1;
- }
- ifp = fopen(fname, "r");
- if ( !( buffer = readall(ifp) ) ) {
- printf("Cannot open file");
- }
- fclose(ifp);
- clean(buffer);
- #ifdef DEBUG
- printf("Contents of file:\n%s\n", buffer);
- #endif
- /*
- * Main interpreter loop
- */
- for(;;){
- /*
- * Define exit points for the interpreter
- */
- op = buffer[ip];
- if ( !op ) return 0;
- if ( sp < 0 ) {
- printf("Stackpointer was non-zero at character %d\n", ip);
- return 1;
- }
- switch ( op ) {
- case MVR:
- sp++;
- ip++;
- break;
- case MVL:
- sp--;
- ip++;
- break;
- case INC:
- stack[sp]++;
- ip++;
- break;
- case DEC:
- stack[sp]--;
- ip++;
- break;
- case OUT:
- putchar(stack[sp]);
- ip++;
- break;
- case RIN:
- break;
- case OLP:
- break;
- case CLP:
- break;
- default:
- printf("Unknown instruction: %c", op);
- return 1;
- }
- }
- free(buffer);
- return 0;
- }
- char* readall(FILE* ifp) {
- /*
- * Read stream 'ifp' to 'buffer'
- * Returns pointer to buffer, 1 on fail
- */
- char* buffer;
- fseek(ifp, 0L, SEEK_END);
- size_t fsize = ftell(ifp);
- rewind(ifp);
- buffer = malloc(fsize);
- /* Check for memory error */
- if ( buffer == NULL )
- return NULL;
- fread(buffer, 1, fsize, ifp);
- return buffer;
- }
- void clean(char* buffer) {
- /*
- * Returns stripped string
- * Used characters are: ><+-.,[]
- */
- int i, bp;
- char c;
- bp = 0;
- for ( i=0; buffer[i]; i++ ) {
- c = buffer[i];
- if ( c == MVR ||
- c == MVL ||
- c == INC ||
- c == DEC ||
- c == OUT ||
- c == RIN ||
- c == OLP ||
- c == CLP ) {
- buffer[bp] = c;
- bp += 1;
- }
- }
- buffer[bp] = 0x00;
- buffer = realloc( buffer, strlen(buffer)+1 );
- }
Add Comment
Please, Sign In to add comment