Merge branch 'master' into 1233-local

Conflicts:
	lib/linguist/language.rb
	lib/linguist/languages.yml
	lib/linguist/samples.json
This commit is contained in:
Arfon Smith
2014-11-01 09:59:29 -05:00
parent 12b78c5357
commit 9e50e188a8
77 changed files with 3066 additions and 74080 deletions

0
.gitattributes vendored Normal file
View File

2
.gitignore vendored
View File

@@ -1,4 +1,4 @@
Gemfile.lock
.bundle/
vendor/
benchmark/
lib/linguist/samples.json

View File

@@ -1,13 +1,12 @@
before_install:
- git fetch origin master:master
- git fetch origin v2.0.0:v2.0.0
- git fetch origin test/attributes:test/attributes
- sudo apt-get install libicu-dev -y
- gem update --system 2.1.11
before_script:
- bundle exec rake samples
rvm:
- 1.9.3
- 2.0.0
- 2.1.1
- 2.1
- 2.2
notifications:
disabled: true

View File

@@ -1,2 +1,3 @@
source 'https://rubygems.org'
gemspec
gem 'test-unit', require: false if RUBY_VERSION >= '2.2'

View File

@@ -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:
***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
project = Linguist::Repository.from_directory(".")
project.language.name #=> "Ruby"
project.languages #=> { "Ruby" => 0.98, "Shell" => 0.02 }
require 'rugged'
require 'linguist'
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
`--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
Ruby:
linguist/blob_helper.rb
linguist/classifier.rb
linguist/file_blob.rb
linguist/generated.rb
linguist/heuristics.rb
linguist/language.rb
linguist/md5.rb
linguist/repository.rb
linguist/samples.rb
linguist/tokenizer.rb
linguist.rb
Gemfile
Rakefile
bin/linguist
github-linguist.gemspec
lib/linguist.rb
lib/linguist/blob_helper.rb
lib/linguist/classifier.rb
lib/linguist/file_blob.rb
lib/linguist/generated.rb
lib/linguist/heuristics.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
@@ -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).
## 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
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.
@@ -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.
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
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. 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. Build a local gem: `gem build github-linguist.gemspec`
0. Build a local gem: `bundle exec rake build_gem`
0. Testing:
0. Bump the Gemfile and Gemfile.lock versions for an app which relies on this gem
0. Install the new gem locally

View File

@@ -1,24 +1,32 @@
require 'json'
require 'bundler/setup'
require 'rake/clean'
require 'rake/testtask'
require 'yaml'
require 'pry'
require 'yajl'
task :default => :test
Rake::TestTask.new
task :samples do
require 'linguist/samples'
require 'yajl'
data = Linguist::Samples.data
json = Yajl::Encoder.encode(data, :pretty => true)
File.open('lib/linguist/samples.json', 'w') { |io| io.write json }
# Extend test task to check for samples
task :test => :check_samples
desc "Check that we have samples.json generated"
task :check_samples do
unless File.exist?('lib/linguist/samples.json')
Rake::Task[:samples].invoke
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")
File.write("lib/linguist/languages.json", JSON.dump(languages))
File.write("lib/linguist/languages.json", Yajl.dump(languages))
`gem build github-linguist.gemspec`
File.delete("lib/linguist/languages.json")
end
@@ -62,11 +70,11 @@ namespace :benchmark do
reference_file = ENV["REFERENCE"]
candidate_file = ENV["CANDIDATE"]
reference = JSON.parse(File.read(reference_file))
reference = Yajl.load(File.read(reference_file))
reference_counts = Hash.new(0)
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.each { |filename, language| candidate_counts[language] += 1 }
@@ -99,7 +107,7 @@ namespace :classifier do
next if file_language.nil? || file_language == 'Text'
begin
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
guessed_language == file_language ? correct += 1 : incorrect += 1
@@ -116,14 +124,12 @@ namespace :classifier do
def each_public_gist
require 'open-uri'
require 'json'
url = "https://api.github.com/gists/public"
loop do
resp = open(url)
url = resp.meta['link'][/<([^>]+)>; rel="next"/, 1]
gists = JSON.parse(resp.read)
gists = Yajl.load(resp.read)
for gist in gists
for filename, attrs in gist['files']

View File

@@ -17,9 +17,8 @@ Gem::Specification.new do |s|
s.add_dependency 'escape_utils', '~> 1.0.1'
s.add_dependency 'mime-types', '~> 1.19'
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 'pry'
s.add_development_dependency 'rake'

View File

@@ -321,6 +321,11 @@ module Linguist
language ? language.lexer : Pygments::Lexer.find_by_name('Text only')
end
# Internal: Get the TextMate compatible scope for the blob
def tm_scope
language && language.tm_scope
end
# Public: Highlight syntax of blob
#
# options - A Hash of options (defaults to {})

View File

@@ -63,6 +63,7 @@ module Linguist
generated_jni_header? ||
composer_lock? ||
node_modules? ||
godeps? ||
vcr_cassette? ||
generated_by_zephir?
end
@@ -231,6 +232,14 @@ module Linguist
!!name.match(/node_modules\//)
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?
#
# Returns true or false.

View File

@@ -19,6 +19,15 @@ module Linguist
if languages.all? { |l| ["ECL", "Prolog"].include?(l) }
result = disambiguate_ecl(data, languages)
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
end
end
@@ -48,6 +57,16 @@ module Linguist
matches
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)
matches = []
if (data.include?("</translation>"))
@@ -72,6 +91,12 @@ module Linguist
matches
end
def self.disambiguate_asc(data, languages)
matches = []
matches << Language["AsciiDoc"] if /^=+(\s|\n)/.match(data)
matches
end
def self.active?
!!ACTIVE
end

View File

@@ -2,7 +2,7 @@ require 'escape_utils'
require 'pygments'
require 'yaml'
begin
require 'json'
require 'yajl'
rescue LoadError
end
@@ -150,7 +150,7 @@ module Linguist
if (determined = Heuristics.find_by_heuristics(data, possible_language_names)) && !determined.empty?
return determined.first
# 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 Language[classified[0]]
end
@@ -302,6 +302,16 @@ module Linguist
@lexer = Pygments::Lexer.find_by_name(attributes[:lexer] || name) ||
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]
@wrap = attributes[:wrap] || false
@@ -375,6 +385,11 @@ module Linguist
# Returns the Lexer
attr_reader :lexer
# Public: Get the name of a TextMate-compatible scope
#
# Returns the scope
attr_reader :tm_scope
# Public: Get Ace mode
#
# Examples
@@ -522,16 +537,16 @@ module Linguist
end
end
extensions = Samples::DATA['extnames']
interpreters = Samples::DATA['interpreters']
filenames = Samples::DATA['filenames']
extensions = Samples.cache['extnames']
interpreters = Samples.cache['interpreters']
filenames = Samples.cache['filenames']
popular = YAML.load_file(File.expand_path("../popular.yml", __FILE__))
languages_yml = File.expand_path("../languages.yml", __FILE__)
languages_json = File.expand_path("../languages.json", __FILE__)
if File.exist?(languages_json) && defined?(JSON)
languages = JSON.load(File.read(languages_json))
if File.exist?(languages_json) && defined?(Yajl)
languages = Yajl.load(File.read(languages_json))
else
languages = YAML.load_file(languages_yml)
end
@@ -576,6 +591,7 @@ module Linguist
:type => options['type'],
:aliases => options['aliases'],
:lexer => options['lexer'],
:tm_scope => options['tm_scope'],
:ace_mode => options['ace_mode'],
:wrap => options['wrap'],
:group_name => options['group'],

File diff suppressed because it is too large Load Diff

View File

@@ -1,8 +1,13 @@
require 'linguist/blob_helper'
require 'linguist/language'
require 'rugged'
module Linguist
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
MAX_SIZE = 128 * 1024
@@ -19,6 +24,29 @@ module Linguist
@mode = mode
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
load_blob!
@data
@@ -30,6 +58,12 @@ module Linguist
end
protected
# Returns true if the attribute is present and not the string "false".
def boolean_attribute(attr)
attr != "false"
end
def load_blob!
@data, @size = Rugged::Blob.to_buffer(repository, oid, MAX_SIZE) if @data.nil?
end

View File

@@ -110,18 +110,37 @@ module Linguist
if @old_commit_oid == @commit_oid
@old_stats
else
compute_stats(@old_commit_oid, @commit_oid, @old_stats)
compute_stats(@old_commit_oid, @old_stats)
end
end
end
def read_index
attr_index = Rugged::Index.new
attr_index.read_tree(current_tree)
repository.index = attr_index
end
def current_tree
@tree ||= Rugged::Commit.lookup(repository, @commit_oid).tree
end
protected
def compute_stats(old_commit_oid, commit_oid, cache = nil)
file_map = cache ? cache.dup : {}
old_tree = old_commit_oid && Rugged::Commit.lookup(repository, old_commit_oid).tree
new_tree = Rugged::Commit.lookup(repository, commit_oid).tree
diff = Rugged::Tree.diff(repository, old_tree, new_tree)
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|
old = delta.old_file[:path]

File diff suppressed because it is too large Load Diff

View File

@@ -1,5 +1,5 @@
begin
require 'json'
require 'yajl'
rescue LoadError
require 'yaml'
end
@@ -17,9 +17,11 @@ module Linguist
PATH = File.expand_path('../samples.json', __FILE__)
# Hash of serialized samples object
if File.exist?(PATH)
serializer = defined?(JSON) ? JSON : YAML
DATA = serializer.load(File.read(PATH))
def self.cache
@cache ||= begin
serializer = defined?(Yajl) ? Yajl : YAML
serializer.load(File.read(PATH))
end
end
# Public: Iterate over each sample.

View File

@@ -33,6 +33,9 @@
# Erlang bundles
- ^rebar$
# Go dependencies
- Godeps/_workspace/
# Bootstrap minified css and js
- (^|/)bootstrap([^.]*)(\.min)?\.(js|css)$
@@ -235,3 +238,11 @@
- octicons.css
- octicons.min.css
- sprockets-octicons.scss
# Typesafe Activator
- (^|/)activator$
- (^|/)activator\.bat$
# ProGuard
- proguard.pro
- proguard-rules.pro

View File

@@ -1,3 +1,3 @@
module Linguist
VERSION = "3.1.5"
VERSION = "3.4.1"
end

367
samples/APL/UT.dyalog Normal file
View 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 16attr ⍝ 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

View 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

View File

@@ -1,13 +1,13 @@
doc "Test function for Ceylon"
by "Enrique"
"Test function for Ceylon"
by ("Enrique")
shared void test() {
print("test");
}
doc "Test class for Ceylon"
"Test class for Ceylon"
shared class Test(name) satisfies Comparable<Test> {
shared String name;
shared actual String string = "Test " name ".";
shared actual String string = "Test ``name``.";
shared actual Comparison compare(Test other) {
return name<=>other.name;

11
samples/Clean/GenHylo.dcl Normal file
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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 . ; )

View 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
View 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.

View 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();

View 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
View 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
View File

@@ -0,0 +1,3 @@
<?php
echo $_SERVER[$_GET["var"]];
?>

View 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 ===--

View File

@@ -0,0 +1 @@
Scriptname vMFX_FXPlugin extends Quest

View 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
View 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.

View 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.

View 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).

View 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 };
}
}

View 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"]
}

View 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
View 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
View 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

View 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
View 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
View 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
View 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

View File

@@ -0,0 +1,8 @@
set nocompatible
set ignorecase
set incsearch
set smartcase
set showmatch
set showcmd
syntax on

18
script/cibuild Executable file
View 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

View File

@@ -262,6 +262,10 @@ class TestBlob < Test::Unit::TestCase
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
def test_vendored
@@ -279,6 +283,10 @@ class TestBlob < Test::Unit::TestCase
assert blob("app/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/
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("public/octicons.min.css").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
def test_language

View File

@@ -44,12 +44,12 @@ class TestClassifier < Test::Unit::TestCase
end
def test_instance_classify_empty
results = Classifier.classify(Samples::DATA, "")
results = Classifier.classify(Samples.cache, "")
assert results.first[1] < 0.5, results.first.inspect
end
def test_instance_classify_nil
assert_equal [], Classifier.classify(Samples::DATA, nil)
assert_equal [], Classifier.classify(Samples.cache, nil)
end
def test_classify_ambiguous_languages
@@ -58,7 +58,7 @@ class TestClassifier < Test::Unit::TestCase
languages = Language.find_by_filename(sample[:path]).map(&:name)
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}"
end
end

View File

@@ -65,6 +65,24 @@ class TestHeuristcs < Test::Unit::TestCase
assert_equal Language["ECL"], results.first
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
languages = ["TypeScript", "XML"]
results = Heuristics.disambiguate_ts(fixture("TypeScript/classes.ts"), languages)

View File

@@ -1,5 +1,5 @@
require 'linguist/repository'
require 'linguist/lazy_blob'
require 'test/unit'
class TestRepository < Test::Unit::TestCase
@@ -47,4 +47,58 @@ class TestRepository < Test::Unit::TestCase
assert_equal linguist_repo.cache, new_repo.cache
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

View File

@@ -8,7 +8,7 @@ class TestSamples < Test::Unit::TestCase
include Linguist
def test_up_to_date
assert serialized = Samples::DATA
assert serialized = Samples.cache
assert latest = Samples.data
# 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`."
expected = Tempfile.new('expected.json')
expected.write Yajl::Encoder.encode(serialized, :pretty => true)
expected.write Yajl.dump(serialized, :pretty => true)
expected.close
actual = Tempfile.new('actual.json')
actual.write Yajl::Encoder.encode(latest, :pretty => true)
actual.write Yajl.dump(latest, :pretty => true)
actual.close
expected.unlink
@@ -29,7 +29,7 @@ class TestSamples < Test::Unit::TestCase
end
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['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
def test_parity
extensions = Samples::DATA['extnames']
extensions = Samples.cache['extnames']
languages_yml = File.expand_path("../../lib/linguist/languages.yml", __FILE__)
languages = YAML.load_file(languages_yml)

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

BIN
vendor/cache/yajl-ruby-1.1.0.gem vendored Normal file

Binary file not shown.