bfrb 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/.document ADDED
@@ -0,0 +1,5 @@
1
+ lib/**/*.rb
2
+ bin/*
3
+ -
4
+ features/**/*.feature
5
+ LICENSE.txt
data/Gemfile ADDED
@@ -0,0 +1,13 @@
1
+ source "http://rubygems.org"
2
+ # Add dependencies required to use your gem here.
3
+ # Example:
4
+ # gem "activesupport", ">= 2.3.5"
5
+
6
+ # Add dependencies to develop your gem here.
7
+ # Include everything needed to run rake, tests, features, etc.
8
+ group :development do
9
+ gem "shoulda", ">= 0"
10
+ gem "bundler", "~> 1.0.0"
11
+ gem "jeweler", "~> 1.5.2"
12
+ gem "rcov", ">= 0"
13
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,20 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ git (1.2.5)
5
+ jeweler (1.5.2)
6
+ bundler (~> 1.0.0)
7
+ git (>= 1.2.5)
8
+ rake
9
+ rake (0.8.7)
10
+ rcov (0.9.9)
11
+ shoulda (2.11.3)
12
+
13
+ PLATFORMS
14
+ x86-mingw32
15
+
16
+ DEPENDENCIES
17
+ bundler (~> 1.0.0)
18
+ jeweler (~> 1.5.2)
19
+ rcov
20
+ shoulda
data/README.rdoc ADDED
@@ -0,0 +1,17 @@
1
+ = bfrb
2
+
3
+ bfrb is a simple brainfuck interpreter written in Ruby.
4
+
5
+ == Usage
6
+
7
+ To install bfrb:
8
+
9
+ % gem install bfrb
10
+
11
+ After installation, you can use bfrb in two ways. First, you can pass brainfuck code directly into it, as long as it is wrapped in quotes.
12
+
13
+ % bfrb ",[.,]"
14
+
15
+ Or, you can specify a file with the -f parameter:
16
+
17
+ % bfrb -f test.bf
data/Rakefile ADDED
@@ -0,0 +1,53 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ begin
4
+ Bundler.setup(:default, :development)
5
+ rescue Bundler::BundlerError => e
6
+ $stderr.puts e.message
7
+ $stderr.puts "Run `bundle install` to install missing gems"
8
+ exit e.status_code
9
+ end
10
+ require 'rake'
11
+
12
+ require 'jeweler'
13
+ Jeweler::Tasks.new do |gem|
14
+ # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
15
+ gem.name = "bfrb"
16
+ gem.homepage = "http://github.com/ctoneal/bfrb"
17
+ gem.license = "MIT"
18
+ gem.summary = %Q{A simple brainfuck interpreter in Ruby}
19
+ gem.description = %Q{bfrb is a brainfuck interpreter written in Ruby.}
20
+ gem.email = "ctoneal@gmail.com"
21
+ gem.authors = ["Chris ONeal"]
22
+ # Include your dependencies below. Runtime dependencies are required when using your gem,
23
+ # and development dependencies are only needed for development (ie running rake tasks, tests, etc)
24
+ # gem.add_runtime_dependency 'jabber4r', '> 0.1'
25
+ # gem.add_development_dependency 'rspec', '> 1.2.3'
26
+ end
27
+ Jeweler::RubygemsDotOrgTasks.new
28
+
29
+ require 'rake/testtask'
30
+ Rake::TestTask.new(:test) do |test|
31
+ test.libs << 'lib' << 'test'
32
+ test.pattern = 'test/**/test_*.rb'
33
+ test.verbose = true
34
+ end
35
+
36
+ require 'rcov/rcovtask'
37
+ Rcov::RcovTask.new do |test|
38
+ test.libs << 'test'
39
+ test.pattern = 'test/**/test_*.rb'
40
+ test.verbose = true
41
+ end
42
+
43
+ task :default => :test
44
+
45
+ require 'rake/rdoctask'
46
+ Rake::RDocTask.new do |rdoc|
47
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
48
+
49
+ rdoc.rdoc_dir = 'rdoc'
50
+ rdoc.title = "bfrb #{version}"
51
+ rdoc.rdoc_files.include('README*')
52
+ rdoc.rdoc_files.include('lib/**/*.rb')
53
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.0
data/bfrb.gemspec ADDED
@@ -0,0 +1,66 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{bfrb}
8
+ s.version = "0.1.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Chris ONeal"]
12
+ s.date = %q{2011-06-03}
13
+ s.default_executable = %q{bfrb}
14
+ s.description = %q{bfrb is a brainfuck interpreter written in Ruby.}
15
+ s.email = %q{ctoneal@gmail.com}
16
+ s.executables = ["bfrb"]
17
+ s.extra_rdoc_files = [
18
+ "README.rdoc"
19
+ ]
20
+ s.files = [
21
+ ".document",
22
+ "Gemfile",
23
+ "Gemfile.lock",
24
+ "README.rdoc",
25
+ "Rakefile",
26
+ "VERSION",
27
+ "bfrb.gemspec",
28
+ "bin/bfrb",
29
+ "lib/bfrb.rb",
30
+ "lib/bfrb/interpreter.rb",
31
+ "lib/bfrb/memory.rb",
32
+ "test/helper.rb",
33
+ "test/test_bfrb.rb"
34
+ ]
35
+ s.homepage = %q{http://github.com/ctoneal/bfrb}
36
+ s.licenses = ["MIT"]
37
+ s.require_paths = ["lib"]
38
+ s.rubygems_version = %q{1.6.2}
39
+ s.summary = %q{A simple brainfuck interpreter in Ruby}
40
+ s.test_files = [
41
+ "test/helper.rb",
42
+ "test/test_bfrb.rb"
43
+ ]
44
+
45
+ if s.respond_to? :specification_version then
46
+ s.specification_version = 3
47
+
48
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
49
+ s.add_development_dependency(%q<shoulda>, [">= 0"])
50
+ s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
51
+ s.add_development_dependency(%q<jeweler>, ["~> 1.5.2"])
52
+ s.add_development_dependency(%q<rcov>, [">= 0"])
53
+ else
54
+ s.add_dependency(%q<shoulda>, [">= 0"])
55
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
56
+ s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
57
+ s.add_dependency(%q<rcov>, [">= 0"])
58
+ end
59
+ else
60
+ s.add_dependency(%q<shoulda>, [">= 0"])
61
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
62
+ s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
63
+ s.add_dependency(%q<rcov>, [">= 0"])
64
+ end
65
+ end
66
+
data/bin/bfrb ADDED
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require File.expand_path(File.join(File.dirname(__FILE__), "..", "lib", "bfrb.rb"))
4
+
5
+ def usage
6
+ puts "Usage:"
7
+ puts "Pass code in as first command line parameter (in quotes): bfrb \",[.,]\""
8
+ puts "Specify a file to read: bfrb -f test.bf"
9
+ end
10
+
11
+ bfrb = BfRb::Base.new
12
+ # if the command line params specify a file, run it
13
+ # otherwise attempt to run code passed in as a param
14
+ if ARGV.length > 1
15
+ if ARGV[0] == "-f"
16
+ bfrb.load_file(ARGV[1])
17
+ else
18
+ puts "Invalid arguments"
19
+ usage
20
+ end
21
+ elsif ARGV.length > 0
22
+ bfrb.run(ARGV[0])
23
+ else
24
+ usage
25
+ end
@@ -0,0 +1,75 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "memory.rb"))
2
+
3
+ module BfRb
4
+ # interprets brainfuck code
5
+ class Interpreter
6
+
7
+ # initialize the interpreter
8
+ def initialize
9
+ @memory = Memory.new
10
+ initialize_environment
11
+ end
12
+
13
+ # cleans the memory and initializes member variables
14
+ def initialize_environment
15
+ @memory.clear
16
+ @program_counter = 0
17
+ @memory_counter = 0
18
+ @code = ""
19
+ @loop_stack = []
20
+ end
21
+
22
+ def run(code)
23
+ @code = code
24
+ evaluate_code
25
+ end
26
+
27
+ def evaluate_code
28
+ while ((0 <= @program_counter) and (@program_counter < @code.length))
29
+ evaluate_instruction
30
+ end
31
+ end
32
+
33
+ def evaluate_instruction
34
+ case @code[@program_counter]
35
+ when ">"
36
+ @memory_counter += 1
37
+ when "<"
38
+ if @memory_counter > 1
39
+ @memory_counter -= 1
40
+ else
41
+ @memory_counter = 0
42
+ end
43
+ when "+"
44
+ @memory.set(@memory_counter, @memory.get(@memory_counter) + 1)
45
+ when "-"
46
+ @memory.set(@memory_counter, @memory.get(@memory_counter) - 1)
47
+ when "."
48
+ print @memory.get(@memory_counter).chr
49
+ when ","
50
+ input = $stdin.gets.getbyte(0)
51
+ @memory.set(@memory_counter, input)
52
+ when "["
53
+ if @memory.get(@memory_counter) != 0
54
+ @loop_stack.push @program_counter
55
+ else
56
+ bracket_counter = 1
57
+ while ((bracket_counter != 0) and (@program_counter < @code.length - 1))
58
+ @program_counter += 1
59
+ if @code[@program_counter] == "["
60
+ bracket_counter += 1
61
+ elsif @code[@program_counter] == "]"
62
+ bracket_counter -= 1
63
+ end
64
+ end
65
+ end
66
+ when "]"
67
+ matching_bracket = @loop_stack.pop
68
+ if @memory.get(@memory_counter) != 0
69
+ @program_counter = matching_bracket - 1
70
+ end
71
+ end
72
+ @program_counter += 1
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,28 @@
1
+ module BfRb
2
+ # memory for brainfuck interpreter
3
+ class Memory
4
+
5
+ # initialize the memory
6
+ def initialize
7
+ clear
8
+ end
9
+
10
+ # get the value at the given address
11
+ def get(address)
12
+ unless @mem.has_key?(address)
13
+ set(address, 0)
14
+ end
15
+ return @mem[address]
16
+ end
17
+
18
+ # set the given address to a certain value
19
+ def set(address, value)
20
+ @mem[address] = value
21
+ end
22
+
23
+ # clear the memory
24
+ def clear
25
+ @mem = {}
26
+ end
27
+ end
28
+ end
data/lib/bfrb.rb ADDED
@@ -0,0 +1,23 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "bfrb", "interpreter.rb"))
2
+
3
+ module BfRb
4
+ # loads and interprets brainfuck code
5
+ class Base
6
+
7
+ # initialize the interpreter
8
+ def initialize
9
+ @interpreter = Interpreter.new
10
+ end
11
+
12
+ # run the given brainfuck code
13
+ def run(code)
14
+ @interpreter.run(code)
15
+ end
16
+
17
+ # load brainfuck code from a file and run it
18
+ def load_file(file_path)
19
+ code = File.open(file_path) { |f| f.read }
20
+ run(code)
21
+ end
22
+ end
23
+ end
data/test/helper.rb ADDED
@@ -0,0 +1,18 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ begin
4
+ Bundler.setup(:default, :development)
5
+ rescue Bundler::BundlerError => e
6
+ $stderr.puts e.message
7
+ $stderr.puts "Run `bundle install` to install missing gems"
8
+ exit e.status_code
9
+ end
10
+ require 'test/unit'
11
+ require 'shoulda'
12
+
13
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
14
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
15
+ require 'bfrb'
16
+
17
+ class Test::Unit::TestCase
18
+ end
data/test/test_bfrb.rb ADDED
@@ -0,0 +1,7 @@
1
+ require 'helper'
2
+
3
+ class TestBfrb < Test::Unit::TestCase
4
+ should "probably rename this file and start testing for real" do
5
+ flunk "hey buddy, you should probably rename this file and start testing for real"
6
+ end
7
+ end
metadata ADDED
@@ -0,0 +1,111 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: bfrb
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Chris ONeal
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-06-03 00:00:00.000000000 -05:00
13
+ default_executable: bfrb
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: shoulda
17
+ requirement: &8092368 !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: '0'
23
+ type: :development
24
+ prerelease: false
25
+ version_requirements: *8092368
26
+ - !ruby/object:Gem::Dependency
27
+ name: bundler
28
+ requirement: &8091288 !ruby/object:Gem::Requirement
29
+ none: false
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: 1.0.0
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: *8091288
37
+ - !ruby/object:Gem::Dependency
38
+ name: jeweler
39
+ requirement: &8089740 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ~>
43
+ - !ruby/object:Gem::Version
44
+ version: 1.5.2
45
+ type: :development
46
+ prerelease: false
47
+ version_requirements: *8089740
48
+ - !ruby/object:Gem::Dependency
49
+ name: rcov
50
+ requirement: &8073336 !ruby/object:Gem::Requirement
51
+ none: false
52
+ requirements:
53
+ - - ! '>='
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ type: :development
57
+ prerelease: false
58
+ version_requirements: *8073336
59
+ description: bfrb is a brainfuck interpreter written in Ruby.
60
+ email: ctoneal@gmail.com
61
+ executables:
62
+ - bfrb
63
+ extensions: []
64
+ extra_rdoc_files:
65
+ - README.rdoc
66
+ files:
67
+ - .document
68
+ - Gemfile
69
+ - Gemfile.lock
70
+ - README.rdoc
71
+ - Rakefile
72
+ - VERSION
73
+ - bfrb.gemspec
74
+ - bin/bfrb
75
+ - lib/bfrb.rb
76
+ - lib/bfrb/interpreter.rb
77
+ - lib/bfrb/memory.rb
78
+ - test/helper.rb
79
+ - test/test_bfrb.rb
80
+ has_rdoc: true
81
+ homepage: http://github.com/ctoneal/bfrb
82
+ licenses:
83
+ - MIT
84
+ post_install_message:
85
+ rdoc_options: []
86
+ require_paths:
87
+ - lib
88
+ required_ruby_version: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ segments:
95
+ - 0
96
+ hash: -476785
97
+ required_rubygems_version: !ruby/object:Gem::Requirement
98
+ none: false
99
+ requirements:
100
+ - - ! '>='
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ requirements: []
104
+ rubyforge_project:
105
+ rubygems_version: 1.6.2
106
+ signing_key:
107
+ specification_version: 3
108
+ summary: A simple brainfuck interpreter in Ruby
109
+ test_files:
110
+ - test/helper.rb
111
+ - test/test_bfrb.rb