mirror of
https://github.com/KevinMidboe/linguist.git
synced 2025-10-29 09:40:21 +00:00
Merge branch 'master' into 1233-local
Conflicts: lib/linguist/language.rb lib/linguist/languages.yml lib/linguist/samples.json
This commit is contained in:
0
.gitattributes
vendored
Normal file
0
.gitattributes
vendored
Normal file
2
.gitignore
vendored
2
.gitignore
vendored
@@ -1,4 +1,4 @@
|
|||||||
Gemfile.lock
|
Gemfile.lock
|
||||||
.bundle/
|
.bundle/
|
||||||
vendor/
|
|
||||||
benchmark/
|
benchmark/
|
||||||
|
lib/linguist/samples.json
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
before_install:
|
before_install:
|
||||||
- git fetch origin master:master
|
- git fetch origin master:master
|
||||||
- git fetch origin v2.0.0:v2.0.0
|
- git fetch origin v2.0.0:v2.0.0
|
||||||
|
- git fetch origin test/attributes:test/attributes
|
||||||
- sudo apt-get install libicu-dev -y
|
- sudo apt-get install libicu-dev -y
|
||||||
- gem update --system 2.1.11
|
|
||||||
before_script:
|
|
||||||
- bundle exec rake samples
|
|
||||||
rvm:
|
rvm:
|
||||||
- 1.9.3
|
- 1.9.3
|
||||||
- 2.0.0
|
- 2.0.0
|
||||||
- 2.1.1
|
- 2.1
|
||||||
|
- 2.2
|
||||||
notifications:
|
notifications:
|
||||||
disabled: true
|
disabled: true
|
||||||
|
|||||||
1
Gemfile
1
Gemfile
@@ -1,2 +1,3 @@
|
|||||||
source 'https://rubygems.org'
|
source 'https://rubygems.org'
|
||||||
gemspec
|
gemspec
|
||||||
|
gem 'test-unit', require: false if RUBY_VERSION >= '2.2'
|
||||||
|
|||||||
89
README.md
89
README.md
@@ -32,33 +32,57 @@ The Language stats bar that you see on every repository is built by aggregating
|
|||||||
|
|
||||||
The repository stats API, accessed through `#languages`, can be used on a directory:
|
The repository stats API, accessed through `#languages`, can be used on a directory:
|
||||||
|
|
||||||
|
***API UPDATE***
|
||||||
|
|
||||||
|
Since [Version 3.0.0](https://github.com/github/linguist/releases/tag/v3.0.0) Linguist expects a git repository (in the form of a [Rugged::Repository](https://github.com/libgit2/rugged#repositories)) to be passed when initializing `Linguist::Repository`.
|
||||||
|
|
||||||
|
|
||||||
```ruby
|
```ruby
|
||||||
project = Linguist::Repository.from_directory(".")
|
require 'rugged'
|
||||||
project.language.name #=> "Ruby"
|
require 'linguist'
|
||||||
project.languages #=> { "Ruby" => 0.98, "Shell" => 0.02 }
|
|
||||||
|
repo = Rugged::Repository.new('.')
|
||||||
|
project = Linguist::Repository.new(repo, repo.head.target_id)
|
||||||
|
project.language #=> "Ruby"
|
||||||
|
project.languages #=> { "Ruby" => 119387 }
|
||||||
```
|
```
|
||||||
|
|
||||||
These stats are also printed out by the `linguist` binary. You can use the
|
These stats are also printed out by the `linguist` binary. You can use the
|
||||||
`--breakdown` flag, and the binary will also output the breakdown of files by language.
|
`--breakdown` flag, and the binary will also output the breakdown of files by language.
|
||||||
|
|
||||||
You can try running `linguist` on the `lib/` directory in this repository itself:
|
You can try running `linguist` on the root directory in this repository itself:
|
||||||
|
|
||||||
$ bundle exec linguist lib/ --breakdown
|
$ bundle exec linguist --breakdown
|
||||||
|
|
||||||
100.00% Ruby
|
100.00% Ruby
|
||||||
|
|
||||||
Ruby:
|
Ruby:
|
||||||
linguist/blob_helper.rb
|
Gemfile
|
||||||
linguist/classifier.rb
|
Rakefile
|
||||||
linguist/file_blob.rb
|
bin/linguist
|
||||||
linguist/generated.rb
|
github-linguist.gemspec
|
||||||
linguist/heuristics.rb
|
lib/linguist.rb
|
||||||
linguist/language.rb
|
lib/linguist/blob_helper.rb
|
||||||
linguist/md5.rb
|
lib/linguist/classifier.rb
|
||||||
linguist/repository.rb
|
lib/linguist/file_blob.rb
|
||||||
linguist/samples.rb
|
lib/linguist/generated.rb
|
||||||
linguist/tokenizer.rb
|
lib/linguist/heuristics.rb
|
||||||
linguist.rb
|
lib/linguist/language.rb
|
||||||
|
lib/linguist/lazy_blob.rb
|
||||||
|
lib/linguist/md5.rb
|
||||||
|
lib/linguist/repository.rb
|
||||||
|
lib/linguist/samples.rb
|
||||||
|
lib/linguist/tokenizer.rb
|
||||||
|
lib/linguist/version.rb
|
||||||
|
test/test_blob.rb
|
||||||
|
test/test_classifier.rb
|
||||||
|
test/test_heuristics.rb
|
||||||
|
test/test_language.rb
|
||||||
|
test/test_md5.rb
|
||||||
|
test/test_pedantic.rb
|
||||||
|
test/test_repository.rb
|
||||||
|
test/test_samples.rb
|
||||||
|
test/test_tokenizer.rb
|
||||||
|
|
||||||
#### Ignore vendored files
|
#### Ignore vendored files
|
||||||
|
|
||||||
@@ -80,9 +104,34 @@ Linguist::FileBlob.new("underscore.min.js").generated? # => true
|
|||||||
|
|
||||||
See [Linguist::Generated#generated?](https://github.com/github/linguist/blob/master/lib/linguist/generated.rb).
|
See [Linguist::Generated#generated?](https://github.com/github/linguist/blob/master/lib/linguist/generated.rb).
|
||||||
|
|
||||||
|
## Overrides
|
||||||
|
|
||||||
|
Linguist supports custom overrides for language definitions and vendored paths. Add a `.gitattributes` file to your project using the keys `linguist-language` and `linguist-vendored` with the standard git-style path matchers for the files you want to override.
|
||||||
|
|
||||||
|
Please note that the overrides currently only affect the language statistics for a repository and not the syntax-highlighting of files.
|
||||||
|
|
||||||
|
```
|
||||||
|
$ cat .gitattributes
|
||||||
|
*.rb linguist-language=Java
|
||||||
|
|
||||||
|
$ linguist --breakdown
|
||||||
|
100.00% Java
|
||||||
|
|
||||||
|
Java:
|
||||||
|
ruby_file.rb
|
||||||
|
```
|
||||||
|
|
||||||
|
By default, Linguist treats all of the paths defined in [lib/linguist/vendor.yml](https://github.com/github/linguist/blob/master/lib/linguist/vendor.yml) as vendored and therefore doesn't include them in the language statistics for a repository. Use the `linguist-vendored` attribute to vendor or un-vendor paths.
|
||||||
|
|
||||||
|
```
|
||||||
|
$ cat .gitattributes
|
||||||
|
special-vendored-path/* linguist-vendored
|
||||||
|
jquery.js linguist-vendored=false
|
||||||
|
```
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
github.com is usually running the latest version of the `github-linguist` gem that is released on [RubyGems.org](http://rubygems.org/gems/github-linguist).
|
Github.com is usually running the latest version of the `github-linguist` gem that is released on [RubyGems.org](http://rubygems.org/gems/github-linguist).
|
||||||
|
|
||||||
But for development you are going to want to checkout out the source. To get it, clone the repo and run [Bundler](http://gembundler.com/) to install its dependencies.
|
But for development you are going to want to checkout out the source. To get it, clone the repo and run [Bundler](http://gembundler.com/) to install its dependencies.
|
||||||
|
|
||||||
@@ -102,10 +151,6 @@ We try to only add languages once they have some usage on GitHub, so please note
|
|||||||
|
|
||||||
Almost all bug fixes or new language additions should come with some additional code samples. Just drop them under [`samples/`](https://github.com/github/linguist/tree/master/samples) in the correct subdirectory and our test suite will automatically test them. In most cases you shouldn't need to add any new assertions.
|
Almost all bug fixes or new language additions should come with some additional code samples. Just drop them under [`samples/`](https://github.com/github/linguist/tree/master/samples) in the correct subdirectory and our test suite will automatically test them. In most cases you shouldn't need to add any new assertions.
|
||||||
|
|
||||||
To update the `samples.json` after adding new files to [`samples/`](https://github.com/github/linguist/tree/master/samples):
|
|
||||||
|
|
||||||
bundle exec rake samples
|
|
||||||
|
|
||||||
### A note on language extensions
|
### A note on language extensions
|
||||||
|
|
||||||
Linguist has a number of methods available to it for identifying the language of a particular file. The initial lookup is based upon the extension of the file, possible file extensions are defined in an array called `extensions`. Take a look at this example for example for `Perl`:
|
Linguist has a number of methods available to it for identifying the language of a particular file. The initial lookup is based upon the extension of the file, possible file extensions are defined in an array called `extensions`. Take a look at this example for example for `Perl`:
|
||||||
@@ -145,7 +190,7 @@ If you are the current maintainer of this gem:
|
|||||||
0. Ensure that tests are green: `bundle exec rake test`
|
0. Ensure that tests are green: `bundle exec rake test`
|
||||||
0. Bump gem version in `lib/linguist/version.rb`. For example, [like this](https://github.com/github/linguist/commit/8d2ea90a5ba3b2fe6e1508b7155aa4632eea2985).
|
0. Bump gem version in `lib/linguist/version.rb`. For example, [like this](https://github.com/github/linguist/commit/8d2ea90a5ba3b2fe6e1508b7155aa4632eea2985).
|
||||||
0. Make a PR to github/linguist. For example, [#1238](https://github.com/github/linguist/pull/1238).
|
0. Make a PR to github/linguist. For example, [#1238](https://github.com/github/linguist/pull/1238).
|
||||||
0. Build a local gem: `gem build github-linguist.gemspec`
|
0. Build a local gem: `bundle exec rake build_gem`
|
||||||
0. Testing:
|
0. Testing:
|
||||||
0. Bump the Gemfile and Gemfile.lock versions for an app which relies on this gem
|
0. Bump the Gemfile and Gemfile.lock versions for an app which relies on this gem
|
||||||
0. Install the new gem locally
|
0. Install the new gem locally
|
||||||
|
|||||||
38
Rakefile
38
Rakefile
@@ -1,24 +1,32 @@
|
|||||||
require 'json'
|
require 'bundler/setup'
|
||||||
require 'rake/clean'
|
require 'rake/clean'
|
||||||
require 'rake/testtask'
|
require 'rake/testtask'
|
||||||
require 'yaml'
|
require 'yaml'
|
||||||
require 'pry'
|
require 'yajl'
|
||||||
|
|
||||||
task :default => :test
|
task :default => :test
|
||||||
|
|
||||||
Rake::TestTask.new
|
Rake::TestTask.new
|
||||||
|
|
||||||
task :samples do
|
# Extend test task to check for samples
|
||||||
require 'linguist/samples'
|
task :test => :check_samples
|
||||||
require 'yajl'
|
|
||||||
data = Linguist::Samples.data
|
desc "Check that we have samples.json generated"
|
||||||
json = Yajl::Encoder.encode(data, :pretty => true)
|
task :check_samples do
|
||||||
File.open('lib/linguist/samples.json', 'w') { |io| io.write json }
|
unless File.exist?('lib/linguist/samples.json')
|
||||||
|
Rake::Task[:samples].invoke
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
task :build_gem do
|
task :samples do
|
||||||
|
require 'linguist/samples'
|
||||||
|
json = Yajl.dump(Linguist::Samples.data, :pretty => true)
|
||||||
|
File.write 'lib/linguist/samples.json', json
|
||||||
|
end
|
||||||
|
|
||||||
|
task :build_gem => :samples do
|
||||||
languages = YAML.load_file("lib/linguist/languages.yml")
|
languages = YAML.load_file("lib/linguist/languages.yml")
|
||||||
File.write("lib/linguist/languages.json", JSON.dump(languages))
|
File.write("lib/linguist/languages.json", Yajl.dump(languages))
|
||||||
`gem build github-linguist.gemspec`
|
`gem build github-linguist.gemspec`
|
||||||
File.delete("lib/linguist/languages.json")
|
File.delete("lib/linguist/languages.json")
|
||||||
end
|
end
|
||||||
@@ -62,11 +70,11 @@ namespace :benchmark do
|
|||||||
reference_file = ENV["REFERENCE"]
|
reference_file = ENV["REFERENCE"]
|
||||||
candidate_file = ENV["CANDIDATE"]
|
candidate_file = ENV["CANDIDATE"]
|
||||||
|
|
||||||
reference = JSON.parse(File.read(reference_file))
|
reference = Yajl.load(File.read(reference_file))
|
||||||
reference_counts = Hash.new(0)
|
reference_counts = Hash.new(0)
|
||||||
reference.each { |filename, language| reference_counts[language] += 1 }
|
reference.each { |filename, language| reference_counts[language] += 1 }
|
||||||
|
|
||||||
candidate = JSON.parse(File.read(candidate_file))
|
candidate = Yajl.load(File.read(candidate_file))
|
||||||
candidate_counts = Hash.new(0)
|
candidate_counts = Hash.new(0)
|
||||||
candidate.each { |filename, language| candidate_counts[language] += 1 }
|
candidate.each { |filename, language| candidate_counts[language] += 1 }
|
||||||
|
|
||||||
@@ -99,7 +107,7 @@ namespace :classifier do
|
|||||||
next if file_language.nil? || file_language == 'Text'
|
next if file_language.nil? || file_language == 'Text'
|
||||||
begin
|
begin
|
||||||
data = open(file_url).read
|
data = open(file_url).read
|
||||||
guessed_language, score = Linguist::Classifier.classify(Linguist::Samples::DATA, data).first
|
guessed_language, score = Linguist::Classifier.classify(Linguist::Samples.cache, data).first
|
||||||
|
|
||||||
total += 1
|
total += 1
|
||||||
guessed_language == file_language ? correct += 1 : incorrect += 1
|
guessed_language == file_language ? correct += 1 : incorrect += 1
|
||||||
@@ -116,14 +124,12 @@ namespace :classifier do
|
|||||||
|
|
||||||
def each_public_gist
|
def each_public_gist
|
||||||
require 'open-uri'
|
require 'open-uri'
|
||||||
require 'json'
|
|
||||||
|
|
||||||
url = "https://api.github.com/gists/public"
|
url = "https://api.github.com/gists/public"
|
||||||
|
|
||||||
loop do
|
loop do
|
||||||
resp = open(url)
|
resp = open(url)
|
||||||
url = resp.meta['link'][/<([^>]+)>; rel="next"/, 1]
|
url = resp.meta['link'][/<([^>]+)>; rel="next"/, 1]
|
||||||
gists = JSON.parse(resp.read)
|
gists = Yajl.load(resp.read)
|
||||||
|
|
||||||
for gist in gists
|
for gist in gists
|
||||||
for filename, attrs in gist['files']
|
for filename, attrs in gist['files']
|
||||||
|
|||||||
@@ -17,9 +17,8 @@ Gem::Specification.new do |s|
|
|||||||
s.add_dependency 'escape_utils', '~> 1.0.1'
|
s.add_dependency 'escape_utils', '~> 1.0.1'
|
||||||
s.add_dependency 'mime-types', '~> 1.19'
|
s.add_dependency 'mime-types', '~> 1.19'
|
||||||
s.add_dependency 'pygments.rb', '~> 0.6.0'
|
s.add_dependency 'pygments.rb', '~> 0.6.0'
|
||||||
s.add_dependency 'rugged', '~> 0.21.0'
|
s.add_dependency 'rugged', '~> 0.21.1b2'
|
||||||
|
|
||||||
s.add_development_dependency 'json'
|
|
||||||
s.add_development_dependency 'mocha'
|
s.add_development_dependency 'mocha'
|
||||||
s.add_development_dependency 'pry'
|
s.add_development_dependency 'pry'
|
||||||
s.add_development_dependency 'rake'
|
s.add_development_dependency 'rake'
|
||||||
|
|||||||
@@ -321,6 +321,11 @@ module Linguist
|
|||||||
language ? language.lexer : Pygments::Lexer.find_by_name('Text only')
|
language ? language.lexer : Pygments::Lexer.find_by_name('Text only')
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Internal: Get the TextMate compatible scope for the blob
|
||||||
|
def tm_scope
|
||||||
|
language && language.tm_scope
|
||||||
|
end
|
||||||
|
|
||||||
# Public: Highlight syntax of blob
|
# Public: Highlight syntax of blob
|
||||||
#
|
#
|
||||||
# options - A Hash of options (defaults to {})
|
# options - A Hash of options (defaults to {})
|
||||||
|
|||||||
@@ -63,6 +63,7 @@ module Linguist
|
|||||||
generated_jni_header? ||
|
generated_jni_header? ||
|
||||||
composer_lock? ||
|
composer_lock? ||
|
||||||
node_modules? ||
|
node_modules? ||
|
||||||
|
godeps? ||
|
||||||
vcr_cassette? ||
|
vcr_cassette? ||
|
||||||
generated_by_zephir?
|
generated_by_zephir?
|
||||||
end
|
end
|
||||||
@@ -231,6 +232,14 @@ module Linguist
|
|||||||
!!name.match(/node_modules\//)
|
!!name.match(/node_modules\//)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Internal: Is the blob part of Godeps/,
|
||||||
|
# which are not meant for humans in pull requests.
|
||||||
|
#
|
||||||
|
# Returns true or false.
|
||||||
|
def godeps?
|
||||||
|
!!name.match(/Godeps\//)
|
||||||
|
end
|
||||||
|
|
||||||
# Internal: Is the blob a generated php composer lock file?
|
# Internal: Is the blob a generated php composer lock file?
|
||||||
#
|
#
|
||||||
# Returns true or false.
|
# Returns true or false.
|
||||||
|
|||||||
@@ -19,6 +19,15 @@ module Linguist
|
|||||||
if languages.all? { |l| ["ECL", "Prolog"].include?(l) }
|
if languages.all? { |l| ["ECL", "Prolog"].include?(l) }
|
||||||
result = disambiguate_ecl(data, languages)
|
result = disambiguate_ecl(data, languages)
|
||||||
end
|
end
|
||||||
|
if languages.all? { |l| ["IDL", "Prolog"].include?(l) }
|
||||||
|
result = disambiguate_pro(data, languages)
|
||||||
|
end
|
||||||
|
if languages.all? { |l| ["Common Lisp", "OpenCL"].include?(l) }
|
||||||
|
result = disambiguate_cl(data, languages)
|
||||||
|
end
|
||||||
|
if languages.all? { |l| ["AsciiDoc", "AGS Script"].include?(l) }
|
||||||
|
result = disambiguate_asc(data, languages)
|
||||||
|
end
|
||||||
return result
|
return result
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -48,6 +57,16 @@ module Linguist
|
|||||||
matches
|
matches
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def self.disambiguate_pro(data, languages)
|
||||||
|
matches = []
|
||||||
|
if (data.include?(":-"))
|
||||||
|
matches << Language["Prolog"]
|
||||||
|
else
|
||||||
|
matches << Language["IDL"]
|
||||||
|
end
|
||||||
|
matches
|
||||||
|
end
|
||||||
|
|
||||||
def self.disambiguate_ts(data, languages)
|
def self.disambiguate_ts(data, languages)
|
||||||
matches = []
|
matches = []
|
||||||
if (data.include?("</translation>"))
|
if (data.include?("</translation>"))
|
||||||
@@ -72,6 +91,12 @@ module Linguist
|
|||||||
matches
|
matches
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def self.disambiguate_asc(data, languages)
|
||||||
|
matches = []
|
||||||
|
matches << Language["AsciiDoc"] if /^=+(\s|\n)/.match(data)
|
||||||
|
matches
|
||||||
|
end
|
||||||
|
|
||||||
def self.active?
|
def self.active?
|
||||||
!!ACTIVE
|
!!ACTIVE
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ require 'escape_utils'
|
|||||||
require 'pygments'
|
require 'pygments'
|
||||||
require 'yaml'
|
require 'yaml'
|
||||||
begin
|
begin
|
||||||
require 'json'
|
require 'yajl'
|
||||||
rescue LoadError
|
rescue LoadError
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -150,7 +150,7 @@ module Linguist
|
|||||||
if (determined = Heuristics.find_by_heuristics(data, possible_language_names)) && !determined.empty?
|
if (determined = Heuristics.find_by_heuristics(data, possible_language_names)) && !determined.empty?
|
||||||
return determined.first
|
return determined.first
|
||||||
# Lastly, fall back to the probabilistic classifier.
|
# Lastly, fall back to the probabilistic classifier.
|
||||||
elsif classified = Classifier.classify(Samples::DATA, data, possible_language_names).first
|
elsif classified = Classifier.classify(Samples.cache, data, possible_language_names).first
|
||||||
# Return the actual Language object based of the string language name (i.e., first element of `#classify`)
|
# Return the actual Language object based of the string language name (i.e., first element of `#classify`)
|
||||||
return Language[classified[0]]
|
return Language[classified[0]]
|
||||||
end
|
end
|
||||||
@@ -302,6 +302,16 @@ module Linguist
|
|||||||
@lexer = Pygments::Lexer.find_by_name(attributes[:lexer] || name) ||
|
@lexer = Pygments::Lexer.find_by_name(attributes[:lexer] || name) ||
|
||||||
raise(ArgumentError, "#{@name} is missing lexer")
|
raise(ArgumentError, "#{@name} is missing lexer")
|
||||||
|
|
||||||
|
@tm_scope = attributes[:tm_scope] || begin
|
||||||
|
context = case @type
|
||||||
|
when :data, :markup, :prose
|
||||||
|
'text'
|
||||||
|
when :programming, nil
|
||||||
|
'source'
|
||||||
|
end
|
||||||
|
"#{context}.#{@name.downcase}"
|
||||||
|
end
|
||||||
|
|
||||||
@ace_mode = attributes[:ace_mode]
|
@ace_mode = attributes[:ace_mode]
|
||||||
@wrap = attributes[:wrap] || false
|
@wrap = attributes[:wrap] || false
|
||||||
|
|
||||||
@@ -375,6 +385,11 @@ module Linguist
|
|||||||
# Returns the Lexer
|
# Returns the Lexer
|
||||||
attr_reader :lexer
|
attr_reader :lexer
|
||||||
|
|
||||||
|
# Public: Get the name of a TextMate-compatible scope
|
||||||
|
#
|
||||||
|
# Returns the scope
|
||||||
|
attr_reader :tm_scope
|
||||||
|
|
||||||
# Public: Get Ace mode
|
# Public: Get Ace mode
|
||||||
#
|
#
|
||||||
# Examples
|
# Examples
|
||||||
@@ -522,16 +537,16 @@ module Linguist
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
extensions = Samples::DATA['extnames']
|
extensions = Samples.cache['extnames']
|
||||||
interpreters = Samples::DATA['interpreters']
|
interpreters = Samples.cache['interpreters']
|
||||||
filenames = Samples::DATA['filenames']
|
filenames = Samples.cache['filenames']
|
||||||
popular = YAML.load_file(File.expand_path("../popular.yml", __FILE__))
|
popular = YAML.load_file(File.expand_path("../popular.yml", __FILE__))
|
||||||
|
|
||||||
languages_yml = File.expand_path("../languages.yml", __FILE__)
|
languages_yml = File.expand_path("../languages.yml", __FILE__)
|
||||||
languages_json = File.expand_path("../languages.json", __FILE__)
|
languages_json = File.expand_path("../languages.json", __FILE__)
|
||||||
|
|
||||||
if File.exist?(languages_json) && defined?(JSON)
|
if File.exist?(languages_json) && defined?(Yajl)
|
||||||
languages = JSON.load(File.read(languages_json))
|
languages = Yajl.load(File.read(languages_json))
|
||||||
else
|
else
|
||||||
languages = YAML.load_file(languages_yml)
|
languages = YAML.load_file(languages_yml)
|
||||||
end
|
end
|
||||||
@@ -576,6 +591,7 @@ module Linguist
|
|||||||
:type => options['type'],
|
:type => options['type'],
|
||||||
:aliases => options['aliases'],
|
:aliases => options['aliases'],
|
||||||
:lexer => options['lexer'],
|
:lexer => options['lexer'],
|
||||||
|
:tm_scope => options['tm_scope'],
|
||||||
:ace_mode => options['ace_mode'],
|
:ace_mode => options['ace_mode'],
|
||||||
:wrap => options['wrap'],
|
:wrap => options['wrap'],
|
||||||
:group_name => options['group'],
|
:group_name => options['group'],
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1,8 +1,13 @@
|
|||||||
require 'linguist/blob_helper'
|
require 'linguist/blob_helper'
|
||||||
|
require 'linguist/language'
|
||||||
require 'rugged'
|
require 'rugged'
|
||||||
|
|
||||||
module Linguist
|
module Linguist
|
||||||
class LazyBlob
|
class LazyBlob
|
||||||
|
GIT_ATTR = ['linguist-language', 'linguist-vendored']
|
||||||
|
GIT_ATTR_OPTS = { :priority => [:index], :skip_system => true }
|
||||||
|
GIT_ATTR_FLAGS = Rugged::Repository::Attributes.parse_opts(GIT_ATTR_OPTS)
|
||||||
|
|
||||||
include BlobHelper
|
include BlobHelper
|
||||||
|
|
||||||
MAX_SIZE = 128 * 1024
|
MAX_SIZE = 128 * 1024
|
||||||
@@ -19,6 +24,29 @@ module Linguist
|
|||||||
@mode = mode
|
@mode = mode
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def git_attributes
|
||||||
|
@git_attributes ||= repository.fetch_attributes(
|
||||||
|
name, GIT_ATTR, GIT_ATTR_FLAGS)
|
||||||
|
end
|
||||||
|
|
||||||
|
def vendored?
|
||||||
|
if attr = git_attributes['linguist-vendored']
|
||||||
|
return boolean_attribute(attr)
|
||||||
|
else
|
||||||
|
return super
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def language
|
||||||
|
return @language if defined?(@language)
|
||||||
|
|
||||||
|
@language = if lang = git_attributes['linguist-language']
|
||||||
|
Language.find_by_name(lang)
|
||||||
|
else
|
||||||
|
super
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def data
|
def data
|
||||||
load_blob!
|
load_blob!
|
||||||
@data
|
@data
|
||||||
@@ -30,6 +58,12 @@ module Linguist
|
|||||||
end
|
end
|
||||||
|
|
||||||
protected
|
protected
|
||||||
|
|
||||||
|
# Returns true if the attribute is present and not the string "false".
|
||||||
|
def boolean_attribute(attr)
|
||||||
|
attr != "false"
|
||||||
|
end
|
||||||
|
|
||||||
def load_blob!
|
def load_blob!
|
||||||
@data, @size = Rugged::Blob.to_buffer(repository, oid, MAX_SIZE) if @data.nil?
|
@data, @size = Rugged::Blob.to_buffer(repository, oid, MAX_SIZE) if @data.nil?
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -110,18 +110,37 @@ module Linguist
|
|||||||
if @old_commit_oid == @commit_oid
|
if @old_commit_oid == @commit_oid
|
||||||
@old_stats
|
@old_stats
|
||||||
else
|
else
|
||||||
compute_stats(@old_commit_oid, @commit_oid, @old_stats)
|
compute_stats(@old_commit_oid, @old_stats)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
protected
|
def read_index
|
||||||
def compute_stats(old_commit_oid, commit_oid, cache = nil)
|
attr_index = Rugged::Index.new
|
||||||
file_map = cache ? cache.dup : {}
|
attr_index.read_tree(current_tree)
|
||||||
old_tree = old_commit_oid && Rugged::Commit.lookup(repository, old_commit_oid).tree
|
repository.index = attr_index
|
||||||
new_tree = Rugged::Commit.lookup(repository, commit_oid).tree
|
end
|
||||||
|
|
||||||
diff = Rugged::Tree.diff(repository, old_tree, new_tree)
|
def current_tree
|
||||||
|
@tree ||= Rugged::Commit.lookup(repository, @commit_oid).tree
|
||||||
|
end
|
||||||
|
|
||||||
|
protected
|
||||||
|
|
||||||
|
def compute_stats(old_commit_oid, cache = nil)
|
||||||
|
old_tree = old_commit_oid && Rugged::Commit.lookup(repository, old_commit_oid).tree
|
||||||
|
|
||||||
|
read_index
|
||||||
|
|
||||||
|
diff = Rugged::Tree.diff(repository, old_tree, current_tree)
|
||||||
|
|
||||||
|
# Clear file map and fetch full diff if any .gitattributes files are changed
|
||||||
|
if cache && diff.each_delta.any? { |delta| File.basename(delta.new_file[:path]) == ".gitattributes" }
|
||||||
|
diff = Rugged::Tree.diff(repository, old_tree = nil, current_tree)
|
||||||
|
file_map = {}
|
||||||
|
else
|
||||||
|
file_map = cache ? cache.dup : {}
|
||||||
|
end
|
||||||
|
|
||||||
diff.each_delta do |delta|
|
diff.each_delta do |delta|
|
||||||
old = delta.old_file[:path]
|
old = delta.old_file[:path]
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,5 @@
|
|||||||
begin
|
begin
|
||||||
require 'json'
|
require 'yajl'
|
||||||
rescue LoadError
|
rescue LoadError
|
||||||
require 'yaml'
|
require 'yaml'
|
||||||
end
|
end
|
||||||
@@ -17,9 +17,11 @@ module Linguist
|
|||||||
PATH = File.expand_path('../samples.json', __FILE__)
|
PATH = File.expand_path('../samples.json', __FILE__)
|
||||||
|
|
||||||
# Hash of serialized samples object
|
# Hash of serialized samples object
|
||||||
if File.exist?(PATH)
|
def self.cache
|
||||||
serializer = defined?(JSON) ? JSON : YAML
|
@cache ||= begin
|
||||||
DATA = serializer.load(File.read(PATH))
|
serializer = defined?(Yajl) ? Yajl : YAML
|
||||||
|
serializer.load(File.read(PATH))
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# Public: Iterate over each sample.
|
# Public: Iterate over each sample.
|
||||||
|
|||||||
@@ -33,6 +33,9 @@
|
|||||||
# Erlang bundles
|
# Erlang bundles
|
||||||
- ^rebar$
|
- ^rebar$
|
||||||
|
|
||||||
|
# Go dependencies
|
||||||
|
- Godeps/_workspace/
|
||||||
|
|
||||||
# Bootstrap minified css and js
|
# Bootstrap minified css and js
|
||||||
- (^|/)bootstrap([^.]*)(\.min)?\.(js|css)$
|
- (^|/)bootstrap([^.]*)(\.min)?\.(js|css)$
|
||||||
|
|
||||||
@@ -235,3 +238,11 @@
|
|||||||
- octicons.css
|
- octicons.css
|
||||||
- octicons.min.css
|
- octicons.min.css
|
||||||
- sprockets-octicons.scss
|
- sprockets-octicons.scss
|
||||||
|
|
||||||
|
# Typesafe Activator
|
||||||
|
- (^|/)activator$
|
||||||
|
- (^|/)activator\.bat$
|
||||||
|
|
||||||
|
# ProGuard
|
||||||
|
- proguard.pro
|
||||||
|
- proguard-rules.pro
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
module Linguist
|
module Linguist
|
||||||
VERSION = "3.1.5"
|
VERSION = "3.4.1"
|
||||||
end
|
end
|
||||||
|
|||||||
367
samples/APL/UT.dyalog
Normal file
367
samples/APL/UT.dyalog
Normal file
@@ -0,0 +1,367 @@
|
|||||||
|
:NameSpace UT
|
||||||
|
|
||||||
|
sac ← 0
|
||||||
|
expect_orig ← expect ← ⎕NS⍬
|
||||||
|
exception ← ⍬
|
||||||
|
nexpect_orig ← nexpect ← ⎕NS⍬
|
||||||
|
|
||||||
|
∇ {Z}←{Conf}run Argument;PRE_test;POST_test;TEST_step;COVER_step;FromSpace
|
||||||
|
|
||||||
|
load_display_if_not_already_loaded
|
||||||
|
load_salt_scripts_into_current_namespace_if_configured
|
||||||
|
|
||||||
|
FromSpace←1⊃⎕RSI
|
||||||
|
|
||||||
|
PRE_test←{}
|
||||||
|
POST_test←{}
|
||||||
|
COVER_step←{}
|
||||||
|
:If 0≠⎕NC'Conf'
|
||||||
|
:If Conf has'cover_target'
|
||||||
|
PRE_test←{{}⎕PROFILE'start'}
|
||||||
|
POST_test←{{}⎕PROFILE'stop'}
|
||||||
|
:EndIf
|
||||||
|
:EndIf
|
||||||
|
|
||||||
|
:If is_function Argument
|
||||||
|
TEST_step←single_function_test_function
|
||||||
|
COVER_file←Argument,'_coverage.html'
|
||||||
|
|
||||||
|
:ElseIf is_list_of_functions Argument
|
||||||
|
TEST_step←list_of_functions_test_function
|
||||||
|
COVER_file←'list_coverage.html'
|
||||||
|
|
||||||
|
:ElseIf is_file Argument
|
||||||
|
TEST_step←file_test_function
|
||||||
|
COVER_file←(get_file_name Argument),'_coverage.html'
|
||||||
|
|
||||||
|
:ElseIf is_dir Argument
|
||||||
|
test_files←test_files_in_dir Argument
|
||||||
|
TEST_step←test_dir_function
|
||||||
|
Argument←test_files
|
||||||
|
:EndIf
|
||||||
|
|
||||||
|
:If 0≠⎕NC'Conf'
|
||||||
|
:If Conf has'cover_target'
|
||||||
|
COVER_step←{Conf,←⊂('cover_file'COVER_file)
|
||||||
|
generate_coverage_page Conf}
|
||||||
|
:EndIf
|
||||||
|
:EndIf
|
||||||
|
|
||||||
|
PRE_test ⍬
|
||||||
|
Z←FromSpace TEST_step Argument
|
||||||
|
POST_test ⍬
|
||||||
|
COVER_step ⍬
|
||||||
|
∇
|
||||||
|
|
||||||
|
∇ load_display_if_not_already_loaded
|
||||||
|
:If 0=⎕NC'#.DISPLAY'
|
||||||
|
'DISPLAY'#.⎕CY'display'
|
||||||
|
:EndIf
|
||||||
|
∇
|
||||||
|
|
||||||
|
∇ load_salt_scripts_into_current_namespace_if_configured
|
||||||
|
:If 0≠⎕NC'#.UT.appdir'
|
||||||
|
:If ⍬≢#.UT.appdir
|
||||||
|
⎕SE.SALT.Load #.UT.appdir,'src/*.dyalog -target=#'
|
||||||
|
⎕SE.SALT.Load #.UT.appdir,'test/*.dyalog -target=#'
|
||||||
|
:EndIf
|
||||||
|
:EndIf
|
||||||
|
∇
|
||||||
|
|
||||||
|
∇ Z←FromSpace single_function_test_function TestName
|
||||||
|
Z←run_ut FromSpace TestName
|
||||||
|
∇
|
||||||
|
|
||||||
|
∇ Z←FromSpace list_of_functions_test_function ListOfNames;t
|
||||||
|
t←⎕TS
|
||||||
|
Z←run_ut¨{FromSpace ⍵}¨ListOfNames
|
||||||
|
t←⎕TS-t
|
||||||
|
('Test execution report')print_passed_crashed_failed Z t
|
||||||
|
∇
|
||||||
|
|
||||||
|
∇ Z←FromSpace file_test_function FilePath;FileNS;Functions;TestFunctions;t
|
||||||
|
FileNS←⎕SE.SALT.Load FilePath,' -target=#'
|
||||||
|
Functions←↓FileNS.⎕NL 3
|
||||||
|
TestFunctions←(is_test¨Functions)/Functions
|
||||||
|
:If (0/⍬,⊂0/'')≡TestFunctions
|
||||||
|
⎕←'No test functions found'
|
||||||
|
Z←⍬
|
||||||
|
:Else
|
||||||
|
t←⎕TS
|
||||||
|
Z←run_ut¨{FileNS ⍵}¨TestFunctions
|
||||||
|
t←⎕TS-t
|
||||||
|
(FilePath,' tests')print_passed_crashed_failed Z t
|
||||||
|
:EndIf
|
||||||
|
∇
|
||||||
|
|
||||||
|
∇ Z←FromSpace test_dir_function Test_files
|
||||||
|
:If Test_files≡⍬/⍬,⊂''
|
||||||
|
⎕←'No test files found'
|
||||||
|
Z←⍬
|
||||||
|
:Else
|
||||||
|
Z←#.UT.run¨Test_files
|
||||||
|
:EndIf
|
||||||
|
∇
|
||||||
|
|
||||||
|
∇ Z←get_file_name Argument;separator
|
||||||
|
separator←⊃⌽(Argument∊'/\')/⍳⍴Argument
|
||||||
|
Z←¯7↓separator↓Argument
|
||||||
|
∇
|
||||||
|
|
||||||
|
∇ generate_coverage_page Conf;ProfileData;CoverResults;HTML
|
||||||
|
ProfileData←⎕PROFILE'data'
|
||||||
|
ToCover←retrieve_coverables¨(⊃'cover_target'in Conf)
|
||||||
|
:If (⍴ToCover)≡(⍴⊂1)
|
||||||
|
ToCover←⊃ToCover
|
||||||
|
:EndIf
|
||||||
|
Representations←get_representation¨ToCover
|
||||||
|
CoverResults←ProfileData∘generate_cover_result¨↓ToCover,[1.5]Representations
|
||||||
|
HTML←generate_html CoverResults
|
||||||
|
Conf write_html_to_page HTML
|
||||||
|
⎕PROFILE'clear'
|
||||||
|
∇
|
||||||
|
|
||||||
|
∇ Z←retrieve_coverables Something;nc;functions
|
||||||
|
nc←⎕NC Something
|
||||||
|
:If nc=3
|
||||||
|
Z←Something
|
||||||
|
:ElseIf nc=9
|
||||||
|
functions←strip¨↓⍎Something,'.⎕NL 3'
|
||||||
|
Z←{(Something,'.',⍵)}¨functions
|
||||||
|
:EndIf
|
||||||
|
∇
|
||||||
|
|
||||||
|
∇ Z←strip input
|
||||||
|
Z←(input≠' ')/input
|
||||||
|
∇
|
||||||
|
|
||||||
|
∇ Z←get_representation Function;nc;rep
|
||||||
|
nc←⎕NC⊂Function
|
||||||
|
:If nc=3.1
|
||||||
|
rep←↓⎕CR Function
|
||||||
|
rep[1]←⊂'∇',⊃rep[1]
|
||||||
|
rep,←⊂'∇'
|
||||||
|
rep←↑rep
|
||||||
|
:Else
|
||||||
|
rep←⎕CR Function
|
||||||
|
:EndIf
|
||||||
|
Z←rep
|
||||||
|
∇
|
||||||
|
|
||||||
|
∇ Z←ProfileData generate_cover_result(name representation);Indices;lines;functionlines;covered_lines
|
||||||
|
Indices←({name≡⍵}¨ProfileData[;1])/⍳⍴ProfileData[;1]
|
||||||
|
lines←ProfileData[Indices;2]
|
||||||
|
nc←⎕NC⊂name
|
||||||
|
:If 3.1=nc
|
||||||
|
functionlines←¯2+⍴↓representation
|
||||||
|
:Else
|
||||||
|
functionlines←⊃⍴↓representation
|
||||||
|
:EndIf
|
||||||
|
covered_lines←(⍬∘≢¨lines)/lines
|
||||||
|
Z←(nc lines functionlines covered_lines representation)
|
||||||
|
∇
|
||||||
|
|
||||||
|
∇ Z←generate_html CoverResults;Covered;Total;Percentage;CoverageText;ColorizedCode;Timestamp;Page
|
||||||
|
Covered←⊃⊃+/{⍴4⊃⍵}¨CoverResults
|
||||||
|
Total←⊃⊃+/{3⊃⍵}¨CoverResults
|
||||||
|
Percentage←100×Covered÷Total
|
||||||
|
CoverageText←'Coverage: ',Percentage,'% (',Covered,'/',Total,')'
|
||||||
|
ColorizedCode←⊃,/{colorize_code_by_coverage ⍵}¨CoverResults
|
||||||
|
Timestamp←generate_timestamp_text
|
||||||
|
Page←⍬
|
||||||
|
Page,←⊂⍬,'<html>'
|
||||||
|
Page,←⊂⍬,'<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>'
|
||||||
|
Page,←⊂⍬,'<style>pre cov {line-height:80%;}'
|
||||||
|
Page,←⊂⍬,'pre cov {color: green;}'
|
||||||
|
Page,←⊂⍬,'pre uncov {line-height:80%;}'
|
||||||
|
Page,←⊂⍬,'pre uncov {color:red;}</style>'
|
||||||
|
Page,←⊂⍬,CoverageText
|
||||||
|
Page,←⊂⍬,'<pre>'
|
||||||
|
Page,←ColorizedCode
|
||||||
|
Page,←⊂⍬,'</pre>'
|
||||||
|
Page,←Timestamp
|
||||||
|
Page,←⊂⍬,'</html>'
|
||||||
|
Z←Page
|
||||||
|
∇
|
||||||
|
|
||||||
|
∇ Z←colorize_code_by_coverage CoverResult;Colors;Ends;Code
|
||||||
|
:If 3.1=⊃CoverResult
|
||||||
|
Colors←(2+3⊃CoverResult)⍴⊂'<uncov>'
|
||||||
|
Colors[1]←⊂''
|
||||||
|
Colors[⍴Colors]←⊂''
|
||||||
|
Ends←(2+3⊃CoverResult)⍴⊂'</uncov>'
|
||||||
|
Ends[1]←⊂''
|
||||||
|
Ends[⍴Ends]←⊂''
|
||||||
|
:Else
|
||||||
|
Colors←(3⊃CoverResult)⍴⊂'<uncov>'
|
||||||
|
Ends←(3⊃CoverResult)⍴⊂'</uncov>'
|
||||||
|
:EndIf
|
||||||
|
Colors[1+4⊃CoverResult]←⊂'<cov>'
|
||||||
|
Ends[1+4⊃CoverResult]←⊂'</cov>'
|
||||||
|
Code←↓5⊃CoverResult
|
||||||
|
Z←Colors,[1.5]Code
|
||||||
|
Z←{⍺,(⎕UCS 13),⍵}/Z,Ends
|
||||||
|
∇
|
||||||
|
|
||||||
|
∇ Z←generate_timestamp_text;TS;YYMMDD;HHMMSS
|
||||||
|
TS←⎕TS
|
||||||
|
YYMMDD←⊃{⍺,'-',⍵}/3↑TS
|
||||||
|
HHMMSS←⊃{⍺,':',⍵}/3↑3↓TS
|
||||||
|
Z←'Page generated: ',YYMMDD,'|',HHMMSS
|
||||||
|
∇
|
||||||
|
|
||||||
|
∇ Conf write_html_to_page Page;tie;filename
|
||||||
|
filename←(⊃'cover_out'in Conf),(⊃'cover_file'in Conf)
|
||||||
|
:Trap 22
|
||||||
|
tie←filename ⎕NTIE 0
|
||||||
|
filename ⎕NERASE tie
|
||||||
|
filename ⎕NCREATE tie
|
||||||
|
:Else
|
||||||
|
tie←filename ⎕NCREATE 0
|
||||||
|
:EndTrap
|
||||||
|
Simple_array←⍕⊃,/Page
|
||||||
|
(⎕UCS'UTF-8'⎕UCS Simple_array)⎕NAPPEND tie
|
||||||
|
∇
|
||||||
|
|
||||||
|
∇ Z←is_function Argument
|
||||||
|
Z←'_TEST'≡¯5↑Argument
|
||||||
|
∇
|
||||||
|
|
||||||
|
∇ Z←is_list_of_functions Argument
|
||||||
|
Z←2=≡Argument
|
||||||
|
∇
|
||||||
|
|
||||||
|
∇ Z←is_file Argument
|
||||||
|
Z←'.dyalog'≡¯7↑Argument
|
||||||
|
∇
|
||||||
|
|
||||||
|
∇ Z←is_dir Argument;attr
|
||||||
|
:If 'Linux'≡5↑⊃'.'⎕WG'APLVersion'
|
||||||
|
Z←'yes'≡⊃⎕CMD'test -d ',Argument,' && echo yes || echo no'
|
||||||
|
:Else
|
||||||
|
'gfa'⎕NA'I kernel32|GetFileAttributes* <0t'
|
||||||
|
:If Z←¯1≠attr←gfa⊂Argument ⍝ If file exists
|
||||||
|
Z←⊃2 16⊤attr ⍝ Return bit 4
|
||||||
|
:EndIf
|
||||||
|
:EndIf
|
||||||
|
∇
|
||||||
|
|
||||||
|
|
||||||
|
∇ Z←test_files_in_dir Argument
|
||||||
|
:If 'Linux'≡5↑⊃'.'⎕WG'APLVersion'
|
||||||
|
Z←⎕SH'find ',Argument,' -name \*_tests.dyalog'
|
||||||
|
:Else
|
||||||
|
#.⎕CY'files'
|
||||||
|
Z←#.Files.Dir Argument,'\*_tests.dyalog'
|
||||||
|
Z←(Argument,'\')∘,¨Z
|
||||||
|
:EndIf
|
||||||
|
∇
|
||||||
|
|
||||||
|
∇ Z←run_ut ut_data;returned;crashed;pass;crash;fail;message
|
||||||
|
(returned crashed time)←execute_function ut_data
|
||||||
|
(pass crash fail)←determine_pass_crash_or_fail returned crashed
|
||||||
|
message←determine_message pass fail crashed(2⊃ut_data)returned time
|
||||||
|
print_message_to_screen message
|
||||||
|
Z←(pass crash fail)
|
||||||
|
∇
|
||||||
|
|
||||||
|
∇ Z←execute_function ut_data;function;t
|
||||||
|
reset_UT_globals
|
||||||
|
function←(⍕(⊃ut_data[1])),'.',⊃ut_data[2]
|
||||||
|
:Trap sac
|
||||||
|
:If 3.2≡⎕NC⊂function
|
||||||
|
t←⎕TS
|
||||||
|
Z←(⍎function,' ⍬')0
|
||||||
|
t←⎕TS-t
|
||||||
|
:Else
|
||||||
|
t←⎕TS
|
||||||
|
Z←(⍎function)0
|
||||||
|
t←⎕TS-t
|
||||||
|
:EndIf
|
||||||
|
|
||||||
|
:Else
|
||||||
|
Z←(↑⎕DM)1
|
||||||
|
:If exception≢⍬
|
||||||
|
expect←exception
|
||||||
|
Z[2]←0
|
||||||
|
t←⎕TS-t
|
||||||
|
:EndIf
|
||||||
|
:EndTrap
|
||||||
|
Z,←⊂t
|
||||||
|
∇
|
||||||
|
|
||||||
|
∇ reset_UT_globals
|
||||||
|
expect_orig ← expect← ⎕NS⍬
|
||||||
|
exception←⍬
|
||||||
|
nexpect_orig ← nexpect← ⎕NS⍬
|
||||||
|
∇
|
||||||
|
|
||||||
|
∇ Z←is_test FunctionName;wsIndex
|
||||||
|
wsIndex←FunctionName⍳' '
|
||||||
|
FunctionName←(wsIndex-1)↑FunctionName
|
||||||
|
Z←'_TEST'≡¯5↑FunctionName
|
||||||
|
∇
|
||||||
|
|
||||||
|
∇ Heading print_passed_crashed_failed(ArrayRes time)
|
||||||
|
⎕←'-----------------------------------------'
|
||||||
|
⎕←Heading
|
||||||
|
⎕←' ⍋ Passed: ',+/{1⊃⍵}¨ArrayRes
|
||||||
|
⎕←' ⍟ Crashed: ',+/{2⊃⍵}¨ArrayRes
|
||||||
|
⎕←' ⍒ Failed: ',+/{3⊃⍵}¨ArrayRes
|
||||||
|
⎕←' ○ Runtime: ',time[5],'m',time[6],'s',time[7],'ms'
|
||||||
|
∇
|
||||||
|
|
||||||
|
determine_pass_crash_or_fail←{
|
||||||
|
r c←⍵ ⋄ 0≠c:0 1 0 ⋄ z←(0 0 1)(1 0 0)
|
||||||
|
expect_orig≢expect:(⎕IO+expect≡r)⊃z ⋄ (⎕IO+nexpect≢r)⊃z
|
||||||
|
}
|
||||||
|
|
||||||
|
∇ Z←determine_message(pass fail crashed name returned time)
|
||||||
|
:If crashed
|
||||||
|
Z←'CRASHED: 'failure_message name returned
|
||||||
|
:ElseIf pass
|
||||||
|
Z←'Passed ',time[5],'m',time[6],'s',time[7],'ms'
|
||||||
|
:Else
|
||||||
|
Z←'FAILED: 'failure_message name returned
|
||||||
|
:EndIf
|
||||||
|
∇
|
||||||
|
|
||||||
|
∇ print_message_to_screen message
|
||||||
|
⎕←message
|
||||||
|
∇
|
||||||
|
|
||||||
|
∇ Z←term_to_text Term;Text;Rows
|
||||||
|
Text←#.DISPLAY Term
|
||||||
|
Rows←1⊃⍴Text
|
||||||
|
Z←(Rows 4⍴''),Text
|
||||||
|
∇
|
||||||
|
|
||||||
|
∇ Z←Cause failure_message(name returned);hdr;exp;expterm;got;gotterm
|
||||||
|
hdr←Cause,name
|
||||||
|
exp←'Expected'
|
||||||
|
expterm←term_to_text #.UT.expect
|
||||||
|
got←'Got'
|
||||||
|
gotterm←term_to_text returned
|
||||||
|
Z←align_and_join_message_parts hdr exp expterm got gotterm
|
||||||
|
∇
|
||||||
|
|
||||||
|
∇ Z←align_and_join_message_parts Parts;hdr;exp;expterm;got;gotterm;R1;C1;R2;C2;W
|
||||||
|
(hdr exp expterm got gotterm)←Parts
|
||||||
|
(R1 C1)←⍴expterm
|
||||||
|
(R2 C2)←⍴gotterm
|
||||||
|
W←⊃⊃⌈/C1 C2(⍴hdr)(⍴exp)(⍴got)
|
||||||
|
Z←(W↑hdr),[0.5](W↑exp)
|
||||||
|
Z←Z⍪(R1 W↑expterm)
|
||||||
|
Z←Z⍪(W↑got)
|
||||||
|
Z←Z⍪(R2 W↑gotterm)
|
||||||
|
∇
|
||||||
|
|
||||||
|
∇ Z←confparam in config
|
||||||
|
Z←1↓⊃({confparam≡⊃⍵}¨config)/config
|
||||||
|
∇
|
||||||
|
|
||||||
|
∇ Z←config has confparam
|
||||||
|
Z←∨/{confparam≡⊃⍵}¨config
|
||||||
|
∇
|
||||||
|
|
||||||
|
:EndNameSpace
|
||||||
66
samples/Assembly/External Interrupt.a51
Normal file
66
samples/Assembly/External Interrupt.a51
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
ORG 0000h
|
||||||
|
SJMP START
|
||||||
|
ORG 0003h
|
||||||
|
LCALL INT0_ISR
|
||||||
|
RETI
|
||||||
|
ORG 000Bh
|
||||||
|
LCALL T0_ISR
|
||||||
|
RETI
|
||||||
|
ORG 0013h
|
||||||
|
LCALL INT1_ISR
|
||||||
|
RETI
|
||||||
|
ORG 001Bh
|
||||||
|
LCALL T1_ISR
|
||||||
|
RETI
|
||||||
|
ORG 0023h
|
||||||
|
LCALL UART_ISR
|
||||||
|
RETI
|
||||||
|
ORG 0030h
|
||||||
|
START:
|
||||||
|
MOV A,#11111110b
|
||||||
|
SETB IT0 ; Set External Interrupt 0 to be falling edge triggered
|
||||||
|
SETB EX0 ; Enable External Interrut 0
|
||||||
|
SETB EA ; Enable Interrupt
|
||||||
|
LEFT:
|
||||||
|
CJNE A,#01111111b,LOOP1
|
||||||
|
JMP RIGHT
|
||||||
|
LOOP1:
|
||||||
|
MOV P1,A
|
||||||
|
RL A
|
||||||
|
LCALL DELAY
|
||||||
|
SJMP LEFT
|
||||||
|
RIGHT:
|
||||||
|
CJNE A,#11111110b,LOOP2
|
||||||
|
JMP LEFT
|
||||||
|
LOOP2:
|
||||||
|
MOV P1,A
|
||||||
|
RR A
|
||||||
|
LCALL DELAY
|
||||||
|
SJMP RIGHT
|
||||||
|
|
||||||
|
INT0_ISR:
|
||||||
|
MOV R1,#3
|
||||||
|
FLASH:
|
||||||
|
MOV P1,#00h
|
||||||
|
LCALL DELAY
|
||||||
|
MOV P1,#0FFh
|
||||||
|
LCALL DELAY
|
||||||
|
DJNZ R1,FLASH
|
||||||
|
RET
|
||||||
|
T0_ISR:
|
||||||
|
RET
|
||||||
|
INT1_ISR:
|
||||||
|
RET
|
||||||
|
T1_ISR:
|
||||||
|
RET
|
||||||
|
UART_ISR:
|
||||||
|
RET
|
||||||
|
|
||||||
|
DELAY: MOV R5,#20 ;R5*20 mS
|
||||||
|
D1: MOV R6,#40
|
||||||
|
D2: MOV R7,#249
|
||||||
|
DJNZ R7,$
|
||||||
|
DJNZ R6,D2
|
||||||
|
DJNZ R5,D1
|
||||||
|
RET
|
||||||
|
END
|
||||||
@@ -1,13 +1,13 @@
|
|||||||
doc "Test function for Ceylon"
|
"Test function for Ceylon"
|
||||||
by "Enrique"
|
by ("Enrique")
|
||||||
shared void test() {
|
shared void test() {
|
||||||
print("test");
|
print("test");
|
||||||
}
|
}
|
||||||
|
|
||||||
doc "Test class for Ceylon"
|
"Test class for Ceylon"
|
||||||
shared class Test(name) satisfies Comparable<Test> {
|
shared class Test(name) satisfies Comparable<Test> {
|
||||||
shared String name;
|
shared String name;
|
||||||
shared actual String string = "Test " name ".";
|
shared actual String string = "Test ``name``.";
|
||||||
|
|
||||||
shared actual Comparison compare(Test other) {
|
shared actual Comparison compare(Test other) {
|
||||||
return name<=>other.name;
|
return name<=>other.name;
|
||||||
|
|||||||
11
samples/Clean/GenHylo.dcl
Normal file
11
samples/Clean/GenHylo.dcl
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
definition module GenHylo
|
||||||
|
|
||||||
|
import StdGeneric, GenMap
|
||||||
|
|
||||||
|
:: Fix f = In (f .(Fix f))
|
||||||
|
Out :: !u:(Fix v:a) -> v:(a w:(Fix v:a)), [u <= w]
|
||||||
|
|
||||||
|
hylo :: ((.f .b) -> .b) (.a -> (.f .a)) -> (.a -> .b) | gMap{|*->*|} f
|
||||||
|
cata :: (u:(f .a) -> .a) -> (Fix u:f) -> .a | gMap{|*->*|} f
|
||||||
|
ana :: (.a -> u:(f .a)) -> .a -> (Fix u:f) | gMap{|*->*|} f
|
||||||
|
|
||||||
9
samples/Clean/GenMap.dcl
Normal file
9
samples/Clean/GenMap.dcl
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
definition module GenMap
|
||||||
|
|
||||||
|
import StdGeneric
|
||||||
|
|
||||||
|
generic gMap a b :: .a -> .b
|
||||||
|
derive gMap c, UNIT, PAIR, EITHER, CONS, FIELD, OBJECT, {}, {!}
|
||||||
|
|
||||||
|
derive gMap [], (,), (,,), (,,,), (,,,,), (,,,,,), (,,,,,,), (,,,,,,,)
|
||||||
|
|
||||||
19
samples/Clean/GenMap.icl
Normal file
19
samples/Clean/GenMap.icl
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
implementation module GenMap
|
||||||
|
|
||||||
|
import StdClass, StdArray, StdInt, StdFunc
|
||||||
|
import StdGeneric, _Array
|
||||||
|
|
||||||
|
generic gMap a b :: .a -> .b
|
||||||
|
gMap{|c|} x = x
|
||||||
|
gMap{|UNIT|} x = x
|
||||||
|
gMap{|PAIR|} fx fy (PAIR x y) = PAIR (fx x) (fy y)
|
||||||
|
gMap{|EITHER|} fl fr (LEFT x) = LEFT (fl x)
|
||||||
|
gMap{|EITHER|} fl fr (RIGHT x) = RIGHT (fr x)
|
||||||
|
gMap{|CONS|} f (CONS x) = CONS (f x)
|
||||||
|
gMap{|FIELD|} f (FIELD x) = FIELD (f x)
|
||||||
|
gMap{|OBJECT|} f (OBJECT x) = OBJECT (f x)
|
||||||
|
gMap{|{}|} f xs = mapArray f xs
|
||||||
|
gMap{|{!}|} f xs = mapArray f xs
|
||||||
|
|
||||||
|
derive gMap [], (,), (,,), (,,,), (,,,,), (,,,,,), (,,,,,,), (,,,,,,,)
|
||||||
|
|
||||||
54
samples/Clean/fsieve.icl
Normal file
54
samples/Clean/fsieve.icl
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
module fsieve
|
||||||
|
|
||||||
|
/*
|
||||||
|
The Fast Sieve of Eratosthenes.
|
||||||
|
|
||||||
|
A sequential and optimized version of the sieve of Eratosthenes.
|
||||||
|
The program calculates a list of the first NrOfPrime primes.
|
||||||
|
The result of the program is the NrOfPrimes'th prime.
|
||||||
|
|
||||||
|
Strictness annotations have been added because the strictness analyser
|
||||||
|
is not able to deduce all strictness information. Removal of these !'s
|
||||||
|
will make the program about 20% slower.
|
||||||
|
|
||||||
|
On a machine without a math coprocessor the execution of this
|
||||||
|
program might take a (very) long time. Set NrOfPrimes to a smaller value.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import StdClass; // RWS
|
||||||
|
import StdInt, StdReal
|
||||||
|
|
||||||
|
NrOfPrimes :== 3000
|
||||||
|
|
||||||
|
// The sieve algorithm: generate an infinite list of all primes.
|
||||||
|
|
||||||
|
Primes::[Int]
|
||||||
|
Primes = pr where pr = [5 : Sieve 7 4 pr]
|
||||||
|
|
||||||
|
Sieve::Int !Int [Int] -> [Int]
|
||||||
|
Sieve g i prs
|
||||||
|
| IsPrime prs g (toInt (sqrt (toReal g))) = [g : Sieve` g i prs]
|
||||||
|
= Sieve (g + i) (6 - i) prs
|
||||||
|
|
||||||
|
Sieve`::Int Int [Int] -> [Int]
|
||||||
|
Sieve` g i prs = Sieve (g + i) (6 - i) prs
|
||||||
|
|
||||||
|
IsPrime::[Int] !Int Int -> Bool
|
||||||
|
IsPrime [f:r] pr bd | f>bd = True
|
||||||
|
| pr rem f==0 = False
|
||||||
|
= IsPrime r pr bd
|
||||||
|
|
||||||
|
// Select is used to get the NrOfPrimes'th prime from the infinite list.
|
||||||
|
|
||||||
|
Select::[x] Int -> x
|
||||||
|
Select [f:r] 1 = f
|
||||||
|
Select [f:r] n = Select r (n - 1)
|
||||||
|
|
||||||
|
|
||||||
|
/* The Start rule: Select the NrOfPrimes'th prime from the list of primes
|
||||||
|
generated by Primes.
|
||||||
|
*/
|
||||||
|
|
||||||
|
Start::Int
|
||||||
|
Start = Select [2, 3 : Primes] NrOfPrimes
|
||||||
|
|
||||||
99
samples/Clean/sem.icl
Normal file
99
samples/Clean/sem.icl
Normal file
@@ -0,0 +1,99 @@
|
|||||||
|
module monadicSemantics
|
||||||
|
|
||||||
|
import StdEnv, StdGeneric, GenMap, GenHylo
|
||||||
|
|
||||||
|
/* For fun I implemented the recursive datastructre Exp and Stm as fixpoints
|
||||||
|
This helps us define recursive functions on them (only a little bit though)
|
||||||
|
However deriving gMap for Fix did not works out of the box
|
||||||
|
I had to remove some uniqueness typing in GenMap and GenHylo */
|
||||||
|
:: Op = Plus | Minus | Times | Rem | Equal | LessThan
|
||||||
|
:: Var :== String
|
||||||
|
|
||||||
|
:: ExpP a = Int Int | Var Var | Op Op a a
|
||||||
|
:: Exp :== Fix ExpP
|
||||||
|
|
||||||
|
:: StmP a = Assign Var Exp | If Exp a a | While Exp a | Seq a a | Cont
|
||||||
|
:: Stm :== Fix StmP
|
||||||
|
|
||||||
|
derive gMap ExpP, StmP, Fix
|
||||||
|
|
||||||
|
// Environment. Semantics is basically Env -> Env
|
||||||
|
:: Env :== Var -> Int
|
||||||
|
:: Sem :== Env -> (Int, Env)
|
||||||
|
empty = \v . 0
|
||||||
|
|
||||||
|
// return
|
||||||
|
rtn :: Int -> Sem
|
||||||
|
rtn i = \e. (i, e)
|
||||||
|
|
||||||
|
// the usual bind
|
||||||
|
(>>=) infixl 1 :: Sem (Int->Sem) -> Sem
|
||||||
|
(>>=) x y = \e. (\(i,e2).y i e2) (x e)
|
||||||
|
(>>|) infixl 1 :: Sem Sem -> Sem
|
||||||
|
(>>|) x y = x >>= \_. y
|
||||||
|
|
||||||
|
// read variable from environment
|
||||||
|
read :: Var -> Sem
|
||||||
|
read v = \e. (e v, e)
|
||||||
|
|
||||||
|
// assign value to give variable in environment
|
||||||
|
write :: Var Int -> Sem
|
||||||
|
write v i = \e. (i, \w. if (w==v) i (e w))
|
||||||
|
|
||||||
|
// semantics
|
||||||
|
class sem a :: a -> Sem
|
||||||
|
|
||||||
|
operator :: Op -> Int -> Int -> Int
|
||||||
|
operator Plus = (+)
|
||||||
|
operator Minus = (-)
|
||||||
|
operator Times = (*)
|
||||||
|
operator Rem = rem
|
||||||
|
operator Equal = \x y . if (x==y) 1 0
|
||||||
|
operator LessThan = \x y . if (x< y) 1 0
|
||||||
|
|
||||||
|
// semantics of expressions
|
||||||
|
instance sem Exp where
|
||||||
|
sem x = cata phi x where
|
||||||
|
phi (Int n) = rtn n
|
||||||
|
phi (Var v) = read v
|
||||||
|
phi (Op op x y) = x >>= \v1. y >>= return o (operator op v1)
|
||||||
|
|
||||||
|
// semantics of statments
|
||||||
|
// NOTE: while will always return 0, as it might not even be executed
|
||||||
|
instance sem Stm where
|
||||||
|
sem x = cata phi x where
|
||||||
|
phi (Assign v e) = sem e >>= write v
|
||||||
|
phi (If e s1 s2) = sem e >>= \b . if (b<>0) s1 s2
|
||||||
|
phi stm=:(While e s) = sem e >>= \b . if (b<>0) (s >>| phi stm) (phi Cont)
|
||||||
|
phi (Seq s1 s2) = s1 >>| s2 // Here the cata *finally* pays off :D
|
||||||
|
phi Cont = rtn 0
|
||||||
|
|
||||||
|
// convenience functions
|
||||||
|
int = In o Int
|
||||||
|
var = In o Var
|
||||||
|
op o = In o2 (Op o)
|
||||||
|
assign = In o2 Assign
|
||||||
|
ifte e = In o2 (If e)
|
||||||
|
while = In o2 While
|
||||||
|
seq = In o2 Seq
|
||||||
|
cont = In Cont
|
||||||
|
|
||||||
|
// test case, also testing the new operator <
|
||||||
|
pEuclides =
|
||||||
|
while (op LessThan (int 0) (var "b"))(
|
||||||
|
seq (assign "r" (op Rem (var "a") (var "b")))
|
||||||
|
(seq (assign "a" (var "b"))
|
||||||
|
( (assign "b" (var "r")))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
Start = fst (program start) where
|
||||||
|
program = sem pEuclides >>| read "a"
|
||||||
|
start "a" = 9
|
||||||
|
start "b" = 12
|
||||||
|
start _ = 0
|
||||||
|
|
||||||
|
// Helper
|
||||||
|
(o2) infixr 9
|
||||||
|
(o2) f g x :== f o (g x)
|
||||||
|
|
||||||
14
samples/Clean/stack.dcl
Normal file
14
samples/Clean/stack.dcl
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
definition module stack
|
||||||
|
|
||||||
|
:: Stack a
|
||||||
|
|
||||||
|
newStack :: (Stack a)
|
||||||
|
push :: a (Stack a) -> Stack a
|
||||||
|
pushes :: [a] (Stack a) -> Stack a
|
||||||
|
pop :: (Stack a) -> Stack a
|
||||||
|
popn :: Int (Stack a) -> Stack a
|
||||||
|
top :: (Stack a) -> a
|
||||||
|
topn :: Int (Stack a) -> [a]
|
||||||
|
elements :: (Stack a) -> [a]
|
||||||
|
count :: (Stack a) -> Int
|
||||||
|
|
||||||
33
samples/Clean/stack.icl
Normal file
33
samples/Clean/stack.icl
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
implementation module stack
|
||||||
|
import StdEnv
|
||||||
|
|
||||||
|
:: Stack a :== [a]
|
||||||
|
|
||||||
|
newStack :: (Stack a)
|
||||||
|
newStack = []
|
||||||
|
|
||||||
|
push :: a (Stack a) -> Stack a
|
||||||
|
push x s = [x:s]
|
||||||
|
|
||||||
|
pushes :: [a] (Stack a) -> Stack a
|
||||||
|
pushes x s = x ++ s
|
||||||
|
|
||||||
|
pop :: (Stack a) -> Stack a
|
||||||
|
pop [] = abort "Cannot use pop on an empty stack"
|
||||||
|
pop [e:s] = s
|
||||||
|
|
||||||
|
popn :: Int (Stack a) -> Stack a
|
||||||
|
popn n s = drop n s
|
||||||
|
|
||||||
|
top :: (Stack a) -> a
|
||||||
|
top [] = abort "Cannot use top on an empty stack"
|
||||||
|
top [e:s] = e
|
||||||
|
|
||||||
|
topn :: Int (Stack a) -> [a]
|
||||||
|
topn n s = take n s
|
||||||
|
elements :: (Stack a) -> [a]
|
||||||
|
elements s = s
|
||||||
|
|
||||||
|
count :: (Stack a) -> Int
|
||||||
|
count s = length s
|
||||||
|
|
||||||
16
samples/Clean/streams.dcl
Normal file
16
samples/Clean/streams.dcl
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
definition module streams
|
||||||
|
|
||||||
|
import StdEnv
|
||||||
|
|
||||||
|
instance zero [Real]
|
||||||
|
instance one [Real]
|
||||||
|
instance + [Real]
|
||||||
|
instance - [Real]
|
||||||
|
instance * [Real]
|
||||||
|
instance / [Real]
|
||||||
|
|
||||||
|
X :: [Real]
|
||||||
|
invert :: [Real] -> [Real]
|
||||||
|
pow :: [Real] Int -> [Real]
|
||||||
|
(shuffle) infixl 7 :: [Real] [Real] -> [Real]
|
||||||
|
|
||||||
49
samples/Clean/streams.icl
Normal file
49
samples/Clean/streams.icl
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
implementation module streams
|
||||||
|
|
||||||
|
import StdEnv
|
||||||
|
|
||||||
|
instance zero [Real]
|
||||||
|
where
|
||||||
|
zero = [] //Infinite row of zeroes represented as empty list to ease computation
|
||||||
|
|
||||||
|
instance one [Real]
|
||||||
|
where
|
||||||
|
one = [1.0:zero]
|
||||||
|
|
||||||
|
instance + [Real]
|
||||||
|
where
|
||||||
|
(+) [s:s`] [t:t`] = [s+t:s`+t`]
|
||||||
|
(+) [s:s`] [] = [s:s`]
|
||||||
|
(+) [] [t:t`] = [t:t`]
|
||||||
|
(+) [] [] = []
|
||||||
|
|
||||||
|
instance - [Real]
|
||||||
|
where
|
||||||
|
(-) [s:s`] [t:t`] = [s-t:s`-t`]
|
||||||
|
(-) [s:s`] [] = [s:s`]
|
||||||
|
(-) [] [t:t`] = [-1.0] * [t:t`]
|
||||||
|
(-) [] [] = []
|
||||||
|
|
||||||
|
instance * [Real]
|
||||||
|
where
|
||||||
|
(*) [s:s`] [t:t`] = [s*t:s`*[t:t`]+[s]*t`]
|
||||||
|
(*) _ _ = []
|
||||||
|
|
||||||
|
instance / [Real]
|
||||||
|
where
|
||||||
|
(/) s t = s * (invert t)
|
||||||
|
|
||||||
|
X :: [Real]
|
||||||
|
X = [0.0:one]
|
||||||
|
|
||||||
|
invert :: [Real] -> [Real]
|
||||||
|
invert [s:s`] = [1.0/s:(invert [s:s`]) * s` * [-1.0/s]]
|
||||||
|
|
||||||
|
pow :: [Real] Int -> [Real]
|
||||||
|
pow s 0 = one
|
||||||
|
pow s n = s * pow s (n-1)
|
||||||
|
|
||||||
|
(shuffle) infixl 7 :: [Real] [Real] -> [Real]
|
||||||
|
(shuffle) [s:s`] [t:t`] = [s*t:s` shuffle [t:t`] + [s:s`] shuffle t`]
|
||||||
|
(shuffle) _ _ = []
|
||||||
|
|
||||||
8
samples/Forth/bitmap.frt
Normal file
8
samples/Forth/bitmap.frt
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
\ Bit arrays.
|
||||||
|
: bits ( u1 -- u2 ) 7 + 3 rshift ;
|
||||||
|
: bitmap ( u "name" -- ) create bits here over erase allot
|
||||||
|
does> ( u -- a x ) over 3 rshift + 1 rot 7 and lshift ;
|
||||||
|
: bit@ ( a x -- f ) swap c@ and ;
|
||||||
|
: 1bit ( a x -- ) over c@ or swap c! ;
|
||||||
|
: 0bit ( a x -- ) invert over c@ and swap c! ;
|
||||||
|
: bit! ( f a x -- ) rot if 1bit else 0bit then ;
|
||||||
7
samples/Forth/enum.frt
Normal file
7
samples/Forth/enum.frt
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
\ Implements ENUM.
|
||||||
|
|
||||||
|
\ Double DOES>!
|
||||||
|
: enum create 0 , does> create dup @ 1 rot +! , does> @ ;
|
||||||
|
|
||||||
|
\ But this is simpler.
|
||||||
|
: enum create 0 , does> dup @ constant 1 swap +! ;
|
||||||
8
samples/Forth/macros.frt
Normal file
8
samples/Forth/macros.frt
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
\ Simplifies compiling words.
|
||||||
|
|
||||||
|
: [[ ; immediate
|
||||||
|
: '<> >in @ ' swap >in ! <> ;
|
||||||
|
: (]]) begin dup '<> while postpone postpone repeat drop ;
|
||||||
|
: ]] ['] [[ (]]) ; immediate
|
||||||
|
|
||||||
|
( Usage: : foo ]] dup * [[ ; immediate : bar 42 foo . ; )
|
||||||
21
samples/Graph Modeling Language/sample.gml
Normal file
21
samples/Graph Modeling Language/sample.gml
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
graph
|
||||||
|
[
|
||||||
|
directed 0
|
||||||
|
node
|
||||||
|
[
|
||||||
|
id 0
|
||||||
|
label "Node 1"
|
||||||
|
value 100
|
||||||
|
]
|
||||||
|
node
|
||||||
|
[
|
||||||
|
id 1
|
||||||
|
label "Node 2"
|
||||||
|
value 200
|
||||||
|
]
|
||||||
|
edge
|
||||||
|
[
|
||||||
|
source 1
|
||||||
|
target 0
|
||||||
|
]
|
||||||
|
]
|
||||||
13
samples/Groff/sample.4
Normal file
13
samples/Groff/sample.4
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
.TH FOO 1
|
||||||
|
.SH NAME
|
||||||
|
foo \- bar
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.B foo
|
||||||
|
.I bar
|
||||||
|
.SH DESCRIPTION
|
||||||
|
Foo bar
|
||||||
|
.BR baz
|
||||||
|
quux.
|
||||||
|
.PP
|
||||||
|
.B Foo
|
||||||
|
bar baz.
|
||||||
12
samples/JavaScript/jsbuild.jsb
Normal file
12
samples/JavaScript/jsbuild.jsb
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
jsb.library('mylibrary', jsb.STATIC_LIBRARY, function(libObject) {
|
||||||
|
libObject.outputName = 'mylibrary';
|
||||||
|
libObject.cflags = [ '-Wall' ];
|
||||||
|
libObject.ldflags = [ '-pthread' ];
|
||||||
|
libObject.includePaths = [ 'src/include' ];
|
||||||
|
libObject.sources = [
|
||||||
|
'src/main.cpp',
|
||||||
|
'src/app.cpp'
|
||||||
|
];
|
||||||
|
});
|
||||||
|
|
||||||
|
jsb.build();
|
||||||
795
samples/LOLCODE/LOLTracer.lol
Normal file
795
samples/LOLCODE/LOLTracer.lol
Normal file
@@ -0,0 +1,795 @@
|
|||||||
|
HAI 1.3
|
||||||
|
OBTW
|
||||||
|
Author: Logan Kelly (logan.kelly@gmail.com)
|
||||||
|
Github: https://github.com/LoganKelly/LOLTracer
|
||||||
|
TLDR
|
||||||
|
|
||||||
|
OBTW prev is the number used in the randin function.
|
||||||
|
I had to declare it in global scope so that it
|
||||||
|
would retain its value between calls to randin.
|
||||||
|
TLDR
|
||||||
|
I HAS A prev ITZ 0
|
||||||
|
I HAS A rand_max ITZ 104729
|
||||||
|
|
||||||
|
|
||||||
|
OBTW Equivalent to C's rand() function, except returns
|
||||||
|
a number in the range of 0 to rand_max.
|
||||||
|
TLDR
|
||||||
|
HOW IZ I randin
|
||||||
|
I HAS A a ITZ 33083
|
||||||
|
I HAS A c ITZ 67607
|
||||||
|
prev R MOD OF SUM OF PRODUKT OF prev AN a AN c AN rand_max
|
||||||
|
FOUND YR prev
|
||||||
|
IF U SAY SO
|
||||||
|
|
||||||
|
|
||||||
|
BTW Returns a random number within the range of 0-1.
|
||||||
|
HOW IZ I rand_onein
|
||||||
|
I HAS A rand_num ITZ I IZ randin MKAY
|
||||||
|
rand_num IS NOW A NUMBAR
|
||||||
|
I HAS A rand_max_float ITZ MAEK rand_max A NUMBAR
|
||||||
|
FOUND YR QUOSHUNT OF rand_num AN rand_max_float
|
||||||
|
IF U SAY SO
|
||||||
|
|
||||||
|
|
||||||
|
OBTW Equivalent to C ceil() function. Returns the next
|
||||||
|
largest integer for the given number.
|
||||||
|
TLDR
|
||||||
|
HOW IZ I ceilin YR num
|
||||||
|
I HAS A int_num ITZ num
|
||||||
|
int_num IS NOW A NUMBR
|
||||||
|
BOTH SAEM int_num AN num, O RLY?
|
||||||
|
YA RLY, FOUND YR num
|
||||||
|
OIC
|
||||||
|
DIFFRINT num AN SMALLR OF num AN 0, O RLY?
|
||||||
|
YA RLY
|
||||||
|
int_num R SUM OF int_num AN 1
|
||||||
|
FOUND YR MAEK int_num A NUMBAR
|
||||||
|
OIC
|
||||||
|
DIFFRINT num AN BIGGR OF num AN 0, O RLY?
|
||||||
|
YA RLY
|
||||||
|
FOUND YR MAEK int_num A NUMBAR
|
||||||
|
OIC
|
||||||
|
IF U SAY SO
|
||||||
|
|
||||||
|
|
||||||
|
OBTW Convert a number to hexadecimal. This
|
||||||
|
is returned as a string.
|
||||||
|
TLDR
|
||||||
|
HOW IZ I decimal_to_hex YR num
|
||||||
|
I HAS A i ITZ 0
|
||||||
|
I HAS A rem
|
||||||
|
I HAS A hex_num ITZ A BUKKIT
|
||||||
|
I HAS A decimal_num ITZ num
|
||||||
|
IM IN YR num_loop
|
||||||
|
rem R MOD OF decimal_num AN 16
|
||||||
|
I HAS A hex_digit
|
||||||
|
rem, WTF?
|
||||||
|
OMG 10, hex_digit R "A", GTFO
|
||||||
|
OMG 11, hex_digit R "B", GTFO
|
||||||
|
OMG 12, hex_digit R "C", GTFO
|
||||||
|
OMG 13, hex_digit R "D", GTFO
|
||||||
|
OMG 14, hex_digit R "E", GTFO
|
||||||
|
OMG 15, hex_digit R "F", GTFO
|
||||||
|
OMGWTF, hex_digit R rem
|
||||||
|
OIC
|
||||||
|
hex_num HAS A SRS i ITZ hex_digit
|
||||||
|
decimal_num R QUOSHUNT OF decimal_num AN 16
|
||||||
|
BOTH SAEM decimal_num AN 0, O RLY?
|
||||||
|
YA RLY, GTFO
|
||||||
|
NO WAI, i R SUM OF i AN 1
|
||||||
|
OIC
|
||||||
|
IM OUTTA YR num_loop
|
||||||
|
I HAS A hex_string ITZ A YARN
|
||||||
|
IM IN YR string_reverse
|
||||||
|
DIFFRINT i AN BIGGR OF i AN 0, O RLY?
|
||||||
|
YA RLY, GTFO
|
||||||
|
OIC
|
||||||
|
hex_string R SMOOSH hex_string AN hex_num'Z SRS i MKAY
|
||||||
|
i R DIFF OF i AN 1
|
||||||
|
IM OUTTA YR string_reverse
|
||||||
|
FOUND YR hex_string
|
||||||
|
IF U SAY SO
|
||||||
|
|
||||||
|
|
||||||
|
OBTW Convert a number to binary. This is returned
|
||||||
|
as a bukkit which has slots number 0-N where
|
||||||
|
n is equal to the number of binary digits - 1.
|
||||||
|
It also has a length slot which is equal to
|
||||||
|
the number of binary digits.
|
||||||
|
TLDR
|
||||||
|
HOW IZ I decimal_to_binary YR num
|
||||||
|
I HAS A i ITZ 0
|
||||||
|
I HAS A decimal_num ITZ num
|
||||||
|
I HAS A binary_num ITZ A BUKKIT
|
||||||
|
IM IN YR num_loop
|
||||||
|
binary_num HAS A SRS i ITZ MOD OF decimal_num AN 2
|
||||||
|
decimal_num R QUOSHUNT OF decimal_num AN 2
|
||||||
|
BOTH SAEM decimal_num AN 0, O RLY?
|
||||||
|
YA RLY
|
||||||
|
I HAS A length ITZ SUM OF i AN 1
|
||||||
|
binary_num HAS A length ITZ length
|
||||||
|
GTFO
|
||||||
|
NO WAI, i R SUM OF i AN 1
|
||||||
|
OIC
|
||||||
|
IM OUTTA YR num_loop
|
||||||
|
FOUND YR binary_num
|
||||||
|
IF U SAY SO
|
||||||
|
|
||||||
|
|
||||||
|
OBTW Bitwise and two binary numbers. The numbers
|
||||||
|
must be provided in the format returned by
|
||||||
|
decimal_to_binary.
|
||||||
|
TLDR
|
||||||
|
HOW IZ I bitwise_andin YR first_num AN YR second_num
|
||||||
|
I HAS A binary_first_num ITZ I IZ decimal_to_binary YR first_num MKAY
|
||||||
|
I HAS A binary_second_num ITZ I IZ decimal_to_binary YR second_num MKAY
|
||||||
|
I HAS A first_length ITZ binary_first_num'Z length
|
||||||
|
I HAS A second_length ITZ binary_second_num'Z length
|
||||||
|
I HAS A max_length ITZ BIGGR OF first_length AN second_length
|
||||||
|
I HAS A final_binary ITZ A BUKKIT
|
||||||
|
I HAS A final_length ITZ 0
|
||||||
|
I HAS A i ITZ 0
|
||||||
|
IM IN YR num_loop
|
||||||
|
BOTH SAEM i AN max_length, O RLY?
|
||||||
|
YA RLY, GTFO
|
||||||
|
OIC
|
||||||
|
I HAS A first_binary ITZ 0
|
||||||
|
I HAS A second_binary ITZ 0
|
||||||
|
DIFFRINT i AN BIGGR OF i AN first_length, O RLY?
|
||||||
|
YA RLY, first_binary R binary_first_num'Z SRS i
|
||||||
|
OIC
|
||||||
|
DIFFRINT i AN BIGGR OF i AN second_length, O RLY?
|
||||||
|
YA RLY, second_binary R binary_second_num'Z SRS i
|
||||||
|
OIC
|
||||||
|
EITHER OF BOTH SAEM first_binary AN 0 AN ...
|
||||||
|
BOTH SAEM second_binary AN 0, O RLY?
|
||||||
|
YA RLY, final_binary HAS A SRS i ITZ 0
|
||||||
|
NO WAI
|
||||||
|
final_binary HAS A SRS i ITZ 1
|
||||||
|
final_length R SUM OF i AN 1
|
||||||
|
OIC
|
||||||
|
i R SUM OF i AN 1
|
||||||
|
IM OUTTA YR num_loop
|
||||||
|
final_binary HAS A length ITZ final_length
|
||||||
|
FOUND YR final_binary
|
||||||
|
IF U SAY SO
|
||||||
|
|
||||||
|
|
||||||
|
OBTW Bitshift left a binary number by num_bits.
|
||||||
|
The binary number must be provided in the format
|
||||||
|
returned by decimal_to_binary.
|
||||||
|
TLDR
|
||||||
|
HOW IZ I bit_shift_leftin YR num AN YR num_bits
|
||||||
|
I HAS A binary_num ITZ num
|
||||||
|
I HAS A length ITZ binary_num'Z length
|
||||||
|
I HAS A i ITZ SUM OF DIFF OF length AN 1 AN num_bits
|
||||||
|
I HAS A shifted_binary_num ITZ A BUKKIT
|
||||||
|
IM IN YR num_loop
|
||||||
|
BOTH SAEM i AN -1, O RLY?
|
||||||
|
YA RLY, GTFO
|
||||||
|
OIC
|
||||||
|
I HAS A unshifted_index ITZ DIFF OF i AN num_bits
|
||||||
|
BOTH SAEM unshifted_index AN BIGGR OF unshifted_index AN 0, O RLY?
|
||||||
|
YA RLY
|
||||||
|
shifted_binary_num HAS A SRS i ITZ binary_num'Z SRS unshifted_index
|
||||||
|
NO WAI
|
||||||
|
shifted_binary_num HAS A SRS i ITZ 0
|
||||||
|
OIC
|
||||||
|
i R DIFF OF i AN 1
|
||||||
|
IM OUTTA YR num_loop
|
||||||
|
shifted_binary_num HAS A length ITZ SUM OF binary_num'Z length AN num_bits
|
||||||
|
FOUND YR shifted_binary_num
|
||||||
|
IF U SAY SO
|
||||||
|
|
||||||
|
|
||||||
|
OBTW Convert a binary number into a decimal number.
|
||||||
|
The binary number must be provided in the format
|
||||||
|
return by decimal_to_binary.
|
||||||
|
TLDR
|
||||||
|
HOW IZ I binary_to_decimal YR binary_num
|
||||||
|
I HAS A length ITZ binary_num'Z length
|
||||||
|
I HAS A decimal_num ITZ 0
|
||||||
|
I HAS A i ITZ 0
|
||||||
|
IM IN YR num_loop
|
||||||
|
BOTH SAEM i AN length, O RLY?
|
||||||
|
YA RLY, GTFO
|
||||||
|
OIC
|
||||||
|
I HAS A binary_value ITZ binary_num'Z SRS i
|
||||||
|
I HAS A decimal_value ITZ 0
|
||||||
|
BOTH SAEM binary_value AN 1, O RLY?
|
||||||
|
YA RLY, decimal_value R I IZ power_of YR 2 AN YR i MKAY
|
||||||
|
OIC
|
||||||
|
decimal_num R SUM OF decimal_num AN decimal_value
|
||||||
|
i R SUM OF i AN 1
|
||||||
|
IM OUTTA YR num_loop
|
||||||
|
FOUND YR decimal_num
|
||||||
|
IF U SAY SO
|
||||||
|
|
||||||
|
|
||||||
|
OBTW Equivalent to C's pow() function. Raises
|
||||||
|
base to the power of exponent.
|
||||||
|
TLDR
|
||||||
|
HOW IZ I power_of YR base AN YR exponent
|
||||||
|
I HAS A i ITZ 0
|
||||||
|
I HAS A num ITZ 1
|
||||||
|
IM IN YR num_loop
|
||||||
|
BOTH SAEM i AN exponent, O RLY?
|
||||||
|
YA RLY, GTFO
|
||||||
|
OIC
|
||||||
|
num R PRODUKT OF num AN base
|
||||||
|
i R SUM OF i AN 1
|
||||||
|
IM OUTTA YR num_loop
|
||||||
|
FOUND YR num
|
||||||
|
IF U SAY SO
|
||||||
|
|
||||||
|
|
||||||
|
OBTW Return a binary number as a YARN.
|
||||||
|
The binary number must be provided in the format
|
||||||
|
return by decimal_to_binary.
|
||||||
|
TLDR
|
||||||
|
HOW IZ I binary_to_string YR binary_num
|
||||||
|
I HAS A binary_string ITZ A YARN
|
||||||
|
I HAS A i ITZ DIFF OF binary_num'Z length AN 1
|
||||||
|
IM IN YR string_reverse
|
||||||
|
DIFFRINT i AN BIGGR OF i AN 0, O RLY?
|
||||||
|
YA RLY, GTFO
|
||||||
|
OIC
|
||||||
|
binary_string R SMOOSH binary_string AN binary_num'Z SRS i MKAY
|
||||||
|
i R DIFF OF i AN 1
|
||||||
|
IM OUTTA YR string_reverse
|
||||||
|
FOUND YR binary_string
|
||||||
|
IF U SAY SO
|
||||||
|
|
||||||
|
OBTW Converts a hexadecimal number to the character
|
||||||
|
equivalent in UNICODE. This was originally used
|
||||||
|
in an attempt to write out to the P6 format of PPM,
|
||||||
|
but the string produced by VISIBLE didn't seem to be
|
||||||
|
properly formatted for some reason. Instead I fell back
|
||||||
|
to P3 of PPM and wrote out to regular ascii format.
|
||||||
|
TLDR
|
||||||
|
HOW IZ I hex_to_char YR hex_string
|
||||||
|
OBTW This is a hack I found for converting hexadecimal strings
|
||||||
|
into their unicode character equivalents. Instead of using
|
||||||
|
the ":" character directly, we escape it and get it using its
|
||||||
|
unicode hex value (3A). This allows us to assemble the string
|
||||||
|
with our inserted hex value without errors.
|
||||||
|
TLDR
|
||||||
|
FOUND YR SMOOSH ":(3A)" AN "(" AN hex_string AN ")" MKAY
|
||||||
|
IF U SAY SO
|
||||||
|
|
||||||
|
|
||||||
|
OBTW Equivalent to C's square() function. However it will only
|
||||||
|
produce accurate results if the number is no larger than
|
||||||
|
1048576. See the note below. This is based upon Newton's
|
||||||
|
Approximation Method as adapted in C at this website (#11):
|
||||||
|
|
||||||
|
http://www.codeproject.com/Articles/69941/Best-Square-Root-Method-Algorithm-Function-Precisi
|
||||||
|
TLDR
|
||||||
|
HOW IZ I square_rootin YR number
|
||||||
|
OBTW Forcing a comparison between the accuracy and a number
|
||||||
|
which is so big that its precision is larger than the
|
||||||
|
accuracy causes an infinite loop to occur. For this
|
||||||
|
reason we have to set any number larger than 2^20 to
|
||||||
|
a value below it.
|
||||||
|
TLDR
|
||||||
|
BOTH SAEM number AN BIGGR OF number AN 1048576.00, O RLY?
|
||||||
|
YA RLY, number R 1048575.00
|
||||||
|
OIC
|
||||||
|
I HAS A accuracy ITZ 0.0001
|
||||||
|
I HAS A lower ITZ A NUMBAR
|
||||||
|
I HAS A upper ITZ A NUMBAR
|
||||||
|
I HAS A guess ITZ A NUMBAR
|
||||||
|
DIFFRINT number AN BIGGR OF number AN 1.0, O RLY?
|
||||||
|
YA RLY
|
||||||
|
lower R number
|
||||||
|
upper R 1.0
|
||||||
|
NO WAI
|
||||||
|
lower R 1.0
|
||||||
|
upper R number
|
||||||
|
OIC
|
||||||
|
IM IN YR LOOP
|
||||||
|
I HAS A delta ITZ DIFF OF upper AN lower
|
||||||
|
BOTH SAEM delta AN SMALLR OF delta AN accuracy, O RLY?
|
||||||
|
YA RLY, GTFO
|
||||||
|
OIC
|
||||||
|
I HAS A guess ITZ QUOSHUNT OF SUM OF lower AN upper AN 2.0
|
||||||
|
I HAS A guess_squared ITZ PRODUKT OF guess AN guess
|
||||||
|
DIFFRINT guess_squared AN SMALLR OF guess_squared AN number, O RLY?
|
||||||
|
YA RLY
|
||||||
|
upper R guess
|
||||||
|
NO WAI
|
||||||
|
lower R guess
|
||||||
|
OIC
|
||||||
|
IM OUTTA YR LOOP
|
||||||
|
FOUND YR QUOSHUNT OF SUM OF lower AN upper AN 2.0
|
||||||
|
IF U SAY SO
|
||||||
|
|
||||||
|
|
||||||
|
OBTW
|
||||||
|
The intersection test for line [o, d]
|
||||||
|
Return 2 if a hit was found (and also return distance t and bouncing ray n).
|
||||||
|
Return 0 if no hit was found but ray goes upward
|
||||||
|
Return 1 if no hit was found but ray goes downward
|
||||||
|
TLDR
|
||||||
|
HOW IZ I tracin YR o AN YR d
|
||||||
|
I HAS A t ITZ 1000000000
|
||||||
|
I HAS A m ITZ 0
|
||||||
|
BOTH SAEM d'Z z AN 0, O RLY?
|
||||||
|
YA RLY, d'Z z R 0.00001
|
||||||
|
OIC
|
||||||
|
I HAS A p ITZ QUOSHUNT OF DIFF OF 0 AN o'Z z AN d'Z z
|
||||||
|
I HAS A n ITZ LIEK A Vector
|
||||||
|
DIFFRINT p AN SMALLR OF p AN 0.01, O RLY?
|
||||||
|
YA RLY
|
||||||
|
t R p
|
||||||
|
n R Vector IZ constructin YR 0.0 AN YR 0.0 AN YR 1.0 MKAY
|
||||||
|
m R 1
|
||||||
|
OIC
|
||||||
|
|
||||||
|
BTW The world is encoded in sphere_positions, with 9 lines and 19 columns
|
||||||
|
I HAS A k ITZ 18
|
||||||
|
IM IN YR column_loop BTW For each column of objects
|
||||||
|
BOTH SAEM k AN -1, O RLY?
|
||||||
|
YA RLY, GTFO
|
||||||
|
OIC
|
||||||
|
|
||||||
|
I HAS A j ITZ 8
|
||||||
|
IM IN YR line_loop BTW For each line on that column
|
||||||
|
BOTH SAEM j AN -1, O RLY?
|
||||||
|
YA RLY, GTFO
|
||||||
|
OIC
|
||||||
|
|
||||||
|
I HAS A sphere_positions_line ITZ sphere_positions'Z SRS j
|
||||||
|
sphere_positions_line'Z SRS k, O RLY?
|
||||||
|
YA RLY
|
||||||
|
BTW There is a sphere, but does the ray hit it?
|
||||||
|
p R Vector IZ addin YR o AN YR ...
|
||||||
|
Vector IZ constructin YR DIFF OF 0 AN k AN ...
|
||||||
|
YR 0 AN ...
|
||||||
|
YR DIFF OF DIFF OF 0 AN j AN 4 MKAY ...
|
||||||
|
MKAY
|
||||||
|
I HAS A b ITZ Vector IZ dot_productin YR p AN YR d MKAY
|
||||||
|
I HAS A q_c ITZ DIFF OF Vector IZ dot_productin YR p AN YR p MKAY AN 1
|
||||||
|
I HAS A q ITZ DIFF OF PRODUKT OF b AN b AN q_c
|
||||||
|
|
||||||
|
|
||||||
|
DIFFRINT q AN SMALLR OF q AN 0, O RLY?
|
||||||
|
YA RLY
|
||||||
|
BTW It does, compute the distance camera-sphere
|
||||||
|
I HAS A s ITZ DIFF OF DIFF OF 0 AN b AN I IZ square_rootin YR q MKAY
|
||||||
|
|
||||||
|
|
||||||
|
BOTH OF DIFFRINT s AN BIGGR OF s AN t AN ...
|
||||||
|
DIFFRINT s AN SMALLR OF s AN 0.01, O RLY?
|
||||||
|
YA RLY
|
||||||
|
BTW So far this is the minimum distance, save it. And
|
||||||
|
BTW also compute the bouncing ray vector into 'n'
|
||||||
|
t R s
|
||||||
|
I HAS A bouncing_ray ITZ Vector IZ scalin YR direction AN YR t MKAY
|
||||||
|
bouncing_ray R Vector IZ addin YR p AN YR bouncing_ray MKAY
|
||||||
|
n R Vector IZ normalizin YR bouncing_ray MKAY
|
||||||
|
m R 2
|
||||||
|
OIC
|
||||||
|
OIC
|
||||||
|
OIC
|
||||||
|
j R DIFF OF j AN 1
|
||||||
|
IM OUTTA YR line_loop
|
||||||
|
k R DIFF OF k AN 1
|
||||||
|
IM OUTTA YR column_loop
|
||||||
|
I HAS A result ITZ A BUKKIT
|
||||||
|
result HAS A m ITZ m
|
||||||
|
result HAS A t ITZ t
|
||||||
|
result HAS A n ITZ n
|
||||||
|
FOUND YR result
|
||||||
|
IF U SAY SO
|
||||||
|
|
||||||
|
|
||||||
|
OBTW
|
||||||
|
Sample the world and return the pixel color for
|
||||||
|
a ray [o, d]
|
||||||
|
TLDR
|
||||||
|
HOW IZ I samplin YR o AN YR d
|
||||||
|
|
||||||
|
BTW Search for an intersection ray Vs. world
|
||||||
|
I HAS A result ITZ I IZ tracin YR o AN YR d MKAY
|
||||||
|
I HAS A m ITZ result'Z m
|
||||||
|
I HAS A t ITZ result'Z t
|
||||||
|
I HAS A n ITZ result'Z n
|
||||||
|
|
||||||
|
BOTH SAEM m AN 0, O RLY?
|
||||||
|
YA RLY
|
||||||
|
BTW No sphere found and the ray goes upward: Generate a sky color
|
||||||
|
I HAS A vec_result ITZ Vector IZ constructin YR 0.7 AN YR 0.6 AN YR 1.0 MKAY
|
||||||
|
|
||||||
|
I HAS A z_component ITZ d'Z z
|
||||||
|
DIFFRINT z_component AN BIGGR OF z_component AN 0, O RLY?
|
||||||
|
YA RLY, z_component R 0
|
||||||
|
OIC
|
||||||
|
I HAS A vec_num ITZ DIFF OF 1 AN z_component
|
||||||
|
vec_num R I IZ power_of YR vec_num AN YR 4 MKAY
|
||||||
|
FOUND YR Vector IZ scalin YR vec_result AN YR vec_num MKAY
|
||||||
|
OIC
|
||||||
|
|
||||||
|
BTW h = intersection coordinate
|
||||||
|
I HAS A h ITZ Vector IZ scalin YR d AN YR t MKAY
|
||||||
|
h R Vector IZ addin YR o AN YR h MKAY
|
||||||
|
BTW l = direction to light (with random delta for soft shadows)
|
||||||
|
I HAS A l ITZ LIEK A Vector
|
||||||
|
l HAS A x ITZ SUM OF 9 AN I IZ rand_onein MKAY
|
||||||
|
l HAS A y ITZ SUM OF 9 AN I IZ rand_onein MKAY
|
||||||
|
l HAS A z ITZ 16
|
||||||
|
I HAS A l_two ITZ Vector IZ scalin YR h AN YR -1.0 MKAY
|
||||||
|
l R Vector IZ addin YR l AN YR l_two MKAY
|
||||||
|
l R Vector IZ normalizin YR l MKAY
|
||||||
|
BTW r = The half-vector
|
||||||
|
I HAS A r ITZ Vector IZ dot_productin YR n AN YR d MKAY
|
||||||
|
r R PRODUKT OF r AN -2
|
||||||
|
r R Vector IZ scalin YR n AN YR r MKAY
|
||||||
|
r R Vector IZ addin YR d AN YR r MKAY
|
||||||
|
|
||||||
|
BTW Calculate the lambertian factor
|
||||||
|
I HAS A b ITZ Vector IZ dot_productin YR l AN YR n MKAY
|
||||||
|
|
||||||
|
BTW Calculate illumination factor (lambertian coefficient > 0 or in shadow)?
|
||||||
|
I HAS A illumination_result ITZ I IZ tracin YR h AN YR l MKAY
|
||||||
|
I HAS A i_m ITZ illumination_result'Z m
|
||||||
|
EITHER OF DIFFRINT b AN BIGGR OF b AN 0 AN BOTH SAEM i_m AN 2, O RLY?
|
||||||
|
YA RLY, b R 0
|
||||||
|
OIC
|
||||||
|
|
||||||
|
BTW Calculate the color 'p' with diffuse and specular component
|
||||||
|
I HAS A base
|
||||||
|
DIFFRINT b AN SMALLR OF b AN 0, O RLY?
|
||||||
|
YA RLY, base R 1
|
||||||
|
NO WAI, base R 0
|
||||||
|
OIC
|
||||||
|
base R Vector IZ scalin YR r AN YR base MKAY
|
||||||
|
base R Vector IZ dot_productin YR l AN YR r MKAY
|
||||||
|
I HAS A p ITZ I IZ power_of YR base AN YR 99 MKAY
|
||||||
|
|
||||||
|
BOTH SAEM m AN 1, O RLY?
|
||||||
|
YA RLY
|
||||||
|
BTW No sphere was hit and the ray was going downward: Generate a floor color
|
||||||
|
h R Vector IZ scalin YR h AN YR 0.2 MKAY
|
||||||
|
I HAS A ceil_h_x ITZ I IZ ceilin YR h'Z x MKAY
|
||||||
|
I HAS A ceil_h_y ITZ I IZ ceilin YR h'Z y MKAY
|
||||||
|
I HAS A ceil_h ITZ SUM OF ceil_h_x AN ceil_h_y
|
||||||
|
ceil_h IS NOW A NUMBR
|
||||||
|
I HAS A color_choice ITZ MOD OF ceil_h AN 2
|
||||||
|
I HAS A color ITZ LIEK A Vector
|
||||||
|
color_choice, O RLY?
|
||||||
|
YA RLY
|
||||||
|
color HAS A x ITZ 3
|
||||||
|
color HAS A y ITZ 1
|
||||||
|
color HAS A z ITZ 1
|
||||||
|
NO WAI
|
||||||
|
color HAS A x ITZ 3
|
||||||
|
color HAS A y ITZ 3
|
||||||
|
color HAS A z ITZ 3
|
||||||
|
OIC
|
||||||
|
FOUND YR Vector IZ scalin YR color AN YR SUM OF PRODUKT OF b AN 0.2 AN 0.1 MKAY
|
||||||
|
OIC
|
||||||
|
|
||||||
|
BTW m == 2 A sphere was hit. Cast a ray bouncing from the sphere surface.
|
||||||
|
I HAS A sphere_color ITZ LIEK A Vector
|
||||||
|
sphere_color HAS A x ITZ p
|
||||||
|
sphere_color HAS A y ITZ p
|
||||||
|
sphere_color HAS A z ITZ p
|
||||||
|
I HAS A recursive_color ITZ I IZ samplin YR h AN YR r MKAY
|
||||||
|
BTW Attenuate color by 50% since it is bouncing (* .5)
|
||||||
|
recursive_color R Vector IZ scalin YR recursive_color AN YR 0.5 MKAY
|
||||||
|
FOUND YR Vector IZ addin YR sphere_color AN YR recursive_color MKAY
|
||||||
|
IF U SAY SO
|
||||||
|
|
||||||
|
|
||||||
|
OBTW The vector class provides functionality for all the common
|
||||||
|
linear algebra operations performed on vectors.
|
||||||
|
TLDR
|
||||||
|
O HAI IM Vector
|
||||||
|
I HAS A x ITZ 0
|
||||||
|
I HAS A y ITZ 0
|
||||||
|
I HAS A z ITZ 0
|
||||||
|
|
||||||
|
BTW Add vector_one and vector_two
|
||||||
|
HOW IZ I addin YR vector_one AN YR vector_two
|
||||||
|
I HAS A result ITZ LIEK A Vector
|
||||||
|
result HAS A x ITZ 0
|
||||||
|
result HAS A y ITZ 0
|
||||||
|
result HAS A z ITZ 0
|
||||||
|
result'Z x R SUM OF vector_one'Z x AN vector_two'Z x
|
||||||
|
result'Z y R SUM OF vector_one'Z y AN vector_two'Z y
|
||||||
|
result'Z z R SUM OF vector_one'Z z AN vector_two'Z z
|
||||||
|
FOUND YR result
|
||||||
|
IF U SAY SO
|
||||||
|
|
||||||
|
BTW Scale vector_one by value
|
||||||
|
HOW IZ I scalin YR vector_one AN YR value
|
||||||
|
I HAS A result ITZ LIEK A Vector
|
||||||
|
result HAS A x ITZ 0
|
||||||
|
result HAS A y ITZ 0
|
||||||
|
result HAS A z ITZ 0
|
||||||
|
result'Z x R PRODUKT OF vector_one'Z x AN value
|
||||||
|
result'Z y R PRODUKT OF vector_one'Z y AN value
|
||||||
|
result'Z z R PRODUKT OF vector_one'Z z AN value
|
||||||
|
FOUND YR result
|
||||||
|
IF U SAY SO
|
||||||
|
|
||||||
|
BTW Dot product of vector_one and vector_two
|
||||||
|
HOW IZ I dot_productin YR vector_one AN YR vector_two
|
||||||
|
FOUND YR SUM OF SUM OF PRODUKT OF vector_one'Z x AN vector_two'Z x AN ...
|
||||||
|
PRODUKT OF vector_one'Z y AN vector_two'Z y AN ...
|
||||||
|
PRODUKT OF vector_one'Z z AN vector_two'Z z
|
||||||
|
IF U SAY SO
|
||||||
|
|
||||||
|
BTW Cross product of vector_one and vector_two
|
||||||
|
HOW IZ I cross_productin YR vector_one AN YR vector_two
|
||||||
|
I HAS A result ITZ LIEK A Vector
|
||||||
|
result HAS A x ITZ 0
|
||||||
|
result HAS A y ITZ 0
|
||||||
|
result HAS A z ITZ 0
|
||||||
|
result'Z x R DIFF OF PRODUKT OF vector_one'Z y AN vector_two'Z z AN ...
|
||||||
|
PRODUKT OF vector_one'Z z AN vector_two'Z y
|
||||||
|
result'Z y R DIFF OF PRODUKT OF vector_one'Z z AN vector_two'Z x AN ...
|
||||||
|
PRODUKT OF vector_one'Z x AN vector_two'Z z
|
||||||
|
result'Z z R DIFF OF PRODUKT OF vector_one'Z x AN vector_two'Z y AN ...
|
||||||
|
PRODUKT OF vector_one'Z y AN vector_two'Z x
|
||||||
|
FOUND YR result
|
||||||
|
IF U SAY SO
|
||||||
|
|
||||||
|
BTW Length of vector_one
|
||||||
|
HOW IZ I lengthin YR vector_one
|
||||||
|
FOUND YR I IZ square_rootin YR ...
|
||||||
|
SUM OF SUM OF PRODUKT OF vector_one'Z x AN vector_one'Z x AN ...
|
||||||
|
PRODUKT OF vector_one'Z y AN vector_one'Z y AN ...
|
||||||
|
PRODUKT OF vector_one'Z z AN vector_one'Z z MKAY
|
||||||
|
IF U SAY SO
|
||||||
|
|
||||||
|
BTW Normalize vector_one
|
||||||
|
HOW IZ I normalizin YR vector_one
|
||||||
|
I HAS A result ITZ LIEK A Vector
|
||||||
|
result HAS A x ITZ 0
|
||||||
|
result HAS A y ITZ 0
|
||||||
|
result HAS A z ITZ 0
|
||||||
|
I HAS A length ITZ Vector IZ lengthin YR vector_one MKAY
|
||||||
|
BOTH SAEM length AN 0, O RLY?
|
||||||
|
YA RLY
|
||||||
|
length R 1
|
||||||
|
OIC
|
||||||
|
result'Z x R QUOSHUNT OF vector_one'Z x AN length
|
||||||
|
result'Z y R QUOSHUNT OF vector_one'Z y AN length
|
||||||
|
result'Z z R QUOSHUNT OF vector_one'Z z AN length
|
||||||
|
FOUND YR result
|
||||||
|
IF U SAY SO
|
||||||
|
|
||||||
|
BTW Printable YARN version of vector
|
||||||
|
HOW IZ I to_stringin YR vector
|
||||||
|
FOUND YR SMOOSH "[" AN vector'Z x AN ", " ...
|
||||||
|
AN vector'Z y AN ", " ...
|
||||||
|
AN vector'Z z AN "]" MKAY
|
||||||
|
IF U SAY SO
|
||||||
|
|
||||||
|
BTW Create and return a vector with components x, y, and z
|
||||||
|
HOW IZ I constructin YR x AN YR y AN YR z
|
||||||
|
I HAS A result ITZ LIEK A Vector
|
||||||
|
result HAS A x ITZ x
|
||||||
|
result HAS A y ITZ y
|
||||||
|
result HAS A z ITZ z
|
||||||
|
FOUND YR result
|
||||||
|
IF U SAY SO
|
||||||
|
KTHX
|
||||||
|
|
||||||
|
OBTW The positions of the spheres are essentially
|
||||||
|
stored in a 2-D array. This differs from Kensler's
|
||||||
|
version where he used bit flags to store the
|
||||||
|
positions in a compressed and quickly accessed
|
||||||
|
manner. Unfortunately for us, bit operations
|
||||||
|
in LOLCODE were too slow for this to be a tenable
|
||||||
|
solution.
|
||||||
|
TLDR
|
||||||
|
I HAS A sphere_positions ITZ A BUKKIT
|
||||||
|
I HAS A sphere_positions_0 ITZ A BUKKIT
|
||||||
|
IM IN YR LOOP UPPIN YR pos_index TIL BOTH SAEM pos_index AN 19
|
||||||
|
sphere_positions_0 HAS A SRS pos_index ITZ FAIL
|
||||||
|
IM OUTTA YR LOOP
|
||||||
|
sphere_positions HAS A SRS 0 ITZ sphere_positions_0
|
||||||
|
I HAS A sphere_positions_1 ITZ A BUKKIT
|
||||||
|
sphere_positions_1 HAS A SRS 0 ITZ WIN
|
||||||
|
BTW sphere_positions_1 HAS A SRS 0 ITZ FAIL
|
||||||
|
sphere_positions_1 HAS A SRS 1 ITZ FAIL
|
||||||
|
sphere_positions_1 HAS A SRS 2 ITZ WIN
|
||||||
|
BTW sphere_positions_1 HAS A SRS 2 ITZ FAIL
|
||||||
|
sphere_positions_1 HAS A SRS 3 ITZ FAIL
|
||||||
|
sphere_positions_1 HAS A SRS 4 ITZ WIN
|
||||||
|
BTW sphere_positions_1 HAS A SRS 4 ITZ FAIL
|
||||||
|
sphere_positions_1 HAS A SRS 5 ITZ FAIL
|
||||||
|
sphere_positions_1 HAS A SRS 6 ITZ FAIL
|
||||||
|
sphere_positions_1 HAS A SRS 7 ITZ WIN
|
||||||
|
BTW sphere_positions_1 HAS A SRS 7 ITZ FAIL
|
||||||
|
sphere_positions_1 HAS A SRS 8 ITZ FAIL
|
||||||
|
sphere_positions_1 HAS A SRS 9 ITZ WIN
|
||||||
|
BTW sphere_positions_1 HAS A SRS 9 ITZ FAIL
|
||||||
|
sphere_positions_1 HAS A SRS 10 ITZ FAIL
|
||||||
|
sphere_positions_1 HAS A SRS 11 ITZ WIN
|
||||||
|
BTW sphere_positions_1 HAS A SRS 11 ITZ FAIL
|
||||||
|
sphere_positions_1 HAS A SRS 12 ITZ FAIL
|
||||||
|
sphere_positions_1 HAS A SRS 13 ITZ FAIL
|
||||||
|
sphere_positions_1 HAS A SRS 14 ITZ WIN
|
||||||
|
BTWsphere_positions_1 HAS A SRS 14 ITZ FAIL
|
||||||
|
sphere_positions_1 HAS A SRS 15 ITZ FAIL
|
||||||
|
sphere_positions_1 HAS A SRS 16 ITZ WIN
|
||||||
|
BTW sphere_positions_1 HAS A SRS 16 ITZ FAIL
|
||||||
|
sphere_positions_1 HAS A SRS 17 ITZ FAIL
|
||||||
|
sphere_positions_1 HAS A SRS 18 ITZ WIN
|
||||||
|
BTW sphere_positions_1 HAS A SRS 18 ITZ FAIL
|
||||||
|
sphere_positions HAS A SRS 1 ITZ sphere_positions_1
|
||||||
|
I HAS A sphere_positions_2 ITZ A BUKKIT
|
||||||
|
IM IN YR LOOP UPPIN YR pos_index TIL BOTH SAEM pos_index AN 19
|
||||||
|
sphere_positions_2 HAS A SRS pos_index ITZ FAIL
|
||||||
|
IM OUTTA YR LOOP
|
||||||
|
sphere_positions HAS A SRS 2 ITZ sphere_positions_2
|
||||||
|
I HAS A sphere_positions_3 ITZ A BUKKIT
|
||||||
|
sphere_positions_3 HAS A SRS 0 ITZ FAIL
|
||||||
|
sphere_positions_3 HAS A SRS 1 ITZ FAIL
|
||||||
|
sphere_positions_3 HAS A SRS 2 ITZ FAIL
|
||||||
|
sphere_positions_3 HAS A SRS 3 ITZ FAIL
|
||||||
|
sphere_positions_3 HAS A SRS 4 ITZ WIN
|
||||||
|
BTW sphere_positions_3 HAS A SRS 4 ITZ FAIL
|
||||||
|
sphere_positions_3 HAS A SRS 5 ITZ FAIL
|
||||||
|
sphere_positions_3 HAS A SRS 6 ITZ FAIL
|
||||||
|
sphere_positions_3 HAS A SRS 7 ITZ WIN
|
||||||
|
BTW sphere_positions_3 HAS A SRS 7 ITZ FAIL
|
||||||
|
sphere_positions_3 HAS A SRS 8 ITZ FAIL
|
||||||
|
sphere_positions_3 HAS A SRS 9 ITZ FAIL
|
||||||
|
sphere_positions_3 HAS A SRS 10 ITZ FAIL
|
||||||
|
sphere_positions_3 HAS A SRS 11 ITZ WIN
|
||||||
|
sphere_positions_3 HAS A SRS 12 ITZ FAIL
|
||||||
|
sphere_positions_3 HAS A SRS 13 ITZ FAIL
|
||||||
|
sphere_positions_3 HAS A SRS 14 ITZ FAIL
|
||||||
|
sphere_positions_3 HAS A SRS 15 ITZ FAIL
|
||||||
|
sphere_positions_3 HAS A SRS 16 ITZ FAIL
|
||||||
|
sphere_positions_3 HAS A SRS 17 ITZ FAIL
|
||||||
|
sphere_positions_3 HAS A SRS 18 ITZ WIN
|
||||||
|
BTW sphere_positions_3 HAS A SRS 18 ITZ FAIL
|
||||||
|
sphere_positions HAS A SRS 3 ITZ sphere_positions_3
|
||||||
|
I HAS A sphere_positions_4 ITZ A BUKKIT
|
||||||
|
IM IN YR LOOP UPPIN YR pos_index TIL BOTH SAEM pos_index AN 19
|
||||||
|
sphere_positions_4 HAS A SRS pos_index ITZ FAIL
|
||||||
|
IM OUTTA YR LOOP
|
||||||
|
sphere_positions HAS A SRS 4 ITZ sphere_positions_4
|
||||||
|
I HAS A sphere_positions_5 ITZ A BUKKIT
|
||||||
|
sphere_positions_5 HAS A SRS 0 ITZ FAIL
|
||||||
|
sphere_positions_5 HAS A SRS 1 ITZ FAIL
|
||||||
|
sphere_positions_5 HAS A SRS 2 ITZ FAIL
|
||||||
|
sphere_positions_5 HAS A SRS 3 ITZ FAIL
|
||||||
|
sphere_positions_5 HAS A SRS 4 ITZ WIN
|
||||||
|
BTW sphere_positions_5 HAS A SRS 4 ITZ FAIL
|
||||||
|
sphere_positions_5 HAS A SRS 5 ITZ FAIL
|
||||||
|
sphere_positions_5 HAS A SRS 6 ITZ FAIL
|
||||||
|
sphere_positions_5 HAS A SRS 7 ITZ WIN
|
||||||
|
BTW sphere_positions_5 HAS A SRS 7 ITZ FAIL
|
||||||
|
sphere_positions_5 HAS A SRS 8 ITZ FAIL
|
||||||
|
sphere_positions_5 HAS A SRS 9 ITZ WIN
|
||||||
|
BTW sphere_positions_5 HAS A SRS 9 ITZ FAIL
|
||||||
|
sphere_positions_5 HAS A SRS 10 ITZ FAIL
|
||||||
|
sphere_positions_5 HAS A SRS 11 ITZ WIN
|
||||||
|
BTW sphere_positions_5 HAS A SRS 11 ITZ FAIL
|
||||||
|
sphere_positions_5 HAS A SRS 12 ITZ FAIL
|
||||||
|
sphere_positions_5 HAS A SRS 13 ITZ FAIL
|
||||||
|
sphere_positions_5 HAS A SRS 14 ITZ FAIL
|
||||||
|
sphere_positions_5 HAS A SRS 15 ITZ FAIL
|
||||||
|
sphere_positions_5 HAS A SRS 16 ITZ FAIL
|
||||||
|
sphere_positions_5 HAS A SRS 17 ITZ FAIL
|
||||||
|
sphere_positions_5 HAS A SRS 18 ITZ WIN
|
||||||
|
BTW sphere_positions_5 HAS A SRS 18 ITZ FAIL
|
||||||
|
sphere_positions HAS A SRS 5 ITZ sphere_positions_5
|
||||||
|
I HAS A sphere_positions_6 ITZ A BUKKIT
|
||||||
|
IM IN YR LOOP UPPIN YR pos_index TIL BOTH SAEM pos_index AN 19
|
||||||
|
sphere_positions_6 HAS A SRS pos_index ITZ FAIL
|
||||||
|
IM OUTTA YR LOOP
|
||||||
|
sphere_positions HAS A SRS 6 ITZ sphere_positions_6
|
||||||
|
I HAS A sphere_positions_7 ITZ A BUKKIT
|
||||||
|
IM IN YR LOOP UPPIN YR pos_index TIL BOTH SAEM pos_index AN 19
|
||||||
|
sphere_positions_7 HAS A SRS pos_index ITZ FAIL
|
||||||
|
IM OUTTA YR LOOP
|
||||||
|
sphere_positions HAS A SRS 7 ITZ sphere_positions_7
|
||||||
|
I HAS A sphere_positions_8 ITZ A BUKKIT
|
||||||
|
IM IN YR LOOP UPPIN YR pos_index TIL BOTH SAEM pos_index AN 19
|
||||||
|
sphere_positions_8 HAS A SRS pos_index ITZ FAIL
|
||||||
|
IM OUTTA YR LOOP
|
||||||
|
sphere_positions HAS A SRS 8 ITZ sphere_positions_8
|
||||||
|
|
||||||
|
BTW Camera direction
|
||||||
|
I HAS A g ITZ Vector IZ constructin YR -6.0 AN YR -16.0 AN YR 0.0 MKAY
|
||||||
|
g R Vector IZ normalizin YR g MKAY
|
||||||
|
|
||||||
|
BTW Camera up vector
|
||||||
|
I HAS A a ITZ Vector IZ constructin YR 0.0 AN YR 0.0 AN YR 1.0 MKAY
|
||||||
|
a R Vector IZ cross_productin YR a AN YR g MKAY
|
||||||
|
a R Vector IZ normalizin YR a MKAY
|
||||||
|
a R Vector IZ scalin YR a AN YR 0.002 MKAY
|
||||||
|
BTW Camera right vector
|
||||||
|
I HAS A b ITZ Vector IZ cross_productin YR g AN YR a MKAY
|
||||||
|
b R Vector IZ normalizin YR b MKAY
|
||||||
|
b R Vector IZ scalin YR b AN YR 0.002 MKAY
|
||||||
|
BTW Camera eye offset
|
||||||
|
I HAS A c ITZ Vector IZ addin YR a AN YR b MKAY
|
||||||
|
c R Vector IZ scalin YR c AN YR -256.0 MKAY
|
||||||
|
c R Vector IZ addin YR c AN YR g MKAY
|
||||||
|
|
||||||
|
I HAS A max_x ITZ 511
|
||||||
|
I HAS A max_y ITZ max_x
|
||||||
|
BTW Issue the PPM Header info
|
||||||
|
VISIBLE "P3 " SUM OF max_x AN 1 " " SUM OF max_y AN 1 " 255"!
|
||||||
|
|
||||||
|
I HAS A viewpoint ITZ Vector IZ constructin YR 17 AN YR 16 AN YR 8 MKAY
|
||||||
|
|
||||||
|
I HAS A y ITZ max_y
|
||||||
|
IM IN YR y_loop
|
||||||
|
BOTH SAEM y AN -1, O RLY?
|
||||||
|
YA RLY, GTFO
|
||||||
|
OIC
|
||||||
|
I HAS A x ITZ max_x
|
||||||
|
IM IN YR x_loop
|
||||||
|
BOTH SAEM x AN -1, O RLY?
|
||||||
|
YA RLY, GTFO
|
||||||
|
OIC
|
||||||
|
I HAS A pixel_color ITZ Vector IZ constructin YR 13 AN YR 13 AN YR 13 MKAY
|
||||||
|
|
||||||
|
I HAS A rays ITZ 64
|
||||||
|
IM IN YR ray_loop
|
||||||
|
BOTH SAEM rays AN 0, O RLY?
|
||||||
|
YA RLY, GTFO
|
||||||
|
OIC
|
||||||
|
|
||||||
|
BTW The delta to apply to the origin of the view (For Depth of View blur).
|
||||||
|
I HAS A a_rand ITZ DIFF OF I IZ rand_onein MKAY AN 0.5
|
||||||
|
I HAS A t_a ITZ Vector IZ scalin YR a AN YR a_rand MKAY
|
||||||
|
t_a R Vector IZ scalin YR t_a AN YR 99.0 MKAY
|
||||||
|
I HAS A b_rand ITZ DIFF OF I IZ rand_onein MKAY AN 0.5
|
||||||
|
I HAS A t_b ITZ Vector IZ scalin YR b AN YR b_rand MKAY
|
||||||
|
t_b R Vector IZ scalin YR t_b AN YR 99.0 MKAY
|
||||||
|
I HAS A t ITZ Vector IZ addin YR t_a AN YR t_b MKAY
|
||||||
|
|
||||||
|
I HAS A origin ITZ Vector IZ addin YR viewpoint AN YR t MKAY
|
||||||
|
|
||||||
|
BTW Ray direction with random deltas for stochastic sampling
|
||||||
|
I HAS A direction_up ITZ SUM OF I IZ rand_onein MKAY AN x
|
||||||
|
direction_up R Vector IZ scalin YR a AN YR direction_up MKAY
|
||||||
|
I HAS A direction_right ITZ SUM OF I IZ rand_onein MKAY AN y
|
||||||
|
direction_right R Vector IZ scalin YR b AN YR direction_right MKAY
|
||||||
|
I HAS A direction_t ITZ Vector IZ scalin YR t AN YR -1 MKAY
|
||||||
|
I HAS A direction ITZ Vector IZ addin YR direction_right AN YR direction_up MKAY
|
||||||
|
direction R Vector IZ addin YR direction AN YR c MKAY
|
||||||
|
direction R Vector IZ scalin YR direction AN YR 16 MKAY
|
||||||
|
direction R Vector IZ addin YR direction AN YR direction_t MKAY
|
||||||
|
direction R Vector IZ normalizin YR direction MKAY
|
||||||
|
|
||||||
|
I HAS A sample_color ITZ I IZ samplin YR origin AN YR direction MKAY
|
||||||
|
sample_color R Vector IZ scalin YR sample_color AN YR 3.5 MKAY
|
||||||
|
BTW + pixel_color for color accumulation
|
||||||
|
pixel_color R Vector IZ addin YR sample_color AN YR pixel_color MKAY
|
||||||
|
rays R DIFF OF rays AN 1
|
||||||
|
IM OUTTA YR ray_loop
|
||||||
|
I HAS A write_color ITZ pixel_color
|
||||||
|
write_color'Z x IS NOW A NUMBR
|
||||||
|
write_color'Z y IS NOW A NUMBR
|
||||||
|
write_color'Z z IS NOW A NUMBR
|
||||||
|
DIFFRINT write_color'Z x AN BIGGR OF write_color'Z x AN 0, O RLY?
|
||||||
|
YA RLY, write_color'Z x R 0
|
||||||
|
OIC
|
||||||
|
DIFFRINT write_color'Z y AN BIGGR OF write_color'Z y AN 0, O RLY?
|
||||||
|
YA RLY, write_color'Z y R 0
|
||||||
|
OIC
|
||||||
|
DIFFRINT write_color'Z z AN BIGGR OF write_color'Z z AN 0, O RLY?
|
||||||
|
YA RLY, write_color'Z z R 0
|
||||||
|
OIC
|
||||||
|
VISIBLE " " write_color'Z x " " ...
|
||||||
|
" " write_color'Z y " " ...
|
||||||
|
" " write_color'Z z " "!
|
||||||
|
x R DIFF OF x AN 1
|
||||||
|
IM OUTTA YR x_loop
|
||||||
|
y R DIFF OF y AN 1
|
||||||
|
IM OUTTA YR y_loop
|
||||||
|
|
||||||
|
KTHXBYE
|
||||||
28
samples/Lua/wsapi.fcgi
Executable file
28
samples/Lua/wsapi.fcgi
Executable file
@@ -0,0 +1,28 @@
|
|||||||
|
#!/usr/bin/lua
|
||||||
|
|
||||||
|
-- Generic WSAPI FastCGI launcher, extracts application to launch
|
||||||
|
-- from SCRIPT_FILENAME/PATH_TRANSLATED, each application (defined
|
||||||
|
-- by its script entry point) gets an isolated Lua VM; sequential
|
||||||
|
-- requests to the same application go to the same VM
|
||||||
|
|
||||||
|
pcall(require,"luarocks.require")
|
||||||
|
|
||||||
|
local common = require "wsapi.common"
|
||||||
|
local fastcgi = require "wsapi.fastcgi"
|
||||||
|
|
||||||
|
local ONE_HOUR = 60 * 60
|
||||||
|
local ONE_DAY = 24 * ONE_HOUR
|
||||||
|
|
||||||
|
local wsapi_loader = common.make_loader{
|
||||||
|
isolated = true, -- isolate each script in its own Lua state
|
||||||
|
filename = nil, -- if you want to force the launch of a single script
|
||||||
|
launcher = "wsapi.fcgi", -- the name of this script
|
||||||
|
reload = false, -- if you want to reload the application on every request
|
||||||
|
period = ONE_HOUR, -- frequency of Lua state staleness checks
|
||||||
|
ttl = ONE_DAY, -- time-to-live for Lua states
|
||||||
|
vars = -- order of checking for the path of the script
|
||||||
|
{ "SCRIPT_FILENAME",
|
||||||
|
"PATH_TRANSLATED" }
|
||||||
|
}
|
||||||
|
|
||||||
|
fastcgi.run(wsapi_loader)
|
||||||
3
samples/PHP/prefix.fcgi
Executable file
3
samples/PHP/prefix.fcgi
Executable file
@@ -0,0 +1,3 @@
|
|||||||
|
<?php
|
||||||
|
echo $_SERVER[$_GET["var"]];
|
||||||
|
?>
|
||||||
68
samples/Papyrus/CAMTEST_OverShoulderME.psc
Normal file
68
samples/Papyrus/CAMTEST_OverShoulderME.psc
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
Scriptname CAMTEST_OverShoulderME extends activemagiceffect
|
||||||
|
{Play with camera effects}
|
||||||
|
|
||||||
|
;--=== Imports ===--
|
||||||
|
|
||||||
|
Import Utility
|
||||||
|
Import Game
|
||||||
|
|
||||||
|
;--=== Properties ===--
|
||||||
|
|
||||||
|
Actor Property PlayerRef Auto
|
||||||
|
ActorBase Property CAMTEST_CameraActor Auto
|
||||||
|
|
||||||
|
;--=== Variables ===--
|
||||||
|
|
||||||
|
Actor Player
|
||||||
|
|
||||||
|
Actor Camera
|
||||||
|
|
||||||
|
Actor Target
|
||||||
|
|
||||||
|
Float PosX
|
||||||
|
Float PosY
|
||||||
|
Float PosZ
|
||||||
|
Float SpeedMult
|
||||||
|
|
||||||
|
ObjectReference Mist
|
||||||
|
ObjectReference Fog
|
||||||
|
|
||||||
|
;--=== Events ===--
|
||||||
|
|
||||||
|
Event OnInit()
|
||||||
|
Player = PlayerRef
|
||||||
|
EndEvent
|
||||||
|
|
||||||
|
Event onEffectStart(Actor akTarget, Actor akCaster)
|
||||||
|
Camera = Player.PlaceActorAtMe(CAMTEST_CameraActor)
|
||||||
|
Camera.EnableAI(False)
|
||||||
|
Camera.SetScale(0.1)
|
||||||
|
Camera.TranslateTo(Player.X + 40,Player.Y,Player.Z,0,0,0,800,30)
|
||||||
|
DisablePlayerControls(abMovement = true, abFighting = true, abCamSwitch = true, abLooking = true, abSneaking = true, abMenu = true, abActivate = true, abJournalTabs = false)
|
||||||
|
SetPlayerAIDriven(True)
|
||||||
|
ForceThirdPerson()
|
||||||
|
SetHUDCartMode()
|
||||||
|
SetInChargen(True, True, False)
|
||||||
|
SetCameraTarget(Camera)
|
||||||
|
ForceFirstPerson()
|
||||||
|
Wait(1)
|
||||||
|
Camera.SplineTranslateTo(Player.X + 4000,Player.Y,Player.Z + 1000,15,0,Camera.GetHeadingAngle(Player) + Camera.GetAngleZ(),1800,800,100)
|
||||||
|
; Camera.SetLookAt(Player)
|
||||||
|
Wait(10)
|
||||||
|
Camera.SplineTranslateTo(Player.X + 1000,Player.Y - 500,Player.Z + 500,25,0,Camera.GetHeadingAngle(Player) + Camera.GetAngleZ(),1800,800,100)
|
||||||
|
Wait(10)
|
||||||
|
SetHUDCartMode(False)
|
||||||
|
SetCameraTarget(Player)
|
||||||
|
SetInChargen(False, False, False)
|
||||||
|
EnablePlayerControls()
|
||||||
|
SetPlayerAIDriven(False)
|
||||||
|
EndEvent
|
||||||
|
|
||||||
|
Event onUpdate()
|
||||||
|
EndEvent
|
||||||
|
|
||||||
|
Event onEffectFinish(Actor akTarget, Actor akCaster)
|
||||||
|
EndEvent
|
||||||
|
|
||||||
|
;--=== Functions ===--
|
||||||
|
|
||||||
1
samples/Papyrus/vMFX_FXPlugin.psc
Normal file
1
samples/Papyrus/vMFX_FXPlugin.psc
Normal file
@@ -0,0 +1 @@
|
|||||||
|
Scriptname vMFX_FXPlugin extends Quest
|
||||||
120
samples/Papyrus/vSCM_MetaQuestScript.psc
Normal file
120
samples/Papyrus/vSCM_MetaQuestScript.psc
Normal file
@@ -0,0 +1,120 @@
|
|||||||
|
Scriptname vSCM_MetaQuestScript extends Quest
|
||||||
|
{Do initialization and track variables for scripts}
|
||||||
|
|
||||||
|
;--=== Imports ===--
|
||||||
|
|
||||||
|
Import Utility
|
||||||
|
Import Game
|
||||||
|
|
||||||
|
;--=== Properties ===--
|
||||||
|
|
||||||
|
Actor Property PlayerRef Auto
|
||||||
|
|
||||||
|
Float Property ModVersion Auto Hidden
|
||||||
|
|
||||||
|
String Property ModName = "Smarter Combat Music" Auto Hidden
|
||||||
|
|
||||||
|
Message Property vSCM_ModLoadedMSG Auto
|
||||||
|
Message Property vSCM_ModUpdatedMSG Auto
|
||||||
|
|
||||||
|
;--=== Variables ===--
|
||||||
|
|
||||||
|
Float _CurrentVersion
|
||||||
|
String _sCurrentVersion
|
||||||
|
|
||||||
|
Bool _Running
|
||||||
|
|
||||||
|
Float _ScriptLatency
|
||||||
|
Float _StartTime
|
||||||
|
Float _EndTime
|
||||||
|
|
||||||
|
;--=== Events ===--
|
||||||
|
|
||||||
|
Event OnInit()
|
||||||
|
If ModVersion == 0
|
||||||
|
DoUpkeep(True)
|
||||||
|
EndIf
|
||||||
|
EndEvent
|
||||||
|
|
||||||
|
Event OnReset()
|
||||||
|
Debug.Trace("SCM: Metaquest event: OnReset")
|
||||||
|
EndEvent
|
||||||
|
|
||||||
|
Event OnGameReloaded()
|
||||||
|
Debug.Trace("SCM: Metaquest event: OnGameReloaded")
|
||||||
|
EndEvent
|
||||||
|
|
||||||
|
;--=== Functions ===--
|
||||||
|
|
||||||
|
Function DoUpkeep(Bool DelayedStart = True)
|
||||||
|
;FIXME: CHANGE THIS WHEN UPDATING!
|
||||||
|
_CurrentVersion = 0.01
|
||||||
|
_sCurrentVersion = GetVersionString(_CurrentVersion)
|
||||||
|
String sErrorMessage
|
||||||
|
If DelayedStart
|
||||||
|
Wait(RandomFloat(2,4))
|
||||||
|
EndIf
|
||||||
|
Debug.Trace("SCM: " + ModName)
|
||||||
|
Debug.Trace("SCM: Performing upkeep...")
|
||||||
|
Debug.Trace("SCM: Loaded version is " + GetVersionString(ModVersion) + ", Current version is " + _sCurrentVersion)
|
||||||
|
If ModVersion == 0
|
||||||
|
Debug.Trace("SCM: Newly installed, doing initialization...")
|
||||||
|
DoInit()
|
||||||
|
If ModVersion == _CurrentVersion
|
||||||
|
Debug.Trace("SCM: Initialization succeeded.")
|
||||||
|
Else
|
||||||
|
Debug.Trace("SCM: WARNING! Initialization had a problem!")
|
||||||
|
EndIf
|
||||||
|
ElseIf ModVersion < _CurrentVersion
|
||||||
|
Debug.Trace("SCM: Installed version is older. Starting the upgrade...")
|
||||||
|
DoUpgrade()
|
||||||
|
If ModVersion != _CurrentVersion
|
||||||
|
Debug.Trace("SCM: WARNING! Upgrade failed!")
|
||||||
|
Debug.MessageBox("WARNING! " + ModName + " upgrade failed for some reason. You should report this to the mod author.")
|
||||||
|
EndIf
|
||||||
|
Debug.Trace("SCM: Upgraded to " + _CurrentVersion)
|
||||||
|
vSCM_ModUpdatedMSG.Show(_CurrentVersion)
|
||||||
|
Else
|
||||||
|
Debug.Trace("SCM: Loaded, no updates.")
|
||||||
|
;CheckForOrphans()
|
||||||
|
EndIf
|
||||||
|
CheckForExtras()
|
||||||
|
UpdateConfig()
|
||||||
|
Debug.Trace("SCM: Upkeep complete!")
|
||||||
|
EndFunction
|
||||||
|
|
||||||
|
Function DoInit()
|
||||||
|
Debug.Trace("SCM: Initializing...")
|
||||||
|
_Running = True
|
||||||
|
ModVersion = _CurrentVersion
|
||||||
|
vSCM_ModLoadedMSG.Show(_CurrentVersion)
|
||||||
|
EndFunction
|
||||||
|
|
||||||
|
Function DoUpgrade()
|
||||||
|
_Running = False
|
||||||
|
If ModVersion < 0.01
|
||||||
|
Debug.Trace("SCM: Upgrading to 0.01...")
|
||||||
|
ModVersion = 0.01
|
||||||
|
EndIf
|
||||||
|
_Running = True
|
||||||
|
Debug.Trace("SCM: Upgrade complete!")
|
||||||
|
EndFunction
|
||||||
|
|
||||||
|
Function UpdateConfig()
|
||||||
|
Debug.Trace("SCM: Updating configuration...")
|
||||||
|
|
||||||
|
Debug.Trace("SCM: Updated configuration values, some scripts may update in the background!")
|
||||||
|
EndFunction
|
||||||
|
|
||||||
|
String Function GetVersionString(Float fVersion)
|
||||||
|
Int Major = Math.Floor(fVersion) as Int
|
||||||
|
Int Minor = ((fVersion - (Major as Float)) * 100.0) as Int
|
||||||
|
If Minor < 10
|
||||||
|
Return Major + ".0" + Minor
|
||||||
|
Else
|
||||||
|
Return Major + "." + Minor
|
||||||
|
EndIf
|
||||||
|
EndFunction
|
||||||
|
|
||||||
|
Function CheckForExtras()
|
||||||
|
EndFunction
|
||||||
193
samples/Pascal/custforms.pp
Normal file
193
samples/Pascal/custforms.pp
Normal file
@@ -0,0 +1,193 @@
|
|||||||
|
unit custforms;
|
||||||
|
|
||||||
|
{$mode objfpc}{$H+}
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
uses
|
||||||
|
Classes, SysUtils, Forms;
|
||||||
|
|
||||||
|
Type
|
||||||
|
|
||||||
|
{ TCustomFormDescr }
|
||||||
|
|
||||||
|
TCustomFormDescr = Class
|
||||||
|
private
|
||||||
|
FAuthor: String;
|
||||||
|
FCaption: String;
|
||||||
|
FCategory: String;
|
||||||
|
FDescription: String;
|
||||||
|
FFormClass: TFormClass;
|
||||||
|
FLazPackage: String;
|
||||||
|
FUnitName: String;
|
||||||
|
public
|
||||||
|
Constructor Create(AFormClass : TFormClass; const APackage: string);
|
||||||
|
Constructor Create(AFormClass : TFormClass; Const ACaption,ADescription,AUnit,APackage : String);
|
||||||
|
Property FormClass : TFormClass Read FFormClass Write FFormClass;
|
||||||
|
Property Caption : String Read FCaption Write FCaption;
|
||||||
|
Property Description : String Read FDescription Write FDescription;
|
||||||
|
Property UnitName : String Read FUnitName Write FUnitName;
|
||||||
|
Property Category : String Read FCategory Write FCategory;
|
||||||
|
Property Author : String Read FAuthor Write FAuthor;
|
||||||
|
Property LazPackage : String Read FLazPackage Write FLazPackage;
|
||||||
|
end;
|
||||||
|
|
||||||
|
Procedure RegisterCustomForm(Descr : TCustomFormDescr);
|
||||||
|
Procedure RegisterCustomForm(AFormClass : TFormClass; const APackage: string);
|
||||||
|
Procedure RegisterCustomForm(AFormClass : TFormClass; Const AUnitName, APackage : String);
|
||||||
|
|
||||||
|
Procedure Register;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
uses ProjectIntf,NewItemIntf,contnrs;
|
||||||
|
|
||||||
|
Const
|
||||||
|
SAppFrameWork = 'Custom forms';
|
||||||
|
SInstanceOf = 'Create a new instance of %s';
|
||||||
|
|
||||||
|
{ TCustomFormDescr }
|
||||||
|
|
||||||
|
constructor TCustomFormDescr.Create(AFormClass: TFormClass;
|
||||||
|
const APackage: string);
|
||||||
|
|
||||||
|
Var
|
||||||
|
N,U : String;
|
||||||
|
|
||||||
|
begin
|
||||||
|
N:=AFormClass.ClassName;
|
||||||
|
U:=N;
|
||||||
|
If (Upcase(U[1])='T') then
|
||||||
|
Delete(U,1,1);
|
||||||
|
Create(AFormClass,N,Format(SInstanceOf,[N]),U,APackage);
|
||||||
|
end;
|
||||||
|
|
||||||
|
constructor TCustomFormDescr.Create(AFormClass: TFormClass;
|
||||||
|
const ACaption, ADescription, AUnit, APackage: String);
|
||||||
|
begin
|
||||||
|
FFormClass:=AFormClass;
|
||||||
|
FCaption:=ACaption;
|
||||||
|
FDescription:=ADescription;
|
||||||
|
FUnitName:=AUnit;
|
||||||
|
FCategory:=SAppFrameWork;
|
||||||
|
FLazPackage:=APackage;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// Registration code.
|
||||||
|
|
||||||
|
Type
|
||||||
|
{ TCustomFormFileDescriptor }
|
||||||
|
TCustomFormFileDescriptor = Class(TFileDescPascalUnitWithResource)
|
||||||
|
private
|
||||||
|
FFormDescr: TCustomFormDescr;
|
||||||
|
Public
|
||||||
|
Constructor Create(ADescr : TCustomFormDescr);
|
||||||
|
Property FormDescr : TCustomFormDescr Read FFormDescr;
|
||||||
|
Function GetLocalizedName : String; override;
|
||||||
|
Function GetLocalizedDescription : String; override;
|
||||||
|
Function GetInterfaceUsesSection : String; override;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TCustomFormFileDescriptor }
|
||||||
|
|
||||||
|
constructor TCustomFormFileDescriptor.Create(ADescr: TCustomFormDescr);
|
||||||
|
begin
|
||||||
|
Inherited Create;
|
||||||
|
FFormDescr:=ADescr;
|
||||||
|
ResourceClass:=FFormDescr.FFormClass;
|
||||||
|
Name:=FFormDescr.Caption;
|
||||||
|
RequiredPackages:=ADescr.LazPackage;
|
||||||
|
//Writeln('TCustomFormFileDescriptor.Create RequiredPackages=',RequiredPackages);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TCustomFormFileDescriptor.GetLocalizedName: String;
|
||||||
|
begin
|
||||||
|
Result:=FFormDescr.Caption;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TCustomFormFileDescriptor.GetLocalizedDescription: String;
|
||||||
|
begin
|
||||||
|
Result:=FFormDescr.Description;
|
||||||
|
If (FFormDescr.Author<>'') then
|
||||||
|
Result:=Result+LineEnding+'By '+FFormDescr.Author;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TCustomFormFileDescriptor.GetInterfaceUsesSection: String;
|
||||||
|
begin
|
||||||
|
Result:=inherited GetInterfaceUsesSection;
|
||||||
|
Result:=Result+',Forms,'+FFormDescr.UnitName;
|
||||||
|
end;
|
||||||
|
|
||||||
|
Var
|
||||||
|
CustomFormList : TObjectList;
|
||||||
|
|
||||||
|
Procedure RegisterCustomForm(Descr : TCustomFormDescr);
|
||||||
|
|
||||||
|
begin
|
||||||
|
CustomFormList.Add(Descr);
|
||||||
|
end;
|
||||||
|
|
||||||
|
Procedure RegisterCustomForm(AFormClass : TFormClass; const APackage: string);
|
||||||
|
|
||||||
|
begin
|
||||||
|
RegisterCustomForm(TCustomFormDescr.Create(AFormClass,APackage));
|
||||||
|
end;
|
||||||
|
|
||||||
|
Procedure RegisterCustomForm(AFormClass : TFormClass; Const AUnitName, APackage : String);
|
||||||
|
|
||||||
|
Var
|
||||||
|
D : TCustomFormDescr;
|
||||||
|
|
||||||
|
begin
|
||||||
|
D:=TCustomFormDescr.Create(AFormClass,APackage);
|
||||||
|
D.UnitName:=AUnitName;
|
||||||
|
RegisterCustomForm(D);
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
Procedure Register;
|
||||||
|
|
||||||
|
Var
|
||||||
|
L : TStringList;
|
||||||
|
I : Integer;
|
||||||
|
D : TCustomFormDescr;
|
||||||
|
|
||||||
|
begin
|
||||||
|
L:=TStringList.Create;
|
||||||
|
Try
|
||||||
|
L.Sorted:=True;
|
||||||
|
L.Duplicates:=dupIgnore;
|
||||||
|
For I:=0 to CustomFormList.Count-1 do
|
||||||
|
L.Add(TCustomFormDescr(CustomFormList[i]).Category);
|
||||||
|
For I:=0 to L.Count-1 do
|
||||||
|
begin
|
||||||
|
RegisterNewItemCategory(TNewIDEItemCategory.Create(L[i]));
|
||||||
|
end;
|
||||||
|
Finally
|
||||||
|
L.Free;
|
||||||
|
end;
|
||||||
|
For I:=0 to CustomFormList.Count-1 do
|
||||||
|
begin
|
||||||
|
D:=TCustomFormDescr(CustomFormList[i]);
|
||||||
|
RegisterProjectFileDescriptor(TCustomFormFileDescriptor.Create(D),D.Category);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
Procedure InitCustomForms;
|
||||||
|
|
||||||
|
begin
|
||||||
|
CustomFormList:=TObjectList.Create;
|
||||||
|
end;
|
||||||
|
|
||||||
|
Procedure DoneCustomForms;
|
||||||
|
|
||||||
|
begin
|
||||||
|
FreeAndNil(CustomFormList);
|
||||||
|
end;
|
||||||
|
|
||||||
|
Initialization
|
||||||
|
InitCustomForms;
|
||||||
|
Finalization
|
||||||
|
DoneCustomForms;
|
||||||
|
end.
|
||||||
|
|
||||||
51
samples/Pascal/gtkextra.pp
Normal file
51
samples/Pascal/gtkextra.pp
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
{ $Id$ }
|
||||||
|
{
|
||||||
|
---------------------------------------------------------------------------
|
||||||
|
gtkextra.pp - GTK(2) widgetset - additional gdk/gtk functions
|
||||||
|
---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
This unit contains missing gdk/gtk functions and defines for certain
|
||||||
|
versions of gtk or fpc.
|
||||||
|
|
||||||
|
---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
@created(Sun Jan 28th WET 2006)
|
||||||
|
@lastmod($Date$)
|
||||||
|
@author(Marc Weustink <marc@@dommelstein.nl>)
|
||||||
|
|
||||||
|
*****************************************************************************
|
||||||
|
This file is part of the Lazarus Component Library (LCL)
|
||||||
|
|
||||||
|
See the file COPYING.modifiedLGPL.txt, included in this distribution,
|
||||||
|
for details about the license.
|
||||||
|
*****************************************************************************
|
||||||
|
}
|
||||||
|
|
||||||
|
unit GtkExtra;
|
||||||
|
|
||||||
|
{$mode objfpc}{$H+}
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
{$I gtkdefines.inc}
|
||||||
|
|
||||||
|
{$ifdef gtk1}
|
||||||
|
{$I gtk1extrah.inc}
|
||||||
|
{$endif}
|
||||||
|
|
||||||
|
{$ifdef gtk2}
|
||||||
|
{$I gtk2extrah.inc}
|
||||||
|
{$endif}
|
||||||
|
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
{$ifdef gtk1}
|
||||||
|
{$I gtk1extra.inc}
|
||||||
|
{$endif}
|
||||||
|
|
||||||
|
{$ifdef gtk2}
|
||||||
|
{$I gtk2extra.inc}
|
||||||
|
{$endif}
|
||||||
|
|
||||||
|
end.
|
||||||
68
samples/Prolog/logic-problem.pro
Normal file
68
samples/Prolog/logic-problem.pro
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
/**
|
||||||
|
* Question 1.1
|
||||||
|
* combiner(+Buddies, -Pairs)
|
||||||
|
*/
|
||||||
|
combiner([], []).
|
||||||
|
combiner([First|Buddies], Pairs):-
|
||||||
|
make_pairs(First, Buddies, Pairs1),
|
||||||
|
combiner(Buddies, Pairs2),
|
||||||
|
concat(Pairs1, Pairs2, Pairs).
|
||||||
|
|
||||||
|
/**
|
||||||
|
* make_pairs(+Buddy, +Buddies, -Pairs)
|
||||||
|
*/
|
||||||
|
make_pairs(Buddy, [], []).
|
||||||
|
make_pairs(Buddy, [First|Buddies], [(Buddy, First)|Pairs]):-
|
||||||
|
make_pairs(Buddy, Buddies, Pairs).
|
||||||
|
|
||||||
|
/**
|
||||||
|
* concat(+X, +Y, ?T)
|
||||||
|
*/
|
||||||
|
concat([], Y, Y).
|
||||||
|
concat([P|R], Y, [P|T]):-
|
||||||
|
concat(R, Y, T).
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Question 1.2
|
||||||
|
* extraire(+AllPossiblePairs, +NbPairs, -Tp, -RemainingPairs)
|
||||||
|
*/
|
||||||
|
extraire(AllPossiblePairs, 0, [], AllPossiblePairs).
|
||||||
|
extraire([PossiblePair|AllPossiblePairs], NbPairs, [PossiblePair|Tp], NewRemainingPairs):-
|
||||||
|
NbPairs > 0,
|
||||||
|
NewNbPairs is NbPairs - 1,
|
||||||
|
extraire(AllPossiblePairs, NewNbPairs, Tp, RemainingPairs),
|
||||||
|
not(pair_in_array(PossiblePair, Tp)),
|
||||||
|
delete_pair(RemainingPairs, PossiblePair, NewRemainingPairs).
|
||||||
|
extraire([PossiblePair|AllPossiblePairs], NbPairs, Tp, [PossiblePair|RemainingPairs]):-
|
||||||
|
NbPairs > 0,
|
||||||
|
extraire(AllPossiblePairs, NbPairs, Tp, RemainingPairs),
|
||||||
|
pair_in_array(PossiblePair, Tp).
|
||||||
|
|
||||||
|
/**
|
||||||
|
* delete_pair(+Pairs, +Pair, -PairsWithoutPair)
|
||||||
|
*/
|
||||||
|
delete_pair([], _, []).
|
||||||
|
delete_pair([Pair|Pairs], Pair, Pairs):-!.
|
||||||
|
delete_pair([FirstPair|Pairs], Pair, [FirstPair|PairsWithoutPair]):-
|
||||||
|
delete_pair(Pairs, Pair, PairsWithoutPair).
|
||||||
|
|
||||||
|
/**
|
||||||
|
* pair_in_array(+Pair, +Pairs)
|
||||||
|
*/
|
||||||
|
pair_in_array((A, B), [(C, D)|Pairs]):-
|
||||||
|
(A == C ; B == D ; A == D ; B == C),
|
||||||
|
!.
|
||||||
|
pair_in_array(Pair, [FirstPair|Pairs]):-
|
||||||
|
pair_in_array(Pair, Pairs).
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Question 1.3
|
||||||
|
* les_tps(+Buddies, -Tps)
|
||||||
|
*/
|
||||||
|
les_tps(Buddies, Tps):-
|
||||||
|
combiner(Buddies, PossiblePairs),
|
||||||
|
length(Buddies, NbBuddies),
|
||||||
|
NbPairs is integer(NbBuddies / 2),
|
||||||
|
findall(Tp, extraire(PossiblePairs, NbPairs, Tp, _), Tps).
|
||||||
26
samples/Puppet/expiringhost.pp
Normal file
26
samples/Puppet/expiringhost.pp
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
define example::expiringhost($ip, $timestamp) {
|
||||||
|
|
||||||
|
# Calculate the age of this resource by comparing 'now' against $timestamp
|
||||||
|
$age = inline_template("<%= require 'time'; Time.now - Time.parse(timestamp) %>")
|
||||||
|
|
||||||
|
# Max age, in seconds.
|
||||||
|
$maxage = 60
|
||||||
|
|
||||||
|
if $age > $maxage {
|
||||||
|
$expired = true
|
||||||
|
notice("Expiring resource $class[$name] due to age > $maxage (actual: $age)")
|
||||||
|
} else {
|
||||||
|
$expired = false
|
||||||
|
notice("Found recently-active $class[$name] (age: $age)")
|
||||||
|
}
|
||||||
|
|
||||||
|
# I set target to a /tmp path so you can run this example as non-root.
|
||||||
|
# In production, you probabyl won't set target as it defaults to /etc/hosts
|
||||||
|
# (or wherever puppet thinks your platform wants it)
|
||||||
|
host {
|
||||||
|
$name:
|
||||||
|
ip => $ip,
|
||||||
|
target => "/tmp/expiring-hosts-example-output",
|
||||||
|
ensure => $expired ? { true => absent, false => present };
|
||||||
|
}
|
||||||
|
}
|
||||||
26
samples/Puppet/stages-example.pp
Normal file
26
samples/Puppet/stages-example.pp
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
class foo {
|
||||||
|
notify {
|
||||||
|
"foo": ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class bar {
|
||||||
|
notify {
|
||||||
|
"bar": ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
node default {
|
||||||
|
stage {
|
||||||
|
"one": ;
|
||||||
|
"two": ;
|
||||||
|
}
|
||||||
|
|
||||||
|
class {
|
||||||
|
"foo": stage => "one";
|
||||||
|
"bar": stage => "two";
|
||||||
|
}
|
||||||
|
|
||||||
|
Stage["one"] -> Stage["two"]
|
||||||
|
}
|
||||||
22
samples/Puppet/unmanaged-notify-puppet25.pp
Normal file
22
samples/Puppet/unmanaged-notify-puppet25.pp
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
# Manually manage /tmp/original
|
||||||
|
# Each puppet run will copy it to /tmp/flag if there's a change and notify
|
||||||
|
# the exec when it changes.
|
||||||
|
#
|
||||||
|
# The idea here is you might need (in some case) to manually manage a file outside
|
||||||
|
# of puppet (in this case, "/tmp/original"). Using this example, you can make puppet
|
||||||
|
# signal other parts of your catalog based on changes to that file.
|
||||||
|
|
||||||
|
file {
|
||||||
|
# This will, when different, copy /tmp/original to /tmp/flag and notify our
|
||||||
|
# exec.
|
||||||
|
"/tmp/flag":
|
||||||
|
source => "file:///tmp/original",
|
||||||
|
notify => Exec["hello world"];
|
||||||
|
}
|
||||||
|
|
||||||
|
exec {
|
||||||
|
"hello world":
|
||||||
|
command => "/bin/echo hello world",
|
||||||
|
refreshonly => true;
|
||||||
|
}
|
||||||
|
|
||||||
120
samples/Python/backstage.fcgi
Executable file
120
samples/Python/backstage.fcgi
Executable file
@@ -0,0 +1,120 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
import sqlite
|
||||||
|
import urllib2
|
||||||
|
import csv
|
||||||
|
import cgi
|
||||||
|
import simplejson
|
||||||
|
import jsontemplate
|
||||||
|
import time
|
||||||
|
|
||||||
|
log = open('log.txt', 'a')
|
||||||
|
|
||||||
|
def urldecode(query):
|
||||||
|
d = {}
|
||||||
|
a = query.split('&')
|
||||||
|
for s in a:
|
||||||
|
if s.find('='):
|
||||||
|
k,v = map(urllib2.unquote, s.split('='))
|
||||||
|
try:
|
||||||
|
d[k].append(v)
|
||||||
|
except KeyError:
|
||||||
|
d[k] = [v]
|
||||||
|
|
||||||
|
return d
|
||||||
|
|
||||||
|
def load_table(uri, cur):
|
||||||
|
table = uri.split('/')[-1]
|
||||||
|
table = table.split('.')[0]
|
||||||
|
|
||||||
|
contents = urllib2.urlopen(uri)
|
||||||
|
fields = ""
|
||||||
|
for field in contents.readline().strip().split(','):
|
||||||
|
fields += field
|
||||||
|
fields += ","
|
||||||
|
fields = fields.rstrip(',')
|
||||||
|
|
||||||
|
cur.execute("SELECT name FROM sqlite_master WHERE type='table' \
|
||||||
|
AND name='%s';" % (table))
|
||||||
|
if cur.fetchone() == None:
|
||||||
|
# cur.execute("DROP TABLE %s;" % (table))
|
||||||
|
cur.execute("CREATE TABLE %s (%s);" % (table, fields))
|
||||||
|
for line in contents:
|
||||||
|
values = line.strip()
|
||||||
|
values = "','".join([val.strip() for val in values.split(",")])
|
||||||
|
values = "'" + values + "'"
|
||||||
|
sql = "INSERT INTO %s (%s) VALUES (%s);" % (table, fields, values)
|
||||||
|
cur.execute(sql)
|
||||||
|
return table
|
||||||
|
|
||||||
|
def build_structure(headings, allresults):
|
||||||
|
results = []
|
||||||
|
for result in allresults:
|
||||||
|
results.append(dict(zip(headings, result)))
|
||||||
|
results = { "query" : results }
|
||||||
|
return results
|
||||||
|
|
||||||
|
def build_json(headings, allresults, callback):
|
||||||
|
results = build_structure(headings, allresults)
|
||||||
|
return_str = simplejson.dumps(results)
|
||||||
|
if callback != None:
|
||||||
|
return_str = callback + "(" + return_str + ");";
|
||||||
|
return return_str
|
||||||
|
|
||||||
|
def load_template(templatefile):
|
||||||
|
return "".join(urllib2.urlopen(templatefile).readlines())
|
||||||
|
|
||||||
|
def build_template(headings, allresults, template_str):
|
||||||
|
results = build_structure(headings, allresults)
|
||||||
|
return jsontemplate.expand(template_str, results)
|
||||||
|
return ""
|
||||||
|
|
||||||
|
def myapp(environ, start_response):
|
||||||
|
args = cgi.parse_qs(environ['QUERY_STRING'])
|
||||||
|
|
||||||
|
query = args['query'][0]
|
||||||
|
uri = args['uri'][0]
|
||||||
|
callback = None
|
||||||
|
if 'callback' in args:
|
||||||
|
callback = args['callback'][0]
|
||||||
|
label = "no label"
|
||||||
|
if 'label' in args:
|
||||||
|
label = args['label'][0]
|
||||||
|
templatefile = None
|
||||||
|
if 'templatefile' in args:
|
||||||
|
templatefile = args['templatefile'][0]
|
||||||
|
|
||||||
|
con = sqlite.connect('mydatabase.db')
|
||||||
|
cur = con.cursor()
|
||||||
|
table_uris = uri.split(',')
|
||||||
|
tables = [load_table(uri, cur) for uri in table_uris]
|
||||||
|
con.commit()
|
||||||
|
before = time.time()
|
||||||
|
cur.execute(query)
|
||||||
|
allresults = cur.fetchall()
|
||||||
|
after = time.time()
|
||||||
|
log.write("%s: query time %f\n" % (label, after - before))
|
||||||
|
|
||||||
|
headings = [name[0] for name in cur.description]
|
||||||
|
return_str = ""
|
||||||
|
if templatefile != None:
|
||||||
|
start_response('200 OK', [('Content-Type', 'text/html')])
|
||||||
|
before = time.time()
|
||||||
|
template_str = load_template(templatefile)
|
||||||
|
after = time.time()
|
||||||
|
log.write("%s: template loading time %f\n" % (label, after - before))
|
||||||
|
before = time.time()
|
||||||
|
return_str = build_template(headings, allresults, template_str)
|
||||||
|
after = time.time()
|
||||||
|
log.write("%s: template rendering time %f\n" % (label, after - before))
|
||||||
|
else:
|
||||||
|
start_response('200 OK', [('Content-Type', 'text/plain')])
|
||||||
|
before = time.time()
|
||||||
|
return_str = build_json(headings, allresults, callback)
|
||||||
|
after = time.time()
|
||||||
|
log.write("%s: json-making time %f\n" % (label, after - before))
|
||||||
|
return return_str
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
from fcgi import WSGIServer
|
||||||
|
WSGIServer(myapp).run()
|
||||||
68
samples/Ruby/mdata_server.fcgi
Executable file
68
samples/Ruby/mdata_server.fcgi
Executable file
@@ -0,0 +1,68 @@
|
|||||||
|
#!/usr/bin/env ruby
|
||||||
|
require "xmlrpc/server"
|
||||||
|
|
||||||
|
# NOTE: force the usage of the pure-ruby version of fcgi.
|
||||||
|
# - this is required by the workaround to get fcgi+xmlrpc working together
|
||||||
|
FCGI_PURE_RUBY=true
|
||||||
|
require 'fcgi'
|
||||||
|
|
||||||
|
require File.join(File.dirname(__FILE__), '../bt_cast/mdata_echo_server/bt_cast_mdata_server_t.rb')
|
||||||
|
|
||||||
|
################################################################################
|
||||||
|
################################################################################
|
||||||
|
# CGI handling for xmlrpc
|
||||||
|
################################################################################
|
||||||
|
################################################################################
|
||||||
|
# - for basic xmlrpc via CGI example
|
||||||
|
# - see http://www.ntecs.de/projects/xmlrpc4r/server.html#label-19
|
||||||
|
|
||||||
|
# create the directory needed for Neoip::Cast_mdata_server_t
|
||||||
|
Neoip::Cast_mdata_server_t.create_dir_ifneeded();
|
||||||
|
|
||||||
|
# init the cgi_server
|
||||||
|
cgi_server = XMLRPC::CGIServer.new
|
||||||
|
# register all the xmlrpc function
|
||||||
|
cgi_server.add_handler("set_cast_mdata_pull") do |web2srv_str, cast_name, cast_privtext, cast_id,
|
||||||
|
port_lview, port_pview, uri_pathquery|
|
||||||
|
Neoip::Cast_mdata_server_t.set_cast_mdata_pull(web2srv_str, cast_name, cast_privtext, cast_id,
|
||||||
|
port_lview, port_pview, uri_pathquery, ENV['REMOTE_ADDR']);
|
||||||
|
end
|
||||||
|
cgi_server.add_handler("set_cast_mdata_push") do |web2srv_str, cast_name, cast_privtext, cast_mdata|
|
||||||
|
Neoip::Cast_mdata_server_t.set_cast_mdata_push(web2srv_str, cast_name, cast_privtext, cast_mdata);
|
||||||
|
end
|
||||||
|
cgi_server.add_handler("get_cast_mdata") do |cast_name, cast_privhash|
|
||||||
|
Neoip::Cast_mdata_server_t.get_cast_mdata(cast_name, cast_privhash);
|
||||||
|
end
|
||||||
|
cgi_server.add_handler("del_cast_mdata") do |cast_name, cast_privtext|
|
||||||
|
Neoip::Cast_mdata_server_t.del_cast_mdata(cast_name, cast_privtext);
|
||||||
|
end
|
||||||
|
|
||||||
|
# handle the unknown/bad formered calls
|
||||||
|
cgi_server.set_default_handler do |name, *args|
|
||||||
|
raise XMLRPC::FaultException.new(-99, "Method #{name} missing" +
|
||||||
|
" or wrong number of parameters!")
|
||||||
|
end
|
||||||
|
|
||||||
|
# server the cgi_server
|
||||||
|
#cgi_server.serve
|
||||||
|
#exit
|
||||||
|
|
||||||
|
# experiment at using fast-cgi
|
||||||
|
FCGI.each_request do |request|
|
||||||
|
# XMLRPC::CGIServer expect some value in ENV[] but FCGI doesnt provides them
|
||||||
|
# - so working around by copying them by hand... dirty
|
||||||
|
ENV['REMOTE_ADDR'] = request.env['REMOTE_ADDR'];
|
||||||
|
ENV['REQUEST_METHOD'] = request.env['REQUEST_METHOD'];
|
||||||
|
ENV['CONTENT_TYPE'] = "text/xml";
|
||||||
|
ENV['CONTENT_LENGTH'] = "#{request.in.length}";
|
||||||
|
|
||||||
|
# copy the request in/out into the stdin/stdout to act as a CGI
|
||||||
|
$stdin = request.in
|
||||||
|
$stdout = request.out
|
||||||
|
|
||||||
|
# process the cgi itself
|
||||||
|
cgi_server.serve
|
||||||
|
|
||||||
|
# mark the request as finished
|
||||||
|
request.finish
|
||||||
|
end
|
||||||
30
samples/Shell/build.command
Normal file
30
samples/Shell/build.command
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
set -e
|
||||||
|
|
||||||
|
echo "/************/"
|
||||||
|
echo "/* BUILDING */"
|
||||||
|
echo "/************/"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
cd `dirname $0`
|
||||||
|
|
||||||
|
cd build
|
||||||
|
|
||||||
|
cmake ..
|
||||||
|
|
||||||
|
make
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "/***********/"
|
||||||
|
echo "/* TESTING */"
|
||||||
|
echo "/***********/"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# ctest ..
|
||||||
|
|
||||||
|
make Experimental
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "/***********/"
|
||||||
|
echo "/* SUCCESS */"
|
||||||
|
echo "/***********/"
|
||||||
|
echo ""
|
||||||
16
samples/Shell/php.fcgi
Executable file
16
samples/Shell/php.fcgi
Executable file
@@ -0,0 +1,16 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# you can change the PHP version here.
|
||||||
|
version="RB_PHP_VERSION_X_Y_Z"
|
||||||
|
|
||||||
|
# php.ini file location
|
||||||
|
PHPRC=/usr/local/php/phpfarm/inst/php-${version}/lib/php.ini
|
||||||
|
export PHPRC
|
||||||
|
|
||||||
|
PHP_FCGI_CHILDREN=3
|
||||||
|
export PHP_FCGI_CHILDREN
|
||||||
|
|
||||||
|
PHP_FCGI_MAX_REQUESTS=5000
|
||||||
|
export PHP_FCGI_MAX_REQUESTS
|
||||||
|
|
||||||
|
# which php-cgi binary to execute
|
||||||
|
exec /usr/local/php/inst/php-${version}/bin/php-cgi
|
||||||
63
samples/Tcl/filenames/owh
Executable file
63
samples/Tcl/filenames/owh
Executable file
@@ -0,0 +1,63 @@
|
|||||||
|
#!/usr/bin/env tclsh
|
||||||
|
# http://wiki.tcl.tk/906
|
||||||
|
|
||||||
|
if {[llength $argv] < 1} {
|
||||||
|
puts "usage: owh ?init? body ?exit?
|
||||||
|
performs body (in Tcl) for each line (\$0) from stdin
|
||||||
|
owh: Ousterhout - Welch - Hobbs, to name a few"
|
||||||
|
exit -1
|
||||||
|
}
|
||||||
|
|
||||||
|
proc awksplit {text {split default}} {
|
||||||
|
set no 0
|
||||||
|
if {$split eq "default"} {
|
||||||
|
set t {}
|
||||||
|
foreach string [split $text] {
|
||||||
|
if {$string ne {}} {
|
||||||
|
lappend t $string
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
set t [list $text $split]
|
||||||
|
}
|
||||||
|
uplevel 1 [list set NF [llength $t]]
|
||||||
|
foreach i $t {uplevel 1 [list set [incr no] $i]}
|
||||||
|
uplevel 1 {set 0 {};trace variable 0 ru 0}
|
||||||
|
}
|
||||||
|
proc 0 {_name index op} {
|
||||||
|
switch $op {
|
||||||
|
r {
|
||||||
|
uplevel {
|
||||||
|
set 0 {}
|
||||||
|
for {set i 1} {$i <= $NF} {incr i} {lappend 0 [set $i]}
|
||||||
|
set 0 [join $0 $OFS]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
u {rename 0 {} ;# leave no traces of the trace..}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
proc print s {if {[catch {puts $s}]} exit} ;# good for broken pipe
|
||||||
|
|
||||||
|
set FS default
|
||||||
|
set OFS { }
|
||||||
|
|
||||||
|
if {[llength $argv] > 1} {
|
||||||
|
eval [lindex $argv 0]
|
||||||
|
set _body [lindex $argv 1] ;# strip outer braces
|
||||||
|
set _exit [lindex $argv 2]
|
||||||
|
} else {
|
||||||
|
set _body [lindex $argv 0] ;# strip outer braces
|
||||||
|
set _exit {}
|
||||||
|
}
|
||||||
|
|
||||||
|
set NR 1
|
||||||
|
while 1 {
|
||||||
|
gets stdin line
|
||||||
|
if {[eof stdin]} break
|
||||||
|
awksplit $line $FS
|
||||||
|
eval $_body
|
||||||
|
incr NR
|
||||||
|
}
|
||||||
|
set res [eval $_exit]
|
||||||
|
if {[string length $res]} {puts $res}
|
||||||
28
samples/Tcl/filenames/starfield
Executable file
28
samples/Tcl/filenames/starfield
Executable file
@@ -0,0 +1,28 @@
|
|||||||
|
#!/usr/bin/env wish
|
||||||
|
# http://wiki.tcl.tk/14140
|
||||||
|
|
||||||
|
proc stars'go {c factor} {
|
||||||
|
set w [winfo width $c]
|
||||||
|
set h [winfo height $c]
|
||||||
|
$c scale all [expr {$w/2}] [expr {$h/2}] $factor $factor
|
||||||
|
foreach item [$c find all] {
|
||||||
|
if {[llength [$c bbox $item]] == 0} {$c delete $item; continue} ;# (1)
|
||||||
|
foreach {x0 y0 x1 y1} [$c bbox $item] break
|
||||||
|
if {$x1<0 || $x0>$w || $y1<0 || $y0>$h} {$c delete $item}
|
||||||
|
}
|
||||||
|
time {
|
||||||
|
set x [expr {rand()*$w}]
|
||||||
|
set y [expr {rand()*$h}]
|
||||||
|
set col [lpick {white yellow beige bisque cyan}]
|
||||||
|
$c create oval $x $y [expr {$x+1}] [expr {$y+1}] -fill $col \
|
||||||
|
-outline $col
|
||||||
|
} 10
|
||||||
|
after $::ms [info level 0]
|
||||||
|
}
|
||||||
|
proc lpick list {lindex $list [expr {int(rand()*[llength $list])}]}
|
||||||
|
#-- Let's go!
|
||||||
|
pack [canvas .c -bg black] -fill both -expand 1
|
||||||
|
set ms 40
|
||||||
|
bind . <Up> {incr ms -5}
|
||||||
|
bind . <Down> {incr ms 5}
|
||||||
|
stars'go .c 1.05
|
||||||
8
samples/VimL/filenames/_vimrc
Normal file
8
samples/VimL/filenames/_vimrc
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
set nocompatible
|
||||||
|
set ignorecase
|
||||||
|
set incsearch
|
||||||
|
set smartcase
|
||||||
|
set showmatch
|
||||||
|
set showcmd
|
||||||
|
|
||||||
|
syntax on
|
||||||
18
script/cibuild
Executable file
18
script/cibuild
Executable file
@@ -0,0 +1,18 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
if [ -d /usr/share/rbenv/shims ]; then
|
||||||
|
export PATH=/usr/share/rbenv/shims:$PATH
|
||||||
|
export RBENV_VERSION=2.1.2-github
|
||||||
|
export RUBY_VERSION=2.1.2-github
|
||||||
|
fi
|
||||||
|
|
||||||
|
set -x
|
||||||
|
git log -n 1 HEAD | cat
|
||||||
|
ruby -v
|
||||||
|
bundle -v
|
||||||
|
set +x
|
||||||
|
|
||||||
|
mkdir -p ./vendor/gems
|
||||||
|
|
||||||
|
bundle install --local --path ./vendor/gems
|
||||||
|
bundle exec rake samples
|
||||||
|
bundle exec rake
|
||||||
@@ -262,6 +262,10 @@ class TestBlob < Test::Unit::TestCase
|
|||||||
|
|
||||||
|
|
||||||
assert Linguist::Generated.generated?("node_modules/grunt/lib/grunt.js", nil)
|
assert Linguist::Generated.generated?("node_modules/grunt/lib/grunt.js", nil)
|
||||||
|
|
||||||
|
# Godep saved dependencies
|
||||||
|
assert blob("Godeps/Godeps.json").generated?
|
||||||
|
assert blob("Godeps/_workspace/src/github.com/kr/s3/sign.go").generated?
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_vendored
|
def test_vendored
|
||||||
@@ -279,6 +283,10 @@ class TestBlob < Test::Unit::TestCase
|
|||||||
assert blob("app/bower_components/custom/custom.js").vendored?
|
assert blob("app/bower_components/custom/custom.js").vendored?
|
||||||
assert blob("vendor/assets/bower_components/custom/custom.js").vendored?
|
assert blob("vendor/assets/bower_components/custom/custom.js").vendored?
|
||||||
|
|
||||||
|
# Go dependencies
|
||||||
|
assert !blob("Godeps/Godeps.json").vendored?
|
||||||
|
assert blob("Godeps/_workspace/src/github.com/kr/s3/sign.go").vendored?
|
||||||
|
|
||||||
# Rails vendor/
|
# Rails vendor/
|
||||||
assert blob("vendor/plugins/will_paginate/lib/will_paginate.rb").vendored?
|
assert blob("vendor/plugins/will_paginate/lib/will_paginate.rb").vendored?
|
||||||
|
|
||||||
@@ -437,6 +445,12 @@ class TestBlob < Test::Unit::TestCase
|
|||||||
assert blob("octicons.css").vendored?
|
assert blob("octicons.css").vendored?
|
||||||
assert blob("public/octicons.min.css").vendored?
|
assert blob("public/octicons.min.css").vendored?
|
||||||
assert blob("public/octicons/sprockets-octicons.scss").vendored?
|
assert blob("public/octicons/sprockets-octicons.scss").vendored?
|
||||||
|
|
||||||
|
# Typesafe Activator
|
||||||
|
assert blob("activator").vendored?
|
||||||
|
assert blob("activator.bat").vendored?
|
||||||
|
assert blob("subproject/activator").vendored?
|
||||||
|
assert blob("subproject/activator.bat").vendored?
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_language
|
def test_language
|
||||||
|
|||||||
@@ -44,12 +44,12 @@ class TestClassifier < Test::Unit::TestCase
|
|||||||
end
|
end
|
||||||
|
|
||||||
def test_instance_classify_empty
|
def test_instance_classify_empty
|
||||||
results = Classifier.classify(Samples::DATA, "")
|
results = Classifier.classify(Samples.cache, "")
|
||||||
assert results.first[1] < 0.5, results.first.inspect
|
assert results.first[1] < 0.5, results.first.inspect
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_instance_classify_nil
|
def test_instance_classify_nil
|
||||||
assert_equal [], Classifier.classify(Samples::DATA, nil)
|
assert_equal [], Classifier.classify(Samples.cache, nil)
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_classify_ambiguous_languages
|
def test_classify_ambiguous_languages
|
||||||
@@ -58,7 +58,7 @@ class TestClassifier < Test::Unit::TestCase
|
|||||||
languages = Language.find_by_filename(sample[:path]).map(&:name)
|
languages = Language.find_by_filename(sample[:path]).map(&:name)
|
||||||
next unless languages.length > 1
|
next unless languages.length > 1
|
||||||
|
|
||||||
results = Classifier.classify(Samples::DATA, File.read(sample[:path]), languages)
|
results = Classifier.classify(Samples.cache, File.read(sample[:path]), languages)
|
||||||
assert_equal language.name, results.first[0], "#{sample[:path]}\n#{results.inspect}"
|
assert_equal language.name, results.first[0], "#{sample[:path]}\n#{results.inspect}"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -65,6 +65,24 @@ class TestHeuristcs < Test::Unit::TestCase
|
|||||||
assert_equal Language["ECL"], results.first
|
assert_equal Language["ECL"], results.first
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_pro_prolog_by_heuristics
|
||||||
|
languages = ["IDL", "Prolog"]
|
||||||
|
results = Heuristics.disambiguate_pro(fixture("Prolog/logic-problem.pro"), languages)
|
||||||
|
assert_equal Language["Prolog"], results.first
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_pro_idl_by_heuristics
|
||||||
|
languages = ["IDL", "Prolog"]
|
||||||
|
results = Heuristics.disambiguate_pro(fixture("IDL/mg_acosh.pro"), languages)
|
||||||
|
assert_equal Language["IDL"], results.first
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_asc_asciidoc_by_heuristics
|
||||||
|
languages = ["AGS Script", "AsciiDoc"]
|
||||||
|
results = Heuristics.disambiguate_asc(fixture("AsciiDoc/list.asc"), languages)
|
||||||
|
assert_equal Language["AsciiDoc"], results.first
|
||||||
|
end
|
||||||
|
|
||||||
def test_ts_typescript_by_heuristics
|
def test_ts_typescript_by_heuristics
|
||||||
languages = ["TypeScript", "XML"]
|
languages = ["TypeScript", "XML"]
|
||||||
results = Heuristics.disambiguate_ts(fixture("TypeScript/classes.ts"), languages)
|
results = Heuristics.disambiguate_ts(fixture("TypeScript/classes.ts"), languages)
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
require 'linguist/repository'
|
require 'linguist/repository'
|
||||||
|
require 'linguist/lazy_blob'
|
||||||
require 'test/unit'
|
require 'test/unit'
|
||||||
|
|
||||||
class TestRepository < Test::Unit::TestCase
|
class TestRepository < Test::Unit::TestCase
|
||||||
@@ -47,4 +47,58 @@ class TestRepository < Test::Unit::TestCase
|
|||||||
|
|
||||||
assert_equal linguist_repo.cache, new_repo.cache
|
assert_equal linguist_repo.cache, new_repo.cache
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_repo_git_attributes
|
||||||
|
# See https://github.com/github/linguist/blob/351c1cc8fd57340839bdb400d7812332af80e9bd/.gitattributes
|
||||||
|
#
|
||||||
|
# It looks like this:
|
||||||
|
# Gemfile linguist-vendored=true
|
||||||
|
# lib/linguist.rb linguist-language=Java
|
||||||
|
# test/*.rb linguist-language=Java
|
||||||
|
# Rakefile linguist-generated
|
||||||
|
# test/fixtures/* linguist-vendored=false
|
||||||
|
|
||||||
|
attr_commit = '351c1cc8fd57340839bdb400d7812332af80e9bd'
|
||||||
|
repo = linguist_repo(attr_commit)
|
||||||
|
|
||||||
|
assert repo.breakdown_by_file.has_key?("Java")
|
||||||
|
assert repo.breakdown_by_file["Java"].include?("lib/linguist.rb")
|
||||||
|
|
||||||
|
assert repo.breakdown_by_file.has_key?("Ruby")
|
||||||
|
assert !repo.breakdown_by_file["Ruby"].empty?
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_commit_with_git_attributes_data
|
||||||
|
# Before we had any .gitattributes data
|
||||||
|
old_commit = '4a017d9033f91b2776eb85275463f9613cc371ef'
|
||||||
|
old_repo = linguist_repo(old_commit)
|
||||||
|
|
||||||
|
# With some .gitattributes data
|
||||||
|
attr_commit = '7ee006cbcb2d7261f9e648510a684ee9ac64126b'
|
||||||
|
# It's incremental but should bust the cache
|
||||||
|
new_repo = Linguist::Repository.incremental(rugged_repository, attr_commit, old_commit, old_repo.cache)
|
||||||
|
|
||||||
|
assert new_repo.breakdown_by_file["Java"].include?("lib/linguist.rb")
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_linguist_override_vendored?
|
||||||
|
attr_commit = '351c1cc8fd57340839bdb400d7812332af80e9bd'
|
||||||
|
repo = linguist_repo(attr_commit).read_index
|
||||||
|
|
||||||
|
override_vendored = Linguist::LazyBlob.new(rugged_repository, attr_commit, 'Gemfile')
|
||||||
|
|
||||||
|
# overridden .gitattributes
|
||||||
|
assert override_vendored.vendored?
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_linguist_override_unvendored?
|
||||||
|
attr_commit = '351c1cc8fd57340839bdb400d7812332af80e9bd'
|
||||||
|
repo = linguist_repo(attr_commit).read_index
|
||||||
|
|
||||||
|
# lib/linguist/vendor.yml defines this as vendored.
|
||||||
|
override_unvendored = Linguist::LazyBlob.new(rugged_repository, attr_commit, 'test/fixtures/foo.rb')
|
||||||
|
|
||||||
|
# overridden .gitattributes
|
||||||
|
assert !override_unvendored.vendored?
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ class TestSamples < Test::Unit::TestCase
|
|||||||
include Linguist
|
include Linguist
|
||||||
|
|
||||||
def test_up_to_date
|
def test_up_to_date
|
||||||
assert serialized = Samples::DATA
|
assert serialized = Samples.cache
|
||||||
assert latest = Samples.data
|
assert latest = Samples.data
|
||||||
|
|
||||||
# Just warn, it shouldn't scare people off by breaking the build.
|
# Just warn, it shouldn't scare people off by breaking the build.
|
||||||
@@ -16,11 +16,11 @@ class TestSamples < Test::Unit::TestCase
|
|||||||
warn "Samples database is out of date. Run `bundle exec rake samples`."
|
warn "Samples database is out of date. Run `bundle exec rake samples`."
|
||||||
|
|
||||||
expected = Tempfile.new('expected.json')
|
expected = Tempfile.new('expected.json')
|
||||||
expected.write Yajl::Encoder.encode(serialized, :pretty => true)
|
expected.write Yajl.dump(serialized, :pretty => true)
|
||||||
expected.close
|
expected.close
|
||||||
|
|
||||||
actual = Tempfile.new('actual.json')
|
actual = Tempfile.new('actual.json')
|
||||||
actual.write Yajl::Encoder.encode(latest, :pretty => true)
|
actual.write Yajl.dump(latest, :pretty => true)
|
||||||
actual.close
|
actual.close
|
||||||
|
|
||||||
expected.unlink
|
expected.unlink
|
||||||
@@ -29,7 +29,7 @@ class TestSamples < Test::Unit::TestCase
|
|||||||
end
|
end
|
||||||
|
|
||||||
def test_verify
|
def test_verify
|
||||||
assert data = Samples::DATA
|
assert data = Samples.cache
|
||||||
|
|
||||||
assert_equal data['languages_total'], data['languages'].inject(0) { |n, (_, c)| n += c }
|
assert_equal data['languages_total'], data['languages'].inject(0) { |n, (_, c)| n += c }
|
||||||
assert_equal data['tokens_total'], data['language_tokens'].inject(0) { |n, (_, c)| n += c }
|
assert_equal data['tokens_total'], data['language_tokens'].inject(0) { |n, (_, c)| n += c }
|
||||||
@@ -38,7 +38,7 @@ class TestSamples < Test::Unit::TestCase
|
|||||||
|
|
||||||
# Check that there aren't samples with extensions that aren't explicitly defined in languages.yml
|
# Check that there aren't samples with extensions that aren't explicitly defined in languages.yml
|
||||||
def test_parity
|
def test_parity
|
||||||
extensions = Samples::DATA['extnames']
|
extensions = Samples.cache['extnames']
|
||||||
languages_yml = File.expand_path("../../lib/linguist/languages.yml", __FILE__)
|
languages_yml = File.expand_path("../../lib/linguist/languages.yml", __FILE__)
|
||||||
languages = YAML.load_file(languages_yml)
|
languages = YAML.load_file(languages_yml)
|
||||||
|
|
||||||
|
|||||||
BIN
vendor/cache/charlock_holmes-0.7.3.gem
vendored
Normal file
BIN
vendor/cache/charlock_holmes-0.7.3.gem
vendored
Normal file
Binary file not shown.
BIN
vendor/cache/coderay-1.1.0.gem
vendored
Normal file
BIN
vendor/cache/coderay-1.1.0.gem
vendored
Normal file
Binary file not shown.
BIN
vendor/cache/escape_utils-1.0.1.gem
vendored
Normal file
BIN
vendor/cache/escape_utils-1.0.1.gem
vendored
Normal file
Binary file not shown.
BIN
vendor/cache/json-1.8.1.gem
vendored
Normal file
BIN
vendor/cache/json-1.8.1.gem
vendored
Normal file
Binary file not shown.
BIN
vendor/cache/metaclass-0.0.4.gem
vendored
Normal file
BIN
vendor/cache/metaclass-0.0.4.gem
vendored
Normal file
Binary file not shown.
BIN
vendor/cache/method_source-0.8.2.gem
vendored
Normal file
BIN
vendor/cache/method_source-0.8.2.gem
vendored
Normal file
Binary file not shown.
BIN
vendor/cache/mime-types-1.25.1.gem
vendored
Normal file
BIN
vendor/cache/mime-types-1.25.1.gem
vendored
Normal file
Binary file not shown.
BIN
vendor/cache/mocha-1.1.0.gem
vendored
Normal file
BIN
vendor/cache/mocha-1.1.0.gem
vendored
Normal file
Binary file not shown.
BIN
vendor/cache/posix-spawn-0.3.9.gem
vendored
Normal file
BIN
vendor/cache/posix-spawn-0.3.9.gem
vendored
Normal file
Binary file not shown.
BIN
vendor/cache/pry-0.10.1.gem
vendored
Normal file
BIN
vendor/cache/pry-0.10.1.gem
vendored
Normal file
Binary file not shown.
BIN
vendor/cache/pygments.rb-0.6.0.gem
vendored
Normal file
BIN
vendor/cache/pygments.rb-0.6.0.gem
vendored
Normal file
Binary file not shown.
BIN
vendor/cache/rake-10.3.2.gem
vendored
Normal file
BIN
vendor/cache/rake-10.3.2.gem
vendored
Normal file
Binary file not shown.
BIN
vendor/cache/rugged-0.21.1b2.gem
vendored
Normal file
BIN
vendor/cache/rugged-0.21.1b2.gem
vendored
Normal file
Binary file not shown.
BIN
vendor/cache/slop-3.6.0.gem
vendored
Normal file
BIN
vendor/cache/slop-3.6.0.gem
vendored
Normal file
Binary file not shown.
BIN
vendor/cache/yajl-ruby-1.1.0.gem
vendored
Normal file
BIN
vendor/cache/yajl-ruby-1.1.0.gem
vendored
Normal file
Binary file not shown.
Reference in New Issue
Block a user