PageRenderTime 40ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/BF/bfi_old_no_time.c

http://dlemos-src.googlecode.com/
C | 139 lines | 103 code | 15 blank | 21 comment | 19 complexity | 039777118a6741598e9f99b7382edb00 MD5 | raw file
  1. /* BrainFuck machine whith jumps, and repetitions assigned by a number */
  2. #include <stdio.h>
  3. #include <sys/stat.h>
  4. //#include <time.h>
  5. #define STACK_LEVEL 32
  6. /* 32768b = 32kb */
  7. #define MEM_SIZE 32768
  8. typedef unsigned char byte;
  9. typedef unsigned int uint;
  10. byte *loadfile(char *name);
  11. byte *alloc_mem(uint size);
  12. int main(int argc, char *argv[])
  13. {
  14. /* program vars */
  15. byte *m; /* Brain'sFuck Memory */
  16. uint p=0; /* Brain'sFuck Memory pointer */
  17. uint i=0, c, times = 1;
  18. uint stack[STACK_LEVEL];
  19. uint stack_l=0;
  20. //clock_t start, end;
  21. int ext = 0;
  22. /* BF vars */
  23. byte *mem;
  24. uint pos=0;
  25. if(argc == 3){
  26. if(argv[1][0] == '-'){
  27. if(argv[1][1] == 'e') ext = 1;
  28. else{
  29. printf("invalid argument %s\n", argv[1]);
  30. exit(1);
  31. }
  32. }
  33. else{
  34. printf("try: %s -e file\n", argv[0]);
  35. exit(1);
  36. }
  37. }
  38. if(argc <= 3){
  39. if(ext == 1) m = loadfile(argv[2]);
  40. else m = loadfile(argv[1]);
  41. }
  42. else{
  43. printf("try: %s [-e] file\n", argv[0]);
  44. exit(1);
  45. }
  46. mem = alloc_mem(MEM_SIZE);
  47. //start = clock();
  48. while(m[p]){
  49. /* if(ext == 1)
  50. if(m[p] >= '0' && m[p] <= '9'){
  51. if(!(m[p+1] >= '0' && m[p+1] <= '9')){
  52. times = m[p] - '0';
  53. p++;
  54. }
  55. }
  56. else times = 1;
  57. for(c=0; c < times; c++){
  58. */ switch(m[p]){
  59. case '+': mem[pos]++; break;
  60. case '-': mem[pos]--; break;
  61. case '<': pos--; break;
  62. case '>': pos++; break;
  63. case '[':
  64. i=0;
  65. if(!mem[pos])
  66. while(m[++p] != ']' || i)
  67. switch(m[p]){
  68. case '[': i++; break;
  69. case ']': i--; break;
  70. }
  71. else{
  72. stack_l++;
  73. stack[stack_l]=p;
  74. }
  75. break;
  76. case ']':
  77. if(stack_l > 0){
  78. p = stack[stack_l]-1;
  79. stack_l--;
  80. }
  81. else{
  82. printf("Erro\n");
  83. exit(1);
  84. }
  85. break;
  86. case '.': putchar(mem[pos]); break;
  87. case ',': mem[pos] = getchar(); break;
  88. }
  89. // }
  90. p++;
  91. // times = 1;
  92. }
  93. //end = clock();
  94. //printf("\nThe program takes %2.2f seconds\n", ((float)end - start) / CLK_TCK);
  95. return(0);
  96. }
  97. byte *loadfile(char *name)
  98. {
  99. FILE *file;
  100. struct stat stats;
  101. char *loaded_file;
  102. if((file = fopen(name, "rb")) == NULL){
  103. printf("can't open: %s", name);
  104. exit(1);
  105. }
  106. fstat(fileno(file), &stats);
  107. loaded_file = alloc_mem(stats.st_size+4);
  108. if(fread(loaded_file, sizeof(byte) , sizeof(byte) * (int) stats.st_size, file) != stats.st_size){
  109. printf("erro loading file\n");
  110. exit(1);
  111. }
  112. // loaded_file[stats.st_size] = 0x0; // too mutch care
  113. return(loaded_file);
  114. }
  115. byte *alloc_mem(uint size)
  116. {
  117. char *ptr;
  118. ptr = (void*) calloc(size, sizeof(byte));
  119. if(!ptr){
  120. printf("Fail Allocking %ibytes\n", size);
  121. exit(1);
  122. }
  123. return(ptr);
  124. }