Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. /*
  2.  * Console example in C--
  3. */
  4.  
  5. #define MEMSIZE 4096*10
  6.  
  7. #include "../lib/obj/console.h"
  8.  
  9. #define bufferSize 10000;
  10. #define memoryBrainfuck 30000
  11. #define memoryByteBF 1
  12. #define stackBrainFuck 4*1024
  13.  
  14. dword buffer = 0;
  15. word bufferSymbol = 0;
  16. dword memory = 0;
  17. dword stack = 0;
  18.  
  19. void evalBrainFuckCode(dword code)
  20. {
  21.         byte cmd = 0;
  22.         dword offsetMemory = 0;
  23.         dword countStack = 0;
  24.         dword countOffset = memoryBrainfuck / 2 / memoryByteBF;
  25.         offsetMemory = memory;
  26.         countStack = stack;
  27.        
  28.         // clear memory
  29.         EBX = memoryBrainfuck;
  30.         offsetMemory = memory;
  31.         WHILE(EBX)
  32.         {
  33.                 EBX--;
  34.                 DSBYTE[offsetMemory] = 0;
  35.                 offsetMemory++;
  36.         }
  37.         //--------
  38.        
  39.         offsetMemory = memory + countOffset;
  40.        
  41.         con_printf stdcall ("Output BrainF*ck:\r\n");
  42.        
  43.         while(1)
  44.         {
  45.                 cmd = DSBYTE[code];
  46.                 switch(cmd)
  47.                 {
  48.                         case '+':
  49.                                 DSBYTE[offsetMemory]++;
  50.                         break;
  51.                         case '-':
  52.                                 DSBYTE[offsetMemory]--;
  53.                         break;
  54.                         case '[':
  55.                                 DSDWORD[countStack] = code;
  56.                                 countStack += 4;
  57.                         break;
  58.                         case ']':
  59.                                 IF (DSBYTE[offsetMemory]) code = DSDWORD[countStack - 4];
  60.                                 ELSE countStack -= 4;
  61.                         break;
  62.                         case ',':
  63.                                 con_getch stdcall();
  64.                                 DSBYTE[offsetMemory] = AL;
  65.                         break;
  66.                         case '.':
  67.                                 DSBYTE[#bufferSymbol] = DSBYTE[offsetMemory];
  68.                                 con_printf stdcall (#bufferSymbol);
  69.                         break;
  70.                         case '>':
  71.                                 offsetMemory++;
  72.                         break;
  73.                         case '<':
  74.                                 offsetMemory--;
  75.                         break;
  76.                         default:
  77.                                 con_printf stdcall ("\r\n");
  78.                                 //ExitProcess();
  79.                                 return;
  80.                         break;
  81.                 }
  82.                 code++;
  83.         }
  84. }
  85.  
  86. void main()
  87. {
  88.         dword brainFuckCode = 0;
  89.        
  90.         buffer = malloc(bufferSize);
  91.         memory = malloc(memoryBrainfuck);
  92.         stack = malloc(stackBrainFuck);
  93.        
  94.         load_dll(libConsole, #con_init, 0);
  95.         con_init stdcall (-1, -1, -1, -1, "BrainF*ck interpreter");
  96.         //con_set_flags stdcall (0x1F);
  97.         con_printf stdcall ("BrainF*ck interpreter v1.0\r\n");
  98.         loop()
  99.         {
  100.                 con_printf stdcall ("\r\nEnter BrainF*ck code:\r\n");
  101.                 //con_write_string stdcall ("\r\n", 2);
  102.                 con_gets stdcall(buffer, bufferSize);
  103.                 //con_printf stdcall (EAX);
  104.                 evalBrainFuckCode(EAX);
  105.         }
  106.         con_exit stdcall (0);
  107.         ExitProcess();
  108. }
  109.  
  110.