Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* CBF (Coed Brainfuck) Interpreter */
- #load "io.h2"
- #load "lib.h2"
- #load "ntl.h2"
- #load "str.h2"
- #load "stat.h2"
- #define ASCII 255
- #define BYTE 5000
- #define RDNLY "-r"
- struct Pointer
- {
- array = [null];
- loops = [];
- ptr = 0;
- };
- struct File
- {
- descriptor = 0;
- plength = 0;
- string = "";
- };
- function create_pointer();
- function starting_file(file_name);
- function increase(*ptr);
- function decrease(*ptr);
- function start_loop(*loop, counter);
- function end_loop(*pointer, *counter);
- function main(argc, argv)
- {
- pointer = create_pointer();
- if (!argv[1])
- {
- fprintf(stderr, "Usage: % <file name>\n", argv[0]);
- exit(1);
- }
- if (!strfind(argv[1], /.+\.bf/))
- {
- fprintf(stderr, "Cannot read file %\n", argv[1]);
- exit(1);
- }
- file = starting_file(argv[1]);
- for (i = 0; i < file.plength; i++)
- {
- switch (file.string[i])
- {
- case '<':
- decrease(&pointer.ptr, BYTE);
- break;
- case '>':
- increase(&pointer.ptr, BYTE);
- break;
- case '+':
- increase(&pointer.array[pointer.ptr], ARRAY);
- break;
- case '-':
- decrease(&pointer.array[pointer.ptr], ARRAY);
- break;
- case '.':
- putchar(pointer.array[pointer.ptr]);
- break;
- case ',':
- pointer.array[pointer.ptr] = getchar();
- break;
- case '[':
- start_loop(&pointer.loops, i);
- break;
- case ']':
- end_loop(&pointer, &i);
- break;
- }
- }
- close(file.descriptor);
- return 0;
- }
- function create_pointer()
- {
- pointer = Pointer;
- for (i = 0; i < BYTE; i++)
- {
- pointer.array[i] = 0;
- }
- return pointer;
- }
- function starting_file(file_name)
- {
- file = File;
- if ((file.descriptor = open(file_name, RDNLY)) < 0)
- {
- fprintf(stderr, "File % doesn't exist\n", file_name);
- exit(1);
- }
- file.string = read(file.descriptor);
- file.plength = length(file.string);
- return file;
- }
- function increase(*ptr, limit)
- {
- if (*ptr == limit)
- {
- *ptr = 0;
- }
- else
- {
- ++(*ptr);
- }
- }
- function decrease(*ptr, limit)
- {
- if (!*ptr)
- {
- *ptr = limit;
- }
- else
- {
- --(*ptr);
- }
- }
- function start_loop(*loop, counter)
- {
- push(*loop, counter);
- }
- function end_loop(*pointer, *counter)
- {
- if (*pointer->array[*pointer->ptr])
- {
- pop(*pointer->loops);
- }
- else
- {
- *counter = *pointer->loops[length(*pointer->loops) - 1];
- }
- }
Add Comment
Please, Sign In to add comment