December SPECIAL! For a limited time only. Get 20% discount on a LIFETIME PRO account!Want more features on Pastebin? Sign Up, it's FREE!
tweet
Guest

brainfuck.c

By: a guest on Sep 12th, 2015  |  syntax: C  |  size: 2.84 KB  |  views: 86  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print  |  QR code  |  clone
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define BLOCK 64
  5.  
  6. char* readFile(char *name) {
  7.     int  index  = 0;
  8.     int  blocks = 1;
  9.     char *data  = malloc(blocks * BLOCK);
  10.     FILE *f     = fopen(name, "r");
  11.  
  12.     for(;(data[index] = fgetc(f)) != EOF; index++)
  13.         if(index == blocks * BLOCK) data = realloc(data, ++blocks * BLOCK);
  14.  
  15.     fclose(f);
  16.     data[index] = 0;
  17.     return data;
  18. }
  19.  
  20. char *seekBracket(char target, char opposite, char *begin, char *ptr,
  21.                   char *(*movePtr)(char*)) {
  22.     int count = 1;
  23.     ptr = (*movePtr)(ptr);
  24.     for(;count && ptr > begin; ptr = (*movePtr)(ptr)) {
  25.         if(*ptr == EOF) {
  26.             ptr--;
  27.             break;
  28.         }
  29.         else if (*ptr == target) count--;
  30.         else if (*ptr == opposite) count++;
  31.     }
  32.     return ptr;
  33. }
  34.  
  35. char *inc(char *ptr) {
  36.     return ++ptr;
  37. }
  38.  
  39. char *dec(char *ptr) {
  40.     return --ptr;
  41. }
  42.  
  43. int main(int argc, char **argv) {
  44.     for (int i = 1; i < argc; i++) {
  45.         char   *code    = readFile(argv[i]);
  46.         char   *codePtr = code;
  47.         size_t blocks   = 1;
  48.         char   *data    = malloc(BLOCK);
  49.         char   *dataPtr = data;
  50.  
  51.         for(int j = 0; j < BLOCK; j++) {
  52.             dataPtr[j] = 0;
  53.         }
  54.  
  55.         for(;*codePtr != EOF; codePtr++) {
  56.             switch(*codePtr) {
  57.                 case '+':
  58.                     (*dataPtr)++;
  59.                     break;
  60.                 case '-':
  61.                     (*dataPtr)--;
  62.                     break;
  63.                 case '.':
  64.                     printf("%c", *dataPtr);
  65.                     break;
  66.                 case ',':
  67.                     *dataPtr = getchar();
  68.                     break;
  69.                 case '<':
  70.                     dataPtr--;
  71.                     if(dataPtr < data) {
  72.                         printf("Error: Pointer moved outside of byte array!\n");
  73.                         goto end;
  74.                     }
  75.                     break;
  76.                 case '>':
  77.                     dataPtr++;
  78.                     if(dataPtr == data + blocks * BLOCK) {
  79.                         data = realloc(data, ++blocks * BLOCK);
  80.                         dataPtr = data + (blocks - 1) * BLOCK;
  81.  
  82.                         for(int j = 0; j < BLOCK; j++) {
  83.                             dataPtr[j] = 0;
  84.                         }
  85.                     }
  86.                     break;
  87.                 case '[':
  88.                     if(!*dataPtr)
  89.                         codePtr = seekBracket(']', '[', code, codePtr, inc);
  90.                     break;
  91.                 case ']':
  92.                     if(*dataPtr)
  93.                         codePtr = seekBracket('[', ']', code, codePtr, dec);
  94.                     break;
  95.                 case 0:
  96.                     goto end;
  97.             }
  98.         }
  99.  
  100. end:    free(code);
  101.         free(data);
  102.         printf("\n");
  103.     }
  104. }
clone this paste RAW Paste Data
Top