diff --git a/.gitignore b/.gitignore
index b844b143..97ef7367 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,3 @@
Gemfile.lock
+.bundle/
+vendor/
diff --git a/.travis.yml b/.travis.yml
index f75b3d89..83880550 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -2,11 +2,8 @@ before_install:
- sudo apt-get install libicu-dev -y
- gem update --system 2.1.11
rvm:
- - 1.8.7
- - 1.9.2
- 1.9.3
- 2.0.0
- 2.1.1
- - ree
notifications:
disabled: true
diff --git a/Gemfile b/Gemfile
index 3df9dcfc..851fabc2 100644
--- a/Gemfile
+++ b/Gemfile
@@ -1,7 +1,2 @@
source 'https://rubygems.org'
gemspec
-
-if RUBY_VERSION < "1.9.3"
- # escape_utils 1.0.0 requires 1.9.3 and above
- gem "escape_utils", "0.3.2"
-end
diff --git a/README.md b/README.md
index 1ff2ed8f..660ac00c 100644
--- a/README.md
+++ b/README.md
@@ -106,8 +106,50 @@ To update the `samples.json` after adding new files to [`samples/`](https://gith
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`:
+
+```
+Perl:
+ type: programming
+ ace_mode: perl
+ color: "#0298c3"
+ extensions:
+ - .pl
+ - .PL
+ - .perl
+ - .ph
+ - .plx
+ - .pm
+ - .pod
+ - .psgi
+ interpreters:
+ - perl
+```
+Any of the extensions defined are valid but the first in this array should be the most popular.
+
### Testing
Sometimes getting the tests running can be too much work, especially if you don't have much Ruby experience. It's okay: be lazy and let our build bot [Travis](http://travis-ci.org/#!/github/linguist) run the tests for you. Just open a pull request and the bot will start cranking away.
Here's our current build status, which is hopefully green: [](http://travis-ci.org/github/linguist)
+
+### Releasing
+
+If you are the current maintainer of this gem:
+
+ 0. Create a branch for the release: `git checkout -b cut-release-vxx.xx.xx`
+ 0. Make sure your local dependencies are up to date: `bundle install`
+ 0. Ensure that samples are updated: `bundle exec rake samples`
+ 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. Testing:
+ 0. Bump the Gemfile and Gemfile.lock versions for an app which relies on this gem
+ 0. Install the new gem locally
+ 0. Test behavior locally, branch deploy, whatever needs to happen
+ 0. Merge github/linguist PR
+ 0. Tag and push: `git tag vx.xx.xx; git push --tags`
+ 0. Push to rubygems.org -- `gem push github-linguist-2.10.12.gem`
diff --git a/github-linguist.gemspec b/github-linguist.gemspec
index ca7647b8..d4c2337a 100644
--- a/github-linguist.gemspec
+++ b/github-linguist.gemspec
@@ -1,6 +1,8 @@
+require File.expand_path('../lib/linguist/version', __FILE__)
+
Gem::Specification.new do |s|
s.name = 'github-linguist'
- s.version = '2.10.12'
+ s.version = Linguist::VERSION
s.summary = "GitHub Language detection"
s.description = 'We use this library at GitHub to detect blob languages, highlight code, ignore binary files, suppress generated files in diffs, and generate language breakdown graphs.'
@@ -11,10 +13,10 @@ Gem::Specification.new do |s|
s.files = Dir['lib/**/*']
s.executables << 'linguist'
- s.add_dependency 'charlock_holmes', '~> 0.6.6'
- s.add_dependency 'escape_utils', '>= 0.3.1'
+ s.add_dependency 'charlock_holmes', '~> 0.7.3'
+ s.add_dependency 'escape_utils', '~> 1.0.1'
s.add_dependency 'mime-types', '~> 1.19'
- s.add_dependency 'pygments.rb', '~> 0.5.4'
+ s.add_dependency 'pygments.rb', '~> 0.6.0'
s.add_development_dependency 'json'
s.add_development_dependency 'mocha'
diff --git a/lib/linguist.rb b/lib/linguist.rb
index ad8337c8..3714b5a0 100644
--- a/lib/linguist.rb
+++ b/lib/linguist.rb
@@ -4,3 +4,4 @@ require 'linguist/heuristics'
require 'linguist/language'
require 'linguist/repository'
require 'linguist/samples'
+require 'linguist/version'
diff --git a/lib/linguist/blob_helper.rb b/lib/linguist/blob_helper.rb
index 37793a36..15ab2d9f 100644
--- a/lib/linguist/blob_helper.rb
+++ b/lib/linguist/blob_helper.rb
@@ -112,6 +112,12 @@ module Linguist
end
end
+ def ruby_encoding
+ if hash = detect_encoding
+ hash[:ruby_encoding]
+ end
+ end
+
# Try to guess the encoding
#
# Returns: a Hash, with :encoding, :confidence, :type
@@ -241,7 +247,31 @@ module Linguist
def lines
@lines ||=
if viewable? && data
- data.split(/\r\n|\r|\n/, -1)
+ # `data` is usually encoded as ASCII-8BIT even when the content has
+ # been detected as a different encoding. However, we are not allowed
+ # to change the encoding of `data` because we've made the implicit
+ # guarantee that each entry in `lines` is encoded the same way as
+ # `data`.
+ #
+ # Instead, we re-encode each possible newline sequence as the
+ # detected encoding, then force them back to the encoding of `data`
+ # (usually a binary encoding like ASCII-8BIT). This means that the
+ # byte sequence will match how newlines are likely encoded in the
+ # file, but we don't have to change the encoding of `data` as far as
+ # Ruby is concerned. This allows us to correctly parse out each line
+ # without changing the encoding of `data`, and
+ # also--importantly--without having to duplicate many (potentially
+ # large) strings.
+ begin
+ encoded_newlines = ["\r\n", "\r", "\n"].
+ map { |nl| nl.encode(ruby_encoding, "ASCII-8BIT").force_encoding(data.encoding) }
+
+ data.split(Regexp.union(encoded_newlines), -1)
+ rescue Encoding::ConverterNotFoundError
+ # The data is not splittable in the detected encoding. Assume it's
+ # one big line.
+ [data]
+ end
else
[]
end
diff --git a/lib/linguist/generated.rb b/lib/linguist/generated.rb
index 5c3de141..761288f0 100644
--- a/lib/linguist/generated.rb
+++ b/lib/linguist/generated.rb
@@ -63,7 +63,8 @@ module Linguist
generated_jni_header? ||
composer_lock? ||
node_modules? ||
- vcr_cassette?
+ vcr_cassette? ||
+ generated_by_zephir?
end
# Internal: Is the blob an XCode project file?
@@ -237,6 +238,13 @@ module Linguist
!!name.match(/composer.lock/)
end
+ # Internal: Is the blob a generated by Zephir
+ #
+ # Returns true or false.
+ def generated_by_zephir?
+ !!name.match(/.\.zep\.(?:c|h|php)$/)
+ end
+
# Is the blob a VCR Cassette file?
#
# Returns true or false
diff --git a/lib/linguist/language.rb b/lib/linguist/language.rb
index 955becb3..a8e7a33c 100644
--- a/lib/linguist/language.rb
+++ b/lib/linguist/language.rb
@@ -24,7 +24,6 @@ module Linguist
@extension_index = Hash.new { |h,k| h[k] = [] }
@interpreter_index = Hash.new { |h,k| h[k] = [] }
@filename_index = Hash.new { |h,k| h[k] = [] }
- @primary_extension_index = {}
# Valid Languages types
TYPES = [:data, :markup, :programming, :prose]
@@ -80,12 +79,6 @@ module Linguist
@extension_index[extension] << language
end
- if @primary_extension_index.key?(language.primary_extension)
- raise ArgumentError, "Duplicate primary extension: #{language.primary_extension}"
- end
-
- @primary_extension_index[language.primary_extension] = language
-
language.interpreters.each do |interpreter|
@interpreter_index[interpreter] << language
end
@@ -191,8 +184,7 @@ module Linguist
# Returns all matching Languages or [] if none were found.
def self.find_by_filename(filename)
basename, extname = File.basename(filename), File.extname(filename)
- langs = [@primary_extension_index[extname]] +
- @filename_index[basename] +
+ langs = @filename_index[basename] +
@extension_index[extname]
langs.compact.uniq
end
@@ -299,15 +291,6 @@ module Linguist
@interpreters = attributes[:interpreters] || []
@filenames = attributes[:filenames] || []
- unless @primary_extension = attributes[:primary_extension]
- raise ArgumentError, "#{@name} is missing primary extension"
- end
-
- # Prepend primary extension unless its already included
- if primary_extension && !extensions.include?(primary_extension)
- @extensions = [primary_extension] + extensions
- end
-
# Set popular, and searchable flags
@popular = attributes.key?(:popular) ? attributes[:popular] : false
@searchable = attributes.key?(:searchable) ? attributes[:searchable] : true
@@ -395,20 +378,6 @@ module Linguist
# Returns the extensions Array
attr_reader :extensions
- # Deprecated: Get primary extension
- #
- # Defaults to the first extension but can be overridden
- # in the languages.yml.
- #
- # The primary extension can not be nil. Tests should verify this.
- #
- # This attribute is only used by app/helpers/gists_helper.rb for
- # creating the language dropdown. It really should be using `name`
- # instead. Would like to drop primary extension.
- #
- # Returns the extension String.
- attr_reader :primary_extension
-
# Public: Get interpreters
#
# Examples
@@ -426,6 +395,27 @@ module Linguist
#
# Returns the extensions Array
attr_reader :filenames
+
+ # Public: Return all possible extensions for language
+ def all_extensions
+ (extensions + [primary_extension]).uniq
+ end
+
+ # Deprecated: Get primary extension
+ #
+ # Defaults to the first extension but can be overridden
+ # in the languages.yml.
+ #
+ # The primary extension can not be nil. Tests should verify this.
+ #
+ # This method is only used by app/helpers/gists_helper.rb for creating
+ # the language dropdown. It really should be using `name` instead.
+ # Would like to drop primary extension.
+ #
+ # Returns the extension String.
+ def primary_extension
+ extensions.first
+ end
# Public: Get URL escaped name.
#
@@ -568,9 +558,8 @@ module Linguist
:group_name => options['group'],
:searchable => options.key?('searchable') ? options['searchable'] : true,
:search_term => options['search_term'],
- :extensions => options['extensions'].sort,
+ :extensions => [options['extensions'].first] + options['extensions'][1..-1].sort,
:interpreters => options['interpreters'].sort,
- :primary_extension => options['primary_extension'],
:filenames => options['filenames'],
:popular => popular.include?(name)
)
diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml
index 91ca647c..f733b114 100644
--- a/lib/linguist/languages.yml
+++ b/lib/linguist/languages.yml
@@ -3,18 +3,15 @@
# All languages have an associated lexer for syntax highlighting. It
# defaults to name.downcase, which covers most cases.
#
-# type - Either data, programming, markup, or nil
+# type - Either data, programming, markup, prose, or nil
# lexer - An explicit lexer String (defaults to name)
# aliases - An Array of additional aliases (implicitly
# includes name.downcase)
# ace_mode - A String name of Ace Mode (if available)
# wrap - Boolean wrap to enable line wrapping (default: false)
-# extension - An Array of associated extensions
+# extensions - An Array of associated extensions (the first one is
+# considered the primary extension)
# interpreters - An Array of associated interpreters
-# primary_extension - A String for the main extension associated with
-# the language. Must be unique. Used when a Language is picked
-# from a dropdown and we need to automatically choose an
-# extension.
# searchable - Boolean flag to enable searching (defaults to true)
# search_term - Deprecated: Some languages maybe indexed under a
# different alias. Avoid defining new exceptions.
@@ -28,13 +25,15 @@
ABAP:
type: programming
lexer: ABAP
- primary_extension: .abap
+ extensions:
+ - .abap
ANTLR:
type: programming
color: "#9DC3FF"
lexer: ANTLR
- primary_extension: .g4
+ extensions:
+ - .g4
ASP:
type: programming
@@ -44,8 +43,8 @@ ASP:
aliases:
- aspx
- aspx-vb
- primary_extension: .asp
extensions:
+ - .asp
- .asax
- .ascx
- .ashx
@@ -56,11 +55,11 @@ ASP:
ATS:
type: programming
color: "#1ac620"
- primary_extension: .dats
lexer: OCaml
aliases:
- ats2
extensions:
+ - .dats
- .atxt
- .hats
- .sats
@@ -72,43 +71,48 @@ ActionScript:
search_term: as3
aliases:
- as3
- primary_extension: .as
+ extensions:
+ - .as
Ada:
type: programming
color: "#02f88c"
- primary_extension: .adb
extensions:
+ - .adb
- .ads
Agda:
type: programming
color: "#467C91"
- primary_extension: .agda
+ extensions:
+ - .agda
Alloy:
type: programming # 'modeling' would be more appropiate
lexer: Text only
color: "#cc5c24"
- primary_extension: .als
+ extensions:
+ - .als
ApacheConf:
type: markup
aliases:
- apache
- primary_extension: .apacheconf
+ extensions:
+ - .apacheconf
Apex:
type: programming
lexer: Text only
- primary_extension: .cls
+ extensions:
+ - .cls
AppleScript:
type: programming
aliases:
- osascript
- primary_extension: .applescript
extensions:
+ - .applescript
- .scpt
interpreters:
- osascript
@@ -117,21 +121,23 @@ Arc:
type: programming
color: "#ca2afe"
lexer: Text only
- primary_extension: .arc
+ extensions:
+ - .arc
Arduino:
type: programming
color: "#bd79d1"
lexer: C++
- primary_extension: .ino
+ extensions:
+ - .ino
AsciiDoc:
type: prose
lexer: Text only
ace_mode: asciidoc
wrap: true
- primary_extension: .asciidoc
extensions:
+ - .asciidoc
- .adoc
- .asc
@@ -139,7 +145,8 @@ AspectJ:
type: programming
lexer: AspectJ
color: "#1957b0"
- primary_extension: .aj
+ extensions:
+ - .aj
Assembly:
type: programming
@@ -148,11 +155,14 @@ Assembly:
search_term: nasm
aliases:
- nasm
- primary_extension: .asm
+ extensions:
+ - .asm
+ - .inc
Augeas:
type: programming
- primary_extension: .aug
+ extensions:
+ - .aug
AutoHotkey:
type: programming
@@ -160,7 +170,8 @@ AutoHotkey:
color: "#6594b9"
aliases:
- ahk
- primary_extension: .ahk
+ extensions:
+ - .ahk
AutoIt:
type: programming
@@ -169,13 +180,14 @@ AutoIt:
- au3
- AutoIt3
- AutoItScript
- primary_extension: .au3
+ extensions:
+ - .au3
Awk:
type: programming
lexer: Awk
- primary_extension: .awk
extensions:
+ - .awk
- .auk
- .gawk
- .mawk
@@ -192,54 +204,60 @@ Batchfile:
search_term: bat
aliases:
- bat
- primary_extension: .bat
extensions:
+ - .bat
- .cmd
Befunge:
- primary_extension: .befunge
+ extensions:
+ - .befunge
BlitzBasic:
type: programming
aliases:
- blitzplus
- blitz3d
- primary_extension: .bb
extensions:
+ - .bb
- .decls
BlitzMax:
- primary_extension: .bmx
+ extensions:
+ - .bmx
Bluespec:
type: programming
lexer: verilog
- primary_extension: .bsv
+ extensions:
+ - .bsv
Boo:
type: programming
color: "#d4bec1"
- primary_extension: .boo
+ extensions:
+ - .boo
Brainfuck:
- primary_extension: .b
extensions:
+ - .b
- .bf
Brightscript:
type: programming
lexer: Text only
- primary_extension: .brs
+ extensions:
+ - .brs
Bro:
type: programming
- primary_extension: .bro
+ extensions:
+ - .bro
C:
type: programming
color: "#555"
- primary_extension: .c
extensions:
+ - .c
- .cats
- .w
@@ -250,8 +268,8 @@ C#:
color: "#5a25a2"
aliases:
- csharp
- primary_extension: .cs
extensions:
+ - .cs
- .cshtml
- .csx
@@ -262,8 +280,8 @@ C++:
color: "#f34b7d"
aliases:
- cpp
- primary_extension: .cpp
extensions:
+ - .cpp
- .C
- .c++
- .cc
@@ -276,11 +294,13 @@ C++:
- .inl
- .tcc
- .tpp
+ - .ipp
C-ObjDump:
type: data
lexer: c-objdump
- primary_extension: .c-objdump
+ extensions:
+ - .c-objdump
C2hs Haskell:
type: programming
@@ -288,24 +308,26 @@ C2hs Haskell:
group: Haskell
aliases:
- c2hs
- primary_extension: .chs
+ extensions:
+ - .chs
CLIPS:
type: programming
lexer: Text only
- primary_extension: .clp
+ extensions:
+ - .clp
CMake:
- primary_extension: .cmake
extensions:
+ - .cmake
- .cmake.in
filenames:
- CMakeLists.txt
COBOL:
type: programming
- primary_extension: .cob
extensions:
+ - .cob
- .cbl
- .ccp
- .cobol
@@ -314,41 +336,43 @@ COBOL:
CSS:
ace_mode: css
color: "#563d7c"
- primary_extension: .css
+ extensions:
+ - .css
Ceylon:
type: programming
lexer: Ceylon
- primary_extension: .ceylon
+ extensions:
+ - .ceylon
ChucK:
lexer: Java
- primary_extension: .ck
+ extensions:
+ - .ck
Cirru:
type: programming
color: "#aaaaff"
- primary_extension: .cirru
# ace_mode: cirru
# lexer: Cirru
lexer: Text only
extensions:
- - .cr
+ - .cirru
Clean:
type: programming
color: "#3a81ad"
lexer: Text only
- primary_extension: .icl
extensions:
+ - .icl
- .dcl
Clojure:
type: programming
ace_mode: clojure
color: "#db5855"
- primary_extension: .clj
extensions:
+ - .clj
- .cl2
- .cljc
- .cljs
@@ -366,8 +390,8 @@ CoffeeScript:
aliases:
- coffee
- coffee-script
- primary_extension: .coffee
extensions:
+ - .coffee
- ._coffee
- .cson
- .iced
@@ -384,8 +408,8 @@ ColdFusion:
search_term: cfm
aliases:
- cfm
- primary_extension: .cfm
extensions:
+ - .cfm
- .cfc
Common Lisp:
@@ -393,8 +417,8 @@ Common Lisp:
color: "#3fb68b"
aliases:
- lisp
- primary_extension: .lisp
extensions:
+ - .lisp
- .asd
- .cl
- .lsp
@@ -407,15 +431,24 @@ Common Lisp:
- clisp
- ecl
+Component Pascal:
+ type: programming
+ lexer: Delphi
+ color: "#b0ce4e"
+ extensions:
+ - .cp
+ - .cps
+
Coq:
type: programming
- primary_extension: .coq
+ extensions:
+ - .coq
Cpp-ObjDump:
type: data
lexer: cpp-objdump
- primary_extension: .cppobjdump
extensions:
+ - .cppobjdump
- .c++objdump
- .cxx-objdump
@@ -423,137 +456,156 @@ Creole:
type: prose
lexer: Text only
wrap: true
- primary_extension: .creole
+ extensions:
+ - .creole
Crystal:
type: programming
lexer: Ruby
- primary_extension: .cr
+ extensions:
+ - .cr
ace_mode: ruby
Cucumber:
lexer: Gherkin
- primary_extension: .feature
+ extensions:
+ - .feature
Cuda:
+ type: programming
lexer: CUDA
- primary_extension: .cu
extensions:
+ - .cu
- .cuh
Cython:
type: programming
group: Python
- primary_extension: .pyx
extensions:
+ - .pyx
- .pxd
- .pxi
D:
type: programming
color: "#fcd46d"
- primary_extension: .d
extensions:
+ - .d
- .di
D-ObjDump:
type: data
lexer: d-objdump
- primary_extension: .d-objdump
+ extensions:
+ - .d-objdump
DM:
type: programming
color: "#075ff1"
lexer: C++
- primary_extension: .dm
+ extensions:
+ - .dm
aliases:
- byond
DOT:
- type: programming
+ type: data
lexer: Text only
- primary_extension: .dot
extensions:
+ - .dot
- .gv
Darcs Patch:
search_term: dpatch
aliases:
- dpatch
- primary_extension: .darcspatch
extensions:
+ - .darcspatch
- .dpatch
Dart:
type: programming
color: "#98BAD6"
- primary_extension: .dart
+ extensions:
+ - .dart
DCPU-16 ASM:
type: programming
lexer: dasm16
- primary_extension: .dasm16
extensions:
+ - .dasm16
- .dasm
aliases:
- dasm16
Diff:
- primary_extension: .diff
+ extensions:
+ - .diff
Dogescript:
type: programming
lexer: Text only
color: "#cca760"
- primary_extension: .djs
+ extensions:
+ - .djs
Dylan:
type: programming
color: "#3ebc27"
- primary_extension: .dylan
extensions:
+ - .dylan
- .intr
- .lid
+E:
+ type: programming
+ color: "#ccce35"
+ lexer: Text only
+ extensions:
+ - .E
+
Ecere Projects:
type: data
group: JavaScript
lexer: JSON
- primary_extension: .epj
+ extensions:
+ - .epj
ECL:
type: programming
color: "#8a1267"
- primary_extension: .ecl
lexer: ECL
extensions:
+ - .ecl
- .eclxml
Eagle:
type: markup
color: "#3994bc"
lexer: XML
- primary_extension: .sch
extensions:
+ - .sch
- .brd
Eiffel:
type: programming
lexer: Text only
color: "#946d57"
- primary_extension: .e
+ extensions:
+ - .e
Elixir:
type: programming
color: "#6e4a7e"
- primary_extension: .ex
extensions:
+ - .ex
- .exs
Elm:
type: programming
lexer: Haskell
- primary_extension: .elm
+ extensions:
+ - .elm
Emacs Lisp:
type: programming
@@ -562,17 +614,17 @@ Emacs Lisp:
aliases:
- elisp
- emacs
- primary_extension: .el
filenames:
- .emacs
extensions:
+ - .el
- .emacs
Erlang:
type: programming
color: "#0faf8d"
- primary_extension: .erl
extensions:
+ - .erl
- .hrl
F#:
@@ -582,25 +634,25 @@ F#:
search_term: fsharp
aliases:
- fsharp
- primary_extension: .fs
extensions:
+ - .fs
- .fsi
- .fsx
FLUX:
type: programming
color: "#33CCFF"
- primary_extension: .fx
lexer: Text only
extensions:
+ - .fx
- .flux
FORTRAN:
type: programming
lexer: Fortran
color: "#4d41b1"
- primary_extension: .f90
extensions:
+ - .f90
- .F
- .F03
- .F08
@@ -620,7 +672,8 @@ FORTRAN:
Factor:
type: programming
color: "#636746"
- primary_extension: .factor
+ extensions:
+ - .factor
filenames:
- .factor-rc
- .factor-boot-rc
@@ -628,8 +681,8 @@ Factor:
Fancy:
type: programming
color: "#7b9db4"
- primary_extension: .fy
extensions:
+ - .fy
- .fancypack
filenames:
- Fakefile
@@ -637,31 +690,40 @@ Fancy:
Fantom:
type: programming
color: "#dbded5"
- primary_extension: .fan
+ extensions:
+ - .fan
Forth:
type: programming
- primary_extension: .fth
color: "#341708"
lexer: Text only
extensions:
+ - .fth
- .4th
Frege:
type: programming
color: "#00cafe"
lexer: Haskell
- primary_extension: .fr
+ extensions:
+ - .fr
Game Maker Language:
type: programming
+ color: "#8ad353"
lexer: JavaScript
- primary_extension: .gml
+ extensions:
+ - .gml
+
+GAMS:
+ type: programming
+ lexer: Text only
+ extensions:
+ - .gms
GAP:
type: programming
lexer: Text only
- primary_extension: .g
extensions:
- .g
- .gap
@@ -671,56 +733,63 @@ GAP:
GAS:
type: programming
group: Assembly
- primary_extension: .s
extensions:
+ - .s
- .S
GLSL:
group: C
type: programming
- primary_extension: .glsl
extensions:
+ - .glsl
- .fp
- .frag
+ - .fshader
- .geom
- .glslv
+ - .gshader
- .shader
- .vert
+ - .vshader
Genshi:
- primary_extension: .kid
+ extensions:
+ - .kid
Gentoo Ebuild:
group: Shell
lexer: Bash
- primary_extension: .ebuild
+ extensions:
+ - .ebuild
Gentoo Eclass:
group: Shell
lexer: Bash
- primary_extension: .eclass
+ extensions:
+ - .eclass
Gettext Catalog:
search_term: pot
searchable: false
aliases:
- pot
- primary_extension: .po
extensions:
+ - .po
- .pot
Glyph:
type: programming
color: "#e4cc98"
lexer: Tcl
- primary_extension: .glf
+ extensions:
+ - .glf
Gnuplot:
type: programming
color: "#f0a9f0"
lexer: Gnuplot
- primary_extension: .gp
extensions:
+ - .gp
- .gnu
- .gnuplot
- .plot
@@ -728,13 +797,15 @@ Gnuplot:
Go:
type: programming
- color: "#a89b4d"
- primary_extension: .go
+ color: "#375eab"
+ extensions:
+ - .go
Gosu:
type: programming
color: "#82937f"
- primary_extension: .gs
+ extensions:
+ - .gs
Grammatical Framework:
type: programming
@@ -742,13 +813,14 @@ Grammatical Framework:
aliases:
- gf
wrap: false
- primary_extension: .gf
+ extensions:
+ - .gf
searchable: true
color: "#ff0000"
Groff:
- primary_extension: .man
extensions:
+ - .man
- '.1'
- '.2'
- '.3'
@@ -761,7 +833,11 @@ Groovy:
type: programming
ace_mode: groovy
color: "#e69f56"
- primary_extension: .groovy
+ extensions:
+ - .groovy
+ - .grt
+ - .gtpl
+ - .gvy
interpreters:
- groovy
@@ -770,27 +846,28 @@ Groovy Server Pages:
lexer: Java Server Page
aliases:
- gsp
- primary_extension: .gsp
+ extensions:
+ - .gsp
HTML:
type: markup
ace_mode: html
aliases:
- xhtml
- primary_extension: .html
extensions:
+ - .html
- .htm
- - .xhtml
- .html.hl
+ - .st
+ - .xhtml
HTML+Django:
type: markup
group: HTML
lexer: HTML+Django/Jinja
- primary_extension: .mustache # TODO: This is incorrect
extensions:
- - .jinja
- .mustache
+ - .jinja
HTML+ERB:
type: markup
@@ -798,8 +875,8 @@ HTML+ERB:
lexer: RHTML
aliases:
- erb
- primary_extension: .erb
extensions:
+ - .erb
- .erb.deface
- .html.erb
- .html.erb.deface
@@ -807,25 +884,27 @@ HTML+ERB:
HTML+PHP:
type: markup
group: HTML
- primary_extension: .phtml
+ extensions:
+ - .phtml
HTTP:
type: data
- primary_extension: .http
+ extensions:
+ - .http
Haml:
group: HTML
type: markup
- primary_extension: .haml
extensions:
+ - .haml
- .haml.deface
- .html.haml.deface
Handlebars:
type: markup
lexer: Text only
- primary_extension: .handlebars
extensions:
+ - .handlebars
- .hbs
- .html.handlebars
- .html.hbs
@@ -834,21 +913,22 @@ Harbour:
type: programming
lexer: Text only
color: "#0e60e3"
- primary_extension: .hb
+ extensions:
+ - .hb
Haskell:
type: programming
color: "#29b544"
- primary_extension: .hs
extensions:
+ - .hs
- .hsc
Haxe:
type: programming
ace_mode: haxe
- color: "#346d51"
- primary_extension: .hx
+ color: "#f7941e"
extensions:
+ - .hx
- .hxsl
Hy:
@@ -856,13 +936,15 @@ Hy:
lexer: Clojure
ace_mode: clojure
color: "#7891b1"
- primary_extension: .hy
+ extensions:
+ - .hy
IDL:
type: programming
- lexer: Text only
+ lexer: IDL
color: "#e3592c"
- primary_extension: .pro
+ extensions:
+ - .pro
INI:
type: data
@@ -870,21 +952,30 @@ INI:
- .ini
- .prefs
- .properties
- primary_extension: .ini
-
+
Inno Setup:
- primary_extension: .iss
+ extensions:
+ - .iss
lexer: Text only
Idris:
type: programming
lexer: Idris
- primary_extension: .idr
extensions:
+ - .idr
- .lidr
+Inform 7:
+ type: programming
+ lexer: Text only
+ wrap: true
+ extensions:
+ - .ni
+ - .i7x
+
Inno Setup:
- primary_extension: .iss
+ extensions:
+ - .iss
lexer: Text only
IRC log:
@@ -892,39 +983,49 @@ IRC log:
search_term: irc
aliases:
- irc
- primary_extension: .irclog
extensions:
+ - .irclog
- .weechatlog
Io:
type: programming
color: "#a9188d"
- primary_extension: .io
+ extensions:
+ - .io
Ioke:
type: programming
color: "#078193"
- primary_extension: .ik
+ extensions:
+ - .ik
+
+Isabelle:
+ type: programming
+ lexer: Text only
+ color: "#fdcd00"
+ extensions:
+ - .thy
J:
type: programming
lexer: Text only
- primary_extension: .ijs
+ extensions:
+ - .ijs
JSON:
type: data
group: JavaScript
ace_mode: json
searchable: false
- primary_extension: .json
extensions:
+ - .json
- .sublime-keymap
- - .sublime_metrics
- .sublime-mousemap
- .sublime-project
- - .sublime_session
- .sublime-settings
- .sublime-workspace
+ - .sublime_metrics
+ - .sublime_session
filenames:
- .jshintrc
- composer.lock
@@ -932,31 +1033,36 @@ JSON:
JSON5:
type: data
lexer: JavaScript
- primary_extension: .json5
+ extensions:
+ - .json5
JSONLD:
type: data
group: JavaScript
ace_mode: json
lexer: JavaScript
- primary_extension: .jsonld
+ extensions:
+ - .jsonld
JSONiq:
type: programming
ace_mode: jsoniq
lexer: XQuery
- primary_extension: .jq
+ extensions:
+ - .jq
Jade:
group: HTML
type: markup
- primary_extension: .jade
+ extensions:
+ - .jade
Java:
type: programming
ace_mode: java
color: "#b07219"
- primary_extension: .java
+ extensions:
+ - .java
Java Server Pages:
group: Java
@@ -964,20 +1070,22 @@ Java Server Pages:
search_term: jsp
aliases:
- jsp
- primary_extension: .jsp
+ extensions:
+ - .jsp
JavaScript:
type: programming
ace_mode: javascript
- color: "#f7df1e"
+ color: "#f1e05a"
aliases:
- js
- node
- primary_extension: .js
extensions:
+ - .js
- ._js
- .bones
- .es6
+ - .frag
- .jake
- .jsfl
- .jsm
@@ -987,6 +1095,8 @@ JavaScript:
- .pac
- .sjs
- .ssjs
+ - .xsjs
+ - .xsjslib
filenames:
- Jakefile
interpreters:
@@ -994,56 +1104,82 @@ JavaScript:
Julia:
type: programming
- primary_extension: .jl
+ extensions:
+ - .jl
color: "#a270ba"
KRL:
lexer: Text only
type: programming
color: "#f5c800"
- primary_extension: .krl
+ extensions:
+ - .krl
+
+Kit:
+ type: markup
+ lexer: HTML
+ ace_mode: html
+ extensions:
+ - .kit
Kotlin:
type: programming
- primary_extension: .kt
extensions:
+ - .kt
- .ktm
- .kts
LFE:
type: programming
- primary_extension: .lfe
+ extensions:
+ - .lfe
color: "#004200"
lexer: Common Lisp
group: Erlang
LLVM:
- primary_extension: .ll
+ extensions:
+ - .ll
Lasso:
type: programming
lexer: Lasso
color: "#2584c3"
- primary_extension: .lasso
+ extensions:
+ - .lasso
+
+Latte:
+ type: markup
+ color: "#A8FF97"
+ group: HTML
+ lexer: Smarty
+ extensions:
+ - .latte
Less:
type: markup
group: CSS
lexer: CSS
- primary_extension: .less
+ extensions:
+ - .less
LilyPond:
lexer: Text only
- primary_extension: .ly
extensions:
+ - .ly
- .ily
+Liquid:
+ type: markup
+ lexer: Text only
+ extensions:
+ - .liquid
+
Literate Agda:
type: programming
group: Agda
- primary_extension: .lagda
extensions:
- - .lagda
+ - .lagda
Literate CoffeeScript:
type: programming
@@ -1054,7 +1190,8 @@ Literate CoffeeScript:
search_term: litcoffee
aliases:
- litcoffee
- primary_extension: .litcoffee
+ extensions:
+ - .litcoffee
Literate Haskell:
type: programming
@@ -1062,7 +1199,8 @@ Literate Haskell:
search_term: lhs
aliases:
- lhs
- primary_extension: .lhs
+ extensions:
+ - .lhs
LiveScript:
type: programming
@@ -1070,28 +1208,29 @@ LiveScript:
color: "#499886"
aliases:
- ls
- primary_extension: .ls
extensions:
+ - .ls
- ._ls
filenames:
- Slakefile
Logos:
type: programming
- primary_extension: .xm
+ extensions:
+ - .xm
Logtalk:
type: programming
- primary_extension: .lgt
extensions:
+ - .lgt
- .logtalk
Lua:
type: programming
ace_mode: lua
color: "#fa1fa1"
- primary_extension: .lua
extensions:
+ - .lua
- .nse
- .rbxs
interpreters:
@@ -1102,17 +1241,23 @@ M:
lexer: Common Lisp
aliases:
- mumps
- primary_extension: .mumps
extensions:
+ - .mumps
- .m
+MTML:
+ type: markup
+ lexer: HTML
+ color: "#0095d9"
+ extensions:
+ - .mtml
+
Makefile:
aliases:
- make
extensions:
- .mak
- .mk
- primary_extension: .mak
filenames:
- makefile
- Makefile
@@ -1121,8 +1266,8 @@ Makefile:
- make
Mako:
- primary_extension: .mako
extensions:
+ - .mako
- .mao
Markdown:
@@ -1130,10 +1275,11 @@ Markdown:
lexer: Text only
ace_mode: markdown
wrap: true
- primary_extension: .md
extensions:
+ - .md
- .markdown
- .mkd
+ - .mkdn
- .mkdown
- .ron
@@ -1142,18 +1288,22 @@ Mask:
lexer: SCSS
color: "#f97732"
ace_mode: scss
- primary_extension: .mask
+ extensions:
+ - .mask
Mathematica:
type: programming
- primary_extension: .mathematica
+ extensions:
+ - .mathematica
+ - .m
+ - .nb
lexer: Text only
Matlab:
type: programming
color: "#bb92ac"
- primary_extension: .matlab
extensions:
+ - .matlab
- .m
Max:
@@ -1164,8 +1314,8 @@ Max:
- max/msp
- maxmsp
search_term: max/msp
- primary_extension: .maxpat
extensions:
+ - .maxpat
- .maxhelp
- .maxproj
- .mxt
@@ -1175,31 +1325,30 @@ MediaWiki:
type: prose
lexer: Text only
wrap: true
- primary_extension: .mediawiki
+ extensions:
+ - .mediawiki
Mercury:
type: programming
- # This is the background colour on the web page.
color: "#abcdef"
- # The primary extension is .m, but lingist won't accept duplicates
- primary_extension: .mercury
- # Mercury's syntax is not prolog syntax, but they do share the lexer
lexer: Prolog
+ ace_mode: prolog
extensions:
- .m
- .moo
MiniD: # Legacy
searchable: false
- primary_extension: .minid # Dummy extension
+ extensions:
+ - .minid # Dummy extension
Mirah:
type: programming
lexer: Ruby
search_term: ruby
color: "#c7a938"
- primary_extension: .druby
extensions:
+ - .druby
- .duby
- .mir
- .mirah
@@ -1207,59 +1356,75 @@ Mirah:
Monkey:
type: programming
lexer: Monkey
- primary_extension: .monkey
+ extensions:
+ - .monkey
Moocode:
+ type: programming
lexer: MOOCode
- primary_extension: .moo
+ extensions:
+ - .moo
MoonScript:
type: programming
- primary_extension: .moon
+ extensions:
+ - .moon
Myghty:
- primary_extension: .myt
+ extensions:
+ - .myt
NSIS:
- primary_extension: .nsi
+ extensions:
+ - .nsi
Nemerle:
type: programming
color: "#0d3c6e"
- primary_extension: .n
+ extensions:
+ - .n
NetLogo:
type: programming
lexer: Common Lisp
color: "#ff2b2b"
- primary_extension: .nlogo
+ extensions:
+ - .nlogo
Nginx:
type: markup
lexer: Nginx configuration file
- primary_extension: .nginxconf
+ extensions:
+ - .nginxconf
Nimrod:
type: programming
color: "#37775b"
- primary_extension: .nim
extensions:
+ - .nim
- .nimrod
+Nix:
+ type: programming
+ lexer: Nix
+ extensions:
+ - .nix
+
Nu:
type: programming
lexer: Scheme
color: "#c9df40"
aliases:
- nush
- primary_extension: .nu
+ extensions:
+ - .nu
filenames:
- Nukefile
NumPy:
group: Python
- primary_extension: .numpy
extensions:
+ - .numpy
- .numpyw
- .numsc
@@ -1267,8 +1432,8 @@ OCaml:
type: programming
ace_mode: ocaml
color: "#3be133"
- primary_extension: .ml
extensions:
+ - .ml
- .eliomi
- .ml4
- .mli
@@ -1278,7 +1443,8 @@ OCaml:
ObjDump:
type: data
lexer: objdump
- primary_extension: .objdump
+ extensions:
+ - .objdump
Objective-C:
type: programming
@@ -1286,7 +1452,8 @@ Objective-C:
aliases:
- obj-c
- objc
- primary_extension: .m
+ extensions:
+ - .m
Objective-C++:
type: programming
@@ -1294,33 +1461,36 @@ Objective-C++:
aliases:
- obj-c++
- objc++
- primary_extension: .mm
+ extensions:
+ - .mm
Objective-J:
type: programming
color: "#ff0c5a"
aliases:
- obj-j
- primary_extension: .j
extensions:
+ - .j
- .sj
Omgrofl:
type: programming
- primary_extension: .omgrofl
+ extensions:
+ - .omgrofl
color: "#cabbff"
lexer: Text only
Opa:
type: programming
- primary_extension: .opa
+ extensions:
+ - .opa
OpenCL:
type: programming
group: C
lexer: C
- primary_extension: .cl
extensions:
+ - .cl
- .opencl
OpenEdge ABL:
@@ -1329,32 +1499,44 @@ OpenEdge ABL:
- progress
- openedge
- abl
- primary_extension: .p
+ extensions:
+ - .p
Org:
type: prose
lexer: Text only
wrap: true
- primary_extension: .org
+ extensions:
+ - .org
+
+Ox:
+ type: programming
+ lexer: Text only
+ extensions:
+ - .ox
+ - .oxh
+ - .oxo
Oxygene:
type: programming
lexer: Text only
color: "#5a63a3"
- primary_extension: .oxygene
+ extensions:
+ - .oxygene
PAWN:
type: programming
lexer: C++
color: "#dbb284"
- primary_extension: .pwn
+ extensions:
+ - .pwn
PHP:
type: programming
ace_mode: php
- color: "#6e03c1"
- primary_extension: .php
+ color: "#4F5D95"
extensions:
+ - .php
- .aw
- .ctp
- .php3
@@ -1364,11 +1546,19 @@ PHP:
filenames:
- Phakefile
+Pan:
+ type: programming
+ lexer: Text only
+ color: '#cc0000'
+ extensions:
+ - .pan
+
Parrot:
type: programming
color: "#f3ca0a"
lexer: Text only
- primary_extension: .parrot # Dummy extension
+ extensions:
+ - .parrot # Dummy extension
Parrot Internal Representation:
group: Parrot
@@ -1376,7 +1566,8 @@ Parrot Internal Representation:
lexer: Text only
aliases:
- pir
- primary_extension: .pir
+ extensions:
+ - .pir
Parrot Assembly:
group: Parrot
@@ -1384,14 +1575,15 @@ Parrot Assembly:
lexer: Text only
aliases:
- pasm
- primary_extension: .pasm
+ extensions:
+ - .pasm
Pascal:
type: programming
lexer: Delphi
color: "#b0ce4e"
- primary_extension: .pas
extensions:
+ - .pas
- .dfm
- .lpr
@@ -1399,8 +1591,8 @@ Perl:
type: programming
ace_mode: perl
color: "#0298c3"
- primary_extension: .pl
extensions:
+ - .pl
- .PL
- .perl
- .ph
@@ -1414,8 +1606,8 @@ Perl:
Perl6:
type: programming
color: "#0298c3"
- primary_extension: .p6
extensions:
+ - .p6
- .6pl
- .6pm
- .nqp
@@ -1427,9 +1619,9 @@ Perl6:
Pike:
type: programming
color: "#066ab2"
- lexer: C
- primary_extension: .pike
+ lexer: Pike
extensions:
+ - .pike
- .pmod
Pod:
@@ -1437,18 +1629,20 @@ Pod:
lexer: Text only
ace_mode: perl
wrap: true
- primary_extension: .pod
+ extensions:
+ - .pod
PogoScript:
type: programming
color: "#d80074"
lexer: Text only
- primary_extension: .pogo
+ extensions:
+ - .pogo
PostScript:
type: markup
- primary_extension: .ps
extensions:
+ - .ps
- .eps
PowerShell:
@@ -1456,8 +1650,8 @@ PowerShell:
ace_mode: powershell
aliases:
- posh
- primary_extension: .ps1
extensions:
+ - .ps1
- .psd1
- .psm1
@@ -1465,27 +1659,35 @@ Processing:
type: programming
lexer: Java
color: "#2779ab"
- primary_extension: .pde
+ extensions:
+ - .pde
Prolog:
type: programming
color: "#74283c"
- primary_extension: .prolog
extensions:
+ - .prolog
- .ecl
- .pl
+Propeller Spin:
+ type: programming
+ lexer: Text only
+ color: "#2b446d"
+ extensions:
+ - .spin
+
Protocol Buffer:
type: markup
aliases:
- protobuf
- Protocol Buffers
- primary_extension: .proto
+ extensions:
+ - .proto
Puppet:
type: programming
color: "#cc5555"
- primary_extension: .pp
extensions:
- .pp
filenames:
@@ -1495,22 +1697,26 @@ Pure Data:
type: programming
color: "#91de79"
lexer: Text only
- primary_extension: .pd
+ extensions:
+ - .pd
PureScript:
type: programming
- color: "#f3ce45"
+ color: "#bcdc53"
lexer: Haskell
- primary_extension: .purs
+ extensions:
+ - .purs
Python:
type: programming
ace_mode: python
color: "#3581ba"
- primary_extension: .py
extensions:
+ - .py
- .gyp
- .lmi
+ - .pyde
+ - .pyp
- .pyt
- .pyw
- .wsgi
@@ -1527,12 +1733,20 @@ Python traceback:
group: Python
lexer: Python Traceback
searchable: false
- primary_extension: .pytb
+ extensions:
+ - .pytb
QML:
type: markup
color: "#44a51c"
- primary_extension: .qml
+ extensions:
+ - .qml
+
+QMake:
+ lexer: Text only
+ extensions:
+ - .pro
+ - .pri
R:
type: programming
@@ -1540,9 +1754,12 @@ R:
lexer: S
aliases:
- R
- primary_extension: .r
+ - Rscript
extensions:
+ - .r
- .R
+ - .Rd
+ - .rd
- .rsx
filenames:
- .Rprofile
@@ -1554,13 +1771,14 @@ RDoc:
lexer: Text only
ace_mode: rdoc
wrap: true
- primary_extension: .rdoc
+ extensions:
+ - .rdoc
REALbasic:
type: programming
lexer: VB.net
- primary_extension: .rbbas
extensions:
+ - .rbbas
- .rbfrm
- .rbmnu
- .rbres
@@ -1570,23 +1788,24 @@ REALbasic:
RHTML:
type: markup
group: HTML
- primary_extension: .rhtml
+ extensions:
+ - .rhtml
RMarkdown:
type: prose
lexer: Text only
wrap: true
ace_mode: markdown
- primary_extension: .rmd
extensions:
+ - .rmd
- .Rmd
Racket:
type: programming
lexer: Racket
color: "#ae17ff"
- primary_extension: .rkt
extensions:
+ - .rkt
- .rktd
- .rktl
@@ -1594,32 +1813,43 @@ Ragel in Ruby Host:
type: programming
lexer: Ragel in Ruby Host
color: "#ff9c2e"
- primary_extension: .rl
+ extensions:
+ - .rl
Raw token data:
search_term: raw
aliases:
- raw
- primary_extension: .raw
+ extensions:
+ - .raw
Rebol:
type: programming
lexer: REBOL
color: "#358a5b"
- primary_extension: .reb
extensions:
+ - .reb
- .r
- .r2
- .r3
- .rebol
+Red:
+ type: programming
+ lexer: Text only
+ color: "#ee0000"
+ extensions:
+ - .red
+ - .reds
+
Redcode:
- primary_extension: .cw
+ extensions:
+ - .cw
RobotFramework:
type: programming
- primary_extension: .robot
- # extensions:
+ extensions:
+ - .robot
# - .txt
Rouge:
@@ -1627,7 +1857,8 @@ Rouge:
lexer: Clojure
ace_mode: clojure
color: "#cc0088"
- primary_extension: .rg
+ extensions:
+ - .rg
Ruby:
type: programming
@@ -1639,8 +1870,8 @@ Ruby:
- rake
- rb
- rbx
- primary_extension: .rb
extensions:
+ - .rb
- .builder
- .gemspec
- .god
@@ -1656,61 +1887,89 @@ Ruby:
interpreters:
- ruby
filenames:
+ - .pryrc
- Appraisals
- Berksfile
+ - Buildfile
- Gemfile
- Gemfile.lock
- Guardfile
+ - Jarfile
+ - Mavenfile
- Podfile
- Thorfile
- Vagrantfile
+ - buildfile
Rust:
type: programming
color: "#dea584"
- primary_extension: .rs
+ extensions:
+ - .rs
+
+SAS:
+ type: programming
+ color: "#1E90FF"
+ lexer: Text only
+ extensions:
+ - .sas
SCSS:
type: markup
group: CSS
ace_mode: scss
- primary_extension: .scss
+ extensions:
+ - .scss
SQL:
type: data
ace_mode: sql
- searchable: false
- primary_extension: .sql
+ extensions:
+ - .sql
+ - .prc
+ - .tab
+ - .udf
+ - .viw
+
+STON:
+ type: data
+ group: Smalltalk
+ lexer: JSON
+ extensions:
+ - .ston
Sage:
type: programming
lexer: Python
group: Python
- primary_extension: .sage
+ extensions:
+ - .sage
Sass:
type: markup
group: CSS
- primary_extension: .sass
+ extensions:
+ - .sass
Scala:
type: programming
ace_mode: scala
color: "#7dd3b0"
- primary_extension: .scala
extensions:
+ - .scala
- .sc
Scaml:
group: HTML
type: markup
- primary_extension: .scaml
+ extensions:
+ - .scaml
Scheme:
type: programming
color: "#1e4aec"
- primary_extension: .scm
extensions:
+ - .scm
- .sld
- .sls
- .ss
@@ -1722,13 +1981,15 @@ Scheme:
Scilab:
type: programming
- primary_extension: .sci
+ extensions:
+ - .sci
Self:
type: programming
color: "#0579aa"
lexer: Text only
- primary_extension: .self
+ extensions:
+ - .self
Shell:
type: programming
@@ -1739,8 +2000,8 @@ Shell:
- sh
- bash
- zsh
- primary_extension: .sh
extensions:
+ - .sh
- .bats
- .tmux
interpreters:
@@ -1753,104 +2014,130 @@ Shell:
ShellSession:
type: programming
lexer: Bash Session
- primary_extension: .sh-session
+ extensions:
+ - .sh-session
Shen:
type: programming
color: "#120F14"
lexer: Text only
- primary_extension: .shen
+ extensions:
+ - .shen
Slash:
type: programming
color: "#007eff"
- primary_extension: .sl
+ extensions:
+ - .sl
+
+Slim:
+ group: HTML
+ type: markup
+ lexer: Slim
+ color: "#ff8877"
+ extensions:
+ - .slim
Smalltalk:
type: programming
color: "#596706"
- primary_extension: .st
+ extensions:
+ - .st
Smarty:
- primary_extension: .tpl
+ extensions:
+ - .tpl
SourcePawn:
type: programming
color: "#f69e1d"
aliases:
- sourcemod
- primary_extension: .sp
+ extensions:
+ - .sp
Squirrel:
type: programming
lexer: C++
- primary_extension: .nut
+ extensions:
+ - .nut
Standard ML:
type: programming
color: "#dc566d"
aliases:
- sml
- primary_extension: .sml
extensions:
+ - .ML
- .fun
+ - .sml
Stata:
type: programming
lexer: Text only
extensions:
- - .ado
- .do
+ - .ado
- .doh
- .ihlp
- .mata
- .matah
- .sthlp
- primary_extension: .do
Stylus:
type: markup
group: CSS
lexer: Text only
- primary_extension: .styl
+ extensions:
+ - .styl
SuperCollider:
type: programming
color: "#46390b"
lexer: Text only
- primary_extension: .scd
+ extensions:
+ - .scd
+
+Swift:
+ type: programming
+ lexer: Swift
+ color: "#ffac45"
+ extensions:
+ - .swift
SystemVerilog:
type: programming
color: "#343761"
lexer: systemverilog
- primary_extension: .sv
extensions:
+ - .sv
- .svh
- .vh
TOML:
type: data
- primary_extension: .toml
+ extensions:
+ - .toml
TXL:
type: programming
lexer: Text only
- primary_extension: .txl
+ extensions:
+ - .txl
Tcl:
type: programming
color: "#e4cc98"
- primary_extension: .tcl
extensions:
+ - .tcl
- .adp
- .tm
Tcsh:
type: programming
group: Shell
- primary_extension: .tcsh
extensions:
+ - .tcsh
- .csh
TeX:
@@ -1860,8 +2147,8 @@ TeX:
wrap: true
aliases:
- latex
- primary_extension: .tex
extensions:
+ - .tex
- .aux
- .bib
- .cls
@@ -1876,35 +2163,39 @@ TeX:
Tea:
type: markup
- primary_extension: .tea
+ extensions:
+ - .tea
Textile:
type: prose
lexer: Text only
ace_mode: textile
wrap: true
- primary_extension: .textile
+ extensions:
+ - .textile
Turing:
type: programming
color: "#45f715"
lexer: Text only
- primary_extension: .t
extensions:
+ - .t
- .tu
Twig:
type: markup
group: PHP
lexer: HTML+Django/Jinja
- primary_extension: .twig
+ extensions:
+ - .twig
TypeScript:
type: programming
color: "#31859c"
aliases:
- ts
- primary_extension: .ts
+ extensions:
+ - .ts
Unified Parallel C:
type: programming
@@ -1912,20 +2203,30 @@ Unified Parallel C:
lexer: C
ace_mode: c_cpp
color: "#755223"
- primary_extension: .upc
+ extensions:
+ - .upc
UnrealScript:
type: programming
color: "#a54c4d"
lexer: Java
- primary_extension: .uc
+ extensions:
+ - .uc
+
+VCL:
+ type: programming
+ lexer: Perl
+ ace_mode: perl
+ color: "#0298c3"
+ extensions:
+ - .vcl
VHDL:
type: programming
lexer: vhdl
color: "#543978"
- primary_extension: .vhdl
extensions:
+ - .vhdl
- .vhd
- .vhf
- .vhi
@@ -1937,16 +2238,16 @@ VHDL:
Vala:
type: programming
color: "#ee7d06"
- primary_extension: .vala
extensions:
+ - .vala
- .vapi
Verilog:
type: programming
lexer: verilog
color: "#848bf3"
- primary_extension: .v
extensions:
+ - .v
- .veo
VimL:
@@ -1955,7 +2256,8 @@ VimL:
search_term: vim
aliases:
- vim
- primary_extension: .vim
+ extensions:
+ - .vim
filenames:
- .vimrc
- vimrc
@@ -1965,8 +2267,8 @@ Visual Basic:
type: programming
lexer: VB.net
color: "#945db7"
- primary_extension: .vb
extensions:
+ - .vb
- .bas
- .frm
- .frx
@@ -1978,12 +2280,14 @@ Volt:
type: programming
lexer: D
color: "#0098db"
- primary_extension: .volt
+ extensions:
+ - .volt
XC:
type: programming
lexer: C
- primary_extension: .xc
+ extensions:
+ - .xc
XML:
type: markup
@@ -1992,21 +2296,27 @@ XML:
- rss
- xsd
- wsdl
- primary_extension: .xml
extensions:
+ - .xml
- .axml
- .ccxml
- .clixml
- .cproject
+ - .csproj
+ - .ct
- .dita
- .ditamap
- .ditaval
+ - .filters
+ - .fsproj
- .glade
- .grxml
- .jelly
- .kml
- .launch
- .mxml
+ - .nproj
+ - .nuspec
- .osm
- .plist
- .pluginspec
@@ -2018,6 +2328,7 @@ XML:
- .scxml
- .srdf
- .svg
+ - .targets
- .tmCommand
- .tmLanguage
- .tmPreferences
@@ -2026,6 +2337,8 @@ XML:
- .tml
- .ui
- .urdf
+ - .vbproj
+ - .vcxproj
- .vxml
- .wsdl
- .wxi
@@ -2048,15 +2361,15 @@ XML:
XProc:
type: programming
lexer: XML
- primary_extension: .xpl
extensions:
+ - .xpl
- .xproc
XQuery:
type: programming
color: "#2700e2"
- primary_extension: .xquery
extensions:
+ - .xquery
- .xq
- .xql
- .xqm
@@ -2064,26 +2377,39 @@ XQuery:
XS:
lexer: C
- primary_extension: .xs
+ extensions:
+ - .xs
XSLT:
type: programming
aliases:
- xsl
- primary_extension: .xslt
extensions:
- - .xsl
+ - .xslt
+ - .xsl
+
+Xojo:
+ type: programming
+ lexer: VB.net
+ extensions:
+ - .xojo_code
+ - .xojo_menu
+ - .xojo_report
+ - .xojo_script
+ - .xojo_toolbar
+ - .xojo_window
Xtend:
type: programming
- primary_extension: .xtend
+ extensions:
+ - .xtend
YAML:
type: data
aliases:
- yml
- primary_extension: .yml
extensions:
+ - .yml
- .reek
- .rviz
- .yaml
@@ -2092,13 +2418,22 @@ Zephir:
type: programming
lexer: PHP
color: "#118f9e"
- primary_extension: .zep
+ extensions:
+ - .zep
+
+Zimpl:
+ type: programming
+ lexer: Text only
+ extensions:
+ - .zimpl
+ - .zmpl
+ - .zpl
eC:
type: programming
search_term: ec
- primary_extension: .ec
extensions:
+ - .ec
- .eh
edn:
@@ -2106,28 +2441,34 @@ edn:
lexer: Clojure
ace_mode: clojure
color: "#db5855"
- primary_extension: .edn
+ extensions:
+ - .edn
fish:
type: programming
group: Shell
lexer: Text only
- primary_extension: .fish
+ extensions:
+ - .fish
mupad:
lexer: MuPAD
- primary_extension: .mu
+ extensions:
+ - .mu
nesC:
type: programming
color: "#ffce3b"
- primary_extension: .nc
+ lexer: nesC
+ extensions:
+ - .nc
ooc:
type: programming
lexer: Ooc
color: "#b0b77e"
- primary_extension: .ooc
+ extensions:
+ - .ooc
reStructuredText:
type: prose
@@ -2135,8 +2476,8 @@ reStructuredText:
search_term: rst
aliases:
- rst
- primary_extension: .rst
extensions:
+ - .rst
- .rest
wisp:
@@ -2144,10 +2485,12 @@ wisp:
lexer: Clojure
ace_mode: clojure
color: "#7582D1"
- primary_extension: .wisp
+ extensions:
+ - .wisp
xBase:
type: programming
lexer: Text only
color: "#3a4040"
- primary_extension: .prg
+ extensions:
+ - .prg
diff --git a/lib/linguist/samples.json b/lib/linguist/samples.json
index fe136b2f..f83d0320 100644
--- a/lib/linguist/samples.json
+++ b/lib/linguist/samples.json
@@ -26,6 +26,10 @@
"AspectJ": [
".aj"
],
+ "Assembly": [
+ ".asm",
+ ".inc"
+ ],
"ATS": [
".atxt",
".dats",
@@ -61,7 +65,8 @@
".cpp",
".h",
".hpp",
- ".inl"
+ ".inl",
+ ".ipp"
],
"Ceylon": [
".ceylon"
@@ -88,14 +93,22 @@
".coffee"
],
"Common Lisp": [
+ ".cl",
".lisp"
],
+ "Component Pascal": [
+ ".cp",
+ ".cps"
+ ],
"Coq": [
".v"
],
"Creole": [
".creole"
],
+ "Crystal": [
+ ".cr"
+ ],
"CSS": [
".css"
],
@@ -115,6 +128,9 @@
"Dogescript": [
".djs"
],
+ "E": [
+ ".E"
+ ],
"Eagle": [
".brd",
".sch"
@@ -149,6 +165,9 @@
"Game Maker Language": [
".gml"
],
+ "GAMS": [
+ ".gms"
+ ],
"GAP": [
".g",
".gd",
@@ -159,6 +178,7 @@
],
"GLSL": [
".fp",
+ ".frag",
".glsl"
],
"Gnuplot": [
@@ -176,6 +196,9 @@
],
"Groovy": [
".gradle",
+ ".grt",
+ ".gtpl",
+ ".gvy",
".script!"
],
"Groovy Server Pages": [
@@ -188,6 +211,13 @@
".handlebars",
".hbs"
],
+ "Haskell": [
+ ".hs"
+ ],
+ "HTML": [
+ ".html",
+ ".st"
+ ],
"Hy": [
".hy"
],
@@ -198,9 +228,16 @@
"Idris": [
".idr"
],
+ "Inform 7": [
+ ".i7x",
+ ".ni"
+ ],
"Ioke": [
".ik"
],
+ "Isabelle": [
+ ".thy"
+ ],
"Jade": [
".jade"
],
@@ -208,8 +245,11 @@
".java"
],
"JavaScript": [
+ ".frag",
".js",
- ".script!"
+ ".script!",
+ ".xsjs",
+ ".xsjslib"
],
"JSON": [
".json",
@@ -227,6 +267,9 @@
"Julia": [
".jl"
],
+ "Kit": [
+ ".kit"
+ ],
"Kotlin": [
".kt"
],
@@ -239,12 +282,18 @@
".lasso9",
".ldml"
],
+ "Latte": [
+ ".latte"
+ ],
"Less": [
".less"
],
"LFE": [
".lfe"
],
+ "Liquid": [
+ ".liquid"
+ ],
"Literate Agda": [
".lagda"
],
@@ -276,7 +325,8 @@
".mask"
],
"Mathematica": [
- ".m"
+ ".m",
+ ".nb"
],
"Matlab": [
".m"
@@ -302,6 +352,9 @@
"MoonScript": [
".moon"
],
+ "MTML": [
+ ".mtml"
+ ],
"Nemerle": [
".n"
],
@@ -311,6 +364,9 @@
"Nimrod": [
".nim"
],
+ "Nix": [
+ ".nix"
+ ],
"NSIS": [
".nsh",
".nsi"
@@ -346,9 +402,17 @@
"Org": [
".org"
],
+ "Ox": [
+ ".ox",
+ ".oxh",
+ ".oxo"
+ ],
"Oxygene": [
".oxygene"
],
+ "Pan": [
+ ".pan"
+ ],
"Parrot Assembly": [
".pasm"
],
@@ -365,6 +429,7 @@
".fcgi",
".pl",
".pm",
+ ".pod",
".script!",
".t"
],
@@ -377,6 +442,10 @@
".php",
".script!"
],
+ "Pike": [
+ ".pike",
+ ".pmod"
+ ],
"Pod": [
".pod"
],
@@ -398,6 +467,9 @@
".pl",
".prolog"
],
+ "Propeller Spin": [
+ ".spin"
+ ],
"Protocol Buffer": [
".proto"
],
@@ -406,10 +478,19 @@
],
"Python": [
".py",
+ ".pyde",
+ ".pyp",
+ ".script!"
+ ],
+ "QMake": [
+ ".pri",
+ ".pro",
".script!"
],
"R": [
".R",
+ ".Rd",
+ ".r",
".rsx",
".script!"
],
@@ -429,6 +510,10 @@
".reb",
".rebol"
],
+ "Red": [
+ ".red",
+ ".reds"
+ ],
"RMarkdown": [
".rmd"
],
@@ -445,6 +530,9 @@
"Rust": [
".rs"
],
+ "SAS": [
+ ".sas"
+ ],
"Sass": [
".sass",
".scss"
@@ -484,13 +572,27 @@
"Slash": [
".sl"
],
+ "Slim": [
+ ".slim"
+ ],
+ "Smalltalk": [
+ ".st"
+ ],
"SourcePawn": [
".sp"
],
+ "SQL": [
+ ".prc",
+ ".sql",
+ ".tab",
+ ".udf",
+ ".viw"
+ ],
"Squirrel": [
".nut"
],
"Standard ML": [
+ ".ML",
".fun",
".sig",
".sml"
@@ -504,12 +606,18 @@
".matah",
".sthlp"
],
+ "STON": [
+ ".ston"
+ ],
"Stylus": [
".styl"
],
"SuperCollider": [
".scd"
],
+ "Swift": [
+ ".swift"
+ ],
"SystemVerilog": [
".sv",
".svh",
@@ -536,6 +644,9 @@
"UnrealScript": [
".uc"
],
+ "VCL": [
+ ".vcl"
+ ],
"Verilog": [
".v"
],
@@ -558,9 +669,26 @@
],
"XML": [
".ant",
+ ".csproj",
+ ".filters",
+ ".fsproj",
".ivy",
+ ".nproj",
+ ".nuspec",
+ ".pluginspec",
+ ".targets",
+ ".vbproj",
+ ".vcxproj",
".xml"
],
+ "Xojo": [
+ ".xojo_code",
+ ".xojo_menu",
+ ".xojo_report",
+ ".xojo_script",
+ ".xojo_toolbar",
+ ".xojo_window"
+ ],
"XProc": [
".xpl"
],
@@ -578,6 +706,9 @@
],
"Zephir": [
".zep"
+ ],
+ "Zimpl": [
+ ".zmpl"
]
},
"interpreters": {
@@ -602,7 +733,11 @@
"Perl": [
"ack"
],
+ "R": [
+ "expr-dist"
+ ],
"Ruby": [
+ ".pryrc",
"Appraisals",
"Capfile",
"Rakefile"
@@ -639,10 +774,15 @@
],
"YAML": [
".gemrc"
+ ],
+ "Zephir": [
+ "exception.zep.c",
+ "exception.zep.h",
+ "exception.zep.php"
]
},
- "tokens_total": 575811,
- "languages_total": 680,
+ "tokens_total": 643487,
+ "languages_total": 843,
"tokens": {
"ABAP": {
"*/**": 1,
@@ -2457,6 +2597,1323 @@
"_cache.put": 1,
"_cache.size": 1
},
+ "Assembly": {
+ ";": 20,
+ "flat": 4,
+ "assembler": 6,
+ "core": 2,
+ "Copyright": 4,
+ "(": 13,
+ "c": 4,
+ ")": 6,
+ "-": 87,
+ "Tomasz": 4,
+ "Grysztar.": 4,
+ "All": 4,
+ "rights": 4,
+ "reserved.": 4,
+ "xor": 52,
+ "eax": 510,
+ "mov": 1253,
+ "[": 2026,
+ "stub_size": 1,
+ "]": 2026,
+ "current_pass": 16,
+ "ax": 87,
+ "resolver_flags": 1,
+ "number_of_sections": 1,
+ "actual_fixups_size": 1,
+ "assembler_loop": 2,
+ "labels_list": 3,
+ "tagged_blocks": 23,
+ "additional_memory": 6,
+ "free_additional_memory": 2,
+ "additional_memory_end": 9,
+ "structures_buffer": 9,
+ "esi": 619,
+ "source_start": 1,
+ "edi": 250,
+ "code_start": 2,
+ "dword": 87,
+ "adjustment": 4,
+ "+": 232,
+ "addressing_space": 17,
+ "error_line": 16,
+ "counter": 13,
+ "format_flags": 2,
+ "number_of_relocations": 1,
+ "undefined_data_end": 4,
+ "file_extension": 1,
+ "next_pass_needed": 16,
+ "al": 1174,
+ "output_format": 3,
+ "adjustment_sign": 2,
+ "code_type": 106,
+ "call": 845,
+ "init_addressing_space": 6,
+ "pass_loop": 2,
+ "assemble_line": 3,
+ "jnc": 11,
+ "cmp": 1088,
+ "je": 485,
+ "pass_done": 2,
+ "sub": 64,
+ "h": 376,
+ "current_line": 24,
+ "jmp": 450,
+ "missing_end_directive": 7,
+ "close_pass": 1,
+ "check_symbols": 2,
+ "memory_end": 7,
+ "jae": 34,
+ "symbols_checked": 2,
+ "test": 95,
+ "byte": 549,
+ "jz": 107,
+ "symbol_defined_ok": 5,
+ "cx": 42,
+ "jne": 485,
+ "and": 50,
+ "not": 42,
+ "or": 194,
+ "use_prediction_ok": 5,
+ "jnz": 125,
+ "check_use_prediction": 2,
+ "use_misprediction": 3,
+ "check_next_symbol": 5,
+ "define_misprediction": 4,
+ "check_define_prediction": 2,
+ "add": 76,
+ "LABEL_STRUCTURE_SIZE": 1,
+ "next_pass": 3,
+ "assemble_ok": 2,
+ "error": 7,
+ "undefined_symbol": 2,
+ "error_confirmed": 3,
+ "error_info": 2,
+ "error_handler": 3,
+ "esp": 14,
+ "ret": 70,
+ "inc": 87,
+ "passes_limit": 3,
+ "code_cannot_be_generated": 1,
+ "create_addressing_space": 1,
+ "ebx": 336,
+ "Ah": 25,
+ "illegal_instruction": 48,
+ "Ch": 11,
+ "jbe": 11,
+ "out_of_memory": 19,
+ "ja": 28,
+ "lods": 366,
+ "assemble_instruction": 2,
+ "jb": 34,
+ "source_end": 2,
+ "define_label": 2,
+ "define_constant": 2,
+ "label_addressing_space": 2,
+ "Fh": 73,
+ "new_line": 2,
+ "code_type_setting": 2,
+ "segment_prefix": 2,
+ "instruction_assembled": 138,
+ "prefixed_instruction": 11,
+ "symbols_file": 4,
+ "continue_line": 8,
+ "line_assembled": 3,
+ "invalid_use_of_symbol": 17,
+ "reserved_word_used_as_symbol": 6,
+ "label_size": 5,
+ "make_label": 3,
+ "edx": 219,
+ "cl": 42,
+ "ebp": 49,
+ "ds": 21,
+ "sbb": 9,
+ "jp": 2,
+ "label_value_ok": 2,
+ "recoverable_overflow": 4,
+ "address_sign": 4,
+ "make_virtual_label": 2,
+ "xchg": 31,
+ "ch": 55,
+ "shr": 30,
+ "neg": 4,
+ "setnz": 5,
+ "ah": 229,
+ "finish_label": 2,
+ "setne": 14,
+ "finish_label_symbol": 2,
+ "b": 30,
+ "label_symbol_ok": 2,
+ "new_label": 2,
+ "symbol_already_defined": 3,
+ "btr": 2,
+ "jc": 28,
+ "requalified_label": 2,
+ "label_made": 4,
+ "push": 150,
+ "get_constant_value": 4,
+ "dl": 58,
+ "size_override": 7,
+ "get_value": 2,
+ "pop": 99,
+ "bl": 124,
+ "ecx": 153,
+ "constant_referencing_mode_ok": 2,
+ "value_type": 42,
+ "make_constant": 2,
+ "value_sign": 3,
+ "constant_symbol_ok": 2,
+ "symbol_identifier": 4,
+ "new_constant": 2,
+ "redeclare_constant": 2,
+ "requalified_constant": 2,
+ "make_addressing_space_label": 3,
+ "dx": 27,
+ "operand_size": 121,
+ "operand_prefix": 9,
+ "opcode_prefix": 30,
+ "rex_prefix": 9,
+ "vex_required": 2,
+ "vex_register": 1,
+ "immediate_size": 9,
+ "instruction_handler": 32,
+ "movzx": 13,
+ "word": 79,
+ "extra_characters_on_line": 8,
+ "clc": 11,
+ "dec": 30,
+ "stc": 9,
+ "org_directive": 1,
+ "invalid_argument": 28,
+ "invalid_value": 21,
+ "get_qword_value": 5,
+ "in_virtual": 2,
+ "org_space_ok": 2,
+ "close_virtual_addressing_space": 3,
+ "org_value_ok": 2,
+ "bts": 1,
+ "label_directive": 1,
+ "get_label_size": 2,
+ "label_size_ok": 2,
+ "get_free_label_value": 2,
+ "get_address_value": 3,
+ "bh": 34,
+ "bp": 2,
+ "shl": 17,
+ "bx": 8,
+ "make_free_label": 1,
+ "address_symbol": 2,
+ "load_directive": 1,
+ "load_size_ok": 2,
+ "value": 38,
+ "get_data_point": 3,
+ "value_loaded": 2,
+ "rep": 7,
+ "movs": 8,
+ "get_data_address": 5,
+ "addressing_space_unavailable": 3,
+ "symbol_out_of_scope": 1,
+ "get_addressing_space": 3,
+ "store_label_reference": 1,
+ "calculate_relative_offset": 2,
+ "data_address_type_ok": 2,
+ "adc": 9,
+ "bad_data_address": 3,
+ "store_directive": 1,
+ "sized_store": 2,
+ "get_byte_value": 23,
+ "store_value_ok": 2,
+ "undefined_data_start": 3,
+ "display_directive": 2,
+ "display_byte": 2,
+ "stos": 107,
+ "display_next": 2,
+ "show_display_buffer": 2,
+ "display_done": 3,
+ "display_messages": 2,
+ "skip_block": 2,
+ "display_block": 4,
+ "times_directive": 1,
+ "get_count_value": 6,
+ "zero_times": 3,
+ "times_argument_ok": 2,
+ "counter_limit": 7,
+ "times_loop": 2,
+ "stack_overflow": 2,
+ "stack_limit": 2,
+ "times_done": 2,
+ "skip_symbol": 5,
+ "virtual_directive": 3,
+ "virtual_at_current": 2,
+ "set_virtual": 2,
+ "allocate_structure_data": 5,
+ "find_structure_data": 6,
+ "scan_structures": 2,
+ "no_such_structure": 2,
+ "structure_data_found": 2,
+ "end_virtual": 2,
+ "unexpected_instruction": 18,
+ "remove_structure_data": 7,
+ "lea": 8,
+ "std": 2,
+ "cld": 2,
+ "addressing_space_closed": 2,
+ "virtual_byte_ok": 2,
+ "virtual_word_ok": 2,
+ "repeat_directive": 7,
+ "zero_repeat": 2,
+ "end_repeat": 2,
+ "continue_repeating": 2,
+ "stop_repeat": 2,
+ "find_end_repeat": 4,
+ "find_structure_end": 5,
+ "while_directive": 7,
+ "do_while": 2,
+ "calculate_logical_expression": 3,
+ "while_true": 2,
+ "stop_while": 2,
+ "find_end_while": 3,
+ "end_while": 2,
+ "too_many_repeats": 1,
+ "if_directive": 13,
+ "if_true": 2,
+ "find_else": 4,
+ "else_true": 3,
+ "make_if_structure": 2,
+ "else_directive": 3,
+ "found_else": 2,
+ "skip_else": 3,
+ "find_end_if": 3,
+ "end_if": 2,
+ "else_found": 2,
+ "find_end_directive": 10,
+ "no_end_directive": 2,
+ "skip_labels": 2,
+ "labels_ok": 2,
+ "prefix_instruction": 2,
+ "skip_repeat": 2,
+ "skip_while": 2,
+ "skip_if": 2,
+ "structure_end": 4,
+ "end_directive": 2,
+ "skip_if_block": 4,
+ "if_block_skipped": 2,
+ "skip_after_else": 3,
+ "data_directive": 1,
+ "end_data": 1,
+ "break_directive": 1,
+ "find_breakable_structure": 4,
+ "break_repeat": 2,
+ "break_while": 2,
+ "break_if": 2,
+ "data_bytes": 1,
+ "define_data": 8,
+ "get_byte": 2,
+ "undefined_data": 7,
+ "get_string": 2,
+ "mark_undefined_data": 2,
+ "undefined_data_ok": 2,
+ "simple_data_value": 3,
+ "skip_expression": 1,
+ "duplicate_zero_times": 2,
+ "duplicate_single_data_value": 3,
+ "duplicate_data": 2,
+ "duplicated_values": 2,
+ "near": 3,
+ "data_defined": 5,
+ "skip_single_data_value": 2,
+ "skip_data_value": 2,
+ "data_unicode": 1,
+ "base_code": 195,
+ "define_words": 2,
+ "data_words": 1,
+ "get_word": 2,
+ "scas": 10,
+ "word_data_value": 2,
+ "word_string": 2,
+ "get_word_value": 19,
+ "mark_relocation": 26,
+ "jecxz": 1,
+ "word_string_ok": 2,
+ "ecx*2": 1,
+ "copy_word_string": 2,
+ "loop": 2,
+ "data_dwords": 1,
+ "get_dword": 2,
+ "get_dword_value": 13,
+ "complex_dword": 2,
+ "invalid_operand": 239,
+ "data_pwords": 1,
+ "get_pword": 2,
+ "get_pword_value": 1,
+ "complex_pword": 2,
+ "data_qwords": 1,
+ "get_qword": 2,
+ "data_twords": 1,
+ "get_tword": 2,
+ "complex_tword": 2,
+ "fp_zero_tword": 2,
+ "FFFh": 3,
+ "jo": 2,
+ "value_out_of_range": 10,
+ "jge": 5,
+ "jg": 1,
+ "tword_exp_ok": 3,
+ "large_shift": 2,
+ "shrd": 1,
+ "tword_mantissa_shift_done": 2,
+ "store_shifted_mantissa": 2,
+ "data_file": 2,
+ "open_binary_file": 2,
+ "lseek": 5,
+ "position_ok": 2,
+ "size_ok": 2,
+ "read": 3,
+ "error_reading_file": 1,
+ "close": 3,
+ "find_current_source_path": 2,
+ "get_current_path": 3,
+ "lodsb": 12,
+ "stosb": 6,
+ "cut_current_path": 1,
+ "current_path_ok": 1,
+ "/": 1,
+ ".": 7,
+ "invalid_align_value": 3,
+ "section_not_aligned_enough": 4,
+ "make_alignment": 3,
+ "pe_alignment": 2,
+ "nops": 2,
+ "reserved_data": 2,
+ "nops_stosb_ok": 2,
+ "nops_stosw_ok": 2,
+ "err_directive": 1,
+ "invoked_error": 2,
+ "assert_directive": 1,
+ "assertion_failed": 1,
+ "interface": 2,
+ "for": 2,
+ "Win32": 2,
+ "format": 1,
+ "PE": 1,
+ "console": 1,
+ "section": 4,
+ "code": 1,
+ "readable": 4,
+ "executable": 1,
+ "start": 1,
+ "con_handle": 8,
+ "STD_OUTPUT_HANDLE": 2,
+ "_logo": 2,
+ "display_string": 19,
+ "get_params": 2,
+ "information": 2,
+ "init_memory": 2,
+ "_memory_prefix": 2,
+ "memory_start": 4,
+ "display_number": 8,
+ "_memory_suffix": 2,
+ "GetTickCount": 3,
+ "start_time": 3,
+ "preprocessor": 1,
+ "parser": 1,
+ "formatter": 1,
+ "display_user_messages": 3,
+ "_passes_suffix": 2,
+ "div": 8,
+ "display_bytes_count": 2,
+ "display_character": 6,
+ "_seconds_suffix": 2,
+ "written_size": 1,
+ "_bytes_suffix": 2,
+ "exit_program": 5,
+ "_usage": 2,
+ "input_file": 4,
+ "output_file": 3,
+ "memory_setting": 4,
+ "GetCommandLine": 2,
+ "params": 2,
+ "find_command_start": 2,
+ "skip_quoted_name": 3,
+ "skip_name": 2,
+ "find_param": 7,
+ "all_params": 5,
+ "option_param": 2,
+ "Dh": 19,
+ "get_output_file": 2,
+ "process_param": 3,
+ "bad_params": 11,
+ "string_param": 3,
+ "copy_param": 2,
+ "param_end": 6,
+ "string_param_end": 2,
+ "memory_option": 4,
+ "passes_option": 4,
+ "symbols_option": 3,
+ "get_option_value": 3,
+ "get_option_digit": 2,
+ "option_value_ok": 4,
+ "invalid_option_value": 5,
+ "imul": 1,
+ "find_symbols_file_name": 2,
+ "include": 15,
+ "data": 3,
+ "writeable": 2,
+ "_copyright": 1,
+ "db": 35,
+ "VERSION_STRING": 1,
+ "align": 1,
+ "dd": 22,
+ "bytes_count": 8,
+ "displayed_count": 4,
+ "character": 3,
+ "last_displayed": 5,
+ "rb": 4,
+ "options": 1,
+ "buffer": 14,
+ "stack": 1,
+ "import": 1,
+ "rva": 16,
+ "kernel_name": 2,
+ "kernel_table": 2,
+ "ExitProcess": 2,
+ "_ExitProcess": 2,
+ "CreateFile": 3,
+ "_CreateFileA": 2,
+ "ReadFile": 2,
+ "_ReadFile": 2,
+ "WriteFile": 6,
+ "_WriteFile": 2,
+ "CloseHandle": 2,
+ "_CloseHandle": 2,
+ "SetFilePointer": 2,
+ "_SetFilePointer": 2,
+ "_GetCommandLineA": 2,
+ "GetEnvironmentVariable": 2,
+ "_GetEnvironmentVariable": 2,
+ "GetStdHandle": 5,
+ "_GetStdHandle": 2,
+ "VirtualAlloc": 2,
+ "_VirtualAlloc": 2,
+ "VirtualFree": 2,
+ "_VirtualFree": 2,
+ "_GetTickCount": 2,
+ "GetSystemTime": 2,
+ "_GetSystemTime": 2,
+ "GlobalMemoryStatus": 2,
+ "_GlobalMemoryStatus": 2,
+ "dw": 14,
+ "fixups": 1,
+ "discardable": 1,
+ "CREATE_NEW": 1,
+ "CREATE_ALWAYS": 2,
+ "OPEN_EXISTING": 2,
+ "OPEN_ALWAYS": 1,
+ "TRUNCATE_EXISTING": 1,
+ "FILE_SHARE_READ": 3,
+ "FILE_SHARE_WRITE": 1,
+ "FILE_SHARE_DELETE": 1,
+ "GENERIC_READ": 2,
+ "GENERIC_WRITE": 2,
+ "STD_INPUT_HANDLE": 1,
+ "FFFFFFF6h": 1,
+ "FFFFFFF5h": 1,
+ "STD_ERROR_HANDLE": 3,
+ "FFFFFFF4h": 1,
+ "MEM_COMMIT": 2,
+ "MEM_RESERVE": 1,
+ "MEM_DECOMMIT": 1,
+ "MEM_RELEASE": 2,
+ "MEM_FREE": 1,
+ "MEM_PRIVATE": 1,
+ "MEM_MAPPED": 1,
+ "MEM_RESET": 1,
+ "MEM_TOP_DOWN": 1,
+ "PAGE_NOACCESS": 1,
+ "PAGE_READONLY": 1,
+ "PAGE_READWRITE": 2,
+ "PAGE_WRITECOPY": 1,
+ "PAGE_EXECUTE": 1,
+ "PAGE_EXECUTE_READ": 1,
+ "PAGE_EXECUTE_READWRITE": 1,
+ "PAGE_EXECUTE_WRITECOPY": 1,
+ "PAGE_GUARD": 1,
+ "PAGE_NOCACHE": 1,
+ "allocate_memory": 4,
+ "jl": 13,
+ "large_memory": 3,
+ "not_enough_memory": 2,
+ "do_exit": 2,
+ "get_environment_variable": 1,
+ "buffer_for_variable_ok": 2,
+ "open": 2,
+ "file_error": 6,
+ "create": 1,
+ "write": 1,
+ "repne": 1,
+ "scasb": 1,
+ "display_loop": 2,
+ "display_digit": 3,
+ "digit_ok": 2,
+ "line_break_ok": 4,
+ "make_line_break": 2,
+ "A0Dh": 2,
+ "D0Ah": 1,
+ "take_last_two_characters": 2,
+ "block_displayed": 2,
+ "block_ok": 2,
+ "fatal_error": 1,
+ "error_prefix": 3,
+ "error_suffix": 3,
+ "FFh": 4,
+ "assembler_error": 1,
+ "get_error_lines": 2,
+ "get_next_error_line": 2,
+ "display_error_line": 3,
+ "find_definition_origin": 2,
+ "line_number_start": 3,
+ "FFFFFFFh": 2,
+ "line_number_ok": 2,
+ "line_data_start": 2,
+ "line_data_displayed": 2,
+ "get_line_data": 2,
+ "display_line_data": 5,
+ "cr_lf": 2,
+ "make_timestamp": 1,
+ "mul": 5,
+ "months_correction": 2,
+ "day_correction_ok": 4,
+ "day_correction": 2,
+ "simple_instruction_except64": 1,
+ "simple_instruction": 6,
+ "simple_instruction_only64": 1,
+ "simple_instruction_16bit_except64": 1,
+ "simple_instruction_16bit": 2,
+ "size_prefix": 3,
+ "simple_instruction_32bit_except64": 1,
+ "simple_instruction_32bit": 6,
+ "iret_instruction": 1,
+ "simple_instruction_64bit": 2,
+ "simple_extended_instruction_64bit": 1,
+ "simple_extended_instruction": 1,
+ "segment_register": 7,
+ "store_segment_prefix": 1,
+ "int_instruction": 1,
+ "get_size_operator": 137,
+ "invalid_operand_size": 131,
+ "jns": 1,
+ "int_imm_ok": 2,
+ "CDh": 1,
+ "aa_instruction": 1,
+ "aa_store": 2,
+ "basic_instruction": 1,
+ "basic_reg": 2,
+ "basic_mem": 1,
+ "get_address": 62,
+ "basic_mem_imm": 2,
+ "basic_mem_reg": 1,
+ "convert_register": 60,
+ "postbyte_register": 137,
+ "instruction_ready": 72,
+ "operand_autodetect": 47,
+ "store_instruction": 3,
+ "basic_mem_imm_nosize": 2,
+ "basic_mem_imm_8bit": 2,
+ "basic_mem_imm_16bit": 2,
+ "basic_mem_imm_32bit": 2,
+ "basic_mem_imm_64bit": 1,
+ "size_declared": 17,
+ "long_immediate_not_encodable": 14,
+ "operand_64bit": 18,
+ "get_simm32": 10,
+ "basic_mem_imm_32bit_ok": 2,
+ "recoverable_unknown_size": 19,
+ "store_instruction_with_imm8": 11,
+ "operand_16bit": 25,
+ "basic_mem_imm_16bit_store": 3,
+ "basic_mem_simm_8bit": 5,
+ "store_instruction_with_imm16": 4,
+ "operand_32bit": 27,
+ "basic_mem_imm_32bit_store": 3,
+ "store_instruction_with_imm32": 4,
+ "cdq": 11,
+ "get_simm32_ok": 2,
+ "basic_reg_reg": 2,
+ "basic_reg_imm": 2,
+ "basic_reg_mem": 1,
+ "basic_reg_mem_8bit": 2,
+ "nomem_instruction_ready": 53,
+ "store_nomem_instruction": 19,
+ "basic_reg_imm_8bit": 2,
+ "basic_reg_imm_16bit": 2,
+ "basic_reg_imm_32bit": 2,
+ "basic_reg_imm_64bit": 1,
+ "basic_reg_imm_32bit_ok": 2,
+ "basic_al_imm": 2,
+ "basic_reg_imm_16bit_store": 3,
+ "basic_reg_simm_8bit": 5,
+ "basic_ax_imm": 2,
+ "basic_store_imm_16bit": 2,
+ "store_instruction_code": 26,
+ "basic_reg_imm_32bit_store": 3,
+ "basic_eax_imm": 2,
+ "basic_store_imm_32bit": 2,
+ "ignore_unknown_size": 2,
+ "operand_size_not_specified": 1,
+ "single_operand_instruction": 1,
+ "F6h": 4,
+ "single_reg": 2,
+ "single_mem": 1,
+ "single_mem_8bit": 2,
+ "single_mem_nosize": 2,
+ "single_reg_8bit": 2,
+ "mov_instruction": 1,
+ "mov_reg": 2,
+ "mov_mem": 1,
+ "mov_mem_imm": 2,
+ "mov_mem_reg": 1,
+ "mov_mem_general_reg": 2,
+ "mov_mem_sreg": 2,
+ "mov_mem_reg_8bit": 2,
+ "mov_mem_ax": 2,
+ "mov_mem_al": 1,
+ "mov_mem_address16_al": 3,
+ "mov_mem_address32_al": 3,
+ "mov_mem_address64_al": 3,
+ "invalid_address_size": 18,
+ "store_segment_prefix_if_necessary": 17,
+ "address_32bit_prefix": 11,
+ "A2h": 3,
+ "store_mov_address32": 4,
+ "store_address_32bit_value": 1,
+ "address_16bit_prefix": 11,
+ "store_mov_address16": 4,
+ "invalid_address": 32,
+ "store_mov_address64": 4,
+ "store_address_64bit_value": 1,
+ "mov_mem_address16_ax": 3,
+ "mov_mem_address32_ax": 3,
+ "mov_mem_address64_ax": 3,
+ "A3h": 3,
+ "mov_mem_sreg_store": 2,
+ "mov_mem_imm_nosize": 2,
+ "mov_mem_imm_8bit": 2,
+ "mov_mem_imm_16bit": 2,
+ "mov_mem_imm_32bit": 2,
+ "mov_mem_imm_64bit": 1,
+ "mov_mem_imm_32bit_store": 2,
+ "C6h": 1,
+ "C7h": 4,
+ "F0h": 7,
+ "mov_sreg": 2,
+ "mov_reg_mem": 2,
+ "mov_reg_imm": 2,
+ "mov_reg_reg": 1,
+ "mov_reg_sreg": 2,
+ "mov_reg_reg_8bit": 2,
+ "mov_reg_creg": 2,
+ "mov_reg_dreg": 2,
+ "mov_reg_treg": 2,
+ "mov_reg_sreg64": 2,
+ "mov_reg_sreg32": 2,
+ "mov_reg_sreg_store": 3,
+ "extended_code": 73,
+ "mov_reg_xrx": 3,
+ "mov_reg_xrx_64bit": 2,
+ "mov_reg_xrx_store": 3,
+ "mov_reg_mem_8bit": 2,
+ "mov_ax_mem": 2,
+ "mov_al_mem": 2,
+ "mov_al_mem_address16": 3,
+ "mov_al_mem_address32": 3,
+ "mov_al_mem_address64": 3,
+ "A0h": 4,
+ "mov_ax_mem_address16": 3,
+ "mov_ax_mem_address32": 3,
+ "mov_ax_mem_address64": 3,
+ "A1h": 4,
+ "mov_reg_imm_8bit": 2,
+ "mov_reg_imm_16bit": 2,
+ "mov_reg_imm_32bit": 2,
+ "mov_reg_imm_64bit": 1,
+ "mov_reg_imm_64bit_store": 3,
+ "mov_reg_64bit_imm_32bit": 2,
+ "B8h": 3,
+ "store_mov_reg_imm_code": 5,
+ "B0h": 5,
+ "mov_store_imm_32bit": 2,
+ "mov_reg_imm_prefix_ok": 2,
+ "mov_creg": 2,
+ "mov_dreg": 2,
+ "mov_treg": 2,
+ "mov_sreg_mem": 2,
+ "mov_sreg_reg": 1,
+ "mov_sreg_reg_size_ok": 2,
+ "Eh": 8,
+ "mov_sreg_mem_size_ok": 2,
+ "mov_xrx": 3,
+ "mov_xrx_64bit": 2,
+ "mov_xrx_store": 4,
+ "test_instruction": 1,
+ "test_reg": 2,
+ "test_mem": 1,
+ "test_mem_imm": 2,
+ "test_mem_reg": 2,
+ "test_mem_reg_8bit": 2,
+ "test_mem_imm_nosize": 2,
+ "test_mem_imm_8bit": 2,
+ "test_mem_imm_16bit": 2,
+ "test_mem_imm_32bit": 2,
+ "test_mem_imm_64bit": 1,
+ "test_mem_imm_32bit_store": 2,
+ "F7h": 5,
+ "test_reg_mem": 3,
+ "test_reg_imm": 2,
+ "test_reg_reg": 1,
+ "test_reg_reg_8bit": 2,
+ "test_reg_imm_8bit": 2,
+ "test_reg_imm_16bit": 2,
+ "test_reg_imm_32bit": 2,
+ "test_reg_imm_64bit": 1,
+ "test_reg_imm_32bit_store": 2,
+ "test_al_imm": 2,
+ "A8h": 1,
+ "test_ax_imm": 2,
+ "A9h": 2,
+ "test_eax_imm": 2,
+ "test_reg_mem_8bit": 2,
+ "xchg_instruction": 1,
+ "xchg_reg": 2,
+ "xchg_mem": 1,
+ "xchg_reg_reg": 1,
+ "xchg_reg_reg_8bit": 2,
+ "xchg_ax_reg": 2,
+ "xchg_reg_reg_store": 3,
+ "xchg_ax_reg_ok": 3,
+ "xchg_ax_reg_store": 2,
+ "push_instruction": 1,
+ "push_size": 9,
+ "push_next": 2,
+ "push_reg": 2,
+ "push_imm": 2,
+ "push_mem": 1,
+ "push_mem_16bit": 3,
+ "push_mem_32bit": 3,
+ "push_mem_64bit": 3,
+ "push_mem_store": 4,
+ "push_done": 5,
+ "push_sreg": 2,
+ "push_reg_ok": 2,
+ "push_reg_16bit": 2,
+ "push_reg_32bit": 2,
+ "push_reg_64bit": 1,
+ "push_reg_store": 5,
+ "dh": 37,
+ "push_sreg16": 3,
+ "push_sreg32": 3,
+ "push_sreg64": 3,
+ "push_sreg_store": 4,
+ "push_sreg_386": 2,
+ "push_imm_size_ok": 3,
+ "push_imm_16bit": 2,
+ "push_imm_32bit": 2,
+ "push_imm_64bit": 2,
+ "push_imm_optimized_16bit": 3,
+ "push_imm_optimized_32bit": 3,
+ "push_imm_optimized_64bit": 2,
+ "push_imm_32bit_store": 8,
+ "push_imm_8bit": 3,
+ "push_imm_16bit_store": 4,
+ "pop_instruction": 1,
+ "pop_next": 2,
+ "pop_reg": 2,
+ "pop_mem": 1,
+ "pop_mem_16bit": 3,
+ "pop_mem_32bit": 3,
+ "pop_mem_64bit": 3,
+ "pop_mem_store": 4,
+ "pop_done": 3,
+ "pop_sreg": 2,
+ "pop_reg_ok": 2,
+ "pop_reg_16bit": 2,
+ "pop_reg_32bit": 2,
+ "pop_reg_64bit": 2,
+ "pop_reg_store": 5,
+ "pop_cs": 2,
+ "pop_sreg16": 3,
+ "pop_sreg32": 3,
+ "pop_sreg64": 3,
+ "pop_sreg_store": 4,
+ "pop_sreg_386": 2,
+ "pop_cs_store": 3,
+ "inc_instruction": 1,
+ "inc_reg": 2,
+ "inc_mem": 2,
+ "inc_mem_8bit": 2,
+ "inc_mem_nosize": 2,
+ "FEh": 2,
+ "inc_reg_8bit": 2,
+ "inc_reg_long_form": 2,
+ "set_instruction": 1,
+ "set_reg": 2,
+ "set_mem": 1,
+ "arpl_instruction": 1,
+ "arpl_reg": 2,
+ "bound_instruction": 1,
+ "bound_store": 2,
+ "enter_instruction": 1,
+ "enter_imm16_size_ok": 2,
+ "enter_imm16_ok": 2,
+ "js": 3,
+ "enter_imm8_size_ok": 2,
+ "enter_imm8_ok": 2,
+ "C8h": 2,
+ "ret_instruction_only64": 1,
+ "ret_instruction": 5,
+ "ret_instruction_32bit_except64": 1,
+ "ret_instruction_32bit": 1,
+ "ret_instruction_16bit": 1,
+ "retf_instruction": 1,
+ "ret_instruction_64bit": 1,
+ "simple_ret": 4,
+ "ret_imm": 3,
+ "ret_imm_ok": 2,
+ "ret_imm_store": 2,
+ "lea_instruction": 1,
+ "ls_instruction": 1,
+ "les_instruction": 2,
+ "lds_instruction": 2,
+ "ls_code_ok": 2,
+ "C4h": 1,
+ "ls_short_code": 2,
+ "C5h": 2,
+ "ls_16bit": 2,
+ "ls_32bit": 2,
+ "ls_64bit": 2,
+ "sh_instruction": 1,
+ "sh_reg": 2,
+ "sh_mem": 1,
+ "sh_mem_imm": 2,
+ "sh_mem_reg": 1,
+ "sh_mem_cl_8bit": 2,
+ "sh_mem_cl_nosize": 2,
+ "D3h": 2,
+ "D2h": 2,
+ "sh_mem_imm_size_ok": 2,
+ "sh_mem_imm_8bit": 2,
+ "sh_mem_imm_nosize": 2,
+ "sh_mem_1": 2,
+ "C1h": 2,
+ "D1h": 2,
+ "sh_mem_1_8bit": 2,
+ "C0h": 2,
+ "D0h": 2,
+ "sh_reg_imm": 2,
+ "sh_reg_reg": 1,
+ "sh_reg_cl_8bit": 2,
+ "sh_reg_imm_size_ok": 2,
+ "sh_reg_imm_8bit": 2,
+ "sh_reg_1": 2,
+ "sh_reg_1_8bit": 2,
+ "shd_instruction": 1,
+ "shd_reg": 2,
+ "shd_mem": 1,
+ "shd_mem_reg_imm": 2,
+ "shd_mem_reg_imm_size_ok": 2,
+ "shd_reg_reg_imm": 2,
+ "shd_reg_reg_imm_size_ok": 2,
+ "movx_instruction": 1,
+ "movx_reg": 2,
+ "movx_unknown_size": 2,
+ "movx_mem_store": 3,
+ "movx_reg_8bit": 2,
+ "movx_reg_16bit": 2,
+ "movsxd_instruction": 1,
+ "movsxd_reg": 2,
+ "movsxd_mem_store": 2,
+ "bt_instruction": 1,
+ "bt_reg": 2,
+ "bt_mem_imm": 3,
+ "bt_mem_reg": 2,
+ "bt_mem_imm_size_ok": 2,
+ "bt_mem_imm_nosize": 2,
+ "bt_mem_imm_store": 2,
+ "BAh": 2,
+ "bt_reg_imm": 3,
+ "bt_reg_reg": 2,
+ "bt_reg_imm_size_ok": 2,
+ "bt_reg_imm_store": 1,
+ "bs_instruction": 1,
+ "get_reg_mem": 2,
+ "bs_reg_reg": 2,
+ "get_reg_reg": 2,
+ "imul_instruction": 1,
+ "imul_reg": 2,
+ "imul_mem": 1,
+ "imul_mem_8bit": 2,
+ "imul_mem_nosize": 2,
+ "imul_reg_": 2,
+ "imul_reg_8bit": 2,
+ "imul_reg_imm": 3,
+ "imul_reg_noimm": 2,
+ "imul_reg_reg": 2,
+ "imul_reg_mem": 1,
+ "imul_reg_mem_imm": 2,
+ "AFh": 2,
+ "imul_reg_mem_imm_16bit": 2,
+ "imul_reg_mem_imm_32bit": 2,
+ "imul_reg_mem_imm_64bit": 1,
+ "imul_reg_mem_imm_32bit_ok": 2,
+ "imul_reg_mem_imm_16bit_store": 4,
+ "imul_reg_mem_imm_8bit_store": 3,
+ "imul_reg_mem_imm_32bit_store": 4,
+ "Bh": 11,
+ "imul_reg_reg_imm": 3,
+ "imul_reg_reg_imm_16bit": 2,
+ "imul_reg_reg_imm_32bit": 2,
+ "imul_reg_reg_imm_64bit": 1,
+ "imul_reg_reg_imm_32bit_ok": 2,
+ "imul_reg_reg_imm_16bit_store": 4,
+ "imul_reg_reg_imm_8bit_store": 3,
+ "imul_reg_reg_imm_32bit_store": 4,
+ "in_instruction": 1,
+ "in_imm": 2,
+ "in_reg": 2,
+ "in_al_dx": 2,
+ "in_ax_dx": 2,
+ "EDh": 1,
+ "ECh": 1,
+ "in_imm_size_ok": 2,
+ "in_al_imm": 2,
+ "in_ax_imm": 2,
+ "E5h": 1,
+ "E4h": 1,
+ "out_instruction": 1,
+ "out_imm": 2,
+ "out_dx_al": 2,
+ "out_dx_ax": 2,
+ "EFh": 1,
+ "EEh": 1,
+ "out_imm_size_ok": 2,
+ "out_imm_al": 2,
+ "out_imm_ax": 2,
+ "E7h": 1,
+ "E6h": 1,
+ "call_instruction": 1,
+ "E8h": 3,
+ "process_jmp": 2,
+ "jmp_instruction": 1,
+ "E9h": 1,
+ "EAh": 1,
+ "get_jump_operator": 3,
+ "jmp_imm": 2,
+ "jmp_reg": 2,
+ "jmp_mem": 1,
+ "jump_type": 14,
+ "jmp_mem_size_not_specified": 2,
+ "jmp_mem_16bit": 3,
+ "jmp_mem_32bit": 2,
+ "jmp_mem_48bit": 2,
+ "jmp_mem_64bit": 2,
+ "jmp_mem_80bit": 2,
+ "jmp_mem_far": 2,
+ "jmp_mem_near": 2,
+ "jmp_mem_near_32bit": 3,
+ "jmp_mem_far_32bit": 4,
+ "jmp_mem_far_store": 3,
+ "jmp_reg_16bit": 2,
+ "jmp_reg_32bit": 2,
+ "jmp_reg_64bit": 1,
+ "jmp_far": 2,
+ "jmp_near": 1,
+ "jmp_imm_16bit": 3,
+ "jmp_imm_32bit": 2,
+ "jmp_imm_64bit": 3,
+ "get_address_dword_value": 3,
+ "jmp_imm_32bit_prefix_ok": 2,
+ "calculate_jump_offset": 10,
+ "check_for_short_jump": 8,
+ "jmp_short": 3,
+ "jmp_imm_32bit_store": 2,
+ "jno": 2,
+ "jmp_imm_32bit_ok": 2,
+ "relative_jump_out_of_range": 6,
+ "get_address_qword_value": 3,
+ "EBh": 1,
+ "get_address_word_value": 3,
+ "jmp_imm_16bit_prefix_ok": 2,
+ "cwde": 3,
+ "forced_short": 2,
+ "no_short_jump": 4,
+ "short_jump": 4,
+ "jmp_short_value_type_ok": 2,
+ "jump_out_of_range": 3,
+ "jmp_far_16bit": 2,
+ "jmp_far_32bit": 3,
+ "jmp_far_segment": 2,
+ "conditional_jump": 1,
+ "conditional_jump_16bit": 3,
+ "conditional_jump_32bit": 2,
+ "conditional_jump_64bit": 3,
+ "conditional_jump_32bit_prefix_ok": 2,
+ "conditional_jump_short": 4,
+ "conditional_jump_32bit_store": 2,
+ "conditional_jump_32bit_range_ok": 2,
+ "conditional_jump_16bit_prefix_ok": 2,
+ "loop_instruction_16bit": 1,
+ "loop_instruction": 5,
+ "loop_instruction_32bit": 1,
+ "loop_instruction_64bit": 1,
+ "loop_jump_16bit": 3,
+ "loop_jump_32bit": 2,
+ "loop_jump_64bit": 3,
+ "loop_jump_32bit_prefix_ok": 2,
+ "loop_counter_size": 4,
+ "make_loop_jump": 3,
+ "loop_counter_size_ok": 2,
+ "loop_jump_16bit_prefix_ok": 2,
+ "movs_instruction": 1,
+ "address_sizes_do_not_agree": 2,
+ "movs_address_16bit": 2,
+ "movs_address_32bit": 2,
+ "movs_store": 3,
+ "A4h": 1,
+ "movs_check_size": 5,
+ "lods_instruction": 1,
+ "lods_address_16bit": 2,
+ "lods_address_32bit": 2,
+ "lods_store": 3,
+ "ACh": 1,
+ "stos_instruction": 1,
+ "stos_address_16bit": 2,
+ "stos_address_32bit": 2,
+ "stos_store": 3,
+ "cmps_instruction": 1,
+ "cmps_address_16bit": 2,
+ "cmps_address_32bit": 2,
+ "cmps_store": 3,
+ "A6h": 1,
+ "ins_instruction": 1,
+ "ins_address_16bit": 2,
+ "ins_address_32bit": 2,
+ "ins_store": 3,
+ "ins_check_size": 2,
+ "outs_instruction": 1,
+ "outs_address_16bit": 2,
+ "outs_address_32bit": 2,
+ "outs_store": 3,
+ "xlat_instruction": 1,
+ "xlat_address_16bit": 2,
+ "xlat_address_32bit": 2,
+ "xlat_store": 3,
+ "D7h": 1,
+ "pm_word_instruction": 1,
+ "pm_reg": 2,
+ "pm_mem": 2,
+ "pm_mem_store": 2,
+ "pm_store_word_instruction": 1,
+ "lgdt_instruction": 1,
+ "lgdt_mem_48bit": 2,
+ "lgdt_mem_80bit": 2,
+ "lgdt_mem_store": 4,
+ "lar_instruction": 1,
+ "lar_reg_reg": 2,
+ "lar_reg_mem": 2,
+ "invlpg_instruction": 1,
+ "swapgs_instruction": 1,
+ "rdtscp_instruction": 1,
+ "basic_486_instruction": 1,
+ "basic_486_reg": 2,
+ "basic_486_mem_reg_8bit": 2,
+ "basic_486_reg_reg_8bit": 2,
+ "bswap_instruction": 1,
+ "bswap_reg_code_ok": 2,
+ "bswap_reg64": 2,
+ "cmpxchgx_instruction": 1,
+ "cmpxchgx_size_ok": 2,
+ "cmpxchgx_store": 2,
+ "nop_instruction": 1,
+ "extended_nop": 4,
+ "extended_nop_reg": 2,
+ "extended_nop_store": 2,
+ "basic_fpu_instruction": 1,
+ "D8h": 2,
+ "basic_fpu_streg": 2,
+ "basic_fpu_mem": 2,
+ "basic_fpu_mem_32bit": 2,
+ "basic_fpu_mem_64bit": 2,
+ "DCh": 2,
+ "convert_fpu_register": 9,
+ "basic_fpu_single_streg": 3,
+ "basic_fpu_st0": 2,
+ "basic_fpu_streg_st0": 2,
+ "simple_fpu_instruction": 1,
+ "D9h": 6,
+ "fi_instruction": 1,
+ "fi_mem_16bit": 2,
+ "fi_mem_32bit": 2,
+ "DAh": 2,
+ "DEh": 2,
+ "fld_instruction": 1,
+ "fld_streg": 2,
+ "fld_mem_32bit": 2,
+ "fld_mem_64bit": 2,
+ "fld_mem_80bit": 2,
+ "DDh": 6,
+ "fld_mem_80bit_store": 3,
+ "DBh": 4,
+ "fst_streg": 2,
+ "fild_instruction": 1,
+ "fild_mem_16bit": 2,
+ "fild_mem_32bit": 2,
+ "fild_mem_64bit": 2,
+ "DFh": 5,
+ "fisttp_64bit_store": 2,
+ "fild_mem_64bit_store": 3,
+ "fbld_instruction": 1,
+ "fbld_mem_80bit": 3,
+ "faddp_instruction": 1,
+ "faddp_streg": 2,
+ "fcompp_instruction": 1,
+ "D9DEh": 1,
+ "fucompp_instruction": 1,
+ "E9DAh": 1,
+ "fxch_instruction": 1,
+ "fpu_single_operand": 3,
+ "ffreep_instruction": 1,
+ "ffree_instruction": 1,
+ "fpu_streg": 2,
+ "fstenv_instruction": 1,
+ "fldenv_instruction": 3,
+ "fpu_mem": 2,
+ "fstenv_instruction_16bit": 1,
+ "fldenv_instruction_16bit": 1,
+ "fstenv_instruction_32bit": 1,
+ "fldenv_instruction_32bit": 1,
+ "fsave_instruction_32bit": 1,
+ "fnsave_instruction_32bit": 1,
+ "fnsave_instruction": 3,
+ "fsave_instruction_16bit": 1,
+ "fnsave_instruction_16bit": 1,
+ "fsave_instruction": 1,
+ "fstcw_instruction": 1,
+ "fldcw_instruction": 1,
+ "fldcw_mem_16bit": 3,
+ "fstsw_instruction": 1,
+ "fnstsw_instruction": 1,
+ "fstsw_reg": 2,
+ "fstsw_mem_16bit": 3,
+ "E0DFh": 1,
+ "finit_instruction": 1,
+ "fninit_instruction": 1,
+ "fcmov_instruction": 1,
+ "fcomi_streg": 3,
+ "fcomi_instruction": 1,
+ "fcomip_instruction": 1,
+ "fcomi_st0_streg": 2,
+ "basic_mmx_instruction": 1,
+ "mmx_instruction": 1,
+ "convert_mmx_register": 18,
+ "make_mmx_prefix": 9,
+ "mmx_mmreg_mmreg": 3,
+ "mmx_mmreg_mem": 2,
+ "mmx_bit_shift_instruction": 1,
+ "mmx_ps_mmreg_imm8": 2,
+ "pmovmskb_instruction": 1,
+ "pmovmskb_reg_size_ok": 2,
+ "mmx_nomem_imm8": 7,
+ "mmx_imm8": 6,
+ "append_imm8": 2,
+ "pinsrw_instruction": 1,
+ "pinsrw_mmreg_reg": 2,
+ "pshufw_instruction": 1,
+ "mmx_size": 30,
+ "pshuf_instruction": 2,
+ "pshufd_instruction": 1,
+ "pshuf_mmreg_mmreg": 2,
+ "movd_instruction": 1,
+ "movd_reg": 2,
+ "movd_mmreg": 2,
+ "movd_mmreg_reg": 2,
+ "mmx_prefix_for_vex": 2,
+ "no_mmx_prefix": 2,
+ "movq_instruction": 1,
+ "movq_reg": 2,
+ "movq_mem_xmmreg": 2,
+ "D6h": 2,
+ "movq_mmreg": 2,
+ "movq_mmreg_": 2,
+ "F3h": 7,
+ "movq_mmreg_reg": 2,
+ "movq_mmreg_mmreg": 2,
+ "movq_mmreg_reg_store": 2,
+ "movdq_instruction": 1,
+ "movdq_mmreg": 2,
+ "convert_xmm_register": 12,
+ "movdq_mmreg_mmreg": 2,
+ "lddqu_instruction": 1,
+ "F2h": 6,
+ "movdq2q_instruction": 1,
+ "movq2dq_": 2,
+ "movq2dq_instruction": 1,
+ "sse_ps_instruction_imm8": 1,
+ "sse_ps_instruction": 1,
+ "sse_instruction": 11,
+ "sse_pd_instruction_imm8": 1,
+ "sse_pd_instruction": 1,
+ "sse_ss_instruction": 1,
+ "sse_sd_instruction": 1,
+ "cmp_pd_instruction": 1,
+ "cmp_ps_instruction": 1,
+ "C2h": 4,
+ "cmp_ss_instruction": 1,
+ "cmp_sx_instruction": 2,
+ "cmpsd_instruction": 1,
+ "A7h": 1,
+ "cmp_sd_instruction": 1,
+ "comiss_instruction": 1,
+ "comisd_instruction": 1,
+ "cvtdq2pd_instruction": 1,
+ "cvtps2pd_instruction": 1,
+ "cvtpd2dq_instruction": 1,
+ "movshdup_instruction": 1,
+ "sse_xmmreg": 2,
+ "sse_reg": 1,
+ "sse_xmmreg_xmmreg": 2,
+ "sse_reg_mem": 2,
+ "sse_mem_size_ok": 2,
+ "supplemental_code": 2,
+ "sse_cmp_mem_ok": 3,
+ "sse_ok": 2,
+ "take_additional_xmm0": 3,
+ "sse_xmmreg_xmmreg_ok": 4,
+ "sse_cmp_nomem_ok": 3,
+ "sse_nomem_ok": 2,
+ "additional_xmm0_ok": 2,
+ "pslldq_instruction": 1,
+ "movpd_instruction": 1,
+ "movps_instruction": 1,
+ "sse_mov_instruction": 3,
+ "movss_instruction": 1,
+ "sse_movs": 2,
+ "movsd_instruction": 1,
+ "A5h": 1,
+ "sse_mem": 2,
+ "sse_mem_xmmreg": 2,
+ "movlpd_instruction": 1,
+ "movlps_instruction": 1,
+ "movhlps_instruction": 1,
+ "maskmovq_instruction": 1,
+ "maskmov_instruction": 2,
+ "maskmovdqu_instruction": 1,
+ "movmskpd_instruction": 1,
+ "movmskps_instruction": 1,
+ "movmskps_reg_ok": 2,
+ "cvtpi2pd_instruction": 1,
+ "cvtpi2ps_instruction": 1
+ },
"ATS": {
"//": 211,
"#include": 16,
@@ -9792,23 +11249,23 @@
"C++": {
"class": 40,
"Bar": 2,
- "{": 629,
+ "{": 726,
"protected": 4,
"char": 127,
"*name": 6,
- ";": 2564,
+ ";": 2783,
"public": 33,
- "void": 226,
+ "void": 241,
"hello": 2,
- "(": 2853,
- ")": 2855,
- "}": 629,
- "//": 292,
+ "(": 3102,
+ ")": 3105,
+ "}": 726,
+ "//": 315,
"///": 843,
"mainpage": 1,
"C": 6,
"library": 14,
- "for": 98,
+ "for": 105,
"Broadcom": 3,
"BCM": 14,
"as": 28,
@@ -9857,7 +11314,7 @@
"SPI": 44,
"I2C": 29,
"accessing": 2,
- "system": 9,
+ "system": 13,
"timers.": 1,
"Pin": 65,
"event": 3,
@@ -9868,13 +11325,13 @@
"interrupts": 1,
"are": 36,
"not": 29,
- "+": 70,
+ "+": 80,
"compatible": 1,
"installs": 1,
"header": 7,
"file": 31,
"non": 2,
- "-": 360,
+ "-": 438,
"shared": 2,
"any": 23,
"Linux": 2,
@@ -9892,7 +11349,7 @@
"of": 215,
"package": 1,
"that": 36,
- "this": 55,
+ "this": 57,
"documentation": 3,
"refers": 1,
"be": 35,
@@ -9966,7 +11423,7 @@
"determined": 1,
"suspect": 1,
"an": 23,
- "interrupt": 1,
+ "interrupt": 3,
"handler": 1,
"hitting": 1,
"hard": 1,
@@ -10044,7 +11501,7 @@
"Ennnnnn": 1,
"available": 6,
"nnnnnn.": 1,
- "base": 6,
+ "base": 8,
"registers": 12,
"following": 2,
"externals": 1,
@@ -10116,7 +11573,7 @@
"SPI.": 1,
"While": 1,
"able": 2,
- "state": 22,
+ "state": 33,
"through": 4,
"bcm2835_spi_gpio_write": 1,
"bcm2835_spi_end": 4,
@@ -10137,7 +11594,7 @@
"referred": 1,
"I": 4,
"//en.wikipedia.org/wiki/I": 1,
- "%": 6,
+ "%": 7,
"C2": 1,
"B2C": 1,
"V2": 2,
@@ -10150,7 +11607,7 @@
"user": 3,
"i.e.": 1,
"they": 2,
- "run": 1,
+ "run": 2,
"Such": 1,
"part": 1,
"kernel": 4,
@@ -10158,7 +11615,7 @@
"subject": 1,
"paging": 1,
"swapping": 2,
- "while": 13,
+ "while": 17,
"does": 4,
"things": 1,
"besides": 1,
@@ -10178,7 +11635,7 @@
"guarantee": 1,
"bcm2835_delay": 5,
"bcm2835_delayMicroseconds": 6,
- "return": 221,
+ "return": 240,
"exactly": 2,
"requested.": 1,
"fact": 2,
@@ -10203,11 +11660,11 @@
"reports": 1,
"prevent": 4,
"fragment": 2,
- "struct": 12,
+ "struct": 13,
"sched_param": 1,
"sp": 4,
"memset": 3,
- "&": 161,
+ "&": 203,
"sizeof": 15,
"sp.sched_priority": 1,
"sched_get_priority_max": 1,
@@ -10215,7 +11672,7 @@
"sched_setscheduler": 1,
"mlockall": 1,
"MCL_CURRENT": 1,
- "|": 19,
+ "|": 40,
"MCL_FUTURE": 1,
"Open": 2,
"Source": 2,
@@ -10223,7 +11680,7 @@
"GPL": 2,
"appropriate": 7,
"option": 1,
- "if": 316,
+ "if": 359,
"want": 5,
"share": 2,
"source": 12,
@@ -10334,7 +11791,7 @@
"need": 6,
"link": 3,
"version.": 1,
- "s": 24,
+ "s": 26,
"doc": 1,
"Also": 1,
"added": 2,
@@ -10368,7 +11825,7 @@
"compiles": 1,
"even": 2,
"CLOCK_MONOTONIC_RAW": 1,
- "CLOCK_MONOTONIC": 1,
+ "CLOCK_MONOTONIC": 3,
"instead.": 1,
"errors": 1,
"divider": 15,
@@ -10416,7 +11873,7 @@
"olly.": 1,
"Patch": 2,
"Dootson": 2,
- "close": 3,
+ "close": 7,
"/dev/mem": 4,
"granted.": 1,
"susceptible": 1,
@@ -10443,7 +11900,7 @@
"completing.": 1,
"Patched": 1,
"p": 6,
- "[": 276,
+ "[": 293,
"atched": 1,
"his": 1,
"submitted": 1,
@@ -10472,10 +11929,10 @@
"DIRECTLY": 1,
"USE": 1,
"LISTS": 1,
- "#ifndef": 28,
+ "#ifndef": 29,
"BCM2835_H": 3,
- "#define": 342,
- "#include": 121,
+ "#define": 343,
+ "#include": 129,
"": 2,
"defgroup": 7,
"constants": 1,
@@ -10485,16 +11942,16 @@
"here": 1,
"@": 14,
"HIGH": 12,
- "true": 41,
+ "true": 49,
"volts": 2,
"pin.": 21,
- "false": 45,
+ "false": 48,
"Speed": 1,
"core": 1,
"clock": 21,
"core_clk": 1,
"BCM2835_CORE_CLK_HZ": 1,
- "<": 250,
+ "<": 255,
"Base": 17,
"Address": 10,
"BCM2835_PERI_BASE": 9,
@@ -10519,7 +11976,7 @@
"bcm2835_init": 11,
"extern": 72,
"volatile": 13,
- "uint32_t": 37,
+ "uint32_t": 39,
"*bcm2835_st": 1,
"*bcm2835_gpio": 1,
"*bcm2835_pwm": 1,
@@ -10533,7 +11990,7 @@
"page": 5,
"BCM2835_PAGE_SIZE": 1,
"*1024": 2,
- "block": 4,
+ "block": 7,
"BCM2835_BLOCK_SIZE": 1,
"offsets": 2,
"BCM2835_GPIO_BASE.": 1,
@@ -10908,10 +12365,10 @@
"BCM2835_BSC_C_READ": 1,
"BCM2835_BSC_S_CLKT": 1,
"stretch": 1,
- "timeout": 1,
+ "timeout": 5,
"BCM2835_BSC_S_ERR": 1,
"ACK": 1,
- "error": 2,
+ "error": 8,
"BCM2835_BSC_S_RXF": 1,
"BCM2835_BSC_S_TXE": 1,
"TXE": 1,
@@ -10942,7 +12399,7 @@
"BCM2835_I2C_REASON_ERROR_CLKT": 1,
"BCM2835_I2C_REASON_ERROR_DATA": 1,
"sent": 1,
- "/": 15,
+ "/": 16,
"BCM2835_ST_CS": 1,
"Control/Status": 1,
"BCM2835_ST_CLO": 1,
@@ -10983,7 +12440,7 @@
"BCM2835_PWM0_SERIAL": 1,
"BCM2835_PWM0_ENABLE": 1,
"x": 86,
- "#endif": 98,
+ "#endif": 110,
"#ifdef": 19,
"__cplusplus": 12,
"init": 2,
@@ -11001,7 +12458,7 @@
"bcm2835_set_debug": 2,
"fails": 1,
"returning": 1,
- "result": 2,
+ "result": 8,
"crashes": 1,
"failures.": 1,
"Prints": 1,
@@ -11010,12 +12467,12 @@
"case": 34,
"errors.": 1,
"successful": 2,
- "else": 50,
- "int": 192,
+ "else": 58,
+ "int": 218,
"Close": 1,
"deallocating": 1,
"allocated": 2,
- "closing": 1,
+ "closing": 3,
"Sets": 24,
"debug": 6,
"prevents": 1,
@@ -11031,7 +12488,7 @@
"operation.": 2,
"Call": 2,
"param": 72,
- "]": 275,
+ "]": 292,
"level.": 3,
"uint8_t": 43,
"lowlevel": 2,
@@ -11105,7 +12562,7 @@
"Tests": 1,
"detected": 7,
"requested": 1,
- "flag": 1,
+ "flag": 3,
"bcm2835_gpio_set_eds": 2,
"status": 1,
"th": 1,
@@ -11207,7 +12664,7 @@
"Forces": 2,
"ALT0": 2,
"funcitons": 1,
- "complete": 2,
+ "complete": 3,
"End": 2,
"returned": 5,
"INPUT": 2,
@@ -11259,7 +12716,7 @@
"placed": 1,
"rbuf.": 1,
"rbuf": 3,
- "long": 14,
+ "long": 15,
"tbuf": 4,
"Buffer": 10,
"send.": 5,
@@ -11303,8 +12760,8 @@
"course": 2,
"nothing": 1,
"driver": 1,
- "const": 170,
- "*": 177,
+ "const": 172,
+ "*": 183,
"receive.": 2,
"received.": 2,
"Allows": 2,
@@ -11350,8 +12807,8 @@
"": 4,
"": 4,
"": 2,
- "namespace": 32,
- "std": 52,
+ "namespace": 38,
+ "std": 53,
"DEFAULT_DELIMITER": 1,
"CsvStreamer": 5,
"private": 16,
@@ -11399,7 +12856,7 @@
"leading/trailing": 1,
"spaces": 3,
"trimmed": 1,
- "bool": 105,
+ "bool": 111,
"Like": 1,
"specify": 1,
"trim": 2,
@@ -11416,7 +12873,7 @@
"": 1,
"": 1,
"": 2,
- "static": 262,
+ "static": 263,
"Env": 13,
"*env_instance": 1,
"NULL": 109,
@@ -11448,6 +12905,202 @@
"": 1,
"Q_OBJECT": 1,
"*instance": 1,
+ "BOOST_ASIO_DETAIL_IMPL_EPOLL_REACTOR_IPP": 3,
+ "#if": 63,
+ "defined": 49,
+ "_MSC_VER": 7,
+ "&&": 29,
+ "": 1,
+ "BOOST_ASIO_HAS_EPOLL": 2,
+ "": 1,
+ "": 1,
+ "": 1,
+ "": 1,
+ "": 1,
+ "BOOST_ASIO_HAS_TIMERFD": 19,
+ "": 1,
+ "boost": 18,
+ "asio": 14,
+ "detail": 5,
+ "epoll_reactor": 40,
+ "io_service": 6,
+ "service_base": 1,
+ "": 1,
+ "io_service_": 1,
+ "use_service": 1,
+ "": 1,
+ "mutex_": 13,
+ "interrupter_": 5,
+ "epoll_fd_": 20,
+ "do_epoll_create": 3,
+ "timer_fd_": 21,
+ "do_timerfd_create": 3,
+ "shutdown_": 10,
+ "epoll_event": 10,
+ "ev": 21,
+ "ev.events": 13,
+ "EPOLLIN": 8,
+ "EPOLLERR": 8,
+ "EPOLLET": 5,
+ "ev.data.ptr": 10,
+ "epoll_ctl": 12,
+ "EPOLL_CTL_ADD": 7,
+ "interrupter_.read_descriptor": 3,
+ "interrupter_.interrupt": 2,
+ "shutdown_service": 1,
+ "mutex": 16,
+ "scoped_lock": 16,
+ "lock": 5,
+ "lock.unlock": 1,
+ "op_queue": 6,
+ "": 6,
+ "ops": 10,
+ "descriptor_state*": 6,
+ "registered_descriptors_.first": 2,
+ "i": 106,
+ "max_ops": 6,
+ "ops.push": 5,
+ "op_queue_": 12,
+ "registered_descriptors_.free": 2,
+ "timer_queues_.get_all_timers": 1,
+ "io_service_.abandon_operations": 1,
+ "fork_service": 1,
+ "fork_event": 1,
+ "fork_ev": 2,
+ "fork_child": 1,
+ "interrupter_.recreate": 1,
+ "update_timeout": 2,
+ "descriptors_lock": 3,
+ "registered_descriptors_mutex_": 3,
+ "next_": 3,
+ "registered_events_": 8,
+ "descriptor_": 5,
+ "error_code": 4,
+ "ec": 6,
+ "errno": 10,
+ "get_system_category": 3,
+ "throw_error": 2,
+ "init_task": 1,
+ "io_service_.init_task": 1,
+ "register_descriptor": 1,
+ "socket_type": 7,
+ "descriptor": 15,
+ "per_descriptor_data": 8,
+ "descriptor_data": 60,
+ "allocate_descriptor_state": 3,
+ "descriptor_lock": 7,
+ "reactor_": 7,
+ "EPOLLHUP": 3,
+ "EPOLLPRI": 3,
+ "register_internal_descriptor": 1,
+ "op_type": 8,
+ "reactor_op*": 5,
+ "op": 28,
+ ".push": 2,
+ "move_descriptor": 1,
+ "target_descriptor_data": 2,
+ "source_descriptor_data": 3,
+ "start_op": 1,
+ "is_continuation": 5,
+ "allow_speculative": 2,
+ "ec_": 4,
+ "bad_descriptor": 1,
+ "post_immediate_completion": 2,
+ ".empty": 5,
+ "read_op": 1,
+ "||": 19,
+ "except_op": 1,
+ "perform": 2,
+ "descriptor_lock.unlock": 4,
+ "io_service_.post_immediate_completion": 2,
+ "write_op": 2,
+ "EPOLLOUT": 4,
+ "EPOLL_CTL_MOD": 3,
+ "io_service_.work_started": 2,
+ "cancel_ops": 1,
+ ".front": 3,
+ "operation_aborted": 2,
+ ".pop": 3,
+ "io_service_.post_deferred_completions": 3,
+ "deregister_descriptor": 1,
+ "EPOLL_CTL_DEL": 2,
+ "free_descriptor_state": 3,
+ "deregister_internal_descriptor": 1,
+ "get_timeout": 5,
+ "events": 8,
+ "num_events": 2,
+ "epoll_wait": 1,
+ "check_timers": 6,
+ "#else": 35,
+ "void*": 2,
+ "ptr": 6,
+ ".data.ptr": 1,
+ "static_cast": 14,
+ "": 2,
+ "set_ready_events": 1,
+ ".events": 1,
+ "common_lock": 1,
+ "timer_queues_.get_ready_timers": 1,
+ "itimerspec": 5,
+ "new_timeout": 6,
+ "old_timeout": 4,
+ "flags": 4,
+ "timerfd_settime": 2,
+ "EPOLL_CLOEXEC": 4,
+ "fd": 15,
+ "epoll_create1": 1,
+ "EINVAL": 4,
+ "ENOSYS": 1,
+ "epoll_create": 1,
+ "epoll_size": 1,
+ "fcntl": 2,
+ "F_SETFD": 2,
+ "FD_CLOEXEC": 2,
+ "timerfd_create": 2,
+ "TFD_CLOEXEC": 1,
+ "registered_descriptors_.alloc": 1,
+ "do_add_timer_queue": 1,
+ "timer_queue_base": 2,
+ "queue": 4,
+ "timer_queues_.insert": 1,
+ "do_remove_timer_queue": 1,
+ "timer_queues_.erase": 1,
+ "timer_queues_.wait_duration_msec": 1,
+ "ts": 1,
+ "ts.it_interval.tv_sec": 1,
+ "ts.it_interval.tv_nsec": 1,
+ "usec": 5,
+ "timer_queues_.wait_duration_usec": 1,
+ "ts.it_value.tv_sec": 1,
+ "ts.it_value.tv_nsec": 1,
+ "TFD_TIMER_ABSTIME": 1,
+ "perform_io_cleanup_on_block_exit": 4,
+ "explicit": 5,
+ "epoll_reactor*": 2,
+ "r": 38,
+ "first_op_": 3,
+ "ops_.empty": 1,
+ "ops_": 2,
+ "operation*": 4,
+ "descriptor_state": 5,
+ "operation": 2,
+ "do_complete": 2,
+ "perform_io": 2,
+ "mutex_.lock": 1,
+ "io_cleanup": 1,
+ "adopt_lock": 1,
+ "j": 10,
+ "io_cleanup.ops_.push": 1,
+ "break": 35,
+ "io_cleanup.first_op_": 2,
+ "io_cleanup.ops_.front": 1,
+ "io_cleanup.ops_.pop": 1,
+ "io_service_impl*": 1,
+ "owner": 3,
+ "size_t": 6,
+ "bytes_transferred": 2,
+ "": 1,
+ "": 1,
"Field": 2,
"Free": 1,
"Black": 1,
@@ -11561,7 +13214,6 @@
"*rr": 1,
"*zero": 1,
"n": 28,
- "i": 83,
"BN_CTX_start": 1,
"BN_CTX_get": 8,
"EC_GROUP_get_order": 1,
@@ -11569,7 +13221,6 @@
"BN_mul_word": 1,
"BN_add": 1,
"ecsig": 3,
- "r": 36,
"EC_GROUP_get_curve_GFp": 1,
"BN_cmp": 1,
"R": 6,
@@ -11627,13 +13278,11 @@
"nBitsR": 3,
"BN_num_bits": 2,
"nBitsS": 3,
- "&&": 24,
"nRecId": 4,
"<4;>": 1,
"keyRec": 5,
"1": 4,
"GetPubKey": 5,
- "break": 34,
"BN_bn2bin": 2,
"/8": 2,
"ECDSA_SIG_free": 2,
@@ -11661,7 +13310,6 @@
"": 1,
"": 1,
"runtime_error": 2,
- "explicit": 4,
"str": 2,
"CKeyID": 5,
"uint160": 8,
@@ -11680,7 +13328,6 @@
"vchPubKey.begin": 1,
"vchPubKey.end": 1,
"vchPubKey.size": 3,
- "||": 17,
"IsCompressed": 2,
"Raw": 1,
"secure_allocator": 2,
@@ -11703,7 +13350,6 @@
"//#define": 1,
"DEBUG": 5,
"dout": 2,
- "#else": 31,
"cerr": 1,
"libcanister": 2,
"//the": 8,
@@ -11810,7 +13456,6 @@
"getFile": 1,
"otherwise": 1,
"overwrites": 1,
- "operation": 1,
"succeeded": 2,
"writeFile": 2,
"//get": 1,
@@ -11833,7 +13478,6 @@
"dFlush": 1,
"Q_OS_LINUX": 2,
"": 1,
- "#if": 52,
"QT_VERSION": 1,
"QT_VERSION_CHECK": 1,
"#error": 9,
@@ -11895,7 +13539,6 @@
"sse": 1,
"cvttss2si": 2,
"OG_ASM_MSVC": 4,
- "defined": 23,
"OG_FTOI_USE_SSE": 2,
"SysInfo": 2,
"cpu.general.SSE": 2,
@@ -11913,7 +13556,6 @@
"cast": 7,
"why": 3,
"did": 3,
- "static_cast": 11,
"": 3,
"FtoiFast": 2,
"Ftol": 1,
@@ -11991,7 +13633,6 @@
"edx": 2,
"fstp": 2,
"dword": 2,
- "ptr": 2,
"asm": 1,
"Deg2Rad": 1,
"DEG_TO_RAD": 1,
@@ -12130,7 +13771,6 @@
"OnShutdown": 1,
"StaticDescriptorInitializer_protocol_2dbuffer_2eproto": 2,
"static_descriptor_initializer_protocol_2dbuffer_2eproto_": 1,
- "_MSC_VER": 3,
"kNameFieldNumber": 2,
"Message": 7,
"SharedCtor": 4,
@@ -12143,7 +13783,6 @@
"SetCachedSize": 2,
"GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN": 2,
"GOOGLE_SAFE_CONCURRENT_WRITES_END": 2,
- "descriptor": 2,
"*default_instance_": 1,
"Person*": 7,
"xffu": 3,
@@ -12179,7 +13818,6 @@
"SERIALIZE": 2,
"WriteString": 1,
"unknown_fields": 7,
- ".empty": 3,
"SerializeUnknownFields": 1,
"uint8*": 4,
"SerializeWithCachedSizesToArray": 2,
@@ -12234,7 +13872,6 @@
"UnknownFieldSet*": 1,
"GetCachedSize": 1,
"clear_name": 2,
- "size_t": 5,
"release_name": 2,
"set_allocated_name": 2,
"set_has_name": 7,
@@ -12665,7 +14302,6 @@
"c0_": 64,
"d": 8,
"HexValue": 2,
- "j": 4,
"PushBack": 8,
"Advance": 44,
"STATIC_ASSERT": 5,
@@ -12686,7 +14322,6 @@
"BIT_NOT": 2,
"Next": 3,
"current_": 2,
- "next_": 2,
"has_multiline_comment_before_next_": 5,
"token": 64,
"": 1,
@@ -12941,7 +14576,6 @@
"QtMsgType": 1,
"dump_path": 1,
"minidump_id": 1,
- "void*": 1,
"context": 8,
"QVariant": 1,
"coffee2js": 1,
@@ -13014,7 +14648,6 @@
"FLAG_random_seed": 2,
"val": 3,
"ScopedLock": 1,
- "lock": 1,
"entropy_mutex.Pointer": 1,
"random": 1,
"random_base": 3,
@@ -13123,7 +14756,6 @@
"PY_VERSION_HEX": 9,
"METH_COEXIST": 1,
"PyDict_CheckExact": 1,
- "op": 6,
"Py_TYPE": 4,
"PyDict_Type": 1,
"PyDict_Contains": 1,
@@ -14744,48 +16376,510 @@
"ip.join": 1
},
"Common Lisp": {
- ";": 10,
- "-": 10,
+ ";": 152,
+ "@file": 1,
+ "macros": 2,
+ "-": 161,
+ "advanced.cl": 1,
+ "@breif": 1,
+ "Advanced": 1,
+ "macro": 5,
+ "practices": 1,
+ "defining": 1,
+ "your": 1,
+ "own": 1,
+ "Macro": 1,
+ "definition": 1,
+ "skeleton": 1,
+ "(": 365,
+ "defmacro": 5,
+ "name": 6,
+ "parameter*": 1,
+ ")": 372,
+ "body": 8,
+ "form*": 1,
+ "Note": 2,
+ "that": 5,
+ "backquote": 1,
+ "expression": 2,
+ "is": 6,
+ "most": 2,
+ "often": 1,
+ "used": 2,
+ "in": 23,
+ "the": 35,
+ "form": 1,
+ "primep": 4,
+ "test": 1,
+ "a": 7,
+ "number": 2,
+ "for": 3,
+ "prime": 12,
+ "defun": 23,
+ "n": 8,
+ "if": 14,
+ "<": 1,
+ "return": 3,
+ "from": 8,
+ "do": 9,
+ "i": 8,
+ "+": 35,
+ "p": 10,
+ "t": 7,
+ "not": 6,
+ "zerop": 1,
+ "mod": 1,
+ "sqrt": 1,
+ "when": 4,
+ "next": 11,
+ "bigger": 1,
+ "than": 1,
+ "specified": 2,
+ "The": 2,
+ "recommended": 1,
+ "procedures": 1,
+ "to": 4,
+ "writting": 1,
+ "new": 6,
+ "are": 2,
+ "as": 1,
+ "follows": 1,
+ "Write": 2,
+ "sample": 2,
+ "call": 2,
+ "and": 12,
+ "code": 2,
+ "it": 2,
+ "should": 1,
+ "expand": 1,
+ "into": 2,
+ "primes": 3,
+ "format": 3,
+ "Expected": 1,
+ "expanded": 1,
+ "codes": 1,
+ "generate": 1,
+ "hardwritten": 1,
+ "expansion": 2,
+ "arguments": 1,
+ "var": 49,
+ "range": 4,
+ "&": 8,
+ "rest": 5,
+ "let": 6,
+ "first": 5,
+ "start": 5,
+ "second": 3,
+ "end": 8,
+ "third": 2,
+ "@body": 4,
+ "More": 1,
+ "concise": 1,
+ "implementations": 1,
+ "with": 7,
+ "synonym": 1,
+ "also": 1,
+ "emits": 1,
+ "more": 1,
+ "friendly": 1,
+ "messages": 1,
+ "on": 1,
+ "incorrent": 1,
+ "input.": 1,
+ "Test": 1,
+ "result": 1,
+ "of": 3,
+ "macroexpand": 2,
+ "function": 2,
+ "gensyms": 4,
+ "value": 8,
+ "Define": 1,
+ "note": 1,
+ "how": 1,
+ "comma": 1,
+ "interpolate": 1,
+ "loop": 2,
+ "names": 2,
+ "collect": 1,
+ "gensym": 1,
+ "#": 15,
+ "|": 9,
+ "ESCUELA": 1,
+ "POLITECNICA": 1,
+ "SUPERIOR": 1,
+ "UNIVERSIDAD": 1,
+ "AUTONOMA": 1,
+ "DE": 1,
+ "MADRID": 1,
+ "INTELIGENCIA": 1,
+ "ARTIFICIAL": 1,
+ "Motor": 1,
+ "de": 2,
+ "inferencia": 1,
+ "Basado": 1,
+ "en": 2,
+ "parte": 1,
+ "Peter": 1,
+ "Norvig": 1,
+ "Global": 1,
+ "variables": 6,
+ "defvar": 4,
+ "*hypothesis": 1,
+ "list*": 7,
+ "*rule": 4,
+ "*fact": 2,
+ "Constants": 1,
+ "defconstant": 2,
+ "fail": 10,
+ "nil": 3,
+ "no": 6,
+ "bindings": 45,
+ "lambda": 4,
+ "b": 6,
+ "mapcar": 2,
+ "man": 3,
+ "luis": 1,
+ "pedro": 1,
+ "woman": 2,
+ "mart": 1,
+ "daniel": 1,
+ "laura": 1,
+ "facts": 1,
+ "x": 47,
+ "aux": 3,
+ "unify": 12,
+ "hypothesis": 10,
+ "list": 9,
+ "____________________________________________________________________________": 5,
+ "FUNCTION": 3,
+ "FIND": 1,
+ "RULES": 2,
+ "COMMENTS": 3,
+ "Returns": 2,
+ "rules": 5,
+ "whose": 1,
+ "THENs": 1,
+ "term": 1,
+ "given": 3,
+ "": 2,
+ "satisfy": 1,
+ "this": 1,
+ "requirement": 1,
+ "renamed.": 1,
+ "EXAMPLES": 2,
+ "setq": 1,
+ "renamed": 3,
+ "rule": 17,
+ "rename": 1,
+ "then": 7,
+ "unless": 3,
+ "null": 1,
+ "equal": 4,
+ "VALUE": 1,
+ "FROM": 1,
+ "all": 2,
+ "solutions": 1,
+ "found": 5,
+ "using": 1,
+ "": 1,
+ ".": 10,
+ "single": 1,
+ "can": 4,
+ "have": 1,
+ "multiple": 1,
+ "solutions.": 1,
+ "mapcan": 1,
+ "R1": 2,
+ "pertenece": 3,
+ "E": 4,
+ "_": 8,
+ "R2": 2,
+ "Xs": 2,
+ "Then": 1,
+ "EVAL": 2,
+ "RULE": 2,
+ "PERTENECE": 6,
+ "E.42": 2,
+ "returns": 4,
+ "NIL": 3,
+ "That": 2,
+ "query": 4,
+ "be": 2,
+ "proven": 2,
+ "binding": 17,
+ "necessary": 2,
+ "fact": 4,
+ "has": 1,
+ "On": 1,
+ "other": 1,
+ "hand": 1,
+ "E.49": 2,
+ "XS.50": 2,
+ "R2.": 1,
+ "eval": 6,
+ "ifs": 1,
+ "NOT": 2,
+ "question": 1,
+ "T": 1,
+ "equality": 2,
+ "UNIFY": 1,
+ "Finds": 1,
+ "general": 1,
+ "unifier": 1,
+ "two": 2,
+ "input": 2,
+ "expressions": 2,
+ "taking": 1,
+ "account": 1,
+ "": 1,
+ "In": 1,
+ "case": 1,
+ "total": 1,
+ "unification.": 1,
+ "Otherwise": 1,
+ "which": 1,
+ "constant": 1,
+ "anonymous": 4,
+ "make": 4,
+ "variable": 6,
+ "Auxiliary": 1,
+ "Functions": 1,
+ "cond": 3,
+ "or": 4,
+ "get": 5,
+ "lookup": 5,
+ "occurs": 5,
+ "extend": 2,
+ "symbolp": 2,
+ "eql": 2,
+ "char": 2,
+ "symbol": 2,
+ "assoc": 1,
+ "car": 2,
+ "val": 6,
+ "cdr": 2,
+ "cons": 2,
+ "append": 1,
+ "eq": 7,
+ "consp": 2,
+ "subst": 3,
+ "listp": 1,
+ "exp": 1,
+ "unique": 3,
+ "find": 6,
+ "anywhere": 6,
+ "predicate": 8,
+ "tree": 11,
+ "optional": 2,
+ "so": 4,
+ "far": 4,
+ "atom": 3,
+ "funcall": 2,
+ "pushnew": 1,
+ "gentemp": 2,
+ "quote": 3,
+ "s/reuse": 1,
+ "cons/cons": 1,
+ "expresion": 2,
+ "some": 1,
+ "EOF": 1,
"*": 2,
"lisp": 1,
- "(": 14,
- "in": 1,
"package": 1,
"foo": 2,
- ")": 14,
"Header": 1,
"comment.": 4,
- "defvar": 1,
"*foo*": 1,
- "eval": 1,
- "when": 1,
"execute": 1,
"compile": 1,
"toplevel": 2,
"load": 1,
- "defun": 1,
"add": 1,
- "x": 5,
- "&": 3,
- "optional": 1,
"y": 2,
"key": 1,
"z": 2,
"declare": 1,
"ignore": 1,
"Inline": 1,
- "+": 2,
- "or": 1,
- "#": 2,
- "|": 2,
"Multi": 1,
"line": 2,
- "defmacro": 1,
- "body": 1,
- "b": 1,
- "if": 1,
"After": 1
},
+ "Component Pascal": {
+ "MODULE": 2,
+ "ObxControls": 1,
+ ";": 123,
+ "IMPORT": 2,
+ "Dialog": 1,
+ "Ports": 1,
+ "Properties": 1,
+ "Views": 1,
+ "CONST": 1,
+ "beginner": 5,
+ "advanced": 3,
+ "expert": 1,
+ "guru": 2,
+ "TYPE": 1,
+ "View": 6,
+ "POINTER": 2,
+ "TO": 2,
+ "RECORD": 2,
+ "(": 91,
+ "Views.View": 2,
+ ")": 94,
+ "size": 1,
+ "INTEGER": 10,
+ "END": 31,
+ "VAR": 9,
+ "data*": 1,
+ "class*": 1,
+ "list*": 1,
+ "Dialog.List": 1,
+ "width*": 1,
+ "predef": 12,
+ "ARRAY": 2,
+ "OF": 2,
+ "PROCEDURE": 12,
+ "SetList": 4,
+ "BEGIN": 13,
+ "IF": 11,
+ "data.class": 5,
+ "THEN": 12,
+ "data.list.SetLen": 3,
+ "data.list.SetItem": 11,
+ "ELSIF": 1,
+ "ELSE": 3,
+ "v": 6,
+ "CopyFromSimpleView": 2,
+ "source": 2,
+ "v.size": 10,
+ ".size": 1,
+ "Restore": 2,
+ "f": 1,
+ "Views.Frame": 1,
+ "l": 1,
+ "t": 1,
+ "r": 7,
+ "b": 1,
+ "[": 13,
+ "]": 13,
+ "f.DrawRect": 1,
+ "Ports.fill": 1,
+ "Ports.red": 1,
+ "HandlePropMsg": 2,
+ "msg": 2,
+ "Views.PropMessage": 1,
+ "WITH": 1,
+ "Properties.SizePref": 1,
+ "DO": 4,
+ "msg.w": 1,
+ "msg.h": 1,
+ "ClassNotify*": 1,
+ "op": 4,
+ "from": 2,
+ "to": 5,
+ "Dialog.changed": 2,
+ "OR": 4,
+ "&": 8,
+ "data.list.index": 3,
+ "data.width": 4,
+ "Dialog.Update": 2,
+ "data": 2,
+ "Dialog.UpdateList": 1,
+ "data.list": 1,
+ "ClassNotify": 1,
+ "ListNotify*": 1,
+ "ListNotify": 1,
+ "ListGuard*": 1,
+ "par": 2,
+ "Dialog.Par": 2,
+ "par.disabled": 1,
+ "ListGuard": 1,
+ "WidthGuard*": 1,
+ "par.readOnly": 1,
+ "#": 3,
+ "WidthGuard": 1,
+ "Open*": 1,
+ "NEW": 2,
+ "*": 1,
+ "Ports.mm": 1,
+ "Views.OpenAux": 1,
+ "Open": 1,
+ "ObxControls.": 1,
+ "ObxFact": 1,
+ "Stores": 1,
+ "Models": 1,
+ "TextModels": 1,
+ "TextControllers": 1,
+ "Integers": 1,
+ "Read": 3,
+ "TextModels.Reader": 2,
+ "x": 15,
+ "Integers.Integer": 3,
+ "i": 17,
+ "len": 5,
+ "beg": 11,
+ "ch": 14,
+ "CHAR": 3,
+ "buf": 5,
+ "r.ReadChar": 5,
+ "WHILE": 3,
+ "r.eot": 4,
+ "<=>": 1,
+ "ReadChar": 1,
+ "ASSERT": 1,
+ "eot": 1,
+ "<": 8,
+ "r.Pos": 2,
+ "-": 1,
+ "REPEAT": 3,
+ "INC": 4,
+ "UNTIL": 3,
+ "+": 1,
+ "r.SetPos": 2,
+ "X": 1,
+ "Integers.ConvertFromString": 1,
+ "Write": 3,
+ "w": 4,
+ "TextModels.Writer": 2,
+ "Integers.Sign": 2,
+ "w.WriteChar": 3,
+ "Integers.Digits10Of": 1,
+ "DEC": 1,
+ "Integers.ThisDigit10": 1,
+ "Compute*": 1,
+ "end": 6,
+ "n": 3,
+ "s": 3,
+ "Stores.Operation": 1,
+ "attr": 3,
+ "TextModels.Attributes": 1,
+ "c": 3,
+ "TextControllers.Controller": 1,
+ "TextControllers.Focus": 1,
+ "NIL": 3,
+ "c.HasSelection": 1,
+ "c.GetSelection": 1,
+ "c.text.NewReader": 1,
+ "r.ReadPrev": 2,
+ "r.attr": 1,
+ "Integers.Compare": 1,
+ "Integers.Long": 3,
+ "MAX": 1,
+ "LONGINT": 1,
+ "SHORT": 1,
+ "Integers.Short": 1,
+ "Integers.Product": 1,
+ "Models.BeginScript": 1,
+ "c.text": 2,
+ "c.text.Delete": 1,
+ "c.text.NewWriter": 1,
+ "w.SetPos": 1,
+ "w.SetAttr": 1,
+ "Models.EndScript": 1,
+ "Compute": 1,
+ "ObxFact.": 1
+ },
"Coq": {
"Inductive": 41,
"day": 9,
@@ -16213,6 +18307,253 @@
"Ruby": 1,
"distribution.": 1
},
+ "Crystal": {
+ "SHEBANG#!bin/crystal": 2,
+ "require": 2,
+ "describe": 2,
+ "do": 26,
+ "it": 21,
+ "run": 14,
+ "(": 201,
+ ")": 201,
+ ".to_i.should": 11,
+ "eq": 16,
+ "end": 135,
+ ".to_f32.should": 2,
+ ".to_b.should": 1,
+ "be_true": 1,
+ "assert_type": 7,
+ "{": 7,
+ "int32": 8,
+ "}": 7,
+ "union_of": 1,
+ "char": 1,
+ "result": 3,
+ "types": 3,
+ "[": 9,
+ "]": 9,
+ "mod": 1,
+ "result.program": 1,
+ "foo": 3,
+ "mod.types": 1,
+ "as": 4,
+ "NonGenericClassType": 1,
+ "foo.instance_vars": 1,
+ ".type.should": 3,
+ "mod.int32": 1,
+ "GenericClassType": 2,
+ "foo_i32": 4,
+ "foo.instantiate": 2,
+ "of": 3,
+ "Type": 2,
+ "|": 8,
+ "ASTNode": 4,
+ "foo_i32.lookup_instance_var": 2,
+ "module": 1,
+ "Crystal": 1,
+ "class": 2,
+ "def": 84,
+ "transform": 81,
+ "transformer": 1,
+ "transformer.before_transform": 1,
+ "self": 77,
+ "node": 164,
+ "transformer.transform": 1,
+ "transformer.after_transform": 1,
+ "Transformer": 1,
+ "before_transform": 1,
+ "after_transform": 1,
+ "Expressions": 2,
+ "exps": 6,
+ "node.expressions.each": 1,
+ "exp": 3,
+ "new_exp": 3,
+ "exp.transform": 3,
+ "if": 23,
+ "new_exp.is_a": 1,
+ "exps.concat": 1,
+ "new_exp.expressions": 1,
+ "else": 2,
+ "<<": 1,
+ "exps.length": 1,
+ "node.expressions": 3,
+ "Call": 1,
+ "node_obj": 1,
+ "node.obj": 9,
+ "node_obj.transform": 1,
+ "transform_many": 23,
+ "node.args": 3,
+ "node_block": 1,
+ "node.block": 2,
+ "node_block.transform": 1,
+ "node_block_arg": 1,
+ "node.block_arg": 6,
+ "node_block_arg.transform": 1,
+ "And": 1,
+ "node.left": 3,
+ "node.left.transform": 3,
+ "node.right": 3,
+ "node.right.transform": 3,
+ "Or": 1,
+ "StringInterpolation": 1,
+ "ArrayLiteral": 1,
+ "node.elements": 1,
+ "node_of": 1,
+ "node.of": 2,
+ "node_of.transform": 1,
+ "HashLiteral": 1,
+ "node.keys": 1,
+ "node.values": 2,
+ "of_key": 1,
+ "node.of_key": 2,
+ "of_key.transform": 1,
+ "of_value": 1,
+ "node.of_value": 2,
+ "of_value.transform": 1,
+ "If": 1,
+ "node.cond": 5,
+ "node.cond.transform": 5,
+ "node.then": 3,
+ "node.then.transform": 3,
+ "node.else": 5,
+ "node.else.transform": 3,
+ "Unless": 1,
+ "IfDef": 1,
+ "MultiAssign": 1,
+ "node.targets": 1,
+ "SimpleOr": 1,
+ "Def": 1,
+ "node.body": 12,
+ "node.body.transform": 10,
+ "receiver": 2,
+ "node.receiver": 4,
+ "receiver.transform": 2,
+ "block_arg": 2,
+ "block_arg.transform": 2,
+ "Macro": 1,
+ "PointerOf": 1,
+ "node.exp": 3,
+ "node.exp.transform": 3,
+ "SizeOf": 1,
+ "InstanceSizeOf": 1,
+ "IsA": 1,
+ "node.obj.transform": 5,
+ "node.const": 1,
+ "node.const.transform": 1,
+ "RespondsTo": 1,
+ "Case": 1,
+ "node.whens": 1,
+ "node_else": 1,
+ "node_else.transform": 1,
+ "When": 1,
+ "node.conds": 1,
+ "ImplicitObj": 1,
+ "ClassDef": 1,
+ "superclass": 1,
+ "node.superclass": 2,
+ "superclass.transform": 1,
+ "ModuleDef": 1,
+ "While": 1,
+ "Generic": 1,
+ "node.name": 5,
+ "node.name.transform": 5,
+ "node.type_vars": 1,
+ "ExceptionHandler": 1,
+ "node.rescues": 1,
+ "node_ensure": 1,
+ "node.ensure": 2,
+ "node_ensure.transform": 1,
+ "Rescue": 1,
+ "node.types": 2,
+ "Union": 1,
+ "Hierarchy": 1,
+ "Metaclass": 1,
+ "Arg": 1,
+ "default_value": 1,
+ "node.default_value": 2,
+ "default_value.transform": 1,
+ "restriction": 1,
+ "node.restriction": 2,
+ "restriction.transform": 1,
+ "BlockArg": 1,
+ "node.fun": 1,
+ "node.fun.transform": 1,
+ "Fun": 1,
+ "node.inputs": 1,
+ "output": 1,
+ "node.output": 2,
+ "output.transform": 1,
+ "Block": 1,
+ "node.args.map": 1,
+ "Var": 2,
+ "FunLiteral": 1,
+ "node.def.body": 1,
+ "node.def.body.transform": 1,
+ "FunPointer": 1,
+ "obj": 1,
+ "obj.transform": 1,
+ "Return": 1,
+ "node.exps": 5,
+ "Break": 1,
+ "Next": 1,
+ "Yield": 1,
+ "scope": 1,
+ "node.scope": 2,
+ "scope.transform": 1,
+ "Include": 1,
+ "Extend": 1,
+ "RangeLiteral": 1,
+ "node.from": 1,
+ "node.from.transform": 1,
+ "node.to": 2,
+ "node.to.transform": 2,
+ "Assign": 1,
+ "node.target": 1,
+ "node.target.transform": 1,
+ "node.value": 3,
+ "node.value.transform": 3,
+ "Nop": 1,
+ "NilLiteral": 1,
+ "BoolLiteral": 1,
+ "NumberLiteral": 1,
+ "CharLiteral": 1,
+ "StringLiteral": 1,
+ "SymbolLiteral": 1,
+ "RegexLiteral": 1,
+ "MetaVar": 1,
+ "InstanceVar": 1,
+ "ClassVar": 1,
+ "Global": 1,
+ "Require": 1,
+ "Path": 1,
+ "Self": 1,
+ "LibDef": 1,
+ "FunDef": 1,
+ "body": 1,
+ "body.transform": 1,
+ "TypeDef": 1,
+ "StructDef": 1,
+ "UnionDef": 1,
+ "EnumDef": 1,
+ "ExternalVar": 1,
+ "IndirectRead": 1,
+ "IndirectWrite": 1,
+ "TypeOf": 1,
+ "Primitive": 1,
+ "Not": 1,
+ "TypeFilteredNode": 1,
+ "TupleLiteral": 1,
+ "Cast": 1,
+ "DeclareVar": 1,
+ "node.var": 1,
+ "node.var.transform": 1,
+ "node.declared_type": 1,
+ "node.declared_type.transform": 1,
+ "Alias": 1,
+ "TupleIndexer": 1,
+ "Attribute": 1,
+ "exps.map": 1
+ },
"CSS": {
".clearfix": 8,
"{": 1661,
@@ -17197,6 +19538,160 @@
"but": 1,
"module.exports": 1
},
+ "E": {
+ "def": 24,
+ "makeVehicle": 3,
+ "(": 65,
+ "self": 1,
+ ")": 64,
+ "{": 57,
+ "vehicle": 2,
+ "to": 27,
+ "milesTillEmpty": 1,
+ "return": 19,
+ "self.milesPerGallon": 1,
+ "*": 1,
+ "self.getFuelRemaining": 1,
+ "}": 57,
+ "makeCar": 4,
+ "var": 6,
+ "fuelRemaining": 4,
+ "car": 8,
+ "extends": 2,
+ "milesPerGallon": 2,
+ "getFuelRemaining": 2,
+ "makeJet": 1,
+ "jet": 3,
+ "println": 2,
+ "The": 2,
+ "can": 1,
+ "go": 1,
+ "car.milesTillEmpty": 1,
+ "miles.": 1,
+ "name": 4,
+ "x": 3,
+ "y": 3,
+ "moveTo": 1,
+ "newX": 2,
+ "newY": 2,
+ "getX": 1,
+ "getY": 1,
+ "setName": 1,
+ "newName": 2,
+ "getName": 1,
+ "sportsCar": 1,
+ "sportsCar.moveTo": 1,
+ "sportsCar.getName": 1,
+ "is": 1,
+ "at": 1,
+ "X": 1,
+ "location": 1,
+ "sportsCar.getX": 1,
+ "makeVOCPair": 1,
+ "brandName": 3,
+ "String": 1,
+ "near": 6,
+ "myTempContents": 6,
+ "none": 2,
+ "brand": 5,
+ "__printOn": 4,
+ "out": 4,
+ "TextWriter": 4,
+ "void": 5,
+ "out.print": 4,
+ "ProveAuth": 2,
+ "<$brandName>": 3,
+ "prover": 1,
+ "getBrand": 4,
+ "coerce": 2,
+ "specimen": 2,
+ "optEjector": 3,
+ "sealedBox": 2,
+ "offerContent": 1,
+ "CheckAuth": 2,
+ "checker": 3,
+ "template": 1,
+ "match": 4,
+ "[": 10,
+ "get": 2,
+ "authList": 2,
+ "any": 2,
+ "]": 10,
+ "specimenBox": 2,
+ "null": 1,
+ "if": 2,
+ "specimenBox.__respondsTo": 1,
+ "specimenBox.offerContent": 1,
+ "else": 1,
+ "for": 3,
+ "auth": 3,
+ "in": 1,
+ "throw.eject": 1,
+ "Unmatched": 1,
+ "authorization": 1,
+ "__respondsTo": 2,
+ "_": 3,
+ "true": 1,
+ "false": 1,
+ "__getAllegedType": 1,
+ "null.__getAllegedType": 1,
+ "#File": 1,
+ "objects": 1,
+ "hardwired": 1,
+ "files": 1,
+ "file1": 1,
+ "": 1,
+ "file2": 1,
+ "": 1,
+ "#Using": 2,
+ "a": 4,
+ "variable": 1,
+ "file": 3,
+ "filePath": 2,
+ "file3": 1,
+ "": 1,
+ "single": 1,
+ "character": 1,
+ "specify": 1,
+ "Windows": 1,
+ "drive": 1,
+ "file4": 1,
+ "": 1,
+ "file5": 1,
+ "": 1,
+ "file6": 1,
+ "": 1,
+ "pragma.syntax": 1,
+ "send": 1,
+ "message": 4,
+ "when": 2,
+ "friend": 4,
+ "<-receive(message))>": 1,
+ "chatUI.showMessage": 4,
+ "catch": 2,
+ "prob": 2,
+ "receive": 1,
+ "receiveFriend": 2,
+ "friendRcvr": 2,
+ "bind": 2,
+ "save": 1,
+ "file.setText": 1,
+ "makeURIFromObject": 1,
+ "chatController": 2,
+ "load": 1,
+ "getObjectFromURI": 1,
+ "file.getText": 1,
+ "<": 1,
+ "-": 2,
+ "tempVow": 2,
+ "#...use": 1,
+ "#....": 1,
+ "report": 1,
+ "problem": 1,
+ "finally": 1,
+ "#....log": 1,
+ "event": 1
+ },
"Eagle": {
"": 2,
"version=": 4,
@@ -21398,6 +23893,165 @@
"scrCheckWaterTop": 1,
"global.temp3": 1
},
+ "GAMS": {
+ "*Basic": 1,
+ "example": 2,
+ "of": 7,
+ "transport": 5,
+ "model": 6,
+ "from": 2,
+ "GAMS": 5,
+ "library": 3,
+ "Title": 1,
+ "A": 3,
+ "Transportation": 1,
+ "Problem": 1,
+ "(": 22,
+ "TRNSPORT": 1,
+ "SEQ": 1,
+ ")": 22,
+ "Ontext": 1,
+ "This": 2,
+ "problem": 1,
+ "finds": 1,
+ "a": 3,
+ "least": 1,
+ "cost": 4,
+ "shipping": 1,
+ "schedule": 1,
+ "that": 1,
+ "meets": 1,
+ "requirements": 1,
+ "at": 5,
+ "markets": 2,
+ "and": 2,
+ "supplies": 1,
+ "factories.": 1,
+ "Dantzig": 1,
+ "G": 1,
+ "B": 1,
+ "Chapter": 2,
+ "In": 2,
+ "Linear": 1,
+ "Programming": 1,
+ "Extensions.": 1,
+ "Princeton": 2,
+ "University": 1,
+ "Press": 2,
+ "New": 1,
+ "Jersey": 1,
+ "formulation": 1,
+ "is": 1,
+ "described": 1,
+ "in": 10,
+ "detail": 1,
+ "Rosenthal": 1,
+ "R": 1,
+ "E": 1,
+ "Tutorial.": 1,
+ "User": 1,
+ "s": 1,
+ "Guide.": 1,
+ "The": 2,
+ "Scientific": 1,
+ "Redwood": 1,
+ "City": 1,
+ "California": 1,
+ "line": 1,
+ "numbers": 1,
+ "will": 1,
+ "not": 1,
+ "match": 1,
+ "those": 1,
+ "the": 1,
+ "book": 1,
+ "because": 1,
+ "these": 1,
+ "comments.": 1,
+ "Offtext": 1,
+ "Sets": 1,
+ "i": 18,
+ "canning": 1,
+ "plants": 1,
+ "/": 9,
+ "seattle": 3,
+ "san": 3,
+ "-": 6,
+ "diego": 3,
+ "j": 18,
+ "new": 3,
+ "york": 3,
+ "chicago": 3,
+ "topeka": 3,
+ ";": 15,
+ "Parameters": 1,
+ "capacity": 1,
+ "plant": 2,
+ "cases": 3,
+ "b": 2,
+ "demand": 4,
+ "market": 2,
+ "Table": 1,
+ "d": 2,
+ "distance": 1,
+ "thousands": 3,
+ "miles": 2,
+ "Scalar": 1,
+ "f": 2,
+ "freight": 1,
+ "dollars": 3,
+ "per": 3,
+ "case": 2,
+ "thousand": 1,
+ "/90/": 1,
+ "Parameter": 1,
+ "c": 3,
+ "*": 1,
+ "Variables": 1,
+ "x": 4,
+ "shipment": 1,
+ "quantities": 1,
+ "z": 3,
+ "total": 1,
+ "transportation": 1,
+ "costs": 1,
+ "Positive": 1,
+ "Variable": 1,
+ "Equations": 1,
+ "define": 1,
+ "objective": 1,
+ "function": 1,
+ "supply": 3,
+ "observe": 1,
+ "limit": 1,
+ "satisfy": 1,
+ "..": 3,
+ "e": 1,
+ "sum": 3,
+ "*x": 1,
+ "l": 1,
+ "g": 1,
+ "Model": 1,
+ "/all/": 1,
+ "Solve": 1,
+ "using": 1,
+ "lp": 1,
+ "minimizing": 1,
+ "Display": 1,
+ "x.l": 1,
+ "x.m": 1,
+ "ontext": 1,
+ "#user": 1,
+ "stuff": 1,
+ "Main": 1,
+ "topic": 1,
+ "Basic": 2,
+ "Featured": 4,
+ "item": 4,
+ "Trnsport": 1,
+ "Description": 1,
+ "offtext": 1
+ },
"GAP": {
"#############################################################################": 63,
"##": 766,
@@ -22614,14 +25268,14 @@
"////": 4,
"High": 1,
"quality": 2,
- "(": 386,
+ "(": 435,
"Some": 1,
"browsers": 1,
"may": 1,
"freeze": 1,
"or": 1,
"crash": 1,
- ")": 386,
+ ")": 435,
"//#define": 10,
"HIGHQUALITY": 2,
"Medium": 1,
@@ -22648,7 +25302,7 @@
"RAGGED_LEAVES": 5,
"DETAILED_NOISE": 3,
"LIGHT_AA": 3,
- "//": 36,
+ "//": 38,
"sample": 2,
"SSAA": 2,
"HEAVY_AA": 2,
@@ -22658,12 +25312,12 @@
"Configurations": 1,
"#ifdef": 14,
"#endif": 14,
- "const": 18,
- "float": 103,
+ "const": 19,
+ "float": 105,
"eps": 5,
"e": 4,
"-": 108,
- ";": 353,
+ ";": 383,
"PI": 3,
"vec3": 165,
"sunDir": 5,
@@ -22682,13 +25336,13 @@
"tonemapping": 1,
"mod289": 4,
"x": 11,
- "{": 61,
+ "{": 82,
"return": 47,
"floor": 8,
"*": 115,
"/": 24,
- "}": 61,
- "vec4": 72,
+ "}": 82,
+ "vec4": 73,
"permute": 4,
"x*34.0": 1,
"+": 108,
@@ -22889,7 +25543,7 @@
"shadow": 4,
"taken": 1,
"for": 7,
- "int": 7,
+ "int": 8,
"rayDir*t": 2,
"res": 6,
"res.x": 3,
@@ -22992,8 +25646,8 @@
"iResolution.x/iResolution.y*0.5": 1,
"rd.x": 1,
"rd.y": 1,
- "void": 5,
- "main": 3,
+ "void": 31,
+ "main": 5,
"gl_FragCoord.xy": 7,
"*0.25": 4,
"*0.5": 1,
@@ -23005,7 +25659,38 @@
"col*exposure": 1,
"x*": 2,
".5": 1,
- "gl_FragColor": 2,
+ "gl_FragColor": 3,
+ "#version": 2,
+ "core": 1,
+ "cbar": 2,
+ "cfoo": 1,
+ "CB": 2,
+ "CD": 2,
+ "CA": 1,
+ "CC": 1,
+ "CBT": 5,
+ "CDT": 3,
+ "CAT": 1,
+ "CCT": 1,
+ "norA": 4,
+ "norB": 3,
+ "norC": 1,
+ "norD": 1,
+ "norE": 4,
+ "norF": 1,
+ "norG": 1,
+ "norH": 1,
+ "norI": 1,
+ "norcA": 2,
+ "norcB": 3,
+ "norcC": 2,
+ "norcD": 2,
+ "head": 1,
+ "of": 1,
+ "cycle": 2,
+ "norcE": 1,
+ "lead": 1,
+ "into": 1,
"NUM_LIGHTS": 4,
"AMBIENT": 2,
"MAX_DIST": 3,
@@ -23014,7 +25699,7 @@
"lightColor": 3,
"[": 29,
"]": 29,
- "varying": 3,
+ "varying": 4,
"fragmentNormal": 2,
"cameraVector": 2,
"lightVector": 4,
@@ -23042,7 +25727,11 @@
"specularDot": 2,
"sample.rgb": 1,
"sample.a": 1,
- "#version": 1,
+ "static": 1,
+ "char*": 1,
+ "SimpleFragmentShader": 1,
+ "STRINGIFY": 1,
+ "FrontColor": 2,
"kCoeff": 2,
"kCube": 2,
"uShift": 3,
@@ -24078,7 +26767,7 @@
"echoDirListViaAntBuilder": 1,
"(": 7,
")": 7,
- "{": 3,
+ "{": 9,
"description": 1,
"//Docs": 1,
"http": 1,
@@ -24106,7 +26795,7 @@
"ant.fileScanner": 1,
"fileset": 1,
"dir": 1,
- "}": 3,
+ "}": 9,
".each": 1,
"//Print": 1,
"each": 1,
@@ -24117,10 +26806,16 @@
"CWD": 1,
"projectDir": 1,
"removed.": 1,
- "println": 2,
+ "println": 3,
"it.toString": 1,
"-": 1,
- "SHEBANG#!groovy": 1
+ "SHEBANG#!groovy": 2,
+ "html": 3,
+ "head": 2,
+ "component": 1,
+ "title": 2,
+ "body": 1,
+ "p": 1
},
"Groovy Server Pages": {
"": 4,
@@ -24189,6 +26884,283 @@
"": 1,
"/each": 1
},
+ "Haskell": {
+ "import": 6,
+ "Data.Char": 1,
+ "main": 4,
+ "IO": 2,
+ "(": 8,
+ ")": 8,
+ "do": 3,
+ "let": 2,
+ "hello": 2,
+ "putStrLn": 3,
+ "map": 13,
+ "toUpper": 1,
+ "module": 2,
+ "Main": 1,
+ "where": 4,
+ "Sudoku": 9,
+ "Data.Maybe": 2,
+ "sudoku": 36,
+ "[": 4,
+ "]": 3,
+ "pPrint": 5,
+ "+": 2,
+ "fromMaybe": 1,
+ "solve": 5,
+ "isSolved": 4,
+ "Data.List": 1,
+ "Data.List.Split": 1,
+ "type": 1,
+ "Int": 1,
+ "-": 3,
+ "Maybe": 1,
+ "|": 8,
+ "Just": 1,
+ "otherwise": 2,
+ "index": 27,
+ "<": 1,
+ "elemIndex": 1,
+ "sudokus": 2,
+ "nextTest": 5,
+ "i": 7,
+ "<->": 1,
+ "1": 2,
+ "9": 7,
+ "checkRow": 2,
+ "checkColumn": 2,
+ "checkBox": 2,
+ "listToMaybe": 1,
+ "mapMaybe": 1,
+ "take": 1,
+ "drop": 1,
+ "length": 12,
+ "getRow": 3,
+ "nub": 6,
+ "getColumn": 3,
+ "getBox": 3,
+ "filter": 3,
+ "0": 3,
+ "chunksOf": 10,
+ "quot": 3,
+ "transpose": 4,
+ "mod": 2,
+ "concat": 2,
+ "concatMap": 2,
+ "3": 4,
+ "27": 1,
+ "Bool": 1,
+ "product": 1,
+ "False": 4,
+ ".": 4,
+ "sudokuRows": 4,
+ "/": 3,
+ "sudokuColumns": 3,
+ "sudokuBoxes": 3,
+ "True": 1,
+ "String": 1,
+ "intercalate": 2,
+ "show": 1
+ },
+ "HTML": {
+ "": 2,
+ "HTML": 2,
+ "PUBLIC": 2,
+ "W3C": 2,
+ "DTD": 3,
+ "4": 1,
+ "0": 2,
+ "Frameset": 1,
+ "EN": 2,
+ "http": 3,
+ "www": 2,
+ "w3": 2,
+ "org": 2,
+ "TR": 2,
+ "REC": 1,
+ "html40": 1,
+ "frameset": 1,
+ "dtd": 2,
+ "": 2,
+ "": 2,
+ "Common_meta": 1,
+ "(": 14,
+ ")": 14,
+ "": 2,
+ "Android": 5,
+ "API": 7,
+ "Differences": 2,
+ "Report": 2,
+ " ": 2,
+ "": 2,
+ "": 10,
+ "class=": 22,
+ "Header": 1,
+ "
": 1,
+ " ": 1,
+ "
": 3,
+ "This": 1,
+ "document": 1,
+ "details": 1,
+ "the": 11,
+ "changes": 2,
+ "in": 4,
+ "framework": 2,
+ "API.": 3,
+ "It": 2,
+ "shows": 1,
+ "additions": 1,
+ "modifications": 1,
+ "and": 5,
+ "removals": 2,
+ "for": 2,
+ "packages": 1,
+ "classes": 1,
+ "methods": 1,
+ "fields.": 1,
+ "Each": 1,
+ "reference": 1,
+ "to": 3,
+ "an": 3,
+ "change": 2,
+ "includes": 1,
+ "a": 4,
+ "brief": 1,
+ "description": 1,
+ "of": 5,
+ "explanation": 1,
+ "suggested": 1,
+ "workaround": 1,
+ "where": 1,
+ "available.": 1,
+ "
": 3,
+ "The": 2,
+ "differences": 2,
+ "described": 1,
+ "this": 2,
+ "report": 1,
+ "are": 3,
+ "based": 1,
+ "comparison": 1,
+ "APIs": 1,
+ "whose": 1,
+ "versions": 1,
+ "specified": 1,
+ "upper": 1,
+ "-": 1,
+ "right": 1,
+ "corner": 1,
+ "page.": 1,
+ "compares": 1,
+ "newer": 1,
+ "older": 2,
+ "version": 1,
+ "noting": 1,
+ "any": 1,
+ "relative": 1,
+ "So": 1,
+ "example": 1,
+ "indicated": 1,
+ "no": 1,
+ "longer": 1,
+ "present": 1,
+ "For": 1,
+ "more": 1,
+ "information": 1,
+ "about": 1,
+ "SDK": 1,
+ "see": 1,
+ "
": 8,
+ "href=": 9,
+ "target=": 3,
+ "product": 1,
+ "site": 1,
+ " ": 8,
+ ".": 1,
+ "if": 4,
+ "no_delta": 1,
+ "
": 1,
+ "Congratulation": 1,
+ " ": 1,
+ "No": 1,
+ "were": 1,
+ "detected": 1,
+ "between": 1,
+ "two": 1,
+ "provided": 1,
+ "APIs.": 1,
+ "endif": 4,
+ "removed_packages": 2,
+ "Table": 3,
+ "name": 3,
+ "rows": 3,
+ "{": 3,
+ "it.from": 1,
+ "ModelElementRow": 1,
+ "}": 3,
+ "
": 3,
+ "added_packages": 2,
+ "it.to": 2,
+ "PackageAddedLink": 1,
+ "SimpleTableRow": 2,
+ "changed_packages": 2,
+ "PackageChangedLink": 1,
+ "
": 11,
+ "": 2,
+ "": 2,
+ "html": 1,
+ "XHTML": 1,
+ "1": 1,
+ "Transitional": 1,
+ "xhtml1": 2,
+ "transitional": 1,
+ "xmlns=": 1,
+ " ": 1,
+ "equiv=": 1,
+ "content=": 1,
+ "Related": 2,
+ "Pages": 2,
+ " ": 1,
+ "rel=": 1,
+ "type=": 1,
+ "": 1,
+ "Main": 1,
+ "Page": 1,
+ "&": 3,
+ "middot": 3,
+ ";": 3,
+ "Class": 2,
+ "Overview": 2,
+ "Hierarchy": 1,
+ "All": 1,
+ "Classes": 1,
+ "Here": 1,
+ "is": 1,
+ "list": 1,
+ "all": 1,
+ "related": 1,
+ "documentation": 1,
+ "pages": 1,
+ "": 1,
+ "": 2,
+ "id=": 2,
+ "": 4,
+ " ": 2,
+ "src=": 2,
+ "alt=": 2,
+ "width=": 1,
+ "height=": 2,
+ " ": 4,
+ " ": 2,
+ "16": 1,
+ "Layout": 1,
+ "System": 1,
+ "
": 1,
+ "Generated": 1,
+ "with": 1,
+ "Doxygen": 1
+ },
"Hy": {
";": 4,
"Fibonacci": 1,
@@ -24423,6 +27395,57 @@
"[": 1,
"]": 1
},
+ "Inform 7": {
+ "by": 3,
+ "Andrew": 3,
+ "Plotkin.": 2,
+ "Include": 1,
+ "Trivial": 3,
+ "Extension": 3,
+ "The": 1,
+ "Kitchen": 1,
+ "is": 4,
+ "a": 2,
+ "room.": 1,
+ "[": 1,
+ "This": 1,
+ "kitchen": 1,
+ "modelled": 1,
+ "after": 1,
+ "the": 4,
+ "one": 1,
+ "in": 2,
+ "Zork": 1,
+ "although": 1,
+ "it": 1,
+ "lacks": 1,
+ "detail": 1,
+ "to": 2,
+ "establish": 1,
+ "this": 1,
+ "player.": 1,
+ "]": 1,
+ "A": 3,
+ "purple": 1,
+ "cow": 3,
+ "called": 1,
+ "Gelett": 2,
+ "Kitchen.": 1,
+ "Instead": 1,
+ "of": 3,
+ "examining": 1,
+ "say": 1,
+ "Version": 1,
+ "Plotkin": 1,
+ "begins": 1,
+ "here.": 2,
+ "kind": 1,
+ "animal.": 1,
+ "can": 1,
+ "be": 1,
+ "purple.": 1,
+ "ends": 1
+ },
"INI": {
";": 1,
"editorconfig.org": 1,
@@ -24452,6 +27475,87 @@
"SHEBANG#!ioke": 1,
"println": 1
},
+ "Isabelle": {
+ "theory": 1,
+ "HelloWorld": 3,
+ "imports": 1,
+ "Main": 1,
+ "begin": 1,
+ "section": 1,
+ "{": 5,
+ "*Playing": 1,
+ "around": 1,
+ "with": 2,
+ "Isabelle*": 1,
+ "}": 5,
+ "text": 4,
+ "*": 4,
+ "creating": 1,
+ "a": 2,
+ "lemma": 2,
+ "the": 2,
+ "name": 1,
+ "hello_world*": 1,
+ "hello_world": 2,
+ "by": 9,
+ "simp": 8,
+ "thm": 1,
+ "defining": 1,
+ "string": 1,
+ "constant": 1,
+ "definition": 1,
+ "where": 1,
+ "theorem": 2,
+ "(": 5,
+ "fact": 1,
+ "List.rev_rev_ident": 4,
+ ")": 5,
+ "*now": 1,
+ "we": 1,
+ "delete": 1,
+ "already": 1,
+ "proven": 1,
+ "lema": 1,
+ "and": 1,
+ "show": 2,
+ "it": 2,
+ "hand*": 1,
+ "declare": 1,
+ "[": 1,
+ "del": 1,
+ "]": 1,
+ "hide_fact": 1,
+ "corollary": 2,
+ "apply": 1,
+ "add": 1,
+ "HelloWorld_def": 1,
+ "done": 1,
+ "*does": 1,
+ "hold": 1,
+ "in": 1,
+ "general": 1,
+ "rev_rev_ident": 2,
+ "proof": 1,
+ "induction": 1,
+ "l": 2,
+ "case": 3,
+ "Nil": 1,
+ "thus": 1,
+ "next": 1,
+ "Cons": 1,
+ "ls": 1,
+ "assume": 1,
+ "IH": 2,
+ "have": 2,
+ "hence": 1,
+ "also": 1,
+ "finally": 1,
+ "using": 1,
+ "qed": 1,
+ "fastforce": 1,
+ "intro": 1,
+ "end": 1
+ },
"Jade": {
"p.": 1,
"Hello": 1,
@@ -25395,15 +28499,15 @@
".internalBuildGeneratedFileFrom": 1
},
"JavaScript": {
- "function": 1210,
- "(": 8513,
- ")": 8521,
- "{": 2736,
- ";": 4052,
+ "function": 1214,
+ "(": 8528,
+ ")": 8536,
+ "{": 2742,
+ ";": 4066,
"//": 410,
"jshint": 1,
"_": 9,
- "var": 910,
+ "var": 916,
"Modal": 2,
"content": 5,
"options": 56,
@@ -25413,15 +28517,15 @@
".delegate": 2,
".proxy": 1,
"this.hide": 1,
- "this": 577,
- "}": 2712,
+ "this": 578,
+ "}": 2718,
"Modal.prototype": 1,
"constructor": 8,
"toggle": 10,
- "return": 944,
- "[": 1459,
+ "return": 947,
+ "[": 1461,
"this.isShown": 3,
- "]": 1456,
+ "]": 1458,
"show": 10,
"that": 33,
"e": 663,
@@ -25449,7 +28553,7 @@
"hide": 8,
"body": 22,
"modal": 4,
- "-": 705,
+ "-": 706,
"open": 2,
"fade": 4,
"hidden": 12,
@@ -25496,7 +28600,7 @@
"Animal.prototype.move": 2,
"meters": 4,
"alert": 11,
- "+": 1135,
+ "+": 1136,
"Snake.__super__.constructor.apply": 2,
"arguments": 83,
"Snake.prototype.move": 2,
@@ -25513,6 +28617,25 @@
"Snake.name": 1,
"Horse.name": 1,
"console.log": 3,
+ "hanaMath": 1,
+ ".import": 1,
+ "x": 41,
+ "parseFloat": 32,
+ ".request.parameters.get": 2,
+ "y": 109,
+ "result": 12,
+ "hanaMath.multiply": 1,
+ "output": 2,
+ "title": 1,
+ "input": 26,
+ ".response.contentType": 1,
+ ".response.statusCode": 1,
+ ".net.http.OK": 1,
+ ".response.setBody": 1,
+ "JSON.stringify": 5,
+ "multiply": 1,
+ "*": 71,
+ "add": 16,
"util": 1,
"require": 9,
"net": 1,
@@ -25531,7 +28654,6 @@
"debug": 15,
"process.env.NODE_DEBUG": 2,
"/http/.test": 1,
- "x": 33,
"console.error": 3,
"else": 307,
"parserOnHeaders": 2,
@@ -26036,7 +29158,6 @@
"incoming.shift": 2,
"serverSocketCloseListener": 3,
"socket.setTimeout": 1,
- "*": 70,
"minute": 1,
"timeout": 2,
"socket.once": 1,
@@ -26109,6 +29230,12 @@
"_results.push": 2,
"math.cube": 2,
".slice": 6,
+ "window": 18,
+ "angular": 1,
+ "Array.prototype.last": 1,
+ "this.length": 41,
+ "app": 3,
+ "angular.module": 1,
"A": 24,
"w": 110,
"ma": 3,
@@ -26247,7 +29374,6 @@
"c.prototype": 1,
"init": 7,
"this.context": 17,
- "this.length": 40,
"s.body": 2,
"this.selector": 16,
"Ta.exec": 1,
@@ -26509,7 +29635,6 @@
"style/": 1,
"ab": 1,
"button": 24,
- "input": 25,
"/i": 22,
"bb": 2,
"select": 20,
@@ -26676,7 +29801,6 @@
"q": 34,
"h.nodeType": 4,
"p": 110,
- "y": 101,
"S": 8,
"H": 8,
"M": 9,
@@ -26808,7 +29932,6 @@
"scrollTo": 1,
"CSS1Compat": 1,
"client": 3,
- "window": 16,
"document": 26,
"window.document": 2,
"navigator": 3,
@@ -27331,7 +30454,6 @@
"exposing": 2,
"metadata": 2,
"plain": 2,
- "JSON.stringify": 4,
".toJSON": 4,
"jQuery.noop": 2,
"An": 1,
@@ -27404,7 +30526,6 @@
"rmultiDash": 3,
".toLowerCase": 7,
"jQuery.isNaN": 1,
- "parseFloat": 30,
"rbrace.test": 2,
"jQuery.parseJSON": 2,
"isn": 2,
@@ -27946,7 +31067,6 @@
"f.inArray": 4,
"s.": 1,
"f.event": 2,
- "add": 15,
"d.handler": 1,
"g.handler": 1,
"d.guid": 4,
@@ -28029,7 +31149,6 @@
"preventDefault": 4,
"stopPropagation": 5,
"isImmediatePropagationStopped": 2,
- "result": 9,
"props": 21,
"split": 4,
"fix": 1,
@@ -28462,7 +31581,6 @@
"week": 1,
"bK": 1,
"about": 1,
- "app": 2,
"storage": 1,
"extension": 1,
"widget": 1,
@@ -29641,6 +32759,7 @@
"js": 1,
"classes.join": 1,
"this.document": 1,
+ "window.angular": 1,
"PEG.parser": 1,
"quote": 3,
"result0": 264,
@@ -31615,6 +34734,14 @@
"end": 3,
"return": 1
},
+ "Kit": {
+ "": 1,
+ "": 1,
+ " ": 1,
+ "": 1,
+ "
": 1,
+ " ": 1
+ },
"Kotlin": {
"package": 1,
"addressbook": 1,
@@ -32565,6 +35692,257 @@
"separate": 2,
"COUNT": 2
},
+ "Latte": {
+ "{": 54,
+ "**": 1,
+ "*": 4,
+ "@param": 3,
+ "string": 2,
+ "basePath": 1,
+ "web": 1,
+ "base": 1,
+ "path": 1,
+ "robots": 2,
+ "tell": 1,
+ "how": 1,
+ "to": 2,
+ "index": 1,
+ "the": 1,
+ "content": 1,
+ "of": 3,
+ "a": 4,
+ "page": 1,
+ "(": 18,
+ "optional": 1,
+ ")": 18,
+ "array": 1,
+ "flashes": 1,
+ "flash": 3,
+ "messages": 1,
+ "}": 54,
+ "": 1,
+ "html": 1,
+ "": 1,
+ "": 1,
+ " ": 6,
+ "charset=": 1,
+ "name=": 4,
+ "content=": 5,
+ "n": 8,
+ "ifset=": 1,
+ "http": 1,
+ "equiv=": 1,
+ "": 1,
+ "ifset": 1,
+ "title": 4,
+ "/ifset": 1,
+ "Translation": 1,
+ "report": 1,
+ " ": 1,
+ " ": 2,
+ "rel=": 2,
+ "media=": 1,
+ "href=": 4,
+ "": 3,
+ "block": 3,
+ "#head": 1,
+ "/block": 3,
+ "": 1,
+ "": 1,
+ "class=": 12,
+ "document.documentElement.className": 1,
+ "+": 3,
+ "#navbar": 1,
+ "include": 3,
+ "_navbar.latte": 1,
+ "": 6,
+ "inner": 1,
+ "foreach=": 3,
+ "_flash.latte": 1,
+ "
": 7,
+ "#content": 1,
+ "": 1,
+ "src=": 1,
+ "#scripts": 1,
+ "": 1,
+ "": 1,
+ "var": 3,
+ "define": 1,
+ "author": 7,
+ "": 2,
+ "Author": 2,
+ "authorId": 2,
+ "-": 71,
+ "id": 3,
+ "black": 2,
+ "avatar": 2,
+ "img": 2,
+ "rounded": 2,
+ "class": 2,
+ "tooltip": 4,
+ "Total": 1,
+ "time": 4,
+ "shortName": 1,
+ "translated": 4,
+ "on": 5,
+ "all": 1,
+ "videos.": 1,
+ "amaraCallbackLink": 1,
+ "row": 2,
+ "col": 3,
+ "md": 2,
+ "outOf": 5,
+ "done": 7,
+ "threshold": 4,
+ "alert": 2,
+ "warning": 2,
+ "<=>": 2,
+ "Seems": 1,
+ "complete": 1,
+ "|": 6,
+ "out": 1,
+ "
": 2,
+ "elseif": 2,
+ "<": 1,
+ "p": 1,
+ "if": 7,
+ "Although": 1,
+ "is": 1,
+ "there": 1,
+ "are": 1,
+ "no": 1,
+ "English": 1,
+ "subtitles": 1,
+ "for": 1,
+ "comparison.": 1,
+ "/if": 8,
+ "/cache": 1,
+ "editor": 1,
+ "ksid": 2,
+ "new": 5,
+ "video": 2,
+ "siteId": 1,
+ "Video": 1,
+ "khanovaskola.cz": 1,
+ "revision": 18,
+ "rev": 4,
+ "this": 3,
+ "older": 1,
+ "#": 2,
+ "else": 2,
+ "newer": 1,
+ "": 1,
+ "": 1,
+ "diffs": 3,
+ "noescape": 2,
+ " ": 1,
+ "description": 1,
+ "text": 4,
+ "as": 2,
+ "line": 3,
+ "context": 1,
+ "splitter": 1,
+ "template": 1,
+ "bottom": 1,
+ "Expand": 1,
+ "fa": 16,
+ "sort": 1,
+ "ellipsis": 1,
+ "h": 1,
+ "success": 1,
+ "amaraEdit": 1,
+ "amaraId": 2,
+ "editButton": 1,
+ "btn": 17,
+ "default": 6,
+ "edit": 1,
+ "khanAcademy": 1,
+ "kaButton": 1,
+ "link": 1,
+ "info": 1,
+ "group": 4,
+ "approve": 1,
+ "thumbs": 3,
+ "up": 1,
+ "markIncomplete": 2,
+ "down": 2,
+ "redirectToAdd": 1,
+ "plus": 1,
+ "square": 1,
+ "table": 2,
+ "condensed": 1,
+ "revisions": 1,
+ "revId": 1,
+ "secondary": 2,
+ "Percent": 1,
+ "lines": 1,
+ "&": 1,
+ "thinsp": 1,
+ "%": 1,
+ "": 3,
+ "": 3,
+ "": 2,
+ "incomplete": 3,
+ "approved": 2,
+ "": 1,
+ "user": 1,
+ "loggedIn": 1,
+ "&&": 1,
+ "comments": 2,
+ "count": 1,
+ "": 2,
+ "": 2,
+ "colspan=": 1,
+ "": 1,
+ "comment": 4,
+ "left": 1,
+ "createdAt": 1,
+ "timeAgo": 1,
+ "noborder": 1,
+ "input": 3,
+ "form": 1,
+ "control": 1,
+ "Comment": 1,
+ "only": 1,
+ "visible": 1,
+ "other": 1,
+ "editors": 1,
+ "save": 1,
+ "share": 1,
+ "": 1,
+ "": 1,
+ "/form": 1,
+ "/foreach": 1,
+ "
": 1
+ },
"Less": {
"@blue": 4,
"#3bbfce": 1,
@@ -32919,6 +36297,173 @@
"info": 1,
"reproduce": 1
},
+ "Liquid": {
+ "": 1,
+ "html": 1,
+ "PUBLIC": 1,
+ "W3C": 1,
+ "DTD": 2,
+ "XHTML": 1,
+ "1": 1,
+ "0": 1,
+ "Transitional": 1,
+ "EN": 1,
+ "http": 2,
+ "www": 1,
+ "w3": 1,
+ "org": 1,
+ "TR": 1,
+ "xhtml1": 2,
+ "transitional": 1,
+ "dtd": 1,
+ "": 1,
+ "xmlns=": 1,
+ "xml": 1,
+ "lang=": 2,
+ "": 1,
+ " ": 1,
+ "equiv=": 1,
+ "content=": 1,
+ "": 1,
+ "{": 89,
+ "shop.name": 2,
+ "}": 89,
+ "-": 4,
+ "page_title": 1,
+ " ": 1,
+ "|": 31,
+ "global_asset_url": 5,
+ "stylesheet_tag": 3,
+ "script_tag": 5,
+ "shopify_asset_url": 1,
+ "asset_url": 2,
+ "content_for_header": 1,
+ "": 1,
+ "": 1,
+ "id=": 28,
+ "": 1,
+ "class=": 14,
+ "": 9,
+ "href=": 9,
+ "Skip": 1,
+ "to": 1,
+ "navigation.": 1,
+ " ": 9,
+ "
": 1,
+ "%": 46,
+ "if": 5,
+ "cart.item_count": 7,
+ "": 23,
+ "style=": 5,
+ "
": 3,
+ "There": 1,
+ "pluralize": 3,
+ "in": 8,
+ "title=": 3,
+ "your": 1,
+ "cart": 1,
+ " ": 3,
+ "
": 1,
+ "Your": 1,
+ "subtotal": 1,
+ "is": 1,
+ "cart.total_price": 2,
+ "money": 5,
+ ".": 3,
+ " ": 1,
+ "for": 6,
+ "item": 1,
+ "cart.items": 1,
+ "onMouseover=": 2,
+ "onMouseout=": 2,
+ "
": 4,
+ "src=": 5,
+ "
": 23,
+ "endfor": 6,
+ " ": 2,
+ "endif": 5,
+ "": 1,
+ " ": 1,
+ "onclick=": 1,
+ "View": 1,
+ "Mini": 1,
+ "Cart": 1,
+ "(": 1,
+ ")": 1,
+ " ": 3,
+ "content_for_layout": 1,
+ "": 5,
+ "link": 2,
+ "linklists.main": 1,
+ "menu.links": 1,
+ "": 5,
+ "link.title": 2,
+ "link_to": 2,
+ "link.url": 2,
+ " ": 5,
+ " ": 5,
+ "tags": 1,
+ "tag": 4,
+ "collection.tags": 1,
+ "": 1,
+ "link_to_add_tag": 1,
+ " ": 1,
+ "highlight_active_tag": 1,
+ "link_to_tag": 1,
+ "linklists.footer.links": 1,
+ "All": 1,
+ "prices": 1,
+ "are": 1,
+ "shop.currency": 1,
+ "Powered": 1,
+ "by": 1,
+ "Shopify": 1,
+ "": 1,
+ "": 1,
+ "": 1,
+ "We": 1,
+ "have": 1,
+ "wonderful": 1,
+ "products": 1,
+ " ": 1,
+ "image": 1,
+ "product.images": 1,
+ "forloop.first": 1,
+ "rel=": 2,
+ "alt=": 2,
+ "else": 1,
+ "product.title": 1,
+ "Vendor": 1,
+ "product.vendor": 1,
+ "link_to_vendor": 1,
+ "Type": 1,
+ "product.type": 1,
+ "link_to_type": 1,
+ "": 1,
+ "product.price_min": 1,
+ "product.price_varies": 1,
+ "product.price_max": 1,
+ " ": 1,
+ "": 1,
+ "product.description": 1,
+ "": 1
+ },
"Literate Agda": {
"documentclass": 1,
"{": 35,
@@ -35887,22 +39432,142 @@
},
"Mathematica": {
"Get": 1,
- "[": 74,
- "]": 73,
+ "[": 307,
+ "]": 286,
+ "Notebook": 2,
+ "{": 227,
+ "Cell": 28,
+ "CellGroupData": 8,
+ "BoxData": 19,
+ "RowBox": 34,
+ "}": 222,
+ "CellChangeTimes": 13,
+ "-": 134,
+ "*": 19,
+ "SuperscriptBox": 1,
+ "MultilineFunction": 1,
+ "None": 8,
+ "Open": 7,
+ "NumberMarks": 3,
+ "False": 19,
+ "GraphicsBox": 2,
+ "Hue": 5,
+ "LineBox": 5,
+ "CompressedData": 9,
+ "AspectRatio": 1,
+ "NCache": 1,
+ "GoldenRatio": 1,
+ "(": 2,
+ ")": 1,
+ "Axes": 1,
+ "True": 7,
+ "AxesLabel": 1,
+ "AxesOrigin": 1,
+ "Method": 2,
+ "PlotRange": 1,
+ "PlotRangeClipping": 1,
+ "PlotRangePadding": 1,
+ "Scaled": 10,
+ "WindowSize": 1,
+ "WindowMargins": 1,
+ "Automatic": 9,
+ "FrontEndVersion": 1,
+ "StyleDefinitions": 1,
+ "NamespaceBox": 1,
+ "DynamicModuleBox": 1,
+ "Typeset": 7,
+ "q": 1,
+ "opts": 1,
+ "AppearanceElements": 1,
+ "Asynchronous": 1,
+ "All": 1,
+ "TimeConstraint": 1,
+ "elements": 1,
+ "pod1": 1,
+ "XMLElement": 13,
+ "FormBox": 4,
+ "TagBox": 9,
+ "GridBox": 2,
+ "PaneBox": 1,
+ "StyleBox": 4,
+ "CellContext": 5,
+ "TagBoxWrapper": 4,
+ "AstronomicalData": 1,
+ "Identity": 2,
+ "LineIndent": 4,
+ "LineSpacing": 2,
+ "GridBoxBackground": 1,
+ "GrayLevel": 17,
+ "GridBoxItemSize": 2,
+ "ColumnsEqual": 2,
+ "RowsEqual": 2,
+ "GridBoxDividers": 1,
+ "GridBoxSpacings": 2,
+ "GridBoxAlignment": 1,
+ "Left": 1,
+ "Baseline": 1,
+ "AllowScriptLevelChange": 2,
+ "BaselinePosition": 2,
+ "Center": 1,
+ "AbsoluteThickness": 3,
+ "TraditionalForm": 3,
+ "PolynomialForm": 1,
+ "#": 2,
+ "TraditionalOrder": 1,
+ "&": 2,
+ "pod2": 1,
+ "LinebreakAdjustments": 2,
+ "FontFamily": 1,
+ "UnitFontFamily": 1,
+ "FontSize": 1,
+ "Smaller": 1,
+ "StripOnInput": 1,
+ "SyntaxForm": 2,
+ "Dot": 2,
+ "ZeroWidthTimes": 1,
+ "pod3": 1,
+ "TemplateBox": 1,
+ "GraphicsComplexBox": 1,
+ "EdgeForm": 2,
+ "Directive": 5,
+ "Opacity": 2,
+ "GraphicsGroupBox": 2,
+ "PolygonBox": 3,
+ "RGBColor": 3,
+ "Dashing": 1,
+ "Small": 1,
+ "GridLines": 1,
+ "Dynamic": 1,
+ "Join": 1,
+ "Replace": 1,
+ "MousePosition": 1,
+ "Graphics": 1,
+ "Pattern": 2,
+ "CalculateUtilities": 5,
+ "GraphicsUtilities": 5,
+ "Private": 5,
+ "x": 2,
+ "Blank": 2,
+ "y": 2,
+ "Epilog": 1,
+ "CapForm": 1,
+ "Offset": 8,
+ "DynamicBox": 1,
+ "ToBoxes": 1,
+ "DynamicModule": 1,
+ "pt": 1,
+ "NearestFunction": 1,
"Paclet": 1,
"Name": 1,
- "-": 8,
"Version": 1,
"MathematicaVersion": 1,
"Description": 1,
"Creator": 1,
"Extensions": 1,
- "{": 2,
"Language": 1,
"MainPage": 1,
- "}": 2,
"BeginPackage": 1,
- ";": 41,
+ ";": 42,
"PossiblyTrueQ": 3,
"usage": 22,
"PossiblyFalseQ": 2,
@@ -35936,13 +39601,11 @@
"L_": 5,
"Fold": 3,
"Or": 1,
- "False": 4,
"cond": 4,
"/@": 3,
"L": 4,
"Flatten": 1,
"And": 4,
- "True": 2,
"SHEBANG#!#!=": 1,
"n_": 5,
"Im": 1,
@@ -35961,7 +39624,16 @@
"a": 3,
"Symbol": 2,
"NumericQ": 1,
- "EndPackage": 1
+ "EndPackage": 1,
+ "Do": 1,
+ "If": 1,
+ "Length": 1,
+ "Divisors": 1,
+ "Binomial": 2,
+ "i": 3,
+ "+": 2,
+ "Print": 1,
+ "Break": 1
},
"Matlab": {
"function": 34,
@@ -40335,39 +44007,507 @@
"c": 1
},
"Moocode": {
- "@program": 2,
+ "@program": 29,
"toy": 3,
"wind": 1,
"this.wound": 8,
- "+": 1,
- ";": 8,
- "player": 1,
+ "+": 39,
+ ";": 505,
+ "player": 2,
"tell": 1,
- "(": 13,
+ "(": 600,
"this.name": 4,
- ")": 13,
+ ")": 593,
"player.location": 1,
"announce": 1,
"player.name": 1,
- ".": 2,
+ ".": 30,
+ "while": 15,
+ "read": 1,
+ "endwhile": 14,
+ "I": 1,
+ "M": 1,
+ "P": 1,
+ "O": 1,
+ "R": 1,
+ "T": 2,
+ "A": 1,
+ "N": 1,
+ "The": 2,
+ "following": 2,
+ "code": 43,
+ "cannot": 1,
+ "be": 1,
+ "used": 1,
+ "as": 28,
+ "is.": 1,
+ "You": 1,
+ "will": 1,
+ "need": 1,
+ "to": 1,
+ "rewrite": 1,
+ "functionality": 1,
+ "that": 3,
+ "is": 6,
+ "not": 2,
+ "present": 1,
+ "in": 43,
+ "your": 1,
+ "server/core.": 1,
+ "most": 1,
+ "straight": 1,
+ "-": 98,
+ "forward": 1,
+ "target": 7,
+ "other": 1,
+ "than": 1,
+ "Stunt/Improvise": 1,
+ "a": 12,
+ "server/core": 1,
+ "provides": 1,
+ "map": 5,
+ "datatype": 1,
+ "and": 1,
+ "anonymous": 1,
+ "objects.": 1,
+ "Installation": 1,
+ "my": 1,
+ "server": 1,
+ "uses": 1,
+ "the": 4,
+ "object": 1,
+ "numbers": 1,
+ "#36819": 1,
+ "MOOcode": 4,
+ "Experimental": 2,
+ "Language": 2,
+ "Package": 2,
+ "#36820": 1,
+ "Changelog": 1,
+ "#36821": 1,
+ "Dictionary": 1,
+ "#36822": 1,
+ "Compiler": 2,
+ "#38128": 1,
+ "Syntax": 4,
+ "Tree": 1,
+ "Pretty": 1,
+ "Printer": 1,
+ "#37644": 1,
+ "Tokenizer": 2,
+ "Prototype": 25,
+ "#37645": 1,
+ "Parser": 2,
+ "#37648": 1,
+ "Symbol": 2,
+ "#37649": 1,
+ "Literal": 1,
+ "#37650": 1,
+ "Statement": 8,
+ "#37651": 1,
+ "Operator": 11,
+ "#37652": 1,
+ "Control": 1,
+ "Flow": 1,
+ "#37653": 1,
+ "Assignment": 2,
+ "#38140": 1,
+ "Compound": 1,
+ "#38123": 1,
+ "Prefix": 1,
+ "#37654": 1,
+ "Infix": 1,
+ "#37655": 1,
+ "Name": 1,
+ "#37656": 1,
+ "Bracket": 1,
+ "#37657": 1,
+ "Brace": 1,
+ "#37658": 1,
+ "If": 1,
+ "#38119": 1,
+ "For": 1,
+ "#38120": 1,
+ "Loop": 1,
+ "#38126": 1,
+ "Fork": 1,
+ "#38127": 1,
+ "Try": 1,
+ "#37659": 1,
+ "Invocation": 1,
+ "#37660": 1,
+ "Verb": 1,
+ "Selector": 2,
+ "#37661": 1,
+ "Property": 1,
+ "#38124": 1,
+ "Error": 1,
+ "Catching": 1,
+ "#38122": 1,
+ "Positional": 1,
+ "#38141": 1,
+ "From": 1,
+ "#37662": 1,
+ "Utilities": 1,
+ "#36823": 1,
+ "Tests": 4,
+ "#36824": 1,
+ "#37646": 1,
+ "#37647": 1,
+ "parent": 1,
+ "plastic.tokenizer_proto": 4,
+ "_": 4,
+ "_ensure_prototype": 4,
+ "application/x": 27,
+ "moocode": 27,
+ "typeof": 11,
+ "this": 114,
+ "OBJ": 3,
+ "||": 19,
+ "raise": 23,
+ "E_INVARG": 3,
+ "_ensure_instance": 7,
+ "ANON": 2,
+ "plastic.compiler": 3,
+ "_lookup": 2,
+ "private": 1,
+ "{": 112,
+ "name": 9,
+ "}": 112,
+ "args": 26,
+ "if": 90,
+ "value": 73,
+ "this.variable_map": 3,
+ "[": 99,
+ "]": 102,
+ "E_RANGE": 17,
+ "return": 61,
+ "else": 45,
+ "tostr": 51,
+ "random": 3,
+ "this.reserved_names": 1,
+ "endif": 93,
+ "compile": 1,
+ "source": 32,
+ "options": 3,
+ "tokenizer": 6,
+ "this.plastic.tokenizer_proto": 2,
+ "create": 16,
+ "parser": 89,
+ "this.plastic.parser_proto": 2,
+ "compiler": 2,
+ "try": 2,
+ "statements": 13,
+ "except": 2,
+ "ex": 4,
+ "ANY": 3,
+ ".tokenizer.row": 1,
+ "endtry": 2,
+ "for": 31,
+ "statement": 29,
+ "statement.type": 10,
+ "@source": 3,
+ "p": 82,
+ "@compiler": 1,
+ "endfor": 31,
+ "ticks_left": 4,
+ "<": 13,
+ "seconds_left": 4,
+ "&&": 39,
+ "suspend": 4,
+ "statement.value": 20,
+ "elseif": 41,
+ "_generate": 1,
+ "isa": 21,
+ "this.plastic.sign_operator_proto": 1,
+ "|": 9,
+ "statement.first": 18,
+ "statement.second": 13,
+ "this.plastic.control_flow_statement_proto": 1,
+ "first": 22,
+ "statement.id": 3,
+ "this.plastic.if_statement_proto": 1,
+ "s": 47,
+ "respond_to": 9,
+ "@code": 28,
+ "@this": 13,
+ "i": 29,
+ "length": 11,
+ "LIST": 6,
+ "this.plastic.for_statement_proto": 1,
+ "statement.subtype": 2,
+ "this.plastic.loop_statement_proto": 1,
+ "prefix": 4,
+ "this.plastic.fork_statement_proto": 1,
+ "this.plastic.try_statement_proto": 1,
+ "x": 9,
+ "@x": 3,
+ "join": 6,
+ "this.plastic.assignment_operator_proto": 1,
+ "statement.first.type": 1,
+ "res": 19,
+ "rest": 3,
+ "v": 17,
+ "statement.first.value": 1,
+ "v.type": 2,
+ "v.first": 2,
+ "v.second": 1,
+ "this.plastic.bracket_operator_proto": 1,
+ "statement.third": 4,
+ "this.plastic.brace_operator_proto": 1,
+ "this.plastic.invocation_operator_proto": 1,
+ "@a": 2,
+ "statement.second.type": 2,
+ "this.plastic.property_selector_operator_proto": 1,
+ "this.plastic.error_catching_operator_proto": 1,
+ "second": 18,
+ "this.plastic.literal_proto": 1,
+ "toliteral": 1,
+ "this.plastic.positional_symbol_proto": 1,
+ "this.plastic.prefix_operator_proto": 3,
+ "this.plastic.infix_operator_proto": 1,
+ "this.plastic.traditional_ternary_operator_proto": 1,
+ "this.plastic.name_proto": 1,
+ "plastic.printer": 2,
+ "_print": 4,
+ "indent": 4,
+ "result": 7,
+ "item": 2,
+ "@result": 2,
+ "E_PROPNF": 1,
+ "print": 1,
+ "instance": 59,
+ "instance.row": 1,
+ "instance.column": 1,
+ "instance.source": 1,
+ "advance": 16,
+ "this.token": 21,
+ "this.source": 3,
+ "row": 23,
+ "this.row": 2,
+ "column": 63,
+ "this.column": 2,
+ "eol": 5,
+ "block_comment": 6,
+ "inline_comment": 4,
+ "loop": 14,
+ "len": 3,
+ "continue": 16,
+ "next_two": 4,
+ "column..column": 1,
+ "c": 44,
+ "break": 6,
+ "re": 1,
+ "not.": 1,
+ "Worse": 1,
+ "*": 4,
+ "valid": 2,
+ "error": 6,
+ "like": 4,
+ "E_PERM": 4,
+ "treated": 2,
+ "literal": 2,
+ "an": 2,
+ "invalid": 2,
+ "E_FOO": 1,
+ "variable.": 1,
+ "Any": 1,
+ "starts": 1,
+ "with": 1,
+ "characters": 1,
+ "*now*": 1,
+ "but": 1,
+ "errors": 1,
+ "are": 1,
+ "errors.": 1,
+ "*/": 1,
+ "<=>": 8,
+ "z": 4,
+ "col1": 6,
+ "mark": 2,
+ "start": 2,
+ "1": 13,
+ "9": 4,
+ "col2": 4,
+ "chars": 21,
+ "index": 2,
+ "E_": 1,
+ "token": 24,
+ "type": 9,
+ "this.errors": 1,
+ "col1..col2": 2,
+ "toobj": 1,
+ "float": 4,
+ "0": 1,
+ "cc": 1,
+ "e": 1,
+ "tofloat": 1,
+ "toint": 1,
+ "esc": 1,
+ "q": 1,
+ "col1..column": 1,
+ "plastic.parser_proto": 3,
+ "@options": 1,
+ "instance.tokenizer": 1,
+ "instance.symbols": 1,
+ "plastic": 1,
+ "this.plastic": 1,
+ "symbol": 65,
+ "plastic.name_proto": 1,
+ "plastic.literal_proto": 1,
+ "plastic.operator_proto": 10,
+ "plastic.prefix_operator_proto": 1,
+ "plastic.error_catching_operator_proto": 3,
+ "plastic.assignment_operator_proto": 1,
+ "plastic.compound_assignment_operator_proto": 5,
+ "plastic.traditional_ternary_operator_proto": 2,
+ "plastic.infix_operator_proto": 13,
+ "plastic.sign_operator_proto": 2,
+ "plastic.bracket_operator_proto": 1,
+ "plastic.brace_operator_proto": 1,
+ "plastic.control_flow_statement_proto": 3,
+ "plastic.if_statement_proto": 1,
+ "plastic.for_statement_proto": 1,
+ "plastic.loop_statement_proto": 2,
+ "plastic.fork_statement_proto": 1,
+ "plastic.try_statement_proto": 1,
+ "plastic.from_statement_proto": 2,
+ "plastic.verb_selector_operator_proto": 2,
+ "plastic.property_selector_operator_proto": 2,
+ "plastic.invocation_operator_proto": 1,
+ "id": 14,
+ "bp": 3,
+ "proto": 4,
+ "nothing": 1,
+ "this.plastic.symbol_proto": 2,
+ "this.symbols": 4,
+ "clone": 2,
+ "this.token.type": 1,
+ "this.token.value": 1,
+ "this.token.eol": 1,
+ "operator": 1,
+ "variable": 1,
+ "identifier": 1,
+ "keyword": 1,
+ "Unexpected": 1,
+ "end": 2,
+ "Expected": 1,
+ "t": 1,
+ "call": 1,
+ "nud": 2,
+ "on": 1,
+ "@definition": 1,
+ "new": 4,
+ "pop": 4,
+ "delete": 1,
+ "plastic.utilities": 6,
+ "suspend_if_necessary": 4,
+ "parse_map_sequence": 1,
+ "separator": 6,
+ "infix": 3,
+ "terminator": 6,
+ "symbols": 7,
+ "ids": 6,
+ "@ids": 2,
+ "push": 3,
+ "@symbol": 2,
+ ".id": 13,
+ "key": 7,
+ "expression": 19,
+ "@map": 1,
+ "parse_list_sequence": 2,
+ "list": 3,
+ "@list": 1,
+ "validate_scattering_pattern": 1,
+ "pattern": 5,
+ "state": 8,
+ "element": 1,
+ "element.type": 3,
+ "element.id": 2,
+ "element.first.type": 2,
+ "children": 4,
+ "node": 3,
+ "node.value": 1,
+ "@children": 1,
+ "match": 1,
+ "root": 2,
+ "keys": 3,
+ "matches": 3,
+ "stack": 4,
+ "next": 2,
+ "top": 5,
+ "@stack": 2,
+ "top.": 1,
+ "@matches": 1,
+ "plastic.symbol_proto": 2,
+ "opts": 2,
+ "instance.id": 1,
+ "instance.value": 1,
+ "instance.bp": 1,
+ "k": 3,
+ "instance.": 1,
+ "parents": 3,
+ "ancestor": 2,
+ "ancestors": 1,
+ "property": 1,
+ "properties": 1,
+ "this.type": 8,
+ "this.first": 8,
+ "import": 8,
+ "this.second": 7,
+ "left": 2,
+ "this.third": 3,
+ "sequence": 2,
+ "led": 4,
+ "this.bp": 2,
+ "second.type": 2,
+ "make_identifier": 4,
+ "first.id": 1,
+ "parser.symbols": 2,
+ "reserve_keyword": 2,
+ "this.plastic.utilities": 1,
+ "third": 4,
+ "third.id": 2,
+ "second.id": 1,
+ "std": 1,
+ "reserve_statement": 1,
+ "types": 7,
+ ".type": 1,
+ "target.type": 3,
+ "target.value": 3,
+ "target.id": 4,
+ "temp": 4,
+ "temp.id": 1,
+ "temp.first.id": 1,
+ "temp.first.type": 2,
+ "temp.second.type": 1,
+ "temp.first": 2,
+ "imports": 5,
+ "import.type": 2,
+ "@imports": 2,
+ "parser.plastic.invocation_operator_proto": 1,
+ "temp.type": 1,
+ "parser.plastic.name_proto": 2,
+ "temp.first.value": 1,
+ "temp.second": 1,
+ "first.type": 1,
+ "parser.imports": 2,
+ "import.id": 2,
+ "parser.plastic.assignment_operator_proto": 1,
+ "result.type": 1,
+ "result.first": 1,
+ "result.second": 1,
"@verb": 1,
"do_the_work": 3,
- "this": 5,
"none": 1,
- "if": 4,
"object_utils": 1,
- "isa": 1,
"this.location": 3,
"room": 1,
"announce_all": 2,
"continue_msg": 1,
- "-": 1,
"fork": 1,
"endfork": 1,
- "else": 1,
- "wind_down_msg": 1,
- "endif": 4,
- "<": 1
+ "wind_down_msg": 1
},
"MoonScript": {
"types": 2,
@@ -40643,6 +44783,40 @@
"arg_list": 1,
"Value": 1
},
+ "MTML": {
+ "<$mt:Var>": 15,
+ "name=": 19,
+ "value=": 9,
+ "": 1,
+ "op=": 8,
+ "setvar=": 9,
+ "": 1,
+ "<": 2,
+ "a": 1,
+ "href": 1,
+ "<$mt:CategoryLabel>": 1,
+ "remove_html=": 1,
+ "": 1,
+ " ": 1,
+ " ": 1,
+ "function=": 1,
+ "": 1,
+ "gt=": 2,
+ "": 1,
+ " ": 1,
+ "": 1,
+ "": 1,
+ " ": 1,
+ " ": 1,
+ "": 2,
+ "from=": 2,
+ "to=": 2,
+ "div": 1,
+ "class": 1,
+ "col_num": 1,
+ " ": 2,
+ "": 1
+ },
"Nemerle": {
"using": 1,
"System.Console": 1,
@@ -40837,6 +45011,72 @@
"Nimrod": {
"echo": 1
},
+ "Nix": {
+ "{": 8,
+ "stdenv": 1,
+ "fetchurl": 2,
+ "fetchgit": 5,
+ "openssl": 2,
+ "zlib": 2,
+ "pcre": 2,
+ "libxml2": 2,
+ "libxslt": 2,
+ "expat": 2,
+ "rtmp": 4,
+ "false": 4,
+ "fullWebDAV": 3,
+ "syslog": 4,
+ "moreheaders": 3,
+ "...": 1,
+ "}": 8,
+ "let": 1,
+ "version": 2,
+ ";": 32,
+ "mainSrc": 2,
+ "url": 5,
+ "sha256": 5,
+ "-": 12,
+ "ext": 5,
+ "git": 2,
+ "//github.com/arut/nginx": 2,
+ "module.git": 3,
+ "rev": 4,
+ "dav": 2,
+ "https": 2,
+ "//github.com/yaoweibin/nginx_syslog_patch.git": 1,
+ "//github.com/agentzh/headers": 1,
+ "more": 1,
+ "nginx": 1,
+ "in": 1,
+ "stdenv.mkDerivation": 1,
+ "rec": 1,
+ "name": 1,
+ "src": 1,
+ "buildInputs": 1,
+ "[": 5,
+ "]": 5,
+ "+": 10,
+ "stdenv.lib.optional": 5,
+ "patches": 1,
+ "if": 1,
+ "then": 1,
+ "else": 1,
+ "configureFlags": 1,
+ "preConfigure": 1,
+ "export": 1,
+ "NIX_CFLAGS_COMPILE": 1,
+ "postInstall": 1,
+ "mv": 1,
+ "out/sbin": 1,
+ "out/bin": 1,
+ "meta": 1,
+ "description": 1,
+ "maintainers": 1,
+ "stdenv.lib.maintainers.raskin": 1,
+ "platforms": 1,
+ "stdenv.lib.platforms.all": 1,
+ "inherit": 1
+ },
"NSIS": {
";": 39,
"bigtest.nsi": 1,
@@ -45325,6 +49565,278 @@
"there": 1,
"it": 1
},
+ "Ox": {
+ "#include": 2,
+ "Kapital": 4,
+ "(": 119,
+ "L": 2,
+ "const": 4,
+ "N": 5,
+ "entrant": 8,
+ "exit": 2,
+ "KP": 14,
+ ")": 119,
+ "{": 22,
+ "StateVariable": 1,
+ ";": 91,
+ "this.entrant": 1,
+ "this.exit": 1,
+ "this.KP": 1,
+ "actual": 2,
+ "Kbar*vals/": 1,
+ "-": 31,
+ "upper": 3,
+ "log": 2,
+ ".Inf": 2,
+ "}": 22,
+ "Transit": 1,
+ "FeasA": 2,
+ "decl": 3,
+ "ent": 5,
+ "CV": 7,
+ "stayout": 3,
+ "[": 25,
+ "]": 25,
+ "exit.pos": 1,
+ "tprob": 5,
+ "sigu": 2,
+ "SigU": 2,
+ "if": 5,
+ "v": 2,
+ "&&": 1,
+ "return": 10,
+ "<0>": 1,
+ "ones": 1,
+ "probn": 2,
+ "Kbe": 2,
+ "/sigu": 1,
+ "Kb0": 2,
+ "+": 14,
+ "Kb2": 2,
+ "*upper": 1,
+ "/": 1,
+ "vals": 1,
+ "tprob.*": 1,
+ "zeros": 4,
+ ".*stayout": 1,
+ "FirmEntry": 6,
+ "Run": 1,
+ "Initialize": 3,
+ "GenerateSample": 2,
+ "BDP": 2,
+ "BayesianDP": 1,
+ "Rust": 1,
+ "Reachable": 2,
+ "sige": 2,
+ "new": 19,
+ "StDeviations": 1,
+ "<0.3,0.3>": 1,
+ "LaggedAction": 1,
+ "d": 2,
+ "array": 1,
+ "Kparams": 1,
+ "Positive": 4,
+ "Free": 1,
+ "Kb1": 1,
+ "Determined": 1,
+ "EndogenousStates": 1,
+ "K": 3,
+ "KN": 1,
+ "SetDelta": 1,
+ "Probability": 1,
+ "kcoef": 3,
+ "ecost": 3,
+ "Negative": 1,
+ "CreateSpaces": 1,
+ "Volume": 3,
+ "LOUD": 1,
+ "EM": 4,
+ "ValueIteration": 1,
+ "//": 17,
+ "Solve": 1,
+ "data": 4,
+ "DataSet": 1,
+ "Simulate": 1,
+ "DataN": 1,
+ "DataT": 1,
+ "FALSE": 1,
+ "Print": 1,
+ "ImaiJainChing": 1,
+ "delta": 1,
+ "*CV": 2,
+ "Utility": 1,
+ "u": 2,
+ "ent*CV": 1,
+ "*AV": 1,
+ "|": 1,
+ "ParallelObjective": 1,
+ "obj": 18,
+ "DONOTUSECLIENT": 2,
+ "isclass": 1,
+ "obj.p2p": 2,
+ "oxwarning": 1,
+ "obj.L": 1,
+ "P2P": 2,
+ "ObjClient": 4,
+ "ObjServer": 7,
+ "this.obj": 2,
+ "Execute": 4,
+ "basetag": 2,
+ "STOP_TAG": 1,
+ "iml": 1,
+ "obj.NvfuncTerms": 2,
+ "Nparams": 6,
+ "obj.nstruct": 2,
+ "Loop": 2,
+ "nxtmsgsz": 2,
+ "//free": 1,
+ "param": 1,
+ "length": 1,
+ "is": 1,
+ "no": 2,
+ "greater": 1,
+ "than": 1,
+ "QUIET": 2,
+ "println": 2,
+ "ID": 2,
+ "Server": 1,
+ "Recv": 1,
+ "ANY_TAG": 1,
+ "//receive": 1,
+ "the": 1,
+ "ending": 1,
+ "parameter": 1,
+ "vector": 1,
+ "Encode": 3,
+ "Buffer": 8,
+ "//encode": 1,
+ "it.": 1,
+ "Decode": 1,
+ "obj.nfree": 1,
+ "obj.cur.V": 1,
+ "vfunc": 2,
+ "CstrServer": 3,
+ "SepServer": 3,
+ "Lagrangian": 1,
+ "rows": 1,
+ "obj.cur": 1,
+ "Vec": 1,
+ "obj.Kvar.v": 1,
+ "imod": 1,
+ "Tag": 1,
+ "obj.K": 1,
+ "TRUE": 1,
+ "obj.Kvar": 1,
+ "PDF": 1,
+ "*": 5,
+ "nldge": 1,
+ "ParticleLogLikeli": 1,
+ "it": 5,
+ "ip": 1,
+ "mss": 3,
+ "mbas": 1,
+ "ms": 8,
+ "my": 4,
+ "mx": 7,
+ "vw": 7,
+ "vwi": 4,
+ "dws": 3,
+ "mhi": 3,
+ "mhdet": 2,
+ "loglikeli": 4,
+ "mData": 4,
+ "vxm": 1,
+ "vxs": 1,
+ "mxm": 1,
+ "<": 4,
+ "mxsu": 1,
+ "mxsl": 1,
+ "time": 2,
+ "timeall": 1,
+ "timeran": 1,
+ "timelik": 1,
+ "timefun": 1,
+ "timeint": 1,
+ "timeres": 1,
+ "GetData": 1,
+ "m_asY": 1,
+ "sqrt": 1,
+ "*M_PI": 1,
+ "m_cY": 1,
+ "determinant": 2,
+ "m_mMSbE.": 2,
+ "covariance": 2,
+ "invert": 2,
+ "of": 2,
+ "measurement": 1,
+ "shocks": 1,
+ "m_vSss": 1,
+ "m_cPar": 4,
+ "m_cS": 1,
+ "start": 1,
+ "particles": 2,
+ "m_vXss": 1,
+ "m_cX": 1,
+ "steady": 1,
+ "state": 3,
+ "and": 1,
+ "policy": 2,
+ "init": 1,
+ "likelihood": 1,
+ "//timeall": 1,
+ "timer": 3,
+ "for": 2,
+ "sizer": 1,
+ "rann": 1,
+ "m_cSS": 1,
+ "m_mSSbE": 1,
+ "noise": 1,
+ "fg": 1,
+ "&": 2,
+ "transition": 1,
+ "prior": 1,
+ "as": 1,
+ "proposal": 1,
+ "m_oApprox.FastInterpolate": 1,
+ "interpolate": 1,
+ "fy": 1,
+ "m_cMS": 1,
+ "evaluate": 1,
+ "importance": 1,
+ "weights": 2,
+ "observation": 1,
+ "error": 1,
+ "exp": 2,
+ "outer": 1,
+ "/mhdet": 2,
+ "sumr": 1,
+ "my*mhi": 1,
+ ".*my": 1,
+ ".": 3,
+ ".NaN": 1,
+ "can": 1,
+ "happen": 1,
+ "extrem": 1,
+ "sumc": 1,
+ "or": 1,
+ "extremely": 1,
+ "wrong": 1,
+ "parameters": 1,
+ "dws/m_cPar": 1,
+ "loglikelihood": 1,
+ "contribution": 1,
+ "//timelik": 1,
+ "/100": 1,
+ "//time": 1,
+ "resample": 1,
+ "vw/dws": 1,
+ "selection": 1,
+ "step": 1,
+ "in": 1,
+ "c": 1,
+ "on": 1,
+ "normalized": 1
+ },
"Oxygene": {
"": 1,
"DefaultTargets=": 1,
@@ -45417,6 +49929,69 @@
"": 1,
" ": 1
},
+ "Pan": {
+ "object": 1,
+ "template": 1,
+ "pantest": 1,
+ ";": 32,
+ "xFF": 1,
+ "e": 2,
+ "-": 2,
+ "E10": 1,
+ "variable": 4,
+ "TEST": 2,
+ "to_string": 1,
+ "(": 8,
+ ")": 8,
+ "+": 2,
+ "value": 1,
+ "undef": 1,
+ "null": 1,
+ "error": 1,
+ "include": 1,
+ "{": 5,
+ "}": 5,
+ "pkg_repl": 2,
+ "PKG_ARCH_DEFAULT": 1,
+ "function": 1,
+ "show_things_view_for_stuff": 1,
+ "thing": 2,
+ "ARGV": 1,
+ "[": 2,
+ "]": 2,
+ "foreach": 1,
+ "i": 1,
+ "mything": 2,
+ "STUFF": 1,
+ "if": 1,
+ "return": 2,
+ "true": 2,
+ "else": 1,
+ "SELF": 1,
+ "false": 2,
+ "HERE": 1,
+ "<<": 1,
+ "EOF": 2,
+ "This": 1,
+ "example": 1,
+ "demonstrates": 1,
+ "an": 1,
+ "in": 1,
+ "line": 1,
+ "heredoc": 1,
+ "style": 1,
+ "config": 1,
+ "file": 1,
+ "main": 1,
+ "awesome": 1,
+ "small": 1,
+ "#This": 1,
+ "should": 1,
+ "be": 1,
+ "highlighted": 1,
+ "normally": 1,
+ "again.": 1
+ },
"Parrot Assembly": {
"SHEBANG#!parrot": 1,
".pcc_sub": 1,
@@ -45618,29 +50193,29 @@
"package": 14,
"App": 131,
"Ack": 136,
- ";": 1185,
- "use": 76,
- "warnings": 16,
- "strict": 16,
+ ";": 1193,
+ "use": 83,
+ "warnings": 18,
+ "strict": 18,
"File": 54,
"Next": 27,
"Plugin": 2,
"Basic": 10,
- "head1": 31,
- "NAME": 5,
- "-": 860,
+ "head1": 36,
+ "NAME": 6,
+ "-": 868,
"A": 2,
"container": 1,
- "for": 78,
+ "for": 83,
"functions": 2,
- "the": 131,
+ "the": 143,
"ack": 38,
"program": 6,
"VERSION": 15,
"Version": 1,
- "cut": 27,
+ "cut": 28,
"our": 34,
- "COPYRIGHT": 6,
+ "COPYRIGHT": 7,
"BEGIN": 7,
"{": 1121,
"}": 1134,
@@ -45657,8 +50232,8 @@
"is_cygwin": 6,
"is_windows": 12,
"Spec": 13,
- "(": 919,
- ")": 917,
+ "(": 925,
+ ")": 923,
"Glob": 4,
"Getopt": 6,
"Long": 6,
@@ -45673,27 +50248,27 @@
"actionscript": 2,
"[": 159,
"qw": 35,
- "as": 33,
+ "as": 37,
"mxml": 2,
"]": 155,
"ada": 4,
"adb": 2,
"ads": 2,
"asm": 4,
- "s": 34,
+ "s": 35,
"batch": 2,
"bat": 2,
"cmd": 2,
"binary": 3,
"q": 5,
"Binary": 2,
- "files": 41,
+ "files": 42,
"defined": 54,
- "by": 11,
- "Perl": 6,
+ "by": 16,
+ "Perl": 9,
"T": 2,
"op": 2,
- "default": 16,
+ "default": 19,
"off": 4,
"tt": 4,
"tt2": 2,
@@ -45719,11 +50294,11 @@
"xslt": 2,
"ent": 2,
"while": 31,
- "my": 401,
+ "my": 404,
"type": 69,
"exts": 6,
"each": 14,
- "if": 272,
+ "if": 276,
"ref": 33,
"ext": 14,
"@": 38,
@@ -45731,7 +50306,7 @@
"_": 101,
"mk": 2,
"mak": 2,
- "not": 53,
+ "not": 54,
"t": 18,
"p": 9,
"STDIN": 2,
@@ -45740,36 +50315,36 @@
"/MSWin32/": 2,
"quotemeta": 5,
"catfile": 4,
- "SYNOPSIS": 5,
- "If": 14,
- "you": 33,
- "want": 5,
- "to": 86,
+ "SYNOPSIS": 6,
+ "If": 15,
+ "you": 44,
+ "want": 7,
+ "to": 95,
"know": 4,
- "about": 3,
+ "about": 4,
"F": 24,
"": 13,
- "see": 4,
- "file": 40,
- "itself.": 2,
+ "see": 5,
+ "file": 49,
+ "itself.": 3,
"No": 4,
"user": 4,
"serviceable": 1,
"parts": 1,
"inside.": 1,
- "is": 62,
- "all": 22,
- "that": 27,
+ "is": 69,
+ "all": 23,
+ "that": 33,
"should": 6,
"this.": 1,
"FUNCTIONS": 1,
- "head2": 32,
+ "head2": 34,
"read_ackrc": 4,
"Reads": 1,
"contents": 2,
- "of": 55,
+ "of": 64,
".ackrc": 1,
- "and": 76,
+ "and": 85,
"returns": 4,
"arguments.": 1,
"sub": 225,
@@ -45787,7 +50362,7 @@
"&&": 83,
"e": 20,
"open": 7,
- "or": 47,
+ "or": 49,
"die": 38,
"@lines": 21,
"/./": 2,
@@ -45802,11 +50377,11 @@
"return": 157,
"get_command_line_options": 4,
"Gets": 3,
- "command": 13,
+ "command": 14,
"line": 20,
"arguments": 2,
"does": 10,
- "specific": 1,
+ "specific": 2,
"tweaking.": 1,
"opt": 291,
"pager": 19,
@@ -45829,9 +50404,9 @@
"column": 4,
"#": 99,
"ignore": 7,
- "this": 18,
+ "this": 22,
"option": 7,
- "it": 25,
+ "it": 28,
"handled": 2,
"beforehand": 2,
"f": 25,
@@ -45863,7 +50438,7 @@
"print_version_statement": 2,
"exit": 16,
"show_help": 3,
- "@_": 41,
+ "@_": 43,
"show_help_types": 2,
"require": 12,
"Pod": 4,
@@ -45875,7 +50450,7 @@
"wanted": 4,
"no//": 2,
"must": 5,
- "be": 30,
+ "be": 36,
"later": 2,
"exists": 19,
"else": 53,
@@ -45910,7 +50485,7 @@
"uniq": 4,
"@uniq": 2,
"sort": 8,
- "a": 81,
+ "a": 85,
"<=>": 2,
"b": 6,
"keys": 15,
@@ -45921,24 +50496,24 @@
"Go": 1,
"through": 6,
"look": 2,
- "I": 67,
+ "I": 68,
"<--type-set>": 1,
"foo=": 1,
"bar": 3,
"<--type-add>": 1,
"xml=": 1,
- ".": 121,
+ ".": 125,
"Remove": 1,
"them": 5,
- "add": 8,
+ "add": 9,
"supported": 1,
"filetypes": 8,
"i.e.": 2,
"into": 6,
- "etc.": 1,
+ "etc.": 3,
"@typedef": 8,
"td": 6,
- "set": 11,
+ "set": 12,
"Builtin": 4,
"cannot": 4,
"changed.": 4,
@@ -45946,7 +50521,7 @@
"delete_type": 5,
"Type": 2,
"exist": 4,
- "creating": 2,
+ "creating": 3,
"with": 26,
"...": 2,
"unless": 39,
@@ -45958,7 +50533,7 @@
"internal": 1,
"structures": 1,
"containing": 5,
- "information": 1,
+ "information": 2,
"type_wanted.": 1,
"Internal": 2,
"error": 4,
@@ -45967,18 +50542,18 @@
"Standard": 1,
"filter": 12,
"pass": 1,
- "L": 18,
+ "L": 34,
"": 1,
"descend_filter.": 1,
- "It": 2,
+ "It": 3,
"true": 3,
"directory": 8,
- "any": 3,
+ "any": 4,
"ones": 1,
"we": 7,
"ignore.": 1,
"path": 28,
- "This": 24,
+ "This": 27,
"removes": 1,
"trailing": 1,
"separator": 4,
@@ -45994,18 +50569,18 @@
"For": 5,
"example": 5,
"": 1,
- "The": 20,
+ "The": 22,
"filetype": 1,
- "will": 7,
- "C": 48,
+ "will": 9,
+ "C": 56,
"": 1,
- "can": 26,
+ "can": 30,
"skipped": 2,
- "something": 2,
+ "something": 3,
"avoid": 1,
"searching": 6,
"even": 4,
- "under": 4,
+ "under": 5,
"a.": 1,
"constant": 2,
"TEXT": 16,
@@ -46015,7 +50590,7 @@
"lc_basename": 8,
"lc": 5,
"r": 14,
- "B": 75,
+ "B": 76,
"header": 17,
"SHEBANG#!#!": 2,
"ruby": 3,
@@ -46049,7 +50624,7 @@
"_get_thpppt": 3,
"print": 35,
"_bar": 3,
- "<<": 6,
+ "<<": 10,
"&": 22,
"*I": 2,
"g": 7,
@@ -46059,13 +50634,13 @@
"#I": 6,
"#7": 4,
"results.": 2,
- "on": 24,
- "when": 17,
- "used": 11,
+ "on": 25,
+ "when": 18,
+ "used": 12,
"interactively": 6,
- "no": 21,
+ "no": 22,
"Print": 6,
- "between": 3,
+ "between": 4,
"results": 8,
"different": 2,
"files.": 6,
@@ -46094,7 +50669,7 @@
"pipe": 4,
"finding": 2,
"Only": 7,
- "found": 9,
+ "found": 11,
"without": 3,
"searching.": 2,
"PATTERN": 8,
@@ -46106,13 +50681,13 @@
"lexically.": 3,
"invert": 2,
"Print/search": 2,
- "handle": 2,
- "do": 11,
+ "handle": 3,
+ "do": 12,
"g/": 2,
"G.": 2,
"show": 3,
"Show": 2,
- "which": 6,
+ "which": 7,
"has.": 2,
"inclusion/exclusion": 2,
"All": 4,
@@ -46148,7 +50723,7 @@
"@before": 16,
"before_starts_at_line": 10,
"after": 18,
- "number": 3,
+ "number": 4,
"still": 4,
"res": 59,
"next_text": 8,
@@ -46213,10 +50788,10 @@
"print_count0": 2,
"filetypes_supported_set": 9,
"True/False": 1,
- "are": 24,
+ "are": 25,
"print_files": 4,
"iter": 23,
- "returned": 2,
+ "returned": 3,
"iterator": 3,
"<$regex>": 1,
"<$one>": 1,
@@ -46224,7 +50799,7 @@
"first.": 1,
"<$ors>": 1,
"<\"\\n\">": 1,
- "defines": 1,
+ "defines": 2,
"what": 14,
"filename.": 1,
"print_files_with_matches": 4,
@@ -46294,24 +50869,24 @@
"pipe.": 1,
"exit_from_ack": 5,
"Exit": 1,
- "application": 10,
+ "application": 15,
"correct": 1,
"code.": 2,
"otherwise": 2,
"handed": 1,
- "in": 29,
+ "in": 36,
"argument.": 1,
"rc": 11,
"LICENSE": 3,
"Copyright": 2,
"Andy": 2,
"Lester.": 2,
- "free": 3,
+ "free": 4,
"software": 3,
- "redistribute": 3,
- "and/or": 3,
- "modify": 3,
- "terms": 3,
+ "redistribute": 4,
+ "and/or": 4,
+ "modify": 4,
+ "terms": 4,
"Artistic": 2,
"License": 2,
"v2.0.": 2,
@@ -46327,8 +50902,8 @@
"unspecified": 1,
"fib": 4,
"N": 2,
- "SEE": 3,
- "ALSO": 3,
+ "SEE": 4,
+ "ALSO": 4,
"": 1,
"SHEBANG#!perl": 5,
"MAIN": 1,
@@ -46349,7 +50924,7 @@
"Resource": 5,
"file_matching": 2,
"check_regex": 2,
- "like": 12,
+ "like": 13,
"finder": 1,
"options": 7,
"FILE...": 1,
@@ -46368,7 +50943,7 @@
"By": 2,
"prints": 2,
"also": 7,
- "would": 3,
+ "would": 5,
"actually": 1,
"let": 1,
"take": 5,
@@ -46386,12 +50961,12 @@
"specified": 3,
"line.": 4,
"default.": 2,
- "item": 42,
+ "item": 44,
"": 11,
"paths": 3,
"included": 1,
"search.": 1,
- "entire": 2,
+ "entire": 3,
"matched": 1,
"against": 1,
"shell": 4,
@@ -46400,7 +50975,7 @@
"<-w>": 2,
"<-v>": 3,
"<-Q>": 4,
- "apply": 2,
+ "apply": 3,
"relative": 1,
"convenience": 1,
"shortcut": 2,
@@ -46446,7 +51021,7 @@
"include": 1,
"<--ignore-dir=data>": 1,
"<--noignore-dir>": 1,
- "allows": 2,
+ "allows": 4,
"normally": 1,
"perhaps": 1,
"research": 1,
@@ -46458,17 +51033,17 @@
"": 1,
"NOT": 1,
"supported.": 1,
- "You": 3,
- "need": 3,
+ "You": 4,
+ "need": 5,
"specify": 1,
"<--ignore-dir=foo>": 1,
- "then": 3,
+ "then": 4,
"foo": 6,
"taken": 1,
"account": 1,
"explicitly": 1,
"": 2,
- "file.": 2,
+ "file.": 3,
"Multiple": 1,
"<--line>": 1,
"comma": 1,
@@ -46509,9 +51084,9 @@
"they": 1,
"expression.": 1,
"Highlighting": 1,
- "work": 1,
+ "work": 3,
"though": 1,
- "so": 3,
+ "so": 4,
"highlight": 1,
"seeing": 1,
"tail": 1,
@@ -46524,9 +51099,9 @@
"usual": 1,
"newline.": 1,
"dealing": 1,
- "contain": 2,
+ "contain": 3,
"whitespace": 1,
- "e.g.": 1,
+ "e.g.": 2,
"html": 1,
"xargs": 2,
"rm": 1,
@@ -46547,7 +51122,7 @@
"<--smart-case>": 1,
"<--no-smart-case>": 1,
"strings": 1,
- "contains": 1,
+ "contains": 2,
"uppercase": 1,
"characters.": 1,
"similar": 1,
@@ -46558,7 +51133,7 @@
"<--sort-files>": 1,
"Sorts": 1,
"Use": 6,
- "your": 13,
+ "your": 20,
"listings": 1,
"deterministic": 1,
"runs": 1,
@@ -46572,7 +51147,7 @@
"Bill": 1,
"Cat": 1,
"logo.": 1,
- "Note": 4,
+ "Note": 5,
"exact": 1,
"spelling": 1,
"<--thpppppt>": 1,
@@ -46581,7 +51156,7 @@
"perl": 8,
"php": 2,
"python": 1,
- "looks": 1,
+ "looks": 2,
"location.": 1,
"variable": 1,
"specifies": 1,
@@ -46625,7 +51200,7 @@
"See": 1,
"": 1,
"specifications.": 1,
- "such": 5,
+ "such": 6,
"": 1,
"": 1,
"": 1,
@@ -46638,7 +51213,7 @@
"understands": 1,
"sequences.": 1,
"never": 1,
- "back": 3,
+ "back": 4,
"ACK": 2,
"OTHER": 1,
"TOOLS": 1,
@@ -46661,8 +51236,8 @@
"Phil": 1,
"Jackson": 1,
"put": 1,
- "together": 1,
- "an": 11,
+ "together": 2,
+ "an": 16,
"": 1,
"extension": 1,
"": 1,
@@ -46675,13 +51250,13 @@
"Code": 1,
"greater": 1,
"normal": 1,
- "code": 7,
+ "code": 8,
"<$?=256>": 1,
"": 1,
"backticks.": 1,
"errors": 1,
"used.": 1,
- "at": 3,
+ "at": 4,
"least": 1,
"returned.": 1,
"DEBUGGING": 1,
@@ -46703,7 +51278,7 @@
"big": 1,
"codesets": 1,
"more": 2,
- "create": 2,
+ "create": 3,
"tree": 2,
"ideal": 1,
"sending": 1,
@@ -46750,7 +51325,7 @@
"tips": 1,
"here.": 1,
"FAQ": 1,
- "Why": 2,
+ "Why": 3,
"isn": 1,
"doesn": 8,
"behavior": 3,
@@ -46772,17 +51347,17 @@
"those": 2,
"well": 2,
"returning": 1,
- "things": 1,
+ "things": 2,
"great": 1,
"did": 1,
"replace": 3,
"read": 6,
"only.": 1,
- "has": 2,
+ "has": 3,
"perfectly": 1,
"good": 2,
"way": 2,
- "using": 2,
+ "using": 5,
"<-p>": 1,
"<-n>": 1,
"switches.": 1,
@@ -46797,7 +51372,7 @@
"<.xyz>": 1,
"already": 2,
"program/package": 1,
- "called": 3,
+ "called": 4,
"ack.": 2,
"Yes": 1,
"know.": 1,
@@ -46852,7 +51427,7 @@
"hash": 11,
"badkey": 1,
"caller": 2,
- "start": 6,
+ "start": 7,
"dh": 4,
"opendir": 1,
"@newfiles": 5,
@@ -46862,7 +51437,7 @@
"catdir": 3,
"closedir": 1,
"": 1,
- "these": 1,
+ "these": 4,
"updated": 1,
"update": 1,
"message": 1,
@@ -46897,7 +51472,7 @@
"seek": 4,
"readline": 1,
"nexted": 3,
- "CGI": 5,
+ "CGI": 6,
"Fast": 3,
"XML": 2,
"Hash": 11,
@@ -46946,6 +51521,113 @@
"Foo": 11,
"Bar": 1,
"@array": 1,
+ "pod": 1,
+ "Catalyst": 10,
+ "PSGI": 10,
+ "How": 1,
+ "": 3,
+ "specification": 3,
+ "interface": 1,
+ "web": 8,
+ "servers": 2,
+ "based": 2,
+ "applications": 2,
+ "frameworks.": 1,
+ "supports": 1,
+ "writing": 1,
+ "portable": 1,
+ "run": 1,
+ "various": 2,
+ "methods": 4,
+ "standalone": 1,
+ "server": 2,
+ "mod_perl": 3,
+ "FastCGI": 2,
+ "": 3,
+ "implementation": 1,
+ "running": 1,
+ "applications.": 1,
+ "Engine": 1,
+ "XXXX": 1,
+ "classes": 2,
+ "environments": 1,
+ "been": 1,
+ "changed": 1,
+ "done": 2,
+ "implementing": 1,
+ "possible": 2,
+ "manually": 2,
+ "": 1,
+ "root": 1,
+ "application.": 1,
+ "write": 2,
+ "own": 4,
+ ".psgi": 7,
+ "Writing": 2,
+ "alternate": 1,
+ "": 1,
+ "extensions": 1,
+ "implement": 2,
+ "": 1,
+ "": 1,
+ "": 1,
+ "simplest": 1,
+ "<.psgi>": 1,
+ "": 1,
+ "TestApp": 5,
+ "app": 2,
+ "psgi_app": 3,
+ "middleware": 2,
+ "components": 2,
+ "automatically": 2,
+ "": 1,
+ "applied": 1,
+ "psgi": 2,
+ "yourself.": 2,
+ "Details": 1,
+ "below.": 1,
+ "Additional": 1,
+ "": 1,
+ "What": 1,
+ "generates": 2,
+ "": 1,
+ "setting": 2,
+ "wrapped": 1,
+ "": 1,
+ "some": 1,
+ "engine": 1,
+ "fixes": 1,
+ "uniform": 1,
+ "behaviour": 2,
+ "contained": 1,
+ "over": 2,
+ "": 1,
+ "": 1,
+ "override": 1,
+ "providing": 2,
+ "none": 1,
+ "call": 2,
+ "MyApp": 1,
+ "Thus": 1,
+ "functionality": 1,
+ "ll": 1,
+ "An": 1,
+ "apply_default_middlewares": 2,
+ "method": 8,
+ "supplied": 1,
+ "wrap": 1,
+ "middlewares": 1,
+ "means": 3,
+ "auto": 1,
+ "generated": 1,
+ "": 1,
+ "": 1,
+ "AUTHORS": 2,
+ "Contributors": 1,
+ "Catalyst.pm": 1,
+ "library": 2,
+ "software.": 1,
+ "same": 2,
"Plack": 25,
"_001": 1,
"HTTP": 16,
@@ -46958,7 +51640,6 @@
"Escape": 6,
"_deprecated": 8,
"alt": 1,
- "method": 7,
"carp": 2,
"croak": 3,
"required": 2,
@@ -47047,7 +51728,6 @@
"_make_upload": 2,
"__END__": 2,
"Portable": 2,
- "PSGI": 6,
"app_or_middleware": 1,
"req": 28,
"finalize": 5,
@@ -47057,19 +51737,14 @@
"API": 2,
"objects": 2,
"across": 1,
- "web": 5,
- "server": 1,
"environments.": 1,
"CAVEAT": 1,
"module": 2,
"intended": 1,
- "middleware": 1,
"developers": 3,
"framework": 2,
"rather": 2,
- "Writing": 1,
"directly": 1,
- "possible": 1,
"recommended": 1,
"yet": 1,
"too": 1,
@@ -47087,7 +51762,6 @@
"PSGI.": 1,
"METHODS": 2,
"Some": 1,
- "methods": 3,
"earlier": 1,
"versions": 1,
"deprecated": 1,
@@ -47125,7 +51799,6 @@
"Unlike": 1,
"": 1,
"allow": 1,
- "setting": 1,
"modifying": 1,
"@values": 1,
"@params": 1,
@@ -47150,7 +51823,6 @@
"": 1,
"": 1,
"store": 1,
- "means": 2,
"plain": 2,
"": 1,
"scalars": 1,
@@ -47164,7 +51836,6 @@
"dispatch": 1,
"route": 1,
"actions": 1,
- "based": 1,
"sure": 1,
"": 1,
"virtual": 1,
@@ -47172,7 +51843,6 @@
"how": 1,
"mounted.": 1,
"hosted": 1,
- "mod_perl": 1,
"scripts": 1,
"multiplexed": 1,
"tools": 1,
@@ -47189,7 +51859,6 @@
"": 1,
"empty.": 1,
"older": 1,
- "call": 1,
"instead.": 1,
"Cookie": 2,
"handling": 1,
@@ -47207,10 +51876,8 @@
"Simple": 1,
"longer": 1,
"have": 2,
- "write": 1,
"wacky": 1,
"simply": 1,
- "AUTHORS": 1,
"Tatsuhiko": 2,
"Miyagawa": 2,
"Kazuhiro": 1,
@@ -47219,8 +51886,6 @@
"Matsuno": 2,
"": 1,
"": 1,
- "library": 1,
- "same": 1,
"Util": 3,
"Accessor": 1,
"status": 17,
@@ -47286,7 +51951,6 @@
"response": 5,
"psgi_handler": 1,
"API.": 1,
- "over": 1,
"Sets": 2,
"gets": 2,
"": 1,
@@ -48502,6 +53166,258 @@
"config": 3,
"application": 2
},
+ "Pike": {
+ "#pike": 2,
+ "__REAL_VERSION__": 2,
+ "constant": 13,
+ "Generic": 1,
+ "__builtin.GenericError": 1,
+ ";": 149,
+ "Index": 1,
+ "__builtin.IndexError": 1,
+ "BadArgument": 1,
+ "__builtin.BadArgumentError": 1,
+ "Math": 1,
+ "__builtin.MathError": 1,
+ "Resource": 1,
+ "__builtin.ResourceError": 1,
+ "Permission": 1,
+ "__builtin.PermissionError": 1,
+ "Decode": 1,
+ "__builtin.DecodeError": 1,
+ "Cpp": 1,
+ "__builtin.CppError": 1,
+ "Compilation": 1,
+ "__builtin.CompilationError": 1,
+ "MasterLoad": 1,
+ "__builtin.MasterLoadError": 1,
+ "ModuleLoad": 1,
+ "__builtin.ModuleLoadError": 1,
+ "//": 85,
+ "Returns": 2,
+ "an": 2,
+ "Error": 2,
+ "object": 5,
+ "for": 1,
+ "any": 1,
+ "argument": 2,
+ "it": 2,
+ "receives.": 1,
+ "If": 1,
+ "the": 4,
+ "already": 1,
+ "is": 2,
+ "or": 1,
+ "empty": 1,
+ "does": 1,
+ "nothing.": 1,
+ "mkerror": 1,
+ "(": 218,
+ "mixed": 8,
+ "error": 14,
+ ")": 218,
+ "{": 51,
+ "if": 35,
+ "UNDEFINED": 1,
+ "return": 41,
+ "objectp": 1,
+ "&&": 2,
+ "-": 50,
+ "is_generic_error": 1,
+ "arrayp": 2,
+ "Error.Generic": 3,
+ "@error": 1,
+ "stringp": 1,
+ "sprintf": 3,
+ "}": 51,
+ "A": 2,
+ "string": 20,
+ "wrapper": 1,
+ "that": 1,
+ "pretends": 1,
+ "to": 7,
+ "be": 3,
+ "a": 6,
+ "@": 36,
+ "[": 45,
+ "Stdio.File": 32,
+ "]": 45,
+ "in": 1,
+ "addition": 1,
+ "some": 1,
+ "features": 1,
+ "of": 3,
+ "Stdio.FILE": 4,
+ "object.": 2,
+ "This": 1,
+ "can": 2,
+ "used": 1,
+ "distinguish": 1,
+ "FakeFile": 3,
+ "from": 1,
+ "real": 1,
+ "is_fake_file": 1,
+ "protected": 12,
+ "data": 34,
+ "int": 31,
+ "ptr": 27,
+ "r": 10,
+ "w": 6,
+ "mtime": 4,
+ "function": 21,
+ "read_cb": 5,
+ "read_oob_cb": 5,
+ "write_cb": 5,
+ "write_oob_cb": 5,
+ "close_cb": 5,
+ "@seealso": 33,
+ "close": 2,
+ "void": 25,
+ "|": 14,
+ "direction": 5,
+ "lower_case": 2,
+ "||": 2,
+ "cr": 2,
+ "has_value": 4,
+ "cw": 2,
+ "@decl": 1,
+ "create": 3,
+ "type": 11,
+ "pointer": 1,
+ "_data": 3,
+ "_ptr": 2,
+ "time": 3,
+ "else": 5,
+ "make_type_str": 3,
+ "+": 19,
+ "dup": 2,
+ "this_program": 3,
+ "Always": 3,
+ "returns": 4,
+ "errno": 2,
+ "size": 3,
+ "and": 1,
+ "creation": 1,
+ "string.": 2,
+ "Stdio.Stat": 3,
+ "stat": 1,
+ "st": 6,
+ "sizeof": 21,
+ "ctime": 1,
+ "atime": 1,
+ "line_iterator": 2,
+ "String.SplitIterator": 3,
+ "trim": 2,
+ "id": 3,
+ "query_id": 2,
+ "set_id": 2,
+ "_id": 2,
+ "read_function": 2,
+ "nbytes": 2,
+ "lambda": 1,
+ "read": 3,
+ "peek": 2,
+ "float": 1,
+ "timeout": 1,
+ "query_address": 2,
+ "is_local": 1,
+ "len": 4,
+ "not_all": 1,
+ "<": 3,
+ "start": 1,
+ "zero_type": 1,
+ "start..ptr": 1,
+ "gets": 2,
+ "ret": 7,
+ "sscanf": 1,
+ "getchar": 2,
+ "c": 4,
+ "catch": 1,
+ "unread": 2,
+ "s": 5,
+ "..ptr": 2,
+ "ptr..": 1,
+ "seek": 2,
+ "pos": 8,
+ "mult": 2,
+ "add": 2,
+ "pos*mult": 1,
+ "strlen": 2,
+ "sync": 2,
+ "tell": 2,
+ "truncate": 2,
+ "length": 2,
+ "..length": 1,
+ "write": 2,
+ "array": 1,
+ "str": 12,
+ "...": 2,
+ "extra": 2,
+ "str*": 1,
+ "@extra": 1,
+ "..": 1,
+ "set_blocking": 3,
+ "set_blocking_keep_callbacks": 3,
+ "set_nonblocking": 1,
+ "rcb": 2,
+ "wcb": 2,
+ "ccb": 2,
+ "rocb": 2,
+ "wocb": 2,
+ "set_nonblocking_keep_callbacks": 1,
+ "set_close_callback": 2,
+ "cb": 10,
+ "set_read_callback": 2,
+ "set_read_oob_callback": 2,
+ "set_write_callback": 2,
+ "set_write_oob_callback": 2,
+ "query_close_callback": 2,
+ "query_read_callback": 2,
+ "query_read_oob_callback": 2,
+ "query_write_callback": 2,
+ "query_write_oob_callback": 2,
+ "_sprintf": 1,
+ "t": 2,
+ "casted": 1,
+ "cast": 1,
+ "switch": 1,
+ "case": 2,
+ "this": 5,
+ "Sizeof": 1,
+ "on": 1,
+ "its": 1,
+ "contents.": 1,
+ "_sizeof": 1,
+ "@ignore": 1,
+ "#define": 1,
+ "NOPE": 20,
+ "X": 2,
+ "args": 1,
+ "#X": 1,
+ "assign": 1,
+ "async_connect": 1,
+ "connect": 1,
+ "connect_unix": 1,
+ "open": 1,
+ "open_socket": 1,
+ "pipe": 1,
+ "tcgetattr": 1,
+ "tcsetattr": 1,
+ "dup2": 1,
+ "lock": 1,
+ "We": 4,
+ "could": 4,
+ "implement": 4,
+ "mode": 1,
+ "proxy": 1,
+ "query_fd": 1,
+ "read_oob": 1,
+ "set_close_on_exec": 1,
+ "set_keepalive": 1,
+ "trylock": 1,
+ "write_oob": 1,
+ "@endignore": 1
+ },
"Pod": {
"Id": 1,
"contents.pod": 1,
@@ -48918,27 +53834,330 @@
"TWO_PI": 1
},
"Prolog": {
- "-": 52,
+ "-": 161,
+ "module": 3,
+ "(": 327,
+ "format_spec": 12,
+ "[": 87,
+ "format_error/2": 1,
+ "format_spec/2": 1,
+ "format_spec//1": 1,
+ "spec_arity/2": 1,
+ "spec_types/2": 1,
+ "]": 87,
+ ")": 326,
+ ".": 107,
+ "use_module": 8,
+ "library": 8,
+ "dcg/basics": 1,
+ "eos//0": 1,
+ "integer//1": 1,
+ "string_without//2": 1,
+ "error": 6,
+ "when": 3,
+ "when/2": 1,
+ "%": 71,
+ "mavis": 1,
+ "format_error": 8,
+ "+": 14,
+ "Goal": 29,
+ "Error": 25,
+ "string": 8,
+ "is": 12,
+ "nondet.": 1,
+ "format": 8,
+ "Format": 23,
+ "Args": 19,
+ "format_error_": 5,
+ "_": 30,
+ "debug": 4,
+ "Spec": 10,
+ "is_list": 1,
+ "spec_types": 8,
+ "Types": 16,
+ "types_error": 3,
+ "length": 4,
+ "TypesLen": 3,
+ "ArgsLen": 3,
+ "types_error_": 4,
+ "Arg": 6,
+ "|": 25,
+ "Type": 3,
+ "ground": 5,
+ "is_of_type": 2,
+ "message_to_string": 1,
+ "type_error": 1,
+ "_Location": 1,
+ "multifile": 2,
+ "check": 3,
+ "checker/2.": 2,
+ "dynamic": 2,
+ "checker": 3,
+ "format_fail/3.": 1,
+ "prolog_walk_code": 1,
+ "module_class": 1,
+ "user": 5,
+ "infer_meta_predicates": 1,
+ "false": 2,
+ "autoload": 1,
+ "format/": 1,
+ "{": 7,
+ "}": 7,
+ "are": 3,
+ "always": 1,
+ "loaded": 1,
+ "undefined": 1,
+ "ignore": 1,
+ "trace_reference": 1,
+ "on_trace": 1,
+ "check_format": 3,
+ "retract": 1,
+ "format_fail": 2,
+ "Location": 6,
+ "print_message": 1,
+ "warning": 1,
+ "fail.": 3,
+ "iterate": 1,
+ "all": 1,
+ "errors": 2,
+ "checker.": 1,
+ "succeed": 2,
+ "even": 1,
+ "if": 1,
+ "no": 1,
+ "found": 1,
+ "Module": 4,
+ "_Caller": 1,
+ "predicate_property": 1,
+ "imported_from": 1,
+ "Source": 2,
+ "memberchk": 2,
+ "system": 1,
+ "prolog_debug": 1,
+ "can_check": 2,
+ "assert": 2,
+ "to": 5,
+ "avoid": 1,
+ "printing": 1,
+ "goals": 1,
+ "once": 3,
+ "clause": 1,
+ "prolog": 2,
+ "message": 1,
+ "message_location": 1,
+ "//": 1,
+ "eos.": 1,
+ "escape": 2,
+ "Numeric": 4,
+ "Modifier": 2,
+ "Action": 15,
+ "Rest": 12,
+ "numeric_argument": 5,
+ "modifier_argument": 3,
+ "action": 6,
+ "text": 4,
+ "String": 6,
+ ";": 12,
+ "Codes": 21,
+ "string_codes": 4,
+ "string_without": 1,
+ "list": 4,
+ "semidet.": 3,
+ "text_codes": 6,
+ "phrase": 3,
+ "spec_arity": 2,
+ "FormatSpec": 2,
+ "Arity": 3,
+ "positive_integer": 1,
+ "det.": 4,
+ "type": 2,
+ "Item": 2,
+ "Items": 2,
+ "item_types": 3,
+ "numeric_types": 5,
+ "action_types": 18,
+ "number": 3,
+ "character": 2,
+ "star": 2,
+ "nothing": 2,
+ "atom_codes": 4,
+ "Code": 2,
+ "Text": 1,
+ "codes": 5,
+ "Var": 5,
+ "var": 4,
+ "Atom": 3,
+ "atom": 6,
+ "N": 5,
+ "integer": 7,
+ "C": 5,
+ "colon": 1,
+ "no_colon": 1,
+ "is_action": 4,
+ "multi.": 1,
+ "a": 4,
+ "d": 3,
+ "e": 1,
+ "float": 3,
+ "f": 1,
+ "G": 2,
+ "I": 1,
+ "n": 1,
+ "p": 1,
+ "any": 3,
+ "r": 1,
+ "s": 2,
+ "t": 1,
+ "W": 1,
+ "func": 13,
+ "op": 2,
+ "xfy": 2,
+ "of": 8,
+ "/2": 3,
+ "list_util": 1,
+ "xfy_list/3": 1,
+ "function_expansion": 5,
+ "arithmetic": 2,
+ "wants_func": 4,
+ "prolog_load_context": 1,
+ "we": 1,
+ "don": 1,
+ "used": 1,
+ "at": 3,
+ "compile": 3,
+ "time": 3,
+ "for": 1,
+ "macro": 1,
+ "expansion.": 1,
+ "compile_function/4.": 1,
+ "compile_function": 8,
+ "Expr": 5,
+ "In": 15,
+ "Out": 16,
+ "evaluable/1": 1,
+ "throws": 1,
+ "exception": 1,
+ "with": 2,
+ "strings": 1,
+ "evaluable": 1,
+ "term_variables": 1,
+ "F": 26,
+ "function_composition_term": 2,
+ "Functor": 8,
+ "true": 5,
+ "..": 6,
+ "format_template": 7,
+ "has_type": 2,
+ "fail": 1,
+ "be": 4,
+ "explicit": 1,
+ "Dict": 3,
+ "is_dict": 1,
+ "get_dict": 1,
+ "Function": 5,
+ "Argument": 1,
+ "Apply": 1,
+ "an": 1,
+ "Argument.": 1,
+ "A": 1,
+ "predicate": 4,
+ "whose": 2,
+ "final": 1,
+ "argument": 2,
+ "generates": 1,
+ "output": 1,
+ "and": 2,
+ "penultimate": 1,
+ "accepts": 1,
+ "input.": 1,
+ "This": 1,
+ "realized": 1,
+ "by": 2,
+ "expanding": 1,
+ "function": 2,
+ "application": 2,
+ "chained": 1,
+ "calls": 1,
+ "time.": 1,
+ "itself": 1,
+ "can": 3,
+ "chained.": 2,
+ "Reversed": 2,
+ "reverse": 4,
+ "sort": 2,
+ "c": 2,
+ "b": 4,
+ "meta_predicate": 2,
+ "throw": 1,
+ "permission_error": 1,
+ "call": 4,
+ "context": 1,
+ "X": 10,
+ "Y": 7,
+ "defer": 1,
+ "until": 1,
+ "run": 1,
+ "P": 2,
+ "Creates": 1,
+ "new": 2,
+ "composing": 1,
+ "G.": 1,
+ "The": 1,
+ "functions": 2,
+ "composed": 1,
+ "create": 1,
+ "compiled": 1,
+ "which": 1,
+ "behaves": 1,
+ "like": 1,
+ "function.": 1,
+ "composition": 1,
+ "Composed": 1,
+ "also": 1,
+ "applied": 1,
+ "/2.": 1,
+ "fix": 1,
+ "syntax": 1,
+ "highlighting": 1,
+ "functions_to_compose": 2,
+ "Term": 10,
+ "Funcs": 7,
+ "functor": 1,
+ "Op": 3,
+ "xfy_list": 2,
+ "thread_state": 4,
+ "Goals": 2,
+ "Tmp": 3,
+ "instantiation_error": 1,
+ "append": 2,
+ "NewArgs": 2,
+ "variant_sha1": 1,
+ "Sha": 2,
+ "current_predicate": 1,
+ "Functor/2": 2,
+ "RevFuncs": 2,
+ "Threaded": 2,
+ "Body": 2,
+ "Head": 2,
+ "compile_predicates": 1,
+ "Output": 2,
+ "compound": 1,
+ "setof": 1,
+ "arg": 1,
+ "Name": 2,
+ "Args0": 2,
+ "nth1": 2,
"lib": 1,
- "(": 49,
"ic": 1,
- ")": 49,
- ".": 25,
"vabs": 2,
"Val": 8,
"AbsVal": 10,
"#": 9,
- ";": 1,
"labeling": 2,
- "[": 21,
- "]": 21,
"vabsIC": 1,
"or": 1,
"faitListe": 3,
- "_": 2,
"First": 2,
- "|": 12,
- "Rest": 6,
"Taille": 2,
"Min": 2,
"Max": 2,
@@ -48953,7 +54172,6 @@
"Xi.": 1,
"checkPeriode": 3,
"ListVar": 2,
- "length": 1,
"Length": 2,
"<": 1,
"X1": 2,
@@ -48974,9 +54192,6 @@
"christie": 3,
"parents": 4,
"brother": 1,
- "X": 3,
- "Y": 2,
- "F": 2,
"M": 2,
"turing": 1,
"Tape0": 2,
@@ -48985,9 +54200,7 @@
"q0": 1,
"Ls": 12,
"Rs": 16,
- "reverse": 1,
"Ls1": 4,
- "append": 1,
"qf": 1,
"Q0": 2,
"Ls0": 6,
@@ -48995,19 +54208,2103 @@
"symbol": 3,
"Sym": 6,
"RsRest": 2,
- "once": 1,
"rule": 1,
"Q1": 2,
"NewSym": 2,
- "Action": 2,
- "action": 4,
"Rs1": 2,
- "b": 2,
"left": 4,
"stay": 1,
"right": 1,
"L": 2
},
+ "Propeller Spin": {
+ "{": 26,
+ "*****************************************": 4,
+ "*": 143,
+ "x4": 4,
+ "Keypad": 1,
+ "Reader": 1,
+ "v1.0": 4,
+ "Author": 8,
+ "Beau": 2,
+ "Schwabe": 2,
+ "Copyright": 10,
+ "(": 356,
+ "c": 33,
+ ")": 356,
+ "Parallax": 10,
+ "See": 10,
+ "end": 12,
+ "of": 108,
+ "file": 9,
+ "for": 70,
+ "terms": 9,
+ "use.": 9,
+ "}": 26,
+ "Operation": 2,
+ "This": 3,
+ "object": 7,
+ "uses": 2,
+ "a": 72,
+ "capacitive": 1,
+ "PIN": 1,
+ "approach": 1,
+ "to": 191,
+ "reading": 1,
+ "the": 136,
+ "keypad.": 1,
+ "To": 3,
+ "do": 26,
+ "so": 11,
+ "ALL": 2,
+ "pins": 26,
+ "are": 18,
+ "made": 2,
+ "LOW": 2,
+ "and": 95,
+ "an": 12,
+ "OUTPUT": 2,
+ "I/O": 3,
+ "pins.": 1,
+ "Then": 1,
+ "set": 42,
+ "INPUT": 2,
+ "state.": 1,
+ "At": 1,
+ "this": 26,
+ "point": 21,
+ "only": 63,
+ "one": 4,
+ "pin": 18,
+ "is": 51,
+ "HIGH": 3,
+ "at": 26,
+ "time.": 2,
+ "If": 2,
+ "closed": 1,
+ "then": 5,
+ "will": 12,
+ "be": 46,
+ "read": 29,
+ "on": 12,
+ "input": 2,
+ "otherwise": 1,
+ "returned.": 1,
+ "The": 17,
+ "keypad": 4,
+ "decoding": 1,
+ "routine": 1,
+ "requires": 3,
+ "two": 6,
+ "subroutines": 1,
+ "returns": 6,
+ "entire": 1,
+ "matrix": 1,
+ "into": 19,
+ "single": 2,
+ "WORD": 1,
+ "variable": 1,
+ "indicating": 1,
+ "which": 16,
+ "buttons": 2,
+ "pressed.": 1,
+ "Multiple": 1,
+ "button": 2,
+ "presses": 1,
+ "allowed": 1,
+ "with": 8,
+ "understanding": 1,
+ "that": 10,
+ "BOX": 2,
+ "entries": 1,
+ "can": 4,
+ "confused.": 1,
+ "An": 1,
+ "example": 3,
+ "entry...": 1,
+ "or": 43,
+ "#": 97,
+ "etc.": 1,
+ "where": 2,
+ "any": 15,
+ "pressed": 3,
+ "evaluate": 1,
+ "non": 3,
+ "as": 8,
+ "being": 2,
+ "even": 1,
+ "when": 3,
+ "they": 2,
+ "not.": 1,
+ "There": 1,
+ "no": 7,
+ "danger": 1,
+ "physical": 1,
+ "electrical": 1,
+ "damage": 1,
+ "s": 16,
+ "just": 2,
+ "way": 1,
+ "sensing": 1,
+ "method": 2,
+ "happens": 1,
+ "work.": 1,
+ "Schematic": 1,
+ "No": 2,
+ "resistors": 4,
+ "capacitors.": 1,
+ "connections": 1,
+ "directly": 1,
+ "from": 21,
+ "Clear": 2,
+ "value": 51,
+ "ReadRow": 4,
+ "Shift": 3,
+ "left": 12,
+ "by": 17,
+ "preset": 1,
+ "P0": 2,
+ "P7": 2,
+ "LOWs": 1,
+ "dira": 3,
+ "[": 35,
+ "]": 34,
+ "make": 16,
+ "INPUTSs": 1,
+ "...": 5,
+ "now": 3,
+ "act": 1,
+ "like": 4,
+ "tiny": 1,
+ "capacitors": 1,
+ "outa": 2,
+ "n": 4,
+ "Pin": 1,
+ "OUTPUT...": 1,
+ "Make": 1,
+ ";": 2,
+ "charge": 10,
+ "+": 759,
+ "ina": 3,
+ "Pn": 1,
+ "remain": 1,
+ "discharged": 1,
+ "DAT": 7,
+ "TERMS": 9,
+ "OF": 49,
+ "USE": 19,
+ "MIT": 9,
+ "License": 9,
+ "Permission": 9,
+ "hereby": 9,
+ "granted": 9,
+ "free": 10,
+ "person": 9,
+ "obtaining": 9,
+ "copy": 21,
+ "software": 9,
+ "associated": 11,
+ "documentation": 9,
+ "files": 9,
+ "deal": 9,
+ "in": 53,
+ "Software": 28,
+ "without": 19,
+ "restriction": 9,
+ "including": 9,
+ "limitation": 9,
+ "rights": 9,
+ "use": 19,
+ "modify": 9,
+ "merge": 9,
+ "publish": 9,
+ "distribute": 9,
+ "sublicense": 9,
+ "and/or": 9,
+ "sell": 9,
+ "copies": 18,
+ "permit": 9,
+ "persons": 9,
+ "whom": 9,
+ "furnished": 9,
+ "subject": 9,
+ "following": 9,
+ "conditions": 9,
+ "above": 11,
+ "copyright": 9,
+ "notice": 18,
+ "permission": 9,
+ "shall": 9,
+ "included": 9,
+ "all": 14,
+ "substantial": 9,
+ "portions": 9,
+ "Software.": 9,
+ "THE": 59,
+ "SOFTWARE": 19,
+ "IS": 10,
+ "PROVIDED": 9,
+ "WITHOUT": 10,
+ "WARRANTY": 10,
+ "ANY": 20,
+ "KIND": 10,
+ "EXPRESS": 10,
+ "OR": 70,
+ "IMPLIED": 10,
+ "INCLUDING": 10,
+ "BUT": 10,
+ "NOT": 11,
+ "LIMITED": 10,
+ "TO": 10,
+ "WARRANTIES": 10,
+ "MERCHANTABILITY": 10,
+ "FITNESS": 10,
+ "FOR": 20,
+ "A": 21,
+ "PARTICULAR": 10,
+ "PURPOSE": 10,
+ "AND": 10,
+ "NONINFRINGEMENT.": 10,
+ "IN": 40,
+ "NO": 10,
+ "EVENT": 10,
+ "SHALL": 10,
+ "AUTHORS": 10,
+ "COPYRIGHT": 10,
+ "HOLDERS": 10,
+ "BE": 10,
+ "LIABLE": 10,
+ "CLAIM": 10,
+ "DAMAGES": 10,
+ "OTHER": 20,
+ "LIABILITY": 10,
+ "WHETHER": 10,
+ "AN": 10,
+ "ACTION": 10,
+ "CONTRACT": 10,
+ "TORT": 10,
+ "OTHERWISE": 10,
+ "ARISING": 10,
+ "FROM": 10,
+ "OUT": 10,
+ "CONNECTION": 10,
+ "WITH": 10,
+ "DEALINGS": 10,
+ "SOFTWARE.": 10,
+ "****************************************": 4,
+ "Debug_Lcd": 1,
+ "v1.2": 2,
+ "Authors": 1,
+ "Jon": 2,
+ "Williams": 2,
+ "Jeff": 2,
+ "Martin": 2,
+ "Inc.": 8,
+ "Debugging": 1,
+ "wrapper": 1,
+ "Serial_Lcd": 1,
+ "-": 486,
+ "March": 1,
+ "Updated": 4,
+ "conform": 1,
+ "Propeller": 3,
+ "initialization": 2,
+ "standards.": 1,
+ "v1.1": 8,
+ "April": 1,
+ "consistency.": 1,
+ "OBJ": 2,
+ "lcd": 2,
+ "number": 27,
+ "string": 8,
+ "conversion": 1,
+ "PUB": 63,
+ "init": 2,
+ "baud": 2,
+ "lines": 24,
+ "okay": 11,
+ "Initializes": 1,
+ "serial": 1,
+ "LCD": 4,
+ "true": 6,
+ "if": 53,
+ "parameters": 19,
+ "lcd.init": 1,
+ "finalize": 1,
+ "Finalizes": 1,
+ "frees": 6,
+ "floats": 1,
+ "lcd.finalize": 1,
+ "putc": 1,
+ "txbyte": 2,
+ "Send": 1,
+ "byte": 27,
+ "terminal": 4,
+ "lcd.putc": 1,
+ "str": 3,
+ "strAddr": 2,
+ "Print": 15,
+ "zero": 10,
+ "terminated": 4,
+ "lcd.str": 8,
+ "dec": 3,
+ "signed": 4,
+ "decimal": 5,
+ "num.dec": 1,
+ "decf": 1,
+ "width": 9,
+ "Prints": 2,
+ "space": 1,
+ "padded": 2,
+ "fixed": 1,
+ "field": 4,
+ "num.decf": 1,
+ "decx": 1,
+ "digits": 23,
+ "negative": 2,
+ "num.decx": 1,
+ "hex": 3,
+ "hexadecimal": 4,
+ "num.hex": 1,
+ "ihex": 1,
+ "indicated": 2,
+ "num.ihex": 1,
+ "bin": 3,
+ "binary": 4,
+ "num.bin": 1,
+ "ibin": 1,
+ "%": 162,
+ "num.ibin": 1,
+ "cls": 1,
+ "Clears": 2,
+ "moves": 1,
+ "cursor": 9,
+ "home": 4,
+ "position": 9,
+ "lcd.cls": 1,
+ "Moves": 2,
+ "lcd.home": 1,
+ "gotoxy": 1,
+ "col": 9,
+ "line": 33,
+ "col/line": 1,
+ "lcd.gotoxy": 1,
+ "clrln": 1,
+ "lcd.clrln": 1,
+ "type": 4,
+ "Selects": 1,
+ "off": 8,
+ "blink": 4,
+ "lcd.cursor": 1,
+ "display": 23,
+ "status": 15,
+ "Controls": 1,
+ "visibility": 1,
+ "false": 7,
+ "hide": 1,
+ "contents": 3,
+ "clearing": 1,
+ "lcd.displayOn": 1,
+ "else": 3,
+ "lcd.displayOff": 1,
+ "custom": 2,
+ "char": 2,
+ "chrDataAddr": 3,
+ "Installs": 1,
+ "character": 6,
+ "map": 1,
+ "address": 16,
+ "definition": 9,
+ "array": 1,
+ "lcd.custom": 1,
+ "backLight": 1,
+ "Enable": 1,
+ "disable": 7,
+ "backlight": 1,
+ "affects": 1,
+ "backlit": 1,
+ "models": 1,
+ "lcd.backLight": 1,
+ "***************************************": 12,
+ "Graphics": 3,
+ "Driver": 4,
+ "Chip": 7,
+ "Gracey": 7,
+ "Theory": 1,
+ "cog": 39,
+ "launched": 1,
+ "processes": 1,
+ "commands": 1,
+ "via": 5,
+ "routines.": 1,
+ "Points": 1,
+ "arcs": 1,
+ "sprites": 1,
+ "text": 9,
+ "polygons": 1,
+ "rasterized": 1,
+ "specified": 1,
+ "stretch": 1,
+ "memory": 2,
+ "serves": 1,
+ "generic": 1,
+ "bitmap": 15,
+ "buffer.": 1,
+ "displayed": 1,
+ "TV.SRC": 1,
+ "VGA.SRC": 1,
+ "driver.": 3,
+ "GRAPHICS_DEMO.SRC": 1,
+ "usage": 1,
+ "example.": 1,
+ "CON": 4,
+ "#1": 47,
+ "_setup": 1,
+ "_color": 2,
+ "_width": 2,
+ "_plot": 2,
+ "_line": 2,
+ "_arc": 2,
+ "_vec": 2,
+ "_vecarc": 2,
+ "_pix": 1,
+ "_pixarc": 1,
+ "_text": 2,
+ "_textarc": 1,
+ "_textmode": 2,
+ "_fill": 1,
+ "_loop": 5,
+ "VAR": 10,
+ "long": 122,
+ "command": 7,
+ "bitmap_base": 7,
+ "pixel": 40,
+ "data": 47,
+ "slices": 3,
+ "text_xs": 1,
+ "text_ys": 1,
+ "text_sp": 1,
+ "text_just": 1,
+ "font": 3,
+ "pointer": 14,
+ "same": 7,
+ "instances": 1,
+ "stop": 9,
+ "cognew": 4,
+ "@loop": 1,
+ "@command": 1,
+ "Stop": 6,
+ "graphics": 4,
+ "driver": 17,
+ "cogstop": 3,
+ "setup": 3,
+ "x_tiles": 9,
+ "y_tiles": 9,
+ "x_origin": 2,
+ "y_origin": 2,
+ "base_ptr": 3,
+ "|": 22,
+ "bases_ptr": 3,
+ "slices_ptr": 1,
+ "Set": 5,
+ "x": 112,
+ "tiles": 19,
+ "x16": 7,
+ "pixels": 14,
+ "each": 11,
+ "y": 80,
+ "relative": 2,
+ "center": 10,
+ "base": 6,
+ "setcommand": 13,
+ "write": 36,
+ "bases": 2,
+ "<<": 70,
+ "retain": 2,
+ "high": 7,
+ "level": 5,
+ "bitmap_longs": 1,
+ "clear": 5,
+ "dest_ptr": 2,
+ "Copy": 1,
+ "double": 2,
+ "buffered": 1,
+ "flicker": 5,
+ "destination": 1,
+ "color": 39,
+ "bit": 35,
+ "pattern": 2,
+ "code": 3,
+ "bits": 29,
+ "@colors": 2,
+ "&": 21,
+ "determine": 2,
+ "shape/width": 2,
+ "w": 8,
+ "F": 18,
+ "pixel_width": 1,
+ "pixel_passes": 2,
+ "@w": 1,
+ "update": 7,
+ "new": 6,
+ "repeat": 18,
+ "i": 24,
+ "p": 8,
+ "E": 7,
+ "r": 4,
+ "<": 14,
+ "colorwidth": 1,
+ "plot": 17,
+ "Plot": 3,
+ "@x": 6,
+ "Draw": 7,
+ "endpoint": 1,
+ "arc": 21,
+ "xr": 7,
+ "yr": 7,
+ "angle": 23,
+ "anglestep": 2,
+ "steps": 9,
+ "arcmode": 2,
+ "radii": 3,
+ "initial": 6,
+ "FFF": 3,
+ "..359.956": 3,
+ "step": 9,
+ "leaves": 1,
+ "between": 4,
+ "points": 2,
+ "vec": 1,
+ "vecscale": 5,
+ "vecangle": 5,
+ "vecdef_ptr": 5,
+ "vector": 12,
+ "sprite": 14,
+ "scale": 7,
+ "rotation": 3,
+ "Vector": 2,
+ "word": 212,
+ "length": 4,
+ "vecarc": 2,
+ "pix": 3,
+ "pixrot": 3,
+ "pixdef_ptr": 3,
+ "mirror": 1,
+ "Pixel": 1,
+ "justify": 4,
+ "draw": 5,
+ "textarc": 1,
+ "string_ptr": 6,
+ "justx": 2,
+ "justy": 3,
+ "it": 8,
+ "may": 6,
+ "necessary": 1,
+ "call": 44,
+ ".finish": 1,
+ "immediately": 1,
+ "afterwards": 1,
+ "prevent": 1,
+ "subsequent": 1,
+ "clobbering": 1,
+ "drawn": 1,
+ "@justx": 1,
+ "@x_scale": 1,
+ "get": 30,
+ "half": 2,
+ "min": 4,
+ "max": 6,
+ "pmin": 1,
+ "round/square": 1,
+ "corners": 1,
+ "y2": 7,
+ "x2": 6,
+ "fill": 3,
+ "pmax": 2,
+ "triangle": 3,
+ "sides": 1,
+ "polygon": 1,
+ "tri": 2,
+ "x3": 4,
+ "y3": 5,
+ "y4": 1,
+ "x1": 5,
+ "y1": 7,
+ "xy": 1,
+ "solid": 1,
+ "/": 27,
+ "finish": 2,
+ "Wait": 2,
+ "current": 3,
+ "insure": 2,
+ "safe": 1,
+ "manually": 1,
+ "manipulate": 1,
+ "while": 5,
+ "primitives": 1,
+ "xa0": 53,
+ "start": 16,
+ "ya1": 3,
+ "ya2": 1,
+ "ya3": 2,
+ "ya4": 40,
+ "ya5": 3,
+ "ya6": 21,
+ "ya7": 9,
+ "ya8": 19,
+ "ya9": 5,
+ "yaA": 18,
+ "yaB": 4,
+ "yaC": 12,
+ "yaD": 4,
+ "yaE": 1,
+ "yaF": 1,
+ "xb0": 19,
+ "yb1": 2,
+ "yb2": 1,
+ "yb3": 4,
+ "yb4": 15,
+ "yb5": 2,
+ "yb6": 7,
+ "yb7": 3,
+ "yb8": 20,
+ "yb9": 5,
+ "ybA": 8,
+ "ybB": 1,
+ "ybC": 32,
+ "ybD": 1,
+ "ybE": 1,
+ "ybF": 1,
+ "ax1": 11,
+ "radius": 2,
+ "ay2": 23,
+ "ay3": 6,
+ "ay4": 4,
+ "a0": 8,
+ "a2": 1,
+ "farc": 41,
+ "another": 7,
+ "arc/line": 1,
+ "Round": 1,
+ "recipes": 1,
+ "C": 11,
+ "D": 18,
+ "fline": 88,
+ "xa2": 48,
+ "xb2": 26,
+ "xa1": 8,
+ "xb1": 2,
+ "more": 90,
+ "xa3": 8,
+ "xb3": 6,
+ "xb4": 35,
+ "a9": 3,
+ "ax2": 30,
+ "ay1": 10,
+ "a7": 2,
+ "aE": 1,
+ "aC": 2,
+ ".": 2,
+ "aF": 4,
+ "aD": 3,
+ "aB": 2,
+ "xa4": 13,
+ "a8": 8,
+ "@": 1,
+ "a4": 3,
+ "B": 15,
+ "H": 1,
+ "J": 1,
+ "L": 5,
+ "N": 1,
+ "P": 6,
+ "R": 3,
+ "T": 5,
+ "aA": 5,
+ "V": 7,
+ "X": 4,
+ "Z": 1,
+ "b": 1,
+ "d": 2,
+ "f": 2,
+ "h": 2,
+ "j": 2,
+ "l": 2,
+ "t": 10,
+ "v": 1,
+ "z": 4,
+ "delta": 10,
+ "bullet": 1,
+ "fx": 1,
+ "*************************************": 2,
+ "org": 2,
+ "loop": 14,
+ "rdlong": 16,
+ "t1": 139,
+ "par": 20,
+ "wz": 21,
+ "arguments": 1,
+ "mov": 154,
+ "t2": 90,
+ "t3": 10,
+ "#8": 14,
+ "arg": 3,
+ "arg0": 12,
+ "add": 92,
+ "d0": 11,
+ "#4": 8,
+ "djnz": 24,
+ "wrlong": 6,
+ "dx": 20,
+ "dy": 15,
+ "arg1": 3,
+ "ror": 4,
+ "#16": 6,
+ "jump": 1,
+ "jumps": 6,
+ "color_": 1,
+ "plot_": 2,
+ "arc_": 2,
+ "vecarc_": 1,
+ "pixarc_": 1,
+ "textarc_": 2,
+ "fill_": 1,
+ "setup_": 1,
+ "xlongs": 4,
+ "xorigin": 2,
+ "yorigin": 4,
+ "arg3": 12,
+ "basesptr": 4,
+ "arg5": 6,
+ "jmp": 24,
+ "#loop": 9,
+ "width_": 1,
+ "pwidth": 3,
+ "passes": 3,
+ "#plotd": 3,
+ "line_": 1,
+ "#linepd": 2,
+ "arg7": 6,
+ "#3": 7,
+ "cmp": 16,
+ "exit": 5,
+ "px": 14,
+ "py": 11,
+ "mode": 7,
+ "if_z": 11,
+ "#plotp": 3,
+ "test": 38,
+ "arg4": 5,
+ "iterations": 1,
+ "vecdef": 1,
+ "rdword": 10,
+ "t7": 8,
+ "add/sub": 1,
+ "to/from": 1,
+ "t6": 7,
+ "sumc": 4,
+ "#multiply": 2,
+ "round": 1,
+ "up": 4,
+ "/2": 1,
+ "lsb": 1,
+ "shr": 24,
+ "t4": 7,
+ "if_nc": 15,
+ "h8000": 5,
+ "wc": 57,
+ "if_c": 37,
+ "xwords": 1,
+ "ywords": 1,
+ "xxxxxxxx": 2,
+ "save": 1,
+ "actual": 4,
+ "sy": 5,
+ "rdbyte": 3,
+ "origin": 1,
+ "adjust": 4,
+ "neg": 2,
+ "sub": 12,
+ "arg2": 7,
+ "sumnc": 7,
+ "if_nz": 18,
+ "yline": 1,
+ "sx": 4,
+ "#0": 20,
+ "next": 16,
+ "#2": 15,
+ "shl": 21,
+ "t5": 4,
+ "xpixel": 2,
+ "rol": 1,
+ "muxc": 5,
+ "pcolor": 5,
+ "color1": 2,
+ "color2": 2,
+ "@string": 1,
+ "#arcmod": 1,
+ "text_": 1,
+ "chr": 4,
+ "done": 3,
+ "scan": 7,
+ "tjz": 8,
+ "def": 2,
+ "extract": 4,
+ "_0001_1": 1,
+ "#fontb": 3,
+ "textsy": 2,
+ "starting": 1,
+ "_0011_0": 1,
+ "#11": 1,
+ "#arcd": 1,
+ "#fontxy": 1,
+ "advance": 2,
+ "textsx": 3,
+ "_0111_0": 1,
+ "setd_ret": 1,
+ "fontxy_ret": 1,
+ "ret": 17,
+ "fontb": 1,
+ "multiply": 8,
+ "fontb_ret": 1,
+ "textmode_": 1,
+ "textsp": 2,
+ "da": 1,
+ "db": 1,
+ "db2": 1,
+ "linechange": 1,
+ "lines_minus_1": 1,
+ "right": 9,
+ "fractions": 1,
+ "pre": 1,
+ "increment": 1,
+ "counter": 1,
+ "yloop": 2,
+ "integers": 1,
+ "base0": 17,
+ "base1": 10,
+ "sar": 8,
+ "cmps": 3,
+ "out": 24,
+ "range": 2,
+ "ylongs": 6,
+ "skip": 5,
+ "mins": 1,
+ "mask": 3,
+ "mask0": 8,
+ "#5": 2,
+ "ready": 10,
+ "count": 4,
+ "mask1": 6,
+ "bits0": 6,
+ "bits1": 5,
+ "pass": 5,
+ "not": 6,
+ "full": 3,
+ "longs": 15,
+ "deltas": 1,
+ "linepd": 1,
+ "wr": 2,
+ "direction": 2,
+ "abs": 1,
+ "dominant": 2,
+ "axis": 1,
+ "last": 6,
+ "ratio": 1,
+ "xloop": 1,
+ "linepd_ret": 1,
+ "plotd": 1,
+ "wide": 3,
+ "bounds": 2,
+ "#plotp_ret": 2,
+ "#7": 2,
+ "store": 1,
+ "writes": 1,
+ "pair": 1,
+ "account": 1,
+ "special": 1,
+ "case": 5,
+ "andn": 7,
+ "slice": 7,
+ "shift0": 1,
+ "colorize": 1,
+ "upper": 2,
+ "subx": 1,
+ "#wslice": 1,
+ "offset": 14,
+ "Get": 2,
+ "args": 5,
+ "move": 2,
+ "using": 1,
+ "first": 9,
+ "arg6": 1,
+ "arcmod_ret": 1,
+ "arg2/t4": 1,
+ "arg4/t6": 1,
+ "arcd": 1,
+ "#setd": 1,
+ "#polarx": 1,
+ "Polar": 1,
+ "cartesian": 1,
+ "polarx": 1,
+ "sine_90": 2,
+ "sine": 7,
+ "quadrant": 3,
+ "nz": 3,
+ "negate": 2,
+ "table": 9,
+ "sine_table": 1,
+ "shift": 7,
+ "final": 3,
+ "sine/cosine": 1,
+ "integer": 2,
+ "negnz": 3,
+ "sine_180": 1,
+ "shifted": 1,
+ "multiplier": 3,
+ "product": 1,
+ "Defined": 1,
+ "constants": 2,
+ "hFFFFFFFF": 1,
+ "FFFFFFFF": 1,
+ "fontptr": 1,
+ "Undefined": 2,
+ "temps": 1,
+ "res": 89,
+ "pointers": 2,
+ "slicesptr": 1,
+ "line/plot": 1,
+ "coordinates": 1,
+ "Inductive": 1,
+ "Sensor": 1,
+ "Demo": 1,
+ "Test": 2,
+ "Circuit": 1,
+ "pF": 1,
+ "K": 4,
+ "M": 1,
+ "FPin": 2,
+ "SDF": 1,
+ "sigma": 3,
+ "feedback": 2,
+ "SDI": 1,
+ "GND": 4,
+ "Coils": 1,
+ "Wire": 1,
+ "used": 9,
+ "was": 2,
+ "GREEN": 2,
+ "about": 4,
+ "gauge": 1,
+ "Coke": 3,
+ "Can": 3,
+ "form": 7,
+ "MHz": 16,
+ "BIC": 1,
+ "pen": 1,
+ "How": 1,
+ "does": 2,
+ "work": 2,
+ "Note": 1,
+ "reported": 2,
+ "resonate": 5,
+ "frequency": 18,
+ "LC": 8,
+ "frequency.": 2,
+ "Instead": 1,
+ "voltage": 5,
+ "produced": 1,
+ "circuit": 5,
+ "clipped.": 1,
+ "In": 2,
+ "below": 4,
+ "When": 1,
+ "you": 5,
+ "apply": 1,
+ "small": 1,
+ "specific": 1,
+ "near": 1,
+ "uncommon": 1,
+ "measure": 1,
+ "times": 3,
+ "amount": 1,
+ "applying": 1,
+ "circuit.": 1,
+ "through": 1,
+ "diode": 2,
+ "basically": 1,
+ "feeds": 1,
+ "divide": 3,
+ "divider": 1,
+ "...So": 1,
+ "order": 1,
+ "see": 2,
+ "ADC": 2,
+ "sweep": 2,
+ "result": 6,
+ "output": 11,
+ "needs": 1,
+ "generate": 1,
+ "Volts": 1,
+ "ground.": 1,
+ "drop": 1,
+ "across": 1,
+ "since": 1,
+ "sensitive": 1,
+ "works": 1,
+ "after": 2,
+ "divider.": 1,
+ "typical": 1,
+ "magnitude": 1,
+ "applied": 2,
+ "might": 1,
+ "look": 2,
+ "something": 1,
+ "*****": 4,
+ "...With": 1,
+ "looks": 1,
+ "X****": 1,
+ "...The": 1,
+ "denotes": 1,
+ "location": 1,
+ "reason": 1,
+ "slightly": 1,
+ "reasons": 1,
+ "really.": 1,
+ "lazy": 1,
+ "I": 1,
+ "didn": 1,
+ "acts": 1,
+ "dead": 1,
+ "short.": 1,
+ "situation": 1,
+ "exactly": 1,
+ "great": 1,
+ "gr.start": 2,
+ "gr.setup": 2,
+ "FindResonateFrequency": 1,
+ "DisplayInductorValue": 2,
+ "Freq.Synth": 1,
+ "FValue": 1,
+ "ADC.SigmaDelta": 1,
+ "@FTemp": 1,
+ "gr.clear": 1,
+ "gr.copy": 2,
+ "display_base": 2,
+ "Option": 2,
+ "Start": 6,
+ "*********************************************": 2,
+ "Frequency": 1,
+ "LowerFrequency": 2,
+ "*100/": 1,
+ "UpperFrequency": 1,
+ "gr.colorwidth": 4,
+ "gr.plot": 3,
+ "gr.line": 3,
+ "FTemp/1024": 1,
+ "Finish": 1,
+ "PS/2": 1,
+ "Keyboard": 1,
+ "v1.0.1": 2,
+ "REVISION": 2,
+ "HISTORY": 2,
+ "/15/2006": 2,
+ "Tool": 1,
+ "par_tail": 1,
+ "key": 4,
+ "buffer": 4,
+ "head": 1,
+ "par_present": 1,
+ "states": 1,
+ "par_keys": 1,
+ "******************************************": 2,
+ "entry": 1,
+ "movd": 10,
+ "#_dpin": 1,
+ "masks": 1,
+ "dmask": 4,
+ "_dpin": 3,
+ "cmask": 2,
+ "_cpin": 2,
+ "reset": 14,
+ "parameter": 14,
+ "_head": 6,
+ "_present/_states": 1,
+ "dlsb": 2,
+ "stat": 6,
+ "Update": 1,
+ "_head/_present/_states": 1,
+ "#1*4": 1,
+ "scancode": 2,
+ "state": 2,
+ "#receive": 1,
+ "AA": 1,
+ "extended": 1,
+ "if_nc_and_z": 2,
+ "F0": 3,
+ "unknown": 2,
+ "ignore": 2,
+ "#newcode": 1,
+ "_states": 2,
+ "set/clear": 1,
+ "#_states": 1,
+ "reg": 5,
+ "muxnc": 5,
+ "cmpsub": 4,
+ "shift/ctrl/alt/win": 1,
+ "pairs": 1,
+ "E0": 1,
+ "handle": 1,
+ "scrlock/capslock/numlock": 1,
+ "_000": 5,
+ "_locks": 5,
+ "#29": 1,
+ "change": 3,
+ "configure": 3,
+ "flag": 5,
+ "leds": 3,
+ "check": 5,
+ "shift1": 1,
+ "if_nz_and_c": 4,
+ "#@shift1": 1,
+ "@table": 1,
+ "#look": 1,
+ "alpha": 1,
+ "considering": 1,
+ "capslock": 1,
+ "if_nz_and_nc": 1,
+ "xor": 8,
+ "flags": 1,
+ "alt": 1,
+ "room": 1,
+ "valid": 2,
+ "enter": 1,
+ "FF": 3,
+ "#11*4": 1,
+ "wrword": 1,
+ "F3": 1,
+ "keyboard": 3,
+ "lock": 1,
+ "#transmit": 2,
+ "rev": 1,
+ "rcl": 2,
+ "_present": 2,
+ "#update": 1,
+ "Lookup": 2,
+ "perform": 2,
+ "lookup": 1,
+ "movs": 9,
+ "#table": 1,
+ "#27": 1,
+ "#rand": 1,
+ "Transmit": 1,
+ "pull": 2,
+ "clock": 4,
+ "low": 5,
+ "napshr": 3,
+ "#13": 3,
+ "#18": 2,
+ "release": 1,
+ "transmit_bit": 1,
+ "#wait_c0": 2,
+ "_d2": 1,
+ "wcond": 3,
+ "c1": 2,
+ "c0d0": 2,
+ "wait": 6,
+ "until": 3,
+ "#wait": 2,
+ "#receive_ack": 1,
+ "ack": 1,
+ "error": 1,
+ "#reset": 2,
+ "transmit_ret": 1,
+ "receive": 1,
+ "receive_bit": 1,
+ "pause": 1,
+ "us": 1,
+ "#nap": 1,
+ "_d3": 1,
+ "#receive_bit": 1,
+ "align": 1,
+ "isolate": 1,
+ "look_ret": 1,
+ "receive_ack_ret": 1,
+ "receive_ret": 1,
+ "wait_c0": 1,
+ "c0": 1,
+ "timeout": 1,
+ "ms": 4,
+ "wloop": 1,
+ "required": 4,
+ "_d4": 1,
+ "replaced": 1,
+ "c0/c1/c0d0/c1d1": 1,
+ "if_never": 1,
+ "replacements": 1,
+ "#wloop": 3,
+ "if_c_or_nz": 1,
+ "c1d1": 1,
+ "if_nc_or_z": 1,
+ "nap": 5,
+ "scales": 1,
+ "time": 7,
+ "snag": 1,
+ "cnt": 2,
+ "elapses": 1,
+ "nap_ret": 1,
+ "F9": 1,
+ "F5": 1,
+ "D2": 1,
+ "F1": 2,
+ "D1": 1,
+ "F12": 1,
+ "F10": 1,
+ "D7": 1,
+ "F6": 1,
+ "D3": 1,
+ "Tab": 2,
+ "Alt": 2,
+ "F3F2": 1,
+ "q": 1,
+ "Win": 2,
+ "Space": 2,
+ "Apps": 1,
+ "Power": 1,
+ "Sleep": 1,
+ "EF2F": 1,
+ "CapsLock": 1,
+ "Enter": 3,
+ "WakeUp": 1,
+ "BackSpace": 1,
+ "C5E1": 1,
+ "C0E4": 1,
+ "Home": 1,
+ "Insert": 1,
+ "C9EA": 1,
+ "Down": 1,
+ "E5": 1,
+ "Right": 1,
+ "C2E8": 1,
+ "Esc": 1,
+ "DF": 2,
+ "F11": 1,
+ "EC": 1,
+ "PageDn": 1,
+ "ED": 1,
+ "PrScr": 1,
+ "C6E9": 1,
+ "ScrLock": 1,
+ "D6": 1,
+ "Uninitialized": 3,
+ "_________": 5,
+ "Key": 1,
+ "Codes": 1,
+ "keypress": 1,
+ "keystate": 2,
+ "E0..FF": 1,
+ "AS": 1,
+ "TV": 9,
+ "May": 2,
+ "tile": 41,
+ "size": 5,
+ "enable": 5,
+ "efficient": 2,
+ "tv_mode": 2,
+ "NTSC": 11,
+ "lntsc": 3,
+ "cycles": 4,
+ "per": 4,
+ "sync": 10,
+ "fpal": 2,
+ "_433_618": 2,
+ "PAL": 10,
+ "spal": 3,
+ "colortable": 7,
+ "inside": 2,
+ "tvptr": 3,
+ "starts": 4,
+ "available": 4,
+ "@entry": 3,
+ "Assembly": 2,
+ "language": 2,
+ "Entry": 2,
+ "tasks": 6,
+ "#10": 2,
+ "Superfield": 2,
+ "_mode": 7,
+ "interlace": 20,
+ "vinv": 2,
+ "hsync": 5,
+ "waitvid": 3,
+ "burst": 2,
+ "sync_high2": 2,
+ "task": 2,
+ "section": 4,
+ "undisturbed": 2,
+ "black": 2,
+ "visible": 7,
+ "vb": 2,
+ "leftmost": 1,
+ "_vt": 3,
+ "vertical": 29,
+ "expand": 3,
+ "vert": 1,
+ "vscl": 12,
+ "hb": 2,
+ "horizontal": 21,
+ "hx": 5,
+ "colors": 18,
+ "screen": 13,
+ "video": 7,
+ "repoint": 2,
+ "hf": 2,
+ "linerot": 5,
+ "field1": 4,
+ "unless": 2,
+ "invisible": 8,
+ "if_z_eq_c": 1,
+ "#hsync": 1,
+ "vsync": 4,
+ "pulses": 2,
+ "vsync1": 2,
+ "#sync_low1": 1,
+ "hhalf": 2,
+ "field2": 1,
+ "#superfield": 1,
+ "Blank": 1,
+ "Horizontal": 1,
+ "pal": 2,
+ "toggle": 1,
+ "phaseflip": 4,
+ "phasemask": 2,
+ "sync_scale1": 1,
+ "blank": 2,
+ "hsync_ret": 1,
+ "vsync_high": 1,
+ "#sync_high1": 1,
+ "Tasks": 1,
+ "performed": 1,
+ "sections": 1,
+ "during": 2,
+ "back": 8,
+ "porch": 9,
+ "load": 3,
+ "#_enable": 1,
+ "_pins": 4,
+ "_enable": 2,
+ "#disabled": 2,
+ "break": 6,
+ "return": 15,
+ "later": 6,
+ "rd": 1,
+ "#wtab": 1,
+ "ltab": 1,
+ "#ltab": 1,
+ "CLKFREQ": 10,
+ "cancel": 1,
+ "_broadcast": 4,
+ "m8": 3,
+ "jmpret": 5,
+ "taskptr": 3,
+ "taskret": 4,
+ "ctra": 5,
+ "pll": 5,
+ "fcolor": 4,
+ "#divide": 2,
+ "vco": 3,
+ "movi": 3,
+ "_111": 1,
+ "ctrb": 4,
+ "limit": 4,
+ "m128": 2,
+ "_100": 1,
+ "within": 5,
+ "_001": 1,
+ "frqb": 2,
+ "swap": 2,
+ "broadcast/baseband": 1,
+ "strip": 3,
+ "chroma": 19,
+ "baseband": 18,
+ "_auralcog": 1,
+ "_hx": 4,
+ "consider": 2,
+ "lineadd": 4,
+ "lineinc": 3,
+ "/160": 2,
+ "loaded": 3,
+ "#9": 2,
+ "FC": 2,
+ "_colors": 2,
+ "colorreg": 3,
+ "d6": 3,
+ "colorloop": 1,
+ "keep": 2,
+ "loading": 2,
+ "m1": 4,
+ "multiply_ret": 2,
+ "Disabled": 2,
+ "try": 2,
+ "again": 2,
+ "reload": 1,
+ "_000_000": 6,
+ "d0s1": 1,
+ "F0F0F0F0": 1,
+ "pins0": 1,
+ "_01110000_00001111_00000111": 1,
+ "pins1": 1,
+ "_11110111_01111111_01110111": 1,
+ "sync_high1": 1,
+ "_101010_0101": 1,
+ "NTSC/PAL": 2,
+ "metrics": 1,
+ "tables": 1,
+ "wtab": 1,
+ "sntsc": 3,
+ "lpal": 3,
+ "hrest": 2,
+ "vvis": 2,
+ "vrep": 2,
+ "_8A": 1,
+ "_AA": 1,
+ "sync_scale2": 1,
+ "_00000000_01_10101010101010_0101": 1,
+ "m2": 1,
+ "Parameter": 4,
+ "/non": 4,
+ "tccip": 3,
+ "_screen": 3,
+ "@long": 2,
+ "_ht": 2,
+ "_ho": 2,
+ "fit": 2,
+ "contiguous": 1,
+ "tv_status": 4,
+ "off/on": 3,
+ "tv_pins": 5,
+ "ntsc/pal": 3,
+ "tv_screen": 5,
+ "tv_ht": 5,
+ "tv_hx": 5,
+ "expansion": 8,
+ "tv_ho": 5,
+ "tv_broadcast": 4,
+ "aural": 13,
+ "fm": 6,
+ "preceding": 2,
+ "copied": 2,
+ "your": 2,
+ "code.": 2,
+ "After": 2,
+ "setting": 2,
+ "variables": 3,
+ "@tv_status": 3,
+ "All": 2,
+ "reloaded": 2,
+ "superframe": 2,
+ "allowing": 2,
+ "live": 2,
+ "changes.": 2,
+ "minimize": 2,
+ "correlate": 2,
+ "changes": 3,
+ "tv_status.": 1,
+ "Experimentation": 2,
+ "optimize": 2,
+ "some": 3,
+ "parameters.": 2,
+ "descriptions": 2,
+ "sets": 3,
+ "indicate": 2,
+ "disabled": 3,
+ "tv_enable": 2,
+ "requirement": 2,
+ "currently": 4,
+ "outputting": 4,
+ "driven": 2,
+ "reduces": 2,
+ "power": 3,
+ "_______": 2,
+ "select": 9,
+ "group": 7,
+ "_0111": 6,
+ "broadcast": 19,
+ "_1111": 6,
+ "_0000": 4,
+ "active": 3,
+ "top": 10,
+ "nibble": 4,
+ "bottom": 5,
+ "signal": 8,
+ "arranged": 3,
+ "attach": 1,
+ "ohm": 10,
+ "resistor": 4,
+ "sum": 7,
+ "/560/1100": 2,
+ "subcarrier": 3,
+ "network": 1,
+ "visual": 1,
+ "carrier": 1,
+ "selects": 4,
+ "x32": 6,
+ "tileheight": 4,
+ "controls": 4,
+ "mixing": 2,
+ "mix": 2,
+ "black/white": 2,
+ "composite": 1,
+ "progressive": 2,
+ "less": 5,
+ "good": 5,
+ "motion": 2,
+ "interlaced": 5,
+ "doubles": 1,
+ "format": 1,
+ "ticks": 11,
+ "must": 18,
+ "least": 14,
+ "_318_180": 1,
+ "_579_545": 1,
+ "Hz": 5,
+ "_734_472": 1,
+ "itself": 1,
+ "words": 5,
+ "define": 10,
+ "tv_vt": 3,
+ "has": 4,
+ "bitfields": 2,
+ "colorset": 2,
+ "ptr": 5,
+ "pixelgroup": 2,
+ "colorset*": 2,
+ "pixelgroup**": 2,
+ "ppppppppppcccc00": 2,
+ "colorsets": 4,
+ "four": 8,
+ "**": 2,
+ "pixelgroups": 2,
+ "": 5,
+ "tv_colors": 2,
+ "fields": 2,
+ "values": 2,
+ "luminance": 2,
+ "modulation": 4,
+ "adds/subtracts": 1,
+ "beware": 1,
+ "modulated": 1,
+ "produce": 1,
+ "saturated": 1,
+ "toggling": 1,
+ "levels": 1,
+ "because": 1,
+ "abruptly": 1,
+ "rather": 1,
+ "against": 1,
+ "white": 2,
+ "background": 1,
+ "best": 1,
+ "appearance": 1,
+ "_____": 6,
+ "practical": 2,
+ "/30": 1,
+ "factor": 4,
+ "sure": 4,
+ "||": 5,
+ "than": 5,
+ "tv_vx": 2,
+ "tv_vo": 2,
+ "pos/neg": 4,
+ "centered": 2,
+ "image": 2,
+ "shifts": 4,
+ "right/left": 2,
+ "up/down": 2,
+ "____________": 1,
+ "expressed": 1,
+ "ie": 1,
+ "channel": 1,
+ "_250_000": 2,
+ "modulator": 2,
+ "turned": 2,
+ "saves": 2,
+ "broadcasting": 1,
+ "___________": 1,
+ "tv_auralcog": 1,
+ "supply": 1,
+ "selected": 1,
+ "bandwidth": 2,
+ "KHz": 3,
+ "vary": 1,
+ "Terminal": 1,
+ "instead": 1,
+ "minimum": 2,
+ "x_scale": 4,
+ "x_spacing": 4,
+ "normal": 1,
+ "x_chr": 2,
+ "y_chr": 5,
+ "y_scale": 3,
+ "y_spacing": 3,
+ "y_offset": 2,
+ "x_limit": 2,
+ "x_screen": 1,
+ "y_limit": 3,
+ "y_screen": 4,
+ "y_max": 3,
+ "y_screen_bytes": 2,
+ "y_scroll": 2,
+ "y_scroll_longs": 4,
+ "y_clear": 2,
+ "y_clear_longs": 2,
+ "paramcount": 1,
+ "ccinp": 1,
+ "tv_hc": 1,
+ "cells": 1,
+ "cell": 1,
+ "@bitmap": 1,
+ "FC0": 1,
+ "gr.textmode": 1,
+ "gr.width": 1,
+ "tv.stop": 2,
+ "gr.stop": 1,
+ "schemes": 1,
+ "tab": 3,
+ "gr.color": 1,
+ "gr.text": 1,
+ "@c": 1,
+ "gr.finish": 2,
+ "newline": 3,
+ "strsize": 2,
+ "_000_000_000": 2,
+ "//": 4,
+ "elseif": 2,
+ "lookupz": 2,
+ "..": 4,
+ "PRI": 1,
+ "longmove": 2,
+ "longfill": 2,
+ "tvparams": 1,
+ "tvparams_pins": 1,
+ "_0101": 1,
+ "vc": 1,
+ "vx": 2,
+ "vo": 1,
+ "auralcog": 1,
+ "color_schemes": 1,
+ "BC_6C_05_02": 1,
+ "E_0D_0C_0A": 1,
+ "E_6D_6C_6A": 1,
+ "BE_BD_BC_BA": 1,
+ "Text": 1,
+ "x13": 2,
+ "cols": 5,
+ "rows": 4,
+ "screensize": 4,
+ "lastrow": 2,
+ "tv_count": 2,
+ "row": 4,
+ "tv": 2,
+ "basepin": 3,
+ "setcolors": 2,
+ "@palette": 1,
+ "@tv_params": 1,
+ "@screen": 3,
+ "tv.start": 1,
+ "stringptr": 3,
+ "k": 1,
+ "Output": 1,
+ "backspace": 1,
+ "spaces": 1,
+ "follows": 4,
+ "Y": 2,
+ "others": 1,
+ "printable": 1,
+ "characters": 1,
+ "wordfill": 2,
+ "print": 2,
+ "A..": 1,
+ "other": 1,
+ "colorptr": 2,
+ "fore": 3,
+ "Override": 1,
+ "default": 1,
+ "palette": 2,
+ "list": 1,
+ "scroll": 1,
+ "hc": 1,
+ "ho": 1,
+ "dark": 2,
+ "blue": 3,
+ "BB": 1,
+ "yellow": 1,
+ "brown": 1,
+ "cyan": 3,
+ "red": 2,
+ "pink": 1,
+ "VGA": 8,
+ "vga_mode": 3,
+ "vgaptr": 3,
+ "hv": 5,
+ "bcolor": 3,
+ "#colortable": 2,
+ "#blank_line": 3,
+ "nobl": 1,
+ "_vx": 1,
+ "nobp": 1,
+ "nofp": 1,
+ "#blank_hsync": 1,
+ "front": 4,
+ "vf": 1,
+ "nofl": 1,
+ "#tasks": 1,
+ "before": 1,
+ "_vs": 2,
+ "except": 1,
+ "#blank_vsync": 1,
+ "#field": 1,
+ "superfield": 1,
+ "blank_vsync": 1,
+ "h2": 2,
+ "if_c_and_nz": 1,
+ "blank_hsync": 1,
+ "_hf": 1,
+ "invisble": 1,
+ "_hb": 1,
+ "#hv": 1,
+ "blank_hsync_ret": 1,
+ "blank_line_ret": 1,
+ "blank_vsync_ret": 1,
+ "_status": 1,
+ "#paramcount": 1,
+ "directions": 1,
+ "_rate": 3,
+ "pllmin": 1,
+ "_011": 1,
+ "rate": 6,
+ "hvbase": 5,
+ "frqa": 3,
+ "vmask": 1,
+ "hmask": 1,
+ "vcfg": 2,
+ "colormask": 1,
+ "waitcnt": 3,
+ "#entry": 1,
+ "Initialized": 1,
+ "lowest": 1,
+ "pllmax": 1,
+ "*16": 1,
+ "m4": 1,
+ "tihv": 1,
+ "_hd": 1,
+ "_hs": 1,
+ "_vd": 1,
+ "underneath": 1,
+ "BF": 1,
+ "___": 1,
+ "/1/2": 1,
+ "off/visible/invisible": 1,
+ "vga_enable": 3,
+ "pppttt": 1,
+ "vga_colors": 2,
+ "vga_vt": 6,
+ "vga_vx": 4,
+ "vga_vo": 4,
+ "vga_hf": 2,
+ "vga_hb": 2,
+ "vga_vf": 2,
+ "vga_vb": 2,
+ "tick": 2,
+ "@vga_status": 1,
+ "vga_status.": 1,
+ "__________": 4,
+ "vga_status": 1,
+ "________": 3,
+ "vga_pins": 1,
+ "monitors": 1,
+ "allows": 1,
+ "polarity": 1,
+ "respectively": 1,
+ "vga_screen": 1,
+ "vga_ht": 3,
+ "care": 1,
+ "suggested": 1,
+ "bits/pins": 3,
+ "green": 1,
+ "bit/pin": 1,
+ "signals": 1,
+ "connect": 3,
+ "RED": 1,
+ "BLUE": 1,
+ "connector": 3,
+ "always": 2,
+ "HSYNC": 1,
+ "VSYNC": 1,
+ "______": 14,
+ "vga_hx": 3,
+ "vga_ho": 2,
+ "equal": 1,
+ "vga_hd": 2,
+ "exceed": 1,
+ "vga_vd": 2,
+ "recommended": 2,
+ "vga_hs": 1,
+ "vga_vs": 1,
+ "vga_rate": 2,
+ "should": 1,
+ "Vocal": 2,
+ "Tract": 2,
+ "October": 1,
+ "synthesizes": 1,
+ "human": 1,
+ "vocal": 10,
+ "tract": 12,
+ "real": 2,
+ "It": 1,
+ "MHz.": 1,
+ "controlled": 1,
+ "reside": 1,
+ "parent": 1,
+ "aa": 2,
+ "ga": 5,
+ "gp": 2,
+ "vp": 3,
+ "vr": 1,
+ "f1": 4,
+ "f2": 1,
+ "f3": 3,
+ "f4": 2,
+ "na": 2,
+ "nf": 2,
+ "fa": 2,
+ "ff": 2,
+ "values.": 2,
+ "Before": 1,
+ "were": 1,
+ "interpolation": 1,
+ "shy": 1,
+ "frame": 12,
+ "makes": 1,
+ "behave": 1,
+ "sensibly": 1,
+ "gaps.": 1,
+ "frame_buffers": 2,
+ "bytes": 2,
+ "frame_longs": 3,
+ "frame_bytes": 1,
+ "...must": 1,
+ "dira_": 3,
+ "dirb_": 1,
+ "ctra_": 1,
+ "ctrb_": 3,
+ "frqa_": 3,
+ "cnt_": 1,
+ "many": 1,
+ "...contiguous": 1,
+ "tract_ptr": 3,
+ "pos_pin": 7,
+ "neg_pin": 6,
+ "fm_offset": 5,
+ "positive": 1,
+ "also": 1,
+ "enabled": 2,
+ "generation": 2,
+ "_500_000": 1,
+ "Remember": 1,
+ "duty": 2,
+ "Ready": 1,
+ "clkfreq": 2,
+ "Launch": 1,
+ "@attenuation": 1,
+ "Reset": 1,
+ "buffers": 1,
+ "@index": 1,
+ "constant": 3,
+ "frame_buffer_longs": 2,
+ "set_attenuation": 1,
+ "master": 2,
+ "attenuation": 3,
+ "initially": 2,
+ "set_pace": 2,
+ "percentage": 3,
+ "pace": 3,
+ "go": 1,
+ "Queue": 1,
+ "transition": 1,
+ "over": 2,
+ "Load": 1,
+ "bytemove": 1,
+ "@frames": 1,
+ "index": 5,
+ "Increment": 1,
+ "Returns": 4,
+ "queue": 2,
+ "useful": 2,
+ "checking": 1,
+ "would": 1,
+ "have": 1,
+ "frames": 2,
+ "empty": 2,
+ "detecting": 1,
+ "finished": 1,
+ "sample_ptr": 1,
+ "receives": 1,
+ "audio": 1,
+ "samples": 1,
+ "updated": 1,
+ "@sample": 1,
+ "aural_id": 1,
+ "id": 2,
+ "executing": 1,
+ "algorithm": 1,
+ "connecting": 1,
+ "Initialization": 1,
+ "reserved": 3,
+ "clear_cnt": 1,
+ "#2*15": 1,
+ "hub": 1,
+ "minst": 3,
+ "d0s0": 3,
+ "mult_ret": 1,
+ "antilog_ret": 1,
+ "assemble": 1,
+ "cordic": 4,
+ "reserves": 2,
+ "cstep": 1,
+ "instruction": 2,
+ "prepare": 1,
+ "cnt_value": 3,
+ "cnt_ticks": 3,
+ "Loop": 1,
+ "sample": 2,
+ "period": 1,
+ "cycle": 1,
+ "driving": 1,
+ "h80000000": 2,
+ "White": 1,
+ "noise": 3,
+ "source": 2,
+ "lfsr": 1,
+ "lfsr_taps": 2,
+ "Aspiration": 1,
+ "vibrato": 3,
+ "vphase": 2,
+ "glottal": 2,
+ "pitch": 5,
+ "mesh": 1,
+ "tune": 2,
+ "convert": 1,
+ "log": 2,
+ "phase": 2,
+ "gphase": 3,
+ "formant2": 2,
+ "rotate": 2,
+ "f2x": 3,
+ "f2y": 3,
+ "#cordic": 2,
+ "formant4": 2,
+ "f4x": 3,
+ "f4y": 3,
+ "subtract": 1,
+ "nx": 4,
+ "negated": 1,
+ "nasal": 2,
+ "amplitude": 3,
+ "#mult": 1,
+ "fphase": 4,
+ "frication": 2,
+ "#sine": 1,
+ "Handle": 1,
+ "frame_ptr": 6,
+ "past": 1,
+ "miscellaneous": 2,
+ "frame_index": 3,
+ "stepsize": 2,
+ "step_size": 5,
+ "h00FFFFFF": 2,
+ "final1": 2,
+ "finali": 2,
+ "iterate": 3,
+ "aa..ff": 4,
+ "accurate": 1,
+ "accumulation": 1,
+ "step_acc": 3,
+ "set2": 3,
+ "#par_curr": 1,
+ "set3": 2,
+ "#par_next": 1,
+ "set4": 3,
+ "#par_step": 1,
+ "#24": 1,
+ "par_curr": 3,
+ "absolute": 1,
+ "msb": 2,
+ "nr": 1,
+ "mult": 2,
+ "par_step": 1,
+ "frame_cnt": 2,
+ "step1": 2,
+ "stepi": 1,
+ "stepframe": 1,
+ "#frame_bytes": 1,
+ "par_next": 2,
+ "Math": 1,
+ "Subroutines": 1,
+ "Antilog": 1,
+ "whole": 2,
+ "fraction": 1,
+ "antilog": 2,
+ "FFEA0000": 1,
+ "h00000FFE": 2,
+ "insert": 2,
+ "leading": 1,
+ "Scaled": 1,
+ "unsigned": 3,
+ "h00001000": 2,
+ "negc": 1,
+ "Multiply": 1,
+ "#15": 1,
+ "mult_step": 1,
+ "Cordic": 1,
+ "degree": 1,
+ "#cordic_steps": 1,
+ "gets": 1,
+ "assembled": 1,
+ "cordic_dx": 1,
+ "incremented": 1,
+ "cordic_a": 1,
+ "cordic_delta": 2,
+ "linear": 1,
+ "register": 1,
+ "B901476": 1,
+ "greater": 1,
+ "h40000000": 1,
+ "h01000000": 1,
+ "FFFFFF": 1,
+ "h00010000": 1,
+ "h0000D000": 1,
+ "D000": 1,
+ "h00007000": 1,
+ "FFE": 1,
+ "h00000800": 1,
+ "registers": 2,
+ "startup": 2,
+ "Data": 1,
+ "zeroed": 1,
+ "cleared": 1,
+ "f1x": 1,
+ "f1y": 1,
+ "f3x": 1,
+ "f3y": 1,
+ "aspiration": 1,
+ "***": 1,
+ "mult_steps": 1,
+ "assembly": 1,
+ "area": 1,
+ "w/ret": 1,
+ "cordic_ret": 1
+ },
"Protocol Buffer": {
"package": 1,
"tutorial": 1,
@@ -49262,33 +56559,244 @@
"entry.completed": 1
},
"Python": {
- "from": 34,
+ "xspacing": 4,
+ "#": 28,
+ "How": 2,
+ "far": 1,
+ "apart": 1,
+ "should": 1,
+ "each": 1,
+ "horizontal": 1,
+ "location": 1,
+ "be": 1,
+ "spaced": 1,
+ "maxwaves": 3,
+ "total": 1,
+ "of": 5,
+ "waves": 1,
+ "to": 5,
+ "add": 1,
+ "together": 1,
+ "theta": 3,
+ "amplitude": 3,
+ "[": 165,
+ "]": 165,
+ "Height": 1,
+ "wave": 2,
+ "dx": 8,
+ "yvalues": 7,
+ "def": 87,
+ "setup": 2,
+ "(": 850,
+ ")": 861,
+ "size": 5,
+ "frameRate": 1,
+ "colorMode": 1,
+ "RGB": 1,
+ "w": 2,
+ "width": 1,
+ "+": 51,
+ "for": 69,
+ "i": 13,
+ "in": 91,
+ "range": 5,
+ "amplitude.append": 1,
+ "random": 2,
+ "period": 2,
+ "many": 1,
+ "pixels": 1,
+ "before": 1,
+ "the": 6,
+ "repeats": 1,
+ "dx.append": 1,
+ "TWO_PI": 1,
+ "/": 26,
+ "*": 38,
+ "_": 6,
+ "yvalues.append": 1,
+ "draw": 2,
+ "background": 2,
+ "calcWave": 2,
+ "renderWave": 2,
+ "len": 11,
+ "j": 7,
+ "x": 34,
+ "if": 160,
+ "%": 33,
+ "sin": 1,
+ "else": 33,
+ "cos": 1,
+ "noStroke": 2,
+ "fill": 2,
+ "ellipseMode": 1,
+ "CENTER": 1,
+ "v": 19,
+ "enumerate": 2,
+ "ellipse": 1,
+ "height": 1,
+ "import": 55,
+ "os": 2,
+ "sys": 3,
+ "json": 1,
+ "c4d": 1,
+ "c4dtools": 1,
+ "itertools": 1,
+ "from": 36,
+ "c4d.modules": 1,
+ "graphview": 1,
+ "as": 14,
+ "gv": 1,
+ "c4dtools.misc": 1,
+ "graphnode": 1,
+ "res": 3,
+ "importer": 1,
+ "c4dtools.prepare": 1,
+ "__file__": 1,
+ "__res__": 1,
+ "settings": 2,
+ "c4dtools.helpers.Attributor": 2,
+ "{": 27,
+ "res.file": 3,
+ "}": 27,
+ "align_nodes": 2,
+ "nodes": 11,
+ "mode": 5,
+ "spacing": 7,
+ "r": 9,
+ "modes": 3,
+ "not": 69,
+ "return": 68,
+ "raise": 23,
+ "ValueError": 6,
+ ".join": 4,
+ "get_0": 12,
+ "lambda": 6,
+ "x.x": 1,
+ "get_1": 4,
+ "x.y": 1,
+ "set_0": 6,
+ "setattr": 16,
+ "set_1": 4,
+ "graphnode.GraphNode": 1,
+ "n": 6,
+ "nodes.sort": 1,
+ "key": 6,
+ "n.position": 1,
+ "midpoint": 3,
+ "graphnode.find_nodes_mid": 1,
+ "first_position": 2,
+ ".position": 1,
+ "new_positions": 2,
+ "prev_offset": 6,
+ "node": 2,
+ "position": 12,
+ "node.position": 2,
+ "-": 36,
+ "node.size": 1,
+ "<": 2,
+ "new_positions.append": 1,
+ "bbox_size": 2,
+ "bbox_size_2": 2,
+ "itertools.izip": 1,
+ "align_nodes_shortcut": 3,
+ "master": 2,
+ "gv.GetMaster": 1,
+ "root": 3,
+ "master.GetRoot": 1,
+ "graphnode.find_selected_nodes": 1,
+ "master.AddUndo": 1,
+ "c4d.EventAdd": 1,
+ "True": 25,
+ "class": 19,
+ "XPAT_Options": 3,
+ "defaults": 1,
+ "__init__": 7,
+ "self": 113,
+ "filename": 12,
+ "None": 92,
+ "super": 4,
+ ".__init__": 3,
+ "self.load": 1,
+ "load": 1,
+ "is": 31,
+ "settings.options_filename": 2,
+ "os.path.isfile": 1,
+ "self.dict_": 2,
+ "self.defaults.copy": 2,
+ "with": 2,
+ "open": 2,
+ "fp": 4,
+ "self.dict_.update": 1,
+ "json.load": 1,
+ "self.save": 1,
+ "save": 2,
+ "values": 15,
+ "dict": 4,
+ "k": 7,
+ "self.dict_.iteritems": 1,
+ "self.defaults": 1,
+ "json.dump": 1,
+ "XPAT_OptionsDialog": 2,
+ "c4d.gui.GeDialog": 1,
+ "CreateLayout": 1,
+ "self.LoadDialogResource": 1,
+ "res.DLG_OPTIONS": 1,
+ "InitValues": 1,
+ "self.SetLong": 2,
+ "res.EDT_HSPACE": 2,
+ "options.hspace": 3,
+ "res.EDT_VSPACE": 2,
+ "options.vspace": 3,
+ "Command": 1,
+ "id": 2,
+ "msg": 1,
+ "res.BTN_SAVE": 1,
+ "self.GetLong": 2,
+ "options.save": 1,
+ "self.Close": 1,
+ "XPAT_Command_OpenOptionsDialog": 2,
+ "c4dtools.plugins.Command": 3,
+ "self._dialog": 4,
+ "@property": 2,
+ "dialog": 1,
+ "PLUGIN_ID": 3,
+ "PLUGIN_NAME": 3,
+ "res.string.XPAT_COMMAND_OPENOPTIONSDIALOG": 1,
+ "PLUGIN_HELP": 3,
+ "res.string.XPAT_COMMAND_OPENOPTIONSDIALOG_HELP": 1,
+ "Execute": 3,
+ "doc": 3,
+ "self.dialog.Open": 1,
+ "c4d.DLG_TYPE_MODAL": 1,
+ "XPAT_Command_AlignHorizontal": 1,
+ "res.string.XPAT_COMMAND_ALIGNHORIZONTAL": 1,
+ "PLUGIN_ICON": 2,
+ "res.string.XPAT_COMMAND_ALIGNHORIZONTAL_HELP": 1,
+ "XPAT_Command_AlignVertical": 1,
+ "res.string.XPAT_COMMAND_ALIGNVERTICAL": 1,
+ "res.string.XPAT_COMMAND_ALIGNVERTICAL_HELP": 1,
+ "options": 4,
+ "__name__": 3,
+ "c4dtools.plugins.main": 1,
"__future__": 2,
- "import": 47,
"unicode_literals": 1,
"copy": 1,
- "sys": 2,
"functools": 1,
"update_wrapper": 2,
"future_builtins": 1,
"zip": 8,
"django.db.models.manager": 1,
- "#": 13,
"Imported": 1,
- "to": 4,
"register": 1,
"signal": 1,
"handler.": 1,
"django.conf": 1,
- "settings": 1,
"django.core.exceptions": 1,
- "(": 719,
"ObjectDoesNotExist": 2,
"MultipleObjectsReturned": 2,
"FieldError": 4,
"ValidationError": 8,
"NON_FIELD_ERRORS": 3,
- ")": 730,
"django.core": 1,
"validators": 1,
"django.db.models.fields": 1,
@@ -49318,8 +56826,6 @@
"get_model": 3,
"django.utils.translation": 1,
"ugettext_lazy": 1,
- "as": 11,
- "_": 5,
"django.utils.functional": 1,
"curry": 6,
"django.utils.encoding": 1,
@@ -49328,54 +56834,37 @@
"django.utils.text": 1,
"get_text_list": 2,
"capfirst": 6,
- "class": 14,
"ModelBase": 4,
"type": 6,
- "def": 68,
"__new__": 2,
"cls": 32,
"name": 39,
"bases": 6,
"attrs": 7,
"super_new": 3,
- "super": 2,
".__new__": 1,
"parents": 8,
- "[": 152,
"b": 11,
- "for": 59,
- "in": 79,
- "if": 145,
"isinstance": 11,
- "]": 152,
- "not": 64,
- "return": 57,
"module": 6,
"attrs.pop": 2,
"new_class": 9,
- "{": 25,
- "}": 25,
"attr_meta": 5,
- "None": 86,
"abstract": 3,
"getattr": 30,
"False": 28,
"meta": 12,
- "else": 30,
"base_meta": 2,
- "is": 29,
"model_module": 1,
"sys.modules": 1,
"new_class.__module__": 1,
"kwargs": 9,
"model_module.__name__.split": 1,
- "-": 30,
"new_class.add_to_class": 7,
"**kwargs": 9,
"subclass_exception": 3,
"tuple": 3,
"x.DoesNotExist": 1,
- "x": 22,
"hasattr": 11,
"and": 35,
"x._meta.abstract": 2,
@@ -49401,7 +56890,6 @@
"attrs.items": 1,
"new_fields": 2,
"new_class._meta.local_fields": 3,
- "+": 37,
"new_class._meta.local_many_to_many": 2,
"new_class._meta.virtual_fields": 1,
"field_names": 5,
@@ -49412,15 +56900,12 @@
"parent": 5,
"parent._meta.abstract": 1,
"parent._meta.fields": 1,
- "raise": 22,
"TypeError": 4,
- "%": 32,
"continue": 10,
"new_class._meta.setup_proxy": 1,
"new_class._meta.concrete_model": 2,
"base._meta.concrete_model": 2,
"o2o_map": 3,
- "dict": 3,
"f.rel.to": 1,
"original_base": 1,
"parent_fields": 3,
@@ -49434,7 +56919,6 @@
"attr_name": 3,
"base._meta.module_name": 1,
"auto_created": 1,
- "True": 20,
"parent_link": 1,
"new_class._meta.parents": 1,
"copy.deepcopy": 2,
@@ -49459,7 +56943,6 @@
"add_to_class": 1,
"value": 9,
"value.contribute_to_class": 1,
- "setattr": 14,
"_prepare": 1,
"opts": 5,
"cls._meta": 3,
@@ -49478,7 +56961,6 @@
"opts.order_with_respect_to.rel.to": 1,
"cls.__doc__": 3,
"cls.__name__": 1,
- ".join": 3,
"f.attname": 5,
"opts.fields": 1,
"cls.get_absolute_url": 3,
@@ -49487,8 +56969,6 @@
"sender": 5,
"ModelState": 2,
"object": 6,
- "__init__": 5,
- "self": 100,
"db": 2,
"self.db": 1,
"self.adding": 1,
@@ -49501,7 +56981,6 @@
"args": 8,
"self._state": 1,
"args_len": 2,
- "len": 9,
"self._meta.fields": 5,
"IndexError": 2,
"fields_iter": 4,
@@ -49522,7 +57001,6 @@
"property": 2,
"AttributeError": 1,
"pass": 4,
- ".__init__": 1,
"signals.post_init.send": 1,
"instance": 5,
"__repr__": 2,
@@ -49561,12 +57039,10 @@
"serializable_value": 1,
"field_name": 8,
"self._meta.get_field_by_name": 1,
- "save": 1,
"force_insert": 7,
"force_update": 10,
"using": 30,
"update_fields": 23,
- "ValueError": 5,
"frozenset": 2,
"field.primary_key": 1,
"non_model_fields": 2,
@@ -49595,13 +57071,11 @@
"manager.using": 3,
".filter": 7,
".exists": 1,
- "values": 13,
"f.pre_save": 1,
"rows": 3,
"._update": 1,
"meta.order_with_respect_to": 2,
"order_value": 2,
- "*": 33,
".count": 1,
"self._order": 1,
"fields": 12,
@@ -49661,8 +57135,6 @@
"self._perform_unique_checks": 1,
"date_errors": 1,
"self._perform_date_checks": 1,
- "k": 4,
- "v": 11,
"date_errors.items": 1,
"errors.setdefault": 3,
".extend": 2,
@@ -49700,7 +57172,6 @@
"model_class._meta": 2,
"qs.exclude": 2,
"qs.exists": 2,
- "key": 5,
".append": 2,
"self.unique_error_message": 1,
"_perform_date_checks": 1,
@@ -49722,7 +57193,6 @@
"field.error_messages": 1,
"field_labels": 4,
"map": 1,
- "lambda": 1,
"full_clean": 1,
"self.clean_fields": 1,
"e": 13,
@@ -49744,15 +57214,11 @@
"ordered_obj._meta.order_with_respect_to.rel.field_name": 2,
"order_name": 4,
"ordered_obj._meta.order_with_respect_to.name": 2,
- "i": 7,
- "j": 2,
- "enumerate": 1,
"ordered_obj.objects.filter": 2,
".update": 1,
"_order": 1,
"pk_name": 3,
"ordered_obj._meta.pk.name": 1,
- "r": 3,
".values": 1,
"##############################################": 2,
"func": 2,
@@ -49781,8 +57247,6 @@
"decorate": 2,
"based": 1,
"views": 1,
- "the": 5,
- "of": 3,
"as_view": 1,
".": 1,
"However": 1,
@@ -49818,6 +57282,22 @@
"meth": 5,
"request.method.lower": 1,
"request.method": 2,
+ "P3D": 1,
+ "lights": 1,
+ "camera": 1,
+ "mouseY": 1,
+ "eyeX": 1,
+ "eyeY": 1,
+ "eyeZ": 1,
+ "centerX": 1,
+ "centerY": 1,
+ "centerZ": 1,
+ "upX": 1,
+ "upY": 1,
+ "upZ": 1,
+ "box": 1,
+ "stroke": 1,
+ "line": 3,
"google.protobuf": 4,
"descriptor": 1,
"_descriptor": 1,
@@ -49833,7 +57313,6 @@
"_PERSON": 3,
"_descriptor.Descriptor": 1,
"full_name": 2,
- "filename": 1,
"file": 1,
"containing_type": 2,
"_descriptor.FieldDescriptor": 1,
@@ -49847,7 +57326,6 @@
"enum_type": 1,
"is_extension": 1,
"extension_scope": 1,
- "options": 3,
"extensions": 1,
"nested_types": 1,
"enum_types": 1,
@@ -49861,13 +57339,11 @@
"_reflection.GeneratedProtocolMessageType": 1,
"SHEBANG#!python": 4,
"print": 39,
- "os": 1,
"main": 4,
"usage": 3,
"string": 1,
"command": 4,
"sys.argv": 2,
- "<": 1,
"sys.exit": 1,
"printDelimiter": 4,
"get": 1,
@@ -49890,7 +57366,6 @@
"os.walk": 1,
".next": 1,
"os.path.isdir": 1,
- "__name__": 2,
"argparse": 1,
"matplotlib.pyplot": 1,
"pl": 1,
@@ -49903,7 +57378,6 @@
"S": 4,
"phif": 7,
"U": 10,
- "/": 23,
"_parse_args": 2,
"V": 12,
"np.genfromtxt": 8,
@@ -50000,7 +57474,6 @@
"phi": 5,
"c": 3,
"a*x": 1,
- "dx": 6,
"d**": 2,
"dy": 4,
"dx_err": 3,
@@ -50192,7 +57665,6 @@
"uri.partition": 1,
"self.arguments": 2,
"supports_http_1_1": 1,
- "@property": 1,
"cookies": 1,
"self._cookies": 3,
"Cookie.SimpleCookie": 1,
@@ -50204,10 +57676,8 @@
"get_ssl_certificate": 1,
"self.connection.stream.socket.getpeercert": 1,
"ssl.SSLError": 1,
- "n": 3,
"_valid_ip": 1,
"ip": 2,
- "res": 2,
"socket.getaddrinfo": 1,
"socket.AF_UNSPEC": 1,
"socket.SOCK_STREAM": 1,
@@ -50216,37 +57686,198 @@
"e.args": 1,
"socket.EAI_NONAME": 1
},
+ "QMake": {
+ "QT": 4,
+ "+": 13,
+ "core": 2,
+ "gui": 2,
+ "greaterThan": 1,
+ "(": 8,
+ "QT_MAJOR_VERSION": 1,
+ ")": 8,
+ "widgets": 1,
+ "contains": 2,
+ "QT_CONFIG": 2,
+ "opengl": 2,
+ "|": 1,
+ "opengles2": 1,
+ "{": 6,
+ "}": 6,
+ "else": 2,
+ "DEFINES": 1,
+ "QT_NO_OPENGL": 1,
+ "TEMPLATE": 2,
+ "app": 2,
+ "win32": 2,
+ "TARGET": 3,
+ "BlahApp": 1,
+ "RC_FILE": 1,
+ "Resources/winres.rc": 1,
+ "blahapp": 1,
+ "include": 1,
+ "functions.pri": 1,
+ "SOURCES": 2,
+ "file.cpp": 2,
+ "HEADERS": 2,
+ "file.h": 2,
+ "FORMS": 2,
+ "file.ui": 1,
+ "RESOURCES": 1,
+ "res.qrc": 1,
+ "exists": 1,
+ ".git/HEAD": 1,
+ "system": 2,
+ "git": 1,
+ "rev": 1,
+ "-": 1,
+ "parse": 1,
+ "HEAD": 1,
+ "rev.txt": 2,
+ "echo": 1,
+ "ThisIsNotAGitRepo": 1,
+ "SHEBANG#!qmake": 1,
+ "message": 1,
+ "This": 1,
+ "is": 1,
+ "QMake.": 1,
+ "CONFIG": 1,
+ "qt": 1,
+ "simpleapp": 1,
+ "file2.c": 1,
+ "This/Is/Folder/file3.cpp": 1,
+ "file2.h": 1,
+ "This/Is/Folder/file3.h": 1,
+ "This/Is/Folder/file3.ui": 1,
+ "Test.ui": 1
+ },
"R": {
- "SHEBANG#!Rscript": 1,
+ "df.residual.mira": 1,
+ "<": 46,
+ "-": 53,
+ "function": 18,
+ "(": 219,
+ "object": 12,
+ "...": 4,
+ ")": 220,
+ "{": 58,
+ "fit": 2,
+ "analyses": 1,
+ "[": 23,
+ "]": 24,
+ "return": 8,
+ "df.residual": 2,
+ "}": 58,
+ "df.residual.lme": 1,
+ "fixDF": 1,
+ "df.residual.mer": 1,
+ "sum": 1,
+ "object@dims": 1,
+ "*": 2,
+ "c": 11,
+ "+": 4,
+ "df.residual.default": 1,
+ "q": 3,
+ "df": 3,
+ "if": 19,
+ "is.null": 8,
+ "mk": 2,
+ "try": 3,
+ "coef": 1,
+ "silent": 3,
+ "TRUE": 14,
+ "mn": 2,
+ "f": 9,
+ "fitted": 1,
+ "inherits": 6,
+ "|": 3,
+ "NULL": 2,
+ "n": 3,
+ "ifelse": 1,
+ "is.data.frame": 1,
+ "is.matrix": 1,
+ "nrow": 1,
+ "length": 3,
+ "k": 3,
+ "max": 1,
+ "SHEBANG#!Rscript": 2,
+ "#": 45,
+ "MedianNorm": 2,
+ "data": 13,
+ "geomeans": 3,
+ "<->": 1,
+ "exp": 1,
+ "rowMeans": 1,
+ "log": 5,
+ "apply": 2,
+ "2": 1,
+ "cnts": 2,
+ "median": 1,
+ "library": 1,
+ "print_usage": 2,
+ "file": 4,
+ "stderr": 1,
+ "cat": 1,
+ "spec": 2,
+ "matrix": 3,
+ "byrow": 3,
+ "ncol": 3,
+ "opt": 23,
+ "getopt": 1,
+ "help": 1,
+ "stdout": 1,
+ "status": 1,
+ "height": 7,
+ "out": 4,
+ "res": 6,
+ "width": 7,
+ "ylim": 7,
+ "read.table": 1,
+ "header": 1,
+ "sep": 4,
+ "quote": 1,
+ "nsamp": 8,
+ "dim": 1,
+ "outfile": 4,
+ "sprintf": 2,
+ "png": 2,
+ "h": 13,
+ "hist": 4,
+ "plot": 7,
+ "FALSE": 9,
+ "mids": 4,
+ "density": 4,
+ "type": 3,
+ "col": 4,
+ "rainbow": 4,
+ "main": 2,
+ "xlab": 2,
+ "ylab": 2,
+ "for": 4,
+ "i": 6,
+ "in": 8,
+ "lines": 6,
+ "devnum": 2,
+ "dev.off": 2,
+ "size.factors": 2,
+ "data.matrix": 1,
+ "data.norm": 3,
+ "t": 1,
+ "x": 3,
+ "/": 1,
"ParseDates": 2,
- "<": 12,
- "-": 12,
- "function": 3,
- "(": 29,
- "lines": 4,
- ")": 29,
- "{": 3,
"dates": 3,
- "matrix": 2,
"unlist": 2,
- "strsplit": 2,
- "ncol": 2,
- "byrow": 2,
- "TRUE": 3,
+ "strsplit": 3,
"days": 2,
- "[": 4,
- "]": 4,
"times": 2,
"hours": 2,
"all.days": 2,
- "c": 2,
"all.hours": 2,
"data.frame": 1,
"Day": 2,
"factor": 2,
"levels": 2,
"Hour": 2,
- "}": 3,
"Main": 2,
"system": 1,
"intern": 1,
@@ -50257,8 +57888,6 @@
"ggplot": 1,
"aes": 2,
"y": 1,
- "x": 1,
- "+": 2,
"geom_point": 1,
"size": 1,
"Freq": 1,
@@ -50266,11 +57895,214 @@
"range": 1,
"ggsave": 1,
"filename": 1,
- "plot": 1,
- "width": 1,
- "height": 1,
"hello": 2,
"print": 1,
+ "module": 25,
+ "code": 21,
+ "available": 1,
+ "via": 1,
+ "the": 16,
+ "environment": 4,
+ "like": 1,
+ "it": 3,
+ "returns.": 1,
+ "@param": 2,
+ "an": 1,
+ "identifier": 1,
+ "specifying": 1,
+ "full": 1,
+ "path": 9,
+ "search": 5,
+ "see": 1,
+ "Details": 1,
+ "even": 1,
+ "attach": 11,
+ "is": 7,
+ "optionally": 1,
+ "attached": 2,
+ "to": 9,
+ "of": 2,
+ "current": 2,
+ "scope": 1,
+ "defaults": 1,
+ ".": 7,
+ "However": 1,
+ "interactive": 2,
+ "invoked": 1,
+ "directly": 1,
+ "from": 5,
+ "terminal": 1,
+ "only": 1,
+ "i.e.": 1,
+ "not": 4,
+ "within": 1,
+ "modules": 4,
+ "import.attach": 1,
+ "can": 3,
+ "be": 8,
+ "set": 2,
+ "or": 1,
+ "depending": 1,
+ "on": 2,
+ "user": 1,
+ "s": 2,
+ "preference.": 1,
+ "attach_operators": 3,
+ "causes": 1,
+ "emph": 3,
+ "operators": 3,
+ "by": 2,
+ "default": 1,
+ "path.": 1,
+ "Not": 1,
+ "attaching": 1,
+ "them": 1,
+ "therefore": 1,
+ "drastically": 1,
+ "limits": 1,
+ "a": 6,
+ "usefulness.": 1,
+ "Modules": 1,
+ "are": 4,
+ "searched": 1,
+ "options": 1,
+ "priority.": 1,
+ "The": 5,
+ "directory": 1,
+ "always": 1,
+ "considered": 1,
+ "first.": 1,
+ "That": 1,
+ "local": 3,
+ "./a.r": 1,
+ "will": 2,
+ "loaded.": 1,
+ "Module": 1,
+ "names": 2,
+ "fully": 1,
+ "qualified": 1,
+ "refer": 1,
+ "nested": 1,
+ "paths.": 1,
+ "See": 1,
+ "import": 5,
+ "executed": 1,
+ "global": 1,
+ "effect": 1,
+ "same.": 1,
+ "When": 1,
+ "used": 2,
+ "globally": 1,
+ "inside": 1,
+ "newly": 2,
+ "outside": 1,
+ "nor": 1,
+ "other": 2,
+ "which": 3,
+ "might": 1,
+ "loaded": 4,
+ "@examples": 1,
+ "@seealso": 3,
+ "reload": 3,
+ "@export": 2,
+ "substitute": 2,
+ "stopifnot": 3,
+ "missing": 1,
+ "&&": 2,
+ "module_name": 7,
+ "getOption": 1,
+ "else": 4,
+ "class": 4,
+ "module_path": 15,
+ "find_module": 1,
+ "stop": 1,
+ "attr": 2,
+ "message": 1,
+ "containing_modules": 3,
+ "module_init_files": 1,
+ "mapply": 1,
+ "do_import": 4,
+ "mod_ns": 5,
+ "as.character": 3,
+ "module_parent": 8,
+ "parent.frame": 2,
+ "mod_env": 7,
+ "exhibit_namespace": 3,
+ "identical": 2,
+ ".GlobalEnv": 2,
+ "name": 10,
+ "environmentName": 2,
+ "parent.env": 4,
+ "export_operators": 2,
+ "invisible": 1,
+ "is_module_loaded": 1,
+ "get_loaded_module": 1,
+ "namespace": 13,
+ "structure": 3,
+ "new.env": 1,
+ "parent": 9,
+ ".BaseNamespaceEnv": 1,
+ "paste": 3,
+ "source": 3,
+ "chdir": 1,
+ "envir": 5,
+ "cache_module": 1,
+ "exported_functions": 2,
+ "lsf.str": 2,
+ "list2env": 2,
+ "sapply": 2,
+ "get": 2,
+ "ops": 2,
+ "is_predefined": 2,
+ "%": 2,
+ "is_op": 2,
+ "prefix": 3,
+ "||": 1,
+ "grepl": 1,
+ "Filter": 1,
+ "op_env": 4,
+ "cache.": 1,
+ "@note": 1,
+ "Any": 1,
+ "references": 1,
+ "remain": 1,
+ "unchanged": 1,
+ "and": 5,
+ "files": 1,
+ "would": 1,
+ "have": 1,
+ "happened": 1,
+ "without": 1,
+ "unload": 2,
+ "should": 2,
+ "production": 1,
+ "code.": 1,
+ "does": 1,
+ "currently": 1,
+ "detach": 1,
+ "environments.": 1,
+ "Reload": 1,
+ "given": 1,
+ "Remove": 1,
+ "cache": 1,
+ "forcing": 1,
+ "reload.": 1,
+ "reloaded": 1,
+ "reference": 1,
+ "unloaded": 1,
+ "still": 1,
+ "work.": 1,
+ "Reloading": 1,
+ "primarily": 1,
+ "useful": 1,
+ "testing": 1,
+ "during": 1,
+ "module_ref": 3,
+ "rm": 1,
+ "list": 1,
+ ".loaded_modules": 1,
+ "whatnot.": 1,
+ "assign": 1,
"##polyg": 1,
"vector": 2,
"##numpoints": 1,
@@ -50285,7 +58117,57 @@
"spsample": 1,
"polyg": 1,
"numpoints": 1,
- "type": 1
+ "docType": 1,
+ "package": 5,
+ "scholar": 6,
+ "alias": 2,
+ "title": 1,
+ "reads": 1,
+ "url": 2,
+ "http": 2,
+ "//scholar.google.com": 1,
+ "Dates": 1,
+ "citation": 2,
+ "counts": 1,
+ "estimated": 1,
+ "determined": 1,
+ "automatically": 1,
+ "computer": 1,
+ "program.": 1,
+ "Use": 1,
+ "at": 2,
+ "your": 1,
+ "own": 1,
+ "risk.": 1,
+ "description": 1,
+ "provides": 1,
+ "functions": 3,
+ "extract": 1,
+ "Google": 2,
+ "Scholar.": 1,
+ "There": 1,
+ "also": 1,
+ "convenience": 1,
+ "comparing": 1,
+ "multiple": 1,
+ "scholars": 1,
+ "predicting": 1,
+ "index": 1,
+ "scores": 1,
+ "based": 1,
+ "past": 1,
+ "publication": 1,
+ "records.": 1,
+ "note": 1,
+ "A": 1,
+ "complementary": 1,
+ "Scholar": 1,
+ "found": 1,
+ "//biostat.jhsph.edu/": 1,
+ "jleek/code/googleCite.r": 1,
+ "was": 1,
+ "developed": 1,
+ "independently.": 1
},
"Racket": {
";": 3,
@@ -50854,6 +58736,249 @@
"print": 4,
"author": 1
},
+ "Red": {
+ "Red": 3,
+ "[": 111,
+ "Title": 2,
+ "Author": 1,
+ "]": 114,
+ "File": 1,
+ "%": 2,
+ "console.red": 1,
+ "Tabs": 1,
+ "Rights": 1,
+ "License": 2,
+ "{": 11,
+ "Distributed": 1,
+ "under": 1,
+ "the": 3,
+ "Boost": 1,
+ "Software": 1,
+ "Version": 1,
+ "See": 1,
+ "https": 1,
+ "//github.com/dockimbel/Red/blob/master/BSL": 1,
+ "-": 74,
+ "License.txt": 1,
+ "}": 11,
+ "Purpose": 2,
+ "Language": 2,
+ "http": 2,
+ "//www.red": 2,
+ "lang.org/": 2,
+ "#system": 1,
+ "global": 1,
+ "#either": 3,
+ "OS": 3,
+ "MacOSX": 2,
+ "History": 1,
+ "library": 1,
+ "cdecl": 3,
+ "add": 2,
+ "history": 2,
+ ";": 31,
+ "Add": 1,
+ "line": 9,
+ "to": 2,
+ "history.": 1,
+ "c": 7,
+ "string": 10,
+ "rl": 4,
+ "insert": 3,
+ "wrapper": 2,
+ "func": 1,
+ "count": 3,
+ "integer": 16,
+ "key": 3,
+ "return": 10,
+ "Windows": 2,
+ "system/platform": 1,
+ "ret": 5,
+ "AttachConsole": 1,
+ "if": 2,
+ "zero": 3,
+ "print": 5,
+ "halt": 2,
+ "SetConsoleTitle": 1,
+ "as": 4,
+ "string/rs": 1,
+ "head": 1,
+ "str": 4,
+ "bind": 1,
+ "tab": 3,
+ "input": 2,
+ "routine": 1,
+ "prompt": 3,
+ "/local": 1,
+ "len": 1,
+ "buffer": 4,
+ "string/load": 1,
+ "+": 1,
+ "length": 1,
+ "free": 1,
+ "byte": 3,
+ "ptr": 14,
+ "SET_RETURN": 1,
+ "(": 6,
+ ")": 4,
+ "delimiters": 1,
+ "function": 6,
+ "block": 3,
+ "list": 1,
+ "copy": 2,
+ "none": 1,
+ "foreach": 1,
+ "case": 2,
+ "escaped": 2,
+ "no": 2,
+ "in": 2,
+ "comment": 2,
+ "switch": 3,
+ "#": 8,
+ "mono": 3,
+ "mode": 3,
+ "cnt/1": 1,
+ "red": 1,
+ "eval": 1,
+ "code": 3,
+ "load/all": 1,
+ "unless": 1,
+ "tail": 1,
+ "set/any": 1,
+ "not": 1,
+ "script/2": 1,
+ "do": 2,
+ "skip": 1,
+ "script": 1,
+ "quit": 2,
+ "init": 1,
+ "console": 2,
+ "Console": 1,
+ "alpha": 1,
+ "version": 3,
+ "only": 1,
+ "ASCII": 1,
+ "supported": 1,
+ "Red/System": 1,
+ "#include": 1,
+ "../common/FPU": 1,
+ "configuration.reds": 1,
+ "C": 1,
+ "types": 1,
+ "#define": 2,
+ "time": 2,
+ "long": 2,
+ "clock": 1,
+ "date": 1,
+ "alias": 2,
+ "struct": 5,
+ "second": 1,
+ "minute": 1,
+ "hour": 1,
+ "day": 1,
+ "month": 1,
+ "year": 1,
+ "Since": 1,
+ "weekday": 1,
+ "since": 1,
+ "Sunday": 1,
+ "yearday": 1,
+ "daylight": 1,
+ "saving": 1,
+ "Negative": 1,
+ "unknown": 1,
+ "#import": 1,
+ "LIBC": 1,
+ "file": 1,
+ "Error": 1,
+ "handling": 1,
+ "form": 1,
+ "error": 5,
+ "Return": 1,
+ "description.": 1,
+ "Print": 1,
+ "standard": 1,
+ "output.": 1,
+ "Memory": 1,
+ "management": 1,
+ "make": 1,
+ "Allocate": 1,
+ "filled": 1,
+ "memory.": 1,
+ "chunks": 1,
+ "size": 5,
+ "binary": 4,
+ "resize": 1,
+ "Resize": 1,
+ "memory": 2,
+ "allocation.": 1,
+ "JVM": 6,
+ "reserved0": 1,
+ "int": 6,
+ "reserved1": 1,
+ "reserved2": 1,
+ "DestroyJavaVM": 1,
+ "JNICALL": 5,
+ "vm": 5,
+ "jint": 5,
+ "AttachCurrentThread": 1,
+ "penv": 3,
+ "p": 3,
+ "args": 2,
+ "DetachCurrentThread": 1,
+ "GetEnv": 1,
+ "AttachCurrentThreadAsDaemon": 1,
+ "just": 2,
+ "some": 2,
+ "datatypes": 1,
+ "for": 1,
+ "testing": 1,
+ "#some": 1,
+ "hash": 1,
+ "FF0000": 3,
+ "FF000000": 2,
+ "with": 4,
+ "instead": 1,
+ "of": 1,
+ "space": 2,
+ "/wAAAA": 1,
+ "/wAAA": 2,
+ "A": 2,
+ "inside": 2,
+ "char": 1,
+ "bla": 2,
+ "ff": 1,
+ "foo": 3,
+ "numbers": 1,
+ "which": 1,
+ "interpreter": 1,
+ "path": 1,
+ "h": 1,
+ "#if": 1,
+ "type": 1,
+ "exe": 1,
+ "push": 3,
+ "system/stack/frame": 2,
+ "save": 1,
+ "previous": 1,
+ "frame": 2,
+ "pointer": 2,
+ "system/stack/top": 1,
+ "@@": 1,
+ "reposition": 1,
+ "after": 1,
+ "catch": 1,
+ "flag": 1,
+ "CATCH_ALL": 1,
+ "exceptions": 1,
+ "root": 1,
+ "barrier": 1,
+ "keep": 1,
+ "stack": 1,
+ "aligned": 1,
+ "on": 1,
+ "bit": 1
+ },
"RMarkdown": {
"Some": 1,
"text.": 1,
@@ -51059,21 +59184,37 @@
"variable": 1
},
"Ruby": {
+ "Pry.config.commands.import": 1,
+ "Pry": 1,
+ "ExtendedCommands": 1,
+ "Experimental": 1,
+ "Pry.config.pager": 1,
+ "false": 29,
+ "Pry.config.color": 1,
+ "Pry.config.commands.alias_command": 1,
+ "Pry.config.commands.command": 1,
+ "do": 38,
+ "|": 93,
+ "*args": 17,
+ "output.puts": 1,
+ "end": 239,
+ "Pry.config.history.should_save": 1,
+ "Pry.config.prompt": 1,
+ "[": 58,
+ "proc": 2,
+ "{": 70,
+ "}": 70,
+ "]": 58,
+ "Pry.plugins": 1,
+ ".disable": 1,
"appraise": 2,
- "do": 37,
"gem": 3,
- "end": 238,
"load": 3,
"Dir": 4,
- "[": 56,
- "]": 56,
".each": 4,
- "{": 68,
- "|": 91,
"plugin": 3,
"(": 244,
")": 256,
- "}": 68,
"task": 2,
"default": 2,
"puts": 12,
@@ -51144,7 +59285,6 @@
"return": 25,
"installed_prefix.children.length": 1,
"rescue": 13,
- "false": 26,
"explicitly_requested": 1,
"ARGV.named.empty": 1,
"ARGV.formulae.include": 1,
@@ -51350,7 +59490,6 @@
"protected": 1,
"system": 1,
"cmd": 6,
- "*args": 16,
"pretty_args": 1,
"args.dup": 1,
"pretty_args.delete": 1,
@@ -52468,6 +60607,53 @@
"running_threads2": 2,
"port2.recv": 1
},
+ "SAS": {
+ "libname": 1,
+ "source": 1,
+ "data": 6,
+ "work.working_copy": 5,
+ ";": 22,
+ "set": 3,
+ "source.original_file.sas7bdat": 1,
+ "run": 6,
+ "if": 2,
+ "Purge": 1,
+ "then": 2,
+ "delete": 1,
+ "ImportantVariable": 1,
+ ".": 1,
+ "MissingFlag": 1,
+ "proc": 2,
+ "surveyselect": 1,
+ "work.data": 1,
+ "out": 2,
+ "work.boot": 2,
+ "method": 1,
+ "urs": 1,
+ "reps": 1,
+ "seed": 2,
+ "sampsize": 1,
+ "outhits": 1,
+ "samplingunit": 1,
+ "Site": 1,
+ "PROC": 1,
+ "MI": 1,
+ "work.bootmi": 2,
+ "nimpute": 1,
+ "round": 1,
+ "By": 2,
+ "Replicate": 2,
+ "VAR": 1,
+ "Variable1": 2,
+ "Variable2": 2,
+ "logistic": 1,
+ "descending": 1,
+ "_Imputation_": 1,
+ "model": 1,
+ "Outcome": 1,
+ "/": 1,
+ "risklimits": 1
+ },
"Sass": {
"blue": 7,
"#3bbfce": 2,
@@ -54357,6 +62543,195 @@
"ast.eval": 1,
"Env.new": 1
},
+ "Slim": {
+ "doctype": 1,
+ "html": 2,
+ "head": 1,
+ "title": 1,
+ "Slim": 2,
+ "Examples": 1,
+ "meta": 2,
+ "name": 2,
+ "content": 2,
+ "author": 2,
+ "javascript": 1,
+ "alert": 1,
+ "(": 1,
+ ")": 1,
+ "body": 1,
+ "h1": 1,
+ "Markup": 1,
+ "examples": 1,
+ "#content": 1,
+ "p": 2,
+ "This": 1,
+ "example": 1,
+ "shows": 1,
+ "you": 2,
+ "how": 1,
+ "a": 1,
+ "basic": 1,
+ "file": 1,
+ "looks": 1,
+ "like.": 1,
+ "yield": 1,
+ "-": 3,
+ "unless": 1,
+ "items.empty": 1,
+ "table": 1,
+ "for": 1,
+ "item": 1,
+ "in": 1,
+ "items": 2,
+ "do": 1,
+ "tr": 1,
+ "td.name": 1,
+ "item.name": 1,
+ "td.price": 1,
+ "item.price": 1,
+ "else": 1,
+ "|": 2,
+ "No": 1,
+ "found.": 1,
+ "Please": 1,
+ "add": 1,
+ "some": 1,
+ "inventory.": 1,
+ "Thank": 1,
+ "div": 1,
+ "id": 1,
+ "render": 1,
+ "Copyright": 1,
+ "#": 2,
+ "{": 2,
+ "year": 1,
+ "}": 2
+ },
+ "Smalltalk": {
+ "Object": 1,
+ "subclass": 2,
+ "#Philosophers": 1,
+ "instanceVariableNames": 1,
+ "classVariableNames": 1,
+ "poolDictionaries": 1,
+ "category": 1,
+ "Philosophers": 3,
+ "class": 1,
+ "methodsFor": 2,
+ "new": 4,
+ "self": 25,
+ "shouldNotImplement": 1,
+ "quantity": 2,
+ "super": 1,
+ "initialize": 3,
+ "dine": 4,
+ "seconds": 2,
+ "(": 19,
+ "Delay": 3,
+ "forSeconds": 1,
+ ")": 19,
+ "wait.": 5,
+ "philosophers": 2,
+ "do": 1,
+ "[": 18,
+ "each": 5,
+ "|": 18,
+ "terminate": 1,
+ "]": 18,
+ ".": 16,
+ "size": 4,
+ "leftFork": 6,
+ "n": 11,
+ "forks": 5,
+ "at": 3,
+ "rightFork": 6,
+ "ifTrue": 1,
+ "ifFalse": 1,
+ "+": 1,
+ "eating": 3,
+ "Semaphore": 2,
+ "new.": 2,
+ "-": 1,
+ "timesRepeat": 1,
+ "signal": 1,
+ "randy": 3,
+ "Random": 1,
+ "to": 2,
+ "collect": 2,
+ "forMutualExclusion": 1,
+ "philosopher": 2,
+ "philosopherCode": 3,
+ "status": 8,
+ "n.": 2,
+ "printString": 1,
+ "true": 2,
+ "whileTrue": 1,
+ "Transcript": 5,
+ "nextPutAll": 5,
+ ";": 8,
+ "nl.": 5,
+ "forMilliseconds": 2,
+ "next": 2,
+ "*": 2,
+ "critical": 1,
+ "signal.": 2,
+ "newProcess": 1,
+ "priority": 1,
+ "Processor": 1,
+ "userBackgroundPriority": 1,
+ "name": 1,
+ "resume": 1,
+ "yourself": 1,
+ "Koan": 1,
+ "TestBasic": 1,
+ "": 1,
+ "A": 1,
+ "collection": 1,
+ "of": 1,
+ "introductory": 1,
+ "tests": 2,
+ "testDeclarationAndAssignment": 1,
+ "declaration": 2,
+ "anotherDeclaration": 2,
+ "_": 1,
+ "expect": 10,
+ "fillMeIn": 10,
+ "toEqual": 10,
+ "declaration.": 1,
+ "anotherDeclaration.": 1,
+ "testEqualSignIsNotAnAssignmentOperator": 1,
+ "variableA": 6,
+ "variableB": 5,
+ "value": 2,
+ "variableB.": 2,
+ "testMultipleStatementsInASingleLine": 1,
+ "variableC": 2,
+ "variableA.": 1,
+ "variableC.": 1,
+ "testInequality": 1,
+ "testLogicalOr": 1,
+ "expression": 4,
+ "<": 2,
+ "expression.": 2,
+ "testLogicalAnd": 1,
+ "&": 1,
+ "testNot": 1,
+ "not.": 1,
+ "testSimpleChainMatches": 1,
+ "e": 11,
+ "eCtrl": 3,
+ "eventKey": 3,
+ "e.": 1,
+ "ctrl": 5,
+ "true.": 1,
+ "assert": 2,
+ "matches": 4,
+ "{": 4,
+ "}": 4,
+ "eCtrl.": 2,
+ "deny": 2,
+ "a": 1
+ },
"SourcePawn": {
"//#define": 1,
"DEBUG": 2,
@@ -54694,6 +63069,169 @@
"well": 1,
"PushArrayCell": 1
},
+ "SQL": {
+ "IF": 13,
+ "EXISTS": 12,
+ "(": 131,
+ "SELECT": 4,
+ "*": 3,
+ "FROM": 1,
+ "DBO.SYSOBJECTS": 1,
+ "WHERE": 1,
+ "ID": 2,
+ "OBJECT_ID": 1,
+ "N": 7,
+ ")": 131,
+ "AND": 1,
+ "OBJECTPROPERTY": 1,
+ "id": 22,
+ "DROP": 3,
+ "PROCEDURE": 1,
+ "dbo.AvailableInSearchSel": 2,
+ "GO": 4,
+ "CREATE": 10,
+ "Procedure": 1,
+ "AvailableInSearchSel": 1,
+ "AS": 1,
+ "UNION": 2,
+ "ALL": 2,
+ "DB_NAME": 1,
+ "BEGIN": 1,
+ "GRANT": 1,
+ "EXECUTE": 1,
+ "ON": 1,
+ "TO": 1,
+ "[": 1,
+ "rv": 1,
+ "]": 1,
+ "END": 1,
+ "SHOW": 2,
+ "WARNINGS": 2,
+ ";": 31,
+ "-": 496,
+ "Table": 9,
+ "structure": 9,
+ "for": 15,
+ "table": 17,
+ "articles": 4,
+ "TABLE": 10,
+ "NOT": 46,
+ "int": 28,
+ "NULL": 91,
+ "AUTO_INCREMENT": 9,
+ "title": 4,
+ "varchar": 22,
+ "DEFAULT": 22,
+ "content": 2,
+ "longtext": 1,
+ "date_posted": 4,
+ "datetime": 10,
+ "created_by": 2,
+ "last_modified": 2,
+ "last_modified_by": 2,
+ "ordering": 2,
+ "is_published": 2,
+ "PRIMARY": 9,
+ "KEY": 13,
+ "Dumping": 6,
+ "data": 6,
+ "INSERT": 6,
+ "INTO": 6,
+ "VALUES": 6,
+ "challenges": 4,
+ "pkg_name": 2,
+ "description": 2,
+ "text": 1,
+ "author": 2,
+ "category": 2,
+ "visibility": 2,
+ "publish": 2,
+ "abstract": 2,
+ "level": 2,
+ "duration": 2,
+ "goal": 2,
+ "solution": 2,
+ "availability": 2,
+ "default_points": 2,
+ "default_duration": 2,
+ "challenge_attempts": 2,
+ "user_id": 8,
+ "challenge_id": 7,
+ "time": 1,
+ "status": 1,
+ "challenge_attempt_count": 2,
+ "tries": 1,
+ "UNIQUE": 4,
+ "classes": 4,
+ "name": 3,
+ "date_created": 6,
+ "archive": 2,
+ "class_challenges": 4,
+ "class_id": 5,
+ "class_memberships": 4,
+ "users": 4,
+ "username": 3,
+ "full_name": 2,
+ "email": 2,
+ "password": 2,
+ "joined": 2,
+ "last_visit": 2,
+ "is_activated": 2,
+ "type": 3,
+ "token": 3,
+ "user_has_challenge_token": 3,
+ "create": 2,
+ "FILIAL": 10,
+ "NUMBER": 1,
+ "not": 5,
+ "null": 4,
+ "title_ua": 1,
+ "VARCHAR2": 4,
+ "title_ru": 1,
+ "title_eng": 1,
+ "remove_date": 1,
+ "DATE": 2,
+ "modify_date": 1,
+ "modify_user": 1,
+ "alter": 1,
+ "add": 1,
+ "constraint": 1,
+ "PK_ID": 1,
+ "primary": 1,
+ "key": 1,
+ "grant": 8,
+ "select": 10,
+ "on": 8,
+ "to": 8,
+ "ATOLL": 1,
+ "CRAMER2GIS": 1,
+ "DMS": 1,
+ "HPSM2GIS": 1,
+ "PLANMONITOR": 1,
+ "SIEBEL": 1,
+ "VBIS": 1,
+ "VPORTAL": 1,
+ "if": 1,
+ "exists": 1,
+ "from": 2,
+ "sysobjects": 1,
+ "where": 2,
+ "and": 1,
+ "in": 1,
+ "exec": 1,
+ "%": 2,
+ "object_ddl": 1,
+ "go": 1,
+ "use": 1,
+ "translog": 1,
+ "VIEW": 1,
+ "suspendedtoday": 2,
+ "view": 1,
+ "as": 1,
+ "suspended": 1,
+ "datediff": 1,
+ "now": 1
+ },
"Squirrel": {
"//example": 1,
"from": 1,
@@ -54746,67 +63284,67 @@
"newplayer.MoveTo": 1
},
"Standard ML": {
+ "structure": 15,
+ "LazyBase": 4,
+ "LAZY_BASE": 5,
+ "struct": 13,
+ "type": 6,
+ "a": 78,
+ "exception": 2,
+ "Undefined": 6,
+ "fun": 60,
+ "delay": 6,
+ "f": 46,
+ "force": 18,
+ "(": 840,
+ ")": 845,
+ "val": 147,
+ "undefined": 2,
+ "fn": 127,
+ "raise": 6,
+ "end": 55,
+ "LazyMemoBase": 4,
+ "datatype": 29,
+ "|": 226,
+ "Done": 2,
+ "of": 91,
+ "lazy": 13,
+ "unit": 7,
+ "-": 20,
+ "let": 44,
+ "open": 9,
+ "B": 2,
+ "inject": 5,
+ "x": 74,
+ "isUndefined": 4,
+ "ignore": 3,
+ ";": 21,
+ "false": 32,
+ "handle": 4,
+ "true": 36,
+ "toString": 4,
+ "if": 51,
+ "then": 51,
+ "else": 51,
+ "eqBy": 5,
+ "p": 10,
+ "y": 50,
+ "eq": 3,
+ "op": 2,
+ "compare": 8,
+ "Ops": 3,
+ "map": 3,
+ "Lazy": 2,
+ "LazyFn": 4,
+ "LazyMemo": 2,
"signature": 2,
- "LAZY_BASE": 3,
"sig": 2,
- "type": 5,
- "a": 74,
- "lazy": 12,
- "-": 19,
- ")": 826,
- "end": 52,
"LAZY": 1,
"bool": 9,
- "val": 143,
- "inject": 3,
- "toString": 3,
- "(": 822,
"string": 14,
- "eq": 2,
"*": 9,
- "eqBy": 3,
- "compare": 7,
"order": 2,
- "map": 2,
"b": 58,
- "structure": 10,
- "Ops": 2,
- "LazyBase": 2,
- "struct": 9,
- "exception": 1,
- "Undefined": 3,
- "fun": 51,
- "delay": 3,
- "f": 37,
- "force": 9,
- "undefined": 1,
- "fn": 124,
- "raise": 5,
- "LazyMemoBase": 2,
- "datatype": 28,
- "|": 225,
- "Done": 1,
- "of": 90,
- "unit": 6,
- "let": 43,
- "open": 8,
- "B": 1,
- "x": 59,
- "isUndefined": 2,
- "ignore": 2,
- ";": 20,
- "false": 31,
- "handle": 3,
- "true": 35,
- "if": 50,
- "then": 50,
- "else": 50,
- "p": 6,
- "y": 44,
- "op": 1,
- "Lazy": 1,
- "LazyFn": 2,
- "LazyMemo": 1,
"functor": 2,
"Main": 1,
"S": 2,
@@ -55883,6 +64421,56 @@
"return": 1,
"/": 1
},
+ "STON": {
+ "[": 11,
+ "]": 11,
+ "{": 15,
+ "#a": 1,
+ "#b": 1,
+ "}": 15,
+ "Rectangle": 1,
+ "#origin": 1,
+ "Point": 2,
+ "-": 2,
+ "#corner": 1,
+ "TestDomainObject": 1,
+ "#created": 1,
+ "DateAndTime": 2,
+ "#modified": 1,
+ "#integer": 1,
+ "#float": 1,
+ "#description": 1,
+ "#color": 1,
+ "#green": 1,
+ "#tags": 1,
+ "#two": 1,
+ "#beta": 1,
+ "#medium": 1,
+ "#bytes": 1,
+ "ByteArray": 1,
+ "#boolean": 1,
+ "false": 1,
+ "ZnResponse": 1,
+ "#headers": 2,
+ "ZnHeaders": 1,
+ "ZnMultiValueDictionary": 1,
+ "#entity": 1,
+ "ZnStringEntity": 1,
+ "#contentType": 1,
+ "ZnMimeType": 1,
+ "#main": 1,
+ "#sub": 1,
+ "#parameters": 1,
+ "#contentLength": 1,
+ "#string": 1,
+ "#encoder": 1,
+ "ZnUTF8Encoder": 1,
+ "#statusLine": 1,
+ "ZnStatusLine": 1,
+ "#version": 1,
+ "#code": 1,
+ "#reason": 1
+ },
"Stylus": {
"border": 6,
"-": 10,
@@ -55972,6 +64560,260 @@
"wait": 1,
".fork": 1
},
+ "Swift": {
+ "let": 43,
+ "apples": 1,
+ "oranges": 1,
+ "appleSummary": 1,
+ "fruitSummary": 1,
+ "var": 42,
+ "shoppingList": 3,
+ "[": 18,
+ "]": 18,
+ "occupations": 2,
+ "emptyArray": 1,
+ "String": 27,
+ "(": 89,
+ ")": 89,
+ "emptyDictionary": 1,
+ "Dictionary": 1,
+ "": 1,
+ "Float": 1,
+ "//": 1,
+ "Went": 1,
+ "shopping": 1,
+ "and": 1,
+ "bought": 1,
+ "everything.": 1,
+ "individualScores": 2,
+ "teamScore": 4,
+ "for": 10,
+ "score": 2,
+ "in": 11,
+ "{": 77,
+ "if": 6,
+ "+": 15,
+ "}": 77,
+ "else": 1,
+ "optionalString": 2,
+ "nil": 1,
+ "optionalName": 2,
+ "greeting": 2,
+ "name": 21,
+ "vegetable": 2,
+ "switch": 4,
+ "case": 21,
+ "vegetableComment": 4,
+ "x": 1,
+ "where": 2,
+ "x.hasSuffix": 1,
+ "default": 2,
+ "interestingNumbers": 2,
+ "largest": 4,
+ "kind": 1,
+ "numbers": 6,
+ "number": 13,
+ "n": 5,
+ "while": 2,
+ "<": 4,
+ "*": 7,
+ "m": 5,
+ "do": 1,
+ "firstForLoop": 3,
+ "i": 6,
+ "secondForLoop": 3,
+ ";": 2,
+ "println": 1,
+ "func": 24,
+ "greet": 2,
+ "day": 1,
+ "-": 21,
+ "return": 30,
+ "getGasPrices": 2,
+ "Double": 11,
+ "sumOf": 3,
+ "Int...": 1,
+ "Int": 19,
+ "sum": 3,
+ "returnFifteen": 2,
+ "y": 3,
+ "add": 2,
+ "makeIncrementer": 2,
+ "addOne": 2,
+ "increment": 2,
+ "hasAnyMatches": 2,
+ "list": 2,
+ "condition": 2,
+ "Bool": 4,
+ "item": 4,
+ "true": 2,
+ "false": 2,
+ "lessThanTen": 2,
+ "numbers.map": 2,
+ "result": 5,
+ "sort": 1,
+ "class": 7,
+ "Shape": 2,
+ "numberOfSides": 4,
+ "simpleDescription": 14,
+ "myVariable": 2,
+ "myConstant": 1,
+ "shape": 1,
+ "shape.numberOfSides": 1,
+ "shapeDescription": 1,
+ "shape.simpleDescription": 1,
+ "NamedShape": 3,
+ "init": 4,
+ "self.name": 1,
+ "Square": 7,
+ "sideLength": 17,
+ "self.sideLength": 2,
+ "super.init": 2,
+ "area": 1,
+ "override": 2,
+ "test": 1,
+ "test.area": 1,
+ "test.simpleDescription": 1,
+ "EquilateralTriangle": 4,
+ "perimeter": 1,
+ "get": 2,
+ "set": 1,
+ "newValue": 1,
+ "/": 1,
+ "triangle": 3,
+ "triangle.perimeter": 2,
+ "triangle.sideLength": 2,
+ "TriangleAndSquare": 2,
+ "willSet": 2,
+ "square.sideLength": 1,
+ "newValue.sideLength": 2,
+ "square": 2,
+ "size": 4,
+ "triangleAndSquare": 1,
+ "triangleAndSquare.square.sideLength": 1,
+ "triangleAndSquare.triangle.sideLength": 2,
+ "triangleAndSquare.square": 1,
+ "Counter": 2,
+ "count": 2,
+ "incrementBy": 1,
+ "amount": 2,
+ "numberOfTimes": 2,
+ "times": 4,
+ "counter": 1,
+ "counter.incrementBy": 1,
+ "optionalSquare": 2,
+ ".sideLength": 1,
+ "enum": 4,
+ "Rank": 2,
+ "Ace": 1,
+ "Two": 1,
+ "Three": 1,
+ "Four": 1,
+ "Five": 1,
+ "Six": 1,
+ "Seven": 1,
+ "Eight": 1,
+ "Nine": 1,
+ "Ten": 1,
+ "Jack": 1,
+ "Queen": 1,
+ "King": 1,
+ "self": 3,
+ ".Ace": 1,
+ ".Jack": 1,
+ ".Queen": 1,
+ ".King": 1,
+ "self.toRaw": 1,
+ "ace": 1,
+ "Rank.Ace": 1,
+ "aceRawValue": 1,
+ "ace.toRaw": 1,
+ "convertedRank": 1,
+ "Rank.fromRaw": 1,
+ "threeDescription": 1,
+ "convertedRank.simpleDescription": 1,
+ "Suit": 2,
+ "Spades": 1,
+ "Hearts": 1,
+ "Diamonds": 1,
+ "Clubs": 1,
+ ".Spades": 2,
+ ".Hearts": 1,
+ ".Diamonds": 1,
+ ".Clubs": 1,
+ "hearts": 1,
+ "Suit.Hearts": 1,
+ "heartsDescription": 1,
+ "hearts.simpleDescription": 1,
+ "implicitInteger": 1,
+ "implicitDouble": 1,
+ "explicitDouble": 1,
+ "struct": 2,
+ "Card": 2,
+ "rank": 2,
+ "suit": 2,
+ "threeOfSpades": 1,
+ ".Three": 1,
+ "threeOfSpadesDescription": 1,
+ "threeOfSpades.simpleDescription": 1,
+ "ServerResponse": 1,
+ "Result": 1,
+ "Error": 1,
+ "success": 2,
+ "ServerResponse.Result": 1,
+ "failure": 1,
+ "ServerResponse.Error": 1,
+ ".Result": 1,
+ "sunrise": 1,
+ "sunset": 1,
+ "serverResponse": 2,
+ ".Error": 1,
+ "error": 1,
+ "protocol": 1,
+ "ExampleProtocol": 5,
+ "mutating": 3,
+ "adjust": 4,
+ "SimpleClass": 2,
+ "anotherProperty": 1,
+ "a": 2,
+ "a.adjust": 1,
+ "aDescription": 1,
+ "a.simpleDescription": 1,
+ "SimpleStructure": 2,
+ "b": 1,
+ "b.adjust": 1,
+ "bDescription": 1,
+ "b.simpleDescription": 1,
+ "extension": 1,
+ "protocolValue": 1,
+ "protocolValue.simpleDescription": 1,
+ "repeat": 2,
+ "": 1,
+ "ItemType": 3,
+ "OptionalValue": 2,
+ "": 1,
+ "None": 1,
+ "Some": 1,
+ "T": 5,
+ "possibleInteger": 2,
+ "": 1,
+ ".None": 1,
+ ".Some": 1,
+ "anyCommonElements": 2,
+ "": 1,
+ "U": 4,
+ "Sequence": 2,
+ "GeneratorType": 3,
+ "Element": 3,
+ "Equatable": 1,
+ "lhs": 2,
+ "rhs": 2,
+ "lhsItem": 2,
+ "rhsItem": 2,
+ "label": 2,
+ "width": 2,
+ "widthLabel": 1
+ },
"SystemVerilog": {
"module": 3,
"endpoint_phy_wrapper": 2,
@@ -57374,6 +66216,87 @@
"log": 1,
"defaultproperties": 1
},
+ "VCL": {
+ "sub": 23,
+ "vcl_recv": 2,
+ "{": 50,
+ "if": 14,
+ "(": 50,
+ "req.request": 18,
+ "&&": 14,
+ ")": 50,
+ "return": 33,
+ "pipe": 4,
+ ";": 48,
+ "}": 50,
+ "pass": 9,
+ "req.http.Authorization": 2,
+ "||": 4,
+ "req.http.Cookie": 2,
+ "lookup": 2,
+ "vcl_pipe": 2,
+ "vcl_pass": 2,
+ "vcl_hash": 2,
+ "set": 10,
+ "req.hash": 3,
+ "+": 17,
+ "req.url": 2,
+ "req.http.host": 4,
+ "else": 3,
+ "server.ip": 2,
+ "hash": 2,
+ "vcl_hit": 2,
+ "obj.cacheable": 2,
+ "deliver": 8,
+ "vcl_miss": 2,
+ "fetch": 3,
+ "vcl_fetch": 2,
+ "obj.http.Set": 1,
+ "-": 21,
+ "Cookie": 2,
+ "obj.prefetch": 1,
+ "s": 3,
+ "vcl_deliver": 2,
+ "vcl_discard": 1,
+ "discard": 2,
+ "vcl_prefetch": 1,
+ "vcl_timeout": 1,
+ "vcl_error": 2,
+ "obj.http.Content": 2,
+ "Type": 2,
+ "synthetic": 2,
+ "utf": 2,
+ "//W3C//DTD": 2,
+ "XHTML": 2,
+ "Strict//EN": 2,
+ "http": 3,
+ "//www.w3.org/TR/xhtml1/DTD/xhtml1": 2,
+ "strict.dtd": 2,
+ "obj.status": 4,
+ "obj.response": 6,
+ "req.xid": 2,
+ "//www.varnish": 1,
+ "cache.org/": 1,
+ "req.restarts": 1,
+ "req.http.x": 1,
+ "forwarded": 1,
+ "for": 1,
+ "req.http.X": 3,
+ "Forwarded": 3,
+ "For": 3,
+ "client.ip": 2,
+ "hash_data": 3,
+ "beresp.ttl": 2,
+ "<": 1,
+ "beresp.http.Set": 1,
+ "beresp.http.Vary": 1,
+ "hit_for_pass": 1,
+ "obj.http.Retry": 1,
+ "After": 1,
+ "vcl_init": 1,
+ "ok": 2,
+ "vcl_fini": 1
+ },
"Verilog": {
"////////////////////////////////////////////////////////////////////////////////": 14,
"//": 117,
@@ -58707,17 +67630,140 @@
"return": 1
},
"XML": {
- "": 4,
- "version=": 6,
+ "": 11,
+ "version=": 17,
+ "encoding=": 7,
+ "": 7,
+ "ToolsVersion=": 6,
+ "DefaultTargets=": 5,
+ "xmlns=": 8,
+ "": 21,
+ "Project=": 12,
+ "Condition=": 37,
+ "": 26,
+ "": 6,
+ "Debug": 10,
+ " ": 6,
+ "": 6,
+ "AnyCPU": 10,
+ " ": 6,
+ "": 5,
+ "{": 6,
+ "D9BF15": 1,
+ "-": 90,
+ "D10": 1,
+ "ABAD688E8B": 1,
+ "}": 6,
+ " ": 5,
+ "": 4,
+ "Exe": 4,
+ " ": 4,
+ "": 2,
+ "Properties": 3,
+ " ": 2,
+ "": 5,
+ "csproj_sample": 1,
+ " ": 5,
+ "": 4,
+ "csproj": 1,
+ "sample": 6,
+ " ": 4,
+ "": 5,
+ "v4.5.1": 5,
+ " ": 5,
+ "": 3,
+ " ": 3,
+ "": 3,
+ "true": 24,
+ " ": 3,
+ " ": 25,
+ "": 6,
+ " ": 6,
+ "": 5,
+ " ": 5,
+ "": 6,
+ "full": 4,
+ " ": 6,
+ "": 7,
+ "false": 11,
+ " ": 7,
+ "": 8,
+ "bin": 11,
+ " ": 8,
+ "": 6,
+ "DEBUG": 3,
+ ";": 52,
+ "TRACE": 6,
+ " ": 6,
+ "": 4,
+ "prompt": 4,
+ " ": 4,
+ "": 8,
+ " ": 8,
+ "pdbonly": 3,
+ "Release": 6,
+ "": 26,
+ "": 30,
+ "Include=": 78,
+ " ": 26,
+ "": 10,
+ "": 5,
+ " ": 7,
+ "": 2,
+ " ": 2,
+ "cfa7a11": 1,
+ "a5cd": 1,
+ "bd7b": 1,
+ "b210d4d51a29": 1,
+ "fsproj_sample": 2,
+ "": 1,
+ " ": 1,
+ "": 3,
+ "fsproj": 1,
+ " ": 3,
+ "": 2,
+ " ": 2,
+ "": 5,
+ "fsproj_sample.XML": 2,
+ " ": 5,
+ "": 2,
+ " ": 2,
+ "": 2,
+ "True": 13,
+ " ": 2,
+ "": 5,
+ "": 1,
+ " ": 1,
+ "": 1,
+ "": 1,
+ "": 2,
+ "(": 65,
+ "MSBuildExtensionsPath32": 2,
+ ")": 58,
+ "..": 1,
+ "Microsoft": 2,
+ "SDKs": 1,
+ "F#": 1,
+ "Framework": 1,
+ "v4.0": 1,
+ "Microsoft.FSharp.Targets": 2,
+ " ": 2,
+ " ": 1,
+ "": 1,
+ "VisualStudio": 1,
+ "v": 1,
+ "VisualStudioVersion": 1,
+ "FSharp": 1,
+ " ": 1,
+ " ": 1,
"": 1,
- "name=": 223,
+ "name=": 227,
"xmlns": 2,
"ea=": 2,
- "": 2,
+ "": 4,
"This": 21,
"easyant": 3,
"module.ant": 1,
- "sample": 2,
"file": 3,
"is": 123,
"optionnal": 1,
@@ -58731,7 +67777,7 @@
"own": 2,
"specific": 8,
"target.": 1,
- " ": 2,
+ " ": 4,
"": 2,
"": 2,
"my": 2,
@@ -58760,7 +67806,7 @@
"this": 77,
"a": 128,
"module.ivy": 1,
- "for": 59,
+ "for": 60,
"java": 1,
"standard": 1,
"application": 2,
@@ -58776,14 +67822,13 @@
"description=": 2,
"": 1,
"": 1,
- "": 1,
+ "": 4,
"org=": 1,
"rev=": 1,
"conf=": 1,
"default": 9,
"junit": 2,
"test": 7,
- "-": 49,
"/": 6,
" ": 1,
"": 1,
@@ -58795,7 +67840,7 @@
"": 1,
"": 1,
"": 120,
- "": 120,
+ "": 121,
"IObservedChange": 5,
"generic": 3,
"interface": 4,
@@ -58809,9 +67854,7 @@
"used": 19,
"both": 2,
"Changing": 5,
- "(": 52,
"i.e.": 23,
- ")": 45,
"Changed": 4,
"Observables.": 2,
"In": 6,
@@ -58825,15 +67868,15 @@
"casting": 1,
"between": 15,
"changes.": 2,
- " ": 121,
+ " ": 122,
" ": 120,
- "The": 74,
+ "The": 75,
"object": 42,
"has": 16,
"raised": 1,
"change.": 12,
"name": 7,
- "of": 75,
+ "of": 76,
"property": 74,
"changed": 18,
"on": 35,
@@ -58929,7 +67972,7 @@
"itself": 2,
"changes": 13,
".": 20,
- "It": 1,
+ "It": 2,
"important": 6,
"implement": 5,
"Changing/Changed": 1,
@@ -58971,7 +68014,6 @@
"ItemChanging": 2,
"ItemChanged": 2,
"properties": 29,
- ";": 10,
"implementing": 2,
"rebroadcast": 2,
"through": 3,
@@ -59007,7 +68049,7 @@
"string": 13,
"distinguish": 12,
"arbitrarily": 2,
- "by": 13,
+ "by": 14,
"client.": 2,
"Listen": 4,
"provides": 6,
@@ -59019,7 +68061,7 @@
"to.": 7,
"": 12,
" ": 84,
- "A": 19,
+ "A": 21,
"identical": 11,
"types": 10,
"one": 27,
@@ -59031,7 +68073,6 @@
"particular": 2,
"registered.": 2,
"message.": 1,
- "True": 6,
"posted": 3,
"Type.": 2,
"Registers": 3,
@@ -59065,7 +68106,7 @@
"allows": 15,
"log": 2,
"attached.": 1,
- "data": 1,
+ "data": 2,
"structure": 1,
"representation": 1,
"memoizing": 2,
@@ -59107,7 +68148,6 @@
"evicted": 2,
"because": 2,
"Invalidate": 2,
- "full": 1,
"Evaluates": 1,
"returning": 1,
"cached": 2,
@@ -59325,7 +68365,6 @@
"notification": 6,
"Attempts": 1,
"expression": 3,
- "false": 2,
"expression.": 1,
"entire": 1,
"able": 1,
@@ -59415,7 +68454,7 @@
"private": 1,
"field.": 1,
"Reference": 1,
- "Use": 13,
+ "Use": 15,
"custom": 4,
"raiseAndSetIfChanged": 1,
"doesn": 1,
@@ -59491,7 +68530,40 @@
"setup.": 12,
" ": 1,
"": 1,
- "encoding=": 1,
+ "": 1,
+ " ": 1,
+ "c67af951": 1,
+ "d8d6376993e7": 1,
+ "nproj_sample": 2,
+ "": 1,
+ " ": 1,
+ "": 1,
+ "Net": 1,
+ " ": 1,
+ "": 1,
+ "ProgramFiles": 1,
+ "Nemerle": 3,
+ " ": 1,
+ "": 1,
+ "NemerleBinPathRoot": 1,
+ "NemerleVersion": 1,
+ " ": 1,
+ "nproj": 1,
+ "OutputPath": 1,
+ "AssemblyName": 1,
+ ".xml": 1,
+ "": 3,
+ " ": 3,
+ "": 1,
+ "False": 1,
+ " ": 1,
+ "": 2,
+ "Nemerle.dll": 1,
+ " ": 2,
+ "": 1,
+ "Nemerle.Linq.dll": 1,
+ " ": 1,
+ "": 1,
"": 1,
"TS": 1,
"": 1,
@@ -59532,7 +68604,443 @@
"English": 1,
"Ingl": 1,
"": 1,
- " ": 1
+ "": 1,
+ "": 1,
+ "": 1,
+ "": 1,
+ "Sample": 2,
+ " ": 1,
+ "": 1,
+ " ": 1,
+ "": 1,
+ " ": 1,
+ "": 1,
+ "Hugh": 2,
+ "Bot": 2,
+ " ": 1,
+ "": 1,
+ " ": 1,
+ "package": 1,
+ "nuget": 1,
+ "just": 1,
+ "works": 1,
+ "": 1,
+ "http": 2,
+ "//hubot.github.com": 1,
+ " ": 1,
+ " ": 1,
+ "": 1,
+ "https": 1,
+ "//github.com/github/hubot/LICENSEmd": 1,
+ " ": 1,
+ "": 1,
+ " ": 1,
+ " ": 1,
+ "": 1,
+ "": 1,
+ "src=": 1,
+ "target=": 1,
+ " ": 1,
+ " ": 1,
+ "MyCommon": 1,
+ "": 1,
+ "Name=": 1,
+ "": 1,
+ "Text=": 1,
+ " ": 1,
+ "D377F": 1,
+ "A798": 1,
+ "B3FD04C": 1,
+ "": 1,
+ "vbproj_sample.Module1": 1,
+ " ": 1,
+ "vbproj_sample": 1,
+ "vbproj": 3,
+ "": 1,
+ "Console": 3,
+ " ": 1,
+ "": 2,
+ " ": 2,
+ "": 2,
+ " ": 2,
+ "sample.xml": 2,
+ "": 2,
+ " ": 2,
+ "": 1,
+ "On": 2,
+ " ": 1,
+ "": 1,
+ "Binary": 1,
+ " ": 1,
+ "": 1,
+ "Off": 1,
+ " ": 1,
+ "": 1,
+ " ": 1,
+ "": 3,
+ " ": 3,
+ "": 3,
+ "Application.myapp": 1,
+ " ": 3,
+ "": 3,
+ "": 1,
+ " ": 1,
+ "Resources.resx": 1,
+ "Settings.settings": 1,
+ "": 1,
+ " ": 1,
+ "": 1,
+ "": 3,
+ "VbMyResourcesResXFileCodeGenerator": 1,
+ " ": 3,
+ "": 3,
+ "Resources.Designer.vb": 1,
+ " ": 3,
+ "": 2,
+ "My.Resources": 1,
+ " ": 2,
+ "": 1,
+ "Designer": 1,
+ " ": 1,
+ " ": 1,
+ "MyApplicationCodeGenerator": 1,
+ "Application.Designer.vb": 1,
+ "": 2,
+ "SettingsSingleFileGenerator": 1,
+ "My": 1,
+ "Settings.Designer.vb": 1,
+ "Label=": 11,
+ "": 2,
+ "Win32": 2,
+ " ": 2,
+ "BF6EED48": 1,
+ "BF18": 1,
+ "C54": 1,
+ "F": 1,
+ "BBF19EEDC7C": 1,
+ "": 1,
+ "ManagedCProj": 1,
+ " ": 1,
+ "vcxprojsample": 1,
+ "": 2,
+ "Application": 2,
+ " ": 2,
+ "": 2,
+ " ": 2,
+ "": 2,
+ "v120": 2,
+ " ": 2,
+ "": 2,
+ " ": 2,
+ "": 2,
+ "Unicode": 2,
+ " ": 2,
+ "": 4,
+ " ": 4,
+ "": 2,
+ " ": 2,
+ "": 2,
+ "": 8,
+ "Level3": 2,
+ "": 1,
+ "Disabled": 1,
+ " ": 1,
+ "": 2,
+ "WIN32": 2,
+ "_DEBUG": 1,
+ "%": 2,
+ "PreprocessorDefinitions": 2,
+ " ": 2,
+ "": 4,
+ " ": 4,
+ " ": 6,
+ " ": 2,
+ "": 2,
+ " ": 2,
+ "": 2,
+ "": 2,
+ " ": 2,
+ "": 2,
+ " ": 2,
+ "NDEBUG": 1,
+ "": 2,
+ "": 4,
+ "": 2,
+ "Create": 2,
+ "": 2,
+ "": 10,
+ "": 3,
+ "FC737F1": 1,
+ "C7A5": 1,
+ "A066": 1,
+ "A32D752A2FF": 1,
+ " ": 3,
+ "": 3,
+ "cpp": 1,
+ "c": 1,
+ "cc": 1,
+ "cxx": 1,
+ "def": 1,
+ "odl": 1,
+ "idl": 1,
+ "hpj": 1,
+ "bat": 1,
+ "asm": 1,
+ "asmx": 1,
+ " ": 3,
+ " ": 10,
+ "BD": 1,
+ "b04": 1,
+ "EB": 1,
+ "FBE52EBFB": 1,
+ "h": 1,
+ "hh": 1,
+ "hpp": 1,
+ "hxx": 1,
+ "hm": 1,
+ "inl": 1,
+ "inc": 1,
+ "xsd": 1,
+ "DA6AB6": 1,
+ "F800": 1,
+ "c08": 1,
+ "B7A": 1,
+ "BB121AAD01": 1,
+ "rc": 1,
+ "ico": 1,
+ "cur": 1,
+ "bmp": 1,
+ "dlg": 1,
+ "rc2": 1,
+ "rct": 1,
+ "rgs": 1,
+ "gif": 1,
+ "jpg": 1,
+ "jpeg": 1,
+ "jpe": 1,
+ "resx": 1,
+ "tiff": 1,
+ "tif": 1,
+ "png": 1,
+ "wav": 1,
+ "mfcribbon": 1,
+ "ms": 1,
+ "Header": 2,
+ "Files": 7,
+ " ": 2,
+ "Resource": 2,
+ "": 1,
+ "Source": 3,
+ "": 1,
+ "": 1,
+ "compatVersion=": 1,
+ "": 1,
+ "FreeMedForms": 1,
+ " ": 1,
+ "": 1,
+ "C": 1,
+ "Eric": 1,
+ "MAEKER": 1,
+ "MD": 1,
+ " ": 1,
+ "": 1,
+ "GPLv3": 1,
+ " ": 1,
+ "": 1,
+ "Patient": 1,
+ " ": 1,
+ "XML": 1,
+ "form": 1,
+ "loader/saver": 1,
+ "FreeMedForms.": 1,
+ "": 1,
+ "//www.freemedforms.com/": 1,
+ " ": 1,
+ "": 1,
+ " ": 1,
+ " ": 1
+ },
+ "Xojo": {
+ "#tag": 88,
+ "Class": 3,
+ "Protected": 1,
+ "App": 1,
+ "Inherits": 1,
+ "Application": 1,
+ "Constant": 3,
+ "Name": 31,
+ "kEditClear": 1,
+ "Type": 34,
+ "String": 3,
+ "Dynamic": 3,
+ "False": 14,
+ "Default": 9,
+ "Scope": 4,
+ "Public": 3,
+ "#Tag": 5,
+ "Instance": 5,
+ "Platform": 5,
+ "Windows": 2,
+ "Language": 5,
+ "Definition": 5,
+ "Linux": 2,
+ "EndConstant": 3,
+ "kFileQuit": 1,
+ "kFileQuitShortcut": 1,
+ "Mac": 1,
+ "OS": 1,
+ "ViewBehavior": 2,
+ "EndViewBehavior": 2,
+ "End": 27,
+ "EndClass": 1,
+ "Report": 2,
+ "Begin": 23,
+ "BillingReport": 1,
+ "Compatibility": 2,
+ "Units": 1,
+ "Width": 3,
+ "PageHeader": 1,
+ "Height": 5,
+ "Body": 1,
+ "PageFooter": 1,
+ "EndReport": 1,
+ "ReportCode": 1,
+ "EndReportCode": 1,
+ "Dim": 3,
+ "dbFile": 3,
+ "As": 4,
+ "FolderItem": 1,
+ "db": 1,
+ "New": 1,
+ "SQLiteDatabase": 1,
+ "GetFolderItem": 1,
+ "(": 7,
+ ")": 7,
+ "db.DatabaseFile": 1,
+ "If": 4,
+ "db.Connect": 1,
+ "Then": 1,
+ "db.SQLExecute": 2,
+ "_": 1,
+ "+": 5,
+ "db.Error": 1,
+ "then": 1,
+ "MsgBox": 3,
+ "db.ErrorMessage": 2,
+ "db.Rollback": 1,
+ "Else": 2,
+ "db.Commit": 1,
+ "Menu": 2,
+ "MainMenuBar": 1,
+ "MenuItem": 11,
+ "FileMenu": 1,
+ "SpecialMenu": 13,
+ "Text": 13,
+ "Index": 14,
+ "-": 14,
+ "AutoEnable": 13,
+ "True": 46,
+ "Visible": 41,
+ "QuitMenuItem": 1,
+ "FileQuit": 1,
+ "ShortcutKey": 6,
+ "Shortcut": 6,
+ "EditMenu": 1,
+ "EditUndo": 1,
+ "MenuModifier": 5,
+ "EditSeparator1": 1,
+ "EditCut": 1,
+ "EditCopy": 1,
+ "EditPaste": 1,
+ "EditClear": 1,
+ "EditSeparator2": 1,
+ "EditSelectAll": 1,
+ "UntitledSeparator": 1,
+ "AppleMenuItem": 1,
+ "AboutItem": 1,
+ "EndMenu": 1,
+ "Toolbar": 2,
+ "MyToolbar": 1,
+ "ToolButton": 2,
+ "FirstItem": 1,
+ "Caption": 3,
+ "HelpTag": 3,
+ "Style": 2,
+ "SecondItem": 1,
+ "EndToolbar": 1,
+ "Window": 2,
+ "Window1": 1,
+ "BackColor": 1,
+ "&": 1,
+ "cFFFFFF00": 1,
+ "Backdrop": 1,
+ "CloseButton": 1,
+ "Composite": 1,
+ "Frame": 1,
+ "FullScreen": 1,
+ "FullScreenButton": 1,
+ "HasBackColor": 1,
+ "ImplicitInstance": 1,
+ "LiveResize": 1,
+ "MacProcID": 1,
+ "MaxHeight": 1,
+ "MaximizeButton": 1,
+ "MaxWidth": 1,
+ "MenuBar": 1,
+ "MenuBarVisible": 1,
+ "MinHeight": 1,
+ "MinimizeButton": 1,
+ "MinWidth": 1,
+ "Placement": 1,
+ "Resizeable": 1,
+ "Title": 1,
+ "PushButton": 1,
+ "HelloWorldButton": 2,
+ "AutoDeactivate": 1,
+ "Bold": 1,
+ "ButtonStyle": 1,
+ "Cancel": 1,
+ "Enabled": 1,
+ "InitialParent": 1,
+ "Italic": 1,
+ "Left": 1,
+ "LockBottom": 1,
+ "LockedInPosition": 1,
+ "LockLeft": 1,
+ "LockRight": 1,
+ "LockTop": 1,
+ "TabIndex": 1,
+ "TabPanelIndex": 1,
+ "TabStop": 1,
+ "TextFont": 1,
+ "TextSize": 1,
+ "TextUnit": 1,
+ "Top": 1,
+ "Underline": 1,
+ "EndWindow": 1,
+ "WindowCode": 1,
+ "EndWindowCode": 1,
+ "Events": 1,
+ "Event": 1,
+ "Sub": 2,
+ "Action": 1,
+ "total": 4,
+ "Integer": 2,
+ "For": 1,
+ "i": 2,
+ "To": 1,
+ "Next": 1,
+ "Str": 1,
+ "EndEvent": 1,
+ "EndEvents": 1,
+ "ViewProperty": 28,
+ "true": 26,
+ "Group": 28,
+ "InitialValue": 23,
+ "EndViewProperty": 28,
+ "EditorType": 14,
+ "EnumValues": 2,
+ "EndEnumValues": 2
},
"XProc": {
"": 1,
@@ -59890,27 +69398,27 @@
},
"Zephir": {
"%": 10,
- "{": 56,
+ "{": 58,
"#define": 1,
"MAX_FACTOR": 3,
- "}": 50,
- "namespace": 3,
- "Test": 2,
- ";": 86,
- "#include": 1,
+ "}": 52,
+ "namespace": 4,
+ "Test": 4,
+ ";": 91,
+ "#include": 9,
"static": 1,
"long": 3,
"fibonacci": 4,
- "(": 55,
+ "(": 59,
"n": 5,
- ")": 53,
+ ")": 57,
"if": 39,
- "<": 1,
- "return": 25,
+ "<": 2,
+ "return": 26,
"else": 11,
"-": 25,
"+": 5,
- "class": 2,
+ "class": 3,
"Cblock": 1,
"public": 22,
"function": 22,
@@ -59918,7 +69426,29 @@
"int": 3,
"a": 6,
"testCblock2": 1,
- "Router": 1,
+ "#ifdef": 1,
+ "HAVE_CONFIG_H": 1,
+ "#endif": 1,
+ "": 1,
+ "": 1,
+ "": 1,
+ "": 1,
+ "ZEPHIR_INIT_CLASS": 2,
+ "Test_Router_Exception": 2,
+ "ZEPHIR_REGISTER_CLASS_EX": 1,
+ "Router": 3,
+ "Exception": 4,
+ "test": 1,
+ "router_exception": 1,
+ "zend_exception_get_default": 1,
+ "TSRMLS_C": 1,
+ "NULL": 1,
+ "SUCCESS": 1,
+ "extern": 1,
+ "zend_class_entry": 1,
+ "*test_router_exception_ce": 1,
+ "php": 1,
+ "extends": 1,
"Route": 1,
"protected": 9,
"_pattern": 3,
@@ -59997,7 +69527,6 @@
"typeof": 2,
"throw": 1,
"new": 1,
- "Exception": 1,
"explode": 1,
"switch": 1,
"count": 1,
@@ -60038,6 +69567,47 @@
"convert": 1,
"converter": 2,
"getConverters": 1
+ },
+ "Zimpl": {
+ "#": 2,
+ "param": 1,
+ "columns": 2,
+ ";": 7,
+ "set": 3,
+ "I": 3,
+ "{": 2,
+ "..": 1,
+ "}": 2,
+ "IxI": 6,
+ "*": 2,
+ "TABU": 4,
+ "[": 8,
+ "": 3,
+ "in": 5,
+ "]": 8,
+ "": 2,
+ "with": 1,
+ "(": 6,
+ "m": 4,
+ "i": 8,
+ "or": 3,
+ "n": 4,
+ "j": 8,
+ ")": 6,
+ "and": 1,
+ "abs": 2,
+ "-": 3,
+ "var": 1,
+ "x": 4,
+ "binary": 1,
+ "maximize": 1,
+ "queens": 1,
+ "sum": 2,
+ "subto": 1,
+ "c1": 1,
+ "forall": 1,
+ "do": 1,
+ "card": 2
}
},
"language_tokens": {
@@ -60050,6 +69620,7 @@
"Arduino": 20,
"AsciiDoc": 103,
"AspectJ": 324,
+ "Assembly": 21750,
"ATS": 4558,
"AutoHotkey": 3,
"Awk": 544,
@@ -60058,21 +69629,24 @@
"Brightscript": 579,
"C": 59053,
"C#": 278,
- "C++": 32475,
+ "C++": 34739,
"Ceylon": 50,
"Cirru": 244,
"Clojure": 510,
"COBOL": 90,
"CoffeeScript": 2951,
- "Common Lisp": 103,
+ "Common Lisp": 2186,
+ "Component Pascal": 825,
"Coq": 18259,
"Creole": 134,
+ "Crystal": 1506,
"CSS": 43867,
"Cuda": 290,
"Dart": 74,
"Diff": 16,
"DM": 169,
"Dogescript": 30,
+ "E": 601,
"Eagle": 30089,
"ECL": 281,
"edn": 227,
@@ -60083,34 +69657,42 @@
"Forth": 1516,
"Frege": 5564,
"Game Maker Language": 13310,
+ "GAMS": 363,
"GAP": 9944,
"GAS": 133,
- "GLSL": 3766,
+ "GLSL": 4033,
"Gnuplot": 1023,
"Gosu": 410,
"Grammatical Framework": 10607,
- "Groovy": 69,
+ "Groovy": 93,
"Groovy Server Pages": 91,
"Haml": 4,
"Handlebars": 69,
+ "Haskell": 302,
+ "HTML": 413,
"Hy": 155,
"IDL": 418,
"Idris": 148,
+ "Inform 7": 75,
"INI": 27,
"Ioke": 2,
+ "Isabelle": 136,
"Jade": 3,
"Java": 8987,
- "JavaScript": 76934,
+ "JavaScript": 77056,
"JSON": 183,
"JSON5": 57,
"JSONiq": 151,
"JSONLD": 18,
"Julia": 247,
+ "Kit": 6,
"Kotlin": 155,
"KRL": 25,
"Lasso": 9849,
+ "Latte": 759,
"Less": 39,
"LFE": 1711,
+ "Liquid": 633,
"Literate Agda": 478,
"Literate CoffeeScript": 275,
"LiveScript": 123,
@@ -60121,18 +69703,20 @@
"Makefile": 50,
"Markdown": 1,
"Mask": 74,
- "Mathematica": 411,
+ "Mathematica": 1857,
"Matlab": 11942,
"Max": 714,
"MediaWiki": 766,
"Mercury": 31096,
"Monkey": 207,
- "Moocode": 93,
+ "Moocode": 5234,
"MoonScript": 1718,
+ "MTML": 93,
"Nemerle": 17,
"NetLogo": 243,
"Nginx": 179,
"Nimrod": 1,
+ "Nix": 188,
"NSIS": 725,
"Nu": 116,
"Objective-C": 26518,
@@ -60143,32 +69727,39 @@
"OpenCL": 144,
"OpenEdge ABL": 762,
"Org": 358,
+ "Ox": 1006,
"Oxygene": 157,
+ "Pan": 130,
"Parrot Assembly": 6,
"Parrot Internal Representation": 5,
"Pascal": 30,
"PAWN": 3263,
- "Perl": 17497,
+ "Perl": 17979,
"Perl6": 372,
"PHP": 20724,
+ "Pike": 1835,
"Pod": 658,
"PogoScript": 250,
"PostScript": 107,
"PowerShell": 12,
"Processing": 74,
- "Prolog": 468,
+ "Prolog": 2420,
+ "Propeller Spin": 13519,
"Protocol Buffer": 63,
"PureScript": 1652,
- "Python": 5715,
- "R": 195,
+ "Python": 6587,
+ "QMake": 119,
+ "R": 1790,
"Racket": 331,
"Ragel in Ruby Host": 593,
"RDoc": 279,
"Rebol": 533,
+ "Red": 816,
"RMarkdown": 19,
"RobotFramework": 483,
- "Ruby": 3862,
+ "Ruby": 3893,
"Rust": 3566,
+ "SAS": 93,
"Sass": 56,
"Scala": 750,
"Scaml": 4,
@@ -60179,12 +69770,17 @@
"ShellSession": 233,
"Shen": 3472,
"Slash": 187,
+ "Slim": 77,
+ "Smalltalk": 423,
"SourcePawn": 2080,
+ "SQL": 1485,
"Squirrel": 130,
- "Standard ML": 6405,
+ "Standard ML": 6567,
"Stata": 3133,
+ "STON": 100,
"Stylus": 76,
"SuperCollider": 133,
+ "Swift": 1128,
"SystemVerilog": 541,
"Tcl": 1133,
"Tea": 3,
@@ -60193,6 +69789,7 @@
"TXL": 213,
"TypeScript": 109,
"UnrealScript": 2873,
+ "VCL": 545,
"Verilog": 3778,
"VHDL": 42,
"VimL": 20,
@@ -60200,13 +69797,15 @@
"Volt": 388,
"wisp": 1363,
"XC": 24,
- "XML": 5737,
+ "XML": 7057,
+ "Xojo": 807,
"XProc": 22,
"XQuery": 801,
"XSLT": 44,
"Xtend": 399,
"YAML": 77,
- "Zephir": 1026
+ "Zephir": 1085,
+ "Zimpl": 123
},
"languages": {
"ABAP": 1,
@@ -60218,6 +69817,7 @@
"Arduino": 1,
"AsciiDoc": 3,
"AspectJ": 2,
+ "Assembly": 4,
"ATS": 10,
"AutoHotkey": 1,
"Awk": 1,
@@ -60226,21 +69826,24 @@
"Brightscript": 1,
"C": 29,
"C#": 2,
- "C++": 28,
+ "C++": 29,
"Ceylon": 1,
"Cirru": 9,
"Clojure": 7,
"COBOL": 4,
"CoffeeScript": 9,
- "Common Lisp": 1,
+ "Common Lisp": 3,
+ "Component Pascal": 2,
"Coq": 12,
"Creole": 1,
+ "Crystal": 3,
"CSS": 2,
"Cuda": 2,
"Dart": 1,
"Diff": 1,
"DM": 1,
"Dogescript": 1,
+ "E": 6,
"Eagle": 2,
"ECL": 1,
"edn": 1,
@@ -60251,34 +69854,42 @@
"Forth": 7,
"Frege": 4,
"Game Maker Language": 13,
+ "GAMS": 1,
"GAP": 7,
"GAS": 1,
- "GLSL": 3,
+ "GLSL": 5,
"Gnuplot": 6,
"Gosu": 4,
"Grammatical Framework": 41,
- "Groovy": 2,
+ "Groovy": 5,
"Groovy Server Pages": 4,
"Haml": 1,
"Handlebars": 2,
+ "Haskell": 3,
+ "HTML": 2,
"Hy": 2,
"IDL": 4,
"Idris": 1,
+ "Inform 7": 2,
"INI": 2,
"Ioke": 1,
+ "Isabelle": 1,
"Jade": 1,
"Java": 6,
- "JavaScript": 20,
+ "JavaScript": 24,
"JSON": 4,
"JSON5": 2,
"JSONiq": 2,
"JSONLD": 1,
"Julia": 1,
+ "Kit": 1,
"Kotlin": 1,
"KRL": 1,
"Lasso": 4,
+ "Latte": 2,
"Less": 1,
"LFE": 4,
+ "Liquid": 2,
"Literate Agda": 1,
"Literate CoffeeScript": 1,
"LiveScript": 1,
@@ -60289,18 +69900,20 @@
"Makefile": 2,
"Markdown": 1,
"Mask": 1,
- "Mathematica": 3,
+ "Mathematica": 6,
"Matlab": 39,
"Max": 3,
"MediaWiki": 1,
"Mercury": 9,
"Monkey": 1,
- "Moocode": 2,
+ "Moocode": 3,
"MoonScript": 1,
+ "MTML": 1,
"Nemerle": 1,
"NetLogo": 1,
"Nginx": 1,
"Nimrod": 1,
+ "Nix": 1,
"NSIS": 2,
"Nu": 2,
"Objective-C": 19,
@@ -60311,32 +69924,39 @@
"OpenCL": 2,
"OpenEdge ABL": 5,
"Org": 1,
+ "Ox": 3,
"Oxygene": 1,
+ "Pan": 1,
"Parrot Assembly": 1,
"Parrot Internal Representation": 1,
"Pascal": 1,
"PAWN": 1,
- "Perl": 14,
+ "Perl": 15,
"Perl6": 3,
"PHP": 9,
+ "Pike": 2,
"Pod": 1,
"PogoScript": 1,
"PostScript": 1,
"PowerShell": 2,
"Processing": 1,
- "Prolog": 3,
+ "Prolog": 5,
+ "Propeller Spin": 10,
"Protocol Buffer": 1,
"PureScript": 4,
- "Python": 7,
- "R": 3,
+ "Python": 10,
+ "QMake": 4,
+ "R": 7,
"Racket": 2,
"Ragel in Ruby Host": 3,
"RDoc": 1,
"Rebol": 6,
+ "Red": 2,
"RMarkdown": 1,
"RobotFramework": 3,
- "Ruby": 17,
+ "Ruby": 18,
"Rust": 1,
+ "SAS": 2,
"Sass": 2,
"Scala": 4,
"Scaml": 1,
@@ -60347,12 +69967,17 @@
"ShellSession": 3,
"Shen": 3,
"Slash": 1,
+ "Slim": 1,
+ "Smalltalk": 3,
"SourcePawn": 1,
+ "SQL": 5,
"Squirrel": 1,
- "Standard ML": 4,
+ "Standard ML": 5,
"Stata": 7,
+ "STON": 7,
"Stylus": 1,
"SuperCollider": 1,
+ "Swift": 43,
"SystemVerilog": 4,
"Tcl": 2,
"Tea": 1,
@@ -60361,6 +69986,7 @@
"TXL": 1,
"TypeScript": 3,
"UnrealScript": 2,
+ "VCL": 2,
"Verilog": 13,
"VHDL": 1,
"VimL": 2,
@@ -60368,13 +69994,15 @@
"Volt": 1,
"wisp": 1,
"XC": 1,
- "XML": 4,
+ "XML": 13,
+ "Xojo": 6,
"XProc": 1,
"XQuery": 1,
"XSLT": 1,
"Xtend": 2,
"YAML": 2,
- "Zephir": 2
+ "Zephir": 5,
+ "Zimpl": 1
},
- "md5": "428da52afec01e49817fbebeef5ebf4a"
+ "md5": "59afe9ab875947c5df3590aef023152d"
}
\ No newline at end of file
diff --git a/lib/linguist/vendor.yml b/lib/linguist/vendor.yml
index 43fb88c5..4d8481e5 100644
--- a/lib/linguist/vendor.yml
+++ b/lib/linguist/vendor.yml
@@ -98,9 +98,16 @@
# AngularJS
- (^|/)angular([^.]*)(\.min)?\.js$
+# D3.js
+- (^|\/)d3(\.v\d+)?([^.]*)(\.min)?\.js$
+
# React
- (^|/)react(-[^.]*)?(\.min)?\.js$
+# Modernizr
+- (^|/)modernizr\-\d\.\d+(\.\d+)?(\.min)?\.js$
+- (^|/)modernizr\.custom\.\d+\.js$
+
## Python ##
# django
@@ -141,7 +148,7 @@
- (^|/)[Mm]icrosoft([Mm]vc)?([Aa]jax|[Vv]alidation)(\.debug)?\.js$
# NuGet
-- ^[Pp]ackages/
+- ^[Pp]ackages\/.+\.\d+\/
# ExtJS
- (^|/)extjs/.*?\.js$
@@ -161,6 +168,9 @@
- (^|/)extjs/src/
- (^|/)extjs/welcome/
+# Html5shiv
+- (^|/)html5shiv(\.min)?\.js$
+
# Samples folders
- ^[Ss]amples/
@@ -189,3 +199,12 @@
# Mercury --use-subdirs
- Mercury/
+
+# R packages
+- ^vignettes/
+- ^inst/extdata/
+
+# Octicons
+- octicons.css
+- octicons.min.css
+- sprockets-octicons.scss
diff --git a/lib/linguist/version.rb b/lib/linguist/version.rb
new file mode 100644
index 00000000..6704b3fb
--- /dev/null
+++ b/lib/linguist/version.rb
@@ -0,0 +1,3 @@
+module Linguist
+ VERSION = "2.12.0"
+end
diff --git a/samples/Assembly/ASSEMBLE.inc b/samples/Assembly/ASSEMBLE.inc
new file mode 100644
index 00000000..c4ffdae3
--- /dev/null
+++ b/samples/Assembly/ASSEMBLE.inc
@@ -0,0 +1,2048 @@
+
+; flat assembler core
+; Copyright (c) 1999-2014, Tomasz Grysztar.
+; All rights reserved.
+
+assembler:
+ xor eax,eax
+ mov [stub_size],eax
+ mov [current_pass],ax
+ mov [resolver_flags],eax
+ mov [number_of_sections],eax
+ mov [actual_fixups_size],eax
+ assembler_loop:
+ mov eax,[labels_list]
+ mov [tagged_blocks],eax
+ mov eax,[additional_memory]
+ mov [free_additional_memory],eax
+ mov eax,[additional_memory_end]
+ mov [structures_buffer],eax
+ mov esi,[source_start]
+ mov edi,[code_start]
+ xor eax,eax
+ mov dword [adjustment],eax
+ mov dword [adjustment+4],eax
+ mov [addressing_space],eax
+ mov [error_line],eax
+ mov [counter],eax
+ mov [format_flags],eax
+ mov [number_of_relocations],eax
+ mov [undefined_data_end],eax
+ mov [file_extension],eax
+ mov [next_pass_needed],al
+ mov [output_format],al
+ mov [adjustment_sign],al
+ mov [code_type],16
+ call init_addressing_space
+ pass_loop:
+ call assemble_line
+ jnc pass_loop
+ mov eax,[additional_memory_end]
+ cmp eax,[structures_buffer]
+ je pass_done
+ sub eax,18h
+ mov eax,[eax+4]
+ mov [current_line],eax
+ jmp missing_end_directive
+ pass_done:
+ call close_pass
+ mov eax,[labels_list]
+ check_symbols:
+ cmp eax,[memory_end]
+ jae symbols_checked
+ test byte [eax+8],8
+ jz symbol_defined_ok
+ mov cx,[current_pass]
+ cmp cx,[eax+18]
+ jne symbol_defined_ok
+ test byte [eax+8],1
+ jz symbol_defined_ok
+ sub cx,[eax+16]
+ cmp cx,1
+ jne symbol_defined_ok
+ and byte [eax+8],not 1
+ or [next_pass_needed],-1
+ symbol_defined_ok:
+ test byte [eax+8],10h
+ jz use_prediction_ok
+ mov cx,[current_pass]
+ and byte [eax+8],not 10h
+ test byte [eax+8],20h
+ jnz check_use_prediction
+ cmp cx,[eax+18]
+ jne use_prediction_ok
+ test byte [eax+8],8
+ jz use_prediction_ok
+ jmp use_misprediction
+ check_use_prediction:
+ test byte [eax+8],8
+ jz use_misprediction
+ cmp cx,[eax+18]
+ je use_prediction_ok
+ use_misprediction:
+ or [next_pass_needed],-1
+ use_prediction_ok:
+ test byte [eax+8],40h
+ jz check_next_symbol
+ and byte [eax+8],not 40h
+ test byte [eax+8],4
+ jnz define_misprediction
+ mov cx,[current_pass]
+ test byte [eax+8],80h
+ jnz check_define_prediction
+ cmp cx,[eax+16]
+ jne check_next_symbol
+ test byte [eax+8],1
+ jz check_next_symbol
+ jmp define_misprediction
+ check_define_prediction:
+ test byte [eax+8],1
+ jz define_misprediction
+ cmp cx,[eax+16]
+ je check_next_symbol
+ define_misprediction:
+ or [next_pass_needed],-1
+ check_next_symbol:
+ add eax,LABEL_STRUCTURE_SIZE
+ jmp check_symbols
+ symbols_checked:
+ cmp [next_pass_needed],0
+ jne next_pass
+ mov eax,[error_line]
+ or eax,eax
+ jz assemble_ok
+ mov [current_line],eax
+ cmp [error],undefined_symbol
+ jne error_confirmed
+ mov eax,[error_info]
+ or eax,eax
+ jz error_confirmed
+ test byte [eax+8],1
+ jnz next_pass
+ error_confirmed:
+ call error_handler
+ error_handler:
+ mov eax,[error]
+ sub eax,error_handler
+ add [esp],eax
+ ret
+ next_pass:
+ inc [current_pass]
+ mov ax,[current_pass]
+ cmp ax,[passes_limit]
+ je code_cannot_be_generated
+ jmp assembler_loop
+ assemble_ok:
+ ret
+
+create_addressing_space:
+ mov ebx,[addressing_space]
+ test ebx,ebx
+ jz init_addressing_space
+ test byte [ebx+0Ah],1
+ jnz illegal_instruction
+ mov eax,edi
+ sub eax,[ebx+18h]
+ mov [ebx+1Ch],eax
+ init_addressing_space:
+ mov ebx,[tagged_blocks]
+ mov dword [ebx-4],10h
+ mov dword [ebx-8],20h
+ sub ebx,8+20h
+ cmp ebx,edi
+ jbe out_of_memory
+ mov [tagged_blocks],ebx
+ mov [addressing_space],ebx
+ xor eax,eax
+ mov [ebx],edi
+ mov [ebx+4],eax
+ mov [ebx+8],eax
+ mov [ebx+10h],eax
+ mov [ebx+14h],eax
+ mov [ebx+18h],edi
+ mov [ebx+1Ch],eax
+ ret
+
+assemble_line:
+ mov eax,[tagged_blocks]
+ sub eax,100h
+ cmp edi,eax
+ ja out_of_memory
+ lods byte [esi]
+ cmp al,1
+ je assemble_instruction
+ jb source_end
+ cmp al,3
+ jb define_label
+ je define_constant
+ cmp al,4
+ je label_addressing_space
+ cmp al,0Fh
+ je new_line
+ cmp al,13h
+ je code_type_setting
+ cmp al,10h
+ jne illegal_instruction
+ lods byte [esi]
+ jmp segment_prefix
+ code_type_setting:
+ lods byte [esi]
+ mov [code_type],al
+ jmp instruction_assembled
+ new_line:
+ lods dword [esi]
+ mov [current_line],eax
+ mov [prefixed_instruction],0
+ cmp [symbols_file],0
+ je continue_line
+ cmp [next_pass_needed],0
+ jne continue_line
+ mov ebx,[tagged_blocks]
+ mov dword [ebx-4],1
+ mov dword [ebx-8],14h
+ sub ebx,8+14h
+ cmp ebx,edi
+ jbe out_of_memory
+ mov [tagged_blocks],ebx
+ mov [ebx],eax
+ mov [ebx+4],edi
+ mov eax,[addressing_space]
+ mov [ebx+8],eax
+ mov al,[code_type]
+ mov [ebx+10h],al
+ continue_line:
+ cmp byte [esi],0Fh
+ je line_assembled
+ jmp assemble_line
+ define_label:
+ lods dword [esi]
+ cmp eax,0Fh
+ jb invalid_use_of_symbol
+ je reserved_word_used_as_symbol
+ mov ebx,eax
+ lods byte [esi]
+ mov [label_size],al
+ call make_label
+ jmp continue_line
+ make_label:
+ mov eax,edi
+ xor edx,edx
+ xor cl,cl
+ mov ebp,[addressing_space]
+ sub eax,[ds:ebp]
+ sbb edx,[ds:ebp+4]
+ sbb cl,[ds:ebp+8]
+ jp label_value_ok
+ call recoverable_overflow
+ label_value_ok:
+ mov [address_sign],cl
+ test byte [ds:ebp+0Ah],1
+ jnz make_virtual_label
+ or byte [ebx+9],1
+ xchg eax,[ebx]
+ xchg edx,[ebx+4]
+ mov ch,[ebx+9]
+ shr ch,1
+ and ch,1
+ neg ch
+ sub eax,[ebx]
+ sbb edx,[ebx+4]
+ sbb ch,cl
+ mov dword [adjustment],eax
+ mov dword [adjustment+4],edx
+ mov [adjustment_sign],ch
+ or al,ch
+ or eax,edx
+ setnz ah
+ jmp finish_label
+ make_virtual_label:
+ and byte [ebx+9],not 1
+ cmp eax,[ebx]
+ mov [ebx],eax
+ setne ah
+ cmp edx,[ebx+4]
+ mov [ebx+4],edx
+ setne al
+ or ah,al
+ finish_label:
+ mov ebp,[addressing_space]
+ mov ch,[ds:ebp+9]
+ mov cl,[label_size]
+ mov edx,[ds:ebp+14h]
+ mov ebp,[ds:ebp+10h]
+ finish_label_symbol:
+ mov al,[address_sign]
+ xor al,[ebx+9]
+ and al,10b
+ or ah,al
+ xor [ebx+9],al
+ cmp cl,[ebx+10]
+ mov [ebx+10],cl
+ setne al
+ or ah,al
+ cmp ch,[ebx+11]
+ mov [ebx+11],ch
+ setne al
+ or ah,al
+ cmp ebp,[ebx+12]
+ mov [ebx+12],ebp
+ setne al
+ or ah,al
+ or ch,ch
+ jz label_symbol_ok
+ cmp edx,[ebx+20]
+ mov [ebx+20],edx
+ setne al
+ or ah,al
+ label_symbol_ok:
+ mov cx,[current_pass]
+ xchg [ebx+16],cx
+ mov edx,[current_line]
+ mov [ebx+28],edx
+ and byte [ebx+8],not 2
+ test byte [ebx+8],1
+ jz new_label
+ cmp cx,[ebx+16]
+ je symbol_already_defined
+ btr dword [ebx+8],10
+ jc requalified_label
+ inc cx
+ sub cx,[ebx+16]
+ setnz al
+ or ah,al
+ jz label_made
+ test byte [ebx+8],8
+ jz label_made
+ mov cx,[current_pass]
+ cmp cx,[ebx+18]
+ jne label_made
+ requalified_label:
+ or [next_pass_needed],-1
+ label_made:
+ ret
+ new_label:
+ or byte [ebx+8],1
+ ret
+ define_constant:
+ lods dword [esi]
+ inc esi
+ cmp eax,0Fh
+ jb invalid_use_of_symbol
+ je reserved_word_used_as_symbol
+ mov edx,[eax+8]
+ push edx
+ cmp [current_pass],0
+ je get_constant_value
+ test dl,4
+ jnz get_constant_value
+ mov cx,[current_pass]
+ cmp cx,[eax+16]
+ je get_constant_value
+ or dl,4
+ mov [eax+8],dl
+ get_constant_value:
+ push eax
+ mov al,byte [esi-1]
+ push eax
+ or [size_override],-1
+ call get_value
+ pop ebx
+ mov ch,bl
+ pop ebx
+ pop ecx
+ test cl,4
+ jnz constant_referencing_mode_ok
+ and byte [ebx+8],not 4
+ constant_referencing_mode_ok:
+ xor cl,cl
+ mov ch,[value_type]
+ cmp ch,3
+ je invalid_use_of_symbol
+ make_constant:
+ and byte [ebx+9],not 1
+ cmp eax,[ebx]
+ mov [ebx],eax
+ setne ah
+ cmp edx,[ebx+4]
+ mov [ebx+4],edx
+ setne al
+ or ah,al
+ mov al,[value_sign]
+ xor al,[ebx+9]
+ and al,10b
+ or ah,al
+ xor [ebx+9],al
+ cmp cl,[ebx+10]
+ mov [ebx+10],cl
+ setne al
+ or ah,al
+ cmp ch,[ebx+11]
+ mov [ebx+11],ch
+ setne al
+ or ah,al
+ xor edx,edx
+ cmp edx,[ebx+12]
+ mov [ebx+12],edx
+ setne al
+ or ah,al
+ or ch,ch
+ jz constant_symbol_ok
+ mov edx,[symbol_identifier]
+ cmp edx,[ebx+20]
+ mov [ebx+20],edx
+ setne al
+ or ah,al
+ constant_symbol_ok:
+ mov cx,[current_pass]
+ xchg [ebx+16],cx
+ mov edx,[current_line]
+ mov [ebx+28],edx
+ test byte [ebx+8],1
+ jz new_constant
+ cmp cx,[ebx+16]
+ jne redeclare_constant
+ test byte [ebx+8],2
+ jz symbol_already_defined
+ or byte [ebx+8],4
+ and byte [ebx+9],not 4
+ jmp instruction_assembled
+ redeclare_constant:
+ btr dword [ebx+8],10
+ jc requalified_constant
+ inc cx
+ sub cx,[ebx+16]
+ setnz al
+ or ah,al
+ jz instruction_assembled
+ test byte [ebx+8],4
+ jnz instruction_assembled
+ test byte [ebx+8],8
+ jz instruction_assembled
+ mov cx,[current_pass]
+ cmp cx,[ebx+18]
+ jne instruction_assembled
+ requalified_constant:
+ or [next_pass_needed],-1
+ jmp instruction_assembled
+ new_constant:
+ or byte [ebx+8],1+2
+ jmp instruction_assembled
+ label_addressing_space:
+ lods dword [esi]
+ cmp eax,0Fh
+ jb invalid_use_of_symbol
+ je reserved_word_used_as_symbol
+ mov cx,[current_pass]
+ test byte [eax+8],1
+ jz make_addressing_space_label
+ cmp cx,[eax+16]
+ je symbol_already_defined
+ test byte [eax+9],4
+ jnz make_addressing_space_label
+ or [next_pass_needed],-1
+ make_addressing_space_label:
+ mov dx,[eax+8]
+ and dx,not (2 or 100h)
+ or dx,1 or 4 or 400h
+ mov [eax+8],dx
+ mov [eax+16],cx
+ mov edx,[current_line]
+ mov [eax+28],edx
+ mov ebx,[addressing_space]
+ mov [eax],ebx
+ or byte [ebx+0Ah],2
+ jmp continue_line
+ assemble_instruction:
+; mov [operand_size],0
+; mov [size_override],0
+; mov [operand_prefix],0
+; mov [opcode_prefix],0
+ and dword [operand_size],0
+; mov [rex_prefix],0
+; mov [vex_required],0
+; mov [vex_register],0
+; mov [immediate_size],0
+ and dword [rex_prefix],0
+ call instruction_handler
+ instruction_handler:
+ movzx ebx,word [esi]
+ mov al,[esi+2]
+ add esi,3
+ add [esp],ebx
+ ret
+ instruction_assembled:
+ mov al,[esi]
+ cmp al,0Fh
+ je line_assembled
+ or al,al
+ jnz extra_characters_on_line
+ line_assembled:
+ clc
+ ret
+ source_end:
+ dec esi
+ stc
+ ret
+
+org_directive:
+ lods byte [esi]
+ cmp al,'('
+ jne invalid_argument
+ cmp byte [esi],'.'
+ je invalid_value
+ call get_qword_value
+ mov cl,[value_type]
+ test cl,1
+ jnz invalid_use_of_symbol
+ push eax
+ mov ebx,[addressing_space]
+ mov eax,edi
+ sub eax,[ebx+18h]
+ mov [ebx+1Ch],eax
+ test byte [ebx+0Ah],1
+ jnz in_virtual
+ call init_addressing_space
+ jmp org_space_ok
+ in_virtual:
+ call close_virtual_addressing_space
+ call init_addressing_space
+ or byte [ebx+0Ah],1
+ org_space_ok:
+ pop eax
+ mov [ebx+9],cl
+ mov cl,[value_sign]
+ sub [ebx],eax
+ sbb [ebx+4],edx
+ sbb byte [ebx+8],cl
+ jp org_value_ok
+ call recoverable_overflow
+ org_value_ok:
+ mov edx,[symbol_identifier]
+ mov [ebx+14h],edx
+ cmp [output_format],1
+ ja instruction_assembled
+ cmp edi,[code_start]
+ jne instruction_assembled
+ cmp eax,100h
+ jne instruction_assembled
+ bts [format_flags],0
+ jmp instruction_assembled
+label_directive:
+ lods byte [esi]
+ cmp al,2
+ jne invalid_argument
+ lods dword [esi]
+ cmp eax,0Fh
+ jb invalid_use_of_symbol
+ je reserved_word_used_as_symbol
+ inc esi
+ mov ebx,eax
+ mov [label_size],0
+ lods byte [esi]
+ cmp al,':'
+ je get_label_size
+ dec esi
+ cmp al,11h
+ jne label_size_ok
+ get_label_size:
+ lods word [esi]
+ cmp al,11h
+ jne invalid_argument
+ mov [label_size],ah
+ label_size_ok:
+ cmp byte [esi],80h
+ je get_free_label_value
+ call make_label
+ jmp instruction_assembled
+ get_free_label_value:
+ inc esi
+ lods byte [esi]
+ cmp al,'('
+ jne invalid_argument
+ push ebx ecx
+ or byte [ebx+8],4
+ cmp byte [esi],'.'
+ je invalid_value
+ call get_address_value
+ or bh,bh
+ setnz ch
+ xchg ch,cl
+ mov bp,cx
+ shl ebp,16
+ xchg bl,bh
+ mov bp,bx
+ pop ecx ebx
+ and byte [ebx+8],not 4
+ mov ch,[value_type]
+ test ch,1
+ jnz invalid_use_of_symbol
+ make_free_label:
+ and byte [ebx+9],not 1
+ cmp eax,[ebx]
+ mov [ebx],eax
+ setne ah
+ cmp edx,[ebx+4]
+ mov [ebx+4],edx
+ setne al
+ or ah,al
+ mov edx,[address_symbol]
+ mov cl,[label_size]
+ call finish_label_symbol
+ jmp instruction_assembled
+load_directive:
+ lods byte [esi]
+ cmp al,2
+ jne invalid_argument
+ lods dword [esi]
+ cmp eax,0Fh
+ jb invalid_use_of_symbol
+ je reserved_word_used_as_symbol
+ inc esi
+ push eax
+ mov al,1
+ cmp byte [esi],11h
+ jne load_size_ok
+ lods byte [esi]
+ lods byte [esi]
+ load_size_ok:
+ cmp al,8
+ ja invalid_value
+ mov [operand_size],al
+ and dword [value],0
+ and dword [value+4],0
+ lods byte [esi]
+ cmp al,82h
+ jne invalid_argument
+ call get_data_point
+ jc value_loaded
+ push esi edi
+ mov esi,ebx
+ mov edi,value
+ rep movs byte [edi],[esi]
+ pop edi esi
+ value_loaded:
+ mov [value_sign],0
+ mov eax,dword [value]
+ mov edx,dword [value+4]
+ pop ebx
+ xor cx,cx
+ jmp make_constant
+ get_data_point:
+ mov ebx,[addressing_space]
+ mov ecx,edi
+ sub ecx,[ebx+18h]
+ mov [ebx+1Ch],ecx
+ lods byte [esi]
+ cmp al,'('
+ jne invalid_argument
+ cmp byte [esi],11h
+ jne get_data_address
+ cmp word [esi+1+4],'):'
+ jne get_data_address
+ inc esi
+ lods dword [esi]
+ add esi,2
+ cmp byte [esi],'('
+ jne invalid_argument
+ inc esi
+ cmp eax,0Fh
+ jbe reserved_word_used_as_symbol
+ mov edx,undefined_symbol
+ test byte [eax+8],1
+ jz addressing_space_unavailable
+ mov edx,symbol_out_of_scope
+ mov cx,[eax+16]
+ cmp cx,[current_pass]
+ jne addressing_space_unavailable
+ test byte [eax+9],4
+ jz invalid_use_of_symbol
+ mov ebx,eax
+ mov ax,[current_pass]
+ mov [ebx+18],ax
+ or byte [ebx+8],8
+ cmp [symbols_file],0
+ je get_addressing_space
+ cmp [next_pass_needed],0
+ jne get_addressing_space
+ call store_label_reference
+ get_addressing_space:
+ mov ebx,[ebx]
+ get_data_address:
+ push ebx
+ cmp byte [esi],'.'
+ je invalid_value
+ or [size_override],-1
+ call get_address_value
+ pop ebp
+ call calculate_relative_offset
+ cmp [next_pass_needed],0
+ jne data_address_type_ok
+ cmp [value_type],0
+ jne invalid_use_of_symbol
+ data_address_type_ok:
+ mov ebx,edi
+ xor ecx,ecx
+ add ebx,eax
+ adc edx,ecx
+ mov eax,ebx
+ sub eax,[ds:ebp+18h]
+ sbb edx,ecx
+ jnz bad_data_address
+ mov cl,[operand_size]
+ add eax,ecx
+ cmp eax,[ds:ebp+1Ch]
+ ja bad_data_address
+ clc
+ ret
+ addressing_space_unavailable:
+ cmp [error_line],0
+ jne get_data_address
+ push [current_line]
+ pop [error_line]
+ mov [error],edx
+ mov [error_info],eax
+ jmp get_data_address
+ bad_data_address:
+ call recoverable_overflow
+ stc
+ ret
+store_directive:
+ cmp byte [esi],11h
+ je sized_store
+ lods byte [esi]
+ cmp al,'('
+ jne invalid_argument
+ call get_byte_value
+ xor edx,edx
+ movzx eax,al
+ mov [operand_size],1
+ jmp store_value_ok
+ sized_store:
+ or [size_override],-1
+ call get_value
+ store_value_ok:
+ cmp [value_type],0
+ jne invalid_use_of_symbol
+ mov dword [value],eax
+ mov dword [value+4],edx
+ lods byte [esi]
+ cmp al,80h
+ jne invalid_argument
+ call get_data_point
+ jc instruction_assembled
+ push esi edi
+ mov esi,value
+ mov edi,ebx
+ rep movs byte [edi],[esi]
+ mov eax,edi
+ pop edi esi
+ cmp ebx,[undefined_data_end]
+ jae instruction_assembled
+ cmp eax,[undefined_data_start]
+ jbe instruction_assembled
+ mov [undefined_data_start],eax
+ jmp instruction_assembled
+
+display_directive:
+ lods byte [esi]
+ cmp al,'('
+ jne invalid_argument
+ cmp byte [esi],0
+ jne display_byte
+ inc esi
+ lods dword [esi]
+ mov ecx,eax
+ push edi
+ mov edi,[tagged_blocks]
+ sub edi,8
+ sub edi,eax
+ cmp edi,[esp]
+ jbe out_of_memory
+ mov [tagged_blocks],edi
+ rep movs byte [edi],[esi]
+ stos dword [edi]
+ xor eax,eax
+ stos dword [edi]
+ pop edi
+ inc esi
+ jmp display_next
+ display_byte:
+ call get_byte_value
+ push edi
+ mov edi,[tagged_blocks]
+ sub edi,8+1
+ mov [tagged_blocks],edi
+ stos byte [edi]
+ mov eax,1
+ stos dword [edi]
+ dec eax
+ stos dword [edi]
+ pop edi
+ display_next:
+ cmp edi,[tagged_blocks]
+ ja out_of_memory
+ lods byte [esi]
+ cmp al,','
+ je display_directive
+ dec esi
+ jmp instruction_assembled
+show_display_buffer:
+ mov eax,[tagged_blocks]
+ or eax,eax
+ jz display_done
+ mov esi,[labels_list]
+ cmp esi,eax
+ je display_done
+ display_messages:
+ sub esi,8
+ mov eax,[esi+4]
+ mov ecx,[esi]
+ sub esi,ecx
+ test eax,eax
+ jnz skip_block
+ push esi
+ call display_block
+ pop esi
+ skip_block:
+ cmp esi,[tagged_blocks]
+ jne display_messages
+ display_done:
+ ret
+
+times_directive:
+ lods byte [esi]
+ cmp al,'('
+ jne invalid_argument
+ cmp byte [esi],'.'
+ je invalid_value
+ call get_count_value
+ cmp eax,0
+ je zero_times
+ cmp byte [esi],':'
+ jne times_argument_ok
+ inc esi
+ times_argument_ok:
+ push [counter]
+ push [counter_limit]
+ mov [counter_limit],eax
+ mov [counter],1
+ times_loop:
+ mov eax,esp
+ sub eax,100h
+ jc stack_overflow
+ cmp eax,[stack_limit]
+ jb stack_overflow
+ push esi
+ or [prefixed_instruction],-1
+ call continue_line
+ mov eax,[counter_limit]
+ cmp [counter],eax
+ je times_done
+ inc [counter]
+ pop esi
+ jmp times_loop
+ times_done:
+ pop eax
+ pop [counter_limit]
+ pop [counter]
+ jmp instruction_assembled
+ zero_times:
+ call skip_symbol
+ jnc zero_times
+ jmp instruction_assembled
+
+virtual_directive:
+ lods byte [esi]
+ cmp al,80h
+ jne virtual_at_current
+ lods byte [esi]
+ cmp al,'('
+ jne invalid_argument
+ cmp byte [esi],'.'
+ je invalid_value
+ call get_address_value
+ mov ebp,[address_symbol]
+ or bh,bh
+ setnz ch
+ jmp set_virtual
+ virtual_at_current:
+ dec esi
+ mov ebp,[addressing_space]
+ mov al,[ds:ebp+9]
+ mov [value_type],al
+ mov eax,edi
+ xor edx,edx
+ xor cl,cl
+ sub eax,[ds:ebp]
+ sbb edx,[ds:ebp+4]
+ sbb cl,[ds:ebp+8]
+ mov [address_sign],cl
+ mov bx,[ds:ebp+10h]
+ mov cx,[ds:ebp+10h+2]
+ xchg bh,bl
+ xchg ch,cl
+ mov ebp,[ds:ebp+14h]
+ set_virtual:
+ xchg bl,bh
+ xchg cl,ch
+ shl ecx,16
+ mov cx,bx
+ push ecx eax
+ call allocate_structure_data
+ mov word [ebx],virtual_directive-instruction_handler
+ mov ecx,[addressing_space]
+ mov [ebx+12],ecx
+ mov [ebx+8],edi
+ mov ecx,[current_line]
+ mov [ebx+4],ecx
+ mov ebx,[addressing_space]
+ mov eax,edi
+ sub eax,[ebx+18h]
+ mov [ebx+1Ch],eax
+ call init_addressing_space
+ or byte [ebx+0Ah],1
+ pop eax
+ mov cl,[address_sign]
+ not eax
+ not edx
+ not cl
+ add eax,1
+ adc edx,0
+ adc cl,0
+ add eax,edi
+ adc edx,0
+ adc cl,0
+ mov [ebx],eax
+ mov [ebx+4],edx
+ mov [ebx+8],cl
+ pop dword [ebx+10h]
+ mov [ebx+14h],ebp
+ mov al,[value_type]
+ test al,1
+ jnz invalid_use_of_symbol
+ mov [ebx+9],al
+ jmp instruction_assembled
+ allocate_structure_data:
+ mov ebx,[structures_buffer]
+ sub ebx,18h
+ cmp ebx,[free_additional_memory]
+ jb out_of_memory
+ mov [structures_buffer],ebx
+ ret
+ find_structure_data:
+ mov ebx,[structures_buffer]
+ scan_structures:
+ cmp ebx,[additional_memory_end]
+ je no_such_structure
+ cmp ax,[ebx]
+ je structure_data_found
+ add ebx,18h
+ jmp scan_structures
+ structure_data_found:
+ ret
+ no_such_structure:
+ stc
+ ret
+ end_virtual:
+ call find_structure_data
+ jc unexpected_instruction
+ push ebx
+ call close_virtual_addressing_space
+ pop ebx
+ mov eax,[ebx+12]
+ mov [addressing_space],eax
+ mov edi,[ebx+8]
+ remove_structure_data:
+ push esi edi
+ mov ecx,ebx
+ sub ecx,[structures_buffer]
+ shr ecx,2
+ lea esi,[ebx-4]
+ lea edi,[esi+18h]
+ std
+ rep movs dword [edi],[esi]
+ cld
+ add [structures_buffer],18h
+ pop edi esi
+ ret
+ close_virtual_addressing_space:
+ mov ebx,[addressing_space]
+ mov eax,edi
+ sub eax,[ebx+18h]
+ mov [ebx+1Ch],eax
+ test byte [ebx+0Ah],2
+ jz addressing_space_closed
+ push esi edi ecx edx
+ mov ecx,eax
+ mov eax,[tagged_blocks]
+ mov dword [eax-4],11h
+ mov dword [eax-8],ecx
+ sub eax,8
+ sub eax,ecx
+ mov [tagged_blocks],eax
+ lea edi,[eax+ecx-1]
+ xchg eax,[ebx+18h]
+ lea esi,[eax+ecx-1]
+ mov eax,edi
+ sub eax,esi
+ std
+ shr ecx,1
+ jnc virtual_byte_ok
+ movs byte [edi],[esi]
+ virtual_byte_ok:
+ dec esi
+ dec edi
+ shr ecx,1
+ jnc virtual_word_ok
+ movs word [edi],[esi]
+ virtual_word_ok:
+ sub esi,2
+ sub edi,2
+ rep movs dword [edi],[esi]
+ cld
+ xor edx,edx
+ add [ebx],eax
+ adc dword [ebx+4],edx
+ adc byte [ebx+8],dl
+ pop edx ecx edi esi
+ addressing_space_closed:
+ ret
+repeat_directive:
+ cmp [prefixed_instruction],0
+ jne unexpected_instruction
+ lods byte [esi]
+ cmp al,'('
+ jne invalid_argument
+ cmp byte [esi],'.'
+ je invalid_value
+ call get_count_value
+ cmp eax,0
+ je zero_repeat
+ call allocate_structure_data
+ mov word [ebx],repeat_directive-instruction_handler
+ xchg eax,[counter_limit]
+ mov [ebx+10h],eax
+ mov eax,1
+ xchg eax,[counter]
+ mov [ebx+14h],eax
+ mov [ebx+8],esi
+ mov eax,[current_line]
+ mov [ebx+4],eax
+ jmp instruction_assembled
+ end_repeat:
+ cmp [prefixed_instruction],0
+ jne unexpected_instruction
+ call find_structure_data
+ jc unexpected_instruction
+ mov eax,[counter_limit]
+ inc [counter]
+ cmp [counter],eax
+ jbe continue_repeating
+ stop_repeat:
+ mov eax,[ebx+10h]
+ mov [counter_limit],eax
+ mov eax,[ebx+14h]
+ mov [counter],eax
+ call remove_structure_data
+ jmp instruction_assembled
+ continue_repeating:
+ mov esi,[ebx+8]
+ jmp instruction_assembled
+ zero_repeat:
+ mov al,[esi]
+ or al,al
+ jz missing_end_directive
+ cmp al,0Fh
+ jne extra_characters_on_line
+ call find_end_repeat
+ jmp instruction_assembled
+ find_end_repeat:
+ call find_structure_end
+ cmp ax,repeat_directive-instruction_handler
+ jne unexpected_instruction
+ ret
+while_directive:
+ cmp [prefixed_instruction],0
+ jne unexpected_instruction
+ call allocate_structure_data
+ mov word [ebx],while_directive-instruction_handler
+ mov eax,1
+ xchg eax,[counter]
+ mov [ebx+10h],eax
+ mov [ebx+8],esi
+ mov eax,[current_line]
+ mov [ebx+4],eax
+ do_while:
+ push ebx
+ call calculate_logical_expression
+ or al,al
+ jnz while_true
+ mov al,[esi]
+ or al,al
+ jz missing_end_directive
+ cmp al,0Fh
+ jne extra_characters_on_line
+ stop_while:
+ call find_end_while
+ pop ebx
+ mov eax,[ebx+10h]
+ mov [counter],eax
+ call remove_structure_data
+ jmp instruction_assembled
+ while_true:
+ pop ebx
+ jmp instruction_assembled
+ end_while:
+ cmp [prefixed_instruction],0
+ jne unexpected_instruction
+ call find_structure_data
+ jc unexpected_instruction
+ mov eax,[ebx+4]
+ mov [current_line],eax
+ inc [counter]
+ jz too_many_repeats
+ mov esi,[ebx+8]
+ jmp do_while
+ find_end_while:
+ call find_structure_end
+ cmp ax,while_directive-instruction_handler
+ jne unexpected_instruction
+ ret
+if_directive:
+ cmp [prefixed_instruction],0
+ jne unexpected_instruction
+ call calculate_logical_expression
+ mov dl,al
+ mov al,[esi]
+ or al,al
+ jz missing_end_directive
+ cmp al,0Fh
+ jne extra_characters_on_line
+ or dl,dl
+ jnz if_true
+ call find_else
+ jc instruction_assembled
+ mov al,[esi]
+ cmp al,1
+ jne else_true
+ cmp word [esi+1],if_directive-instruction_handler
+ jne else_true
+ add esi,4
+ jmp if_directive
+ if_true:
+ xor al,al
+ make_if_structure:
+ call allocate_structure_data
+ mov word [ebx],if_directive-instruction_handler
+ mov byte [ebx+2],al
+ mov eax,[current_line]
+ mov [ebx+4],eax
+ jmp instruction_assembled
+ else_true:
+ or al,al
+ jz missing_end_directive
+ cmp al,0Fh
+ jne extra_characters_on_line
+ or al,-1
+ jmp make_if_structure
+ else_directive:
+ cmp [prefixed_instruction],0
+ jne unexpected_instruction
+ mov ax,if_directive-instruction_handler
+ call find_structure_data
+ jc unexpected_instruction
+ cmp byte [ebx+2],0
+ jne unexpected_instruction
+ found_else:
+ mov al,[esi]
+ cmp al,1
+ jne skip_else
+ cmp word [esi+1],if_directive-instruction_handler
+ jne skip_else
+ add esi,4
+ call find_else
+ jnc found_else
+ call remove_structure_data
+ jmp instruction_assembled
+ skip_else:
+ or al,al
+ jz missing_end_directive
+ cmp al,0Fh
+ jne extra_characters_on_line
+ call find_end_if
+ call remove_structure_data
+ jmp instruction_assembled
+ end_if:
+ cmp [prefixed_instruction],0
+ jne unexpected_instruction
+ call find_structure_data
+ jc unexpected_instruction
+ call remove_structure_data
+ jmp instruction_assembled
+ find_else:
+ call find_structure_end
+ cmp ax,else_directive-instruction_handler
+ je else_found
+ cmp ax,if_directive-instruction_handler
+ jne unexpected_instruction
+ stc
+ ret
+ else_found:
+ clc
+ ret
+ find_end_if:
+ call find_structure_end
+ cmp ax,if_directive-instruction_handler
+ jne unexpected_instruction
+ ret
+ find_structure_end:
+ push [error_line]
+ mov eax,[current_line]
+ mov [error_line],eax
+ find_end_directive:
+ call skip_symbol
+ jnc find_end_directive
+ lods byte [esi]
+ cmp al,0Fh
+ jne no_end_directive
+ lods dword [esi]
+ mov [current_line],eax
+ skip_labels:
+ cmp byte [esi],2
+ jne labels_ok
+ add esi,6
+ jmp skip_labels
+ labels_ok:
+ cmp byte [esi],1
+ jne find_end_directive
+ mov ax,[esi+1]
+ cmp ax,prefix_instruction-instruction_handler
+ je find_end_directive
+ add esi,4
+ cmp ax,repeat_directive-instruction_handler
+ je skip_repeat
+ cmp ax,while_directive-instruction_handler
+ je skip_while
+ cmp ax,if_directive-instruction_handler
+ je skip_if
+ cmp ax,else_directive-instruction_handler
+ je structure_end
+ cmp ax,end_directive-instruction_handler
+ jne find_end_directive
+ cmp byte [esi],1
+ jne find_end_directive
+ mov ax,[esi+1]
+ add esi,4
+ cmp ax,repeat_directive-instruction_handler
+ je structure_end
+ cmp ax,while_directive-instruction_handler
+ je structure_end
+ cmp ax,if_directive-instruction_handler
+ jne find_end_directive
+ structure_end:
+ pop [error_line]
+ ret
+ no_end_directive:
+ mov eax,[error_line]
+ mov [current_line],eax
+ jmp missing_end_directive
+ skip_repeat:
+ call find_end_repeat
+ jmp find_end_directive
+ skip_while:
+ call find_end_while
+ jmp find_end_directive
+ skip_if:
+ call skip_if_block
+ jmp find_end_directive
+ skip_if_block:
+ call find_else
+ jc if_block_skipped
+ cmp byte [esi],1
+ jne skip_after_else
+ cmp word [esi+1],if_directive-instruction_handler
+ jne skip_after_else
+ add esi,4
+ jmp skip_if_block
+ skip_after_else:
+ call find_end_if
+ if_block_skipped:
+ ret
+end_directive:
+ lods byte [esi]
+ cmp al,1
+ jne invalid_argument
+ lods word [esi]
+ inc esi
+ cmp ax,virtual_directive-instruction_handler
+ je end_virtual
+ cmp ax,repeat_directive-instruction_handler
+ je end_repeat
+ cmp ax,while_directive-instruction_handler
+ je end_while
+ cmp ax,if_directive-instruction_handler
+ je end_if
+ cmp ax,data_directive-instruction_handler
+ je end_data
+ jmp invalid_argument
+break_directive:
+ mov ebx,[structures_buffer]
+ mov al,[esi]
+ or al,al
+ jz find_breakable_structure
+ cmp al,0Fh
+ jne extra_characters_on_line
+ find_breakable_structure:
+ cmp ebx,[additional_memory_end]
+ je unexpected_instruction
+ mov ax,[ebx]
+ cmp ax,repeat_directive-instruction_handler
+ je break_repeat
+ cmp ax,while_directive-instruction_handler
+ je break_while
+ cmp ax,if_directive-instruction_handler
+ je break_if
+ add ebx,18h
+ jmp find_breakable_structure
+ break_if:
+ push [current_line]
+ mov eax,[ebx+4]
+ mov [current_line],eax
+ call remove_structure_data
+ call skip_if_block
+ pop [current_line]
+ mov ebx,[structures_buffer]
+ jmp find_breakable_structure
+ break_repeat:
+ push ebx
+ call find_end_repeat
+ pop ebx
+ jmp stop_repeat
+ break_while:
+ push ebx
+ jmp stop_while
+
+data_bytes:
+ call define_data
+ lods byte [esi]
+ cmp al,'('
+ je get_byte
+ cmp al,'?'
+ jne invalid_argument
+ mov eax,edi
+ mov byte [edi],0
+ inc edi
+ jmp undefined_data
+ get_byte:
+ cmp byte [esi],0
+ je get_string
+ call get_byte_value
+ stos byte [edi]
+ ret
+ get_string:
+ inc esi
+ lods dword [esi]
+ mov ecx,eax
+ lea eax,[edi+ecx]
+ cmp eax,[tagged_blocks]
+ ja out_of_memory
+ rep movs byte [edi],[esi]
+ inc esi
+ ret
+ undefined_data:
+ mov ebp,[addressing_space]
+ test byte [ds:ebp+0Ah],1
+ jz mark_undefined_data
+ ret
+ mark_undefined_data:
+ cmp eax,[undefined_data_end]
+ je undefined_data_ok
+ mov [undefined_data_start],eax
+ undefined_data_ok:
+ mov [undefined_data_end],edi
+ ret
+ define_data:
+ cmp edi,[tagged_blocks]
+ jae out_of_memory
+ cmp byte [esi],'('
+ jne simple_data_value
+ mov ebx,esi
+ inc esi
+ call skip_expression
+ xchg esi,ebx
+ cmp byte [ebx],81h
+ jne simple_data_value
+ inc esi
+ call get_count_value
+ inc esi
+ or eax,eax
+ jz duplicate_zero_times
+ cmp byte [esi],'{'
+ jne duplicate_single_data_value
+ inc esi
+ duplicate_data:
+ push eax esi
+ duplicated_values:
+ cmp edi,[tagged_blocks]
+ jae out_of_memory
+ call near dword [esp+8]
+ lods byte [esi]
+ cmp al,','
+ je duplicated_values
+ cmp al,'}'
+ jne invalid_argument
+ pop ebx eax
+ dec eax
+ jz data_defined
+ mov esi,ebx
+ jmp duplicate_data
+ duplicate_single_data_value:
+ cmp edi,[tagged_blocks]
+ jae out_of_memory
+ push eax esi
+ call near dword [esp+8]
+ pop ebx eax
+ dec eax
+ jz data_defined
+ mov esi,ebx
+ jmp duplicate_single_data_value
+ duplicate_zero_times:
+ cmp byte [esi],'{'
+ jne skip_single_data_value
+ inc esi
+ skip_data_value:
+ call skip_symbol
+ jc invalid_argument
+ cmp byte [esi],'}'
+ jne skip_data_value
+ inc esi
+ jmp data_defined
+ skip_single_data_value:
+ call skip_symbol
+ jmp data_defined
+ simple_data_value:
+ cmp edi,[tagged_blocks]
+ jae out_of_memory
+ call near dword [esp]
+ data_defined:
+ lods byte [esi]
+ cmp al,','
+ je define_data
+ dec esi
+ add esp,4
+ jmp instruction_assembled
+data_unicode:
+ or [base_code],-1
+ jmp define_words
+data_words:
+ mov [base_code],0
+ define_words:
+ call define_data
+ lods byte [esi]
+ cmp al,'('
+ je get_word
+ cmp al,'?'
+ jne invalid_argument
+ mov eax,edi
+ and word [edi],0
+ scas word [edi]
+ jmp undefined_data
+ ret
+ get_word:
+ cmp [base_code],0
+ je word_data_value
+ cmp byte [esi],0
+ je word_string
+ word_data_value:
+ call get_word_value
+ call mark_relocation
+ stos word [edi]
+ ret
+ word_string:
+ inc esi
+ lods dword [esi]
+ mov ecx,eax
+ jecxz word_string_ok
+ lea eax,[edi+ecx*2]
+ cmp eax,[tagged_blocks]
+ ja out_of_memory
+ xor ah,ah
+ copy_word_string:
+ lods byte [esi]
+ stos word [edi]
+ loop copy_word_string
+ word_string_ok:
+ inc esi
+ ret
+data_dwords:
+ call define_data
+ lods byte [esi]
+ cmp al,'('
+ je get_dword
+ cmp al,'?'
+ jne invalid_argument
+ mov eax,edi
+ and dword [edi],0
+ scas dword [edi]
+ jmp undefined_data
+ get_dword:
+ push esi
+ call get_dword_value
+ pop ebx
+ cmp byte [esi],':'
+ je complex_dword
+ call mark_relocation
+ stos dword [edi]
+ ret
+ complex_dword:
+ mov esi,ebx
+ cmp byte [esi],'.'
+ je invalid_value
+ call get_word_value
+ push eax
+ inc esi
+ lods byte [esi]
+ cmp al,'('
+ jne invalid_operand
+ mov al,[value_type]
+ push eax
+ cmp byte [esi],'.'
+ je invalid_value
+ call get_word_value
+ call mark_relocation
+ stos word [edi]
+ pop eax
+ mov [value_type],al
+ pop eax
+ call mark_relocation
+ stos word [edi]
+ ret
+data_pwords:
+ call define_data
+ lods byte [esi]
+ cmp al,'('
+ je get_pword
+ cmp al,'?'
+ jne invalid_argument
+ mov eax,edi
+ and dword [edi],0
+ scas dword [edi]
+ and word [edi],0
+ scas word [edi]
+ jmp undefined_data
+ get_pword:
+ push esi
+ call get_pword_value
+ pop ebx
+ cmp byte [esi],':'
+ je complex_pword
+ call mark_relocation
+ stos dword [edi]
+ mov ax,dx
+ stos word [edi]
+ ret
+ complex_pword:
+ mov esi,ebx
+ cmp byte [esi],'.'
+ je invalid_value
+ call get_word_value
+ push eax
+ inc esi
+ lods byte [esi]
+ cmp al,'('
+ jne invalid_operand
+ mov al,[value_type]
+ push eax
+ cmp byte [esi],'.'
+ je invalid_value
+ call get_dword_value
+ call mark_relocation
+ stos dword [edi]
+ pop eax
+ mov [value_type],al
+ pop eax
+ call mark_relocation
+ stos word [edi]
+ ret
+data_qwords:
+ call define_data
+ lods byte [esi]
+ cmp al,'('
+ je get_qword
+ cmp al,'?'
+ jne invalid_argument
+ mov eax,edi
+ and dword [edi],0
+ scas dword [edi]
+ and dword [edi],0
+ scas dword [edi]
+ jmp undefined_data
+ get_qword:
+ call get_qword_value
+ call mark_relocation
+ stos dword [edi]
+ mov eax,edx
+ stos dword [edi]
+ ret
+data_twords:
+ call define_data
+ lods byte [esi]
+ cmp al,'('
+ je get_tword
+ cmp al,'?'
+ jne invalid_argument
+ mov eax,edi
+ and dword [edi],0
+ scas dword [edi]
+ and dword [edi],0
+ scas dword [edi]
+ and word [edi],0
+ scas word [edi]
+ jmp undefined_data
+ get_tword:
+ cmp byte [esi],'.'
+ jne complex_tword
+ inc esi
+ cmp word [esi+8],8000h
+ je fp_zero_tword
+ mov eax,[esi]
+ stos dword [edi]
+ mov eax,[esi+4]
+ stos dword [edi]
+ mov ax,[esi+8]
+ add ax,3FFFh
+ jo value_out_of_range
+ cmp ax,7FFFh
+ jge value_out_of_range
+ cmp ax,0
+ jg tword_exp_ok
+ mov cx,ax
+ neg cx
+ inc cx
+ cmp cx,64
+ jae value_out_of_range
+ cmp cx,32
+ ja large_shift
+ mov eax,[esi]
+ mov edx,[esi+4]
+ mov ebx,edx
+ shr edx,cl
+ shrd eax,ebx,cl
+ jmp tword_mantissa_shift_done
+ large_shift:
+ sub cx,32
+ xor edx,edx
+ mov eax,[esi+4]
+ shr eax,cl
+ tword_mantissa_shift_done:
+ jnc store_shifted_mantissa
+ add eax,1
+ adc edx,0
+ store_shifted_mantissa:
+ mov [edi-8],eax
+ mov [edi-4],edx
+ xor ax,ax
+ test edx,1 shl 31
+ jz tword_exp_ok
+ inc ax
+ tword_exp_ok:
+ mov bl,[esi+11]
+ shl bx,15
+ or ax,bx
+ stos word [edi]
+ add esi,13
+ ret
+ fp_zero_tword:
+ xor eax,eax
+ stos dword [edi]
+ stos dword [edi]
+ mov al,[esi+11]
+ shl ax,15
+ stos word [edi]
+ add esi,13
+ ret
+ complex_tword:
+ call get_word_value
+ push eax
+ cmp byte [esi],':'
+ jne invalid_operand
+ inc esi
+ lods byte [esi]
+ cmp al,'('
+ jne invalid_operand
+ mov al,[value_type]
+ push eax
+ cmp byte [esi],'.'
+ je invalid_value
+ call get_qword_value
+ call mark_relocation
+ stos dword [edi]
+ mov eax,edx
+ stos dword [edi]
+ pop eax
+ mov [value_type],al
+ pop eax
+ call mark_relocation
+ stos word [edi]
+ ret
+data_file:
+ lods word [esi]
+ cmp ax,'('
+ jne invalid_argument
+ add esi,4
+ call open_binary_file
+ mov eax,[esi-4]
+ lea esi,[esi+eax+1]
+ mov al,2
+ xor edx,edx
+ call lseek
+ push eax
+ xor edx,edx
+ cmp byte [esi],':'
+ jne position_ok
+ inc esi
+ cmp byte [esi],'('
+ jne invalid_argument
+ inc esi
+ cmp byte [esi],'.'
+ je invalid_value
+ push ebx
+ call get_count_value
+ pop ebx
+ mov edx,eax
+ sub [esp],edx
+ jc value_out_of_range
+ position_ok:
+ cmp byte [esi],','
+ jne size_ok
+ inc esi
+ cmp byte [esi],'('
+ jne invalid_argument
+ inc esi
+ cmp byte [esi],'.'
+ je invalid_value
+ push ebx edx
+ call get_count_value
+ pop edx ebx
+ cmp eax,[esp]
+ ja value_out_of_range
+ mov [esp],eax
+ size_ok:
+ xor al,al
+ call lseek
+ pop ecx
+ mov edx,edi
+ add edi,ecx
+ jc out_of_memory
+ cmp edi,[tagged_blocks]
+ ja out_of_memory
+ call read
+ jc error_reading_file
+ call close
+ lods byte [esi]
+ cmp al,','
+ je data_file
+ dec esi
+ jmp instruction_assembled
+ open_binary_file:
+ push esi
+ push edi
+ mov eax,[current_line]
+ find_current_source_path:
+ mov esi,[eax]
+ test byte [eax+7],80h
+ jz get_current_path
+ mov eax,[eax+8]
+ jmp find_current_source_path
+ get_current_path:
+ lodsb
+ stosb
+ or al,al
+ jnz get_current_path
+ cut_current_path:
+ cmp edi,[esp]
+ je current_path_ok
+ cmp byte [edi-1],'\'
+ je current_path_ok
+ cmp byte [edi-1],'/'
+ je current_path_ok
+ dec edi
+ jmp cut_current_path
+ current_path_ok:
+ mov esi,[esp+4]
+ call expand_path
+ pop edx
+ mov esi,edx
+ call open
+ jnc file_opened
+ mov edx,[include_paths]
+ search_in_include_paths:
+ push edx esi
+ mov edi,esi
+ mov esi,[esp+4]
+ call get_include_directory
+ mov [esp+4],esi
+ mov esi,[esp+8]
+ call expand_path
+ pop edx
+ mov esi,edx
+ call open
+ pop edx
+ jnc file_opened
+ cmp byte [edx],0
+ jne search_in_include_paths
+ mov edi,esi
+ mov esi,[esp]
+ push edi
+ call expand_path
+ pop edx
+ mov esi,edx
+ call open
+ jc file_not_found
+ file_opened:
+ mov edi,esi
+ pop esi
+ ret
+reserve_bytes:
+ lods byte [esi]
+ cmp al,'('
+ jne invalid_argument
+ cmp byte [esi],'.'
+ je invalid_value
+ call get_count_value
+ mov ecx,eax
+ mov edx,ecx
+ add edx,edi
+ jc out_of_memory
+ cmp edx,[tagged_blocks]
+ ja out_of_memory
+ push edi
+ cmp [next_pass_needed],0
+ je zero_bytes
+ add edi,ecx
+ jmp reserved_data
+ zero_bytes:
+ xor eax,eax
+ shr ecx,1
+ jnc bytes_stosb_ok
+ stos byte [edi]
+ bytes_stosb_ok:
+ shr ecx,1
+ jnc bytes_stosw_ok
+ stos word [edi]
+ bytes_stosw_ok:
+ rep stos dword [edi]
+ reserved_data:
+ pop eax
+ call undefined_data
+ jmp instruction_assembled
+reserve_words:
+ lods byte [esi]
+ cmp al,'('
+ jne invalid_argument
+ cmp byte [esi],'.'
+ je invalid_value
+ call get_count_value
+ mov ecx,eax
+ mov edx,ecx
+ shl edx,1
+ jc out_of_memory
+ add edx,edi
+ jc out_of_memory
+ cmp edx,[tagged_blocks]
+ ja out_of_memory
+ push edi
+ cmp [next_pass_needed],0
+ je zero_words
+ lea edi,[edi+ecx*2]
+ jmp reserved_data
+ zero_words:
+ xor eax,eax
+ shr ecx,1
+ jnc words_stosw_ok
+ stos word [edi]
+ words_stosw_ok:
+ rep stos dword [edi]
+ jmp reserved_data
+reserve_dwords:
+ lods byte [esi]
+ cmp al,'('
+ jne invalid_argument
+ cmp byte [esi],'.'
+ je invalid_value
+ call get_count_value
+ mov ecx,eax
+ mov edx,ecx
+ shl edx,1
+ jc out_of_memory
+ shl edx,1
+ jc out_of_memory
+ add edx,edi
+ jc out_of_memory
+ cmp edx,[tagged_blocks]
+ ja out_of_memory
+ push edi
+ cmp [next_pass_needed],0
+ je zero_dwords
+ lea edi,[edi+ecx*4]
+ jmp reserved_data
+ zero_dwords:
+ xor eax,eax
+ rep stos dword [edi]
+ jmp reserved_data
+reserve_pwords:
+ lods byte [esi]
+ cmp al,'('
+ jne invalid_argument
+ cmp byte [esi],'.'
+ je invalid_value
+ call get_count_value
+ mov ecx,eax
+ shl ecx,1
+ jc out_of_memory
+ add ecx,eax
+ mov edx,ecx
+ shl edx,1
+ jc out_of_memory
+ add edx,edi
+ jc out_of_memory
+ cmp edx,[tagged_blocks]
+ ja out_of_memory
+ push edi
+ cmp [next_pass_needed],0
+ je zero_words
+ lea edi,[edi+ecx*2]
+ jmp reserved_data
+reserve_qwords:
+ lods byte [esi]
+ cmp al,'('
+ jne invalid_argument
+ cmp byte [esi],'.'
+ je invalid_value
+ call get_count_value
+ mov ecx,eax
+ shl ecx,1
+ jc out_of_memory
+ mov edx,ecx
+ shl edx,1
+ jc out_of_memory
+ shl edx,1
+ jc out_of_memory
+ add edx,edi
+ jc out_of_memory
+ cmp edx,[tagged_blocks]
+ ja out_of_memory
+ push edi
+ cmp [next_pass_needed],0
+ je zero_dwords
+ lea edi,[edi+ecx*4]
+ jmp reserved_data
+reserve_twords:
+ lods byte [esi]
+ cmp al,'('
+ jne invalid_argument
+ cmp byte [esi],'.'
+ je invalid_value
+ call get_count_value
+ mov ecx,eax
+ shl ecx,2
+ jc out_of_memory
+ add ecx,eax
+ mov edx,ecx
+ shl edx,1
+ jc out_of_memory
+ add edx,edi
+ jc out_of_memory
+ cmp edx,[tagged_blocks]
+ ja out_of_memory
+ push edi
+ cmp [next_pass_needed],0
+ je zero_words
+ lea edi,[edi+ecx*2]
+ jmp reserved_data
+align_directive:
+ lods byte [esi]
+ cmp al,'('
+ jne invalid_argument
+ cmp byte [esi],'.'
+ je invalid_value
+ call get_count_value
+ mov edx,eax
+ dec edx
+ test eax,edx
+ jnz invalid_align_value
+ or eax,eax
+ jz invalid_align_value
+ cmp eax,1
+ je instruction_assembled
+ mov ecx,edi
+ mov ebp,[addressing_space]
+ sub ecx,[ds:ebp]
+ cmp dword [ds:ebp+10h],0
+ jne section_not_aligned_enough
+ cmp byte [ds:ebp+9],0
+ je make_alignment
+ cmp [output_format],3
+ je pe_alignment
+ mov ebx,[ds:ebp+14h]
+ cmp byte [ebx],0
+ jne section_not_aligned_enough
+ cmp eax,[ebx+10h]
+ jbe make_alignment
+ jmp section_not_aligned_enough
+ pe_alignment:
+ cmp eax,1000h
+ ja section_not_aligned_enough
+ make_alignment:
+ dec eax
+ and ecx,eax
+ jz instruction_assembled
+ neg ecx
+ add ecx,eax
+ inc ecx
+ mov edx,ecx
+ add edx,edi
+ jc out_of_memory
+ cmp edx,[tagged_blocks]
+ ja out_of_memory
+ push edi
+ cmp [next_pass_needed],0
+ je nops
+ add edi,ecx
+ jmp reserved_data
+ invalid_align_value:
+ cmp [error_line],0
+ jne instruction_assembled
+ mov eax,[current_line]
+ mov [error_line],eax
+ mov [error],invalid_value
+ jmp instruction_assembled
+ nops:
+ mov eax,90909090h
+ shr ecx,1
+ jnc nops_stosb_ok
+ stos byte [edi]
+ nops_stosb_ok:
+ shr ecx,1
+ jnc nops_stosw_ok
+ stos word [edi]
+ nops_stosw_ok:
+ rep stos dword [edi]
+ jmp reserved_data
+err_directive:
+ mov al,[esi]
+ cmp al,0Fh
+ je invoked_error
+ or al,al
+ jz invoked_error
+ jmp extra_characters_on_line
+assert_directive:
+ call calculate_logical_expression
+ or al,al
+ jnz instruction_assembled
+ cmp [error_line],0
+ jne instruction_assembled
+ mov eax,[current_line]
+ mov [error_line],eax
+ mov [error],assertion_failed
+ jmp instruction_assembled
diff --git a/samples/Assembly/FASM.asm b/samples/Assembly/FASM.asm
new file mode 100644
index 00000000..9a2201ae
--- /dev/null
+++ b/samples/Assembly/FASM.asm
@@ -0,0 +1,350 @@
+
+; flat assembler interface for Win32
+; Copyright (c) 1999-2014, Tomasz Grysztar.
+; All rights reserved.
+
+ format PE console
+
+section '.text' code readable executable
+
+start:
+
+ mov [con_handle],STD_OUTPUT_HANDLE
+ mov esi,_logo
+ call display_string
+
+ call get_params
+ jc information
+
+ call init_memory
+
+ mov esi,_memory_prefix
+ call display_string
+ mov eax,[memory_end]
+ sub eax,[memory_start]
+ add eax,[additional_memory_end]
+ sub eax,[additional_memory]
+ shr eax,10
+ call display_number
+ mov esi,_memory_suffix
+ call display_string
+
+ call [GetTickCount]
+ mov [start_time],eax
+
+ call preprocessor
+ call parser
+ call assembler
+ call formatter
+
+ call display_user_messages
+ movzx eax,[current_pass]
+ inc eax
+ call display_number
+ mov esi,_passes_suffix
+ call display_string
+ call [GetTickCount]
+ sub eax,[start_time]
+ xor edx,edx
+ mov ebx,100
+ div ebx
+ or eax,eax
+ jz display_bytes_count
+ xor edx,edx
+ mov ebx,10
+ div ebx
+ push edx
+ call display_number
+ mov dl,'.'
+ call display_character
+ pop eax
+ call display_number
+ mov esi,_seconds_suffix
+ call display_string
+ display_bytes_count:
+ mov eax,[written_size]
+ call display_number
+ mov esi,_bytes_suffix
+ call display_string
+ xor al,al
+ jmp exit_program
+
+information:
+ mov esi,_usage
+ call display_string
+ mov al,1
+ jmp exit_program
+
+get_params:
+ mov [input_file],0
+ mov [output_file],0
+ mov [symbols_file],0
+ mov [memory_setting],0
+ mov [passes_limit],100
+ call [GetCommandLine]
+ mov esi,eax
+ mov edi,params
+ find_command_start:
+ lodsb
+ cmp al,20h
+ je find_command_start
+ cmp al,22h
+ je skip_quoted_name
+ skip_name:
+ lodsb
+ cmp al,20h
+ je find_param
+ or al,al
+ jz all_params
+ jmp skip_name
+ skip_quoted_name:
+ lodsb
+ cmp al,22h
+ je find_param
+ or al,al
+ jz all_params
+ jmp skip_quoted_name
+ find_param:
+ lodsb
+ cmp al,20h
+ je find_param
+ cmp al,'-'
+ je option_param
+ cmp al,0Dh
+ je all_params
+ or al,al
+ jz all_params
+ cmp [input_file],0
+ jne get_output_file
+ mov [input_file],edi
+ jmp process_param
+ get_output_file:
+ cmp [output_file],0
+ jne bad_params
+ mov [output_file],edi
+ process_param:
+ cmp al,22h
+ je string_param
+ copy_param:
+ stosb
+ lodsb
+ cmp al,20h
+ je param_end
+ cmp al,0Dh
+ je param_end
+ or al,al
+ jz param_end
+ jmp copy_param
+ string_param:
+ lodsb
+ cmp al,22h
+ je string_param_end
+ cmp al,0Dh
+ je param_end
+ or al,al
+ jz param_end
+ stosb
+ jmp string_param
+ option_param:
+ lodsb
+ cmp al,'m'
+ je memory_option
+ cmp al,'M'
+ je memory_option
+ cmp al,'p'
+ je passes_option
+ cmp al,'P'
+ je passes_option
+ cmp al,'s'
+ je symbols_option
+ cmp al,'S'
+ je symbols_option
+ bad_params:
+ stc
+ ret
+ get_option_value:
+ xor eax,eax
+ mov edx,eax
+ get_option_digit:
+ lodsb
+ cmp al,20h
+ je option_value_ok
+ cmp al,0Dh
+ je option_value_ok
+ or al,al
+ jz option_value_ok
+ sub al,30h
+ jc invalid_option_value
+ cmp al,9
+ ja invalid_option_value
+ imul edx,10
+ jo invalid_option_value
+ add edx,eax
+ jc invalid_option_value
+ jmp get_option_digit
+ option_value_ok:
+ dec esi
+ clc
+ ret
+ invalid_option_value:
+ stc
+ ret
+ memory_option:
+ lodsb
+ cmp al,20h
+ je memory_option
+ cmp al,0Dh
+ je bad_params
+ or al,al
+ jz bad_params
+ dec esi
+ call get_option_value
+ or edx,edx
+ jz bad_params
+ cmp edx,1 shl (32-10)
+ jae bad_params
+ mov [memory_setting],edx
+ jmp find_param
+ passes_option:
+ lodsb
+ cmp al,20h
+ je passes_option
+ cmp al,0Dh
+ je bad_params
+ or al,al
+ jz bad_params
+ dec esi
+ call get_option_value
+ or edx,edx
+ jz bad_params
+ cmp edx,10000h
+ ja bad_params
+ mov [passes_limit],dx
+ jmp find_param
+ symbols_option:
+ mov [symbols_file],edi
+ find_symbols_file_name:
+ lodsb
+ cmp al,20h
+ jne process_param
+ jmp find_symbols_file_name
+ param_end:
+ dec esi
+ string_param_end:
+ xor al,al
+ stosb
+ jmp find_param
+ all_params:
+ cmp [input_file],0
+ je bad_params
+ clc
+ ret
+
+include 'system.inc'
+
+include '..\errors.inc'
+include '..\symbdump.inc'
+include '..\preproce.inc'
+include '..\parser.inc'
+include '..\exprpars.inc'
+include '..\assemble.inc'
+include '..\exprcalc.inc'
+include '..\formats.inc'
+include '..\x86_64.inc'
+include '..\avx.inc'
+
+include '..\tables.inc'
+include '..\messages.inc'
+
+section '.data' data readable writeable
+
+include '..\version.inc'
+
+_copyright db 'Copyright (c) 1999-2014, Tomasz Grysztar',0Dh,0Ah,0
+
+_logo db 'flat assembler version ',VERSION_STRING,0
+_usage db 0Dh,0Ah
+ db 'usage: fasm [output]',0Dh,0Ah
+ db 'optional settings:',0Dh,0Ah
+ db ' -m set the limit in kilobytes for the available memory',0Dh,0Ah
+ db ' -p set the maximum allowed number of passes',0Dh,0Ah
+ db ' -s dump symbolic information for debugging',0Dh,0Ah
+ db 0
+_memory_prefix db ' (',0
+_memory_suffix db ' kilobytes memory)',0Dh,0Ah,0
+_passes_suffix db ' passes, ',0
+_seconds_suffix db ' seconds, ',0
+_bytes_suffix db ' bytes.',0Dh,0Ah,0
+
+align 4
+
+include '..\variable.inc'
+
+con_handle dd ?
+memory_setting dd ?
+start_time dd ?
+bytes_count dd ?
+displayed_count dd ?
+character db ?
+last_displayed rb 2
+
+params rb 1000h
+options rb 1000h
+buffer rb 4000h
+
+stack 10000h
+
+section '.idata' import data readable writeable
+
+ dd 0,0,0,rva kernel_name,rva kernel_table
+ dd 0,0,0,0,0
+
+ kernel_table:
+ ExitProcess dd rva _ExitProcess
+ CreateFile dd rva _CreateFileA
+ ReadFile dd rva _ReadFile
+ WriteFile dd rva _WriteFile
+ CloseHandle dd rva _CloseHandle
+ SetFilePointer dd rva _SetFilePointer
+ GetCommandLine dd rva _GetCommandLineA
+ GetEnvironmentVariable dd rva _GetEnvironmentVariable
+ GetStdHandle dd rva _GetStdHandle
+ VirtualAlloc dd rva _VirtualAlloc
+ VirtualFree dd rva _VirtualFree
+ GetTickCount dd rva _GetTickCount
+ GetSystemTime dd rva _GetSystemTime
+ GlobalMemoryStatus dd rva _GlobalMemoryStatus
+ dd 0
+
+ kernel_name db 'KERNEL32.DLL',0
+
+ _ExitProcess dw 0
+ db 'ExitProcess',0
+ _CreateFileA dw 0
+ db 'CreateFileA',0
+ _ReadFile dw 0
+ db 'ReadFile',0
+ _WriteFile dw 0
+ db 'WriteFile',0
+ _CloseHandle dw 0
+ db 'CloseHandle',0
+ _SetFilePointer dw 0
+ db 'SetFilePointer',0
+ _GetCommandLineA dw 0
+ db 'GetCommandLineA',0
+ _GetEnvironmentVariable dw 0
+ db 'GetEnvironmentVariableA',0
+ _GetStdHandle dw 0
+ db 'GetStdHandle',0
+ _VirtualAlloc dw 0
+ db 'VirtualAlloc',0
+ _VirtualFree dw 0
+ db 'VirtualFree',0
+ _GetTickCount dw 0
+ db 'GetTickCount',0
+ _GetSystemTime dw 0
+ db 'GetSystemTime',0
+ _GlobalMemoryStatus dw 0
+ db 'GlobalMemoryStatus',0
+
+section '.reloc' fixups data readable discardable
diff --git a/samples/Assembly/SYSTEM.inc b/samples/Assembly/SYSTEM.inc
new file mode 100644
index 00000000..77a61d29
--- /dev/null
+++ b/samples/Assembly/SYSTEM.inc
@@ -0,0 +1,503 @@
+
+; flat assembler interface for Win32
+; Copyright (c) 1999-2014, Tomasz Grysztar.
+; All rights reserved.
+
+CREATE_NEW = 1
+CREATE_ALWAYS = 2
+OPEN_EXISTING = 3
+OPEN_ALWAYS = 4
+TRUNCATE_EXISTING = 5
+
+FILE_SHARE_READ = 1
+FILE_SHARE_WRITE = 2
+FILE_SHARE_DELETE = 4
+
+GENERIC_READ = 80000000h
+GENERIC_WRITE = 40000000h
+
+STD_INPUT_HANDLE = 0FFFFFFF6h
+STD_OUTPUT_HANDLE = 0FFFFFFF5h
+STD_ERROR_HANDLE = 0FFFFFFF4h
+
+MEM_COMMIT = 1000h
+MEM_RESERVE = 2000h
+MEM_DECOMMIT = 4000h
+MEM_RELEASE = 8000h
+MEM_FREE = 10000h
+MEM_PRIVATE = 20000h
+MEM_MAPPED = 40000h
+MEM_RESET = 80000h
+MEM_TOP_DOWN = 100000h
+
+PAGE_NOACCESS = 1
+PAGE_READONLY = 2
+PAGE_READWRITE = 4
+PAGE_WRITECOPY = 8
+PAGE_EXECUTE = 10h
+PAGE_EXECUTE_READ = 20h
+PAGE_EXECUTE_READWRITE = 40h
+PAGE_EXECUTE_WRITECOPY = 80h
+PAGE_GUARD = 100h
+PAGE_NOCACHE = 200h
+
+init_memory:
+ xor eax,eax
+ mov [memory_start],eax
+ mov eax,esp
+ and eax,not 0FFFh
+ add eax,1000h-10000h
+ mov [stack_limit],eax
+ mov eax,[memory_setting]
+ shl eax,10
+ jnz allocate_memory
+ push buffer
+ call [GlobalMemoryStatus]
+ mov eax,dword [buffer+20]
+ mov edx,dword [buffer+12]
+ cmp eax,0
+ jl large_memory
+ cmp edx,0
+ jl large_memory
+ shr eax,2
+ add eax,edx
+ jmp allocate_memory
+ large_memory:
+ mov eax,80000000h
+ allocate_memory:
+ mov edx,eax
+ shr edx,2
+ mov ecx,eax
+ sub ecx,edx
+ mov [memory_end],ecx
+ mov [additional_memory_end],edx
+ push PAGE_READWRITE
+ push MEM_COMMIT
+ push eax
+ push 0
+ call [VirtualAlloc]
+ or eax,eax
+ jz not_enough_memory
+ mov [memory_start],eax
+ add eax,[memory_end]
+ mov [memory_end],eax
+ mov [additional_memory],eax
+ add [additional_memory_end],eax
+ ret
+ not_enough_memory:
+ mov eax,[additional_memory_end]
+ shl eax,1
+ cmp eax,4000h
+ jb out_of_memory
+ jmp allocate_memory
+
+exit_program:
+ movzx eax,al
+ push eax
+ mov eax,[memory_start]
+ test eax,eax
+ jz do_exit
+ push MEM_RELEASE
+ push 0
+ push eax
+ call [VirtualFree]
+ do_exit:
+ call [ExitProcess]
+
+get_environment_variable:
+ mov ecx,[memory_end]
+ sub ecx,edi
+ cmp ecx,4000h
+ jbe buffer_for_variable_ok
+ mov ecx,4000h
+ buffer_for_variable_ok:
+ push ecx
+ push edi
+ push esi
+ call [GetEnvironmentVariable]
+ add edi,eax
+ cmp edi,[memory_end]
+ jae out_of_memory
+ ret
+
+open:
+ push 0
+ push 0
+ push OPEN_EXISTING
+ push 0
+ push FILE_SHARE_READ
+ push GENERIC_READ
+ push edx
+ call [CreateFile]
+ cmp eax,-1
+ je file_error
+ mov ebx,eax
+ clc
+ ret
+ file_error:
+ stc
+ ret
+create:
+ push 0
+ push 0
+ push CREATE_ALWAYS
+ push 0
+ push FILE_SHARE_READ
+ push GENERIC_WRITE
+ push edx
+ call [CreateFile]
+ cmp eax,-1
+ je file_error
+ mov ebx,eax
+ clc
+ ret
+write:
+ push 0
+ push bytes_count
+ push ecx
+ push edx
+ push ebx
+ call [WriteFile]
+ or eax,eax
+ jz file_error
+ clc
+ ret
+read:
+ mov ebp,ecx
+ push 0
+ push bytes_count
+ push ecx
+ push edx
+ push ebx
+ call [ReadFile]
+ or eax,eax
+ jz file_error
+ cmp ebp,[bytes_count]
+ jne file_error
+ clc
+ ret
+close:
+ push ebx
+ call [CloseHandle]
+ ret
+lseek:
+ movzx eax,al
+ push eax
+ push 0
+ push edx
+ push ebx
+ call [SetFilePointer]
+ ret
+
+display_string:
+ push [con_handle]
+ call [GetStdHandle]
+ mov ebp,eax
+ mov edi,esi
+ or ecx,-1
+ xor al,al
+ repne scasb
+ neg ecx
+ sub ecx,2
+ push 0
+ push bytes_count
+ push ecx
+ push esi
+ push ebp
+ call [WriteFile]
+ ret
+display_character:
+ push ebx
+ mov [character],dl
+ push [con_handle]
+ call [GetStdHandle]
+ mov ebx,eax
+ push 0
+ push bytes_count
+ push 1
+ push character
+ push ebx
+ call [WriteFile]
+ pop ebx
+ ret
+display_number:
+ push ebx
+ mov ecx,1000000000
+ xor edx,edx
+ xor bl,bl
+ display_loop:
+ div ecx
+ push edx
+ cmp ecx,1
+ je display_digit
+ or bl,bl
+ jnz display_digit
+ or al,al
+ jz digit_ok
+ not bl
+ display_digit:
+ mov dl,al
+ add dl,30h
+ push ecx
+ call display_character
+ pop ecx
+ digit_ok:
+ mov eax,ecx
+ xor edx,edx
+ mov ecx,10
+ div ecx
+ mov ecx,eax
+ pop eax
+ or ecx,ecx
+ jnz display_loop
+ pop ebx
+ ret
+
+display_user_messages:
+ mov [displayed_count],0
+ call show_display_buffer
+ cmp [displayed_count],1
+ jb line_break_ok
+ je make_line_break
+ mov ax,word [last_displayed]
+ cmp ax,0A0Dh
+ je line_break_ok
+ cmp ax,0D0Ah
+ je line_break_ok
+ make_line_break:
+ mov word [buffer],0A0Dh
+ push [con_handle]
+ call [GetStdHandle]
+ push 0
+ push bytes_count
+ push 2
+ push buffer
+ push eax
+ call [WriteFile]
+ line_break_ok:
+ ret
+display_block:
+ add [displayed_count],ecx
+ cmp ecx,1
+ ja take_last_two_characters
+ jb block_displayed
+ mov al,[last_displayed+1]
+ mov ah,[esi]
+ mov word [last_displayed],ax
+ jmp block_ok
+ take_last_two_characters:
+ mov ax,[esi+ecx-2]
+ mov word [last_displayed],ax
+ block_ok:
+ push ecx
+ push [con_handle]
+ call [GetStdHandle]
+ pop ecx
+ push 0
+ push bytes_count
+ push ecx
+ push esi
+ push eax
+ call [WriteFile]
+ block_displayed:
+ ret
+
+fatal_error:
+ mov [con_handle],STD_ERROR_HANDLE
+ mov esi,error_prefix
+ call display_string
+ pop esi
+ call display_string
+ mov esi,error_suffix
+ call display_string
+ mov al,0FFh
+ jmp exit_program
+assembler_error:
+ mov [con_handle],STD_ERROR_HANDLE
+ call display_user_messages
+ push dword 0
+ mov ebx,[current_line]
+ get_error_lines:
+ mov eax,[ebx]
+ cmp byte [eax],0
+ je get_next_error_line
+ push ebx
+ test byte [ebx+7],80h
+ jz display_error_line
+ mov edx,ebx
+ find_definition_origin:
+ mov edx,[edx+12]
+ test byte [edx+7],80h
+ jnz find_definition_origin
+ push edx
+ get_next_error_line:
+ mov ebx,[ebx+8]
+ jmp get_error_lines
+ display_error_line:
+ mov esi,[ebx]
+ call display_string
+ mov esi,line_number_start
+ call display_string
+ mov eax,[ebx+4]
+ and eax,7FFFFFFFh
+ call display_number
+ mov dl,']'
+ call display_character
+ pop esi
+ cmp ebx,esi
+ je line_number_ok
+ mov dl,20h
+ call display_character
+ push esi
+ mov esi,[esi]
+ movzx ecx,byte [esi]
+ inc esi
+ call display_block
+ mov esi,line_number_start
+ call display_string
+ pop esi
+ mov eax,[esi+4]
+ and eax,7FFFFFFFh
+ call display_number
+ mov dl,']'
+ call display_character
+ line_number_ok:
+ mov esi,line_data_start
+ call display_string
+ mov esi,ebx
+ mov edx,[esi]
+ call open
+ mov al,2
+ xor edx,edx
+ call lseek
+ mov edx,[esi+8]
+ sub eax,edx
+ jz line_data_displayed
+ push eax
+ xor al,al
+ call lseek
+ mov ecx,[esp]
+ mov edx,[additional_memory]
+ lea eax,[edx+ecx]
+ cmp eax,[additional_memory_end]
+ ja out_of_memory
+ call read
+ call close
+ pop ecx
+ mov esi,[additional_memory]
+ get_line_data:
+ mov al,[esi]
+ cmp al,0Ah
+ je display_line_data
+ cmp al,0Dh
+ je display_line_data
+ cmp al,1Ah
+ je display_line_data
+ or al,al
+ jz display_line_data
+ inc esi
+ loop get_line_data
+ display_line_data:
+ mov ecx,esi
+ mov esi,[additional_memory]
+ sub ecx,esi
+ call display_block
+ line_data_displayed:
+ mov esi,cr_lf
+ call display_string
+ pop ebx
+ or ebx,ebx
+ jnz display_error_line
+ mov esi,error_prefix
+ call display_string
+ pop esi
+ call display_string
+ mov esi,error_suffix
+ call display_string
+ mov al,2
+ jmp exit_program
+
+make_timestamp:
+ push buffer
+ call [GetSystemTime]
+ movzx ecx,word [buffer]
+ mov eax,ecx
+ sub eax,1970
+ mov ebx,365
+ mul ebx
+ mov ebp,eax
+ mov eax,ecx
+ sub eax,1969
+ shr eax,2
+ add ebp,eax
+ mov eax,ecx
+ sub eax,1901
+ mov ebx,100
+ div ebx
+ sub ebp,eax
+ mov eax,ecx
+ xor edx,edx
+ sub eax,1601
+ mov ebx,400
+ div ebx
+ add ebp,eax
+ movzx ecx,word [buffer+2]
+ mov eax,ecx
+ dec eax
+ mov ebx,30
+ mul ebx
+ add ebp,eax
+ cmp ecx,8
+ jbe months_correction
+ mov eax,ecx
+ sub eax,7
+ shr eax,1
+ add ebp,eax
+ mov ecx,8
+ months_correction:
+ mov eax,ecx
+ shr eax,1
+ add ebp,eax
+ cmp ecx,2
+ jbe day_correction_ok
+ sub ebp,2
+ movzx ecx,word [buffer]
+ test ecx,11b
+ jnz day_correction_ok
+ xor edx,edx
+ mov eax,ecx
+ mov ebx,100
+ div ebx
+ or edx,edx
+ jnz day_correction
+ mov eax,ecx
+ mov ebx,400
+ div ebx
+ or edx,edx
+ jnz day_correction_ok
+ day_correction:
+ inc ebp
+ day_correction_ok:
+ movzx eax,word [buffer+6]
+ dec eax
+ add eax,ebp
+ mov ebx,24
+ mul ebx
+ movzx ecx,word [buffer+8]
+ add eax,ecx
+ mov ebx,60
+ mul ebx
+ movzx ecx,word [buffer+10]
+ add eax,ecx
+ mov ebx,60
+ mul ebx
+ movzx ecx,word [buffer+12]
+ add eax,ecx
+ adc edx,0
+ ret
+
+error_prefix db 'error: ',0
+error_suffix db '.'
+cr_lf db 0Dh,0Ah,0
+line_number_start db ' [',0
+line_data_start db ':',0Dh,0Ah,0
diff --git a/samples/Assembly/X86_64.inc b/samples/Assembly/X86_64.inc
new file mode 100644
index 00000000..28413065
--- /dev/null
+++ b/samples/Assembly/X86_64.inc
@@ -0,0 +1,7060 @@
+
+; flat assembler core
+; Copyright (c) 1999-2014, Tomasz Grysztar.
+; All rights reserved.
+
+simple_instruction_except64:
+ cmp [code_type],64
+ je illegal_instruction
+simple_instruction:
+ stos byte [edi]
+ jmp instruction_assembled
+simple_instruction_only64:
+ cmp [code_type],64
+ jne illegal_instruction
+ jmp simple_instruction
+simple_instruction_16bit_except64:
+ cmp [code_type],64
+ je illegal_instruction
+simple_instruction_16bit:
+ cmp [code_type],16
+ jne size_prefix
+ stos byte [edi]
+ jmp instruction_assembled
+ size_prefix:
+ mov ah,al
+ mov al,66h
+ stos word [edi]
+ jmp instruction_assembled
+simple_instruction_32bit_except64:
+ cmp [code_type],64
+ je illegal_instruction
+simple_instruction_32bit:
+ cmp [code_type],16
+ je size_prefix
+ stos byte [edi]
+ jmp instruction_assembled
+iret_instruction:
+ cmp [code_type],64
+ jne simple_instruction
+simple_instruction_64bit:
+ cmp [code_type],64
+ jne illegal_instruction
+ mov ah,al
+ mov al,48h
+ stos word [edi]
+ jmp instruction_assembled
+simple_extended_instruction_64bit:
+ cmp [code_type],64
+ jne illegal_instruction
+ mov byte [edi],48h
+ inc edi
+simple_extended_instruction:
+ mov ah,al
+ mov al,0Fh
+ stos word [edi]
+ jmp instruction_assembled
+prefix_instruction:
+ stos byte [edi]
+ or [prefixed_instruction],-1
+ jmp continue_line
+segment_prefix:
+ mov ah,al
+ shr ah,4
+ cmp ah,6
+ jne illegal_instruction
+ and al,1111b
+ mov [segment_register],al
+ call store_segment_prefix
+ or [prefixed_instruction],-1
+ jmp continue_line
+int_instruction:
+ lods byte [esi]
+ call get_size_operator
+ cmp ah,1
+ ja invalid_operand_size
+ cmp al,'('
+ jne invalid_operand
+ call get_byte_value
+ test eax,eax
+ jns int_imm_ok
+ call recoverable_overflow
+ int_imm_ok:
+ mov ah,al
+ mov al,0CDh
+ stos word [edi]
+ jmp instruction_assembled
+aa_instruction:
+ cmp [code_type],64
+ je illegal_instruction
+ push eax
+ mov bl,10
+ cmp byte [esi],'('
+ jne aa_store
+ inc esi
+ xor al,al
+ xchg al,[operand_size]
+ cmp al,1
+ ja invalid_operand_size
+ call get_byte_value
+ mov bl,al
+ aa_store:
+ cmp [operand_size],0
+ jne invalid_operand
+ pop eax
+ mov ah,bl
+ stos word [edi]
+ jmp instruction_assembled
+
+basic_instruction:
+ mov [base_code],al
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ je basic_reg
+ cmp al,'['
+ jne invalid_operand
+ basic_mem:
+ call get_address
+ push edx ebx ecx
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ cmp al,'('
+ je basic_mem_imm
+ cmp al,10h
+ jne invalid_operand
+ basic_mem_reg:
+ lods byte [esi]
+ call convert_register
+ mov [postbyte_register],al
+ pop ecx ebx edx
+ mov al,ah
+ cmp al,1
+ je instruction_ready
+ call operand_autodetect
+ inc [base_code]
+ instruction_ready:
+ call store_instruction
+ jmp instruction_assembled
+ basic_mem_imm:
+ mov al,[operand_size]
+ cmp al,1
+ jb basic_mem_imm_nosize
+ je basic_mem_imm_8bit
+ cmp al,2
+ je basic_mem_imm_16bit
+ cmp al,4
+ je basic_mem_imm_32bit
+ cmp al,8
+ jne invalid_operand_size
+ basic_mem_imm_64bit:
+ cmp [size_declared],0
+ jne long_immediate_not_encodable
+ call operand_64bit
+ call get_simm32
+ cmp [value_type],4
+ jae long_immediate_not_encodable
+ jmp basic_mem_imm_32bit_ok
+ basic_mem_imm_nosize:
+ call recoverable_unknown_size
+ basic_mem_imm_8bit:
+ call get_byte_value
+ mov byte [value],al
+ mov al,[base_code]
+ shr al,3
+ mov [postbyte_register],al
+ pop ecx ebx edx
+ mov [base_code],80h
+ call store_instruction_with_imm8
+ jmp instruction_assembled
+ basic_mem_imm_16bit:
+ call operand_16bit
+ call get_word_value
+ mov word [value],ax
+ mov al,[base_code]
+ shr al,3
+ mov [postbyte_register],al
+ pop ecx ebx edx
+ cmp [value_type],0
+ jne basic_mem_imm_16bit_store
+ cmp [size_declared],0
+ jne basic_mem_imm_16bit_store
+ cmp word [value],80h
+ jb basic_mem_simm_8bit
+ cmp word [value],-80h
+ jae basic_mem_simm_8bit
+ basic_mem_imm_16bit_store:
+ mov [base_code],81h
+ call store_instruction_with_imm16
+ jmp instruction_assembled
+ basic_mem_simm_8bit:
+ mov [base_code],83h
+ call store_instruction_with_imm8
+ jmp instruction_assembled
+ basic_mem_imm_32bit:
+ call operand_32bit
+ call get_dword_value
+ basic_mem_imm_32bit_ok:
+ mov dword [value],eax
+ mov al,[base_code]
+ shr al,3
+ mov [postbyte_register],al
+ pop ecx ebx edx
+ cmp [value_type],0
+ jne basic_mem_imm_32bit_store
+ cmp [size_declared],0
+ jne basic_mem_imm_32bit_store
+ cmp dword [value],80h
+ jb basic_mem_simm_8bit
+ cmp dword [value],-80h
+ jae basic_mem_simm_8bit
+ basic_mem_imm_32bit_store:
+ mov [base_code],81h
+ call store_instruction_with_imm32
+ jmp instruction_assembled
+ get_simm32:
+ call get_qword_value
+ mov ecx,edx
+ cdq
+ cmp ecx,edx
+ jne value_out_of_range
+ cmp [value_type],4
+ jne get_simm32_ok
+ mov [value_type],2
+ get_simm32_ok:
+ ret
+ basic_reg:
+ lods byte [esi]
+ call convert_register
+ mov [postbyte_register],al
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ je basic_reg_reg
+ cmp al,'('
+ je basic_reg_imm
+ cmp al,'['
+ jne invalid_operand
+ basic_reg_mem:
+ call get_address
+ mov al,[operand_size]
+ cmp al,1
+ je basic_reg_mem_8bit
+ call operand_autodetect
+ add [base_code],3
+ jmp instruction_ready
+ basic_reg_mem_8bit:
+ add [base_code],2
+ jmp instruction_ready
+ basic_reg_reg:
+ lods byte [esi]
+ call convert_register
+ mov bl,[postbyte_register]
+ mov [postbyte_register],al
+ mov al,ah
+ cmp al,1
+ je nomem_instruction_ready
+ call operand_autodetect
+ inc [base_code]
+ nomem_instruction_ready:
+ call store_nomem_instruction
+ jmp instruction_assembled
+ basic_reg_imm:
+ mov al,[operand_size]
+ cmp al,1
+ je basic_reg_imm_8bit
+ cmp al,2
+ je basic_reg_imm_16bit
+ cmp al,4
+ je basic_reg_imm_32bit
+ cmp al,8
+ jne invalid_operand_size
+ basic_reg_imm_64bit:
+ cmp [size_declared],0
+ jne long_immediate_not_encodable
+ call operand_64bit
+ call get_simm32
+ cmp [value_type],4
+ jae long_immediate_not_encodable
+ jmp basic_reg_imm_32bit_ok
+ basic_reg_imm_8bit:
+ call get_byte_value
+ mov dl,al
+ mov bl,[base_code]
+ shr bl,3
+ xchg bl,[postbyte_register]
+ or bl,bl
+ jz basic_al_imm
+ mov [base_code],80h
+ call store_nomem_instruction
+ mov al,dl
+ stos byte [edi]
+ jmp instruction_assembled
+ basic_al_imm:
+ mov al,[base_code]
+ add al,4
+ stos byte [edi]
+ mov al,dl
+ stos byte [edi]
+ jmp instruction_assembled
+ basic_reg_imm_16bit:
+ call operand_16bit
+ call get_word_value
+ mov dx,ax
+ mov bl,[base_code]
+ shr bl,3
+ xchg bl,[postbyte_register]
+ cmp [value_type],0
+ jne basic_reg_imm_16bit_store
+ cmp [size_declared],0
+ jne basic_reg_imm_16bit_store
+ cmp dx,80h
+ jb basic_reg_simm_8bit
+ cmp dx,-80h
+ jae basic_reg_simm_8bit
+ basic_reg_imm_16bit_store:
+ or bl,bl
+ jz basic_ax_imm
+ mov [base_code],81h
+ call store_nomem_instruction
+ basic_store_imm_16bit:
+ mov ax,dx
+ call mark_relocation
+ stos word [edi]
+ jmp instruction_assembled
+ basic_reg_simm_8bit:
+ mov [base_code],83h
+ call store_nomem_instruction
+ mov al,dl
+ stos byte [edi]
+ jmp instruction_assembled
+ basic_ax_imm:
+ add [base_code],5
+ call store_instruction_code
+ jmp basic_store_imm_16bit
+ basic_reg_imm_32bit:
+ call operand_32bit
+ call get_dword_value
+ basic_reg_imm_32bit_ok:
+ mov edx,eax
+ mov bl,[base_code]
+ shr bl,3
+ xchg bl,[postbyte_register]
+ cmp [value_type],0
+ jne basic_reg_imm_32bit_store
+ cmp [size_declared],0
+ jne basic_reg_imm_32bit_store
+ cmp edx,80h
+ jb basic_reg_simm_8bit
+ cmp edx,-80h
+ jae basic_reg_simm_8bit
+ basic_reg_imm_32bit_store:
+ or bl,bl
+ jz basic_eax_imm
+ mov [base_code],81h
+ call store_nomem_instruction
+ basic_store_imm_32bit:
+ mov eax,edx
+ call mark_relocation
+ stos dword [edi]
+ jmp instruction_assembled
+ basic_eax_imm:
+ add [base_code],5
+ call store_instruction_code
+ jmp basic_store_imm_32bit
+ recoverable_unknown_size:
+ cmp [error_line],0
+ jne ignore_unknown_size
+ push [current_line]
+ pop [error_line]
+ mov [error],operand_size_not_specified
+ ignore_unknown_size:
+ ret
+single_operand_instruction:
+ mov [base_code],0F6h
+ mov [postbyte_register],al
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ je single_reg
+ cmp al,'['
+ jne invalid_operand
+ single_mem:
+ call get_address
+ mov al,[operand_size]
+ cmp al,1
+ je single_mem_8bit
+ jb single_mem_nosize
+ call operand_autodetect
+ inc [base_code]
+ jmp instruction_ready
+ single_mem_nosize:
+ call recoverable_unknown_size
+ single_mem_8bit:
+ jmp instruction_ready
+ single_reg:
+ lods byte [esi]
+ call convert_register
+ mov bl,al
+ mov al,ah
+ cmp al,1
+ je single_reg_8bit
+ call operand_autodetect
+ inc [base_code]
+ single_reg_8bit:
+ jmp nomem_instruction_ready
+mov_instruction:
+ mov [base_code],88h
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ je mov_reg
+ cmp al,'['
+ jne invalid_operand
+ mov_mem:
+ call get_address
+ push edx ebx ecx
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ cmp al,'('
+ je mov_mem_imm
+ cmp al,10h
+ jne invalid_operand
+ mov_mem_reg:
+ lods byte [esi]
+ cmp al,60h
+ jb mov_mem_general_reg
+ cmp al,70h
+ jb mov_mem_sreg
+ mov_mem_general_reg:
+ call convert_register
+ mov [postbyte_register],al
+ pop ecx ebx edx
+ cmp ah,1
+ je mov_mem_reg_8bit
+ mov al,ah
+ call operand_autodetect
+ mov al,[postbyte_register]
+ or al,bl
+ or al,bh
+ jz mov_mem_ax
+ inc [base_code]
+ jmp instruction_ready
+ mov_mem_reg_8bit:
+ or al,bl
+ or al,bh
+ jnz instruction_ready
+ mov_mem_al:
+ test ch,22h
+ jnz mov_mem_address16_al
+ test ch,44h
+ jnz mov_mem_address32_al
+ test ch,88h
+ jnz mov_mem_address64_al
+ or ch,ch
+ jnz invalid_address_size
+ cmp [code_type],64
+ je mov_mem_address64_al
+ cmp [code_type],32
+ je mov_mem_address32_al
+ cmp edx,10000h
+ jb mov_mem_address16_al
+ mov_mem_address32_al:
+ call store_segment_prefix_if_necessary
+ call address_32bit_prefix
+ mov [base_code],0A2h
+ store_mov_address32:
+ call store_instruction_code
+ call store_address_32bit_value
+ jmp instruction_assembled
+ mov_mem_address16_al:
+ call store_segment_prefix_if_necessary
+ call address_16bit_prefix
+ mov [base_code],0A2h
+ store_mov_address16:
+ cmp [code_type],64
+ je invalid_address
+ call store_instruction_code
+ mov eax,edx
+ stos word [edi]
+ cmp edx,10000h
+ jge value_out_of_range
+ jmp instruction_assembled
+ mov_mem_address64_al:
+ call store_segment_prefix_if_necessary
+ mov [base_code],0A2h
+ store_mov_address64:
+ call store_instruction_code
+ call store_address_64bit_value
+ jmp instruction_assembled
+ mov_mem_ax:
+ test ch,22h
+ jnz mov_mem_address16_ax
+ test ch,44h
+ jnz mov_mem_address32_ax
+ test ch,88h
+ jnz mov_mem_address64_ax
+ or ch,ch
+ jnz invalid_address_size
+ cmp [code_type],64
+ je mov_mem_address64_ax
+ cmp [code_type],32
+ je mov_mem_address32_ax
+ cmp edx,10000h
+ jb mov_mem_address16_ax
+ mov_mem_address32_ax:
+ call store_segment_prefix_if_necessary
+ call address_32bit_prefix
+ mov [base_code],0A3h
+ jmp store_mov_address32
+ mov_mem_address16_ax:
+ call store_segment_prefix_if_necessary
+ call address_16bit_prefix
+ mov [base_code],0A3h
+ jmp store_mov_address16
+ mov_mem_address64_ax:
+ call store_segment_prefix_if_necessary
+ mov [base_code],0A3h
+ jmp store_mov_address64
+ mov_mem_sreg:
+ sub al,61h
+ mov [postbyte_register],al
+ pop ecx ebx edx
+ mov ah,[operand_size]
+ or ah,ah
+ jz mov_mem_sreg_store
+ cmp ah,2
+ jne invalid_operand_size
+ mov_mem_sreg_store:
+ mov [base_code],8Ch
+ jmp instruction_ready
+ mov_mem_imm:
+ mov al,[operand_size]
+ cmp al,1
+ jb mov_mem_imm_nosize
+ je mov_mem_imm_8bit
+ cmp al,2
+ je mov_mem_imm_16bit
+ cmp al,4
+ je mov_mem_imm_32bit
+ cmp al,8
+ jne invalid_operand_size
+ mov_mem_imm_64bit:
+ cmp [size_declared],0
+ jne long_immediate_not_encodable
+ call operand_64bit
+ call get_simm32
+ cmp [value_type],4
+ jae long_immediate_not_encodable
+ jmp mov_mem_imm_32bit_store
+ mov_mem_imm_8bit:
+ call get_byte_value
+ mov byte [value],al
+ mov [postbyte_register],0
+ mov [base_code],0C6h
+ pop ecx ebx edx
+ call store_instruction_with_imm8
+ jmp instruction_assembled
+ mov_mem_imm_16bit:
+ call operand_16bit
+ call get_word_value
+ mov word [value],ax
+ mov [postbyte_register],0
+ mov [base_code],0C7h
+ pop ecx ebx edx
+ call store_instruction_with_imm16
+ jmp instruction_assembled
+ mov_mem_imm_nosize:
+ call recoverable_unknown_size
+ mov_mem_imm_32bit:
+ call operand_32bit
+ call get_dword_value
+ mov_mem_imm_32bit_store:
+ mov dword [value],eax
+ mov [postbyte_register],0
+ mov [base_code],0C7h
+ pop ecx ebx edx
+ call store_instruction_with_imm32
+ jmp instruction_assembled
+ mov_reg:
+ lods byte [esi]
+ mov ah,al
+ sub ah,10h
+ and ah,al
+ test ah,0F0h
+ jnz mov_sreg
+ call convert_register
+ mov [postbyte_register],al
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ cmp al,'['
+ je mov_reg_mem
+ cmp al,'('
+ je mov_reg_imm
+ cmp al,10h
+ jne invalid_operand
+ mov_reg_reg:
+ lods byte [esi]
+ mov ah,al
+ sub ah,10h
+ and ah,al
+ test ah,0F0h
+ jnz mov_reg_sreg
+ call convert_register
+ mov bl,[postbyte_register]
+ mov [postbyte_register],al
+ mov al,ah
+ cmp al,1
+ je mov_reg_reg_8bit
+ call operand_autodetect
+ inc [base_code]
+ mov_reg_reg_8bit:
+ jmp nomem_instruction_ready
+ mov_reg_sreg:
+ mov bl,[postbyte_register]
+ mov ah,al
+ and al,1111b
+ mov [postbyte_register],al
+ shr ah,4
+ cmp ah,5
+ je mov_reg_creg
+ cmp ah,7
+ je mov_reg_dreg
+ ja mov_reg_treg
+ dec [postbyte_register]
+ cmp [operand_size],8
+ je mov_reg_sreg64
+ cmp [operand_size],4
+ je mov_reg_sreg32
+ cmp [operand_size],2
+ jne invalid_operand_size
+ call operand_16bit
+ jmp mov_reg_sreg_store
+ mov_reg_sreg64:
+ call operand_64bit
+ jmp mov_reg_sreg_store
+ mov_reg_sreg32:
+ call operand_32bit
+ mov_reg_sreg_store:
+ mov [base_code],8Ch
+ jmp nomem_instruction_ready
+ mov_reg_treg:
+ cmp ah,9
+ jne invalid_operand
+ mov [extended_code],24h
+ jmp mov_reg_xrx
+ mov_reg_dreg:
+ mov [extended_code],21h
+ jmp mov_reg_xrx
+ mov_reg_creg:
+ mov [extended_code],20h
+ mov_reg_xrx:
+ mov [base_code],0Fh
+ cmp [code_type],64
+ je mov_reg_xrx_64bit
+ cmp [operand_size],4
+ jne invalid_operand_size
+ cmp [postbyte_register],8
+ jne mov_reg_xrx_store
+ cmp [extended_code],20h
+ jne mov_reg_xrx_store
+ mov al,0F0h
+ stos byte [edi]
+ mov [postbyte_register],0
+ mov_reg_xrx_store:
+ jmp nomem_instruction_ready
+ mov_reg_xrx_64bit:
+ cmp [operand_size],8
+ jne invalid_operand_size
+ jmp nomem_instruction_ready
+ mov_reg_mem:
+ call get_address
+ mov al,[operand_size]
+ cmp al,1
+ je mov_reg_mem_8bit
+ call operand_autodetect
+ mov al,[postbyte_register]
+ or al,bl
+ or al,bh
+ jz mov_ax_mem
+ add [base_code],3
+ jmp instruction_ready
+ mov_reg_mem_8bit:
+ mov al,[postbyte_register]
+ or al,bl
+ or al,bh
+ jz mov_al_mem
+ add [base_code],2
+ jmp instruction_ready
+ mov_al_mem:
+ test ch,22h
+ jnz mov_al_mem_address16
+ test ch,44h
+ jnz mov_al_mem_address32
+ test ch,88h
+ jnz mov_al_mem_address64
+ or ch,ch
+ jnz invalid_address_size
+ cmp [code_type],64
+ je mov_al_mem_address64
+ cmp [code_type],32
+ je mov_al_mem_address32
+ cmp edx,10000h
+ jb mov_al_mem_address16
+ mov_al_mem_address32:
+ call store_segment_prefix_if_necessary
+ call address_32bit_prefix
+ mov [base_code],0A0h
+ jmp store_mov_address32
+ mov_al_mem_address16:
+ call store_segment_prefix_if_necessary
+ call address_16bit_prefix
+ mov [base_code],0A0h
+ jmp store_mov_address16
+ mov_al_mem_address64:
+ call store_segment_prefix_if_necessary
+ mov [base_code],0A0h
+ jmp store_mov_address64
+ mov_ax_mem:
+ test ch,22h
+ jnz mov_ax_mem_address16
+ test ch,44h
+ jnz mov_ax_mem_address32
+ test ch,88h
+ jnz mov_ax_mem_address64
+ or ch,ch
+ jnz invalid_address_size
+ cmp [code_type],64
+ je mov_ax_mem_address64
+ cmp [code_type],32
+ je mov_ax_mem_address32
+ cmp edx,10000h
+ jb mov_ax_mem_address16
+ mov_ax_mem_address32:
+ call store_segment_prefix_if_necessary
+ call address_32bit_prefix
+ mov [base_code],0A1h
+ jmp store_mov_address32
+ mov_ax_mem_address16:
+ call store_segment_prefix_if_necessary
+ call address_16bit_prefix
+ mov [base_code],0A1h
+ jmp store_mov_address16
+ mov_ax_mem_address64:
+ call store_segment_prefix_if_necessary
+ mov [base_code],0A1h
+ jmp store_mov_address64
+ mov_reg_imm:
+ mov al,[operand_size]
+ cmp al,1
+ je mov_reg_imm_8bit
+ cmp al,2
+ je mov_reg_imm_16bit
+ cmp al,4
+ je mov_reg_imm_32bit
+ cmp al,8
+ jne invalid_operand_size
+ mov_reg_imm_64bit:
+ call operand_64bit
+ call get_qword_value
+ mov ecx,edx
+ cmp [size_declared],0
+ jne mov_reg_imm_64bit_store
+ cmp [value_type],4
+ jae mov_reg_imm_64bit_store
+ cdq
+ cmp ecx,edx
+ je mov_reg_64bit_imm_32bit
+ mov_reg_imm_64bit_store:
+ push eax ecx
+ mov al,0B8h
+ call store_mov_reg_imm_code
+ pop edx eax
+ call mark_relocation
+ stos dword [edi]
+ mov eax,edx
+ stos dword [edi]
+ jmp instruction_assembled
+ mov_reg_imm_8bit:
+ call get_byte_value
+ mov dl,al
+ mov al,0B0h
+ call store_mov_reg_imm_code
+ mov al,dl
+ stos byte [edi]
+ jmp instruction_assembled
+ mov_reg_imm_16bit:
+ call get_word_value
+ mov dx,ax
+ call operand_16bit
+ mov al,0B8h
+ call store_mov_reg_imm_code
+ mov ax,dx
+ call mark_relocation
+ stos word [edi]
+ jmp instruction_assembled
+ mov_reg_imm_32bit:
+ call operand_32bit
+ call get_dword_value
+ mov edx,eax
+ mov al,0B8h
+ call store_mov_reg_imm_code
+ mov_store_imm_32bit:
+ mov eax,edx
+ call mark_relocation
+ stos dword [edi]
+ jmp instruction_assembled
+ store_mov_reg_imm_code:
+ mov ah,[postbyte_register]
+ test ah,1000b
+ jz mov_reg_imm_prefix_ok
+ or [rex_prefix],41h
+ mov_reg_imm_prefix_ok:
+ and ah,111b
+ add al,ah
+ mov [base_code],al
+ call store_instruction_code
+ ret
+ mov_reg_64bit_imm_32bit:
+ mov edx,eax
+ mov bl,[postbyte_register]
+ mov [postbyte_register],0
+ mov [base_code],0C7h
+ call store_nomem_instruction
+ jmp mov_store_imm_32bit
+ mov_sreg:
+ mov ah,al
+ and al,1111b
+ mov [postbyte_register],al
+ shr ah,4
+ cmp ah,5
+ je mov_creg
+ cmp ah,7
+ je mov_dreg
+ ja mov_treg
+ cmp al,2
+ je illegal_instruction
+ dec [postbyte_register]
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ cmp al,'['
+ je mov_sreg_mem
+ cmp al,10h
+ jne invalid_operand
+ mov_sreg_reg:
+ lods byte [esi]
+ call convert_register
+ or ah,ah
+ jz mov_sreg_reg_size_ok
+ cmp ah,2
+ jne invalid_operand_size
+ mov bl,al
+ mov_sreg_reg_size_ok:
+ mov [base_code],8Eh
+ jmp nomem_instruction_ready
+ mov_sreg_mem:
+ call get_address
+ mov al,[operand_size]
+ or al,al
+ jz mov_sreg_mem_size_ok
+ cmp al,2
+ jne invalid_operand_size
+ mov_sreg_mem_size_ok:
+ mov [base_code],8Eh
+ jmp instruction_ready
+ mov_treg:
+ cmp ah,9
+ jne invalid_operand
+ mov [extended_code],26h
+ jmp mov_xrx
+ mov_dreg:
+ mov [extended_code],23h
+ jmp mov_xrx
+ mov_creg:
+ mov [extended_code],22h
+ mov_xrx:
+ mov [base_code],0Fh
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_register
+ mov bl,al
+ cmp [code_type],64
+ je mov_xrx_64bit
+ cmp ah,4
+ jne invalid_operand_size
+ cmp [postbyte_register],8
+ jne mov_xrx_store
+ cmp [extended_code],22h
+ jne mov_xrx_store
+ mov al,0F0h
+ stos byte [edi]
+ mov [postbyte_register],0
+ mov_xrx_store:
+ jmp nomem_instruction_ready
+ mov_xrx_64bit:
+ cmp ah,8
+ je mov_xrx_store
+ jmp invalid_operand_size
+test_instruction:
+ mov [base_code],84h
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ je test_reg
+ cmp al,'['
+ jne invalid_operand
+ test_mem:
+ call get_address
+ push edx ebx ecx
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ cmp al,'('
+ je test_mem_imm
+ cmp al,10h
+ jne invalid_operand
+ test_mem_reg:
+ lods byte [esi]
+ call convert_register
+ mov [postbyte_register],al
+ pop ecx ebx edx
+ mov al,ah
+ cmp al,1
+ je test_mem_reg_8bit
+ call operand_autodetect
+ inc [base_code]
+ test_mem_reg_8bit:
+ jmp instruction_ready
+ test_mem_imm:
+ mov al,[operand_size]
+ cmp al,1
+ jb test_mem_imm_nosize
+ je test_mem_imm_8bit
+ cmp al,2
+ je test_mem_imm_16bit
+ cmp al,4
+ je test_mem_imm_32bit
+ cmp al,8
+ jne invalid_operand_size
+ test_mem_imm_64bit:
+ cmp [size_declared],0
+ jne long_immediate_not_encodable
+ call operand_64bit
+ call get_simm32
+ cmp [value_type],4
+ jae long_immediate_not_encodable
+ jmp test_mem_imm_32bit_store
+ test_mem_imm_8bit:
+ call get_byte_value
+ mov byte [value],al
+ mov [postbyte_register],0
+ mov [base_code],0F6h
+ pop ecx ebx edx
+ call store_instruction_with_imm8
+ jmp instruction_assembled
+ test_mem_imm_16bit:
+ call operand_16bit
+ call get_word_value
+ mov word [value],ax
+ mov [postbyte_register],0
+ mov [base_code],0F7h
+ pop ecx ebx edx
+ call store_instruction_with_imm16
+ jmp instruction_assembled
+ test_mem_imm_nosize:
+ call recoverable_unknown_size
+ test_mem_imm_32bit:
+ call operand_32bit
+ call get_dword_value
+ test_mem_imm_32bit_store:
+ mov dword [value],eax
+ mov [postbyte_register],0
+ mov [base_code],0F7h
+ pop ecx ebx edx
+ call store_instruction_with_imm32
+ jmp instruction_assembled
+ test_reg:
+ lods byte [esi]
+ call convert_register
+ mov [postbyte_register],al
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ cmp al,'['
+ je test_reg_mem
+ cmp al,'('
+ je test_reg_imm
+ cmp al,10h
+ jne invalid_operand
+ test_reg_reg:
+ lods byte [esi]
+ call convert_register
+ mov bl,[postbyte_register]
+ mov [postbyte_register],al
+ mov al,ah
+ cmp al,1
+ je test_reg_reg_8bit
+ call operand_autodetect
+ inc [base_code]
+ test_reg_reg_8bit:
+ jmp nomem_instruction_ready
+ test_reg_imm:
+ mov al,[operand_size]
+ cmp al,1
+ je test_reg_imm_8bit
+ cmp al,2
+ je test_reg_imm_16bit
+ cmp al,4
+ je test_reg_imm_32bit
+ cmp al,8
+ jne invalid_operand_size
+ test_reg_imm_64bit:
+ cmp [size_declared],0
+ jne long_immediate_not_encodable
+ call operand_64bit
+ call get_simm32
+ cmp [value_type],4
+ jae long_immediate_not_encodable
+ jmp test_reg_imm_32bit_store
+ test_reg_imm_8bit:
+ call get_byte_value
+ mov dl,al
+ mov bl,[postbyte_register]
+ mov [postbyte_register],0
+ mov [base_code],0F6h
+ or bl,bl
+ jz test_al_imm
+ call store_nomem_instruction
+ mov al,dl
+ stos byte [edi]
+ jmp instruction_assembled
+ test_al_imm:
+ mov [base_code],0A8h
+ call store_instruction_code
+ mov al,dl
+ stos byte [edi]
+ jmp instruction_assembled
+ test_reg_imm_16bit:
+ call operand_16bit
+ call get_word_value
+ mov dx,ax
+ mov bl,[postbyte_register]
+ mov [postbyte_register],0
+ mov [base_code],0F7h
+ or bl,bl
+ jz test_ax_imm
+ call store_nomem_instruction
+ mov ax,dx
+ call mark_relocation
+ stos word [edi]
+ jmp instruction_assembled
+ test_ax_imm:
+ mov [base_code],0A9h
+ call store_instruction_code
+ mov ax,dx
+ stos word [edi]
+ jmp instruction_assembled
+ test_reg_imm_32bit:
+ call operand_32bit
+ call get_dword_value
+ test_reg_imm_32bit_store:
+ mov edx,eax
+ mov bl,[postbyte_register]
+ mov [postbyte_register],0
+ mov [base_code],0F7h
+ or bl,bl
+ jz test_eax_imm
+ call store_nomem_instruction
+ mov eax,edx
+ call mark_relocation
+ stos dword [edi]
+ jmp instruction_assembled
+ test_eax_imm:
+ mov [base_code],0A9h
+ call store_instruction_code
+ mov eax,edx
+ stos dword [edi]
+ jmp instruction_assembled
+ test_reg_mem:
+ call get_address
+ mov al,[operand_size]
+ cmp al,1
+ je test_reg_mem_8bit
+ call operand_autodetect
+ inc [base_code]
+ test_reg_mem_8bit:
+ jmp instruction_ready
+xchg_instruction:
+ mov [base_code],86h
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ je xchg_reg
+ cmp al,'['
+ jne invalid_operand
+ xchg_mem:
+ call get_address
+ push edx ebx ecx
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ je test_mem_reg
+ jmp invalid_operand
+ xchg_reg:
+ lods byte [esi]
+ call convert_register
+ mov [postbyte_register],al
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ cmp al,'['
+ je test_reg_mem
+ cmp al,10h
+ jne invalid_operand
+ xchg_reg_reg:
+ lods byte [esi]
+ call convert_register
+ mov bl,al
+ mov al,ah
+ cmp al,1
+ je xchg_reg_reg_8bit
+ call operand_autodetect
+ cmp [postbyte_register],0
+ je xchg_ax_reg
+ or bl,bl
+ jnz xchg_reg_reg_store
+ mov bl,[postbyte_register]
+ xchg_ax_reg:
+ cmp [code_type],64
+ jne xchg_ax_reg_ok
+ cmp ah,4
+ jne xchg_ax_reg_ok
+ or bl,bl
+ jz xchg_reg_reg_store
+ xchg_ax_reg_ok:
+ test bl,1000b
+ jz xchg_ax_reg_store
+ or [rex_prefix],41h
+ and bl,111b
+ xchg_ax_reg_store:
+ add bl,90h
+ mov [base_code],bl
+ call store_instruction_code
+ jmp instruction_assembled
+ xchg_reg_reg_store:
+ inc [base_code]
+ xchg_reg_reg_8bit:
+ jmp nomem_instruction_ready
+push_instruction:
+ mov [push_size],al
+ push_next:
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ je push_reg
+ cmp al,'('
+ je push_imm
+ cmp al,'['
+ jne invalid_operand
+ push_mem:
+ call get_address
+ mov al,[operand_size]
+ mov ah,[push_size]
+ cmp al,2
+ je push_mem_16bit
+ cmp al,4
+ je push_mem_32bit
+ cmp al,8
+ je push_mem_64bit
+ or al,al
+ jnz invalid_operand_size
+ cmp ah,2
+ je push_mem_16bit
+ cmp ah,4
+ je push_mem_32bit
+ cmp ah,8
+ je push_mem_64bit
+ call recoverable_unknown_size
+ jmp push_mem_store
+ push_mem_16bit:
+ test ah,not 2
+ jnz invalid_operand_size
+ call operand_16bit
+ jmp push_mem_store
+ push_mem_32bit:
+ test ah,not 4
+ jnz invalid_operand_size
+ cmp [code_type],64
+ je illegal_instruction
+ call operand_32bit
+ jmp push_mem_store
+ push_mem_64bit:
+ test ah,not 8
+ jnz invalid_operand_size
+ cmp [code_type],64
+ jne illegal_instruction
+ push_mem_store:
+ mov [base_code],0FFh
+ mov [postbyte_register],110b
+ call store_instruction
+ jmp push_done
+ push_reg:
+ lods byte [esi]
+ mov ah,al
+ sub ah,10h
+ and ah,al
+ test ah,0F0h
+ jnz push_sreg
+ call convert_register
+ test al,1000b
+ jz push_reg_ok
+ or [rex_prefix],41h
+ and al,111b
+ push_reg_ok:
+ add al,50h
+ mov [base_code],al
+ mov al,ah
+ mov ah,[push_size]
+ cmp al,2
+ je push_reg_16bit
+ cmp al,4
+ je push_reg_32bit
+ cmp al,8
+ jne invalid_operand_size
+ push_reg_64bit:
+ test ah,not 8
+ jnz invalid_operand_size
+ cmp [code_type],64
+ jne illegal_instruction
+ jmp push_reg_store
+ push_reg_32bit:
+ test ah,not 4
+ jnz invalid_operand_size
+ cmp [code_type],64
+ je illegal_instruction
+ call operand_32bit
+ jmp push_reg_store
+ push_reg_16bit:
+ test ah,not 2
+ jnz invalid_operand_size
+ call operand_16bit
+ push_reg_store:
+ call store_instruction_code
+ jmp push_done
+ push_sreg:
+ mov bl,al
+ mov dl,[operand_size]
+ mov dh,[push_size]
+ cmp dl,2
+ je push_sreg16
+ cmp dl,4
+ je push_sreg32
+ cmp dl,8
+ je push_sreg64
+ or dl,dl
+ jnz invalid_operand_size
+ cmp dh,2
+ je push_sreg16
+ cmp dh,4
+ je push_sreg32
+ cmp dh,8
+ je push_sreg64
+ jmp push_sreg_store
+ push_sreg16:
+ test dh,not 2
+ jnz invalid_operand_size
+ call operand_16bit
+ jmp push_sreg_store
+ push_sreg32:
+ test dh,not 4
+ jnz invalid_operand_size
+ cmp [code_type],64
+ je illegal_instruction
+ call operand_32bit
+ jmp push_sreg_store
+ push_sreg64:
+ test dh,not 8
+ jnz invalid_operand_size
+ cmp [code_type],64
+ jne illegal_instruction
+ push_sreg_store:
+ mov al,bl
+ cmp al,70h
+ jae invalid_operand
+ sub al,61h
+ jc invalid_operand
+ cmp al,4
+ jae push_sreg_386
+ shl al,3
+ add al,6
+ mov [base_code],al
+ cmp [code_type],64
+ je illegal_instruction
+ jmp push_reg_store
+ push_sreg_386:
+ sub al,4
+ shl al,3
+ add al,0A0h
+ mov [extended_code],al
+ mov [base_code],0Fh
+ jmp push_reg_store
+ push_imm:
+ mov al,[operand_size]
+ mov ah,[push_size]
+ or al,al
+ je push_imm_size_ok
+ or ah,ah
+ je push_imm_size_ok
+ cmp al,ah
+ jne invalid_operand_size
+ push_imm_size_ok:
+ cmp al,2
+ je push_imm_16bit
+ cmp al,4
+ je push_imm_32bit
+ cmp al,8
+ je push_imm_64bit
+ cmp ah,2
+ je push_imm_optimized_16bit
+ cmp ah,4
+ je push_imm_optimized_32bit
+ cmp ah,8
+ je push_imm_optimized_64bit
+ or al,al
+ jnz invalid_operand_size
+ cmp [code_type],16
+ je push_imm_optimized_16bit
+ cmp [code_type],32
+ je push_imm_optimized_32bit
+ push_imm_optimized_64bit:
+ cmp [code_type],64
+ jne illegal_instruction
+ call get_simm32
+ mov edx,eax
+ cmp [value_type],0
+ jne push_imm_32bit_store
+ cmp eax,-80h
+ jl push_imm_32bit_store
+ cmp eax,80h
+ jge push_imm_32bit_store
+ jmp push_imm_8bit
+ push_imm_optimized_32bit:
+ cmp [code_type],64
+ je illegal_instruction
+ call get_dword_value
+ mov edx,eax
+ call operand_32bit
+ cmp [value_type],0
+ jne push_imm_32bit_store
+ cmp eax,-80h
+ jl push_imm_32bit_store
+ cmp eax,80h
+ jge push_imm_32bit_store
+ jmp push_imm_8bit
+ push_imm_optimized_16bit:
+ call get_word_value
+ mov dx,ax
+ call operand_16bit
+ cmp [value_type],0
+ jne push_imm_16bit_store
+ cmp ax,-80h
+ jl push_imm_16bit_store
+ cmp ax,80h
+ jge push_imm_16bit_store
+ push_imm_8bit:
+ mov ah,al
+ mov [base_code],6Ah
+ call store_instruction_code
+ mov al,ah
+ stos byte [edi]
+ jmp push_done
+ push_imm_16bit:
+ call get_word_value
+ mov dx,ax
+ call operand_16bit
+ push_imm_16bit_store:
+ mov [base_code],68h
+ call store_instruction_code
+ mov ax,dx
+ call mark_relocation
+ stos word [edi]
+ jmp push_done
+ push_imm_64bit:
+ cmp [code_type],64
+ jne illegal_instruction
+ call get_simm32
+ mov edx,eax
+ jmp push_imm_32bit_store
+ push_imm_32bit:
+ cmp [code_type],64
+ je illegal_instruction
+ call get_dword_value
+ mov edx,eax
+ call operand_32bit
+ push_imm_32bit_store:
+ mov [base_code],68h
+ call store_instruction_code
+ mov eax,edx
+ call mark_relocation
+ stos dword [edi]
+ push_done:
+ lods byte [esi]
+ dec esi
+ cmp al,0Fh
+ je instruction_assembled
+ or al,al
+ jz instruction_assembled
+ mov [operand_size],0
+ mov [size_override],0
+ mov [operand_prefix],0
+ mov [rex_prefix],0
+ jmp push_next
+pop_instruction:
+ mov [push_size],al
+ pop_next:
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ je pop_reg
+ cmp al,'['
+ jne invalid_operand
+ pop_mem:
+ call get_address
+ mov al,[operand_size]
+ mov ah,[push_size]
+ cmp al,2
+ je pop_mem_16bit
+ cmp al,4
+ je pop_mem_32bit
+ cmp al,8
+ je pop_mem_64bit
+ or al,al
+ jnz invalid_operand_size
+ cmp ah,2
+ je pop_mem_16bit
+ cmp ah,4
+ je pop_mem_32bit
+ cmp ah,8
+ je pop_mem_64bit
+ call recoverable_unknown_size
+ jmp pop_mem_store
+ pop_mem_16bit:
+ test ah,not 2
+ jnz invalid_operand_size
+ call operand_16bit
+ jmp pop_mem_store
+ pop_mem_32bit:
+ test ah,not 4
+ jnz invalid_operand_size
+ cmp [code_type],64
+ je illegal_instruction
+ call operand_32bit
+ jmp pop_mem_store
+ pop_mem_64bit:
+ test ah,not 8
+ jnz invalid_operand_size
+ cmp [code_type],64
+ jne illegal_instruction
+ pop_mem_store:
+ mov [base_code],08Fh
+ mov [postbyte_register],0
+ call store_instruction
+ jmp pop_done
+ pop_reg:
+ lods byte [esi]
+ mov ah,al
+ sub ah,10h
+ and ah,al
+ test ah,0F0h
+ jnz pop_sreg
+ call convert_register
+ test al,1000b
+ jz pop_reg_ok
+ or [rex_prefix],41h
+ and al,111b
+ pop_reg_ok:
+ add al,58h
+ mov [base_code],al
+ mov al,ah
+ mov ah,[push_size]
+ cmp al,2
+ je pop_reg_16bit
+ cmp al,4
+ je pop_reg_32bit
+ cmp al,8
+ je pop_reg_64bit
+ jmp invalid_operand_size
+ pop_reg_64bit:
+ test ah,not 8
+ jnz invalid_operand_size
+ cmp [code_type],64
+ jne illegal_instruction
+ jmp pop_reg_store
+ pop_reg_32bit:
+ test ah,not 4
+ jnz invalid_operand_size
+ cmp [code_type],64
+ je illegal_instruction
+ call operand_32bit
+ jmp pop_reg_store
+ pop_reg_16bit:
+ test ah,not 2
+ jnz invalid_operand_size
+ call operand_16bit
+ pop_reg_store:
+ call store_instruction_code
+ pop_done:
+ lods byte [esi]
+ dec esi
+ cmp al,0Fh
+ je instruction_assembled
+ or al,al
+ jz instruction_assembled
+ mov [operand_size],0
+ mov [size_override],0
+ mov [operand_prefix],0
+ mov [rex_prefix],0
+ jmp pop_next
+ pop_sreg:
+ mov dl,[operand_size]
+ mov dh,[push_size]
+ cmp al,62h
+ je pop_cs
+ mov bl,al
+ cmp dl,2
+ je pop_sreg16
+ cmp dl,4
+ je pop_sreg32
+ cmp dl,8
+ je pop_sreg64
+ or dl,dl
+ jnz invalid_operand_size
+ cmp dh,2
+ je pop_sreg16
+ cmp dh,4
+ je pop_sreg32
+ cmp dh,8
+ je pop_sreg64
+ jmp pop_sreg_store
+ pop_sreg16:
+ test dh,not 2
+ jnz invalid_operand_size
+ call operand_16bit
+ jmp pop_sreg_store
+ pop_sreg32:
+ test dh,not 4
+ jnz invalid_operand_size
+ cmp [code_type],64
+ je illegal_instruction
+ call operand_32bit
+ jmp pop_sreg_store
+ pop_sreg64:
+ test dh,not 8
+ jnz invalid_operand_size
+ cmp [code_type],64
+ jne illegal_instruction
+ pop_sreg_store:
+ mov al,bl
+ cmp al,70h
+ jae invalid_operand
+ sub al,61h
+ jc invalid_operand
+ cmp al,4
+ jae pop_sreg_386
+ shl al,3
+ add al,7
+ mov [base_code],al
+ cmp [code_type],64
+ je illegal_instruction
+ jmp pop_reg_store
+ pop_cs:
+ cmp [code_type],16
+ jne illegal_instruction
+ cmp dl,2
+ je pop_cs_store
+ or dl,dl
+ jnz invalid_operand_size
+ cmp dh,2
+ je pop_cs_store
+ or dh,dh
+ jnz illegal_instruction
+ pop_cs_store:
+ test dh,not 2
+ jnz invalid_operand_size
+ mov al,0Fh
+ stos byte [edi]
+ jmp pop_done
+ pop_sreg_386:
+ sub al,4
+ shl al,3
+ add al,0A1h
+ mov [extended_code],al
+ mov [base_code],0Fh
+ jmp pop_reg_store
+inc_instruction:
+ mov [base_code],al
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ je inc_reg
+ cmp al,'['
+ je inc_mem
+ jne invalid_operand
+ inc_mem:
+ call get_address
+ mov al,[operand_size]
+ cmp al,1
+ je inc_mem_8bit
+ jb inc_mem_nosize
+ call operand_autodetect
+ mov al,0FFh
+ xchg al,[base_code]
+ mov [postbyte_register],al
+ jmp instruction_ready
+ inc_mem_nosize:
+ call recoverable_unknown_size
+ inc_mem_8bit:
+ mov al,0FEh
+ xchg al,[base_code]
+ mov [postbyte_register],al
+ jmp instruction_ready
+ inc_reg:
+ lods byte [esi]
+ call convert_register
+ mov bl,al
+ mov al,0FEh
+ xchg al,[base_code]
+ mov [postbyte_register],al
+ mov al,ah
+ cmp al,1
+ je inc_reg_8bit
+ call operand_autodetect
+ cmp [code_type],64
+ je inc_reg_long_form
+ mov al,[postbyte_register]
+ shl al,3
+ add al,bl
+ add al,40h
+ mov [base_code],al
+ call store_instruction_code
+ jmp instruction_assembled
+ inc_reg_long_form:
+ inc [base_code]
+ inc_reg_8bit:
+ jmp nomem_instruction_ready
+set_instruction:
+ mov [base_code],0Fh
+ mov [extended_code],al
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ je set_reg
+ cmp al,'['
+ jne invalid_operand
+ set_mem:
+ call get_address
+ cmp [operand_size],1
+ ja invalid_operand_size
+ mov [postbyte_register],0
+ jmp instruction_ready
+ set_reg:
+ lods byte [esi]
+ call convert_register
+ cmp ah,1
+ jne invalid_operand_size
+ mov bl,al
+ mov [postbyte_register],0
+ jmp nomem_instruction_ready
+arpl_instruction:
+ cmp [code_type],64
+ je illegal_instruction
+ mov [base_code],63h
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ je arpl_reg
+ cmp al,'['
+ jne invalid_operand
+ call get_address
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_register
+ mov [postbyte_register],al
+ cmp ah,2
+ jne invalid_operand_size
+ jmp instruction_ready
+ arpl_reg:
+ lods byte [esi]
+ call convert_register
+ cmp ah,2
+ jne invalid_operand_size
+ mov bl,al
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_register
+ mov [postbyte_register],al
+ jmp nomem_instruction_ready
+bound_instruction:
+ cmp [code_type],64
+ je illegal_instruction
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_register
+ mov [postbyte_register],al
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ cmp al,'['
+ jne invalid_operand
+ call get_address
+ mov al,[operand_size]
+ cmp al,2
+ je bound_store
+ cmp al,4
+ jne invalid_operand_size
+ bound_store:
+ call operand_autodetect
+ mov [base_code],62h
+ jmp instruction_ready
+enter_instruction:
+ lods byte [esi]
+ call get_size_operator
+ cmp ah,2
+ je enter_imm16_size_ok
+ or ah,ah
+ jnz invalid_operand_size
+ enter_imm16_size_ok:
+ cmp al,'('
+ jne invalid_operand
+ call get_word_value
+ cmp [next_pass_needed],0
+ jne enter_imm16_ok
+ cmp [value_type],0
+ jne invalid_use_of_symbol
+ test eax,eax
+ js value_out_of_range
+ enter_imm16_ok:
+ push eax
+ mov [operand_size],0
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ cmp ah,1
+ je enter_imm8_size_ok
+ or ah,ah
+ jnz invalid_operand_size
+ enter_imm8_size_ok:
+ cmp al,'('
+ jne invalid_operand
+ call get_byte_value
+ cmp [next_pass_needed],0
+ jne enter_imm8_ok
+ test eax,eax
+ js value_out_of_range
+ enter_imm8_ok:
+ mov dl,al
+ pop ebx
+ mov al,0C8h
+ stos byte [edi]
+ mov ax,bx
+ stos word [edi]
+ mov al,dl
+ stos byte [edi]
+ jmp instruction_assembled
+ret_instruction_only64:
+ cmp [code_type],64
+ jne illegal_instruction
+ jmp ret_instruction
+ret_instruction_32bit_except64:
+ cmp [code_type],64
+ je illegal_instruction
+ret_instruction_32bit:
+ call operand_32bit
+ jmp ret_instruction
+ret_instruction_16bit:
+ call operand_16bit
+ jmp ret_instruction
+retf_instruction:
+ cmp [code_type],64
+ jne ret_instruction
+ret_instruction_64bit:
+ call operand_64bit
+ret_instruction:
+ mov [base_code],al
+ lods byte [esi]
+ dec esi
+ or al,al
+ jz simple_ret
+ cmp al,0Fh
+ je simple_ret
+ lods byte [esi]
+ call get_size_operator
+ or ah,ah
+ jz ret_imm
+ cmp ah,2
+ je ret_imm
+ jmp invalid_operand_size
+ ret_imm:
+ cmp al,'('
+ jne invalid_operand
+ call get_word_value
+ cmp [next_pass_needed],0
+ jne ret_imm_ok
+ cmp [value_type],0
+ jne invalid_use_of_symbol
+ test eax,eax
+ js value_out_of_range
+ ret_imm_ok:
+ cmp [size_declared],0
+ jne ret_imm_store
+ or ax,ax
+ jz simple_ret
+ ret_imm_store:
+ mov dx,ax
+ call store_instruction_code
+ mov ax,dx
+ stos word [edi]
+ jmp instruction_assembled
+ simple_ret:
+ inc [base_code]
+ call store_instruction_code
+ jmp instruction_assembled
+lea_instruction:
+ mov [base_code],8Dh
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_register
+ mov [postbyte_register],al
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ xor al,al
+ xchg al,[operand_size]
+ push eax
+ lods byte [esi]
+ call get_size_operator
+ cmp al,'['
+ jne invalid_operand
+ mov [size_override],-1
+ call get_address
+ pop eax
+ mov [operand_size],al
+ call operand_autodetect
+ jmp instruction_ready
+ls_instruction:
+ or al,al
+ jz les_instruction
+ cmp al,3
+ jz lds_instruction
+ add al,0B0h
+ mov [extended_code],al
+ mov [base_code],0Fh
+ jmp ls_code_ok
+ les_instruction:
+ mov [base_code],0C4h
+ jmp ls_short_code
+ lds_instruction:
+ mov [base_code],0C5h
+ ls_short_code:
+ cmp [code_type],64
+ je illegal_instruction
+ ls_code_ok:
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_register
+ mov [postbyte_register],al
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ add [operand_size],2
+ lods byte [esi]
+ call get_size_operator
+ cmp al,'['
+ jne invalid_operand
+ call get_address
+ mov al,[operand_size]
+ cmp al,4
+ je ls_16bit
+ cmp al,6
+ je ls_32bit
+ cmp al,10
+ je ls_64bit
+ jmp invalid_operand_size
+ ls_16bit:
+ call operand_16bit
+ jmp instruction_ready
+ ls_32bit:
+ call operand_32bit
+ jmp instruction_ready
+ ls_64bit:
+ call operand_64bit
+ jmp instruction_ready
+sh_instruction:
+ mov [postbyte_register],al
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ je sh_reg
+ cmp al,'['
+ jne invalid_operand
+ sh_mem:
+ call get_address
+ push edx ebx ecx
+ mov al,[operand_size]
+ push eax
+ mov [operand_size],0
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ cmp al,'('
+ je sh_mem_imm
+ cmp al,10h
+ jne invalid_operand
+ sh_mem_reg:
+ lods byte [esi]
+ cmp al,11h
+ jne invalid_operand
+ pop eax ecx ebx edx
+ cmp al,1
+ je sh_mem_cl_8bit
+ jb sh_mem_cl_nosize
+ call operand_autodetect
+ mov [base_code],0D3h
+ jmp instruction_ready
+ sh_mem_cl_nosize:
+ call recoverable_unknown_size
+ sh_mem_cl_8bit:
+ mov [base_code],0D2h
+ jmp instruction_ready
+ sh_mem_imm:
+ mov al,[operand_size]
+ or al,al
+ jz sh_mem_imm_size_ok
+ cmp al,1
+ jne invalid_operand_size
+ sh_mem_imm_size_ok:
+ call get_byte_value
+ mov byte [value],al
+ pop eax ecx ebx edx
+ cmp al,1
+ je sh_mem_imm_8bit
+ jb sh_mem_imm_nosize
+ call operand_autodetect
+ cmp byte [value],1
+ je sh_mem_1
+ mov [base_code],0C1h
+ call store_instruction_with_imm8
+ jmp instruction_assembled
+ sh_mem_1:
+ mov [base_code],0D1h
+ jmp instruction_ready
+ sh_mem_imm_nosize:
+ call recoverable_unknown_size
+ sh_mem_imm_8bit:
+ cmp byte [value],1
+ je sh_mem_1_8bit
+ mov [base_code],0C0h
+ call store_instruction_with_imm8
+ jmp instruction_assembled
+ sh_mem_1_8bit:
+ mov [base_code],0D0h
+ jmp instruction_ready
+ sh_reg:
+ lods byte [esi]
+ call convert_register
+ mov bx,ax
+ mov [operand_size],0
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ cmp al,'('
+ je sh_reg_imm
+ cmp al,10h
+ jne invalid_operand
+ sh_reg_reg:
+ lods byte [esi]
+ cmp al,11h
+ jne invalid_operand
+ mov al,bh
+ cmp al,1
+ je sh_reg_cl_8bit
+ call operand_autodetect
+ mov [base_code],0D3h
+ jmp nomem_instruction_ready
+ sh_reg_cl_8bit:
+ mov [base_code],0D2h
+ jmp nomem_instruction_ready
+ sh_reg_imm:
+ mov al,[operand_size]
+ or al,al
+ jz sh_reg_imm_size_ok
+ cmp al,1
+ jne invalid_operand_size
+ sh_reg_imm_size_ok:
+ push ebx
+ call get_byte_value
+ mov dl,al
+ pop ebx
+ mov al,bh
+ cmp al,1
+ je sh_reg_imm_8bit
+ call operand_autodetect
+ cmp dl,1
+ je sh_reg_1
+ mov [base_code],0C1h
+ call store_nomem_instruction
+ mov al,dl
+ stos byte [edi]
+ jmp instruction_assembled
+ sh_reg_1:
+ mov [base_code],0D1h
+ jmp nomem_instruction_ready
+ sh_reg_imm_8bit:
+ cmp dl,1
+ je sh_reg_1_8bit
+ mov [base_code],0C0h
+ call store_nomem_instruction
+ mov al,dl
+ stos byte [edi]
+ jmp instruction_assembled
+ sh_reg_1_8bit:
+ mov [base_code],0D0h
+ jmp nomem_instruction_ready
+shd_instruction:
+ mov [base_code],0Fh
+ mov [extended_code],al
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ je shd_reg
+ cmp al,'['
+ jne invalid_operand
+ shd_mem:
+ call get_address
+ push edx ebx ecx
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_register
+ mov [postbyte_register],al
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ mov al,ah
+ mov [operand_size],0
+ push eax
+ lods byte [esi]
+ call get_size_operator
+ cmp al,'('
+ je shd_mem_reg_imm
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ cmp al,11h
+ jne invalid_operand
+ pop eax ecx ebx edx
+ call operand_autodetect
+ inc [extended_code]
+ jmp instruction_ready
+ shd_mem_reg_imm:
+ mov al,[operand_size]
+ or al,al
+ jz shd_mem_reg_imm_size_ok
+ cmp al,1
+ jne invalid_operand_size
+ shd_mem_reg_imm_size_ok:
+ call get_byte_value
+ mov byte [value],al
+ pop eax ecx ebx edx
+ call operand_autodetect
+ call store_instruction_with_imm8
+ jmp instruction_assembled
+ shd_reg:
+ lods byte [esi]
+ call convert_register
+ mov [postbyte_register],al
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_register
+ mov bl,[postbyte_register]
+ mov [postbyte_register],al
+ mov al,ah
+ push eax ebx
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ mov [operand_size],0
+ lods byte [esi]
+ call get_size_operator
+ cmp al,'('
+ je shd_reg_reg_imm
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ cmp al,11h
+ jne invalid_operand
+ pop ebx eax
+ call operand_autodetect
+ inc [extended_code]
+ jmp nomem_instruction_ready
+ shd_reg_reg_imm:
+ mov al,[operand_size]
+ or al,al
+ jz shd_reg_reg_imm_size_ok
+ cmp al,1
+ jne invalid_operand_size
+ shd_reg_reg_imm_size_ok:
+ call get_byte_value
+ mov dl,al
+ pop ebx eax
+ call operand_autodetect
+ call store_nomem_instruction
+ mov al,dl
+ stos byte [edi]
+ jmp instruction_assembled
+movx_instruction:
+ mov [base_code],0Fh
+ mov [extended_code],al
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_register
+ mov [postbyte_register],al
+ mov al,ah
+ push eax
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ mov [operand_size],0
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ je movx_reg
+ cmp al,'['
+ jne invalid_operand
+ call get_address
+ pop eax
+ mov ah,[operand_size]
+ or ah,ah
+ jz movx_unknown_size
+ cmp ah,al
+ jae invalid_operand_size
+ cmp ah,1
+ je movx_mem_store
+ cmp ah,2
+ jne invalid_operand_size
+ inc [extended_code]
+ movx_mem_store:
+ call operand_autodetect
+ jmp instruction_ready
+ movx_unknown_size:
+ call recoverable_unknown_size
+ jmp movx_mem_store
+ movx_reg:
+ lods byte [esi]
+ call convert_register
+ pop ebx
+ xchg bl,al
+ cmp ah,al
+ jae invalid_operand_size
+ cmp ah,1
+ je movx_reg_8bit
+ cmp ah,2
+ je movx_reg_16bit
+ jmp invalid_operand_size
+ movx_reg_8bit:
+ call operand_autodetect
+ jmp nomem_instruction_ready
+ movx_reg_16bit:
+ call operand_autodetect
+ inc [extended_code]
+ jmp nomem_instruction_ready
+movsxd_instruction:
+ mov [base_code],al
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_register
+ mov [postbyte_register],al
+ cmp ah,8
+ jne invalid_operand_size
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ mov [operand_size],0
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ je movsxd_reg
+ cmp al,'['
+ jne invalid_operand
+ call get_address
+ cmp [operand_size],4
+ je movsxd_mem_store
+ cmp [operand_size],0
+ jne invalid_operand_size
+ movsxd_mem_store:
+ call operand_64bit
+ jmp instruction_ready
+ movsxd_reg:
+ lods byte [esi]
+ call convert_register
+ cmp ah,4
+ jne invalid_operand_size
+ mov bl,al
+ call operand_64bit
+ jmp nomem_instruction_ready
+bt_instruction:
+ mov [postbyte_register],al
+ shl al,3
+ add al,83h
+ mov [extended_code],al
+ mov [base_code],0Fh
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ je bt_reg
+ cmp al,'['
+ jne invalid_operand
+ call get_address
+ push eax ebx ecx
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ cmp byte [esi],'('
+ je bt_mem_imm
+ cmp byte [esi],11h
+ jne bt_mem_reg
+ cmp byte [esi+2],'('
+ je bt_mem_imm
+ bt_mem_reg:
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_register
+ mov [postbyte_register],al
+ pop ecx ebx edx
+ mov al,ah
+ call operand_autodetect
+ jmp instruction_ready
+ bt_mem_imm:
+ xor al,al
+ xchg al,[operand_size]
+ push eax
+ lods byte [esi]
+ call get_size_operator
+ cmp al,'('
+ jne invalid_operand
+ mov al,[operand_size]
+ or al,al
+ jz bt_mem_imm_size_ok
+ cmp al,1
+ jne invalid_operand_size
+ bt_mem_imm_size_ok:
+ call get_byte_value
+ mov byte [value],al
+ pop eax
+ or al,al
+ jz bt_mem_imm_nosize
+ call operand_autodetect
+ bt_mem_imm_store:
+ pop ecx ebx edx
+ mov [extended_code],0BAh
+ call store_instruction_with_imm8
+ jmp instruction_assembled
+ bt_mem_imm_nosize:
+ call recoverable_unknown_size
+ jmp bt_mem_imm_store
+ bt_reg:
+ lods byte [esi]
+ call convert_register
+ mov bl,al
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ cmp byte [esi],'('
+ je bt_reg_imm
+ cmp byte [esi],11h
+ jne bt_reg_reg
+ cmp byte [esi+2],'('
+ je bt_reg_imm
+ bt_reg_reg:
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_register
+ mov [postbyte_register],al
+ mov al,ah
+ call operand_autodetect
+ jmp nomem_instruction_ready
+ bt_reg_imm:
+ xor al,al
+ xchg al,[operand_size]
+ push eax ebx
+ lods byte [esi]
+ call get_size_operator
+ cmp al,'('
+ jne invalid_operand
+ mov al,[operand_size]
+ or al,al
+ jz bt_reg_imm_size_ok
+ cmp al,1
+ jne invalid_operand_size
+ bt_reg_imm_size_ok:
+ call get_byte_value
+ mov byte [value],al
+ pop ebx eax
+ call operand_autodetect
+ bt_reg_imm_store:
+ mov [extended_code],0BAh
+ call store_nomem_instruction
+ mov al,byte [value]
+ stos byte [edi]
+ jmp instruction_assembled
+bs_instruction:
+ mov [extended_code],al
+ mov [base_code],0Fh
+ call get_reg_mem
+ jc bs_reg_reg
+ mov al,[operand_size]
+ call operand_autodetect
+ jmp instruction_ready
+ bs_reg_reg:
+ mov al,ah
+ call operand_autodetect
+ jmp nomem_instruction_ready
+ get_reg_mem:
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_register
+ mov [postbyte_register],al
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ je get_reg_reg
+ cmp al,'['
+ jne invalid_argument
+ call get_address
+ clc
+ ret
+ get_reg_reg:
+ lods byte [esi]
+ call convert_register
+ mov bl,al
+ stc
+ ret
+
+imul_instruction:
+ mov [base_code],0F6h
+ mov [postbyte_register],5
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ je imul_reg
+ cmp al,'['
+ jne invalid_operand
+ imul_mem:
+ call get_address
+ mov al,[operand_size]
+ cmp al,1
+ je imul_mem_8bit
+ jb imul_mem_nosize
+ call operand_autodetect
+ inc [base_code]
+ jmp instruction_ready
+ imul_mem_nosize:
+ call recoverable_unknown_size
+ imul_mem_8bit:
+ jmp instruction_ready
+ imul_reg:
+ lods byte [esi]
+ call convert_register
+ cmp byte [esi],','
+ je imul_reg_
+ mov bl,al
+ mov al,ah
+ cmp al,1
+ je imul_reg_8bit
+ call operand_autodetect
+ inc [base_code]
+ imul_reg_8bit:
+ jmp nomem_instruction_ready
+ imul_reg_:
+ mov [postbyte_register],al
+ inc esi
+ cmp byte [esi],'('
+ je imul_reg_imm
+ cmp byte [esi],11h
+ jne imul_reg_noimm
+ cmp byte [esi+2],'('
+ je imul_reg_imm
+ imul_reg_noimm:
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ je imul_reg_reg
+ cmp al,'['
+ jne invalid_operand
+ imul_reg_mem:
+ call get_address
+ push edx ebx ecx
+ cmp byte [esi],','
+ je imul_reg_mem_imm
+ mov al,[operand_size]
+ call operand_autodetect
+ pop ecx ebx edx
+ mov [base_code],0Fh
+ mov [extended_code],0AFh
+ jmp instruction_ready
+ imul_reg_mem_imm:
+ inc esi
+ lods byte [esi]
+ call get_size_operator
+ cmp al,'('
+ jne invalid_operand
+ mov al,[operand_size]
+ cmp al,2
+ je imul_reg_mem_imm_16bit
+ cmp al,4
+ je imul_reg_mem_imm_32bit
+ cmp al,8
+ jne invalid_operand_size
+ imul_reg_mem_imm_64bit:
+ cmp [size_declared],0
+ jne long_immediate_not_encodable
+ call operand_64bit
+ call get_simm32
+ cmp [value_type],4
+ jae long_immediate_not_encodable
+ jmp imul_reg_mem_imm_32bit_ok
+ imul_reg_mem_imm_16bit:
+ call operand_16bit
+ call get_word_value
+ mov word [value],ax
+ cmp [value_type],0
+ jne imul_reg_mem_imm_16bit_store
+ cmp [size_declared],0
+ jne imul_reg_mem_imm_16bit_store
+ cmp ax,-80h
+ jl imul_reg_mem_imm_16bit_store
+ cmp ax,80h
+ jl imul_reg_mem_imm_8bit_store
+ imul_reg_mem_imm_16bit_store:
+ pop ecx ebx edx
+ mov [base_code],69h
+ call store_instruction_with_imm16
+ jmp instruction_assembled
+ imul_reg_mem_imm_32bit:
+ call operand_32bit
+ call get_dword_value
+ imul_reg_mem_imm_32bit_ok:
+ mov dword [value],eax
+ cmp [value_type],0
+ jne imul_reg_mem_imm_32bit_store
+ cmp [size_declared],0
+ jne imul_reg_mem_imm_32bit_store
+ cmp eax,-80h
+ jl imul_reg_mem_imm_32bit_store
+ cmp eax,80h
+ jl imul_reg_mem_imm_8bit_store
+ imul_reg_mem_imm_32bit_store:
+ pop ecx ebx edx
+ mov [base_code],69h
+ call store_instruction_with_imm32
+ jmp instruction_assembled
+ imul_reg_mem_imm_8bit_store:
+ pop ecx ebx edx
+ mov [base_code],6Bh
+ call store_instruction_with_imm8
+ jmp instruction_assembled
+ imul_reg_imm:
+ mov bl,[postbyte_register]
+ dec esi
+ jmp imul_reg_reg_imm
+ imul_reg_reg:
+ lods byte [esi]
+ call convert_register
+ mov bl,al
+ cmp byte [esi],','
+ je imul_reg_reg_imm
+ mov al,ah
+ call operand_autodetect
+ mov [base_code],0Fh
+ mov [extended_code],0AFh
+ jmp nomem_instruction_ready
+ imul_reg_reg_imm:
+ inc esi
+ lods byte [esi]
+ call get_size_operator
+ cmp al,'('
+ jne invalid_operand
+ mov al,[operand_size]
+ cmp al,2
+ je imul_reg_reg_imm_16bit
+ cmp al,4
+ je imul_reg_reg_imm_32bit
+ cmp al,8
+ jne invalid_operand_size
+ imul_reg_reg_imm_64bit:
+ cmp [size_declared],0
+ jne long_immediate_not_encodable
+ call operand_64bit
+ push ebx
+ call get_simm32
+ cmp [value_type],4
+ jae long_immediate_not_encodable
+ jmp imul_reg_reg_imm_32bit_ok
+ imul_reg_reg_imm_16bit:
+ call operand_16bit
+ push ebx
+ call get_word_value
+ pop ebx
+ mov dx,ax
+ cmp [value_type],0
+ jne imul_reg_reg_imm_16bit_store
+ cmp [size_declared],0
+ jne imul_reg_reg_imm_16bit_store
+ cmp ax,-80h
+ jl imul_reg_reg_imm_16bit_store
+ cmp ax,80h
+ jl imul_reg_reg_imm_8bit_store
+ imul_reg_reg_imm_16bit_store:
+ mov [base_code],69h
+ call store_nomem_instruction
+ mov ax,dx
+ call mark_relocation
+ stos word [edi]
+ jmp instruction_assembled
+ imul_reg_reg_imm_32bit:
+ call operand_32bit
+ push ebx
+ call get_dword_value
+ imul_reg_reg_imm_32bit_ok:
+ pop ebx
+ mov edx,eax
+ cmp [value_type],0
+ jne imul_reg_reg_imm_32bit_store
+ cmp [size_declared],0
+ jne imul_reg_reg_imm_32bit_store
+ cmp eax,-80h
+ jl imul_reg_reg_imm_32bit_store
+ cmp eax,80h
+ jl imul_reg_reg_imm_8bit_store
+ imul_reg_reg_imm_32bit_store:
+ mov [base_code],69h
+ call store_nomem_instruction
+ mov eax,edx
+ call mark_relocation
+ stos dword [edi]
+ jmp instruction_assembled
+ imul_reg_reg_imm_8bit_store:
+ mov [base_code],6Bh
+ call store_nomem_instruction
+ mov al,dl
+ stos byte [edi]
+ jmp instruction_assembled
+in_instruction:
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_register
+ or al,al
+ jnz invalid_operand
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ mov al,ah
+ push eax
+ mov [operand_size],0
+ lods byte [esi]
+ call get_size_operator
+ cmp al,'('
+ je in_imm
+ cmp al,10h
+ je in_reg
+ jmp invalid_operand
+ in_reg:
+ lods byte [esi]
+ cmp al,22h
+ jne invalid_operand
+ pop eax
+ cmp al,1
+ je in_al_dx
+ cmp al,2
+ je in_ax_dx
+ cmp al,4
+ jne invalid_operand_size
+ in_ax_dx:
+ call operand_autodetect
+ mov [base_code],0EDh
+ call store_instruction_code
+ jmp instruction_assembled
+ in_al_dx:
+ mov al,0ECh
+ stos byte [edi]
+ jmp instruction_assembled
+ in_imm:
+ mov al,[operand_size]
+ or al,al
+ jz in_imm_size_ok
+ cmp al,1
+ jne invalid_operand_size
+ in_imm_size_ok:
+ call get_byte_value
+ mov dl,al
+ pop eax
+ cmp al,1
+ je in_al_imm
+ cmp al,2
+ je in_ax_imm
+ cmp al,4
+ jne invalid_operand_size
+ in_ax_imm:
+ call operand_autodetect
+ mov [base_code],0E5h
+ call store_instruction_code
+ mov al,dl
+ stos byte [edi]
+ jmp instruction_assembled
+ in_al_imm:
+ mov al,0E4h
+ stos byte [edi]
+ mov al,dl
+ stos byte [edi]
+ jmp instruction_assembled
+out_instruction:
+ lods byte [esi]
+ call get_size_operator
+ cmp al,'('
+ je out_imm
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ cmp al,22h
+ jne invalid_operand
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ mov [operand_size],0
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_register
+ or al,al
+ jnz invalid_operand
+ mov al,ah
+ cmp al,1
+ je out_dx_al
+ cmp al,2
+ je out_dx_ax
+ cmp al,4
+ jne invalid_operand_size
+ out_dx_ax:
+ call operand_autodetect
+ mov [base_code],0EFh
+ call store_instruction_code
+ jmp instruction_assembled
+ out_dx_al:
+ mov al,0EEh
+ stos byte [edi]
+ jmp instruction_assembled
+ out_imm:
+ mov al,[operand_size]
+ or al,al
+ jz out_imm_size_ok
+ cmp al,1
+ jne invalid_operand_size
+ out_imm_size_ok:
+ call get_byte_value
+ mov dl,al
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ mov [operand_size],0
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_register
+ or al,al
+ jnz invalid_operand
+ mov al,ah
+ cmp al,1
+ je out_imm_al
+ cmp al,2
+ je out_imm_ax
+ cmp al,4
+ jne invalid_operand_size
+ out_imm_ax:
+ call operand_autodetect
+ mov [base_code],0E7h
+ call store_instruction_code
+ mov al,dl
+ stos byte [edi]
+ jmp instruction_assembled
+ out_imm_al:
+ mov al,0E6h
+ stos byte [edi]
+ mov al,dl
+ stos byte [edi]
+ jmp instruction_assembled
+
+call_instruction:
+ mov [postbyte_register],10b
+ mov [base_code],0E8h
+ mov [extended_code],9Ah
+ jmp process_jmp
+jmp_instruction:
+ mov [postbyte_register],100b
+ mov [base_code],0E9h
+ mov [extended_code],0EAh
+ process_jmp:
+ lods byte [esi]
+ call get_jump_operator
+ call get_size_operator
+ cmp al,'('
+ je jmp_imm
+ mov [base_code],0FFh
+ cmp al,10h
+ je jmp_reg
+ cmp al,'['
+ jne invalid_operand
+ jmp_mem:
+ cmp [jump_type],1
+ je illegal_instruction
+ call get_address
+ mov edx,eax
+ mov al,[operand_size]
+ or al,al
+ jz jmp_mem_size_not_specified
+ cmp al,2
+ je jmp_mem_16bit
+ cmp al,4
+ je jmp_mem_32bit
+ cmp al,6
+ je jmp_mem_48bit
+ cmp al,8
+ je jmp_mem_64bit
+ cmp al,10
+ je jmp_mem_80bit
+ jmp invalid_operand_size
+ jmp_mem_size_not_specified:
+ cmp [jump_type],3
+ je jmp_mem_far
+ cmp [jump_type],2
+ je jmp_mem_near
+ call recoverable_unknown_size
+ jmp_mem_near:
+ cmp [code_type],16
+ je jmp_mem_16bit
+ cmp [code_type],32
+ je jmp_mem_near_32bit
+ jmp_mem_64bit:
+ cmp [jump_type],3
+ je invalid_operand_size
+ cmp [code_type],64
+ jne illegal_instruction
+ jmp instruction_ready
+ jmp_mem_far:
+ cmp [code_type],16
+ je jmp_mem_far_32bit
+ jmp_mem_48bit:
+ call operand_32bit
+ jmp_mem_far_store:
+ cmp [jump_type],2
+ je invalid_operand_size
+ inc [postbyte_register]
+ jmp instruction_ready
+ jmp_mem_80bit:
+ call operand_64bit
+ jmp jmp_mem_far_store
+ jmp_mem_far_32bit:
+ call operand_16bit
+ jmp jmp_mem_far_store
+ jmp_mem_32bit:
+ cmp [jump_type],3
+ je jmp_mem_far_32bit
+ cmp [jump_type],2
+ je jmp_mem_near_32bit
+ cmp [code_type],16
+ je jmp_mem_far_32bit
+ jmp_mem_near_32bit:
+ cmp [code_type],64
+ je illegal_instruction
+ call operand_32bit
+ jmp instruction_ready
+ jmp_mem_16bit:
+ cmp [jump_type],3
+ je invalid_operand_size
+ call operand_16bit
+ jmp instruction_ready
+ jmp_reg:
+ test [jump_type],1
+ jnz invalid_operand
+ lods byte [esi]
+ call convert_register
+ mov bl,al
+ mov al,ah
+ cmp al,2
+ je jmp_reg_16bit
+ cmp al,4
+ je jmp_reg_32bit
+ cmp al,8
+ jne invalid_operand_size
+ jmp_reg_64bit:
+ cmp [code_type],64
+ jne illegal_instruction
+ jmp nomem_instruction_ready
+ jmp_reg_32bit:
+ cmp [code_type],64
+ je illegal_instruction
+ call operand_32bit
+ jmp nomem_instruction_ready
+ jmp_reg_16bit:
+ call operand_16bit
+ jmp nomem_instruction_ready
+ jmp_imm:
+ cmp byte [esi],'.'
+ je invalid_value
+ mov ebx,esi
+ dec esi
+ call skip_symbol
+ xchg esi,ebx
+ cmp byte [ebx],':'
+ je jmp_far
+ cmp [jump_type],3
+ je invalid_operand
+ jmp_near:
+ mov al,[operand_size]
+ cmp al,2
+ je jmp_imm_16bit
+ cmp al,4
+ je jmp_imm_32bit
+ cmp al,8
+ je jmp_imm_64bit
+ or al,al
+ jnz invalid_operand_size
+ cmp [code_type],16
+ je jmp_imm_16bit
+ cmp [code_type],64
+ je jmp_imm_64bit
+ jmp_imm_32bit:
+ cmp [code_type],64
+ je invalid_operand_size
+ call get_address_dword_value
+ cmp [code_type],16
+ jne jmp_imm_32bit_prefix_ok
+ mov byte [edi],66h
+ inc edi
+ jmp_imm_32bit_prefix_ok:
+ call calculate_jump_offset
+ cdq
+ call check_for_short_jump
+ jc jmp_short
+ jmp_imm_32bit_store:
+ mov edx,eax
+ sub edx,3
+ jno jmp_imm_32bit_ok
+ cmp [code_type],64
+ je relative_jump_out_of_range
+ jmp_imm_32bit_ok:
+ mov al,[base_code]
+ stos byte [edi]
+ mov eax,edx
+ call mark_relocation
+ stos dword [edi]
+ jmp instruction_assembled
+ jmp_imm_64bit:
+ cmp [code_type],64
+ jne invalid_operand_size
+ call get_address_qword_value
+ call calculate_jump_offset
+ mov ecx,edx
+ cdq
+ cmp edx,ecx
+ jne relative_jump_out_of_range
+ call check_for_short_jump
+ jnc jmp_imm_32bit_store
+ jmp_short:
+ mov ah,al
+ mov al,0EBh
+ stos word [edi]
+ jmp instruction_assembled
+ jmp_imm_16bit:
+ call get_address_word_value
+ cmp [code_type],16
+ je jmp_imm_16bit_prefix_ok
+ mov byte [edi],66h
+ inc edi
+ jmp_imm_16bit_prefix_ok:
+ call calculate_jump_offset
+ cwde
+ cdq
+ call check_for_short_jump
+ jc jmp_short
+ cmp [value_type],0
+ jne invalid_use_of_symbol
+ mov edx,eax
+ dec edx
+ mov al,[base_code]
+ stos byte [edi]
+ mov eax,edx
+ stos word [edi]
+ jmp instruction_assembled
+ calculate_jump_offset:
+ add edi,2
+ mov ebp,[addressing_space]
+ call calculate_relative_offset
+ sub edi,2
+ ret
+ check_for_short_jump:
+ cmp [jump_type],1
+ je forced_short
+ ja no_short_jump
+ cmp [base_code],0E8h
+ je no_short_jump
+ cmp [value_type],0
+ jne no_short_jump
+ cmp eax,80h
+ jb short_jump
+ cmp eax,-80h
+ jae short_jump
+ no_short_jump:
+ clc
+ ret
+ forced_short:
+ cmp [base_code],0E8h
+ je illegal_instruction
+ cmp [next_pass_needed],0
+ jne jmp_short_value_type_ok
+ cmp [value_type],0
+ jne invalid_use_of_symbol
+ jmp_short_value_type_ok:
+ cmp eax,-80h
+ jae short_jump
+ cmp eax,80h
+ jae jump_out_of_range
+ short_jump:
+ stc
+ ret
+ jump_out_of_range:
+ cmp [error_line],0
+ jne instruction_assembled
+ mov eax,[current_line]
+ mov [error_line],eax
+ mov [error],relative_jump_out_of_range
+ jmp instruction_assembled
+ jmp_far:
+ cmp [jump_type],2
+ je invalid_operand
+ cmp [code_type],64
+ je illegal_instruction
+ mov al,[extended_code]
+ mov [base_code],al
+ call get_word_value
+ push eax
+ inc esi
+ lods byte [esi]
+ cmp al,'('
+ jne invalid_operand
+ mov al,[value_type]
+ push eax [symbol_identifier]
+ cmp byte [esi],'.'
+ je invalid_value
+ mov al,[operand_size]
+ cmp al,4
+ je jmp_far_16bit
+ cmp al,6
+ je jmp_far_32bit
+ or al,al
+ jnz invalid_operand_size
+ cmp [code_type],16
+ jne jmp_far_32bit
+ jmp_far_16bit:
+ call get_word_value
+ mov ebx,eax
+ call operand_16bit
+ call store_instruction_code
+ mov ax,bx
+ call mark_relocation
+ stos word [edi]
+ jmp_far_segment:
+ pop [symbol_identifier] eax
+ mov [value_type],al
+ pop eax
+ call mark_relocation
+ stos word [edi]
+ jmp instruction_assembled
+ jmp_far_32bit:
+ call get_dword_value
+ mov ebx,eax
+ call operand_32bit
+ call store_instruction_code
+ mov eax,ebx
+ call mark_relocation
+ stos dword [edi]
+ jmp jmp_far_segment
+conditional_jump:
+ mov [base_code],al
+ lods byte [esi]
+ call get_jump_operator
+ cmp [jump_type],3
+ je invalid_operand
+ call get_size_operator
+ cmp al,'('
+ jne invalid_operand
+ cmp byte [esi],'.'
+ je invalid_value
+ mov al,[operand_size]
+ cmp al,2
+ je conditional_jump_16bit
+ cmp al,4
+ je conditional_jump_32bit
+ cmp al,8
+ je conditional_jump_64bit
+ or al,al
+ jnz invalid_operand_size
+ cmp [code_type],16
+ je conditional_jump_16bit
+ cmp [code_type],64
+ je conditional_jump_64bit
+ conditional_jump_32bit:
+ cmp [code_type],64
+ je invalid_operand_size
+ call get_address_dword_value
+ cmp [code_type],16
+ jne conditional_jump_32bit_prefix_ok
+ mov byte [edi],66h
+ inc edi
+ conditional_jump_32bit_prefix_ok:
+ call calculate_jump_offset
+ cdq
+ call check_for_short_jump
+ jc conditional_jump_short
+ conditional_jump_32bit_store:
+ mov edx,eax
+ sub edx,4
+ jno conditional_jump_32bit_range_ok
+ cmp [code_type],64
+ je relative_jump_out_of_range
+ conditional_jump_32bit_range_ok:
+ mov ah,[base_code]
+ add ah,10h
+ mov al,0Fh
+ stos word [edi]
+ mov eax,edx
+ call mark_relocation
+ stos dword [edi]
+ jmp instruction_assembled
+ conditional_jump_64bit:
+ cmp [code_type],64
+ jne invalid_operand_size
+ call get_address_qword_value
+ call calculate_jump_offset
+ mov ecx,edx
+ cdq
+ cmp edx,ecx
+ jne relative_jump_out_of_range
+ call check_for_short_jump
+ jnc conditional_jump_32bit_store
+ conditional_jump_short:
+ mov ah,al
+ mov al,[base_code]
+ stos word [edi]
+ jmp instruction_assembled
+ conditional_jump_16bit:
+ call get_address_word_value
+ cmp [code_type],16
+ je conditional_jump_16bit_prefix_ok
+ mov byte [edi],66h
+ inc edi
+ conditional_jump_16bit_prefix_ok:
+ call calculate_jump_offset
+ cwde
+ cdq
+ call check_for_short_jump
+ jc conditional_jump_short
+ cmp [value_type],0
+ jne invalid_use_of_symbol
+ mov edx,eax
+ sub dx,2
+ mov ah,[base_code]
+ add ah,10h
+ mov al,0Fh
+ stos word [edi]
+ mov eax,edx
+ stos word [edi]
+ jmp instruction_assembled
+loop_instruction_16bit:
+ cmp [code_type],64
+ je illegal_instruction
+ cmp [code_type],16
+ je loop_instruction
+ mov [operand_prefix],67h
+ jmp loop_instruction
+loop_instruction_32bit:
+ cmp [code_type],32
+ je loop_instruction
+ mov [operand_prefix],67h
+ jmp loop_instruction
+loop_instruction_64bit:
+ cmp [code_type],64
+ jne illegal_instruction
+loop_instruction:
+ mov [base_code],al
+ lods byte [esi]
+ call get_jump_operator
+ cmp [jump_type],1
+ ja invalid_operand
+ call get_size_operator
+ cmp al,'('
+ jne invalid_operand
+ cmp byte [esi],'.'
+ je invalid_value
+ mov al,[operand_size]
+ cmp al,2
+ je loop_jump_16bit
+ cmp al,4
+ je loop_jump_32bit
+ cmp al,8
+ je loop_jump_64bit
+ or al,al
+ jnz invalid_operand_size
+ cmp [code_type],16
+ je loop_jump_16bit
+ cmp [code_type],64
+ je loop_jump_64bit
+ loop_jump_32bit:
+ cmp [code_type],64
+ je invalid_operand_size
+ call get_address_dword_value
+ cmp [code_type],16
+ jne loop_jump_32bit_prefix_ok
+ mov byte [edi],66h
+ inc edi
+ loop_jump_32bit_prefix_ok:
+ call loop_counter_size
+ call calculate_jump_offset
+ cdq
+ make_loop_jump:
+ call check_for_short_jump
+ jc conditional_jump_short
+ scas word [edi]
+ jmp jump_out_of_range
+ loop_counter_size:
+ cmp [operand_prefix],0
+ je loop_counter_size_ok
+ push eax
+ mov al,[operand_prefix]
+ stos byte [edi]
+ pop eax
+ loop_counter_size_ok:
+ ret
+ loop_jump_64bit:
+ cmp [code_type],64
+ jne invalid_operand_size
+ call get_address_qword_value
+ call loop_counter_size
+ call calculate_jump_offset
+ mov ecx,edx
+ cdq
+ cmp edx,ecx
+ jne relative_jump_out_of_range
+ jmp make_loop_jump
+ loop_jump_16bit:
+ call get_address_word_value
+ cmp [code_type],16
+ je loop_jump_16bit_prefix_ok
+ mov byte [edi],66h
+ inc edi
+ loop_jump_16bit_prefix_ok:
+ call loop_counter_size
+ call calculate_jump_offset
+ cwde
+ cdq
+ jmp make_loop_jump
+
+movs_instruction:
+ lods byte [esi]
+ call get_size_operator
+ cmp al,'['
+ jne invalid_operand
+ call get_address
+ or eax,eax
+ jnz invalid_address
+ or bl,ch
+ jnz invalid_address
+ cmp [segment_register],1
+ ja invalid_address
+ push ebx
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ cmp al,'['
+ jne invalid_operand
+ call get_address
+ pop edx
+ or eax,eax
+ jnz invalid_address
+ or bl,ch
+ jnz invalid_address
+ mov al,dh
+ mov ah,bh
+ shr al,4
+ shr ah,4
+ cmp al,ah
+ jne address_sizes_do_not_agree
+ and bh,111b
+ and dh,111b
+ cmp bh,6
+ jne invalid_address
+ cmp dh,7
+ jne invalid_address
+ cmp al,2
+ je movs_address_16bit
+ cmp al,4
+ je movs_address_32bit
+ cmp [code_type],64
+ jne invalid_address_size
+ jmp movs_store
+ movs_address_32bit:
+ call address_32bit_prefix
+ jmp movs_store
+ movs_address_16bit:
+ cmp [code_type],64
+ je invalid_address_size
+ call address_16bit_prefix
+ movs_store:
+ xor ebx,ebx
+ call store_segment_prefix_if_necessary
+ mov al,0A4h
+ movs_check_size:
+ mov bl,[operand_size]
+ cmp bl,1
+ je simple_instruction
+ inc al
+ cmp bl,2
+ je simple_instruction_16bit
+ cmp bl,4
+ je simple_instruction_32bit
+ cmp bl,8
+ je simple_instruction_64bit
+ or bl,bl
+ jnz invalid_operand_size
+ call recoverable_unknown_size
+ jmp simple_instruction
+lods_instruction:
+ lods byte [esi]
+ call get_size_operator
+ cmp al,'['
+ jne invalid_operand
+ call get_address
+ or eax,eax
+ jnz invalid_address
+ or bl,ch
+ jnz invalid_address
+ cmp bh,26h
+ je lods_address_16bit
+ cmp bh,46h
+ je lods_address_32bit
+ cmp bh,86h
+ jne invalid_address
+ cmp [code_type],64
+ jne invalid_address_size
+ jmp lods_store
+ lods_address_32bit:
+ call address_32bit_prefix
+ jmp lods_store
+ lods_address_16bit:
+ cmp [code_type],64
+ je invalid_address_size
+ call address_16bit_prefix
+ lods_store:
+ xor ebx,ebx
+ call store_segment_prefix_if_necessary
+ mov al,0ACh
+ jmp movs_check_size
+stos_instruction:
+ mov [base_code],al
+ lods byte [esi]
+ call get_size_operator
+ cmp al,'['
+ jne invalid_operand
+ call get_address
+ or eax,eax
+ jnz invalid_address
+ or bl,ch
+ jnz invalid_address
+ cmp bh,27h
+ je stos_address_16bit
+ cmp bh,47h
+ je stos_address_32bit
+ cmp bh,87h
+ jne invalid_address
+ cmp [code_type],64
+ jne invalid_address_size
+ jmp stos_store
+ stos_address_32bit:
+ call address_32bit_prefix
+ jmp stos_store
+ stos_address_16bit:
+ cmp [code_type],64
+ je invalid_address_size
+ call address_16bit_prefix
+ stos_store:
+ cmp [segment_register],1
+ ja invalid_address
+ mov al,[base_code]
+ jmp movs_check_size
+cmps_instruction:
+ lods byte [esi]
+ call get_size_operator
+ cmp al,'['
+ jne invalid_operand
+ call get_address
+ or eax,eax
+ jnz invalid_address
+ or bl,ch
+ jnz invalid_address
+ mov al,[segment_register]
+ push eax ebx
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ cmp al,'['
+ jne invalid_operand
+ call get_address
+ or eax,eax
+ jnz invalid_address
+ or bl,ch
+ jnz invalid_address
+ pop edx eax
+ cmp [segment_register],1
+ ja invalid_address
+ mov [segment_register],al
+ mov al,dh
+ mov ah,bh
+ shr al,4
+ shr ah,4
+ cmp al,ah
+ jne address_sizes_do_not_agree
+ and bh,111b
+ and dh,111b
+ cmp bh,7
+ jne invalid_address
+ cmp dh,6
+ jne invalid_address
+ cmp al,2
+ je cmps_address_16bit
+ cmp al,4
+ je cmps_address_32bit
+ cmp [code_type],64
+ jne invalid_address_size
+ jmp cmps_store
+ cmps_address_32bit:
+ call address_32bit_prefix
+ jmp cmps_store
+ cmps_address_16bit:
+ cmp [code_type],64
+ je invalid_address_size
+ call address_16bit_prefix
+ cmps_store:
+ xor ebx,ebx
+ call store_segment_prefix_if_necessary
+ mov al,0A6h
+ jmp movs_check_size
+ins_instruction:
+ lods byte [esi]
+ call get_size_operator
+ cmp al,'['
+ jne invalid_operand
+ call get_address
+ or eax,eax
+ jnz invalid_address
+ or bl,ch
+ jnz invalid_address
+ cmp bh,27h
+ je ins_address_16bit
+ cmp bh,47h
+ je ins_address_32bit
+ cmp bh,87h
+ jne invalid_address
+ cmp [code_type],64
+ jne invalid_address_size
+ jmp ins_store
+ ins_address_32bit:
+ call address_32bit_prefix
+ jmp ins_store
+ ins_address_16bit:
+ cmp [code_type],64
+ je invalid_address_size
+ call address_16bit_prefix
+ ins_store:
+ cmp [segment_register],1
+ ja invalid_address
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ cmp al,22h
+ jne invalid_operand
+ mov al,6Ch
+ ins_check_size:
+ cmp [operand_size],8
+ jne movs_check_size
+ jmp invalid_operand_size
+outs_instruction:
+ lods byte [esi]
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ cmp al,22h
+ jne invalid_operand
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ cmp al,'['
+ jne invalid_operand
+ call get_address
+ or eax,eax
+ jnz invalid_address
+ or bl,ch
+ jnz invalid_address
+ cmp bh,26h
+ je outs_address_16bit
+ cmp bh,46h
+ je outs_address_32bit
+ cmp bh,86h
+ jne invalid_address
+ cmp [code_type],64
+ jne invalid_address_size
+ jmp outs_store
+ outs_address_32bit:
+ call address_32bit_prefix
+ jmp outs_store
+ outs_address_16bit:
+ cmp [code_type],64
+ je invalid_address_size
+ call address_16bit_prefix
+ outs_store:
+ xor ebx,ebx
+ call store_segment_prefix_if_necessary
+ mov al,6Eh
+ jmp ins_check_size
+xlat_instruction:
+ lods byte [esi]
+ call get_size_operator
+ cmp al,'['
+ jne invalid_operand
+ call get_address
+ or eax,eax
+ jnz invalid_address
+ or bl,ch
+ jnz invalid_address
+ cmp bh,23h
+ je xlat_address_16bit
+ cmp bh,43h
+ je xlat_address_32bit
+ cmp bh,83h
+ jne invalid_address
+ cmp [code_type],64
+ jne invalid_address_size
+ jmp xlat_store
+ xlat_address_32bit:
+ call address_32bit_prefix
+ jmp xlat_store
+ xlat_address_16bit:
+ cmp [code_type],64
+ je invalid_address_size
+ call address_16bit_prefix
+ xlat_store:
+ call store_segment_prefix_if_necessary
+ mov al,0D7h
+ cmp [operand_size],1
+ jbe simple_instruction
+ jmp invalid_operand_size
+
+pm_word_instruction:
+ mov ah,al
+ shr ah,4
+ and al,111b
+ mov [base_code],0Fh
+ mov [extended_code],ah
+ mov [postbyte_register],al
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ je pm_reg
+ pm_mem:
+ cmp al,'['
+ jne invalid_operand
+ call get_address
+ mov al,[operand_size]
+ cmp al,2
+ je pm_mem_store
+ or al,al
+ jnz invalid_operand_size
+ pm_mem_store:
+ jmp instruction_ready
+ pm_reg:
+ lods byte [esi]
+ call convert_register
+ mov bl,al
+ cmp ah,2
+ jne invalid_operand_size
+ jmp nomem_instruction_ready
+pm_store_word_instruction:
+ mov ah,al
+ shr ah,4
+ and al,111b
+ mov [base_code],0Fh
+ mov [extended_code],ah
+ mov [postbyte_register],al
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne pm_mem
+ lods byte [esi]
+ call convert_register
+ mov bl,al
+ mov al,ah
+ call operand_autodetect
+ jmp nomem_instruction_ready
+lgdt_instruction:
+ mov [base_code],0Fh
+ mov [extended_code],1
+ mov [postbyte_register],al
+ lods byte [esi]
+ call get_size_operator
+ cmp al,'['
+ jne invalid_operand
+ call get_address
+ mov al,[operand_size]
+ cmp al,6
+ je lgdt_mem_48bit
+ cmp al,10
+ je lgdt_mem_80bit
+ or al,al
+ jnz invalid_operand_size
+ jmp lgdt_mem_store
+ lgdt_mem_80bit:
+ cmp [code_type],64
+ jne illegal_instruction
+ jmp lgdt_mem_store
+ lgdt_mem_48bit:
+ cmp [code_type],64
+ je illegal_instruction
+ cmp [postbyte_register],2
+ jb lgdt_mem_store
+ call operand_32bit
+ lgdt_mem_store:
+ jmp instruction_ready
+lar_instruction:
+ mov [extended_code],al
+ mov [base_code],0Fh
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_register
+ mov [postbyte_register],al
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ xor al,al
+ xchg al,[operand_size]
+ call operand_autodetect
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ je lar_reg_reg
+ cmp al,'['
+ jne invalid_operand
+ call get_address
+ mov al,[operand_size]
+ or al,al
+ jz lar_reg_mem
+ cmp al,2
+ jne invalid_operand_size
+ lar_reg_mem:
+ jmp instruction_ready
+ lar_reg_reg:
+ lods byte [esi]
+ call convert_register
+ cmp ah,2
+ jne invalid_operand_size
+ mov bl,al
+ jmp nomem_instruction_ready
+invlpg_instruction:
+ mov [base_code],0Fh
+ mov [extended_code],1
+ mov [postbyte_register],7
+ lods byte [esi]
+ call get_size_operator
+ cmp al,'['
+ jne invalid_operand
+ call get_address
+ jmp instruction_ready
+swapgs_instruction:
+ cmp [code_type],64
+ jne illegal_instruction
+rdtscp_instruction:
+ mov [base_code],0Fh
+ mov [extended_code],1
+ mov [postbyte_register],7
+ mov bl,al
+ jmp nomem_instruction_ready
+
+basic_486_instruction:
+ mov [base_code],0Fh
+ mov [extended_code],al
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ je basic_486_reg
+ cmp al,'['
+ jne invalid_operand
+ call get_address
+ push edx ebx ecx
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_register
+ mov [postbyte_register],al
+ pop ecx ebx edx
+ mov al,ah
+ cmp al,1
+ je basic_486_mem_reg_8bit
+ call operand_autodetect
+ inc [extended_code]
+ basic_486_mem_reg_8bit:
+ jmp instruction_ready
+ basic_486_reg:
+ lods byte [esi]
+ call convert_register
+ mov [postbyte_register],al
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_register
+ mov bl,[postbyte_register]
+ mov [postbyte_register],al
+ mov al,ah
+ cmp al,1
+ je basic_486_reg_reg_8bit
+ call operand_autodetect
+ inc [extended_code]
+ basic_486_reg_reg_8bit:
+ jmp nomem_instruction_ready
+bswap_instruction:
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_register
+ test al,1000b
+ jz bswap_reg_code_ok
+ or [rex_prefix],41h
+ and al,111b
+ bswap_reg_code_ok:
+ add al,0C8h
+ mov [extended_code],al
+ mov [base_code],0Fh
+ cmp ah,8
+ je bswap_reg64
+ cmp ah,4
+ jne invalid_operand_size
+ call operand_32bit
+ call store_instruction_code
+ jmp instruction_assembled
+ bswap_reg64:
+ call operand_64bit
+ call store_instruction_code
+ jmp instruction_assembled
+cmpxchgx_instruction:
+ mov [base_code],0Fh
+ mov [extended_code],0C7h
+ mov [postbyte_register],al
+ lods byte [esi]
+ call get_size_operator
+ cmp al,'['
+ jne invalid_operand
+ call get_address
+ mov ah,1
+ xchg [postbyte_register],ah
+ mov al,[operand_size]
+ or al,al
+ jz cmpxchgx_size_ok
+ cmp al,ah
+ jne invalid_operand_size
+ cmpxchgx_size_ok:
+ cmp ah,16
+ jne cmpxchgx_store
+ call operand_64bit
+ cmpxchgx_store:
+ jmp instruction_ready
+nop_instruction:
+ mov ah,[esi]
+ cmp ah,10h
+ je extended_nop
+ cmp ah,11h
+ je extended_nop
+ cmp ah,'['
+ je extended_nop
+ stos byte [edi]
+ jmp instruction_assembled
+ extended_nop:
+ mov [base_code],0Fh
+ mov [extended_code],1Fh
+ mov [postbyte_register],0
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ je extended_nop_reg
+ cmp al,'['
+ jne invalid_operand
+ call get_address
+ mov al,[operand_size]
+ or al,al
+ jz extended_nop_store
+ call operand_autodetect
+ extended_nop_store:
+ jmp instruction_ready
+ extended_nop_reg:
+ lods byte [esi]
+ call convert_register
+ mov bl,al
+ mov al,ah
+ call operand_autodetect
+ jmp nomem_instruction_ready
+
+basic_fpu_instruction:
+ mov [postbyte_register],al
+ mov [base_code],0D8h
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ je basic_fpu_streg
+ cmp al,'['
+ je basic_fpu_mem
+ dec esi
+ mov ah,[postbyte_register]
+ cmp ah,2
+ jb invalid_operand
+ cmp ah,3
+ ja invalid_operand
+ mov bl,1
+ jmp nomem_instruction_ready
+ basic_fpu_mem:
+ call get_address
+ mov al,[operand_size]
+ cmp al,4
+ je basic_fpu_mem_32bit
+ cmp al,8
+ je basic_fpu_mem_64bit
+ or al,al
+ jnz invalid_operand_size
+ call recoverable_unknown_size
+ basic_fpu_mem_32bit:
+ jmp instruction_ready
+ basic_fpu_mem_64bit:
+ mov [base_code],0DCh
+ jmp instruction_ready
+ basic_fpu_streg:
+ lods byte [esi]
+ call convert_fpu_register
+ mov bl,al
+ mov ah,[postbyte_register]
+ cmp ah,2
+ je basic_fpu_single_streg
+ cmp ah,3
+ je basic_fpu_single_streg
+ or al,al
+ jz basic_fpu_st0
+ test ah,110b
+ jz basic_fpu_streg_st0
+ xor [postbyte_register],1
+ basic_fpu_streg_st0:
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_fpu_register
+ or al,al
+ jnz invalid_operand
+ mov [base_code],0DCh
+ jmp nomem_instruction_ready
+ basic_fpu_st0:
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_fpu_register
+ mov bl,al
+ basic_fpu_single_streg:
+ mov [base_code],0D8h
+ jmp nomem_instruction_ready
+simple_fpu_instruction:
+ mov ah,al
+ or ah,11000000b
+ mov al,0D9h
+ stos word [edi]
+ jmp instruction_assembled
+fi_instruction:
+ mov [postbyte_register],al
+ lods byte [esi]
+ call get_size_operator
+ cmp al,'['
+ jne invalid_operand
+ call get_address
+ mov al,[operand_size]
+ cmp al,2
+ je fi_mem_16bit
+ cmp al,4
+ je fi_mem_32bit
+ or al,al
+ jnz invalid_operand_size
+ call recoverable_unknown_size
+ fi_mem_32bit:
+ mov [base_code],0DAh
+ jmp instruction_ready
+ fi_mem_16bit:
+ mov [base_code],0DEh
+ jmp instruction_ready
+fld_instruction:
+ mov [postbyte_register],al
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ je fld_streg
+ cmp al,'['
+ jne invalid_operand
+ call get_address
+ mov al,[operand_size]
+ cmp al,4
+ je fld_mem_32bit
+ cmp al,8
+ je fld_mem_64bit
+ cmp al,10
+ je fld_mem_80bit
+ or al,al
+ jnz invalid_operand_size
+ call recoverable_unknown_size
+ fld_mem_32bit:
+ mov [base_code],0D9h
+ jmp instruction_ready
+ fld_mem_64bit:
+ mov [base_code],0DDh
+ jmp instruction_ready
+ fld_mem_80bit:
+ mov al,[postbyte_register]
+ cmp al,0
+ je fld_mem_80bit_store
+ dec [postbyte_register]
+ cmp al,3
+ je fld_mem_80bit_store
+ jmp invalid_operand_size
+ fld_mem_80bit_store:
+ add [postbyte_register],5
+ mov [base_code],0DBh
+ jmp instruction_ready
+ fld_streg:
+ lods byte [esi]
+ call convert_fpu_register
+ mov bl,al
+ cmp [postbyte_register],2
+ jae fst_streg
+ mov [base_code],0D9h
+ jmp nomem_instruction_ready
+ fst_streg:
+ mov [base_code],0DDh
+ jmp nomem_instruction_ready
+fild_instruction:
+ mov [postbyte_register],al
+ lods byte [esi]
+ call get_size_operator
+ cmp al,'['
+ jne invalid_operand
+ call get_address
+ mov al,[operand_size]
+ cmp al,2
+ je fild_mem_16bit
+ cmp al,4
+ je fild_mem_32bit
+ cmp al,8
+ je fild_mem_64bit
+ or al,al
+ jnz invalid_operand_size
+ call recoverable_unknown_size
+ fild_mem_32bit:
+ mov [base_code],0DBh
+ jmp instruction_ready
+ fild_mem_16bit:
+ mov [base_code],0DFh
+ jmp instruction_ready
+ fild_mem_64bit:
+ mov al,[postbyte_register]
+ cmp al,1
+ je fisttp_64bit_store
+ jb fild_mem_64bit_store
+ dec [postbyte_register]
+ cmp al,3
+ je fild_mem_64bit_store
+ jmp invalid_operand_size
+ fild_mem_64bit_store:
+ add [postbyte_register],5
+ mov [base_code],0DFh
+ jmp instruction_ready
+ fisttp_64bit_store:
+ mov [base_code],0DDh
+ jmp instruction_ready
+fbld_instruction:
+ mov [postbyte_register],al
+ lods byte [esi]
+ call get_size_operator
+ cmp al,'['
+ jne invalid_operand
+ call get_address
+ mov al,[operand_size]
+ or al,al
+ jz fbld_mem_80bit
+ cmp al,10
+ je fbld_mem_80bit
+ jmp invalid_operand_size
+ fbld_mem_80bit:
+ mov [base_code],0DFh
+ jmp instruction_ready
+faddp_instruction:
+ mov [postbyte_register],al
+ mov [base_code],0DEh
+ mov edx,esi
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ je faddp_streg
+ mov esi,edx
+ mov bl,1
+ jmp nomem_instruction_ready
+ faddp_streg:
+ lods byte [esi]
+ call convert_fpu_register
+ mov bl,al
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_fpu_register
+ or al,al
+ jnz invalid_operand
+ jmp nomem_instruction_ready
+fcompp_instruction:
+ mov ax,0D9DEh
+ stos word [edi]
+ jmp instruction_assembled
+fucompp_instruction:
+ mov ax,0E9DAh
+ stos word [edi]
+ jmp instruction_assembled
+fxch_instruction:
+ mov dx,01D9h
+ jmp fpu_single_operand
+ffreep_instruction:
+ mov dx,00DFh
+ jmp fpu_single_operand
+ffree_instruction:
+ mov dl,0DDh
+ mov dh,al
+ fpu_single_operand:
+ mov ebx,esi
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ je fpu_streg
+ or dh,dh
+ jz invalid_operand
+ mov esi,ebx
+ shl dh,3
+ or dh,11000001b
+ mov ax,dx
+ stos word [edi]
+ jmp instruction_assembled
+ fpu_streg:
+ lods byte [esi]
+ call convert_fpu_register
+ shl dh,3
+ or dh,al
+ or dh,11000000b
+ mov ax,dx
+ stos word [edi]
+ jmp instruction_assembled
+
+fstenv_instruction:
+ mov byte [edi],9Bh
+ inc edi
+fldenv_instruction:
+ mov [base_code],0D9h
+ jmp fpu_mem
+fstenv_instruction_16bit:
+ mov byte [edi],9Bh
+ inc edi
+fldenv_instruction_16bit:
+ call operand_16bit
+ jmp fldenv_instruction
+fstenv_instruction_32bit:
+ mov byte [edi],9Bh
+ inc edi
+fldenv_instruction_32bit:
+ call operand_32bit
+ jmp fldenv_instruction
+fsave_instruction_32bit:
+ mov byte [edi],9Bh
+ inc edi
+fnsave_instruction_32bit:
+ call operand_32bit
+ jmp fnsave_instruction
+fsave_instruction_16bit:
+ mov byte [edi],9Bh
+ inc edi
+fnsave_instruction_16bit:
+ call operand_16bit
+ jmp fnsave_instruction
+fsave_instruction:
+ mov byte [edi],9Bh
+ inc edi
+fnsave_instruction:
+ mov [base_code],0DDh
+ fpu_mem:
+ mov [postbyte_register],al
+ lods byte [esi]
+ call get_size_operator
+ cmp al,'['
+ jne invalid_operand
+ call get_address
+ cmp [operand_size],0
+ jne invalid_operand_size
+ jmp instruction_ready
+fstcw_instruction:
+ mov byte [edi],9Bh
+ inc edi
+fldcw_instruction:
+ mov [postbyte_register],al
+ mov [base_code],0D9h
+ lods byte [esi]
+ call get_size_operator
+ cmp al,'['
+ jne invalid_operand
+ call get_address
+ mov al,[operand_size]
+ or al,al
+ jz fldcw_mem_16bit
+ cmp al,2
+ je fldcw_mem_16bit
+ jmp invalid_operand_size
+ fldcw_mem_16bit:
+ jmp instruction_ready
+fstsw_instruction:
+ mov al,9Bh
+ stos byte [edi]
+fnstsw_instruction:
+ mov [base_code],0DDh
+ mov [postbyte_register],7
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ je fstsw_reg
+ cmp al,'['
+ jne invalid_operand
+ call get_address
+ mov al,[operand_size]
+ or al,al
+ jz fstsw_mem_16bit
+ cmp al,2
+ je fstsw_mem_16bit
+ jmp invalid_operand_size
+ fstsw_mem_16bit:
+ jmp instruction_ready
+ fstsw_reg:
+ lods byte [esi]
+ call convert_register
+ cmp ax,0200h
+ jne invalid_operand
+ mov ax,0E0DFh
+ stos word [edi]
+ jmp instruction_assembled
+finit_instruction:
+ mov byte [edi],9Bh
+ inc edi
+fninit_instruction:
+ mov ah,al
+ mov al,0DBh
+ stos word [edi]
+ jmp instruction_assembled
+fcmov_instruction:
+ mov dh,0DAh
+ jmp fcomi_streg
+fcomi_instruction:
+ mov dh,0DBh
+ jmp fcomi_streg
+fcomip_instruction:
+ mov dh,0DFh
+ fcomi_streg:
+ mov dl,al
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_fpu_register
+ mov ah,al
+ cmp byte [esi],','
+ je fcomi_st0_streg
+ add ah,dl
+ mov al,dh
+ stos word [edi]
+ jmp instruction_assembled
+ fcomi_st0_streg:
+ or ah,ah
+ jnz invalid_operand
+ inc esi
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_fpu_register
+ mov ah,al
+ add ah,dl
+ mov al,dh
+ stos word [edi]
+ jmp instruction_assembled
+
+basic_mmx_instruction:
+ mov [base_code],0Fh
+ mov [extended_code],al
+ mmx_instruction:
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_mmx_register
+ call make_mmx_prefix
+ mov [postbyte_register],al
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ je mmx_mmreg_mmreg
+ cmp al,'['
+ jne invalid_operand
+ mmx_mmreg_mem:
+ call get_address
+ jmp instruction_ready
+ mmx_mmreg_mmreg:
+ lods byte [esi]
+ call convert_mmx_register
+ mov bl,al
+ jmp nomem_instruction_ready
+mmx_bit_shift_instruction:
+ mov [base_code],0Fh
+ mov [extended_code],al
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_mmx_register
+ call make_mmx_prefix
+ mov [postbyte_register],al
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ mov [operand_size],0
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ je mmx_mmreg_mmreg
+ cmp al,'('
+ je mmx_ps_mmreg_imm8
+ cmp al,'['
+ je mmx_mmreg_mem
+ jmp invalid_operand
+ mmx_ps_mmreg_imm8:
+ call get_byte_value
+ mov byte [value],al
+ test [operand_size],not 1
+ jnz invalid_value
+ mov bl,[extended_code]
+ mov al,bl
+ shr bl,4
+ and al,1111b
+ add al,70h
+ mov [extended_code],al
+ sub bl,0Ch
+ shl bl,1
+ xchg bl,[postbyte_register]
+ call store_nomem_instruction
+ mov al,byte [value]
+ stos byte [edi]
+ jmp instruction_assembled
+pmovmskb_instruction:
+ mov [base_code],0Fh
+ mov [extended_code],al
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_register
+ cmp ah,4
+ je pmovmskb_reg_size_ok
+ cmp [code_type],64
+ jne invalid_operand_size
+ cmp ah,8
+ jnz invalid_operand_size
+ pmovmskb_reg_size_ok:
+ mov [postbyte_register],al
+ mov [operand_size],0
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_mmx_register
+ mov bl,al
+ call make_mmx_prefix
+ cmp [extended_code],0C5h
+ je mmx_nomem_imm8
+ jmp nomem_instruction_ready
+ mmx_imm8:
+ push ebx ecx edx
+ xor cl,cl
+ xchg cl,[operand_size]
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ test ah,not 1
+ jnz invalid_operand_size
+ mov [operand_size],cl
+ cmp al,'('
+ jne invalid_operand
+ call get_byte_value
+ mov byte [value],al
+ pop edx ecx ebx
+ call store_instruction_with_imm8
+ jmp instruction_assembled
+ mmx_nomem_imm8:
+ call store_nomem_instruction
+ call append_imm8
+ jmp instruction_assembled
+ append_imm8:
+ mov [operand_size],0
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ test ah,not 1
+ jnz invalid_operand_size
+ cmp al,'('
+ jne invalid_operand
+ call get_byte_value
+ stosb
+ ret
+pinsrw_instruction:
+ mov [extended_code],al
+ mov [base_code],0Fh
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_mmx_register
+ call make_mmx_prefix
+ mov [postbyte_register],al
+ mov [operand_size],0
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ je pinsrw_mmreg_reg
+ cmp al,'['
+ jne invalid_operand
+ call get_address
+ cmp [operand_size],0
+ je mmx_imm8
+ cmp [operand_size],2
+ jne invalid_operand_size
+ jmp mmx_imm8
+ pinsrw_mmreg_reg:
+ lods byte [esi]
+ call convert_register
+ cmp ah,4
+ jne invalid_operand_size
+ mov bl,al
+ jmp mmx_nomem_imm8
+pshufw_instruction:
+ mov [mmx_size],8
+ mov [opcode_prefix],al
+ jmp pshuf_instruction
+pshufd_instruction:
+ mov [mmx_size],16
+ mov [opcode_prefix],al
+ pshuf_instruction:
+ mov [base_code],0Fh
+ mov [extended_code],70h
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_mmx_register
+ cmp ah,[mmx_size]
+ jne invalid_operand_size
+ mov [postbyte_register],al
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ je pshuf_mmreg_mmreg
+ cmp al,'['
+ jne invalid_operand
+ call get_address
+ jmp mmx_imm8
+ pshuf_mmreg_mmreg:
+ lods byte [esi]
+ call convert_mmx_register
+ mov bl,al
+ jmp mmx_nomem_imm8
+movd_instruction:
+ mov [base_code],0Fh
+ mov [extended_code],7Eh
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ je movd_reg
+ cmp al,'['
+ jne invalid_operand
+ call get_address
+ test [operand_size],not 4
+ jnz invalid_operand_size
+ mov [operand_size],0
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_mmx_register
+ call make_mmx_prefix
+ mov [postbyte_register],al
+ jmp instruction_ready
+ movd_reg:
+ lods byte [esi]
+ cmp al,0B0h
+ jae movd_mmreg
+ call convert_register
+ cmp ah,4
+ jne invalid_operand_size
+ mov [operand_size],0
+ mov bl,al
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_mmx_register
+ mov [postbyte_register],al
+ call make_mmx_prefix
+ jmp nomem_instruction_ready
+ movd_mmreg:
+ mov [extended_code],6Eh
+ call convert_mmx_register
+ call make_mmx_prefix
+ mov [postbyte_register],al
+ mov [operand_size],0
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ je movd_mmreg_reg
+ cmp al,'['
+ jne invalid_operand
+ call get_address
+ test [operand_size],not 4
+ jnz invalid_operand_size
+ jmp instruction_ready
+ movd_mmreg_reg:
+ lods byte [esi]
+ call convert_register
+ cmp ah,4
+ jne invalid_operand_size
+ mov bl,al
+ jmp nomem_instruction_ready
+ make_mmx_prefix:
+ cmp [vex_required],0
+ jne mmx_prefix_for_vex
+ cmp [operand_size],16
+ jne no_mmx_prefix
+ mov [operand_prefix],66h
+ no_mmx_prefix:
+ ret
+ mmx_prefix_for_vex:
+ cmp [operand_size],16
+ jne invalid_operand
+ mov [opcode_prefix],66h
+ ret
+movq_instruction:
+ mov [base_code],0Fh
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ je movq_reg
+ cmp al,'['
+ jne invalid_operand
+ call get_address
+ test [operand_size],not 8
+ jnz invalid_operand_size
+ mov [operand_size],0
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_mmx_register
+ mov [postbyte_register],al
+ cmp ah,16
+ je movq_mem_xmmreg
+ mov [extended_code],7Fh
+ jmp instruction_ready
+ movq_mem_xmmreg:
+ mov [extended_code],0D6h
+ mov [opcode_prefix],66h
+ jmp instruction_ready
+ movq_reg:
+ lods byte [esi]
+ cmp al,0B0h
+ jae movq_mmreg
+ call convert_register
+ cmp ah,8
+ jne invalid_operand_size
+ mov bl,al
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ mov [operand_size],0
+ lods byte [esi]
+ call convert_mmx_register
+ mov [postbyte_register],al
+ call make_mmx_prefix
+ mov [extended_code],7Eh
+ call operand_64bit
+ jmp nomem_instruction_ready
+ movq_mmreg:
+ call convert_mmx_register
+ mov [postbyte_register],al
+ mov [extended_code],6Fh
+ mov [mmx_size],ah
+ cmp ah,16
+ jne movq_mmreg_
+ mov [extended_code],7Eh
+ mov [opcode_prefix],0F3h
+ movq_mmreg_:
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ mov [operand_size],0
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ je movq_mmreg_reg
+ call get_address
+ test [operand_size],not 8
+ jnz invalid_operand_size
+ jmp instruction_ready
+ movq_mmreg_reg:
+ lods byte [esi]
+ cmp al,0B0h
+ jae movq_mmreg_mmreg
+ mov [operand_size],0
+ call convert_register
+ cmp ah,8
+ jne invalid_operand_size
+ mov [extended_code],6Eh
+ mov [opcode_prefix],0
+ mov bl,al
+ cmp [mmx_size],16
+ jne movq_mmreg_reg_store
+ mov [opcode_prefix],66h
+ movq_mmreg_reg_store:
+ call operand_64bit
+ jmp nomem_instruction_ready
+ movq_mmreg_mmreg:
+ call convert_mmx_register
+ cmp ah,[mmx_size]
+ jne invalid_operand_size
+ mov bl,al
+ jmp nomem_instruction_ready
+movdq_instruction:
+ mov [opcode_prefix],al
+ mov [base_code],0Fh
+ mov [extended_code],6Fh
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ je movdq_mmreg
+ cmp al,'['
+ jne invalid_operand
+ call get_address
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_xmm_register
+ mov [postbyte_register],al
+ mov [extended_code],7Fh
+ jmp instruction_ready
+ movdq_mmreg:
+ lods byte [esi]
+ call convert_xmm_register
+ mov [postbyte_register],al
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ je movdq_mmreg_mmreg
+ cmp al,'['
+ jne invalid_operand
+ call get_address
+ jmp instruction_ready
+ movdq_mmreg_mmreg:
+ lods byte [esi]
+ call convert_xmm_register
+ mov bl,al
+ jmp nomem_instruction_ready
+lddqu_instruction:
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_xmm_register
+ push eax
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ cmp al,'['
+ jne invalid_operand
+ call get_address
+ pop eax
+ mov [postbyte_register],al
+ mov [opcode_prefix],0F2h
+ mov [base_code],0Fh
+ mov [extended_code],0F0h
+ jmp instruction_ready
+
+movdq2q_instruction:
+ mov [opcode_prefix],0F2h
+ mov [mmx_size],8
+ jmp movq2dq_
+movq2dq_instruction:
+ mov [opcode_prefix],0F3h
+ mov [mmx_size],16
+ movq2dq_:
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_mmx_register
+ cmp ah,[mmx_size]
+ jne invalid_operand_size
+ mov [postbyte_register],al
+ mov [operand_size],0
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_mmx_register
+ xor [mmx_size],8+16
+ cmp ah,[mmx_size]
+ jne invalid_operand_size
+ mov bl,al
+ mov [base_code],0Fh
+ mov [extended_code],0D6h
+ jmp nomem_instruction_ready
+
+sse_ps_instruction_imm8:
+ mov [immediate_size],1
+sse_ps_instruction:
+ mov [mmx_size],16
+ jmp sse_instruction
+sse_pd_instruction_imm8:
+ mov [immediate_size],1
+sse_pd_instruction:
+ mov [mmx_size],16
+ mov [opcode_prefix],66h
+ jmp sse_instruction
+sse_ss_instruction:
+ mov [mmx_size],4
+ mov [opcode_prefix],0F3h
+ jmp sse_instruction
+sse_sd_instruction:
+ mov [mmx_size],8
+ mov [opcode_prefix],0F2h
+ jmp sse_instruction
+cmp_pd_instruction:
+ mov [opcode_prefix],66h
+cmp_ps_instruction:
+ mov [mmx_size],16
+ mov byte [value],al
+ mov al,0C2h
+ jmp sse_instruction
+cmp_ss_instruction:
+ mov [mmx_size],4
+ mov [opcode_prefix],0F3h
+ jmp cmp_sx_instruction
+cmpsd_instruction:
+ mov al,0A7h
+ mov ah,[esi]
+ or ah,ah
+ jz simple_instruction_32bit
+ cmp ah,0Fh
+ je simple_instruction_32bit
+ mov al,-1
+cmp_sd_instruction:
+ mov [mmx_size],8
+ mov [opcode_prefix],0F2h
+ cmp_sx_instruction:
+ mov byte [value],al
+ mov al,0C2h
+ jmp sse_instruction
+comiss_instruction:
+ mov [mmx_size],4
+ jmp sse_instruction
+comisd_instruction:
+ mov [mmx_size],8
+ mov [opcode_prefix],66h
+ jmp sse_instruction
+cvtdq2pd_instruction:
+ mov [opcode_prefix],0F3h
+cvtps2pd_instruction:
+ mov [mmx_size],8
+ jmp sse_instruction
+cvtpd2dq_instruction:
+ mov [mmx_size],16
+ mov [opcode_prefix],0F2h
+ jmp sse_instruction
+movshdup_instruction:
+ mov [mmx_size],16
+ mov [opcode_prefix],0F3h
+sse_instruction:
+ mov [base_code],0Fh
+ mov [extended_code],al
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ sse_xmmreg:
+ lods byte [esi]
+ call convert_xmm_register
+ sse_reg:
+ mov [postbyte_register],al
+ mov [operand_size],0
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ je sse_xmmreg_xmmreg
+ sse_reg_mem:
+ cmp al,'['
+ jne invalid_operand
+ call get_address
+ cmp [operand_size],0
+ je sse_mem_size_ok
+ mov al,[mmx_size]
+ cmp [operand_size],al
+ jne invalid_operand_size
+ sse_mem_size_ok:
+ mov al,[extended_code]
+ mov ah,[supplemental_code]
+ cmp al,0C2h
+ je sse_cmp_mem_ok
+ cmp ax,443Ah
+ je sse_cmp_mem_ok
+ cmp [immediate_size],1
+ je mmx_imm8
+ cmp [immediate_size],-1
+ jne sse_ok
+ call take_additional_xmm0
+ mov [immediate_size],0
+ sse_ok:
+ jmp instruction_ready
+ sse_cmp_mem_ok:
+ cmp byte [value],-1
+ je mmx_imm8
+ call store_instruction_with_imm8
+ jmp instruction_assembled
+ sse_xmmreg_xmmreg:
+ cmp [operand_prefix],66h
+ jne sse_xmmreg_xmmreg_ok
+ cmp [extended_code],12h
+ je invalid_operand
+ cmp [extended_code],16h
+ je invalid_operand
+ sse_xmmreg_xmmreg_ok:
+ lods byte [esi]
+ call convert_xmm_register
+ mov bl,al
+ mov al,[extended_code]
+ mov ah,[supplemental_code]
+ cmp al,0C2h
+ je sse_cmp_nomem_ok
+ cmp ax,443Ah
+ je sse_cmp_nomem_ok
+ cmp [immediate_size],1
+ je mmx_nomem_imm8
+ cmp [immediate_size],-1
+ jne sse_nomem_ok
+ call take_additional_xmm0
+ mov [immediate_size],0
+ sse_nomem_ok:
+ jmp nomem_instruction_ready
+ sse_cmp_nomem_ok:
+ cmp byte [value],-1
+ je mmx_nomem_imm8
+ call store_nomem_instruction
+ mov al,byte [value]
+ stosb
+ jmp instruction_assembled
+ take_additional_xmm0:
+ cmp byte [esi],','
+ jne additional_xmm0_ok
+ inc esi
+ lods byte [esi]
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_xmm_register
+ test al,al
+ jnz invalid_operand
+ additional_xmm0_ok:
+ ret
+
+pslldq_instruction:
+ mov [postbyte_register],al
+ mov [opcode_prefix],66h
+ mov [base_code],0Fh
+ mov [extended_code],73h
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_xmm_register
+ mov bl,al
+ jmp mmx_nomem_imm8
+movpd_instruction:
+ mov [opcode_prefix],66h
+movps_instruction:
+ mov [base_code],0Fh
+ mov [extended_code],al
+ mov [mmx_size],16
+ jmp sse_mov_instruction
+movss_instruction:
+ mov [mmx_size],4
+ mov [opcode_prefix],0F3h
+ jmp sse_movs
+movsd_instruction:
+ mov al,0A5h
+ mov ah,[esi]
+ or ah,ah
+ jz simple_instruction_32bit
+ cmp ah,0Fh
+ je simple_instruction_32bit
+ mov [mmx_size],8
+ mov [opcode_prefix],0F2h
+ sse_movs:
+ mov [base_code],0Fh
+ mov [extended_code],10h
+ jmp sse_mov_instruction
+sse_mov_instruction:
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ je sse_xmmreg
+ sse_mem:
+ cmp al,'['
+ jne invalid_operand
+ inc [extended_code]
+ call get_address
+ cmp [operand_size],0
+ je sse_mem_xmmreg
+ mov al,[mmx_size]
+ cmp [operand_size],al
+ jne invalid_operand_size
+ mov [operand_size],0
+ sse_mem_xmmreg:
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_xmm_register
+ mov [postbyte_register],al
+ jmp instruction_ready
+movlpd_instruction:
+ mov [opcode_prefix],66h
+movlps_instruction:
+ mov [base_code],0Fh
+ mov [extended_code],al
+ mov [mmx_size],8
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne sse_mem
+ lods byte [esi]
+ call convert_xmm_register
+ mov [postbyte_register],al
+ mov [operand_size],0
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ jmp sse_reg_mem
+movhlps_instruction:
+ mov [base_code],0Fh
+ mov [extended_code],al
+ mov [mmx_size],0
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_xmm_register
+ mov [postbyte_register],al
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ je sse_xmmreg_xmmreg_ok
+ jmp invalid_operand
+maskmovq_instruction:
+ mov cl,8
+ jmp maskmov_instruction
+maskmovdqu_instruction:
+ mov cl,16
+ mov [opcode_prefix],66h
+ maskmov_instruction:
+ mov [base_code],0Fh
+ mov [extended_code],0F7h
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_mmx_register
+ cmp ah,cl
+ jne invalid_operand_size
+ mov [postbyte_register],al
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_mmx_register
+ mov bl,al
+ jmp nomem_instruction_ready
+movmskpd_instruction:
+ mov [opcode_prefix],66h
+movmskps_instruction:
+ mov [base_code],0Fh
+ mov [extended_code],50h
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_register
+ mov [postbyte_register],al
+ cmp ah,4
+ je movmskps_reg_ok
+ cmp ah,8
+ jne invalid_operand_size
+ cmp [code_type],64
+ jne invalid_operand
+ movmskps_reg_ok:
+ mov [operand_size],0
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ je sse_xmmreg_xmmreg_ok
+ jmp invalid_operand
+
+cvtpi2pd_instruction:
+ mov [opcode_prefix],66h
+cvtpi2ps_instruction:
+ mov [base_code],0Fh
+ mov [extended_code],al
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_xmm_register
+ mov [postbyte_register],al
+ mov [operand_size],0
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ je cvtpi_xmmreg_xmmreg
+ cmp al,'['
+ jne invalid_operand
+ call get_address
+ cmp [operand_size],0
+ je cvtpi_size_ok
+ cmp [operand_size],8
+ jne invalid_operand_size
+ cvtpi_size_ok:
+ jmp instruction_ready
+ cvtpi_xmmreg_xmmreg:
+ lods byte [esi]
+ call convert_mmx_register
+ cmp ah,8
+ jne invalid_operand_size
+ mov bl,al
+ jmp nomem_instruction_ready
+cvtsi2ss_instruction:
+ mov [opcode_prefix],0F3h
+ jmp cvtsi_instruction
+cvtsi2sd_instruction:
+ mov [opcode_prefix],0F2h
+ cvtsi_instruction:
+ mov [base_code],0Fh
+ mov [extended_code],al
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_xmm_register
+ mov [postbyte_register],al
+ cvtsi_xmmreg:
+ mov [operand_size],0
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ je cvtsi_xmmreg_reg
+ cmp al,'['
+ jne invalid_operand
+ call get_address
+ cmp [operand_size],0
+ je cvtsi_size_ok
+ cmp [operand_size],4
+ je cvtsi_size_ok
+ cmp [operand_size],8
+ jne invalid_operand_size
+ call operand_64bit
+ cvtsi_size_ok:
+ jmp instruction_ready
+ cvtsi_xmmreg_reg:
+ lods byte [esi]
+ call convert_register
+ cmp ah,4
+ je cvtsi_xmmreg_reg_store
+ cmp ah,8
+ jne invalid_operand_size
+ call operand_64bit
+ cvtsi_xmmreg_reg_store:
+ mov bl,al
+ jmp nomem_instruction_ready
+cvtps2pi_instruction:
+ mov [mmx_size],8
+ jmp cvtpd_instruction
+cvtpd2pi_instruction:
+ mov [opcode_prefix],66h
+ mov [mmx_size],16
+ cvtpd_instruction:
+ mov [base_code],0Fh
+ mov [extended_code],al
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_mmx_register
+ cmp ah,8
+ jne invalid_operand_size
+ mov [operand_size],0
+ jmp sse_reg
+cvtss2si_instruction:
+ mov [opcode_prefix],0F3h
+ mov [mmx_size],4
+ jmp cvt2si_instruction
+cvtsd2si_instruction:
+ mov [opcode_prefix],0F2h
+ mov [mmx_size],8
+ cvt2si_instruction:
+ mov [extended_code],al
+ mov [base_code],0Fh
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_register
+ mov [operand_size],0
+ cmp ah,4
+ je sse_reg
+ cmp ah,8
+ jne invalid_operand_size
+ call operand_64bit
+ jmp sse_reg
+
+ssse3_instruction:
+ mov [base_code],0Fh
+ mov [extended_code],38h
+ mov [supplemental_code],al
+ jmp mmx_instruction
+palignr_instruction:
+ mov [base_code],0Fh
+ mov [extended_code],3Ah
+ mov [supplemental_code],0Fh
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_mmx_register
+ call make_mmx_prefix
+ mov [postbyte_register],al
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ je palignr_mmreg_mmreg
+ cmp al,'['
+ jne invalid_operand
+ call get_address
+ jmp mmx_imm8
+ palignr_mmreg_mmreg:
+ lods byte [esi]
+ call convert_mmx_register
+ mov bl,al
+ jmp mmx_nomem_imm8
+amd3dnow_instruction:
+ mov [base_code],0Fh
+ mov [extended_code],0Fh
+ mov byte [value],al
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_mmx_register
+ cmp ah,8
+ jne invalid_operand_size
+ mov [postbyte_register],al
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ je amd3dnow_mmreg_mmreg
+ cmp al,'['
+ jne invalid_operand
+ call get_address
+ call store_instruction_with_imm8
+ jmp instruction_assembled
+ amd3dnow_mmreg_mmreg:
+ lods byte [esi]
+ call convert_mmx_register
+ cmp ah,8
+ jne invalid_operand_size
+ mov bl,al
+ call store_nomem_instruction
+ mov al,byte [value]
+ stos byte [edi]
+ jmp instruction_assembled
+
+sse4_instruction_38_xmm0:
+ mov [immediate_size],-1
+sse4_instruction_38:
+ mov [mmx_size],16
+ mov [opcode_prefix],66h
+ mov [supplemental_code],al
+ mov al,38h
+ jmp sse_instruction
+sse4_ss_instruction_3a_imm8:
+ mov [immediate_size],1
+ mov [mmx_size],4
+ jmp sse4_instruction_3a_setup
+sse4_sd_instruction_3a_imm8:
+ mov [immediate_size],1
+ mov [mmx_size],8
+ jmp sse4_instruction_3a_setup
+sse4_instruction_3a_imm8:
+ mov [immediate_size],1
+ mov [mmx_size],16
+ sse4_instruction_3a_setup:
+ mov [opcode_prefix],66h
+ mov [supplemental_code],al
+ mov al,3Ah
+ jmp sse_instruction
+pclmulqdq_instruction:
+ mov byte [value],al
+ mov [mmx_size],16
+ mov al,44h
+ jmp sse4_instruction_3a_setup
+extractps_instruction:
+ mov [opcode_prefix],66h
+ mov [base_code],0Fh
+ mov [extended_code],3Ah
+ mov [supplemental_code],17h
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ je extractps_reg
+ cmp al,'['
+ jne invalid_operand
+ call get_address
+ cmp [operand_size],4
+ je extractps_size_ok
+ cmp [operand_size],0
+ jne invalid_operand_size
+ extractps_size_ok:
+ push edx ebx ecx
+ mov [operand_size],0
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_xmm_register
+ mov [postbyte_register],al
+ pop ecx ebx edx
+ jmp mmx_imm8
+ extractps_reg:
+ lods byte [esi]
+ call convert_register
+ push eax
+ mov [operand_size],0
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_xmm_register
+ mov [postbyte_register],al
+ pop ebx
+ mov al,bh
+ cmp al,4
+ je mmx_nomem_imm8
+ cmp al,8
+ jne invalid_operand_size
+ call operand_64bit
+ jmp mmx_nomem_imm8
+insertps_instruction:
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_xmm_register
+ mov [postbyte_register],al
+ insertps_xmmreg:
+ mov [opcode_prefix],66h
+ mov [base_code],0Fh
+ mov [extended_code],3Ah
+ mov [supplemental_code],21h
+ mov [operand_size],0
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ je insertps_xmmreg_reg
+ cmp al,'['
+ jne invalid_operand
+ call get_address
+ cmp [operand_size],4
+ je insertps_size_ok
+ cmp [operand_size],0
+ jne invalid_operand_size
+ insertps_size_ok:
+ jmp mmx_imm8
+ insertps_xmmreg_reg:
+ lods byte [esi]
+ call convert_mmx_register
+ mov bl,al
+ jmp mmx_nomem_imm8
+pextrq_instruction:
+ mov [mmx_size],8
+ jmp pextr_instruction
+pextrd_instruction:
+ mov [mmx_size],4
+ jmp pextr_instruction
+pextrw_instruction:
+ mov [mmx_size],2
+ jmp pextr_instruction
+pextrb_instruction:
+ mov [mmx_size],1
+ pextr_instruction:
+ mov [opcode_prefix],66h
+ mov [base_code],0Fh
+ mov [extended_code],3Ah
+ mov [supplemental_code],al
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ je pextr_reg
+ cmp al,'['
+ jne invalid_operand
+ call get_address
+ mov al,[mmx_size]
+ cmp al,[operand_size]
+ je pextr_size_ok
+ cmp [operand_size],0
+ jne invalid_operand_size
+ pextr_size_ok:
+ cmp al,8
+ jne pextr_prefix_ok
+ call operand_64bit
+ pextr_prefix_ok:
+ push edx ebx ecx
+ mov [operand_size],0
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_xmm_register
+ mov [postbyte_register],al
+ pop ecx ebx edx
+ jmp mmx_imm8
+ pextr_reg:
+ lods byte [esi]
+ call convert_register
+ cmp [mmx_size],4
+ ja pextrq_reg
+ cmp ah,4
+ je pextr_reg_size_ok
+ cmp [code_type],64
+ jne pextr_invalid_size
+ cmp ah,8
+ je pextr_reg_size_ok
+ pextr_invalid_size:
+ jmp invalid_operand_size
+ pextrq_reg:
+ cmp ah,8
+ jne pextr_invalid_size
+ call operand_64bit
+ pextr_reg_size_ok:
+ mov [operand_size],0
+ push eax
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_mmx_register
+ mov ebx,eax
+ pop eax
+ mov [postbyte_register],al
+ mov al,ah
+ cmp [mmx_size],2
+ jne pextr_reg_store
+ mov [opcode_prefix],0
+ mov [extended_code],0C5h
+ call make_mmx_prefix
+ jmp mmx_nomem_imm8
+ pextr_reg_store:
+ cmp bh,16
+ jne invalid_operand_size
+ xchg bl,[postbyte_register]
+ call operand_autodetect
+ jmp mmx_nomem_imm8
+pinsrb_instruction:
+ mov [mmx_size],1
+ jmp pinsr_instruction
+pinsrd_instruction:
+ mov [mmx_size],4
+ jmp pinsr_instruction
+pinsrq_instruction:
+ mov [mmx_size],8
+ call operand_64bit
+ pinsr_instruction:
+ mov [opcode_prefix],66h
+ mov [base_code],0Fh
+ mov [extended_code],3Ah
+ mov [supplemental_code],al
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_xmm_register
+ mov [postbyte_register],al
+ pinsr_xmmreg:
+ mov [operand_size],0
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ je pinsr_xmmreg_reg
+ cmp al,'['
+ jne invalid_operand
+ call get_address
+ cmp [operand_size],0
+ je mmx_imm8
+ mov al,[mmx_size]
+ cmp al,[operand_size]
+ je mmx_imm8
+ jmp invalid_operand_size
+ pinsr_xmmreg_reg:
+ lods byte [esi]
+ call convert_register
+ mov bl,al
+ cmp [mmx_size],8
+ je pinsrq_xmmreg_reg
+ cmp ah,4
+ je mmx_nomem_imm8
+ jmp invalid_operand_size
+ pinsrq_xmmreg_reg:
+ cmp ah,8
+ je mmx_nomem_imm8
+ jmp invalid_operand_size
+pmovsxbw_instruction:
+ mov [mmx_size],8
+ jmp pmovsx_instruction
+pmovsxbd_instruction:
+ mov [mmx_size],4
+ jmp pmovsx_instruction
+pmovsxbq_instruction:
+ mov [mmx_size],2
+ jmp pmovsx_instruction
+pmovsxwd_instruction:
+ mov [mmx_size],8
+ jmp pmovsx_instruction
+pmovsxwq_instruction:
+ mov [mmx_size],4
+ jmp pmovsx_instruction
+pmovsxdq_instruction:
+ mov [mmx_size],8
+ pmovsx_instruction:
+ mov [opcode_prefix],66h
+ mov [base_code],0Fh
+ mov [extended_code],38h
+ mov [supplemental_code],al
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_xmm_register
+ mov [postbyte_register],al
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ mov [operand_size],0
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ je pmovsx_xmmreg_reg
+ cmp al,'['
+ jne invalid_operand
+ call get_address
+ cmp [operand_size],0
+ je instruction_ready
+ mov al,[mmx_size]
+ cmp al,[operand_size]
+ jne invalid_operand_size
+ jmp instruction_ready
+ pmovsx_xmmreg_reg:
+ lods byte [esi]
+ call convert_xmm_register
+ mov bl,al
+ jmp nomem_instruction_ready
+
+fxsave_instruction_64bit:
+ call operand_64bit
+fxsave_instruction:
+ mov [extended_code],0AEh
+ mov [base_code],0Fh
+ mov [postbyte_register],al
+ lods byte [esi]
+ call get_size_operator
+ cmp al,'['
+ jne invalid_operand
+ call get_address
+ mov ah,[operand_size]
+ or ah,ah
+ jz fxsave_size_ok
+ mov al,[postbyte_register]
+ cmp al,111b
+ je clflush_size_check
+ cmp al,10b
+ jb invalid_operand_size
+ cmp al,11b
+ ja invalid_operand_size
+ cmp ah,4
+ jne invalid_operand_size
+ jmp fxsave_size_ok
+ clflush_size_check:
+ cmp ah,1
+ jne invalid_operand_size
+ fxsave_size_ok:
+ jmp instruction_ready
+prefetch_instruction:
+ mov [extended_code],18h
+ prefetch_mem_8bit:
+ mov [base_code],0Fh
+ mov [postbyte_register],al
+ lods byte [esi]
+ call get_size_operator
+ cmp al,'['
+ jne invalid_operand
+ or ah,ah
+ jz prefetch_size_ok
+ cmp ah,1
+ jne invalid_operand_size
+ prefetch_size_ok:
+ call get_address
+ jmp instruction_ready
+amd_prefetch_instruction:
+ mov [extended_code],0Dh
+ jmp prefetch_mem_8bit
+fence_instruction:
+ mov bl,al
+ mov ax,0AE0Fh
+ stos word [edi]
+ mov al,bl
+ stos byte [edi]
+ jmp instruction_assembled
+pause_instruction:
+ mov ax,90F3h
+ stos word [edi]
+ jmp instruction_assembled
+movntq_instruction:
+ mov [mmx_size],8
+ jmp movnt_instruction
+movntpd_instruction:
+ mov [opcode_prefix],66h
+movntps_instruction:
+ mov [mmx_size],16
+ movnt_instruction:
+ mov [extended_code],al
+ mov [base_code],0Fh
+ lods byte [esi]
+ call get_size_operator
+ cmp al,'['
+ jne invalid_operand
+ call get_address
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_mmx_register
+ cmp ah,[mmx_size]
+ jne invalid_operand_size
+ mov [postbyte_register],al
+ jmp instruction_ready
+
+movntsd_instruction:
+ mov [opcode_prefix],0F2h
+ mov [mmx_size],8
+ jmp movnts_instruction
+movntss_instruction:
+ mov [opcode_prefix],0F3h
+ mov [mmx_size],4
+ movnts_instruction:
+ mov [extended_code],al
+ mov [base_code],0Fh
+ lods byte [esi]
+ call get_size_operator
+ cmp al,'['
+ jne invalid_operand
+ call get_address
+ mov al,[operand_size]
+ cmp al,[mmx_size]
+ je movnts_size_ok
+ test al,al
+ jnz invalid_operand_size
+ movnts_size_ok:
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ mov [operand_size],0
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_xmm_register
+ mov [postbyte_register],al
+ jmp instruction_ready
+
+movnti_instruction:
+ mov [base_code],0Fh
+ mov [extended_code],al
+ lods byte [esi]
+ call get_size_operator
+ cmp al,'['
+ jne invalid_operand
+ call get_address
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_register
+ cmp ah,4
+ je movnti_store
+ cmp ah,8
+ jne invalid_operand_size
+ call operand_64bit
+ movnti_store:
+ mov [postbyte_register],al
+ jmp instruction_ready
+monitor_instruction:
+ mov [postbyte_register],al
+ cmp byte [esi],0
+ je monitor_instruction_store
+ cmp byte [esi],0Fh
+ je monitor_instruction_store
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_register
+ cmp ax,0400h
+ jne invalid_operand
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_register
+ cmp ax,0401h
+ jne invalid_operand
+ cmp [postbyte_register],0C8h
+ jne monitor_instruction_store
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_register
+ cmp ax,0402h
+ jne invalid_operand
+ monitor_instruction_store:
+ mov ax,010Fh
+ stos word [edi]
+ mov al,[postbyte_register]
+ stos byte [edi]
+ jmp instruction_assembled
+movntdqa_instruction:
+ mov [opcode_prefix],66h
+ mov [base_code],0Fh
+ mov [extended_code],38h
+ mov [supplemental_code],al
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_xmm_register
+ mov [postbyte_register],al
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ cmp al,'['
+ jne invalid_operand
+ call get_address
+ jmp instruction_ready
+
+extrq_instruction:
+ mov [opcode_prefix],66h
+ mov [base_code],0Fh
+ mov [extended_code],78h
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_xmm_register
+ mov [postbyte_register],al
+ mov [operand_size],0
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ je extrq_xmmreg_xmmreg
+ test ah,not 1
+ jnz invalid_operand_size
+ cmp al,'('
+ jne invalid_operand
+ xor bl,bl
+ xchg bl,[postbyte_register]
+ call store_nomem_instruction
+ call get_byte_value
+ stosb
+ call append_imm8
+ jmp instruction_assembled
+ extrq_xmmreg_xmmreg:
+ inc [extended_code]
+ lods byte [esi]
+ call convert_xmm_register
+ mov bl,al
+ jmp nomem_instruction_ready
+insertq_instruction:
+ mov [opcode_prefix],0F2h
+ mov [base_code],0Fh
+ mov [extended_code],78h
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_xmm_register
+ mov [postbyte_register],al
+ mov [operand_size],0
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_xmm_register
+ mov bl,al
+ cmp byte [esi],','
+ je insertq_with_imm
+ inc [extended_code]
+ jmp nomem_instruction_ready
+ insertq_with_imm:
+ call store_nomem_instruction
+ call append_imm8
+ call append_imm8
+ jmp instruction_assembled
+
+crc32_instruction:
+ mov [opcode_prefix],0F2h
+ mov [base_code],0Fh
+ mov [extended_code],38h
+ mov [supplemental_code],0F0h
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_register
+ mov [postbyte_register],al
+ cmp ah,8
+ je crc32_reg64
+ cmp ah,4
+ jne invalid_operand
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ mov [operand_size],0
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ je crc32_reg32_reg
+ cmp al,'['
+ jne invalid_operand
+ call get_address
+ mov al,[operand_size]
+ test al,al
+ jz crc32_unknown_size
+ cmp al,1
+ je crc32_reg32_mem_store
+ cmp al,4
+ ja invalid_operand_size
+ inc [supplemental_code]
+ call operand_autodetect
+ crc32_reg32_mem_store:
+ jmp instruction_ready
+ crc32_unknown_size:
+ call recoverable_unknown_size
+ jmp crc32_reg32_mem_store
+ crc32_reg32_reg:
+ lods byte [esi]
+ call convert_register
+ mov bl,al
+ mov al,ah
+ cmp al,1
+ je crc32_reg32_reg_store
+ cmp al,4
+ ja invalid_operand_size
+ inc [supplemental_code]
+ call operand_autodetect
+ crc32_reg32_reg_store:
+ jmp nomem_instruction_ready
+ crc32_reg64:
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ mov [operand_size],0
+ call operand_64bit
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ je crc32_reg64_reg
+ cmp al,'['
+ jne invalid_operand
+ call get_address
+ mov ah,[operand_size]
+ mov al,8
+ test ah,ah
+ jz crc32_unknown_size
+ cmp ah,1
+ je crc32_reg32_mem_store
+ cmp ah,al
+ jne invalid_operand_size
+ inc [supplemental_code]
+ jmp crc32_reg32_mem_store
+ crc32_reg64_reg:
+ lods byte [esi]
+ call convert_register
+ mov bl,al
+ mov al,8
+ cmp ah,1
+ je crc32_reg32_reg_store
+ cmp ah,al
+ jne invalid_operand_size
+ inc [supplemental_code]
+ jmp crc32_reg32_reg_store
+popcnt_instruction:
+ mov [opcode_prefix],0F3h
+ jmp bs_instruction
+movbe_instruction:
+ mov [supplemental_code],al
+ mov [extended_code],38h
+ mov [base_code],0Fh
+ lods byte [esi]
+ call get_size_operator
+ cmp al,'['
+ je movbe_mem
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_register
+ mov [postbyte_register],al
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ cmp al,'['
+ jne invalid_argument
+ call get_address
+ mov al,[operand_size]
+ call operand_autodetect
+ jmp instruction_ready
+ movbe_mem:
+ inc [supplemental_code]
+ call get_address
+ push edx ebx ecx
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_register
+ mov [postbyte_register],al
+ pop ecx ebx edx
+ mov al,[operand_size]
+ call operand_autodetect
+ jmp instruction_ready
+adx_instruction:
+ mov [base_code],0Fh
+ mov [extended_code],38h
+ mov [supplemental_code],0F6h
+ mov [operand_prefix],al
+ call get_reg_mem
+ jc adx_reg_reg
+ mov al,[operand_size]
+ cmp al,4
+ je instruction_ready
+ cmp al,8
+ jne invalid_operand_size
+ call operand_64bit
+ jmp instruction_ready
+ adx_reg_reg:
+ cmp ah,4
+ je nomem_instruction_ready
+ cmp ah,8
+ jne invalid_operand_size
+ call operand_64bit
+ jmp nomem_instruction_ready
+
+simple_vmx_instruction:
+ mov ah,al
+ mov al,0Fh
+ stos byte [edi]
+ mov al,1
+ stos word [edi]
+ jmp instruction_assembled
+vmclear_instruction:
+ mov [opcode_prefix],66h
+ jmp vmx_instruction
+vmxon_instruction:
+ mov [opcode_prefix],0F3h
+vmx_instruction:
+ mov [postbyte_register],al
+ mov [extended_code],0C7h
+ lods byte [esi]
+ call get_size_operator
+ cmp al,'['
+ jne invalid_operand
+ call get_address
+ mov al,[operand_size]
+ or al,al
+ jz vmx_size_ok
+ cmp al,8
+ jne invalid_operand_size
+ vmx_size_ok:
+ mov [base_code],0Fh
+ jmp instruction_ready
+vmread_instruction:
+ mov [extended_code],78h
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ je vmread_nomem
+ cmp al,'['
+ jne invalid_operand
+ call get_address
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_register
+ mov [postbyte_register],al
+ call vmread_check_size
+ jmp vmx_size_ok
+ vmread_nomem:
+ lods byte [esi]
+ call convert_register
+ push eax
+ call vmread_check_size
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_register
+ mov [postbyte_register],al
+ call vmread_check_size
+ pop ebx
+ mov [base_code],0Fh
+ jmp nomem_instruction_ready
+ vmread_check_size:
+ cmp [code_type],64
+ je vmread_long
+ cmp [operand_size],4
+ jne invalid_operand_size
+ ret
+ vmread_long:
+ cmp [operand_size],8
+ jne invalid_operand_size
+ ret
+vmwrite_instruction:
+ mov [extended_code],79h
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_register
+ mov [postbyte_register],al
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ je vmwrite_nomem
+ cmp al,'['
+ jne invalid_operand
+ call get_address
+ call vmread_check_size
+ jmp vmx_size_ok
+ vmwrite_nomem:
+ lods byte [esi]
+ call convert_register
+ mov bl,al
+ mov [base_code],0Fh
+ jmp nomem_instruction_ready
+vmx_inv_instruction:
+ mov [opcode_prefix],66h
+ mov [extended_code],38h
+ mov [supplemental_code],al
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_register
+ mov [postbyte_register],al
+ call vmread_check_size
+ mov [operand_size],0
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ cmp al,'['
+ jne invalid_operand
+ call get_address
+ mov al,[operand_size]
+ or al,al
+ jz vmx_size_ok
+ cmp al,16
+ jne invalid_operand_size
+ jmp vmx_size_ok
+simple_svm_instruction:
+ push eax
+ mov [base_code],0Fh
+ mov [extended_code],1
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_register
+ or al,al
+ jnz invalid_operand
+ simple_svm_detect_size:
+ cmp ah,2
+ je simple_svm_16bit
+ cmp ah,4
+ je simple_svm_32bit
+ cmp [code_type],64
+ jne invalid_operand_size
+ jmp simple_svm_store
+ simple_svm_16bit:
+ cmp [code_type],16
+ je simple_svm_store
+ cmp [code_type],64
+ je invalid_operand_size
+ jmp prefixed_svm_store
+ simple_svm_32bit:
+ cmp [code_type],32
+ je simple_svm_store
+ prefixed_svm_store:
+ mov al,67h
+ stos byte [edi]
+ simple_svm_store:
+ call store_instruction_code
+ pop eax
+ stos byte [edi]
+ jmp instruction_assembled
+skinit_instruction:
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_register
+ cmp ax,0400h
+ jne invalid_operand
+ mov al,0DEh
+ jmp simple_vmx_instruction
+invlpga_instruction:
+ push eax
+ mov [base_code],0Fh
+ mov [extended_code],1
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_register
+ or al,al
+ jnz invalid_operand
+ mov bl,ah
+ mov [operand_size],0
+ lods byte [esi]
+ cmp al,','
+ jne invalid_operand
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_register
+ cmp ax,0401h
+ jne invalid_operand
+ mov ah,bl
+ jmp simple_svm_detect_size
+
+rdrand_instruction:
+ mov [base_code],0Fh
+ mov [extended_code],0C7h
+ mov [postbyte_register],al
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_register
+ mov bl,al
+ mov al,ah
+ call operand_autodetect
+ jmp nomem_instruction_ready
+rdfsbase_instruction:
+ cmp [code_type],64
+ jne illegal_instruction
+ mov [opcode_prefix],0F3h
+ mov [base_code],0Fh
+ mov [extended_code],0AEh
+ mov [postbyte_register],al
+ lods byte [esi]
+ call get_size_operator
+ cmp al,10h
+ jne invalid_operand
+ lods byte [esi]
+ call convert_register
+ mov bl,al
+ mov al,ah
+ cmp ah,2
+ je invalid_operand_size
+ call operand_autodetect
+ jmp nomem_instruction_ready
+
+xabort_instruction:
+ lods byte [esi]
+ call get_size_operator
+ cmp ah,1
+ ja invalid_operand_size
+ cmp al,'('
+ jne invalid_operand
+ call get_byte_value
+ mov dl,al
+ mov ax,0F8C6h
+ stos word [edi]
+ mov al,dl
+ stos byte [edi]
+ jmp instruction_assembled
+xbegin_instruction:
+ lods byte [esi]
+ cmp al,'('
+ jne invalid_operand
+ mov al,[code_type]
+ cmp al,64
+ je xbegin_64bit
+ cmp al,32
+ je xbegin_32bit
+ xbegin_16bit:
+ call get_address_word_value
+ add edi,4
+ mov ebp,[addressing_space]
+ call calculate_relative_offset
+ sub edi,4
+ shl eax,16
+ mov ax,0F8C7h
+ stos dword [edi]
+ jmp instruction_assembled
+ xbegin_32bit:
+ call get_address_dword_value
+ jmp xbegin_address_ok
+ xbegin_64bit:
+ call get_address_qword_value
+ xbegin_address_ok:
+ add edi,5
+ mov ebp,[addressing_space]
+ call calculate_relative_offset
+ sub edi,5
+ mov edx,eax
+ cwde
+ cmp eax,edx
+ jne xbegin_rel32
+ mov al,66h
+ stos byte [edi]
+ mov eax,edx
+ shl eax,16
+ mov ax,0F8C7h
+ stos dword [edi]
+ jmp instruction_assembled
+ xbegin_rel32:
+ sub edx,1
+ jno xbegin_rel32_ok
+ cmp [code_type],64
+ je relative_jump_out_of_range
+ xbegin_rel32_ok:
+ mov ax,0F8C7h
+ stos word [edi]
+ mov eax,edx
+ stos dword [edi]
+ jmp instruction_assembled
+
+convert_register:
+ mov ah,al
+ shr ah,4
+ and al,0Fh
+ cmp ah,8
+ je match_register_size
+ cmp ah,4
+ ja invalid_operand
+ cmp ah,1
+ ja match_register_size
+ cmp al,4
+ jb match_register_size
+ or ah,ah
+ jz high_byte_register
+ or [rex_prefix],40h
+ match_register_size:
+ cmp ah,[operand_size]
+ je register_size_ok
+ cmp [operand_size],0
+ jne operand_sizes_do_not_match
+ mov [operand_size],ah
+ register_size_ok:
+ ret
+ high_byte_register:
+ mov ah,1
+ or [rex_prefix],80h
+ jmp match_register_size
+convert_fpu_register:
+ mov ah,al
+ shr ah,4
+ and al,111b
+ cmp ah,10
+ jne invalid_operand
+ jmp match_register_size
+convert_mmx_register:
+ mov ah,al
+ shr ah,4
+ cmp ah,0Ch
+ je xmm_register
+ ja invalid_operand
+ and al,111b
+ cmp ah,0Bh
+ jne invalid_operand
+ mov ah,8
+ cmp [vex_required],0
+ jne invalid_operand
+ jmp match_register_size
+ xmm_register:
+ and al,0Fh
+ mov ah,16
+ cmp al,8
+ jb match_register_size
+ cmp [code_type],64
+ jne invalid_operand
+ jmp match_register_size
+convert_xmm_register:
+ mov ah,al
+ shr ah,4
+ cmp ah,0Ch
+ je xmm_register
+ jmp invalid_operand
+get_size_operator:
+ xor ah,ah
+ cmp al,11h
+ jne no_size_operator
+ mov [size_declared],1
+ lods word [esi]
+ xchg al,ah
+ mov [size_override],1
+ cmp ah,[operand_size]
+ je size_operator_ok
+ cmp [operand_size],0
+ jne operand_sizes_do_not_match
+ mov [operand_size],ah
+ size_operator_ok:
+ ret
+ no_size_operator:
+ mov [size_declared],0
+ cmp al,'['
+ jne size_operator_ok
+ mov [size_override],0
+ ret
+get_jump_operator:
+ mov [jump_type],0
+ cmp al,12h
+ jne jump_operator_ok
+ lods word [esi]
+ mov [jump_type],al
+ mov al,ah
+ jump_operator_ok:
+ ret
+get_address:
+ mov [segment_register],0
+ mov [address_size],0
+ mov [free_address_range],0
+ mov al,[code_type]
+ shr al,3
+ mov [value_size],al
+ mov al,[esi]
+ and al,11110000b
+ cmp al,60h
+ jne get_size_prefix
+ lods byte [esi]
+ sub al,60h
+ mov [segment_register],al
+ mov al,[esi]
+ and al,11110000b
+ get_size_prefix:
+ cmp al,70h
+ jne address_size_prefix_ok
+ lods byte [esi]
+ sub al,70h
+ cmp al,2
+ jb invalid_address_size
+ cmp al,8
+ ja invalid_address_size
+ mov [address_size],al
+ mov [value_size],al
+ address_size_prefix_ok:
+ call calculate_address
+ cmp byte [esi-1],']'
+ jne invalid_address
+ mov [address_high],edx
+ mov edx,eax
+ cmp [code_type],64
+ jne address_ok
+ or bx,bx
+ jnz address_ok
+ test ch,0Fh
+ jnz address_ok
+ calculate_relative_address:
+ mov edx,[address_symbol]
+ mov [symbol_identifier],edx
+ mov edx,[address_high]
+ mov ebp,[addressing_space]
+ call calculate_relative_offset
+ mov [address_high],edx
+ cdq
+ cmp edx,[address_high]
+ je address_high_ok
+ call recoverable_overflow
+ address_high_ok:
+ mov edx,eax
+ ror ecx,16
+ mov cl,[value_type]
+ rol ecx,16
+ mov bx,0FF00h
+ address_ok:
+ ret
+operand_16bit:
+ cmp [code_type],16
+ je size_prefix_ok
+ mov [operand_prefix],66h
+ ret
+operand_32bit:
+ cmp [code_type],16
+ jne size_prefix_ok
+ mov [operand_prefix],66h
+ size_prefix_ok:
+ ret
+operand_64bit:
+ cmp [code_type],64
+ jne illegal_instruction
+ or [rex_prefix],48h
+ ret
+operand_autodetect:
+ cmp al,2
+ je operand_16bit
+ cmp al,4
+ je operand_32bit
+ cmp al,8
+ je operand_64bit
+ jmp invalid_operand_size
+store_segment_prefix_if_necessary:
+ mov al,[segment_register]
+ or al,al
+ jz segment_prefix_ok
+ cmp al,4
+ ja segment_prefix_386
+ cmp [code_type],64
+ je segment_prefix_ok
+ cmp al,3
+ je ss_prefix
+ jb segment_prefix_86
+ cmp bl,25h
+ je segment_prefix_86
+ cmp bh,25h
+ je segment_prefix_86
+ cmp bh,45h
+ je segment_prefix_86
+ cmp bh,44h
+ je segment_prefix_86
+ ret
+ ss_prefix:
+ cmp bl,25h
+ je segment_prefix_ok
+ cmp bh,25h
+ je segment_prefix_ok
+ cmp bh,45h
+ je segment_prefix_ok
+ cmp bh,44h
+ je segment_prefix_ok
+ jmp segment_prefix_86
+store_segment_prefix:
+ mov al,[segment_register]
+ or al,al
+ jz segment_prefix_ok
+ cmp al,5
+ jae segment_prefix_386
+ segment_prefix_86:
+ dec al
+ shl al,3
+ add al,26h
+ stos byte [edi]
+ jmp segment_prefix_ok
+ segment_prefix_386:
+ add al,64h-5
+ stos byte [edi]
+ segment_prefix_ok:
+ ret
+store_instruction_code:
+ cmp [vex_required],0
+ jne store_vex_instruction_code
+ mov al,[operand_prefix]
+ or al,al
+ jz operand_prefix_ok
+ stos byte [edi]
+ operand_prefix_ok:
+ mov al,[opcode_prefix]
+ or al,al
+ jz opcode_prefix_ok
+ stos byte [edi]
+ opcode_prefix_ok:
+ mov al,[rex_prefix]
+ test al,40h
+ jz rex_prefix_ok
+ cmp [code_type],64
+ jne invalid_operand
+ test al,0B0h
+ jnz disallowed_combination_of_registers
+ stos byte [edi]
+ rex_prefix_ok:
+ mov al,[base_code]
+ stos byte [edi]
+ cmp al,0Fh
+ jne instruction_code_ok
+ store_extended_code:
+ mov al,[extended_code]
+ stos byte [edi]
+ cmp al,38h
+ je store_supplemental_code
+ cmp al,3Ah
+ je store_supplemental_code
+ instruction_code_ok:
+ ret
+ store_supplemental_code:
+ mov al,[supplemental_code]
+ stos byte [edi]
+ ret
+store_nomem_instruction:
+ test [postbyte_register],1000b
+ jz nomem_reg_code_ok
+ or [rex_prefix],44h
+ and [postbyte_register],111b
+ nomem_reg_code_ok:
+ test bl,1000b
+ jz nomem_rm_code_ok
+ or [rex_prefix],41h
+ and bl,111b
+ nomem_rm_code_ok:
+ call store_instruction_code
+ mov al,[postbyte_register]
+ shl al,3
+ or al,bl
+ or al,11000000b
+ stos byte [edi]
+ ret
+store_instruction:
+ mov [current_offset],edi
+ test [postbyte_register],1000b
+ jz reg_code_ok
+ or [rex_prefix],44h
+ and [postbyte_register],111b
+ reg_code_ok:
+ cmp [code_type],64
+ jne address_value_ok
+ xor eax,eax
+ bt edx,31
+ sbb eax,[address_high]
+ jz address_value_ok
+ cmp [address_high],0
+ jne address_value_out_of_range
+ test ch,44h
+ jnz address_value_ok
+ test bx,8080h
+ jz address_value_ok
+ address_value_out_of_range:
+ call recoverable_overflow
+ address_value_ok:
+ call store_segment_prefix_if_necessary
+ test [vex_required],4
+ jnz address_vsib
+ or bx,bx
+ jz address_immediate
+ cmp bx,0F800h
+ je address_rip_based
+ cmp bx,0F400h
+ je address_eip_based
+ cmp bx,0FF00h
+ je address_relative
+ mov al,bl
+ or al,bh
+ and al,11110000b
+ cmp al,80h
+ je postbyte_64bit
+ cmp al,40h
+ je postbyte_32bit
+ cmp al,20h
+ jne invalid_address
+ cmp [code_type],64
+ je invalid_address_size
+ call address_16bit_prefix
+ call store_instruction_code
+ cmp bl,bh
+ jbe determine_16bit_address
+ xchg bl,bh
+ determine_16bit_address:
+ cmp bx,2600h
+ je address_si
+ cmp bx,2700h
+ je address_di
+ cmp bx,2300h
+ je address_bx
+ cmp bx,2500h
+ je address_bp
+ cmp bx,2625h
+ je address_bp_si
+ cmp bx,2725h
+ je address_bp_di
+ cmp bx,2723h
+ je address_bx_di
+ cmp bx,2623h
+ jne invalid_address
+ address_bx_si:
+ xor al,al
+ jmp postbyte_16bit
+ address_bx_di:
+ mov al,1
+ jmp postbyte_16bit
+ address_bp_si:
+ mov al,10b
+ jmp postbyte_16bit
+ address_bp_di:
+ mov al,11b
+ jmp postbyte_16bit
+ address_si:
+ mov al,100b
+ jmp postbyte_16bit
+ address_di:
+ mov al,101b
+ jmp postbyte_16bit
+ address_bx:
+ mov al,111b
+ jmp postbyte_16bit
+ address_bp:
+ mov al,110b
+ postbyte_16bit:
+ test ch,22h
+ jnz address_16bit_value
+ or ch,ch
+ jnz address_sizes_do_not_agree
+ cmp edx,10000h
+ jge value_out_of_range
+ cmp edx,-8000h
+ jl value_out_of_range
+ or dx,dx
+ jz address
+ cmp dx,80h
+ jb address_8bit_value
+ cmp dx,-80h
+ jae address_8bit_value
+ address_16bit_value:
+ or al,10000000b
+ mov cl,[postbyte_register]
+ shl cl,3
+ or al,cl
+ stos byte [edi]
+ mov eax,edx
+ stos word [edi]
+ ret
+ address_8bit_value:
+ or al,01000000b
+ mov cl,[postbyte_register]
+ shl cl,3
+ or al,cl
+ stos byte [edi]
+ mov al,dl
+ stos byte [edi]
+ cmp dx,80h
+ jge value_out_of_range
+ cmp dx,-80h
+ jl value_out_of_range
+ ret
+ address:
+ cmp al,110b
+ je address_8bit_value
+ mov cl,[postbyte_register]
+ shl cl,3
+ or al,cl
+ stos byte [edi]
+ ret
+ address_vsib:
+ mov al,bl
+ shr al,4
+ cmp al,0Ch
+ je vector_index_ok
+ cmp al,0Dh
+ jne invalid_address
+ vector_index_ok:
+ mov al,bh
+ shr al,4
+ cmp al,4
+ je postbyte_32bit
+ cmp [code_type],64
+ je address_prefix_ok
+ test al,al
+ jnz invalid_address
+ postbyte_32bit:
+ call address_32bit_prefix
+ jmp address_prefix_ok
+ postbyte_64bit:
+ cmp [code_type],64
+ jne invalid_address_size
+ address_prefix_ok:
+ cmp bl,44h
+ je invalid_address
+ cmp bl,84h
+ je invalid_address
+ test bh,1000b
+ jz base_code_ok
+ or [rex_prefix],41h
+ base_code_ok:
+ test bl,1000b
+ jz index_code_ok
+ or [rex_prefix],42h
+ index_code_ok:
+ call store_instruction_code
+ or cl,cl
+ jz only_base_register
+ base_and_index:
+ mov al,100b
+ xor ah,ah
+ cmp cl,1
+ je scale_ok
+ cmp cl,2
+ je scale_1
+ cmp cl,4
+ je scale_2
+ or ah,11000000b
+ jmp scale_ok
+ scale_2:
+ or ah,10000000b
+ jmp scale_ok
+ scale_1:
+ or ah,01000000b
+ scale_ok:
+ or bh,bh
+ jz only_index_register
+ and bl,111b
+ shl bl,3
+ or ah,bl
+ and bh,111b
+ or ah,bh
+ sib_ready:
+ test ch,44h
+ jnz sib_address_32bit_value
+ test ch,88h
+ jnz sib_address_32bit_value
+ or ch,ch
+ jnz address_sizes_do_not_agree
+ cmp bh,5
+ je address_value
+ or edx,edx
+ jz sib_address
+ address_value:
+ cmp edx,80h
+ jb sib_address_8bit_value
+ cmp edx,-80h
+ jae sib_address_8bit_value
+ sib_address_32bit_value:
+ or al,10000000b
+ mov cl,[postbyte_register]
+ shl cl,3
+ or al,cl
+ stos word [edi]
+ jmp store_address_32bit_value
+ sib_address_8bit_value:
+ or al,01000000b
+ mov cl,[postbyte_register]
+ shl cl,3
+ or al,cl
+ stos word [edi]
+ mov al,dl
+ stos byte [edi]
+ cmp edx,80h
+ jge value_out_of_range
+ cmp edx,-80h
+ jl value_out_of_range
+ ret
+ sib_address:
+ mov cl,[postbyte_register]
+ shl cl,3
+ or al,cl
+ stos word [edi]
+ ret
+ only_index_register:
+ or ah,101b
+ and bl,111b
+ shl bl,3
+ or ah,bl
+ mov cl,[postbyte_register]
+ shl cl,3
+ or al,cl
+ stos word [edi]
+ test ch,44h
+ jnz store_address_32bit_value
+ test ch,88h
+ jnz store_address_32bit_value
+ or ch,ch
+ jnz invalid_address_size
+ jmp store_address_32bit_value
+ zero_index_register:
+ mov bl,4
+ mov cl,1
+ jmp base_and_index
+ only_base_register:
+ mov al,bh
+ and al,111b
+ cmp al,4
+ je zero_index_register
+ test ch,44h
+ jnz simple_address_32bit_value
+ test ch,88h
+ jnz simple_address_32bit_value
+ or ch,ch
+ jnz address_sizes_do_not_agree
+ or edx,edx
+ jz simple_address
+ cmp edx,80h
+ jb simple_address_8bit_value
+ cmp edx,-80h
+ jae simple_address_8bit_value
+ simple_address_32bit_value:
+ or al,10000000b
+ mov cl,[postbyte_register]
+ shl cl,3
+ or al,cl
+ stos byte [edi]
+ jmp store_address_32bit_value
+ simple_address_8bit_value:
+ or al,01000000b
+ mov cl,[postbyte_register]
+ shl cl,3
+ or al,cl
+ stos byte [edi]
+ mov al,dl
+ stos byte [edi]
+ cmp edx,80h
+ jge value_out_of_range
+ cmp edx,-80h
+ jl value_out_of_range
+ ret
+ simple_address:
+ cmp al,5
+ je simple_address_8bit_value
+ mov cl,[postbyte_register]
+ shl cl,3
+ or al,cl
+ stos byte [edi]
+ ret
+ address_immediate:
+ cmp [code_type],64
+ je address_immediate_sib
+ test ch,44h
+ jnz address_immediate_32bit
+ test ch,88h
+ jnz address_immediate_32bit
+ test ch,22h
+ jnz address_immediate_16bit
+ or ch,ch
+ jnz invalid_address_size
+ cmp [code_type],16
+ je addressing_16bit
+ address_immediate_32bit:
+ call address_32bit_prefix
+ call store_instruction_code
+ store_immediate_address:
+ mov al,101b
+ mov cl,[postbyte_register]
+ shl cl,3
+ or al,cl
+ stos byte [edi]
+ store_address_32bit_value:
+ test ch,0F0h
+ jz address_32bit_relocation_ok
+ mov eax,ecx
+ shr eax,16
+ cmp al,4
+ jne address_32bit_relocation
+ mov al,2
+ address_32bit_relocation:
+ xchg [value_type],al
+ mov ebx,[address_symbol]
+ xchg ebx,[symbol_identifier]
+ call mark_relocation
+ mov [value_type],al
+ mov [symbol_identifier],ebx
+ address_32bit_relocation_ok:
+ mov eax,edx
+ stos dword [edi]
+ ret
+ store_address_64bit_value:
+ test ch,0F0h
+ jz address_64bit_relocation_ok
+ mov eax,ecx
+ shr eax,16
+ xchg [value_type],al
+ mov ebx,[address_symbol]
+ xchg ebx,[symbol_identifier]
+ call mark_relocation
+ mov [value_type],al
+ mov [symbol_identifier],ebx
+ address_64bit_relocation_ok:
+ mov eax,edx
+ stos dword [edi]
+ mov eax,[address_high]
+ stos dword [edi]
+ ret
+ address_immediate_sib:
+ test ch,44h
+ jnz address_immediate_sib_32bit
+ test ch,not 88h
+ jnz invalid_address_size
+ address_immediate_sib_store:
+ call store_instruction_code
+ mov al,100b
+ mov ah,100101b
+ mov cl,[postbyte_register]
+ shl cl,3
+ or al,cl
+ stos word [edi]
+ jmp store_address_32bit_value
+ address_immediate_sib_32bit:
+ test ecx,0FF0000h
+ jnz address_immediate_sib_nosignextend
+ test edx,80000000h
+ jz address_immediate_sib_store
+ address_immediate_sib_nosignextend:
+ call address_32bit_prefix
+ jmp address_immediate_sib_store
+ address_eip_based:
+ mov al,67h
+ stos byte [edi]
+ address_rip_based:
+ cmp [code_type],64
+ jne invalid_address
+ call store_instruction_code
+ jmp store_immediate_address
+ address_relative:
+ call store_instruction_code
+ movzx eax,[immediate_size]
+ add eax,edi
+ sub eax,[current_offset]
+ add eax,5
+ sub edx,eax
+ jo value_out_of_range
+ mov al,101b
+ mov cl,[postbyte_register]
+ shl cl,3
+ or al,cl
+ stos byte [edi]
+ shr ecx,16
+ xchg [value_type],cl
+ mov ebx,[address_symbol]
+ xchg ebx,[symbol_identifier]
+ mov eax,edx
+ call mark_relocation
+ mov [value_type],cl
+ mov [symbol_identifier],ebx
+ stos dword [edi]
+ ret
+ addressing_16bit:
+ cmp edx,10000h
+ jge address_immediate_32bit
+ cmp edx,-8000h
+ jl address_immediate_32bit
+ movzx edx,dx
+ address_immediate_16bit:
+ call address_16bit_prefix
+ call store_instruction_code
+ mov al,110b
+ mov cl,[postbyte_register]
+ shl cl,3
+ or al,cl
+ stos byte [edi]
+ mov eax,edx
+ stos word [edi]
+ cmp edx,10000h
+ jge value_out_of_range
+ cmp edx,-8000h
+ jl value_out_of_range
+ ret
+ address_16bit_prefix:
+ cmp [code_type],16
+ je instruction_prefix_ok
+ mov al,67h
+ stos byte [edi]
+ ret
+ address_32bit_prefix:
+ cmp [code_type],32
+ je instruction_prefix_ok
+ mov al,67h
+ stos byte [edi]
+ instruction_prefix_ok:
+ ret
+store_instruction_with_imm8:
+ mov [immediate_size],1
+ call store_instruction
+ mov al,byte [value]
+ stos byte [edi]
+ ret
+store_instruction_with_imm16:
+ mov [immediate_size],2
+ call store_instruction
+ mov ax,word [value]
+ call mark_relocation
+ stos word [edi]
+ ret
+store_instruction_with_imm32:
+ mov [immediate_size],4
+ call store_instruction
+ mov eax,dword [value]
+ call mark_relocation
+ stos dword [edi]
+ ret
diff --git a/samples/C++/epoll_reactor.ipp b/samples/C++/epoll_reactor.ipp
new file mode 100644
index 00000000..5d592aff
--- /dev/null
+++ b/samples/C++/epoll_reactor.ipp
@@ -0,0 +1,664 @@
+//
+// detail/impl/epoll_reactor.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2013 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef BOOST_ASIO_DETAIL_IMPL_EPOLL_REACTOR_IPP
+#define BOOST_ASIO_DETAIL_IMPL_EPOLL_REACTOR_IPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+# pragma once
+#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#include
+
+#if defined(BOOST_ASIO_HAS_EPOLL)
+
+#include
+#include
+#include
+#include
+#include
+
+#if defined(BOOST_ASIO_HAS_TIMERFD)
+# include
+#endif // defined(BOOST_ASIO_HAS_TIMERFD)
+
+#include
+
+namespace boost {
+namespace asio {
+namespace detail {
+
+epoll_reactor::epoll_reactor(boost::asio::io_service& io_service)
+ : boost::asio::detail::service_base(io_service),
+ io_service_(use_service(io_service)),
+ mutex_(),
+ interrupter_(),
+ epoll_fd_(do_epoll_create()),
+ timer_fd_(do_timerfd_create()),
+ shutdown_(false)
+{
+ // Add the interrupter's descriptor to epoll.
+ epoll_event ev = { 0, { 0 } };
+ ev.events = EPOLLIN | EPOLLERR | EPOLLET;
+ ev.data.ptr = &interrupter_;
+ epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, interrupter_.read_descriptor(), &ev);
+ interrupter_.interrupt();
+
+ // Add the timer descriptor to epoll.
+ if (timer_fd_ != -1)
+ {
+ ev.events = EPOLLIN | EPOLLERR;
+ ev.data.ptr = &timer_fd_;
+ epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, timer_fd_, &ev);
+ }
+}
+
+epoll_reactor::~epoll_reactor()
+{
+ if (epoll_fd_ != -1)
+ close(epoll_fd_);
+ if (timer_fd_ != -1)
+ close(timer_fd_);
+}
+
+void epoll_reactor::shutdown_service()
+{
+ mutex::scoped_lock lock(mutex_);
+ shutdown_ = true;
+ lock.unlock();
+
+ op_queue ops;
+
+ while (descriptor_state* state = registered_descriptors_.first())
+ {
+ for (int i = 0; i < max_ops; ++i)
+ ops.push(state->op_queue_[i]);
+ state->shutdown_ = true;
+ registered_descriptors_.free(state);
+ }
+
+ timer_queues_.get_all_timers(ops);
+
+ io_service_.abandon_operations(ops);
+}
+
+void epoll_reactor::fork_service(boost::asio::io_service::fork_event fork_ev)
+{
+ if (fork_ev == boost::asio::io_service::fork_child)
+ {
+ if (epoll_fd_ != -1)
+ ::close(epoll_fd_);
+ epoll_fd_ = -1;
+ epoll_fd_ = do_epoll_create();
+
+ if (timer_fd_ != -1)
+ ::close(timer_fd_);
+ timer_fd_ = -1;
+ timer_fd_ = do_timerfd_create();
+
+ interrupter_.recreate();
+
+ // Add the interrupter's descriptor to epoll.
+ epoll_event ev = { 0, { 0 } };
+ ev.events = EPOLLIN | EPOLLERR | EPOLLET;
+ ev.data.ptr = &interrupter_;
+ epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, interrupter_.read_descriptor(), &ev);
+ interrupter_.interrupt();
+
+ // Add the timer descriptor to epoll.
+ if (timer_fd_ != -1)
+ {
+ ev.events = EPOLLIN | EPOLLERR;
+ ev.data.ptr = &timer_fd_;
+ epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, timer_fd_, &ev);
+ }
+
+ update_timeout();
+
+ // Re-register all descriptors with epoll.
+ mutex::scoped_lock descriptors_lock(registered_descriptors_mutex_);
+ for (descriptor_state* state = registered_descriptors_.first();
+ state != 0; state = state->next_)
+ {
+ ev.events = state->registered_events_;
+ ev.data.ptr = state;
+ int result = epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, state->descriptor_, &ev);
+ if (result != 0)
+ {
+ boost::system::error_code ec(errno,
+ boost::asio::error::get_system_category());
+ boost::asio::detail::throw_error(ec, "epoll re-registration");
+ }
+ }
+ }
+}
+
+void epoll_reactor::init_task()
+{
+ io_service_.init_task();
+}
+
+int epoll_reactor::register_descriptor(socket_type descriptor,
+ epoll_reactor::per_descriptor_data& descriptor_data)
+{
+ descriptor_data = allocate_descriptor_state();
+
+ {
+ mutex::scoped_lock descriptor_lock(descriptor_data->mutex_);
+
+ descriptor_data->reactor_ = this;
+ descriptor_data->descriptor_ = descriptor;
+ descriptor_data->shutdown_ = false;
+ }
+
+ epoll_event ev = { 0, { 0 } };
+ ev.events = EPOLLIN | EPOLLERR | EPOLLHUP | EPOLLPRI | EPOLLET;
+ descriptor_data->registered_events_ = ev.events;
+ ev.data.ptr = descriptor_data;
+ int result = epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, descriptor, &ev);
+ if (result != 0)
+ return errno;
+
+ return 0;
+}
+
+int epoll_reactor::register_internal_descriptor(
+ int op_type, socket_type descriptor,
+ epoll_reactor::per_descriptor_data& descriptor_data, reactor_op* op)
+{
+ descriptor_data = allocate_descriptor_state();
+
+ {
+ mutex::scoped_lock descriptor_lock(descriptor_data->mutex_);
+
+ descriptor_data->reactor_ = this;
+ descriptor_data->descriptor_ = descriptor;
+ descriptor_data->shutdown_ = false;
+ descriptor_data->op_queue_[op_type].push(op);
+ }
+
+ epoll_event ev = { 0, { 0 } };
+ ev.events = EPOLLIN | EPOLLERR | EPOLLHUP | EPOLLPRI | EPOLLET;
+ descriptor_data->registered_events_ = ev.events;
+ ev.data.ptr = descriptor_data;
+ int result = epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, descriptor, &ev);
+ if (result != 0)
+ return errno;
+
+ return 0;
+}
+
+void epoll_reactor::move_descriptor(socket_type,
+ epoll_reactor::per_descriptor_data& target_descriptor_data,
+ epoll_reactor::per_descriptor_data& source_descriptor_data)
+{
+ target_descriptor_data = source_descriptor_data;
+ source_descriptor_data = 0;
+}
+
+void epoll_reactor::start_op(int op_type, socket_type descriptor,
+ epoll_reactor::per_descriptor_data& descriptor_data, reactor_op* op,
+ bool is_continuation, bool allow_speculative)
+{
+ if (!descriptor_data)
+ {
+ op->ec_ = boost::asio::error::bad_descriptor;
+ post_immediate_completion(op, is_continuation);
+ return;
+ }
+
+ mutex::scoped_lock descriptor_lock(descriptor_data->mutex_);
+
+ if (descriptor_data->shutdown_)
+ {
+ post_immediate_completion(op, is_continuation);
+ return;
+ }
+
+ if (descriptor_data->op_queue_[op_type].empty())
+ {
+ if (allow_speculative
+ && (op_type != read_op
+ || descriptor_data->op_queue_[except_op].empty()))
+ {
+ if (op->perform())
+ {
+ descriptor_lock.unlock();
+ io_service_.post_immediate_completion(op, is_continuation);
+ return;
+ }
+
+ if (op_type == write_op)
+ {
+ if ((descriptor_data->registered_events_ & EPOLLOUT) == 0)
+ {
+ epoll_event ev = { 0, { 0 } };
+ ev.events = descriptor_data->registered_events_ | EPOLLOUT;
+ ev.data.ptr = descriptor_data;
+ if (epoll_ctl(epoll_fd_, EPOLL_CTL_MOD, descriptor, &ev) == 0)
+ {
+ descriptor_data->registered_events_ |= ev.events;
+ }
+ else
+ {
+ op->ec_ = boost::system::error_code(errno,
+ boost::asio::error::get_system_category());
+ io_service_.post_immediate_completion(op, is_continuation);
+ return;
+ }
+ }
+ }
+ }
+ else
+ {
+ if (op_type == write_op)
+ {
+ descriptor_data->registered_events_ |= EPOLLOUT;
+ }
+
+ epoll_event ev = { 0, { 0 } };
+ ev.events = descriptor_data->registered_events_;
+ ev.data.ptr = descriptor_data;
+ epoll_ctl(epoll_fd_, EPOLL_CTL_MOD, descriptor, &ev);
+ }
+ }
+
+ descriptor_data->op_queue_[op_type].push(op);
+ io_service_.work_started();
+}
+
+void epoll_reactor::cancel_ops(socket_type,
+ epoll_reactor::per_descriptor_data& descriptor_data)
+{
+ if (!descriptor_data)
+ return;
+
+ mutex::scoped_lock descriptor_lock(descriptor_data->mutex_);
+
+ op_queue ops;
+ for (int i = 0; i < max_ops; ++i)
+ {
+ while (reactor_op* op = descriptor_data->op_queue_[i].front())
+ {
+ op->ec_ = boost::asio::error::operation_aborted;
+ descriptor_data->op_queue_[i].pop();
+ ops.push(op);
+ }
+ }
+
+ descriptor_lock.unlock();
+
+ io_service_.post_deferred_completions(ops);
+}
+
+void epoll_reactor::deregister_descriptor(socket_type descriptor,
+ epoll_reactor::per_descriptor_data& descriptor_data, bool closing)
+{
+ if (!descriptor_data)
+ return;
+
+ mutex::scoped_lock descriptor_lock(descriptor_data->mutex_);
+
+ if (!descriptor_data->shutdown_)
+ {
+ if (closing)
+ {
+ // The descriptor will be automatically removed from the epoll set when
+ // it is closed.
+ }
+ else
+ {
+ epoll_event ev = { 0, { 0 } };
+ epoll_ctl(epoll_fd_, EPOLL_CTL_DEL, descriptor, &ev);
+ }
+
+ op_queue ops;
+ for (int i = 0; i < max_ops; ++i)
+ {
+ while (reactor_op* op = descriptor_data->op_queue_[i].front())
+ {
+ op->ec_ = boost::asio::error::operation_aborted;
+ descriptor_data->op_queue_[i].pop();
+ ops.push(op);
+ }
+ }
+
+ descriptor_data->descriptor_ = -1;
+ descriptor_data->shutdown_ = true;
+
+ descriptor_lock.unlock();
+
+ free_descriptor_state(descriptor_data);
+ descriptor_data = 0;
+
+ io_service_.post_deferred_completions(ops);
+ }
+}
+
+void epoll_reactor::deregister_internal_descriptor(socket_type descriptor,
+ epoll_reactor::per_descriptor_data& descriptor_data)
+{
+ if (!descriptor_data)
+ return;
+
+ mutex::scoped_lock descriptor_lock(descriptor_data->mutex_);
+
+ if (!descriptor_data->shutdown_)
+ {
+ epoll_event ev = { 0, { 0 } };
+ epoll_ctl(epoll_fd_, EPOLL_CTL_DEL, descriptor, &ev);
+
+ op_queue ops;
+ for (int i = 0; i < max_ops; ++i)
+ ops.push(descriptor_data->op_queue_[i]);
+
+ descriptor_data->descriptor_ = -1;
+ descriptor_data->shutdown_ = true;
+
+ descriptor_lock.unlock();
+
+ free_descriptor_state(descriptor_data);
+ descriptor_data = 0;
+ }
+}
+
+void epoll_reactor::run(bool block, op_queue& ops)
+{
+ // This code relies on the fact that the task_io_service queues the reactor
+ // task behind all descriptor operations generated by this function. This
+ // means, that by the time we reach this point, any previously returned
+ // descriptor operations have already been dequeued. Therefore it is now safe
+ // for us to reuse and return them for the task_io_service to queue again.
+
+ // Calculate a timeout only if timerfd is not used.
+ int timeout;
+ if (timer_fd_ != -1)
+ timeout = block ? -1 : 0;
+ else
+ {
+ mutex::scoped_lock lock(mutex_);
+ timeout = block ? get_timeout() : 0;
+ }
+
+ // Block on the epoll descriptor.
+ epoll_event events[128];
+ int num_events = epoll_wait(epoll_fd_, events, 128, timeout);
+
+#if defined(BOOST_ASIO_HAS_TIMERFD)
+ bool check_timers = (timer_fd_ == -1);
+#else // defined(BOOST_ASIO_HAS_TIMERFD)
+ bool check_timers = true;
+#endif // defined(BOOST_ASIO_HAS_TIMERFD)
+
+ // Dispatch the waiting events.
+ for (int i = 0; i < num_events; ++i)
+ {
+ void* ptr = events[i].data.ptr;
+ if (ptr == &interrupter_)
+ {
+ // No need to reset the interrupter since we're leaving the descriptor
+ // in a ready-to-read state and relying on edge-triggered notifications
+ // to make it so that we only get woken up when the descriptor's epoll
+ // registration is updated.
+
+#if defined(BOOST_ASIO_HAS_TIMERFD)
+ if (timer_fd_ == -1)
+ check_timers = true;
+#else // defined(BOOST_ASIO_HAS_TIMERFD)
+ check_timers = true;
+#endif // defined(BOOST_ASIO_HAS_TIMERFD)
+ }
+#if defined(BOOST_ASIO_HAS_TIMERFD)
+ else if (ptr == &timer_fd_)
+ {
+ check_timers = true;
+ }
+#endif // defined(BOOST_ASIO_HAS_TIMERFD)
+ else
+ {
+ // The descriptor operation doesn't count as work in and of itself, so we
+ // don't call work_started() here. This still allows the io_service to
+ // stop if the only remaining operations are descriptor operations.
+ descriptor_state* descriptor_data = static_cast(ptr);
+ descriptor_data->set_ready_events(events[i].events);
+ ops.push(descriptor_data);
+ }
+ }
+
+ if (check_timers)
+ {
+ mutex::scoped_lock common_lock(mutex_);
+ timer_queues_.get_ready_timers(ops);
+
+#if defined(BOOST_ASIO_HAS_TIMERFD)
+ if (timer_fd_ != -1)
+ {
+ itimerspec new_timeout;
+ itimerspec old_timeout;
+ int flags = get_timeout(new_timeout);
+ timerfd_settime(timer_fd_, flags, &new_timeout, &old_timeout);
+ }
+#endif // defined(BOOST_ASIO_HAS_TIMERFD)
+ }
+}
+
+void epoll_reactor::interrupt()
+{
+ epoll_event ev = { 0, { 0 } };
+ ev.events = EPOLLIN | EPOLLERR | EPOLLET;
+ ev.data.ptr = &interrupter_;
+ epoll_ctl(epoll_fd_, EPOLL_CTL_MOD, interrupter_.read_descriptor(), &ev);
+}
+
+int epoll_reactor::do_epoll_create()
+{
+#if defined(EPOLL_CLOEXEC)
+ int fd = epoll_create1(EPOLL_CLOEXEC);
+#else // defined(EPOLL_CLOEXEC)
+ int fd = -1;
+ errno = EINVAL;
+#endif // defined(EPOLL_CLOEXEC)
+
+ if (fd == -1 && (errno == EINVAL || errno == ENOSYS))
+ {
+ fd = epoll_create(epoll_size);
+ if (fd != -1)
+ ::fcntl(fd, F_SETFD, FD_CLOEXEC);
+ }
+
+ if (fd == -1)
+ {
+ boost::system::error_code ec(errno,
+ boost::asio::error::get_system_category());
+ boost::asio::detail::throw_error(ec, "epoll");
+ }
+
+ return fd;
+}
+
+int epoll_reactor::do_timerfd_create()
+{
+#if defined(BOOST_ASIO_HAS_TIMERFD)
+# if defined(TFD_CLOEXEC)
+ int fd = timerfd_create(CLOCK_MONOTONIC, TFD_CLOEXEC);
+# else // defined(TFD_CLOEXEC)
+ int fd = -1;
+ errno = EINVAL;
+# endif // defined(TFD_CLOEXEC)
+
+ if (fd == -1 && errno == EINVAL)
+ {
+ fd = timerfd_create(CLOCK_MONOTONIC, 0);
+ if (fd != -1)
+ ::fcntl(fd, F_SETFD, FD_CLOEXEC);
+ }
+
+ return fd;
+#else // defined(BOOST_ASIO_HAS_TIMERFD)
+ return -1;
+#endif // defined(BOOST_ASIO_HAS_TIMERFD)
+}
+
+epoll_reactor::descriptor_state* epoll_reactor::allocate_descriptor_state()
+{
+ mutex::scoped_lock descriptors_lock(registered_descriptors_mutex_);
+ return registered_descriptors_.alloc();
+}
+
+void epoll_reactor::free_descriptor_state(epoll_reactor::descriptor_state* s)
+{
+ mutex::scoped_lock descriptors_lock(registered_descriptors_mutex_);
+ registered_descriptors_.free(s);
+}
+
+void epoll_reactor::do_add_timer_queue(timer_queue_base& queue)
+{
+ mutex::scoped_lock lock(mutex_);
+ timer_queues_.insert(&queue);
+}
+
+void epoll_reactor::do_remove_timer_queue(timer_queue_base& queue)
+{
+ mutex::scoped_lock lock(mutex_);
+ timer_queues_.erase(&queue);
+}
+
+void epoll_reactor::update_timeout()
+{
+#if defined(BOOST_ASIO_HAS_TIMERFD)
+ if (timer_fd_ != -1)
+ {
+ itimerspec new_timeout;
+ itimerspec old_timeout;
+ int flags = get_timeout(new_timeout);
+ timerfd_settime(timer_fd_, flags, &new_timeout, &old_timeout);
+ return;
+ }
+#endif // defined(BOOST_ASIO_HAS_TIMERFD)
+ interrupt();
+}
+
+int epoll_reactor::get_timeout()
+{
+ // By default we will wait no longer than 5 minutes. This will ensure that
+ // any changes to the system clock are detected after no longer than this.
+ return timer_queues_.wait_duration_msec(5 * 60 * 1000);
+}
+
+#if defined(BOOST_ASIO_HAS_TIMERFD)
+int epoll_reactor::get_timeout(itimerspec& ts)
+{
+ ts.it_interval.tv_sec = 0;
+ ts.it_interval.tv_nsec = 0;
+
+ long usec = timer_queues_.wait_duration_usec(5 * 60 * 1000 * 1000);
+ ts.it_value.tv_sec = usec / 1000000;
+ ts.it_value.tv_nsec = usec ? (usec % 1000000) * 1000 : 1;
+
+ return usec ? 0 : TFD_TIMER_ABSTIME;
+}
+#endif // defined(BOOST_ASIO_HAS_TIMERFD)
+
+struct epoll_reactor::perform_io_cleanup_on_block_exit
+{
+ explicit perform_io_cleanup_on_block_exit(epoll_reactor* r)
+ : reactor_(r), first_op_(0)
+ {
+ }
+
+ ~perform_io_cleanup_on_block_exit()
+ {
+ if (first_op_)
+ {
+ // Post the remaining completed operations for invocation.
+ if (!ops_.empty())
+ reactor_->io_service_.post_deferred_completions(ops_);
+
+ // A user-initiated operation has completed, but there's no need to
+ // explicitly call work_finished() here. Instead, we'll take advantage of
+ // the fact that the task_io_service will call work_finished() once we
+ // return.
+ }
+ else
+ {
+ // No user-initiated operations have completed, so we need to compensate
+ // for the work_finished() call that the task_io_service will make once
+ // this operation returns.
+ reactor_->io_service_.work_started();
+ }
+ }
+
+ epoll_reactor* reactor_;
+ op_queue ops_;
+ operation* first_op_;
+};
+
+epoll_reactor::descriptor_state::descriptor_state()
+ : operation(&epoll_reactor::descriptor_state::do_complete)
+{
+}
+
+operation* epoll_reactor::descriptor_state::perform_io(uint32_t events)
+{
+ mutex_.lock();
+ perform_io_cleanup_on_block_exit io_cleanup(reactor_);
+ mutex::scoped_lock descriptor_lock(mutex_, mutex::scoped_lock::adopt_lock);
+
+ // Exception operations must be processed first to ensure that any
+ // out-of-band data is read before normal data.
+ static const int flag[max_ops] = { EPOLLIN, EPOLLOUT, EPOLLPRI };
+ for (int j = max_ops - 1; j >= 0; --j)
+ {
+ if (events & (flag[j] | EPOLLERR | EPOLLHUP))
+ {
+ while (reactor_op* op = op_queue_[j].front())
+ {
+ if (op->perform())
+ {
+ op_queue_[j].pop();
+ io_cleanup.ops_.push(op);
+ }
+ else
+ break;
+ }
+ }
+ }
+
+ // The first operation will be returned for completion now. The others will
+ // be posted for later by the io_cleanup object's destructor.
+ io_cleanup.first_op_ = io_cleanup.ops_.front();
+ io_cleanup.ops_.pop();
+ return io_cleanup.first_op_;
+}
+
+void epoll_reactor::descriptor_state::do_complete(
+ io_service_impl* owner, operation* base,
+ const boost::system::error_code& ec, std::size_t bytes_transferred)
+{
+ if (owner)
+ {
+ descriptor_state* descriptor_data = static_cast(base);
+ uint32_t events = static_cast(bytes_transferred);
+ if (operation* op = descriptor_data->perform_io(events))
+ {
+ op->complete(*owner, ec, 0);
+ }
+ }
+}
+
+} // namespace detail
+} // namespace asio
+} // namespace boost
+
+#include
+
+#endif // defined(BOOST_ASIO_HAS_EPOLL)
+
+#endif // BOOST_ASIO_DETAIL_IMPL_EPOLL_REACTOR_IPP
diff --git a/samples/Common Lisp/macros-advanced.cl b/samples/Common Lisp/macros-advanced.cl
new file mode 100644
index 00000000..b746d769
--- /dev/null
+++ b/samples/Common Lisp/macros-advanced.cl
@@ -0,0 +1,82 @@
+;; @file macros-advanced.cl
+;;
+;; @breif Advanced macro practices - defining your own macros
+;;
+;; Macro definition skeleton:
+;; (defmacro name (parameter*)
+;; "Optional documentation string"
+;; body-form*)
+;;
+;; Note that backquote expression is most often used in the `body-form`
+;;
+
+; `primep` test a number for prime
+(defun primep (n)
+ "test a number for prime"
+ (if (< n 2) (return-from primep))
+ (do ((i 2 (1+ i)) (p t (not (zerop (mod n i)))))
+ ((> i (sqrt n)) p)
+ (when (not p) (return))))
+; `next-prime` return the next prime bigger than the specified number
+(defun next-prime (n)
+ "return the next prime bigger than the speicified number"
+ (do ((i (1+ n) (1+ i)))
+ ((primep i) i)))
+;
+; The recommended procedures to writting a new macro are as follows:
+; 1. Write a sample call to the macro and the code it should expand into
+(do-primes (p 0 19)
+ (format t "~d " p))
+; Expected expanded codes
+(do ((p (next-prime (- 0 1)) (next-prime p)))
+ ((> p 19))
+ (format t "~d " p))
+; 2. Write code that generate the hardwritten expansion from the arguments in
+; the sample call
+(defmacro do-primes (var-and-range &rest body)
+ (let ((var (first var-and-range))
+ (start (second var-and-range))
+ (end (third var-and-range)))
+ `(do ((,var (next-prime (- ,start 1)) (next-prime ,var)))
+ ((> ,var ,end))
+ ,@body)))
+; 2-1. More concise implementations with the 'parameter list destructuring' and
+; '&body' synonym, it also emits more friendly messages on incorrent input.
+(defmacro do-primes ((var start end) &body body)
+ `(do ((,var (next-prime (- ,start 1)) (next-prime ,var)))
+ ((> ,var ,end))
+ ,@body))
+; 2-2. Test the result of macro expansion with the `macroexpand-1` function
+(macroexpand-1 '(do-primes (p 0 19) (format t "~d " p)))
+; 3. Make sure the macro abstraction does not "leak"
+(defmacro do-primes ((var start end) &body body)
+ (let ((end-value-name (gensym)))
+ `(do ((,var (next-prime (- ,start 1)) (next-prime ,var))
+ (,end-value-name ,end))
+ ((> ,var ,end-value-name))
+ ,@body)))
+; 3-1. Rules to observe to avoid common and possible leaks
+; a. include any subforms in the expansion in positions that will be evaluated
+; in the same order as the subforms appear in the macro call
+; b. make sure subforms are evaluated only once by creating a variable in the
+; expansion to hold the value of evaluating the argument form, and then
+; using that variable anywhere else the value is needed in the expansion
+; c. use `gensym` at macro expansion time to create variable names used in the
+; expansion
+;
+; Appendix I. Macro-writting macros, 'with-gensyms', to guranttee that rule c
+; gets observed.
+; Example usage of `with-gensyms`
+(defmacro do-primes-a ((var start end) &body body)
+ "do-primes implementation with macro-writting macro 'with-gensyms'"
+ (with-gensyms (end-value-name)
+ `(do ((,var (next-prime (- ,start 1)) (next-prime ,var))
+ (,end-value-name ,end))
+ ((> ,var ,end-value-name))
+ ,@body)))
+; Define the macro, note how comma is used to interpolate the value of the loop
+; expression
+(defmacro with-gensyms ((&rest names) &body body)
+ `(let ,(loop for n in names collect `(,n (gensym)))
+ ,@body)
+)
\ No newline at end of file
diff --git a/samples/Common Lisp/motor-inferencia.cl b/samples/Common Lisp/motor-inferencia.cl
new file mode 100644
index 00000000..6a2a97ea
--- /dev/null
+++ b/samples/Common Lisp/motor-inferencia.cl
@@ -0,0 +1,475 @@
+#|
+ESCUELA POLITECNICA SUPERIOR - UNIVERSIDAD AUTONOMA DE MADRID
+INTELIGENCIA ARTIFICIAL
+
+Motor de inferencia
+Basado en parte en "Paradigms of AI Programming: Case Studies
+in Common Lisp", de Peter Norvig, 1992
+|#
+
+
+;;;;;;;;;;;;;;;;;;;;;
+;;;; Global variables
+;;;;;;;;;;;;;;;;;;;;;
+
+
+(defvar *hypothesis-list*)
+(defvar *rule-list*)
+(defvar *fact-list*)
+
+;;;;;;;;;;;;;;;;;;;;;
+;;;; Constants
+;;;;;;;;;;;;;;;;;;;;;
+
+(defconstant +fail+ nil "Indicates unification failure")
+
+(defconstant +no-bindings+ '((nil))
+ "Indicates unification success, with no variables.")
+
+(defconstant *mundo-abierto* nil)
+
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;; Functions for the user
+;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+
+;; Resets *fact-list* to NIL
+(defun erase-facts () (setq *fact-list* nil))
+
+(defun set-hypothesis-list (h) (setq *hypothesis-list* h))
+
+
+;; Returns a list of solutions, each one satisfying all the hypothesis contained
+;; in *hypothesis-list*
+(defun motor-inferencia ()
+ (consulta *hypothesis-list*))
+
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;
+;;;; Auxiliary functions
+;;;;;;;;;;;;;;;;;;;;;;;;
+
+#|____________________________________________________________________________
+FUNCTION: CONSULTA
+
+COMMENTS:
+CONSULTA receives a list of hypothesis (variable ), and returns
+a list of binding lists (each binding list being a solution).
+
+EXAMPLES:
+hypotheses is:
+((brothers ?x ?y) (neighbours juan ?x)).
+
+That is, we are searching the brothers of the possible neighbors of Juan.
+
+The function can return in this case:
+
+(((?x . sergio) (?y . javier)) ((?x . julian) (?y . mario)) ((?x . julian) (?y . pedro))).
+That is, the neighbors of Juan (Sergio and Julian) have 3 brothers in total(Javier, Mario, Pedro)
+____________________________________________________________________________|#
+
+(defun consulta (hypotheses)
+ (if (null hypotheses) (list +no-bindings+)
+ (mapcan #'(lambda (b)
+ (mapcar #'(lambda (x) (une-bindings-con-bindings b x))
+ (consulta (subst-bindings b (rest hypotheses)))))
+ (find-hypothesis-value (first hypotheses)))))
+
+
+
+#|____________________________________________________________________________
+FUNCTION: FIND-HYPOTHESIS-VALUE
+
+COMMENTS:
+This function manages the query a single query (only one hypothesis) given a binding list.
+It tries (in the following order) to:
+- Answer the query from *fact-list*
+- Answer the query from the rules in *rule-list*
+- Ask the user
+
+The function returns a list of solutions (list of binding lists).
+
+EXAMPLES:
+If hypothesis is (brothers ?x ?y)
+and the function returns:
+(((?x . sergio) (?y . javier)) ((?x . julian) (?y . maria)) ((?x . alberto) (?y . pedro))).
+
+Means that Sergio and Javier and brothers, Julian and Mario are brothers, and Alberto and Pedro are brothers.
+____________________________________________________________________________|#
+
+(defun find-hypothesis-value (hypothesis)
+ (let (rules)
+ (cond
+ ((equality? hypothesis)
+ (value-from-equality hypothesis))
+ ((value-from-facts hypothesis))
+ ((setq good-rules (find-rules hypothesis))
+ (value-from-rules hypothesis good-rules))
+ (t (ask-user hypothesis)))))
+
+
+
+; une-bindings-con-bindings takes two binding lists and returns a binding list
+; Assumes that b1 and b2 are not +fail+
+(defun une-bindings-con-bindings (b1 b2)
+ (cond
+ ((equal b1 +no-bindings+) b2)
+ ((equal b2 +no-bindings+) b1)
+ (T (append b1 b2))))
+
+
+
+#|____________________________________________________________________________
+FUNCTION: VALUE-FROM-FACTS
+
+COMMENTS:
+Returns all the solutions of obtained directly from *fact-list*
+
+EXAMPLES:
+> (setf *fact-list* '((man luis) (man pedro)(woman mart)(man daniel)(woman laura)))
+
+> (value-from-facts '(man ?x))
+returns:
+
+(((?X . LUIS)) ((?X . PEDRO)) ((?X . DANIEL)))
+____________________________________________________________________________|#
+
+(defun value-from-facts (hypothesis)
+ (mapcan #'(lambda(x) (let ((aux (unify hypothesis x)))
+ (when aux (list aux)))) *fact-list*))
+
+
+
+
+#|____________________________________________________________________________
+FUNCTION: FIND-RULES
+
+COMMENTS:
+Returns the rules in *rule-list* whose THENs unify with the term given in
+The variables in the rules that satisfy this requirement are renamed.
+
+EXAMPLES:
+> (setq *rule-list*
+ '((R1 (pertenece ?E (?E . ?_)))
+ (R2 (pertenece ?E (?_ . ?Xs)) :- ((pertenece ?E ?Xs)))))
+
+Then:
+> (FIND-RULES (PERTENECE 1 (2 5)))
+returns:
+((R2 (PERTENECE ?E.1 (?_ . ?XS.2)) :- ((PERTENECE ?E.1 ?XS.2))))
+That is, only the THEN of rule R2 unify with
+
+However,
+> (FIND-RULES (PERTENECE 1 (1 6 7)))
+
+returns:
+((R1 (PERTENECE ?E.6 (?E.6 . ?_)))
+ (R2 (PERTENECE ?E.7 (?_ . ?XS.8)) :- ((PERTENECE ?E.7 ?XS.8))))
+So the THEN of both rules unify with
+____________________________________________________________________________|#
+
+(defun find-rules (hypothesis)
+ (mapcan #'(lambda(b) (let ((renamed-rule (rename-variables b)))
+ (when (in-then? hypothesis renamed-rule)
+ (list renamed-rule)))) *rule-list*))
+
+(defun in-then? (hypothesis rule)
+ (unless (null (rule-then rule))
+ (not (equal +fail+ (unify hypothesis (rule-then rule))))))
+
+
+
+#|____________________________________________________________________________
+FUNCTION: VALUE-FROM-RULES
+
+COMMENTS:
+Returns all the solutions to found using all the rules given in
+the list . Note that a single rule can have multiple solutions.
+____________________________________________________________________________|#
+(defun value-from-rules (hypothesis rules)
+ (mapcan #'(lambda (r) (eval-rule hypothesis r)) rules))
+
+(defun limpia-vinculos (termino bindings)
+ (unify termino (subst-bindings bindings termino)))
+
+
+#|____________________________________________________________________________
+FUNCTION: EVAL-RULE
+
+COMMENTS:
+Returns all the solutions found using the rule given as input argument.
+
+EXAMPLES:
+> (setq *rule-list*
+ '((R1 (pertenece ?E (?E . ?_)))
+ (R2 (pertenece ?E (?_ . ?Xs)) :- ((pertenece ?E ?Xs)))))
+Then:
+> (EVAL-RULE
+ (PERTENECE 1 (1 6 7))
+ (R1 (PERTENECE ?E.42 (?E.42 . ?_))))
+returns:
+(((NIL)))
+That is, the query (PERTENECE 1 (1 6 7)) can be proven from the given rule, and
+no binding in the variables in the query is necessary (in fact, the query has no variables).
+On the other hand:
+> (EVAL-RULE
+ (PERTENECE 1 (7))
+ (R2 (PERTENECE ?E.49 (?_ . ?XS.50)) :- ((PERTENECE ?E.49 ?XS.50))))
+returns:
+NIL
+That is, the query can not be proven from the rule R2.
+____________________________________________________________________________|#
+
+(defun eval-rule (hypothesis rule)
+ (let ((bindings-then
+ (unify (rule-then rule) hypothesis)))
+ (unless (equal +fail+ bindings-then)
+ (if (rule-ifs rule)
+ (mapcar #'(lambda(b) (limpia-vinculos hypothesis (append bindings-then b)))
+ (consulta (subst-bindings bindings-then (rule-ifs rule))))
+ (list (limpia-vinculos hypothesis bindings-then))))))
+
+
+(defun ask-user (hypothesis)
+ (let ((question hypothesis))
+ (cond
+ ((variables-in question) +fail+)
+ ((not-in-fact-list? question) +fail+)
+ (*mundo-abierto*
+ (format t "~%Es cierto el hecho ~S? (T/nil)" question)
+ (cond
+ ((read) (add-fact question) +no-bindings+)
+ (T (add-fact (list 'NOT question)) +fail+)))
+ (T +fail+))))
+
+
+; value-from-equality:
+(defun value-from-equality (hypothesis)
+ (let ((new-bindings (unify (second hypothesis) (third hypothesis))))
+ (if (not (equal +fail+ new-bindings))
+ (list new-bindings))))
+
+
+
+#|____________________________________________________________________________
+FUNCTION: UNIFY
+
+COMMENTS:
+Finds the most general unifier of two input expressions, taking into account the
+bindings specified in the input
+In case the two expressions can unify, the function returns the total bindings necessary
+for that unification. Otherwise, returns +fail+
+
+EXAMPLES:
+> (unify '1 '1)
+((NIL)) ;; which is the constant +no-bindings+
+> (unify 1 '2)
+nil ;; which is the constant +fail+
+> (unify '?x 1)
+((?x . 1))
+> (unify '(1 1) ?x)
+((? x 1 1))
+> (unify '?_ '?x)
+((NIL))
+> (unify '(p ?x 1 2) '(p ?y ?_ ?_))
+((?x . ?y))
+> (unify '(?a . ?_) '(1 2 3))
+((?a . 1))
+> (unify '(?_ ?_) '(1 2))
+((nil))
+> (unify '(?a . ?b) '(1 2 3))
+((?b 2 3) (?a . 1))
+> (unify '(?a . ?b) '(?v . ?d))
+((?b . ?d) (?a . ?v))
+> (unify '(?eval (+ 1 1)) '1)
+nil
+> (unify '(?eval (+ 1 1)) '2)
+(nil))
+____________________________________________________________________________|#
+
+(defun unify (x y &optional (bindings +no-bindings+))
+ "See if x and y match with given bindings. If they do,
+ return a binding list that would make them equal [p 303]."
+ (cond ((eq bindings +fail+) +fail+)
+ ((eql x y) bindings)
+ ((eval? x) (unify-eval x y bindings))
+ ((eval? y) (unify-eval y x bindings))
+ ((variable? x) (unify-var x y bindings))
+ ((variable? y) (unify-var y x bindings))
+ ((and (consp x) (consp y))
+ (unify (rest x) (rest y)
+ (unify (first x) (first y) bindings)))
+ (t +fail+)))
+
+
+;; rename-variables: renombra ?X por ?X.1, ?Y por ?Y.2 etc. salvo ?_ que no se renombra
+(defun rename-variables (x)
+ "Replace all variables in x with new ones. Excepto ?_"
+ (sublis (mapcar #'(lambda (var)
+ (if (anonymous-var? var)
+ (make-binding var var)
+ (make-binding var (new-variable var))))
+ (variables-in x))
+ x))
+
+
+
+;;;; Auxiliary Functions
+
+(defun unify-var (var x bindings)
+ "Unify var with x, using (and maybe extending) bindings [p 303]."
+ (cond ((or (anonymous-var? var)(anonymous-var? x)) bindings)
+ ((get-binding var bindings)
+ (unify (lookup var bindings) x bindings))
+ ((and (variable? x) (get-binding x bindings))
+ (unify var (lookup x bindings) bindings))
+ ((occurs-in? var x bindings)
+ +fail+)
+ (t (extend-bindings var x bindings))))
+
+(defun variable? (x)
+ "Is x a variable (a symbol starting with ?)?"
+ (and (symbolp x) (eql (char (symbol-name x) 0) #\?)))
+
+(defun get-binding (var bindings)
+ "Find a (variable . value) pair in a binding list."
+ (assoc var bindings))
+
+(defun binding-var (binding)
+ "Get the variable part of a single binding."
+ (car binding))
+
+(defun binding-val (binding)
+ "Get the value part of a single binding."
+ (cdr binding))
+
+(defun make-binding (var val) (cons var val))
+
+(defun lookup (var bindings)
+ "Get the value part (for var) from a binding list."
+ (binding-val (get-binding var bindings)))
+
+(defun extend-bindings (var val bindings)
+ "Add a (var . value) pair to a binding list."
+ (append
+ (unless (eq bindings +no-bindings+) bindings)
+ (list (make-binding var val))))
+
+(defun occurs-in? (var x bindings)
+ "Does var occur anywhere inside x?"
+ (cond ((eq var x) t)
+ ((and (variable? x) (get-binding x bindings))
+ (occurs-in? var (lookup x bindings) bindings))
+ ((consp x) (or (occurs-in? var (first x) bindings)
+ (occurs-in? var (rest x) bindings)))
+ (t nil)))
+
+(defun subst-bindings (bindings x)
+ "Substitute the value of variables in bindings into x,
+ taking recursively bound variables into account."
+ (cond ((eq bindings +fail+) +fail+)
+ ((eq bindings +no-bindings+) x)
+ ((and (listp x) (eq '?eval (car x)))
+ (subst-bindings-quote bindings x))
+ ((and (variable? x) (get-binding x bindings))
+ (subst-bindings bindings (lookup x bindings)))
+ ((atom x) x)
+ (t (cons (subst-bindings bindings (car x)) ;; s/reuse-cons/cons
+ (subst-bindings bindings (cdr x))))))
+
+(defun unifier (x y)
+ "Return something that unifies with both x and y (or fail)."
+ (subst-bindings (unify x y) x))
+
+(defun variables-in (exp)
+ "Return a list of all the variables in EXP."
+ (unique-find-anywhere-if #'variable? exp))
+
+(defun unique-find-anywhere-if (predicate tree &optional found-so-far)
+ "Return a list of leaves of tree satisfying predicate,
+ with duplicates removed."
+ (if (atom tree)
+ (if (funcall predicate tree)
+ (pushnew tree found-so-far)
+ found-so-far)
+ (unique-find-anywhere-if
+ predicate
+ (first tree)
+ (unique-find-anywhere-if predicate (rest tree)
+ found-so-far))))
+
+(defun find-anywhere-if (predicate tree)
+ "Does predicate apply to any atom in the tree?"
+ (if (atom tree)
+ (funcall predicate tree)
+ (or (find-anywhere-if predicate (first tree))
+ (find-anywhere-if predicate (rest tree)))))
+
+(defun new-variable (var)
+ "Create a new variable. Assumes user never types variables of form ?X.9"
+ (gentemp (format nil "~S." var)))
+; (gentemp "?") )
+;;;
+
+(defun anonymous-var? (x)
+ (eq x '?_))
+
+(defun subst-bindings-quote (bindings x)
+ "Substitute the value of variables in bindings into x,
+ taking recursively bound variables into account."
+ (cond ((eq bindings +fail+) +fail+)
+ ((eq bindings +no-bindings+) x)
+ ((and (variable? x) (get-binding x bindings))
+ (if (variable? (lookup x bindings))
+ (subst-bindings-quote bindings (lookup x bindings))
+ (subst-bindings-quote bindings (list 'quote (lookup x bindings)))
+ )
+ )
+ ((atom x) x)
+ (t (cons (subst-bindings-quote bindings (car x)) ;; s/reuse-cons/cons
+ (subst-bindings-quote bindings (cdr x))))))
+
+(defun eval? (x)
+ (and (consp x) (eq (first x) '?eval)))
+
+(defun unify-eval (x y bindings)
+ (let ((exp (subst-bindings-quote bindings (second x))))
+ (if (variables-in exp)
+ +fail+
+ (unify (eval exp) y bindings))))
+
+
+
+(defun rule-ifs (rule) (fourth rule))
+(defun rule-then (rule) (second rule))
+
+
+(defun equality? (term)
+ (and (consp term) (eql (first term) '?=)))
+
+
+(defun in-fact-list? (expresion)
+ (some #'(lambda(x) (equal x expresion)) *fact-list*))
+
+(defun not-in-fact-list? (expresion)
+ (if (eq (car expresion) 'NOT)
+ (in-fact-list? (second expresion))
+ (in-fact-list? (list 'NOT expresion))))
+
+
+;; add-fact:
+
+(defun add-fact (fact)
+ (setq *fact-list* (cons fact *fact-list*)))
+
+
+(defun variable? (x)
+ "Is x a variable (a symbol starting with ?) except ?eval and ?="
+ (and (not (equal x '?eval)) (not (equal x '?=))
+ (symbolp x) (eql (char (symbol-name x) 0) #\?)))
+
+
+;; EOF
\ No newline at end of file
diff --git a/samples/Component Pascal/Example.cp b/samples/Component Pascal/Example.cp
new file mode 100644
index 00000000..5bace2c4
--- /dev/null
+++ b/samples/Component Pascal/Example.cp
@@ -0,0 +1,130 @@
+MODULE ObxControls;
+(**
+ project = "BlackBox"
+ organization = "www.oberon.ch"
+ contributors = "Oberon microsystems"
+ version = "System/Rsrc/About"
+ copyright = "System/Rsrc/About"
+ license = "Docu/BB-License"
+ changes = ""
+ issues = ""
+
+**)
+
+IMPORT Dialog, Ports, Properties, Views;
+
+CONST beginner = 0; advanced = 1; expert = 2; guru = 3; (* user classes *)
+
+TYPE
+ View = POINTER TO RECORD (Views.View)
+ size: INTEGER (* border size in mm *)
+ END;
+
+VAR
+ data*: RECORD
+ class*: INTEGER; (* current user class *)
+ list*: Dialog.List; (* list of currently available sizes, derived from class *)
+ width*: INTEGER (* width of next view to be opened. Derived from
+ class, or entered through a text entry field *)
+ END;
+
+ predef: ARRAY 6 OF INTEGER; (* table of predefined sizes *)
+
+
+PROCEDURE SetList;
+BEGIN
+ IF data.class = beginner THEN
+ data.list.SetLen(1);
+ data.list.SetItem(0, "default")
+ ELSIF data.class = advanced THEN
+ data.list.SetLen(4);
+ data.list.SetItem(0, "default");
+ data.list.SetItem(1, "small");
+ data.list.SetItem(2, "medium");
+ data.list.SetItem(3, "large");
+ ELSE
+ data.list.SetLen(6);
+ data.list.SetItem(0, "default");
+ data.list.SetItem(1, "small");
+ data.list.SetItem(2, "medium");
+ data.list.SetItem(3, "large");
+ data.list.SetItem(4, "tiny");
+ data.list.SetItem(5, "huge");
+ END
+END SetList;
+
+(* View *)
+
+PROCEDURE (v: View) CopyFromSimpleView (source: Views.View);
+BEGIN
+ v.size := source(View).size
+END CopyFromSimpleView;
+
+PROCEDURE (v: View) Restore (f: Views.Frame; l, t, r, b: INTEGER);
+BEGIN (* fill view with a red square of size v.size *)
+ IF v.size = 0 THEN v.size := predef[0] END; (* lazy initialization of size *)
+ f.DrawRect(0, 0, v.size, v.size, Ports.fill, Ports.red)
+END Restore;
+
+PROCEDURE (v: View) HandlePropMsg (VAR msg: Views.PropMessage);
+BEGIN
+ WITH msg: Properties.SizePref DO
+ IF v.size = 0 THEN v.size := predef[0] END; (* lazy initialization of size *)
+ msg.w := v.size; msg.h := v.size (* tell environment about desired width and height *)
+ ELSE (* ignore other messages *)
+ END
+END HandlePropMsg;
+
+(* notifiers *)
+
+PROCEDURE ClassNotify* (op, from, to: INTEGER);
+BEGIN (* react to change in data.class *)
+ IF op = Dialog.changed THEN
+ IF (to = beginner) OR (to = advanced) & (data.list.index > 3) THEN
+ (* if class is reduced, make sure that selection contains legal elements *)
+ data.list.index := 0; data.width := predef[0]; (* modify interactor *)
+ Dialog.Update(data) (* redraw controls where necessary *)
+ END;
+ SetList;
+ Dialog.UpdateList(data.list) (* reconstruct list box contents *)
+ END
+END ClassNotify;
+
+PROCEDURE ListNotify* (op, from, to: INTEGER);
+BEGIN (* reacto to change in data.list (index to was selected) *)
+ IF op = Dialog.changed THEN
+ data.width := predef[to]; (* modify interactor *)
+ Dialog.Update(data) (* redraw controls where necessary *)
+ END
+END ListNotify;
+
+(* guards *)
+
+PROCEDURE ListGuard* (VAR par: Dialog.Par);
+BEGIN (* disable list box for a beginner *)
+ par.disabled := data.class = beginner
+END ListGuard;
+
+PROCEDURE WidthGuard* (VAR par: Dialog.Par);
+BEGIN (* make text entry field read-only if user is not guru *)
+ par.readOnly := data.class # guru
+END WidthGuard;
+
+(* commands *)
+
+PROCEDURE Open*;
+ VAR v: View;
+BEGIN
+ NEW(v); (* create and initialize a new view *)
+ v.size := data.width * Ports.mm; (* define view's size in function of class *)
+ Views.OpenAux(v, "Example") (* open the view in a window *)
+END Open;
+
+BEGIN (* initialization of global variables *)
+ predef[0] := 40; predef[1] := 30; predef[2] := 50; (* predefined sizes *)
+ predef[3] := 70; predef[4] := 20; predef[5] := 100;
+ data.class := beginner; (* default values *)
+ data.list.index := 0;
+ data.width := predef[0];
+ SetList
+END ObxControls.
diff --git a/samples/Component Pascal/Example2.cps b/samples/Component Pascal/Example2.cps
new file mode 100644
index 00000000..4c4b3930
--- /dev/null
+++ b/samples/Component Pascal/Example2.cps
@@ -0,0 +1,71 @@
+MODULE ObxFact;
+(**
+ project = "BlackBox"
+ organization = "www.oberon.ch"
+ contributors = "Oberon microsystems"
+ version = "System/Rsrc/About"
+ copyright = "System/Rsrc/About"
+ license = "Docu/BB-License"
+ changes = ""
+ issues = ""
+
+**)
+
+IMPORT
+ Stores, Models, TextModels, TextControllers, Integers;
+
+PROCEDURE Read(r: TextModels.Reader; VAR x: Integers.Integer);
+ VAR i, len, beg: INTEGER; ch: CHAR; buf: POINTER TO ARRAY OF CHAR;
+BEGIN
+ r.ReadChar(ch);
+ WHILE ~r.eot & (ch <= " ") DO r.ReadChar(ch) END;
+ ASSERT(~r.eot & (((ch >= "0") & (ch <= "9")) OR (ch = "-")));
+ beg := r.Pos() - 1; len := 0;
+ REPEAT INC(len); r.ReadChar(ch) UNTIL r.eot OR (ch < "0") OR (ch > "9");
+ NEW(buf, len + 1);
+ i := 0; r.SetPos(beg);
+ REPEAT r.ReadChar(buf[i]); INC(i) UNTIL i = len;
+ buf[i] := 0X;
+ Integers.ConvertFromString(buf^, x)
+END Read;
+
+PROCEDURE Write(w: TextModels.Writer; x: Integers.Integer);
+ VAR i: INTEGER;
+BEGIN
+ IF Integers.Sign(x) < 0 THEN w.WriteChar("-") END;
+ i := Integers.Digits10Of(x);
+ IF i # 0 THEN
+ REPEAT DEC(i); w.WriteChar(Integers.ThisDigit10(x, i)) UNTIL i = 0
+ ELSE w.WriteChar("0")
+ END
+END Write;
+
+PROCEDURE Compute*;
+ VAR beg, end, i, n: INTEGER; ch: CHAR;
+ s: Stores.Operation;
+ r: TextModels.Reader; w: TextModels.Writer; attr: TextModels.Attributes;
+ c: TextControllers.Controller;
+ x: Integers.Integer;
+BEGIN
+ c := TextControllers.Focus();
+ IF (c # NIL) & c.HasSelection() THEN
+ c.GetSelection(beg, end);
+ r := c.text.NewReader(NIL); r.SetPos(beg); r.ReadChar(ch);
+ WHILE ~r.eot & (beg < end) & (ch <= " ") DO r.ReadChar(ch); INC(beg) END;
+ IF ~r.eot & (beg < end) THEN
+ r.ReadPrev; Read(r, x);
+ end := r.Pos(); r.ReadPrev; attr :=r.attr;
+ IF (Integers.Sign(x) > 0) & (Integers.Compare(x, Integers.Long(MAX(LONGINT))) <= 0) THEN
+ n := SHORT(Integers.Short(x)); i := 2; x := Integers.Long(1);
+ WHILE i <= n DO x := Integers.Product(x, Integers.Long(i)); INC(i) END;
+ Models.BeginScript(c.text, "computation", s);
+ c.text.Delete(beg, end);
+ w := c.text.NewWriter(NIL); w.SetPos(beg); w.SetAttr(attr);
+ Write(w, x);
+ Models.EndScript(c.text, s)
+ END
+ END
+ END
+END Compute;
+
+END ObxFact.
\ No newline at end of file
diff --git a/samples/Crystal/const_spec.cr b/samples/Crystal/const_spec.cr
new file mode 100644
index 00000000..3ab20f14
--- /dev/null
+++ b/samples/Crystal/const_spec.cr
@@ -0,0 +1,169 @@
+#!/usr/bin/env bin/crystal --run
+require "../../spec_helper"
+
+describe "Codegen: const" do
+ it "define a constant" do
+ run("A = 1; A").to_i.should eq(1)
+ end
+
+ it "support nested constant" do
+ run("class B; A = 1; end; B::A").to_i.should eq(1)
+ end
+
+ it "support constant inside a def" do
+ run("
+ class Foo
+ A = 1
+
+ def foo
+ A
+ end
+ end
+
+ Foo.new.foo
+ ").to_i.should eq(1)
+ end
+
+ it "finds nearest constant first" do
+ run("
+ A = 1
+
+ class Foo
+ A = 2.5_f32
+
+ def foo
+ A
+ end
+ end
+
+ Foo.new.foo
+ ").to_f32.should eq(2.5)
+ end
+
+ it "allows constants with same name" do
+ run("
+ A = 1
+
+ class Foo
+ A = 2.5_f32
+
+ def foo
+ A
+ end
+ end
+
+ A
+ Foo.new.foo
+ ").to_f32.should eq(2.5)
+ end
+
+ it "constants with expression" do
+ run("
+ A = 1 + 1
+ A
+ ").to_i.should eq(2)
+ end
+
+ it "finds global constant" do
+ run("
+ A = 1
+
+ class Foo
+ def foo
+ A
+ end
+ end
+
+ Foo.new.foo
+ ").to_i.should eq(1)
+ end
+
+ it "define a constant in lib" do
+ run("lib Foo; A = 1; end; Foo::A").to_i.should eq(1)
+ end
+
+ it "invokes block in const" do
+ run("require \"prelude\"; A = [\"1\"].map { |x| x.to_i }; A[0]").to_i.should eq(1)
+ end
+
+ it "declare constants in right order" do
+ run("A = 1 + 1; B = true ? A : 0; B").to_i.should eq(2)
+ end
+
+ it "uses correct types lookup" do
+ run("
+ module A
+ class B
+ def foo
+ 1
+ end
+ end
+
+ C = B.new;
+ end
+
+ def foo
+ A::C.foo
+ end
+
+ foo
+ ").to_i.should eq(1)
+ end
+
+ it "codegens variable assignment in const" do
+ run("
+ class Foo
+ def initialize(@x)
+ end
+
+ def x
+ @x
+ end
+ end
+
+ A = begin
+ f = Foo.new(1)
+ f
+ end
+
+ def foo
+ A.x
+ end
+
+ foo
+ ").to_i.should eq(1)
+ end
+
+ it "declaring var" do
+ run("
+ BAR = begin
+ a = 1
+ while 1 == 2
+ b = 2
+ end
+ a
+ end
+ class Foo
+ def compile
+ BAR
+ end
+ end
+
+ Foo.new.compile
+ ").to_i.should eq(1)
+ end
+
+ it "initialize const that might raise an exception" do
+ run("
+ require \"prelude\"
+ CONST = (raise \"OH NO\" if 1 == 2)
+
+ def doit
+ CONST
+ rescue
+ end
+
+ doit.nil?
+ ").to_b.should be_true
+ end
+end
diff --git a/samples/Crystal/declare_var_spec.cr b/samples/Crystal/declare_var_spec.cr
new file mode 100644
index 00000000..c6a44127
--- /dev/null
+++ b/samples/Crystal/declare_var_spec.cr
@@ -0,0 +1,79 @@
+#!/usr/bin/env bin/crystal --run
+require "../../spec_helper"
+
+describe "Type inference: declare var" do
+ it "types declare var" do
+ assert_type("a :: Int32") { int32 }
+ end
+
+ it "types declare var and reads it" do
+ assert_type("a :: Int32; a") { int32 }
+ end
+
+ it "types declare var and changes its type" do
+ assert_type("a :: Int32; while 1 == 2; a = 'a'; end; a") { union_of(int32, char) }
+ end
+
+ it "declares instance var which appears in initialize" do
+ result = assert_type("
+ class Foo
+ @x :: Int32
+ end
+
+ Foo.new") { types["Foo"] }
+
+ mod = result.program
+
+ foo = mod.types["Foo"] as NonGenericClassType
+ foo.instance_vars["@x"].type.should eq(mod.int32)
+ end
+
+ it "declares instance var of generic class" do
+ result = assert_type("
+ class Foo(T)
+ @x :: T
+ end
+
+ Foo(Int32).new") do
+ foo = types["Foo"] as GenericClassType
+ foo_i32 = foo.instantiate([int32] of Type | ASTNode)
+ foo_i32.lookup_instance_var("@x").type.should eq(int32)
+ foo_i32
+ end
+ end
+
+ it "declares instance var of generic class after reopen" do
+ result = assert_type("
+ class Foo(T)
+ end
+
+ f = Foo(Int32).new
+
+ class Foo(T)
+ @x :: T
+ end
+
+ f") do
+ foo = types["Foo"] as GenericClassType
+ foo_i32 = foo.instantiate([int32] of Type | ASTNode)
+ foo_i32.lookup_instance_var("@x").type.should eq(int32)
+ foo_i32
+ end
+ end
+
+ it "declares an instance variable in initialize" do
+ assert_type("
+ class Foo
+ def initialize
+ @x :: Int32
+ end
+
+ def x
+ @x
+ end
+ end
+
+ Foo.new.x
+ ") { int32 }
+ end
+end
diff --git a/samples/Crystal/transformer.cr b/samples/Crystal/transformer.cr
new file mode 100644
index 00000000..8bb78fbe
--- /dev/null
+++ b/samples/Crystal/transformer.cr
@@ -0,0 +1,515 @@
+module Crystal
+ class ASTNode
+ def transform(transformer)
+ transformer.before_transform self
+ node = transformer.transform self
+ transformer.after_transform self
+ node
+ end
+ end
+
+ class Transformer
+ def before_transform(node)
+ end
+
+ def after_transform(node)
+ end
+
+ def transform(node : Expressions)
+ exps = [] of ASTNode
+ node.expressions.each do |exp|
+ new_exp = exp.transform(self)
+ if new_exp
+ if new_exp.is_a?(Expressions)
+ exps.concat new_exp.expressions
+ else
+ exps << new_exp
+ end
+ end
+ end
+
+ if exps.length == 1
+ exps[0]
+ else
+ node.expressions = exps
+ node
+ end
+ end
+
+ def transform(node : Call)
+ if node_obj = node.obj
+ node.obj = node_obj.transform(self)
+ end
+ transform_many node.args
+
+ if node_block = node.block
+ node.block = node_block.transform(self)
+ end
+
+ if node_block_arg = node.block_arg
+ node.block_arg = node_block_arg.transform(self)
+ end
+
+ node
+ end
+
+ def transform(node : And)
+ node.left = node.left.transform(self)
+ node.right = node.right.transform(self)
+ node
+ end
+
+ def transform(node : Or)
+ node.left = node.left.transform(self)
+ node.right = node.right.transform(self)
+ node
+ end
+
+ def transform(node : StringInterpolation)
+ transform_many node.expressions
+ node
+ end
+
+ def transform(node : ArrayLiteral)
+ transform_many node.elements
+
+ if node_of = node.of
+ node.of = node_of.transform(self)
+ end
+
+ node
+ end
+
+ def transform(node : HashLiteral)
+ transform_many node.keys
+ transform_many node.values
+
+ if of_key = node.of_key
+ node.of_key = of_key.transform(self)
+ end
+
+ if of_value = node.of_value
+ node.of_value = of_value.transform(self)
+ end
+
+ node
+ end
+
+ def transform(node : If)
+ node.cond = node.cond.transform(self)
+ node.then = node.then.transform(self)
+ node.else = node.else.transform(self)
+ node
+ end
+
+ def transform(node : Unless)
+ node.cond = node.cond.transform(self)
+ node.then = node.then.transform(self)
+ node.else = node.else.transform(self)
+ node
+ end
+
+ def transform(node : IfDef)
+ node.cond = node.cond.transform(self)
+ node.then = node.then.transform(self)
+ node.else = node.else.transform(self)
+ node
+ end
+
+ def transform(node : MultiAssign)
+ transform_many node.targets
+ transform_many node.values
+ node
+ end
+
+ def transform(node : SimpleOr)
+ node.left = node.left.transform(self)
+ node.right = node.right.transform(self)
+ node
+ end
+
+ def transform(node : Def)
+ transform_many node.args
+ node.body = node.body.transform(self)
+
+ if receiver = node.receiver
+ node.receiver = receiver.transform(self)
+ end
+
+ if block_arg = node.block_arg
+ node.block_arg = block_arg.transform(self)
+ end
+
+ node
+ end
+
+ def transform(node : Macro)
+ transform_many node.args
+ node.body = node.body.transform(self)
+
+ if receiver = node.receiver
+ node.receiver = receiver.transform(self)
+ end
+
+ if block_arg = node.block_arg
+ node.block_arg = block_arg.transform(self)
+ end
+
+ node
+ end
+
+ def transform(node : PointerOf)
+ node.exp = node.exp.transform(self)
+ node
+ end
+
+ def transform(node : SizeOf)
+ node.exp = node.exp.transform(self)
+ node
+ end
+
+ def transform(node : InstanceSizeOf)
+ node.exp = node.exp.transform(self)
+ node
+ end
+
+ def transform(node : IsA)
+ node.obj = node.obj.transform(self)
+ node.const = node.const.transform(self)
+ node
+ end
+
+ def transform(node : RespondsTo)
+ node.obj = node.obj.transform(self)
+ node
+ end
+
+ def transform(node : Case)
+ node.cond = node.cond.transform(self)
+ transform_many node.whens
+
+ if node_else = node.else
+ node.else = node_else.transform(self)
+ end
+
+ node
+ end
+
+ def transform(node : When)
+ transform_many node.conds
+ node.body = node.body.transform(self)
+ node
+ end
+
+ def transform(node : ImplicitObj)
+ node
+ end
+
+ def transform(node : ClassDef)
+ node.body = node.body.transform(self)
+
+ if superclass = node.superclass
+ node.superclass = superclass.transform(self)
+ end
+
+ node
+ end
+
+ def transform(node : ModuleDef)
+ node.body = node.body.transform(self)
+ node
+ end
+
+ def transform(node : While)
+ node.cond = node.cond.transform(self)
+ node.body = node.body.transform(self)
+ node
+ end
+
+ def transform(node : Generic)
+ node.name = node.name.transform(self)
+ transform_many node.type_vars
+ node
+ end
+
+ def transform(node : ExceptionHandler)
+ node.body = node.body.transform(self)
+ transform_many node.rescues
+
+ if node_ensure = node.ensure
+ node.ensure = node_ensure.transform(self)
+ end
+
+ node
+ end
+
+ def transform(node : Rescue)
+ node.body = node.body.transform(self)
+ transform_many node.types
+ node
+ end
+
+ def transform(node : Union)
+ transform_many node.types
+ node
+ end
+
+ def transform(node : Hierarchy)
+ node.name = node.name.transform(self)
+ node
+ end
+
+ def transform(node : Metaclass)
+ node.name = node.name.transform(self)
+ node
+ end
+
+ def transform(node : Arg)
+ if default_value = node.default_value
+ node.default_value = default_value.transform(self)
+ end
+
+ if restriction = node.restriction
+ node.restriction = restriction.transform(self)
+ end
+
+ node
+ end
+
+ def transform(node : BlockArg)
+ node.fun = node.fun.transform(self)
+ node
+ end
+
+ def transform(node : Fun)
+ transform_many node.inputs
+
+ if output = node.output
+ node.output = output.transform(self)
+ end
+
+ node
+ end
+
+ def transform(node : Block)
+ node.args.map! { |exp| exp.transform(self) as Var }
+ node.body = node.body.transform(self)
+ node
+ end
+
+ def transform(node : FunLiteral)
+ node.def.body = node.def.body.transform(self)
+ node
+ end
+
+ def transform(node : FunPointer)
+ if obj = node.obj
+ node.obj = obj.transform(self)
+ end
+ node
+ end
+
+ def transform(node : Return)
+ transform_many node.exps
+ node
+ end
+
+ def transform(node : Break)
+ transform_many node.exps
+ node
+ end
+
+ def transform(node : Next)
+ transform_many node.exps
+ node
+ end
+
+ def transform(node : Yield)
+ if scope = node.scope
+ node.scope = scope.transform(self)
+ end
+ transform_many node.exps
+ node
+ end
+
+ def transform(node : Include)
+ node.name = node.name.transform(self)
+ node
+ end
+
+ def transform(node : Extend)
+ node.name = node.name.transform(self)
+ node
+ end
+
+ def transform(node : RangeLiteral)
+ node.from = node.from.transform(self)
+ node.to = node.to.transform(self)
+ node
+ end
+
+ def transform(node : Assign)
+ node.target = node.target.transform(self)
+ node.value = node.value.transform(self)
+ node
+ end
+
+ def transform(node : Nop)
+ node
+ end
+
+ def transform(node : NilLiteral)
+ node
+ end
+
+ def transform(node : BoolLiteral)
+ node
+ end
+
+ def transform(node : NumberLiteral)
+ node
+ end
+
+ def transform(node : CharLiteral)
+ node
+ end
+
+ def transform(node : StringLiteral)
+ node
+ end
+
+ def transform(node : SymbolLiteral)
+ node
+ end
+
+ def transform(node : RegexLiteral)
+ node
+ end
+
+ def transform(node : Var)
+ node
+ end
+
+ def transform(node : MetaVar)
+ node
+ end
+
+ def transform(node : InstanceVar)
+ node
+ end
+
+ def transform(node : ClassVar)
+ node
+ end
+
+ def transform(node : Global)
+ node
+ end
+
+ def transform(node : Require)
+ node
+ end
+
+ def transform(node : Path)
+ node
+ end
+
+ def transform(node : Self)
+ node
+ end
+
+ def transform(node : LibDef)
+ node.body = node.body.transform(self)
+ node
+ end
+
+ def transform(node : FunDef)
+ if body = node.body
+ node.body = body.transform(self)
+ end
+ node
+ end
+
+ def transform(node : TypeDef)
+ node
+ end
+
+ def transform(node : StructDef)
+ node
+ end
+
+ def transform(node : UnionDef)
+ node
+ end
+
+ def transform(node : EnumDef)
+ node
+ end
+
+ def transform(node : ExternalVar)
+ node
+ end
+
+ def transform(node : IndirectRead)
+ node.obj = node.obj.transform(self)
+ node
+ end
+
+ def transform(node : IndirectWrite)
+ node.obj = node.obj.transform(self)
+ node.value = node.value.transform(self)
+ node
+ end
+
+ def transform(node : TypeOf)
+ transform_many node.expressions
+ node
+ end
+
+ def transform(node : Primitive)
+ node
+ end
+
+ def transform(node : Not)
+ node
+ end
+
+ def transform(node : TypeFilteredNode)
+ node
+ end
+
+ def transform(node : TupleLiteral)
+ transform_many node.exps
+ node
+ end
+
+ def transform(node : Cast)
+ node.obj = node.obj.transform(self)
+ node.to = node.to.transform(self)
+ node
+ end
+
+ def transform(node : DeclareVar)
+ node.var = node.var.transform(self)
+ node.declared_type = node.declared_type.transform(self)
+ node
+ end
+
+ def transform(node : Alias)
+ node.value = node.value.transform(self)
+ node
+ end
+
+ def transform(node : TupleIndexer)
+ node
+ end
+
+ def transform(node : Attribute)
+ node
+ end
+
+ def transform_many(exps)
+ exps.map! { |exp| exp.transform(self) } if exps
+ end
+ end
+end
diff --git a/samples/E/Extends.E b/samples/E/Extends.E
new file mode 100644
index 00000000..002a9105
--- /dev/null
+++ b/samples/E/Extends.E
@@ -0,0 +1,31 @@
+# from
+# http://wiki.erights.org/wiki/Walnut/Ordinary_Programming/Objects_and_Functions
+def makeVehicle(self) {
+ def vehicle {
+ to milesTillEmpty() {
+ return self.milesPerGallon() * self.getFuelRemaining()
+ }
+ }
+ return vehicle
+}
+
+def makeCar() {
+ var fuelRemaining := 20
+ def car extends makeVehicle(car) {
+ to milesPerGallon() {return 19}
+ to getFuelRemaining() {return fuelRemaining}
+ }
+ return car
+}
+
+def makeJet() {
+ var fuelRemaining := 2000
+ def jet extends makeVehicle(jet) {
+ to milesPerGallon() {return 2}
+ to getFuelRemaining() {return fuelRemaining}
+ }
+ return jet
+}
+
+def car := makeCar()
+println(`The car can go ${car.milesTillEmpty()} miles.`)
diff --git a/samples/E/Functions.E b/samples/E/Functions.E
new file mode 100644
index 00000000..086e4f7a
--- /dev/null
+++ b/samples/E/Functions.E
@@ -0,0 +1,21 @@
+# from
+# http://wiki.erights.org/wiki/Walnut/Ordinary_Programming/Objects_and_Functions
+def makeCar(var name) {
+ var x := 0
+ var y := 0
+ def car {
+ to moveTo(newX,newY) {
+ x := newX
+ y := newY
+ }
+ to getX() {return x}
+ to getY() {return y}
+ to setName(newName) {name := newName}
+ to getName() {return name}
+ }
+ return car
+}
+# Now use the makeCar function to make a car, which we will move and print
+def sportsCar := makeCar("Ferrari")
+sportsCar.moveTo(10,20)
+println(`The car ${sportsCar.getName()} is at X location ${sportsCar.getX()}`)
diff --git a/samples/E/Guards.E b/samples/E/Guards.E
new file mode 100644
index 00000000..e3e841ae
--- /dev/null
+++ b/samples/E/Guards.E
@@ -0,0 +1,69 @@
+# from
+# http://wiki.erights.org/wiki/Walnut/Advanced_Topics/Build_your_Own_Guards
+def makeVOCPair(brandName :String) :near {
+
+ var myTempContents := def none {}
+
+ def brand {
+ to __printOn(out :TextWriter) :void {
+ out.print(brandName)
+ }
+ }
+
+ def ProveAuth {
+ to __printOn(out :TextWriter) :void {
+ out.print(`<$brandName prover>`)
+ }
+ to getBrand() :near { return brand }
+ to coerce(specimen, optEjector) :near {
+ def sealedBox {
+ to getBrand() :near { return brand }
+ to offerContent() :void {
+ myTempContents := specimen
+ }
+ }
+ return sealedBox
+ }
+ }
+ def CheckAuth {
+ to __printOn(out :TextWriter) :void {
+ out.print(`<$brandName checker template>`)
+ }
+ to getBrand() :near { return brand }
+ match [`get`, authList :any[]] {
+ def checker {
+ to __printOn(out :TextWriter) :void {
+ out.print(`<$brandName checker>`)
+ }
+ to getBrand() :near { return brand }
+ to coerce(specimenBox, optEjector) :any {
+ myTempContents := null
+ if (specimenBox.__respondsTo("offerContent", 0)) {
+ # XXX Using __respondsTo/2 here is a kludge
+ specimenBox.offerContent()
+ } else {
+ myTempContents := specimenBox
+ }
+ for auth in authList {
+ if (auth == myTempContents) {
+ return auth
+ }
+ }
+ myTempContents := none
+ throw.eject(optEjector,
+ `Unmatched $brandName authorization`)
+ }
+ }
+ }
+ match [`__respondsTo`, [`get`, _]] {
+ true
+ }
+ match [`__respondsTo`, [_, _]] {
+ false
+ }
+ match [`__getAllegedType`, []] {
+ null.__getAllegedType()
+ }
+ }
+ return [ProveAuth, CheckAuth]
+}
diff --git a/samples/E/IO.E b/samples/E/IO.E
new file mode 100644
index 00000000..e96e41ad
--- /dev/null
+++ b/samples/E/IO.E
@@ -0,0 +1,14 @@
+# E sample from
+# http://wiki.erights.org/wiki/Walnut/Ordinary_Programming/InputOutput
+#File objects for hardwired files:
+def file1 :=
+def file2 :=
+
+#Using a variable for a file name:
+def filePath := "c:\\docs\\myFile.txt"
+def file3 := [filePath]
+
+#Using a single character to specify a Windows drive
+def file4 :=
+def file5 :=
+def file6 :=
diff --git a/samples/E/Promises.E b/samples/E/Promises.E
new file mode 100644
index 00000000..ae03c6ec
--- /dev/null
+++ b/samples/E/Promises.E
@@ -0,0 +1,9 @@
+# E snippet from
+# http://wiki.erights.org/wiki/Walnut/Distributed_Computing/Promises
+when (tempVow) -> {
+ #...use tempVow
+} catch prob {
+ #.... report problem
+} finally {
+ #....log event
+}
diff --git a/samples/E/minChat.E b/samples/E/minChat.E
new file mode 100644
index 00000000..b422a71e
--- /dev/null
+++ b/samples/E/minChat.E
@@ -0,0 +1,18 @@
+# from
+# http://wiki.erights.org/wiki/Walnut/Secure_Distributed_Computing/Auditing_minChat
+pragma.syntax("0.9")
+to send(message) {
+ when (friend<-receive(message)) -> {
+ chatUI.showMessage("self", message)
+ } catch prob {chatUI.showMessage("system", "connection lost")}
+}
+to receive(message) {chatUI.showMessage("friend", message)}
+to receiveFriend(friendRcvr) {
+ bind friend := friendRcvr
+ chatUI.showMessage("system", "friend has arrived")
+}
+to save(file) {file.setText(makeURIFromObject(chatController))}
+to load(file) {
+ bind friend := getObjectFromURI(file.getText())
+ friend <- receiveFriend(chatController)
+}
diff --git a/samples/GAMS/transport.gms b/samples/GAMS/transport.gms
new file mode 100644
index 00000000..fb6ccbc9
--- /dev/null
+++ b/samples/GAMS/transport.gms
@@ -0,0 +1,76 @@
+*Basic example of transport model from GAMS model library
+
+$Title A Transportation Problem (TRNSPORT,SEQ=1)
+$Ontext
+
+This problem finds a least cost shipping schedule that meets
+requirements at markets and supplies at factories.
+
+
+Dantzig, G B, Chapter 3.3. In Linear Programming and Extensions.
+Princeton University Press, Princeton, New Jersey, 1963.
+
+This formulation is described in detail in:
+Rosenthal, R E, Chapter 2: A GAMS Tutorial. In GAMS: A User's Guide.
+The Scientific Press, Redwood City, California, 1988.
+
+The line numbers will not match those in the book because of these
+comments.
+
+$Offtext
+
+
+ Sets
+ i canning plants / seattle, san-diego /
+ j markets / new-york, chicago, topeka / ;
+ Parameters
+ a(i) capacity of plant i in cases
+ / seattle 350
+ san-diego 600 /
+ b(j) demand at market j in cases
+ / new-york 325
+ chicago 300
+ topeka 275 / ;
+ Table d(i,j) distance in thousands of miles
+ new-york chicago topeka
+ seattle 2.5 1.7 1.8
+ san-diego 2.5 1.8 1.4 ;
+ Scalar f freight in dollars per case per thousand miles /90/ ;
+ Parameter c(i,j) transport cost in thousands of dollars per case ;
+ c(i,j) = f * d(i,j) / 1000 ;
+ Variables
+ x(i,j) shipment quantities in cases
+ z total transportation costs in thousands of dollars ;
+
+ Positive Variable x ;
+
+ Equations
+ cost define objective function
+ supply(i) observe supply limit at plant i
+ demand(j) satisfy demand at market j ;
+
+ cost .. z =e= sum((i,j), c(i,j)*x(i,j)) ;
+
+ supply(i) .. sum(j, x(i,j)) =l= a(i) ;
+
+ demand(j) .. sum(i, x(i,j)) =g= b(j) ;
+
+ Model transport /all/ ;
+
+ Solve transport using lp minimizing z ;
+
+ Display x.l, x.m ;
+
+$ontext
+#user model library stuff
+Main topic Basic GAMS
+Featured item 1 Trnsport model
+Featured item 2
+Featured item 3
+Featured item 4
+Description
+Basic example of transport model from GAMS model library
+
+
+
+$offtext
\ No newline at end of file
diff --git a/samples/GLSL/SimpleLighting.gl2.frag b/samples/GLSL/SimpleLighting.gl2.frag
new file mode 100644
index 00000000..bb851f86
--- /dev/null
+++ b/samples/GLSL/SimpleLighting.gl2.frag
@@ -0,0 +1,9 @@
+static const char* SimpleFragmentShader = STRINGIFY(
+
+varying vec4 FrontColor;
+
+void main(void)
+{
+ gl_FragColor = FrontColor;
+}
+);
diff --git a/samples/GLSL/recurse1.frag b/samples/GLSL/recurse1.frag
new file mode 100644
index 00000000..66b4c3fe
--- /dev/null
+++ b/samples/GLSL/recurse1.frag
@@ -0,0 +1,48 @@
+#version 330 core
+
+// cross-unit recursion
+
+void main() {}
+
+// two-level recursion
+
+float cbar(int);
+
+void cfoo(float)
+{
+ cbar(2);
+}
+
+// four-level, out of order
+
+void CB();
+void CD();
+void CA() { CB(); }
+void CC() { CD(); }
+
+// high degree
+
+void CBT();
+void CDT();
+void CAT() { CBT(); CBT(); CBT(); }
+void CCT() { CDT(); CDT(); CBT(); }
+
+// not recursive
+
+void norA() {}
+void norB() { norA(); }
+void norC() { norA(); }
+void norD() { norA(); }
+void norE() { norB(); }
+void norF() { norB(); }
+void norG() { norE(); }
+void norH() { norE(); }
+void norI() { norE(); }
+
+// not recursive, but with a call leading into a cycle if ignoring direction
+
+void norcA() { }
+void norcB() { norcA(); }
+void norcC() { norcB(); }
+void norcD() { norcC(); norcB(); } // head of cycle
+void norcE() { norcD(); } // lead into cycle
diff --git a/samples/Groovy/script.gvy b/samples/Groovy/script.gvy
new file mode 100644
index 00000000..25ef2eab
--- /dev/null
+++ b/samples/Groovy/script.gvy
@@ -0,0 +1,2 @@
+#!/usr/bin/env groovy
+println "Hello World"
diff --git a/samples/Groovy/template.grt b/samples/Groovy/template.grt
new file mode 100644
index 00000000..59bb9c22
--- /dev/null
+++ b/samples/Groovy/template.grt
@@ -0,0 +1,9 @@
+html {
+ head {
+ component "bootstrap"
+ title "Bootstrap Template"
+ }
+
+ html {
+ }
+}
diff --git a/samples/Groovy/template.gtpl b/samples/Groovy/template.gtpl
new file mode 100644
index 00000000..f2e594d1
--- /dev/null
+++ b/samples/Groovy/template.gtpl
@@ -0,0 +1,9 @@
+html {
+ head {
+ title "Example Template"
+ }
+
+ body {
+ p "This is a quick template example"
+ }
+}
diff --git a/samples/HTML/ApiOverviewPage.st b/samples/HTML/ApiOverviewPage.st
new file mode 100644
index 00000000..4faa1935
--- /dev/null
+++ b/samples/HTML/ApiOverviewPage.st
@@ -0,0 +1,60 @@
+
+
+
+$Common_meta()$
+
+Android API Differences Report
+
+
+
+
+$Header()$
+
+
+
+
Android API Differences Report
+
This document details the changes in the Android framework API. It shows
+additions, modifications, and removals for packages, classes, methods, and
+fields. Each reference to an API change includes a brief description of the
+API and an explanation of the change and suggested workaround, where available.
+
+
The differences described in this report are based a comparison of the APIs
+whose versions are specified in the upper-right corner of this page. It compares a
+newer "to" API to an older "from" version, noting any changes relative to the
+older API. So, for example, indicated API removals are no longer present in the "to"
+API.
+
For more information about the Android framework API and SDK,
+see the Android product site .
+
+$if(no_delta)$
+
Congratulation!
+No differences were detected between the two provided APIs.
+$endif$
+
+
+$if(removed_packages)$
+$Table(name="Removed Packages", rows=removed_packages:{$it.from:ModelElementRow()$})$
+
+$endif$
+
+
+$if(added_packages)$
+$Table(name="Added Packages", rows=added_packages:{$it.to:PackageAddedLink()$}:SimpleTableRow())$
+
+$endif$
+
+$if(changed_packages)$
+$Table(name="Changed Packages", rows=changed_packages:{$it.to:PackageChangedLink()$}:SimpleTableRow())$
+
+$endif$
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/HTML/pages.html b/samples/HTML/pages.html
new file mode 100644
index 00000000..e068e4fa
--- /dev/null
+++ b/samples/HTML/pages.html
@@ -0,0 +1,31 @@
+
+
+
+
+Related Pages
+
+
+
+
+
+
+
+
+
Here is a list of all related documentation pages:
+
+Generated with Doxygen 1.8.1.2
+
+
diff --git a/samples/Haskell/Hello.hs b/samples/Haskell/Hello.hs
new file mode 100644
index 00000000..cef0b4a9
--- /dev/null
+++ b/samples/Haskell/Hello.hs
@@ -0,0 +1,6 @@
+import Data.Char
+
+main :: IO ()
+main = do
+ let hello = "hello world"
+ putStrLn $ map toUpper hello
\ No newline at end of file
diff --git a/samples/Haskell/Main.hs b/samples/Haskell/Main.hs
new file mode 100644
index 00000000..4a37a8c0
--- /dev/null
+++ b/samples/Haskell/Main.hs
@@ -0,0 +1,33 @@
+module Main where
+
+import Sudoku
+import Data.Maybe
+
+
+sudoku :: Sudoku
+sudoku = [8, 0, 1, 3, 4, 0, 0, 0, 0,
+ 4, 3, 0, 8, 0, 0, 1, 0, 7,
+ 0, 0, 0, 0, 6, 0, 0, 0, 3,
+ 2, 0, 8, 0, 5, 0, 0, 0, 9,
+ 0, 0, 9, 0, 0, 0, 7, 0, 0,
+ 6, 0, 0, 0, 7, 0, 8, 0, 4,
+ 3, 0, 0, 0, 1, 0, 0, 0, 0,
+ 1, 0, 5, 0, 0, 6, 0, 4, 2,
+ 0, 0, 0, 0, 2, 4, 3, 0, 8]
+
+{-
+sudoku :: Sudoku
+sudoku = [8, 6, 1, 3, 4, 7, 2, 9, 5,
+ 4, 3, 2, 8, 9, 5, 1, 6, 7,
+ 9, 5, 7, 1, 6, 2, 4, 8, 3,
+ 2, 7, 8, 4, 5, 1, 6, 3, 9,
+ 5, 4, 9, 6, 8, 3, 7, 2, 1,
+ 6, 1, 3, 2, 7, 9, 8, 5, 4,
+ 3, 2, 4, 9, 1, 8, 5, 7, 6,
+ 1, 8, 5, 7, 3, 6, 9, 4, 2,
+ 7, 9, 6, 5, 2, 4, 3, 1, 8]
+-}
+main :: IO ()
+main = do
+ putStrLn $ pPrint sudoku ++ "\n\n"
+ putStrLn $ pPrint $ fromMaybe [] $ solve sudoku
\ No newline at end of file
diff --git a/samples/Haskell/Sudoku.hs b/samples/Haskell/Sudoku.hs
new file mode 100644
index 00000000..ca6122e3
--- /dev/null
+++ b/samples/Haskell/Sudoku.hs
@@ -0,0 +1,46 @@
+module Sudoku
+(
+ Sudoku,
+ solve,
+ isSolved,
+ pPrint
+) where
+
+import Data.Maybe
+import Data.List
+import Data.List.Split
+
+type Sudoku = [Int]
+
+solve :: Sudoku -> Maybe Sudoku
+solve sudoku
+ | isSolved sudoku = Just sudoku
+ | otherwise = do
+ index <- elemIndex 0 sudoku
+ let sudokus = [nextTest sudoku index i | i <- [1..9],
+ checkRow (nextTest sudoku index i) index,
+ checkColumn (nextTest sudoku index i) index,
+ checkBox (nextTest sudoku index i) index]
+ listToMaybe $ mapMaybe solve sudokus
+ where nextTest sudoku index i = take index sudoku ++ [i] ++ drop (index+1) sudoku
+ checkRow sudoku index = (length $ getRow sudoku index) == (length $ nub $ getRow sudoku index)
+ checkColumn sudoku index = (length $ getColumn sudoku index) == (length $ nub $ getColumn sudoku index)
+ checkBox sudoku index = (length $ getBox sudoku index) == (length $ nub $ getBox sudoku index)
+ getRow sudoku index = filter (/=0) $ (chunksOf 9 sudoku) !! (quot index 9)
+ getColumn sudoku index = filter (/=0) $ (transpose $ chunksOf 9 sudoku) !! (mod index 9)
+ getBox sudoku index = filter (/=0) $ (map concat $ concatMap transpose $ chunksOf 3 $ map (chunksOf 3) $ chunksOf 9 sudoku)
+ !! (3 * (quot index 27) + (quot (mod index 9) 3))
+
+isSolved :: Sudoku -> Bool
+isSolved sudoku
+ | product sudoku == 0 = False
+ | map (length . nub) sudokuRows /= map length sudokuRows = False
+ | map (length . nub) sudokuColumns /= map length sudokuColumns = False
+ | map (length . nub) sudokuBoxes /= map length sudokuBoxes = False
+ | otherwise = True
+ where sudokuRows = chunksOf 9 sudoku
+ sudokuColumns = transpose sudokuRows
+ sudokuBoxes = map concat $ concatMap transpose $ chunksOf 3 $ map (chunksOf 3) $ chunksOf 9 sudoku
+
+pPrint :: Sudoku -> String
+pPrint sudoku = intercalate "\n" $ map (intercalate " " . map show) $ chunksOf 9 sudoku
\ No newline at end of file
diff --git a/samples/Inform 7/Trivial Extension.i7x b/samples/Inform 7/Trivial Extension.i7x
new file mode 100644
index 00000000..1aae1b85
--- /dev/null
+++ b/samples/Inform 7/Trivial Extension.i7x
@@ -0,0 +1,6 @@
+Version 1 of Trivial Extension by Andrew Plotkin begins here.
+
+A cow is a kind of animal. A cow can be purple.
+
+Trivial Extension ends here.
+
diff --git a/samples/Inform 7/story.ni b/samples/Inform 7/story.ni
new file mode 100644
index 00000000..f8873369
--- /dev/null
+++ b/samples/Inform 7/story.ni
@@ -0,0 +1,12 @@
+"Test Case" by Andrew Plotkin.
+
+Include Trivial Extension by Andrew Plotkin.
+
+The Kitchen is a room.
+
+[This kitchen is modelled after the one in Zork, although it lacks the detail to establish this to the player.]
+
+A purple cow called Gelett is in the Kitchen.
+
+Instead of examining Gelett:
+ say "You'd rather see than be one."
diff --git a/samples/Isabelle/HelloWorld.thy b/samples/Isabelle/HelloWorld.thy
new file mode 100644
index 00000000..7c814dae
--- /dev/null
+++ b/samples/Isabelle/HelloWorld.thy
@@ -0,0 +1,46 @@
+theory HelloWorld
+imports Main
+begin
+
+section{*Playing around with Isabelle*}
+
+text{* creating a lemma with the name hello_world*}
+lemma hello_world: "True" by simp
+
+(*inspecting it*)
+thm hello_world
+
+text{* defining a string constant HelloWorld *}
+
+definition HelloWorld :: "string" where
+ "HelloWorld \ ''Hello World!''"
+
+(*reversing HelloWorld twice yilds HelloWorld again*)
+theorem "rev (rev HelloWorld) = HelloWorld"
+ by (fact List.rev_rev_ident)
+
+text{*now we delete the already proven List.rev_rev_ident lema and show it by hand*}
+declare List.rev_rev_ident[simp del]
+hide_fact List.rev_rev_ident
+
+(*It's trivial since we can just 'execute' it*)
+corollary "rev (rev HelloWorld) = HelloWorld"
+ apply(simp add: HelloWorld_def)
+ done
+
+text{*does it hold in general?*}
+theorem rev_rev_ident:"rev (rev l) = l"
+ proof(induction l)
+ case Nil thus ?case by simp
+ next
+ case (Cons l ls)
+ assume IH: "rev (rev ls) = ls"
+ have "rev (l#ls) = (rev ls) @ [l]" by simp
+ hence "rev (rev (l#ls)) = rev ((rev ls) @ [l])" by simp
+ also have "\ = [l] @ rev (rev ls)" by simp
+ finally show "rev (rev (l#ls)) = l#ls" using IH by simp
+ qed
+
+corollary "\(l::string). rev (rev l) = l" by(fastforce intro: rev_rev_ident)
+
+end
diff --git a/samples/JavaScript/helloHanaEndpoint.xsjs b/samples/JavaScript/helloHanaEndpoint.xsjs
new file mode 100644
index 00000000..25629850
--- /dev/null
+++ b/samples/JavaScript/helloHanaEndpoint.xsjs
@@ -0,0 +1,24 @@
+/*
+ invoke endpoint by calling in a browser:
+ http://:////helloHanaMath.xsjslib?x=4&y=2
+ e.g.:
+ http://192.168.178.20:8000/geekflyer/linguist/helloHanaEndpoint.xsjs?x=4&y=2
+ */
+
+var hanaMath = $.import("./helloHanaMath.xsjslib");
+
+var x = parseFloat($.request.parameters.get("x"));
+var y = parseFloat($.request.parameters.get("y"));
+
+
+var result = hanaMath.multiply(x, y);
+
+var output = {
+ title: "Hello HANA XS - do some simple math",
+ input: {x: x, y: y},
+ result: result
+};
+
+$.response.contentType = "application/json";
+$.response.statusCode = $.net.http.OK;
+$.response.setBody(JSON.stringify(output));
\ No newline at end of file
diff --git a/samples/JavaScript/helloHanaMath.xsjslib b/samples/JavaScript/helloHanaMath.xsjslib
new file mode 100644
index 00000000..311c2570
--- /dev/null
+++ b/samples/JavaScript/helloHanaMath.xsjslib
@@ -0,0 +1,9 @@
+/* simple hana xs demo library, which can be used by multiple endpoints */
+
+function multiply(x, y) {
+ return x * y;
+}
+
+function add(x, y) {
+ return x + y;
+}
\ No newline at end of file
diff --git a/samples/JavaScript/intro.js.frag b/samples/JavaScript/intro.js.frag
new file mode 100644
index 00000000..a4e06b08
--- /dev/null
+++ b/samples/JavaScript/intro.js.frag
@@ -0,0 +1,7 @@
+(function(window, angular) {
+
+Array.prototype.last = function() {
+ return this[this.length-1];
+};
+
+var app = angular.module('ConwayGameOfLife', []);
diff --git a/samples/JavaScript/outro.js.frag b/samples/JavaScript/outro.js.frag
new file mode 100644
index 00000000..8634f6ed
--- /dev/null
+++ b/samples/JavaScript/outro.js.frag
@@ -0,0 +1,3 @@
+
+})(window, window.angular);
+
diff --git a/samples/Kit/demo.kit b/samples/Kit/demo.kit
new file mode 100644
index 00000000..7c948f16
--- /dev/null
+++ b/samples/Kit/demo.kit
@@ -0,0 +1,8 @@
+
+
+
\ No newline at end of file
diff --git a/samples/Latte/layout.latte b/samples/Latte/layout.latte
new file mode 100644
index 00000000..5e94975f
--- /dev/null
+++ b/samples/Latte/layout.latte
@@ -0,0 +1,59 @@
+{**
+ * @param string $basePath web base path
+ * @param string $robots tell robots how to index the content of a page (optional)
+ * @param array $flashes flash messages
+ *}
+
+
+
+
+
+
+
+
+
+
+ {ifset $title}{$title} › {/ifset}Translation report
+
+
+
+
+
+
+ {block #head}{/block}
+
+
+
+
+
+ {block #navbar}
+ {include _navbar.latte}
+ {/block}
+
+
+
+
+ {include _flash.latte, flash => $flash}
+
+
+
+ {include #content}
+
+
+
+
+
+ {block #scripts}{/block}
+
+
diff --git a/samples/Latte/template.latte b/samples/Latte/template.latte
new file mode 100644
index 00000000..1718045a
--- /dev/null
+++ b/samples/Latte/template.latte
@@ -0,0 +1,243 @@
+{var $title => "⚐ {$new->title}"}
+{define author}
+
+
+ {$author->name|trim}
+
+
+ {$author->estimatedTimeTranslated|secondsToTime}{*
+ *} {if $author->joined}, {/if}
+ {if $author->joined}joined {$author->joined|timeAgo}{/if}{*
+ *}{ifset $postfix}, {$postfix}{/ifset}
+{/define}
+{block #scripts}
+
+{/block}
+{block #content}
+
+{if isset($old)}
+ Diffing revision #{$old->revision} and #{$new->revision}
+{else}
+ First revision
+{/if}
+
+{var $editor = $user->loggedIn && $new->language === 'cs'}
+{var $rev = $new->video->siteRevision}
+
+
+
+ published {$new->publishedAt|timeAgo} {*
+ *}{ifset $old},
+
+ {$new->textChange * 100|number} % text change{*
+ *} {*
+ *}{if $new->timeChange},
+
+ {$new->timeChange * 100|number} % timing change
+
+ {/if}
+ {/ifset}
+
+ {cache $new->id, expires => '+4 hours'}
+
+ {if isset($old) && $old->author->name !== $new->author->name}
+ {include author, author => $old->author, class => 'author-old'}
+ —
+ {include author, author => $new->author, class => 'author-new'}
+ {elseif isset($old)}
+ {include author, author => $new->author, class => 'author-new', postfix => 'authored both revisions'}
+ {else}
+ {include author, author => $new->author, class => 'author-new'}
+ {/if}
+
+ {/cache}
+
+ {var $threshold = 10}
+ {cache $new->id}
+ {var $done = $new->timeTranslated}
+ {var $outOf = $new->video->canonicalTimeTranslated}
+ {if $outOf}
+
+ Only {$done|time} translated out of {$outOf|time},
+ {(1-$done/$outOf) * 100|number} % ({$outOf - $done|time}) left
+
+
+ Seems complete: {$done|time} translated out of {$outOf|time}
+
+ {elseif $done}
+
+ Although {$done|time} is translated, there are no English subtitles for comparison.
+
+ {/if}
+ {/cache}
+
+ {if $editor}
+ {var $ksid = $new->video->siteId}
+ {if $ksid}
+
+ Video on khanovaskola.cz
+ {if $new->revision === $rev}
+ (on this revision)
+ {elseif $new->revision > $rev}
+ (on older revision #{$rev})
+ {else}
+ (on newer revision #{$rev})
+ {/if}
+
+ {/if}
+ {/if}
+
+
{$diffs->title|noescape}
+
{$diffs->description|noescape}
+
+
+ {$line->text|noescape}
+
+
+
+
+
+
+
+
+ {if $editor}
+ {if $new->approved}
+
+ Revision has been approved{if $new->editor} by {$new->editor->name}{/if}.
+
+
+
+ Edit on Amara
+
+
+ on Khan Academy
+
+
+ {elseif $new->incomplete}
+
+ Revision has been marked as incomplete by {if $new->editor}{$new->editor->name}{/if}.
+
+ {include editButton}
+ {include kaButton}
+
+ {* else $new->status === UNSET: *}
+ {elseif $new->video->siteId}
+
+ {include kaButton}
+
+ {else}
+
+ {include kaButton}
+
+
Filed under category:
+ {foreach $new->video->categories as $list}
+ — {$list|implode:' › '}{sep} {/sep}
+ {/foreach}
+
+ {/if}
+ {/if}
+
+
+
All revisions:
+
+ {foreach $new->video->getRevisionsIn($new->language) as $revision}
+
+
+ #{$revision->revision}
+
+
+
+
+ {$revision->author->name}
+
+
+
+
+ {$revision->publishedAt|timeAgo}
+
+
+
+ {* vars $outOf, $threshold already set *}
+ {default $outOf = $new->video->canonicalTimeTranslated}
+ {if $outOf} {* ignore if canonical time not set *}
+ {var $done = $revision->timeTranslated}
+
+ {$done/$outOf * 100|number} %
+
+
+ ~100 %
+
+ {/if}
+
+
+ {if $revision->incomplete || $revision->approved}
+ {var $i = $revision->incomplete}
+
+ {if $i}incomplete{else}approved{/if}
+
+ {/if}
+
+ {if $user->loggedIn && $revision->comments->count()}
+
+
+
+
+
+ {/if}
+ {if $user->loggedIn && $new->id === $revision->id}
+
+
+
+ {form commentForm}
+
+ {/form}
+
+ {/if}
+
+ {/foreach}
+
+
+
+
diff --git a/samples/Liquid/layout.liquid b/samples/Liquid/layout.liquid
new file mode 100644
index 00000000..7954c7ec
--- /dev/null
+++ b/samples/Liquid/layout.liquid
@@ -0,0 +1,104 @@
+
+
+
+
+
+ {{shop.name}} - {{page_title}}
+
+ {{ 'textile.css' | global_asset_url | stylesheet_tag }}
+ {{ 'lightbox/v204/lightbox.css' | global_asset_url | stylesheet_tag }}
+
+ {{ 'prototype/1.6/prototype.js' | global_asset_url | script_tag }}
+ {{ 'scriptaculous/1.8.2/scriptaculous.js' | global_asset_url | script_tag }}
+ {{ 'lightbox/v204/lightbox.js' | global_asset_url | script_tag }}
+ {{ 'option_selection.js' | shopify_asset_url | script_tag }}
+
+ {{ 'layout.css' | asset_url | stylesheet_tag }}
+ {{ 'shop.js' | asset_url | script_tag }}
+
+ {{ content_for_header }}
+
+
+
+
+ Skip to navigation.
+
+ {% if cart.item_count > 0 %}
+
+
+
There {{ cart.item_count | pluralize: 'is', 'are' }} {{ cart.item_count }} {{ cart.item_count | pluralize: 'item', 'items' }} in your cart ! Your subtotal is {{ cart.total_price | money }}.
+ {% for item in cart.items %}
+
+ {% endfor %}
+
+
+
+ {% endif %}
+
+
+
+
+
+
+
+
+ {{ content_for_layout }}
+
+
+
+
+
+
+
+ {% for link in linklists.main-menu.links %}
+ {{ link.title | link_to: link.url }}
+ {% endfor %}
+
+
+ {% if tags %}
+
+ {% for tag in collection.tags %}
+ {{ '+' | link_to_add_tag: tag }} {{ tag | highlight_active_tag | link_to_tag: tag }}
+ {% endfor %}
+
+ {% endif %}
+
+
+ {% for link in linklists.footer.links %}
+ {{ link.title | link_to: link.url }}
+ {% endfor %}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/Liquid/template.liquid b/samples/Liquid/template.liquid
new file mode 100644
index 00000000..5502c2e7
--- /dev/null
+++ b/samples/Liquid/template.liquid
@@ -0,0 +1,70 @@
+We have wonderful products!
+
diff --git a/samples/MTML/categories_to_columns.mtml b/samples/MTML/categories_to_columns.mtml
new file mode 100644
index 00000000..a46c0674
--- /dev/null
+++ b/samples/MTML/categories_to_columns.mtml
@@ -0,0 +1,35 @@
+<$mt:Var name="num_cols" value="6"$>
+<$mt:Var name="index" value="0"$>
+
+ <$mt:Var name="index" op="++" setvar="index"$>
+
+ <$mt:CategoryLabel remove_html="1"$>
+
+
+<$mt:Var name="categories" function="count" setvar="cat_count"$>
+<$mt:Var name="cat_count" op="%" value="$num_cols" setvar="modulus"$>
+
+ <$mt:Var name="cat_count" op="-" value="$modulus" setvar="cat_count_minus_mod"$>
+ <$mt:Var name="cat_count_minus_mod" op="/" value="$num_cols" setvar="cats_per_col"$>
+ <$mt:Var name="cats_per_col" op="+" value="1" setvar="cats_per_col"$>
+
+ <$mt:Var name="cat_count" op="/" value="$num_cols" setvar="cats_per_col"$>
+
+
+ <$mt:Var name="index" op="++" setvar="index"$>
+
+ <$mt:Var name="categories{$index}"$>
+
+
+
+<$mt:Var name="index" value="0"$>
+<$mt:Var name="col_num" value="1"$>
+
+ ">
+
+ <$mt:Var name="for_inner"$>
+
+
+ <$mt:Var name="col_num" op="++" setvar="col_num"$>
+
+
diff --git a/samples/Mathematica/MiscCalculations.nb b/samples/Mathematica/MiscCalculations.nb
new file mode 100644
index 00000000..5e34ac95
--- /dev/null
+++ b/samples/Mathematica/MiscCalculations.nb
@@ -0,0 +1,232 @@
+(* Content-type: application/vnd.wolfram.mathematica *)
+
+(*** Wolfram Notebook File ***)
+(* http://www.wolfram.com/nb *)
+
+(* CreatedBy='Mathematica 9.0' *)
+
+(*CacheID: 234*)
+(* Internal cache information:
+NotebookFileLineBreakTest
+NotebookFileLineBreakTest
+NotebookDataPosition[ 157, 7]
+NotebookDataLength[ 7164, 223]
+NotebookOptionsPosition[ 6163, 182]
+NotebookOutlinePosition[ 6508, 197]
+CellTagsIndexPosition[ 6465, 194]
+WindowFrame->Normal*)
+
+(* Beginning of Notebook Content *)
+Notebook[{
+
+Cell[CellGroupData[{
+Cell[BoxData[
+ RowBox[{
+ RowBox[{"Solve", "[",
+ RowBox[{
+ RowBox[{"y", "'"}], "\[Equal]", " ", "xy"}], "]"}],
+ "\[IndentingNewLine]"}]], "Input",
+ CellChangeTimes->{{3.6112716342092056`*^9, 3.6112716549793935`*^9}}],
+
+Cell[BoxData[
+ RowBox[{"{",
+ RowBox[{"{",
+ RowBox[{"xy", "\[Rule]",
+ SuperscriptBox["y", "\[Prime]",
+ MultilineFunction->None]}], "}"}], "}"}]], "Output",
+ CellChangeTimes->{3.6112716579295626`*^9}]
+}, Open ]],
+
+Cell[CellGroupData[{
+
+Cell[BoxData[
+ RowBox[{"Log", "[",
+ RowBox[{"Sin", "[", "38", "]"}], "]"}]], "Input",
+ CellChangeTimes->{{3.611271663920905*^9, 3.6112716759275913`*^9}}],
+
+Cell[BoxData[
+ RowBox[{"Log", "[",
+ RowBox[{"Sin", "[", "38", "]"}], "]"}]], "Output",
+ CellChangeTimes->{3.611271678256725*^9}]
+}, Open ]],
+
+Cell[CellGroupData[{
+
+Cell[BoxData[
+ RowBox[{"N", "[",
+ RowBox[{"Log", "[",
+ RowBox[{"Sin", "[", "38", "]"}], "]"}], "]"}]], "Input",
+ NumberMarks->False],
+
+Cell[BoxData[
+ RowBox[{"-", "1.2161514009320473`"}]], "Output",
+ CellChangeTimes->{3.611271682061942*^9}]
+}, Open ]],
+
+Cell[CellGroupData[{
+
+Cell[BoxData[
+ RowBox[{"Abs", "[",
+ RowBox[{"-", "1.2161514009320473`"}], "]"}]], "Input",
+ NumberMarks->False],
+
+Cell[BoxData["1.2161514009320473`"], "Output",
+ CellChangeTimes->{3.6112716842780695`*^9}]
+}, Open ]],
+
+Cell[CellGroupData[{
+
+Cell[BoxData[
+ RowBox[{"RealDigits", "[", "1.2161514009320473`", "]"}]], "Input",
+ NumberMarks->False],
+
+Cell[BoxData[
+ RowBox[{"{",
+ RowBox[{
+ RowBox[{"{",
+ RowBox[{
+ "1", ",", "2", ",", "1", ",", "6", ",", "1", ",", "5", ",", "1", ",", "4",
+ ",", "0", ",", "0", ",", "9", ",", "3", ",", "2", ",", "0", ",", "4",
+ ",", "7"}], "}"}], ",", "1"}], "}"}]], "Output",
+ CellChangeTimes->{3.611271685319129*^9}]
+}, Open ]],
+
+Cell[CellGroupData[{
+
+Cell[BoxData[
+ RowBox[{
+ RowBox[{"Graph", "[",
+ RowBox[{"Log", "[", "x", "]"}], "]"}], "\[IndentingNewLine]"}]], "Input",
+ CellChangeTimes->{{3.611271689258354*^9, 3.611271702038085*^9}}],
+
+Cell[BoxData[
+ RowBox[{"Graph", "[",
+ RowBox[{"Log", "[", "x", "]"}], "]"}]], "Output",
+ CellChangeTimes->{3.611271704295214*^9}]
+}, Open ]],
+
+Cell[BoxData[""], "Input",
+ CellChangeTimes->{{3.611271712769699*^9, 3.6112717423153887`*^9}}],
+
+Cell[CellGroupData[{
+
+Cell[BoxData[
+ RowBox[{
+ RowBox[{"Plot", "[",
+ RowBox[{
+ RowBox[{"Log", "[", "x", "]"}], ",", " ",
+ RowBox[{"{",
+ RowBox[{"x", ",", " ", "0", ",", " ", "10"}], "}"}]}], "]"}],
+ "\[IndentingNewLine]"}]], "Input",
+ CellChangeTimes->{{3.6112717573482485`*^9, 3.6112717747822456`*^9}}],
+
+Cell[BoxData[
+ GraphicsBox[{{}, {},
+ {Hue[0.67, 0.6, 0.6], LineBox[CompressedData["
+1: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
+/wc13qzo
+ "]]}},
+ AspectRatio->NCache[GoldenRatio^(-1), 0.6180339887498948],
+ Axes->True,
+ AxesLabel->{None, None},
+ AxesOrigin->{0, 0},
+ Method->{},
+ PlotRange->{{0, 10}, {-1.623796532045525, 2.3025850725858823`}},
+ PlotRangeClipping->True,
+ PlotRangePadding->{
+ Scaled[0.02],
+ Scaled[0.02]}]], "Output",
+ CellChangeTimes->{3.6112717778594217`*^9}]
+}, Open ]]
+},
+WindowSize->{716, 833},
+WindowMargins->{{Automatic, 214}, {Automatic, 26}},
+FrontEndVersion->"9.0 for Microsoft Windows (64-bit) (January 25, 2013)",
+StyleDefinitions->"Default.nb"
+]
+(* End of Notebook Content *)
+
+(* Internal cache information *)
+(*CellTagsOutline
+CellTagsIndex->{}
+*)
+(*CellTagsIndex
+CellTagsIndex->{}
+*)
+(*NotebookFileOutline
+Notebook[{
+Cell[CellGroupData[{
+Cell[579, 22, 224, 6, 52, "Input"],
+Cell[806, 30, 211, 6, 31, "Output"]
+}, Open ]],
+Cell[CellGroupData[{
+Cell[1054, 41, 155, 3, 31, "Input"],
+Cell[1212, 46, 130, 3, 31, "Output"]
+}, Open ]],
+Cell[CellGroupData[{
+Cell[1379, 54, 137, 4, 31, "Input"],
+Cell[1519, 60, 105, 2, 31, "Output"]
+}, Open ]],
+Cell[CellGroupData[{
+Cell[1661, 67, 113, 3, 31, "Input"],
+Cell[1777, 72, 90, 1, 31, "Output"]
+}, Open ]],
+Cell[CellGroupData[{
+Cell[1904, 78, 102, 2, 31, "Input"],
+Cell[2009, 82, 321, 8, 31, "Output"]
+}, Open ]],
+Cell[CellGroupData[{
+Cell[2367, 95, 191, 4, 52, "Input"],
+Cell[2561, 101, 131, 3, 31, "Output"]
+}, Open ]],
+Cell[2707, 107, 94, 1, 31, "Input"],
+Cell[CellGroupData[{
+Cell[2826, 112, 299, 8, 52, "Input"],
+Cell[3128, 122, 3019, 57, 265, "Output"]
+}, Open ]]
+}
+]
+*)
+
+(* End of internal cache information *)
diff --git a/samples/Mathematica/MiscCalculations2.nb b/samples/Mathematica/MiscCalculations2.nb
new file mode 100644
index 00000000..84960c53
--- /dev/null
+++ b/samples/Mathematica/MiscCalculations2.nb
@@ -0,0 +1,3666 @@
+(* Content-type: application/vnd.wolfram.mathematica *)
+
+(*** Wolfram Notebook File ***)
+(* http://www.wolfram.com/nb *)
+
+(* CreatedBy='Mathematica 9.0' *)
+
+(*CacheID: 234*)
+(* Internal cache information:
+NotebookFileLineBreakTest
+NotebookFileLineBreakTest
+NotebookDataPosition[ 157, 7]
+NotebookDataLength[ 200462, 3656]
+NotebookOptionsPosition[ 199657, 3624]
+NotebookOutlinePosition[ 200002, 3639]
+CellTagsIndexPosition[ 199959, 3636]
+WindowFrame->Normal*)
+
+(* Beginning of Notebook Content *)
+Notebook[{
+
+Cell[CellGroupData[{
+Cell["\<\
+How far is the Earth from the Moon?\
+\>", "WolframAlphaLong",
+ CellChangeTimes->{{3.6112720079145803`*^9, 3.61127201386392*^9}}],
+
+Cell[BoxData[
+ NamespaceBox["WolframAlphaQueryResults",
+ DynamicModuleBox[{Typeset`q$$ = "How far is the Earth from the Moon?",
+ Typeset`opts$$ = {
+ AppearanceElements -> {
+ "Warnings", "Assumptions", "Brand", "Pods", "PodMenus", "Unsuccessful",
+ "Sources"}, Asynchronous -> All,
+ TimeConstraint -> {30, Automatic, Automatic, Automatic},
+ Method -> {
+ "Formats" -> {"cell", "minput", "msound", "dataformats"}, "Server" ->
+ "http://api.wolframalpha.com/v1/"}}, Typeset`elements$$ = {
+ "Warnings", "Assumptions", "Brand", "Pods", "PodMenus", "Unsuccessful",
+ "Sources"}, Typeset`pod1$$ = XMLElement[
+ "pod", {"title" -> "Input interpretation", "scanner" -> "Identity", "id" ->
+ "Input", "position" -> "100", "error" -> "false", "numsubpods" -> "1"}, {
+ XMLElement["subpod", {"title" -> ""}, {
+ XMLElement["cell", {"compressed" -> False, "string" -> True}, {
+ Cell[
+ BoxData[
+ FormBox[
+ TagBox[
+ FormBox[
+ TagBox[
+ GridBox[{{
+ PaneBox[
+ StyleBox[
+ TagBox[
+ GridBox[{{
+ StyleBox[
+ TagBox[
+ TagBox["\"Moon\"",
+ $CellContext`TagBoxWrapper[
+ "Entity" -> {AstronomicalData, "Moon"}]], Identity], {
+ LineIndent -> 0, LineSpacing -> {0.9, 0, 1.5}}],
+ "\"distance from Earth\""}},
+ GridBoxBackground -> {"Columns" -> {
+ GrayLevel[0.949], None}, "Rows" -> {{None}}},
+ GridBoxItemSize -> {
+ "Columns" -> {{Automatic}}, "Rows" -> {{Automatic}}},
+ ColumnsEqual -> False, RowsEqual -> False,
+ GridBoxDividers -> {"Columns" -> {
+ GrayLevel[0.84],
+ GrayLevel[0.84],
+ GrayLevel[0.84]}, "Rows" -> {{
+ GrayLevel[0.84]}},
+ "RowsIndexed" -> {
+ 1 -> GrayLevel[0.84], -1 -> GrayLevel[0.84]}},
+ GridBoxSpacings -> {
+ "Columns" -> {1, 1, 1}, "Rows" -> {{0.3}}},
+ GridBoxAlignment -> {
+ "Columns" -> {{Left}}, "Rows" -> {{Baseline}}},
+ AllowScriptLevelChange -> False, BaselinePosition -> 1],
+ $CellContext`TagBoxWrapper["Separator" -> " | "]],
+ LineSpacing -> {1, 0, 1.5}, LineIndent -> 0],
+ BaselinePosition -> Center]}},
+ GridBoxItemSize -> {
+ "Columns" -> {{Automatic}}, "Rows" -> {{Automatic}}},
+ ColumnsEqual -> False, RowsEqual -> False,
+ GridBoxSpacings -> {"Columns" -> {{
+ AbsoluteThickness[-1]}}, "Rows" -> {{0}}},
+ AllowScriptLevelChange -> False],
+ $CellContext`TagBoxWrapper["Separator" -> " | "]],
+ TraditionalForm],
+ PolynomialForm[#, TraditionalOrder -> False]& ],
+ TraditionalForm]], "Output", {}]}],
+ XMLElement[
+ "dataformats", {}, {"plaintext,computabledata,formatteddata"}]}]}],
+ Typeset`pod2$$ = XMLElement[
+ "pod", {"title" -> "Current result", "scanner" -> "Data", "id" -> "Result",
+ "position" -> "200", "error" -> "false", "numsubpods" -> "1", "primary" ->
+ "true"}, {
+ XMLElement["subpod", {"title" -> ""}, {
+ XMLElement["cell", {"compressed" -> False, "string" -> True}, {
+ Cell[
+ BoxData[
+ FormBox[
+ StyleBox[
+ TagBox[
+ TagBox[
+ TagBox[
+ RowBox[{
+ TagBox["239\[ThinSpace]262",
+ $CellContext`TagBoxWrapper["StringBoxes" -> "239262"]],
+ "\[InvisibleSpace]", " ",
+ StyleBox[
+ "\"miles\"", LinebreakAdjustments -> {1, 100, 1, 0, 100},
+ LineIndent -> 0, {
+ FontFamily :> $CellContext`$UnitFontFamily, FontSize ->
+ Smaller}, StripOnInput -> False]}], Identity], #& ,
+ SyntaxForm -> Dot], "Unit", SyntaxForm -> Dot],
+ LinebreakAdjustments -> {1, 100, 1, 0, 100}, LineIndent -> 0,
+ ZeroWidthTimes -> False], TraditionalForm]], "Output", {}]}],
+ XMLElement[
+ "dataformats", {}, {
+ "plaintext,moutput,computabledata,formatteddata,numberdata,\
+quantitydata"}]}],
+ XMLElement["states", {"count" -> "1"}, {
+ XMLElement[
+ "state", {
+ "name" -> "Show metric", "input" -> "Result__Show metric"}, {}]}]}],
+ Typeset`pod3$$ = XMLElement[
+ "pod", {"title" -> "History", "scanner" -> "Data", "id" ->
+ "DistanceHistory:AstronomicalData", "position" -> "300", "error" ->
+ "false", "numsubpods" -> "1"}, {
+ XMLElement["subpod", {"title" -> ""}, {
+ XMLElement["cell", {"compressed" -> True, "string" -> False}, {
+ Cell[
+ BoxData[
+ FormBox[
+ TemplateBox[{
+ GraphicsBox[
+ GraphicsComplexBox[CompressedData["
+1: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
++H+hweW+
+ "], {{{}, {
+ EdgeForm[],
+ Directive[
+ Opacity[0.05],
+ Hue[0.67, 0.6, 0.6]],
+ GraphicsGroupBox[{
+ PolygonBox[CompressedData["
+1:eJwl1nfYjnUYxvEH2XuTkD2yV1b23iTKnmWFMkr2SJTsVfauEClSSUOiUkaI
+llIhIQ0qUX0u/XEe5/d73e/xep/7/t2Xp0CvIe0GJ00kEknkctL/O2eKRCKX
+lOIV+VX9tws7dWX9hjyK17n2l0zktXgLPEYOyX1m2c1y4x2Shs+V1ma9+BW8
+DRfVm2UAnmt+Ei/EZ/AQfAeugCvhk/h1/Yhea3ZJ/8BX6z/5BHwXbo5z45XS
+lY/m3+pD/Gl9kO/W9/JsOhevjffKJL6d/64v8hd0an1Qz9GtdE/Xi+BN0j/m
+/Kw+wRfE38Tf1YN5SV2eV8SvyUi+hl/U3/NV+g/+gR7Pa+pmPBdeIV34Y/wT
+6ciz8pz4FUnFZ0tLsx58tnwvD5qVMCuHm8oo+Vg6mGcxz4HLShN5VA7IPa5l
+di077i6z5DsZZF7cvAyugE/gnXqEXh0/E/cZX8XjcA3cOM4Q/hQv1531I2YH
+8Qz8EW6PM+FsuBb+Cr+nJ+qXzX7TF/jzOqWeJS1wN9cK443Sj8/kZ/RnfL4+
+zd/RA3kxXZqXx6/KcL6KX4ifi/urr/D9eiyvrhvxHHiZdOIj497jp/CH+E19
+N8+os/K78B6ZwLfxFPiT+Lt0c93VrFCcI3mAPx1nUQbworwUXhnnLd4ds2pm
+DfGIOBPSziyDWRbcRWbIN9LfvIj5HXhF3C8ZbVbVrAH+FW+J56mP6KX6Pj08
+zgJ+Eu/HbXF6nBnXxF/id/V4/VL8Hv0Tf04nj/dHmuHOrhWM5yP386f4D/o4
+n6dP8X64MC6Jy+EdMizOBP9Jf8uX61/5vjjn/E5dn2fDS+RePiw+sz7Ap+t9
+fJduw9PpTLwGfkfG8a38F32eb9C36I/1DN1Ud3K9QHwm6cuf5F/LA7wQL4GX
+xe+Id8esilk9/LC8L63N0ppljD0n0+Urud+8oHlxXFcekr3SyjyNeQa8RZLF
+eZImsYPi2eOX8O36mN6g++hprn0pfXkBXgxfi7OMy+rPYlfph+P5xj2Kc4sv
+x3uNK+M68Tnwi3Fe9WH9rO6oh7r2EZ4W7x5uiVPj9Ph67CtcXX+h39Zj9Yuu
+/YjX46RxjqQx7mieHx/F63Vv/UTsI32Mz9Vf8D74dlwUl8GvyEN8CT8f54Yv
+1T/HvY69wSvp2jwLfkY68CH8Q/wE3oPf0C14Kp2Ob5Yk/ACfrhvpDmb58Drp
+xafyz6U3z8+L4Cv6rzirsTv0yzI07plrl2Qkr8hr4cGx56W5WUqztLFH5XE5
+Kb3M85kXjj0Rezl2kzQzT2GeBm9KJG7+pztNGpq1p3nxWunJp8SO1Uf5HH2C
+98R5cSFcCm+TIfyZeDb663h39MU4f3oEr6Br8sx4sdzDB/FT+gM+NZ4xf103
+5cl1al4NvyVj+EZ+Lu4f/jfOTjxj3iB2YuwgvBXfptdIDzzZ/FM8O3Y0flv3
+4LfpgvxPvD32WLwDEl9GFsf7hJ/FF/B7sbd4eV2DX8ab473Xi6Q9Hmj+ljTh
+t/BUuCreLaP5C/wfmcrr83Z4khyX7mZ5zArg6rGbZbc0Nk9mnhI/Lzfi2ZrV
+M2uLJ8ox6WZ2a7y/+I8407Hz9PHYRfpBvSje5Ti/sU/xMFwOV8M/402xT/Qh
+vVDfrfu7th8/jt/EjXBS7KtZ4k78ecz1Y/q5xP/f387G2dHX+RRcN/YkzoNX
+S3c+gZ/WR/isOFu8K86N8+MSeIsMir8lnnm8u3FuYqfGHsRlcVWcAS+Qdrxf
+7NHYz3yK3sUb4iQ4Od4gf8tkszpmrfH4OB/SxSyXWb74bLGL452WBuaJ2OHx
+XkiV2LNxTqW+a//GM4odK+PkiHQ2yxnnEC+IdyJ2sVkZs8o4PZ4vbXnf2DN4
+Mn4N18P/JLn5Tyaq6F0yKnZaPCd9Js62vhb7R0/itXVLfiteJd34WH4Yz8SH
+42zqTjyHzsOvxm7BxWM3y0A8P/ZRnGl8Du+JHc1L60qxf/DG2G96nrTBfcx3
+Sl1+Q/4D9Bd4ag==
+ "]]}]}, {}, {
+ EdgeForm[],
+ Directive[
+ Opacity[0.05],
+ Hue[0.67, 0.6, 0.6]],
+ GraphicsGroupBox[{
+ PolygonBox[CompressedData["
+1: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
+ "]]}]}, {}, {}, {}, {}, {}, {}}, {{}, {}, {
+ Hue[0.67, 0.6, 0.6],
+ Directive[
+ RGBColor[0.24720000000000014`, 0.24, 0.6]],
+ LineBox[CompressedData["
+1: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
+9H+6xHgr
+ "]]}, {
+ Hue[0.9060679774997897, 0.6, 0.6],
+ Directive[
+ RGBColor[0.24720000000000014`, 0.24, 0.6],
+ Dashing[{0, Small}]],
+ LineBox[CompressedData["
+1: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
+ "]]}}}], {GridLines -> Dynamic[
+ Join[{{{3605299200,
+ GrayLevel[0.9]}, {3607891200,
+ GrayLevel[0.9]}, {3610569600,
+ GrayLevel[0.9]}, {3613161600,
+ GrayLevel[0.9]}, {3615840000,
+ GrayLevel[0.9]}, {3618518400,
+ GrayLevel[0.9]}}, {210, 220, 230, 240, 250, 260}},
+ Replace[
+ MousePosition[{"Graphics", Graphics}, None], {
+ None -> {{}, {}}, {
+ Pattern[CalculateUtilities`GraphicsUtilities`Private`x$,
+ Blank[]],
+ Pattern[CalculateUtilities`GraphicsUtilities`Private`y$,
+ Blank[]]} :> {{{
+ CalculateUtilities`GraphicsUtilities`Private`x$,
+ GrayLevel[0.7]}}, {{
+ CalculateUtilities`GraphicsUtilities`Private`y$,
+ GrayLevel[0.7]}}}}], 2]], Epilog -> {{
+ Directive[
+ AbsoluteThickness[0.5],
+ RGBColor[1, 0, 0]],
+
+ LineBox[{{3611188800, 212.72879241512837`}, {
+ 3611188800, 257.21097084166985`}}], {
+ CapForm[None], {
+ GrayLevel[1],
+ PolygonBox[{
+ Offset[{-4.6, -4.25},
+ Scaled[{0, 0.08}]],
+ Offset[{-4.6, -0.34999999999999987`},
+ Scaled[{0, 0.08}]],
+ Offset[{4.6, 4.25},
+ Scaled[{0, 0.08}]],
+ Offset[{4.6, 0.34999999999999987`},
+ Scaled[{0, 0.08}]]}]}, {
+ AbsoluteThickness[1],
+ GrayLevel[0],
+ LineBox[{{
+ Offset[{-4.6, -4.25},
+ Scaled[{0, 0.08}]],
+ Offset[{4.6, 0.34999999999999987`},
+ Scaled[{0, 0.08}]]}, {
+ Offset[{-4.6, -0.34999999999999987`},
+ Scaled[{0, 0.08}]],
+ Offset[{4.6, 4.25},
+ Scaled[{0, 0.08}]]}}]}}},
+ DynamicBox[
+ Typeset`ToBoxes[
+
+ DynamicModule[{
+ CalculateUtilities`GraphicsUtilities`Private`pt = (
+ NearestFunction[1, {1541, 1}, 3, CompressedData["
+1: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
+B69ISgU=
+ "], CompressedData["
+1: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
+Aw==
+ "], CompressedData["
+1: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
+nQ58IPd6+iXkCzVptpL1cMLBDl8Z9Pf09Sk6BnCZ4grjIkmK3NoiW20Ed4xb
+L9MWQ/+3r2yDKcx2N7K3eiVFfJI/bDWH7+h9j25aRpGbed5tFnDbHwUXZx6K
+DFb/dt8M73q6R7GHC3lvWNzXDi6yeNc0xYr9+1f8zX6cmTeX5IQt+JE+IZOQ
+7fDvNySQ/Y8f8dzgGeUCW22/Iyz0049ku0xxu8H0lUPDV775kW565LldcNrH
+VdVy435EMnqFiCcskhSaFj7iR9wzc7P2wpserGJZM+xHMu/qrPWCA/prfeq+
++pFPdbVFB+GrvPQWv0E/4vJzqJKC/+ypzivt9yMXucNMGcz9jd/H79rnR9pW
+L631h3eUc4f97fEjjltUWoLhu9yuWyy6/UjKvseuR+BubZaKkU4/8v7I1p6j
+zHrZnb86qcOP2Of5j5+ED97/9eNDux9JqmYLOgVf6Lq869gHP9L0PmUuGq5Z
+bF63us2P8A7LRsTAkxqj6i9b/Yjtv7LFcbDoUy3DQThOyDIxAf4kv8yp6j8/
+0qDULpgMZySN0BPxeiuXOelUWGx3zjVdfN4ZetzNi8z9rD1Wzf3Rj9RGSahl
+wJdVXdq6YfO7JkbZsMQCH/cZjPdUXXNNDtzpNbLGDfOp6fLcnAtfaXxprNbl
+Rwj3qR0FzPq6csz/A+Z/YrVgVxFz/hwucUWf/chj3Rv7bsNZlNaNE1ivv7a6
+I3eY9dDK92R7rx8x2ld36D4sZTTSLo/1PXrEZaYMllU3jZ0e8CNVScPHK2Fe
+Y81D77Bf66uXxj2CHzqJmJzBfqdHbBl8wtzP4Tg1DdTDnEWSWQ1sHf5vdcd3
+P1L9TmC2Fi6/MciuNovxfhX1egsn/yx91cZGkZxit6fvYcuYdQ9PclKELeCK
++H/wX/HLxYrMel3/OfgD/N+dZVmt3BR5Ob/6/Uc43vxUUjgv8lTNXpVOeEP7
+9Ml1/BSJOZMb08087++fbtizgiLDtoP9PfDiFN7edGGKWAusM+1n1vv2nSfe
+iiNPf/DJ+MJcH8F8SS7kbZ4rRb++wr7//XhoivPZJK9WPAazOifM3kY+3m6s
+KzoNz7k99U8wpkgpW2jQLFwrwcv/0gx5v/5B8xzs9tn19vwmirRvMz79D/7h
++WPED/eJvsiJXtaJEbPH0iT2OvJmRtdTIw74bF+8fMcO5Edv8x9ccLdIlGrD
+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
+yy7JIPeI/tFr8HgYeesrivNbc4XjBrPe6/O2v8fz6bQ5W2I+TAnxftDH8+tQ
+7QHhQuZ89wbuzOFjkJ1Wr68Ww6FOyb83ceM+bVBTLGGO54T2sRROnO+mWaNS
+eKr1WITqPJ0c7JKIqYerFLPSMtroJIhPc7ABbvRstNF7TycnTS3NG+GH6fMs
+bY10kp7jz/Ievsjl5rf8JZ3Ue9WGdjDXv29byMQdOlk3wfCZYJ6/WP9C5dN0
+MrJQYy04hTzxfjvbaQU6mVZrv7kSfqlvst5zDZ2w7RlfJArvyVlHGUjSmX8P
+ei4JXzr0978JfjqxOUMZysMBPPkFzO8DFy9bqWwA69nOxu17TiO01T68nvA3
+ke0VT53RL53XytoLX9g0tsvdnkbcORdUveAdjGiOWSsasR45b+87xfz3rgoH
+NQMaWVdanRIE0w9LjF2RwOst+cViYTlOiVi9fvSHVZ8K42D9kjxv/U6KtCjf
+MEyEudw1rAz+o0jNcoNdKfDIPYvFRnUUye7Yd/UK7L3PP9q0iCI7GRVy9+Di
+Q3U6G0Mo8r43oqIUbqn14rXwp8hmR1urCnjrKo4vVn4U0dPv9amGvzeSC3bo
+R1eyL71Vy5yvUtV3V0vk98P/Gb+CPSJcGtzR/3IOZTe9hjs+TufsNqTIsZ2+
+u5tgZ83UI3t1kJffaH97Cx+P0XLwUqOIn+m/ky3w16ltHfqKFOm7+2p5G3O+
+G6P3/beWIu/SPLQ6mJ/fPxzIgzxstUThRResqSMxny9CkadHfzj2wNVRdlEb
+BSly2zMm+AtsLH//QthS5IOWbYuH4PrgLxIrF1PkyibJ9JEp5vc/hG/cRf6I
+V7z3YJI5f+9jZUO//QjHlWPW35nzqbxtHPULeWiZZcdP+MqS3perpvzI94jl
+1AzcvXOF3cMxP+L7s2P+N+xTuKltxxDy84G8hHmY7T/J5cLIT64fD0n9gzmV
+hC7WIG+9tTEsYf2Oz4/gkaQjn1k95iQcsGwb+3VR5LmtDz+8WARfzVnE9faT
+H9lRWbB5CSxOW0I7jfzodW/Ldj54Hfuy9T9a/AhVsqqdH77etPxywTs/ElQ8
+5b4C1r0kyOrZ7Eci81IPiMDK6mKv3zT4kbPXD46KwU/mJNRP1fuRc1f1D0nC
+hrWrUvVrkeeuLP21Ci4/JzM3+dyPXM3oOiIDW7mv3Z33zI/kXyxZkIWfy697
+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
+9wS8dH5wKhb5+H+PylPO
+ "], Automatic,
+ Hold[
+ Nearest[CompressedData["
+1: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
+Aw==
+ "] -> CompressedData["
+1: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
+nQ58IPd6+iXkCzVptpL1cMLBDl8Z9Pf09Sk6BnCZ4grjIkmK3NoiW20Ed4xb
+L9MWQ/+3r2yDKcx2N7K3eiVFfJI/bDWH7+h9j25aRpGbed5tFnDbHwUXZx6K
+DFb/dt8M73q6R7GHC3lvWNzXDi6yeNc0xYr9+1f8zX6cmTeX5IQt+JE+IZOQ
+7fDvNySQ/Y8f8dzgGeUCW22/Iyz0049ku0xxu8H0lUPDV775kW565LldcNrH
+VdVy435EMnqFiCcskhSaFj7iR9wzc7P2wpserGJZM+xHMu/qrPWCA/prfeq+
++pFPdbVFB+GrvPQWv0E/4vJzqJKC/+ypzivt9yMXucNMGcz9jd/H79rnR9pW
+L631h3eUc4f97fEjjltUWoLhu9yuWyy6/UjKvseuR+BubZaKkU4/8v7I1p6j
+zHrZnb86qcOP2Of5j5+ED97/9eNDux9JqmYLOgVf6Lq869gHP9L0PmUuGq5Z
+bF63us2P8A7LRsTAkxqj6i9b/Yjtv7LFcbDoUy3DQThOyDIxAf4kv8yp6j8/
+0qDULpgMZySN0BPxeiuXOelUWGx3zjVdfN4ZetzNi8z9rD1Wzf3Rj9RGSahl
+wJdVXdq6YfO7JkbZsMQCH/cZjPdUXXNNDtzpNbLGDfOp6fLcnAtfaXxprNbl
+Rwj3qR0FzPq6csz/A+Z/YrVgVxFz/hwucUWf/chj3Rv7bsNZlNaNE1ivv7a6
+I3eY9dDK92R7rx8x2ld36D4sZTTSLo/1PXrEZaYMllU3jZ0e8CNVScPHK2Fe
+Y81D77Bf66uXxj2CHzqJmJzBfqdHbBl8wtzP4Tg1DdTDnEWSWQ1sHf5vdcd3
+P1L9TmC2Fi6/MciuNovxfhX1egsn/yx91cZGkZxit6fvYcuYdQ9PclKELeCK
++H/wX/HLxYrMel3/OfgD/N+dZVmt3BR5Ob/6/Uc43vxUUjgv8lTNXpVOeEP7
+9Ml1/BSJOZMb08087++fbtizgiLDtoP9PfDiFN7edGGKWAusM+1n1vv2nSfe
+iiNPf/DJ+MJcH8F8SS7kbZ4rRb++wr7//XhoivPZJK9WPAazOifM3kY+3m6s
+KzoNz7k99U8wpkgpW2jQLFwrwcv/0gx5v/5B8xzs9tn19vwmirRvMz79D/7h
++WPED/eJvsiJXtaJEbPH0iT2OvJmRtdTIw74bF+8fMcO5Edv8x9ccLdIlGrD
+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
+yy7JIPeI/tFr8HgYeesrivNbc4XjBrPe6/O2v8fz6bQ5W2I+TAnxftDH8+tQ
+7QHhQuZ89wbuzOFjkJ1Wr68Ww6FOyb83ceM+bVBTLGGO54T2sRROnO+mWaNS
+eKr1WITqPJ0c7JKIqYerFLPSMtroJIhPc7ABbvRstNF7TycnTS3NG+GH6fMs
+bY10kp7jz/Ievsjl5rf8JZ3Ue9WGdjDXv29byMQdOlk3wfCZYJ6/WP9C5dN0
+MrJQYy04hTzxfjvbaQU6mVZrv7kSfqlvst5zDZ2w7RlfJArvyVlHGUjSmX8P
+ei4JXzr0978JfjqxOUMZysMBPPkFzO8DFy9bqWwA69nOxu17TiO01T68nvA3
+ke0VT53RL53XytoLX9g0tsvdnkbcORdUveAdjGiOWSsasR45b+87xfz3rgoH
+NQMaWVdanRIE0w9LjF2RwOst+cViYTlOiVi9fvSHVZ8K42D9kjxv/U6KtCjf
+MEyEudw1rAz+o0jNcoNdKfDIPYvFRnUUye7Yd/UK7L3PP9q0iCI7GRVy9+Di
+Q3U6G0Mo8r43oqIUbqn14rXwp8hmR1urCnjrKo4vVn4U0dPv9amGvzeSC3bo
+R1eyL71Vy5yvUtV3V0vk98P/Gb+CPSJcGtzR/3IOZTe9hjs+TufsNqTIsZ2+
+u5tgZ83UI3t1kJffaH97Cx+P0XLwUqOIn+m/ky3w16ltHfqKFOm7+2p5G3O+
+G6P3/beWIu/SPLQ6mJ/fPxzIgzxstUThRResqSMxny9CkadHfzj2wNVRdlEb
+BSly2zMm+AtsLH//QthS5IOWbYuH4PrgLxIrF1PkyibJ9JEp5vc/hG/cRf6I
+V7z3YJI5f+9jZUO//QjHlWPW35nzqbxtHPULeWiZZcdP+MqS3perpvzI94jl
+1AzcvXOF3cMxP+L7s2P+N+xTuKltxxDy84G8hHmY7T/J5cLIT64fD0n9gzmV
+hC7WIG+9tTEsYf2Oz4/gkaQjn1k95iQcsGwb+3VR5LmtDz+8WARfzVnE9faT
+H9lRWbB5CSxOW0I7jfzodW/Ldj54Hfuy9T9a/AhVsqqdH77etPxywTs/ElQ8
+5b4C1r0kyOrZ7Eci81IPiMDK6mKv3zT4kbPXD46KwU/mJNRP1fuRc1f1D0nC
+hrWrUvVrkeeuLP21Ci4/JzM3+dyPXM3oOiIDW7mv3Z33zI/kXyxZkIWfy697
+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
+9wS8dH5wKhb5+H+PylPO
+ "]]]][
+ Part[#, 1]]& )[
+ MousePosition[{"Graphics", Graphics}, {0, 0}]],
+ CalculateUtilities`GraphicsUtilities`Private`scaled =
+ MousePosition[{"GraphicsScaled", Graphics}, None]},
+ If[
+ CalculateUtilities`GraphicsUtilities`Private`scaled ===
+ None, {}, {
+ Text[
+ Style[
+ Row[{
+ (
+ DateString[#, {
+ "DayShort", " ", "MonthNameShort", " ", "Year"}]& )[
+ Part[
+ CalculateUtilities`GraphicsUtilities`Private`pt, 1, 1]],
+ (
+ Function[{
+ CalculateUtilities`GraphicsUtilities`Private`a,
+ CalculateUtilities`GraphicsUtilities`Private`acc},
+ Quiet[
+ RawBoxes[
+ ToBoxes[
+ NumberForm[CalculateUtilities`GraphicsUtilities`Private`a,
+ Max[1,
+ Ceiling[
+ RealExponent[
+ CalculateUtilities`GraphicsUtilities`Private`a] +
+ CalculateUtilities`GraphicsUtilities`Private`acc]],
+ ExponentFunction -> (Null& ),
+ NumberFormat -> (StringReplace[#, StringExpression[
+ Pattern[CalculateUtilities`GraphicsUtilities`Private`s,
+ BlankSequence[]], ".", EndOfString] ->
+ CalculateUtilities`GraphicsUtilities`Private`s]& )]]]]][#,
+ 0]& )[
+ Part[
+ CalculateUtilities`GraphicsUtilities`Private`pt, 1, 2]]},
+ ","], 12],
+ Part[
+ CalculateUtilities`GraphicsUtilities`Private`pt, 1], {
+ 1.5 Sign[
+ Part[CalculateUtilities`GraphicsUtilities`Private`scaled,
+ 1] - 0.5], 0}, Background -> White],
+ AbsolutePointSize[7],
+ Point[CalculateUtilities`GraphicsUtilities`Private`pt],
+ White,
+ AbsolutePointSize[5],
+ Point[CalculateUtilities`GraphicsUtilities`Private`pt]}]],
+ TraditionalForm, Graphics]]}, FrameTicks -> {{{{220.,
+ FormBox[
+ TagBox["220", #& ], TraditionalForm], {0.00625, 0.}, {
+ GrayLevel[0.],
+ AbsoluteThickness[0.25]}}, {230.,
+ FormBox[
+ TagBox["230", #& ], TraditionalForm], {0.00625, 0.}, {
+ GrayLevel[0.],
+ AbsoluteThickness[0.25]}}, {240.,
+ FormBox[
+ TagBox["240", #& ], TraditionalForm], {0.00625, 0.}, {
+ GrayLevel[0.],
+ AbsoluteThickness[0.25]}}, {250.,
+ FormBox[
+ TagBox["250", #& ], TraditionalForm], {0.00625, 0.}, {
+ GrayLevel[0.],
+ AbsoluteThickness[0.25]}}, {222.,
+ FormBox["\"\"", TraditionalForm], {0.00375, 0.}, {
+ GrayLevel[0.],
+ AbsoluteThickness[0.125]}}, {224.,
+ FormBox["\"\"", TraditionalForm], {0.00375, 0.}, {
+ GrayLevel[0.],
+ AbsoluteThickness[0.125]}}, {226.,
+ FormBox["\"\"", TraditionalForm], {0.00375, 0.}, {
+ GrayLevel[0.],
+ AbsoluteThickness[0.125]}}, {228.,
+ FormBox["\"\"", TraditionalForm], {0.00375, 0.}, {
+ GrayLevel[0.],
+ AbsoluteThickness[0.125]}}, {232.,
+ FormBox["\"\"", TraditionalForm], {0.00375, 0.}, {
+ GrayLevel[0.],
+ AbsoluteThickness[0.125]}}, {234.,
+ FormBox["\"\"", TraditionalForm], {0.00375, 0.}, {
+ GrayLevel[0.],
+ AbsoluteThickness[0.125]}}, {236.,
+ FormBox["\"\"", TraditionalForm], {0.00375, 0.}, {
+ GrayLevel[0.],
+ AbsoluteThickness[0.125]}}, {238.,
+ FormBox["\"\"", TraditionalForm], {0.00375, 0.}, {
+ GrayLevel[0.],
+ AbsoluteThickness[0.125]}}, {242.,
+ FormBox["\"\"", TraditionalForm], {0.00375, 0.}, {
+ GrayLevel[0.],
+ AbsoluteThickness[0.125]}}, {244.,
+ FormBox["\"\"", TraditionalForm], {0.00375, 0.}, {
+ GrayLevel[0.],
+ AbsoluteThickness[0.125]}}, {246.,
+ FormBox["\"\"", TraditionalForm], {0.00375, 0.}, {
+ GrayLevel[0.],
+ AbsoluteThickness[0.125]}}, {248.,
+ FormBox["\"\"", TraditionalForm], {0.00375, 0.}, {
+ GrayLevel[0.],
+ AbsoluteThickness[0.125]}}, {252.,
+ FormBox["\"\"", TraditionalForm], {0.00375, 0.}, {
+ GrayLevel[0.],
+ AbsoluteThickness[0.125]}}, {254.,
+ FormBox["\"\"", TraditionalForm], {0.00375, 0.}, {
+ GrayLevel[0.],
+ AbsoluteThickness[0.125]}}, {256.,
+ FormBox["\"\"", TraditionalForm], {0.00375, 0.}, {
+ GrayLevel[0.],
+ AbsoluteThickness[0.125]}}}, {{220.,
+ FormBox["\"\"", TraditionalForm], {0.00625, 0.}, {
+ GrayLevel[0.],
+ AbsoluteThickness[0.25]}}, {230.,
+ FormBox["\"\"", TraditionalForm], {0.00625, 0.}, {
+ GrayLevel[0.],
+ AbsoluteThickness[0.25]}}, {240.,
+ FormBox["\"\"", TraditionalForm], {0.00625, 0.}, {
+ GrayLevel[0.],
+ AbsoluteThickness[0.25]}}, {250.,
+ FormBox["\"\"", TraditionalForm], {0.00625, 0.}, {
+ GrayLevel[0.],
+ AbsoluteThickness[0.25]}}, {222.,
+ FormBox["\"\"", TraditionalForm], {0.00375, 0.}, {
+ GrayLevel[0.],
+ AbsoluteThickness[0.125]}}, {224.,
+ FormBox["\"\"", TraditionalForm], {0.00375, 0.}, {
+ GrayLevel[0.],
+ AbsoluteThickness[0.125]}}, {226.,
+ FormBox["\"\"", TraditionalForm], {0.00375, 0.}, {
+ GrayLevel[0.],
+ AbsoluteThickness[0.125]}}, {228.,
+ FormBox["\"\"", TraditionalForm], {0.00375, 0.}, {
+ GrayLevel[0.],
+ AbsoluteThickness[0.125]}}, {232.,
+ FormBox["\"\"", TraditionalForm], {0.00375, 0.}, {
+ GrayLevel[0.],
+ AbsoluteThickness[0.125]}}, {234.,
+ FormBox["\"\"", TraditionalForm], {0.00375, 0.}, {
+ GrayLevel[0.],
+ AbsoluteThickness[0.125]}}, {236.,
+ FormBox["\"\"", TraditionalForm], {0.00375, 0.}, {
+ GrayLevel[0.],
+ AbsoluteThickness[0.125]}}, {238.,
+ FormBox["\"\"", TraditionalForm], {0.00375, 0.}, {
+ GrayLevel[0.],
+ AbsoluteThickness[0.125]}}, {242.,
+ FormBox["\"\"", TraditionalForm], {0.00375, 0.}, {
+ GrayLevel[0.],
+ AbsoluteThickness[0.125]}}, {244.,
+ FormBox["\"\"", TraditionalForm], {0.00375, 0.}, {
+ GrayLevel[0.],
+ AbsoluteThickness[0.125]}}, {246.,
+ FormBox["\"\"", TraditionalForm], {0.00375, 0.}, {
+ GrayLevel[0.],
+ AbsoluteThickness[0.125]}}, {248.,
+ FormBox["\"\"", TraditionalForm], {0.00375, 0.}, {
+ GrayLevel[0.],
+ AbsoluteThickness[0.125]}}, {218.,
+ FormBox["\"\"", TraditionalForm], {0.00375, 0.}, {
+ GrayLevel[0.],
+ AbsoluteThickness[0.125]}}, {216.,
+ FormBox["\"\"", TraditionalForm], {0.00375, 0.}, {
+ GrayLevel[0.],
+ AbsoluteThickness[0.125]}}, {214.,
+ FormBox["\"\"", TraditionalForm], {0.00375, 0.}, {
+ GrayLevel[0.],
+ AbsoluteThickness[0.125]}}, {252.,
+ FormBox["\"\"", TraditionalForm], {0.00375, 0.}, {
+ GrayLevel[0.],
+ AbsoluteThickness[0.125]}}, {254.,
+ FormBox["\"\"", TraditionalForm], {0.00375, 0.}, {
+ GrayLevel[0.],
+ AbsoluteThickness[0.125]}}, {256.,
+ FormBox["\"\"", TraditionalForm], {0.00375, 0.}, {
+ GrayLevel[0.],
+ AbsoluteThickness[0.125]}}}}, {{{3605299200,
+ FormBox["\"Apr\"", TraditionalForm], {
+ 0.020601132958329826`, 0}}, {3607891200,
+ FormBox["\"May\"", TraditionalForm], {
+ 0.020601132958329826`, 0}}, {3610569600,
+ FormBox["\"Jun\"", TraditionalForm], {
+ 0.020601132958329826`, 0}}, {3613161600,
+ FormBox["\"Jul\"", TraditionalForm], {
+ 0.020601132958329826`, 0}}, {3615840000,
+ FormBox["\"Aug\"", TraditionalForm], {
+ 0.020601132958329826`, 0}}, {3618518400,
+ FormBox["\"Sep\"", TraditionalForm], {
+ 0.020601132958329826`, 0}}, {3603830400,
+ FormBox["\"\"", TraditionalForm], {
+ 0.012360679774997897`, 0}}, {3606508800,
+ FormBox["\"\"", TraditionalForm], {
+ 0.012360679774997897`, 0}}, {3609100800,
+ FormBox["\"\"", TraditionalForm], {
+ 0.012360679774997897`, 0}}, {3611779200,
+ FormBox["\"\"", TraditionalForm], {
+ 0.012360679774997897`, 0}}, {3614371200,
+ FormBox["\"\"", TraditionalForm], {
+ 0.012360679774997897`, 0}}, {3617049600,
+ FormBox["\"\"", TraditionalForm], {
+ 0.012360679774997897`, 0}}}, {{3605299200,
+ FormBox[
+ StyleBox["\"\"", 0, StripOnInput -> False],
+ TraditionalForm], {0.020601132958329826`, 0}}, {
+ 3607891200,
+ FormBox[
+ StyleBox["\"\"", 0, StripOnInput -> False],
+ TraditionalForm], {0.020601132958329826`, 0}}, {
+ 3610569600,
+ FormBox[
+ StyleBox["\"\"", 0, StripOnInput -> False],
+ TraditionalForm], {0.020601132958329826`, 0}}, {
+ 3613161600,
+ FormBox[
+ StyleBox["\"\"", 0, StripOnInput -> False],
+ TraditionalForm], {0.020601132958329826`, 0}}, {
+ 3615840000,
+ FormBox[
+ StyleBox["\"\"", 0, StripOnInput -> False],
+ TraditionalForm], {0.020601132958329826`, 0}}, {
+ 3618518400,
+ FormBox[
+ StyleBox["\"\"", 0, StripOnInput -> False],
+ TraditionalForm], {0.020601132958329826`, 0}}, {
+ 3603830400,
+ FormBox[
+ StyleBox["\"\"", 0, StripOnInput -> False],
+ TraditionalForm], {0.012360679774997897`, 0}}, {
+ 3606508800,
+ FormBox[
+ StyleBox["\"\"", 0, StripOnInput -> False],
+ TraditionalForm], {0.012360679774997897`, 0}}, {
+ 3609100800,
+ FormBox[
+ StyleBox["\"\"", 0, StripOnInput -> False],
+ TraditionalForm], {0.012360679774997897`, 0}}, {
+ 3611779200,
+ FormBox[
+ StyleBox["\"\"", 0, StripOnInput -> False],
+ TraditionalForm], {0.012360679774997897`, 0}}, {
+ 3614371200,
+ FormBox[
+ StyleBox["\"\"", 0, StripOnInput -> False],
+ TraditionalForm], {0.012360679774997897`, 0}}, {
+ 3617049600,
+ FormBox[
+ StyleBox["\"\"", 0, StripOnInput -> False],
+ TraditionalForm], {0.012360679774997897`, 0}}}}},
+ ImagePadding -> All, GridLines -> {{{3605299200,
+ GrayLevel[0.9]}, {3607891200,
+ GrayLevel[0.9]}, {3610569600,
+ GrayLevel[0.9]}, {3613161600,
+ GrayLevel[0.9]}, {3615840000,
+ GrayLevel[0.9]}, {3618518400,
+ GrayLevel[0.9]}}, Automatic}, Epilog -> {
+ Directive[
+ AbsoluteThickness[0.5],
+ RGBColor[1, 0, 0]],
+
+ LineBox[{{3611188800, 212.72879241512837`}, {
+ 3611188800, 257.21097084166985`}}], {
+ CapForm[None], {
+ GrayLevel[1],
+ PolygonBox[{
+ Offset[{-4.6, -4.25},
+ Scaled[{0, 0.08}]],
+ Offset[{-4.6, -0.34999999999999987`},
+ Scaled[{0, 0.08}]],
+ Offset[{4.6, 4.25},
+ Scaled[{0, 0.08}]],
+ Offset[{4.6, 0.34999999999999987`},
+ Scaled[{0, 0.08}]]}]}, {
+ AbsoluteThickness[1],
+ GrayLevel[0],
+ LineBox[{{
+ Offset[{-4.6, -4.25},
+ Scaled[{0, 0.08}]],
+ Offset[{4.6, 0.34999999999999987`},
+ Scaled[{0, 0.08}]]}, {
+ Offset[{-4.6, -0.34999999999999987`},
+ Scaled[{0, 0.08}]],
+ Offset[{4.6, 4.25},
+ Scaled[{0, 0.08}]]}}]}}}, PlotRangeClipping -> False,
+ PlotRangePadding -> None, AspectRatio -> 0.3,
+ AxesOrigin -> {3.604*^9, 214.}, AxesStyle -> Directive[
+ GrayLevel[0, 0.35], FontColor -> GrayLevel[0.25],
+ FontOpacity -> 1], BaseStyle -> AbsoluteThickness[1],
+ Epilog -> {
+ Directive[
+ AbsoluteThickness[0.5],
+ RGBColor[1, 0, 0]],
+
+ LineBox[{{3611188800, 212.72879241512837`}, {
+ 3611188800, 257.21097084166985`}}]}, Frame -> True,
+ FrameLabel -> {None, None}, FrameStyle -> Directive[
+ GrayLevel[0, 0.35], FontColor -> GrayLevel[0.25],
+ FontOpacity -> 1], FrameTicksStyle ->
+ Directive[FontFamily -> "Times", FontSize -> 10],
+ GridLines -> {{{3605299200,
+ GrayLevel[0.9]}, {3607891200,
+ GrayLevel[0.9]}, {3610569600,
+ GrayLevel[0.9]}, {3613161600,
+ GrayLevel[0.9]}, {3615840000,
+ GrayLevel[0.9]}, {3618518400,
+ GrayLevel[0.9]}}, Automatic}, GridLinesStyle ->
+ GrayLevel[0.9], ImageSize -> Full,
+ LabelStyle -> {FontFamily -> "Verdana", FontSize -> 10},
+ Method -> {"AxesInFront" -> True},
+ PlotRange -> {{3603398400, 3619123200}, {212.72879241512837`,
+ 257.21097084166985`}}, PlotRangeClipping -> True,
+ PlotRangePadding -> None, Prolog -> {
+ Opacity[0],
+ TagBox[
+ RectangleBox[
+ Scaled[{0, 0}],
+ Scaled[{1, 1}]], Annotation[#, "DatePlot", "Frame"]& ]},
+ TicksStyle ->
+ Directive[FontFamily -> "Times", FontSize -> 10]}],
+ TagBox[
+ GridBox[{{
+ TagBox[
+ GridBox[{{
+ StyleBox[
+ RowBox[{"\"(\"", "\[NoBreak]",
+ FormBox[
+ TagBox[
+ FormBox[
+ TemplateBox[{"\"from \"",
+ FormBox[
+ TagBox["\"Mar 10, 2014\"", Identity], TraditionalForm],
+ "\" to \"",
+ FormBox[
+ TagBox["\"Sep 8, 2014\"", Identity], TraditionalForm]},
+ "RowDefault"], TraditionalForm],
+ Format[#, TraditionalForm]& ], TraditionalForm],
+ "\[NoBreak]", "\")\""}], {
+ FontFamily -> "Verdana", FontSize -> 10,
+ GrayLevel[0.5],
+ LinebreakAdjustments -> {1, 100, 1, 0, 100}, LineIndent ->
+ 0}, StripOnInput -> False]}},
+ GridBoxAlignment -> {"Columns" -> {{Left}}},
+ DefaultBaseStyle -> "Column",
+ GridBoxItemSize -> {
+ "Columns" -> {{Automatic}}, "Rows" -> {{Automatic}}}],
+ "Column"],
+ TagBox[
+ GridBox[{{
+ StyleBox[
+ RowBox[{"\"(\"", "\[NoBreak]",
+
+ TemplateBox[{
+ "\"in \"", "\"thousands\"", "\" of \"", "\"miles\""},
+ "RowDefault"], "\[NoBreak]", "\")\""}], {
+ FontFamily -> "Verdana", FontSize -> 10,
+ GrayLevel[0.5],
+ LinebreakAdjustments -> {1, 100, 1, 0, 100}, LineIndent ->
+ 0}, StripOnInput -> False]}},
+ GridBoxAlignment -> {"Columns" -> {{Left}}},
+ DefaultBaseStyle -> "Column",
+ GridBoxItemSize -> {
+ "Columns" -> {{Automatic}}, "Rows" -> {{Automatic}}}],
+ "Column"]}},
+ GridBoxAlignment -> {
+ "Columns" -> {{Automatic}}, "Rows" -> {{Baseline}}},
+ AutoDelete -> False,
+ GridBoxItemSize -> {
+ "Columns" -> {{Automatic}}, "Rows" -> {{Automatic}}},
+ GridBoxSpacings -> {"Columns" -> {{0.5}}}], "Grid"]},
+ "Labeled", DisplayFunction -> (FormBox[
+ GridBox[{{
+ TagBox[
+ ItemBox[
+ PaneBox[
+ TagBox[#, "SkipImageSizeLevel"],
+ Alignment -> {Center, Baseline}, BaselinePosition ->
+ Baseline], DefaultBaseStyle -> "Labeled"],
+ "SkipImageSizeLevel"]}, {
+
+ ItemBox[#2, Alignment -> {Left, Inherited},
+ DefaultBaseStyle -> "LabeledLabel"]}},
+ GridBoxAlignment -> {
+ "Columns" -> {{Center}}, "Rows" -> {{Center}}}, AutoDelete ->
+ False, GridBoxItemSize -> {
+ "Columns" -> {{Automatic}}, "Rows" -> {{Automatic}}},
+ BaselinePosition -> {1, 1}], TraditionalForm]& ),
+ InterpretationFunction -> (RowBox[{
+ StyleBox[
+ "Labeled", FontFamily -> "Bitstream Vera Sans",
+ FontSize -> -1 + Inherited], "[",
+ RowBox[{#, ",",
+ RowBox[{"{", #2, "}"}], ",",
+ RowBox[{"(", "\[NoBreak]",
+ GridBox[{{
+ StyleBox[
+ "Bottom", FontFamily -> "Bitstream Vera Sans",
+ FontSize -> -1 + Inherited],
+ StyleBox[
+ "Left", FontFamily -> "Bitstream Vera Sans",
+ FontSize -> -1 + Inherited]}}, RowSpacings -> 1,
+ ColumnSpacings -> 1, RowAlignments -> Baseline,
+ ColumnAlignments -> Center], "\[NoBreak]", ")"}]}],
+ "]"}]& )], TraditionalForm]], "Output", {
+ Background -> None}]}],
+ XMLElement[
+ "dataformats", {}, {"computabledata,formatteddata,timeseriesdata"}]}],
+ XMLElement["states", {"count" -> "2"}, {
+ XMLElement[
+ "state", {
+ "name" -> "Use Metric", "input" ->
+ "DistanceHistory:AstronomicalData__Use Metric"}, {}],
+ XMLElement[
+ "statelist", {
+ "count" -> "5", "value" -> "\[PlusMinus]3 months", "delimiters" ->
+ ""}, {
+ XMLElement[
+ "state", {
+ "name" -> "\[PlusMinus]3 months", "input" ->
+ "DistanceHistory:AstronomicalData__\[PlusMinus]3 months"}, {}],
+ XMLElement[
+ "state", {
+ "name" -> "\[PlusMinus]6 months", "input" ->
+ "DistanceHistory:AstronomicalData__\[PlusMinus]6 months"}, {}],
+ XMLElement[
+ "state", {
+ "name" -> "\[PlusMinus]1 year", "input" ->
+ "DistanceHistory:AstronomicalData__\[PlusMinus]1 year"}, {}],
+ XMLElement[
+ "state", {
+ "name" -> "\[PlusMinus]5 years", "input" ->
+ "DistanceHistory:AstronomicalData__\[PlusMinus]5 years"}, {}],
+ XMLElement[
+ "state", {
+ "name" -> "\[PlusMinus]10 years", "input" ->
+ "DistanceHistory:AstronomicalData__\[PlusMinus]10 years"}, \
+{}]}]}]}], Typeset`pod4$$ = XMLElement[
+ "pod", {"title" -> "Unit conversions", "scanner" -> "Unit", "id" ->
+ "UnitConversion", "position" -> "400", "error" -> "false", "numsubpods" ->
+ "2"}, {
+ XMLElement["subpod", {"title" -> ""}, {
+ XMLElement["cell", {"compressed" -> False, "string" -> True}, {
+ Cell[
+ BoxData[
+ FormBox[
+ StyleBox[
+ TagBox[
+ RowBox[{
+ TagBox[
+ TagBox[
+ RowBox[{
+ TagBox["385\[ThinSpace]056",
+ $CellContext`TagBoxWrapper["StringBoxes" -> "385056"]],
+ "\[NoBreak]",
+ StyleBox[
+ RowBox[{}], FontFamily -> "Helvetica", FontSize ->
+ Smaller], "\[InvisibleSpace]", "\[ThickSpace]",
+ "\[InvisibleSpace]",
+ StyleBox[
+ "\"km\"", FontFamily -> "Helvetica", FontSize ->
+ Smaller]}], Identity], #& , SyntaxForm -> Dot], " ",
+ StyleBox[
+
+ RowBox[{
+ "\"(\"", "\[NoBreak]", "\"kilometers\"", "\[NoBreak]",
+ "\")\""}], {
+ FontFamily :> $CellContext`$UnitFontFamily, FontSize ->
+ Smaller,
+ GrayLevel[0.6], LinebreakAdjustments -> {1, 100, 1, 0, 100},
+ LineIndent -> 0}, StripOnInput -> False]}], "Unit",
+ SyntaxForm -> Dot], LinebreakAdjustments -> {1, 100, 1, 0, 100},
+ LineIndent -> 0, ZeroWidthTimes -> False], TraditionalForm]],
+ "Output", {}]}],
+ XMLElement[
+ "dataformats", {}, {
+ "plaintext,computabledata,formatteddata,numberdata,quantitydata"}]}],
+ XMLElement["subpod", {"title" -> ""}, {
+ XMLElement["cell", {"compressed" -> False, "string" -> True}, {
+ Cell[
+ BoxData[
+ FormBox[
+ StyleBox[
+ TagBox[
+ TagBox[
+ TagBox[
+ RowBox[{
+ TagBox[
+ RowBox[{"3.851",
+ StyleBox["\[Times]",
+ GrayLevel[0.5]],
+ SuperscriptBox["10", "8"]}],
+ $CellContext`TagBoxWrapper[
+ "StringBoxes" -> RowBox[{"3.851", "\[Times]",
+ SuperscriptBox["10", "8"]}]], SyntaxForm -> CenterDot],
+ "\[InvisibleSpace]", " ",
+ StyleBox[
+ "\"meters\"", LinebreakAdjustments -> {1, 100, 1, 0, 100},
+ LineIndent -> 0, {
+ FontFamily :> $CellContext`$UnitFontFamily, FontSize ->
+ Smaller}, StripOnInput -> False]}], Identity], #& ,
+ SyntaxForm -> Dot], "Unit", SyntaxForm -> Dot],
+ LinebreakAdjustments -> {1, 100, 1, 0, 100}, LineIndent -> 0,
+ ZeroWidthTimes -> False], TraditionalForm]], "Output", {}]}],
+ XMLElement[
+ "dataformats", {}, {
+ "plaintext,computabledata,formatteddata,numberdata,quantitydata"}]}]}]\
+, Typeset`pod5$$ = XMLElement[
+ "pod", {"title" -> "Comparison as distance", "scanner" -> "Unit", "id" ->
+ "ComparisonAsDistance", "position" -> "500", "error" -> "false",
+ "numsubpods" -> "1"}, {
+ XMLElement["subpod", {"title" -> ""}, {
+ XMLElement["cell", {"compressed" -> False, "string" -> True}, {
+ Cell[
+ BoxData[
+ FormBox[
+ FormBox[
+
+ TemplateBox[{
+ "\" \[TildeTilde] \"",
+ "1.00017081986198578379799203020065608125`4.767535813146223",
+ "\" \"",
+ StyleBox["\"\[Times]\"",
+ GrayLevel[0.3], FontSize -> 10.219999999999999`, StripOnInput ->
+ False], "\"\[MediumSpace]\"",
+ StyleBox[
+ "\"mean Moon\[Hyphen]Earth distance\"", FontFamily ->
+ "Helvetica", FontSize -> Smaller, StripOnInput -> False],
+ "\" \"",
+ StyleBox[
+ RowBox[{"\"(\"", "\[NoBreak]",
+ TemplateBox[{"\"\[MediumSpace]\"",
+ StyleBox[
+ TagBox[
+ TagBox[
+ TagBox[
+ RowBox[{
+ TagBox[
+ RowBox[{"3.85",
+ StyleBox["\[Times]",
+ GrayLevel[0.5]],
+ SuperscriptBox["10", "8"]}],
+ $CellContext`TagBoxWrapper[
+ "StringBoxes" -> RowBox[{"3.85", "\[Times]",
+ SuperscriptBox["10", "8"]}]], SyntaxForm -> CenterDot],
+ "\[NoBreak]",
+ StyleBox[
+ RowBox[{}], FontFamily -> "Helvetica", FontSize ->
+ Smaller], "\[InvisibleSpace]", "\[ThickSpace]",
+ "\[InvisibleSpace]",
+ StyleBox[
+ "\"m\"", FontFamily -> "Helvetica", FontSize ->
+ Smaller]}], Identity], #& , SyntaxForm -> Dot], "Unit",
+ SyntaxForm -> Dot],
+ LinebreakAdjustments -> {1, 100, 1, 0, 100}, LineIndent ->
+ 0, ZeroWidthTimes -> False], "\"\[MediumSpace]\""},
+ "RowDefault"], "\[NoBreak]", "\")\""}], {
+ FontFamily -> "Verdana", FontSize -> 10,
+ GrayLevel[0.5], LinebreakAdjustments -> {1, 100, 1, 0, 100},
+ LineIndent -> 0}, StripOnInput -> False]}, "RowDefault"],
+ TraditionalForm], TraditionalForm]], "Output", {}]}],
+ XMLElement["dataformats", {}, {"plaintext"}]}]}], Typeset`pod6$$ =
+ XMLElement[
+ "pod", {"title" -> "Corresponding quantities", "scanner" -> "Unit", "id" ->
+ "CorrespondingQuantity", "position" -> "600", "error" -> "false",
+ "numsubpods" -> "2"}, {
+ XMLElement["subpod", {"title" -> ""}, {
+ XMLElement["cell", {"compressed" -> False, "string" -> True}, {
+ Cell[
+ BoxData[
+ FormBox[
+ TagBox[
+ GridBox[{{
+ InterpretationBox[
+ Cell[
+ TextData[{"Light travel time ",
+ Cell[
+ BoxData[
+ FormBox["t", TraditionalForm]]], " in vacuum from ",
+ Cell[
+ BoxData[
+ FormBox[
+ FormBox[
+ TemplateBox[{
+ TagBox[
+ RowBox[{"t", "\[LongEqual]",
+
+ RowBox[{"x", "\[InvisibleSpace]", "\"/\"",
+ "\[InvisibleSpace]", "c"}]}],
+ PolynomialForm[#, TraditionalOrder -> False]& ]},
+ "RowDefault"], TraditionalForm], TraditionalForm]]],
+ ":"}]],
+ TextCell[
+ Row[{"Light travel time ",
+ $CellContext`CalculateSymbol["t"], " in vacuum from ",
+ $CellContext`InlineForm["t \[LongEqual] x/c"], ":"}]]]}, {
+ TagBox[
+ GridBox[{{
+ InterpretationBox[
+ StyleBox[
+
+ GraphicsBox[{}, ImageSize -> {10, 0}, BaselinePosition ->
+ Baseline], "CacheGraphics" -> False],
+ Spacer[10]],
+ StyleBox[
+ TagBox[
+ TagBox[
+ TagBox[
+ RowBox[{
+ TagBox["1.3",
+ $CellContext`TagBoxWrapper["StringBoxes" -> "1.3"]],
+ "\[InvisibleSpace]", " ",
+ StyleBox[
+ "\"seconds\"",
+ LinebreakAdjustments -> {1, 100, 1, 0, 100}, LineIndent ->
+ 0, {FontFamily :> $CellContext`$UnitFontFamily, FontSize ->
+ Smaller}, StripOnInput -> False]}], Identity], #& ,
+ SyntaxForm -> Dot], "Unit", SyntaxForm -> Dot],
+ LinebreakAdjustments -> {1, 100, 1, 0, 100}, LineIndent ->
+ 0, ZeroWidthTimes -> False]}},
+ GridBoxAlignment -> {"Columns" -> {{Left}}}, AutoDelete ->
+ False, GridBoxItemSize -> {
+ "Columns" -> {{Automatic}}, "Rows" -> {{Automatic}}}],
+ "Grid"]}}, GridBoxAlignment -> {"Columns" -> {{Left}}},
+ DefaultBaseStyle -> "Column",
+ GridBoxItemSize -> {"ColumnsIndexed" -> {1 -> 0}}], "Column"],
+ TraditionalForm]], "Output", {}]}],
+ XMLElement[
+ "dataformats", {}, {
+ "plaintext,computabledata,formatteddata,numberdata,quantitydata"}]}],
+ XMLElement["subpod", {"title" -> ""}, {
+ XMLElement["cell", {"compressed" -> False, "string" -> True}, {
+ Cell[
+ BoxData[
+ FormBox[
+ TagBox[
+ GridBox[{{
+ InterpretationBox[
+ Cell[
+ TextData[{"Light travel time ",
+ Cell[
+ BoxData[
+ FormBox["t", TraditionalForm]]], " in an optical fiber ",
+ Cell[
+ BoxData[
+ FormBox[
+ FormBox[
+ TemplateBox[{
+ TagBox[
+ RowBox[{"t", "\[LongEqual]",
+ RowBox[{
+ RowBox[{"1.48`", "\[InvisibleSpace]", "x"}],
+ "\[InvisibleSpace]", "\"/\"", "\[InvisibleSpace]",
+ "c"}]}], PolynomialForm[#, TraditionalOrder -> False]& ]},
+ "RowDefault"], TraditionalForm], TraditionalForm]]],
+ ":"}]],
+ TextCell[
+ Row[{"Light travel time ",
+ $CellContext`CalculateSymbol["t"],
+ " in an optical fiber ",
+ $CellContext`InlineForm["t \[LongEqual] 1.48x/c"],
+ ":"}]]]}, {
+ TagBox[
+ GridBox[{{
+ InterpretationBox[
+ StyleBox[
+
+ GraphicsBox[{}, ImageSize -> {10, 0}, BaselinePosition ->
+ Baseline], "CacheGraphics" -> False],
+ Spacer[10]],
+ StyleBox[
+ TagBox[
+ TagBox[
+ TagBox[
+ RowBox[{
+ TagBox["1.9",
+ $CellContext`TagBoxWrapper["StringBoxes" -> "1.9"]],
+ "\[InvisibleSpace]", " ",
+ StyleBox[
+ "\"seconds\"",
+ LinebreakAdjustments -> {1, 100, 1, 0, 100}, LineIndent ->
+ 0, {FontFamily :> $CellContext`$UnitFontFamily, FontSize ->
+ Smaller}, StripOnInput -> False]}], Identity], #& ,
+ SyntaxForm -> Dot], "Unit", SyntaxForm -> Dot],
+ LinebreakAdjustments -> {1, 100, 1, 0, 100}, LineIndent ->
+ 0, ZeroWidthTimes -> False]}},
+ GridBoxAlignment -> {"Columns" -> {{Left}}}, AutoDelete ->
+ False, GridBoxItemSize -> {
+ "Columns" -> {{Automatic}}, "Rows" -> {{Automatic}}}],
+ "Grid"]}}, GridBoxAlignment -> {"Columns" -> {{Left}}},
+ DefaultBaseStyle -> "Column",
+ GridBoxItemSize -> {"ColumnsIndexed" -> {1 -> 0}}], "Column"],
+ TraditionalForm]], "Output", {}]}],
+ XMLElement[
+ "dataformats", {}, {
+ "plaintext,computabledata,formatteddata,numberdata,quantitydata"}]}]}]\
+, Typeset`pod7$$ = XMLElement[
+ "pod", {"title" -> "Orbital properties", "scanner" -> "Data", "id" ->
+ "BasicPlanetOrbitalProperties:AstronomicalData", "position" -> "700",
+ "error" -> "false", "numsubpods" -> "1"}, {
+ XMLElement["subpod", {"title" -> ""}, {
+ XMLElement["cell", {"compressed" -> True, "string" -> False}, {
+ Cell[
+ BoxData[
+ FormBox[
+ StyleBox[
+ TagBox[
+ GridBox[{{
+ TagBox[
+ PaneBox[
+ "\"current distance from Earth\"",
+ BaseStyle -> {{
+ BaselinePosition -> Baseline, FontColor ->
+ GrayLevel[0.3]}, LineSpacing -> {0.9, 0, 1.5},
+ LinebreakAdjustments -> {1, 10, 10000, 0, 100},
+ TextAlignment -> Left}, BaselinePosition -> Baseline],
+ $CellContext`TagBoxWrapper["Label"]],
+ TagBox[
+ GridBox[{{
+ StyleBox[
+ TagBox[
+ TagBox[
+ TagBox[
+ RowBox[{
+ TagBox["239\[ThinSpace]262",
+ $CellContext`TagBoxWrapper["StringBoxes" -> "239262"]],
+ "\[NoBreak]",
+ StyleBox[
+ RowBox[{}], FontFamily -> "Helvetica", FontSize ->
+ Smaller], "\[InvisibleSpace]", "\[ThickSpace]",
+ "\[InvisibleSpace]",
+ StyleBox[
+ "\"mi\"", FontFamily -> "Helvetica", FontSize ->
+ Smaller]}], Identity], #& , SyntaxForm -> Dot], "Unit",
+ SyntaxForm -> Dot],
+ LinebreakAdjustments -> {1, 100, 1, 0, 100}, LineIndent ->
+ 0, ZeroWidthTimes -> False]}, {
+ StyleBox[
+ TagBox[
+ TagBox[
+ TagBox[
+ RowBox[{
+ TagBox["60.37",
+ $CellContext`TagBoxWrapper["StringBoxes" -> "60.37"]],
+ "\[NoBreak]",
+ StyleBox[
+ RowBox[{}], FontFamily -> "Helvetica", FontSize ->
+ Smaller], "\[InvisibleSpace]", "\[ThickSpace]",
+ "\[InvisibleSpace]",
+ StyleBox[
+ SubscriptBox[
+ StyleBox["\"a\"", Italic, StripOnInput -> False],
+ "\"\[Earth]\""], FontFamily -> "Helvetica", FontSize ->
+ Smaller]}], Identity], #& , SyntaxForm -> Dot], "Unit",
+ SyntaxForm -> Dot],
+ LinebreakAdjustments -> {1, 100, 1, 0, 100}, LineIndent ->
+ 0, ZeroWidthTimes -> False]}},
+ GridBoxAlignment -> {"Columns" -> {{Left}}},
+ BaselinePosition -> 1, DefaultBaseStyle -> "Column",
+ GridBoxItemSize -> {
+ "Columns" -> {{Automatic}}, "Rows" -> {{Automatic}}},
+ GridBoxSpacings -> {
+ "Columns" -> {{Automatic}}, "Rows" -> {{Automatic}}}],
+ "Column"]}, {
+ TagBox[
+ PaneBox[
+ TagBox["\"average distance from Earth\"", Identity],
+ BaseStyle -> {{
+ BaselinePosition -> Baseline, FontColor ->
+ GrayLevel[0.3]}, LineSpacing -> {0.9, 0, 1.5},
+ LinebreakAdjustments -> {1, 10, 10000, 0, 100},
+ TextAlignment -> Left}, BaselinePosition -> Baseline],
+ $CellContext`TagBoxWrapper["Label"]],
+ TagBox[
+ GridBox[{{
+ StyleBox[
+ TagBox[
+ TagBox[
+ TagBox[
+ RowBox[{
+ TagBox["239\[ThinSpace]200",
+ $CellContext`TagBoxWrapper["StringBoxes" -> "239200"]],
+ "\[NoBreak]",
+ StyleBox[
+ RowBox[{}], FontFamily -> "Helvetica", FontSize ->
+ Smaller], "\[InvisibleSpace]", "\[ThickSpace]",
+ "\[InvisibleSpace]",
+ StyleBox[
+ "\"mi\"", FontFamily -> "Helvetica", FontSize ->
+ Smaller]}], Identity], #& , SyntaxForm -> Dot], "Unit",
+ SyntaxForm -> Dot],
+ LinebreakAdjustments -> {1, 100, 1, 0, 100}, LineIndent ->
+ 0, ZeroWidthTimes -> False]}, {
+ StyleBox[
+ TagBox[
+ TagBox[
+ TagBox[
+ RowBox[{
+ TagBox["60.36",
+ $CellContext`TagBoxWrapper["StringBoxes" -> "60.36"]],
+ "\[NoBreak]",
+ StyleBox[
+ RowBox[{}], FontFamily -> "Helvetica", FontSize ->
+ Smaller], "\[InvisibleSpace]", "\[ThickSpace]",
+ "\[InvisibleSpace]",
+ StyleBox[
+ SubscriptBox[
+ StyleBox["\"a\"", Italic, StripOnInput -> False],
+ "\"\[Earth]\""], FontFamily -> "Helvetica", FontSize ->
+ Smaller]}], Identity], #& , SyntaxForm -> Dot], "Unit",
+ SyntaxForm -> Dot],
+ LinebreakAdjustments -> {1, 100, 1, 0, 100}, LineIndent ->
+ 0, ZeroWidthTimes -> False]}},
+ GridBoxAlignment -> {"Columns" -> {{Left}}},
+ BaselinePosition -> 1, DefaultBaseStyle -> "Column",
+ GridBoxItemSize -> {
+ "Columns" -> {{Automatic}}, "Rows" -> {{Automatic}}},
+ GridBoxSpacings -> {
+ "Columns" -> {{Automatic}}, "Rows" -> {{Automatic}}}],
+ "Column"]}, {
+ TagBox[
+ PaneBox[
+ "\"largest distance from orbit center\"",
+ BaseStyle -> {{
+ BaselinePosition -> Baseline, FontColor ->
+ GrayLevel[0.3]}, LineSpacing -> {0.9, 0, 1.5},
+ LinebreakAdjustments -> {1, 10, 10000, 0, 100},
+ TextAlignment -> Left}, BaselinePosition -> Baseline],
+ $CellContext`TagBoxWrapper["Label"]],
+ TagBox[
+ GridBox[{{
+ StyleBox[
+ TagBox[
+ TagBox[
+ TagBox[
+ RowBox[{
+ TagBox["252\[ThinSpace]100",
+ $CellContext`TagBoxWrapper["StringBoxes" -> "252100"]],
+ "\[NoBreak]",
+ StyleBox[
+ RowBox[{}], FontFamily -> "Helvetica", FontSize ->
+ Smaller], "\[InvisibleSpace]", "\[ThickSpace]",
+ "\[InvisibleSpace]",
+ StyleBox[
+ "\"mi\"", FontFamily -> "Helvetica", FontSize ->
+ Smaller]}], Identity], #& , SyntaxForm -> Dot], "Unit",
+ SyntaxForm -> Dot],
+ LinebreakAdjustments -> {1, 100, 1, 0, 100}, LineIndent ->
+ 0, ZeroWidthTimes -> False]}, {
+ StyleBox[
+ TagBox[
+ TagBox[
+ TagBox[
+ RowBox[{
+ TagBox["63.61",
+ $CellContext`TagBoxWrapper["StringBoxes" -> "63.61"]],
+ "\[NoBreak]",
+ StyleBox[
+ RowBox[{}], FontFamily -> "Helvetica", FontSize ->
+ Smaller], "\[InvisibleSpace]", "\[ThickSpace]",
+ "\[InvisibleSpace]",
+ StyleBox[
+ SubscriptBox[
+ StyleBox["\"a\"", Italic, StripOnInput -> False],
+ "\"\[Earth]\""], FontFamily -> "Helvetica", FontSize ->
+ Smaller]}], Identity], #& , SyntaxForm -> Dot], "Unit",
+ SyntaxForm -> Dot],
+ LinebreakAdjustments -> {1, 100, 1, 0, 100}, LineIndent ->
+ 0, ZeroWidthTimes -> False]}},
+ GridBoxAlignment -> {"Columns" -> {{Left}}},
+ BaselinePosition -> 1, DefaultBaseStyle -> "Column",
+ GridBoxItemSize -> {
+ "Columns" -> {{Automatic}}, "Rows" -> {{Automatic}}},
+ GridBoxSpacings -> {
+ "Columns" -> {{Automatic}}, "Rows" -> {{Automatic}}}],
+ "Column"]}, {
+ TagBox[
+ PaneBox[
+ "\"nearest distance from orbit center\"",
+ BaseStyle -> {{
+ BaselinePosition -> Baseline, FontColor ->
+ GrayLevel[0.3]}, LineSpacing -> {0.9, 0, 1.5},
+ LinebreakAdjustments -> {1, 10, 10000, 0, 100},
+ TextAlignment -> Left}, BaselinePosition -> Baseline],
+ $CellContext`TagBoxWrapper["Label"]],
+ TagBox[
+ GridBox[{{
+ StyleBox[
+ TagBox[
+ TagBox[
+ TagBox[
+ RowBox[{
+ TagBox["225\[ThinSpace]600",
+ $CellContext`TagBoxWrapper["StringBoxes" -> "225600"]],
+ "\[NoBreak]",
+ StyleBox[
+ RowBox[{}], FontFamily -> "Helvetica", FontSize ->
+ Smaller], "\[InvisibleSpace]", "\[ThickSpace]",
+ "\[InvisibleSpace]",
+ StyleBox[
+ "\"mi\"", FontFamily -> "Helvetica", FontSize ->
+ Smaller]}], Identity], #& , SyntaxForm -> Dot], "Unit",
+ SyntaxForm -> Dot],
+ LinebreakAdjustments -> {1, 100, 1, 0, 100}, LineIndent ->
+ 0, ZeroWidthTimes -> False]}, {
+ StyleBox[
+ TagBox[
+ TagBox[
+ TagBox[
+ RowBox[{
+ TagBox["56.93",
+ $CellContext`TagBoxWrapper["StringBoxes" -> "56.93"]],
+ "\[NoBreak]",
+ StyleBox[
+ RowBox[{}], FontFamily -> "Helvetica", FontSize ->
+ Smaller], "\[InvisibleSpace]", "\[ThickSpace]",
+ "\[InvisibleSpace]",
+ StyleBox[
+ SubscriptBox[
+ StyleBox["\"a\"", Italic, StripOnInput -> False],
+ "\"\[Earth]\""], FontFamily -> "Helvetica", FontSize ->
+ Smaller]}], Identity], #& , SyntaxForm -> Dot], "Unit",
+ SyntaxForm -> Dot],
+ LinebreakAdjustments -> {1, 100, 1, 0, 100}, LineIndent ->
+ 0, ZeroWidthTimes -> False]}},
+ GridBoxAlignment -> {"Columns" -> {{Left}}},
+ BaselinePosition -> 1, DefaultBaseStyle -> "Column",
+ GridBoxItemSize -> {
+ "Columns" -> {{Automatic}}, "Rows" -> {{Automatic}}},
+ GridBoxSpacings -> {
+ "Columns" -> {{Automatic}}, "Rows" -> {{Automatic}}}],
+ "Column"]}, {
+ TagBox[
+ PaneBox[
+ TagBox["\"orbital period\"", Identity],
+ BaseStyle -> {{
+ BaselinePosition -> Baseline, FontColor ->
+ GrayLevel[0.3]}, LineSpacing -> {0.9, 0, 1.5},
+ LinebreakAdjustments -> {1, 10, 10000, 0, 100},
+ TextAlignment -> Left}, BaselinePosition -> Baseline],
+ $CellContext`TagBoxWrapper["Label"]],
+ StyleBox[
+ TagBox[
+ TagBox[
+ TagBox[
+ RowBox[{
+ TagBox["27.322",
+ $CellContext`TagBoxWrapper["StringBoxes" -> "27.322"]],
+ "\[InvisibleSpace]", " ",
+ StyleBox[
+ "\"days\"", LinebreakAdjustments -> {1, 100, 1, 0, 100},
+ LineIndent -> 0, {
+ FontFamily :> $CellContext`$UnitFontFamily, FontSize ->
+ Smaller}, StripOnInput -> False]}], Identity], #& ,
+ SyntaxForm -> Dot], "Unit", SyntaxForm -> Dot],
+ LinebreakAdjustments -> {1, 100, 1, 0, 100}, LineIndent ->
+ 0, ZeroWidthTimes -> False]}},
+ GridBoxAlignment -> {
+ "Columns" -> {Left, Left}, "Rows" -> {{Baseline}}},
+ AutoDelete -> False,
+ GridBoxBackground -> {"Columns" -> {None, None}},
+ GridBoxFrame -> {"Columns" -> {{True}}, "Rows" -> {{True}}},
+ GridBoxItemSize -> {
+ "Columns" -> {{Automatic}}, "Rows" -> {{Automatic}}},
+ GridBoxSpacings -> {"Columns" -> {{1.5}, 2}, "Rows" -> {{1}}},
+ FrameStyle -> GrayLevel[0.84], BaselinePosition -> Automatic,
+ AllowScriptLevelChange -> False], "Grid"],
+ LineSpacing -> {0.9, 0, 1.5}, LineIndent -> 0, StripOnInput ->
+ False], TraditionalForm]], "Output", {}]}],
+ XMLElement[
+ "dataformats", {}, {
+ "plaintext,computabledata,formatteddata,numberdata,quantitydata"}]}],
+ XMLElement["states", {"count" -> "2"}, {
+ XMLElement[
+ "state", {
+ "name" -> "Show metric", "input" ->
+ "BasicPlanetOrbitalProperties:AstronomicalData__Show metric"}, {}],
+ XMLElement[
+ "state", {
+ "name" -> "More", "input" ->
+ "BasicPlanetOrbitalProperties:AstronomicalData__More"}, {}]}],
+ XMLElement["infos", {"count" -> "1"}, {
+ XMLElement["info", {}, {
+ XMLElement["units", {"count" -> "2"}, {
+ XMLElement[
+ "unit", {
+ "short" -> "a_\[Earth]", "long" ->
+ "equatorial radii of Earth"}, {}],
+ XMLElement["unit", {"short" -> "mi", "long" -> "miles"}, {}],
+ XMLElement["cell", {"compressed" -> False, "string" -> True}, {
+ Cell[
+ BoxData[
+ FormBox[
+ StyleBox[
+ TagBox[
+ GridBox[{{
+ StyleBox[
+ StyleBox[
+ TagBox[
+ TagBox[
+ RowBox[{
+ StyleBox[
+ SubscriptBox[
+ StyleBox["\"a\"", Italic, StripOnInput -> False],
+ "\"\[Earth]\""], FontFamily -> "Helvetica", FontSize ->
+ Smaller]}], Identity], "UnitOnly", SyntaxForm -> Dot],
+ LinebreakAdjustments -> {1, 100, 1, 0, 100}, LineIndent ->
+ 0, ZeroWidthTimes -> False], 10, StripOnInput -> False],
+ StyleBox[
+ "\"equatorial radii of Earth\"", FontSize -> 10,
+ LinebreakAdjustments -> {1, 100, 1, 0, 100}, LineIndent ->
+ 0, {FontFamily :> $CellContext`$UnitFontFamily, FontSize ->
+ Smaller},
+ GrayLevel[0.6], StripOnInput -> False]}, {
+ StyleBox[
+ StyleBox[
+ TagBox[
+ TagBox[
+ RowBox[{
+ StyleBox[
+ "\"mi\"", FontFamily -> "Helvetica", FontSize ->
+ Smaller]}], Identity], "UnitOnly", SyntaxForm -> Dot],
+ LinebreakAdjustments -> {1, 100, 1, 0, 100}, LineIndent ->
+ 0, ZeroWidthTimes -> False], 10, StripOnInput -> False],
+ StyleBox[
+ "\"miles\"", FontSize -> 10,
+ LinebreakAdjustments -> {1, 100, 1, 0, 100}, LineIndent ->
+ 0, {FontFamily :> $CellContext`$UnitFontFamily, FontSize ->
+ Smaller},
+ GrayLevel[0.6], StripOnInput -> False]}},
+ GridBoxAlignment -> {
+ "Columns" -> {Left, Left}, "Rows" -> {{Baseline}}},
+ AutoDelete -> False,
+ GridBoxBackground -> {"Columns" -> {{None}}},
+ GridBoxFrame -> {
+ "Columns" -> {{True}}, "Rows" -> {{True}}},
+ GridBoxItemSize -> {
+ "Columns" -> {{Automatic}}, "Rows" -> {{Automatic}}},
+ GridBoxSpacings -> {
+ "Columns" -> {{1.5}}, "Rows" -> {{0.5}}}, FrameStyle ->
+ GrayLevel[0.84], BaselinePosition -> Automatic,
+ AllowScriptLevelChange -> False], "Grid"],
+ LineSpacing -> {0.9, 0, 1.5}, LineIndent -> 0, StripOnInput ->
+ False], TraditionalForm]], "Output", {}]}]}]}]}]}],
+ Typeset`aux1$$ = {True, False, {False}, True}, Typeset`aux2$$ = {
+ True, False, {False}, True}, Typeset`aux3$$ = {True, False, {False}, True},
+ Typeset`aux4$$ = {True, False, {False, False}, True}, Typeset`aux5$$ = {
+ True, False, {False}, True}, Typeset`aux6$$ = {
+ True, False, {False, False}, True}, Typeset`aux7$$ = {
+ True, False, {False}, True}, Typeset`asyncpods$$ = {}, Typeset`nonpods$$ = {
+ XMLElement["sources", {"count" -> "1"}, {
+ XMLElement[
+ "source", {
+ "url" ->
+ "http://www.wolframalpha.com/sources/\
+AstronomicalDataSourceInformationNotes.html", "text" ->
+ "Astronomical data"}, {}]}]}, Typeset`initdone$$ = True,
+ Typeset`queryinfo$$ = {
+ "success" -> "true", "error" -> "false", "numpods" -> "7", "datatypes" ->
+ "Astronomical", "timedout" -> "", "timedoutpods" -> "", "timing" ->
+ "2.573", "parsetiming" -> "0.486", "parsetimedout" -> "false",
+ "recalculate" -> "", "id" ->
+ "MSPa79522303fg0608bh95i00004h41i28eicg1ci5g", "host" ->
+ "http://www3.wolframalpha.com", "server" -> "20", "related" ->
+ "http://www3.wolframalpha.com/api/v2/relatedQueries.jsp?id=\
+MSPa79622303fg0608bh95i000037d20g9h7ib3ec64&s=20", "version" -> "2.6"},
+ Typeset`sessioninfo$$ = {
+ "TimeZone" -> -4.,
+ "Date" -> {2014, 6, 8, 23, 7, 20.2144277`9.058236384941416}, "Line" -> 3,
+ "SessionID" -> 25552092645876612485}, Typeset`showpods$$ = {1, 2, 3, 4, 5,
+ 6, 7}, Typeset`failedpods$$ = {}, Typeset`chosen$$ = {}, Typeset`open$$ =
+ False, Typeset`newq$$ = "How far is the Earth from the Moon?"},
+ DynamicBox[ToBoxes[
+ AlphaIntegration`FormatAlphaResults[
+ Dynamic[{
+ 1, {Typeset`pod1$$, Typeset`pod2$$, Typeset`pod3$$, Typeset`pod4$$,
+ Typeset`pod5$$, Typeset`pod6$$, Typeset`pod7$$}, {
+ Typeset`aux1$$, Typeset`aux2$$, Typeset`aux3$$, Typeset`aux4$$,
+ Typeset`aux5$$, Typeset`aux6$$, Typeset`aux7$$}, Typeset`chosen$$,
+ Typeset`open$$, Typeset`elements$$, Typeset`q$$, Typeset`opts$$,
+ Typeset`nonpods$$, Typeset`queryinfo$$, Typeset`sessioninfo$$,
+ Typeset`showpods$$, Typeset`failedpods$$, Typeset`newq$$}]],
+ StandardForm],
+ ImageSizeCache->{648., {478., 483.}},
+ TrackedSymbols:>{Typeset`showpods$$, Typeset`failedpods$$}],
+ DynamicModuleValues:>{},
+ Initialization:>If[
+ Not[Typeset`initdone$$], Null; WolframAlphaClient`Private`doAsyncUpdates[
+ Hold[{
+ Typeset`pod1$$, Typeset`pod2$$, Typeset`pod3$$, Typeset`pod4$$,
+ Typeset`pod5$$, Typeset`pod6$$, Typeset`pod7$$}],
+ Typeset`asyncpods$$,
+ Dynamic[Typeset`failedpods$$]]; Typeset`asyncpods$$ = {};
+ Typeset`initdone$$ = True],
+ SynchronousInitialization->False],
+ BaseStyle->{Deployed -> True},
+ DeleteWithContents->True,
+ Editable->False,
+ SelectWithContents->True]], "Print",
+ CellMargins->{{20, 10}, {Inherited, Inherited}},
+ CellChangeTimes->{3.611272040233429*^9}]
+}, Open ]],
+
+Cell[CellGroupData[{
+
+Cell[BoxData[
+ RowBox[{"Plot3D", "[",
+ RowBox[{
+ RowBox[{
+ RowBox[{"Power", "[",
+ RowBox[{"x", ",", " ", "2"}], "]"}], " ", "+", " ", "y", " ", "+", " ",
+ "z"}], ",", " ",
+ RowBox[{"{",
+ RowBox[{"x", ",", " ", "0", ",", " ", "10"}], "}"}], " ", ",", " ",
+ RowBox[{"{",
+ RowBox[{"y", ",", " ", "0", ",", " ", "10"}], "}"}]}], "]"}]], "Input",
+ CellChangeTimes->{{3.6112720578024335`*^9, 3.6112721112124887`*^9}}],
+
+Cell[BoxData[
+ Graphics3DBox[{},
+ Axes->True,
+ BoxRatios->{1, 1, 0.4},
+ Method->{"RotationControl" -> "Globe"},
+ PlotRange->{{0, 10}, {0, 10}, {0., 0.}},
+ PlotRangePadding->{
+ Scaled[0.02],
+ Scaled[0.02],
+ Scaled[0.02]}]], "Output",
+ CellChangeTimes->{3.6112721144606743`*^9}]
+}, Open ]],
+
+Cell[CellGroupData[{
+
+Cell[BoxData[
+ RowBox[{"Plot3D", "[",
+ RowBox[{
+ RowBox[{
+ SuperscriptBox["x", "2"], "+", "y", "+", "z"}], ",",
+ RowBox[{"{",
+ RowBox[{"x", ",", "0", ",", "10"}], "}"}], ",",
+ RowBox[{"{",
+ RowBox[{"y", ",", "0", ",", "10"}], "}"}], ",",
+ RowBox[{"Mesh", "\[Rule]", "Automatic"}], ",",
+ RowBox[{"MeshFunctions", "\[Rule]", "Automatic"}]}], "]"}]], "Input",
+ NumberMarks->False],
+
+Cell[BoxData[
+ Graphics3DBox[{},
+ Axes->True,
+ BoxRatios->{1, 1, 0.4},
+ Method->{"RotationControl" -> "Globe"},
+ PlotRange->{{0, 10}, {0, 10}, {0., 0.}},
+ PlotRangePadding->{
+ Scaled[0.02],
+ Scaled[0.02],
+ Scaled[0.02]}]], "Output",
+ CellChangeTimes->{3.6112721290995116`*^9}]
+}, Open ]],
+
+Cell[CellGroupData[{
+
+Cell[BoxData[
+ RowBox[{"Plot3D", "[",
+ RowBox[{
+ RowBox[{
+ SuperscriptBox["x", "2"], "+", "y", "+", "z"}], ",",
+ RowBox[{"{",
+ RowBox[{"x", ",", "0", ",", "10"}], "}"}], ",",
+ RowBox[{"{",
+ RowBox[{"y", ",", "0", ",", "10"}], "}"}], ",",
+ RowBox[{"MeshStyle", "\[Rule]",
+ RowBox[{"Directive", "[",
+ RowBox[{
+ RowBox[{"RGBColor", "[",
+ RowBox[{"0.05`", ",", "1.`", ",", "0.98`"}], "]"}], ",",
+ RowBox[{"Opacity", "[", "0.11`", "]"}], ",",
+ RowBox[{"AbsoluteThickness", "[", "1.555`", "]"}]}], "]"}]}], ",",
+ RowBox[{"Mesh", "\[Rule]", "Automatic"}], ",",
+ RowBox[{"MeshFunctions", "\[Rule]", "Automatic"}]}], "]"}]], "Input",
+ NumberMarks->False],
+
+Cell[BoxData[
+ Graphics3DBox[{},
+ Axes->True,
+ BoxRatios->{1, 1, 0.4},
+ Method->{"RotationControl" -> "Globe"},
+ PlotRange->{{0, 10}, {0, 10}, {0., 0.}},
+ PlotRangePadding->{
+ Scaled[0.02],
+ Scaled[0.02],
+ Scaled[0.02]}]], "Output",
+ CellChangeTimes->{3.6112721409161873`*^9}]
+}, Open ]],
+
+Cell[CellGroupData[{
+
+Cell[BoxData[
+ RowBox[{"Manipulate", "[",
+ RowBox[{
+ RowBox[{"Plot", "[",
+ RowBox[{
+ RowBox[{"Derivative", "[",
+ RowBox[{"Power", "[",
+ RowBox[{"x", ",", " ", "3"}], "]"}], "]"}], ",", " ",
+ RowBox[{"{",
+ RowBox[{"x", ",", " ", "0", ",", " ", "10"}], "}"}]}], "]"}], ",", " ",
+ RowBox[{"{",
+ RowBox[{"x", ",", " ", "0", ",", " ", "100"}], "}"}]}], "]"}]], "Input",
+ CellChangeTimes->{{3.611272144379386*^9, 3.61127220827404*^9}}],
+
+Cell[BoxData[
+ TagBox[
+ StyleBox[
+ DynamicModuleBox[{$CellContext`x$$ = 74.60000000000001, Typeset`show$$ =
+ True, Typeset`bookmarkList$$ = {}, Typeset`bookmarkMode$$ = "Menu",
+ Typeset`animator$$, Typeset`animvar$$ = 1, Typeset`name$$ =
+ "\"untitled\"", Typeset`specs$$ = {{
+ Hold[$CellContext`x$$], 0, 100}}, Typeset`size$$ = {360., {106., 110.}},
+ Typeset`update$$ = 0, Typeset`initDone$$, Typeset`skipInitDone$$ =
+ True, $CellContext`x$5214$$ = 0},
+ DynamicBox[Manipulate`ManipulateBoxes[
+ 1, StandardForm, "Variables" :> {$CellContext`x$$ = 0},
+ "ControllerVariables" :> {
+ Hold[$CellContext`x$$, $CellContext`x$5214$$, 0]},
+ "OtherVariables" :> {
+ Typeset`show$$, Typeset`bookmarkList$$, Typeset`bookmarkMode$$,
+ Typeset`animator$$, Typeset`animvar$$, Typeset`name$$,
+ Typeset`specs$$, Typeset`size$$, Typeset`update$$, Typeset`initDone$$,
+ Typeset`skipInitDone$$}, "Body" :> Plot[
+ Derivative[$CellContext`x$$^3], {$CellContext`x$$, 0, 10}],
+ "Specifications" :> {{$CellContext`x$$, 0, 100}}, "Options" :> {},
+ "DefaultOptions" :> {}],
+ ImageSizeCache->{411., {152., 157.}},
+ SingleEvaluation->True],
+ Deinitialization:>None,
+ DynamicModuleValues:>{},
+ SynchronousInitialization->True,
+ UnsavedVariables:>{Typeset`initDone$$},
+ UntrackedVariables:>{Typeset`size$$}], "Manipulate",
+ Deployed->True,
+ StripOnInput->False],
+ Manipulate`InterpretManipulate[1]]], "Output",
+ CellChangeTimes->{3.611272211487224*^9}]
+}, Open ]]
+},
+WindowSize->{716, 833},
+WindowMargins->{{Automatic, 275}, {Automatic, 64}},
+FrontEndVersion->"9.0 for Microsoft Windows (64-bit) (January 25, 2013)",
+StyleDefinitions->"Default.nb"
+]
+(* End of Notebook Content *)
+
+(* Internal cache information *)
+(*CellTagsOutline
+CellTagsIndex->{}
+*)
+(*CellTagsIndex
+CellTagsIndex->{}
+*)
+(*NotebookFileOutline
+Notebook[{
+Cell[CellGroupData[{
+Cell[579, 22, 138, 3, 41, "WolframAlphaLong"],
+Cell[720, 27, 194311, 3452, 971, "Print"]
+}, Open ]],
+Cell[CellGroupData[{
+Cell[195068, 3484, 441, 11, 31, "Input"],
+Cell[195512, 3497, 292, 10, 306, "Output"]
+}, Open ]],
+Cell[CellGroupData[{
+Cell[195841, 3512, 404, 11, 55, "Input"],
+Cell[196248, 3525, 292, 10, 306, "Output"]
+}, Open ]],
+Cell[CellGroupData[{
+Cell[196577, 3540, 708, 18, 76, "Input"],
+Cell[197288, 3560, 292, 10, 306, "Output"]
+}, Open ]],
+Cell[CellGroupData[{
+Cell[197617, 3575, 472, 12, 31, "Input"],
+Cell[198092, 3589, 1549, 32, 358, "Output"]
+}, Open ]]
+}
+]
+*)
+
+(* End of internal cache information *)
+
diff --git a/samples/Mathematica/Problem12.m b/samples/Mathematica/Problem12.m
new file mode 100644
index 00000000..2e8e0ac7
--- /dev/null
+++ b/samples/Mathematica/Problem12.m
@@ -0,0 +1,8 @@
+(* ::Package:: *)
+
+(* Problem12.m *)
+(* Author: William Woodruff *)
+(* Problem: What is the value of the first triangle number to have over five hundred divisors? *)
+
+Do[If[Length[Divisors[Binomial[i + 1, 2]]] > 500,
+ Print[Binomial[i + 1, 2]]; Break[]], {i, 1000000}]
diff --git a/samples/Moocode/moocode_toolkit.moo b/samples/Moocode/moocode_toolkit.moo
new file mode 100644
index 00000000..daa69f04
--- /dev/null
+++ b/samples/Moocode/moocode_toolkit.moo
@@ -0,0 +1,2196 @@
+;; while (read(player) != ".") endwhile
+
+I M P O R T A N T
+=================
+
+The following code cannot be used as is. You will need to rewrite
+functionality that is not present in your server/core. The most
+straight-forward target (other than Stunt/Improvise) is a server/core
+that provides a map datatype and anonymous objects.
+
+Installation in my server uses the following object numbers:
+
+#36819 -> MOOcode Experimental Language Package
+ #36820 -> Changelog
+ #36821 -> Dictionary
+ #36822 -> MOOcode Compiler
+ #38128 -> Syntax Tree Pretty Printer
+ #37644 -> Tokenizer Prototype
+ #37645 -> Parser Prototype
+ #37648 -> Symbol Prototype
+ #37649 -> Literal Prototype
+ #37650 -> Statement Prototype
+ #37651 -> Operator Prototype
+ #37652 -> Control Flow Statement Prototype
+ #37653 -> Assignment Operator Prototype
+ #38140 -> Compound Assignment Operator Prototype
+ #38123 -> Prefix Operator Prototype
+ #37654 -> Infix Operator Prototype
+ #37655 -> Name Prototype
+ #37656 -> Bracket Operator Prototype
+ #37657 -> Brace Operator Prototype
+ #37658 -> If Statement Prototype
+ #38119 -> For Statement Prototype
+ #38120 -> Loop Statement Prototype
+ #38126 -> Fork Statement Prototype
+ #38127 -> Try Statement Prototype
+ #37659 -> Invocation Operator Prototype
+ #37660 -> Verb Selector Operator Prototype
+ #37661 -> Property Selector Operator Prototype
+ #38124 -> Error Catching Operator Prototype
+ #38122 -> Positional Symbol Prototype
+ #38141 -> From Statement Prototype
+ #37662 -> Utilities
+#36823 -> MOOcode Experimental Language Package Tests
+ #36824 -> MOOcode Compiler Tests
+ #37646 -> Tokenizer Tests
+ #37647 -> Parser Tests
+.
+
+; /* BASE */
+
+; parent($plastic.tokenizer_proto)
+
+@program _:_ensure_prototype as application/x-moocode
+(typeof(this) == OBJ) || raise(E_INVARG, "Callable on prototypes only");
+.
+
+@program _:_ensure_instance as application/x-moocode
+(typeof(this) == ANON) || raise(E_INVARG, "Callable on instances only");
+.
+
+; /* COMPILER */
+
+@program $plastic.compiler:_lookup as application/x-moocode
+$private();
+
+this:_ensure_instance();
+
+{name} = args;
+
+if (`value = this.variable_map[name] ! E_RANGE')
+ return value;
+elseif (name in this.variable_map || name in this.reserved_names)
+ value = name;
+ while (value in this.variable_map || value in this.reserved_names)
+ value = tostr("_", value);
+ endwhile
+ this.variable_map[name] = value;
+ return value;
+else
+ value = name;
+ this.variable_map[name] = value;
+ return value;
+endif
+.
+
+@program $plastic.compiler:_generate as application/x-moocode
+$private();
+
+this:_ensure_instance();
+
+{name} = args;
+
+if (`value = this.variable_map[name] ! E_RANGE')
+ return value;
+else
+ value = tostr("_", random());
+ while (value in this.variable_map || value in this.reserved_names)
+ value = tostr("_", random());
+ endwhile
+ this.variable_map[name] = value;
+ return value;
+endif
+.
+
+@program $plastic.compiler:compile as application/x-moocode
+this:_ensure_prototype();
+
+{source, ?options = []} = args;
+
+tokenizer = this.plastic.tokenizer_proto:create(source);
+parser = this.plastic.parser_proto:create(tokenizer);
+compiler = create(this, 1);
+
+try
+ statements = parser:statements();
+except ex (ANY)
+ return {0, {tostr("Line ", ex[3].tokenizer.row, ": ", ex[2])}};
+endtry
+
+source = {};
+
+for statement in (statements)
+ if (statement.type != "statement")
+ source = {@source, tostr(compiler:p(statement), ";")};
+ else
+ source = {@source, @compiler:p(statement)};
+ endif
+endfor
+
+return {1, source};
+.
+
+@program $plastic.compiler:p as application/x-moocode
+this:_ensure_instance();
+
+{statement} = args;
+
+ticks_left() < 10000 || seconds_left() < 2 && suspend(0);
+
+if (statement.type == "variable")
+ return this:_lookup(statement.value);
+elseif (statement.type == "unique")
+ return this:_generate(statement.value);
+elseif (isa(statement, this.plastic.sign_operator_proto))
+ if (statement.type == "unary")
+ return tostr(statement.value == "-" ? "-" | "", this:p(statement.first));
+ else
+ return tostr("(", this:p(statement.first), " ", statement.value, " ", this:p(statement.second), ")");
+ endif
+
+elseif (isa(statement, this.plastic.control_flow_statement_proto))
+ if ((first = statement.first) != 0)
+ return {tostr(statement.id, " " , this:p(first), ";")};
+ else
+ return {tostr(statement.id, ";")};
+ endif
+
+elseif (isa(statement, this.plastic.if_statement_proto))
+ value = statement.value;
+
+ code = {tostr("if (", this:p(value[1]), ")")};
+
+ for s in (value[2])
+ if (respond_to(s, "std"))
+ code = {@code, @this:p(s)};
+ else
+ code = {@code, this:p(s) + ";"};
+ endif
+ endfor
+
+ i = 3;
+ while (length(value) >= i && typeof(value[i]) != LIST)
+ code = {@code, tostr("elseif (", this:p(value[i]), ")")};
+
+ i = i + 1;
+
+ for s in (value[i])
+ if (respond_to(s, "std"))
+ code = {@code, @this:p(s)};
+ else
+ code = {@code, this:p(s) + ";"};
+ endif
+ endfor
+
+ i = i + 1;
+ endwhile
+
+ if (length(value) == i)
+ code = {@code, "else"};
+
+ for s in (value[i])
+ if (respond_to(s, "std"))
+ code = {@code, @this:p(s)};
+ else
+ code = {@code, this:p(s) + ";"};
+ endif
+ endfor
+ endif
+
+ code = {@code, "endif"};
+
+ return code;
+
+elseif (isa(statement, this.plastic.for_statement_proto))
+ value = statement.value;
+
+ if (statement.subtype == "range")
+ code = {tostr("for ", this:p(value[1]), " in [", this:p(value[2]), "..", this:p(value[3]), "]")};
+ statements = value[4];
+ elseif (length(value) == 4)
+ code = {tostr("for ", this:p(value[1]), ", ", this:p(value[2]), " in (", this:p(value[3]), ")")};
+ statements = value[4];
+ else
+ code = {tostr("for ", this:p(value[1]), " in (", this:p(value[2]), ")")};
+ statements = value[3];
+ endif
+
+ for s in (statements)
+ if (respond_to(s, "std"))
+ code = {@code, @this:p(s)};
+ else
+ code = {@code, this:p(s) + ";"};
+ endif
+ endfor
+
+ code = {@code, "endfor"};
+
+ return code;
+
+elseif (isa(statement, this.plastic.loop_statement_proto))
+ value = statement.value;
+
+ i = 0;
+
+ if (length(value) > 2)
+ prefix = tostr("while ", this:p(value[i = i + 1]));
+ else
+ prefix = tostr("while");
+ endif
+
+ if (statement.id == "while")
+ code = {tostr(prefix, " (", this:p(value[i = i + 1]), ")")};
+ else
+ code = {tostr(prefix, " (!(", this:p(value[i = i + 1]), "))")};
+ endif
+
+ for s in (value[i = i + 1])
+ if (respond_to(s, "std"))
+ code = {@code, @this:p(s)};
+ else
+ code = {@code, this:p(s) + ";"};
+ endif
+ endfor
+
+ code = {@code, "endwhile"};
+
+ return code;
+
+elseif (isa(statement, this.plastic.fork_statement_proto))
+ value = statement.value;
+
+ i = 0;
+
+ if (length(value) > 2)
+ code = {tostr("fork ", this:p(value[i = i + 1]), " (", this:p(value[i = i + 1]), ")")};
+ else
+ code = {tostr("fork", " (", this:p(value[i = i + 1]), ")")};
+ endif
+
+ for s in (value[i = i + 1])
+ if (respond_to(s, "std"))
+ code = {@code, @this:p(s)};
+ else
+ code = {@code, this:p(s) + ";"};
+ endif
+ endfor
+
+ code = {@code, "endfork"};
+
+ return code;
+
+elseif (isa(statement, this.plastic.try_statement_proto))
+ value = statement.value;
+
+ code = {"try"};
+
+ for s in (value[1])
+ if (respond_to(s, "std"))
+ code = {@code, @this:p(s)};
+ else
+ code = {@code, this:p(s) + ";"};
+ endif
+ endfor
+
+ if (statement.subtype == "finally")
+ code = {@code, "finally"};
+
+ for s in (value[2])
+ if (respond_to(s, "std"))
+ code = {@code, @this:p(s)};
+ else
+ code = {@code, this:p(s) + ";"};
+ endif
+ endfor
+
+ else
+ for value in (value[2..$])
+ if (length(value) == 3)
+ x = {};
+ for s in (value[2])
+ x = {@x, this:p(s)};
+ endfor
+
+ code = {@code, tostr("except ", this:p(value[1]), " (", x:join(", "), ")")};
+ statements = value[3];
+
+ else
+ x = {};
+ for s in (value[1])
+ x = {@x, this:p(s)};
+ endfor
+
+ code = {@code, tostr("except (", x:join(", "), ")")};
+ statements = value[2];
+
+ endif
+
+ for s in (statements)
+ if (respond_to(s, "std"))
+ code = {@code, @this:p(s)};
+ else
+ code = {@code, this:p(s) + ";"};
+ endif
+ endfor
+
+ endfor
+ endif
+
+ code = {@code, "endtry"};
+
+ return code;
+
+elseif (isa(statement, this.plastic.assignment_operator_proto))
+ if (statement.first.type == "pattern")
+ res = "{";
+ rest = 0;
+ for v in (statement.first.value)
+ if (v.type == "unary")
+ v = tostr("@", this:p(v.first));
+ elseif (v.type == "binary")
+ v = tostr("?", this:p(v.first), " = ", this:p(v.second));
+ else
+ v = this:p(v);
+ endif
+ res = tostr(res, (rest ? ", " | ""), v);
+ rest = 1;
+ endfor
+ res = tostr(res, "}");
+ return tostr("(", res, " ", statement.value, " ", this:p(statement.second), ")");
+ else
+ return tostr("(", this:p(statement.first), " ", statement.value, " ", this:p(statement.second), ")");
+ endif
+
+elseif (isa(statement, this.plastic.bracket_operator_proto))
+ if (statement.type == "ternary")
+ return tostr("(", this:p(statement.first), "[", this:p(statement.second), "..", this:p(statement.third), "])");
+ elseif (statement.type == "binary")
+ return tostr("(", this:p(statement.first), "[", this:p(statement.second), "])");
+ else
+ res = "[";
+ first = 1;
+ for v in (statement.value)
+ ticks_left() < 10000 || seconds_left() < 2 && suspend(0);
+ res = tostr(res, (first ? "" | ", "), this:p(v[1]), " -> ", this:p(v[2]));
+ first = 0;
+ endfor
+ res = tostr(res, "]");
+ return res;
+ return {res};
+ endif
+
+elseif (isa(statement, this.plastic.brace_operator_proto))
+ res = "{";
+ first = 1;
+ for v in (statement.value)
+ ticks_left() < 10000 || seconds_left() < 2 && suspend(0);
+ res = tostr(res, (first ? "" | ", "), this:p(v));
+ first = 0;
+ endfor
+ res = tostr(res, "}");
+ return res;
+
+elseif (isa(statement, this.plastic.invocation_operator_proto))
+ if (statement.type == "ternary")
+ a = {};
+ for v in (statement.third)
+ a = {@a, this:p(v)};
+ endfor
+ if (statement.second.type == "identifier")
+ return tostr(this:p(statement.first), ":", this:p(statement.second), "(", a:join(", "), ")");
+ else
+ return tostr(this:p(statement.first), ":(", this:p(statement.second), ")(", a:join(", "), ")");
+ endif
+ elseif (statement.type == "binary")
+ a = {};
+ for v in (statement.second)
+ a = {@a, this:p(v)};
+ endfor
+ return tostr(this:p(statement.first), "(", a:join(", "), ")");
+ else
+ return tostr(this:p(statement.first));
+ endif
+
+elseif (isa(statement, this.plastic.property_selector_operator_proto))
+ if (statement.second.type == "identifier")
+ return tostr(this:p(statement.first), ".", this:p(statement.second));
+ else
+ return tostr(this:p(statement.first), ".(", this:p(statement.second) + ")");
+ endif
+
+elseif (isa(statement, this.plastic.error_catching_operator_proto))
+ if (statement.type == "unary")
+ return tostr(statement.value, this:p(statement.first));
+ endif
+
+ x = {};
+ for s in (statement.second)
+ x = {@x, this:p(s)};
+ endfor
+
+ second = x:join(", ");
+
+ if (statement.type == "ternary")
+ return tostr("`", this:p(statement.first), " ! ", second, " => ", this:p(statement.third), "'");
+ else
+ return tostr("`", this:p(statement.first), " ! ", second, "'");
+ endif
+
+elseif (isa(statement, this.plastic.literal_proto))
+ return toliteral(statement.value);
+elseif (isa(statement, this.plastic.positional_symbol_proto))
+ return statement.value;
+elseif (isa(statement, this.plastic.prefix_operator_proto))
+ return tostr(statement.value, this:p(statement.first));
+elseif (isa(statement, this.plastic.infix_operator_proto))
+ value = statement.value;
+ value = (value != "**") ? value | "^";
+ return tostr("(", this:p(statement.first), " ", value, " ", this:p(statement.second), ")");
+elseif (isa(statement, this.plastic.traditional_ternary_operator_proto))
+ return tostr("(", this:p(statement.first), " ? ", this:p(statement.second), " | ", this:p(statement.third), ")");
+elseif (isa(statement, this.plastic.name_proto))
+ return statement.value;
+else
+ raise(E_INVARG);
+endif
+.
+
+; /* PRINTER */
+
+@program $plastic.printer:_print as application/x-moocode
+{statement, ?indent = ""} = args;
+
+if (typeof(statement) == LIST)
+ result = {tostr(indent, "-")};
+
+ for item in (statement)
+ result = {@result, @this:_print(item, indent + " ")};
+ endfor
+
+ return result;
+endif
+
+if (`typeof(statement.value) == LIST ! ANY')
+ result = {tostr(indent, statement.id, " : ", statement.type)};
+
+ for value in (statement.value)
+ result = {@result, @this:_print(value, indent + " ")};
+ endfor
+else
+ result = {tostr(indent, typeof(statement.value) == ERR ? toliteral(statement.value) | statement.value, " : ", statement.type)};
+
+ for prop in ({"first", "second", "third"})
+ if (`value = statement.(prop) ! E_PROPNF' != E_PROPNF && value != 0)
+ result = {@result, @this:_print(value, indent + " ")};
+ endif
+ endfor
+endif
+
+return result;
+.
+
+@program $plastic.printer:print as application/x-moocode
+{source, ?options = []} = args;
+
+tokenizer = this.plastic.tokenizer_proto:create(source);
+parser = this.plastic.parser_proto:create(tokenizer);
+
+statements = parser:statements();
+
+source = {};
+
+for statement in (statements)
+ source = {@source, @this:_print(statement)};
+endfor
+
+return source;
+.
+
+; /* TOKENIZER */
+
+@program $plastic.tokenizer_proto:create as application/x-moocode
+this:_ensure_prototype();
+
+instance = create(this, 1);
+
+instance.row = 1;
+instance.column = 1;
+instance.source = (length(args) == 1 && typeof(args[1]) == LIST) ? args[1] | args;
+
+return instance;
+.
+
+@program $plastic.tokenizer_proto:advance as application/x-moocode
+this:_ensure_instance();
+
+this.token = 0;
+
+if (!this.source)
+ return this;
+endif
+
+row = this.row;
+column = this.column;
+source = this.source;
+
+eol = 0;
+block_comment = 0;
+inline_comment = 0;
+
+while loop (length(source) >= row)
+
+ if (column > (len = length(source[row])))
+ eol = 1;
+ inline_comment = 0;
+ row = row + 1;
+ column = 1;
+ continue loop;
+ endif
+
+ next_two = len > column ? source[row][column..column + 1] | "";
+
+ if (block_comment && next_two == "*/")
+ block_comment = 0;
+ column = column + 2;
+ continue loop;
+ elseif (next_two == "/*")
+ block_comment = 1;
+ column = column + 2;
+ continue loop;
+ elseif (next_two == "//")
+ inline_comment = 1;
+ column = column + 2;
+ continue loop;
+ endif
+
+ if (block_comment || inline_comment)
+ column = column + 1;
+ continue loop;
+ endif
+
+ if (len >= column && ((c = source[row][column]) == " " || c == " "))
+ column = column + 1;
+ continue loop;
+ endif
+
+ if (this.token)
+ this.token["eol"] = eol;
+ eol = 0;
+ break loop;
+ endif
+
+ if (`c = source[row][column] ! E_RANGE')
+
+ /* name and error */
+ /* MOO error literals look like names but they're not. Worse, a
+ * valid error like E_PERM is treated like a literal, while an
+ * invalid error like E_FOO is treated like a variable. Any name
+ * that starts with the characters "E_" is *now* an error literal,
+ * but invalid errors are errors.
+ */
+ if ((c >= "a" && c <= "z") || c == "_" || c == "$")
+ col1 = column; /* mark the start */
+ column = column + 1;
+ while (`c = source[row][column] ! E_RANGE')
+ if ((c >= "a" && c <= "z") || (c >= "0" && c <= "9") || c == "_")
+ column = column + 1;
+ else
+ break;
+ endif
+ endwhile
+ col2 = column - 1;
+ chars = source[row][col1..col2];
+ if (index(chars, "E_") == 1)
+ try
+ this.token = ["type" -> "error", "value" -> this.errors[chars]];
+ except ex (E_RANGE)
+ this.token = ["type" -> "error", "value" -> chars, "error" -> tostr("Invalid error: ", chars)];
+ endtry
+ else
+ this.token = ["type" -> "name", "value" -> chars];
+ endif
+ continue loop;
+
+ /* object number */
+ elseif (c == "#")
+ col1 = column; /* mark the start */
+ column = column + 1;
+ if (`c = source[row][column] ! E_RANGE')
+ if (c == "+" || c == "-")
+ column = column + 1;
+ endif
+ endif
+ while (`c = source[row][column] ! E_RANGE')
+ if (c >= "0" && c <= "9")
+ column = column + 1;
+ else
+ break;
+ endif
+ endwhile
+ col2 = column - 1;
+ chars = source[row][col1..col2];
+ if (chars[$] < "0" || chars[$] > "9")
+ this.token = ["type" -> "object", "value" -> chars, "error" -> "Bad object number"];
+ elseif (c >= "a" && c <= "z")
+ this.token = ["type" -> "object", "value" -> chars + c, "error" -> "Bad object number"];
+ else
+ this.token = ["type" -> "object", "value" -> toobj(chars)];
+ endif
+ continue loop;
+
+ /* number */
+ elseif (c >= "0" && c <= "9")
+ float = 0;
+ col1 = column; /* mark the start */
+ column = column + 1;
+ while (`c = source[row][column] ! E_RANGE')
+ if (c >= "0" && c <= "9")
+ column = column + 1;
+ else
+ break;
+ endif
+ endwhile
+ if (c == "." && ((cc = `source[row][column + 1] ! E_RANGE') != ".")) /* not `..' */
+ float = 1;
+ column = column + 1;
+ while (`c = source[row][column] ! E_RANGE')
+ if (c >= "0" && c <= "9")
+ column = column + 1;
+ else
+ break;
+ endif
+ endwhile
+ endif
+ if (c == "e")
+ float = 1;
+ column = column + 1;
+ if (`c = source[row][column] ! E_RANGE' && c in {"-", "+"})
+ column = column + 1;
+ endif
+ while (`c = source[row][column] ! E_RANGE')
+ if (c >= "0" && c <= "9")
+ column = column + 1;
+ else
+ break;
+ endif
+ endwhile
+ endif
+ col2 = column - 1;
+ chars = source[row][col1..col2];
+ if ((chars[$] < "0" || chars[$] > "9") && chars[$] != ".")
+ this.token = ["type" -> "number", "value" -> chars, "error" -> "Bad number"];
+ elseif (c >= "a" && c <= "z")
+ this.token = ["type" -> "number", "value" -> chars + c, "error" -> "Bad number"];
+ else
+ this.token = ["type" -> "number", "value" -> float ? tofloat(chars) | toint(chars)];
+ endif
+ continue loop;
+
+ /* string */
+ elseif (c == "\"" || c == "'")
+ esc = 0;
+ chars = "";
+ q = c;
+ col1 = column; /* mark the start */
+ column = column + 1;
+ while (`c = source[row][column] ! E_RANGE' && (c != q || esc))
+ column = column + 1;
+ if (c != "\\" || esc)
+ chars = tostr(chars, c);
+ esc = 0;
+ else
+ esc = 1;
+ endif
+ endwhile
+ column = column + 1;
+ col2 = column - 1;
+ if (c != q)
+ this.token = ["type" -> "string", "value" -> source[row][col1..col2 - 1], "error" -> "Unterminated string"];
+ continue loop;
+ else
+ this.token = ["type" -> "string", "value" -> chars];
+ continue loop;
+ endif
+
+ /* possible multi-character operator */
+ elseif (index("-+<>=*/%!|&.", c))
+ col1 = column; /* mark the start */
+ column = column + 1;
+ if (`c = source[row][column] ! E_RANGE' && index(">=*!|&.", c))
+ column = column + 1;
+ this.token = ["type" -> "operator", "value" -> source[row][col1..column - 1]];
+ continue loop;
+ else
+ this.token = ["type" -> "operator", "value" -> source[row][col1]];
+ continue loop;
+ endif
+
+ /* operator */
+ else
+ column = column + 1;
+ this.token = ["type" -> "operator", "value" -> c];
+ continue loop;
+
+ endif
+
+ column = column + 1;
+ endif
+endwhile
+
+this.row = row;
+this.column = column;
+this.source = source;
+
+/* check for unterminated comment */
+if (block_comment)
+ this.token = ["type" -> "comment", "value" -> "", "error" -> "Unterminated comment"];
+endif
+
+/* dollar sign by itself is not a name */
+if (this.token && this.token["type"] == "name" && this.token["value"] == "$")
+ this.token["type"] = "operator";
+endif
+
+/* catch the last token */
+if (row > length(source) && this.token)
+ this.token["eol"] = 1;
+endif
+
+return this;
+.
+
+@program $plastic.tokenizer_proto:token as application/x-moocode
+this:_ensure_instance();
+
+return this.token;
+.
+
+; /* PARSER */
+
+@program $plastic.parser_proto:create as application/x-moocode
+this:_ensure_prototype();
+
+{tokenizer, @options} = args;
+
+instance = create(this, 1);
+instance.tokenizer = tokenizer;
+instance.symbols = [];
+
+plastic = this.plastic;
+
+/* `(end)' is required */
+instance:symbol("(end)");
+instance:symbol("(name)", 0, plastic.name_proto);
+instance:symbol("(literal)", 0, plastic.literal_proto);
+instance:symbol(";", 0, plastic.operator_proto);
+instance:symbol(",", 0, plastic.operator_proto);
+instance:symbol("]", 0, plastic.operator_proto);
+instance:symbol("}", 0, plastic.operator_proto);
+instance:symbol("->", 0, plastic.operator_proto);
+instance:symbol("=>", 0, plastic.operator_proto);
+instance:symbol("..", 0, plastic.operator_proto);
+instance:symbol("|", 0, plastic.operator_proto);
+instance:symbol("`", 0, plastic.operator_proto);
+instance:symbol("!", 0, plastic.prefix_operator_proto);
+instance:symbol("!!", 50, plastic.error_catching_operator_proto);
+instance:symbol("=", 100, plastic.assignment_operator_proto);
+instance:symbol("+=", 100, plastic.compound_assignment_operator_proto);
+instance:symbol("-=", 100, plastic.compound_assignment_operator_proto);
+instance:symbol("*=", 100, plastic.compound_assignment_operator_proto);
+instance:symbol("/=", 100, plastic.compound_assignment_operator_proto);
+instance:symbol("%=", 100, plastic.compound_assignment_operator_proto);
+instance:symbol("?", 200, plastic.traditional_ternary_operator_proto);
+instance:symbol("&&", 300, plastic.infix_operator_proto, ["right" -> 1]);
+instance:symbol("||", 300, plastic.infix_operator_proto, ["right" -> 1]);
+instance:symbol("!=", 400, plastic.infix_operator_proto);
+instance:symbol("==", 400, plastic.infix_operator_proto);
+instance:symbol("<", 400, plastic.infix_operator_proto);
+instance:symbol("<=", 400, plastic.infix_operator_proto);
+instance:symbol(">", 400, plastic.infix_operator_proto);
+instance:symbol(">=", 400, plastic.infix_operator_proto);
+instance:symbol("in", 400, plastic.infix_operator_proto);
+instance:symbol("+", 500, plastic.sign_operator_proto);
+instance:symbol("-", 500, plastic.sign_operator_proto);
+instance:symbol("*", 600, plastic.infix_operator_proto);
+instance:symbol("/", 600, plastic.infix_operator_proto);
+instance:symbol("%", 600, plastic.infix_operator_proto);
+instance:symbol("**", 650, plastic.infix_operator_proto);
+instance:symbol("[", 800, plastic.bracket_operator_proto);
+instance:symbol("{", 0, plastic.brace_operator_proto); /* never bind left */
+instance:symbol("return", 0, plastic.control_flow_statement_proto);
+instance:symbol("break", 0, plastic.control_flow_statement_proto);
+instance:symbol("continue", 0, plastic.control_flow_statement_proto);
+instance:symbol("if", 0, plastic.if_statement_proto);
+instance:symbol("for", 0, plastic.for_statement_proto);
+instance:symbol("while", 0, plastic.loop_statement_proto);
+instance:symbol("until", 0, plastic.loop_statement_proto);
+instance:symbol("fork", 0, plastic.fork_statement_proto);
+instance:symbol("try", 0, plastic.try_statement_proto);
+instance:symbol("from", 0, plastic.from_statement_proto);
+instance:symbol(":", 800, plastic.verb_selector_operator_proto);
+instance:symbol(".", 800, plastic.property_selector_operator_proto);
+/* the infix form is function/verb invocation */
+instance:symbol("(", 800, plastic.invocation_operator_proto);
+instance:symbol(")", 0, plastic.operator_proto);
+
+return instance;
+.
+
+@program $plastic.parser_proto:symbol as application/x-moocode
+this:_ensure_instance();
+
+{id, ?bp = 0, ?proto = $nothing, ?options = []} = args;
+
+proto = valid(proto) ? proto | this.plastic.symbol_proto;
+
+if ((symbol = `this.symbols[id] ! E_RANGE') == E_RANGE)
+ symbol = proto:create(id, bp, options);
+endif
+
+this.symbols[id] = symbol;
+
+return symbol;
+.
+
+@program $plastic.parser_proto:reserve_statement as application/x-moocode
+this:_ensure_instance();
+
+{symbol} = args;
+
+id = symbol.id;
+
+/* raise error if this symbol is not a name, statement or keyword */
+if ((type = this.symbols[id].type) != "name" && type != "statement" && type != "keyword")
+ an_or_a = index("aeiou", type[1]) ? "an" | "a";
+ raise("Syntax error", tostr("`", id, "' is ", an_or_a, " ", type), this);
+endif
+
+symbol.reserved = 1;
+symbol.type = verb[9..$];
+
+this.symbols[id] = symbol;
+.
+
+@program $plastic.parser_proto:make_identifier as application/x-moocode
+this:_ensure_instance();
+
+{symbol} = args;
+
+id = symbol.id;
+
+/* raise error if this symbol is reserved */
+if (this.symbols[id].reserved)
+ raise("Syntax error", tostr("`", id, "' is reserved"), this);
+endif
+
+symbol.reserved = 0;
+symbol.type = verb[6..$];
+
+this.symbols[id] = symbol;
+.
+
+@program $plastic.parser_proto:token as application/x-moocode
+this:_ensure_instance();
+
+{?ttid = 0} = args;
+
+if (this.token == 0)
+ this.tokenizer:advance();
+ token = this.tokenizer.token;
+ if (token)
+ type = token["type"];
+ value = token["value"];
+ eol = token["eol"];
+ if (`token["error"] ! E_RANGE')
+ raise("Syntax error", token["error"], this);
+ elseif (type == "number" || type == "string" || type == "object" || type == "error")
+ symbol = this:symbol("(literal)");
+ this.token = symbol:clone();
+ this.token.type = type;
+ this.token.value = value;
+ this.token.eol = eol;
+ elseif (type == "operator")
+ /* Update the symbol table itself and give the operator the
+ * initial type "operator" (the type will change to "unary",
+ * "binary" or "ternary" when we learn how this symbol is used in
+ * the program).
+ */
+ /* check the symbol table */
+ if ((symbol = `this.symbols[value] ! E_RANGE') == E_RANGE)
+ raise("Syntax error", tostr("Unknown operator: `", value, "'"), this);
+ endif
+ this.token = symbol:clone();
+ this.token.type = "operator";
+ this.token.value = value;
+ this.token.eol = eol;
+ elseif (type == "name")
+ /* Update the symbol table itself and give the name the initial
+ * type "name" (the type will change to "variable", "identifier",
+ * "statement" or "keyword" when we learn how this symbol is used
+ * in the program).
+ */
+ id = value;
+ /* peek into the symbol table */
+ if ((symbol = `this.symbols[id] ! E_RANGE') != E_RANGE)
+ this.token = symbol:clone();
+ this.symbols[id] = this.token;
+ this.token.type = symbol.type || "name";
+ this.token.id = id;
+ this.token.value = value;
+ this.token.eol = eol;
+ else
+ symbol = this:symbol("(name)");
+ this.token = symbol:clone();
+ this.symbols[id] = this.token;
+ this.token.type = "name";
+ this.token.id = id;
+ this.token.value = value;
+ this.token.eol = eol;
+ endif
+ else
+ raise("Syntax error", "Unexpected token", this);
+ endif
+ else
+ symbol = this:symbol("(end)");
+ this.token = symbol:clone();
+ endif
+endif
+
+if (ttid)
+ this:advance(ttid);
+endif
+
+return this.token;
+.
+
+@program $plastic.parser_proto:advance as application/x-moocode
+this:_ensure_instance();
+
+{?id = 0} = args;
+
+/* raise error if token doesn't match expectation */
+if (id && this.token != 0 && this.token.id != id)
+ raise("Syntax error", tostr("Expected `", id, "'"), this);
+endif
+
+this.token = 0;
+
+return this;
+.
+
+@program $plastic.parser_proto:expression as application/x-moocode
+this:_ensure_instance();
+
+{?bp = 0} = args;
+
+token = this:token();
+this:advance();
+
+/* don't call `nud()' and/or `led()' on `(end)' */
+if (token.id == "(end)")
+ return token;
+endif
+
+left = token:nud(this);
+
+while (bp < this:token().bp)
+ this.plastic.utilities:suspend_if_necessary();
+
+ token = this:token();
+ this:advance();
+ left = token:led(this, left);
+endwhile
+
+return left;
+.
+
+@program $plastic.parser_proto:statement as application/x-moocode
+this:_ensure_instance();
+
+token = this:token();
+
+/* disregarded naked semicolons */
+while (token.id == ";")
+ this:advance();
+ token = this:token();
+endwhile
+
+/* either the beginning of a statement */
+/* or an expression with an optional semicolon */
+if (respond_to(token, "std"))
+ this:advance();
+ return token:std(this);
+else
+ expression = this:expression();
+ if (this:token().id == ";")
+ this:advance();
+ endif
+ return expression;
+endif
+.
+
+@program $plastic.parser_proto:statements as application/x-moocode
+this:_ensure_instance();
+
+terminals = args;
+
+statements = {};
+
+while (1)
+ this.plastic.utilities:suspend_if_necessary();
+
+ token = this:token();
+ if (token.id == "(end)" || ((token.type in {"name", "statement", "keyword"}) && token.value in terminals))
+ break;
+ endif
+ statement = this:statement();
+ if (statement.id == "(end)")
+ break;
+ endif
+ statements = {@statements, statement};
+endwhile
+
+return statements;
+.
+
+@program $plastic.parser_proto:parse_all as application/x-moocode
+this:_ensure_instance();
+
+/* This is the API entry-point for clients that want to turn a
+ * stream of tokens into a syntax tree and to return it for further
+ * modification, changing ownership to the client in the process.
+ * Assumes "change owner" permission has been granted by the
+ * caller.
+ */
+
+stack = statements = this:statements();
+
+while (stack)
+ this.plastic.utilities:suspend_if_necessary();
+ {top, @stack} = stack;
+ stack = {@stack, @this.plastic.utilities:children(top)};
+ if (typeof(top) == ANON && isa(top, this.plastic.symbol_proto))
+ this.object_utilities:change_owner(top, caller_perms());
+ endif
+endwhile
+
+return statements;
+.
+
+@program $plastic.parser_proto:push as application/x-moocode
+this:_ensure_instance();
+
+definition = args;
+{id, @rest} = definition;
+
+new = 0;
+
+if (`this.symbols[id] ! E_RANGE' == E_RANGE)
+ this:symbol(@definition);
+ new = 1;
+endif
+
+return {new, id};
+.
+
+@program $plastic.parser_proto:pop as application/x-moocode
+this:_ensure_instance();
+
+{args} = args;
+{new, id} = args;
+
+if (new)
+ this.symbols = this.symbols:delete(id);
+endif
+.
+
+
+; /* UTILITIES */
+
+@program $plastic.utilities:suspend_if_necessary as application/x-moocode
+(ticks_left() < 10000 || seconds_left() < 2) && suspend(0);
+.
+
+@program $plastic.utilities:parse_map_sequence as application/x-moocode
+{parser, separator, infix, terminator, ?symbols = {}} = args;
+
+ids = {};
+for symbol in (symbols)
+ ids = {@ids, parser:push(@symbol)};
+endfor
+
+if (terminator && parser:token().id == terminator)
+ return {};
+endif
+
+key = parser:expression(0);
+parser:advance(infix);
+value = parser:expression(0);
+map = {{key, value}};
+
+while (parser:token().id == separator)
+ this:suspend_if_necessary();
+ map && parser:advance(separator);
+ key = parser:expression(0);
+ parser:advance(infix);
+ value = parser:expression(0);
+ map = {@map, {key, value}};
+endwhile
+
+for id in (ids)
+ parser:pop(id);
+endfor
+
+return map;
+.
+
+@program $plastic.utilities:parse_list_sequence as application/x-moocode
+{parser, separator, terminator, ?symbols = "defaults"} = args;
+
+/* enable defaults */
+if (symbols && symbols == "defaults")
+ symbols = {{"@", 0, this.plastic.prefix_operator_proto}};
+endif
+
+ids = {};
+for symbol in (symbols)
+ ids = {@ids, parser:push(@symbol)};
+endfor
+
+if (terminator && parser:token().id == terminator)
+ return {};
+endif
+
+expression = parser:expression(0);
+list = {expression};
+
+while (parser:token().id == separator)
+ this:suspend_if_necessary();
+ parser:advance(separator);
+ expression = parser:expression(0);
+ list = {@list, expression};
+endwhile
+
+for id in (ids)
+ parser:pop(id);
+endfor
+
+return list;
+.
+
+@program $plastic.utilities:validate_scattering_pattern as application/x-moocode
+{parser, pattern} = args;
+
+state = 1;
+
+for element in (pattern)
+ if (state == 1 && element.type == "variable")
+ continue;
+ elseif ((state == 1 || state == 2) && element.type == "binary" && element.id == "=")
+ if (element.first.type == "variable")
+ state = 2;
+ continue;
+ endif
+ elseif ((state == 1 || state == 2) && element.type == "unary" && element.id == "@")
+ if (element.first.type == "variable")
+ state = 3;
+ continue;
+ endif
+ endif
+
+ raise("Syntax error", "Illegal scattering pattern", parser);
+endfor
+.
+
+@program $plastic.utilities:children as application/x-moocode
+{node} = args;
+
+/* Intelligently gather children from various places.
+ */
+
+if (typeof(node) == LIST)
+ return node;
+elseif (`typeof(value = node.value) == LIST ! ANY')
+ return value;
+else
+ children = {};
+ for prop in ({"first", "second", "third"})
+ if (`value = node.(prop) ! E_PROPNF => 0' != 0)
+ children = {@children, value};
+ endif
+ endfor
+ return children;
+endif
+.
+
+@program $plastic.utilities:match as application/x-moocode
+{root, pattern} = args;
+
+/* Pattern is a map. The keys specify the properties (`id', `type',
+ * etc.) to match on. The values specify the property values for the
+ * match comparison. Conducts a depth first search for pattern.
+ */
+
+keys = pattern:keys();
+matches = {};
+stack = {root};
+
+while next (stack)
+ this:suspend_if_necessary();
+ {top, @stack} = stack;
+ stack = {@stack, @this:children(top)};
+ if (typeof(top) == ANON && isa(top, this.plastic.symbol_proto))
+ for key in (keys)
+ if (top.(key) != pattern[key])
+ continue next;
+ endif
+ endfor
+ matches = {@matches, top};
+ endif
+endwhile
+
+return matches;
+.
+
+
+@program $plastic.symbol_proto:create as application/x-moocode
+{id, ?bp = 0, ?opts = []} = args;
+(typeof(this) == OBJ) || raise(E_PERM, "Call not allowed on anonymous object");
+instance = create(this, 1);
+instance.id = id;
+instance.value = id;
+instance.bp = bp;
+for v, k in (opts)
+ if (k in {"id", "type", "bp", "right"})
+ instance.(k) = v;
+ endif
+endfor
+return instance;
+.
+
+@program $plastic.symbol_proto:clone as application/x-moocode
+(typeof(this) == OBJ) && raise(E_PERM, "Call not allowed on permanent object");
+parents = parents(this);
+instance = create(parents, 1);
+for ancestor in (ancestors(this))
+ for property in (`properties(ancestor) ! E_PERM => {}')
+ instance.(property) = this.(property);
+ endfor
+endfor
+return instance;
+.
+
+@program $plastic.symbol_proto:nud as application/x-moocode
+{parser} = args;
+raise("Syntax error", tostr("Undefined: ", this.id), parser);
+.
+
+@program $plastic.symbol_proto:led as application/x-moocode
+{parser, _} = args;
+raise("Syntax error", tostr("Missing operator: ", this.id), parser);
+.
+
+
+@program $plastic.literal_proto:nud as application/x-moocode
+return this;
+.
+
+
+@program $plastic.positional_symbol_proto:nud as application/x-moocode
+return this;
+.
+
+
+@program $plastic.prefix_operator_proto:nud as application/x-moocode
+{parser} = args;
+
+first = parser:expression(700);
+
+if (first.id == "(end)")
+ raise("Syntax error", "Expected an expression", parser);
+endif
+
+this.type = "unary";
+this.first = first;
+
+return this;
+.
+
+
+@program $plastic.infix_operator_proto:led as application/x-moocode
+{parser, first} = args;
+
+right = this.right && 1; /* does this operator associate to the right? */
+
+second = parser:expression(this.bp - right);
+
+if (second.id == "(end)")
+ raise("Syntax error", "Expected an expression", parser);
+endif
+
+this.type = "binary";
+this.first = first;
+this.second = second;
+
+return this;
+.
+
+
+@program $plastic.sign_operator_proto:nud as application/x-moocode
+{parser} = args;
+
+first = parser:expression(700);
+
+if (first.id == "(end)")
+ raise("Syntax error", "Expected an expression", parser);
+endif
+
+this.type = "unary";
+this.first = first;
+
+return this;
+.
+
+@program $plastic.sign_operator_proto:led as application/x-moocode
+{parser, first} = args;
+
+second = parser:expression(this.bp);
+
+if (second.id == "(end)")
+ raise("Syntax error", "Expected an expression", parser);
+endif
+
+this.type = "binary";
+this.first = first;
+this.second = second;
+
+return this;
+.
+
+
+@program $plastic.statement_proto:std as application/x-moocode
+{parser} = args;
+raise("Syntax error", "Undefined", parser);
+.
+
+
+
+@program $plastic.control_flow_statement_proto:std as application/x-moocode
+{parser} = args;
+
+if (this.id != "return" && parser.loop_depth < 1)
+ raise("Syntax error", tostr("No enclosing loop for ", this.id), parser);
+endif
+
+/* update the symbol table */
+parser:reserve_statement(this);
+
+if (!this.eol && parser:token().id != ";")
+ expression = parser:expression(0);
+ this.first = expression;
+endif
+
+if (this.id != "return" && this.first != 0)
+ if (this.first.type != "variable")
+ raise("Syntax error", "Loop name must be a name", parser);
+ endif
+ if (!(this.first.value in parser.loop_variables))
+ raise("Syntax error", tostr("Invalid loop name for ", this.id), parser);
+ endif
+endif
+
+if (parser:token().id == ";")
+ parser:advance(";");
+endif
+
+return this;
+.
+
+
+@program $plastic.if_statement_proto:std as application/x-moocode
+{parser} = args;
+
+/* update the symbol table */
+parser:reserve_statement(this);
+
+a = {};
+
+/* the predicate */
+parser:token("(");
+expression = parser:expression(0);
+a = {@a, expression};
+parser:token(")");
+
+/* the consequent */
+statements = parser:statements("elseif", "else", "endif", "end");
+a = {@a, statements};
+
+/* the alternatives */
+while (parser:token().id == "elseif")
+ parser:advance("elseif");
+
+ /* predicate */
+ parser:token("(");
+ expression = parser:expression(0);
+ a = {@a, expression};
+ parser:token(")");
+
+ /* consequent */
+ statements = parser:statements("elseif", "else", "endif", "end");
+ a = {@a, statements};
+
+ /* update the symbol table */
+ symbol = parser.symbols["elseif"];
+ parser:reserve_keyword(symbol);
+endwhile
+
+/* the final alternative */
+if (parser:token().id == "else")
+ parser:advance("else");
+
+ statements = parser:statements("endif", "end");
+ a = {@a, statements};
+
+ /* update the symbol table */
+ symbol = parser.symbols["else"];
+ parser:reserve_keyword(symbol);
+endif
+
+/* the last token must be "endif" or "end" */
+if ((id = parser:token().id) == "endif")
+ parser:advance("endif");
+else
+ parser:advance("end");
+endif
+
+/* update the symbol table */
+symbol = parser.symbols[id];
+parser:reserve_keyword(symbol);
+
+/* store the parts in this token's `value' */
+this.value = a;
+
+return this;
+.
+
+
+@program $plastic.for_statement_proto:std as application/x-moocode
+{parser} = args;
+
+/* update the symbol table */
+parser:reserve_statement(this);
+
+a = {};
+
+/* the index(s) */
+variables = {};
+
+variable = parser:token();
+parser:make_variable(variable);
+parser:advance();
+variables = {@variables, variable};
+
+if (parser:token().id == ",")
+ while (parser:token().id == ",")
+ parser:advance(",");
+ variable = parser:token();
+ parser:make_variable(variable);
+ parser:advance();
+ variables = {@variables, variable};
+ endwhile
+elseif (parser:token().id == "->")
+ while (parser:token().id == "->")
+ parser:advance("->");
+ variable = parser:token();
+ parser:make_variable(variable);
+ parser:advance();
+ variables = {variable, @variables};
+ endwhile
+endif
+
+a = {@a, @variables};
+
+for _, i in (variables)
+ variables[i] = variables[i].id;
+endfor
+
+parser:token("in");
+
+/* update the symbol table */
+symbol = parser.symbols["in"];
+parser:reserve_keyword(symbol);
+
+/* could be a range or a collection */
+if (parser:token().id == "[")
+ /* range */
+ this.subtype = "range";
+ length(a) < 2 || raise("Syntax error", "Too many loop variables", parser);
+ parser:token("[");
+ first = parser:expression(0);
+ a = {@a, first};
+ parser:token("..");
+ second = parser:expression(0);
+ a = {@a, second};
+ parser:token("]");
+else
+ /* collection */
+ this.subtype = "collection";
+ length(a) < 3 || raise("Syntax error", "Too many loop variables", parser);
+ parser:token("(");
+ expression = parser:expression(0);
+ a = {@a, expression};
+ parser:token(")");
+endif
+
+/* the body */
+parser.loop_variables = {@parser.loop_variables, @variables};
+parser.loop_depth = parser.loop_depth + 1;
+
+statements = parser:statements("endfor", "end");
+a = {@a, statements};
+
+l = length(variables);
+parser.loop_variables = parser.loop_variables[1..$ - l];
+parser.loop_depth = parser.loop_depth - 1;
+
+/* the last token must be "endfor" or "end" */
+if ((id = parser:token().id) == "endfor")
+ parser:advance("endfor");
+else
+ parser:advance("end");
+endif
+
+/* update the symbol table */
+symbol = parser.symbols[id];
+parser:reserve_keyword(symbol);
+
+/* store the parts in this token's `value' */
+this.value = a;
+
+return this;
+.
+
+
+@program $plastic.loop_statement_proto:std as application/x-moocode
+{parser} = args;
+
+/* update the symbol table */
+parser:reserve_statement(this);
+
+end = tostr("end", this.id);
+
+a = {};
+
+/* possible, optional loop name */
+variables = {};
+if ((type = parser:token().type) == "variable" || type == "name")
+ variable = parser:token();
+ parser:make_variable(variable);
+ parser:advance();
+ variables = {@variables, variable.id};
+ a = {@a, variable};
+endif
+
+/* the condition */
+parser:token("(");
+expression = parser:expression(0);
+a = {@a, expression};
+parser:token(")");
+
+/* the body */
+parser.loop_variables = {@parser.loop_variables, @variables};
+parser.loop_depth = parser.loop_depth + 1;
+
+statements = parser:statements(end, "end");
+a = {@a, statements};
+
+l = length(variables);
+parser.loop_variables = parser.loop_variables[1..$ - l];
+parser.loop_depth = parser.loop_depth - 1;
+
+/* the last token must be "endwhile/enduntil" or "end" */
+if ((id = parser:token().id) == end)
+ parser:advance(end);
+else
+ parser:advance("end");
+endif
+
+/* update the symbol table */
+symbol = parser.symbols[id];
+parser:reserve_keyword(symbol);
+
+/* store the parts in this token's `value' */
+this.value = a;
+
+return this;
+.
+
+
+@program $plastic.fork_statement_proto:std as application/x-moocode
+{parser} = args;
+
+/* update the symbol table */
+parser:reserve_statement(this);
+
+a = {};
+
+/* possible, optional task name */
+if ((type = parser:token().type) == "variable" || type == "name")
+ variable = parser:token();
+ parser:make_variable(variable);
+ parser:advance();
+ a = {@a, variable};
+endif
+
+/* the expression */
+parser:token("(");
+expression = parser:expression(0);
+a = {@a, expression};
+parser:token(")");
+
+/* the body */
+statements = parser:statements("endfork", "end");
+a = {@a, statements};
+
+/* the last token must be "endfork" or "end" */
+if ((id = parser:token().id) == "endfork")
+ parser:advance("endfork");
+else
+ parser:advance("end");
+endif
+
+/* update the symbol table */
+symbol = parser.symbols[id];
+parser:reserve_keyword(symbol);
+
+/* store the parts in this token's `value' */
+this.value = a;
+
+return this;
+.
+
+
+@program $plastic.try_statement_proto:std as application/x-moocode
+{parser} = args;
+
+/* update the symbol table */
+parser:reserve_statement(this);
+
+a = {};
+
+/* the body */
+body = parser:statements("except", "finally", "endtry", "end");
+a = {@a, body};
+
+if (parser:token().id == "finally")
+ parser:advance("finally");
+
+ b = parser:statements("endtry", "end");
+
+ /* update the symbol table */
+ symbol = parser.symbols["finally"];
+ parser:reserve_keyword(symbol);
+
+ this.subtype = "finally";
+
+ a = {@a, b};
+
+else
+ b = {};
+
+ id = parser:push("@", 0, this.plastic.prefix_operator_proto);
+
+ /* the exceptions */
+ while (parser:token().id == "except")
+ parser:advance("except");
+
+ /* variable and codes */
+ if ((variable = parser:token()).id != "(")
+ parser:advance();
+
+ if (variable.type != "name" && variable.type != "variable")
+ raise("Syntax error", "Variable must be an identifier", parser);
+ endif
+ parser:make_variable(variable);
+
+ parser:token("(");
+ if ((token = parser:token()).id == "ANY")
+ parser:advance("ANY");
+ symbol = parser.symbols["ANY"];
+ parser:reserve_keyword(symbol);
+ codes = {token};
+ else
+ codes = this.plastic.utilities:parse_list_sequence(parser, ",", ")");
+ endif
+ parser:token(")");
+
+ !codes && raise("Syntax error", "Codes may not be empty", parser);
+
+ b = {variable, codes};
+
+ /* just codes */
+ else
+ parser:token("(");
+ if ((token = parser:token()).id == "ANY")
+ parser:advance("ANY");
+ symbol = parser.symbols["ANY"];
+ parser:reserve_keyword(symbol);
+ codes = {token};
+ else
+ codes = this.plastic.utilities:parse_list_sequence(parser, ",", ")");
+ endif
+ parser:token(")");
+
+ !codes && raise("Syntax error", "Codes may not be empty", parser);
+
+ b = {codes};
+
+ endif
+
+ /* handler */
+ handler = parser:statements("except", "finally", "endtry", "end");
+ b = {@b, handler};
+
+ /* update the symbol table */
+ symbol = parser.symbols["except"];
+ parser:reserve_keyword(symbol);
+
+ a = {@a, b};
+
+ endwhile
+
+ parser:pop(id);
+
+ if (!b)
+ raise("Syntax error", "Missing except", parser);
+ endif
+
+ this.subtype = "except";
+
+endif
+
+/* the last token must be "endtry" or "end" */
+if ((id = parser:token().id) == "endtry")
+ parser:advance("endtry");
+else
+ parser:advance("end");
+endif
+
+/* update the symbol table */
+symbol = parser.symbols[id];
+parser:reserve_keyword(symbol);
+
+/* store the parts in this token's `value' */
+this.value = a;
+
+return this;
+.
+
+
+@program $plastic.assignment_operator_proto:led as application/x-moocode
+{parser, first} = args;
+
+if (first.type == "unary" && first.id == "{") /* scattering syntax */
+ this.plastic.utilities:validate_scattering_pattern(parser, first.value);
+ first.type = "pattern";
+endif
+
+if (first.type != "variable" && first.type != "pattern" && first.id != "." && first.id != "[")
+ raise("Syntax error", "Illegal expression on left side of assignment", parser);
+endif
+
+second = parser:expression(this.bp - 1);
+
+if (second.id == "(end)")
+ raise("Syntax error", "Expected an expression", parser);
+endif
+
+this.type = "binary";
+this.first = first;
+this.second = second;
+
+return this;
+.
+
+
+@program $plastic.compound_assignment_operator_proto:led as application/x-moocode
+{parser, first} = args;
+
+if (first.type != "variable" && first.id != "." && first.id != "[")
+ raise("Syntax error", "Illegal expression on left side of assignment", parser);
+endif
+
+second = parser:expression(this.bp - 1);
+
+if (second.id == "(end)")
+ raise("Syntax error", "Expected an expression", parser);
+endif
+
+op = this.id[1];
+bp = parser.symbols[op].bp;
+
+inner = parser.plastic.infix_operator_proto:create(op, bp);
+inner.type = "binary";
+inner.first = first;
+inner.second = second;
+
+outer = parser.plastic.assignment_operator_proto:create("=", this.bp);
+outer.type = "binary";
+outer.first = first;
+outer.second = inner;
+
+return outer;
+.
+
+
+@program $plastic.name_proto:nud as application/x-moocode
+{parser} = args;
+
+/* Assume the name is a variable. Subsequent usage may modify this
+ * assumption.
+ */
+parser:make_variable(this);
+
+return this;
+.
+
+
+@program $plastic.bracket_operator_proto:nud as application/x-moocode
+{parser} = args;
+
+sequence = this.plastic.utilities:parse_map_sequence(parser, ",", "->", "]");
+parser:token("]");
+
+this.type = "unary";
+this.value = sequence;
+this.first = this;
+
+return this;
+.
+
+@program $plastic.bracket_operator_proto:led as application/x-moocode
+{parser, first} = args;
+
+caret = parser:push("^", 0, this.plastic.positional_symbol_proto);
+dollar = parser:push("$", 0, this.plastic.positional_symbol_proto);
+
+second = parser:expression(0);
+
+if (parser:token().id == "..")
+ parser:advance("..");
+ third = parser:expression(0);
+ parser:advance("]");
+ this.type = "ternary";
+ this.first = first;
+ this.second = second;
+ this.third = third;
+else
+ parser:advance("]");
+ this.type = "binary";
+ this.first = first;
+ this.second = second;
+endif
+
+parser:pop(caret);
+parser:pop(dollar);
+
+return this;
+.
+
+
+@program $plastic.brace_operator_proto:nud as application/x-moocode
+{parser} = args;
+
+sequence = this.plastic.utilities:parse_list_sequence(parser, ",", "}");
+parser:token("}");
+
+this.type = "unary";
+this.value = sequence;
+this.first = this;
+
+return this;
+.
+
+
+
+@program $plastic.invocation_operator_proto:nud as application/x-moocode
+{parser} = args;
+
+expression = parser:expression(0);
+parser:token(")");
+
+this.type = "unary";
+this.first = expression;
+
+return this;
+.
+
+@program $plastic.invocation_operator_proto:led as application/x-moocode
+{parser, left} = args;
+
+sequence = this.plastic.utilities:parse_list_sequence(parser, ",", ")");
+parser:token(")");
+
+/* The invocation operator handles function and verb invocation, and
+ * guards against use on properties.
+ */
+if (left.id == ".")
+ raise("Syntax error", "Invalid application of invocation", parser);
+elseif (left.id == ":")
+ first = left.first;
+ second = left.second;
+
+ /* the verb selector operator has our back */
+
+ this.type = "ternary";
+ this.first = first;
+ this.second = second;
+ this.third = sequence;
+else
+ if (left.type != "variable")
+ raise("Syntax error", "Expected an identifier", parser);
+ endif
+
+ parser:make_identifier(left);
+
+ if (`import = parser.imports[left.value] ! E_RANGE' != E_RANGE)
+ this.type = "ternary";
+ this.first = import;
+ this.second = left;
+ this.third = sequence;
+ else
+ this.type = "binary";
+ this.first = left;
+ this.second = sequence;
+ endif
+endif
+
+return this;
+.
+
+
+
+@program $plastic.verb_selector_operator_proto:led as application/x-moocode
+{parser, first} = args;
+
+if (parser:token().id == "(")
+ parser:advance("(");
+ second = parser:expression(0);
+ parser:advance(")");
+else
+ second = parser:expression(this.bp);
+ if (second.type != "variable")
+ raise("Syntax error", "Expected an identifier", parser);
+ endif
+ parser:make_identifier(second);
+endif
+
+if (parser:token().id != "(")
+ raise("Syntax error", "Expected `('", parser);
+endif
+
+this.type = "binary";
+this.first = first;
+this.second = second;
+
+return this;
+.
+
+
+@program $plastic.property_selector_operator_proto:led as application/x-moocode
+{parser, first} = args;
+
+if (parser:token().id == "(")
+ parser:advance("(");
+ second = parser:expression(0);
+ parser:advance(")");
+else
+ second = parser:expression(this.bp);
+ if (second.type != "variable")
+ raise("Syntax error", "Expected an identifier", parser);
+ endif
+ parser:make_identifier(second);
+endif
+
+this.type = "binary";
+this.first = first;
+this.second = second;
+
+return this;
+.
+
+
+@program $plastic.error_catching_operator_proto:nud as application/x-moocode
+{parser} = args;
+
+first = parser:expression(700);
+
+if (first.id == "(end)")
+ raise("Syntax error", "Expected an expression", parser);
+endif
+
+this.type = "unary";
+this.first = first;
+
+return this;
+.
+
+@program $plastic.error_catching_operator_proto:led as application/x-moocode
+{parser, first} = args;
+
+/* Error codes are either the keyword `ANY' or a list of expressions
+ * (see 4.1.12 Catching Errors in Expressions).
+ */
+id = parser:push("@", 0, this.plastic.prefix_operator_proto);
+
+if ((token = parser:token()).id == "ANY")
+ parser:advance("ANY");
+ symbol = parser.symbols["ANY"];
+ parser:reserve_keyword(symbol);
+ second = {token};
+else
+ second = this.plastic.utilities:parse_list_sequence(parser, ",", "");
+
+ if (second[$].id == "(end)")
+ raise("Syntax error", "Expected `ANY' or a list of expressions", parser);
+ endif
+endif
+
+parser:pop(id);
+
+if ((token = parser:token()).id == "=>")
+ parser:advance("=>");
+ third = parser:expression(0);
+
+ if (third.id == "(end)")
+ raise("Syntax error", "Expected an expression", parser);
+ endif
+
+ this.type = "ternary";
+ this.first = first;
+ this.second = second;
+ this.third = third;
+else
+ this.type = "binary";
+ this.first = first;
+ this.second = second;
+endif
+
+return this;
+.
+
+
+@program $plastic.traditional_ternary_operator_proto:led as application/x-moocode
+{parser, first} = args;
+
+second = parser:expression(0);
+parser:token("|");
+third = parser:expression(0);
+
+if (second.id == "(end)" || third.id == "(end)")
+ raise("Syntax error", "Expected an expression", parser);
+endif
+
+this.type = "ternary";
+this.first = first;
+this.second = second;
+this.third = third;
+
+return this;
+.
+
+@program $plastic.from_statement_proto:std as application/x-moocode
+{parser} = args;
+
+/* update the symbol table */
+parser:reserve_statement(this);
+
+types = {"name", "variable", "identifier"};
+
+/* the reference */
+if ((target = parser:token()).type == "string")
+ parser:advance();
+elseif (target.type in types && target.value == "this")
+ parser:advance();
+elseif (target.type in types && target.value[1] == "$")
+ target = parser:expression();
+ if (target.id == ".")
+ temp = target;
+ while (temp.id == ".")
+ if ((temp.first.id != "." && !(temp.first.type in types)) && !(temp.second.type in types))
+ raise("Syntax error", tostr("Invalid reference: ", target.id), parser);
+ endif
+ temp = temp.first;
+ endwhile
+ elseif (target.value[1] == "$")
+ /* ok */
+ else
+ raise("Syntax error", tostr("Invalid reference: ", target.id), parser);
+ endif
+else
+ raise("Syntax error", tostr("Invalid reference: ", target.id), parser);
+endif
+
+parser:token("use");
+
+/* update the symbol table */
+symbol = parser.symbols["use"];
+parser:reserve_keyword(symbol);
+
+/* the import(s) */
+imports = {};
+
+if ((import = parser:token()).id == "(end)")
+ raise("Syntax error", "Expected an identifier", parser);
+elseif (!(import.type in types))
+ raise("Syntax error", "Import must be an identifier", parser);
+endif
+parser:make_identifier(import);
+parser:advance();
+imports = {@imports, import};
+
+while (parser:token().id == ",")
+ parser:advance(",");
+ if ((import = parser:token()).id == "(end)")
+ raise("Syntax error", "Expected an identifier", parser);
+ elseif (!(import.type in types))
+ raise("Syntax error", "Import must be an identifier", parser);
+ endif
+ parser:make_identifier(import);
+ parser:advance();
+ imports = {@imports, import};
+endwhile
+
+/* generate code */
+if (target.type == "string")
+ temp = parser.plastic.invocation_operator_proto:create("(");
+ temp.type = "binary";
+ temp.first = parser.plastic.name_proto:create("$lookup");
+ temp.first.type = "identifier";
+ temp.first.value = "$lookup";
+ temp.second = {target};
+ target = temp;
+endif
+
+first = parser.plastic.name_proto:create(tostr(random()));
+first.type = "unique";
+
+if (!length(imports))
+ raise("Syntax error", "Missing imports", parser);
+endif
+
+for import in (imports)
+ if (`parser.imports[import.id] ! E_RANGE' != E_RANGE)
+ raise("Syntax error", "Duplicate imports", parser);
+ endif
+ parser.imports[import.id] = first;
+endfor
+
+result = parser.plastic.assignment_operator_proto:create("=");
+result.type = "binary";
+result.first = first;
+result.second = target;
+
+return result;
+.
diff --git a/samples/Nix/nginx.nix b/samples/Nix/nginx.nix
new file mode 100644
index 00000000..515b686f
--- /dev/null
+++ b/samples/Nix/nginx.nix
@@ -0,0 +1,80 @@
+{ stdenv, fetchurl, fetchgit, openssl, zlib, pcre, libxml2, libxslt, expat
+, rtmp ? false
+, fullWebDAV ? false
+, syslog ? false
+, moreheaders ? false, ...}:
+
+let
+ version = "1.4.4";
+ mainSrc = fetchurl {
+ url = "http://nginx.org/download/nginx-${version}.tar.gz";
+ sha256 = "1f82845mpgmhvm151fhn2cnqjggw9w7cvsqbva9rb320wmc9m63w";
+ };
+
+ rtmp-ext = fetchgit {
+ url = git://github.com/arut/nginx-rtmp-module.git;
+ rev = "1cfb7aeb582789f3b15a03da5b662d1811e2a3f1";
+ sha256 = "03ikfd2l8mzsjwx896l07rdrw5jn7jjfdiyl572yb9jfrnk48fwi";
+ };
+
+ dav-ext = fetchgit {
+ url = git://github.com/arut/nginx-dav-ext-module.git;
+ rev = "54cebc1f21fc13391aae692c6cce672fa7986f9d";
+ sha256 = "1dvpq1fg5rslnl05z8jc39sgnvh3akam9qxfl033akpczq1bh8nq";
+ };
+
+ syslog-ext = fetchgit {
+ url = https://github.com/yaoweibin/nginx_syslog_patch.git;
+ rev = "165affd9741f0e30c4c8225da5e487d33832aca3";
+ sha256 = "14dkkafjnbapp6jnvrjg9ip46j00cr8pqc2g7374z9aj7hrvdvhs";
+ };
+
+ moreheaders-ext = fetchgit {
+ url = https://github.com/agentzh/headers-more-nginx-module.git;
+ rev = "refs/tags/v0.23";
+ sha256 = "12pbjgsxnvcf2ff2i2qdn39q4cm5czlgrng96j8ml4cgxvnbdh39";
+ };
+in
+
+stdenv.mkDerivation rec {
+ name = "nginx-${version}";
+ src = mainSrc;
+
+ buildInputs = [ openssl zlib pcre libxml2 libxslt
+ ] ++ stdenv.lib.optional fullWebDAV expat;
+
+ patches = if syslog then [ "${syslog-ext}/syslog_1.4.0.patch" ] else [];
+
+ configureFlags = [
+ "--with-http_ssl_module"
+ "--with-http_spdy_module"
+ "--with-http_xslt_module"
+ "--with-http_sub_module"
+ "--with-http_dav_module"
+ "--with-http_gzip_static_module"
+ "--with-http_secure_link_module"
+ "--with-ipv6"
+ # Install destination problems
+ # "--with-http_perl_module"
+ ] ++ stdenv.lib.optional rtmp "--add-module=${rtmp-ext}"
+ ++ stdenv.lib.optional fullWebDAV "--add-module=${dav-ext}"
+ ++ stdenv.lib.optional syslog "--add-module=${syslog-ext}"
+ ++ stdenv.lib.optional moreheaders "--add-module=${moreheaders-ext}";
+
+ preConfigure = ''
+ export NIX_CFLAGS_COMPILE="$NIX_CFLAGS_COMPILE -I${libxml2 }/include/libxml2"
+ '';
+
+ # escape example
+ postInstall = ''
+ mv $out/sbin $out/bin ''' ''${
+ ${ if true then ${ "" } else false }
+ '';
+
+ meta = {
+ description = "A reverse proxy and lightweight webserver";
+ maintainers = [ stdenv.lib.maintainers.raskin];
+ platforms = stdenv.lib.platforms.all;
+ inherit version;
+ };
+}
diff --git a/samples/Ox/IJCEmet2009.oxh b/samples/Ox/IJCEmet2009.oxh
new file mode 100644
index 00000000..5dd045af
--- /dev/null
+++ b/samples/Ox/IJCEmet2009.oxh
@@ -0,0 +1,72 @@
+/** Replicate Imai, Jain and Ching Econometrica 2009 (incomplete).
+
+**/
+#include "IJCEmet2009.h"
+
+Kapital::Kapital(L,const N,const entrant,const exit,const KP){
+ StateVariable(L,N);
+ this.entrant = entrant;
+ this.exit = exit;
+ this.KP = KP;
+ actual = Kbar*vals/(N-1);
+ upper = log(actual~.Inf);
+ }
+
+Kapital::Transit(FeasA) {
+ decl ent =CV(entrant), stayout = FeasA[][exit.pos], tprob, sigu = CV(KP[SigU]);
+ if (!v && !ent) return { <0>, ones(stayout) };
+ tprob = ent ? probn( (upper-CV(KP[Kbe]))/sigu )
+ : probn( (upper-(CV(KP[Kb0])+CV(KP[Kb2])*upper[v])) / sigu );
+ tprob = tprob[1:] - tprob[:N-1];
+ return { vals, tprob.*(1-stayout)+(1.0~zeros(1,N-1)).*stayout };
+ }
+
+FirmEntry::Run() {
+ Initialize();
+ GenerateSample();
+ BDP->BayesianDP();
+ }
+
+FirmEntry::Initialize() {
+ Rust::Initialize(Reachable,0);
+ sige = new StDeviations("sige",<0.3,0.3>,0);
+ entrant = new LaggedAction("entrant",d);
+ KP = new array[Kparams];
+ KP[Kbe] = new Positive("be",0.5);
+ KP[Kb0] = new Free("b0",0.0);
+ KP[Kb1] = new Determined("b1",0.0);
+ KP[Kb2] = new Positive("b2",0.4);
+ KP[SigU] = new Positive("sigu",0.4);
+ EndogenousStates(K = new Kapital("K",KN,entrant,d,KP),entrant);
+ SetDelta(new Probability("delta",0.85));
+ kcoef = new Positive("kcoef",0.1);
+ ecost = new Negative("ec",-0.4);
+ CreateSpaces();
+ }
+
+FirmEntry::GenerateSample() {
+ Volume = LOUD;
+ EM = new ValueIteration(0);
+// EM -> Solve(0,0);
+ data = new DataSet(0,EM);
+ data->Simulate(DataN,DataT,0,FALSE);
+ data->Print("firmentry.xls");
+ BDP = new ImaiJainChing("FMH",data,EM,ecost,sige,kcoef,KP,delta);
+ }
+
+/** Capital stock can be positive only for incumbents.
+**/
+FirmEntry::Reachable() { return CV(entrant)*CV(K) ? 0 : new FirmEntry() ; }
+
+/** The one period return.
+
+U =
+
+**/
+FirmEntry::Utility() {
+ decl ent = CV(entrant),
+ u =
+ ent*CV(ecost)+(1-ent)*CV(kcoef)*AV(K)
+ | 0.0;
+ return u;
+ }
diff --git a/samples/Ox/ParallelObjective.ox b/samples/Ox/ParallelObjective.ox
new file mode 100644
index 00000000..24463987
--- /dev/null
+++ b/samples/Ox/ParallelObjective.ox
@@ -0,0 +1,63 @@
+/** Client and Server classes for parallel optimization using CFMPI.**/
+#include "ParallelObjective.h"
+
+/** Set up MPI Client-Server support for objective optimization.
+@param obj `Objective' to parallelize
+@param DONOTUSECLIENT TRUE (default): client node does no object evaluation FALSE after putting servers to work Client node does one evaluation.
+**/
+ParallelObjective(obj,DONOTUSECLIENT) {
+ if (isclass(obj.p2p)) {oxwarning("P2P object already exists for "+obj.L+". Nothing changed"); return;}
+ obj.p2p = new P2P(DONOTUSECLIENT,new ObjClient(obj),new ObjServer(obj));
+ }
+
+ObjClient::ObjClient(obj) { this.obj = obj; }
+
+ObjClient::Execute() { }
+
+ObjServer::ObjServer(obj) {
+ this.obj = obj;
+ basetag = P2P::STOP_TAG+1;
+ iml = obj.NvfuncTerms;
+ Nparams = obj.nstruct;
+ }
+
+/** Wait on the objective client.
+**/
+ObjServer::Loop(nxtmsgsz) {
+ Nparams = nxtmsgsz; //free param length is no greater than Nparams
+ if (Volume>QUIET) println("ObjServer server ",ID," Nparams ",Nparams);
+ Server::Loop(Nparams);
+ Recv(ANY_TAG); //receive the ending parameter vector
+ obj->Encode(Buffer[:Nparams-1]); //encode it.
+ }
+
+/** Do the objective evaluation.
+Receive structural parameter vector and `Objective::Encode`() it.
+Call `Objective::vfunc`().
+@return Nparams (max. length of next expected message);
+**/
+ObjServer::Execute() {
+ obj->Decode(Buffer[:obj.nfree-1]);
+ Buffer = obj.cur.V[] = obj->vfunc();
+ if (Volume>QUIET) println("Server Executive: ",ID," vfunc[0]= ",Buffer[0]);
+ return obj.nstruct;
+ }
+
+CstrServer::CstrServer(obj) { ObjServer(obj); }
+
+SepServer::SepServer(obj) { ObjServer(obj); }
+
+CstrServer::Execute() {
+ obj->Encode(Buffer);
+ obj->Lagrangian(0);
+ return rows(Buffer = obj.cur->Vec());
+ }
+
+/** Separable objective evaluations.
+**/
+SepServer::Execute() {
+ obj.Kvar.v = imod(Tag-basetag,obj.K);
+ obj->Encode(Buffer,TRUE);
+ Buffer = obj.Kvar->PDF() * obj->vfunc();
+ return obj.NvfuncTerms;
+ }
diff --git a/samples/Ox/particle.oxo b/samples/Ox/particle.oxo
new file mode 100644
index 00000000..0ce64fb7
--- /dev/null
+++ b/samples/Ox/particle.oxo
@@ -0,0 +1,38 @@
+nldge::ParticleLogLikeli()
+{ decl it, ip,
+ mss, mbas, ms, my, mx, vw, vwi, dws,
+ mhi, mhdet, loglikeli, mData,
+ vxm, vxs, mxm=<>, mxsu=<>, mxsl=<>,
+ time, timeall, timeran=0, timelik=0, timefun=0, timeint=0, timeres=0;
+
+ mData = GetData(m_asY);
+ mhdet = sqrt((2*M_PI)^m_cY * determinant(m_mMSbE.^2)); // covariance determinant
+ mhi = invert(m_mMSbE.^2); // invert covariance of measurement shocks
+
+ ms = m_vSss + zeros(m_cPar, m_cS); // start particles
+ mx = m_vXss + zeros(m_cPar, m_cX); // steady state of state and policy
+
+ loglikeli = 0; // init likelihood
+ //timeall=timer();
+ for(it = 0; it < sizer(mData); it++)
+ {
+ mss = rann(m_cPar, m_cSS) * m_mSSbE; // state noise
+ fg(&ms, ms, mx, mss); // transition prior as proposal
+ mx = m_oApprox.FastInterpolate(ms); // interpolate
+ fy(&my, ms, mx, zeros(m_cPar, m_cMS)); // evaluate importance weights
+ my -= mData[it][]; // observation error
+
+ vw = exp(-0.5 * outer(my,mhi,'d')' )/mhdet; // vw = exp(-0.5 * sumr(my*mhi .*my ) )/mhdet;
+
+ vw = vw .== .NaN .? 0 .: vw; // no policy can happen for extrem particles
+ dws = sumc(vw);
+ if(dws==0) return -.Inf; // or extremely wrong parameters
+ loglikeli += log(dws/m_cPar) ; // loglikelihood contribution
+ //timelik += (timer()-time)/100;
+ //time=timer();
+ vwi = resample(vw/dws)-1; // selection step in c++
+ ms = ms[vwi][]; // on normalized weights
+ mx = mx[vwi][];
+ }
+ return loglikeli;
+}
diff --git a/samples/Pan/test.pan b/samples/Pan/test.pan
new file mode 100644
index 00000000..56c8bd62
--- /dev/null
+++ b/samples/Pan/test.pan
@@ -0,0 +1,54 @@
+object template pantest;
+
+# Very simple pan test file
+"/long/decimal" = 123;
+"/long/octal" = 0755;
+"/long/hexadecimal" = 0xFF;
+
+"/double/simple" = 0.01;
+"/double/pi" = 3.14159;
+"/double/exponent" = 1e-8;
+"/double/scientific" = 1.3E10;
+
+"/string/single" = 'Faster, but escapes like \t, \n and \x3d don''t work, but '' should work.';
+"/string/double" = "Slower, but escapes like \t, \n and \x3d do work";
+
+variable TEST = 2;
+
+"/x2" = to_string(TEST);
+"/x2" ?= 'Default value';
+
+"/x3" = 1 + 2 + value("/long/decimal");
+
+"/x4" = undef;
+
+"/x5" = null;
+
+variable e ?= error("Test error message");
+
+# include gmond config for services-monitoring
+include { 'site/ganglia/gmond/services-monitoring' };
+
+"/software/packages"=pkg_repl("httpd","2.2.3-43.sl5.3",PKG_ARCH_DEFAULT);
+"/software/packages"=pkg_repl("php");
+
+# Example function
+function show_things_view_for_stuff = {
+ thing = ARGV[0];
+ foreach( i; mything; STUFF ) {
+ if ( thing == mything ) {
+ return( true );
+ } else {
+ return SELF;
+ };
+ };
+ false;
+};
+
+variable HERE = < specification defines an interface between web servers and
+Perl-based web applications and frameworks. It supports the writing of
+portable applications that can be run using various methods (as a
+standalone server, or using mod_perl, FastCGI, etc.). L is an
+implementation of the PSGI specification for running Perl applications.
+
+Catalyst used to contain an entire set of C<< Catalyst::Engine::XXXX >>
+classes to handle various web servers and environments (e.g. CGI,
+FastCGI, mod_perl) etc.
+
+This has been changed in Catalyst 5.9 so that all of that work is done
+by Catalyst implementing the L specification, using L's
+adaptors to implement that functionality.
+
+This means that we can share common code, and share fixes for specific
+web servers.
+
+=head1 I already have an application
+
+If you already have a Catalyst application, then you should be able to
+upgrade to the latest release with little or no trouble (see the notes
+in L for specifics about your web server
+deployment).
+
+=head1 Writing your own PSGI file.
+
+=head2 What is a .psgi file?
+
+A C<< .psgi >> file lets you control how your application code reference
+is built. Catalyst will automatically handle this for you, but it's
+possible to do it manually by creating a C file in the root
+of your application.
+
+=head2 Why would I want to write my own .psgi file?
+
+Writing your own .psgi file allows you to use the alternate L command
+to start your application, and allows you to add classes and extensions
+that implement L, such as L
+or L.
+
+The simplest C<.psgi> file for an application called C would be:
+
+ use strict;
+ use warnings;
+ use TestApp;
+
+ my $app = TestApp->psgi_app(@_);
+
+Note that Catalyst will apply a number of middleware components for you
+automatically, and these B be applied if you manually create a
+psgi file yourself. Details of these components can be found below.
+
+Additional information about psgi files can be found at:
+L
+
+=head2 What is in the .psgi file Catalyst generates by default?
+
+Catalyst generates an application which, if the C
+setting is on, is wrapped in L, and
+contains some engine-specific fixes for uniform behaviour, as contained
+in:
+
+=over
+
+=item L
+
+=item L
+
+=back
+
+If you override the default by providing your own C<< .psgi >> file,
+then none of these things will be done automatically for you by the PSGI
+application returned when you call C<< MyApp->psgi_app >>. Thus, if you
+need any of this functionality, you'll need to implement this in your
+C<< .psgi >> file yourself.
+
+An apply_default_middlewares method is supplied to wrap your application
+in the default middlewares if you want this behaviour and you are providing
+your own .psgi file.
+
+This means that the auto-generated (no .psgi file) code looks something
+like this:
+
+ use strict;
+ use warnings;
+ use TestApp;
+
+ my $app = TestApp->apply_default_middlewares(TestApp->psgi_app(@_));
+
+=head1 SEE ALSO
+
+L, L, L, L.
+
+=head1 AUTHORS
+
+Catalyst Contributors, see Catalyst.pm
+
+=head1 COPYRIGHT
+
+This library is free software. You can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=cut
diff --git a/samples/Pike/Error.pmod b/samples/Pike/Error.pmod
new file mode 100644
index 00000000..808ecb0e
--- /dev/null
+++ b/samples/Pike/Error.pmod
@@ -0,0 +1,38 @@
+#pike __REAL_VERSION__
+
+constant Generic = __builtin.GenericError;
+
+constant Index = __builtin.IndexError;
+
+constant BadArgument = __builtin.BadArgumentError;
+
+constant Math = __builtin.MathError;
+
+constant Resource = __builtin.ResourceError;
+
+constant Permission = __builtin.PermissionError;
+
+constant Decode = __builtin.DecodeError;
+
+constant Cpp = __builtin.CppError;
+
+constant Compilation = __builtin.CompilationError;
+
+constant MasterLoad = __builtin.MasterLoadError;
+
+constant ModuleLoad = __builtin.ModuleLoadError;
+
+//! Returns an Error object for any argument it receives. If the
+//! argument already is an Error object or is empty, it does nothing.
+object mkerror(mixed error)
+{
+ if (error == UNDEFINED)
+ return error;
+ if (objectp(error) && error->is_generic_error)
+ return error;
+ if (arrayp(error))
+ return Error.Generic(@error);
+ if (stringp(error))
+ return Error.Generic(error);
+ return Error.Generic(sprintf("%O", error));
+}
\ No newline at end of file
diff --git a/samples/Pike/FakeFile.pike b/samples/Pike/FakeFile.pike
new file mode 100644
index 00000000..48f3ea64
--- /dev/null
+++ b/samples/Pike/FakeFile.pike
@@ -0,0 +1,360 @@
+#pike __REAL_VERSION__
+
+//! A string wrapper that pretends to be a @[Stdio.File] object
+//! in addition to some features of a @[Stdio.FILE] object.
+
+
+//! This constant can be used to distinguish a FakeFile object
+//! from a real @[Stdio.File] object.
+constant is_fake_file = 1;
+
+protected string data;
+protected int ptr;
+protected int(0..1) r;
+protected int(0..1) w;
+protected int mtime;
+
+protected function read_cb;
+protected function read_oob_cb;
+protected function write_cb;
+protected function write_oob_cb;
+protected function close_cb;
+
+//! @seealso
+//! @[Stdio.File()->close()]
+int close(void|string direction) {
+ direction = lower_case(direction||"rw");
+ int cr = has_value(direction, "r");
+ int cw = has_value(direction, "w");
+
+ if(cr) {
+ r = 0;
+ }
+
+ if(cw) {
+ w = 0;
+ }
+
+ // FIXME: Close callback
+ return 1;
+}
+
+//! @decl void create(string data, void|string type, void|int pointer)
+//! @seealso
+//! @[Stdio.File()->create()]
+void create(string _data, void|string type, int|void _ptr) {
+ if(!_data) error("No data string given to FakeFile.\n");
+ data = _data;
+ ptr = _ptr;
+ mtime = time();
+ if(type) {
+ type = lower_case(type);
+ if(has_value(type, "r"))
+ r = 1;
+ if(has_value(type, "w"))
+ w = 1;
+ }
+ else
+ r = w = 1;
+}
+
+protected string make_type_str() {
+ string type = "";
+ if(r) type += "r";
+ if(w) type += "w";
+ return type;
+}
+
+//! @seealso
+//! @[Stdio.File()->dup()]
+this_program dup() {
+ return this_program(data, make_type_str(), ptr);
+}
+
+//! Always returns 0.
+//! @seealso
+//! @[Stdio.File()->errno()]
+int errno() { return 0; }
+
+//! Returns size and the creation time of the string.
+Stdio.Stat stat() {
+ Stdio.Stat st = Stdio.Stat();
+ st->size = sizeof(data);
+ st->mtime=st->ctime=mtime;
+ st->atime=time();
+ return st;
+}
+
+//! @seealso
+//! @[Stdio.File()->line_iterator()]
+String.SplitIterator line_iterator(int|void trim) {
+ if(trim)
+ return String.SplitIterator( data-"\r", '\n' );
+ return String.SplitIterator( data, '\n' );
+}
+
+protected mixed id;
+
+//! @seealso
+//! @[Stdio.File()->query_id()]
+mixed query_id() { return id; }
+
+//! @seealso
+//! @[Stdio.File()->set_id()]
+void set_id(mixed _id) { id = _id; }
+
+//! @seealso
+//! @[Stdio.File()->read_function()]
+function(:string) read_function(int nbytes) {
+ return lambda() { return read(nbytes); };
+}
+
+//! @seealso
+//! @[Stdio.File()->peek()]
+int(-1..1) peek(int|float|void timeout) {
+ if(!r) return -1;
+ if(ptr >= sizeof(data)) return 0;
+ return 1;
+}
+
+//! Always returns 0.
+//! @seealso
+//! @[Stdio.File()->query_address()]
+string query_address(void|int(0..1) is_local) { return 0; }
+
+//! @seealso
+//! @[Stdio.File()->read()]
+string read(void|int(0..) len, void|int(0..1) not_all) {
+ if(!r) return 0;
+ if (len < 0) error("Cannot read negative number of characters.\n");
+ int start=ptr;
+ ptr += len;
+ if(zero_type(len) || ptr>sizeof(data))
+ ptr = sizeof(data);
+
+ // FIXME: read callback
+ return data[start..ptr-1];
+}
+
+//! @seealso
+//! @[Stdio.FILE()->gets()]
+string gets() {
+ if(!r) return 0;
+ string ret;
+ sscanf(data,"%*"+(string)ptr+"s%[^\n]",ret);
+ if(ret)
+ {
+ ptr+=sizeof(ret)+1;
+ if(ptr>sizeof(data))
+ {
+ ptr=sizeof(data);
+ if(!sizeof(ret))
+ ret = 0;
+ }
+ }
+
+ // FIXME: read callback
+ return ret;
+}
+
+//! @seealso
+//! @[Stdio.FILE()->getchar()]
+int getchar() {
+ if(!r) return 0;
+ int c;
+ if(catch(c=data[ptr]))
+ c=-1;
+ else
+ ptr++;
+
+ // FIXME: read callback
+ return c;
+}
+
+//! @seealso
+//! @[Stdio.FILE()->unread()]
+void unread(string s) {
+ if(!r) return;
+ if(data[ptr-sizeof(s)..ptr-1]==s)
+ ptr-=sizeof(s);
+ else
+ {
+ data=s+data[ptr..];
+ ptr=0;
+ }
+}
+
+//! @seealso
+//! @[Stdio.File()->seek()]
+int seek(int pos, void|int mult, void|int add) {
+ if(mult)
+ pos = pos*mult+add;
+ if(pos<0)
+ {
+ pos = sizeof(data)+pos;
+ if( pos < 0 )
+ pos = 0;
+ }
+ ptr = pos;
+ if( ptr > strlen( data ) )
+ ptr = strlen(data);
+ return ptr;
+}
+
+//! Always returns 1.
+//! @seealso
+//! @[Stdio.File()->sync()]
+int(1..1) sync() { return 1; }
+
+//! @seealso
+//! @[Stdio.File()->tell()]
+int tell() { return ptr; }
+
+//! @seealso
+//! @[Stdio.File()->truncate()]
+int(0..1) truncate(int length) {
+ data = data[..length-1];
+ return sizeof(data)==length;
+}
+
+//! @seealso
+//! @[Stdio.File()->write()]
+int(-1..) write(string|array(string) str, mixed ... extra) {
+ if(!w) return -1;
+ if(arrayp(str)) str=str*"";
+ if(sizeof(extra)) str=sprintf(str, @extra);
+
+ if(ptr==sizeof(data)) {
+ data += str;
+ ptr = sizeof(data);
+ }
+ else if(sizeof(str)==1)
+ data[ptr++] = str[0];
+ else {
+ data = data[..ptr-1] + str + data[ptr+sizeof(str)..];
+ ptr += sizeof(str);
+ }
+
+ // FIXME: write callback
+ return sizeof(str);
+}
+
+//! @seealso
+//! @[Stdio.File()->set_blocking]
+void set_blocking() {
+ close_cb = 0;
+ read_cb = 0;
+ read_oob_cb = 0;
+ write_cb = 0;
+ write_oob_cb = 0;
+}
+
+//! @seealso
+//! @[Stdio.File()->set_blocking_keep_callbacks]
+void set_blocking_keep_callbacks() { }
+
+//! @seealso
+//! @[Stdio.File()->set_blocking]
+void set_nonblocking(function rcb, function wcb, function ccb,
+ function rocb, function wocb) {
+ read_cb = rcb;
+ write_cb = wcb;
+ close_cb = ccb;
+ read_oob_cb = rocb;
+ write_oob_cb = wocb;
+}
+
+//! @seealso
+//! @[Stdio.File()->set_blocking_keep_callbacks]
+void set_nonblocking_keep_callbacks() { }
+
+
+//! @seealso
+//! @[Stdio.File()->set_close_callback]
+void set_close_callback(function cb) { close_cb = cb; }
+
+//! @seealso
+//! @[Stdio.File()->set_read_callback]
+void set_read_callback(function cb) { read_cb = cb; }
+
+//! @seealso
+//! @[Stdio.File()->set_read_oob_callback]
+void set_read_oob_callback(function cb) { read_oob_cb = cb; }
+
+//! @seealso
+//! @[Stdio.File()->set_write_callback]
+void set_write_callback(function cb) { write_cb = cb; }
+
+//! @seealso
+//! @[Stdio.File()->set_write_oob_callback]
+void set_write_oob_callback(function cb) { write_oob_cb = cb; }
+
+
+//! @seealso
+//! @[Stdio.File()->query_close_callback]
+function query_close_callback() { return close_cb; }
+
+//! @seealso
+//! @[Stdio.File()->query_read_callback]
+function query_read_callback() { return read_cb; }
+
+//! @seealso
+//! @[Stdio.File()->query_read_oob_callback]
+function query_read_oob_callback() { return read_oob_cb; }
+
+//! @seealso
+//! @[Stdio.File()->query_write_callback]
+function query_write_callback() { return write_cb; }
+
+//! @seealso
+//! @[Stdio.File()->query_write_oob_callback]
+function query_write_oob_callback() { return write_oob_cb; }
+
+string _sprintf(int t) {
+ return t=='O' && sprintf("%O(%d,%O)", this_program, sizeof(data),
+ make_type_str());
+}
+
+
+// FakeFile specials.
+
+//! A FakeFile can be casted to a string.
+mixed cast(string to) {
+ switch(to) {
+ case "string": return data;
+ case "object": return this;
+ }
+ error("Can not cast object to %O.\n", to);
+}
+
+//! Sizeof on a FakeFile returns the size of its contents.
+int(0..) _sizeof() {
+ return sizeof(data);
+}
+
+//! @ignore
+
+#define NOPE(X) mixed X (mixed ... args) { error("This is a FakeFile. %s is not available.\n", #X); }
+NOPE(assign);
+NOPE(async_connect);
+NOPE(connect);
+NOPE(connect_unix);
+NOPE(open);
+NOPE(open_socket);
+NOPE(pipe);
+NOPE(tcgetattr);
+NOPE(tcsetattr);
+
+// Stdio.Fd
+NOPE(dup2);
+NOPE(lock); // We could implement this
+NOPE(mode); // We could implement this
+NOPE(proxy); // We could implement this
+NOPE(query_fd);
+NOPE(read_oob);
+NOPE(set_close_on_exec);
+NOPE(set_keepalive);
+NOPE(trylock); // We could implement this
+NOPE(write_oob);
+
+//! @endignore
\ No newline at end of file
diff --git a/samples/Prolog/format_spec.pl b/samples/Prolog/format_spec.pl
new file mode 100644
index 00000000..1508f3a3
--- /dev/null
+++ b/samples/Prolog/format_spec.pl
@@ -0,0 +1,260 @@
+:- module(format_spec, [ format_error/2
+ , format_spec/2
+ , format_spec//1
+ , spec_arity/2
+ , spec_types/2
+ ]).
+
+:- use_module(library(dcg/basics), [eos//0, integer//1, string_without//2]).
+:- use_module(library(error)).
+:- use_module(library(when), [when/2]).
+
+% TODO loading this module is optional
+% TODO it's for my own convenience during development
+%:- use_module(library(mavis)).
+
+%% format_error(+Goal, -Error:string) is nondet.
+%
+% True if Goal exhibits an Error in its format string. The
+% Error string describes what is wrong with Goal. Iterates each
+% error on backtracking.
+%
+% Goal may be one of the following predicates:
+%
+% * format/2
+% * format/3
+% * debug/3
+format_error(format(Format,Args), Error) :-
+ format_error_(Format, Args,Error).
+format_error(format(_,Format,Args), Error) :-
+ format_error_(Format,Args,Error).
+format_error(debug(_,Format,Args), Error) :-
+ format_error_(Format,Args,Error).
+
+format_error_(Format,Args,Error) :-
+ format_spec(Format, Spec),
+ !,
+ is_list(Args),
+ spec_types(Spec, Types),
+ types_error(Args, Types, Error).
+format_error_(Format,_,Error) :-
+ % \+ format_spec(Format, _),
+ format(string(Error), "Invalid format string: ~q", [Format]).
+
+types_error(Args, Types, Error) :-
+ length(Types, TypesLen),
+ length(Args, ArgsLen),
+ TypesLen =\= ArgsLen,
+ !,
+ format( string(Error)
+ , "Wrong argument count. Expected ~d, got ~d"
+ , [TypesLen, ArgsLen]
+ ).
+types_error(Args, Types, Error) :-
+ types_error_(Args, Types, Error).
+
+types_error_([Arg|_],[Type|_],Error) :-
+ ground(Arg),
+ \+ is_of_type(Type,Arg),
+ message_to_string(error(type_error(Type,Arg),_Location),Error).
+types_error_([_|Args],[_|Types],Error) :-
+ types_error_(Args, Types, Error).
+
+
+% check/0 augmentation
+:- multifile check:checker/2.
+:- dynamic check:checker/2.
+check:checker(format_spec:checker, "format/2 strings and arguments").
+
+:- dynamic format_fail/3.
+
+checker :-
+ prolog_walk_code([ module_class([user])
+ , infer_meta_predicates(false)
+ , autoload(false) % format/{2,3} are always loaded
+ , undefined(ignore)
+ , trace_reference(_)
+ , on_trace(check_format)
+ ]),
+ retract(format_fail(Goal,Location,Error)),
+ print_message(warning, format_error(Goal,Location,Error)),
+ fail. % iterate all errors
+checker. % succeed even if no errors are found
+
+check_format(Module:Goal, _Caller, Location) :-
+ predicate_property(Module:Goal, imported_from(Source)),
+ memberchk(Source, [system,prolog_debug]),
+ can_check(Goal),
+ format_error(Goal, Error),
+ assert(format_fail(Goal, Location, Error)),
+ fail.
+check_format(_,_,_). % succeed to avoid printing goals
+
+% true if format_error/2 can check this goal
+can_check(Goal) :-
+ once(clause(format_error(Goal,_),_)).
+
+prolog:message(format_error(Goal,Location,Error)) -->
+ prolog:message_location(Location),
+ ['~n In goal: ~q~n ~s'-[Goal,Error]].
+
+
+%% format_spec(-Spec)//
+%
+% DCG for parsing format strings. It doesn't yet generate format
+% strings from a spec. See format_spec/2 for details.
+format_spec([]) -->
+ eos.
+format_spec([escape(Numeric,Modifier,Action)|Rest]) -->
+ "~",
+ numeric_argument(Numeric),
+ modifier_argument(Modifier),
+ action(Action),
+ format_spec(Rest).
+format_spec([text(String)|Rest]) -->
+ { when((ground(String);ground(Codes)),string_codes(String, Codes)) },
+ string_without("~", Codes),
+ { Codes \= [] },
+ format_spec(Rest).
+
+
+%% format_spec(+Format, -Spec:list) is semidet.
+%
+% Parse a format string. Each element of Spec is one of the following:
+%
+% * `text(Text)` - text sent to the output as is
+% * `escape(Num,Colon,Action)` - a format escape
+%
+% `Num` represents the optional numeric portion of an esape. `Colon`
+% represents the optional colon in an escape. `Action` is an atom
+% representing the action to be take by this escape.
+format_spec(Format, Spec) :-
+ when((ground(Format);ground(Codes)),text_codes(Format, Codes)),
+ once(phrase(format_spec(Spec), Codes, [])).
+
+%% spec_arity(+FormatSpec, -Arity:positive_integer) is det.
+%
+% True if FormatSpec requires format/2 to have Arity arguments.
+spec_arity(Spec, Arity) :-
+ spec_types(Spec, Types),
+ length(Types, Arity).
+
+
+%% spec_types(+FormatSpec, -Types:list(type)) is det.
+%
+% True if FormatSpec requires format/2 to have arguments of Types. Each
+% value of Types is a type as described by error:has_type/2. This
+% notion of types is compatible with library(mavis).
+spec_types(Spec, Types) :-
+ phrase(spec_types(Spec), Types).
+
+spec_types([]) -->
+ [].
+spec_types([Item|Items]) -->
+ item_types(Item),
+ spec_types(Items).
+
+item_types(text(_)) -->
+ [].
+item_types(escape(Numeric,_,Action)) -->
+ numeric_types(Numeric),
+ action_types(Action).
+
+numeric_types(number(_)) -->
+ [].
+numeric_types(character(_)) -->
+ [].
+numeric_types(star) -->
+ [number].
+numeric_types(nothing) -->
+ [].
+
+action_types(Action) -->
+ { atom_codes(Action, [Code]) },
+ { action_types(Code, Types) },
+ phrase(Types).
+
+
+%% text_codes(Text:text, Codes:codes).
+text_codes(Var, Codes) :-
+ var(Var),
+ !,
+ string_codes(Var, Codes).
+text_codes(Atom, Codes) :-
+ atom(Atom),
+ !,
+ atom_codes(Atom, Codes).
+text_codes(String, Codes) :-
+ string(String),
+ !,
+ string_codes(String, Codes).
+text_codes(Codes, Codes) :-
+ is_of_type(codes, Codes).
+
+
+numeric_argument(number(N)) -->
+ integer(N).
+numeric_argument(character(C)) -->
+ "`",
+ [C].
+numeric_argument(star) -->
+ "*".
+numeric_argument(nothing) -->
+ "".
+
+
+modifier_argument(colon) -->
+ ":".
+modifier_argument(no_colon) -->
+ \+ ":".
+
+
+action(Action) -->
+ [C],
+ { is_action(C) },
+ { atom_codes(Action, [C]) }.
+
+
+%% is_action(+Action:integer) is semidet.
+%% is_action(-Action:integer) is multi.
+%
+% True if Action is a valid format/2 action character. Iterates all
+% acceptable action characters, if Action is unbound.
+is_action(Action) :-
+ action_types(Action, _).
+
+%% action_types(?Action:integer, ?Types:list(type))
+%
+% True if Action consumes arguments matching Types. An action (like
+% `~`), which consumes no arguments, has `Types=[]`. For example,
+%
+% ?- action_types(0'~, Types).
+% Types = [].
+% ?- action_types(0'a, Types).
+% Types = [atom].
+action_types(0'~, []).
+action_types(0'a, [atom]).
+action_types(0'c, [integer]). % specifically, a code
+action_types(0'd, [integer]).
+action_types(0'D, [integer]).
+action_types(0'e, [float]).
+action_types(0'E, [float]).
+action_types(0'f, [float]).
+action_types(0'g, [float]).
+action_types(0'G, [float]).
+action_types(0'i, [any]).
+action_types(0'I, [integer]).
+action_types(0'k, [any]).
+action_types(0'n, []).
+action_types(0'N, []).
+action_types(0'p, [any]).
+action_types(0'q, [any]).
+action_types(0'r, [integer]).
+action_types(0'R, [integer]).
+action_types(0's, [text]).
+action_types(0'@, [callable]).
+action_types(0't, []).
+action_types(0'|, []).
+action_types(0'+, []).
+action_types(0'w, [any]).
+action_types(0'W, [any, list]).
diff --git a/samples/Prolog/func.pl b/samples/Prolog/func.pl
new file mode 100644
index 00000000..944514e2
--- /dev/null
+++ b/samples/Prolog/func.pl
@@ -0,0 +1,194 @@
+:- module(func, [ op(675, xfy, ($))
+ , op(650, xfy, (of))
+ , ($)/2
+ , (of)/2
+ ]).
+:- use_module(library(list_util), [xfy_list/3]).
+:- use_module(library(function_expansion)).
+:- use_module(library(arithmetic)).
+:- use_module(library(error)).
+
+
+% true if the module whose terms are being read has specifically
+% imported library(func).
+wants_func :-
+ prolog_load_context(module, Module),
+ Module \== func, % we don't want func sugar ourselves
+ predicate_property(Module:of(_,_),imported_from(func)).
+
+
+%% compile_function(+Term, -In, -Out, -Goal) is semidet.
+%
+% True if Term represents a function from In to Out
+% implemented by calling Goal. This multifile hook is
+% called by $/2 and of/2 to convert a term into a goal.
+% It's used at compile time for macro expansion.
+% It's used at run time to handle functions which aren't
+% known at compile time.
+% When called as a hook, Term is guaranteed to be =nonvar=.
+%
+% For example, to treat library(assoc) terms as functions which
+% map a key to a value, one might define:
+%
+% :- multifile compile_function/4.
+% compile_function(Assoc, Key, Value, Goal) :-
+% is_assoc(Assoc),
+% Goal = get_assoc(Key, Assoc, Value).
+%
+% Then one could write:
+%
+% list_to_assoc([a-1, b-2, c-3], Assoc),
+% Two = Assoc $ b,
+:- multifile compile_function/4.
+compile_function(Var, _, _, _) :-
+ % variables storing functions must be evaluated at run time
+ % and can't be compiled, a priori, into a goal
+ var(Var),
+ !,
+ fail.
+compile_function(Expr, In, Out, Out is Expr) :-
+ % arithmetic expression of one variable are simply evaluated
+ \+ string(Expr), % evaluable/1 throws exception with strings
+ arithmetic:evaluable(Expr),
+ term_variables(Expr, [In]).
+compile_function(F, In, Out, func:Goal) :-
+ % composed functions
+ function_composition_term(F),
+ user:function_expansion(F, func:Functor, true),
+ Goal =.. [Functor,In,Out].
+compile_function(F, In, Out, Goal) :-
+ % string interpolation via format templates
+ format_template(F),
+ ( atom(F) ->
+ Goal = format(atom(Out), F, In)
+ ; string(F) ->
+ Goal = format(string(Out), F, In)
+ ; error:has_type(codes, F) ->
+ Goal = format(codes(Out), F, In)
+ ; fail % to be explicit
+ ).
+compile_function(Dict, In, Out, Goal) :-
+ is_dict(Dict),
+ Goal = get_dict(In, Dict, Out).
+
+%% $(+Function, +Argument) is det.
+%
+% Apply Function to an Argument. A Function is any predicate
+% whose final argument generates output and whose penultimate argument
+% accepts input.
+%
+% This is realized by expanding function application to chained
+% predicate calls at compile time. Function application itself can
+% be chained.
+%
+% ==
+% Reversed = reverse $ sort $ [c,d,b].
+% ==
+:- meta_predicate $(2,+).
+$(_,_) :-
+ throw(error(permission_error(call, predicate, ($)/2),
+ context(_, '$/2 must be subject to goal expansion'))).
+
+user:function_expansion($(F,X), Y, Goal) :-
+ wants_func,
+ ( func:compile_function(F, X, Y, Goal) ->
+ true
+ ; var(F) -> Goal = % defer until run time
+ ( func:compile_function(F, X, Y, P) ->
+ call(P)
+ ; call(F, X, Y)
+ )
+ ; Goal = call(F, X, Y)
+ ).
+
+
+%% of(+F, +G) is det.
+%
+% Creates a new function by composing F and G. The functions are
+% composed at compile time to create a new, compiled predicate which
+% behaves like a function. Function composition can be chained.
+% Composed functions can also be applied with $/2.
+%
+% ==
+% Reversed = reverse of sort $ [c,d,b].
+% ==
+:- meta_predicate of(2,2).
+of(_,_).
+
+
+%% format_template(Format) is semidet.
+%
+% True if Format is a template string suitable for format/3.
+% The current check is very naive and should be improved.
+format_template(Format) :-
+ atom(Format), !,
+ atom_codes(Format, Codes),
+ format_template(Codes).
+format_template(Format) :-
+ string(Format),
+ !,
+ string_codes(Format, Codes),
+ format_template(Codes).
+format_template(Format) :-
+ error:has_type(codes, Format),
+ memberchk(0'~, Format). % ' fix syntax highlighting
+
+
+% True if the argument is a function composition term
+function_composition_term(of(_,_)).
+
+% Converts a function composition term into a list of functions to compose
+functions_to_compose(Term, Funcs) :-
+ functor(Term, Op, 2),
+ Op = (of),
+ xfy_list(Op, Term, Funcs).
+
+% Thread a state variable through a list of functions. This is similar
+% to a DCG expansion, but much simpler.
+thread_state([], [], Out, Out).
+thread_state([F|Funcs], [Goal|Goals], In, Out) :-
+ ( compile_function(F, In, Tmp, Goal) ->
+ true
+ ; var(F) ->
+ instantiation_error(F)
+ ; F =.. [Functor|Args],
+ append(Args, [In, Tmp], NewArgs),
+ Goal =.. [Functor|NewArgs]
+ ),
+ thread_state(Funcs, Goals, Tmp, Out).
+
+user:function_expansion(Term, func:Functor, true) :-
+ wants_func,
+ functions_to_compose(Term, Funcs),
+ debug(func, 'building composed function for: ~w', [Term]),
+ variant_sha1(Funcs, Sha),
+ format(atom(Functor), 'composed_function_~w', [Sha]),
+ debug(func, ' name: ~s', [Functor]),
+ ( func:current_predicate(Functor/2) ->
+ debug(func, ' composed predicate already exists', [])
+ ; true ->
+ reverse(Funcs, RevFuncs),
+ thread_state(RevFuncs, Threaded, In, Out),
+ xfy_list(',', Body, Threaded),
+ Head =.. [Functor, In, Out],
+ func:assert(Head :- Body),
+ func:compile_predicates([Functor/2])
+ ).
+
+
+% support foo(x,~,y) evaluation
+user:function_expansion(Term, Output, Goal) :-
+ wants_func,
+ compound(Term),
+
+ % has a single ~ argument
+ setof( X
+ , ( arg(X,Term,Arg), Arg == '~' )
+ , [N]
+ ),
+
+ % replace ~ with a variable
+ Term =.. [Name|Args0],
+ nth1(N, Args0, ~, Rest),
+ nth1(N, Args, Output, Rest),
+ Goal =.. [Name|Args].
diff --git a/samples/Propeller Spin/4x4 Keypad Reader.spin b/samples/Propeller Spin/4x4 Keypad Reader.spin
new file mode 100644
index 00000000..c822bd04
--- /dev/null
+++ b/samples/Propeller Spin/4x4 Keypad Reader.spin
@@ -0,0 +1,97 @@
+{{
+*****************************************
+* 4x4 Keypad Reader v1.0 *
+* Author: Beau Schwabe *
+* Copyright (c) 2007 Parallax *
+* See end of file for terms of use. *
+*****************************************
+}}
+{
+
+Operation:
+
+This object uses a capacitive PIN approach to reading the keypad.
+To do so, ALL pins are made LOW and an OUTPUT to "discharge" the
+I/O pins. Then, ALL pins are set to an INPUT state. At this point,
+only one pin is made HIGH and an OUTPUT at a time. If the "switch"
+is closed, then a HIGH will be read on the input, otherwise a LOW
+will be returned.
+
+The keypad decoding routine only requires two subroutines and returns
+the entire 4x4 keypad matrix into a single WORD variable indicating
+which buttons are pressed. Multiple button presses are allowed with
+the understanding that“BOX entries can be confused. An example of a
+BOX entry... 1,2,4,5 or 1,4,3,6 or 4,6,*,# etc. where any 3 of the 4
+buttons pressed will evaluate the non pressed button as being pressed,
+even when they are not. There is no danger of any physical or
+electrical damage, that s just the way this sensing method happens to
+work.
+
+Schematic:
+No resistors, No capacitors. The connections are directly from the
+keypad to the I/O's. I literally plugged mine right into the demo
+board RevC.
+
+Looking at the Back of the 4x4 keypad...
+
+ P7 P0
+ ││││││││
+┌─────── ││││││││ ───────┐
+│ oo ││││││││ o │
+│ │
+│ O O O O O │
+│ │
+│ O O O O O │
+│ {LABEL} │
+│ O O O O O │
+│ │
+│ O O O O O │
+│ │
+│ O O O O O │
+│ o o │
+└────────────────────────┘
+
+}
+VAR
+ word keypad
+
+PUB ReadKeyPad
+ keypad := 0 'Clear 4x4 'keypad' value
+ ReadRow(3) 'Call routine to read entire ROW 0
+ keypad <<= 4 'Shift 'keypad' value left by 4
+ ReadRow(2) 'Call routine to read entire ROW 1
+ keypad <<= 4 'Shift 'keypad' value left by 4
+ ReadRow(1) 'Call routine to read entire ROW 2
+ keypad <<= 4 'Shift 'keypad' value left by 4
+ ReadRow(0) 'Call routine to read entire ROW 3
+ Result := keypad
+
+PRI ReadRow(n)
+ outa[0..7]~ 'preset P0 to P7 as LOWs
+ dira[0..7]~~ 'make P0 to P7 OUTPUTs ... discharge pins or "capacitors" to VSS
+ dira[0..7]~ 'make P0 to P7 INPUTSs ... now the pins act like tiny capacitors
+ outa[n]~~ 'preset Pin 'n' HIGH
+ dira[n]~~ 'make Pin 'n' an OUTPUT... Make only one pin HIGH ; will charge
+ ' "capacitor" if switch is closed.
+ '
+ keypad += ina[4..7] 'read ROW value ... If a switch is open, the pin or "capacitor"
+ dira[n]~ 'make Pn an INPUT will remain discharged
+
+DAT
+{{
+┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+│ TERMS OF USE: MIT License │
+├──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
+│Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation │
+│files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, │
+│modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software│
+│is furnished to do so, subject to the following conditions: │
+│ │
+│The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.│
+│ │
+│THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE │
+│WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR │
+│COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, │
+│ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. │
+└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+}}
\ No newline at end of file
diff --git a/samples/Propeller Spin/Debug_Lcd.spin b/samples/Propeller Spin/Debug_Lcd.spin
new file mode 100644
index 00000000..8e3fa1f5
--- /dev/null
+++ b/samples/Propeller Spin/Debug_Lcd.spin
@@ -0,0 +1,181 @@
+''****************************************
+''* Debug_Lcd v1.2 *
+''* Authors: Jon Williams, Jeff Martin *
+''* Copyright (c) 2006 Parallax, Inc. *
+''* See end of file for terms of use. *
+''****************************************
+''
+'' Debugging wrapper for Serial_Lcd object
+''
+'' v1.2 - March 26, 2008 - Updated by Jeff Martin to conform to Propeller object initialization standards.
+'' v1.1 - April 29, 2006 - Updated by Jon Williams for consistency.
+''
+
+
+OBJ
+
+ lcd : "serial_lcd" ' driver for Parallax Serial LCD
+ num : "simple_numbers" ' number to string conversion
+
+
+PUB init(pin, baud, lines) : okay
+
+'' Initializes serial LCD object
+'' -- returns true if all parameters okay
+
+ okay := lcd.init(pin, baud, lines)
+
+
+PUB finalize
+
+'' Finalizes lcd object -- frees the pin (floats)
+
+ lcd.finalize
+
+
+PUB putc(txbyte)
+
+'' Send a byte to the terminal
+
+ lcd.putc(txbyte)
+
+
+PUB str(strAddr)
+
+'' Print a zero-terminated string
+
+ lcd.str(strAddr)
+
+
+PUB dec(value)
+
+'' Print a signed decimal number
+
+ lcd.str(num.dec(value))
+
+
+PUB decf(value, width)
+
+'' Prints signed decimal value in space-padded, fixed-width field
+
+ lcd.str(num.decf(value, width))
+
+
+PUB decx(value, digits)
+
+'' Prints zero-padded, signed-decimal string
+'' -- if value is negative, field width is digits+1
+
+ lcd.str(num.decx(value, digits))
+
+
+PUB hex(value, digits)
+
+'' Print a hexadecimal number
+
+ lcd.str(num.hex(value, digits))
+
+
+PUB ihex(value, digits)
+
+'' Print an indicated hexadecimal number
+
+ lcd.str(num.ihex(value, digits))
+
+
+PUB bin(value, digits)
+
+'' Print a binary number
+
+ lcd.str(num.bin(value, digits))
+
+
+PUB ibin(value, digits)
+
+'' Print an indicated (%) binary number
+
+ lcd.str(num.ibin(value, digits))
+
+
+PUB cls
+
+'' Clears LCD and moves cursor to home (0, 0) position
+
+ lcd.cls
+
+
+PUB home
+
+'' Moves cursor to 0, 0
+
+ lcd.home
+
+
+PUB gotoxy(col, line)
+
+'' Moves cursor to col/line
+
+ lcd.gotoxy(col, line)
+
+
+PUB clrln(line)
+
+'' Clears line
+
+ lcd.clrln(line)
+
+
+PUB cursor(type)
+
+'' Selects cursor type
+'' 0 : cursor off, blink off
+'' 1 : cursor off, blink on
+'' 2 : cursor on, blink off
+'' 3 : cursor on, blink on
+
+ lcd.cursor(type)
+
+
+PUB display(status)
+
+'' Controls display visibility; use display(false) to hide contents without clearing
+
+ if status
+ lcd.displayOn
+ else
+ lcd.displayOff
+
+
+PUB custom(char, chrDataAddr)
+
+'' Installs custom character map
+'' -- chrDataAddr is address of 8-byte character definition array
+
+ lcd.custom(char, chrDataAddr)
+
+
+PUB backLight(status)
+
+'' Enable (true) or disable (false) LCD backlight
+'' -- affects only backlit models
+
+ lcd.backLight(status)
+
+{{
+
+┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+│ TERMS OF USE: MIT License │
+├──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
+│Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation │
+│files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, │
+│modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software│
+│is furnished to do so, subject to the following conditions: │
+│ │
+│The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.│
+│ │
+│THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE │
+│WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR │
+│COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, │
+│ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. │
+└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+}}
\ No newline at end of file
diff --git a/samples/Propeller Spin/Graphics.spin b/samples/Propeller Spin/Graphics.spin
new file mode 100644
index 00000000..26295017
--- /dev/null
+++ b/samples/Propeller Spin/Graphics.spin
@@ -0,0 +1,1669 @@
+''***************************************
+''* Graphics Driver v1.0 *
+''* Author: Chip Gracey *
+''* Copyright (c) 2005 Parallax, Inc. *
+''* See end of file for terms of use. *
+''***************************************
+
+''
+'' Theory of Operation:
+''
+'' A cog is launched which processes commands via the PUB routines.
+''
+'' Points, lines, arcs, sprites, text, and polygons are rasterized into
+'' a specified stretch of memory which serves as a generic bitmap buffer.
+''
+'' The bitmap can be displayed by the TV.SRC or VGA.SRC driver.
+''
+'' See GRAPHICS_DEMO.SRC for usage example.
+''
+
+CON
+
+ #1, _setup, _color, _width, _plot, _line, _arc, _vec, _vecarc, _pix, _pixarc, _text, _textarc, _textmode, _fill, _loop
+
+VAR
+
+ long cog
+
+ long command
+
+ long bitmap_base 'bitmap data
+ long bitmap_longs
+ word bases[32]
+
+ long pixel_width 'pixel data
+ long slices[8]
+
+ long text_xs, text_ys, text_sp, text_just 'text data (these 4 must be contiguous)
+
+
+PUB start : okay
+
+'' Start graphics driver - starts a cog
+'' returns false if no cog available
+
+ fontptr := @font 'set font pointer (same for all instances)
+
+ stop
+ okay := cog := cognew(@loop, @command) + 1
+
+
+PUB stop
+
+'' Stop graphics driver - frees a cog
+
+ if cog
+ cogstop(cog~ - 1)
+
+ command~
+
+
+PUB setup(x_tiles, y_tiles, x_origin, y_origin, base_ptr) | bases_ptr, slices_ptr
+
+'' Set bitmap parameters
+''
+'' x_tiles - number of x tiles (tiles are 16x16 pixels each)
+'' y_tiles - number of y tiles
+'' x_origin - relative-x center pixel
+'' y_origin - relative-y center pixel
+'' base_ptr - base address of bitmap
+
+ setcommand(_loop, 0) 'make sure last command finished
+
+ repeat bases_ptr from 0 to x_tiles - 1 <# 31 'write bases
+ bases[bases_ptr] := base_ptr + bases_ptr * y_tiles << 6
+
+ y_tiles <<= 4 'adjust arguments and do setup command
+ y_origin := y_tiles - y_origin - 1
+ bases_ptr := @bases
+ slices_ptr := @slices
+ setcommand(_setup, @x_tiles)
+
+ bitmap_base := base_ptr 'retain high-level bitmap data
+ bitmap_longs := x_tiles * y_tiles
+
+
+PUB clear
+
+'' Clear bitmap
+
+ setcommand(_loop, 0) 'make sure last command finished
+
+ longfill(bitmap_base, 0, bitmap_longs) 'clear bitmap
+
+
+PUB copy(dest_ptr)
+
+'' Copy bitmap
+'' use for double-buffered display (flicker-free)
+''
+'' dest_ptr - base address of destination bitmap
+
+ setcommand(_loop, 0) 'make sure last command finished
+
+ longmove(dest_ptr, bitmap_base, bitmap_longs) 'copy bitmap
+
+
+PUB color(c)
+
+'' Set pixel color to two-bit pattern
+''
+'' c - color code in bits[1..0]
+
+ setcommand(_color, @colors[c & 3]) 'set color
+
+
+PUB width(w) | pixel_passes, r, i, p
+
+'' Set pixel width
+'' actual width is w[3..0] + 1
+''
+'' w - 0..15 for round pixels, 16..31 for square pixels
+
+ r := not w & $10 'determine pixel shape/width
+ w &= $F
+ pixel_width := w
+ pixel_passes := w >> 1 + 1
+
+ setcommand(_width, @w) 'do width command now to avoid updating slices when busy
+
+ p := w ^ $F 'update slices to new shape/width
+ repeat i from 0 to w >> 1
+ slices[i] := true >> (p << 1) << (p & $E)
+ if r and pixels[w] & |< i
+ p += 2
+ if r and i == pixel_passes - 2
+ p += 2
+
+
+PUB colorwidth(c, w)
+
+'' Set pixel color and width
+
+ color(c)
+ width(w)
+
+
+PUB plot(x, y)
+
+'' Plot point
+''
+'' x,y - point
+
+ setcommand(_plot, @x)
+
+
+PUB line(x, y)
+
+'' Draw a line to point
+''
+'' x,y - endpoint
+
+ setcommand(_line, @x)
+
+
+PUB arc(x, y, xr, yr, angle, anglestep, steps, arcmode)
+
+'' Draw an arc
+''
+'' x,y - center of arc
+'' xr,yr - radii of arc
+'' angle - initial angle in bits[12..0] (0..$1FFF = 0°..359.956°)
+'' anglestep - angle step in bits[12..0]
+'' steps - number of steps (0 just leaves (x,y) at initial arc position)
+'' arcmode - 0: plot point(s)
+'' 1: line to point(s)
+'' 2: line between points
+'' 3: line from point(s) to center
+
+ setcommand(_arc, @x)
+
+
+PUB vec(x, y, vecscale, vecangle, vecdef_ptr)
+
+'' Draw a vector sprite
+''
+'' x,y - center of vector sprite
+'' vecscale - scale of vector sprite ($100 = 1x)
+'' vecangle - rotation angle of vector sprite in bits[12..0]
+'' vecdef_ptr - address of vector sprite definition
+''
+''
+'' Vector sprite definition:
+''
+'' word $8000|$4000+angle 'vector mode + 13-bit angle (mode: $4000=plot, $8000=line)
+'' word length 'vector length
+'' ... 'more vectors
+'' ...
+'' word 0 'end of definition
+
+ setcommand(_vec, @x)
+
+
+PUB vecarc(x, y, xr, yr, angle, vecscale, vecangle, vecdef_ptr)
+
+'' Draw a vector sprite at an arc position
+''
+'' x,y - center of arc
+'' xr,yr - radii of arc
+'' angle - angle in bits[12..0] (0..$1FFF = 0°..359.956°)
+'' vecscale - scale of vector sprite ($100 = 1x)
+'' vecangle - rotation angle of vector sprite in bits[12..0]
+'' vecdef_ptr - address of vector sprite definition
+
+ setcommand(_vecarc, @x)
+
+
+PUB pix(x, y, pixrot, pixdef_ptr)
+
+'' Draw a pixel sprite
+''
+'' x,y - center of vector sprite
+'' pixrot - 0: 0°, 1: 90°, 2: 180°, 3: 270°, +4: mirror
+'' pixdef_ptr - address of pixel sprite definition
+''
+''
+'' Pixel sprite definition:
+''
+'' word 'word align, express dimensions and center, define pixels
+'' byte xwords, ywords, xorigin, yorigin
+'' word %%xxxxxxxx,%%xxxxxxxx
+'' word %%xxxxxxxx,%%xxxxxxxx
+'' word %%xxxxxxxx,%%xxxxxxxx
+'' ...
+
+ setcommand(_pix, @x)
+
+
+PUB pixarc(x, y, xr, yr, angle, pixrot, pixdef_ptr)
+
+'' Draw a pixel sprite at an arc position
+''
+'' x,y - center of arc
+'' xr,yr - radii of arc
+'' angle - angle in bits[12..0] (0..$1FFF = 0°..359.956°)
+'' pixrot - 0: 0°, 1: 90°, 2: 180°, 3: 270°, +4: mirror
+'' pixdef_ptr - address of pixel sprite definition
+
+ setcommand(_pixarc, @x)
+
+
+PUB text(x, y, string_ptr) | justx, justy
+
+'' Draw text
+''
+'' x,y - text position (see textmode for sizing and justification)
+'' string_ptr - address of zero-terminated string (it may be necessary to call .finish
+'' immediately afterwards to prevent subsequent code from clobbering the
+'' string as it is being drawn
+
+ justify(string_ptr, @justx) 'justify string and draw text
+ setcommand(_text, @x)
+
+
+PUB textarc(x, y, xr, yr, angle, string_ptr) | justx, justy
+
+'' Draw text at an arc position
+''
+'' x,y - center of arc
+'' xr,yr - radii of arc
+'' angle - angle in bits[12..0] (0..$1FFF = 0°..359.956°)
+'' string_ptr - address of zero-terminated string (it may be necessary to call .finish
+'' immediately afterwards to prevent subsequent code from clobbering the
+'' string as it is being drawn
+
+ justify(string_ptr, @justx) 'justify string and draw text
+ setcommand(_textarc, @x)
+
+
+PUB textmode(x_scale, y_scale, spacing, justification)
+
+'' Set text size and justification
+''
+'' x_scale - x character scale, should be 1+
+'' y_scale - y character scale, should be 1+
+'' spacing - character spacing, 6 is normal
+'' justification - bits[1..0]: 0..3 = left, center, right, left
+'' bits[3..2]: 0..3 = bottom, center, top, bottom
+
+ longmove(@text_xs, @x_scale, 4) 'retain high-level text data
+
+ setcommand(_textmode, @x_scale) 'set text mode
+
+
+PUB box(x, y, box_width, box_height) | x2, y2, pmin, pmax
+
+'' Draw a box with round/square corners, according to pixel width
+''
+'' x,y - box left, box bottom
+
+ if box_width > pixel_width and box_height > pixel_width
+
+ pmax := pixel_width - (pmin := pixel_width >> 1) 'get pixel-half-min and pixel-half-max
+
+ x += pmin 'adjust coordinates to accomodate width
+ y += pmin
+ x2 := x + box_width - 1 - pixel_width
+ y2 := y + box_height - 1 - pixel_width
+
+ plot(x, y) 'plot round/square corners
+ plot(x, y2)
+ plot(x2, y)
+ plot(x2, y2)
+
+ fill(x, y2 + pmax, 0, (x2 - x) << 16, 0, 0, pmax) 'fill gaps
+ fill(x, y, 0, (x2 - x) << 16, 0, 0, pmin)
+ fill(x - pmin, y2, 0, (x2 - x + pixel_width) << 16, 0, 0, y2 - y)
+
+
+PUB quad(x1, y1, x2, y2, x3, y3, x4, y4)
+
+'' Draw a solid quadrilateral
+'' vertices must be ordered clockwise or counter-clockwise
+
+ tri(x1, y1, x2, y2, x3, y3) 'draw two triangle to make 4-sides polygon
+ tri(x3, y3, x4, y4, x1, y1)
+
+
+PUB tri(x1, y1, x2, y2, x3, y3) | xy[2]
+
+'' Draw a solid triangle
+
+' reorder vertices by descending y
+
+ case (y1 => y2) & %100 | (y2 => y3) & %010 | (y1 => y3) & %001
+ %000:
+ longmove(@xy, @x1, 2)
+ longmove(@x1, @x3, 2)
+ longmove(@x3, @xy, 2)
+ %010:
+ longmove(@xy, @x1, 2)
+ longmove(@x1, @x2, 4)
+ longmove(@x3, @xy, 2)
+ %011:
+ longmove(@xy, @x1, 2)
+ longmove(@x1, @x2, 2)
+ longmove(@x2, @xy, 2)
+ %100:
+ longmove(@xy, @x3, 2)
+ longmove(@x2, @x1, 4)
+ longmove(@x1, @xy, 2)
+ %101:
+ longmove(@xy, @x2, 2)
+ longmove(@x2, @x3, 2)
+ longmove(@x3, @xy, 2)
+
+' draw triangle
+
+ fill(x1, y1, (x3 - x1) << 16 / (y1 - y3 + 1), (x2 - x1) << 16 / (y1 - y2 + 1), (x3 - x2) << 16 / (y2 - y3 + 1), y1 - y2, y1 - y3)
+
+
+PUB finish
+
+'' Wait for any current graphics command to finish
+'' use this to insure that it is safe to manually manipulate the bitmap
+
+ setcommand(_loop, 0) 'make sure last command finished
+
+
+PRI fill(x, y, da, db, db2, linechange, lines_minus_1)
+
+ setcommand(_fill, @x)
+
+
+PRI justify(string_ptr, justptr) | x
+
+ x := (strsize(string_ptr) - 1) * text_xs * text_sp + text_xs * 5 - 1
+ long[justptr] := -lookupz(text_just >> 2 & 3: 0, x >> 1, x, 0)
+ long[justptr][1] := -lookupz(text_just & 3: 0, text_ys << 3, text_ys << 4, 0)
+
+
+PRI setcommand(cmd, argptr)
+
+ command := cmd << 16 + argptr 'write command and pointer
+ repeat while command 'wait for command to be cleared, signifying receipt
+
+
+CON
+
+ ' Vector font primitives
+
+ xa0 = %000 << 0 'x line start / arc center
+ xa1 = %001 << 0
+ xa2 = %010 << 0
+ xa3 = %011 << 0
+ xa4 = %100 << 0
+ xa5 = %101 << 0
+ xa6 = %110 << 0
+ xa7 = %111 << 0
+
+ ya0 = %0000 << 3 'y line start / arc center
+ ya1 = %0001 << 3
+ ya2 = %0010 << 3
+ ya3 = %0011 << 3
+ ya4 = %0100 << 3
+ ya5 = %0101 << 3
+ ya6 = %0110 << 3
+ ya7 = %0111 << 3
+ ya8 = %1000 << 3
+ ya9 = %1001 << 3
+ yaA = %1010 << 3
+ yaB = %1011 << 3
+ yaC = %1100 << 3
+ yaD = %1101 << 3
+ yaE = %1110 << 3
+ yaF = %1111 << 3
+
+ xb0 = %000 << 7 'x line end
+ xb1 = %001 << 7
+ xb2 = %010 << 7
+ xb3 = %011 << 7
+ xb4 = %100 << 7
+ xb5 = %101 << 7
+ xb6 = %110 << 7
+ xb7 = %111 << 7
+
+ yb0 = %0000 << 10 'y line end
+ yb1 = %0001 << 10
+ yb2 = %0010 << 10
+ yb3 = %0011 << 10
+ yb4 = %0100 << 10
+ yb5 = %0101 << 10
+ yb6 = %0110 << 10
+ yb7 = %0111 << 10
+ yb8 = %1000 << 10
+ yb9 = %1001 << 10
+ ybA = %1010 << 10
+ ybB = %1011 << 10
+ ybC = %1100 << 10
+ ybD = %1101 << 10
+ ybE = %1110 << 10
+ ybF = %1111 << 10
+
+ ax1 = %0 << 7 'x arc radius
+ ax2 = %1 << 7
+
+ ay1 = %00 << 8 'y arc radius
+ ay2 = %01 << 8
+ ay3 = %10 << 8
+ ay4 = %11 << 8
+
+ a0 = %0000 << 10 'arc start/length
+ a1 = %0001 << 10 'bits[1..0] = start (0..3 = 0°, 90°, 180°, 270°)
+ a2 = %0010 << 10 'bits[3..2] = length (0..3 = 360°, 270°, 180°, 90°)
+ a3 = %0011 << 10
+ a4 = %0100 << 10
+ a5 = %0101 << 10
+ a6 = %0110 << 10
+ a7 = %0111 << 10
+ a8 = %1000 << 10
+ a9 = %1001 << 10
+ aA = %1010 << 10
+ aB = %1011 << 10
+ aC = %1100 << 10
+ aD = %1101 << 10
+ aE = %1110 << 10
+ aF = %1111 << 10
+
+ fline = %0 << 14 'line command
+ farc = %1 << 14 'arc command
+
+ more = %1 << 15 'another arc/line
+
+
+DAT
+
+' Color codes
+
+colors long %%0000000000000000
+ long %%1111111111111111
+ long %%2222222222222222
+ long %%3333333333333333
+
+' Round pixel recipes
+
+pixels byte %00000000,%00000000,%00000000,%00000000 '0,1,2,3
+ byte %00000000,%00000000,%00000010,%00000101 '4,5,6,7
+ byte %00001010,%00001010,%00011010,%00011010 '8,9,A,B
+ byte %00110100,%00111010,%01110100,%01110100 'C,D,E,F
+
+' Vector font - standard ascii characters ($21-$7E)
+
+font word fline + xa2 + yaC + xb2 + yb7 + more '!
+ word fline + xa2 + ya5 + xb2 + yb4
+
+ word fline + xa1 + yaD + xb1 + ybC + more '"
+ word fline + xa3 + yaD + xb3 + ybC
+
+ word fline + xa1 + yaA + xb1 + yb6 + more '#
+ word fline + xa3 + yaA + xb3 + yb6 + more
+ word fline + xa0 + ya9 + xb4 + yb9 + more
+ word fline + xa0 + ya7 + xb4 + yb7
+
+ word farc + xa2 + ya9 + a9 + ax2 + ay1 + more '$
+ word farc + xa2 + ya7 + aB + ax2 + ay1 + more
+ word fline + xa0 + ya6 + xb2 + yb6 + more
+ word fline + xa2 + yaA + xb4 + ybA + more
+ word fline + xa2 + yaA + xb2 + ybB + more
+ word fline + xa2 + ya6 + xb2 + yb5
+
+ word farc + xa1 + yaA + a0 + ax1 + ay1 + more '%
+ word farc + xa3 + ya6 + a0 + ax1 + ay1 + more
+ word fline + xa0 + ya6 + xb4 + ybA
+
+ word farc + xa2 + yaA + a7 + ax1 + ay1 + more '&
+ word farc + xa2 + ya7 + a5 + ax2 + ay2 + more
+ word fline + xa1 + yaA + xb4 + yb5
+
+ word fline + xa2 + yaD + xb2 + ybC ' '
+
+ word farc + xa3 + ya9 + aD + ax1 + ay4 + more '(
+ word farc + xa3 + ya7 + aE + ax1 + ay4 + more
+ word fline + xa2 + ya7 + xb2 + yb9
+
+ word farc + xa1 + ya9 + aC + ax1 + ay4 + more ')
+ word farc + xa1 + ya7 + aF + ax1 + ay4 + more
+ word fline + xa2 + ya7 + xb2 + yb9
+
+ word fline + xa4 + ya6 + xb0 + ybA + more '*
+ word fline + xa0 + ya6 + xb4 + ybA + more
+ word fline + xa2 + yaB + xb2 + yb5
+
+ word fline + xa0 + ya8 + xb4 + yb8 + more '+
+ word fline + xa2 + yaA + xb2 + yb6
+
+ word fline + xa2 + ya4 + xb1 + yb3 ',
+
+ word fline + xa0 + ya8 + xb4 + yb8 '-
+
+ word fline + xa2 + ya5 + xb2 + yb4 '.
+
+ word fline + xa0 + ya4 + xb4 + ybC '/
+
+ word farc + xa2 + ya8 + a0 + ax2 + ay4 '0
+
+ word fline + xa0 + ya4 + xb4 + yb4 + more '1
+ word fline + xa2 + ya4 + xb2 + ybC + more
+ word fline + xa0 + yaA + xb2 + ybC
+
+ word farc + xa2 + yaA + a8 + ax2 + ay2 + more '2
+ word farc + xa2 + yaA + aF + ax2 + ay3 + more
+ word farc + xa2 + ya4 + aD + ax2 + ay3 + more
+ word fline + xa0 + ya4 + xb4 + yb4
+
+ word farc + xa2 + yaA + a7 + ax2 + ay2 + more '3
+ word farc + xa2 + ya6 + a6 + ax2 + ay2
+
+ word fline + xa2 + yaC + xb0 + yb7 + more '4
+ word fline + xa0 + ya7 + xb4 + yb7 + more
+ word fline + xa3 + ya4 + xb3 + yb8
+
+ word farc + xa2 + ya6 + aB + ax2 + ay2 + more '5
+ word fline + xa4 + yaC + xb0 + ybC + more
+ word fline + xa0 + yaC + xb0 + yb8 + more
+ word fline + xa0 + ya8 + xb2 + yb8 + more
+ word fline + xa0 + ya4 + xb2 + yb4
+
+ word farc + xa2 + ya6 + a0 + ax2 + ay2 + more '6
+ word farc + xa2 + ya8 + aD + ax2 + ay4 + more
+ word fline + xa0 + ya6 + xb0 + yb8 + more
+ word fline + xa2 + yaC + xb3 + ybC
+
+ word fline + xa0 + yaC + xb4 + ybC + more '7
+ word fline + xa1 + ya4 + xb4 + ybC
+
+ word farc + xa2 + ya6 + a0 + ax2 + ay2 + more '8
+ word farc + xa2 + yaA + a0 + ax2 + ay2
+
+ word farc + xa2 + yaA + a0 + ax2 + ay2 + more '9
+ word farc + xa2 + ya8 + aF + ax2 + ay4 + more
+ word fline + xa4 + ya8 + xb4 + ybA + more
+ word fline + xa1 + ya4 + xb2 + yb4
+
+ word fline + xa2 + ya6 + xb2 + yb7 + more ':
+ word fline + xa2 + yaA + xb2 + yb9
+
+ word fline + xa2 + ya4 + xb1 + yb3 + more ';
+ word fline + xa2 + ya8 + xb2 + yb7
+
+ word fline + xa0 + ya8 + xb4 + ybA + more '<
+ word fline + xa0 + ya8 + xb4 + yb6
+
+ word fline + xa0 + yaA + xb4 + ybA + more '=
+ word fline + xa0 + ya6 + xb4 + yb6
+
+ word fline + xa4 + ya8 + xb0 + ybA + more '>
+ word fline + xa4 + ya8 + xb0 + yb6
+
+ word farc + xa2 + yaB + a8 + ax2 + ay1 + more '?
+ word farc + xa3 + yaB + aF + ax1 + ay2 + more
+ word farc + xa3 + ya7 + aD + ax1 + ay2 + more
+ word fline + xa2 + ya5 + xb2 + yb4
+
+ word farc + xa2 + ya8 + a0 + ax1 + ay1 + more '@
+ word farc + xa2 + ya8 + a4 + ax2 + ay3 + more
+ word farc + xa3 + ya8 + aF + ax1 + ay1 + more
+ word farc + xa2 + ya6 + aF + ax2 + ay1 + more
+ word fline + xa3 + ya7 + xb3 + yb9
+
+ word farc + xa2 + yaA + a8 + ax2 + ay2 + more 'A
+ word fline + xa0 + ya4 + xb0 + ybA + more
+ word fline + xa4 + ya4 + xb4 + ybA + more
+ word fline + xa0 + ya8 + xb4 + yb8
+
+ word farc + xa2 + yaA + aB + ax2 + ay2 + more 'B
+ word farc + xa2 + ya6 + aB + ax2 + ay2 + more
+ word fline + xa0 + ya4 + xb0 + ybC + more
+ word fline + xa0 + ya4 + xb2 + yb4 + more
+ word fline + xa0 + ya8 + xb2 + yb8 + more
+ word fline + xa0 + yaC + xb2 + ybC
+
+ word farc + xa2 + yaA + a8 + ax2 + ay2 + more 'C
+ word farc + xa2 + ya6 + aA + ax2 + ay2 + more
+ word fline + xa0 + ya6 + xb0 + ybA
+
+ word farc + xa2 + yaA + aC + ax2 + ay2 + more 'D
+ word farc + xa2 + ya6 + aF + ax2 + ay2 + more
+ word fline + xa0 + ya4 + xb0 + ybC + more
+ word fline + xa4 + ya6 + xb4 + ybA + more
+ word fline + xa0 + ya4 + xb2 + yb4 + more
+ word fline + xa0 + yaC + xb2 + ybC
+
+ word fline + xa0 + ya4 + xb0 + ybC + more 'E
+ word fline + xa0 + ya4 + xb4 + yb4 + more
+ word fline + xa0 + ya8 + xb3 + yb8 + more
+ word fline + xa0 + yaC + xb4 + ybC
+
+ word fline + xa0 + ya4 + xb0 + ybC + more 'F
+ word fline + xa0 + ya8 + xb3 + yb8 + more
+ word fline + xa0 + yaC + xb4 + ybC
+
+ word farc + xa2 + yaA + a8 + ax2 + ay2 + more 'G
+ word farc + xa2 + ya6 + aA + ax2 + ay2 + more
+ word fline + xa0 + ya6 + xb0 + ybA + more
+ word fline + xa4 + ya4 + xb4 + yb7 + more
+ word fline + xa3 + ya7 + xb4 + yb7
+
+ word fline + xa0 + ya4 + xb0 + ybC + more 'H
+ word fline + xa4 + ya4 + xb4 + ybC + more
+ word fline + xa0 + ya8 + xb4 + yb8
+
+ word fline + xa2 + ya4 + xb2 + ybC + more 'I
+ word fline + xa0 + ya4 + xb4 + yb4 + more
+ word fline + xa0 + yaC + xb4 + ybC
+
+ word farc + xa2 + ya6 + aA + ax2 + ay2 + more 'J
+ word fline + xa4 + ya6 + xb4 + ybC
+
+ word fline + xa0 + ya4 + xb0 + ybC + more 'K
+ word fline + xa4 + yaC + xb0 + yb8 + more
+ word fline + xa4 + ya4 + xb0 + yb8
+
+ word fline + xa0 + ya4 + xb0 + ybC + more 'L
+ word fline + xa0 + ya4 + xb4 + yb4
+
+ word fline + xa0 + ya4 + xb0 + ybC + more 'M
+ word fline + xa4 + ya4 + xb4 + ybC + more
+ word fline + xa2 + ya8 + xb0 + ybC + more
+ word fline + xa2 + ya8 + xb4 + ybC
+
+ word fline + xa0 + ya4 + xb0 + ybC + more 'N
+ word fline + xa4 + ya4 + xb4 + ybC + more
+ word fline + xa4 + ya4 + xb0 + ybC
+
+ word farc + xa2 + yaA + a8 + ax2 + ay2 + more '0
+ word farc + xa2 + ya6 + aA + ax2 + ay2 + more
+ word fline + xa0 + ya6 + xb0 + ybA + more
+ word fline + xa4 + ya6 + xb4 + ybA
+
+ word farc + xa2 + yaA + aB + ax2 + ay2 + more 'P
+ word fline + xa0 + ya4 + xb0 + ybC + more
+ word fline + xa0 + ya8 + xb2 + yb8 + more
+ word fline + xa0 + yaC + xb2 + ybC
+
+ word farc + xa2 + yaA + a8 + ax2 + ay2 + more 'Q
+ word farc + xa2 + ya6 + aA + ax2 + ay2 + more
+ word fline + xa0 + ya6 + xb0 + ybA + more
+ word fline + xa4 + ya6 + xb4 + ybA + more
+ word fline + xa2 + ya6 + xb4 + yb3
+
+ word farc + xa2 + yaA + aB + ax2 + ay2 + more 'R
+ word fline + xa0 + ya4 + xb0 + ybC + more
+ word fline + xa0 + ya8 + xb2 + yb8 + more
+ word fline + xa0 + yaC + xb2 + ybC + more
+ word fline + xa4 + ya4 + xb2 + yb8
+
+ word farc + xa2 + yaA + a4 + ax2 + ay2 + more 'S
+ word farc + xa2 + ya6 + a6 + ax2 + ay2
+
+ word fline + xa2 + ya4 + xb2 + ybC + more 'T
+ word fline + xa0 + yaC + xb4 + ybC
+
+ word farc + xa2 + ya6 + aA + ax2 + ay2 + more 'U
+ word fline + xa0 + ya6 + xb0 + ybC + more
+ word fline + xa4 + ya6 + xb4 + ybC
+
+ word fline + xa2 + ya4 + xb0 + ybC + more 'V
+ word fline + xa2 + ya4 + xb4 + ybC
+
+ word fline + xa0 + yaC + xb0 + yb4 + more 'W
+ word fline + xa4 + yaC + xb4 + yb4 + more
+ word fline + xa2 + ya8 + xb0 + yb4 + more
+ word fline + xa2 + ya8 + xb4 + yb4
+
+ word fline + xa4 + ya4 + xb0 + ybC + more 'X
+ word fline + xa0 + ya4 + xb4 + ybC
+
+ word fline + xa0 + yaC + xb2 + yb8 + more 'Y
+ word fline + xa4 + yaC + xb2 + yb8 + more
+ word fline + xa2 + ya4 + xb2 + yb8
+
+ word fline + xa0 + yaC + xb4 + ybC + more 'Z
+ word fline + xa0 + ya4 + xb4 + ybC + more
+ word fline + xa0 + ya4 + xb4 + yb4
+
+ word fline + xa2 + yaD + xb2 + yb3 + more '[
+ word fline + xa2 + yaD + xb4 + ybD + more
+ word fline + xa2 + ya3 + xb4 + yb3
+
+ word fline + xa4 + ya4 + xb0 + ybC '\
+
+ word fline + xa2 + yaD + xb2 + yb3 + more '[
+ word fline + xa2 + yaD + xb0 + ybD + more
+ word fline + xa2 + ya3 + xb0 + yb3
+
+ word fline + xa2 + yaA + xb0 + yb6 + more '^
+ word fline + xa2 + yaA + xb4 + yb6
+
+ word fline + xa0 + ya1 + xa4 + yb1 '_
+
+ word fline + xa1 + ya9 + xb3 + yb7 '`
+
+ word farc + xa2 + ya6 + a0 + ax2 + ay2 + more 'a
+ word fline + xa4 + ya4 + xb4 + yb8
+
+ word farc + xa2 + ya6 + a0 + ax2 + ay2 + more 'b
+ word fline + xa0 + ya4 + xb0 + ybC
+
+ word farc + xa2 + ya6 + a9 + ax2 + ay2 + more 'c
+ word fline + xa2 + ya4 + xb4 + yb4 + more
+ word fline + xa2 + ya8 + xb4 + yb8
+
+ word farc + xa2 + ya6 + a0 + ax2 + ay2 + more 'd
+ word fline + xa4 + ya4 + xb4 + ybC
+
+ word farc + xa2 + ya6 + a4 + ax2 + ay2 + more 'e
+ word fline + xa0 + ya6 + xb4 + yb6 + more
+ word fline + xa2 + ya4 + xb4 + yb4
+
+ word farc + xa4 + yaA + aD + ax2 + ay2 + more 'f
+ word fline + xa0 + ya8 + xb4 + yb8 + more
+ word fline + xa2 + ya4 + xb2 + ybA
+
+ word farc + xa2 + ya6 + a0 + ax2 + ay2 + more 'g
+ word farc + xa2 + ya3 + aF + ax2 + ay2 + more
+ word fline + xa4 + ya3 + xb4 + yb8 + more
+ word fline + xa1 + ya1 + xb2 + yb1
+
+ word farc + xa2 + ya6 + a8 + ax2 + ay2 + more 'h
+ word fline + xa0 + ya4 + xb0 + ybC + more
+ word fline + xa4 + ya4 + xb4 + yb6
+
+ word fline + xa1 + ya4 + xb3 + yb4 + more 'i
+ word fline + xa2 + ya4 + xb2 + yb8 + more
+ word fline + xa1 + ya8 + xb2 + yb8 + more
+ word fline + xa2 + yaB + xb2 + ybA
+
+ word farc + xa0 + ya3 + aF + ax2 + ay2 + more 'j
+ word fline + xa2 + ya3 + xb2 + yb8 + more
+ word fline + xa1 + ya8 + xb2 + yb8 + more
+ word fline + xa2 + yaB + xb2 + ybA
+
+ word fline + xa0 + ya4 + xb0 + ybC + more 'k
+ word fline + xa0 + ya6 + xb2 + yb6 + more
+ word fline + xa2 + ya6 + xb4 + yb8 + more
+ word fline + xa2 + ya6 + xb4 + yb4
+
+ word fline + xa1 + ya4 + xb3 + yb4 + more 'l
+ word fline + xa2 + ya4 + xb2 + ybC + more
+ word fline + xa1 + yaC + xb2 + ybC
+
+ word farc + xa1 + ya7 + a8 + ax1 + ay1 + more 'm
+ word farc + xa3 + ya7 + a8 + ax1 + ay1 + more
+ word fline + xa0 + ya4 + xb0 + yb8 + more
+ word fline + xa2 + ya4 + xb2 + yb7 + more
+ word fline + xa4 + ya4 + xb4 + yb7
+
+ word farc + xa2 + ya6 + a8 + ax2 + ay2 + more 'n
+ word fline + xa0 + ya4 + xb0 + yb8 + more
+ word fline + xa4 + ya4 + xb4 + yb6
+
+ word farc + xa2 + ya6 + a0 + ax2 + ay2 'o
+
+ word farc + xa2 + ya6 + a0 + ax2 + ay2 + more 'p
+ word fline + xa0 + ya1 + xb0 + yb8
+
+ word farc + xa2 + ya6 + a0 + ax2 + ay2 + more 'q
+ word fline + xa4 + ya1 + xb4 + yb8
+
+ word farc + xa2 + ya7 + a8 + ax2 + ay1 + more 'r
+ word fline + xa0 + ya4 + xb0 + yb8
+
+ word farc + xa2 + ya7 + a9 + ax2 + ay1 + more 's
+ word farc + xa2 + ya5 + aB + ax2 + ay1 + more
+ word fline + xa0 + ya4 + xb2 + yb4 + more
+ word fline + xa2 + ya8 + xb4 + yb8
+
+ word farc + xa4 + ya6 + aE + ax2 + ay2 + more 't
+ word fline + xa0 + ya8 + xb4 + yb8 + more
+ word fline + xa2 + ya6 + xb2 + ybA
+
+ word farc + xa2 + ya6 + aA + ax2 + ay2 + more 'u
+ word fline + xa0 + ya6 + xb0 + yb8 + more
+ word fline + xa4 + ya4 + xb4 + yb8
+
+ word fline + xa0 + ya8 + xb2 + yb4 + more 'v
+ word fline + xa4 + ya8 + xb2 + yb4
+
+ word farc + xa1 + ya5 + aA + ax1 + ay1 + more 'w
+ word farc + xa3 + ya5 + aA + ax1 + ay1 + more
+ word fline + xa0 + ya5 + xb0 + yb8 + more
+ word fline + xa2 + ya5 + xb2 + yb6 + more
+ word fline + xa4 + ya5 + xb4 + yb8
+
+ word fline + xa0 + ya8 + xb4 + yb4 + more 'x
+ word fline + xa0 + ya4 + xb4 + yb8
+
+ word farc + xa2 + ya6 + aA + ax2 + ay2 + more 'y
+ word farc + xa2 + ya3 + aF + ax2 + ay2 + more
+ word fline + xa4 + ya3 + xb4 + yb8 + more
+ word fline + xa0 + ya6 + xb0 + yb8 + more
+ word fline + xa1 + ya1 + xb2 + yb1
+
+ word fline + xa0 + ya8 + xb4 + yb8 + more 'z
+ word fline + xa4 + ya8 + xb0 + yb4 + more
+ word fline + xa0 + ya4 + xb4 + yb4
+
+ word farc + xa3 + yaA + aD + ax1 + ay3 + more '{
+ word farc + xa1 + ya6 + aC + ax1 + ay2 + more
+ word farc + xa1 + yaA + aF + ax1 + ay2 + more
+ word farc + xa3 + ya6 + aE + ax1 + ay3
+
+ word fline + xa2 + ya3 + xb2 + ybD '|
+
+ word farc + xa1 + yaA + aC + ax1 + ay3 + more '}
+ word farc + xa3 + ya6 + aD + ax1 + ay2 + more
+ word farc + xa3 + yaA + aE + ax1 + ay2 + more
+ word farc + xa1 + ya6 + aF + ax1 + ay3
+
+ word farc + xa1 + ya8 + a8 + ax1 + ay1 + more '~
+ word farc + xa3 + ya8 + aA + ax1 + ay1
+
+' Vector font - custom characters ($7F+)
+
+ word fline + xa2 + ya9 + xb0 + yb4 + more 'delta
+ word fline + xa2 + ya9 + xb4 + yb4 + more
+ word fline + xa0 + ya4 + xb4 + yb4
+
+ word farc + xa2 + ya7 + a8 + ax2 + ay2 + more 'omega
+ word farc + xa1 + ya7 + aE + ax1 + ay2 + more
+ word farc + xa3 + ya7 + aF + ax1 + ay2 + more
+ word fline + xa1 + ya5 + xb1 + yb4 + more
+ word fline + xa3 + ya5 + xb3 + yb4 + more
+ word fline + xa0 + ya4 + xb1 + yb4 + more
+ word fline + xa4 + ya4 + xb3 + yb4
+
+ word farc + xa2 + ya8 + a0 + ax1 + ay1 'bullet
+
+CON fx = 3 'number of custom characters
+
+DAT
+
+'*************************************
+'* Assembly language graphics driver *
+'*************************************
+
+ org
+'
+'
+' Graphics driver - main loop
+'
+loop rdlong t1,par wz 'wait for command
+ if_z jmp #loop
+
+ movd :arg,#arg0 'get 8 arguments
+ mov t2,t1
+ mov t3,#8
+:arg rdlong arg0,t2
+ add :arg,d0
+ add t2,#4
+ djnz t3,#:arg
+
+ wrlong zero,par 'zero command to signify received
+
+ call #setd 'set dx,dy from arg0,arg1
+
+ ror t1,#16+2 'lookup command address
+ add t1,#jumps
+ movs :table,t1
+ rol t1,#2
+ shl t1,#3
+:table mov t2,0
+ shr t2,t1
+ and t2,#$FF
+ jmp t2 'jump to command
+
+
+jumps byte 0 '0
+ byte setup_ '1
+ byte color_ '2
+ byte width_ '3
+ byte plot_ '4
+ byte line_ '5
+ byte arc_ '6
+ byte vec_ '7
+ byte vecarc_ '8
+ byte pix_ '9
+ byte pixarc_ 'A
+ byte text_ 'B
+ byte textarc_ 'C
+ byte textmode_ 'D
+ byte fill_ 'E
+ byte loop 'F
+'
+'
+' setup(x_tiles, y_tiles*16, x_origin, y_origin, base_ptr) bases_ptr, slices_ptr
+'
+setup_ mov xlongs,arg0 'set xlongs, ylongs
+ mov ylongs,arg1
+ mov xorigin,arg2 'set xorigin, yorigin
+ mov yorigin,arg3
+ mov basesptr,arg5 'set pointers
+ mov slicesptr,arg6
+
+ jmp #loop
+'
+'
+' color(c)
+'
+color_ mov pcolor,arg0 'set pixel color
+
+ jmp #loop
+'
+'
+' width(w) pixel_passes
+'
+width_ mov pwidth,arg0 'set pixel width
+ mov passes,arg1 'set pixel passes
+
+ jmp #loop
+'
+'
+' plot(x, y)
+'
+plot_ call #plotd
+
+ jmp #loop
+'
+'
+' line(x, y)
+'
+line_ call #linepd
+
+ jmp #loop
+'
+'
+' arc(x, y, xr, yr, angle, anglestep, iterations, mode)
+'
+arc_ and arg7,#3 'limit mode
+
+:loop call #arca 'get arc dx,dy
+
+ cmp arg7,#1 wz 'if not mode 1, set px,py
+ if_nz mov px,dx
+ if_nz mov py,dy
+
+ tjz arg6,#loop 'if no points exit with new px,py
+
+ cmp arg7,#3 wz 'if mode 3, set center
+ if_z call #setd
+
+ test arg7,#1 wz 'if mode 0 or 2, plot point
+ if_z call #plotp
+
+ test arg7,#1 wz 'if mode 1 or 3, plot line
+ if_nz call #linepd
+
+ cmp arg7,#2 wz 'if mode 2, set mode 1
+ if_z mov arg7,#1
+
+ add arg4,arg5 'step angle
+ djnz arg6,#:loop 'loop if more iterations
+
+ jmp #loop
+'
+'
+' vec(x, y, vecscale, vecangle, vecdef_ptr)
+' vecarc(x, y, xr, yr, angle, vecscale, vecangle, vecdef_ptr)
+'
+' vecdef: word $8000/$4000+angle 'vector mode + 13-bit angle (mode: $4000=plot, $8000=line)
+' word length 'vector length
+' ... 'more vectors
+' ...
+' word 0 'end of definition
+'
+vecarc_ call #arcmod
+
+vec_ tjz arg2,#loop 'if scale 0, exit
+
+:loop rdword t7,arg4 wz 'get vector mode+angle
+ add arg4,#2
+
+ if_z jmp #loop 'if mode+angle 0, exit
+
+ rdword t1,arg4 'get vector length
+ add arg4,#2
+
+ abs t2,arg2 wc 'add/sub vector angle to/from angle
+ mov t6,arg3
+ sumc t6,t7
+
+ call #multiply 'multiply length by scale
+ add t1,#$80 'round up 1/2 lsb
+ shr t1,#8
+
+ mov t4,t1 'get arc dx,dy
+ mov t5,t1
+ call #arcd
+
+ test t7,h8000 wc 'plot pixel or draw line?
+ if_nc call #plotd
+ test t7,h8000 wc
+ if_c call #linepd
+
+ jmp #:loop 'get next vector
+'
+'
+' pix(x, y, pixrot, pixdef_ptr)
+' pixarc(x, y, xr, yr, angle, pixrot, pixdef_ptr)
+'
+' pixdef: word
+' byte xwords, ywords, xorigin, yorigin
+' word %%xxxxxxxx,%%xxxxxxxx
+' word %%xxxxxxxx,%%xxxxxxxx
+' word %%xxxxxxxx,%%xxxxxxxx
+' ...
+'
+pixarc_ call #arcmod
+
+pix_ mov t6,pcolor 'save color
+
+ mov px,dx 'get center into px,py
+ mov py,dy
+
+ mov sy,pwidth 'get actual pixel width
+ add sy,#1
+
+ rdbyte dx,arg3 'get dimensions into dx,dy
+ add arg3,#1
+ rdbyte dy,arg3
+ add arg3,#1
+
+ rdbyte t1,arg3 'get origin and adjust px,py
+ add arg3,#1
+ rdbyte t2,arg3
+ add arg3,#1
+ neg t2,t2
+ sub t2,#1
+ add t2,dy
+ mov t3,sy
+:adjust test arg2,#%001 wz
+ test arg2,#%110 wc
+ if_z sumnc px,t1
+ if_nz sumc py,t1
+ test arg2,#%010 wc
+ if_nz sumnc px,t2
+ if_z sumnc py,t2
+ djnz t3,#:adjust
+
+:yline mov sx,#0 'plot entire pix
+ mov t3,dx
+:xword rdword t4,arg3 'read next pix word
+ add arg3,#2
+ shl t4,#16
+ mov t5,#8
+:xpixel rol t4,#2 'plot pixel within word
+ test t4,#1 wc 'set color
+ muxc pcolor,color1
+ test t4,#2 wc
+ muxc pcolor,color2 wz '(z=1 if color=0)
+ if_nz call #plotp
+ test arg2,#%001 wz 'update px,py for next x
+ test arg2,#%110 wc
+ if_z sumc px,sy
+ if_nz sumnc py,sy
+ add sx,sy
+ djnz t5,#:xpixel 'another x pixel?
+ djnz t3,#:xword 'another x word?
+ if_z sumnc px,sx 'update px,py for next y
+ if_nz sumc py,sx
+ test arg2,#%010 wc
+ if_nz sumc px,sy
+ if_z sumc py,sy
+ djnz dy,#:yline 'another y line?
+
+ mov pcolor,t6 'restore color
+
+ jmp #loop
+'
+'
+' text(x, y, @string) justx, justy
+' textarc(x, y, xr, yr, angle, @string) justx, justy
+'
+textarc_ call #arcmod
+
+text_ add arg3,arg0 'add x into justx
+ add arg4,arg1 'add y into justy
+
+:chr rdbyte t1,arg2 wz 'get chr
+ add arg2,#1
+
+ if_z jmp #loop 'if 0, done
+
+ sub t1,#$21 'if chr out of range, skip
+ cmp t1,#$7F-$21+fx wc
+ if_nc jmp #:skip
+
+ mov arg5,fontptr 'scan font for chr definition
+:scan tjz t1,#:def
+ rdword t2,arg5
+ add arg5,#2
+ test t2,h8000 wc
+ if_nc sub t1,#1
+ jmp #:scan
+
+:def rdword t7,arg5 'get font definition word
+ add arg5,#2
+
+ call #fontxy 'extract initial x,y
+
+ test t7,#$80 wc 'arc or line?
+ if_nc jmp #:line
+
+
+ mov t2,textsx 'arc, extract x radius
+ mov t3,#%0001_0001_1
+ call #fontb
+ mov t4,t1
+
+ mov t2,textsy 'extract y radius
+ mov t3,#%0010_0011_1
+ call #fontb
+ mov t5,t1
+
+ mov t2,#1 'extract starting angle
+ mov t3,#%0010_0011_0
+ call #fontb
+ shl t1,#11
+
+ mov t6,t1 'extract angle sweep
+ mov t3,#%0010_0011_0
+ call #fontb
+ neg arg6,t1
+ shl arg6,#4
+ add arg6,#65
+
+ call #arcd 'plot initial arc point
+ call #plotd
+
+:arc call #arcd 'connect subsequent arc points with lines
+ call #linepd
+ add t6,#$80
+ djnz arg6,#:arc
+
+ jmp #:more
+
+
+:line call #plotd 'line, plot initial x,y
+
+ call #fontxy 'extract terminal x,y
+
+ call #linepd 'draw line
+
+
+:more test t7,#$02 wc 'more font definition?
+ if_c jmp #:def
+
+:skip mov t1,textsp 'advance x to next chr position
+ mov t2,textsx
+ call #multiply
+ add arg3,t1
+
+ jmp #:chr 'get next chr
+
+
+fontxy mov t2,textsx 'extract x
+ mov t3,#%0011_0111_0
+ call #fontb
+ mov arg0,t1
+ add arg0,arg3
+
+ mov t2,textsy 'extract y
+ mov t3,#%0100_1111_0
+ call #fontb
+ mov arg1,t1
+ add arg1,arg4
+
+setd mov dx,xorigin 'set dx,dy from arg0,arg1
+ add dx,arg0
+ mov dy,yorigin
+ sub dy,arg1
+setd_ret
+fontxy_ret ret
+
+
+fontb mov t1,t7 'extract bitrange from font word
+ shr t3,#1 wc
+ and t1,t3
+ if_c add t1,#1
+ shr t3,#4
+ shr t7,t3
+
+ shl t1,#32-4 'multiply t1[3..0] by t2
+ mov t3,#4
+:loop shl t1,#1 wc
+ if_c add t1,t2
+ djnz t3,#:loop
+
+fontb_ret ret
+'
+'
+' textmode(x_scale, y_scale, spacing, justification)
+'
+textmode_ mov textsx,arg0 'set text x scale
+ mov textsy,arg1 'set text y scale
+ mov textsp,arg2 'set text spacing
+
+ jmp #loop
+'
+'
+' fill(x, y, da, db, db2, linechange, lines_minus_1)
+'
+fill_ shl dx,#16 'get left and right fractions
+ or dx,h8000
+ mov t1,dx
+
+ mov t2,xlongs 'get x pixels
+ shl t2,#4
+
+ add arg6,#1 'pre-increment line counter
+
+:yloop add dx,arg2 'adjust left and right fractions
+ add t1,arg3
+
+ cmps dx,t1 wc 'get left and right integers
+ if_c mov base0,dx
+ if_c mov base1,t1
+ if_nc mov base0,t1
+ if_nc mov base1,dx
+ sar base0,#16
+ sar base1,#16
+
+ cmps base0,t2 wc 'left out of range?
+ if_c cmps hFFFFFFFF,base1 wc 'right out of range?
+ if_c cmp dy,ylongs wc 'y out of range?
+ if_nc jmp #:skip 'if any, skip
+
+ mins base0,#0 'limit left and right
+ maxs base1,t2 wc
+ if_nc sub base1,#1
+
+ shl base0,#1 'make left mask
+ neg mask0,#1
+ shl mask0,base0
+ shr base0,#5
+
+ shl base1,#1 'make right mask
+ xor base1,#$1E
+ neg mask1,#1
+ shr mask1,base1
+ shr base1,#5
+
+ sub base1,base0 wz 'ready long count
+ add base1,#1
+
+ if_z and mask0,mask1 'if single long, merge masks
+
+ shl base0,#1 'get long base
+ add base0,basesptr
+ rdword base0,base0
+ shl dy,#2
+ add base0,dy
+ shr dy,#2
+
+ mov bits0,mask0 'ready left mask
+:xloop mov bits1,pcolor 'make color mask
+ and bits1,bits0
+ rdlong pass,base0 'read-modify-write long
+ andn pass,bits0
+ or pass,bits1
+ wrlong pass,base0
+ shl ylongs,#2 'advance to next long
+ add base0,ylongs
+ shr ylongs,#2
+ cmp base1,#2 wz 'one more?
+ if_nz neg bits0,#1 'if not, ready full mask
+ if_z mov bits0,mask1 'if one more, ready right mask
+ djnz base1,#:xloop 'loop if more longs
+
+:skip sub arg5,#1 wc 'delta change?
+ if_c mov arg3,arg4 'if so, set new deltas
+:same
+ add dy,#1 'adjust y
+ djnz arg6,#:yloop 'another y?
+
+ jmp #loop
+'
+'
+' Plot line from px,py to dx,dy
+'
+linepd cmps dx,px wc, wr 'get x difference
+ negc sx,#1 'set x direction
+
+ cmps dy,py wc, wr 'get y difference
+ negc sy,#1 'set y direction
+
+ abs dx,dx 'make differences absolute
+ abs dy,dy
+
+ cmp dx,dy wc 'determine dominant axis
+ if_nc tjz dx,#:last 'if both differences 0, plot single pixel
+ if_nc mov count,dx 'set pixel count
+ if_c mov count,dy
+ mov ratio,count 'set initial ratio
+ shr ratio,#1
+ if_c jmp #:yloop 'x or y dominant?
+
+
+:xloop call #plotp 'dominant x line
+ add px,sx
+ sub ratio,dy wc
+ if_c add ratio,dx
+ if_c add py,sy
+ djnz count,#:xloop
+
+ jmp #:last 'plot last pixel
+
+
+:yloop call #plotp 'dominant y line
+ add py,sy
+ sub ratio,dx wc
+ if_c add ratio,dy
+ if_c add px,sx
+ djnz count,#:yloop
+
+:last call #plotp 'plot last pixel
+
+linepd_ret ret
+'
+'
+' Plot pixel at px,py
+'
+plotd mov px,dx 'set px,py to dx,dy
+ mov py,dy
+
+plotp tjnz pwidth,#wplot 'if width > 0, do wide plot
+
+ mov t1,px 'compute pixel mask
+ shl t1,#1
+ mov mask0,#%11
+ shl mask0,t1
+ shr t1,#5
+
+ cmp t1,xlongs wc 'if x or y out of bounds, exit
+ if_c cmp py,ylongs wc
+ if_nc jmp #plotp_ret
+
+ mov bits0,pcolor 'compute pixel bits
+ and bits0,mask0
+
+ shl t1,#1 'get address of pixel long
+ add t1,basesptr
+ mov t2,py
+ rdword t1,t1
+ shl t2,#2
+ add t1,t2
+
+ rdlong t2,t1 'write pixel
+ andn t2,mask0
+ or t2,bits0
+ wrlong t2,t1
+plotp_ret
+plotd_ret ret
+'
+'
+' Plot wide pixel
+'
+wplot mov t1,py 'if y out of bounds, exit
+ add t1,#7
+ mov t2,ylongs
+ add t2,#7+8
+ cmp t1,t2 wc
+ if_nc jmp #plotp_ret
+
+ mov t1,px 'determine x long pair
+ sub t1,#8
+ sar t1,#4
+ cmp t1,xlongs wc
+ muxc jumps,#%01 '(use jumps[1..0] to store writes)
+ add t1,#1
+ cmp t1,xlongs wc
+ muxc jumps,#%10
+
+ test jumps,#%11 wz 'if x out of bounds, exit
+ if_z jmp #plotp_ret
+
+ shl t1,#1 'get base pair
+ add t1,basesptr
+ rdword base1,t1
+ sub t1,#2
+ rdword base0,t1
+
+ mov t1,px 'determine pair shifts
+ shl t1,#1
+ movs :shift1,t1
+ xor :shift1,#7<<1
+ add t1,#9<<1
+ movs :shift0,t1
+ test t1,#$F<<1 wz '(account for special case)
+ if_z andn jumps,#%01
+
+ mov pass,#0 'ready to plot slices
+ mov slice,slicesptr
+
+:loop rdlong mask0,slice 'get next slice
+ mov mask1,mask0
+
+:shift0 shl mask0,#0 'position slice
+:shift1 shr mask1,#0
+
+ mov bits0,pcolor 'colorize slice
+ and bits0,mask0
+ mov bits1,pcolor
+ and bits1,mask1
+
+ mov t1,py 'plot lower slice
+ add t1,pass
+ cmp t1,ylongs wc
+ if_c call #wslice
+
+ mov t1,py 'plot upper slice
+ test pwidth,#1 wc
+ subx t1,pass
+ cmp t1,ylongs wc
+ if_c call #wslice
+
+ add slice,#4 'next slice
+ add pass,#1
+ cmp pass,passes wz
+ if_nz jmp #:loop
+
+ jmp #plotp_ret
+'
+'
+' Plot wide pixel slice
+'
+wslice shl t1,#2 'ready long offset
+
+ add base0,t1 'plot left slice
+ test jumps,#%01 wc
+ if_c rdlong t2,base0
+ if_c andn t2,mask0
+ if_c or t2,bits0
+ if_c wrlong t2,base0
+
+ add base1,t1 'plot right slice
+ test jumps,#%10 wc
+ if_c rdlong t2,base1
+ if_c andn t2,mask1
+ if_c or t2,bits1
+ if_c wrlong t2,base1
+
+ sub base0,t1 'restore bases
+ sub base1,t1
+
+wslice_ret ret
+'
+'
+' Get arc point from args and then move args 5..7 to 2..4
+'
+arcmod call #arca 'get arc using first 5 args
+
+ mov arg0,dx 'set arg0,arg1
+ sub arg0,xorigin
+ mov arg1,yorigin
+ sub arg1,dy
+
+ mov arg2,arg5 'move args 5..7 to 2..4
+ mov arg3,arg6
+ mov arg4,arg7
+
+arcmod_ret ret
+'
+'
+' Get arc dx,dy from arg0,arg1
+'
+' in: arg0,arg1 = center x,y
+' arg2/t4 = x length
+' arg3/t5 = y length
+' arg4/t6 = 13-bit angle
+'
+' out: dx,dy = arc point
+'
+arca mov t4,arg2 'use args
+ mov t5,arg3
+ mov t6,arg4
+
+arcd call #setd 'reset dx,dy to arg0,arg1
+
+ mov t1,t6 'get arc dx
+ mov t2,t4
+ call #polarx
+ add dx,t1
+
+ mov t1,t6 'get arc dy
+ mov t2,t5
+ call #polary
+ sub dy,t1
+arcd_ret
+arca_ret ret
+'
+'
+' Polar to cartesian
+'
+' in: t1 = 13-bit angle
+' t2 = 16-bit length
+'
+' out: t1 = x|y
+'
+polarx add t1,sine_90 'cosine, add 90° for sine lookup
+polary test t1,sine_180 wz 'get sine quadrant 3|4 into nz
+ test t1,sine_90 wc 'get sine quadrant 2|4 into c
+ negc t1,t1 'if sine quadrant 2|4, negate table offset
+ or t1,sine_table 'or in sine table address >> 1
+ shl t1,#1 'shift left to get final word address
+ rdword t1,t1 'read sine/cosine word
+ call #multiply 'multiply sine/cosine by length to get x|y
+ add t1,h8000 'add 1/2 lsb to round up x|y fraction
+ shr t1,#16 'justify x|y integer
+ negnz t1,t1 'if sine quadrant 3|4, negate x|y
+polary_ret
+polarx_ret ret
+
+sine_90 long $0800 '90° bit
+sine_180 long $1000 '180° bit
+sine_table long $E000 >> 1 'sine table address shifted right
+'
+'
+' Multiply
+'
+' in: t1 = 16-bit multiplicand (t1[31..16] must be 0)
+' t2 = 16-bit multiplier
+'
+' out: t1 = 32-bit product
+'
+multiply mov t3,#16
+ shl t2,#16
+ shr t1,#1 wc
+
+:loop if_c add t1,t2 wc
+ rcr t1,#1 wc
+ djnz t3,#:loop
+
+multiply_ret ret
+'
+'
+' Defined data
+'
+zero long 0 'constants
+d0 long $200
+h8000 long $8000
+hFFFFFFFF long $FFFFFFFF
+color1 long %%1111111111111111
+color2 long %%2222222222222222
+
+fontptr long 0 'font pointer (set before cognew command)
+
+pcolor long %%1111111111111111 'pixel color
+pwidth long 0 'pixel width
+passes long 1 'pixel passes
+textsx long 1 'text scale x
+textsy long 1 'text scale y
+textsp long 6 'text spacing
+'
+'
+' Undefined data
+'
+t1 res 1 'temps
+t2 res 1
+t3 res 1
+t4 res 1
+t5 res 1
+t6 res 1
+t7 res 1
+
+arg0 res 1 'arguments passed from high-level
+arg1 res 1
+arg2 res 1
+arg3 res 1
+arg4 res 1
+arg5 res 1
+arg6 res 1
+arg7 res 1
+
+basesptr res 1 'pointers
+slicesptr res 1
+
+xlongs res 1 'bitmap metrics
+ylongs res 1
+xorigin res 1
+yorigin res 1
+
+dx res 1 'line/plot coordinates
+dy res 1
+px res 1
+py res 1
+
+sx res 1 'line
+sy res 1
+count res 1
+ratio res 1
+
+pass res 1 'plot
+slice res 1
+base0 res 1
+base1 res 1
+mask0 res 1
+mask1 res 1
+bits0 res 1
+bits1 res 1
+
+{{
+
+┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+│ TERMS OF USE: MIT License │
+├──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
+│Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation │
+│files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, │
+│modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software│
+│is furnished to do so, subject to the following conditions: │
+│ │
+│The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.│
+│ │
+│THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE │
+│WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR │
+│COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, │
+│ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. │
+└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+}}
\ No newline at end of file
diff --git a/samples/Propeller Spin/Inductor.spin b/samples/Propeller Spin/Inductor.spin
new file mode 100644
index 00000000..611a75fc
--- /dev/null
+++ b/samples/Propeller Spin/Inductor.spin
@@ -0,0 +1,221 @@
+{{
+*****************************************
+* Inductive Sensor Demo v1.0 *
+* Author: Beau Schwabe *
+* Copyright (c) 2007 Parallax *
+* See end of file for terms of use. *
+*****************************************
+
+
+Test Circuit:
+
+ 10pF 100K 1M
+FPin ───┳──┳── SDF(sigma-delta feedback)
+ │ ┣──── SDI(sigma-delta input)
+ L 100K
+
+ GND GND
+
+
+Test Coils:
+
+Wire used was the "Radio Shack Special" GREEN (about 27 gauge)
+
+25T (Coke Can form) = 2.1MHz
+15T (Coke Can form) = 3.9MHz
+ 5T (Coke Can form) = 5.3MHz
+50T (BIC pen form) = 3.2MHz
+
+
+
+How does it work?
+
+Note: The reported resonate frequency is NOT the actual resonate LC frequency. Instead it is where the voltage produced from
+ the LC circuit was clipped.
+
+ In the example circuit below:
+
+ C L
+ A ────┳──── GND
+ │
+ B
+
+ When you apply a small voltage at a specific frequency to an LC circuit (at point "A") that is at or near the resonate
+ frequency of LC, it is not uncommon to measure 10's or 100's of times the amount of voltage (at point "B") that you are
+ applying to the LC circuit. (at point "A")
+
+
+ In the "Test Circuit" above, point "B" passes through a diode which then basically feeds a divide by 2 voltage divider:
+
+ 100K 100K
+ B ───┳── GND
+ │
+ C
+
+ ...So in order see the sigma-delta ADC "clip" the frequency sweep result, the output from the LC circuit only needs
+ to generate about 6.6 Volts above ground. (0.6V drop across the diode, and since the ADC is only sensitive to about
+ 3V, it works out to be about 6.6V after the voltage divider.)
+
+
+ A typical magnitude plot of a frequency sweep applied to an LC circuit might look something like this:
+
+ *
+ *
+ *
+ *
+ * *
+ * *
+ * *
+ * *
+ * *
+ ***** *****
+
+
+ ...With 'clipping' the pattern looks more like this:
+
+ X****
+ * *
+ * *
+ * *
+ ***** *****
+
+ ...The 'X' denotes the location of the reported resonate frequency. The reason this is slightly off is for
+ two reasons really. 1) lazy - I didn't want to fiddle with the voltage divider combo... adjusting so that the
+ "peak" was also where the ADC happened to "clip". 2) some benefit - When you apply a frequency to a tuned LC
+ circuit that's resonate frequency is the same as the applied frequency, the LC acts like a dead short. A
+ situation not exactly great for Propeller I/O's
+
+ Now that we have that out of the way, what happens next? How can we use this so called "coil" as a sensor?
+
+ If a frequency sweep is initially preformed to determine the resonate frequency clip point, then it just so
+ happens that adding additional "metal" (<- Does not need to be ferrous) causes the resonate frequency to shift
+ to a HIGHER frequency.
+
+ Once you determine the "clip" frequency and you use one of the available counters to constantly feed that
+ particular frequency back to the LC circuit, the resulting ADC output is proportional and somewhat linear when
+ metal objects are introduced to the coil.
+
+ Assume frequency increases from Left to Right. With a slight resonate shift to the right, the ADC reports a
+ lower "de-tuned" value because the voltage magnitude no longer "clips" at the reported resonate frequency.
+ Typical ranges are full scale between 65535 (no metal) and 0 (metal saturation)
+
+
+ X *****
+ * *
+ ADC reports value here --> * *
+ * *
+ ***** *****
+
+ Slight shift to the right
+
+ I also made mention that the response is somewhat linear. As the LC resonance shifts and the ADC value begins
+ to lower, the slope is steepest near the "clip" point. Therefore, the slightest shift results in larger value
+ changes. Since the coil is actually the least sensitive to metal the further away it is (Law of squares) and
+ most sensitive to metal the closer it is, the resulting combination acts to linearize the output. I need to
+ point out that some LC combinations will exhibit plateaus and other anomalies caused by varying parasitic circuit
+ conditions that will affect the overall output, so a little bit of trial and error is necessary to get things
+ the way you want them.
+
+}}
+OBJ
+ Freq : "Synth"
+ ADC : "ADC"
+ gr : "graphics"
+ Num : "Numbers"
+CON
+ FPin = 0
+
+ UpperFrequency = 6_000_000
+ LowerFrequency = 2_000_000
+
+ bitmap_base = $2000
+ display_base = $5000
+
+VAR
+ long FMax, FTemp, FValue, Frequency
+
+PUB demo
+ 'start and setup graphics
+ gr.start
+ gr.setup(16, 12, 128, 96, bitmap_base)
+
+ FindResonateFrequency
+
+ DisplayInductorValue
+
+PUB DisplayInductorValue | X
+ Freq.Synth("A", FPin, FValue)
+ repeat
+ ADC.SigmaDelta(@FTemp)
+
+'**************************************** Graphics Option Start *********************************************
+ 'clear bitmap
+ gr.clear
+ 'draw text
+ gr.textmode(1,1,7,5)
+ gr.colorwidth(1,0)
+ gr.text(0,90,string("Inductive Propeller Sensor"))
+
+ gr.colorwidth(1,5)
+ X := (65535 - FTemp )*200/65535
+ gr.plot(-100+X,15)
+
+ gr.textmode(1,1,7,%0000)
+ gr.colorwidth(1,0)
+ gr.text(-100,-20,string("Resonate Frequency ="))
+ gr.text(35,-20,Num.ToStr(FValue,10))
+
+ gr.text(-100,-36,string("ADC Frequency Response ="))
+ gr.text(65,-36,Num.ToStr(FTemp,10))
+
+ 'copy bitmap to display
+ gr.copy(display_base)
+'**************************************** Graphics Option Finish *********************************************
+
+PUB FindResonateFrequency | P
+ dira[FPin] := 1
+
+ FMax := 0
+ repeat Frequency from LowerFrequency to UpperFrequency step 1000
+ Freq.Synth("A", FPin, Frequency)
+ ADC.SigmaDelta(@FTemp)
+
+ if FTemp > FMax
+ FMax := FTemp
+ FValue := Frequency
+'**************************************** Graphics Option Start *********************************************
+ P := (Frequency - LowerFrequency)*100/(UpperFrequency - LowerFrequency)
+
+ gr.colorwidth(1,5)
+ gr.plot(0,0)
+ gr.line(P,0)
+ gr.colorwidth(3,5)
+ gr.line(100,0)
+
+ gr.colorwidth(2,0)
+ gr.plot(P,(FTemp/1024)+10)
+ gr.colorwidth(0,1)
+ gr.plot(P+1,5)
+ gr.line(P+1,50)
+
+ gr.copy(display_base)
+'**************************************** Graphics Option Finish *********************************************
+
+DAT
+{{
+┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+│ TERMS OF USE: MIT License │
+├──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
+│Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation │
+│files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, │
+│modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software│
+│is furnished to do so, subject to the following conditions: │
+│ │
+│The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.│
+│ │
+│THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE │
+│WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR │
+│COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, │
+│ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. │
+└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+}}
\ No newline at end of file
diff --git a/samples/Propeller Spin/Keyboard.spin b/samples/Propeller Spin/Keyboard.spin
new file mode 100644
index 00000000..bb38d0ab
--- /dev/null
+++ b/samples/Propeller Spin/Keyboard.spin
@@ -0,0 +1,736 @@
+''***************************************
+''* PS/2 Keyboard Driver v1.0.1 *
+''* Author: Chip Gracey *
+''* Copyright (c) 2004 Parallax, Inc. *
+''* See end of file for terms of use. *
+''***************************************
+
+{-----------------REVISION HISTORY-----------------
+ v1.0.1 - Updated 6/15/2006 to work with Propeller Tool 0.96}
+
+VAR
+
+ long cog
+
+ long par_tail 'key buffer tail read/write (19 contiguous longs)
+ long par_head 'key buffer head read-only
+ long par_present 'keyboard present read-only
+ long par_states[8] 'key states (256 bits) read-only
+ long par_keys[8] 'key buffer (16 words) read-only (also used to pass initial parameters)
+
+
+PUB start(dpin, cpin) : okay
+
+'' Start keyboard driver - starts a cog
+'' returns false if no cog available
+''
+'' dpin = data signal on PS/2 jack
+'' cpin = clock signal on PS/2 jack
+''
+'' use 100-ohm resistors between pins and jack
+'' use 10K-ohm resistors to pull jack-side signals to VDD
+'' connect jack-power to 5V, jack-gnd to VSS
+''
+'' all lock-keys will be enabled, NumLock will be initially 'on',
+'' and auto-repeat will be set to 15cps with a delay of .5s
+
+ okay := startx(dpin, cpin, %0_000_100, %01_01000)
+
+
+PUB startx(dpin, cpin, locks, auto) : okay
+
+'' Like start, but allows you to specify lock settings and auto-repeat
+''
+'' locks = lock setup
+'' bit 6 disallows shift-alphas (case set soley by CapsLock)
+'' bits 5..3 disallow toggle of NumLock/CapsLock/ScrollLock state
+'' bits 2..0 specify initial state of NumLock/CapsLock/ScrollLock
+'' (eg. %0_001_100 = disallow ScrollLock, NumLock initially 'on')
+''
+'' auto = auto-repeat setup
+'' bits 6..5 specify delay (0=.25s, 1=.5s, 2=.75s, 3=1s)
+'' bits 4..0 specify repeat rate (0=30cps..31=2cps)
+'' (eg %01_00000 = .5s delay, 30cps repeat)
+
+ stop
+ longmove(@par_keys, @dpin, 4)
+ okay := cog := cognew(@entry, @par_tail) + 1
+
+
+PUB stop
+
+'' Stop keyboard driver - frees a cog
+
+ if cog
+ cogstop(cog~ - 1)
+ longfill(@par_tail, 0, 19)
+
+
+PUB present : truefalse
+
+'' Check if keyboard present - valid ~2s after start
+'' returns t|f
+
+ truefalse := -par_present
+
+
+PUB key : keycode
+
+'' Get key (never waits)
+'' returns key (0 if buffer empty)
+
+ if par_tail <> par_head
+ keycode := par_keys.word[par_tail]
+ par_tail := ++par_tail & $F
+
+
+PUB getkey : keycode
+
+'' Get next key (may wait for keypress)
+'' returns key
+
+ repeat until (keycode := key)
+
+
+PUB newkey : keycode
+
+'' Clear buffer and get new key (always waits for keypress)
+'' returns key
+
+ par_tail := par_head
+ keycode := getkey
+
+
+PUB gotkey : truefalse
+
+'' Check if any key in buffer
+'' returns t|f
+
+ truefalse := par_tail <> par_head
+
+
+PUB clearkeys
+
+'' Clear key buffer
+
+ par_tail := par_head
+
+
+PUB keystate(k) : state
+
+'' Get the state of a particular key
+'' returns t|f
+
+ state := -(par_states[k >> 5] >> k & 1)
+
+
+DAT
+
+'******************************************
+'* Assembly language PS/2 keyboard driver *
+'******************************************
+
+ org
+'
+'
+' Entry
+'
+entry movd :par,#_dpin 'load input parameters _dpin/_cpin/_locks/_auto
+ mov x,par
+ add x,#11*4
+ mov y,#4
+:par rdlong 0,x
+ add :par,dlsb
+ add x,#4
+ djnz y,#:par
+
+ mov dmask,#1 'set pin masks
+ shl dmask,_dpin
+ mov cmask,#1
+ shl cmask,_cpin
+
+ test _dpin,#$20 wc 'modify port registers within code
+ muxc _d1,dlsb
+ muxc _d2,dlsb
+ muxc _d3,#1
+ muxc _d4,#1
+ test _cpin,#$20 wc
+ muxc _c1,dlsb
+ muxc _c2,dlsb
+ muxc _c3,#1
+
+ mov _head,#0 'reset output parameter _head
+'
+'
+' Reset keyboard
+'
+reset mov dira,#0 'reset directions
+ mov dirb,#0
+
+ movd :par,#_present 'reset output parameters _present/_states[8]
+ mov x,#1+8
+:par mov 0,#0
+ add :par,dlsb
+ djnz x,#:par
+
+ mov stat,#8 'set reset flag
+'
+'
+' Update parameters
+'
+update movd :par,#_head 'update output parameters _head/_present/_states[8]
+ mov x,par
+ add x,#1*4
+ mov y,#1+1+8
+:par wrlong 0,x
+ add :par,dlsb
+ add x,#4
+ djnz y,#:par
+
+ test stat,#8 wc 'if reset flag, transmit reset command
+ if_c mov data,#$FF
+ if_c call #transmit
+'
+'
+' Get scancode
+'
+newcode mov stat,#0 'reset state
+
+:same call #receive 'receive byte from keyboard
+
+ cmp data,#$83+1 wc 'scancode?
+
+ if_nc cmp data,#$AA wz 'powerup/reset?
+ if_nc_and_z jmp #configure
+
+ if_nc cmp data,#$E0 wz 'extended?
+ if_nc_and_z or stat,#1
+ if_nc_and_z jmp #:same
+
+ if_nc cmp data,#$F0 wz 'released?
+ if_nc_and_z or stat,#2
+ if_nc_and_z jmp #:same
+
+ if_nc jmp #newcode 'unknown, ignore
+'
+'
+' Translate scancode and enter into buffer
+'
+ test stat,#1 wc 'lookup code with extended flag
+ rcl data,#1
+ call #look
+
+ cmp data,#0 wz 'if unknown, ignore
+ if_z jmp #newcode
+
+ mov t,_states+6 'remember lock keys in _states
+
+ mov x,data 'set/clear key bit in _states
+ shr x,#5
+ add x,#_states
+ movd :reg,x
+ mov y,#1
+ shl y,data
+ test stat,#2 wc
+:reg muxnc 0,y
+
+ if_nc cmpsub data,#$F0 wc 'if released or shift/ctrl/alt/win, done
+ if_c jmp #update
+
+ mov y,_states+7 'get shift/ctrl/alt/win bit pairs
+ shr y,#16
+
+ cmpsub data,#$E0 wc 'translate keypad, considering numlock
+ if_c test _locks,#%100 wz
+ if_c_and_z add data,#@keypad1-@table
+ if_c_and_nz add data,#@keypad2-@table
+ if_c call #look
+ if_c jmp #:flags
+
+ cmpsub data,#$DD wc 'handle scrlock/capslock/numlock
+ if_c mov x,#%001_000
+ if_c shl x,data
+ if_c andn x,_locks
+ if_c shr x,#3
+ if_c shr t,#29 'ignore auto-repeat
+ if_c andn x,t wz
+ if_c xor _locks,x
+ if_c add data,#$DD
+ if_c_and_nz or stat,#4 'if change, set configure flag to update leds
+
+ test y,#%11 wz 'get shift into nz
+
+ if_nz cmp data,#$60+1 wc 'check shift1
+ if_nz_and_c cmpsub data,#$5B wc
+ if_nz_and_c add data,#@shift1-@table
+ if_nz_and_c call #look
+ if_nz_and_c andn y,#%11
+
+ if_nz cmp data,#$3D+1 wc 'check shift2
+ if_nz_and_c cmpsub data,#$27 wc
+ if_nz_and_c add data,#@shift2-@table
+ if_nz_and_c call #look
+ if_nz_and_c andn y,#%11
+
+ test _locks,#%010 wc 'check shift-alpha, considering capslock
+ muxnc :shift,#$20
+ test _locks,#$40 wc
+ if_nz_and_nc xor :shift,#$20
+ cmp data,#"z"+1 wc
+ if_c cmpsub data,#"a" wc
+:shift if_c add data,#"A"
+ if_c andn y,#%11
+
+:flags ror data,#8 'add shift/ctrl/alt/win flags
+ mov x,#4 '+$100 if shift
+:loop test y,#%11 wz '+$200 if ctrl
+ shr y,#2 '+$400 if alt
+ if_nz or data,#1 '+$800 if win
+ ror data,#1
+ djnz x,#:loop
+ rol data,#12
+
+ rdlong x,par 'if room in buffer and key valid, enter
+ sub x,#1
+ and x,#$F
+ cmp x,_head wz
+ if_nz test data,#$FF wz
+ if_nz mov x,par
+ if_nz add x,#11*4
+ if_nz add x,_head
+ if_nz add x,_head
+ if_nz wrword data,x
+ if_nz add _head,#1
+ if_nz and _head,#$F
+
+ test stat,#4 wc 'if not configure flag, done
+ if_nc jmp #update 'else configure to update leds
+'
+'
+' Configure keyboard
+'
+configure mov data,#$F3 'set keyboard auto-repeat
+ call #transmit
+ mov data,_auto
+ and data,#%11_11111
+ call #transmit
+
+ mov data,#$ED 'set keyboard lock-leds
+ call #transmit
+ mov data,_locks
+ rev data,#-3 & $1F
+ test data,#%100 wc
+ rcl data,#1
+ and data,#%111
+ call #transmit
+
+ mov x,_locks 'insert locks into _states
+ and x,#%111
+ shl _states+7,#3
+ or _states+7,x
+ ror _states+7,#3
+
+ mov _present,#1 'set _present
+
+ jmp #update 'done
+'
+'
+' Lookup byte in table
+'
+look ror data,#2 'perform lookup
+ movs :reg,data
+ add :reg,#table
+ shr data,#27
+ mov x,data
+:reg mov data,0
+ shr data,x
+
+ jmp #rand 'isolate byte
+'
+'
+' Transmit byte to keyboard
+'
+transmit
+_c1 or dira,cmask 'pull clock low
+ movs napshr,#13 'hold clock for ~128us (must be >100us)
+ call #nap
+_d1 or dira,dmask 'pull data low
+ movs napshr,#18 'hold data for ~4us
+ call #nap
+_c2 xor dira,cmask 'release clock
+
+ test data,#$0FF wc 'append parity and stop bits to byte
+ muxnc data,#$100
+ or data,dlsb
+
+ mov x,#10 'ready 10 bits
+transmit_bit call #wait_c0 'wait until clock low
+ shr data,#1 wc 'output data bit
+_d2 muxnc dira,dmask
+ mov wcond,c1 'wait until clock high
+ call #wait
+ djnz x,#transmit_bit 'another bit?
+
+ mov wcond,c0d0 'wait until clock and data low
+ call #wait
+ mov wcond,c1d1 'wait until clock and data high
+ call #wait
+
+ call #receive_ack 'receive ack byte with timed wait
+ cmp data,#$FA wz 'if ack error, reset keyboard
+ if_nz jmp #reset
+
+transmit_ret ret
+'
+'
+' Receive byte from keyboard
+'
+receive test _cpin,#$20 wc 'wait indefinitely for initial clock low
+ waitpne cmask,cmask
+receive_ack
+ mov x,#11 'ready 11 bits
+receive_bit call #wait_c0 'wait until clock low
+ movs napshr,#16 'pause ~16us
+ call #nap
+_d3 test dmask,ina wc 'input data bit
+ rcr data,#1
+ mov wcond,c1 'wait until clock high
+ call #wait
+ djnz x,#receive_bit 'another bit?
+
+ shr data,#22 'align byte
+ test data,#$1FF wc 'if parity error, reset keyboard
+ if_nc jmp #reset
+rand and data,#$FF 'isolate byte
+
+look_ret
+receive_ack_ret
+receive_ret ret
+'
+'
+' Wait for clock/data to be in required state(s)
+'
+wait_c0 mov wcond,c0 '(wait until clock low)
+
+wait mov y,tenms 'set timeout to 10ms
+
+wloop movs napshr,#18 'nap ~4us
+ call #nap
+_c3 test cmask,ina wc 'check required state(s)
+_d4 test dmask,ina wz 'loop until got state(s) or timeout
+wcond if_never djnz y,#wloop '(replaced with c0/c1/c0d0/c1d1)
+
+ tjz y,#reset 'if timeout, reset keyboard
+wait_ret
+wait_c0_ret ret
+
+
+c0 if_c djnz y,#wloop '(if_never replacements)
+c1 if_nc djnz y,#wloop
+c0d0 if_c_or_nz djnz y,#wloop
+c1d1 if_nc_or_z djnz y,#wloop
+'
+'
+' Nap
+'
+nap rdlong t,#0 'get clkfreq
+napshr shr t,#18/16/13 'shr scales time
+ min t,#3 'ensure waitcnt won't snag
+ add t,cnt 'add cnt to time
+ waitcnt t,#0 'wait until time elapses (nap)
+
+nap_ret ret
+'
+'
+' Initialized data
+'
+'
+dlsb long 1 << 9
+tenms long 10_000 / 4
+'
+'
+' Lookup table
+' ascii scan extkey regkey ()=keypad
+'
+table word $0000 '00
+ word $00D8 '01 F9
+ word $0000 '02
+ word $00D4 '03 F5
+ word $00D2 '04 F3
+ word $00D0 '05 F1
+ word $00D1 '06 F2
+ word $00DB '07 F12
+ word $0000 '08
+ word $00D9 '09 F10
+ word $00D7 '0A F8
+ word $00D5 '0B F6
+ word $00D3 '0C F4
+ word $0009 '0D Tab
+ word $0060 '0E `
+ word $0000 '0F
+ word $0000 '10
+ word $F5F4 '11 Alt-R Alt-L
+ word $00F0 '12 Shift-L
+ word $0000 '13
+ word $F3F2 '14 Ctrl-R Ctrl-L
+ word $0071 '15 q
+ word $0031 '16 1
+ word $0000 '17
+ word $0000 '18
+ word $0000 '19
+ word $007A '1A z
+ word $0073 '1B s
+ word $0061 '1C a
+ word $0077 '1D w
+ word $0032 '1E 2
+ word $F600 '1F Win-L
+ word $0000 '20
+ word $0063 '21 c
+ word $0078 '22 x
+ word $0064 '23 d
+ word $0065 '24 e
+ word $0034 '25 4
+ word $0033 '26 3
+ word $F700 '27 Win-R
+ word $0000 '28
+ word $0020 '29 Space
+ word $0076 '2A v
+ word $0066 '2B f
+ word $0074 '2C t
+ word $0072 '2D r
+ word $0035 '2E 5
+ word $CC00 '2F Apps
+ word $0000 '30
+ word $006E '31 n
+ word $0062 '32 b
+ word $0068 '33 h
+ word $0067 '34 g
+ word $0079 '35 y
+ word $0036 '36 6
+ word $CD00 '37 Power
+ word $0000 '38
+ word $0000 '39
+ word $006D '3A m
+ word $006A '3B j
+ word $0075 '3C u
+ word $0037 '3D 7
+ word $0038 '3E 8
+ word $CE00 '3F Sleep
+ word $0000 '40
+ word $002C '41 ,
+ word $006B '42 k
+ word $0069 '43 i
+ word $006F '44 o
+ word $0030 '45 0
+ word $0039 '46 9
+ word $0000 '47
+ word $0000 '48
+ word $002E '49 .
+ word $EF2F '4A (/) /
+ word $006C '4B l
+ word $003B '4C ;
+ word $0070 '4D p
+ word $002D '4E -
+ word $0000 '4F
+ word $0000 '50
+ word $0000 '51
+ word $0027 '52 '
+ word $0000 '53
+ word $005B '54 [
+ word $003D '55 =
+ word $0000 '56
+ word $0000 '57
+ word $00DE '58 CapsLock
+ word $00F1 '59 Shift-R
+ word $EB0D '5A (Enter) Enter
+ word $005D '5B ]
+ word $0000 '5C
+ word $005C '5D \
+ word $CF00 '5E WakeUp
+ word $0000 '5F
+ word $0000 '60
+ word $0000 '61
+ word $0000 '62
+ word $0000 '63
+ word $0000 '64
+ word $0000 '65
+ word $00C8 '66 BackSpace
+ word $0000 '67
+ word $0000 '68
+ word $C5E1 '69 End (1)
+ word $0000 '6A
+ word $C0E4 '6B Left (4)
+ word $C4E7 '6C Home (7)
+ word $0000 '6D
+ word $0000 '6E
+ word $0000 '6F
+ word $CAE0 '70 Insert (0)
+ word $C9EA '71 Delete (.)
+ word $C3E2 '72 Down (2)
+ word $00E5 '73 (5)
+ word $C1E6 '74 Right (6)
+ word $C2E8 '75 Up (8)
+ word $00CB '76 Esc
+ word $00DF '77 NumLock
+ word $00DA '78 F11
+ word $00EC '79 (+)
+ word $C7E3 '7A PageDn (3)
+ word $00ED '7B (-)
+ word $DCEE '7C PrScr (*)
+ word $C6E9 '7D PageUp (9)
+ word $00DD '7E ScrLock
+ word $0000 '7F
+ word $0000 '80
+ word $0000 '81
+ word $0000 '82
+ word $00D6 '83 F7
+
+keypad1 byte $CA, $C5, $C3, $C7, $C0, 0, $C1, $C4, $C2, $C6, $C9, $0D, "+-*/"
+
+keypad2 byte "0123456789.", $0D, "+-*/"
+
+shift1 byte "{|}", 0, 0, "~"
+
+shift2 byte $22, 0, 0, 0, 0, "<_>?)!@#$%^&*(", 0, ":", 0, "+"
+'
+'
+' Uninitialized data
+'
+dmask res 1
+cmask res 1
+stat res 1
+data res 1
+x res 1
+y res 1
+t res 1
+
+_head res 1 'write-only
+_present res 1 'write-only
+_states res 8 'write-only
+_dpin res 1 'read-only at start
+_cpin res 1 'read-only at start
+_locks res 1 'read-only at start
+_auto res 1 'read-only at start
+
+''
+''
+'' _________
+'' Key Codes
+''
+'' 00..DF = keypress and keystate
+'' E0..FF = keystate only
+''
+''
+'' 09 Tab
+'' 0D Enter
+'' 20 Space
+'' 21 !
+'' 22 "
+'' 23 #
+'' 24 $
+'' 25 %
+'' 26 &
+'' 27 '
+'' 28 (
+'' 29 )
+'' 2A *
+'' 2B +
+'' 2C ,
+'' 2D -
+'' 2E .
+'' 2F /
+'' 30 0..9
+'' 3A :
+'' 3B ;
+'' 3C <
+'' 3D =
+'' 3E >
+'' 3F ?
+'' 40 @
+'' 41..5A A..Z
+'' 5B [
+'' 5C \
+'' 5D ]
+'' 5E ^
+'' 5F _
+'' 60 `
+'' 61..7A a..z
+'' 7B {
+'' 7C |
+'' 7D }
+'' 7E ~
+''
+'' 80-BF (future international character support)
+''
+'' C0 Left Arrow
+'' C1 Right Arrow
+'' C2 Up Arrow
+'' C3 Down Arrow
+'' C4 Home
+'' C5 End
+'' C6 Page Up
+'' C7 Page Down
+'' C8 Backspace
+'' C9 Delete
+'' CA Insert
+'' CB Esc
+'' CC Apps
+'' CD Power
+'' CE Sleep
+'' CF Wakeup
+''
+'' D0..DB F1..F12
+'' DC Print Screen
+'' DD Scroll Lock
+'' DE Caps Lock
+'' DF Num Lock
+''
+'' E0..E9 Keypad 0..9
+'' EA Keypad .
+'' EB Keypad Enter
+'' EC Keypad +
+'' ED Keypad -
+'' EE Keypad *
+'' EF Keypad /
+''
+'' F0 Left Shift
+'' F1 Right Shift
+'' F2 Left Ctrl
+'' F3 Right Ctrl
+'' F4 Left Alt
+'' F5 Right Alt
+'' F6 Left Win
+'' F7 Right Win
+''
+'' FD Scroll Lock State
+'' FE Caps Lock State
+'' FF Num Lock State
+''
+'' +100 if Shift
+'' +200 if Ctrl
+'' +400 if Alt
+'' +800 if Win
+''
+'' eg. Ctrl-Alt-Delete = $6C9
+''
+''
+'' Note: Driver will buffer up to 15 keystrokes, then ignore overflow.
+
+{{
+
+┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+│ TERMS OF USE: MIT License │
+├──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
+│Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation │
+│files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, │
+│modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software│
+│is furnished to do so, subject to the following conditions: │
+│ │
+│The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.│
+│ │
+│THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE │
+│WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR │
+│COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, │
+│ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. │
+└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+}}
\ No newline at end of file
diff --git a/samples/Propeller Spin/TV.spin b/samples/Propeller Spin/TV.spin
new file mode 100644
index 00000000..49b55b14
--- /dev/null
+++ b/samples/Propeller Spin/TV.spin
@@ -0,0 +1,711 @@
+''***************************************
+''* TV Driver v1.1 *
+''* Author: Chip Gracey *
+''* Copyright (c) 2004 Parallax, Inc. *
+''* See end of file for terms of use. *
+''***************************************
+
+' v1.0 - 01 May 2006 - original version
+' v1.1 - 17 May 2006 - pixel tile size can now be 16 x 32 to enable more efficient
+' character displays utilizing the internal font - see 'tv_mode'
+
+
+CON
+
+ fntsc = 3_579_545 'NTSC color frequency
+ lntsc = 3640 'NTSC color cycles per line * 16
+ sntsc = 624 'NTSC color cycles per sync * 16
+
+ fpal = 4_433_618 'PAL color frequency
+ lpal = 4540 'PAL color cycles per line * 16
+ spal = 848 'PAL color cycles per sync * 16
+
+ paramcount = 14
+ colortable = $180 'start of colortable inside cog
+
+
+VAR
+
+ long cog
+
+
+PUB start(tvptr) : okay
+
+'' Start TV driver - starts a cog
+'' returns false if no cog available
+''
+'' tvptr = pointer to TV parameters
+
+ stop
+ okay := cog := cognew(@entry, tvptr) + 1
+
+
+PUB stop
+
+'' Stop TV driver - frees a cog
+
+ if cog
+ cogstop(cog~ - 1)
+
+
+DAT
+
+'*******************************
+'* Assembly language TV driver *
+'*******************************
+
+ org
+'
+'
+' Entry
+'
+entry mov taskptr,#tasks 'reset tasks
+
+ mov x,#10 'perform task sections initially
+:init jmpret taskret,taskptr
+ djnz x,#:init
+'
+'
+' Superfield
+'
+superfield mov taskptr,#tasks 'reset tasks
+
+ test _mode,#%0001 wc 'if ntsc, set phaseflip
+ if_nc mov phaseflip,phasemask
+
+ test _mode,#%0010 wz 'get interlace into nz
+'
+'
+' Field
+'
+field mov x,vinv 'do invisible back porch lines
+:black call #hsync 'do hsync
+ waitvid burst,sync_high2 'do black
+ jmpret taskret,taskptr 'call task section (z undisturbed)
+ djnz x,#:black 'another black line?
+
+ wrlong visible,par 'set status to visible
+
+ mov x,vb 'do visible back porch lines
+ call #blank_lines
+
+ mov screen,_screen 'point to first tile (upper-leftmost)
+ mov y,_vt 'set vertical tiles
+:line mov vx,_vx 'set vertical expand
+:vert if_z xor interlace,#1 'interlace skip?
+ if_z tjz interlace,#:skip
+
+ call #hsync 'do hsync
+
+ mov vscl,hb 'do visible back porch pixels
+ xor tile,colortable
+ waitvid tile,#0
+
+ mov x,_ht 'set horizontal tiles
+ mov vscl,hx 'set horizontal expand
+
+:tile rdword tile,screen 'read tile
+ or tile,line 'set pointer bits into tile
+ rol tile,#6 'read tile pixels
+ rdlong pixels,tile '(2 instructions between reads)
+ shr tile,#10+6 'set tile colors
+ movs :color,tile
+ add screen,#2 'point to next tile
+ mov tile,phaseflip
+:color xor tile,colortable
+ waitvid tile,pixels 'pass colors and pixels to video
+ djnz x,#:tile 'another tile?
+
+ sub screen,hc2x 'repoint to first tile in same line
+
+ mov vscl,hf 'do visible front porch pixels
+ mov tile,phaseflip
+ xor tile,colortable
+ waitvid tile,#0
+
+:skip djnz vx,#:vert 'vertical expand?
+ ror line,linerot 'set next line
+ add line,lineadd wc
+ rol line,linerot
+ if_nc jmp #:line
+ add screen,hc2x 'point to first tile in next line
+ djnz y,#:line 'another tile line?
+
+ if_z xor interlace,#1 wz 'get interlace and field1 into z
+
+ test _mode,#%0001 wc 'do visible front porch lines
+ mov x,vf
+ if_nz_and_c add x,#1
+ call #blank_lines
+
+ if_nz wrlong invisible,par 'unless interlace and field1, set status to invisible
+
+ if_z_eq_c call #hsync 'if required, do short line
+ if_z_eq_c mov vscl,hrest
+ if_z_eq_c waitvid burst,sync_high2
+ if_z_eq_c xor phaseflip,phasemask
+
+ call #vsync_high 'do high vsync pulses
+
+ movs vsync1,#sync_low1 'do low vsync pulses
+ movs vsync2,#sync_low2
+ call #vsync_low
+
+ call #vsync_high 'do high vsync pulses
+
+ if_nz mov vscl,hhalf 'if odd frame, do half line
+ if_nz waitvid burst,sync_high2
+
+ if_z jmp #field 'if interlace and field1, display field2
+ jmp #superfield 'else, new superfield
+'
+'
+' Blank lines
+'
+blank_lines call #hsync 'do hsync
+
+ xor tile,colortable 'do background
+ waitvid tile,#0
+
+ djnz x,#blank_lines
+
+blank_lines_ret ret
+'
+'
+' Horizontal sync
+'
+hsync test _mode,#%0001 wc 'if pal, toggle phaseflip
+ if_c xor phaseflip,phasemask
+
+ mov vscl,sync_scale1 'do hsync
+ mov tile,phaseflip
+ xor tile,burst
+ waitvid tile,sync_normal
+
+ mov vscl,hvis 'setup in case blank line
+ mov tile,phaseflip
+
+hsync_ret ret
+'
+'
+' Vertical sync
+'
+vsync_high movs vsync1,#sync_high1 'vertical sync
+ movs vsync2,#sync_high2
+
+vsync_low mov x,vrep
+
+vsyncx mov vscl,sync_scale1
+vsync1 waitvid burst,sync_high1
+
+ mov vscl,sync_scale2
+vsync2 waitvid burst,sync_high2
+
+ djnz x,#vsyncx
+vsync_low_ret
+vsync_high_ret ret
+'
+'
+' Tasks - performed in sections during invisible back porch lines
+'
+tasks mov t1,par 'load parameters
+ movd :par,#_enable '(skip _status)
+ mov t2,#paramcount - 1
+:load add t1,#4
+:par rdlong 0,t1
+ add :par,d0
+ djnz t2,#:load '+119
+
+ mov t1,_pins 'set video pins and directions
+ test t1,#$08 wc
+ if_nc mov t2,pins0
+ if_c mov t2,pins1
+ test t1,#$40 wc
+ shr t1,#1
+ shl t1,#3
+ shr t2,t1
+ movs vcfg,t2
+ shr t1,#6
+ movd vcfg,t1
+ shl t1,#3
+ and t2,#$FF
+ shl t2,t1
+ if_nc mov dira,t2
+ if_nc mov dirb,#0
+ if_c mov dira,#0
+ if_c mov dirb,t2 '+18
+
+ tjz _enable,#disabled '+2, disabled?
+
+ jmpret taskptr,taskret '+1=140, break and return later
+
+ movs :rd,#wtab 'load ntsc/pal metrics from word table
+ movd :wr,#hvis
+ mov t1,#wtabx - wtab
+ test _mode,#%0001 wc
+:rd mov t2,0
+ add :rd,#1
+ if_nc shl t2,#16
+ shr t2,#16
+:wr mov 0,t2
+ add :wr,d0
+ djnz t1,#:rd '+54
+
+ if_nc movs :ltab,#ltab 'load ntsc/pal metrics from long table
+ if_c movs :ltab,#ltab+1
+ movd :ltab,#fcolor
+ mov t1,#(ltabx - ltab) >> 1
+:ltab mov 0,0
+ add :ltab,d0s1
+ djnz t1,#:ltab '+17
+
+ rdlong t1,#0 'get CLKFREQ
+ shr t1,#1 'if CLKFREQ < 16MHz, cancel _broadcast
+ cmp t1,m8 wc
+ if_c mov _broadcast,#0
+ shr t1,#1 'if CLKFREQ < color frequency * 4, disable
+ cmp t1,fcolor wc
+ if_c jmp #disabled '+11
+
+ jmpret taskptr,taskret '+1=83, break and return later
+
+ mov t1,fcolor 'set ctra pll to fcolor * 16
+ call #divide 'if ntsc, set vco to fcolor * 32 (114.5454 MHz)
+ test _mode,#%0001 wc 'if pal, set vco to fcolor * 16 (70.9379 MHz)
+ if_c movi ctra,#%00001_111 'select fcolor * 16 output (ntsc=/2, pal=/1)
+ if_nc movi ctra,#%00001_110
+ if_nc shl t2,#1
+ mov frqa,t2 '+147
+
+ jmpret taskptr,taskret '+1=148, break and return later
+
+ mov t1,_broadcast 'set ctrb pll to _broadcast
+ mov t2,#0 'if 0, turn off ctrb
+ tjz t1,#:off
+ min t1,m8 'limit from 8MHz to 128MHz
+ max t1,m128
+ mov t2,#%00001_100 'adjust _broadcast to be within 4MHz-8MHz
+:scale shr t1,#1 '(vco will be within 64MHz-128MHz)
+ cmp m8,t1 wc
+ if_c add t2,#%00000_001
+ if_c jmp #:scale
+:off movi ctrb,t2
+ call #divide
+ mov frqb,t2 '+165
+
+ jmpret taskptr,taskret '+1=166, break and return later
+
+ mov t1,#%10100_000 'set video configuration
+ test _pins,#$01 wc '(swap broadcast/baseband output bits?)
+ if_c or t1,#%01000_000
+ test _mode,#%1000 wc '(strip chroma from broadcast?)
+ if_nc or t1,#%00010_000
+ test _mode,#%0100 wc '(strip chroma from baseband?)
+ if_nc or t1,#%00001_000
+ and _auralcog,#%111 '(set aural cog)
+ or t1,_auralcog
+ movi vcfg,t1 '+10
+
+ mov hx,_hx 'compute horizontal metrics
+ shl hx,#8
+ or hx,_hx
+ shl hx,#4
+
+ mov hc2x,_ht
+ shl hc2x,#1
+
+ mov t1,_ht
+ mov t2,_hx
+ call #multiply
+ mov hf,hvis
+ sub hf,t1
+ shr hf,#1 wc
+ mov hb,_ho
+ addx hb,hf
+ sub hf,_ho '+52
+
+ mov t1,_vt 'compute vertical metrics
+ mov t2,_vx
+ call #multiply
+ test _mode,#%10000 wc 'consider tile size
+ muxc linerot,#1
+ mov lineadd,lineinc
+ if_c shr lineadd,#1
+ if_c shl t1,#1
+ test _mode,#%0010 wc 'consider interlace
+ if_c shr t1,#1
+ mov vf,vvis
+ sub vf,t1
+ shr vf,#1 wc
+ neg vb,_vo
+ addx vb,vf
+ add vf,_vo '+53
+
+ xor _mode,#%0010 '+1, flip interlace bit for display
+
+:colors jmpret taskptr,taskret '+1=117/160, break and return later
+
+ mov t1,#13 'load next 13 colors into colortable
+:colorloop mov t2,:colorreg '5 times = 65 (all 64 colors loaded)
+ shr t2,#9-2
+ and t2,#$FC
+ add t2,_colors
+:colorreg rdlong colortable,t2
+ add :colorreg,d0
+ andn :colorreg,d6
+ djnz t1,#:colorloop '+158
+
+ jmp #:colors '+1, keep loading colors
+'
+'
+' Divide t1/CLKFREQ to get frqa or frqb value into t2
+'
+divide rdlong m1,#0 'get CLKFREQ
+
+ mov m2,#32+1
+:loop cmpsub t1,m1 wc
+ rcl t2,#1
+ shl t1,#1
+ djnz m2,#:loop
+
+divide_ret ret '+140
+'
+'
+' Multiply t1 * t2 * 16 (t1, t2 = bytes)
+'
+multiply shl t2,#8+4-1
+
+ mov m1,#8
+:loop shr t1,#1 wc
+ if_c add t1,t2
+ djnz m1,#:loop
+
+multiply_ret ret '+37
+'
+'
+' Disabled - reset status, nap ~4ms, try again
+'
+disabled mov ctra,#0 'reset ctra
+ mov ctrb,#0 'reset ctrb
+ mov vcfg,#0 'reset video
+
+ wrlong outa,par 'set status to disabled
+
+ rdlong t1,#0 'get CLKFREQ
+ shr t1,#8 'nap for ~4ms
+ min t1,#3
+ add t1,cnt
+ waitcnt t1,#0
+
+ jmp #entry 'reload parameters
+'
+'
+' Initialized data
+'
+m8 long 8_000_000
+m128 long 128_000_000
+d0 long 1 << 9 << 0
+d6 long 1 << 9 << 6
+d0s1 long 1 << 9 << 0 + 1 << 1
+interlace long 0
+invisible long 1
+visible long 2
+phaseflip long $00000000
+phasemask long $F0F0F0F0
+line long $00060000
+lineinc long $10000000
+linerot long 0
+pins0 long %11110000_01110000_00001111_00000111
+pins1 long %11111111_11110111_01111111_01110111
+sync_high1 long %0101010101010101010101_101010_0101
+sync_high2 long %01010101010101010101010101010101 'used for black
+sync_low1 long %1010101010101010101010101010_0101
+sync_low2 long %01_101010101010101010101010101010
+'
+'
+' NTSC/PAL metrics tables
+' ntsc pal
+' ----------------------------------------------
+wtab word lntsc - sntsc, lpal - spal 'hvis
+ word lntsc / 2 - sntsc, lpal / 2 - spal 'hrest
+ word lntsc / 2, lpal / 2 'hhalf
+ word 243, 286 'vvis
+ word 10, 18 'vinv
+ word 6, 5 'vrep
+ word $02_8A, $02_AA 'burst
+wtabx
+ltab long fntsc 'fcolor
+ long fpal
+ long sntsc >> 4 << 12 + sntsc 'sync_scale1
+ long spal >> 4 << 12 + spal
+ long 67 << 12 + lntsc / 2 - sntsc 'sync_scale2
+ long 79 << 12 + lpal / 2 - spal
+ long %0101_00000000_01_10101010101010_0101 'sync_normal
+ long %010101_00000000_01_101010101010_0101
+ltabx
+'
+'
+' Uninitialized data
+'
+taskptr res 1 'tasks
+taskret res 1
+t1 res 1
+t2 res 1
+m1 res 1
+m2 res 1
+
+x res 1 'display
+y res 1
+hf res 1
+hb res 1
+vf res 1
+vb res 1
+hx res 1
+vx res 1
+hc2x res 1
+screen res 1
+tile res 1
+pixels res 1
+lineadd res 1
+
+hvis res 1 'loaded from word table
+hrest res 1
+hhalf res 1
+vvis res 1
+vinv res 1
+vrep res 1
+burst res 1
+
+fcolor res 1 'loaded from long table
+sync_scale1 res 1
+sync_scale2 res 1
+sync_normal res 1
+'
+'
+' Parameter buffer
+'
+_enable res 1 '0/non-0 read-only
+_pins res 1 '%pppmmmm read-only
+_mode res 1 '%tccip read-only
+_screen res 1 '@word read-only
+_colors res 1 '@long read-only
+_ht res 1 '1+ read-only
+_vt res 1 '1+ read-only
+_hx res 1 '4+ read-only
+_vx res 1 '1+ read-only
+_ho res 1 '0+- read-only
+_vo res 1 '0+- read-only
+_broadcast res 1 '0+ read-only
+_auralcog res 1 '0-7 read-only
+
+ fit colortable 'fit underneath colortable ($180-$1BF)
+''
+''___
+''VAR 'TV parameters - 14 contiguous longs
+''
+'' long tv_status '0/1/2 = off/invisible/visible read-only
+'' long tv_enable '0/non-0 = off/on write-only
+'' long tv_pins '%pppmmmm = pin group, pin group mode write-only
+'' long tv_mode '%tccip = tile,chroma,interlace,ntsc/pal write-only
+'' long tv_screen 'pointer to screen (words) write-only
+'' long tv_colors 'pointer to colors (longs) write-only
+'' long tv_ht 'horizontal tiles write-only
+'' long tv_vt 'vertical tiles write-only
+'' long tv_hx 'horizontal tile expansion write-only
+'' long tv_vx 'vertical tile expansion write-only
+'' long tv_ho 'horizontal offset write-only
+'' long tv_vo 'vertical offset write-only
+'' long tv_broadcast 'broadcast frequency (Hz) write-only
+'' long tv_auralcog 'aural fm cog write-only
+''
+''The preceding VAR section may be copied into your code.
+''After setting variables, do start(@tv_status) to start driver.
+''
+''All parameters are reloaded each superframe, allowing you to make live
+''changes. To minimize flicker, correlate changes with tv_status.
+''
+''Experimentation may be required to optimize some parameters.
+''
+''Parameter descriptions:
+'' _________
+'' tv_status
+''
+'' driver sets this to indicate status:
+'' 0: driver disabled (tv_enable = 0 or CLKFREQ < requirement)
+'' 1: currently outputting invisible sync data
+'' 2: currently outputting visible screen data
+'' _________
+'' tv_enable
+''
+'' 0: disable (pins will be driven low, reduces power)
+'' non-0: enable
+'' _______
+'' tv_pins
+''
+'' bits 6..4 select pin group:
+'' %000: pins 7..0
+'' %001: pins 15..8
+'' %010: pins 23..16
+'' %011: pins 31..24
+'' %100: pins 39..32
+'' %101: pins 47..40
+'' %110: pins 55..48
+'' %111: pins 63..56
+''
+'' bits 3..0 select pin group mode:
+'' %0000: %0000_0111 - baseband
+'' %0001: %0000_0111 - broadcast
+'' %0010: %0000_1111 - baseband + chroma
+'' %0011: %0000_1111 - broadcast + aural
+'' %0100: %0111_0000 broadcast -
+'' %0101: %0111_0000 baseband -
+'' %0110: %1111_0000 broadcast + aural -
+'' %0111: %1111_0000 baseband + chroma -
+'' %1000: %0111_0111 broadcast baseband
+'' %1001: %0111_0111 baseband broadcast
+'' %1010: %0111_1111 broadcast baseband + chroma
+'' %1011: %0111_1111 baseband broadcast + aural
+'' %1100: %1111_0111 broadcast + aural baseband
+'' %1101: %1111_0111 baseband + chroma broadcast
+'' %1110: %1111_1111 broadcast + aural baseband + chroma
+'' %1111: %1111_1111 baseband + chroma broadcast + aural
+'' -----------------------------------------------------------
+'' active pins top nibble bottom nibble
+''
+'' the baseband signal nibble is arranged as:
+'' bit 3: chroma signal for s-video (attach via 560-ohm resistor)
+'' bits 2..0: baseband video (sum 270/560/1100-ohm resistors to form 75-ohm 1V signal)
+''
+'' the broadcast signal nibble is arranged as:
+'' bit 3: aural subcarrier (sum 560-ohm resistor into network below)
+'' bits 2..0: visual carrier (sum 270/560/1100-ohm resistors to form 75-ohm 1V signal)
+'' _______
+'' tv_mode
+''
+'' bit 4 selects between 16x16 and 16x32 pixel tiles:
+'' 0: 16x16 pixel tiles (tileheight = 16)
+'' 1: 16x32 pixel tiles (tileheight = 32)
+''
+'' bit 3 controls chroma mixing into broadcast:
+'' 0: mix chroma into broadcast (color)
+'' 1: strip chroma from broadcast (black/white)
+''
+'' bit 2 controls chroma mixing into baseband:
+'' 0: mix chroma into baseband (composite color)
+'' 1: strip chroma from baseband (black/white or s-video)
+''
+'' bit 1 controls interlace:
+'' 0: progressive scan (243 display lines for NTSC, 286 for PAL)
+'' less flicker, good for motion
+'' 1: interlaced scan (486 display lines for NTSC, 572 for PAL)
+'' doubles the vertical display lines, good for text
+''
+'' bit 0 selects NTSC or PAL format
+'' 0: NTSC
+'' 3016 horizontal display ticks
+'' 243 or 486 (interlaced) vertical display lines
+'' CLKFREQ must be at least 14_318_180 (4 * 3_579_545 Hz)*
+'' 1: PAL
+'' 3692 horizontal display ticks
+'' 286 or 572 (interlaced) vertical display lines
+'' CLKFREQ must be at least 17_734_472 (4 * 4_433_618 Hz)*
+''
+'' * driver will disable itself while CLKFREQ is below requirement
+'' _________
+'' tv_screen
+''
+'' pointer to words which define screen contents (left-to-right, top-to-bottom)
+'' number of words must be tv_ht * tv_vt
+'' each word has two bitfields: a 6-bit colorset ptr and a 10-bit pixelgroup ptr
+'' bits 15..10: select the colorset* for the associated pixel tile
+'' bits 9..0: select the pixelgroup** address %ppppppppppcccc00 (p=address, c=0..15)
+''
+'' * colorsets are longs which each define four 8-bit colors
+''
+'' ** pixelgroups are longs which define (left-to-right, top-to-bottom) the 2-bit
+'' (four color) pixels that make up a 16x16 or a 32x32 pixel tile
+'' _________
+'' tv_colors
+''
+'' pointer to longs which define colorsets
+'' number of longs must be 1..64
+'' each long has four 8-bit fields which define colors for 2-bit (four color) pixels
+'' first long's bottom color is also used as the screen background color
+'' 8-bit color fields are as follows:
+'' bits 7..4: chroma data (0..15 = blue..green..red..)*
+'' bit 3: controls chroma modulation (0=off, 1=on)
+'' bits 2..0: 3-bit luminance level:
+'' values 0..1: reserved for sync - don't use
+'' values 2..7: valid luminance range, modulation adds/subtracts 1 (beware of 7)
+'' value 0 may be modulated to produce a saturated color toggling between levels 1 and 7
+''
+'' * because of TV's limitations, it doesn't look good when chroma changes abruptly -
+'' rather, use luminance - change chroma only against a black or white background for
+'' best appearance
+'' _____
+'' tv_ht
+''
+'' horizontal number pixel tiles - must be at least 1
+'' practical limit is 40 for NTSC, 50 for PAL
+'' _____
+'' tv_vt
+''
+'' vertical number of pixel tiles - must be at least 1
+'' practical limit is 13 for NTSC, 15 for PAL (26/30 max for interlaced NTSC/PAL)
+'' _____
+'' tv_hx
+''
+'' horizontal tile expansion factor - must be at least 3 for NTSC, 4 for PAL
+''
+'' make sure 16 * tv_ht * tv_hx + ||tv_ho + 32 is less than the horizontal display ticks
+'' _____
+'' tv_vx
+''
+'' vertical tile expansion factor - must be at least 1
+''
+'' make sure * tv_vt * tv_vx + ||tv_vo + 1 is less than the display lines
+'' _____
+'' tv_ho
+''
+'' horizontal offset in ticks - pos/neg value (0 for centered image)
+'' shifts the display right/left
+'' _____
+'' tv_vo
+''
+'' vertical offset in lines - pos/neg value (0 for centered image)
+'' shifts the display up/down
+'' ____________
+'' tv_broadcast
+''
+'' broadcast frequency expressed in Hz (ie channel 2 is 55_250_000)
+'' if 0, modulator is turned off - saves power
+''
+'' broadcasting requires CLKFREQ to be at least 16_000_000
+'' while CLKFREQ is below 16_000_000, modulator will be turned off
+'' ___________
+'' tv_auralcog
+''
+'' selects cog to supply aural fm signal - 0..7
+'' uses ctra pll output from selected cog
+''
+'' in NTSC, the offset frequency must be 4.5MHz and the max bandwidth +-25KHz
+'' in PAL, the offset frequency and max bandwidth vary by PAL type
+
+{{
+
+┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+│ TERMS OF USE: MIT License │
+├──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
+│Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation │
+│files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, │
+│modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software│
+│is furnished to do so, subject to the following conditions: │
+│ │
+│The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.│
+│ │
+│THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE │
+│WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR │
+│COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, │
+│ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. │
+└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+}}
\ No newline at end of file
diff --git a/samples/Propeller Spin/TV_Terminal.spin b/samples/Propeller Spin/TV_Terminal.spin
new file mode 100644
index 00000000..697cd9f8
--- /dev/null
+++ b/samples/Propeller Spin/TV_Terminal.spin
@@ -0,0 +1,244 @@
+''***************************************
+''* TV Terminal v1.1 *
+''* Author: Chip Gracey *
+''* Copyright (c) 2005 Parallax, Inc. *
+''* See end of file for terms of use. *
+''***************************************
+
+{-----------------REVISION HISTORY-----------------
+ v1.1 - Updated 5/15/2006 to use actual pin number, instead of pin group, for Start method's basepin parameter.}
+
+CON
+
+ x_tiles = 16
+ y_tiles = 13
+
+ x_screen = x_tiles << 4
+ y_screen = y_tiles << 4
+
+ width = 0 '0 = minimum
+ x_scale = 1 '1 = minimum
+ y_scale = 1 '1 = minimum
+ x_spacing = 6 '6 = normal
+ y_spacing = 13 '13 = normal
+
+ x_chr = x_scale * x_spacing
+ y_chr = y_scale * y_spacing
+
+ y_offset = y_spacing / 6 + y_chr - 1
+
+ x_limit = x_screen / (x_scale * x_spacing)
+ y_limit = y_screen / (y_scale * y_spacing)
+ y_max = y_limit - 1
+
+ y_screen_bytes = y_screen << 2
+ y_scroll = y_chr << 2
+ y_scroll_longs = y_chr * y_max
+ y_clear = y_scroll_longs << 2
+ y_clear_longs = y_screen - y_scroll_longs
+
+ paramcount = 14
+
+
+VAR
+
+ long x, y, bitmap_base
+
+ long tv_status '0/1/2 = off/visible/invisible read-only
+ long tv_enable '0/? = off/on write-only
+ long tv_pins '%ppmmm = pins write-only
+ long tv_mode '%ccinp = chroma,interlace,ntsc/pal,swap write-only
+ long tv_screen 'pointer to screen (words) write-only
+ long tv_colors 'pointer to colors (longs) write-only
+ long tv_hc 'horizontal cells write-only
+ long tv_vc 'vertical cells write-only
+ long tv_hx 'horizontal cell expansion write-only
+ long tv_vx 'vertical cell expansion write-only
+ long tv_ho 'horizontal offset write-only
+ long tv_vo 'vertical offset write-only
+ long tv_broadcast 'broadcast frequency (Hz) write-only
+ long tv_auralcog 'aural fm cog write-only
+
+ long bitmap[x_tiles * y_tiles << 4 + 16] 'add 16 longs to allow for 64-byte alignment
+ word screen[x_tiles * y_tiles]
+
+
+OBJ
+
+ tv : "tv"
+ gr : "graphics"
+
+
+PUB start(basepin)
+
+'' Start terminal
+''
+'' basepin = first of three pins on a 4-pin boundary (0, 4, 8...) to have
+'' 1.1k, 560, and 270 ohm resistors connected and summed to form the 1V,
+'' 75 ohm DAC for baseband video
+
+ 'init bitmap and tile screen
+ bitmap_base := (@bitmap + $3F) & $7FC0
+ repeat x from 0 to x_tiles - 1
+ repeat y from 0 to y_tiles - 1
+ screen[y * x_tiles + x] := bitmap_base >> 6 + y + x * y_tiles
+
+ 'start tv
+ tvparams_pins := (basepin & $38) << 1 | (basepin & 4 == 4) & %0101
+ longmove(@tv_status, @tvparams, paramcount)
+ tv_screen := @screen
+ tv_colors := @color_schemes
+ tv.start(@tv_status)
+
+ 'start graphics
+ gr.start
+ gr.setup(x_tiles, y_tiles, 0, y_screen, bitmap_base)
+ gr.textmode(x_scale, y_scale, x_spacing, 0)
+ gr.width(width)
+ out(0)
+
+
+PUB stop
+
+'' Stop terminal
+
+ tv.stop
+ gr.stop
+
+
+PUB out(c)
+
+'' Print a character
+''
+'' $00 = home
+'' $01..$03 = color
+'' $04..$07 = color schemes
+'' $09 = tab
+'' $0D = return
+'' $20..$7E = character
+
+ case c
+
+ $00: 'home?
+ gr.clear
+ x := y := 0
+
+ $01..$03: 'color?
+ gr.color(c)
+
+ $04..$07: 'color scheme?
+ tv_colors := @color_schemes[c & 3]
+
+ $09: 'tab?
+ repeat
+ out($20)
+ while x & 7
+
+ $0D: 'return?
+ newline
+
+ $20..$7E: 'character?
+ gr.text(x * x_chr, -y * y_chr - y_offset, @c)
+ gr.finish
+ if ++x == x_limit
+ newline
+
+
+PUB str(string_ptr)
+
+'' Print a zero-terminated string
+
+ repeat strsize(string_ptr)
+ out(byte[string_ptr++])
+
+
+PUB dec(value) | i
+
+'' Print a decimal number
+
+ if value < 0
+ -value
+ out("-")
+
+ i := 1_000_000_000
+
+ repeat 10
+ if value => i
+ out(value / i + "0")
+ value //= i
+ result~~
+ elseif result or i == 1
+ out("0")
+ i /= 10
+
+
+PUB hex(value, digits)
+
+'' Print a hexadecimal number
+
+ value <<= (8 - digits) << 2
+ repeat digits
+ out(lookupz((value <-= 4) & $F : "0".."9", "A".."F"))
+
+
+PUB bin(value, digits)
+
+'' Print a binary number
+
+ value <<= 32 - digits
+ repeat digits
+ out((value <-= 1) & 1 + "0")
+
+
+PRI newline
+
+ if ++y == y_limit
+ gr.finish
+ repeat x from 0 to x_tiles - 1
+ y := bitmap_base + x * y_screen_bytes
+ longmove(y, y + y_scroll, y_scroll_longs)
+ longfill(y + y_clear, 0, y_clear_longs)
+ y := y_max
+ x := 0
+
+
+DAT
+
+tvparams long 0 'status
+ long 1 'enable
+tvparams_pins long %001_0101 'pins
+ long %0000 'mode
+ long 0 'screen
+ long 0 'colors
+ long x_tiles 'hc
+ long y_tiles 'vc
+ long 10 'hx
+ long 1 'vx
+ long 0 'ho
+ long 0 'vo
+ long 55_250_000 'broadcast
+ long 0 'auralcog
+
+color_schemes long $BC_6C_05_02
+ long $0E_0D_0C_0A
+ long $6E_6D_6C_6A
+ long $BE_BD_BC_BA
+
+{{
+
+┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+│ TERMS OF USE: MIT License │
+├──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
+│Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation │
+│files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, │
+│modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software│
+│is furnished to do so, subject to the following conditions: │
+│ │
+│The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.│
+│ │
+│THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE │
+│WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR │
+│COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, │
+│ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. │
+└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+}}
\ No newline at end of file
diff --git a/samples/Propeller Spin/TV_Text.spin b/samples/Propeller Spin/TV_Text.spin
new file mode 100644
index 00000000..160ffc97
--- /dev/null
+++ b/samples/Propeller Spin/TV_Text.spin
@@ -0,0 +1,232 @@
+''***************************************
+''* TV Text 40x13 v1.0 *
+''* Author: Chip Gracey *
+''* Copyright (c) 2006 Parallax, Inc. *
+''* See end of file for terms of use. *
+''***************************************
+
+CON
+
+ cols = 40
+ rows = 13
+
+ screensize = cols * rows
+ lastrow = screensize - cols
+
+ tv_count = 14
+
+
+VAR
+
+ long col, row, color, flag
+
+ word screen[screensize]
+ long colors[8 * 2]
+
+ long tv_status '0/1/2 = off/invisible/visible read-only (14 longs)
+ long tv_enable '0/non-0 = off/on write-only
+ long tv_pins '%pppmmmm = pin group, pin group mode write-only
+ long tv_mode '%tccip = tile,chroma,interlace,ntsc/pal write-only
+ long tv_screen 'pointer to screen (words) write-only
+ long tv_colors 'pointer to colors (longs) write-only
+ long tv_ht 'horizontal tiles write-only
+ long tv_vt 'vertical tiles write-only
+ long tv_hx 'horizontal tile expansion write-only
+ long tv_vx 'vertical tile expansion write-only
+ long tv_ho 'horizontal offset write-only
+ long tv_vo 'vertical offset write-only
+ long tv_broadcast 'broadcast frequency (Hz) write-only
+ long tv_auralcog 'aural fm cog write-only
+
+
+OBJ
+
+ tv : "tv"
+
+
+PUB start(basepin) : okay
+
+'' Start terminal - starts a cog
+'' returns false if no cog available
+
+ setcolors(@palette)
+ out(0)
+
+ longmove(@tv_status, @tv_params, tv_count)
+ tv_pins := (basepin & $38) << 1 | (basepin & 4 == 4) & %0101
+ tv_screen := @screen
+ tv_colors := @colors
+
+ okay := tv.start(@tv_status)
+
+
+PUB stop
+
+'' Stop terminal - frees a cog
+
+ tv.stop
+
+
+PUB str(stringptr)
+
+'' Print a zero-terminated string
+
+ repeat strsize(stringptr)
+ out(byte[stringptr++])
+
+
+PUB dec(value) | i
+
+'' Print a decimal number
+
+ if value < 0
+ -value
+ out("-")
+
+ i := 1_000_000_000
+
+ repeat 10
+ if value => i
+ out(value / i + "0")
+ value //= i
+ result~~
+ elseif result or i == 1
+ out("0")
+ i /= 10
+
+
+PUB hex(value, digits)
+
+'' Print a hexadecimal number
+
+ value <<= (8 - digits) << 2
+ repeat digits
+ out(lookupz((value <-= 4) & $F : "0".."9", "A".."F"))
+
+
+PUB bin(value, digits)
+
+'' Print a binary number
+
+ value <<= 32 - digits
+ repeat digits
+ out((value <-= 1) & 1 + "0")
+
+
+PUB out(c) | i, k
+
+'' Output a character
+''
+'' $00 = clear screen
+'' $01 = home
+'' $08 = backspace
+'' $09 = tab (8 spaces per)
+'' $0A = set X position (X follows)
+'' $0B = set Y position (Y follows)
+'' $0C = set color (color follows)
+'' $0D = return
+'' others = printable characters
+
+ case flag
+ $00: case c
+ $00: wordfill(@screen, $220, screensize)
+ col := row := 0
+ $01: col := row := 0
+ $08: if col
+ col--
+ $09: repeat
+ print(" ")
+ while col & 7
+ $0A..$0C: flag := c
+ return
+ $0D: newline
+ other: print(c)
+ $0A: col := c // cols
+ $0B: row := c // rows
+ $0C: color := c & 7
+ flag := 0
+
+
+PUB setcolors(colorptr) | i, fore, back
+
+'' Override default color palette
+'' colorptr must point to a list of up to 8 colors
+'' arranged as follows:
+''
+'' fore back
+'' ------------
+'' palette byte color, color 'color 0
+'' byte color, color 'color 1
+'' byte color, color 'color 2
+'' ...
+
+ repeat i from 0 to 7
+ fore := byte[colorptr][i << 1]
+ back := byte[colorptr][i << 1 + 1]
+ colors[i << 1] := fore << 24 + back << 16 + fore << 8 + back
+ colors[i << 1 + 1] := fore << 24 + fore << 16 + back << 8 + back
+
+
+PRI print(c)
+
+ screen[row * cols + col] := (color << 1 + c & 1) << 10 + $200 + c & $FE
+ if ++col == cols
+ newline
+
+
+PRI newline | i
+
+ col := 0
+ if ++row == rows
+ row--
+ wordmove(@screen, @screen[cols], lastrow) 'scroll lines
+ wordfill(@screen[lastrow], $220, cols) 'clear new line
+
+
+DAT
+
+tv_params long 0 'status
+ long 1 'enable
+ long 0 'pins
+ long %10010 'mode
+ long 0 'screen
+ long 0 'colors
+ long cols 'hc
+ long rows 'vc
+ long 4 'hx
+ long 1 'vx
+ long 0 'ho
+ long 0 'vo
+ long 0 'broadcast
+ long 0 'auralcog
+
+
+ ' fore back
+ ' color color
+palette byte $07, $0A '0 white / dark blue
+ byte $07, $BB '1 white / red
+ byte $9E, $9B '2 yellow / brown
+ byte $04, $07 '3 grey / white
+ byte $3D, $3B '4 cyan / dark cyan
+ byte $6B, $6E '5 green / gray-green
+ byte $BB, $CE '6 red / pink
+ byte $3C, $0A '7 cyan / blue
+
+{{
+
+┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+│ TERMS OF USE: MIT License │
+├──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
+│Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation │
+│files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, │
+│modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software│
+│is furnished to do so, subject to the following conditions: │
+│ │
+│The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.│
+│ │
+│THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE │
+│WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR │
+│COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, │
+│ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. │
+└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+}}
\ No newline at end of file
diff --git a/samples/Propeller Spin/VGA.spin b/samples/Propeller Spin/VGA.spin
new file mode 100644
index 00000000..ef14d2c4
--- /dev/null
+++ b/samples/Propeller Spin/VGA.spin
@@ -0,0 +1,596 @@
+''***************************************
+''* VGA Driver v1.1 *
+''* Author: Chip Gracey *
+''* Copyright (c) 2006 Parallax, Inc. *
+''* See end of file for terms of use. *
+''***************************************
+
+' v1.0 - 01 May 2006 - original version
+' v1.1 - 15 May 2006 - pixel tile size can now be 16 x 32 to enable more efficient
+' character displays utilizing the internal font - see 'vga_mode'
+
+CON
+
+ paramcount = 21
+ colortable = $180 'start of colortable inside cog
+
+
+VAR
+
+ long cog
+
+
+PUB start(vgaptr) : okay
+
+'' Start VGA driver - starts a cog
+'' returns false if no cog available
+''
+'' vgaptr = pointer to VGA parameters
+
+ stop
+ okay := cog := cognew(@entry, vgaptr) + 1
+
+
+PUB stop
+
+'' Stop VGA driver - frees a cog
+
+ if cog
+ cogstop(cog~ - 1)
+
+
+DAT
+
+'********************************
+'* Assembly language VGA driver *
+'********************************
+
+ org
+'
+'
+' Entry
+'
+entry mov taskptr,#tasks 'reset tasks
+
+ mov x,#8 'perform task sections initially
+:init jmpret taskret,taskptr
+ djnz x,#:init
+'
+'
+' Superfield
+'
+superfield mov hv,hvbase 'set hv
+
+ mov interlace,#0 'reset interlace
+
+ test _mode,#%0100 wz 'get interlace into nz
+'
+'
+' Field
+'
+field wrlong visible,par 'set status to visible
+
+ tjz vb,#:nobl 'do any visible back porch lines
+ mov x,vb
+ movd bcolor,#colortable
+ call #blank_line
+:nobl
+ mov screen,_screen 'point to first tile (upper-leftmost)
+ mov y,_vt 'set vertical tiles
+:line mov vx,_vx 'set vertical expand
+:vert if_nz xor interlace,#1 'interlace skip?
+ if_nz tjz interlace,#:skip
+
+ tjz hb,#:nobp 'do any visible back porch pixels
+ mov vscl,hb
+ waitvid colortable,#0
+:nobp
+ mov x,_ht 'set horizontal tiles
+ mov vscl,hx 'set horizontal expand
+
+:tile rdword tile,screen 'read tile
+ add tile,line 'set pointer bits into tile
+ rol tile,#6 'read tile pixels
+ rdlong pixels,tile '(8 clocks between reads)
+ shr tile,#10+6 'set tile colors
+ movd :color,tile
+ add screen,#2 'point to next tile
+:color waitvid colortable,pixels 'pass colors and pixels to video
+ djnz x,#:tile 'another tile?
+
+ sub screen,hc2x 'repoint to first tile in same line
+
+ tjz hf,#:nofp 'do any visible front porch pixels
+ mov vscl,hf
+ waitvid colortable,#0
+:nofp
+ mov x,#1 'do hsync
+ call #blank_hsync '(x=0)
+
+:skip djnz vx,#:vert 'vertical expand?
+ ror line,linerot 'set next line
+ add line,lineadd wc
+ rol line,linerot
+ if_nc jmp #:line
+ add screen,hc2x 'point to first tile in next line
+ djnz y,#:line wc 'another tile line? (c=0)
+
+ tjz vf,#:nofl 'do any visible front porch lines
+ mov x,vf
+ movd bcolor,#colortable
+ call #blank_line
+:nofl
+ if_nz xor interlace,#1 wc,wz 'get interlace and field1 into nz (c=0/?)
+
+ if_z wrlong invisible,par 'unless interlace and field1, set status to invisible
+
+ mov taskptr,#tasks 'reset tasks
+
+ addx x,_vf wc 'do invisible front porch lines (x=0 before, c=0 after)
+ call #blank_line
+
+ mov x,_vs 'do vsync lines
+ call #blank_vsync
+
+ mov x,_vb 'do invisible back porch lines, except last
+ call #blank_vsync
+
+ if_nz jmp #field 'if interlace and field1, display field2
+ jmp #superfield 'else, new superfield
+'
+'
+' Blank line(s)
+'
+blank_vsync cmp interlace,#2 wc 'vsync (c=1)
+
+blank_line mov vscl,h1 'blank line or vsync-interlace?
+ if_nc add vscl,h2
+ if_c_and_nz xor hv,#%01
+ if_c waitvid hv,#0
+ if_c mov vscl,h2 'blank line or vsync-normal?
+ if_c_and_z xor hv,#%01
+bcolor waitvid hv,#0
+
+ if_nc jmpret taskret,taskptr 'call task section (z undisturbed)
+
+blank_hsync mov vscl,_hf 'hsync, do invisible front porch pixels
+ waitvid hv,#0
+
+ mov vscl,_hs 'do invisble sync pixels
+ xor hv,#%10
+ waitvid hv,#0
+
+ mov vscl,_hb 'do invisible back porch pixels
+ xor hv,#%10
+ waitvid hv,#0
+
+ djnz x,#blank_line wc '(c=0)
+
+ movd bcolor,#hv
+blank_hsync_ret
+blank_line_ret
+blank_vsync_ret ret
+'
+'
+' Tasks - performed in sections during invisible back porch lines
+'
+tasks mov t1,par 'load parameters
+ movd :par,#_enable '(skip _status)
+ mov t2,#paramcount - 1
+:load add t1,#4
+:par rdlong 0,t1
+ add :par,d0
+ djnz t2,#:load '+164
+
+ mov t1,#2 'set video pins and directions
+ shl t1,_pins '(if video disabled, pins will drive low)
+ sub t1,#1
+ test _pins,#$20 wc
+ and _pins,#$38
+ shr t1,_pins
+ movs vcfg,t1
+ shl t1,_pins
+ shr _pins,#3
+ movd vcfg,_pins
+ if_nc mov dira,t1
+ if_nc mov dirb,#0
+ if_c mov dira,#0
+ if_c mov dirb,t1 '+14
+
+ tjz _enable,#disabled '+2, disabled?
+
+ jmpret taskptr,taskret '+1=181, break and return later
+
+ rdlong t1,#0 'make sure CLKFREQ => 16MHz
+ shr t1,#1
+ cmp t1,m8 wc
+ if_c jmp #disabled '+8
+
+ min _rate,pllmin 'limit _rate to pll range
+ max _rate,pllmax '+2
+
+ mov t1,#%00001_011 'set ctra configuration
+:max cmp m8,_rate wc 'adjust rate to be within 4MHz-8MHz
+ if_c shr _rate,#1 '(vco will be within 64MHz-128MHz)
+ if_c add t1,#%00000_001
+ if_c jmp #:max
+:min cmp _rate,m4 wc
+ if_c shl _rate,#1
+ if_c sub x,#%00000_001
+ if_c jmp #:min
+ movi ctra,t1 '+22
+
+ rdlong t1,#0 'divide _rate/CLKFREQ and set frqa
+ mov hvbase,#32+1
+:div cmpsub _rate,t1 wc
+ rcl t2,#1
+ shl _rate,#1
+ djnz hvbase,#:div '(hvbase=0)
+ mov frqa,t2 '+136
+
+ test _mode,#%0001 wc 'make hvbase
+ muxnc hvbase,vmask
+ test _mode,#%0010 wc
+ muxnc hvbase,hmask '+4
+
+ jmpret taskptr,taskret '+1=173, break and return later
+
+ mov hx,_hx 'compute horizontal metrics
+ shl hx,#8
+ or hx,_hx
+ shl hx,#4
+
+ mov hc2x,_ht
+ shl hc2x,#1
+
+ mov h1,_hd
+ neg h2,_hf
+ sub h2,_hs
+ sub h2,_hb
+ sub h1,h2
+ shr h1,#1 wc
+ addx h2,h1
+
+ mov t1,_ht
+ mov t2,_hx
+ call #multiply
+ mov hf,_hd
+ sub hf,t1
+ shr hf,#1 wc
+ mov hb,_ho
+ addx hb,hf
+ sub hf,_ho '+59
+
+ mov t1,_vt 'compute vertical metrics
+ mov t2,_vx
+ call #multiply
+ test _mode,#%1000 wc 'consider tile size
+ muxc linerot,#1
+ mov lineadd,lineinc
+ if_c shr lineadd,#1
+ if_c shl t1,#1
+ test _mode,#%0100 wc 'consider interlace
+ if_c shr t1,#1
+ mov vf,_vd
+ sub vf,t1
+ shr vf,#1 wc
+ neg vb,_vo
+ addx vb,vf
+ add vf,_vo '+53
+
+ movi vcfg,#%01100_000 '+1, set video configuration
+
+:colors jmpret taskptr,taskret '+1=114/160, break and return later
+
+ mov t1,#13 'load next 13 colors into colortable
+:loop mov t2,:color '5 times = 65 (all 64 colors loaded)
+ shr t2,#9-2
+ and t2,#$FC
+ add t2,_colors
+ rdlong t2,t2
+ and t2,colormask
+ or t2,hvbase
+:color mov colortable,t2
+ add :color,d0
+ andn :color,d6
+ djnz t1,#:loop '+158
+
+ jmp #:colors '+1, keep loading colors
+'
+'
+' Multiply t1 * t2 * 16 (t1, t2 = bytes)
+'
+multiply shl t2,#8+4-1
+
+ mov tile,#8
+:loop shr t1,#1 wc
+ if_c add t1,t2
+ djnz tile,#:loop
+
+multiply_ret ret '+37
+'
+'
+' Disabled - reset status, nap ~4ms, try again
+'
+disabled mov ctra,#0 'reset ctra
+ mov vcfg,#0 'reset video
+
+ wrlong outa,par 'set status to disabled
+
+ rdlong t1,#0 'get CLKFREQ
+ shr t1,#8 'nap for ~4ms
+ min t1,#3
+ add t1,cnt
+ waitcnt t1,#0
+
+ jmp #entry 'reload parameters
+'
+'
+' Initialized data
+'
+pllmin long 500_000 'pll lowest output frequency
+pllmax long 128_000_000 'pll highest output frequency
+m8 long 8_000_000 '*16 = 128MHz (pll vco max)
+m4 long 4_000_000 '*16 = 64MHz (pll vco min)
+d0 long 1 << 9 << 0
+d6 long 1 << 9 << 6
+invisible long 1
+visible long 2
+line long $00060000
+lineinc long $10000000
+linerot long 0
+vmask long $01010101
+hmask long $02020202
+colormask long $FCFCFCFC
+'
+'
+' Uninitialized data
+'
+taskptr res 1 'tasks
+taskret res 1
+t1 res 1
+t2 res 1
+
+x res 1 'display
+y res 1
+hf res 1
+hb res 1
+vf res 1
+vb res 1
+hx res 1
+vx res 1
+hc2x res 1
+screen res 1
+tile res 1
+pixels res 1
+lineadd res 1
+interlace res 1
+hv res 1
+hvbase res 1
+h1 res 1
+h2 res 1
+'
+'
+' Parameter buffer
+'
+_enable res 1 '0/non-0 read-only
+_pins res 1 '%pppttt read-only
+_mode res 1 '%tihv read-only
+_screen res 1 '@word read-only
+_colors res 1 '@long read-only
+_ht res 1 '1+ read-only
+_vt res 1 '1+ read-only
+_hx res 1 '1+ read-only
+_vx res 1 '1+ read-only
+_ho res 1 '0+- read-only
+_vo res 1 '0+- read-only
+_hd res 1 '1+ read-only
+_hf res 1 '1+ read-only
+_hs res 1 '1+ read-only
+_hb res 1 '1+ read-only
+_vd res 1 '1+ read-only
+_vf res 1 '1+ read-only
+_vs res 1 '1+ read-only
+_vb res 1 '2+ read-only
+_rate res 1 '500_000+ read-only
+
+ fit colortable 'fit underneath colortable ($180-$1BF)
+
+
+''
+''___
+''VAR 'VGA parameters - 21 contiguous longs
+''
+'' long vga_status '0/1/2 = off/visible/invisible read-only
+'' long vga_enable '0/non-0 = off/on write-only
+'' long vga_pins '%pppttt = pins write-only
+'' long vga_mode '%tihv = tile,interlace,hpol,vpol write-only
+'' long vga_screen 'pointer to screen (words) write-only
+'' long vga_colors 'pointer to colors (longs) write-only
+'' long vga_ht 'horizontal tiles write-only
+'' long vga_vt 'vertical tiles write-only
+'' long vga_hx 'horizontal tile expansion write-only
+'' long vga_vx 'vertical tile expansion write-only
+'' long vga_ho 'horizontal offset write-only
+'' long vga_vo 'vertical offset write-only
+'' long vga_hd 'horizontal display ticks write-only
+'' long vga_hf 'horizontal front porch ticks write-only
+'' long vga_hs 'horizontal sync ticks write-only
+'' long vga_hb 'horizontal back porch ticks write-only
+'' long vga_vd 'vertical display lines write-only
+'' long vga_vf 'vertical front porch lines write-only
+'' long vga_vs 'vertical sync lines write-only
+'' long vga_vb 'vertical back porch lines write-only
+'' long vga_rate 'tick rate (Hz) write-only
+''
+''The preceding VAR section may be copied into your code.
+''After setting variables, do start(@vga_status) to start driver.
+''
+''All parameters are reloaded each superframe, allowing you to make live
+''changes. To minimize flicker, correlate changes with vga_status.
+''
+''Experimentation may be required to optimize some parameters.
+''
+''Parameter descriptions:
+'' __________
+'' vga_status
+''
+'' driver sets this to indicate status:
+'' 0: driver disabled (vga_enable = 0 or CLKFREQ < 16MHz)
+'' 1: currently outputting invisible sync data
+'' 2: currently outputting visible screen data
+'' __________
+'' vga_enable
+''
+'' 0: disable (pins will be driven low, reduces power)
+'' non-0: enable
+'' ________
+'' vga_pins
+''
+'' bits 5..3 select pin group:
+'' %000: pins 7..0
+'' %001: pins 15..8
+'' %010: pins 23..16
+'' %011: pins 31..24
+'' %100: pins 39..32
+'' %101: pins 47..40
+'' %110: pins 55..48
+'' %111: pins 63..56
+''
+'' bits 2..0 select top pin within group
+'' for example: %01111 (15) will use pins %01000-%01111 (8-15)
+'' ________
+'' vga_mode
+''
+'' bit 3 selects between 16x16 and 16x32 pixel tiles:
+'' 0: 16x16 pixel tiles (tileheight = 16)
+'' 1: 16x32 pixel tiles (tileheight = 32)
+''
+'' bit 2 controls interlace:
+'' 0: progressive scan (less flicker, good for motion, required for LCD monitors)
+'' 1: interlaced scan (allows you to double vga_vt, good for text)
+''
+'' bits 1 and 0 select horizontal and vertical sync polarity, respectively
+'' 0: active low
+'' 1: active high
+'' __________
+'' vga_screen
+''
+'' pointer to words which define screen contents (left-to-right, top-to-bottom)
+'' number of words must be vga_ht * vga_vt
+'' each word has two bitfields: a 6-bit colorset ptr and a 10-bit pixelgroup ptr
+'' bits 15..10: select the colorset* for the associated pixel tile
+'' bits 9..0: select the pixelgroup** address %ppppppppppcccc00 (p=address, c=0..15)
+''
+'' * colorsets are longs which each define four 8-bit colors
+''
+'' ** pixelgroups are longs which define (left-to-right, top-to-bottom) the 2-bit
+'' (four color) pixels that make up a 16x16 or a 16x32 pixel tile
+'' __________
+'' vga_colors
+''
+'' pointer to longs which define colorsets
+'' number of longs must be 1..64
+'' each long has four 8-bit fields which define colors for 2-bit (four color) pixels
+'' first long's bottom color is also used as the screen background color
+'' 8-bit color fields are as follows:
+'' bits 7..2: actual state of pins 7..2 within pin group*
+'' bits 1..0: don't care (used within driver for hsync and vsync)
+''
+'' * it is suggested that:
+'' bits/pins 7..6 are used for red
+'' bits/pins 5..4 are used for green
+'' bits/pins 3..2 are used for blue
+'' for each bit/pin set, sum 240 and 470-ohm resistors to form 75-ohm 1V signals
+'' connect signal sets to RED, GREEN, and BLUE on VGA connector
+'' always connect group pin 1 to HSYNC on VGA connector via 240-ohm resistor
+'' always connect group pin 0 to VSYNC on VGA connector via 240-ohm resistor
+'' ______
+'' vga_ht
+''
+'' horizontal number of pixel tiles - must be at least 1
+'' ______
+'' vga_vt
+''
+'' vertical number of pixel tiles - must be at least 1
+'' ______
+'' vga_hx
+''
+'' horizontal tile expansion factor - must be at least 1
+''
+'' make sure 16 * vga_ht * vga_hx + ||vga_ho is equal to or at least 16 less than vga_hd
+'' ______
+'' vga_vx
+''
+'' vertical tile expansion factor - must be at least 1
+''
+'' make sure * vga_vt * vga_vx + ||vga_vo does not exceed vga_vd
+'' (for interlace, use / 2 * vga_vt * vga_vx + ||vga_vo)
+'' ______
+'' vga_ho
+''
+'' horizontal offset in ticks - pos/neg value (0 recommended)
+'' shifts the display right/left
+'' ______
+'' vga_vo
+''
+'' vertical offset in lines - pos/neg value (0 recommended)
+'' shifts the display up/down
+'' ______
+'' vga_hd
+''
+'' horizontal display ticks
+'' ______
+'' vga_hf
+''
+'' horizontal front porch ticks
+'' ______
+'' vga_hs
+''
+'' horizontal sync ticks
+'' ______
+'' vga_hb
+''
+'' horizontal back porch ticks
+'' ______
+'' vga_vd
+''
+'' vertical display lines
+'' ______
+'' vga_vf
+''
+'' vertical front porch lines
+'' ______
+'' vga_vs
+''
+'' vertical sync lines
+'' ______
+'' vga_vb
+''
+'' vertical back porch lines
+'' ________
+'' vga_rate
+''
+'' tick rate in Hz
+''
+'' driver will limit value to be within 500KHz and 128MHz
+'' pixel rate (vga_rate / vga_hx) should be no more than CLKFREQ / 4
+
+{{
+
+┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+│ TERMS OF USE: MIT License │
+├──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
+│Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation │
+│files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, │
+│modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software│
+│is furnished to do so, subject to the following conditions: │
+│ │
+│The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.│
+│ │
+│THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE │
+│WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR │
+│COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, │
+│ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. │
+└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+}}
\ No newline at end of file
diff --git a/samples/Propeller Spin/VocalTract.spin b/samples/Propeller Spin/VocalTract.spin
new file mode 100644
index 00000000..c70a75b9
--- /dev/null
+++ b/samples/Propeller Spin/VocalTract.spin
@@ -0,0 +1,737 @@
+{{
+┌───────────────────────────────────────────┬────────────────┬───────────────────────────────────┬─────────────────┐
+│ Vocal Tract v1.1 │ by Chip Gracey │ Copyright (c) 2006 Parallax, Inc. │ 28 October 2006 │
+├───────────────────────────────────────────┴────────────────┴───────────────────────────────────┴─────────────────┤
+│ │
+│ This object synthesizes a human vocal tract in real-time. It requires one cog and at least 80 MHz. │
+│ │
+│ The vocal tract is controlled via 13 single-byte parameters which must reside in the parent object: │
+│ │
+│ VAR byte aa,ga,gp,vp,vr,f1,f2,f3,f4,na,nf,fa,ff 'vocal tract parameters │
+│ │
+│ │
+│ aa │
+│ ┌────────────┐ │
+│ │ ASPIRATION ├──┐ │
+│ └────────────┘ │ f1 f2 f3 f4 na nf │
+│ ┌────┐ ┌────┐ ┌────┐ ┌────┐ ┌───────┐ │
+│ +┣──┤ F1 ├──┤ F2 ├──┤ F3 ├──┤ F4 ├──┤ NASAL ├──┐ │
+│ ga gp └────┘ └────┘ └────┘ └────┘ └───────┘ │ │
+│ ┌─────────┐ │ │
+│ │ GLOTTAL ├──┘ +┣── OUTPUT │
+│ └────┬────┘ fa ff │
+│ ┌───────────┐ │ │
+│ vp │ vr │ FRICATION ├──┘ │
+│ ┌────┴────┐ └───────────┘ │
+│ │ VIBRATO │ │
+│ └─────────┘ │
+│ │
+│ │
+│ ┌───────────┬──────────────────────┬─────────────┬────────────────────────────────────────────────┐ │
+│ │ parameter │ description │ unit │ notes │ │
+│ ├───────────┼──────────────────────┼─────────────┼────────────────────────────────────────────────┤ │
+│ │ aa │ aspiration amplitude │ 0..255 │ breath volume: silent..loud, linear │ │
+│ │ ga │ glottal amplitude │ 0..255 │ voice volume: silent..loud, linear │ │
+│ │ gp │ glottal pitch │ 1/48 octave │ voice pitch: 100 ─ 110.00Hz (musical note A2) │ │
+│ │ vp │ vibrato pitch │ 1/48 octave │ voice vibrato pitch: 48 ─ ± 1/2 octave swing │ │
+│ │ vr │ vibrato rate │ 0.0763 Hz │ voice vibrato rate: 52 ─ 4 Hz │ │
+│ │ f1 │ formant1 frequency │ 19.53 Hz │ 1st resonator frequency: 40 ─ 781 Hz │ │
+│ │ f2 │ formant2 frequency │ 19.53 Hz │ 2nd resonator frequency: 56 ─ 1094 Hz │ │
+│ │ f3 │ formant3 frequency │ 19.53 Hz │ 3rd resonator frequency: 128 ─ 2500 Hz │ │
+│ │ f4 │ formant4 frequency │ 19.53 Hz │ 4th resonator frequency: 179 ─ 3496 Hz │ │
+│ │ na │ nasal amplitude │ 0..255 │ anti-resonator level: off..on, linear │ │
+│ │ nf │ nasal frequency │ 19.53 Hz │ anti-resonator frequency: 102 ─ 1992 Hz │ │
+│ │ fa │ frication amplitude │ 0..255 │ white noise volume: silent..loud, linear │ │
+│ │ ff │ frication frequency │ 39.06 Hz │ white noise frequency: 60 ─ 2344 Hz ("Sh") │ │
+│ └───────────┴──────────────────────┴─────────────┴────────────────────────────────────────────────┘ │
+│ │
+│ The parent object alternately modifies one or more of these parameters and then calls the go(time) method to │
+│ queue the entire 13-parameter frame for feeding to the vocal tract. The vocal tract will load one queued frame │
+│ after another and smoothly interpolate between them over specified amounts of time without interruption. Up to │
+│ eight frames will be queued in order to relax the frame-generation timing requirement of the parent object. If │
+│ eight frames are queued, the parent must then wait to queue another frame. If the vocal tract runs out of │
+│ frames, it will continue generating samples based on the last frame. When a new frame is queued, it will │
+│ immediately load it and begin inter-polating towards it. │
+│ │
+│ The vocal tract generates audio samples at a continuous rate of 20KHz. These samples can be output to pins via │
+│ delta-modulation for RC filtering or direct transducer driving. An FM aural subcarrier can also be generated for │
+│ inclusion into a TV broadcast controlled by another cog. Regardless of any output mode, samples are always │
+│ streamed into a special variable so that other objects can access them in real-time. │
+│ │
+│ In order to achieve optimal sound quality, it is worthwhile to maximize amplitudes such as 'ga' to the point │
+│ just shy of numerical overflow. Numerical overflow results in high-amplitude noise bursts which are quite │
+│ disruptive. The closeness of 'f1'-'f4' and their relationship to 'gp' can greatly influence the amount of 'ga' │
+│ that can be applied before overflow occurs. You must determine through experimentation what the limits are. By │
+│ pushing 'ga' close to the overflow point, you will maximize the signal-to-noise ratio of the vocal tract, │
+│ resulting in the highest quality sound. Once your vocal tract programming is complete, the attenuation level │
+│ can then be used to reduce the overall output in 3dB steps while preserving the signal-to-noise ratio. │
+│ │
+├──────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
+│ Revision History v1.0 released 26 October 2006 │
+│ │
+│ v1.1 If the vocal tract runs out of frames, its internal parameters will now be brought all the way to the │
+│ last frame's values. Before, they were left one interpolation point shy, and then set to the last frame's │
+│ values at the start of the next frame. For continuous frames this was trivial, but it posed a problem │
+│ during frame gaps because the internal parameters would get stalled at transition points just shy of the │
+│ last frame's values. This change makes the vocal tract behave more sensibly during frame gaps. │
+│ │
+└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+
+}}
+CON
+
+ frame_buffers = 8 'frame buffers (2n)
+
+ frame_bytes = 3 {for stepsize} + 13 {for aa..ff} '16 bytes per frame
+ frame_longs = frame_bytes / 4 '4 longs per frame
+
+ frame_buffer_bytes = frame_bytes * frame_buffers
+ frame_buffer_longs = frame_longs * frame_buffers
+
+
+VAR
+
+ long cog, tract, pace
+
+ long index, attenuation, sample '3 longs ...must
+ long dira_, dirb_, ctra_, ctrb_, frqa_, cnt_ '6 longs ...be
+ long frames[frame_buffer_longs] 'many longs ...contiguous
+
+
+PUB start(tract_ptr, pos_pin, neg_pin, fm_offset) : okay
+
+'' Start vocal tract driver - starts a cog
+'' returns false if no cog available
+''
+'' tract_ptr = pointer to vocal tract parameters (13 bytes)
+'' pos_pin = positive delta-modulation pin (-1 to disable)
+'' neg_pin = negative delta-modulation pin (pos_pin must also be enabled, -1 to disable)
+'' fm_offset = offset frequency for fm aural subcarrier generation (-1 to disable, 4_500_000 for NTSC)
+
+ 'Reset driver
+ stop
+
+ 'Remember vocal tract parameters pointer
+ tract := tract_ptr
+
+ 'Initialize pace to 100%
+ pace := 100
+
+ 'If delta-modulation pin(s) enabled, ready output(s) and ready ctrb for duty mode
+ if pos_pin > -1
+ dira_[pos_pin >> 5 & 1] |= |< pos_pin
+ ctrb_ := $18000000 + pos_pin & $3F
+ if neg_pin > -1
+ dira_[neg_pin >> 5 & 1] |= |< neg_pin
+ ctrb_ += $04000000 + (neg_pin & $3F) << 9
+
+ 'If fm offset is valid, ready ctra for pll mode with divide-by-16 (else disabled)
+ if fm_offset > -1
+ ctra_ := $05800000
+
+ 'Ready frqa value for fm offset
+ repeat 33
+ frqa_ <<= 1
+ if fm_offset => clkfreq
+ fm_offset -= clkfreq
+ frqa_++
+ fm_offset <<= 1
+
+ 'Ready 20KHz sample period
+ cnt_ := clkfreq / 20_000
+
+ 'Launch vocal tract cog
+ return cog := cognew(@entry, @attenuation) + 1
+
+
+PUB stop
+
+'' Stop vocal tract driver - frees a cog
+
+ 'If already running, stop vocal tract cog
+ if cog
+ cogstop(cog~ - 1)
+
+ 'Reset variables and buffers
+ longfill(@index, 0, constant(3 + 6 + frame_buffer_longs))
+
+
+PUB set_attenuation(level)
+
+'' Set master attenuation level (0..7, initially 0)
+
+ attenuation := level
+
+
+PUB set_pace(percentage)
+
+'' Set pace to some percentage (initially 100)
+
+ pace := percentage
+
+
+PUB go(time)
+
+'' Queue current parameters to transition over time
+''
+'' actual time = integer(time * 100 / pace) #> 2 * 700µs (at least 1400µs, see set_pace)
+
+ 'Wait until frame available (first long will be zeroed)
+ repeat while frames[index]
+
+ 'Load parameters into frame
+ bytemove(@frames[index] + 3, tract, 13)
+
+ 'Write stepsize into frame (non-0 alerts vocal tract that frame is ready)
+ frames[index] |= $01000000 / (time * 100 / pace #> 2)
+
+ 'Increment frame index
+ index := (index + frame_longs) & constant(frame_buffer_longs - 1)
+
+
+PUB full : status
+
+'' Returns true if the parameter queue is full
+'' (useful for checking if "go" would have to wait)
+
+ return frames[index]
+
+
+PUB empty : status | i
+
+'' Returns true if the parameter queue is empty
+'' (useful for detecting when the vocal tract is finished)
+
+ repeat i from 0 to constant(frame_buffers - 1)
+ if frames[i * frame_longs]
+ return {false}
+ return true
+
+
+PUB sample_ptr : ptr
+
+'' Returns the address of the long which receives the audio samples in real-time
+'' (signed 32-bit values updated at 20KHz)
+
+ return @sample
+
+
+PUB aural_id : id
+
+'' Returns the id of the cog executing the vocal tract algorithm
+'' (for connecting a broadcast tv driver with the aural subcarrier)
+
+ return cog - 1
+
+
+DAT
+
+' ┌──────────────────┐
+' │ Initialization │
+' └──────────────────┘
+
+entry org
+
+:zero mov reserves,#0 'zero all reserved data
+ add :zero,d0
+ djnz clear_cnt,#:zero
+
+ mov t1,#2*15 'assemble 15 multiply steps into reserves
+:minst mov mult_steps,mult_step '(saves hub memory)
+ add :minst,d0s0
+ test t1,#1 wc
+ if_c sub :minst,#2
+ djnz t1,#:minst
+ mov mult_ret,antilog_ret 'write 'ret' after last instruction
+
+ mov t1,#13 'assemble 13 cordic steps into reserves
+:cstep mov t2,#8 '(saves hub memory)
+:cinst mov cordic_steps,cordic_step
+ add :cinst,d0s0
+ djnz t2,#:cinst
+ sub :cinst,#8
+ add cordic_dx,#1
+ add cordic_dy,#1
+ add cordic_a,#1
+ djnz t1,#:cstep
+ mov cordic_ret,antilog_ret 'write 'ret' over last instruction
+
+ mov t1,par 'get dira/dirb/ctra/ctrb
+ add t1,#2*4
+ mov t2,#4
+:regs rdlong dira,t1
+ add t1,#4
+ add :regs,d0
+ djnz t2,#:regs
+
+ rdlong frqa_center,t1 'get frqa center
+
+ add t1,#4 'get cnt ticks
+ rdlong cnt_ticks,t1
+
+ mov cnt_value,cnt 'prepare for initial waitcnt
+ add cnt_value,cnt_ticks
+
+
+' ┌────────────────────┐
+' │ Vocal Tract Loop │
+' └────────────────────┘
+
+' Wait for next sample period, then output sample
+
+loop waitcnt cnt_value,cnt_ticks 'wait for sample period
+
+ rdlong t1,par 'perform master attenuation
+ sar x,t1
+
+ mov t1,x 'update fm aural subcarrier for tv broadcast
+ sar t1,#10
+ add t1,frqa_center
+ mov frqa,t1
+
+ mov t1,x 'update duty cycle output for pin driving
+ add t1,h80000000
+ mov frqb,t1
+
+ mov t1,par 'update sample receiver in main memory
+ add t1,#1*4
+ wrlong x,t1
+
+' White noise source
+
+ test lfsr,lfsr_taps wc 'iterate lfsr three times
+ rcl lfsr,#1
+ test lfsr,lfsr_taps wc
+ rcl lfsr,#1
+ test lfsr,lfsr_taps wc
+ rcl lfsr,#1
+
+' Aspiration
+
+ mov t1,aa 'aspiration amplitude
+ mov t2,lfsr
+ call #mult
+
+ sar t1,#8 'set x
+ mov x,t1
+
+' Vibrato
+
+ mov t1,vr 'vibrato rate
+ shr t1,#10
+ add vphase,t1
+
+ mov t1,vp 'vibrato pitch
+ mov t2,vphase
+ call #sine
+
+ add t1,gp 'sum glottal pitch (+) into vibrato pitch (+/-)
+
+' Glottal pulse
+
+ shr t1,#2 'divide final pitch by 3 to mesh with
+ mov t2,t1 '...12 notes/octave musical scale
+ shr t2,#2 '(multiply by %0.0101010101010101)
+ add t1,t2
+ mov t2,t1
+ shr t2,#4
+ add t1,t2
+ mov t2,t1
+ shr t2,#8
+ add t1,t2
+
+ add t1,tune 'tune scale so that gp=100 produces 110.00Hz (A2)
+
+ call #antilog 'convert pitch (log frequency) to phase delta
+ add gphase,t2
+
+ mov t1,gphase 'convert phase to glottal pulse sample
+ call #antilog
+ sub t2,h40000000
+ mov t1,ga
+ call #sine
+
+ sar t1,#6 'add to x
+ add x,t1
+
+' Vocal tract formants
+
+ mov y,#0 'reset y
+
+ mov a,f1 'formant1, sum and rotate (x,y)
+ add x,f1x
+ add y,f1y
+ call #cordic
+ mov f1x,x
+ mov f1y,y
+
+ mov a,f2 'formant2, sum and rotate (x,y)
+ add x,f2x
+ add y,f2y
+ call #cordic
+ mov f2x,x
+ mov f2y,y
+
+ mov a,f3 'formant3, sum and rotate (x,y)
+ add x,f3x
+ add y,f3y
+ call #cordic
+ mov f3x,x
+ mov f3y,y
+
+ mov a,f4 'formant4, sum and rotate (x,y)
+ add x,f4x
+ add y,f4y
+ call #cordic
+ mov f4x,x
+ mov f4y,y
+
+' Nasal anti-formant
+
+ add nx,x 'subtract from x (nx negated)
+
+ mov a,nf 'nasal frequency
+ call #cordic
+
+ mov t1,na 'nasal amplitude
+ mov t2,x
+ call #mult
+
+ mov x,nx 'restore x
+ neg nx,t1 'negate nx
+
+' Frication
+
+ mov t1,lfsr 'phase noise
+ sar t1,#3
+ add fphase,t1
+ sar t1,#1
+ add fphase,t1
+
+ mov t1,ff 'frication frequency
+ shr t1,#1
+ add fphase,t1
+
+ mov t1,fa 'frication amplitude
+ mov t2,fphase
+ call #sine
+
+ add x,t1 'add to x
+
+' Handle frame
+
+ jmp :ret 'run segment of frame handler, return to loop
+
+
+' ┌─────────────────┐
+' │ Frame Handler │
+' └─────────────────┘
+
+:ret long :wait 'pointer to next frame handler routine
+
+
+:wait jmpret :ret,#loop '(6 or 17.5 cycles)
+ mov frame_ptr,par 'check for next frame
+ add frame_ptr,#8*4 'point past miscellaneous data
+ add frame_ptr,frame_index 'point to start of frame
+ rdlong step_size,frame_ptr 'get stepsize
+ and step_size,h00FFFFFF wz 'isolate stepsize and check if not 0
+ if_nz jmp #:next 'if not 0, next frame ready
+
+
+ mov :final1,:finali 'no frame ready, ready to finalize parameters
+ mov frame_cnt,#13 'iterate aa..ff
+
+:final jmpret :ret,#loop '(13.5 or 4 cycles)
+:final1 mov par_curr,par_next 'current parameter = next parameter
+ add :final1,d0s0 'update pointers
+ djnz frame_cnt,#:final 'another parameter?
+
+ jmp #:wait 'check for next frame
+
+
+:next add step_size,#1 'next frame ready, insure accurate accumulation
+ mov step_acc,step_size 'initialize step accumulator
+
+
+ movs :set1,#par_next 'ready to get parameters and steps for aa..ff
+ movd :set2,#par_curr
+ movd :set3,#par_next
+ movd :set4,#par_step
+ add frame_ptr,#3 'point to first parameter
+ mov frame_cnt,#13 'iterate aa..ff
+
+:set jmpret :ret,#loop '(19.5 or 46.5 cycles)
+ rdbyte t1,frame_ptr 'get new parameter
+ shl t1,#24 'msb justify
+:set1 mov t2,par_next 'get next parameter
+:set2 mov par_curr,t2 'current parameter = next parameter
+:set3 mov par_next,t1 'next parameter = new parameter
+ sub t1,t2 wc 'get next-current delta with sign in c
+ negc t1,t1 'make delta absolute (by c, not msb)
+ rcl vscl,#1 wz, nr 'save sign into nz (vscl unaffected)
+
+ mov t2,#8 'multiply delta by step size
+:mult shl t1,#1 wc
+ if_c add t1,step_size
+ djnz t2,#:mult
+
+:set4 negnz par_step,t1 'set signed step
+
+ add :set1,#1 'update pointers for next parameter+step
+ add :set2,d0
+ add :set3,d0
+ add :set4,d0
+ add frame_ptr,#1
+ djnz frame_cnt,#:set 'another parameter?
+
+
+:stepframe jmpret :ret,#loop '(47.5 or 8 cycles)
+ mov :step1,:stepi 'ready to step parameters
+ mov frame_cnt,#13 'iterate aa..ff
+
+:step jmpret :ret,#loop '(3 or 4 cycles)
+:step1 add par_curr,par_step 'step parameter
+ add :step1,d0s0 'update pointers for next parameter+step
+ djnz frame_cnt,#:step 'another parameter?
+
+ add step_acc,step_size 'accumulate frame steps
+ test step_acc,h01000000 wc 'check for frame steps done
+ if_nc jmp #:stepframe 'another frame step?
+
+
+ sub frame_ptr,#frame_bytes 'zero stepsize in frame to signal frame done
+ wrlong vscl,frame_ptr
+
+ add frame_index,#frame_bytes'point to next frame
+ and frame_index,#frame_buffer_bytes - 1
+
+ jmp #:wait 'check for next frame
+
+
+:finali mov par_curr,par_next 'instruction used to finalize parameters
+:stepi add par_curr,par_step 'instruction used to step parameters
+
+
+' ┌────────────────────┐
+' │ Math Subroutines │
+' └────────────────────┘
+
+' Antilog
+'
+' in: t1 = log (top 4 bits = whole number, next 11 bits = fraction)
+'
+' out: t2 = antilog ($00010000..$FFEA0000)
+
+antilog mov t2,t1
+ shr t2,#16 'position 11-bit fraction
+ shr t1,#16+12 'position 4-bit whole number
+ and t2,h00000FFE 'get table offset
+ or t2,h0000D000 'get table base
+ rdword t2,t2 'lookup fractional antilog
+ or t2,h00010000 'insert leading bit
+ shl t2,t1 'shift up by whole number
+
+antilog_ret ret
+
+
+' Scaled sine
+'
+' in: t1 = unsigned scale (15 top bits used)
+' t2 = angle (13 top bits used)
+'
+' out: t1 = 17-bit * 15-bit scaled sine ($80014000..$7FFEC000)
+
+sine shr t2,#32-13 'get 13-bit angle
+ test t2,h00001000 wz 'get sine quadrant 3|4 into nz
+ test t2,h00000800 wc 'get sine quadrant 2|4 into c
+ negc t2,t2 'if sine quadrant 2|4, negate table offset
+ or t2,h00007000 'insert sine table base address >> 1
+ shl t2,#1 'shift left to get final word address
+ rdword t2,t2 'read sine word from table
+ negnz t2,t2 'if quadrant 3|4, negate word
+ shl t2,#15 'msb-justify result
+ 'multiply follows...
+
+' Multiply
+'
+' in: t1 = unsigned multiplier (15 top bits used)
+' t2 = signed multiplicand (17 top bits used)
+'
+' out: t1 = 32-bit signed product
+
+mult shr t1,#32-15 'position unsigned multiplier
+
+ sar t2,#15 'position signed multiplicand
+ shl t2,#15-1
+
+ jmp #mult_steps 'do multiply steps
+
+
+mult_step sar t1,#1 wc 'multiply step that gets assembled into reserves (x15)
+ if_c add t1,t2
+
+
+' Cordic rotation
+'
+' in: a = 0 to <90 degree angle (~13 top bits used)
+' x,y = signed coordinates
+'
+' out: x,y = scaled and rotated signed coordinates
+
+cordic sar x,#1 'multiply (x,y) by %0.10011001 (0.60725 * 0.984)
+ mov t1,x '...for cordic pre-scaling and slight damping
+ sar t1,#3
+ add x,t1
+ mov t1,x
+ sar t1,#4
+ add x,t1
+
+ sar y,#1
+ mov t1,y
+ sar t1,#3
+ add y,t1
+ mov t1,y
+ sar t1,#4
+ add y,t1
+
+ mov t1,x 'do first cordic step
+ sub x,y
+ add y,t1
+ sub a,h80000000 wc
+
+ jmp #cordic_steps+1 'do subsequent cordic steps (skip first instruction)
+
+
+cordic_step mov a,a wc 'cordic step that gets assembled into reserves (x13)
+ mov t1,y
+cordic_dx sar t1,#1 '(source incremented for each step)
+ mov t2,x
+cordic_dy sar t2,#1 '(source incremented for each step)
+ sumnc x,t1
+ sumc y,t2
+cordic_a sumnc a,cordic_delta '(source incremented for each step)
+
+
+' ┌────────────────┐
+' │ Defined Data │
+' └────────────────┘
+
+tune long $66920000 'scale tuned to 110.00Hz at gp=100 (manually calibrated)
+
+lfsr long 1 'linear feedback shift register for noise generation
+lfsr_taps long $80061000
+
+cordic_delta long $4B901476 'cordic angle deltas (first is h80000000)
+ long $27ECE16D
+ long $14444750
+ long $0A2C350C
+ long $05175F85
+ long $028BD879
+ long $0145F154
+ long $00A2F94D
+ long $00517CBB
+ long $0028BE60
+ long $00145F30
+ long $000A2F98
+
+h80000000 long $80000000 'miscellaneous constants greater than 9 bits
+h40000000 long $40000000
+h01000000 long $01000000
+h00FFFFFF long $00FFFFFF
+h00010000 long $00010000
+h0000D000 long $0000D000
+h00007000 long $00007000
+h00001000 long $00001000
+h00000FFE long $00000FFE
+h00000800 long $00000800
+
+d0 long $00000200 'destination/source field increments
+d0s0 long $00000201
+
+clear_cnt long $1F0 - reserves 'number of reserved registers to clear on startup
+
+
+' ┌──────────────────────────────────────────────────┐
+' │ Undefined Data (zeroed by initialization code) │
+' └──────────────────────────────────────────────────┘
+
+reserves
+
+frqa_center res 1 'reserved registers that get cleared on startup
+
+cnt_ticks res 1
+cnt_value res 1
+
+frame_index res 1
+frame_ptr res 1
+frame_cnt res 1
+
+step_size res 1
+step_acc res 1
+
+vphase res 1
+gphase res 1
+fphase res 1
+
+f1x res 1
+f1y res 1
+f2x res 1
+f2y res 1
+f3x res 1
+f3y res 1
+f4x res 1
+f4y res 1
+nx res 1
+
+a res 1
+x res 1
+y res 1
+
+t1 res 1
+t2 res 1
+
+par_curr '*** current parameters
+aa res 1 'aspiration amplitude
+ga res 1 'glottal amplitude
+gp res 1 'glottal pitch
+vp res 1 'vibrato pitch
+vr res 1 'vibrato rate
+f1 res 1 'formant1 frequency
+f2 res 1 'formant2 frequency
+f3 res 1 'formant3 frequency
+f4 res 1 'formant4 frequency
+na res 1 'nasal amplitude
+nf res 1 'nasal frequency
+fa res 1 'frication amplitude
+ff res 1 'frication frequency
+
+par_next res 13 '*** next parameters
+par_step res 13 '*** parameter steps
+
+
+mult_steps res 2 * 15 'assembly area for multiply steps w/ret
+mult_ret
+sine_ret res 1
+
+cordic_steps res 8 * 13 - 1 'assembly area for cordic steps w/ret
+cordic_ret res 1
+
+{{
+
+┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+│ TERMS OF USE: MIT License │
+├──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
+│Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation │
+│files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, │
+│modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software│
+│is furnished to do so, subject to the following conditions: │
+│ │
+│The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.│
+│ │
+│THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE │
+│WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR │
+│COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, │
+│ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. │
+└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+}}
\ No newline at end of file
diff --git a/samples/Python/AdditiveWave.pyde b/samples/Python/AdditiveWave.pyde
new file mode 100644
index 00000000..d02f15a0
--- /dev/null
+++ b/samples/Python/AdditiveWave.pyde
@@ -0,0 +1,63 @@
+"""
+Additive Wave
+by Daniel Shiffman.
+
+Create a more complex wave by adding two waves together.
+"""
+
+xspacing = 8 # How far apart should each horizontal location be spaced
+maxwaves = 4 # total # of waves to add together
+theta = 0.0
+
+amplitude = [] # Height of wave
+# Value for incrementing X, to be calculated as a function of period and
+# xspacing
+dx = []
+yvalues = []
+
+
+def setup():
+ size(640, 360)
+ frameRate(30)
+ colorMode(RGB, 255, 255, 255, 100)
+ w = width + 16
+ for i in range(maxwaves):
+ amplitude.append(random(10, 30))
+ period = random(100, 300) # How many pixels before the wave repeats
+ dx.append((TWO_PI / period) * xspacing)
+ for _ in range(w / xspacing + 1):
+ yvalues.append(0.0)
+
+
+def draw():
+ background(0)
+ calcWave()
+ renderWave()
+
+
+def calcWave():
+ # Increment theta (try different values for 'angular velocity' here
+ theta += 0.02
+ # Set all height values to zero
+ for i in range(len(yvalues)):
+ yvalues[i] = 0
+ # Accumulate wave height values
+ for j in range(maxwaves):
+ x = theta
+ for i in range(len(yvalues)):
+ # Every other wave is cosine instead of sine
+ if j % 2 == 0:
+ yvalues[i] += sin(x) * amplitude[j]
+ else:
+ yvalues[i] += cos(x) * amplitude[j]
+ x += dx[j]
+
+
+def renderWave():
+ # A simple way to draw the wave with an ellipse at each location
+ noStroke()
+ fill(255, 50)
+ ellipseMode(CENTER)
+ for x, v in enumerate(yvalues):
+ ellipse(x * xspacing, height / 2 + v, 16, 16)
+
diff --git a/samples/Python/Cinema4DPythonPlugin.pyp b/samples/Python/Cinema4DPythonPlugin.pyp
new file mode 100644
index 00000000..30c2aa78
--- /dev/null
+++ b/samples/Python/Cinema4DPythonPlugin.pyp
@@ -0,0 +1,241 @@
+#
+# Cinema 4D Python Plugin Source file
+# https://github.com/nr-plugins/nr-xpresso-alignment-tools
+#
+
+# coding: utf-8
+#
+# Copyright (C) 2012, Niklas Rosenstein
+# Licensed under the GNU General Public License
+#
+# XPAT - XPresso Alignment Tools
+# ==============================
+#
+# The XPAT plugin provides tools for aligning nodes in the Cinema 4D
+# XPresso Editor, improving readability of complex XPresso set-ups
+# immensively.
+#
+# Requirements:
+# - MAXON Cinema 4D R13+
+# - Python `c4dtools` library. Get it from
+# http://github.com/NiklasRosenstein/c4dtools
+#
+# Author: Niklas Rosenstein
+# Version: 1.1 (01/06/2012)
+
+import os
+import sys
+import json
+import c4d
+import c4dtools
+import itertools
+
+from c4d.modules import graphview as gv
+from c4dtools.misc import graphnode
+
+res, importer = c4dtools.prepare(__file__, __res__)
+settings = c4dtools.helpers.Attributor({
+ 'options_filename': res.file('config.json'),
+})
+
+def align_nodes(nodes, mode, spacing):
+ r"""
+ Aligns the passed nodes horizontally and apply the minimum spacing
+ between them.
+ """
+
+ modes = ['horizontal', 'vertical']
+ if not nodes:
+ return
+ if mode not in modes:
+ raise ValueError('invalid mode, choices are: ' + ', '.join(modes))
+
+ get_0 = lambda x: x.x
+ get_1 = lambda x: x.y
+ set_0 = lambda x, v: setattr(x, 'x', v)
+ set_1 = lambda x, v: setattr(x, 'y', v)
+
+ if mode == 'vertical':
+ get_0, get_1 = get_1, get_0
+ set_0, set_1 = set_1, set_0
+
+ nodes = [graphnode.GraphNode(n) for n in nodes]
+ nodes.sort(key=lambda n: get_0(n.position))
+ midpoint = graphnode.find_nodes_mid(nodes)
+
+ # Apply the spacing between the nodes relative to the coordinate-systems
+ # origin. We can offset them later because we now the nodes' midpoint
+ # already.
+ first_position = nodes[0].position
+ new_positions = []
+ prev_offset = 0
+ for node in nodes:
+ # Compute the relative position of the node.
+ position = node.position
+ set_0(position, get_0(position) - get_0(first_position))
+
+ # Obtain it's size and check if the node needs to be re-placed.
+ size = node.size
+ if get_0(position) < prev_offset:
+ set_0(position, prev_offset)
+ prev_offset += spacing + get_0(size)
+ else:
+ prev_offset = get_0(position) + get_0(size) + spacing
+
+ set_1(position, get_1(midpoint))
+ new_positions.append(position)
+
+ # Center the nodes again.
+ bbox_size = prev_offset - spacing
+ bbox_size_2 = bbox_size * 0.5
+ for node, position in itertools.izip(nodes, new_positions):
+ # TODO: Here is some issue with offsetting the nodes. Some value
+ # dependent on the spacing must be added here to not make the nodes
+ # move horizontally/vertically although they have already been
+ # aligned.
+ set_0(position, get_0(midpoint) + get_0(position) - bbox_size_2 + spacing)
+ node.position = position
+
+def align_nodes_shortcut(mode, spacing):
+ master = gv.GetMaster(0)
+ if not master:
+ return
+
+ root = master.GetRoot()
+ if not root:
+ return
+
+ nodes = graphnode.find_selected_nodes(root)
+ if nodes:
+ master.AddUndo()
+ align_nodes(nodes, mode, spacing)
+ c4d.EventAdd()
+
+ return True
+
+class XPAT_Options(c4dtools.helpers.Attributor):
+ r"""
+ This class organizes the options for the XPAT plugin, i.e.
+ validating, loading and saving.
+ """
+
+ defaults = {
+ 'hspace': 50,
+ 'vspace': 20,
+ }
+
+ def __init__(self, filename=None):
+ super(XPAT_Options, self).__init__()
+ self.load(filename)
+
+ def load(self, filename=None):
+ r"""
+ Load the options from file pointed to by filename. If filename
+ is None, it defaults to the filename defined in options in the
+ global scope.
+ """
+
+ if filename is None:
+ filename = settings.options_filename
+
+ if os.path.isfile(filename):
+ self.dict_ = self.defaults.copy()
+ with open(filename, 'rb') as fp:
+ self.dict_.update(json.load(fp))
+ else:
+ self.dict_ = self.defaults.copy()
+ self.save()
+
+ def save(self, filename=None):
+ r"""
+ Save the options defined in XPAT_Options instance to HD.
+ """
+
+ if filename is None:
+ filename = settings.options_filename
+
+ values = dict((k, v) for k, v in self.dict_.iteritems()
+ if k in self.defaults)
+ with open(filename, 'wb') as fp:
+ json.dump(values, fp)
+
+class XPAT_OptionsDialog(c4d.gui.GeDialog):
+ r"""
+ This class implements the behavior of the XPAT options dialog,
+ taking care of storing the options on the HD and loading them
+ again on startup.
+ """
+
+ # c4d.gui.GeDialog
+
+ def CreateLayout(self):
+ return self.LoadDialogResource(res.DLG_OPTIONS)
+
+ def InitValues(self):
+ self.SetLong(res.EDT_HSPACE, options.hspace)
+ self.SetLong(res.EDT_VSPACE, options.vspace)
+ return True
+
+ def Command(self, id, msg):
+ if id == res.BTN_SAVE:
+ options.hspace = self.GetLong(res.EDT_HSPACE)
+ options.vspace = self.GetLong(res.EDT_VSPACE)
+ options.save()
+ self.Close()
+ return True
+
+class XPAT_Command_OpenOptionsDialog(c4dtools.plugins.Command):
+ r"""
+ This Cinema 4D CommandData plugin opens the XPAT options dialog
+ when being executed.
+ """
+
+ def __init__(self):
+ super(XPAT_Command_OpenOptionsDialog, self).__init__()
+ self._dialog = None
+
+ @property
+ def dialog(self):
+ if not self._dialog:
+ self._dialog = XPAT_OptionsDialog()
+ return self._dialog
+
+ # c4dtools.plugins.Command
+
+ PLUGIN_ID = 1029621
+ PLUGIN_NAME = res.string.XPAT_COMMAND_OPENOPTIONSDIALOG()
+ PLUGIN_HELP = res.string.XPAT_COMMAND_OPENOPTIONSDIALOG_HELP()
+
+ # c4d.gui.CommandData
+
+ def Execute(self, doc):
+ return self.dialog.Open(c4d.DLG_TYPE_MODAL)
+
+class XPAT_Command_AlignHorizontal(c4dtools.plugins.Command):
+
+ PLUGIN_ID = 1029538
+ PLUGIN_NAME = res.string.XPAT_COMMAND_ALIGNHORIZONTAL()
+ PLUGIN_ICON = res.file('xpresso-align-h.png')
+ PLUGIN_HELP = res.string.XPAT_COMMAND_ALIGNHORIZONTAL_HELP()
+
+ def Execute(self, doc):
+ align_nodes_shortcut('horizontal', options.hspace)
+ return True
+
+class XPAT_Command_AlignVertical(c4dtools.plugins.Command):
+
+ PLUGIN_ID = 1029539
+ PLUGIN_NAME = res.string.XPAT_COMMAND_ALIGNVERTICAL()
+ PLUGIN_ICON = res.file('xpresso-align-v.png')
+ PLUGIN_HELP = res.string.XPAT_COMMAND_ALIGNVERTICAL_HELP()
+
+ def Execute(self, doc):
+ align_nodes_shortcut('vertical', options.vspace)
+ return True
+
+options = XPAT_Options()
+
+if __name__ == '__main__':
+ c4dtools.plugins.main()
+
+
diff --git a/samples/Python/MoveEye.pyde b/samples/Python/MoveEye.pyde
new file mode 100644
index 00000000..310c8efb
--- /dev/null
+++ b/samples/Python/MoveEye.pyde
@@ -0,0 +1,29 @@
+"""
+ * Move Eye.
+ * by Simon Greenwold.
+ *
+ * The camera lifts up (controlled by mouseY) while looking at the same point.
+ """
+
+
+def setup():
+ size(640, 360, P3D)
+ fill(204)
+
+
+def draw():
+ lights()
+ background(0)
+
+ # Change height of the camera with mouseY
+ camera(30.0, mouseY, 220.0, # eyeX, eyeY, eyeZ
+ 0.0, 0.0, 0.0, # centerX, centerY, centerZ
+ 0.0, 1.0, 0.0) # upX, upY, upZ
+
+ noStroke()
+ box(90)
+ stroke(255)
+ line(-100, 0, 0, 100, 0, 0)
+ line(0, -100, 0, 0, 100, 0)
+ line(0, 0, -100, 0, 0, 100)
+
diff --git a/samples/QMake/complex.pro b/samples/QMake/complex.pro
new file mode 100644
index 00000000..6f6a5317
--- /dev/null
+++ b/samples/QMake/complex.pro
@@ -0,0 +1,30 @@
+# This QMake file is complex, as it usese
+# boolean operators and function calls
+
+QT += core gui
+greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
+
+# We could use some OpenGL right now
+contains(QT_CONFIG, opengl) | contains(QT_CONFIG, opengles2) {
+ QT += opengl
+} else {
+ DEFINES += QT_NO_OPENGL
+}
+
+TEMPLATE = app
+win32 {
+ TARGET = BlahApp
+ RC_FILE = Resources/winres.rc
+}
+!win32 { TARGET = blahapp }
+
+# Let's add a PRI file!
+include(functions.pri)
+
+SOURCES += file.cpp
+
+HEADERS += file.h
+
+FORMS += file.ui
+
+RESOURCES += res.qrc
diff --git a/samples/QMake/functions.pri b/samples/QMake/functions.pri
new file mode 100644
index 00000000..ef1541a5
--- /dev/null
+++ b/samples/QMake/functions.pri
@@ -0,0 +1,8 @@
+# QMake include file that calls some functions
+# and does nothing else...
+
+exists(.git/HEAD) {
+ system(git rev-parse HEAD >rev.txt)
+} else {
+ system(echo ThisIsNotAGitRepo >rev.txt)
+}
diff --git a/samples/QMake/qmake.script! b/samples/QMake/qmake.script!
new file mode 100644
index 00000000..297139da
--- /dev/null
+++ b/samples/QMake/qmake.script!
@@ -0,0 +1,2 @@
+#!/usr/bin/qmake
+message(This is QMake.)
diff --git a/samples/QMake/simple.pro b/samples/QMake/simple.pro
new file mode 100644
index 00000000..3bdf5ab8
--- /dev/null
+++ b/samples/QMake/simple.pro
@@ -0,0 +1,17 @@
+# Simple QMake file
+
+CONFIG += qt
+QT += core gui
+TEMPLATE = app
+TARGET = simpleapp
+
+SOURCES += file.cpp \
+ file2.c \
+ This/Is/Folder/file3.cpp
+
+HEADERS += file.h \
+ file2.h \
+ This/Is/Folder/file3.h
+
+FORMS += This/Is/Folder/file3.ui \
+ Test.ui
diff --git a/samples/R/df.residual.r b/samples/R/df.residual.r
new file mode 100644
index 00000000..a7a00686
--- /dev/null
+++ b/samples/R/df.residual.r
@@ -0,0 +1,29 @@
+
+df.residual.mira <- function(object, ...) {
+ fit <- object$analyses[[1]]
+ return(df.residual(fit))
+}
+
+df.residual.lme <- function(object, ...) {
+ return(object$fixDF[["X"]][1])
+}
+
+df.residual.mer <- function(object, ...) {
+ return(sum(object@dims[2:4] * c(1, -1, -1)) + 1)
+}
+
+df.residual.default <- function(object, q = 1.3, ...) {
+ df <- object$df.residual
+ if (!is.null(df))
+ return(df)
+
+ mk <- try(c <- coef(object), silent = TRUE)
+ mn <- try(f <- fitted(object), silent = TRUE)
+ if (inherits(mk, "try-error") | inherits(mn, "try-error"))
+ return(NULL)
+ n <- ifelse(is.data.frame(f) | is.matrix(f), nrow(f), length(f))
+ k <- length(c)
+ if (k == 0 | n == 0)
+ return(NULL)
+ return(max(1, n - q * k))
+}
diff --git a/samples/R/filenames/expr-dist b/samples/R/filenames/expr-dist
new file mode 100755
index 00000000..1f7ab280
--- /dev/null
+++ b/samples/R/filenames/expr-dist
@@ -0,0 +1,101 @@
+#!/usr/bin/env Rscript
+
+# Copyright (c) 2013 Daniel S. Standage, released under MIT license
+#
+# expr-dist: plot distributions of expression values before and after
+# normalization; visually confirm that normalization worked
+# as expected
+#
+# Program input is a matrix of expression values, each row corresponding to a
+# molecule (gene, transcript, etc) and each row corresponding to that molecule's
+# expression level or abundance. The program expects the rows and columns to be
+# named, and was tested primarily on output produced by the
+# 'rsem-generate-data-matrix' script distributed with the RSEM package.
+#
+# The program plots the distributions of the logged expression values by sample
+# as provided, then normalizes the values, and finally plots the distribution of
+# the logged normalized expression values by sample. The expectation is that all
+# samples' distributions will have a similar shape but different medians prior
+# to normalization, and that post normalization they will all have an identical
+# median to facilitate cross-sample comparison.
+
+
+# MedianNorm function borrowed from the EBSeq library version 1.1.6
+# See http://www.bioconductor.org/packages/devel/bioc/html/EBSeq.html
+MedianNorm <- function(data)
+{
+ geomeans <- exp( rowMeans(log(data)) )
+ apply(data, 2, function(cnts) median((cnts/geomeans)[geomeans > 0]))
+}
+
+library("getopt")
+print_usage <- function(file=stderr())
+{
+ cat("
+expr-dist: see source code for full description
+Usage: expr-dist [options] < expr-matrix.txt
+ Options:
+ -h|--help: print this help message and exit
+ -o|--out: STRING prefix for output files; default is 'expr-dist'
+ -r|--res: INT resolution (dpi) of generated graphics; default is 150
+ -t|--height: INT height (pixels) of generated graphics; default is 1200
+ -w|--width: INT width (pixels) of generated graphics; default is 1200
+ -y|--ylim: REAL the visible range of the Y axis depends on the first
+ distribution plotted; if other distributions are getting
+ cut off, use this setting to override the default\n\n")
+}
+
+spec <- matrix( c("help", 'h', 0, "logical",
+ "out", 'o', 1, "character",
+ "res", 'r', 1, "integer",
+ "height", 't', 1, "integer",
+ "width", 'w', 1, "integer",
+ "ylim", 'y', 1, "double"),
+ byrow=TRUE, ncol=4)
+opt <- getopt(spec)
+if(!is.null(opt$help))
+{
+ print_usage(file=stdout())
+ q(status=1)
+}
+if(is.null(opt$height)) { opt$height <- 1200 }
+if(is.null(opt$out)) { opt$out <- "expr-dist" }
+if(is.null(opt$res)) { opt$res <- 150 }
+if(is.null(opt$width)) { opt$width <- 1200 }
+if(!is.null(opt$ylim)) { opt$ylim <- c(0, opt$ylim) }
+
+# Load data, determine number of samples
+data <- read.table(file("stdin"), header=TRUE, sep="\t", quote="")
+nsamp <- dim(data)[2] - 1
+data <- data[,1:nsamp+1]
+
+# Plot distribution of expression values before normalization
+outfile <- sprintf("%s-median.png", opt$out)
+png(outfile, height=opt$height, width=opt$width, res=opt$res)
+h <- hist(log(data[,1]), plot=FALSE)
+plot(h$mids, h$density, type="l", col=rainbow(nsamp)[1], main="",
+ xlab="Log expression value", ylab="Proportion of molecules", ylim=opt$ylim)
+for(i in 2:nsamp)
+{
+ h <- hist(log(data[,i]), plot=FALSE)
+ lines(h$mids, h$density, col=rainbow(nsamp)[i])
+}
+devnum <- dev.off()
+
+# Normalize by median
+size.factors <- MedianNorm(data.matrix(data))
+data.norm <- t(apply(data, 1, function(x){ x / size.factors }))
+
+# Plot distribution of normalized expression values
+outfile <- sprintf("%s-median-norm.png", opt$out)
+png(outfile, height=opt$height, width=opt$width, res=opt$res)
+h <- hist(log(data.norm[,1]), plot=FALSE)
+plot(h$mids, h$density, type="l", col=rainbow(nsamp)[1], main="",
+ xlab="Log normalized expression value", ylab="Proportion of molecules",
+ ylim=opt$ylim)
+for(i in 2:nsamp)
+{
+ h <- hist(log(data.norm[,i]), plot=FALSE)
+ lines(h$mids, h$density, col=rainbow(nsamp)[i])
+}
+devnum <- dev.off()
diff --git a/samples/R/import.r b/samples/R/import.r
new file mode 100644
index 00000000..dbccce17
--- /dev/null
+++ b/samples/R/import.r
@@ -0,0 +1,201 @@
+#' Import a module into the current scope
+#'
+#' \code{module = import('module')} imports a specified module and makes its
+#' code available via the environment-like object it returns.
+#'
+#' @param module an identifier specifying the full module path
+#' @param attach if \code{TRUE}, attach the newly loaded module to the object
+#' search path (see \code{Details})
+#' @param attach_operators if \code{TRUE}, attach operators of module to the
+#' object search path, even if \code{attach} is \code{FALSE}
+#' @return the loaded module environment (invisible)
+#'
+#' @details Modules are loaded in an isolated environment which is returned, and
+#' optionally attached to the object search path of the current scope (if
+#' argument \code{attach} is \code{TRUE}).
+#' \code{attach} defaults to \code{FALSE}. However, in interactive code it is
+#' often helpful to attach packages by default. Therefore, in interactive code
+#' invoked directly from the terminal only (i.e. not within modules),
+#' \code{attach} defaults to the value of \code{options('import.attach')}, which
+#' can be set to \code{TRUE} or \code{FALSE} depending on the user’s preference.
+#'
+#' \code{attach_operators} causes \emph{operators} to be attached by default,
+#' because operators can only be invoked in R if they re found in the search
+#' path. Not attaching them therefore drastically limits a module’s usefulness.
+#'
+#' Modules are searched in the module search path \code{options('import.path')}.
+#' This is a vector of paths to consider, from the highest to the lowest
+#' priority. The current directory is \emph{always} considered first. That is,
+#' if a file \code{a.r} exists both in the current directory and in a module
+#' search path, the local file \code{./a.r} will be loaded.
+#'
+#' Module names can be fully qualified to refer to nested paths. See
+#' \code{Examples}.
+#'
+#' @note Unlike for packages, attaching happens \emph{locally}: if
+#' \code{import} is executed in the global environment, the effect is the same.
+#' Otherwise, the imported module is inserted as the parent of the current
+#' \code{environment()}. When used (globally) \emph{inside} a module, the newly
+#' imported module is only available inside the module’s search path, not
+#' outside it (nor in other modules which might be loaded).
+#'
+#' @examples
+#' # `a.r` is a file in the local directory containing a function `f`.
+#' a = import('a')
+#' a$f()
+#'
+#' # b/c.r is a file in path `b`, containing a function `g`.
+#' import('b/c', attach = TRUE)
+#' g() # No module name qualification necessary
+#'
+#' @seealso \code{unload}
+#' @seealso \code{reload}
+#' @seealso \code{module_name}
+#' @export
+import = function (module, attach, attach_operators = TRUE) {
+ module = substitute(module)
+ stopifnot(inherits(module, 'name'))
+
+ if (missing(attach)) {
+ attach = if (interactive() && is.null(module_name()))
+ getOption('import.attach', FALSE)
+ else
+ FALSE
+ }
+
+ stopifnot(class(attach) == 'logical' && length(attach) == 1)
+
+ module_path = try(find_module(module), silent = TRUE)
+
+ if (inherits(module_path, 'try-error'))
+ stop(attr(module_path, 'condition')$message)
+
+ containing_modules = module_init_files(module, module_path)
+ mapply(do_import, names(containing_modules), containing_modules)
+
+ mod_ns = do_import(as.character(module), module_path)
+ module_parent = parent.frame()
+ mod_env = exhibit_namespace(mod_ns, as.character(module), module_parent)
+
+ if (attach) {
+ if (identical(module_parent, .GlobalEnv))
+ attach(mod_env, name = environmentName(mod_env))
+ else
+ parent.env(module_parent) = mod_env
+ }
+ else if (attach_operators)
+ export_operators(mod_ns, module_parent)
+
+ invisible(mod_env)
+}
+
+do_import = function (module_name, module_path) {
+ if (is_module_loaded(module_path))
+ return(get_loaded_module(module_path))
+
+ # The namespace contains a module’s content. This schema is very much like
+ # R package organisation.
+ # A good resource for this is:
+ #
+ namespace = structure(new.env(parent = .BaseNamespaceEnv),
+ name = paste('namespace', module_name, sep = ':'),
+ path = module_path,
+ class = c('namespace', 'environment'))
+ local(source(attr(environment(), 'path'), chdir = TRUE, local = TRUE),
+ envir = namespace)
+ cache_module(namespace)
+ namespace
+}
+
+exhibit_namespace = function (namespace, name, parent) {
+ exported_functions = lsf.str(namespace)
+ # Skip one parent environment because this module is hooked into the chain
+ # between the calling environment and its ancestor, thus sitting in its
+ # local object search path.
+ structure(list2env(sapply(exported_functions, get, envir = namespace),
+ parent = parent.env(parent)),
+ name = paste('module', name, sep = ':'),
+ path = module_path(namespace),
+ class = c('module', 'environment'))
+}
+
+export_operators = function (namespace, parent) {
+ # `$` cannot be overwritten, but it is generic so S3 variants of it can be
+ # defined. We therefore test it as well.
+ ops = c('+', '-', '*', '/', '^', '**', '&', '|', ':', '::', ':::', '$', '=',
+ '<-', '<<-', '==', '<', '<=', '>', '>=', '!=', '~', '&&', '||')
+
+ is_predefined = function (f) f %in% ops
+
+ is_op = function (f) {
+ prefix = strsplit(f, '\\.')[[1]][1]
+ is_predefined(prefix) || grepl('^%.*%$', prefix)
+ }
+
+ operators = Filter(is_op, lsf.str(namespace))
+ name = module_name(namespace)
+ # Skip one parent environment because this module is hooked into the chain
+ # between the calling environment and its ancestor, thus sitting in its
+ # local object search path.
+ op_env = structure(list2env(sapply(operators, get, envir = namespace),
+ parent = parent.env(parent)),
+ name = paste('operators', name, sep = ':'),
+ path = module_path(namespace),
+ class = c('module', 'environment'))
+
+ if (identical(parent, .GlobalEnv))
+ attach(op_env, name = environmentName(op_env))
+ else
+ parent.env(parent) = op_env
+}
+
+#' Unload a given module
+#'
+#' Unset the module variable that is being passed as a parameter, and remove the
+#' loaded module from cache.
+#' @param module reference to the module which should be unloaded
+#' @note Any other references to the loaded modules remain unchanged, and will
+#' still work. However, subsequently importing the module again will reload its
+#' source files, which would not have happened without \code{unload}.
+#' Unloading modules is primarily useful for testing during development, and
+#' should not be used in production code.
+#'
+#' \code{unload} does not currently detach environments.
+#' @seealso \code{import}
+#' @seealso \code{reload}
+#' @export
+unload = function (module) {
+ stopifnot(inherits(module, 'module'))
+ module_ref = as.character(substitute(module))
+ rm(list = module_path(module), envir = .loaded_modules)
+ # unset the module reference in its scope, i.e. the caller’s environment or
+ # some parent thereof.
+ rm(list = module_ref, envir = parent.frame(), inherits = TRUE)
+}
+
+#' Reload a given module
+#'
+#' Remove the loaded module from the cache, forcing a reload. The newly reloaded
+#' module is assigned to the module reference in the calling scope.
+#' @param module reference to the module which should be unloaded
+#' @note Any other references to the loaded modules remain unchanged, and will
+#' still work. Reloading modules is primarily useful for testing during
+#' development, and should not be used in production code.
+#'
+#' \code{reload} does not work correctly with attached environments.
+#' @seealso \code{import}
+#' @seealso \code{unload}
+#' @export
+reload = function (module) {
+ stopifnot(inherits(module, 'module'))
+ module_ref = as.character(substitute(module))
+ module_path = module_path(module)
+ module_name = module_name(module)
+ rm(list = module_path, envir = .loaded_modules)
+ #' @TODO Once we have `attach`, need also to take care of the search path
+ #' and whatnot.
+ mod_ns = do_import(module_name, module_path)
+ module_parent = parent.frame()
+ mod_env = exhibit_namespace(mod_ns, module_ref, module_parent)
+ assign(module_ref, mod_env, envir = module_parent, inherits = TRUE)
+}
diff --git a/samples/R/scholar.Rd b/samples/R/scholar.Rd
new file mode 100644
index 00000000..8a593b38
--- /dev/null
+++ b/samples/R/scholar.Rd
@@ -0,0 +1,25 @@
+\docType{package}
+\name{scholar}
+\alias{scholar}
+\alias{scholar-package}
+\title{scholar}
+\source{
+ The package reads data from
+ \url{http://scholar.google.com}. Dates and citation
+ counts are estimated and are determined automatically by
+ a computer program. Use at your own risk.
+}
+\description{
+ The \code{scholar} package provides functions to extract
+ citation data from Google Scholar. There are also
+ convenience functions for comparing multiple scholars and
+ predicting h-index scores based on past publication
+ records.
+}
+\note{
+ A complementary set of Google Scholar functions can be
+ found at
+ \url{http://biostat.jhsph.edu/~jleek/code/googleCite.r}.
+ The \code{scholar} package was developed independently.
+}
+
diff --git a/samples/Red/example.red b/samples/Red/example.red
new file mode 100644
index 00000000..66a5ada3
--- /dev/null
+++ b/samples/Red/example.red
@@ -0,0 +1,257 @@
+Red [
+ Title: "Red console"
+ Author: ["Nenad Rakocevic" "Kaj de Vos"]
+ File: %console.red
+ Tabs: 4
+ Rights: "Copyright (C) 2012-2013 Nenad Rakocevic. All rights reserved."
+ License: {
+ Distributed under the Boost Software License, Version 1.0.
+ See https://github.com/dockimbel/Red/blob/master/BSL-License.txt
+ }
+ Purpose: "Just some code for testing Pygments colorizer"
+ Language: http://www.red-lang.org/
+]
+
+#system-global [
+ #either OS = 'Windows [
+ #import [
+ "kernel32.dll" stdcall [
+ AttachConsole: "AttachConsole" [
+ processID [integer!]
+ return: [integer!]
+ ]
+ SetConsoleTitle: "SetConsoleTitleA" [
+ title [c-string!]
+ return: [integer!]
+ ]
+ ReadConsole: "ReadConsoleA" [
+ consoleInput [integer!]
+ buffer [byte-ptr!]
+ charsToRead [integer!]
+ numberOfChars [int-ptr!]
+ inputControl [int-ptr!]
+ return: [integer!]
+ ]
+ ]
+ ]
+ line-buffer-size: 16 * 1024
+ line-buffer: allocate line-buffer-size
+ ][
+ #switch OS [
+ MacOSX [
+ #define ReadLine-library "libreadline.dylib"
+ ]
+ #default [
+ #define ReadLine-library "libreadline.so.6"
+ #define History-library "libhistory.so.6"
+ ]
+ ]
+ #import [
+ ReadLine-library cdecl [
+ read-line: "readline" [ ; Read a line from the console.
+ prompt [c-string!]
+ return: [c-string!]
+ ]
+ rl-bind-key: "rl_bind_key" [
+ key [integer!]
+ command [integer!]
+ return: [integer!]
+ ]
+ rl-insert: "rl_insert" [
+ count [integer!]
+ key [integer!]
+ return: [integer!]
+ ]
+ ]
+ #if OS <> 'MacOSX [
+ History-library cdecl [
+ add-history: "add_history" [ ; Add line to the history.
+ line [c-string!]
+ ]
+ ]
+ ]
+ ]
+
+ rl-insert-wrapper: func [
+ [cdecl]
+ count [integer!]
+ key [integer!]
+ return: [integer!]
+ ][
+ rl-insert count key
+ ]
+
+ ]
+]
+
+Windows?: system/platform = 'Windows
+
+read-argument: routine [
+ /local
+ args [str-array!]
+ str [red-string!]
+][
+ if system/args-count <> 2 [
+ SET_RETURN(none-value)
+ exit
+ ]
+ args: system/args-list + 1 ;-- skip binary filename
+ str: simple-io/read-txt args/item
+ SET_RETURN(str)
+]
+
+init-console: routine [
+ str [string!]
+ /local
+ ret
+][
+ #either OS = 'Windows [
+ ;ret: AttachConsole -1
+ ;if zero? ret [print-line "ReadConsole failed!" halt]
+
+ ret: SetConsoleTitle as c-string! string/rs-head str
+ if zero? ret [print-line "SetConsoleTitle failed!" halt]
+ ][
+ rl-bind-key as-integer tab as-integer :rl-insert-wrapper
+ ]
+]
+
+input: routine [
+ prompt [string!]
+ /local
+ len ret str buffer line
+][
+ #either OS = 'Windows [
+ len: 0
+ print as c-string! string/rs-head prompt
+ ret: ReadConsole stdin line-buffer line-buffer-size :len null
+ if zero? ret [print-line "ReadConsole failed!" halt]
+ len: len + 1
+ line-buffer/len: null-byte
+ str: string/load as c-string! line-buffer len
+ ][
+ line: read-line as c-string! string/rs-head prompt
+ if line = null [halt] ; EOF
+
+ #if OS <> 'MacOSX [add-history line]
+
+ str: string/load line 1 + length? line
+; free as byte-ptr! line
+ ]
+ SET_RETURN(str)
+]
+
+count-delimiters: function [
+ buffer [string!]
+ return: [block!]
+][
+ list: copy [0 0]
+ c: none
+
+ foreach c buffer [
+ case [
+ escaped? [
+ escaped?: no
+ ]
+ in-comment? [
+ switch c [
+ #"^/" [in-comment?: no]
+ ]
+ ]
+ 'else [
+ switch c [
+ #"^^" [escaped?: yes]
+ #";" [if zero? list/2 [in-comment?: yes]]
+ #"[" [list/1: list/1 + 1]
+ #"]" [list/1: list/1 - 1]
+ #"{" [list/2: list/2 + 1]
+ #"}" [list/2: list/2 - 1]
+ ]
+ ]
+ ]
+ ]
+ list
+]
+
+do-console: function [][
+ buffer: make string! 10000
+ prompt: red-prompt: "red>> "
+ mode: 'mono
+
+ switch-mode: [
+ mode: case [
+ cnt/1 > 0 ['block]
+ cnt/2 > 0 ['string]
+ 'else [
+ prompt: red-prompt
+ do eval
+ 'mono
+ ]
+ ]
+ prompt: switch mode [
+ block ["[^-"]
+ string ["{^-"]
+ mono [red-prompt]
+ ]
+ ]
+
+ eval: [
+ code: load/all buffer
+
+ unless tail? code [
+ set/any 'result do code
+
+ unless unset? :result [
+ if 67 = length? result: mold/part :result 67 [ ;-- optimized for width = 72
+ clear back tail result
+ append result "..."
+ ]
+ print ["==" result]
+ ]
+ ]
+ clear buffer
+ ]
+
+ while [true][
+ unless tail? line: input prompt [
+ append buffer line
+ cnt: count-delimiters buffer
+
+ either Windows? [
+ remove skip tail buffer -2 ;-- clear extra CR (Windows)
+ ][
+ append buffer lf ;-- Unix
+ ]
+
+ switch mode [
+ block [if cnt/1 <= 0 [do switch-mode]]
+ string [if cnt/2 <= 0 [do switch-mode]]
+ mono [do either any [cnt/1 > 0 cnt/2 > 0][switch-mode][eval]]
+ ]
+ ]
+ ]
+]
+
+q: :quit
+
+if script: read-argument [
+ script: load script
+ either any [
+ script/1 <> 'Red
+ not block? script/2
+ ][
+ print "*** Error: not a Red program!"
+ ][
+ do skip script 2
+ ]
+ quit
+]
+
+init-console "Red Console"
+
+print {
+-=== Red Console alpha version ===-
+(only ASCII input supported)
+}
+
+do-console
\ No newline at end of file
diff --git a/samples/Red/example.reds b/samples/Red/example.reds
new file mode 100644
index 00000000..dd4ad0f9
--- /dev/null
+++ b/samples/Red/example.reds
@@ -0,0 +1,124 @@
+Red/System [
+ Title: "Red/System example file"
+ Purpose: "Just some code for testing Pygments colorizer"
+ Language: http://www.red-lang.org/
+]
+
+#include %../common/FPU-configuration.reds
+
+; C types
+
+#define time! long!
+#define clock! long!
+
+date!: alias struct! [
+ second [integer!] ; 0-61 (60?)
+ minute [integer!] ; 0-59
+ hour [integer!] ; 0-23
+
+ day [integer!] ; 1-31
+ month [integer!] ; 0-11
+ year [integer!] ; Since 1900
+
+ weekday [integer!] ; 0-6 since Sunday
+ yearday [integer!] ; 0-365
+ daylight-saving-time? [integer!] ; Negative: unknown
+]
+
+#either OS = 'Windows [
+ #define clocks-per-second 1000
+][
+ ; CLOCKS_PER_SEC value for Syllable, Linux (XSI-conformant systems)
+ ; TODO: check for other systems
+ #define clocks-per-second 1000'000
+]
+
+#import [LIBC-file cdecl [
+
+ ; Error handling
+
+ form-error: "strerror" [ ; Return error description.
+ code [integer!]
+ return: [c-string!]
+ ]
+ print-error: "perror" [ ; Print error to standard error output.
+ string [c-string!]
+ ]
+
+
+ ; Memory management
+
+ make: "calloc" [ ; Allocate zero-filled memory.
+ chunks [size!]
+ size [size!]
+ return: [binary!]
+ ]
+ resize: "realloc" [ ; Resize memory allocation.
+ memory [binary!]
+ size [size!]
+ return: [binary!]
+ ]
+ ]
+
+ JVM!: alias struct! [
+ reserved0 [int-ptr!]
+ reserved1 [int-ptr!]
+ reserved2 [int-ptr!]
+
+ DestroyJavaVM [function! [[JNICALL] vm [JVM-ptr!] return: [jint!]]]
+ AttachCurrentThread [function! [[JNICALL] vm [JVM-ptr!] penv [struct! [p [int-ptr!]]] args [byte-ptr!] return: [jint!]]]
+ DetachCurrentThread [function! [[JNICALL] vm [JVM-ptr!] return: [jint!]]]
+ GetEnv [function! [[JNICALL] vm [JVM-ptr!] penv [struct! [p [int-ptr!]]] version [integer!] return: [jint!]]]
+ AttachCurrentThreadAsDaemon [function! [[JNICALL] vm [JVM-ptr!] penv [struct! [p [int-ptr!]]] args [byte-ptr!] return: [jint!]]]
+]
+
+ ;just some datatypes for testing:
+
+ #some-hash
+ 10-1-2013
+ quit
+
+ ;binary:
+ #{00FF0000}
+ #{00FF0000 FF000000}
+ #{00FF0000 FF000000} ;with tab instead of space
+ 2#{00001111}
+ 64#{/wAAAA==}
+ 64#{/wAAA A==} ;with space inside
+ 64#{/wAAA A==} ;with tab inside
+
+
+ ;string with char
+ {bla ^(ff) foo}
+ {bla ^(( foo}
+ ;some numbers:
+ 12
+ 1'000
+ 1.2
+ FF00FF00h
+
+ ;some tests of hexa number notation with not common ending
+ [ff00h ff00h] ff00h{} FFh"foo" 00h(1 + 2) (AEh)
+
+;normal words:
+foo char
+
+;get-word
+:foo
+
+;lit-word:
+'foo 'foo
+
+to-integer foo
+foo/(a + 1)/b
+
+call/output reform ['which interpreter] path: copy ""
+
+ version-1.1: 00010001h
+
+ #if type = 'exe [
+ push system/stack/frame ;-- save previous frame pointer
+ system/stack/frame: system/stack/top ;-- @@ reposition frame pointer just after the catch flag
+]
+push CATCH_ALL ;-- exceptions root barrier
+push 0 ;-- keep stack aligned on 64-bit
\ No newline at end of file
diff --git a/samples/Ruby/filenames/.pryrc b/samples/Ruby/filenames/.pryrc
new file mode 100644
index 00000000..3fb31ad4
--- /dev/null
+++ b/samples/Ruby/filenames/.pryrc
@@ -0,0 +1,19 @@
+Pry.config.commands.import Pry::ExtendedCommands::Experimental
+
+Pry.config.pager = false
+
+Pry.config.color = false
+
+Pry.config.commands.alias_command "lM", "ls -M"
+
+Pry.config.commands.command "add", "Add a list of numbers together" do |*args|
+ output.puts "Result is: #{args.map(&:to_i).inject(&:+)}"
+end
+
+Pry.config.history.should_save = false
+
+Pry.config.prompt = [proc { "input> " },
+ proc { " | " }]
+
+# Disable pry-buggy-plug:
+Pry.plugins["buggy-plug"].disable!
diff --git a/samples/SAS/data.sas b/samples/SAS/data.sas
new file mode 100644
index 00000000..e4e9bb07
--- /dev/null
+++ b/samples/SAS/data.sas
@@ -0,0 +1,17 @@
+/* Example DATA step code for linguist */
+
+libname source 'C:\path\to\file'
+
+data work.working_copy;
+ set source.original_file.sas7bdat;
+run;
+
+data work.working_copy;
+ set work.working_copy;
+ if Purge = 1 then delete;
+run;
+
+data work.working_copy;
+ set work.working_copy;
+ if ImportantVariable = . then MissingFlag = 1;
+run;
\ No newline at end of file
diff --git a/samples/SAS/proc.sas b/samples/SAS/proc.sas
new file mode 100644
index 00000000..80cc1676
--- /dev/null
+++ b/samples/SAS/proc.sas
@@ -0,0 +1,15 @@
+/* PROC examples for Linguist */
+
+proc surveyselect data=work.data out=work.boot method=urs reps=20000 seed=2156 sampsize=28 outhits;
+ samplingunit Site;
+run;
+
+PROC MI data=work.boot out=work.bootmi nimpute=30 seed=5686 round = 1;
+ By Replicate;
+ VAR Variable1 Variable2;
+run;
+
+proc logistic data=work.bootmi descending;
+ By Replicate _Imputation_;
+ model Outcome = Variable1 Variable2 / risklimits;
+run;
\ No newline at end of file
diff --git a/samples/SQL/AvailableInSearchSel.prc b/samples/SQL/AvailableInSearchSel.prc
new file mode 100644
index 00000000..b37a89c5
--- /dev/null
+++ b/samples/SQL/AvailableInSearchSel.prc
@@ -0,0 +1,19 @@
+IF EXISTS (SELECT * FROM DBO.SYSOBJECTS WHERE ID = OBJECT_ID(N'dbo.AvailableInSearchSel') AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
+ DROP PROCEDURE dbo.AvailableInSearchSel
+GO
+CREATE Procedure AvailableInSearchSel
+AS
+
+ SELECT '-1',
+ 'Select...'
+ UNION ALL
+ SELECT '1',
+ 'Yes'
+ UNION ALL
+ SELECT '0',
+ 'No'
+GO
+IF DB_NAME() = 'Diebold' BEGIN
+ GRANT EXECUTE ON dbo.AvailableInSearchSel TO [rv]
+END
+GO
diff --git a/samples/SQL/db.sql b/samples/SQL/db.sql
new file mode 100644
index 00000000..860dcb0f
--- /dev/null
+++ b/samples/SQL/db.sql
@@ -0,0 +1,225 @@
+SHOW WARNINGS;
+--
+-- Table structure for table `articles`
+--
+CREATE TABLE IF NOT EXISTS `articles` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `title` varchar(255) DEFAULT NULL,
+ `content` longtext,
+ `date_posted` datetime NOT NULL,
+ `created_by` varchar(255) NOT NULL,
+ `last_modified` datetime DEFAULT NULL,
+ `last_modified_by` varchar(255) DEFAULT NULL,
+ `ordering` int(10) DEFAULT '0',
+ `is_published` int(1) DEFAULT '1',
+ PRIMARY KEY (`id`)
+);
+
+--
+-- Dumping data for table `articles`
+--
+
+INSERT INTO `articles` (`title`, `content`, `date_posted`, `created_by`, `last_modified`, `last_modified_by`, `ordering`, `is_published`) VALUES
+('Welcome', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed interdum, felis ac pellentesque feugiat, massa enim sagittis elit, sed dignissim sem ligula non nisl. Sed pulvinar nunc nec eros aliquet non tempus diam vehicula. Nunc tincidunt, leo ut interdum tristique, quam ligula porttitor tellus, at tincidunt magna enim nec arcu. Nunc tempor egestas libero. Vivamus nulla ligula, vehicula vitae mattis quis, laoreet eget urna. Proin eget est quis urna venenatis dictum nec vel lectus. Nullam sit amet vehicula leo. Sed commodo, orci vitae facilisis accumsan, arcu justo sagittis risus, quis aliquet purus neque eu odio. Mauris lectus orci, tincidunt in varius quis, dictum sed nibh. Quisque dapibus mollis blandit. Donec vel tellus nisl, sed scelerisque felis. Praesent ut eros tortor, sed molestie nunc. Duis eu massa at justo iaculis gravida.
\r\nIn adipiscing dictum risus a tincidunt. Sed nisi ipsum, rutrum sed ornare in, bibendum at augue. Integer ornare semper varius. Integer luctus vehicula elementum. Donec cursus elit quis erat laoreet elementum. Praesent eget justo purus, vitae accumsan massa. Ut tristique, mauris non dignissim luctus, velit justo sollicitudin odio, vel rutrum purus enim eu felis. In adipiscing elementum sagittis. Nam sed dui ante. Nunc laoreet hendrerit nisl vitae porta. Praesent sit amet ligula et nisi vulputate volutpat. Maecenas venenatis iaculis sapien sit amet auctor. Curabitur euismod venenatis velit non tempor. Cras vel sapien purus, mollis fermentum nulla. Mauris sed elementum enim. Donec ultrices urna at justo adipiscing rutrum.
', '2012-08-09 01:19:59', 'admin',NULL, NULL, 0, 1);
+
+
+-- --------------------------------------------------------
+
+--
+-- Table structure for table `challenges`
+--
+
+CREATE TABLE IF NOT EXISTS `challenges` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `title` varchar(255) DEFAULT NULL,
+ `pkg_name` varchar(255) NOT NULL,
+ `description` text,
+ `author` varchar(255) NOT NULL,
+ `category` varchar(255) NOT NULL,
+ `date_posted` datetime NOT NULL,
+ `visibility` varchar(255) DEFAULT 'private',
+ `publish` int(10) DEFAULT '0',
+ `abstract` varchar(255) DEFAULT NULL,
+ `level` varchar(255) DEFAULT NULL,
+ `duration` int(11) DEFAULT NULL,
+ `goal` varchar(255) DEFAULT NULL,
+ `solution` varchar(255) DEFAULT NULL,
+ `availability` varchar(255) DEFAULT 'private',
+ `default_points` int(11) DEFAULT NULL,
+ `default_duration` int(11) DEFAULT NULL,
+ PRIMARY KEY (`id`)
+);
+
+--
+-- Dumping data for table `challenges`
+--
+
+INSERT INTO `challenges` (`title`, `pkg_name`, `description`, `author`, `category`, `date_posted`, `visibility`, `publish`, `abstract`, `level`, `duration`, `goal`, `solution`, `availability`, `default_points`, `default_duration`) VALUES
+('Challenge 1', 'ch001', 'Our agents (hackers) informed us that there reasonable suspicion \r\nthat the site of this Logistics Company is a blind \r\nfor a human organs'' smuggling organisation. This organisation attracts its \r\nvictims through advertisments for jobs with very high salaries. They choose those ones who \r\ndo not have many relatives, they assasinate them and then sell their organs to very rich \r\nclients, at very high prices. These employees are registered in the secret \r\nfiles of the company as "special clients"! One of our agents has been hired \r\nas by the particular company. Unfortunately, since 01/01/2007 he has gone missing. \r\n We know that our agent is alive, but we cannot contact him. Last time he \r\ncommunicated with us, he mentioned that we could contact him at the e-mail address the \r\ncompany has supplied him with, should there a problem arise. The problem is \r\nthat when we last talked to him, he had not a company e-mail address yet, but he told us \r\nthat his e-mail can be found through the company''s site. The only thing we \r\nremember is that he was hired on Friday the 13th! You have to find his e-mail \r\naddress and send it to us by using the central communication panel of the company''s \r\nsite. Good luck!!!', 'Andreas Venieris,\n Konstantinos Papapanagiotou,\n \n Anastasios Stasinopoulos,\n Vasilios Vlachos,\n Alexandros \nPapanikolaou', 'web', '2012-08-09 00:23:14', 'public', 1, NULL, '1', 60, NULL, NULL, 'public', 1, 60),
+('Challenge 2', 'ch002', 'Your Country needs your help for finding the password of an enemy \r\n\r\nsite that contains useful information, which if is not acquired on time, peace in our \r\n\r\narea will be at stake. \n You must therefore succeed in finding the \r\n\r\npassword of this military SITE . Good luck!', 'Andreas Venieris,\n Konstantinos Papapanagiotou,\n Anastasios \r\n\r\nStasinopoulos,\n Vasilios Vlachos,\n Alexandros Papanikolaou', 'web', '0000-00-00 00:00:00', 'public', 1, NULL, '1', 60, NULL, NULL, 'public', 1, 60),
+('Challenge 3', 'ch003', 'XSS permits a malevolent user to inject his own code in vulnerable \r\n\r\nweb pages. According to the OWASP 2010 Top 10 Application Security Risks, XSS attacks \r\n\r\nrank 2nd in the "most dangerous" list. Your objective is to make an alert \r\n\r\nbox appear HERE bearing the message: \r\n\r\n"XSS! ".', 'Andreas Venieris,\n Konstantinos Papapanagiotou,\n \r\n\r\n Anastasios Stasinopoulos,\n Vasilios Vlachos,\n Alexandros \r\n\r\nPapanikolaou', 'web', '2012-08-09 00:24:46', 'public', 1, NULL, '1', 60, NULL, NULL, 'public', 1, 60),
+('Challenge 4', 'ch004', 'A hacker informed us that this site suffers from an XSS-like type of vulnerability. Unfortunately, he \r\n\r\nlost the notes he had written regarding how exactly did he exploit the aforementioned \r\n\r\nvulnerability. Your objective is to make an alert box appear, bearing the message \r\n\r\n"XSS! ". It should be noted, however, that this site has some protection \r\n\r\nagainst such attacks.', 'Andreas Venieris,\n Konstantinos Papapanagiotou,\n \r\n\r\nAnastasios Stasinopoulos,\n Vasilios Vlachos,\n Alexandros \r\n\r\nPapanikolaou', 'web', '2012-08-09 00:25:25', 'public', 1, NULL, '1', 60, NULL, NULL, 'public', 1, 60),
+('Challenge 5', 'ch005', 'You need to get access to the contents of this SITE . In order to achieve this, however, you \r\n\r\nmust buy the "p0wnBrowser" web browser. Since it is too expensive, you will have to \r\n\r\n"fool" the system in some way, so that it let you read the site''s contents.', 'Andreas \r\n\r\nVenieris,\n Konstantinos Papapanagiotou,\n Anastasios Stasinopoulos,\n \r\n\r\nVasilios Vlachos,\n Alexandros Papanikolaou', 'web', '2012-08-09 00:26:09', 'public', 1, NULL, '1', 60, NULL, NULL, 'public', 1, 60),
+('Challenge 6', 'ch006', 'In this assignment you must prove your... knightly skills! Real \r\n\r\nknights have not disappeared.They still exist, keeping their secrets well hidden. \r\n\r\nYour mission is to infiltrate their SITE . \r\n\r\nThere is a small problem, however... We don''t know the password! Perhaps you could \r\n\r\nfind it? Let''s see! g00d luck dudes!', 'Andreas Venieris,\n Konstantinos \r\n\r\nPapapanagiotou,\n Anastasios Stasinopoulos,\n Vasilios Vlachos,\n \r\n\r\nAlexandros Papanikolaou', 'web', '2012-08-09 00:26:52', 'public', 1, NULL, '1', 60, NULL, NULL, 'public', 1, 60),
+('Challenge 7', 'ch007', 'A good friend of mine studies at Acme University, in the Computer Science and Telecomms Department . \r\n\r\nUnfortunately, her grades are not that good. You are now thinking "This is big news!"... \r\n\r\nHmmm, maybe not. What is big news, however, is this: The network administrator asked for \r\n\r\n3,000 euros to change her marks into A''s. This is obviously a case of administrative \r\n\r\nauthority abuse. Hence... a good chance for D-phase and public exposure... I need to \r\n\r\nget into the site as admin and upload an index.htm file in the web-root directory, that \r\n\r\nwill present all required evidence for the University''s latest "re-marking" practices!\r\n\r\n I only need you to find the admin password for me... Good \r\n\r\nLuck!', 'Andreas Venieris,\n Konstantinos Papapanagiotou,\n Anastasios \r\n\r\nStasinopoulos,\n Vasilios Vlachos,\n Alexandros Papanikolaou', 'web', '0000-00-00 00:00:00', 'public', 1, NULL, '1', 60, NULL, NULL, 'public', 1, 60),
+('Challenge 8', 'ch008', 'You have managed, after several tries, to install a backdoor shell \r\n\r\n(Locus7Shell) to trytohack.gr The \r\n\r\nproblem is that, in order to execute the majority of the commands (on the machine running \r\n\r\nthe backdoor) you must have super-user rights (root). Your aim is to obtain \r\n\r\nroot rights.', 'Andreas Venieris,\n Konstantinos Papapanagiotou,\n Anastasios \r\n\r\nStasinopoulos,\n Vasilios Vlachos,\n Alexandros Papanikolaou', 'web', '0000-00-00 00:00:00', 'public', 1, NULL, '1', 60, NULL, NULL, 'public', 1, 60),
+('Challenge 9', 'ch009', 'A friend of yours has set up a news blog at slagoff.com . However, he is kind of worried \r\n\r\nregarding the security of the news that gets posted on the blog and has asked you to check \r\n\r\nhow secure it is. Your objective is to determine whether any vulnerabilities \r\n\r\nexist that, if exploited, can grant access to the blog''s server. Hint: A \r\n\r\nspecially-tailored backdoor shell can be found at "http://www.really_nasty_hacker.com/shell.txt ".', 'Andreas Venieris,\n \r\n\r\nKonstantinos Papapanagiotou,\n Anastasios Stasinopoulos,\n Vasilios Vlachos,\r\n\r\n\n Alexandros Papanikolaou', 'web', '2012-08-09 00:31:31', 'public', 1, NULL, '1', 60, NULL, NULL, 'public', 1, 60),
+('Challenge 10', 'ch010', 'Would you like to become an active hacker ? How about \r\n\r\nbecoming a member of the world''s largest hacker group: The n1nJ4.n4x0rZ.CreW! \r\n\r\n Before you can join though, you ''ll have to prove yourself worthy by passing the \r\n\r\ntest that can be found at: http://n1nj4h4x0rzcr3w.com If you succeed in completing the challenge, \r\n\r\nyou will get a serial number, which you will use for obtaining the password that will \r\n\r\nenable you to join the group. Your objective is to bypass the authentication \r\n\r\nmechanism, find the serial number and be supplied with your own username and password from \r\n\r\n the admin team of the site.', 'Andreas Venieris,\n Konstantinos Papapanagiotou,\n \r\n\r\n Anastasios Stasinopoulos,\n Vasilios Vlachos,\n Alexandros \r\n\r\nPapanikolaou', 'web', '2012-08-09 00:32:07', 'public', 1, NULL, '1', 60, NULL, NULL, 'public', 1, 60),
+('Example Template For Challenge xml Files creation', 'example', 'Insert some text describing the scenario of the challenge(what the users are supposed to do and if there is any fictional story)
', 'Name or email or both', 'In what category does your challenge belong?(web? crypto? networks?)', '2012-10-16 22:35:01', 'private', 0, NULL, '1', 60, NULL, NULL, 'private', 1, 0),
+('cookiEng', 'cookiEng', 'Hello, we have heard that you are one of the best hackers in our country. We need your services. You must visit an underground site and find the right password. With this password we will cancel 100k+ illegal gun and drug deals!\n The good news are that we have the directory where the password is stored. Its here \\\"/t0psec.php\\\".\n The bad news are that we have no access there. Only the administrator does. Go and find the password for us! Good luck!
', 'Nikos Danopoulos', 'web', '2012-08-09 00:32:07', 'public', 1, NULL, '1', 60, NULL, NULL, 'public', 1, 60),
+('Izon Challenge', 'izon', 'After the mysterious disappearance of your best friend, you are contacted by an unknown individual who claims to have information about your friend. This individual identifies himself as \"Mister Jax\" and claims that is a former colleague of your friend.
Your friend was working at Izon Corporation, a weapons manufactured and government contractor as a systems engineer. Mister Jax didn\'t tell you his role in Izon, but wants you to pass through a series of tests to infiltrate Izon\'s web security to find the truth about your friend
After much consideration you agree with Mister Jax and he, remotely, sets up your computer to look like as if it is a part of Izon\'s Virtual Private Network in order to access their site. He also said that he\'ll guide you while you work your way to uncover the truth about your lost friend
Here is a copy of Mister Jax\'s last email:
The task is simple: You get in, get your information and get out.\r\nYour friend was either a dumb programmer or a brilliant one, he left\r\nmany holes to be exploited in order to gain higher access to the site.\r\nI\'ll be guiding you with tips while you try to hack through Izon\'s site.\r\nThere are four tasks, some related to each other, some not.\r\nYou need to use your skills to overcome the obstacles, knowledge will come along.\r\nSixty minutes will suffice. When they\'re over, I won\'t be able to offer any\r\ncover to you, and you\'ll be compromised, with unknown consequences, I\'m afraid.\r\nI\'ll be seeing you there.\r\n\r\ - Jax Once you get in, you\'ll have sixty minutes to complete this challenge. Use common sense, remember that the most obvious place hides the most important stuff and try to behave as if you were hacking a real system.
Good Luck!
', 'Vasileios Mplanas', 'web', '2014-03-27 00:00:00', 'public', 1, NULL, '1', 60, NULL, NULL, 'public', 10, 60);
+-- --------------------------------------------------------
+
+--
+-- Table structure for table `challenge_attempts`
+--
+
+CREATE TABLE IF NOT EXISTS `challenge_attempts` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `user_id` int(11) NOT NULL,
+ `challenge_id` int(11) NOT NULL,
+ `time` datetime NOT NULL,
+ `status` varchar(255) NOT NULL,
+ PRIMARY KEY (`id`)
+);
+
+-- --------------------------------------------------------
+
+--
+-- Table structure for table `challenge_attempt_count`
+--
+
+CREATE TABLE IF NOT EXISTS `challenge_attempt_count` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `user_id` int(11) NOT NULL,
+ `challenge_id` int(11) NOT NULL,
+ `tries` int(11) DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `user_id` (`user_id`),
+ UNIQUE KEY `challenge_id` (`challenge_id`)
+);
+-- --------------------------------------------------------
+
+--
+-- Table structure for table `classes`
+--
+
+CREATE TABLE IF NOT EXISTS `classes` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `name` varchar(255) NOT NULL,
+ `date_created` datetime NOT NULL,
+ `archive` int(1) DEFAULT '0',
+ PRIMARY KEY (`id`)
+);
+
+--
+-- Dumping data for table `classes`
+--
+
+INSERT INTO `classes` (`name`, `date_created`, `archive`) VALUES
+('Sample Class', '2012-08-09 00:43:48', 0),
+('fooClass', '2012-10-16 22:32:43', 0);
+
+-- --------------------------------------------------------
+
+--
+-- Table structure for table `class_challenges`
+--
+
+CREATE TABLE IF NOT EXISTS `class_challenges` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `challenge_id` int(11) NOT NULL,
+ `class_id` int(11) NOT NULL,
+ `date_created` datetime NOT NULL,
+ PRIMARY KEY (`id`)
+);
+
+--
+-- Dumping data for table `class_challenges`
+--
+
+INSERT INTO `class_challenges` (`challenge_id`, `class_id`, `date_created`) VALUES
+(1, 1, '2012-08-09 01:01:07'),
+(2, 1, '2012-08-09 01:01:07'),
+(3, 1, '2012-08-09 01:01:07'),
+(4, 1, '2012-08-09 01:01:07'),
+(5, 1, '2012-08-09 01:01:07'),
+(6, 1, '2012-08-09 01:01:07'),
+(7, 1, '2012-08-09 01:01:07'),
+(9, 1, '2012-08-09 01:01:07'),
+(10, 1, '2012-08-09 01:01:07'),
+(1, 2, '2012-10-16 22:32:49'),
+(4, 2, '2012-10-16 22:32:52'),
+(9, 2, '2012-10-16 22:32:53'),
+(10, 2, '2012-10-16 22:32:55'),
+(8, 2, '2012-10-16 22:32:58');
+
+-- --------------------------------------------------------
+
+--
+-- Table structure for table `class_memberships`
+--
+
+CREATE TABLE IF NOT EXISTS `class_memberships` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `user_id` int(11) NOT NULL,
+ `class_id` int(11) NOT NULL,
+ `date_created` datetime NOT NULL,
+ PRIMARY KEY (`user_id`,`class_id`),
+ UNIQUE KEY `id` (`id`)
+);
+
+--
+-- Dumping data for table `class_memberships`
+--
+
+INSERT INTO `class_memberships` (`user_id`, `class_id`, `date_created`) VALUES
+( 1, 1, '2012-08-09 00:59:00'),
+( 2, 1, '2012-08-09 00:59:00'),
+( 3, 1, '2012-08-09 00:59:00'),
+( 4, 2, '2012-10-16 22:33:07'),
+( 5, 2, '2012-10-16 22:33:13');
+
+-- --------------------------------------------------------
+
+--
+-- Table structure for table `users`
+--
+
+CREATE TABLE IF NOT EXISTS `users` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `username` varchar(255) NOT NULL,
+ `full_name` varchar(255) NOT NULL,
+ `email` varchar(100) NOT NULL,
+ `password` varchar(255) NOT NULL,
+ `joined` datetime NOT NULL,
+ `last_visit` datetime DEFAULT NULL,
+ `is_activated` int(1) DEFAULT '0',
+ `type` int(10) DEFAULT '0',
+ `token` int(10) DEFAULT '0',
+ PRIMARY KEY (`username`),
+ UNIQUE KEY `id` (`id`)
+);
+
+--
+-- Dumping data for table `users`
+--
+
+INSERT INTO `users` (`username`, `full_name`, `email`, `password`, `joined`, `last_visit`, `is_activated`, `type`, `token`) VALUES
+('bar', 'mr. bar', 'bar@owasp.com', '$P$BJ8UtXZYqS/Lokm8zFMwcxO8dq797P.', '2012-10-16 22:12:52', '2012-10-16 22:22:39', 0, 0, 0),
+('foo', 'mr. foo', 'foo@owasp.com', '$P$BxCHeVG1RMF06UxwRbrVQtPA1yOwAq.', '2012-10-16 22:12:34', '2012-10-16 22:59:29', 0, 0, 0),
+('sensei', 'waspy sifu', 'waspy@owasp.sifu', '$P$Bj/JtLJJR3bUD0LLWXL2UW9DuRVo0I.', '2012-10-16 22:36:06', '2012-10-16 22:37:04', 1, 2, 0);
+
+--
+-- Table structure for table `user_has_challenge_token`
+--
+DROP TABLE IF EXISTS `user_has_challenge_token`;
+CREATE TABLE IF NOT EXISTS `user_has_challenge_token` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `user_id` varchar(512) NOT NULL,
+ `challenge_id` varchar(512) NOT NULL,
+ `token` varchar(256) NOT NULL,
+ PRIMARY KEY (`id`)
+);
+
+SHOW WARNINGS;
diff --git a/samples/SQL/filial.tab b/samples/SQL/filial.tab
new file mode 100644
index 00000000..44140e9e
--- /dev/null
+++ b/samples/SQL/filial.tab
@@ -0,0 +1,22 @@
+create table FILIAL
+(
+ id NUMBER not null,
+ title_ua VARCHAR2(128) not null,
+ title_ru VARCHAR2(128) not null,
+ title_eng VARCHAR2(128) not null,
+ remove_date DATE,
+ modify_date DATE,
+ modify_user VARCHAR2(128)
+)
+;
+alter table FILIAL
+ add constraint PK_ID primary key (ID);
+grant select on FILIAL to ATOLL;
+grant select on FILIAL to CRAMER2GIS;
+grant select on FILIAL to DMS;
+grant select on FILIAL to HPSM2GIS;
+grant select on FILIAL to PLANMONITOR;
+grant select on FILIAL to SIEBEL;
+grant select on FILIAL to VBIS;
+grant select on FILIAL to VPORTAL;
+
diff --git a/samples/SQL/object-update.udf b/samples/SQL/object-update.udf
new file mode 100644
index 00000000..4b4a6d6e
--- /dev/null
+++ b/samples/SQL/object-update.udf
@@ -0,0 +1,8 @@
+
+if not exists(select * from sysobjects where name = '%object_name%' and type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
+ exec('create FUNCTION dbo.%object_name%() returns int as begin return null end')
+GO
+
+%object_ddl%
+
+go
diff --git a/samples/SQL/suspendedtoday.viw b/samples/SQL/suspendedtoday.viw
new file mode 100644
index 00000000..f9de6e6d
--- /dev/null
+++ b/samples/SQL/suspendedtoday.viw
@@ -0,0 +1,6 @@
+use translog;
+DROP VIEW IF EXISTS `suspendedtoday`;
+
+create view suspendedtoday as
+select * from suspended
+where datediff(datetime, now()) = 0;
diff --git a/samples/STON/Array.ston b/samples/STON/Array.ston
new file mode 100644
index 00000000..b5d8bb58
--- /dev/null
+++ b/samples/STON/Array.ston
@@ -0,0 +1 @@
+[1, 2, 3]
diff --git a/samples/STON/Dictionary.ston b/samples/STON/Dictionary.ston
new file mode 100644
index 00000000..ae4e2731
--- /dev/null
+++ b/samples/STON/Dictionary.ston
@@ -0,0 +1 @@
+{#a : 1, #b : 2}
diff --git a/samples/STON/Rectangle.ston b/samples/STON/Rectangle.ston
new file mode 100644
index 00000000..f9c81b33
--- /dev/null
+++ b/samples/STON/Rectangle.ston
@@ -0,0 +1,4 @@
+Rectangle {
+ #origin : Point [ -40, -15 ],
+ #corner : Point [ 60, 35 ]
+ }
diff --git a/samples/STON/TestDomainObject.ston b/samples/STON/TestDomainObject.ston
new file mode 100644
index 00000000..d054f4c5
--- /dev/null
+++ b/samples/STON/TestDomainObject.ston
@@ -0,0 +1,15 @@
+TestDomainObject {
+ #created : DateAndTime [ '2012-02-14T16:40:15+01:00' ],
+ #modified : DateAndTime [ '2012-02-14T16:40:18+01:00' ],
+ #integer : 39581,
+ #float : 73.84789359463944,
+ #description : 'This is a test',
+ #color : #green,
+ #tags : [
+ #two,
+ #beta,
+ #medium
+ ],
+ #bytes : ByteArray [ 'afabfdf61d030f43eb67960c0ae9f39f' ],
+ #boolean : false
+}
diff --git a/samples/STON/ZNResponse.ston b/samples/STON/ZNResponse.ston
new file mode 100644
index 00000000..66378370
--- /dev/null
+++ b/samples/STON/ZNResponse.ston
@@ -0,0 +1,30 @@
+ZnResponse {
+ #headers : ZnHeaders {
+ #headers : ZnMultiValueDictionary {
+ 'Date' : 'Fri, 04 May 2012 20:09:23 GMT',
+ 'Modification-Date' : 'Thu, 10 Feb 2011 08:32:30 GMT',
+ 'Content-Length' : '113',
+ 'Server' : 'Zinc HTTP Components 1.0',
+ 'Vary' : 'Accept-Encoding',
+ 'Connection' : 'close',
+ 'Content-Type' : 'text/html;charset=utf-8'
+ }
+ },
+ #entity : ZnStringEntity {
+ #contentType : ZnMimeType {
+ #main : 'text',
+ #sub : 'html',
+ #parameters : {
+ 'charset' : 'utf-8'
+ }
+ },
+ #contentLength : 113,
+ #string : '\nSmall \nSmall This is a small HTML document
\n\n',
+ #encoder : ZnUTF8Encoder { }
+ },
+ #statusLine : ZnStatusLine {
+ #version : 'HTTP/1.1',
+ #code : 200,
+ #reason : 'OK'
+ }
+ }
diff --git a/samples/STON/methodProperties.ston b/samples/STON/methodProperties.ston
new file mode 100644
index 00000000..40a1a0fe
--- /dev/null
+++ b/samples/STON/methodProperties.ston
@@ -0,0 +1,24 @@
+{
+ "class" : {
+ },
+ "instance" : {
+ "clientList:listElement:" : "dkh 03/20/2014 16:27",
+ "copyObjectMenuAction:selectionIndex:" : "dkh 10/13/2013 10:20",
+ "definitionForSelection:" : "dkh 10/13/2013 10:15",
+ "editMenuActionSpec" : "dkh 10/13/2013 10:19",
+ "itemSelected:listElement:selectedIndex:shiftPressed:" : "dkh 10/20/2013 11:06",
+ "menuActionSpec:" : "dkh 10/19/2013 17:12",
+ "repository:" : "dkh 10/19/2013 17:36",
+ "theList" : "dkh 10/12/2013 15:51",
+ "versionInfoBlock:" : "dkh 10/19/2013 17:08",
+ "versionInfoDiffVsSelection:selectedIndex:" : "dkh 10/19/2013 17:48",
+ "versionInfoDiffVsWorkingCopy:selectedIndex:" : "dkh 10/20/2013 12:36",
+ "versionInfoSelect:selectedIndex:" : "dkh 10/12/2013 17:04",
+ "versionInfos" : "dkh 10/19/2013 17:13",
+ "versionSummaryIsClosing" : "dkh 10/20/2013 10:19",
+ "windowIsClosing:" : "dkh 10/20/2013 10:39",
+ "windowLabel" : "dkh 05/20/2014 11:00",
+ "windowLocation" : "dkh 05/23/2014 10:17",
+ "windowName" : "dkh 10/12/2013 16:00",
+ "workingCopy" : "dkh 10/12/2013 16:16",
+ "workingCopy:" : "dkh 10/12/2013 16:17" } }
diff --git a/samples/STON/properties.ston b/samples/STON/properties.ston
new file mode 100644
index 00000000..b4aa0206
--- /dev/null
+++ b/samples/STON/properties.ston
@@ -0,0 +1,19 @@
+{
+ "category" : "Topez-Server-Core",
+ "classinstvars" : [
+ ],
+ "classvars" : [
+ ],
+ "commentStamp" : "",
+ "instvars" : [
+ "workingCopy",
+ "repository",
+ "versionInfos",
+ "versionInfoBlock",
+ "selectedVersionInfo",
+ "versionInfoSummaryWindowId" ],
+ "name" : "TDVersionInfoBrowser",
+ "pools" : [
+ ],
+ "super" : "TDAbstractMonticelloToolBuilder",
+ "type" : "normal" }
diff --git a/samples/Slim/sample.slim b/samples/Slim/sample.slim
new file mode 100644
index 00000000..9480a9ff
--- /dev/null
+++ b/samples/Slim/sample.slim
@@ -0,0 +1,31 @@
+doctype html
+html
+ head
+ title Slim Examples
+ meta name="keywords" content="template language"
+ meta name="author" content=author
+ javascript:
+ alert('Slim supports embedded javascript!')
+
+ body
+ h1 Markup examples
+
+ #content
+ p This example shows you how a basic Slim file looks like.
+
+ == yield
+
+ - unless items.empty?
+ table
+ - for item in items do
+ tr
+ td.name = item.name
+ td.price = item.price
+ - else
+ p
+ | No items found. Please add some inventory.
+ Thank you!
+
+ div id="footer"
+ = render 'footer'
+ | Copyright © #{year} #{author}
diff --git a/samples/Smalltalk/Dinner.st b/samples/Smalltalk/Dinner.st
new file mode 100644
index 00000000..9304cbc0
--- /dev/null
+++ b/samples/Smalltalk/Dinner.st
@@ -0,0 +1,111 @@
+"======================================================================
+|
+| Smalltalk dining philosophers
+|
+|
+ ======================================================================"
+
+
+"======================================================================
+|
+| Copyright 1999, 2000 Free Software Foundation, Inc.
+| Written by Paolo Bonzini.
+|
+| This file is part of GNU Smalltalk.
+|
+| GNU Smalltalk is free software; you can redistribute it and/or modify it
+| under the terms of the GNU General Public License as published by the Free
+| Software Foundation; either version 2, or (at your option) any later version.
+|
+| GNU Smalltalk is distributed in the hope that it will be useful, but WITHOUT
+| ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+| FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+| details.
+|
+| You should have received a copy of the GNU General Public License along with
+| GNU Smalltalk; see the file COPYING. If not, write to the Free Software
+| Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+|
+ ======================================================================"
+
+
+Object subclass: #Philosophers
+ instanceVariableNames: 'forks philosophers randy eating'
+ classVariableNames: ''
+ poolDictionaries: ''
+ category: 'Examples-Processes'!
+
+!Philosophers class methodsFor: 'dining'!
+
+new
+ self shouldNotImplement
+!
+
+new: quantity
+ ^super new initialize: quantity
+! !
+
+!Philosophers methodsFor: 'dining'!
+
+dine
+ self dine: 15
+!
+
+dine: seconds
+ (Delay forSeconds: seconds) wait.
+ philosophers do: [ :each | each terminate ].
+ self initialize: self size
+!
+
+leftFork: n
+ ^forks at: n
+!
+
+rightFork: n
+ ^n = self size
+ ifTrue: [ forks at: 1 ]
+ ifFalse: [ forks at: n + 1 ]
+!
+
+initialize: n
+ eating := Semaphore new.
+ n - 1 timesRepeat: [ eating signal ].
+
+ randy := Random new.
+ forks := (1 to: n) collect: [ :each | Semaphore forMutualExclusion ].
+ philosophers := (1 to: n) collect: [ :each | self philosopher: each ].
+!
+
+philosopher: n
+ | philosopherCode leftFork rightFork status |
+ leftFork := self leftFork: n.
+ rightFork := self rightFork: n.
+ status := 'Philosopher #', n printString, ' '.
+ philosopherCode := [[ true ] whileTrue: [
+ Transcript nextPutAll: status, 'thinks'; nl.
+ (Delay forMilliseconds: randy next * 2000) wait.
+ Transcript nextPutAll: status, 'wants to eat'; nl.
+ eating critical: [ "Avoid deadlock"
+ Transcript nextPutAll: status, 'waits for left fork'; nl.
+ leftFork wait.
+ Transcript nextPutAll: status, 'waits for right fork'; nl.
+ rightFork wait.
+ Transcript nextPutAll: status, 'eats'; nl.
+ (Delay forMilliseconds: randy next * 2000) wait.
+ leftFork signal.
+ rightFork signal.
+ ].
+ ]].
+
+ ^(philosopherCode newProcess)
+ priority: Processor userBackgroundPriority;
+ name: status;
+ resume;
+ yourself
+!
+
+size
+ ^forks size
+! !
+
+(Philosophers new: 5) dine!
diff --git a/samples/Smalltalk/TestBasic.st b/samples/Smalltalk/TestBasic.st
new file mode 100644
index 00000000..ef6244cd
--- /dev/null
+++ b/samples/Smalltalk/TestBasic.st
@@ -0,0 +1,64 @@
+Koan subclass: TestBasic [
+
+
+ testDeclarationAndAssignment [
+ | declaration anotherDeclaration |
+ "You must declare variables before using them."
+ "Variables are separated by a single space."
+
+ declaration _ 1. "Squeak Smalltalk way to assign value"
+ anotherDeclaration := 'string'. "typical way to assign value
+ (this will be used throughout the koans)"
+
+ self expect: fillMeIn toEqual: declaration.
+ self expect: fillMeIn toEqual: anotherDeclaration.
+ ]
+
+ testEqualSignIsNotAnAssignmentOperator [
+ | variableA variableB value |
+
+ variableA := variableB := 1234. "multiple assignments work"
+ value := variableA = variableB. "equal is not used for assignment"
+
+ self expect: fillMeIn toEqual: (variableA = variableB).
+
+ "#== is a message that checks if identity is equal. More about messages in the TestMessage koan."
+ ]
+
+ testMultipleStatementsInASingleLine [
+ | variableA variableB variableC |
+
+ "Multiple statements are separated by periods."
+ variableA := 1. variableB := 2. variableC := 3.
+
+ self expect: fillMeIn toEqual: variableA.
+ self expect: fillMeIn toEqual: variableB.
+ self expect: fillMeIn toEqual: variableC.
+ ]
+
+ testInequality [
+ self expect: fillMeIn toEqual: ('hello' ~= 'world').
+
+ "#~~ is a message that checks if identity is not equal. More about messages in the TestMessage koan."
+ ]
+
+ testLogicalOr [
+ | expression |
+
+ expression := (3 > 4) | (5 < 6).
+
+ self expect: fillMeIn toEqual: expression.
+ ]
+
+ testLogicalAnd [
+ | expression |
+
+ expression := (2 > 1) & ('a' < 'b').
+
+ self expect: fillMeIn toEqual: expression.
+ ]
+
+ testNot [
+ self expect: fillMeIn toEqual: true not.
+ ]
+]
diff --git a/samples/Smalltalk/testSimpleChainMatches.st b/samples/Smalltalk/testSimpleChainMatches.st
new file mode 100644
index 00000000..85ee574b
--- /dev/null
+++ b/samples/Smalltalk/testSimpleChainMatches.st
@@ -0,0 +1,11 @@
+tests
+testSimpleChainMatches
+ |e eCtrl |
+ e := self eventKey: $e.
+ eCtrl := self eventKey: $e ctrl: true.
+
+ self assert: (($e ctrl, $e) matches: {eCtrl}).
+ self assert: ($e ctrl matches: {eCtrl. e}).
+
+ self deny: (($e ctrl, $e) matches: {eCtrl. self eventKey: $a}).
+ self deny: ($e ctrl matches: {e}).
\ No newline at end of file
diff --git a/samples/Standard ML/Foo.ML b/samples/Standard ML/Foo.ML
new file mode 100644
index 00000000..2bbb789e
--- /dev/null
+++ b/samples/Standard ML/Foo.ML
@@ -0,0 +1,75 @@
+
+structure LazyBase:> LAZY_BASE =
+ struct
+ type 'a lazy = unit -> 'a
+
+ exception Undefined
+
+ fun delay f = f
+
+ fun force f = f()
+
+ val undefined = fn () => raise Undefined
+ end
+
+structure LazyMemoBase:> LAZY_BASE =
+ struct
+
+ datatype 'a susp = NotYet of unit -> 'a
+ | Done of 'a
+
+ type 'a lazy = unit -> 'a susp ref
+
+ exception Undefined
+
+ fun delay f =
+ let
+ val r = ref (NotYet f)
+ in
+ fn () => r
+ end
+
+ fun force f =
+ case f() of
+ ref (Done x) => x
+ | r as ref (NotYet f') =>
+ let
+ val a = f'()
+ in
+ r := Done a
+ ; a
+ end
+
+ val undefined = fn () => raise Undefined
+ end
+
+functor LazyFn(B: LAZY_BASE): LAZY' =
+ struct
+
+ open B
+
+ fun inject x = delay (fn () => x)
+
+ fun isUndefined x =
+ (ignore (force x)
+ ; false)
+ handle Undefined => true
+
+ fun toString f x = if isUndefined x then "_|_" else f (force x)
+
+ fun eqBy p (x,y) = p(force x,force y)
+ fun eq (x,y) = eqBy op= (x,y)
+ fun compare p (x,y) = p(force x,force y)
+
+ structure Ops =
+ struct
+ val ! = force
+ val ? = inject
+ end
+
+ fun map f x = delay (fn () => f (force x))
+
+ end
+
+structure Lazy' = LazyFn(LazyBase)
+structure LazyMemo = LazyFn(LazyMemoBase)
diff --git a/samples/Swift/section-11.swift b/samples/Swift/section-11.swift
new file mode 100644
index 00000000..3be056ab
--- /dev/null
+++ b/samples/Swift/section-11.swift
@@ -0,0 +1,4 @@
+let apples = 3
+let oranges = 5
+let appleSummary = "I have \(apples) apples."
+let fruitSummary = "I have \(apples + oranges) pieces of fruit."
diff --git a/samples/Swift/section-13.swift b/samples/Swift/section-13.swift
new file mode 100644
index 00000000..06589fd7
--- /dev/null
+++ b/samples/Swift/section-13.swift
@@ -0,0 +1,8 @@
+var shoppingList = ["catfish", "water", "tulips", "blue paint"]
+shoppingList[1] = "bottle of water"
+
+var occupations = [
+ "Malcolm": "Captain",
+ "Kaylee": "Mechanic",
+ ]
+occupations["Jayne"] = "Public Relations"
diff --git a/samples/Swift/section-15.swift b/samples/Swift/section-15.swift
new file mode 100644
index 00000000..3641de25
--- /dev/null
+++ b/samples/Swift/section-15.swift
@@ -0,0 +1,2 @@
+let emptyArray = String[]()
+let emptyDictionary = Dictionary()
diff --git a/samples/Swift/section-17.swift b/samples/Swift/section-17.swift
new file mode 100644
index 00000000..e079c3b2
--- /dev/null
+++ b/samples/Swift/section-17.swift
@@ -0,0 +1 @@
+shoppingList = [] // Went shopping and bought everything.
diff --git a/samples/Swift/section-19.swift b/samples/Swift/section-19.swift
new file mode 100644
index 00000000..262512fc
--- /dev/null
+++ b/samples/Swift/section-19.swift
@@ -0,0 +1,10 @@
+let individualScores = [75, 43, 103, 87, 12]
+var teamScore = 0
+for score in individualScores {
+ if score > 50 {
+ teamScore += 3
+ } else {
+ teamScore += 1
+ }
+}
+teamScore
diff --git a/samples/Swift/section-21.swift b/samples/Swift/section-21.swift
new file mode 100644
index 00000000..fb06bd77
--- /dev/null
+++ b/samples/Swift/section-21.swift
@@ -0,0 +1,8 @@
+var optionalString: String? = "Hello"
+optionalString == nil
+
+var optionalName: String? = "John Appleseed"
+var greeting = "Hello!"
+if let name = optionalName {
+ greeting = "Hello, \(name)"
+}
diff --git a/samples/Swift/section-23.swift b/samples/Swift/section-23.swift
new file mode 100644
index 00000000..09f4747c
--- /dev/null
+++ b/samples/Swift/section-23.swift
@@ -0,0 +1,11 @@
+let vegetable = "red pepper"
+switch vegetable {
+ case "celery":
+ let vegetableComment = "Add some raisins and make ants on a log."
+ case "cucumber", "watercress":
+ let vegetableComment = "That would make a good tea sandwich."
+ case let x where x.hasSuffix("pepper"):
+ let vegetableComment = "Is it a spicy \(x)?"
+ default:
+ let vegetableComment = "Everything tastes good in soup."
+}
diff --git a/samples/Swift/section-25.swift b/samples/Swift/section-25.swift
new file mode 100644
index 00000000..80e19f9c
--- /dev/null
+++ b/samples/Swift/section-25.swift
@@ -0,0 +1,14 @@
+let interestingNumbers = [
+ "Prime": [2, 3, 5, 7, 11, 13],
+ "Fibonacci": [1, 1, 2, 3, 5, 8],
+ "Square": [1, 4, 9, 16, 25],
+]
+var largest = 0
+for (kind, numbers) in interestingNumbers {
+ for number in numbers {
+ if number > largest {
+ largest = number
+ }
+ }
+}
+largest
diff --git a/samples/Swift/section-27.swift b/samples/Swift/section-27.swift
new file mode 100644
index 00000000..e2feda12
--- /dev/null
+++ b/samples/Swift/section-27.swift
@@ -0,0 +1,11 @@
+var n = 2
+while n < 100 {
+ n = n * 2
+}
+n
+
+var m = 2
+do {
+ m = m * 2
+} while m < 100
+m
diff --git a/samples/Swift/section-29.swift b/samples/Swift/section-29.swift
new file mode 100644
index 00000000..b269cf97
--- /dev/null
+++ b/samples/Swift/section-29.swift
@@ -0,0 +1,11 @@
+var firstForLoop = 0
+for i in 0..3 {
+ firstForLoop += i
+}
+firstForLoop
+
+var secondForLoop = 0
+for var i = 0; i < 3; ++i {
+ secondForLoop += 1
+}
+secondForLoop
diff --git a/samples/Swift/section-3.swift b/samples/Swift/section-3.swift
new file mode 100644
index 00000000..47ea7d53
--- /dev/null
+++ b/samples/Swift/section-3.swift
@@ -0,0 +1 @@
+println("Hello, world")
diff --git a/samples/Swift/section-31.swift b/samples/Swift/section-31.swift
new file mode 100644
index 00000000..9b77ea62
--- /dev/null
+++ b/samples/Swift/section-31.swift
@@ -0,0 +1,4 @@
+func greet(name: String, day: String) -> String {
+ return "Hello \(name), today is \(day)."
+}
+greet("Bob", "Tuesday")
diff --git a/samples/Swift/section-33.swift b/samples/Swift/section-33.swift
new file mode 100644
index 00000000..89361a75
--- /dev/null
+++ b/samples/Swift/section-33.swift
@@ -0,0 +1,4 @@
+func getGasPrices() -> (Double, Double, Double) {
+ return (3.59, 3.69, 3.79)
+}
+getGasPrices()
diff --git a/samples/Swift/section-35.swift b/samples/Swift/section-35.swift
new file mode 100644
index 00000000..c724746f
--- /dev/null
+++ b/samples/Swift/section-35.swift
@@ -0,0 +1,9 @@
+func sumOf(numbers: Int...) -> Int {
+ var sum = 0
+ for number in numbers {
+ sum += number
+ }
+ return sum
+}
+sumOf()
+sumOf(42, 597, 12)
diff --git a/samples/Swift/section-37.swift b/samples/Swift/section-37.swift
new file mode 100644
index 00000000..f78fdbe9
--- /dev/null
+++ b/samples/Swift/section-37.swift
@@ -0,0 +1,9 @@
+func returnFifteen() -> Int {
+ var y = 10
+ func add() {
+ y += 5
+ }
+ add()
+ return y
+}
+returnFifteen()
diff --git a/samples/Swift/section-39.swift b/samples/Swift/section-39.swift
new file mode 100644
index 00000000..d2fa5fe3
--- /dev/null
+++ b/samples/Swift/section-39.swift
@@ -0,0 +1,8 @@
+func makeIncrementer() -> (Int -> Int) {
+ func addOne(number: Int) -> Int {
+ return 1 + number
+ }
+ return addOne
+}
+var increment = makeIncrementer()
+increment(7)
diff --git a/samples/Swift/section-41.swift b/samples/Swift/section-41.swift
new file mode 100644
index 00000000..e72d410a
--- /dev/null
+++ b/samples/Swift/section-41.swift
@@ -0,0 +1,13 @@
+func hasAnyMatches(list: Int[], condition: Int -> Bool) -> Bool {
+ for item in list {
+ if condition(item) {
+ return true
+ }
+ }
+ return false
+}
+func lessThanTen(number: Int) -> Bool {
+ return number < 10
+}
+var numbers = [20, 19, 7, 12]
+hasAnyMatches(numbers, lessThanTen)
diff --git a/samples/Swift/section-43.swift b/samples/Swift/section-43.swift
new file mode 100644
index 00000000..5dee10f7
--- /dev/null
+++ b/samples/Swift/section-43.swift
@@ -0,0 +1,5 @@
+numbers.map({
+ (number: Int) -> Int in
+ let result = 3 * number
+ return result
+})
diff --git a/samples/Swift/section-45.swift b/samples/Swift/section-45.swift
new file mode 100644
index 00000000..dbf29eed
--- /dev/null
+++ b/samples/Swift/section-45.swift
@@ -0,0 +1 @@
+numbers.map({ number in 3 * number })
diff --git a/samples/Swift/section-47.swift b/samples/Swift/section-47.swift
new file mode 100644
index 00000000..73defb77
--- /dev/null
+++ b/samples/Swift/section-47.swift
@@ -0,0 +1 @@
+sort([1, 5, 3, 12, 2]) { $0 > $1 }
diff --git a/samples/Swift/section-49.swift b/samples/Swift/section-49.swift
new file mode 100644
index 00000000..69739b8d
--- /dev/null
+++ b/samples/Swift/section-49.swift
@@ -0,0 +1,6 @@
+class Shape {
+ var numberOfSides = 0
+ func simpleDescription() -> String {
+ return "A shape with \(numberOfSides) sides."
+ }
+}
diff --git a/samples/Swift/section-5.swift b/samples/Swift/section-5.swift
new file mode 100644
index 00000000..885d5812
--- /dev/null
+++ b/samples/Swift/section-5.swift
@@ -0,0 +1,3 @@
+var myVariable = 42
+myVariable = 50
+let myConstant = 42
diff --git a/samples/Swift/section-51.swift b/samples/Swift/section-51.swift
new file mode 100644
index 00000000..a84750c8
--- /dev/null
+++ b/samples/Swift/section-51.swift
@@ -0,0 +1,3 @@
+var shape = Shape()
+shape.numberOfSides = 7
+var shapeDescription = shape.simpleDescription()
diff --git a/samples/Swift/section-53.swift b/samples/Swift/section-53.swift
new file mode 100644
index 00000000..74aac461
--- /dev/null
+++ b/samples/Swift/section-53.swift
@@ -0,0 +1,12 @@
+class NamedShape {
+ var numberOfSides: Int = 0
+ var name: String
+
+ init(name: String) {
+ self.name = name
+ }
+
+ func simpleDescription() -> String {
+ return "A shape with \(numberOfSides) sides."
+ }
+}
diff --git a/samples/Swift/section-55.swift b/samples/Swift/section-55.swift
new file mode 100644
index 00000000..6e489078
--- /dev/null
+++ b/samples/Swift/section-55.swift
@@ -0,0 +1,20 @@
+class Square: NamedShape {
+ var sideLength: Double
+
+ init(sideLength: Double, name: String) {
+ self.sideLength = sideLength
+ super.init(name: name)
+ numberOfSides = 4
+ }
+
+ func area() -> Double {
+ return sideLength * sideLength
+ }
+
+ override func simpleDescription() -> String {
+ return "A square with sides of length \(sideLength)."
+ }
+}
+let test = Square(sideLength: 5.2, name: "my test square")
+test.area()
+test.simpleDescription()
diff --git a/samples/Swift/section-57.swift b/samples/Swift/section-57.swift
new file mode 100644
index 00000000..90d2e03c
--- /dev/null
+++ b/samples/Swift/section-57.swift
@@ -0,0 +1,26 @@
+class EquilateralTriangle: NamedShape {
+ var sideLength: Double = 0.0
+
+ init(sideLength: Double, name: String) {
+ self.sideLength = sideLength
+ super.init(name: name)
+ numberOfSides = 3
+ }
+
+ var perimeter: Double {
+ get {
+ return 3.0 * sideLength
+ }
+ set {
+ sideLength = newValue / 3.0
+ }
+ }
+
+ override func simpleDescription() -> String {
+ return "An equilateral triagle with sides of length \(sideLength)."
+ }
+}
+var triangle = EquilateralTriangle(sideLength: 3.1, name: "a triangle")
+triangle.perimeter
+triangle.perimeter = 9.9
+triangle.sideLength
diff --git a/samples/Swift/section-59.swift b/samples/Swift/section-59.swift
new file mode 100644
index 00000000..21e3b09d
--- /dev/null
+++ b/samples/Swift/section-59.swift
@@ -0,0 +1,21 @@
+class TriangleAndSquare {
+ var triangle: EquilateralTriangle {
+ willSet {
+ square.sideLength = newValue.sideLength
+ }
+ }
+ var square: Square {
+ willSet {
+ triangle.sideLength = newValue.sideLength
+ }
+ }
+ init(size: Double, name: String) {
+ square = Square(sideLength: size, name: name)
+ triangle = EquilateralTriangle(sideLength: size, name: name)
+ }
+}
+var triangleAndSquare = TriangleAndSquare(size: 10, name: "another test shape")
+triangleAndSquare.square.sideLength
+triangleAndSquare.triangle.sideLength
+triangleAndSquare.square = Square(sideLength: 50, name: "larger square")
+triangleAndSquare.triangle.sideLength
diff --git a/samples/Swift/section-61.swift b/samples/Swift/section-61.swift
new file mode 100644
index 00000000..013ded74
--- /dev/null
+++ b/samples/Swift/section-61.swift
@@ -0,0 +1,8 @@
+class Counter {
+ var count: Int = 0
+ func incrementBy(amount: Int, numberOfTimes times: Int) {
+ count += amount * times
+ }
+}
+var counter = Counter()
+counter.incrementBy(2, numberOfTimes: 7)
diff --git a/samples/Swift/section-63.swift b/samples/Swift/section-63.swift
new file mode 100644
index 00000000..9305cfc7
--- /dev/null
+++ b/samples/Swift/section-63.swift
@@ -0,0 +1,2 @@
+let optionalSquare: Square? = Square(sideLength: 2.5, name: "optional square")
+let sideLength = optionalSquare?.sideLength
diff --git a/samples/Swift/section-65.swift b/samples/Swift/section-65.swift
new file mode 100644
index 00000000..809c71ce
--- /dev/null
+++ b/samples/Swift/section-65.swift
@@ -0,0 +1,21 @@
+enum Rank: Int {
+ case Ace = 1
+ case Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten
+ case Jack, Queen, King
+ func simpleDescription() -> String {
+ switch self {
+ case .Ace:
+ return "ace"
+ case .Jack:
+ return "jack"
+ case .Queen:
+ return "queen"
+ case .King:
+ return "king"
+ default:
+ return String(self.toRaw())
+ }
+ }
+}
+let ace = Rank.Ace
+let aceRawValue = ace.toRaw()
diff --git a/samples/Swift/section-67.swift b/samples/Swift/section-67.swift
new file mode 100644
index 00000000..d5be66c2
--- /dev/null
+++ b/samples/Swift/section-67.swift
@@ -0,0 +1,3 @@
+if let convertedRank = Rank.fromRaw(3) {
+ let threeDescription = convertedRank.simpleDescription()
+}
diff --git a/samples/Swift/section-69.swift b/samples/Swift/section-69.swift
new file mode 100644
index 00000000..fc6d7a4c
--- /dev/null
+++ b/samples/Swift/section-69.swift
@@ -0,0 +1,17 @@
+enum Suit {
+ case Spades, Hearts, Diamonds, Clubs
+ func simpleDescription() -> String {
+ switch self {
+ case .Spades:
+ return "spades"
+ case .Hearts:
+ return "hearts"
+ case .Diamonds:
+ return "diamonds"
+ case .Clubs:
+ return "clubs"
+ }
+ }
+}
+let hearts = Suit.Hearts
+let heartsDescription = hearts.simpleDescription()
diff --git a/samples/Swift/section-7.swift b/samples/Swift/section-7.swift
new file mode 100644
index 00000000..7d55c034
--- /dev/null
+++ b/samples/Swift/section-7.swift
@@ -0,0 +1,3 @@
+let implicitInteger = 70
+let implicitDouble = 70.0
+let explicitDouble: Double = 70
diff --git a/samples/Swift/section-71.swift b/samples/Swift/section-71.swift
new file mode 100644
index 00000000..f006d0f9
--- /dev/null
+++ b/samples/Swift/section-71.swift
@@ -0,0 +1,9 @@
+struct Card {
+ var rank: Rank
+ var suit: Suit
+ func simpleDescription() -> String {
+ return "The \(rank.simpleDescription()) of \(suit.simpleDescription())"
+ }
+}
+let threeOfSpades = Card(rank: .Three, suit: .Spades)
+let threeOfSpadesDescription = threeOfSpades.simpleDescription()
diff --git a/samples/Swift/section-73.swift b/samples/Swift/section-73.swift
new file mode 100644
index 00000000..be0cf35f
--- /dev/null
+++ b/samples/Swift/section-73.swift
@@ -0,0 +1,14 @@
+enum ServerResponse {
+ case Result(String, String)
+ case Error(String)
+}
+
+let success = ServerResponse.Result("6:00 am", "8:09 pm")
+let failure = ServerResponse.Error("Out of cheese.")
+
+switch success {
+ case let .Result(sunrise, sunset):
+ let serverResponse = "Sunrise is at \(sunrise) and sunset is at \(sunset)."
+ case let .Error(error):
+ let serverResponse = "Failure... \(error)"
+}
diff --git a/samples/Swift/section-75.swift b/samples/Swift/section-75.swift
new file mode 100644
index 00000000..46dd36da
--- /dev/null
+++ b/samples/Swift/section-75.swift
@@ -0,0 +1,4 @@
+protocol ExampleProtocol {
+ var simpleDescription: String { get }
+ mutating func adjust()
+}
diff --git a/samples/Swift/section-77.swift b/samples/Swift/section-77.swift
new file mode 100644
index 00000000..bc052d20
--- /dev/null
+++ b/samples/Swift/section-77.swift
@@ -0,0 +1,20 @@
+class SimpleClass: ExampleProtocol {
+ var simpleDescription: String = "A very simple class."
+ var anotherProperty: Int = 69105
+ func adjust() {
+ simpleDescription += " Now 100% adjusted."
+ }
+}
+var a = SimpleClass()
+a.adjust()
+let aDescription = a.simpleDescription
+
+struct SimpleStructure: ExampleProtocol {
+ var simpleDescription: String = "A simple structure"
+ mutating func adjust() {
+ simpleDescription += " (adjusted)"
+ }
+}
+var b = SimpleStructure()
+b.adjust()
+let bDescription = b.simpleDescription
diff --git a/samples/Swift/section-79.swift b/samples/Swift/section-79.swift
new file mode 100644
index 00000000..0e7b831b
--- /dev/null
+++ b/samples/Swift/section-79.swift
@@ -0,0 +1,9 @@
+extension Int: ExampleProtocol {
+ var simpleDescription: String {
+ return "The number \(self)"
+ }
+ mutating func adjust() {
+ self += 42
+ }
+ }
+7.simpleDescription
diff --git a/samples/Swift/section-81.swift b/samples/Swift/section-81.swift
new file mode 100644
index 00000000..74e0a000
--- /dev/null
+++ b/samples/Swift/section-81.swift
@@ -0,0 +1,3 @@
+let protocolValue: ExampleProtocol = a
+protocolValue.simpleDescription
+// protocolValue.anotherProperty // Uncomment to see the error
diff --git a/samples/Swift/section-83.swift b/samples/Swift/section-83.swift
new file mode 100644
index 00000000..aa2e6d75
--- /dev/null
+++ b/samples/Swift/section-83.swift
@@ -0,0 +1,8 @@
+func repeat(item: ItemType, times: Int) -> ItemType[] {
+ var result = ItemType[]()
+ for i in 0..times {
+ result += item
+ }
+ return result
+}
+repeat("knock", 4)
diff --git a/samples/Swift/section-85.swift b/samples/Swift/section-85.swift
new file mode 100644
index 00000000..b2f52840
--- /dev/null
+++ b/samples/Swift/section-85.swift
@@ -0,0 +1,7 @@
+// Reimplement the Swift standard library's optional type
+enum OptionalValue {
+ case None
+ case Some(T)
+}
+var possibleInteger: OptionalValue = .None
+possibleInteger = .Some(100)
diff --git a/samples/Swift/section-87.swift b/samples/Swift/section-87.swift
new file mode 100644
index 00000000..f9dc7f33
--- /dev/null
+++ b/samples/Swift/section-87.swift
@@ -0,0 +1,11 @@
+func anyCommonElements (lhs: T, rhs: U) -> Bool {
+ for lhsItem in lhs {
+ for rhsItem in rhs {
+ if lhsItem == rhsItem {
+ return true
+ }
+ }
+ }
+ return false
+}
+anyCommonElements([1, 2, 3], [3])
diff --git a/samples/Swift/section-9.swift b/samples/Swift/section-9.swift
new file mode 100644
index 00000000..2e83efa1
--- /dev/null
+++ b/samples/Swift/section-9.swift
@@ -0,0 +1,3 @@
+let label = "The width is "
+let width = 94
+let widthLabel = label + String(width)
diff --git a/samples/Text/ISO-2022-KR.txt b/samples/Text/ISO-2022-KR.txt
new file mode 100644
index 00000000..721d7051
--- /dev/null
+++ b/samples/Text/ISO-2022-KR.txt
@@ -0,0 +1,43 @@
+$)C#
+# Out-AnsiGraph.psm1
+# Author: xcud
+# History:
+# v0.1 September 21, 2009 initial version
+#
+# PS Example> ps | select -first 5 | sort -property VM |
+# Out-AnsiGraph ProcessName, VM
+# AEADISRV 14508032
+# audiodg 50757632
+# conhost 73740288
+# AppleMobileDeviceService 92061696
+# btdna 126443520
+#
+function Out-AnsiGraph($Parameter1=$null) {
+ BEGIN {
+ $q = new-object Collections.queue
+ $max = 0; $namewidth = 0;
+ }
+
+ PROCESS {
+ if($_) {
+ $name = $_.($Parameter1[0]);
+ $val = $_.($Parameter1[1])
+ if($max -lt $val) { $max = $val}
+ if($namewidth -lt $name.length) {
+ $namewidth = $name.length }
+ $q.enqueue(@($name, $val))
+ }
+ }
+
+ END {
+ $q | %{
+ $graph = ""; 0..($_[1]/$max*20) |
+ %{ $graph += "" }
+ $name = "{0,$namewidth}" -f $_[0]
+ "$name $graph " + $_[1]
+ }
+
+ }
+}
+
+Export-ModuleMember Out-AnsiGraph
\ No newline at end of file
diff --git a/samples/Text/Visual_Battlers.rb b/samples/Text/Visual_Battlers.rb
new file mode 100644
index 00000000..74bb0f2c
--- /dev/null
+++ b/samples/Text/Visual_Battlers.rb
@@ -0,0 +1,703 @@
+#==============================================================================
+#
+# Yanfly Engine Ace - Visual Battlers v1.01
+# -- Last Updated: 2012.07.24
+# -- Level: Easy
+# -- Requires: n/a
+#
+# Modified by:
+# -- Yami
+# -- Kread-Ex
+# -- Archeia_Nessiah
+#==============================================================================
+
+$imported = {} if $imported.nil?
+$imported["YEA-VisualBattlers"] = true
+
+#==============================================================================
+# Updates
+# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+# 2012.12.18 - Added preset views and able to change direction in-game.
+# 2012.07.24 - Finished Script.
+# 2012.01.05 - Started Script.
+#
+#==============================================================================
+# Introduction
+# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+# This script provides a visual for all actors by default charsets. The actions
+# and movements are alike Final Fantasy 1, only move forward and backward when
+# start and finish actions.
+#
+#==============================================================================
+# Instructions
+# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+# To change the player direction in-game, use the snippet below in a script
+# call:
+#
+# $game_system.party_direction = n
+#
+# To install this script, open up your script editor and copy/paste this script
+# to an open slot below Materials but above Main. Remember to save.
+#
+#==============================================================================
+# Compatibility
+# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+# This script is made strictly for RPG Maker VX Ace. It is highly unlikely that
+# it will run with RPG Maker VX without adjusting.
+#
+#==============================================================================
+
+module YEA
+ module VISUAL_BATTLERS
+
+ #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
+ # - Party Location Setting -
+ #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
+ # These settings are adjusted for Party Location. Each Actor will have
+ # coordinates calculated by below formula. There are two samples coordinates
+ # below, change PARTY_DIRECTION to the base index you want to use.
+ #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
+ PARTY_DIRECTION = 6 # This direction is opposite from actual direction.
+
+ PARTY_LOCATION_BASE_COORDINATES ={
+ # Index => [base_x, base_y, mod_x, mod_y],
+ 2 => [ 250, 290, 40, 0], #UP
+ 4 => [ 150, 280, 20, -20], #LEFT
+ 3 => [ 460, 280, 30, -10], #RIGHT
+ 6 => [ 460, 230, 20, 20], #DEFAULT RIGHT
+ 8 => [ 260, 230, 40, 0], #DOWN
+ } # Do not remove this.
+
+ PARTY_LOCATION_FORMULA_X = "base_x + index * mod_x"
+ PARTY_LOCATION_FORMULA_Y = "base_y + index * mod_y"
+
+ end # VISUAL_BATTLERS
+end # YEA
+
+#==============================================================================
+# Editting anything past this point may potentially result in causing
+# computer damage, incontinence, explosion of user's head, coma, death, and/or
+# halitosis so edit at your own risk.
+#==============================================================================
+
+#==============================================================================
+# ? Direction
+#==============================================================================
+
+module Direction
+
+ #--------------------------------------------------------------------------
+ # self.correct
+ #--------------------------------------------------------------------------
+ def self.correct(direction)
+ case direction
+ when 1; return 4
+ when 3; return 6
+ when 7; return 4
+ when 9; return 6
+ else; return direction
+ end
+ end
+
+ #--------------------------------------------------------------------------
+ # self.opposite
+ #--------------------------------------------------------------------------
+ def self.opposite(direction)
+ case direction
+ when 1; return 6
+ when 2; return 8
+ when 3; return 4
+ when 4; return 6
+ when 6; return 4
+ when 7; return 6
+ when 8; return 2
+ when 9; return 4
+ else; return direction
+ end
+ end
+
+end # Direction
+
+#==============================================================================
+# ? Game_System
+#==============================================================================
+
+class Game_System; attr_accessor :party_direction; end
+
+#==============================================================================
+# ? Game_BattleCharacter
+#==============================================================================
+
+class Game_BattleCharacter < Game_Character
+
+ #--------------------------------------------------------------------------
+ # initialize
+ #--------------------------------------------------------------------------
+ def initialize(actor)
+ super()
+ setup_actor(actor)
+ @move_x_rate = 0
+ @move_y_rate = 0
+ end
+
+ #--------------------------------------------------------------------------
+ # setup_actor
+ #--------------------------------------------------------------------------
+ def setup_actor(actor)
+ @actor = actor
+ @step_anime = true
+ set_graphic(@actor.character_name, @actor.character_index)
+ setup_coordinates
+ dr = $game_system.party_direction || YEA::VISUAL_BATTLERS::PARTY_DIRECTION
+ direction = Direction.opposite(dr)
+ set_direction(Direction.correct(direction))
+ end
+
+ #--------------------------------------------------------------------------
+ # sprite=
+ #--------------------------------------------------------------------------
+ def sprite=(sprite)
+ @sprite = sprite
+ end
+
+ #--------------------------------------------------------------------------
+ # setup_coordinates
+ #--------------------------------------------------------------------------
+ def setup_coordinates
+ location = ($game_system.party_direction ||
+ YEA::VISUAL_BATTLERS::PARTY_DIRECTION)
+ base_x = YEA::VISUAL_BATTLERS::PARTY_LOCATION_BASE_COORDINATES[location][0]
+ base_y = YEA::VISUAL_BATTLERS::PARTY_LOCATION_BASE_COORDINATES[location][1]
+ mod_x = YEA::VISUAL_BATTLERS::PARTY_LOCATION_BASE_COORDINATES[location][2]
+ mod_y = YEA::VISUAL_BATTLERS::PARTY_LOCATION_BASE_COORDINATES[location][3]
+ @actor.screen_x = eval(YEA::VISUAL_BATTLERS::PARTY_LOCATION_FORMULA_X)
+ @actor.screen_y = eval(YEA::VISUAL_BATTLERS::PARTY_LOCATION_FORMULA_Y)
+ @actor.origin_x = @actor.screen_x
+ @actor.origin_y = @actor.screen_y
+ @actor.create_move_to(screen_x, screen_y, 1)
+ end
+
+ #--------------------------------------------------------------------------
+ # index
+ #--------------------------------------------------------------------------
+ def index
+ return @actor.index
+ end
+
+ #--------------------------------------------------------------------------
+ # screen_x
+ #--------------------------------------------------------------------------
+ def screen_x
+ return @actor.screen_x
+ end
+
+ #--------------------------------------------------------------------------
+ # screen_y
+ #--------------------------------------------------------------------------
+ def screen_y
+ return @actor.screen_y
+ end
+
+ #--------------------------------------------------------------------------
+ # screen_z
+ #--------------------------------------------------------------------------
+ def screen_z
+ return @actor.screen_z
+ end
+
+end # Game_BattleCharacter
+
+#==============================================================================
+# ? Game_Battler
+#==============================================================================
+
+class Game_Battler < Game_BattlerBase
+
+ #--------------------------------------------------------------------------
+ # public instance variables
+ #--------------------------------------------------------------------------
+ attr_accessor :moved_back
+ attr_accessor :origin_x
+ attr_accessor :origin_y
+ attr_accessor :screen_x
+ attr_accessor :screen_y
+ attr_accessor :started_turn
+
+ #--------------------------------------------------------------------------
+ # alias method: execute_damage
+ #--------------------------------------------------------------------------
+ alias game_battler_execute_damage_vb execute_damage
+ def execute_damage(user)
+ game_battler_execute_damage_vb(user)
+ if @result.hp_damage > 0
+ move_backward(24, 6) unless @moved_back
+ @moved_back = true
+ end
+ end
+
+ #--------------------------------------------------------------------------
+ # face_opposing_party
+ #--------------------------------------------------------------------------
+ def face_opposing_party
+ direction = ($game_system.party_direction ||
+ YEA::VISUAL_BATTLERS::PARTY_DIRECTION)
+ character.set_direction(Direction.correct(direction)) rescue 0
+ end
+
+ #--------------------------------------------------------------------------
+ # new method: face_coordinate
+ #--------------------------------------------------------------------------
+ def face_coordinate(destination_x, destination_y)
+ x1 = Integer(@screen_x)
+ x2 = Integer(destination_x)
+ y1 = Graphics.height - Integer(@screen_y)
+ y2 = Graphics.height - Integer(destination_y)
+ return if x1 == x2 and y1 == y2
+ #---
+ angle = Integer(Math.atan2((y2-y1),(x2-x1)) * 1800 / Math::PI)
+ if (0..225) === angle or (-225..0) === angle
+ direction = 6
+ elsif (226..675) === angle
+ direction = 9
+ elsif (676..1125) === angle
+ direction = 8
+ elsif (1126..1575) === angle
+ direction = 7
+ elsif (1576..1800) === angle or (-1800..-1576) === angle
+ direction = 4
+ elsif (-1575..-1126) === angle
+ direction = 1
+ elsif (-1125..-676) === angle
+ direction = 2
+ elsif (-675..-226) === angle
+ direction = 3
+ end
+ #---
+ character.set_direction(Direction.correct(direction)) rescue 0
+ end
+
+ #--------------------------------------------------------------------------
+ # create_move_to
+ #--------------------------------------------------------------------------
+ def create_move_to(destination_x, destination_y, frames = 12)
+ @destination_x = destination_x
+ @destination_y = destination_y
+ frames = [frames, 1].max
+ @move_x_rate = [(@screen_x - @destination_x).abs / frames, 2].max
+ @move_y_rate = [(@screen_y - @destination_y).abs / frames, 2].max
+ end
+
+ #--------------------------------------------------------------------------
+ # update_move_to
+ #--------------------------------------------------------------------------
+ def update_move_to
+ @move_x_rate = 0 if @screen_x == @destination_x || @move_x_rate.nil?
+ @move_y_rate = 0 if @screen_y == @destination_y || @move_y_rate.nil?
+ value = [(@screen_x - @destination_x).abs, @move_x_rate].min
+ @screen_x += (@destination_x > @screen_x) ? value : -value
+ value = [(@screen_y - @destination_y).abs, @move_y_rate].min
+ @screen_y += (@destination_y > @screen_y) ? value : -value
+ end
+
+ #--------------------------------------------------------------------------
+ # move_forward
+ #--------------------------------------------------------------------------
+ def move_forward(distance = 24, frames = 12)
+ direction = forward_direction
+ move_direction(direction, distance, frames)
+ end
+
+ #--------------------------------------------------------------------------
+ # move_backward
+ #--------------------------------------------------------------------------
+ def move_backward(distance = 24, frames = 12)
+ direction = Direction.opposite(forward_direction)
+ move_direction(direction, distance, frames)
+ end
+
+ #--------------------------------------------------------------------------
+ # move_direction
+ #--------------------------------------------------------------------------
+ def move_direction(direction, distance = 24, frames = 12)
+ case direction
+ when 1; move_x = distance / -2; move_y = distance / 2
+ when 2; move_x = distance * 0; move_y = distance * 1
+ when 3; move_x = distance / -2; move_y = distance / 2
+ when 4; move_x = distance * -1; move_y = distance * 0
+ when 6; move_x = distance * 1; move_y = distance * 0
+ when 7; move_x = distance / -2; move_y = distance / -2
+ when 8; move_x = distance * 0; move_y = distance * -1
+ when 9; move_x = distance / 2; move_y = distance / -2
+ else; return
+ end
+ destination_x = @screen_x + move_x
+ destination_y = @screen_y + move_y
+ create_move_to(destination_x, destination_y, frames)
+ end
+
+ #--------------------------------------------------------------------------
+ # forward_direction
+ #--------------------------------------------------------------------------
+ def forward_direction
+ return ($game_system.party_direction ||
+ YEA::VISUAL_BATTLERS::PARTY_DIRECTION)
+ end
+
+ #--------------------------------------------------------------------------
+ # move_origin
+ #--------------------------------------------------------------------------
+ def move_origin
+ create_move_to(@origin_x, @origin_y)
+ face_coordinate(@origin_x, @origin_y)
+ @moved_back = false
+ end
+
+ #--------------------------------------------------------------------------
+ # moving?
+ #--------------------------------------------------------------------------
+ def moving?
+ return false if dead? || !exist?
+ return @move_x_rate != 0 || @move_y_rate != 0
+ end
+
+end # Game_Battler
+
+#==============================================================================
+# ? Game_Actor
+#==============================================================================
+
+class Game_Actor < Game_Battler
+
+ #--------------------------------------------------------------------------
+ # overwrite method: use_sprite?
+ #--------------------------------------------------------------------------
+ def use_sprite?
+ return true
+ end
+
+ #--------------------------------------------------------------------------
+ # new method: screen_x
+ #--------------------------------------------------------------------------
+ def screen_x
+ return @screen_x rescue 0
+ end
+
+ #--------------------------------------------------------------------------
+ # new method: screen_y
+ #--------------------------------------------------------------------------
+ def screen_y
+ return @screen_y rescue 0
+ end
+
+ #--------------------------------------------------------------------------
+ # new method: screen_z
+ #--------------------------------------------------------------------------
+ def screen_z
+ return 100
+ end
+
+ #--------------------------------------------------------------------------
+ # new method: sprite
+ #--------------------------------------------------------------------------
+ def sprite
+ index = $game_party.battle_members.index(self)
+ return SceneManager.scene.spriteset.actor_sprites[index]
+ end
+
+ #--------------------------------------------------------------------------
+ # new method: character
+ #--------------------------------------------------------------------------
+ def character
+ return sprite.character_base
+ end
+
+ #--------------------------------------------------------------------------
+ # face_opposing_party
+ #--------------------------------------------------------------------------
+ def face_opposing_party
+ dr = $game_system.party_direction || YEA::VISUAL_BATTLERS::PARTY_DIRECTION
+ direction = Direction.opposite(dr)
+ character.set_direction(Direction.correct(direction)) rescue 0
+ end
+
+ #--------------------------------------------------------------------------
+ # forward_direction
+ #--------------------------------------------------------------------------
+ def forward_direction
+ return Direction.opposite(($game_system.party_direction ||
+ YEA::VISUAL_BATTLERS::PARTY_DIRECTION))
+ end
+
+end # Game_Actor
+
+#==============================================================================
+# ? Game_Enemy
+#==============================================================================
+
+class Game_Enemy < Game_Battler
+
+ #--------------------------------------------------------------------------
+ # new method: sprite
+ #--------------------------------------------------------------------------
+ def sprite
+ return SceneManager.scene.spriteset.enemy_sprites.reverse[self.index]
+ end
+
+ #--------------------------------------------------------------------------
+ # new method: character
+ #--------------------------------------------------------------------------
+ def character
+ return sprite
+ end
+
+end # Game_Enemy
+
+#==============================================================================
+# ? Game_Troop
+#==============================================================================
+
+class Game_Troop < Game_Unit
+
+ #--------------------------------------------------------------------------
+ # alias method: setup
+ #--------------------------------------------------------------------------
+ alias game_troop_setup_vb setup
+ def setup(troop_id)
+ game_troop_setup_vb(troop_id)
+ set_coordinates
+ end
+
+ #--------------------------------------------------------------------------
+ # new method: set_coordinates
+ #--------------------------------------------------------------------------
+ def set_coordinates
+ for member in members
+ member.origin_x = member.screen_x
+ member.origin_y = member.screen_y
+ member.create_move_to(member.screen_x, member.screen_y, 1)
+ end
+ end
+
+end # Game_Troop
+
+#==============================================================================
+# ? Sprite_Battler
+#==============================================================================
+
+class Sprite_Battler < Sprite_Base
+
+ #--------------------------------------------------------------------------
+ # public instance_variable
+ #--------------------------------------------------------------------------
+ attr_accessor :character_base
+ attr_accessor :character_sprite
+
+ #--------------------------------------------------------------------------
+ # alias method: dispose
+ #--------------------------------------------------------------------------
+ alias sprite_battler_dispose_vb dispose
+ def dispose
+ dispose_character_sprite
+ sprite_battler_dispose_vb
+ end
+
+ #--------------------------------------------------------------------------
+ # new method: dispose_character_sprite
+ #--------------------------------------------------------------------------
+ def dispose_character_sprite
+ @character_sprite.dispose unless @character_sprite.nil?
+ end
+
+ #--------------------------------------------------------------------------
+ # alias method: update
+ #--------------------------------------------------------------------------
+ alias sprite_battler_update_vb update
+ def update
+ sprite_battler_update_vb
+ return if @battler.nil?
+ update_move_to
+ update_character_base
+ update_character_sprite
+ end
+
+ #--------------------------------------------------------------------------
+ # new method: update_character_base
+ #--------------------------------------------------------------------------
+ def update_character_base
+ return if @character_base.nil?
+ @character_base.update
+ end
+
+ #--------------------------------------------------------------------------
+ # new method: update_character_sprite
+ #--------------------------------------------------------------------------
+ def update_character_sprite
+ return if @character_sprite.nil?
+ @character_sprite.update
+ end
+
+ #--------------------------------------------------------------------------
+ # new method: update_move_to
+ #--------------------------------------------------------------------------
+ def update_move_to
+ @battler.update_move_to
+ end
+
+ #--------------------------------------------------------------------------
+ # new method: moving?
+ #--------------------------------------------------------------------------
+ def moving?
+ return false if @battler.nil?
+ return @battler.moving?
+ end
+
+end # Sprite_Battler
+
+#==============================================================================
+# ? Sprite_BattleCharacter
+#==============================================================================
+
+class Sprite_BattleCharacter < Sprite_Character
+
+ #--------------------------------------------------------------------------
+ # initialize
+ #--------------------------------------------------------------------------
+ def initialize(viewport, character = nil)
+ super(viewport, character)
+ character.sprite = self
+ end
+
+end # Sprite_BattleCharacter
+
+#==============================================================================
+# ? Spriteset_Battle
+#==============================================================================
+
+class Spriteset_Battle
+
+ #--------------------------------------------------------------------------
+ # public instance_variable
+ #--------------------------------------------------------------------------
+ attr_accessor :actor_sprites
+ attr_accessor :enemy_sprites
+
+ #--------------------------------------------------------------------------
+ # overwrite method: create_actors
+ #--------------------------------------------------------------------------
+ def create_actors
+ total = $game_party.max_battle_members
+ @current_party = $game_party.battle_members.clone
+ @actor_sprites = Array.new(total) { Sprite_Battler.new(@viewport1) }
+ for actor in $game_party.battle_members
+ @actor_sprites[actor.index].battler = actor
+ create_actor_sprite(actor)
+ end
+ end
+
+ #--------------------------------------------------------------------------
+ # new method: create_actor_sprite
+ #--------------------------------------------------------------------------
+ def create_actor_sprite(actor)
+ character = Game_BattleCharacter.new(actor)
+ character_sprite = Sprite_BattleCharacter.new(@viewport1, character)
+ @actor_sprites[actor.index].character_base = character
+ @actor_sprites[actor.index].character_sprite = character_sprite
+ actor.face_opposing_party
+ end
+
+ #--------------------------------------------------------------------------
+ # alias method: update_actors
+ #--------------------------------------------------------------------------
+ alias spriteset_battle_update_actors_vb update_actors
+ def update_actors
+ if @current_party != $game_party.battle_members
+ dispose_actors
+ create_actors
+ end
+ spriteset_battle_update_actors_vb
+ end
+
+ #--------------------------------------------------------------------------
+ # new method: moving?
+ #--------------------------------------------------------------------------
+ def moving?
+ return battler_sprites.any? {|sprite| sprite.moving? }
+ end
+
+end # Spriteset_Battle
+
+#==============================================================================
+# ? Scene_Battle
+#==============================================================================
+
+class Scene_Battle < Scene_Base
+
+ #--------------------------------------------------------------------------
+ # public instance variables
+ #--------------------------------------------------------------------------
+ attr_accessor :spriteset
+
+ #--------------------------------------------------------------------------
+ # alias method: process_action_end
+ #--------------------------------------------------------------------------
+ alias scene_battle_process_action_end_vb process_action_end
+ def process_action_end
+ start_battler_move_origin
+ scene_battle_process_action_end_vb
+ end
+
+ #--------------------------------------------------------------------------
+ # alias method: execute_action
+ #--------------------------------------------------------------------------
+ alias scene_battle_execute_action_vb execute_action
+ def execute_action
+ start_battler_move_forward
+ scene_battle_execute_action_vb
+ end
+
+ #--------------------------------------------------------------------------
+ # new method: start_battler_move_forward
+ #--------------------------------------------------------------------------
+ def start_battler_move_forward
+ return if @subject.started_turn
+ @subject.started_turn = true
+ @subject.move_forward
+ wait_for_moving
+ end
+
+ #--------------------------------------------------------------------------
+ # new method: start_battler_move_origin
+ #--------------------------------------------------------------------------
+ def start_battler_move_origin
+ @subject.started_turn = nil
+ move_battlers_origin
+ wait_for_moving
+ @subject.face_opposing_party rescue 0
+ end
+
+ #--------------------------------------------------------------------------
+ # new method: move_battlers_origin
+ #--------------------------------------------------------------------------
+ def move_battlers_origin
+ for member in all_battle_members
+ next if member.dead?
+ next unless member.exist?
+ member.move_origin
+ end
+ end
+
+ #--------------------------------------------------------------------------
+ # new method: wait_for_moving
+ #--------------------------------------------------------------------------
+ def wait_for_moving
+ update_for_wait
+ update_for_wait while @spriteset.moving?
+ end
+
+end # Scene_Battle
+
+#==============================================================================
+#
+# End of File
+#
+#==============================================================================
diff --git a/samples/Text/iso8859-8-i.txt b/samples/Text/iso8859-8-i.txt
new file mode 100644
index 00000000..ed2bf6c4
--- /dev/null
+++ b/samples/Text/iso8859-8-i.txt
@@ -0,0 +1 @@
+%
\ No newline at end of file
diff --git a/samples/Text/utf16le-windows.txt b/samples/Text/utf16le-windows.txt
new file mode 100644
index 00000000..590ae2a6
Binary files /dev/null and b/samples/Text/utf16le-windows.txt differ
diff --git a/samples/Text/utf16le.txt b/samples/Text/utf16le.txt
new file mode 100644
index 00000000..1829ef70
Binary files /dev/null and b/samples/Text/utf16le.txt differ
diff --git a/samples/VCL/varnish2_default.vcl b/samples/VCL/varnish2_default.vcl
new file mode 100644
index 00000000..9b01881f
--- /dev/null
+++ b/samples/VCL/varnish2_default.vcl
@@ -0,0 +1,152 @@
+/*-
+ * Copyright (c) 2006 Verdens Gang AS
+ * Copyright (c) 2006-2008 Linpro AS
+ * All rights reserved.
+ *
+ * Author: Poul-Henning Kamp
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $Id$
+ *
+ * The default VCL code.
+ *
+ * NB! You do NOT need to copy & paste all of these functions into your
+ * own vcl code, if you do not provide a definition of one of these
+ * functions, the compiler will automatically fall back to the default
+ * code from this file.
+ *
+ * This code will be prefixed with a backend declaration built from the
+ * -b argument.
+ */
+
+sub vcl_recv {
+ if (req.request != "GET" &&
+ req.request != "HEAD" &&
+ req.request != "PUT" &&
+ req.request != "POST" &&
+ req.request != "TRACE" &&
+ req.request != "OPTIONS" &&
+ req.request != "DELETE") {
+ /* Non-RFC2616 or CONNECT which is weird. */
+ return (pipe);
+ }
+ if (req.request != "GET" && req.request != "HEAD") {
+ /* We only deal with GET and HEAD by default */
+ return (pass);
+ }
+ if (req.http.Authorization || req.http.Cookie) {
+ /* Not cacheable by default */
+ return (pass);
+ }
+ return (lookup);
+}
+
+sub vcl_pipe {
+ # Note that only the first request to the backend will have
+ # X-Forwarded-For set. If you use X-Forwarded-For and want to
+ # have it set for all requests, make sure to have:
+ # set req.http.connection = "close";
+ # here. It is not set by default as it might break some broken web
+ # applications, like IIS with NTLM authentication.
+ return (pipe);
+}
+
+sub vcl_pass {
+ return (pass);
+}
+
+sub vcl_hash {
+ set req.hash += req.url;
+ if (req.http.host) {
+ set req.hash += req.http.host;
+ } else {
+ set req.hash += server.ip;
+ }
+ return (hash);
+}
+
+sub vcl_hit {
+ if (!obj.cacheable) {
+ return (pass);
+ }
+ return (deliver);
+}
+
+sub vcl_miss {
+ return (fetch);
+}
+
+sub vcl_fetch {
+ if (!obj.cacheable) {
+ return (pass);
+ }
+ if (obj.http.Set-Cookie) {
+ return (pass);
+ }
+ set obj.prefetch = -30s;
+ return (deliver);
+}
+
+sub vcl_deliver {
+ return (deliver);
+}
+
+sub vcl_discard {
+ /* XXX: Do not redefine vcl_discard{}, it is not yet supported */
+ return (discard);
+}
+
+sub vcl_prefetch {
+ /* XXX: Do not redefine vcl_prefetch{}, it is not yet supported */
+ return (fetch);
+}
+
+sub vcl_timeout {
+ /* XXX: Do not redefine vcl_timeout{}, it is not yet supported */
+ return (discard);
+}
+
+sub vcl_error {
+ set obj.http.Content-Type = "text/html; charset=utf-8";
+ synthetic {"
+
+
+
+
+ "} obj.status " " obj.response {"
+
+
+ Error "} obj.status " " obj.response {"
+ "} obj.response {"
+ Guru Meditation:
+ XID: "} req.xid {"
+
+
+ Varnish cache server
+
+
+
+"};
+ return (deliver);
+}
diff --git a/samples/VCL/varnish3_default.vcl b/samples/VCL/varnish3_default.vcl
new file mode 100644
index 00000000..412b6e94
--- /dev/null
+++ b/samples/VCL/varnish3_default.vcl
@@ -0,0 +1,149 @@
+/*-
+ * Copyright (c) 2006 Verdens Gang AS
+ * Copyright (c) 2006-2011 Varnish Software AS
+ * All rights reserved.
+ *
+ * Author: Poul-Henning Kamp
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The default VCL code.
+ *
+ * NB! You do NOT need to copy & paste all of these functions into your
+ * own vcl code, if you do not provide a definition of one of these
+ * functions, the compiler will automatically fall back to the default
+ * code from this file.
+ *
+ * This code will be prefixed with a backend declaration built from the
+ * -b argument.
+ */
+
+sub vcl_recv {
+ if (req.restarts == 0) {
+ if (req.http.x-forwarded-for) {
+ set req.http.X-Forwarded-For =
+ req.http.X-Forwarded-For + ", " + client.ip;
+ } else {
+ set req.http.X-Forwarded-For = client.ip;
+ }
+ }
+ if (req.request != "GET" &&
+ req.request != "HEAD" &&
+ req.request != "PUT" &&
+ req.request != "POST" &&
+ req.request != "TRACE" &&
+ req.request != "OPTIONS" &&
+ req.request != "DELETE") {
+ /* Non-RFC2616 or CONNECT which is weird. */
+ return (pipe);
+ }
+ if (req.request != "GET" && req.request != "HEAD") {
+ /* We only deal with GET and HEAD by default */
+ return (pass);
+ }
+ if (req.http.Authorization || req.http.Cookie) {
+ /* Not cacheable by default */
+ return (pass);
+ }
+ return (lookup);
+}
+
+sub vcl_pipe {
+ # Note that only the first request to the backend will have
+ # X-Forwarded-For set. If you use X-Forwarded-For and want to
+ # have it set for all requests, make sure to have:
+ # set bereq.http.connection = "close";
+ # here. It is not set by default as it might break some broken web
+ # applications, like IIS with NTLM authentication.
+ return (pipe);
+}
+
+sub vcl_pass {
+ return (pass);
+}
+
+sub vcl_hash {
+ hash_data(req.url);
+ if (req.http.host) {
+ hash_data(req.http.host);
+ } else {
+ hash_data(server.ip);
+ }
+ return (hash);
+}
+
+sub vcl_hit {
+ return (deliver);
+}
+
+sub vcl_miss {
+ return (fetch);
+}
+
+sub vcl_fetch {
+ if (beresp.ttl <= 0s ||
+ beresp.http.Set-Cookie ||
+ beresp.http.Vary == "*") {
+ /*
+ * Mark as "Hit-For-Pass" for the next 2 minutes
+ */
+ set beresp.ttl = 120 s;
+ return (hit_for_pass);
+ }
+ return (deliver);
+}
+
+sub vcl_deliver {
+ return (deliver);
+}
+
+sub vcl_error {
+ set obj.http.Content-Type = "text/html; charset=utf-8";
+ set obj.http.Retry-After = "5";
+ synthetic {"
+
+
+
+
+ "} + obj.status + " " + obj.response + {"
+
+
+ Error "} + obj.status + " " + obj.response + {"
+ "} + obj.response + {"
+ Guru Meditation:
+ XID: "} + req.xid + {"
+
+ Varnish cache server
+
+
+"};
+ return (deliver);
+}
+
+sub vcl_init {
+ return (ok);
+}
+
+sub vcl_fini {
+ return (ok);
+}
diff --git a/samples/XML/XmlIO.pluginspec b/samples/XML/XmlIO.pluginspec
new file mode 100644
index 00000000..8e02e760
--- /dev/null
+++ b/samples/XML/XmlIO.pluginspec
@@ -0,0 +1,13 @@
+
+ FreeMedForms
+ (C) 2008-2012 by Eric MAEKER, MD
+ GPLv3
+ Patient data
+ The XML form loader/saver for FreeMedForms.
+ http://www.freemedforms.com/
+
+
+
+
+
+
diff --git a/samples/XML/csproj-sample.csproj b/samples/XML/csproj-sample.csproj
new file mode 100644
index 00000000..c4c4be68
--- /dev/null
+++ b/samples/XML/csproj-sample.csproj
@@ -0,0 +1,59 @@
+
+
+
+
+ Debug
+ AnyCPU
+ {99D9BF15-2911-4D10-8079-83ABAD688E8B}
+ Exe
+ Properties
+ csproj_sample
+ csproj-sample
+ v4.5.1
+ 512
+ true
+
+
+ AnyCPU
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ AnyCPU
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/samples/XML/fsproj-sample.fsproj b/samples/XML/fsproj-sample.fsproj
new file mode 100644
index 00000000..205dde83
--- /dev/null
+++ b/samples/XML/fsproj-sample.fsproj
@@ -0,0 +1,76 @@
+
+
+
+
+ Debug
+ AnyCPU
+ 2.0
+ 6cfa7a11-a5cd-4301-bd7b-b210d4d51a29
+ Exe
+ fsproj_sample
+ fsproj_sample
+ v4.5.1
+ true
+ 4.3.1.0
+ fsproj-sample
+
+
+ true
+ full
+ false
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ 3
+ AnyCPU
+ bin\Debug\fsproj_sample.XML
+ true
+
+
+ pdbonly
+ true
+ true
+ bin\Release\
+ TRACE
+ 3
+ AnyCPU
+ bin\Release\fsproj_sample.XML
+ true
+
+
+
+
+ True
+
+
+
+
+
+
+
+
+
+
+ 11
+
+
+
+
+ $(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets
+
+
+
+
+ $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.FSharp.Targets
+
+
+
+
+
+
\ No newline at end of file
diff --git a/samples/XML/nproj-sample.nproj b/samples/XML/nproj-sample.nproj
new file mode 100644
index 00000000..c50bcccb
--- /dev/null
+++ b/samples/XML/nproj-sample.nproj
@@ -0,0 +1,77 @@
+
+
+
+ Debug
+ AnyCPU
+ 8.0.30703
+ 2.0
+ c67af951-5808-4525-9785-d8d6376993e7
+ Exe
+ Properties
+ nproj_sample
+ nproj_sample
+ v4.5.1
+ 512
+ true
+ Net-4.0
+ $(ProgramFiles)\Nemerle
+ $(NemerleBinPathRoot)\$(NemerleVersion)
+ nproj-sample
+
+
+ true
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ false
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+ $(OutputPath)\$(AssemblyName).xml
+
+
+
+
+
+ 3.5
+
+
+ 3.5
+
+
+ 3.5
+
+
+
+
+ False
+ $(Nemerle)\Nemerle.dll
+ True
+
+
+ $(Nemerle)\Nemerle.Linq.dll
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/samples/XML/sample.nuspec b/samples/XML/sample.nuspec
new file mode 100644
index 00000000..238c325a
--- /dev/null
+++ b/samples/XML/sample.nuspec
@@ -0,0 +1,21 @@
+
+
+
+ Sample
+ Sample
+ 0.101.0
+ Hugh Bot
+ Hugh Bot
+ A package of nuget
+
+ It just works
+
+ http://hubot.github.com
+
+ https://github.com/github/hubot/LICENSEmd
+ false
+
+
+
+
+
diff --git a/samples/XML/sample.targets b/samples/XML/sample.targets
new file mode 100644
index 00000000..50e1d81b
--- /dev/null
+++ b/samples/XML/sample.targets
@@ -0,0 +1,9 @@
+
+
+ MyCommon
+
+
+
+
+
+
\ No newline at end of file
diff --git a/samples/XML/vbproj-sample.vbproj b/samples/XML/vbproj-sample.vbproj
new file mode 100644
index 00000000..90422f08
--- /dev/null
+++ b/samples/XML/vbproj-sample.vbproj
@@ -0,0 +1,115 @@
+
+
+
+
+ Debug
+ AnyCPU
+ {400D377F-6993-425A-A798-05532B3FD04C}
+ Exe
+ vbproj_sample.Module1
+ vbproj_sample
+ vbproj-sample
+ 512
+ Console
+ v4.5.1
+ true
+
+
+ AnyCPU
+ true
+ full
+ true
+ true
+ bin\Debug\
+ vbproj-sample.xml
+ 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022
+
+
+ AnyCPU
+ pdbonly
+ false
+ true
+ true
+ bin\Release\
+ vbproj-sample.xml
+ 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022
+
+
+ On
+
+
+ Binary
+
+
+ Off
+
+
+ On
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ True
+ Application.myapp
+
+
+ True
+ True
+ Resources.resx
+
+
+ True
+ Settings.settings
+ True
+
+
+
+
+ VbMyResourcesResXFileCodeGenerator
+ Resources.Designer.vb
+ My.Resources
+ Designer
+
+
+
+
+ MyApplicationCodeGenerator
+ Application.Designer.vb
+
+
+ SettingsSingleFileGenerator
+ My
+ Settings.Designer.vb
+
+
+
+
+
+
\ No newline at end of file
diff --git a/samples/XML/vcxproj-sample.vcxproj b/samples/XML/vcxproj-sample.vcxproj
new file mode 100644
index 00000000..52e7f458
--- /dev/null
+++ b/samples/XML/vcxproj-sample.vcxproj
@@ -0,0 +1,104 @@
+
+
+
+
+ Debug
+ Win32
+
+
+ Release
+ Win32
+
+
+
+ {BF6EED48-BF18-4C54-866F-6BBF19EEDC7C}
+ v4.5.1
+ ManagedCProj
+ vcxprojsample
+
+
+
+ Application
+ true
+ v120
+ true
+ Unicode
+
+
+ Application
+ false
+ v120
+ true
+ Unicode
+
+
+
+
+
+
+
+
+
+
+
+
+ true
+
+
+ false
+
+
+
+ Level3
+ Disabled
+ WIN32;_DEBUG;%(PreprocessorDefinitions)
+ Use
+
+
+ true
+
+ Console
+
+
+
+
+ Level3
+ WIN32;NDEBUG;%(PreprocessorDefinitions)
+ Use
+
+
+ true
+
+ Console
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Create
+ Create
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/samples/XML/vcxproj-sample.vcxproj.filters b/samples/XML/vcxproj-sample.vcxproj.filters
new file mode 100644
index 00000000..41bf7054
--- /dev/null
+++ b/samples/XML/vcxproj-sample.vcxproj.filters
@@ -0,0 +1,49 @@
+
+
+
+
+ {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
+ cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx
+
+
+ {93995380-89BD-4b04-88EB-625FBE52EBFB}
+ h;hh;hpp;hxx;hm;inl;inc;xsd
+
+
+ {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
+ rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms
+
+
+
+
+
+
+
+ Header Files
+
+
+ Header Files
+
+
+
+
+ Resource Files
+
+
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+
+
+ Resource Files
+
+
+
\ No newline at end of file
diff --git a/samples/Xojo/App.xojo_code b/samples/Xojo/App.xojo_code
new file mode 100644
index 00000000..4b7d02a5
--- /dev/null
+++ b/samples/Xojo/App.xojo_code
@@ -0,0 +1,22 @@
+#tag Class
+Protected Class App
+Inherits Application
+ #tag Constant, Name = kEditClear, Type = String, Dynamic = False, Default = \"&Delete", Scope = Public
+ #Tag Instance, Platform = Windows, Language = Default, Definition = \"&Delete"
+ #Tag Instance, Platform = Linux, Language = Default, Definition = \"&Delete"
+ #tag EndConstant
+
+ #tag Constant, Name = kFileQuit, Type = String, Dynamic = False, Default = \"&Quit", Scope = Public
+ #Tag Instance, Platform = Windows, Language = Default, Definition = \"E&xit"
+ #tag EndConstant
+
+ #tag Constant, Name = kFileQuitShortcut, Type = String, Dynamic = False, Default = \"", Scope = Public
+ #Tag Instance, Platform = Mac OS, Language = Default, Definition = \"Cmd+Q"
+ #Tag Instance, Platform = Linux, Language = Default, Definition = \"Ctrl+Q"
+ #tag EndConstant
+
+
+ #tag ViewBehavior
+ #tag EndViewBehavior
+End Class
+#tag EndClass
diff --git a/samples/Xojo/BillingReport.xojo_report b/samples/Xojo/BillingReport.xojo_report
new file mode 100644
index 00000000..fae10085
--- /dev/null
+++ b/samples/Xojo/BillingReport.xojo_report
@@ -0,0 +1,23 @@
+#tag Report
+Begin Report BillingReport
+ Compatibility = ""
+ Units = 0
+ Width = 8.5
+ Begin PageHeader
+ Type = 1
+ Height = 1.0
+ End
+ Begin Body
+ Type = 3
+ Height = 2.0
+ End
+ Begin PageFooter
+ Type = 5
+ Height = 1.0
+ End
+End
+#tag EndReport
+
+#tag ReportCode
+#tag EndReportCode
+
diff --git a/samples/Xojo/MainMenuBar.xojo_menu b/samples/Xojo/MainMenuBar.xojo_menu
new file mode 100644
index 00000000..0634681c
--- /dev/null
+++ b/samples/Xojo/MainMenuBar.xojo_menu
@@ -0,0 +1,112 @@
+#tag Menu
+Begin Menu MainMenuBar
+ Begin MenuItem FileMenu
+ SpecialMenu = 0
+ Text = "&File"
+ Index = -2147483648
+ AutoEnable = True
+ Visible = True
+ Begin QuitMenuItem FileQuit
+ SpecialMenu = 0
+ Text = "#App.kFileQuit"
+ Index = -2147483648
+ ShortcutKey = "#App.kFileQuitShortcut"
+ Shortcut = "#App.kFileQuitShortcut"
+ AutoEnable = True
+ Visible = True
+ End
+ End
+ Begin MenuItem EditMenu
+ SpecialMenu = 0
+ Text = "&Edit"
+ Index = -2147483648
+ AutoEnable = True
+ Visible = True
+ Begin MenuItem EditUndo
+ SpecialMenu = 0
+ Text = "&Undo"
+ Index = -2147483648
+ ShortcutKey = "Z"
+ Shortcut = "Cmd+Z"
+ MenuModifier = True
+ AutoEnable = True
+ Visible = True
+ End
+ Begin MenuItem EditSeparator1
+ SpecialMenu = 0
+ Text = "-"
+ Index = -2147483648
+ AutoEnable = True
+ Visible = True
+ End
+ Begin MenuItem EditCut
+ SpecialMenu = 0
+ Text = "Cu&t"
+ Index = -2147483648
+ ShortcutKey = "X"
+ Shortcut = "Cmd+X"
+ MenuModifier = True
+ AutoEnable = True
+ Visible = True
+ End
+ Begin MenuItem EditCopy
+ SpecialMenu = 0
+ Text = "&Copy"
+ Index = -2147483648
+ ShortcutKey = "C"
+ Shortcut = "Cmd+C"
+ MenuModifier = True
+ AutoEnable = True
+ Visible = True
+ End
+ Begin MenuItem EditPaste
+ SpecialMenu = 0
+ Text = "&Paste"
+ Index = -2147483648
+ ShortcutKey = "V"
+ Shortcut = "Cmd+V"
+ MenuModifier = True
+ AutoEnable = True
+ Visible = True
+ End
+ Begin MenuItem EditClear
+ SpecialMenu = 0
+ Text = "#App.kEditClear"
+ Index = -2147483648
+ AutoEnable = True
+ Visible = True
+ End
+ Begin MenuItem EditSeparator2
+ SpecialMenu = 0
+ Text = "-"
+ Index = -2147483648
+ AutoEnable = True
+ Visible = True
+ End
+ Begin MenuItem EditSelectAll
+ SpecialMenu = 0
+ Text = "Select &All"
+ Index = -2147483648
+ ShortcutKey = "A"
+ Shortcut = "Cmd+A"
+ MenuModifier = True
+ AutoEnable = True
+ Visible = True
+ End
+ Begin MenuItem UntitledSeparator
+ SpecialMenu = 0
+ Text = "-"
+ Index = -2147483648
+ AutoEnable = True
+ Visible = True
+ End
+ Begin AppleMenuItem AboutItem
+ SpecialMenu = 0
+ Text = "About This App..."
+ Index = -2147483648
+ AutoEnable = True
+ Visible = True
+ End
+ End
+End
+#tag EndMenu
diff --git a/samples/Xojo/MyToolbar.xojo_toolbar b/samples/Xojo/MyToolbar.xojo_toolbar
new file mode 100644
index 00000000..02dfbf0a
--- /dev/null
+++ b/samples/Xojo/MyToolbar.xojo_toolbar
@@ -0,0 +1,14 @@
+#tag Toolbar
+Begin Toolbar MyToolbar
+ Begin ToolButton FirstItem
+ Caption = "First Item"
+ HelpTag = ""
+ Style = 0
+ End
+ Begin ToolButton SecondItem
+ Caption = "Second Item"
+ HelpTag = ""
+ Style = 0
+ End
+End
+#tag EndToolbar
diff --git a/samples/Xojo/Window1.xojo_window b/samples/Xojo/Window1.xojo_window
new file mode 100644
index 00000000..c52fd843
--- /dev/null
+++ b/samples/Xojo/Window1.xojo_window
@@ -0,0 +1,304 @@
+#tag Window
+Begin Window Window1
+ BackColor = &cFFFFFF00
+ Backdrop = 0
+ CloseButton = True
+ Compatibility = ""
+ Composite = False
+ Frame = 0
+ FullScreen = False
+ FullScreenButton= False
+ HasBackColor = False
+ Height = 400
+ ImplicitInstance= True
+ LiveResize = True
+ MacProcID = 0
+ MaxHeight = 32000
+ MaximizeButton = True
+ MaxWidth = 32000
+ MenuBar = 1153981589
+ MenuBarVisible = True
+ MinHeight = 64
+ MinimizeButton = True
+ MinWidth = 64
+ Placement = 0
+ Resizeable = True
+ Title = "Sample App"
+ Visible = True
+ Width = 600
+ Begin PushButton HelloWorldButton
+ AutoDeactivate = True
+ Bold = False
+ ButtonStyle = "0"
+ Cancel = False
+ Caption = "Push Me"
+ Default = True
+ Enabled = True
+ Height = 20
+ HelpTag = ""
+ Index = -2147483648
+ InitialParent = ""
+ Italic = False
+ Left = 260
+ LockBottom = False
+ LockedInPosition= False
+ LockLeft = True
+ LockRight = False
+ LockTop = True
+ Scope = 0
+ TabIndex = 0
+ TabPanelIndex = 0
+ TabStop = True
+ TextFont = "System"
+ TextSize = 0.0
+ TextUnit = 0
+ Top = 32
+ Underline = False
+ Visible = True
+ Width = 80
+ End
+End
+#tag EndWindow
+
+#tag WindowCode
+#tag EndWindowCode
+
+#tag Events HelloWorldButton
+ #tag Event
+ Sub Action()
+ Dim total As Integer
+
+ For i As Integer = 0 To 10
+ total = total + i
+ Next
+
+ MsgBox "Hello World! " + Str(total)
+ End Sub
+ #tag EndEvent
+#tag EndEvents
+#tag ViewBehavior
+ #tag ViewProperty
+ Name="BackColor"
+ Visible=true
+ Group="Appearance"
+ InitialValue="&hFFFFFF"
+ Type="Color"
+ #tag EndViewProperty
+ #tag ViewProperty
+ Name="Backdrop"
+ Visible=true
+ Group="Appearance"
+ Type="Picture"
+ EditorType="Picture"
+ #tag EndViewProperty
+ #tag ViewProperty
+ Name="CloseButton"
+ Visible=true
+ Group="Appearance"
+ InitialValue="True"
+ Type="Boolean"
+ EditorType="Boolean"
+ #tag EndViewProperty
+ #tag ViewProperty
+ Name="Composite"
+ Visible=true
+ Group="Appearance"
+ InitialValue="False"
+ Type="Boolean"
+ #tag EndViewProperty
+ #tag ViewProperty
+ Name="Frame"
+ Visible=true
+ Group="Appearance"
+ InitialValue="0"
+ Type="Integer"
+ EditorType="Enum"
+ #tag EnumValues
+ "0 - Document"
+ "1 - Movable Modal"
+ "2 - Modal Dialog"
+ "3 - Floating Window"
+ "4 - Plain Box"
+ "5 - Shadowed Box"
+ "6 - Rounded Window"
+ "7 - Global Floating Window"
+ "8 - Sheet Window"
+ "9 - Metal Window"
+ "10 - Drawer Window"
+ "11 - Modeless Dialog"
+ #tag EndEnumValues
+ #tag EndViewProperty
+ #tag ViewProperty
+ Name="FullScreen"
+ Group="Appearance"
+ InitialValue="False"
+ Type="Boolean"
+ EditorType="Boolean"
+ #tag EndViewProperty
+ #tag ViewProperty
+ Name="FullScreenButton"
+ Visible=true
+ Group="Appearance"
+ InitialValue="False"
+ Type="Boolean"
+ EditorType="Boolean"
+ #tag EndViewProperty
+ #tag ViewProperty
+ Name="HasBackColor"
+ Visible=true
+ Group="Appearance"
+ InitialValue="False"
+ Type="Boolean"
+ #tag EndViewProperty
+ #tag ViewProperty
+ Name="Height"
+ Visible=true
+ Group="Position"
+ InitialValue="400"
+ Type="Integer"
+ #tag EndViewProperty
+ #tag ViewProperty
+ Name="ImplicitInstance"
+ Visible=true
+ Group="Appearance"
+ InitialValue="True"
+ Type="Boolean"
+ EditorType="Boolean"
+ #tag EndViewProperty
+ #tag ViewProperty
+ Name="Interfaces"
+ Visible=true
+ Group="ID"
+ Type="String"
+ #tag EndViewProperty
+ #tag ViewProperty
+ Name="LiveResize"
+ Visible=true
+ Group="Appearance"
+ InitialValue="True"
+ Type="Boolean"
+ EditorType="Boolean"
+ #tag EndViewProperty
+ #tag ViewProperty
+ Name="MacProcID"
+ Visible=true
+ Group="Appearance"
+ InitialValue="0"
+ Type="Integer"
+ #tag EndViewProperty
+ #tag ViewProperty
+ Name="MaxHeight"
+ Visible=true
+ Group="Position"
+ InitialValue="32000"
+ Type="Integer"
+ #tag EndViewProperty
+ #tag ViewProperty
+ Name="MaximizeButton"
+ Visible=true
+ Group="Appearance"
+ InitialValue="True"
+ Type="Boolean"
+ EditorType="Boolean"
+ #tag EndViewProperty
+ #tag ViewProperty
+ Name="MaxWidth"
+ Visible=true
+ Group="Position"
+ InitialValue="32000"
+ Type="Integer"
+ #tag EndViewProperty
+ #tag ViewProperty
+ Name="MenuBar"
+ Visible=true
+ Group="Appearance"
+ Type="MenuBar"
+ EditorType="MenuBar"
+ #tag EndViewProperty
+ #tag ViewProperty
+ Name="MenuBarVisible"
+ Group="Appearance"
+ InitialValue="True"
+ Type="Boolean"
+ EditorType="Boolean"
+ #tag EndViewProperty
+ #tag ViewProperty
+ Name="MinHeight"
+ Visible=true
+ Group="Position"
+ InitialValue="64"
+ Type="Integer"
+ #tag EndViewProperty
+ #tag ViewProperty
+ Name="MinimizeButton"
+ Visible=true
+ Group="Appearance"
+ InitialValue="True"
+ Type="Boolean"
+ EditorType="Boolean"
+ #tag EndViewProperty
+ #tag ViewProperty
+ Name="MinWidth"
+ Visible=true
+ Group="Position"
+ InitialValue="64"
+ Type="Integer"
+ #tag EndViewProperty
+ #tag ViewProperty
+ Name="Name"
+ Visible=true
+ Group="ID"
+ Type="String"
+ #tag EndViewProperty
+ #tag ViewProperty
+ Name="Placement"
+ Visible=true
+ Group="Position"
+ InitialValue="0"
+ Type="Integer"
+ EditorType="Enum"
+ #tag EnumValues
+ "0 - Default"
+ "1 - Parent Window"
+ "2 - Main Screen"
+ "3 - Parent Window Screen"
+ "4 - Stagger"
+ #tag EndEnumValues
+ #tag EndViewProperty
+ #tag ViewProperty
+ Name="Resizeable"
+ Visible=true
+ Group="Appearance"
+ InitialValue="True"
+ Type="Boolean"
+ EditorType="Boolean"
+ #tag EndViewProperty
+ #tag ViewProperty
+ Name="Super"
+ Visible=true
+ Group="ID"
+ Type="String"
+ #tag EndViewProperty
+ #tag ViewProperty
+ Name="Title"
+ Visible=true
+ Group="Appearance"
+ InitialValue="Untitled"
+ Type="String"
+ #tag EndViewProperty
+ #tag ViewProperty
+ Name="Visible"
+ Visible=true
+ Group="Appearance"
+ InitialValue="True"
+ Type="Boolean"
+ EditorType="Boolean"
+ #tag EndViewProperty
+ #tag ViewProperty
+ Name="Width"
+ Visible=true
+ Group="Position"
+ InitialValue="600"
+ Type="Integer"
+ #tag EndViewProperty
+#tag EndViewBehavior
diff --git a/samples/Xojo/database.xojo_script b/samples/Xojo/database.xojo_script
new file mode 100644
index 00000000..1f0f59cc
--- /dev/null
+++ b/samples/Xojo/database.xojo_script
@@ -0,0 +1,17 @@
+Dim dbFile As FolderItem
+Dim db As New SQLiteDatabase
+dbFile = GetFolderItem("Employees.sqlite")
+db.DatabaseFile = dbFile
+If db.Connect Then
+ db.SQLExecute("BEGIN TRANSACTION")
+ db.SQLExecute ("INSERT INTO Employees (Name,Job,YearJoined) VALUES "_
+ +"('Dr.Strangelove','Advisor',1962)")
+ If db.Error then
+ MsgBox("Error: " + db.ErrorMessage)
+ db.Rollback
+ Else
+ db.Commit
+ End If
+Else
+ MsgBox("The database couldn't be opened. Error: " + db.ErrorMessage)
+End If
diff --git a/samples/Zephir/filenames/exception.zep.c b/samples/Zephir/filenames/exception.zep.c
new file mode 100644
index 00000000..c1e0bc09
--- /dev/null
+++ b/samples/Zephir/filenames/exception.zep.c
@@ -0,0 +1,28 @@
+
+#ifdef HAVE_CONFIG_H
+#include "../../ext_config.h"
+#endif
+
+#include
+#include "../../php_ext.h"
+#include "../../ext.h"
+
+#include
+#include
+#include
+
+#include "kernel/main.h"
+
+
+/**
+ * Test\Router\Exception
+ *
+ * Exceptions generated by the router
+ */
+ZEPHIR_INIT_CLASS(Test_Router_Exception) {
+
+ ZEPHIR_REGISTER_CLASS_EX(Test\\Router, Exception, test, router_exception, zend_exception_get_default(TSRMLS_C), NULL, 0);
+
+ return SUCCESS;
+
+}
diff --git a/samples/Zephir/filenames/exception.zep.h b/samples/Zephir/filenames/exception.zep.h
new file mode 100644
index 00000000..49d56b9c
--- /dev/null
+++ b/samples/Zephir/filenames/exception.zep.h
@@ -0,0 +1,4 @@
+
+extern zend_class_entry *test_router_exception_ce;
+
+ZEPHIR_INIT_CLASS(Test_Router_Exception);
diff --git a/samples/Zephir/filenames/exception.zep.php b/samples/Zephir/filenames/exception.zep.php
new file mode 100644
index 00000000..f6087a8d
--- /dev/null
+++ b/samples/Zephir/filenames/exception.zep.php
@@ -0,0 +1,8 @@
+ in IxI] := { in IxI with
+ (m != i or n != j) and (m == i or n == j or abs(m - i) == abs(n - j)) };
+
+var x[IxI] binary;
+
+maximize queens: sum in IxI : x[i,j];
+
+subto c1: forall in IxI do
+ card(TABU[i,j]) - card(TABU[i,j]) * x[i,j] >= sum in TABU[i,j] : x[m,n];
+
diff --git a/test/test_blob.rb b/test/test_blob.rb
index 3e82f7a8..4f08db11 100644
--- a/test/test_blob.rb
+++ b/test/test_blob.rb
@@ -11,6 +11,17 @@ class TestBlob < Test::Unit::TestCase
Lexer = Pygments::Lexer
+ def setup
+ # git blobs are normally loaded as ASCII-8BIT since they may contain data
+ # with arbitrary encoding not known ahead of time
+ @original_external = Encoding.default_external
+ Encoding.default_external = Encoding.find("ASCII-8BIT")
+ end
+
+ def teardown
+ Encoding.default_external = @original_external
+ end
+
def samples_path
File.expand_path("../../samples", __FILE__)
end
@@ -67,6 +78,14 @@ class TestBlob < Test::Unit::TestCase
assert_equal 475, blob("Emacs Lisp/ess-julia.el").lines.length
end
+ def test_lines_maintains_original_encoding
+ # Even if the file's encoding is detected as something like UTF-16LE,
+ # earlier versions of the gem made implicit guarantees that the encoding of
+ # each `line` is in the same encoding as the file was originally read (in
+ # practice, UTF-8 or ASCII-8BIT)
+ assert_equal Encoding.default_external, blob("Text/utf16le.txt").lines.first.encoding
+ end
+
def test_size
assert_equal 15, blob("Ruby/foo.rb").size
end
@@ -77,13 +96,27 @@ class TestBlob < Test::Unit::TestCase
def test_sloc
assert_equal 2, blob("Ruby/foo.rb").sloc
+ assert_equal 3, blob("Text/utf16le-windows.txt").sloc
+ assert_equal 1, blob("Text/iso8859-8-i.txt").sloc
end
def test_encoding
assert_equal "ISO-8859-2", blob("Text/README").encoding
+ assert_equal "ISO-8859-2", blob("Text/README").ruby_encoding
assert_equal "ISO-8859-1", blob("Text/dump.sql").encoding
+ assert_equal "ISO-8859-1", blob("Text/dump.sql").ruby_encoding
assert_equal "UTF-8", blob("Text/foo.txt").encoding
+ assert_equal "UTF-8", blob("Text/foo.txt").ruby_encoding
+ assert_equal "UTF-16LE", blob("Text/utf16le.txt").encoding
+ assert_equal "UTF-16LE", blob("Text/utf16le.txt").ruby_encoding
+ assert_equal "UTF-16LE", blob("Text/utf16le-windows.txt").encoding
+ assert_equal "UTF-16LE", blob("Text/utf16le-windows.txt").ruby_encoding
+ assert_equal "ISO-2022-KR", blob("Text/ISO-2022-KR.txt").encoding
+ assert_equal "binary", blob("Text/ISO-2022-KR.txt").ruby_encoding
assert_nil blob("Binary/dog.o").encoding
+
+ assert_equal "windows-1252", blob("Text/Visual_Battlers.rb").encoding
+ assert_equal "Windows-1252", blob("Text/Visual_Battlers.rb").ruby_encoding
end
def test_binary
@@ -214,6 +247,13 @@ class TestBlob < Test::Unit::TestCase
# Generated VCR
assert blob("YAML/vcr_cassette.yml").generated?
+ # Generated by Zephir
+ assert blob("Zephir/filenames/exception.zep.c").generated?
+ assert blob("Zephir/filenames/exception.zep.h").generated?
+ assert blob("Zephir/filenames/exception.zep.php").generated?
+ assert !blob("Zephir/Router.zep").generated?
+
+
assert Linguist::Generated.generated?("node_modules/grunt/lib/grunt.js", nil)
end
@@ -306,6 +346,14 @@ class TestBlob < Test::Unit::TestCase
assert blob("public/javascripts/angular.js").vendored?
assert blob("public/javascripts/angular.min.js").vendored?
+ # D3.js
+ assert blob("public/javascripts/d3.v3.js").vendored?
+ assert blob("public/javascripts/d3.v3.min.js").vendored?
+
+ # Modernizr
+ assert blob("public/javascripts/modernizr-2.7.1.js").vendored?
+ assert blob("public/javascripts/modernizr.custom.01009.js").vendored?
+
# Fabric
assert blob("fabfile.py").vendored?
@@ -334,6 +382,10 @@ class TestBlob < Test::Unit::TestCase
# NuGet Packages
assert blob("packages/Modernizr.2.0.6/Content/Scripts/modernizr-2.0.6-development-only.js").vendored?
+ # Html5shiv
+ assert blob("Scripts/html5shiv.js").vendored?
+ assert blob("Scripts/html5shiv.min.js").vendored?
+
# Test fixtures
assert blob("test/fixtures/random.rkt").vendored?
assert blob("Test/fixtures/random.rkt").vendored?
@@ -354,6 +406,11 @@ class TestBlob < Test::Unit::TestCase
assert blob("subproject/gradlew").vendored?
assert blob("subproject/gradlew.bat").vendored?
assert blob("subproject/gradle/wrapper/gradle-wrapper.properties").vendored?
+
+ # Octicons
+ assert blob("octicons.css").vendored?
+ assert blob("public/octicons.min.css").vendored?
+ assert blob("public/octicons/sprockets-octicons.scss").vendored?
end
def test_language
diff --git a/test/test_language.rb b/test/test_language.rb
index 423434fb..10c5f9a2 100644
--- a/test/test_language.rb
+++ b/test/test_language.rb
@@ -214,7 +214,7 @@ class TestLanguage < Test::Unit::TestCase
def test_searchable
assert Language['Ruby'].searchable?
assert !Language['Gettext Catalog'].searchable?
- assert !Language['SQL'].searchable?
+ assert Language['SQL'].searchable?
end
def test_find_by_name
@@ -323,7 +323,7 @@ class TestLanguage < Test::Unit::TestCase
def test_color
assert_equal '#701516', Language['Ruby'].color
assert_equal '#3581ba', Language['Python'].color
- assert_equal '#f7df1e', Language['JavaScript'].color
+ assert_equal '#f1e05a', Language['JavaScript'].color
assert_equal '#31859c', Language['TypeScript'].color
end
diff --git a/test/test_pedantic.rb b/test/test_pedantic.rb
index d6271dd7..2586f4ca 100644
--- a/test/test_pedantic.rb
+++ b/test/test_pedantic.rb
@@ -22,10 +22,10 @@ class TestPedantic < Test::Unit::TestCase
file("languages.yml").lines.each do |line|
if line =~ /^ extensions:$/
extensions = []
- elsif extensions && line =~ /^ - \.(\w+)$/
+ elsif extensions && line =~ /^ - \.([\w-]+)( *#.*)?$/
extensions << $1
else
- assert_sorted extensions if extensions
+ assert_sorted extensions[1..-1] if extensions
extensions = nil
end
end
diff --git a/test/test_samples.rb b/test/test_samples.rb
index 5073f7b8..e0130282 100644
--- a/test/test_samples.rb
+++ b/test/test_samples.rb
@@ -1,7 +1,7 @@
require 'linguist/samples'
+require 'linguist/language'
require 'tempfile'
require 'yajl'
-
require 'test/unit'
class TestSamples < Test::Unit::TestCase
@@ -35,4 +35,22 @@ class TestSamples < Test::Unit::TestCase
assert_equal data['tokens_total'], data['language_tokens'].inject(0) { |n, (_, c)| n += c }
assert_equal data['tokens_total'], data['tokens'].inject(0) { |n, (_, ts)| n += ts.inject(0) { |m, (_, c)| m += c } }
end
+
+ # If a language extension isn't globally unique then make sure there are samples
+ def test_presence
+ Linguist::Language.all.each do |language|
+ language.all_extensions.each do |extension|
+ language_matches = Language.find_by_filename("foo#{extension}")
+
+ # If there is more than one language match for a given extension
+ # then check that there are examples for that language with the extension
+ if language_matches.length > 1
+ language_matches.each do |language|
+ assert File.directory?("samples/#{language.name}"), "#{language.name} is missing a samples directory"
+ assert Dir.glob("samples/#{language.name}/*#{extension}").any?, "#{language.name} is missing samples for extension #{extension}"
+ end
+ end
+ end
+ end
+ end
end