bfrb 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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