mirror of
https://github.com/KevinMidboe/linguist.git
synced 2025-10-29 17:50:22 +00:00
Merge branch 'master' into combine-gems
This commit is contained in:
290
.gitmodules
vendored
290
.gitmodules
vendored
@@ -25,9 +25,6 @@
|
|||||||
[submodule "vendor/grammars/Sublime-REBOL"]
|
[submodule "vendor/grammars/Sublime-REBOL"]
|
||||||
path = vendor/grammars/Sublime-REBOL
|
path = vendor/grammars/Sublime-REBOL
|
||||||
url = https://github.com/Oldes/Sublime-REBOL
|
url = https://github.com/Oldes/Sublime-REBOL
|
||||||
[submodule "vendor/grammars/Sublime-Inform"]
|
|
||||||
path = vendor/grammars/Sublime-Inform
|
|
||||||
url = https://github.com/PogiNate/Sublime-Inform
|
|
||||||
[submodule "vendor/grammars/autoitv3-tmbundle"]
|
[submodule "vendor/grammars/autoitv3-tmbundle"]
|
||||||
path = vendor/grammars/autoitv3-tmbundle
|
path = vendor/grammars/autoitv3-tmbundle
|
||||||
url = https://github.com/Red-Nova-Technologies/autoitv3-tmbundle
|
url = https://github.com/Red-Nova-Technologies/autoitv3-tmbundle
|
||||||
@@ -85,6 +82,9 @@
|
|||||||
[submodule "vendor/grammars/language-shellscript"]
|
[submodule "vendor/grammars/language-shellscript"]
|
||||||
path = vendor/grammars/language-shellscript
|
path = vendor/grammars/language-shellscript
|
||||||
url = https://github.com/atom/language-shellscript
|
url = https://github.com/atom/language-shellscript
|
||||||
|
[submodule "vendor/grammars/language-supercollider"]
|
||||||
|
path = vendor/grammars/language-supercollider
|
||||||
|
url = https://github.com/supercollider/language-supercollider
|
||||||
[submodule "vendor/grammars/language-yaml"]
|
[submodule "vendor/grammars/language-yaml"]
|
||||||
path = vendor/grammars/language-yaml
|
path = vendor/grammars/language-yaml
|
||||||
url = https://github.com/atom/language-yaml
|
url = https://github.com/atom/language-yaml
|
||||||
@@ -96,7 +96,7 @@
|
|||||||
url = https://github.com/bfad/Sublime-Lasso
|
url = https://github.com/bfad/Sublime-Lasso
|
||||||
[submodule "vendor/grammars/chapel-tmbundle"]
|
[submodule "vendor/grammars/chapel-tmbundle"]
|
||||||
path = vendor/grammars/chapel-tmbundle
|
path = vendor/grammars/chapel-tmbundle
|
||||||
url = https://github.com/bholt/chapel-tmbundle
|
url = https://github.com/chapel-lang/chapel-tmbundle
|
||||||
[submodule "vendor/grammars/sublime-nginx"]
|
[submodule "vendor/grammars/sublime-nginx"]
|
||||||
path = vendor/grammars/sublime-nginx
|
path = vendor/grammars/sublime-nginx
|
||||||
url = https://github.com/brandonwamboldt/sublime-nginx
|
url = https://github.com/brandonwamboldt/sublime-nginx
|
||||||
@@ -112,21 +112,15 @@
|
|||||||
[submodule "vendor/grammars/nesC.tmbundle"]
|
[submodule "vendor/grammars/nesC.tmbundle"]
|
||||||
path = vendor/grammars/nesC.tmbundle
|
path = vendor/grammars/nesC.tmbundle
|
||||||
url = https://github.com/cdwilson/nesC.tmbundle
|
url = https://github.com/cdwilson/nesC.tmbundle
|
||||||
[submodule "vendor/grammars/racket-tmbundle"]
|
|
||||||
path = vendor/grammars/racket-tmbundle
|
|
||||||
url = https://github.com/christophevg/racket-tmbundle
|
|
||||||
[submodule "vendor/grammars/haxe-sublime-bundle"]
|
[submodule "vendor/grammars/haxe-sublime-bundle"]
|
||||||
path = vendor/grammars/haxe-sublime-bundle
|
path = vendor/grammars/haxe-sublime-bundle
|
||||||
url = https://github.com/clemos/haxe-sublime-bundle
|
url = https://github.com/clemos/haxe-sublime-bundle
|
||||||
[submodule "vendor/grammars/cucumber-tmbundle"]
|
[submodule "vendor/grammars/cucumber-tmbundle"]
|
||||||
path = vendor/grammars/cucumber-tmbundle
|
path = vendor/grammars/cucumber-tmbundle
|
||||||
url = https://github.com/cucumber/cucumber-tmbundle
|
url = https://github.com/cucumber/cucumber-tmbundle
|
||||||
[submodule "vendor/grammars/Handlebars"]
|
[submodule "vendor/grammars/powershell"]
|
||||||
path = vendor/grammars/Handlebars
|
path = vendor/grammars/powershell
|
||||||
url = https://github.com/daaain/Handlebars
|
url = https://github.com/SublimeText/PowerShell
|
||||||
[submodule "vendor/grammars/powershell.tmbundle"]
|
|
||||||
path = vendor/grammars/powershell.tmbundle
|
|
||||||
url = https://github.com/davidpeckham/powershell.tmbundle
|
|
||||||
[submodule "vendor/grammars/jade-tmbundle"]
|
[submodule "vendor/grammars/jade-tmbundle"]
|
||||||
path = vendor/grammars/jade-tmbundle
|
path = vendor/grammars/jade-tmbundle
|
||||||
url = https://github.com/davidrios/jade-tmbundle
|
url = https://github.com/davidrios/jade-tmbundle
|
||||||
@@ -139,9 +133,6 @@
|
|||||||
[submodule "vendor/grammars/fancy-tmbundle"]
|
[submodule "vendor/grammars/fancy-tmbundle"]
|
||||||
path = vendor/grammars/fancy-tmbundle
|
path = vendor/grammars/fancy-tmbundle
|
||||||
url = https://github.com/fancy-lang/fancy-tmbundle
|
url = https://github.com/fancy-lang/fancy-tmbundle
|
||||||
[submodule "vendor/grammars/fsharpbinding"]
|
|
||||||
path = vendor/grammars/fsharpbinding
|
|
||||||
url = https://github.com/fsharp/fsharpbinding
|
|
||||||
[submodule "vendor/grammars/monkey.tmbundle"]
|
[submodule "vendor/grammars/monkey.tmbundle"]
|
||||||
path = vendor/grammars/monkey.tmbundle
|
path = vendor/grammars/monkey.tmbundle
|
||||||
url = https://github.com/gingerbeardman/monkey.tmbundle
|
url = https://github.com/gingerbeardman/monkey.tmbundle
|
||||||
@@ -172,18 +163,12 @@
|
|||||||
[submodule "vendor/grammars/Textmate-Gosu-Bundle"]
|
[submodule "vendor/grammars/Textmate-Gosu-Bundle"]
|
||||||
path = vendor/grammars/Textmate-Gosu-Bundle
|
path = vendor/grammars/Textmate-Gosu-Bundle
|
||||||
url = https://github.com/jpcamara/Textmate-Gosu-Bundle
|
url = https://github.com/jpcamara/Textmate-Gosu-Bundle
|
||||||
[submodule "vendor/grammars/jquery-tmbundle"]
|
|
||||||
path = vendor/grammars/jquery-tmbundle
|
|
||||||
url = https://github.com/kswedberg/jquery-tmbundle
|
|
||||||
[submodule "vendor/grammars/fish-tmbundle"]
|
[submodule "vendor/grammars/fish-tmbundle"]
|
||||||
path = vendor/grammars/fish-tmbundle
|
path = vendor/grammars/fish-tmbundle
|
||||||
url = https://github.com/l15n/fish-tmbundle
|
url = https://github.com/l15n/fish-tmbundle
|
||||||
[submodule "vendor/grammars/sublime-idris"]
|
[submodule "vendor/grammars/sublime-idris"]
|
||||||
path = vendor/grammars/sublime-idris
|
path = vendor/grammars/sublime-idris
|
||||||
url = https://github.com/laughedelic/sublime-idris
|
url = https://github.com/laughedelic/sublime-idris
|
||||||
[submodule "vendor/grammars/sublime-better-typescript"]
|
|
||||||
path = vendor/grammars/sublime-better-typescript
|
|
||||||
url = https://github.com/lavrton/sublime-better-typescript
|
|
||||||
[submodule "vendor/grammars/moonscript-tmbundle"]
|
[submodule "vendor/grammars/moonscript-tmbundle"]
|
||||||
path = vendor/grammars/moonscript-tmbundle
|
path = vendor/grammars/moonscript-tmbundle
|
||||||
url = https://github.com/leafo/moonscript-tmbundle
|
url = https://github.com/leafo/moonscript-tmbundle
|
||||||
@@ -252,7 +237,7 @@
|
|||||||
url = https://github.com/shellderp/sublime-robot-plugin
|
url = https://github.com/shellderp/sublime-robot-plugin
|
||||||
[submodule "vendor/grammars/actionscript3-tmbundle"]
|
[submodule "vendor/grammars/actionscript3-tmbundle"]
|
||||||
path = vendor/grammars/actionscript3-tmbundle
|
path = vendor/grammars/actionscript3-tmbundle
|
||||||
url = https://github.com/simongregory/actionscript3-tmbundle
|
url = https://github.com/honzabrecka/actionscript3-tmbundle
|
||||||
[submodule "vendor/grammars/Sublime-QML"]
|
[submodule "vendor/grammars/Sublime-QML"]
|
||||||
path = vendor/grammars/Sublime-QML
|
path = vendor/grammars/Sublime-QML
|
||||||
url = https://github.com/skozlovf/Sublime-QML
|
url = https://github.com/skozlovf/Sublime-QML
|
||||||
@@ -268,9 +253,6 @@
|
|||||||
[submodule "vendor/grammars/SublimeXtend"]
|
[submodule "vendor/grammars/SublimeXtend"]
|
||||||
path = vendor/grammars/SublimeXtend
|
path = vendor/grammars/SublimeXtend
|
||||||
url = https://github.com/staltz/SublimeXtend
|
url = https://github.com/staltz/SublimeXtend
|
||||||
[submodule "vendor/grammars/Stata.tmbundle"]
|
|
||||||
path = vendor/grammars/Stata.tmbundle
|
|
||||||
url = https://github.com/statatmbundle/Stata.tmbundle
|
|
||||||
[submodule "vendor/grammars/Vala-TMBundle"]
|
[submodule "vendor/grammars/Vala-TMBundle"]
|
||||||
path = vendor/grammars/Vala-TMBundle
|
path = vendor/grammars/Vala-TMBundle
|
||||||
url = https://github.com/technosophos/Vala-TMBundle
|
url = https://github.com/technosophos/Vala-TMBundle
|
||||||
@@ -340,15 +322,15 @@
|
|||||||
[submodule "vendor/grammars/ini.tmbundle"]
|
[submodule "vendor/grammars/ini.tmbundle"]
|
||||||
path = vendor/grammars/ini.tmbundle
|
path = vendor/grammars/ini.tmbundle
|
||||||
url = https://github.com/textmate/ini.tmbundle
|
url = https://github.com/textmate/ini.tmbundle
|
||||||
|
[submodule "vendor/grammars/desktop.tmbundle"]
|
||||||
|
path = vendor/grammars/desktop.tmbundle
|
||||||
|
url = https://github.com/Mailaender/desktop.tmbundle.git
|
||||||
[submodule "vendor/grammars/io.tmbundle"]
|
[submodule "vendor/grammars/io.tmbundle"]
|
||||||
path = vendor/grammars/io.tmbundle
|
path = vendor/grammars/io.tmbundle
|
||||||
url = https://github.com/textmate/io.tmbundle
|
url = https://github.com/textmate/io.tmbundle
|
||||||
[submodule "vendor/grammars/java.tmbundle"]
|
[submodule "vendor/grammars/java.tmbundle"]
|
||||||
path = vendor/grammars/java.tmbundle
|
path = vendor/grammars/java.tmbundle
|
||||||
url = https://github.com/textmate/java.tmbundle
|
url = https://github.com/textmate/java.tmbundle
|
||||||
[submodule "vendor/grammars/javadoc.tmbundle"]
|
|
||||||
path = vendor/grammars/javadoc.tmbundle
|
|
||||||
url = https://github.com/textmate/javadoc.tmbundle
|
|
||||||
[submodule "vendor/grammars/javascript-objective-j.tmbundle"]
|
[submodule "vendor/grammars/javascript-objective-j.tmbundle"]
|
||||||
path = vendor/grammars/javascript-objective-j.tmbundle
|
path = vendor/grammars/javascript-objective-j.tmbundle
|
||||||
url = https://github.com/textmate/javascript-objective-j.tmbundle
|
url = https://github.com/textmate/javascript-objective-j.tmbundle
|
||||||
@@ -358,9 +340,6 @@
|
|||||||
[submodule "vendor/grammars/latex.tmbundle"]
|
[submodule "vendor/grammars/latex.tmbundle"]
|
||||||
path = vendor/grammars/latex.tmbundle
|
path = vendor/grammars/latex.tmbundle
|
||||||
url = https://github.com/textmate/latex.tmbundle
|
url = https://github.com/textmate/latex.tmbundle
|
||||||
[submodule "vendor/grammars/less.tmbundle"]
|
|
||||||
path = vendor/grammars/less.tmbundle
|
|
||||||
url = https://github.com/textmate/less.tmbundle
|
|
||||||
[submodule "vendor/grammars/lilypond.tmbundle"]
|
[submodule "vendor/grammars/lilypond.tmbundle"]
|
||||||
path = vendor/grammars/lilypond.tmbundle
|
path = vendor/grammars/lilypond.tmbundle
|
||||||
url = https://github.com/textmate/lilypond.tmbundle
|
url = https://github.com/textmate/lilypond.tmbundle
|
||||||
@@ -397,9 +376,6 @@
|
|||||||
[submodule "vendor/grammars/pascal.tmbundle"]
|
[submodule "vendor/grammars/pascal.tmbundle"]
|
||||||
path = vendor/grammars/pascal.tmbundle
|
path = vendor/grammars/pascal.tmbundle
|
||||||
url = https://github.com/textmate/pascal.tmbundle
|
url = https://github.com/textmate/pascal.tmbundle
|
||||||
[submodule "vendor/grammars/perl.tmbundle"]
|
|
||||||
path = vendor/grammars/perl.tmbundle
|
|
||||||
url = https://github.com/textmate/perl.tmbundle
|
|
||||||
[submodule "vendor/grammars/php-smarty.tmbundle"]
|
[submodule "vendor/grammars/php-smarty.tmbundle"]
|
||||||
path = vendor/grammars/php-smarty.tmbundle
|
path = vendor/grammars/php-smarty.tmbundle
|
||||||
url = https://github.com/textmate/php-smarty.tmbundle
|
url = https://github.com/textmate/php-smarty.tmbundle
|
||||||
@@ -412,9 +388,6 @@
|
|||||||
[submodule "vendor/grammars/processing.tmbundle"]
|
[submodule "vendor/grammars/processing.tmbundle"]
|
||||||
path = vendor/grammars/processing.tmbundle
|
path = vendor/grammars/processing.tmbundle
|
||||||
url = https://github.com/textmate/processing.tmbundle
|
url = https://github.com/textmate/processing.tmbundle
|
||||||
[submodule "vendor/grammars/prolog.tmbundle"]
|
|
||||||
path = vendor/grammars/prolog.tmbundle
|
|
||||||
url = https://github.com/textmate/prolog.tmbundle
|
|
||||||
[submodule "vendor/grammars/python-django.tmbundle"]
|
[submodule "vendor/grammars/python-django.tmbundle"]
|
||||||
path = vendor/grammars/python-django.tmbundle
|
path = vendor/grammars/python-django.tmbundle
|
||||||
url = https://github.com/textmate/python-django.tmbundle
|
url = https://github.com/textmate/python-django.tmbundle
|
||||||
@@ -427,9 +400,6 @@
|
|||||||
[submodule "vendor/grammars/ruby-haml.tmbundle"]
|
[submodule "vendor/grammars/ruby-haml.tmbundle"]
|
||||||
path = vendor/grammars/ruby-haml.tmbundle
|
path = vendor/grammars/ruby-haml.tmbundle
|
||||||
url = https://github.com/textmate/ruby-haml.tmbundle
|
url = https://github.com/textmate/ruby-haml.tmbundle
|
||||||
[submodule "vendor/grammars/ruby-on-rails-tmbundle"]
|
|
||||||
path = vendor/grammars/ruby-on-rails-tmbundle
|
|
||||||
url = https://github.com/textmate/ruby-on-rails-tmbundle
|
|
||||||
[submodule "vendor/grammars/scheme.tmbundle"]
|
[submodule "vendor/grammars/scheme.tmbundle"]
|
||||||
path = vendor/grammars/scheme.tmbundle
|
path = vendor/grammars/scheme.tmbundle
|
||||||
url = https://github.com/textmate/scheme.tmbundle
|
url = https://github.com/textmate/scheme.tmbundle
|
||||||
@@ -448,15 +418,6 @@
|
|||||||
[submodule "vendor/grammars/tcl.tmbundle"]
|
[submodule "vendor/grammars/tcl.tmbundle"]
|
||||||
path = vendor/grammars/tcl.tmbundle
|
path = vendor/grammars/tcl.tmbundle
|
||||||
url = https://github.com/textmate/tcl.tmbundle
|
url = https://github.com/textmate/tcl.tmbundle
|
||||||
[submodule "vendor/grammars/text.tmbundle"]
|
|
||||||
path = vendor/grammars/text.tmbundle
|
|
||||||
url = https://github.com/textmate/text.tmbundle
|
|
||||||
[submodule "vendor/grammars/textile.tmbundle"]
|
|
||||||
path = vendor/grammars/textile.tmbundle
|
|
||||||
url = https://github.com/textmate/textile.tmbundle
|
|
||||||
[submodule "vendor/grammars/textmate.tmbundle"]
|
|
||||||
path = vendor/grammars/textmate.tmbundle
|
|
||||||
url = https://github.com/textmate/textmate.tmbundle
|
|
||||||
[submodule "vendor/grammars/thrift.tmbundle"]
|
[submodule "vendor/grammars/thrift.tmbundle"]
|
||||||
path = vendor/grammars/thrift.tmbundle
|
path = vendor/grammars/thrift.tmbundle
|
||||||
url = https://github.com/textmate/thrift.tmbundle
|
url = https://github.com/textmate/thrift.tmbundle
|
||||||
@@ -490,10 +451,6 @@
|
|||||||
[submodule "vendor/grammars/sublime-nix"]
|
[submodule "vendor/grammars/sublime-nix"]
|
||||||
path = vendor/grammars/sublime-nix
|
path = vendor/grammars/sublime-nix
|
||||||
url = https://github.com/wmertens/sublime-nix
|
url = https://github.com/wmertens/sublime-nix
|
||||||
[submodule "vendor/grammars/ada.tmbundle"]
|
|
||||||
path = vendor/grammars/ada.tmbundle
|
|
||||||
url = https://github.com/aroben/ada.tmbundle
|
|
||||||
branch = better-with-highlighting
|
|
||||||
[submodule "vendor/grammars/oz-tmbundle"]
|
[submodule "vendor/grammars/oz-tmbundle"]
|
||||||
path = vendor/grammars/oz-tmbundle
|
path = vendor/grammars/oz-tmbundle
|
||||||
url = https://github.com/eregon/oz-tmbundle
|
url = https://github.com/eregon/oz-tmbundle
|
||||||
@@ -528,9 +485,234 @@
|
|||||||
[submodule "vendor/grammars/sublime-bsv"]
|
[submodule "vendor/grammars/sublime-bsv"]
|
||||||
path = vendor/grammars/sublime-bsv
|
path = vendor/grammars/sublime-bsv
|
||||||
url = https://github.com/thotypous/sublime-bsv
|
url = https://github.com/thotypous/sublime-bsv
|
||||||
|
[submodule "vendor/grammars/Sublime-HTTP"]
|
||||||
|
path = vendor/grammars/Sublime-HTTP
|
||||||
|
url = https://github.com/httpspec/sublime-highlighting
|
||||||
[submodule "vendor/grammars/sass-textmate-bundle"]
|
[submodule "vendor/grammars/sass-textmate-bundle"]
|
||||||
path = vendor/grammars/sass-textmate-bundle
|
path = vendor/grammars/sass-textmate-bundle
|
||||||
url = https://github.com/nathos/sass-textmate-bundle
|
url = https://github.com/nathos/sass-textmate-bundle
|
||||||
[submodule "vendor/grammars/carto-atom"]
|
[submodule "vendor/grammars/carto-atom"]
|
||||||
path = vendor/grammars/carto-atom
|
path = vendor/grammars/carto-atom
|
||||||
url = https://github.com/yohanboniface/carto-atom
|
url = https://github.com/yohanboniface/carto-atom
|
||||||
|
[submodule "vendor/grammars/Sublime-Nit"]
|
||||||
|
path = vendor/grammars/Sublime-Nit
|
||||||
|
url = https://github.com/R4PaSs/Sublime-Nit
|
||||||
|
[submodule "vendor/grammars/language-hy"]
|
||||||
|
path = vendor/grammars/language-hy
|
||||||
|
url = https://github.com/rwtolbert/language-hy
|
||||||
|
[submodule "vendor/grammars/Racket"]
|
||||||
|
path = vendor/grammars/Racket
|
||||||
|
url = https://github.com/soegaard/racket-highlight-for-github
|
||||||
|
[submodule "vendor/grammars/turtle.tmbundle"]
|
||||||
|
path = vendor/grammars/turtle.tmbundle
|
||||||
|
url = https://github.com/peta/turtle.tmbundle
|
||||||
|
[submodule "vendor/grammars/liquid.tmbundle"]
|
||||||
|
path = vendor/grammars/liquid.tmbundle
|
||||||
|
url = https://github.com/bastilian/validcode-textmate-bundles
|
||||||
|
[submodule "vendor/grammars/ats.sublime"]
|
||||||
|
path = vendor/grammars/ats.sublime
|
||||||
|
url = https://github.com/steinwaywhw/ats-mode-sublimetext
|
||||||
|
[submodule "vendor/grammars/Modelica"]
|
||||||
|
path = vendor/grammars/Modelica
|
||||||
|
url = https://github.com/BorisChumichev/modelicaSublimeTextPackage
|
||||||
|
[submodule "vendor/grammars/sublime-apl"]
|
||||||
|
path = vendor/grammars/sublime-apl
|
||||||
|
url = https://github.com/StoneCypher/sublime-apl
|
||||||
|
[submodule "vendor/grammars/CLIPS-sublime"]
|
||||||
|
path = vendor/grammars/CLIPS-sublime
|
||||||
|
url = https://github.com/psicomante/CLIPS-sublime
|
||||||
|
[submodule "vendor/grammars/Creole"]
|
||||||
|
path = vendor/grammars/Creole
|
||||||
|
url = https://github.com/Siddley/Creole
|
||||||
|
[submodule "vendor/grammars/GDScript-sublime"]
|
||||||
|
path = vendor/grammars/GDScript-sublime
|
||||||
|
url = https://github.com/beefsack/GDScript-sublime
|
||||||
|
[submodule "vendor/grammars/sublime-golo"]
|
||||||
|
path = vendor/grammars/sublime-golo
|
||||||
|
url = https://github.com/TypeUnsafe/sublime-golo
|
||||||
|
[submodule "vendor/grammars/JSyntax"]
|
||||||
|
path = vendor/grammars/JSyntax
|
||||||
|
url = https://github.com/bcj/JSyntax
|
||||||
|
[submodule "vendor/grammars/TXL"]
|
||||||
|
path = vendor/grammars/TXL
|
||||||
|
url = https://github.com/MikeHoffert/Sublime-Text-TXL-syntax
|
||||||
|
[submodule "vendor/grammars/G-Code"]
|
||||||
|
path = vendor/grammars/G-Code
|
||||||
|
url = https://github.com/robotmaster/sublime-text-syntax-highlighting
|
||||||
|
[submodule "vendor/grammars/grace-tmbundle"]
|
||||||
|
path = vendor/grammars/grace-tmbundle
|
||||||
|
url = https://github.com/zmthy/grace-tmbundle
|
||||||
|
[submodule "vendor/grammars/sublime-text-ox"]
|
||||||
|
path = vendor/grammars/sublime-text-ox
|
||||||
|
url = https://github.com/andreashetland/sublime-text-ox
|
||||||
|
[submodule "vendor/grammars/AutoHotkey"]
|
||||||
|
path = vendor/grammars/AutoHotkey
|
||||||
|
url = https://github.com/ahkscript/SublimeAutoHotkey
|
||||||
|
[submodule "vendor/grammars/ec.tmbundle"]
|
||||||
|
path = vendor/grammars/ec.tmbundle
|
||||||
|
url = https://github.com/ecere/ec.tmbundle
|
||||||
|
[submodule "vendor/grammars/InnoSetup"]
|
||||||
|
path = vendor/grammars/InnoSetup
|
||||||
|
url = https://github.com/idleberg/InnoSetup-Sublime-Text
|
||||||
|
[submodule "vendor/grammars/gap-tmbundle"]
|
||||||
|
path = vendor/grammars/gap-tmbundle
|
||||||
|
url = https://github.com/dhowden/gap-tmbundle
|
||||||
|
[submodule "vendor/grammars/SublimePapyrus"]
|
||||||
|
path = vendor/grammars/SublimePapyrus
|
||||||
|
url = https://github.com/Kapiainen/SublimePapyrus
|
||||||
|
[submodule "vendor/grammars/sublime-spintools"]
|
||||||
|
path = vendor/grammars/sublime-spintools
|
||||||
|
url = https://github.com/bitbased/sublime-spintools
|
||||||
|
[submodule "vendor/grammars/PogoScript.tmbundle"]
|
||||||
|
path = vendor/grammars/PogoScript.tmbundle
|
||||||
|
url = https://github.com/featurist/PogoScript.tmbundle
|
||||||
|
[submodule "vendor/grammars/sublime-opal"]
|
||||||
|
path = vendor/grammars/sublime-opal
|
||||||
|
url = https://github.com/artifactz/sublime-opal
|
||||||
|
[submodule "vendor/grammars/mediawiki.tmbundle"]
|
||||||
|
path = vendor/grammars/mediawiki.tmbundle
|
||||||
|
url = https://github.com/textmate/mediawiki.tmbundle
|
||||||
|
[submodule "vendor/grammars/SublimeClarion"]
|
||||||
|
path = vendor/grammars/SublimeClarion
|
||||||
|
url = https://github.com/fushnisoft/SublimeClarion
|
||||||
|
[submodule "vendor/grammars/oracle.tmbundle"]
|
||||||
|
path = vendor/grammars/oracle.tmbundle
|
||||||
|
url = https://github.com/mulander/oracle.tmbundle.git
|
||||||
|
[submodule "vendor/grammars/BrightScript.tmbundle"]
|
||||||
|
path = vendor/grammars/BrightScript.tmbundle
|
||||||
|
url = https://github.com/cmink/BrightScript.tmbundle
|
||||||
|
[submodule "vendor/grammars/Stylus"]
|
||||||
|
path = vendor/grammars/Stylus
|
||||||
|
url = https://github.com/billymoon/Stylus
|
||||||
|
[submodule "vendor/grammars/asciidoc.tmbundle"]
|
||||||
|
path = vendor/grammars/asciidoc.tmbundle
|
||||||
|
url = https://github.com/zuckschwerdt/asciidoc.tmbundle
|
||||||
|
[submodule "vendor/grammars/sublime-text-pig-latin"]
|
||||||
|
path = vendor/grammars/sublime-text-pig-latin
|
||||||
|
url = https://github.com/goblindegook/sublime-text-pig-latin
|
||||||
|
[submodule "vendor/grammars/Lean.tmbundle"]
|
||||||
|
path = vendor/grammars/Lean.tmbundle
|
||||||
|
url = https://github.com/leanprover/Lean.tmbundle
|
||||||
|
[submodule "vendor/grammars/ampl"]
|
||||||
|
path = vendor/grammars/ampl
|
||||||
|
url = https://github.com/ampl/sublime-ampl
|
||||||
|
[submodule "vendor/grammars/openscad.tmbundle"]
|
||||||
|
path = vendor/grammars/openscad.tmbundle
|
||||||
|
url = https://github.com/tbuser/openscad.tmbundle
|
||||||
|
[submodule "vendor/grammars/sublime-varnish"]
|
||||||
|
path = vendor/grammars/sublime-varnish
|
||||||
|
url = https://github.com/brandonwamboldt/sublime-varnish
|
||||||
|
[submodule "vendor/grammars/xc.tmbundle"]
|
||||||
|
path = vendor/grammars/xc.tmbundle
|
||||||
|
url = https://github.com/graymalkin/xc.tmbundle
|
||||||
|
[submodule "vendor/grammars/perl.tmbundle"]
|
||||||
|
path = vendor/grammars/perl.tmbundle
|
||||||
|
url = https://github.com/textmate/perl.tmbundle
|
||||||
|
[submodule "vendor/grammars/sublime-netlinx"]
|
||||||
|
path = vendor/grammars/sublime-netlinx
|
||||||
|
url = https://github.com/amclain/sublime-netlinx
|
||||||
|
[submodule "vendor/grammars/Sublime-Red"]
|
||||||
|
path = vendor/grammars/Sublime-Red
|
||||||
|
url = https://github.com/Oldes/Sublime-Red
|
||||||
|
[submodule "vendor/grammars/jflex.tmbundle"]
|
||||||
|
path = vendor/grammars/jflex.tmbundle
|
||||||
|
url = https://github.com/jflex-de/jflex.tmbundle.git
|
||||||
|
[submodule "vendor/grammars/Sublime-Modula-2"]
|
||||||
|
path = vendor/grammars/Sublime-Modula-2
|
||||||
|
url = https://github.com/harogaston/Sublime-Modula-2
|
||||||
|
[submodule "vendor/grammars/ada.tmbundle"]
|
||||||
|
path = vendor/grammars/ada.tmbundle
|
||||||
|
url = https://github.com/textmate/ada.tmbundle
|
||||||
|
[submodule "vendor/grammars/api-blueprint-sublime-plugin"]
|
||||||
|
path = vendor/grammars/api-blueprint-sublime-plugin
|
||||||
|
url = https://github.com/apiaryio/api-blueprint-sublime-plugin
|
||||||
|
[submodule "vendor/grammars/Handlebars"]
|
||||||
|
path = vendor/grammars/Handlebars
|
||||||
|
url = https://github.com/daaain/Handlebars
|
||||||
|
[submodule "vendor/grammars/smali-sublime"]
|
||||||
|
path = vendor/grammars/smali-sublime
|
||||||
|
url = https://github.com/ShaneWilton/sublime-smali
|
||||||
|
[submodule "vendor/grammars/language-jsoniq"]
|
||||||
|
path = vendor/grammars/language-jsoniq
|
||||||
|
url = http://github.com/wcandillon/language-jsoniq
|
||||||
|
[submodule "vendor/grammars/atom-fsharp"]
|
||||||
|
path = vendor/grammars/atom-fsharp
|
||||||
|
url = https://github.com/fsprojects/atom-fsharp
|
||||||
|
[submodule "vendor/grammars/SMT.tmbundle"]
|
||||||
|
path = vendor/grammars/SMT.tmbundle
|
||||||
|
url = https://github.com/SRI-CSL/SMT.tmbundle.git
|
||||||
|
[submodule "vendor/grammars/language-crystal"]
|
||||||
|
path = vendor/grammars/language-crystal
|
||||||
|
url = https://github.com/atom-crystal/language-crystal
|
||||||
|
[submodule "vendor/grammars/language-xbase"]
|
||||||
|
path = vendor/grammars/language-xbase
|
||||||
|
url = https://github.com/hernad/atom-language-harbour
|
||||||
|
[submodule "vendor/grammars/language-ncl"]
|
||||||
|
path = vendor/grammars/language-ncl
|
||||||
|
url = https://github.com/rpavlick/language-ncl.git
|
||||||
|
[submodule "vendor/grammars/atom-language-purescript"]
|
||||||
|
path = vendor/grammars/atom-language-purescript
|
||||||
|
url = https://github.com/purescript-contrib/atom-language-purescript
|
||||||
|
[submodule "vendor/grammars/vue-syntax-highlight"]
|
||||||
|
path = vendor/grammars/vue-syntax-highlight
|
||||||
|
url = https://github.com/vuejs/vue-syntax-highlight
|
||||||
|
[submodule "vendor/grammars/st2-zonefile"]
|
||||||
|
path = vendor/grammars/st2-zonefile
|
||||||
|
url = https://github.com/sixty4k/st2-zonefile
|
||||||
|
[submodule "vendor/grammars/sublimeprolog"]
|
||||||
|
path = vendor/grammars/sublimeprolog
|
||||||
|
url = https://github.com/alnkpa/sublimeprolog
|
||||||
|
[submodule "vendor/grammars/sublime-aspectj"]
|
||||||
|
path = vendor/grammars/sublime-aspectj
|
||||||
|
url = https://github.com/pchaigno/sublime-aspectj
|
||||||
|
[submodule "vendor/grammars/sublime-typescript"]
|
||||||
|
path = vendor/grammars/sublime-typescript
|
||||||
|
url = https://github.com/Microsoft/TypeScript-Sublime-Plugin
|
||||||
|
[submodule "vendor/grammars/sublime-pony"]
|
||||||
|
path = vendor/grammars/sublime-pony
|
||||||
|
url = https://github.com/CausalityLtd/sublime-pony
|
||||||
|
[submodule "vendor/grammars/X10"]
|
||||||
|
path = vendor/grammars/X10
|
||||||
|
url = https://github.com/x10-lang/x10-highlighting
|
||||||
|
[submodule "vendor/grammars/language-babel"]
|
||||||
|
path = vendor/grammars/language-babel
|
||||||
|
url = https://github.com/gandm/language-babel
|
||||||
|
[submodule "vendor/grammars/UrWeb-Language-Definition"]
|
||||||
|
path = vendor/grammars/UrWeb-Language-Definition
|
||||||
|
url = https://github.com/gwalborn/UrWeb-Language-Definition.git
|
||||||
|
[submodule "vendor/grammars/Stata.tmbundle"]
|
||||||
|
path = vendor/grammars/Stata.tmbundle
|
||||||
|
url = https://github.com/pschumm/Stata.tmbundle
|
||||||
|
[submodule "vendor/grammars/FreeMarker.tmbundle"]
|
||||||
|
path = vendor/grammars/FreeMarker.tmbundle
|
||||||
|
url = https://github.com/freemarker/FreeMarker.tmbundle
|
||||||
|
[submodule "vendor/grammars/MagicPython"]
|
||||||
|
path = vendor/grammars/MagicPython
|
||||||
|
url = https://github.com/MagicStack/MagicPython
|
||||||
|
[submodule "vendor/grammars/language-click"]
|
||||||
|
path = vendor/grammars/language-click
|
||||||
|
url = https://github.com/stenverbois/language-click.git
|
||||||
|
[submodule "vendor/grammars/language-maxscript"]
|
||||||
|
path = vendor/grammars/language-maxscript
|
||||||
|
url = https://github.com/Alhadis/language-maxscript
|
||||||
|
[submodule "vendor/grammars/language-renpy"]
|
||||||
|
path = vendor/grammars/language-renpy
|
||||||
|
url = https://github.com/williamd1k0/language-renpy.git
|
||||||
|
[submodule "vendor/grammars/language-inform7"]
|
||||||
|
path = vendor/grammars/language-inform7
|
||||||
|
url = https://github.com/erkyrath/language-inform7
|
||||||
|
[submodule "vendor/grammars/atom-language-stan"]
|
||||||
|
path = vendor/grammars/atom-language-stan
|
||||||
|
url = https://github.com/jrnold/atom-language-stan
|
||||||
|
[submodule "vendor/grammars/language-yang"]
|
||||||
|
path = vendor/grammars/language-yang
|
||||||
|
url = https://github.com/DzonyKalafut/language-yang.git
|
||||||
|
[submodule "vendor/grammars/perl6fe"]
|
||||||
|
path = vendor/grammars/perl6fe
|
||||||
|
url = https://github.com/MadcapJake/language-perl6fe.git
|
||||||
|
[submodule "vendor/grammars/language-less"]
|
||||||
|
path = vendor/grammars/language-less
|
||||||
|
url = https://github.com/atom/language-less.git
|
||||||
|
[submodule "vendor/grammars/language-povray"]
|
||||||
|
path = vendor/grammars/language-povray
|
||||||
|
url = https://github.com/c-lipka/language-povray
|
||||||
|
|||||||
@@ -1,7 +1,12 @@
|
|||||||
|
language: ruby
|
||||||
sudo: false
|
sudo: false
|
||||||
|
addons:
|
||||||
|
apt:
|
||||||
|
packages:
|
||||||
|
- libicu-dev
|
||||||
|
- libicu48
|
||||||
before_install: script/travis/before_install
|
before_install: script/travis/before_install
|
||||||
rvm:
|
rvm:
|
||||||
- 1.9.3
|
|
||||||
- 2.0.0
|
- 2.0.0
|
||||||
- 2.1
|
- 2.1
|
||||||
- 2.2
|
- 2.2
|
||||||
|
|||||||
@@ -1,30 +1,40 @@
|
|||||||
## Contributing
|
# Contributing
|
||||||
|
|
||||||
The majority of contributions won't need to touch any Ruby code at all. The [master language list][languages] is just a YAML configuration file.
|
[code-of-conduct]: http://todogroup.org/opencodeofconduct/#Linguist/opensource@github.com
|
||||||
|
|
||||||
Almost all bug fixes or new language additions should come with some additional code samples. Just drop them under [`samples/`][samples] in the correct subdirectory and our test suite will automatically test them. In most cases you shouldn't need to add any new assertions.
|
Hi there! We're thrilled that you'd like to contribute to this project. Your help is essential for keeping it great. This project adheres to the [Open Code of Conduct][code-of-conduct]. By participating, you are expected to uphold this code.
|
||||||
|
|
||||||
### My code is detected as the wrong language
|
The majority of contributions won't need to touch any Ruby code at all.
|
||||||
|
|
||||||
This can usually be solved either by adding a new filename or file name extension to the language's entry in [`languages.yml`][languages] or adding more [samples][samples] for your language to the repository to make Linguist's classifier smarter.
|
## Adding an extension to a language
|
||||||
|
|
||||||
### Syntax highlighting looks wrong
|
We try only to add new extensions once they have some usage on GitHub. In most cases we prefer that extensions be in use in hundreds of repositories before supporting them in Linguist.
|
||||||
|
|
||||||
Assuming your code is being detected as the right language (see above), in most cases this is due to a bug in the language grammar rather than a bug in Linguist. [`grammars.yml`][grammars] lists all the grammars we use for syntax highlighting on github.com. Find the one corresponding to your code's programming language and submit a bug report upstream. If you can, try to reproduce the highlighting problem in the text editor that the grammar is designed for (TextMate, Sublime Text, or Atom) and include that information in your bug report.
|
To add support for a new extension:
|
||||||
|
|
||||||
You can also try to fix the bug yourself and submit a Pull Request. [This piece from TextMate's documentation](http://manual.macromates.com/en/language_grammars) offers a good introduction on how to work with TextMate-compatible grammars. You can test grammars using [Lightshow](https://lightshow.githubapp.com).
|
0. Add your extension to the language entry in [`languages.yml`][languages], keeping the extensions in alphabetical order.
|
||||||
|
0. Add at least one sample for your extension to the [samples directory][samples] in the correct subdirectory.
|
||||||
|
0. Open a pull request, linking to a [GitHub search result](https://github.com/search?utf8=%E2%9C%93&q=extension%3Aboot+NOT+nothack&type=Code&ref=searchresults) showing in-the-wild usage.
|
||||||
|
|
||||||
Once the bug has been fixed upstream, please let us know and we'll pick it up for GitHub.
|
In addition, if this extension is already listed in [`languages.yml`][languages] then sometimes a few more steps will need to be taken:
|
||||||
|
|
||||||
### I want to add support for the `X` programming language
|
0. Make sure that example `.yourextension` files are present in the [samples directory][samples] for each language that uses `.yourextension`.
|
||||||
|
0. Test the performance of the Bayesian classifier with a relatively large number (1000s) of sample `.yourextension` files. (ping @arfon or @bkeepers to help with this) to ensure we're not misclassifying files.
|
||||||
|
0. If the Bayesian classifier does a bad job with the sample `.yourextension` files then a [heuristic](https://github.com/github/linguist/blob/master/lib/linguist/heuristics.rb) may need to be written to help.
|
||||||
|
|
||||||
Great! You'll need to:
|
|
||||||
|
## Adding a language
|
||||||
|
|
||||||
|
We try only to add languages once they have some usage on GitHub. In most cases we prefer that each new file extension be in use in hundreds of repositories before supporting them in Linguist.
|
||||||
|
|
||||||
|
To add support for a new language:
|
||||||
|
|
||||||
0. Add an entry for your language to [`languages.yml`][languages].
|
0. Add an entry for your language to [`languages.yml`][languages].
|
||||||
0. Add a grammar for your language. Please only add grammars that have a license that permits redistribution.
|
0. Add a grammar for your language. Please only add grammars that have a license that permits redistribution.
|
||||||
0. Add your grammar as a submodule: `git submodule add https://github.com/JaneSmith/MyGrammar vendor/grammars/MyGrammar`.
|
0. Add your grammar as a submodule: `git submodule add https://github.com/JaneSmith/MyGrammar vendor/grammars/MyGrammar`.
|
||||||
0. Add your grammar to [`grammars.yml`][grammars] by running `script/convert-grammars --add vendor/grammars/MyGrammar`.
|
0. Add your grammar to [`grammars.yml`][grammars] by running `script/convert-grammars --add vendor/grammars/MyGrammar`.
|
||||||
0. Add samples for your language to the [samples directory][samples].
|
0. Add samples for your language to the [samples directory][samples] in the correct subdirectory.
|
||||||
|
0. Open a pull request, linking to a [GitHub search result](https://github.com/search?utf8=%E2%9C%93&q=extension%3Aboot+NOT+nothack&type=Code&ref=searchresults) showing in-the-wild usage.
|
||||||
|
|
||||||
In addition, if your new language defines an extension that's already listed in [`languages.yml`][languages] (such as `.foo`) then sometimes a few more steps will need to be taken:
|
In addition, if your new language defines an extension that's already listed in [`languages.yml`][languages] (such as `.foo`) then sometimes a few more steps will need to be taken:
|
||||||
|
|
||||||
@@ -34,8 +44,62 @@ In addition, if your new language defines an extension that's already listed in
|
|||||||
|
|
||||||
Remember, the goal here is to try and avoid false positives!
|
Remember, the goal here is to try and avoid false positives!
|
||||||
|
|
||||||
We try only to add languages once they have some usage on GitHub, so please note in-the-wild usage examples in your pull request. In most cases we prefer that languages already be in use in hundreds of repositories before supporting them in Linguist.
|
|
||||||
|
## Fixing a misclassified language
|
||||||
|
|
||||||
|
Most languages are detected by their file extension defined in [languages.yml][languages]. For disambiguating between files with common extensions, linguist applies some [heuristics](/lib/linguist/heuristics.rb) and a [statistical classifier](lib/linguist/classifier.rb). This process can help differentiate between, for example, `.h` files which could be either C, C++, or Obj-C.
|
||||||
|
|
||||||
|
Misclassifications can often be solved by either adding a new filename or extension for the language or adding more [samples][samples] to make the classifier smarter.
|
||||||
|
|
||||||
|
|
||||||
|
## Fixing syntax highlighting
|
||||||
|
|
||||||
|
Syntax highlighting in GitHub is performed using TextMate-compatible grammars. These are the same grammars that TextMate, Sublime Text and Atom use. Every language in [languages.yml][languages] is mapped to its corresponding TM `scope`. This scope will be used when picking up a grammar for highlighting.
|
||||||
|
|
||||||
|
Assuming your code is being detected as the right language, in most cases this is due to a bug in the language grammar rather than a bug in Linguist. [`grammars.yml`][grammars] lists all the grammars we use for syntax highlighting on github.com. Find the one corresponding to your code's programming language and submit a bug report upstream. If you can, try to reproduce the highlighting problem in the text editor that the grammar is designed for (TextMate, Sublime Text, or Atom) and include that information in your bug report.
|
||||||
|
|
||||||
|
You can also try to fix the bug yourself and submit a Pull Request. [TextMate's documentation](https://manual.macromates.com/en/language_grammars) offers a good introduction on how to work with TextMate-compatible grammars. You can test grammars using [Lightshow](https://github-lightshow.herokuapp.com).
|
||||||
|
|
||||||
|
Once the bug has been fixed upstream, we'll pick it up for GitHub in the next release of Linguist.
|
||||||
|
|
||||||
|
## Testing
|
||||||
|
|
||||||
|
For development you are going to want to checkout out the source. To get it, clone the repo and run [Bundler](http://gembundler.com/) to install its dependencies.
|
||||||
|
|
||||||
|
git clone https://github.com/github/linguist.git
|
||||||
|
cd linguist/
|
||||||
|
script/bootstrap
|
||||||
|
|
||||||
|
To run the tests:
|
||||||
|
|
||||||
|
bundle exec rake test
|
||||||
|
|
||||||
|
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](https://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: [](https://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: `script/bootstrap`
|
||||||
|
0. If grammar submodules have not been updated recently, update them: `git submodule update --remote && git commit -a`
|
||||||
|
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`, [like this](https://github.com/github/linguist/commit/8d2ea90a5ba3b2fe6e1508b7155aa4632eea2985).
|
||||||
|
0. Make a PR to github/linguist, [like this](https://github.com/github/linguist/pull/1238).
|
||||||
|
0. Build a local gem: `bundle exec rake build_gem`
|
||||||
|
0. Test the gem:
|
||||||
|
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-3.0.0.gem`
|
||||||
|
|
||||||
[grammars]: /grammars.yml
|
[grammars]: /grammars.yml
|
||||||
[languages]: /lib/linguist/languages.yml
|
[languages]: /lib/linguist/languages.yml
|
||||||
[samples]: /samples
|
[samples]: /samples
|
||||||
|
[new-issue]: https://github.com/github/linguist/issues/new
|
||||||
|
|||||||
2
LICENSE
2
LICENSE
@@ -1,4 +1,4 @@
|
|||||||
Copyright (c) 2011-2014 GitHub, Inc.
|
Copyright (c) 2011-2016 GitHub, Inc.
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person
|
Permission is hereby granted, free of charge, to any person
|
||||||
obtaining a copy of this software and associated documentation
|
obtaining a copy of this software and associated documentation
|
||||||
|
|||||||
230
README.md
230
README.md
@@ -1,45 +1,85 @@
|
|||||||
# Linguist
|
# Linguist
|
||||||
|
|
||||||
We use this library at GitHub to detect blob languages, ignore binary files, suppress generated files in diffs, and generate language breakdown graphs.
|
[issues]: https://github.com/github/linguist/issues
|
||||||
|
[new-issue]: https://github.com/github/linguist/issues/new
|
||||||
|
|
||||||
Tips for filing issues and creating pull requests can be found in [`CONTRIBUTING.md`](/CONTRIBUTING.md).
|
This library is used on GitHub.com to detect blob languages, ignore binary or vendored files, suppress generated files in diffs, and generate language breakdown graphs.
|
||||||
|
|
||||||
## Features
|
See [Troubleshooting](#troubleshooting) and [`CONTRIBUTING.md`](/CONTRIBUTING.md) before filing an issue or creating a pull request.
|
||||||
|
|
||||||
### Language detection
|
## Troubleshooting
|
||||||
|
|
||||||
Linguist defines a list of all languages known to GitHub in a [yaml file](https://github.com/github/linguist/blob/master/lib/linguist/languages.yml).
|
### My repository is detected as the wrong language
|
||||||
|
|
||||||
Most languages are detected by their file extension. For disambiguating between files with common extensions, we first apply some common-sense heuristics to pick out obvious languages. After that, we use a
|

|
||||||
[statistical
|
|
||||||
classifier](https://github.com/github/linguist/blob/master/lib/linguist/classifier.rb).
|
|
||||||
This process can help us tell the difference between, for example, `.h` files which could be either C, C++, or Obj-C.
|
|
||||||
|
|
||||||
```ruby
|
The Language stats bar displays languages percentages for the files in the repository. The percentages are calculated based on the bytes of code for each language as reported by the [List Languages](https://developer.github.com/v3/repos/#list-languages) API. If the bar is reporting a language that you don't expect:
|
||||||
|
|
||||||
Linguist::FileBlob.new("lib/linguist.rb").language.name #=> "Ruby"
|
0. Click on the name of the language in the stats bar to see a list of the files that are identified as that language.
|
||||||
|
0. If you see files that you didn't write, consider moving the files into one of the [paths for vendored code](/lib/linguist/vendor.yml), or use the [manual overrides](#overrides) feature to ignore them.
|
||||||
|
0. If the files are being misclassified, search for [open issues][issues] to see if anyone else has already reported the issue. Any information you can add, especially links to public repositories, is helpful.
|
||||||
|
0. If there are no reported issues of this misclassification, [open an issue][new-issue] and include a link to the repository or a sample of the code that is being misclassified.
|
||||||
|
|
||||||
Linguist::FileBlob.new("bin/linguist").language.name #=> "Ruby"
|
## Overrides
|
||||||
|
|
||||||
|
Linguist supports a number of different custom overrides strategies for language definitions and vendored paths.
|
||||||
|
|
||||||
|
### Using gitattributes
|
||||||
|
|
||||||
|
Add a `.gitattributes` file to your project and use standard git-style path matchers for the files you want to override to set `linguist-documentation`, `linguist-language`, and `linguist-vendored`. `.gitattributes` will be used to determine language statistics, but will not be used to syntax highlight files. To manually set syntax highlighting, use [Vim or Emacs modelines](#using-emacs-or-vim-modelines).
|
||||||
|
|
||||||
|
```
|
||||||
|
$ cat .gitattributes
|
||||||
|
*.rb linguist-language=Java
|
||||||
```
|
```
|
||||||
|
|
||||||
See [lib/linguist/language.rb](https://github.com/github/linguist/blob/master/lib/linguist/language.rb) and [lib/linguist/languages.yml](https://github.com/github/linguist/blob/master/lib/linguist/languages.yml).
|
Checking code you didn't write, such as JavaScript libraries, into your git repo is a common practice, but this often inflates your project's language stats and may even cause your project to be labeled as another language. By default, Linguist treats all of the paths defined in [lib/linguist/vendor.yml](https://github.com/github/linguist/blob/master/lib/linguist/vendor.yml) as vendored and therefore doesn't include them in the language statistics for a repository.
|
||||||
|
|
||||||
### Syntax Highlighting
|
Use the `linguist-vendored` attribute to vendor or un-vendor paths.
|
||||||
|
|
||||||
Syntax highlighting in GitHub is performed using TextMate-compatible grammars. These are the same grammars that TextMate, Sublime Text and Atom use.
|
```
|
||||||
|
$ cat .gitattributes
|
||||||
|
special-vendored-path/* linguist-vendored
|
||||||
|
jquery.js linguist-vendored=false
|
||||||
|
```
|
||||||
|
|
||||||
Every language in `languages.yml` is mapped to its corresponding TM `scope`. This scope will be used when picking up a grammar for highlighting. **When adding a new language to Linguist, please add its corresponding scope too (assuming there's an existing TextMate bundle, Sublime Text package, or Atom package) so syntax highlighting works for it**.
|
Similar to vendored files, Linguist excludes documentation files from your project's language stats. (Unlike vendored files, documentation files are displayed in diffs on github.com.) [lib/linguist/documentation.yml](lib/linguist/documentation.yml) lists common documentation paths and excludes them from the language statistics for your repository.
|
||||||
|
|
||||||
### Stats
|
Use the `linguist-documentation` attribute to mark or unmark paths as documentation.
|
||||||
|
|
||||||
The Language stats bar that you see on every repository is built by aggregating the languages of each file in that repository. The top language in the graph determines the project's primary language.
|
```
|
||||||
|
$ cat .gitattributes
|
||||||
|
project-docs/* linguist-documentation
|
||||||
|
docs/formatter.rb linguist-documentation=false
|
||||||
|
```
|
||||||
|
|
||||||
The repository stats API, accessed through `#languages`, can be used on a directory:
|
### Using Emacs or Vim modelines
|
||||||
|
|
||||||
***API UPDATE***
|
Alternatively, you can use Vim or Emacs style modelines to set the language for a single file. Modelines can be placed anywhere within a file and are respected when determining how to syntax-highlight a file on GitHub.com
|
||||||
|
|
||||||
Since [Version 3.0.0](https://github.com/github/linguist/releases/tag/v3.0.0) Linguist expects a git repository (in the form of a [Rugged::Repository](https://github.com/libgit2/rugged#repositories)) to be passed when initializing `Linguist::Repository`.
|
##### Vim
|
||||||
|
```
|
||||||
|
# Some examples of various styles:
|
||||||
|
vim: syntax=java
|
||||||
|
vim: set syntax=ruby:
|
||||||
|
vim: set filetype=prolog:
|
||||||
|
vim: set ft=cpp:
|
||||||
|
```
|
||||||
|
|
||||||
|
##### Emacs
|
||||||
|
```
|
||||||
|
-*- mode: php;-*-
|
||||||
|
```
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
Install the gem:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ gem install github-linguist
|
||||||
|
```
|
||||||
|
|
||||||
|
Then use it in your application:
|
||||||
|
|
||||||
```ruby
|
```ruby
|
||||||
require 'rugged'
|
require 'rugged'
|
||||||
@@ -51,149 +91,28 @@ project.language #=> "Ruby"
|
|||||||
project.languages #=> { "Ruby" => 119387 }
|
project.languages #=> { "Ruby" => 119387 }
|
||||||
```
|
```
|
||||||
|
|
||||||
These stats are also printed out by the `linguist` binary. You can use the
|
These stats are also printed out by the `linguist` executable. You can use the
|
||||||
`--breakdown` flag, and the binary will also output the breakdown of files by language.
|
`--breakdown` flag, and the binary will also output the breakdown of files by language.
|
||||||
|
|
||||||
You can try running `linguist` on the root directory in this repository itself:
|
You can try running `linguist` on the root directory in this repository itself:
|
||||||
|
|
||||||
$ bundle exec linguist --breakdown
|
```
|
||||||
|
$ bundle exec linguist --breakdown
|
||||||
|
|
||||||
100.00% Ruby
|
100.00% Ruby
|
||||||
|
|
||||||
Ruby:
|
Ruby:
|
||||||
Gemfile
|
Gemfile
|
||||||
Rakefile
|
Rakefile
|
||||||
bin/linguist
|
bin/linguist
|
||||||
github-linguist.gemspec
|
github-linguist.gemspec
|
||||||
lib/linguist.rb
|
lib/linguist.rb
|
||||||
lib/linguist/blob_helper.rb
|
…
|
||||||
lib/linguist/classifier.rb
|
|
||||||
lib/linguist/file_blob.rb
|
|
||||||
lib/linguist/generated.rb
|
|
||||||
lib/linguist/heuristics.rb
|
|
||||||
lib/linguist/language.rb
|
|
||||||
lib/linguist/lazy_blob.rb
|
|
||||||
lib/linguist/md5.rb
|
|
||||||
lib/linguist/repository.rb
|
|
||||||
lib/linguist/samples.rb
|
|
||||||
lib/linguist/tokenizer.rb
|
|
||||||
lib/linguist/version.rb
|
|
||||||
test/test_blob.rb
|
|
||||||
test/test_classifier.rb
|
|
||||||
test/test_heuristics.rb
|
|
||||||
test/test_language.rb
|
|
||||||
test/test_md5.rb
|
|
||||||
test/test_pedantic.rb
|
|
||||||
test/test_repository.rb
|
|
||||||
test/test_samples.rb
|
|
||||||
test/test_tokenizer.rb
|
|
||||||
|
|
||||||
#### Ignore vendored files
|
|
||||||
|
|
||||||
Checking other code into your git repo is a common practice. But this often inflates your project's language stats and may even cause your project to be labeled as another language. We are able to identify some of these files and directories and exclude them.
|
|
||||||
|
|
||||||
```ruby
|
|
||||||
Linguist::FileBlob.new("vendor/plugins/foo.rb").vendored? # => true
|
|
||||||
```
|
```
|
||||||
|
|
||||||
See [Linguist::BlobHelper#vendored?](https://github.com/github/linguist/blob/master/lib/linguist/blob_helper.rb) and [lib/linguist/vendor.yml](https://github.com/github/linguist/blob/master/lib/linguist/vendor.yml).
|
## Contributing
|
||||||
|
|
||||||
#### Generated file detection
|
Please check out our [contributing guidelines](CONTRIBUTING.md).
|
||||||
|
|
||||||
Not all plain text files are true source files. Generated files like minified js and compiled CoffeeScript can be detected and excluded from language stats. As an extra bonus, these files are suppressed in diffs.
|
|
||||||
|
|
||||||
```ruby
|
|
||||||
Linguist::FileBlob.new("underscore.min.js").generated? # => true
|
|
||||||
```
|
|
||||||
|
|
||||||
See [Linguist::Generated#generated?](https://github.com/github/linguist/blob/master/lib/linguist/generated.rb).
|
|
||||||
|
|
||||||
## Overrides
|
|
||||||
|
|
||||||
Linguist supports custom overrides for language definitions and vendored paths. Add a `.gitattributes` file to your project using the keys `linguist-language` and `linguist-vendored` with the standard git-style path matchers for the files you want to override.
|
|
||||||
|
|
||||||
Please note that the overrides currently only affect the language statistics for a repository and not the syntax-highlighting of files.
|
|
||||||
|
|
||||||
```
|
|
||||||
$ cat .gitattributes
|
|
||||||
*.rb linguist-language=Java
|
|
||||||
|
|
||||||
$ linguist --breakdown
|
|
||||||
100.00% Java
|
|
||||||
|
|
||||||
Java:
|
|
||||||
ruby_file.rb
|
|
||||||
```
|
|
||||||
|
|
||||||
By default, Linguist treats all of the paths defined in [lib/linguist/vendor.yml](https://github.com/github/linguist/blob/master/lib/linguist/vendor.yml) as vendored and therefore doesn't include them in the language statistics for a repository. Use the `linguist-vendored` attribute to vendor or un-vendor paths.
|
|
||||||
|
|
||||||
```
|
|
||||||
$ cat .gitattributes
|
|
||||||
special-vendored-path/* linguist-vendored
|
|
||||||
jquery.js linguist-vendored=false
|
|
||||||
```
|
|
||||||
|
|
||||||
## Installation
|
|
||||||
|
|
||||||
Github.com is usually running the latest version of the `github-linguist` gem that is released on [RubyGems.org](http://rubygems.org/gems/github-linguist).
|
|
||||||
|
|
||||||
But for development you are going to want to checkout out the source. To get it, clone the repo and run [Bundler](http://gembundler.com/) to install its dependencies.
|
|
||||||
|
|
||||||
git clone https://github.com/github/linguist.git
|
|
||||||
cd linguist/
|
|
||||||
script/bootstrap
|
|
||||||
|
|
||||||
To run the tests:
|
|
||||||
|
|
||||||
bundle exec rake test
|
|
||||||
|
|
||||||
### 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: `script/bootstrap`
|
|
||||||
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: `bundle exec rake build_gem`
|
|
||||||
0. Testing:
|
|
||||||
0. Bump the Gemfile and Gemfile.lock versions for an app which relies on this gem
|
|
||||||
0. Install the new gem locally
|
|
||||||
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-3.0.0.gem`
|
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
@@ -201,4 +120,3 @@ The language grammars included in this gem are covered by their repositories'
|
|||||||
respective licenses. `grammars.yml` specifies the repository for each grammar.
|
respective licenses. `grammars.yml` specifies the repository for each grammar.
|
||||||
|
|
||||||
All other files are covered by the MIT license, see `LICENSE`.
|
All other files are covered by the MIT license, see `LICENSE`.
|
||||||
|
|
||||||
|
|||||||
2
Rakefile
2
Rakefile
@@ -58,7 +58,7 @@ namespace :benchmark do
|
|||||||
|
|
||||||
corpus = File.expand_path(ENV["CORPUS"] || "samples")
|
corpus = File.expand_path(ENV["CORPUS"] || "samples")
|
||||||
|
|
||||||
require 'linguist/language'
|
require 'linguist'
|
||||||
|
|
||||||
results = Hash.new
|
results = Hash.new
|
||||||
Dir.glob("#{corpus}/**/*").each do |file|
|
Dir.glob("#{corpus}/**/*").each do |file|
|
||||||
|
|||||||
138
bin/git-linguist
Executable file
138
bin/git-linguist
Executable file
@@ -0,0 +1,138 @@
|
|||||||
|
#!/usr/bin/env ruby
|
||||||
|
|
||||||
|
require 'linguist'
|
||||||
|
require 'rugged'
|
||||||
|
require 'optparse'
|
||||||
|
require 'json'
|
||||||
|
require 'tmpdir'
|
||||||
|
require 'zlib'
|
||||||
|
|
||||||
|
class GitLinguist
|
||||||
|
def initialize(path, commit_oid, incremental = true)
|
||||||
|
@repo_path = path
|
||||||
|
@commit_oid = commit_oid
|
||||||
|
@incremental = incremental
|
||||||
|
end
|
||||||
|
|
||||||
|
def linguist
|
||||||
|
if @commit_oid.nil?
|
||||||
|
raise "git-linguist must be called with a specific commit OID to perform language computation"
|
||||||
|
end
|
||||||
|
repo = Linguist::Repository.new(rugged, @commit_oid)
|
||||||
|
|
||||||
|
if @incremental && stats = load_language_stats
|
||||||
|
old_commit_oid, old_stats = stats
|
||||||
|
|
||||||
|
# A cache with NULL oid means that we want to froze
|
||||||
|
# these language stats in place and stop computing
|
||||||
|
# them (for performance reasons)
|
||||||
|
return old_stats if old_commit_oid == NULL_OID
|
||||||
|
repo.load_existing_stats(old_commit_oid, old_stats)
|
||||||
|
end
|
||||||
|
|
||||||
|
result = yield repo
|
||||||
|
|
||||||
|
save_language_stats(@commit_oid, repo.cache)
|
||||||
|
result
|
||||||
|
end
|
||||||
|
|
||||||
|
def load_language_stats
|
||||||
|
version, oid, stats = load_cache
|
||||||
|
if version == LANGUAGE_STATS_CACHE_VERSION && oid && stats
|
||||||
|
[oid, stats]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def save_language_stats(oid, stats)
|
||||||
|
cache = [LANGUAGE_STATS_CACHE_VERSION, oid, stats]
|
||||||
|
write_cache(cache)
|
||||||
|
end
|
||||||
|
|
||||||
|
def clear_language_stats
|
||||||
|
File.unlink(cache_file)
|
||||||
|
rescue Errno::ENOENT
|
||||||
|
end
|
||||||
|
|
||||||
|
def disable_language_stats
|
||||||
|
save_language_stats(NULL_OID, {})
|
||||||
|
end
|
||||||
|
|
||||||
|
protected
|
||||||
|
NULL_OID = ("0" * 40).freeze
|
||||||
|
|
||||||
|
LANGUAGE_STATS_CACHE = 'language-stats.cache'
|
||||||
|
LANGUAGE_STATS_CACHE_VERSION = "v3:#{Linguist::VERSION}"
|
||||||
|
|
||||||
|
def rugged
|
||||||
|
@rugged ||= Rugged::Repository.bare(@repo_path)
|
||||||
|
end
|
||||||
|
|
||||||
|
def cache_file
|
||||||
|
File.join(@repo_path, LANGUAGE_STATS_CACHE)
|
||||||
|
end
|
||||||
|
|
||||||
|
def write_cache(object)
|
||||||
|
return unless File.directory? @repo_path
|
||||||
|
|
||||||
|
begin
|
||||||
|
tmp_path = Dir::Tmpname.make_tmpname(cache_file, nil)
|
||||||
|
File.open(tmp_path, "wb") do |f|
|
||||||
|
marshal = Marshal.dump(object)
|
||||||
|
f.write(Zlib::Deflate.deflate(marshal))
|
||||||
|
end
|
||||||
|
|
||||||
|
File.rename(tmp_path, cache_file)
|
||||||
|
rescue => e
|
||||||
|
(File.unlink(tmp_path) rescue nil)
|
||||||
|
raise e
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def load_cache
|
||||||
|
marshal = File.open(cache_file, "rb") { |f| Zlib::Inflate.inflate(f.read) }
|
||||||
|
Marshal.load(marshal)
|
||||||
|
rescue SystemCallError, ::Zlib::DataError, ::Zlib::BufError, TypeError
|
||||||
|
nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
def git_linguist(args)
|
||||||
|
incremental = true
|
||||||
|
commit = nil
|
||||||
|
|
||||||
|
parser = OptionParser.new do |opts|
|
||||||
|
opts.banner = "Usage: git-linguist [OPTIONS] stats|breakdown|dump-cache|clear|disable"
|
||||||
|
|
||||||
|
opts.on("-f", "--force", "Force a full rescan") { incremental = false }
|
||||||
|
opts.on("--commit=COMMIT", "Commit to index") { |v| commit = v}
|
||||||
|
end
|
||||||
|
|
||||||
|
parser.parse!(args)
|
||||||
|
|
||||||
|
git_dir = `git rev-parse --git-dir`.strip
|
||||||
|
raise "git-linguist must be ran in a Git repository" unless $?.success?
|
||||||
|
wrapper = GitLinguist.new(git_dir, commit, incremental)
|
||||||
|
|
||||||
|
case args.pop
|
||||||
|
when "stats"
|
||||||
|
wrapper.linguist do |linguist|
|
||||||
|
puts JSON.dump(linguist.languages)
|
||||||
|
end
|
||||||
|
when "breakdown"
|
||||||
|
wrapper.linguist do |linguist|
|
||||||
|
puts JSON.dump(linguist.breakdown_by_file)
|
||||||
|
end
|
||||||
|
when "dump-cache"
|
||||||
|
puts JSON.dump(wrapper.load_language_stats)
|
||||||
|
when "clear"
|
||||||
|
wrapper.clear_language_stats
|
||||||
|
when "disable"
|
||||||
|
wrapper.disable_language_stats
|
||||||
|
else
|
||||||
|
$stderr.print(parser.help)
|
||||||
|
exit 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
git_linguist(ARGV)
|
||||||
@@ -2,10 +2,8 @@
|
|||||||
|
|
||||||
# linguist — detect language type for a file, or, given a directory, determine language breakdown
|
# linguist — detect language type for a file, or, given a directory, determine language breakdown
|
||||||
# usage: linguist <path> [<--breakdown>]
|
# usage: linguist <path> [<--breakdown>]
|
||||||
|
#
|
||||||
require 'linguist/file_blob'
|
require 'linguist'
|
||||||
require 'linguist/language'
|
|
||||||
require 'linguist/repository'
|
|
||||||
require 'rugged'
|
require 'rugged'
|
||||||
|
|
||||||
path = ARGV[0] || Dir.pwd
|
path = ARGV[0] || Dir.pwd
|
||||||
|
|||||||
@@ -10,13 +10,13 @@ Gem::Specification.new do |s|
|
|||||||
s.homepage = "https://github.com/github/linguist"
|
s.homepage = "https://github.com/github/linguist"
|
||||||
s.license = "MIT"
|
s.license = "MIT"
|
||||||
|
|
||||||
s.files = Dir['lib/**/*'] + Dir['grammars/*']
|
s.files = Dir['lib/**/*'] + Dir['grammars/*'] + ['LICENSE']
|
||||||
s.executables << 'linguist'
|
s.executables = ['linguist', 'git-linguist']
|
||||||
|
|
||||||
s.add_dependency 'charlock_holmes', '~> 0.7.3'
|
s.add_dependency 'charlock_holmes', '~> 0.7.3'
|
||||||
s.add_dependency 'escape_utils', '~> 1.0.1'
|
s.add_dependency 'escape_utils', '~> 1.1.0'
|
||||||
s.add_dependency 'mime-types', '>= 1.19'
|
s.add_dependency 'mime-types', '>= 1.19'
|
||||||
s.add_dependency 'rugged', '~> 0.22.0b4'
|
s.add_dependency 'rugged', '>= 0.23.0b'
|
||||||
|
|
||||||
s.add_development_dependency 'minitest', '>= 5.0'
|
s.add_development_dependency 'minitest', '>= 5.0'
|
||||||
s.add_development_dependency 'mocha'
|
s.add_development_dependency 'mocha'
|
||||||
@@ -24,4 +24,7 @@ Gem::Specification.new do |s|
|
|||||||
s.add_development_dependency 'pry'
|
s.add_development_dependency 'pry'
|
||||||
s.add_development_dependency 'rake'
|
s.add_development_dependency 'rake'
|
||||||
s.add_development_dependency 'yajl-ruby'
|
s.add_development_dependency 'yajl-ruby'
|
||||||
|
s.add_development_dependency 'color-proximity', '~> 0.2.1'
|
||||||
|
s.add_development_dependency 'licensee', '6.0.0b1'
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
217
grammars.yml
Normal file → Executable file
217
grammars.yml
Normal file → Executable file
@@ -24,26 +24,56 @@ vendor/grammars/Agda.tmbundle:
|
|||||||
- source.agda
|
- source.agda
|
||||||
vendor/grammars/Alloy.tmbundle:
|
vendor/grammars/Alloy.tmbundle:
|
||||||
- source.alloy
|
- source.alloy
|
||||||
|
vendor/grammars/AutoHotkey/:
|
||||||
|
- source.ahk
|
||||||
|
vendor/grammars/BrightScript.tmbundle/:
|
||||||
|
- source.brightauthorproject
|
||||||
|
- source.brightscript
|
||||||
|
vendor/grammars/CLIPS-sublime:
|
||||||
|
- source.clips
|
||||||
vendor/grammars/ColdFusion:
|
vendor/grammars/ColdFusion:
|
||||||
- source.cfscript
|
- source.cfscript
|
||||||
- source.cfscript.cfc
|
- source.cfscript.cfc
|
||||||
- text.cfml.basic
|
- text.cfml.basic
|
||||||
- text.html.cfm
|
- text.html.cfm
|
||||||
|
vendor/grammars/Creole:
|
||||||
|
- text.html.creole
|
||||||
vendor/grammars/Docker.tmbundle:
|
vendor/grammars/Docker.tmbundle:
|
||||||
- source.dockerfile
|
- source.dockerfile
|
||||||
vendor/grammars/Elm.tmLanguage:
|
vendor/grammars/Elm.tmLanguage:
|
||||||
- source.elm
|
- source.elm
|
||||||
|
vendor/grammars/FreeMarker.tmbundle:
|
||||||
|
- text.html.ftl
|
||||||
|
vendor/grammars/G-Code/:
|
||||||
|
- source.LS
|
||||||
|
- source.MCPOST
|
||||||
|
- source.MOD
|
||||||
|
- source.apt
|
||||||
|
- source.gcode
|
||||||
|
vendor/grammars/GDScript-sublime/:
|
||||||
|
- source.gdscript
|
||||||
vendor/grammars/Handlebars:
|
vendor/grammars/Handlebars:
|
||||||
- text.html.handlebars
|
- text.html.handlebars
|
||||||
vendor/grammars/IDL-Syntax:
|
vendor/grammars/IDL-Syntax:
|
||||||
- source.webidl
|
- source.webidl
|
||||||
|
vendor/grammars/InnoSetup/:
|
||||||
|
- source.inno
|
||||||
vendor/grammars/Isabelle.tmbundle:
|
vendor/grammars/Isabelle.tmbundle:
|
||||||
- source.isabelle.root
|
- source.isabelle.root
|
||||||
- source.isabelle.theory
|
- source.isabelle.theory
|
||||||
|
vendor/grammars/JSyntax/:
|
||||||
|
- source.j
|
||||||
vendor/grammars/Julia.tmbundle:
|
vendor/grammars/Julia.tmbundle:
|
||||||
- source.julia
|
- source.julia
|
||||||
|
vendor/grammars/Lean.tmbundle:
|
||||||
|
- source.lean
|
||||||
vendor/grammars/LiveScript.tmbundle:
|
vendor/grammars/LiveScript.tmbundle:
|
||||||
- source.livescript
|
- source.livescript
|
||||||
|
vendor/grammars/MagicPython:
|
||||||
|
- source.python
|
||||||
|
- source.regexp.python
|
||||||
|
vendor/grammars/Modelica/:
|
||||||
|
- source.modelica
|
||||||
vendor/grammars/NSIS:
|
vendor/grammars/NSIS:
|
||||||
- source.nsis
|
- source.nsis
|
||||||
vendor/grammars/NimLime:
|
vendor/grammars/NimLime:
|
||||||
@@ -52,48 +82,75 @@ vendor/grammars/NimLime:
|
|||||||
- source.nimcfg
|
- source.nimcfg
|
||||||
vendor/grammars/PHP-Twig.tmbundle:
|
vendor/grammars/PHP-Twig.tmbundle:
|
||||||
- text.html.twig
|
- text.html.twig
|
||||||
|
vendor/grammars/PogoScript.tmbundle/:
|
||||||
|
- source.pogoscript
|
||||||
vendor/grammars/RDoc.tmbundle:
|
vendor/grammars/RDoc.tmbundle:
|
||||||
- text.rdoc
|
- text.rdoc
|
||||||
|
vendor/grammars/Racket:
|
||||||
|
- source.racket
|
||||||
vendor/grammars/SCSS.tmbundle:
|
vendor/grammars/SCSS.tmbundle:
|
||||||
- source.scss
|
- source.scss
|
||||||
|
vendor/grammars/SMT.tmbundle:
|
||||||
|
- source.smt
|
||||||
vendor/grammars/Scalate.tmbundle:
|
vendor/grammars/Scalate.tmbundle:
|
||||||
- source.scaml
|
- source.scaml
|
||||||
- text.html.ssp
|
- text.html.ssp
|
||||||
vendor/grammars/Slash.tmbundle:
|
vendor/grammars/Slash.tmbundle:
|
||||||
- text.html.slash
|
- text.html.slash
|
||||||
vendor/grammars/Stata.tmbundle:
|
vendor/grammars/Stata.tmbundle/:
|
||||||
- source.mata
|
- source.mata
|
||||||
- source.stata
|
- source.stata
|
||||||
|
vendor/grammars/Stylus/:
|
||||||
|
- source.stylus
|
||||||
vendor/grammars/Sublime-Coq:
|
vendor/grammars/Sublime-Coq:
|
||||||
- source.coq
|
- source.coq
|
||||||
vendor/grammars/Sublime-Inform:
|
vendor/grammars/Sublime-HTTP:
|
||||||
- source.Inform7
|
- source.httpspec
|
||||||
vendor/grammars/Sublime-Lasso:
|
vendor/grammars/Sublime-Lasso:
|
||||||
- file.lasso
|
- file.lasso
|
||||||
vendor/grammars/Sublime-Logos:
|
vendor/grammars/Sublime-Logos:
|
||||||
- source.logos
|
- source.logos
|
||||||
vendor/grammars/Sublime-Loom:
|
vendor/grammars/Sublime-Loom:
|
||||||
- source.loomscript
|
- source.loomscript
|
||||||
|
vendor/grammars/Sublime-Modula-2/:
|
||||||
|
- source.modula2
|
||||||
|
vendor/grammars/Sublime-Nit:
|
||||||
|
- source.nit
|
||||||
vendor/grammars/Sublime-QML:
|
vendor/grammars/Sublime-QML:
|
||||||
- source.qml
|
- source.qml
|
||||||
vendor/grammars/Sublime-REBOL:
|
vendor/grammars/Sublime-REBOL:
|
||||||
- source.rebol
|
- source.rebol
|
||||||
|
vendor/grammars/Sublime-Red:
|
||||||
|
- source.red
|
||||||
vendor/grammars/Sublime-SQF-Language:
|
vendor/grammars/Sublime-SQF-Language:
|
||||||
- source.sqf
|
- source.sqf
|
||||||
vendor/grammars/Sublime-Text-2-OpenEdge-ABL:
|
vendor/grammars/Sublime-Text-2-OpenEdge-ABL:
|
||||||
- source.abl
|
- source.abl
|
||||||
|
- text.html.abl
|
||||||
vendor/grammars/Sublime-VimL:
|
vendor/grammars/Sublime-VimL:
|
||||||
- source.viml
|
- source.viml
|
||||||
vendor/grammars/SublimeBrainfuck:
|
vendor/grammars/SublimeBrainfuck:
|
||||||
- source.bf
|
- source.bf
|
||||||
|
vendor/grammars/SublimeClarion/:
|
||||||
|
- source.clarion
|
||||||
|
vendor/grammars/SublimePapyrus/:
|
||||||
|
- source.compiled-papyrus
|
||||||
|
- source.papyrus
|
||||||
|
- source.papyrus-assembly
|
||||||
vendor/grammars/SublimeXtend:
|
vendor/grammars/SublimeXtend:
|
||||||
- source.xtend
|
- source.xtend
|
||||||
|
vendor/grammars/TXL/:
|
||||||
|
- source.txl
|
||||||
vendor/grammars/Textmate-Gosu-Bundle:
|
vendor/grammars/Textmate-Gosu-Bundle:
|
||||||
- source.gosu.2
|
- source.gosu.2
|
||||||
|
vendor/grammars/UrWeb-Language-Definition:
|
||||||
|
- source.ur
|
||||||
vendor/grammars/VBDotNetSyntax:
|
vendor/grammars/VBDotNetSyntax:
|
||||||
- source.vbnet
|
- source.vbnet
|
||||||
vendor/grammars/Vala-TMBundle:
|
vendor/grammars/Vala-TMBundle:
|
||||||
- source.vala
|
- source.vala
|
||||||
|
vendor/grammars/X10:
|
||||||
|
- source.x10
|
||||||
vendor/grammars/abap.tmbundle:
|
vendor/grammars/abap.tmbundle:
|
||||||
- source.abap
|
- source.abap
|
||||||
vendor/grammars/actionscript3-tmbundle:
|
vendor/grammars/actionscript3-tmbundle:
|
||||||
@@ -102,6 +159,8 @@ vendor/grammars/actionscript3-tmbundle:
|
|||||||
- text.xml.flex-config
|
- text.xml.flex-config
|
||||||
vendor/grammars/ada.tmbundle:
|
vendor/grammars/ada.tmbundle:
|
||||||
- source.ada
|
- source.ada
|
||||||
|
vendor/grammars/ampl:
|
||||||
|
- source.ampl
|
||||||
vendor/grammars/ant.tmbundle:
|
vendor/grammars/ant.tmbundle:
|
||||||
- text.xml.ant
|
- text.xml.ant
|
||||||
vendor/grammars/antlr.tmbundle:
|
vendor/grammars/antlr.tmbundle:
|
||||||
@@ -109,17 +168,33 @@ vendor/grammars/antlr.tmbundle:
|
|||||||
vendor/grammars/apache.tmbundle:
|
vendor/grammars/apache.tmbundle:
|
||||||
- source.apache-config
|
- source.apache-config
|
||||||
- source.apache-config.mod_perl
|
- source.apache-config.mod_perl
|
||||||
|
vendor/grammars/api-blueprint-sublime-plugin/:
|
||||||
|
- text.html.markdown.source.gfm.apib
|
||||||
|
- text.html.markdown.source.gfm.mson
|
||||||
vendor/grammars/applescript.tmbundle:
|
vendor/grammars/applescript.tmbundle:
|
||||||
- source.applescript
|
- source.applescript
|
||||||
|
vendor/grammars/asciidoc.tmbundle/:
|
||||||
|
- text.html.asciidoc
|
||||||
vendor/grammars/asp.tmbundle:
|
vendor/grammars/asp.tmbundle:
|
||||||
- source.asp
|
- source.asp
|
||||||
- text.html.asp
|
- text.html.asp
|
||||||
vendor/grammars/assembly.tmbundle:
|
vendor/grammars/assembly.tmbundle:
|
||||||
- objdump.x86asm
|
- objdump.x86asm
|
||||||
- source.x86asm
|
- source.x86asm
|
||||||
|
vendor/grammars/atom-fsharp/:
|
||||||
|
- source.fsharp
|
||||||
|
- source.fsharp.fsi
|
||||||
|
- source.fsharp.fsl
|
||||||
|
- source.fsharp.fsx
|
||||||
|
vendor/grammars/atom-language-purescript/:
|
||||||
|
- source.purescript
|
||||||
|
vendor/grammars/atom-language-stan/:
|
||||||
|
- source.stan
|
||||||
vendor/grammars/atom-salt:
|
vendor/grammars/atom-salt:
|
||||||
- source.python.salt
|
- source.python.salt
|
||||||
- source.yaml.salt
|
- source.yaml.salt
|
||||||
|
vendor/grammars/ats.sublime:
|
||||||
|
- source.ats
|
||||||
vendor/grammars/autoitv3-tmbundle:
|
vendor/grammars/autoitv3-tmbundle:
|
||||||
- source.autoit.3
|
- source.autoit.3
|
||||||
vendor/grammars/awk-sublime:
|
vendor/grammars/awk-sublime:
|
||||||
@@ -161,7 +236,10 @@ vendor/grammars/d.tmbundle:
|
|||||||
vendor/grammars/dart-sublime-bundle:
|
vendor/grammars/dart-sublime-bundle:
|
||||||
- source.dart
|
- source.dart
|
||||||
- source.pubspec
|
- source.pubspec
|
||||||
|
- text.dart-analysis-output
|
||||||
- text.dart-doccomments
|
- text.dart-doccomments
|
||||||
|
vendor/grammars/desktop.tmbundle:
|
||||||
|
- source.desktop
|
||||||
vendor/grammars/diff.tmbundle:
|
vendor/grammars/diff.tmbundle:
|
||||||
- source.diff
|
- source.diff
|
||||||
vendor/grammars/dylan.tmbundle:
|
vendor/grammars/dylan.tmbundle:
|
||||||
@@ -170,6 +248,8 @@ vendor/grammars/dylan.tmbundle:
|
|||||||
- source.makegen
|
- source.makegen
|
||||||
vendor/grammars/ebundles/Bundles/MSDOS batch file.tmbundle:
|
vendor/grammars/ebundles/Bundles/MSDOS batch file.tmbundle:
|
||||||
- source.dosbatch
|
- source.dosbatch
|
||||||
|
vendor/grammars/ec.tmbundle/:
|
||||||
|
- source.c.ec
|
||||||
vendor/grammars/eiffel.tmbundle:
|
vendor/grammars/eiffel.tmbundle:
|
||||||
- source.eiffel
|
- source.eiffel
|
||||||
vendor/grammars/elixir-tmbundle:
|
vendor/grammars/elixir-tmbundle:
|
||||||
@@ -189,14 +269,16 @@ vendor/grammars/fish-tmbundle:
|
|||||||
vendor/grammars/fortran.tmbundle:
|
vendor/grammars/fortran.tmbundle:
|
||||||
- source.fortran
|
- source.fortran
|
||||||
- source.fortran.modern
|
- source.fortran.modern
|
||||||
vendor/grammars/fsharpbinding:
|
vendor/grammars/gap-tmbundle/:
|
||||||
- source.fsharp
|
- source.gap
|
||||||
vendor/grammars/gettext.tmbundle:
|
vendor/grammars/gettext.tmbundle:
|
||||||
- source.po
|
- source.po
|
||||||
vendor/grammars/gnuplot-tmbundle:
|
vendor/grammars/gnuplot-tmbundle:
|
||||||
- source.gnuplot
|
- source.gnuplot
|
||||||
vendor/grammars/go-tmbundle:
|
vendor/grammars/go-tmbundle:
|
||||||
- source.go
|
- source.go
|
||||||
|
vendor/grammars/grace-tmbundle/:
|
||||||
|
- source.grace
|
||||||
vendor/grammars/gradle.tmbundle:
|
vendor/grammars/gradle.tmbundle:
|
||||||
- source.groovy.gradle
|
- source.groovy.gradle
|
||||||
vendor/grammars/graphviz.tmbundle:
|
vendor/grammars/graphviz.tmbundle:
|
||||||
@@ -225,8 +307,8 @@ vendor/grammars/io.tmbundle:
|
|||||||
vendor/grammars/ioke-outdated:
|
vendor/grammars/ioke-outdated:
|
||||||
- source.ioke
|
- source.ioke
|
||||||
vendor/grammars/jade-tmbundle:
|
vendor/grammars/jade-tmbundle:
|
||||||
- source.jade
|
|
||||||
- source.pyjade
|
- source.pyjade
|
||||||
|
- text.jade
|
||||||
vendor/grammars/jasmin-sublime:
|
vendor/grammars/jasmin-sublime:
|
||||||
- source.jasmin
|
- source.jasmin
|
||||||
vendor/grammars/java.tmbundle:
|
vendor/grammars/java.tmbundle:
|
||||||
@@ -234,40 +316,68 @@ vendor/grammars/java.tmbundle:
|
|||||||
- source.java-properties
|
- source.java-properties
|
||||||
- text.html.jsp
|
- text.html.jsp
|
||||||
- text.junit-test-report
|
- text.junit-test-report
|
||||||
vendor/grammars/javadoc.tmbundle:
|
|
||||||
- text.html.javadoc
|
|
||||||
vendor/grammars/javascript-objective-j.tmbundle:
|
vendor/grammars/javascript-objective-j.tmbundle:
|
||||||
- source.js.objj
|
- source.js.objj
|
||||||
vendor/grammars/jquery-tmbundle:
|
vendor/grammars/jflex.tmbundle:
|
||||||
- source.js.jquery
|
- source.jflex
|
||||||
vendor/grammars/json.tmbundle:
|
vendor/grammars/json.tmbundle:
|
||||||
- source.json
|
- source.json
|
||||||
vendor/grammars/kotlin-sublime-package:
|
vendor/grammars/kotlin-sublime-package:
|
||||||
- source.Kotlin
|
- source.Kotlin
|
||||||
|
vendor/grammars/language-babel/:
|
||||||
|
- source.js.jsx
|
||||||
|
- source.regexp.babel
|
||||||
|
vendor/grammars/language-click/:
|
||||||
|
- source.click
|
||||||
vendor/grammars/language-clojure:
|
vendor/grammars/language-clojure:
|
||||||
- source.clojure
|
- source.clojure
|
||||||
vendor/grammars/language-coffee-script:
|
vendor/grammars/language-coffee-script:
|
||||||
- source.coffee
|
- source.coffee
|
||||||
- source.litcoffee
|
- source.litcoffee
|
||||||
|
vendor/grammars/language-crystal:
|
||||||
|
- source.crystal
|
||||||
vendor/grammars/language-csharp:
|
vendor/grammars/language-csharp:
|
||||||
|
- source.cake
|
||||||
- source.cs
|
- source.cs
|
||||||
- source.csx
|
- source.csx
|
||||||
- source.nant-build
|
- source.nant-build
|
||||||
vendor/grammars/language-gfm:
|
vendor/grammars/language-gfm:
|
||||||
- source.gfm
|
- source.gfm
|
||||||
|
vendor/grammars/language-hy:
|
||||||
|
- source.hy
|
||||||
|
vendor/grammars/language-inform7:
|
||||||
|
- source.inform7
|
||||||
vendor/grammars/language-javascript:
|
vendor/grammars/language-javascript:
|
||||||
- source.js
|
- source.js
|
||||||
- source.js.regexp
|
- source.js.regexp
|
||||||
|
- source.js.regexp.replacement
|
||||||
|
vendor/grammars/language-jsoniq/:
|
||||||
|
- source.jq
|
||||||
|
- source.xq
|
||||||
|
vendor/grammars/language-less/:
|
||||||
|
- source.css.less
|
||||||
|
vendor/grammars/language-maxscript:
|
||||||
|
- source.maxscript
|
||||||
|
vendor/grammars/language-ncl:
|
||||||
|
- source.ncl
|
||||||
|
vendor/grammars/language-povray:
|
||||||
|
- source.pov-ray sdl
|
||||||
vendor/grammars/language-python:
|
vendor/grammars/language-python:
|
||||||
- source.python
|
|
||||||
- source.regexp.python
|
|
||||||
- text.python.console
|
- text.python.console
|
||||||
- text.python.traceback
|
- text.python.traceback
|
||||||
|
vendor/grammars/language-renpy:
|
||||||
|
- source.renpy
|
||||||
vendor/grammars/language-shellscript:
|
vendor/grammars/language-shellscript:
|
||||||
- source.shell
|
- source.shell
|
||||||
- text.shell-session
|
- text.shell-session
|
||||||
|
vendor/grammars/language-supercollider:
|
||||||
|
- source.supercollider
|
||||||
|
vendor/grammars/language-xbase:
|
||||||
|
- source.harbour
|
||||||
vendor/grammars/language-yaml:
|
vendor/grammars/language-yaml:
|
||||||
- source.yaml
|
- source.yaml
|
||||||
|
vendor/grammars/language-yang/:
|
||||||
|
- source.yang
|
||||||
vendor/grammars/latex.tmbundle:
|
vendor/grammars/latex.tmbundle:
|
||||||
- text.bibtex
|
- text.bibtex
|
||||||
- text.log.latex
|
- text.log.latex
|
||||||
@@ -275,10 +385,10 @@ vendor/grammars/latex.tmbundle:
|
|||||||
- text.tex.latex
|
- text.tex.latex
|
||||||
- text.tex.latex.beamer
|
- text.tex.latex.beamer
|
||||||
- text.tex.latex.memoir
|
- text.tex.latex.memoir
|
||||||
vendor/grammars/less.tmbundle:
|
|
||||||
- source.css.less
|
|
||||||
vendor/grammars/lilypond.tmbundle:
|
vendor/grammars/lilypond.tmbundle:
|
||||||
- source.lilypond
|
- source.lilypond
|
||||||
|
vendor/grammars/liquid.tmbundle:
|
||||||
|
- text.html.liquid
|
||||||
vendor/grammars/lisp.tmbundle:
|
vendor/grammars/lisp.tmbundle:
|
||||||
- source.lisp
|
- source.lisp
|
||||||
vendor/grammars/llvm.tmbundle:
|
vendor/grammars/llvm.tmbundle:
|
||||||
@@ -298,6 +408,8 @@ vendor/grammars/matlab.tmbundle:
|
|||||||
- source.octave
|
- source.octave
|
||||||
vendor/grammars/maven.tmbundle:
|
vendor/grammars/maven.tmbundle:
|
||||||
- text.xml.pom
|
- text.xml.pom
|
||||||
|
vendor/grammars/mediawiki.tmbundle/:
|
||||||
|
- text.html.mediawiki
|
||||||
vendor/grammars/mercury-tmlanguage:
|
vendor/grammars/mercury-tmlanguage:
|
||||||
- source.mercury
|
- source.mercury
|
||||||
vendor/grammars/monkey.tmbundle:
|
vendor/grammars/monkey.tmbundle:
|
||||||
@@ -324,26 +436,33 @@ vendor/grammars/ooc.tmbundle:
|
|||||||
- source.ooc
|
- source.ooc
|
||||||
vendor/grammars/opa.tmbundle:
|
vendor/grammars/opa.tmbundle:
|
||||||
- source.opa
|
- source.opa
|
||||||
|
vendor/grammars/openscad.tmbundle/:
|
||||||
|
- source.scad
|
||||||
|
vendor/grammars/oracle.tmbundle:
|
||||||
|
- source.plsql.oracle
|
||||||
vendor/grammars/oz-tmbundle/Syntaxes/Oz.tmLanguage:
|
vendor/grammars/oz-tmbundle/Syntaxes/Oz.tmLanguage:
|
||||||
- source.oz
|
- source.oz
|
||||||
vendor/grammars/pascal.tmbundle:
|
vendor/grammars/pascal.tmbundle:
|
||||||
- source.pascal
|
- source.pascal
|
||||||
vendor/grammars/perl.tmbundle:
|
vendor/grammars/perl.tmbundle/:
|
||||||
- source.perl
|
- source.perl
|
||||||
|
- source.perl.6
|
||||||
|
vendor/grammars/perl6fe:
|
||||||
|
- source.meta-info
|
||||||
|
- source.perl6fe
|
||||||
|
- source.regexp.perl6fe
|
||||||
vendor/grammars/php-smarty.tmbundle:
|
vendor/grammars/php-smarty.tmbundle:
|
||||||
- source.smarty
|
- text.html.smarty
|
||||||
vendor/grammars/php.tmbundle:
|
vendor/grammars/php.tmbundle:
|
||||||
- text.html.php
|
- text.html.php
|
||||||
vendor/grammars/pike-textmate:
|
vendor/grammars/pike-textmate:
|
||||||
- source.pike
|
- source.pike
|
||||||
vendor/grammars/postscript.tmbundle:
|
vendor/grammars/postscript.tmbundle:
|
||||||
- source.postscript
|
- source.postscript
|
||||||
vendor/grammars/powershell.tmbundle:
|
vendor/grammars/powershell:
|
||||||
- source.powershell
|
- source.powershell
|
||||||
vendor/grammars/processing.tmbundle:
|
vendor/grammars/processing.tmbundle:
|
||||||
- source.processing
|
- source.processing
|
||||||
vendor/grammars/prolog.tmbundle:
|
|
||||||
- source.prolog
|
|
||||||
vendor/grammars/protobuf-tmbundle:
|
vendor/grammars/protobuf-tmbundle:
|
||||||
- source.protobuf
|
- source.protobuf
|
||||||
vendor/grammars/puppet-textmate-bundle:
|
vendor/grammars/puppet-textmate-bundle:
|
||||||
@@ -354,26 +473,18 @@ vendor/grammars/python-django.tmbundle:
|
|||||||
vendor/grammars/r.tmbundle:
|
vendor/grammars/r.tmbundle:
|
||||||
- source.r
|
- source.r
|
||||||
- text.tex.latex.rd
|
- text.tex.latex.rd
|
||||||
vendor/grammars/racket-tmbundle:
|
|
||||||
- source.racket
|
|
||||||
vendor/grammars/restructuredtext.tmbundle:
|
vendor/grammars/restructuredtext.tmbundle:
|
||||||
- text.restructuredtext
|
- text.restructuredtext
|
||||||
vendor/grammars/ruby-haml.tmbundle:
|
vendor/grammars/ruby-haml.tmbundle:
|
||||||
- text.haml
|
- text.haml
|
||||||
vendor/grammars/ruby-on-rails-tmbundle:
|
|
||||||
- source.js.erb.rails
|
|
||||||
- source.ruby.rails
|
|
||||||
- source.ruby.rails.rjs
|
|
||||||
- source.sql.ruby
|
|
||||||
- text.html.erb.rails
|
|
||||||
vendor/grammars/ruby-slim.tmbundle:
|
vendor/grammars/ruby-slim.tmbundle:
|
||||||
- text.slim
|
- text.slim
|
||||||
vendor/grammars/ruby.tmbundle:
|
vendor/grammars/ruby.tmbundle:
|
||||||
- source.ruby
|
- source.ruby
|
||||||
- text.html.erb
|
- text.html.erb
|
||||||
vendor/grammars/sas.tmbundle:
|
vendor/grammars/sas.tmbundle:
|
||||||
- source.SASLog
|
|
||||||
- source.sas
|
- source.sas
|
||||||
|
- source.sas_log
|
||||||
vendor/grammars/sass-textmate-bundle:
|
vendor/grammars/sass-textmate-bundle:
|
||||||
- source.sass
|
- source.sass
|
||||||
vendor/grammars/scala.tmbundle:
|
vendor/grammars/scala.tmbundle:
|
||||||
@@ -383,19 +494,25 @@ vendor/grammars/scheme.tmbundle:
|
|||||||
- source.scheme
|
- source.scheme
|
||||||
vendor/grammars/scilab.tmbundle:
|
vendor/grammars/scilab.tmbundle:
|
||||||
- source.scilab
|
- source.scilab
|
||||||
|
vendor/grammars/smali-sublime/smali.tmLanguage:
|
||||||
|
- source.smali
|
||||||
vendor/grammars/smalltalk-tmbundle:
|
vendor/grammars/smalltalk-tmbundle:
|
||||||
- source.smalltalk
|
- source.smalltalk
|
||||||
vendor/grammars/sql.tmbundle:
|
vendor/grammars/sql.tmbundle:
|
||||||
- source.sql
|
- source.sql
|
||||||
|
vendor/grammars/st2-zonefile:
|
||||||
|
- text.zone_file
|
||||||
vendor/grammars/standard-ml.tmbundle:
|
vendor/grammars/standard-ml.tmbundle:
|
||||||
- source.cm
|
- source.cm
|
||||||
- source.ml
|
- source.ml
|
||||||
vendor/grammars/sublime-MuPAD:
|
vendor/grammars/sublime-MuPAD:
|
||||||
- source.mupad
|
- source.mupad
|
||||||
|
vendor/grammars/sublime-apl/:
|
||||||
|
- source.apl
|
||||||
|
vendor/grammars/sublime-aspectj/:
|
||||||
|
- source.aspectj
|
||||||
vendor/grammars/sublime-befunge:
|
vendor/grammars/sublime-befunge:
|
||||||
- source.befunge
|
- source.befunge
|
||||||
vendor/grammars/sublime-better-typescript:
|
|
||||||
- source.ts
|
|
||||||
vendor/grammars/sublime-bsv:
|
vendor/grammars/sublime-bsv:
|
||||||
- source.bsv
|
- source.bsv
|
||||||
vendor/grammars/sublime-cirru:
|
vendor/grammars/sublime-cirru:
|
||||||
@@ -403,29 +520,55 @@ vendor/grammars/sublime-cirru:
|
|||||||
vendor/grammars/sublime-glsl:
|
vendor/grammars/sublime-glsl:
|
||||||
- source.essl
|
- source.essl
|
||||||
- source.glsl
|
- source.glsl
|
||||||
|
vendor/grammars/sublime-golo/:
|
||||||
|
- source.golo
|
||||||
vendor/grammars/sublime-idris:
|
vendor/grammars/sublime-idris:
|
||||||
- source.idris
|
- source.idris
|
||||||
vendor/grammars/sublime-mask:
|
vendor/grammars/sublime-mask:
|
||||||
- source.mask
|
- source.mask
|
||||||
|
vendor/grammars/sublime-netlinx:
|
||||||
|
- source.netlinx
|
||||||
|
- source.netlinx.erb
|
||||||
vendor/grammars/sublime-nginx:
|
vendor/grammars/sublime-nginx:
|
||||||
- source.nginx
|
- source.nginx
|
||||||
vendor/grammars/sublime-nix:
|
vendor/grammars/sublime-nix:
|
||||||
- source.nix
|
- source.nix
|
||||||
|
vendor/grammars/sublime-opal/:
|
||||||
|
- source.opal
|
||||||
|
- source.opalsysdefs
|
||||||
|
vendor/grammars/sublime-pony:
|
||||||
|
- source.pony
|
||||||
vendor/grammars/sublime-robot-plugin:
|
vendor/grammars/sublime-robot-plugin:
|
||||||
- text.robot
|
- text.robot
|
||||||
vendor/grammars/sublime-rust:
|
vendor/grammars/sublime-rust:
|
||||||
- source.rust
|
- source.rust
|
||||||
vendor/grammars/sublime-sourcepawn:
|
vendor/grammars/sublime-sourcepawn:
|
||||||
- source.sp
|
- source.sp
|
||||||
|
vendor/grammars/sublime-spintools/:
|
||||||
|
- source.regexp.spin
|
||||||
|
- source.spin
|
||||||
vendor/grammars/sublime-tea:
|
vendor/grammars/sublime-tea:
|
||||||
- source.tea
|
- source.tea
|
||||||
|
vendor/grammars/sublime-text-ox/:
|
||||||
|
- source.ox
|
||||||
|
vendor/grammars/sublime-text-pig-latin/:
|
||||||
|
- source.pig_latin
|
||||||
|
vendor/grammars/sublime-typescript/:
|
||||||
|
- source.ts
|
||||||
|
- source.tsx
|
||||||
|
vendor/grammars/sublime-varnish:
|
||||||
|
- source.varnish.vcl
|
||||||
vendor/grammars/sublime_cobol:
|
vendor/grammars/sublime_cobol:
|
||||||
- source.acucobol
|
- source.acucobol
|
||||||
- source.cobol
|
- source.cobol
|
||||||
|
- source.jcl
|
||||||
- source.opencobol
|
- source.opencobol
|
||||||
vendor/grammars/sublime_man_page_support:
|
vendor/grammars/sublime_man_page_support:
|
||||||
- source.man
|
- source.man
|
||||||
- text.groff
|
- text.groff
|
||||||
|
vendor/grammars/sublimeprolog/:
|
||||||
|
- source.prolog
|
||||||
|
- source.prolog.eclipse
|
||||||
vendor/grammars/sublimetext-cuda-cpp:
|
vendor/grammars/sublimetext-cuda-cpp:
|
||||||
- source.cuda-c++
|
- source.cuda-c++
|
||||||
vendor/grammars/swift.tmbundle:
|
vendor/grammars/swift.tmbundle:
|
||||||
@@ -433,21 +576,21 @@ vendor/grammars/swift.tmbundle:
|
|||||||
vendor/grammars/tcl.tmbundle:
|
vendor/grammars/tcl.tmbundle:
|
||||||
- source.tcl
|
- source.tcl
|
||||||
- text.html.tcl
|
- text.html.tcl
|
||||||
vendor/grammars/text.tmbundle:
|
|
||||||
- text.plain
|
|
||||||
vendor/grammars/textile.tmbundle:
|
|
||||||
- text.html.textile
|
|
||||||
vendor/grammars/textmate.tmbundle:
|
|
||||||
- source.regexp.oniguruma
|
|
||||||
- source.tm-properties
|
|
||||||
vendor/grammars/thrift.tmbundle:
|
vendor/grammars/thrift.tmbundle:
|
||||||
- source.thrift
|
- source.thrift
|
||||||
vendor/grammars/toml.tmbundle:
|
vendor/grammars/toml.tmbundle:
|
||||||
- source.toml
|
- source.toml
|
||||||
|
vendor/grammars/turtle.tmbundle:
|
||||||
|
- source.sparql
|
||||||
|
- source.turtle
|
||||||
vendor/grammars/verilog.tmbundle:
|
vendor/grammars/verilog.tmbundle:
|
||||||
- source.verilog
|
- source.verilog
|
||||||
|
vendor/grammars/vue-syntax-highlight:
|
||||||
|
- text.html.vue
|
||||||
vendor/grammars/x86-assembly-textmate-bundle:
|
vendor/grammars/x86-assembly-textmate-bundle:
|
||||||
- source.asm.x86
|
- source.asm.x86
|
||||||
|
vendor/grammars/xc.tmbundle/:
|
||||||
|
- source.xc
|
||||||
vendor/grammars/xml.tmbundle:
|
vendor/grammars/xml.tmbundle:
|
||||||
- text.xml
|
- text.xml
|
||||||
- text.xml.xsl
|
- text.xml.xsl
|
||||||
|
|||||||
@@ -7,3 +7,15 @@ require 'linguist/repository'
|
|||||||
require 'linguist/samples'
|
require 'linguist/samples'
|
||||||
require 'linguist/shebang'
|
require 'linguist/shebang'
|
||||||
require 'linguist/version'
|
require 'linguist/version'
|
||||||
|
|
||||||
|
class << Linguist
|
||||||
|
attr_accessor :instrumenter
|
||||||
|
|
||||||
|
def instrument(*args, &bk)
|
||||||
|
if instrumenter
|
||||||
|
instrumenter.instrument(*args, &bk)
|
||||||
|
elsif block_given?
|
||||||
|
yield
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|||||||
73
lib/linguist/blob.rb
Normal file
73
lib/linguist/blob.rb
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
require 'linguist/blob_helper'
|
||||||
|
|
||||||
|
module Linguist
|
||||||
|
# A Blob is a wrapper around the content of a file to make it quack
|
||||||
|
# like a Grit::Blob. It provides the basic interface: `name`,
|
||||||
|
# `data`, `path` and `size`.
|
||||||
|
class Blob
|
||||||
|
include BlobHelper
|
||||||
|
|
||||||
|
# Public: Initialize a new Blob.
|
||||||
|
#
|
||||||
|
# path - A path String (does not necessarily exists on the file system).
|
||||||
|
# content - Content of the file.
|
||||||
|
#
|
||||||
|
# Returns a Blob.
|
||||||
|
def initialize(path, content)
|
||||||
|
@path = path
|
||||||
|
@content = content
|
||||||
|
end
|
||||||
|
|
||||||
|
# Public: Filename
|
||||||
|
#
|
||||||
|
# Examples
|
||||||
|
#
|
||||||
|
# Blob.new("/path/to/linguist/lib/linguist.rb", "").path
|
||||||
|
# # => "/path/to/linguist/lib/linguist.rb"
|
||||||
|
#
|
||||||
|
# Returns a String
|
||||||
|
attr_reader :path
|
||||||
|
|
||||||
|
# Public: File name
|
||||||
|
#
|
||||||
|
# Returns a String
|
||||||
|
def name
|
||||||
|
File.basename(@path)
|
||||||
|
end
|
||||||
|
|
||||||
|
# Public: File contents.
|
||||||
|
#
|
||||||
|
# Returns a String.
|
||||||
|
def data
|
||||||
|
@content
|
||||||
|
end
|
||||||
|
|
||||||
|
# Public: Get byte size
|
||||||
|
#
|
||||||
|
# Returns an Integer.
|
||||||
|
def size
|
||||||
|
@content.bytesize
|
||||||
|
end
|
||||||
|
|
||||||
|
# Public: Get file extension.
|
||||||
|
#
|
||||||
|
# Returns a String.
|
||||||
|
def extension
|
||||||
|
extensions.last || ""
|
||||||
|
end
|
||||||
|
|
||||||
|
# Public: Return an array of the file extensions
|
||||||
|
#
|
||||||
|
# >> Linguist::Blob.new("app/views/things/index.html.erb").extensions
|
||||||
|
# => [".html.erb", ".erb"]
|
||||||
|
#
|
||||||
|
# Returns an Array
|
||||||
|
def extensions
|
||||||
|
basename, *segments = name.downcase.split(".")
|
||||||
|
|
||||||
|
segments.map.with_index do |segment, index|
|
||||||
|
"." + segments[index..-1].join(".")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -99,7 +99,7 @@ module Linguist
|
|||||||
elsif name.nil?
|
elsif name.nil?
|
||||||
"attachment"
|
"attachment"
|
||||||
else
|
else
|
||||||
"attachment; filename=#{EscapeUtils.escape_url(File.basename(name))}"
|
"attachment; filename=#{EscapeUtils.escape_url(name)}"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -233,7 +233,22 @@ module Linguist
|
|||||||
#
|
#
|
||||||
# Return true or false
|
# Return true or false
|
||||||
def vendored?
|
def vendored?
|
||||||
name =~ VendoredRegexp ? true : false
|
path =~ VendoredRegexp ? true : false
|
||||||
|
end
|
||||||
|
|
||||||
|
documentation_paths = YAML.load_file(File.expand_path("../documentation.yml", __FILE__))
|
||||||
|
DocumentationRegexp = Regexp.new(documentation_paths.join('|'))
|
||||||
|
|
||||||
|
# Public: Is the blob in a documentation directory?
|
||||||
|
#
|
||||||
|
# Documentation files are ignored by language statistics.
|
||||||
|
#
|
||||||
|
# See "documentation.yml" for a list of documentation conventions that match
|
||||||
|
# this pattern.
|
||||||
|
#
|
||||||
|
# Return true or false
|
||||||
|
def documentation?
|
||||||
|
path =~ DocumentationRegexp ? true : false
|
||||||
end
|
end
|
||||||
|
|
||||||
# Public: Get each line of data
|
# Public: Get each line of data
|
||||||
@@ -301,7 +316,7 @@ module Linguist
|
|||||||
#
|
#
|
||||||
# Return true or false
|
# Return true or false
|
||||||
def generated?
|
def generated?
|
||||||
@_generated ||= Generated.generated?(name, lambda { data })
|
@_generated ||= Generated.generated?(path, lambda { data })
|
||||||
end
|
end
|
||||||
|
|
||||||
# Public: Detects the Language of the blob.
|
# Public: Detects the Language of the blob.
|
||||||
@@ -317,5 +332,15 @@ module Linguist
|
|||||||
def tm_scope
|
def tm_scope
|
||||||
language && language.tm_scope
|
language && language.tm_scope
|
||||||
end
|
end
|
||||||
|
|
||||||
|
DETECTABLE_TYPES = [:programming, :markup].freeze
|
||||||
|
|
||||||
|
# Internal: Should this blob be included in repository language statistics?
|
||||||
|
def include_in_language_stats?
|
||||||
|
!vendored? &&
|
||||||
|
!documentation? &&
|
||||||
|
!generated? &&
|
||||||
|
language && DETECTABLE_TYPES.include?(language.type)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
30
lib/linguist/documentation.yml
Normal file
30
lib/linguist/documentation.yml
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
# Documentation files and directories are excluded from language
|
||||||
|
# statistics.
|
||||||
|
#
|
||||||
|
# Lines in this file are Regexps that are matched against the file
|
||||||
|
# pathname.
|
||||||
|
#
|
||||||
|
# Please add additional test coverage to
|
||||||
|
# `test/test_blob.rb#test_documentation` if you make any changes.
|
||||||
|
|
||||||
|
## Documentation directories ##
|
||||||
|
|
||||||
|
- ^docs?/
|
||||||
|
- (^|/)[Dd]ocumentation/
|
||||||
|
- (^|/)javadoc/
|
||||||
|
- ^man/
|
||||||
|
- ^[Ee]xamples/
|
||||||
|
|
||||||
|
## Documentation files ##
|
||||||
|
|
||||||
|
- (^|/)CHANGE(S|LOG)?(\.|$)
|
||||||
|
- (^|/)CONTRIBUTING(\.|$)
|
||||||
|
- (^|/)COPYING(\.|$)
|
||||||
|
- (^|/)INSTALL(\.|$)
|
||||||
|
- (^|/)LICEN[CS]E(\.|$)
|
||||||
|
- (^|/)[Ll]icen[cs]e(\.|$)
|
||||||
|
- (^|/)README(\.|$)
|
||||||
|
- (^|/)[Rr]eadme(\.|$)
|
||||||
|
|
||||||
|
# Samples folders
|
||||||
|
- ^[Ss]amples/
|
||||||
@@ -1,10 +1,11 @@
|
|||||||
require 'linguist/blob_helper'
|
require 'linguist/blob_helper'
|
||||||
|
require 'linguist/blob'
|
||||||
|
|
||||||
module Linguist
|
module Linguist
|
||||||
# A FileBlob is a wrapper around a File object to make it quack
|
# A FileBlob is a wrapper around a File object to make it quack
|
||||||
# like a Grit::Blob. It provides the basic interface: `name`,
|
# like a Grit::Blob. It provides the basic interface: `name`,
|
||||||
# `data`, and `size`.
|
# `data`, `path` and `size`.
|
||||||
class FileBlob
|
class FileBlob < Blob
|
||||||
include BlobHelper
|
include BlobHelper
|
||||||
|
|
||||||
# Public: Initialize a new FileBlob from a path
|
# Public: Initialize a new FileBlob from a path
|
||||||
@@ -14,64 +15,29 @@ module Linguist
|
|||||||
#
|
#
|
||||||
# Returns a FileBlob.
|
# Returns a FileBlob.
|
||||||
def initialize(path, base_path = nil)
|
def initialize(path, base_path = nil)
|
||||||
@path = path
|
@fullpath = path
|
||||||
@name = base_path ? path.sub("#{base_path}/", '') : path
|
@path = base_path ? path.sub("#{base_path}/", '') : path
|
||||||
end
|
end
|
||||||
|
|
||||||
# Public: Filename
|
|
||||||
#
|
|
||||||
# Examples
|
|
||||||
#
|
|
||||||
# FileBlob.new("/path/to/linguist/lib/linguist.rb").name
|
|
||||||
# # => "/path/to/linguist/lib/linguist.rb"
|
|
||||||
#
|
|
||||||
# FileBlob.new("/path/to/linguist/lib/linguist.rb",
|
|
||||||
# "/path/to/linguist").name
|
|
||||||
# # => "lib/linguist.rb"
|
|
||||||
#
|
|
||||||
# Returns a String
|
|
||||||
attr_reader :name
|
|
||||||
|
|
||||||
# Public: Read file permissions
|
# Public: Read file permissions
|
||||||
#
|
#
|
||||||
# Returns a String like '100644'
|
# Returns a String like '100644'
|
||||||
def mode
|
def mode
|
||||||
File.stat(@path).mode.to_s(8)
|
File.stat(@fullpath).mode.to_s(8)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Public: Read file contents.
|
# Public: Read file contents.
|
||||||
#
|
#
|
||||||
# Returns a String.
|
# Returns a String.
|
||||||
def data
|
def data
|
||||||
File.read(@path)
|
File.read(@fullpath)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Public: Get byte size
|
# Public: Get byte size
|
||||||
#
|
#
|
||||||
# Returns an Integer.
|
# Returns an Integer.
|
||||||
def size
|
def size
|
||||||
File.size(@path)
|
File.size(@fullpath)
|
||||||
end
|
|
||||||
|
|
||||||
# Public: Get file extension.
|
|
||||||
#
|
|
||||||
# Returns a String.
|
|
||||||
def extension
|
|
||||||
extensions.last || ""
|
|
||||||
end
|
|
||||||
|
|
||||||
# Public: Return an array of the file extensions
|
|
||||||
#
|
|
||||||
# >> Linguist::FileBlob.new("app/views/things/index.html.erb").extensions
|
|
||||||
# => [".html.erb", ".erb"]
|
|
||||||
#
|
|
||||||
# Returns an Array
|
|
||||||
def extensions
|
|
||||||
basename, *segments = File.basename(name).split(".")
|
|
||||||
|
|
||||||
segments.map.with_index do |segment, index|
|
|
||||||
"." + segments[index..-1].join(".")
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -53,18 +53,28 @@ module Linguist
|
|||||||
def generated?
|
def generated?
|
||||||
xcode_file? ||
|
xcode_file? ||
|
||||||
generated_net_designer_file? ||
|
generated_net_designer_file? ||
|
||||||
|
generated_net_specflow_feature_file? ||
|
||||||
composer_lock? ||
|
composer_lock? ||
|
||||||
node_modules? ||
|
node_modules? ||
|
||||||
godeps? ||
|
godeps? ||
|
||||||
generated_by_zephir? ||
|
generated_by_zephir? ||
|
||||||
minified_files? ||
|
minified_files? ||
|
||||||
|
source_map? ||
|
||||||
compiled_coffeescript? ||
|
compiled_coffeescript? ||
|
||||||
generated_parser? ||
|
generated_parser? ||
|
||||||
generated_net_docfile? ||
|
generated_net_docfile? ||
|
||||||
generated_postscript? ||
|
generated_postscript? ||
|
||||||
|
compiled_cython_file? ||
|
||||||
|
generated_go? ||
|
||||||
generated_protocol_buffer? ||
|
generated_protocol_buffer? ||
|
||||||
|
generated_apache_thrift? ||
|
||||||
generated_jni_header? ||
|
generated_jni_header? ||
|
||||||
vcr_cassette?
|
vcr_cassette? ||
|
||||||
|
generated_module? ||
|
||||||
|
generated_unity3d_meta? ||
|
||||||
|
generated_racc? ||
|
||||||
|
generated_jflex? ||
|
||||||
|
generated_grammarkit?
|
||||||
end
|
end
|
||||||
|
|
||||||
# Internal: Is the blob an Xcode file?
|
# Internal: Is the blob an Xcode file?
|
||||||
@@ -94,6 +104,20 @@ module Linguist
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Internal: Is the blob a generated source map?
|
||||||
|
#
|
||||||
|
# Source Maps usually have .css.map or .js.map extensions. In case they
|
||||||
|
# are not following the name convention, detect them based on the content.
|
||||||
|
#
|
||||||
|
# Returns true or false.
|
||||||
|
def source_map?
|
||||||
|
return false unless extname.downcase == '.map'
|
||||||
|
|
||||||
|
name =~ /(\.css|\.js)\.map$/i || # Name convention
|
||||||
|
lines[0] =~ /^{"version":\d+,/ || # Revision 2 and later begin with the version number
|
||||||
|
lines[0] =~ /^\/\*\* Begin line maps\. \*\*\/{/ # Revision 1 begins with a magic comment
|
||||||
|
end
|
||||||
|
|
||||||
# Internal: Is the blob of JS generated by CoffeeScript?
|
# Internal: Is the blob of JS generated by CoffeeScript?
|
||||||
#
|
#
|
||||||
# CoffeeScript is meant to output JS that would be difficult to
|
# CoffeeScript is meant to output JS that would be difficult to
|
||||||
@@ -162,6 +186,17 @@ module Linguist
|
|||||||
name.downcase =~ /\.designer\.cs$/
|
name.downcase =~ /\.designer\.cs$/
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Internal: Is this a codegen file for Specflow feature file?
|
||||||
|
#
|
||||||
|
# Visual Studio's SpecFlow extension generates *.feature.cs files
|
||||||
|
# from *.feature files, they are not meant to be consumed by humans.
|
||||||
|
# Let's hide them.
|
||||||
|
#
|
||||||
|
# Returns true or false
|
||||||
|
def generated_net_specflow_feature_file?
|
||||||
|
name.downcase =~ /\.feature\.cs$/
|
||||||
|
end
|
||||||
|
|
||||||
# Internal: Is the blob of JS a parser generated by PEG.js?
|
# Internal: Is the blob of JS a parser generated by PEG.js?
|
||||||
#
|
#
|
||||||
# PEG.js-generated parsers are not meant to be consumed by humans.
|
# PEG.js-generated parsers are not meant to be consumed by humans.
|
||||||
@@ -202,17 +237,38 @@ module Linguist
|
|||||||
creator.include?("ImageMagick")
|
creator.include?("ImageMagick")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def generated_go?
|
||||||
|
return false unless extname == '.go'
|
||||||
|
return false unless lines.count > 1
|
||||||
|
|
||||||
|
return lines[0].include?("Code generated by")
|
||||||
|
end
|
||||||
|
|
||||||
|
PROTOBUF_EXTENSIONS = ['.py', '.java', '.h', '.cc', '.cpp']
|
||||||
|
|
||||||
# Internal: Is the blob a C++, Java or Python source file generated by the
|
# Internal: Is the blob a C++, Java or Python source file generated by the
|
||||||
# Protocol Buffer compiler?
|
# Protocol Buffer compiler?
|
||||||
#
|
#
|
||||||
# Returns true of false.
|
# Returns true of false.
|
||||||
def generated_protocol_buffer?
|
def generated_protocol_buffer?
|
||||||
return false unless ['.py', '.java', '.h', '.cc', '.cpp'].include?(extname)
|
return false unless PROTOBUF_EXTENSIONS.include?(extname)
|
||||||
return false unless lines.count > 1
|
return false unless lines.count > 1
|
||||||
|
|
||||||
return lines[0].include?("Generated by the protocol buffer compiler. DO NOT EDIT!")
|
return lines[0].include?("Generated by the protocol buffer compiler. DO NOT EDIT!")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
APACHE_THRIFT_EXTENSIONS = ['.rb', '.py', '.go', '.js', '.m', '.java', '.h', '.cc', '.cpp']
|
||||||
|
|
||||||
|
# Internal: Is the blob generated by Apache Thrift compiler?
|
||||||
|
#
|
||||||
|
# Returns true or false
|
||||||
|
def generated_apache_thrift?
|
||||||
|
return false unless APACHE_THRIFT_EXTENSIONS.include?(extname)
|
||||||
|
return false unless lines.count > 1
|
||||||
|
|
||||||
|
return lines[0].include?("Autogenerated by Thrift Compiler") || lines[1].include?("Autogenerated by Thrift Compiler")
|
||||||
|
end
|
||||||
|
|
||||||
# Internal: Is the blob a C/C++ header generated by the Java JNI tool javah?
|
# Internal: Is the blob a C/C++ header generated by the Java JNI tool javah?
|
||||||
#
|
#
|
||||||
# Returns true of false.
|
# Returns true of false.
|
||||||
@@ -262,5 +318,89 @@ module Linguist
|
|||||||
# VCR Cassettes have "recorded_with: VCR" in the second last line.
|
# VCR Cassettes have "recorded_with: VCR" in the second last line.
|
||||||
return lines[-2].include?("recorded_with: VCR")
|
return lines[-2].include?("recorded_with: VCR")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Internal: Is this a compiled C/C++ file from Cython?
|
||||||
|
#
|
||||||
|
# Cython-compiled C/C++ files typically contain:
|
||||||
|
# /* Generated by Cython x.x.x on ... */
|
||||||
|
# on the first line.
|
||||||
|
#
|
||||||
|
# Return true or false
|
||||||
|
def compiled_cython_file?
|
||||||
|
return false unless ['.c', '.cpp'].include? extname
|
||||||
|
return false unless lines.count > 1
|
||||||
|
return lines[0].include?("Generated by Cython")
|
||||||
|
end
|
||||||
|
|
||||||
|
# Internal: Is it a KiCAD or GFortran module file?
|
||||||
|
#
|
||||||
|
# KiCAD module files contain:
|
||||||
|
# PCBNEW-LibModule-V1 yyyy-mm-dd h:mm:ss XM
|
||||||
|
# on the first line.
|
||||||
|
#
|
||||||
|
# GFortran module files contain:
|
||||||
|
# GFORTRAN module version 'x' created from
|
||||||
|
# on the first line.
|
||||||
|
#
|
||||||
|
# Return true of false
|
||||||
|
def generated_module?
|
||||||
|
return false unless extname == '.mod'
|
||||||
|
return false unless lines.count > 1
|
||||||
|
return lines[0].include?("PCBNEW-LibModule-V") ||
|
||||||
|
lines[0].include?("GFORTRAN module version '")
|
||||||
|
end
|
||||||
|
|
||||||
|
# Internal: Is this a metadata file from Unity3D?
|
||||||
|
#
|
||||||
|
# Unity3D Meta files start with:
|
||||||
|
# fileFormatVersion: X
|
||||||
|
# guid: XXXXXXXXXXXXXXX
|
||||||
|
#
|
||||||
|
# Return true or false
|
||||||
|
def generated_unity3d_meta?
|
||||||
|
return false unless extname == '.meta'
|
||||||
|
return false unless lines.count > 1
|
||||||
|
return lines[0].include?("fileFormatVersion: ")
|
||||||
|
end
|
||||||
|
|
||||||
|
# Internal: Is this a Racc-generated file?
|
||||||
|
#
|
||||||
|
# A Racc-generated file contains:
|
||||||
|
# # This file is automatically generated by Racc x.y.z
|
||||||
|
# on the third line.
|
||||||
|
#
|
||||||
|
# Return true or false
|
||||||
|
def generated_racc?
|
||||||
|
return false unless extname == '.rb'
|
||||||
|
return false unless lines.count > 2
|
||||||
|
return lines[2].start_with?("# This file is automatically generated by Racc")
|
||||||
|
end
|
||||||
|
|
||||||
|
# Internal: Is this a JFlex-generated file?
|
||||||
|
#
|
||||||
|
# A JFlex-generated file contains:
|
||||||
|
# /* The following code was generated by JFlex x.y.z on d/at/e ti:me */
|
||||||
|
# on the first line.
|
||||||
|
#
|
||||||
|
# Return true or false
|
||||||
|
def generated_jflex?
|
||||||
|
return false unless extname == '.java'
|
||||||
|
return false unless lines.count > 1
|
||||||
|
return lines[0].start_with?("/* The following code was generated by JFlex ")
|
||||||
|
end
|
||||||
|
|
||||||
|
# Internal: Is this a GrammarKit-generated file?
|
||||||
|
#
|
||||||
|
# A GrammarKit-generated file typically contain:
|
||||||
|
# // This is a generated file. Not intended for manual editing.
|
||||||
|
# on the first line. This is not always the case, as it's possible to
|
||||||
|
# customize the class header.
|
||||||
|
#
|
||||||
|
# Return true or false
|
||||||
|
def generated_grammarkit?
|
||||||
|
return false unless extname == '.java'
|
||||||
|
return false unless lines.count > 1
|
||||||
|
return lines[0].start_with?("// This is a generated file. Not intended for manual editing.")
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -13,11 +13,14 @@ module Linguist
|
|||||||
# ])
|
# ])
|
||||||
#
|
#
|
||||||
# Returns an Array of languages, or empty if none matched or were inconclusive.
|
# Returns an Array of languages, or empty if none matched or were inconclusive.
|
||||||
def self.call(blob, languages)
|
def self.call(blob, candidates)
|
||||||
data = blob.data
|
data = blob.data
|
||||||
|
|
||||||
@heuristics.each do |heuristic|
|
@heuristics.each do |heuristic|
|
||||||
return Array(heuristic.call(data)) if heuristic.matches?(languages)
|
if heuristic.matches?(blob.name)
|
||||||
|
languages = Array(heuristic.call(data))
|
||||||
|
return languages if languages.any? || languages.all? { |l| candidates.include?(l) }
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
[] # No heuristics matched
|
[] # No heuristics matched
|
||||||
@@ -30,30 +33,31 @@ module Linguist
|
|||||||
#
|
#
|
||||||
# Examples
|
# Examples
|
||||||
#
|
#
|
||||||
# disambiguate "Perl", "Prolog" do |data|
|
# disambiguate ".pm" do |data|
|
||||||
# if data.include?("use strict")
|
# if data.include?("use strict")
|
||||||
# Language["Perl"]
|
# Language["Perl"]
|
||||||
# elsif data.include?(":-")
|
# elsif /^[^#]+:-/.match(data)
|
||||||
# Language["Prolog"]
|
# Language["Prolog"]
|
||||||
# end
|
# end
|
||||||
# end
|
# end
|
||||||
#
|
#
|
||||||
def self.disambiguate(*languages, &heuristic)
|
def self.disambiguate(*extensions, &heuristic)
|
||||||
@heuristics << new(languages, &heuristic)
|
@heuristics << new(extensions, &heuristic)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Internal: Array of defined heuristics
|
# Internal: Array of defined heuristics
|
||||||
@heuristics = []
|
@heuristics = []
|
||||||
|
|
||||||
# Internal
|
# Internal
|
||||||
def initialize(languages, &heuristic)
|
def initialize(extensions, &heuristic)
|
||||||
@languages = languages
|
@extensions = extensions
|
||||||
@heuristic = heuristic
|
@heuristic = heuristic
|
||||||
end
|
end
|
||||||
|
|
||||||
# Internal: Check if this heuristic matches the candidate languages.
|
# Internal: Check if this heuristic matches the candidate languages.
|
||||||
def matches?(candidates)
|
def matches?(filename)
|
||||||
candidates.any? && candidates.all? { |l| @languages.include?(l.name) }
|
filename = filename.downcase
|
||||||
|
@extensions.any? { |ext| filename.end_with?(ext) }
|
||||||
end
|
end
|
||||||
|
|
||||||
# Internal: Perform the heuristic
|
# Internal: Perform the heuristic
|
||||||
@@ -61,7 +65,20 @@ module Linguist
|
|||||||
@heuristic.call(data)
|
@heuristic.call(data)
|
||||||
end
|
end
|
||||||
|
|
||||||
disambiguate "BitBake", "BlitzBasic" do |data|
|
# Common heuristics
|
||||||
|
ObjectiveCRegex = /^\s*(@(interface|class|protocol|property|end|synchronised|selector|implementation)\b|#import\s+.+\.h[">])/
|
||||||
|
|
||||||
|
disambiguate ".asc" do |data|
|
||||||
|
if /^(----[- ]BEGIN|ssh-(rsa|dss)) /.match(data)
|
||||||
|
Language["Public Key"]
|
||||||
|
elsif /^[=-]+(\s|\n)|{{[A-Za-z]/.match(data)
|
||||||
|
Language["AsciiDoc"]
|
||||||
|
elsif /^(\/\/.+|((import|export)\s+)?(function|int|float|char)\s+((room|repeatedly|on|game)_)?([A-Za-z]+[A-Za-z_0-9]+)\s*[;\(])/.match(data)
|
||||||
|
Language["AGS Script"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
disambiguate ".bb" do |data|
|
||||||
if /^\s*; /.match(data) || data.include?("End Function")
|
if /^\s*; /.match(data) || data.include?("End Function")
|
||||||
Language["BlitzBasic"]
|
Language["BlitzBasic"]
|
||||||
elsif /^\s*(# |include|require)\b/.match(data)
|
elsif /^\s*(# |include|require)\b/.match(data)
|
||||||
@@ -69,43 +86,14 @@ module Linguist
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
disambiguate "Objective-C", "C++", "C" do |data|
|
disambiguate ".ch" do |data|
|
||||||
if (/^[ \t]*@(interface|class|protocol|property|end|synchronised|selector|implementation)\b/.match(data))
|
if /^\s*#\s*(if|ifdef|ifndef|define|command|xcommand|translate|xtranslate|include|pragma|undef)\b/i.match(data)
|
||||||
Language["Objective-C"]
|
Language["xBase"]
|
||||||
elsif (/^\s*#\s*include <(cstdint|string|vector|map|list|array|bitset|queue|stack|forward_list|unordered_map|unordered_set|(i|o|io)stream)>/.match(data) ||
|
|
||||||
/^\s*template\s*</.match(data) || /^[ \t]*try/.match(data) || /^[ \t]*catch\s*\(/.match(data) || /^[ \t]*(class|(using[ \t]+)?namespace)\s+\w+/.match(data) || /^[ \t]*(private|public|protected):$/.match(data) || /std::\w+/.match(data))
|
|
||||||
Language["C++"]
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
disambiguate "Perl", "Perl6", "Prolog" do |data|
|
disambiguate ".cl" do |data|
|
||||||
if data.include?("use v6")
|
if /^\s*\((defun|in-package|defpackage) /i.match(data)
|
||||||
Language["Perl6"]
|
|
||||||
elsif data.include?("use strict")
|
|
||||||
Language["Perl"]
|
|
||||||
elsif data.include?(":-")
|
|
||||||
Language["Prolog"]
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
disambiguate "ECL", "Prolog" do |data|
|
|
||||||
if data.include?(":-")
|
|
||||||
Language["Prolog"]
|
|
||||||
elsif data.include?(":=")
|
|
||||||
Language["ECL"]
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
disambiguate "IDL", "Prolog" do |data|
|
|
||||||
if data.include?(":-")
|
|
||||||
Language["Prolog"]
|
|
||||||
else
|
|
||||||
Language["IDL"]
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
disambiguate "Common Lisp", "OpenCL", "Cool" do |data|
|
|
||||||
if data.include?("(defun ")
|
|
||||||
Language["Common Lisp"]
|
Language["Common Lisp"]
|
||||||
elsif /^class/x.match(data)
|
elsif /^class/x.match(data)
|
||||||
Language["Cool"]
|
Language["Cool"]
|
||||||
@@ -114,49 +102,88 @@ module Linguist
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
disambiguate "Hack", "PHP" do |data|
|
disambiguate ".cs" do |data|
|
||||||
if data.include?("<?hh")
|
if /![\w\s]+methodsFor: /.match(data)
|
||||||
Language["Hack"]
|
Language["Smalltalk"]
|
||||||
elsif /<?[^h]/.match(data)
|
elsif /^\s*namespace\s*[\w\.]+\s*{/.match(data) || /^\s*\/\//.match(data)
|
||||||
Language["PHP"]
|
Language["C#"]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
disambiguate "Scala", "SuperCollider" do |data|
|
disambiguate ".d" do |data|
|
||||||
if /\^(this|super)\./.match(data) || /^\s*(\+|\*)\s*\w+\s*{/.match(data) || /^\s*~\w+\s*=\./.match(data)
|
if /^module /.match(data)
|
||||||
Language["SuperCollider"]
|
Language["D"]
|
||||||
elsif /^\s*import (scala|java)\./.match(data) || /^\s*val\s+\w+\s*=/.match(data) || /^\s*class\b/.match(data)
|
elsif /^((dtrace:::)?BEGIN|provider |#pragma (D (option|attributes)|ident)\s)/.match(data)
|
||||||
Language["Scala"]
|
Language["DTrace"]
|
||||||
|
elsif /(\/.*:( .* \\)$| : \\$|^ : |: \\$)/.match(data)
|
||||||
|
Language["Makefile"]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
disambiguate "AsciiDoc", "AGS Script" do |data|
|
disambiguate ".ecl" do |data|
|
||||||
Language["AsciiDoc"] if /^=+(\s|\n)/.match(data)
|
if /^[^#]+:-/.match(data)
|
||||||
|
Language["ECLiPSe"]
|
||||||
|
elsif data.include?(":=")
|
||||||
|
Language["ECL"]
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
disambiguate "FORTRAN", "Forth" do |data|
|
disambiguate ".for", ".f" do |data|
|
||||||
if /^: /.match(data)
|
if /^: /.match(data)
|
||||||
Language["Forth"]
|
Language["Forth"]
|
||||||
elsif /^([c*][^a-z]| (subroutine|program)\s|!)/i.match(data)
|
elsif /^([c*][^abd-z]| (subroutine|program|end)\s|\s*!)/i.match(data)
|
||||||
Language["FORTRAN"]
|
Language["FORTRAN"]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
disambiguate "F#", "Forth", "GLSL" do |data|
|
disambiguate ".fr" do |data|
|
||||||
|
if /^(: |also |new-device|previous )/.match(data)
|
||||||
|
Language["Forth"]
|
||||||
|
elsif /^\s*(import|module|package|data|type) /.match(data)
|
||||||
|
Language["Frege"]
|
||||||
|
else
|
||||||
|
Language["Text"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
disambiguate ".fs" do |data|
|
||||||
if /^(: |new-device)/.match(data)
|
if /^(: |new-device)/.match(data)
|
||||||
Language["Forth"]
|
Language["Forth"]
|
||||||
elsif /^\s*(#light|import|let|module|namespace|open|type)/.match(data)
|
elsif /^\s*(#light|import|let|module|namespace|open|type)/.match(data)
|
||||||
Language["F#"]
|
Language["F#"]
|
||||||
elsif /^\s*(#include|#pragma|precision|uniform|varying|void)/.match(data)
|
elsif /^\s*(#version|precision|uniform|varying|vec[234])/.match(data)
|
||||||
Language["GLSL"]
|
Language["GLSL"]
|
||||||
|
elsif /#include|#pragma\s+(rs|version)|__attribute__/.match(data)
|
||||||
|
Language["Filterscript"]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
disambiguate "Gosu", "JavaScript" do |data|
|
disambiguate ".gs" do |data|
|
||||||
Language["Gosu"] if /^uses java\./.match(data)
|
Language["Gosu"] if /^uses java\./.match(data)
|
||||||
end
|
end
|
||||||
|
|
||||||
disambiguate "LoomScript", "LiveScript" do |data|
|
disambiguate ".h" do |data|
|
||||||
|
if ObjectiveCRegex.match(data)
|
||||||
|
Language["Objective-C"]
|
||||||
|
elsif (/^\s*#\s*include <(cstdint|string|vector|map|list|array|bitset|queue|stack|forward_list|unordered_map|unordered_set|(i|o|io)stream)>/.match(data) ||
|
||||||
|
/^\s*template\s*</.match(data) || /^[ \t]*try/.match(data) || /^[ \t]*catch\s*\(/.match(data) || /^[ \t]*(class|(using[ \t]+)?namespace)\s+\w+/.match(data) || /^[ \t]*(private|public|protected):$/.match(data) || /std::\w+/.match(data))
|
||||||
|
Language["C++"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
disambiguate ".l" do |data|
|
||||||
|
if /\(def(un|macro)\s/.match(data)
|
||||||
|
Language["Common Lisp"]
|
||||||
|
elsif /^(%[%{}]xs|<.*>)/.match(data)
|
||||||
|
Language["Lex"]
|
||||||
|
elsif /^\.[a-z][a-z](\s|$)/i.match(data)
|
||||||
|
Language["Groff"]
|
||||||
|
elsif /^\((de|class|rel|code|data|must)\s/.match(data)
|
||||||
|
Language["PicoLisp"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
disambiguate ".ls" do |data|
|
||||||
if /^\s*package\s*[\w\.\/\*\s]*\s*{/.match(data)
|
if /^\s*package\s*[\w\.\/\*\s]*\s*{/.match(data)
|
||||||
Language["LoomScript"]
|
Language["LoomScript"]
|
||||||
else
|
else
|
||||||
@@ -164,7 +191,177 @@ module Linguist
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
disambiguate "TypeScript", "XML" do |data|
|
disambiguate ".lsp", ".lisp" do |data|
|
||||||
|
if /^\s*\((defun|in-package|defpackage) /i.match(data)
|
||||||
|
Language["Common Lisp"]
|
||||||
|
elsif /^\s*\(define /.match(data)
|
||||||
|
Language["NewLisp"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
disambiguate ".m" do |data|
|
||||||
|
if ObjectiveCRegex.match(data)
|
||||||
|
Language["Objective-C"]
|
||||||
|
elsif data.include?(":- module")
|
||||||
|
Language["Mercury"]
|
||||||
|
elsif /^: /.match(data)
|
||||||
|
Language["MUF"]
|
||||||
|
elsif /^\s*;/.match(data)
|
||||||
|
Language["M"]
|
||||||
|
elsif /^\s*\(\*/.match(data)
|
||||||
|
Language["Mathematica"]
|
||||||
|
elsif /^\s*%/.match(data)
|
||||||
|
Language["Matlab"]
|
||||||
|
elsif /^\w+\s*:\s*module\s*{/.match(data)
|
||||||
|
Language["Limbo"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
disambiguate ".ml" do |data|
|
||||||
|
if /(^\s*module)|let rec |match\s+(\S+\s)+with/.match(data)
|
||||||
|
Language["OCaml"]
|
||||||
|
elsif /=> |case\s+(\S+\s)+of/.match(data)
|
||||||
|
Language["Standard ML"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
disambiguate ".mod" do |data|
|
||||||
|
if data.include?('<!ENTITY ')
|
||||||
|
Language["XML"]
|
||||||
|
elsif /MODULE\s\w+\s*;/i.match(data) || /^\s*END \w+;$/i.match(data)
|
||||||
|
Language["Modula-2"]
|
||||||
|
else
|
||||||
|
[Language["Linux Kernel Module"], Language["AMPL"]]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
disambiguate ".ms" do |data|
|
||||||
|
if /^[.'][a-z][a-z](\s|$)/i.match(data)
|
||||||
|
Language["Groff"]
|
||||||
|
elsif /(?<!\S)\.(include|globa?l)\s/.match(data) || /(?<!\/\*)(\A|\n)\s*\.[A-Za-z]/.match(data.gsub(/"([^\\"]|\\.)*"|'([^\\']|\\.)*'|\\\s*(?:--.*)?\n/, ""))
|
||||||
|
Language["GAS"]
|
||||||
|
else
|
||||||
|
Language["MAXScript"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
disambiguate ".n" do |data|
|
||||||
|
if /^[.']/.match(data)
|
||||||
|
Language["Groff"]
|
||||||
|
elsif /^(module|namespace|using)\s/.match(data)
|
||||||
|
Language["Nemerle"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
disambiguate ".ncl" do |data|
|
||||||
|
if data.include?("THE_TITLE")
|
||||||
|
Language["Text"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
disambiguate ".nl" do |data|
|
||||||
|
if /^(b|g)[0-9]+ /.match(data)
|
||||||
|
Language["NL"]
|
||||||
|
else
|
||||||
|
Language["NewLisp"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
disambiguate ".php" do |data|
|
||||||
|
if data.include?("<?hh")
|
||||||
|
Language["Hack"]
|
||||||
|
elsif /<?[^h]/.match(data)
|
||||||
|
Language["PHP"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
disambiguate ".pl" do |data|
|
||||||
|
if /^[^#]+:-/.match(data)
|
||||||
|
Language["Prolog"]
|
||||||
|
elsif /use strict|use\s+v?5\./.match(data)
|
||||||
|
Language["Perl"]
|
||||||
|
elsif /^(use v6|(my )?class|module)/.match(data)
|
||||||
|
Language["Perl6"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
disambiguate ".pm", ".t" do |data|
|
||||||
|
if /use strict|use\s+v?5\./.match(data)
|
||||||
|
Language["Perl"]
|
||||||
|
elsif /^(use v6|(my )?class|module)/.match(data)
|
||||||
|
Language["Perl6"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
disambiguate ".pod" do |data|
|
||||||
|
if /^=\w+$/.match(data)
|
||||||
|
Language["Pod"]
|
||||||
|
else
|
||||||
|
Language["Perl"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
disambiguate ".pro" do |data|
|
||||||
|
if /^[^#]+:-/.match(data)
|
||||||
|
Language["Prolog"]
|
||||||
|
elsif data.include?("last_client=")
|
||||||
|
Language["INI"]
|
||||||
|
elsif data.include?("HEADERS") && data.include?("SOURCES")
|
||||||
|
Language["QMake"]
|
||||||
|
elsif /^\s*function[ \w,]+$/.match(data)
|
||||||
|
Language["IDL"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
disambiguate ".r" do |data|
|
||||||
|
if /\bRebol\b/i.match(data)
|
||||||
|
Language["Rebol"]
|
||||||
|
elsif data.include?("<-")
|
||||||
|
Language["R"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
disambiguate ".rpy" do |data|
|
||||||
|
if /(^(import|from|class|def)[\s\S])/m.match(data)
|
||||||
|
Language["Python"]
|
||||||
|
else
|
||||||
|
Language["Ren'Py"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
disambiguate ".rs" do |data|
|
||||||
|
if /^(use |fn |mod |pub |macro_rules|impl|#!?\[)/.match(data)
|
||||||
|
Language["Rust"]
|
||||||
|
elsif /#include|#pragma\s+(rs|version)|__attribute__/.match(data)
|
||||||
|
Language["RenderScript"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
disambiguate ".sc" do |data|
|
||||||
|
if /\^(this|super)\./.match(data) || /^\s*(\+|\*)\s*\w+\s*{/.match(data) || /^\s*~\w+\s*=\./.match(data)
|
||||||
|
Language["SuperCollider"]
|
||||||
|
elsif /^\s*import (scala|java)\./.match(data) || /^\s*val\s+\w+\s*=/.match(data) || /^\s*class\b/.match(data)
|
||||||
|
Language["Scala"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
disambiguate ".sql" do |data|
|
||||||
|
if /^\\i\b|AS \$\$|LANGUAGE '+plpgsql'+/i.match(data) || /SECURITY (DEFINER|INVOKER)/i.match(data) || /BEGIN( WORK| TRANSACTION)?;/i.match(data)
|
||||||
|
#Postgres
|
||||||
|
Language["PLpgSQL"]
|
||||||
|
elsif /(alter module)|(language sql)|(begin( NOT)+ atomic)/i.match(data) || /signal SQLSTATE '[0-9]+'/i.match(data)
|
||||||
|
#IBM db2
|
||||||
|
Language["SQLPL"]
|
||||||
|
elsif /pragma|\$\$PLSQL_|XMLTYPE|sysdate|systimestamp|\.nextval|connect by|AUTHID (DEFINER|CURRENT_USER)/i.match(data) || /constructor\W+function/i.match(data)
|
||||||
|
#Oracle
|
||||||
|
Language["PLSQL"]
|
||||||
|
elsif ! /begin|boolean|package|exception/i.match(data)
|
||||||
|
#Generic SQL
|
||||||
|
Language["SQL"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
disambiguate ".ts" do |data|
|
||||||
if data.include?("<TS ")
|
if data.include?("<TS ")
|
||||||
Language["XML"]
|
Language["XML"]
|
||||||
else
|
else
|
||||||
@@ -172,13 +369,12 @@ module Linguist
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
disambiguate "Frege", "Forth", "Text" do |data|
|
disambiguate ".tst" do |data|
|
||||||
if /^(: |also |new-device|previous )/.match(data)
|
if (data.include?("gap> "))
|
||||||
Language["Forth"]
|
Language["GAP"]
|
||||||
elsif /\s*(import|module|package|data|type) /.match(data)
|
# Heads up - we don't usually write heuristics like this (with no regex match)
|
||||||
Language["Frege"]
|
|
||||||
else
|
else
|
||||||
Language["Text"]
|
Language["Scilab"]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ require 'linguist/samples'
|
|||||||
require 'linguist/file_blob'
|
require 'linguist/file_blob'
|
||||||
require 'linguist/blob_helper'
|
require 'linguist/blob_helper'
|
||||||
require 'linguist/strategy/filename'
|
require 'linguist/strategy/filename'
|
||||||
|
require 'linguist/strategy/modeline'
|
||||||
require 'linguist/shebang'
|
require 'linguist/shebang'
|
||||||
|
|
||||||
module Linguist
|
module Linguist
|
||||||
@@ -31,13 +32,6 @@ module Linguist
|
|||||||
# Valid Languages types
|
# Valid Languages types
|
||||||
TYPES = [:data, :markup, :programming, :prose]
|
TYPES = [:data, :markup, :programming, :prose]
|
||||||
|
|
||||||
# Names of non-programming languages that we will still detect
|
|
||||||
#
|
|
||||||
# Returns an array
|
|
||||||
def self.detectable_markup
|
|
||||||
["CSS", "Less", "Sass", "SCSS", "Stylus", "TeX"]
|
|
||||||
end
|
|
||||||
|
|
||||||
# Detect languages by a specific type
|
# Detect languages by a specific type
|
||||||
#
|
#
|
||||||
# type - A symbol that exists within TYPES
|
# type - A symbol that exists within TYPES
|
||||||
@@ -79,7 +73,7 @@ module Linguist
|
|||||||
raise ArgumentError, "Extension is missing a '.': #{extension.inspect}"
|
raise ArgumentError, "Extension is missing a '.': #{extension.inspect}"
|
||||||
end
|
end
|
||||||
|
|
||||||
@extension_index[extension] << language
|
@extension_index[extension.downcase] << language
|
||||||
end
|
end
|
||||||
|
|
||||||
language.interpreters.each do |interpreter|
|
language.interpreters.each do |interpreter|
|
||||||
@@ -94,8 +88,9 @@ module Linguist
|
|||||||
end
|
end
|
||||||
|
|
||||||
STRATEGIES = [
|
STRATEGIES = [
|
||||||
Linguist::Strategy::Filename,
|
Linguist::Strategy::Modeline,
|
||||||
Linguist::Shebang,
|
Linguist::Shebang,
|
||||||
|
Linguist::Strategy::Filename,
|
||||||
Linguist::Heuristics,
|
Linguist::Heuristics,
|
||||||
Linguist::Classifier
|
Linguist::Classifier
|
||||||
]
|
]
|
||||||
@@ -110,19 +105,31 @@ module Linguist
|
|||||||
# Bail early if the blob is binary or empty.
|
# Bail early if the blob is binary or empty.
|
||||||
return nil if blob.likely_binary? || blob.binary? || blob.empty?
|
return nil if blob.likely_binary? || blob.binary? || blob.empty?
|
||||||
|
|
||||||
|
Linguist.instrument("linguist.detection", :blob => blob) do
|
||||||
# Call each strategy until one candidate is returned.
|
# Call each strategy until one candidate is returned.
|
||||||
STRATEGIES.reduce([]) do |languages, strategy|
|
languages = []
|
||||||
candidates = strategy.call(blob, languages)
|
returning_strategy = nil
|
||||||
|
|
||||||
|
STRATEGIES.each do |strategy|
|
||||||
|
returning_strategy = strategy
|
||||||
|
candidates = Linguist.instrument("linguist.strategy", :blob => blob, :strategy => strategy, :candidates => languages) do
|
||||||
|
strategy.call(blob, languages)
|
||||||
|
end
|
||||||
if candidates.size == 1
|
if candidates.size == 1
|
||||||
return candidates.first
|
languages = candidates
|
||||||
|
break
|
||||||
elsif candidates.size > 1
|
elsif candidates.size > 1
|
||||||
# More than one candidate was found, pass them to the next strategy.
|
# More than one candidate was found, pass them to the next strategy.
|
||||||
candidates
|
languages = candidates
|
||||||
else
|
else
|
||||||
# No candiates were found, pass on languages from the previous strategy.
|
# No candidates, try the next strategy
|
||||||
languages
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
Linguist.instrument("linguist.detected", :blob => blob, :strategy => returning_strategy, :language => languages.first)
|
||||||
|
|
||||||
|
languages.first
|
||||||
end
|
end
|
||||||
end.first
|
|
||||||
end
|
end
|
||||||
|
|
||||||
# Public: Get all Languages
|
# Public: Get all Languages
|
||||||
@@ -143,7 +150,8 @@ module Linguist
|
|||||||
#
|
#
|
||||||
# Returns the Language or nil if none was found.
|
# Returns the Language or nil if none was found.
|
||||||
def self.find_by_name(name)
|
def self.find_by_name(name)
|
||||||
name && @name_index[name.downcase]
|
return nil if name.to_s.empty?
|
||||||
|
name && (@name_index[name.downcase] || @name_index[name.split(',').first.downcase])
|
||||||
end
|
end
|
||||||
|
|
||||||
# Public: Look up Language by one of its aliases.
|
# Public: Look up Language by one of its aliases.
|
||||||
@@ -155,9 +163,10 @@ module Linguist
|
|||||||
# Language.find_by_alias('cpp')
|
# Language.find_by_alias('cpp')
|
||||||
# # => #<Language name="C++">
|
# # => #<Language name="C++">
|
||||||
#
|
#
|
||||||
# Returns the Lexer or nil if none was found.
|
# Returns the Language or nil if none was found.
|
||||||
def self.find_by_alias(name)
|
def self.find_by_alias(name)
|
||||||
name && @alias_index[name.downcase]
|
return nil if name.to_s.empty?
|
||||||
|
name && (@alias_index[name.downcase] || @alias_index[name.split(',').first.downcase])
|
||||||
end
|
end
|
||||||
|
|
||||||
# Public: Look up Languages by filename.
|
# Public: Look up Languages by filename.
|
||||||
@@ -196,7 +205,7 @@ module Linguist
|
|||||||
# Returns all matching Languages or [] if none were found.
|
# Returns all matching Languages or [] if none were found.
|
||||||
def self.find_by_extension(extname)
|
def self.find_by_extension(extname)
|
||||||
extname = ".#{extname}" unless extname.start_with?(".")
|
extname = ".#{extname}" unless extname.start_with?(".")
|
||||||
@extension_index[extname]
|
@extension_index[extname.downcase]
|
||||||
end
|
end
|
||||||
|
|
||||||
# DEPRECATED
|
# DEPRECATED
|
||||||
@@ -219,7 +228,7 @@ module Linguist
|
|||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
# Public: Look up Language by its name or lexer.
|
# Public: Look up Language by its name.
|
||||||
#
|
#
|
||||||
# name - The String name of the Language
|
# name - The String name of the Language
|
||||||
#
|
#
|
||||||
@@ -233,7 +242,8 @@ module Linguist
|
|||||||
#
|
#
|
||||||
# Returns the Language or nil if none was found.
|
# Returns the Language or nil if none was found.
|
||||||
def self.[](name)
|
def self.[](name)
|
||||||
name && @index[name.downcase]
|
return nil if name.to_s.empty?
|
||||||
|
name && (@index[name.downcase] || @index[name.split(',').first.downcase])
|
||||||
end
|
end
|
||||||
|
|
||||||
# Public: A List of popular languages
|
# Public: A List of popular languages
|
||||||
@@ -243,7 +253,7 @@ module Linguist
|
|||||||
#
|
#
|
||||||
# This list is configured in "popular.yml".
|
# This list is configured in "popular.yml".
|
||||||
#
|
#
|
||||||
# Returns an Array of Lexers.
|
# Returns an Array of Languages.
|
||||||
def self.popular
|
def self.popular
|
||||||
@popular ||= all.select(&:popular?).sort_by { |lang| lang.name.downcase }
|
@popular ||= all.select(&:popular?).sort_by { |lang| lang.name.downcase }
|
||||||
end
|
end
|
||||||
@@ -255,7 +265,7 @@ module Linguist
|
|||||||
#
|
#
|
||||||
# This list is created from all the languages not listed in "popular.yml".
|
# This list is created from all the languages not listed in "popular.yml".
|
||||||
#
|
#
|
||||||
# Returns an Array of Lexers.
|
# Returns an Array of Languages.
|
||||||
def self.unpopular
|
def self.unpopular
|
||||||
@unpopular ||= all.select(&:unpopular?).sort_by { |lang| lang.name.downcase }
|
@unpopular ||= all.select(&:unpopular?).sort_by { |lang| lang.name.downcase }
|
||||||
end
|
end
|
||||||
@@ -375,11 +385,6 @@ module Linguist
|
|||||||
# Returns the name String
|
# Returns the name String
|
||||||
attr_reader :search_term
|
attr_reader :search_term
|
||||||
|
|
||||||
# Public: Get Lexer
|
|
||||||
#
|
|
||||||
# Returns the Lexer
|
|
||||||
attr_reader :lexer
|
|
||||||
|
|
||||||
# Public: Get the name of a TextMate-compatible scope
|
# Public: Get the name of a TextMate-compatible scope
|
||||||
#
|
#
|
||||||
# Returns the scope
|
# Returns the scope
|
||||||
@@ -495,16 +500,6 @@ module Linguist
|
|||||||
@searchable
|
@searchable
|
||||||
end
|
end
|
||||||
|
|
||||||
# Public: Highlight syntax of text
|
|
||||||
#
|
|
||||||
# text - String of code to be highlighted
|
|
||||||
# options - A Hash of options (defaults to {})
|
|
||||||
#
|
|
||||||
# Returns html String
|
|
||||||
def colorize(text, options = {})
|
|
||||||
lexer.highlight(text, options)
|
|
||||||
end
|
|
||||||
|
|
||||||
# Public: Return name as String representation
|
# Public: Return name as String representation
|
||||||
def to_s
|
def to_s
|
||||||
name
|
name
|
||||||
@@ -548,8 +543,8 @@ module Linguist
|
|||||||
|
|
||||||
if extnames = extensions[name]
|
if extnames = extensions[name]
|
||||||
extnames.each do |extname|
|
extnames.each do |extname|
|
||||||
if !options['extensions'].index { |x| x.end_with? extname }
|
if !options['extensions'].index { |x| x.downcase.end_with? extname.downcase }
|
||||||
warn "#{name} has a sample with extension (#{extname}) that isn't explicitly defined in languages.yml" unless extname == '.script!'
|
warn "#{name} has a sample with extension (#{extname.downcase}) that isn't explicitly defined in languages.yml"
|
||||||
options['extensions'] << extname
|
options['extensions'] << extname
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -580,7 +575,6 @@ module Linguist
|
|||||||
:color => options['color'],
|
:color => options['color'],
|
||||||
:type => options['type'],
|
:type => options['type'],
|
||||||
:aliases => options['aliases'],
|
:aliases => options['aliases'],
|
||||||
:lexer => options['lexer'],
|
|
||||||
:tm_scope => options['tm_scope'],
|
:tm_scope => options['tm_scope'],
|
||||||
:ace_mode => options['ace_mode'],
|
:ace_mode => options['ace_mode'],
|
||||||
:wrap => options['wrap'],
|
:wrap => options['wrap'],
|
||||||
|
|||||||
1116
lib/linguist/languages.yml
Normal file → Executable file
1116
lib/linguist/languages.yml
Normal file → Executable file
File diff suppressed because it is too large
Load Diff
@@ -4,7 +4,11 @@ require 'rugged'
|
|||||||
|
|
||||||
module Linguist
|
module Linguist
|
||||||
class LazyBlob
|
class LazyBlob
|
||||||
GIT_ATTR = ['linguist-language', 'linguist-vendored']
|
GIT_ATTR = ['linguist-documentation',
|
||||||
|
'linguist-language',
|
||||||
|
'linguist-vendored',
|
||||||
|
'linguist-generated']
|
||||||
|
|
||||||
GIT_ATTR_OPTS = { :priority => [:index], :skip_system => true }
|
GIT_ATTR_OPTS = { :priority => [:index], :skip_system => true }
|
||||||
GIT_ATTR_FLAGS = Rugged::Repository::Attributes.parse_opts(GIT_ATTR_OPTS)
|
GIT_ATTR_FLAGS = Rugged::Repository::Attributes.parse_opts(GIT_ATTR_OPTS)
|
||||||
|
|
||||||
@@ -14,13 +18,15 @@ module Linguist
|
|||||||
|
|
||||||
attr_reader :repository
|
attr_reader :repository
|
||||||
attr_reader :oid
|
attr_reader :oid
|
||||||
attr_reader :name
|
attr_reader :path
|
||||||
attr_reader :mode
|
attr_reader :mode
|
||||||
|
|
||||||
def initialize(repo, oid, name, mode = nil)
|
alias :name :path
|
||||||
|
|
||||||
|
def initialize(repo, oid, path, mode = nil)
|
||||||
@repository = repo
|
@repository = repo
|
||||||
@oid = oid
|
@oid = oid
|
||||||
@name = name
|
@path = path
|
||||||
@mode = mode
|
@mode = mode
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -29,11 +35,27 @@ module Linguist
|
|||||||
name, GIT_ATTR, GIT_ATTR_FLAGS)
|
name, GIT_ATTR, GIT_ATTR_FLAGS)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def documentation?
|
||||||
|
if attr = git_attributes['linguist-documentation']
|
||||||
|
boolean_attribute(attr)
|
||||||
|
else
|
||||||
|
super
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def generated?
|
||||||
|
if attr = git_attributes['linguist-generated']
|
||||||
|
boolean_attribute(attr)
|
||||||
|
else
|
||||||
|
super
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def vendored?
|
def vendored?
|
||||||
if attr = git_attributes['linguist-vendored']
|
if attr = git_attributes['linguist-vendored']
|
||||||
return boolean_attribute(attr)
|
return boolean_attribute(attr)
|
||||||
else
|
else
|
||||||
return super
|
super
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -41,7 +63,7 @@ module Linguist
|
|||||||
return @language if defined?(@language)
|
return @language if defined?(@language)
|
||||||
|
|
||||||
@language = if lang = git_attributes['linguist-language']
|
@language = if lang = git_attributes['linguist-language']
|
||||||
Language.find_by_name(lang)
|
Language.find_by_alias(lang)
|
||||||
else
|
else
|
||||||
super
|
super
|
||||||
end
|
end
|
||||||
@@ -57,11 +79,15 @@ module Linguist
|
|||||||
@size
|
@size
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def cleanup!
|
||||||
|
@data.clear if @data
|
||||||
|
end
|
||||||
|
|
||||||
protected
|
protected
|
||||||
|
|
||||||
# Returns true if the attribute is present and not the string "false".
|
# Returns true if the attribute is present and not the string "false".
|
||||||
def boolean_attribute(attr)
|
def boolean_attribute(attribute)
|
||||||
attr != "false"
|
attribute != "false"
|
||||||
end
|
end
|
||||||
|
|
||||||
def load_blob!
|
def load_blob!
|
||||||
|
|||||||
@@ -9,21 +9,21 @@
|
|||||||
- CSS
|
- CSS
|
||||||
- Clojure
|
- Clojure
|
||||||
- CoffeeScript
|
- CoffeeScript
|
||||||
- Common Lisp
|
- Go
|
||||||
- Diff
|
|
||||||
- Emacs Lisp
|
|
||||||
- Erlang
|
|
||||||
- HTML
|
- HTML
|
||||||
- Haskell
|
- Haskell
|
||||||
- Java
|
- Java
|
||||||
- JavaScript
|
- JavaScript
|
||||||
- Lua
|
- Lua
|
||||||
|
- Matlab
|
||||||
- Objective-C
|
- Objective-C
|
||||||
- PHP
|
- PHP
|
||||||
- Perl
|
- Perl
|
||||||
- Python
|
- Python
|
||||||
|
- R
|
||||||
- Ruby
|
- Ruby
|
||||||
- SQL
|
|
||||||
- Scala
|
- Scala
|
||||||
- Scheme
|
|
||||||
- Shell
|
- Shell
|
||||||
|
- Swift
|
||||||
|
- TeX
|
||||||
|
- VimL
|
||||||
|
|||||||
@@ -126,12 +126,13 @@ module Linguist
|
|||||||
end
|
end
|
||||||
|
|
||||||
protected
|
protected
|
||||||
|
MAX_TREE_SIZE = 100_000
|
||||||
|
|
||||||
def compute_stats(old_commit_oid, cache = nil)
|
def compute_stats(old_commit_oid, cache = nil)
|
||||||
|
return {} if current_tree.count_recursive(MAX_TREE_SIZE) >= MAX_TREE_SIZE
|
||||||
|
|
||||||
old_tree = old_commit_oid && Rugged::Commit.lookup(repository, old_commit_oid).tree
|
old_tree = old_commit_oid && Rugged::Commit.lookup(repository, old_commit_oid).tree
|
||||||
|
|
||||||
read_index
|
read_index
|
||||||
|
|
||||||
diff = Rugged::Tree.diff(repository, old_tree, current_tree)
|
diff = Rugged::Tree.diff(repository, old_tree, current_tree)
|
||||||
|
|
||||||
# Clear file map and fetch full diff if any .gitattributes files are changed
|
# Clear file map and fetch full diff if any .gitattributes files are changed
|
||||||
@@ -150,19 +151,18 @@ module Linguist
|
|||||||
next if delta.binary
|
next if delta.binary
|
||||||
|
|
||||||
if [:added, :modified].include? delta.status
|
if [:added, :modified].include? delta.status
|
||||||
# Skip submodules
|
# Skip submodules and symlinks
|
||||||
mode = delta.new_file[:mode]
|
mode = delta.new_file[:mode]
|
||||||
next if (mode & 040000) != 0
|
mode_format = (mode & 0170000)
|
||||||
|
next if mode_format == 0120000 || mode_format == 040000 || mode_format == 0160000
|
||||||
|
|
||||||
blob = Linguist::LazyBlob.new(repository, delta.new_file[:oid], new, mode.to_s(8))
|
blob = Linguist::LazyBlob.new(repository, delta.new_file[:oid], new, mode.to_s(8))
|
||||||
|
|
||||||
# Skip vendored or generated blobs
|
if blob.include_in_language_stats?
|
||||||
next if blob.vendored? || blob.generated? || blob.language.nil?
|
|
||||||
|
|
||||||
# Only include programming languages and acceptable markup languages
|
|
||||||
if blob.language.type == :programming || Language.detectable_markup.include?(blob.language.name)
|
|
||||||
file_map[new] = [blob.language.group.name, blob.size]
|
file_map[new] = [blob.language.group.name, blob.size]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
blob.cleanup!
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -50,16 +50,13 @@ module Linguist
|
|||||||
end
|
end
|
||||||
else
|
else
|
||||||
path = File.join(dirname, filename)
|
path = File.join(dirname, filename)
|
||||||
|
extname = File.extname(filename)
|
||||||
if File.extname(filename) == ""
|
|
||||||
raise "#{path} is missing an extension, maybe it belongs in filenames/ subdir"
|
|
||||||
end
|
|
||||||
|
|
||||||
yield({
|
yield({
|
||||||
:path => path,
|
:path => path,
|
||||||
:language => category,
|
:language => category,
|
||||||
:interpreter => Shebang.interpreter(File.read(path)),
|
:interpreter => Shebang.interpreter(File.read(path)),
|
||||||
:extname => File.extname(filename)
|
:extname => extname.empty? ? nil : extname
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -23,17 +23,20 @@ module Linguist
|
|||||||
# First line must start with #!
|
# First line must start with #!
|
||||||
return unless shebang && shebang.start_with?("#!")
|
return unless shebang && shebang.start_with?("#!")
|
||||||
|
|
||||||
# Get the parts of the shebang without the #!
|
s = StringScanner.new(shebang)
|
||||||
tokens = shebang.sub(/^#!\s*/, '').strip.split(' ')
|
|
||||||
|
|
||||||
# There was nothing after the #!
|
# There was nothing after the #!
|
||||||
return if tokens.empty?
|
return unless path = s.scan(/^#!\s*\S+/)
|
||||||
|
|
||||||
# Get the name of the interpreter
|
# Keep going
|
||||||
script = File.basename(tokens.first)
|
script = path.split('/').last
|
||||||
|
|
||||||
# Get next argument if interpreter was /usr/bin/env
|
# if /usr/bin/env type shebang then walk the string
|
||||||
script = tokens[1] if script == 'env'
|
if script == 'env'
|
||||||
|
s.scan(/\s+/)
|
||||||
|
s.scan(/.*=[^\s]+\s+/) # skip over variable arguments e.g. foo=bar
|
||||||
|
script = s.scan(/\S+/)
|
||||||
|
end
|
||||||
|
|
||||||
# Interpreter was /usr/bin/env with no arguments
|
# Interpreter was /usr/bin/env with no arguments
|
||||||
return unless script
|
return unless script
|
||||||
@@ -41,6 +44,9 @@ module Linguist
|
|||||||
# "python2.6" -> "python2"
|
# "python2.6" -> "python2"
|
||||||
script.sub! /(\.\d+)$/, ''
|
script.sub! /(\.\d+)$/, ''
|
||||||
|
|
||||||
|
# #! perl -> perl
|
||||||
|
script.sub! /^#!\s*/, ''
|
||||||
|
|
||||||
# Check for multiline shebang hacks that call `exec`
|
# Check for multiline shebang hacks that call `exec`
|
||||||
if script == 'sh' &&
|
if script == 'sh' &&
|
||||||
data.lines.first(5).any? { |l| l.match(/exec (\w+).+\$0.+\$@/) }
|
data.lines.first(5).any? { |l| l.match(/exec (\w+).+\$0.+\$@/) }
|
||||||
|
|||||||
@@ -3,17 +3,7 @@ module Linguist
|
|||||||
# Detects language based on filename and/or extension
|
# Detects language based on filename and/or extension
|
||||||
class Filename
|
class Filename
|
||||||
def self.call(blob, _)
|
def self.call(blob, _)
|
||||||
name = blob.name.to_s
|
Language.find_by_filename(blob.name.to_s)
|
||||||
|
|
||||||
# A bit of an elegant hack. If the file is executable but extensionless,
|
|
||||||
# append a "magic" extension so it can be classified with other
|
|
||||||
# languages that have shebang scripts.
|
|
||||||
extensions = FileBlob.new(name).extensions
|
|
||||||
if extensions.empty? && blob.mode && (blob.mode.to_i(8) & 05) == 05
|
|
||||||
name += ".script!"
|
|
||||||
end
|
|
||||||
|
|
||||||
Language.find_by_filename(name)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
41
lib/linguist/strategy/modeline.rb
Normal file
41
lib/linguist/strategy/modeline.rb
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
module Linguist
|
||||||
|
module Strategy
|
||||||
|
class Modeline
|
||||||
|
EMACS_MODELINE = /-\*-\s*(?:(?!mode)[\w-]+\s*:\s*(?:[\w+-]+)\s*;?\s*)*(?:mode\s*:)?\s*([\w+-]+)\s*(?:;\s*(?!mode)[\w-]+\s*:\s*[\w+-]+\s*)*;?\s*-\*-/i
|
||||||
|
|
||||||
|
# First form vim modeline
|
||||||
|
# [text]{white}{vi:|vim:|ex:}[white]{options}
|
||||||
|
# ex: 'vim: syntax=ruby'
|
||||||
|
VIM_MODELINE_1 = /(?:vim|vi|ex):\s*(?:ft|filetype|syntax)=(\w+)\s?/i
|
||||||
|
|
||||||
|
# Second form vim modeline (compatible with some versions of Vi)
|
||||||
|
# [text]{white}{vi:|vim:|Vim:|ex:}[white]se[t] {options}:[text]
|
||||||
|
# ex: 'vim set syntax=ruby:'
|
||||||
|
VIM_MODELINE_2 = /(?:vim|vi|Vim|ex):\s*se(?:t)?.*\s(?:ft|filetype|syntax)=(\w+)\s?.*:/i
|
||||||
|
|
||||||
|
MODELINES = [EMACS_MODELINE, VIM_MODELINE_1, VIM_MODELINE_2]
|
||||||
|
|
||||||
|
# Public: Detects language based on Vim and Emacs modelines
|
||||||
|
#
|
||||||
|
# blob - An object that quacks like a blob.
|
||||||
|
#
|
||||||
|
# Examples
|
||||||
|
#
|
||||||
|
# Modeline.call(FileBlob.new("path/to/file"))
|
||||||
|
#
|
||||||
|
# Returns an Array with one Language if the blob has a Vim or Emacs modeline
|
||||||
|
# that matches a Language name or alias. Returns an empty array if no match.
|
||||||
|
def self.call(blob, _ = nil)
|
||||||
|
Array(Language.find_by_alias(modeline(blob.data)))
|
||||||
|
end
|
||||||
|
|
||||||
|
# Public: Get the modeline from the first n-lines of the file
|
||||||
|
#
|
||||||
|
# Returns a String or nil
|
||||||
|
def self.modeline(data)
|
||||||
|
match = MODELINES.map { |regex| data.match(regex) }.reject(&:nil?).first
|
||||||
|
match[1] if match
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -22,8 +22,10 @@ module Linguist
|
|||||||
# Start state on token, ignore anything till the next newline
|
# Start state on token, ignore anything till the next newline
|
||||||
SINGLE_LINE_COMMENTS = [
|
SINGLE_LINE_COMMENTS = [
|
||||||
'//', # C
|
'//', # C
|
||||||
|
'--', # Ada, Haskell, AppleScript
|
||||||
'#', # Ruby
|
'#', # Ruby
|
||||||
'%', # Tex
|
'%', # Tex
|
||||||
|
'"', # Vim
|
||||||
]
|
]
|
||||||
|
|
||||||
# Start state on opening token, ignore anything until the closing
|
# Start state on opening token, ignore anything until the closing
|
||||||
@@ -33,7 +35,8 @@ module Linguist
|
|||||||
['<!--', '-->'], # XML
|
['<!--', '-->'], # XML
|
||||||
['{-', '-}'], # Haskell
|
['{-', '-}'], # Haskell
|
||||||
['(*', '*)'], # Coq
|
['(*', '*)'], # Coq
|
||||||
['"""', '"""'] # Python
|
['"""', '"""'], # Python
|
||||||
|
["'''", "'''"] # Python
|
||||||
]
|
]
|
||||||
|
|
||||||
START_SINGLE_LINE_COMMENT = Regexp.compile(SINGLE_LINE_COMMENTS.map { |c|
|
START_SINGLE_LINE_COMMENT = Regexp.compile(SINGLE_LINE_COMMENTS.map { |c|
|
||||||
@@ -83,17 +86,17 @@ module Linguist
|
|||||||
if s.peek(1) == "\""
|
if s.peek(1) == "\""
|
||||||
s.getch
|
s.getch
|
||||||
else
|
else
|
||||||
s.skip_until(/[^\\]"/)
|
s.skip_until(/(?<!\\)"/)
|
||||||
end
|
end
|
||||||
elsif s.scan(/'/)
|
elsif s.scan(/'/)
|
||||||
if s.peek(1) == "'"
|
if s.peek(1) == "'"
|
||||||
s.getch
|
s.getch
|
||||||
else
|
else
|
||||||
s.skip_until(/[^\\]'/)
|
s.skip_until(/(?<!\\)'/)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Skip number literals
|
# Skip number literals
|
||||||
elsif s.scan(/(0x)?\d(\d|\.)*/)
|
elsif s.scan(/(0x\h(\h|\.)*|\d(\d|\.)*)([uU][lL]{0,2}|([eE][-+]\d*)?[fFlL]*)/)
|
||||||
|
|
||||||
# SGML style brackets
|
# SGML style brackets
|
||||||
elsif token = s.scan(/<[^\s<>][^<>]*>/)
|
elsif token = s.scan(/<[^\s<>][^<>]*>/)
|
||||||
@@ -129,6 +132,9 @@ module Linguist
|
|||||||
# extract_shebang("#!/usr/bin/env node")
|
# extract_shebang("#!/usr/bin/env node")
|
||||||
# # => "node"
|
# # => "node"
|
||||||
#
|
#
|
||||||
|
# extract_shebang("#!/usr/bin/env A=B foo=bar awk -f")
|
||||||
|
# # => "awk"
|
||||||
|
#
|
||||||
# Returns String token or nil it couldn't be parsed.
|
# Returns String token or nil it couldn't be parsed.
|
||||||
def extract_shebang(data)
|
def extract_shebang(data)
|
||||||
s = StringScanner.new(data)
|
s = StringScanner.new(data)
|
||||||
@@ -137,6 +143,7 @@ module Linguist
|
|||||||
script = path.split('/').last
|
script = path.split('/').last
|
||||||
if script == 'env'
|
if script == 'env'
|
||||||
s.scan(/\s+/)
|
s.scan(/\s+/)
|
||||||
|
s.scan(/.*=[^\s]+\s+/)
|
||||||
script = s.scan(/\S+/)
|
script = s.scan(/\S+/)
|
||||||
end
|
end
|
||||||
script = script[/[^\d]+/, 0] if script
|
script = script[/[^\d]+/, 0] if script
|
||||||
|
|||||||
@@ -20,10 +20,20 @@
|
|||||||
- ^deps/
|
- ^deps/
|
||||||
- ^tools/
|
- ^tools/
|
||||||
- (^|/)configure$
|
- (^|/)configure$
|
||||||
- (^|/)configure.ac$
|
|
||||||
- (^|/)config.guess$
|
- (^|/)config.guess$
|
||||||
- (^|/)config.sub$
|
- (^|/)config.sub$
|
||||||
|
|
||||||
|
# stuff autogenerated by autoconf - still C deps
|
||||||
|
- (^|/)aclocal.m4
|
||||||
|
- (^|/)libtool.m4
|
||||||
|
- (^|/)ltoptions.m4
|
||||||
|
- (^|/)ltsugar.m4
|
||||||
|
- (^|/)ltversion.m4
|
||||||
|
- (^|/)lt~obsolete.m4
|
||||||
|
|
||||||
|
# Linters
|
||||||
|
- cpplint.py
|
||||||
|
|
||||||
# Node dependencies
|
# Node dependencies
|
||||||
- node_modules/
|
- node_modules/
|
||||||
|
|
||||||
@@ -40,30 +50,34 @@
|
|||||||
# Minified JavaScript and CSS
|
# Minified JavaScript and CSS
|
||||||
- (\.|-)min\.(js|css)$
|
- (\.|-)min\.(js|css)$
|
||||||
|
|
||||||
|
# Stylesheets imported from packages
|
||||||
|
- ([^\s]*)import\.(css|less|scss|styl)$
|
||||||
|
|
||||||
# Bootstrap css and js
|
# Bootstrap css and js
|
||||||
- (^|/)bootstrap([^.]*)\.(js|css)$
|
- (^|/)bootstrap([^.]*)\.(js|css|less|scss|styl)$
|
||||||
|
- (^|/)custom\.bootstrap([^\s]*)(js|css|less|scss|styl)$
|
||||||
|
|
||||||
# Font Awesome
|
# Font Awesome
|
||||||
- font-awesome.css
|
- (^|/)font-awesome\.(css|less|scss|styl)$
|
||||||
|
|
||||||
# Foundation css
|
# Foundation css
|
||||||
- foundation.css
|
- (^|/)foundation\.(css|less|scss|styl)$
|
||||||
|
|
||||||
# Normalize.css
|
# Normalize.css
|
||||||
- normalize.css
|
- (^|/)normalize\.(css|less|scss|styl)$
|
||||||
|
|
||||||
# Bourbon SCSS
|
# Bourbon css
|
||||||
- (^|/)[Bb]ourbon/.*\.css$
|
- (^|/)[Bb]ourbon/.*\.(css|less|scss|styl)$
|
||||||
- (^|/)[Bb]ourbon/.*\.scss$
|
|
||||||
|
|
||||||
# Animate.css
|
# Animate.css
|
||||||
- animate.css
|
- (^|/)animate\.(css|less|scss|styl)$
|
||||||
|
|
||||||
# Vendored dependencies
|
# Vendored dependencies
|
||||||
- third[-_]?party/
|
- third[-_]?party/
|
||||||
- 3rd[-_]?party/
|
- 3rd[-_]?party/
|
||||||
- vendors?/
|
- vendors?/
|
||||||
- extern(al)?/
|
- extern(al)?/
|
||||||
|
- (^|/)[Vv]+endor/
|
||||||
|
|
||||||
# Debian packaging
|
# Debian packaging
|
||||||
- ^debian/
|
- ^debian/
|
||||||
@@ -71,6 +85,9 @@
|
|||||||
# Haxelib projects often contain a neko bytecode file named run.n
|
# Haxelib projects often contain a neko bytecode file named run.n
|
||||||
- run.n$
|
- run.n$
|
||||||
|
|
||||||
|
# Bootstrap Datepicker
|
||||||
|
- bootstrap-datepicker/
|
||||||
|
|
||||||
## Commonly Bundled JavaScript frameworks ##
|
## Commonly Bundled JavaScript frameworks ##
|
||||||
|
|
||||||
# jQuery
|
# jQuery
|
||||||
@@ -81,6 +98,34 @@
|
|||||||
- (^|/)jquery\-ui(\-\d\.\d+(\.\d+)?)?(\.\w+)?\.(js|css)$
|
- (^|/)jquery\-ui(\-\d\.\d+(\.\d+)?)?(\.\w+)?\.(js|css)$
|
||||||
- (^|/)jquery\.(ui|effects)\.([^.]*)\.(js|css)$
|
- (^|/)jquery\.(ui|effects)\.([^.]*)\.(js|css)$
|
||||||
|
|
||||||
|
# jQuery Gantt
|
||||||
|
- jquery.fn.gantt.js
|
||||||
|
|
||||||
|
# jQuery fancyBox
|
||||||
|
- jquery.fancybox.(js|css)
|
||||||
|
|
||||||
|
# Fuel UX
|
||||||
|
- fuelux.js
|
||||||
|
|
||||||
|
# jQuery File Upload
|
||||||
|
- (^|/)jquery\.fileupload(-\w+)?\.js$
|
||||||
|
|
||||||
|
# Slick
|
||||||
|
- (^|/)slick\.\w+.js$
|
||||||
|
|
||||||
|
# Leaflet plugins
|
||||||
|
- (^|/)Leaflet\.Coordinates-\d+\.\d+\.\d+\.src\.js$
|
||||||
|
- leaflet.draw-src.js
|
||||||
|
- leaflet.draw.css
|
||||||
|
- Control.FullScreen.css
|
||||||
|
- Control.FullScreen.js
|
||||||
|
- leaflet.spin.js
|
||||||
|
- wicket-leaflet.js
|
||||||
|
|
||||||
|
# Sublime Text workspace files
|
||||||
|
- .sublime-project
|
||||||
|
- .sublime-workspace
|
||||||
|
|
||||||
# Prototype
|
# Prototype
|
||||||
- (^|/)prototype(.*)\.js$
|
- (^|/)prototype(.*)\.js$
|
||||||
- (^|/)effects\.js$
|
- (^|/)effects\.js$
|
||||||
@@ -115,7 +160,7 @@
|
|||||||
- (^|/)Chart\.js$
|
- (^|/)Chart\.js$
|
||||||
|
|
||||||
# Codemirror
|
# Codemirror
|
||||||
- (^|/)[Cc]ode[Mm]irror/(lib|mode|theme|addon|keymap)
|
- (^|/)[Cc]ode[Mm]irror/(\d+\.\d+/)?(lib|mode|theme|addon|keymap|demo)
|
||||||
|
|
||||||
# SyntaxHighlighter - http://alexgorbatchev.com/
|
# SyntaxHighlighter - http://alexgorbatchev.com/
|
||||||
- (^|/)shBrush([^.]*)\.js$
|
- (^|/)shBrush([^.]*)\.js$
|
||||||
@@ -140,6 +185,9 @@
|
|||||||
|
|
||||||
## Python ##
|
## Python ##
|
||||||
|
|
||||||
|
# Sphinx
|
||||||
|
- (^|/)docs?/_?(build|themes?|templates?|static)/
|
||||||
|
|
||||||
# django
|
# django
|
||||||
- (^|/)admin_media/
|
- (^|/)admin_media/
|
||||||
|
|
||||||
@@ -154,12 +202,31 @@
|
|||||||
|
|
||||||
## Obj-C ##
|
## Obj-C ##
|
||||||
|
|
||||||
|
# Xcode
|
||||||
|
|
||||||
|
- \.xctemplate/
|
||||||
|
- \.imageset/
|
||||||
|
|
||||||
|
# Carthage
|
||||||
|
- ^Carthage/
|
||||||
|
|
||||||
# Cocoapods
|
# Cocoapods
|
||||||
- ^Pods/
|
- ^Pods/
|
||||||
|
|
||||||
# Sparkle
|
# Sparkle
|
||||||
- (^|/)Sparkle/
|
- (^|/)Sparkle/
|
||||||
|
|
||||||
|
# Crashlytics
|
||||||
|
- Crashlytics.framework/
|
||||||
|
|
||||||
|
# Fabric
|
||||||
|
- Fabric.framework/
|
||||||
|
|
||||||
|
# git config files
|
||||||
|
- gitattributes$
|
||||||
|
- gitignore$
|
||||||
|
- gitmodules$
|
||||||
|
|
||||||
## Groovy ##
|
## Groovy ##
|
||||||
|
|
||||||
# Gradle
|
# Gradle
|
||||||
@@ -204,21 +271,9 @@
|
|||||||
# Html5shiv
|
# Html5shiv
|
||||||
- (^|/)html5shiv\.js$
|
- (^|/)html5shiv\.js$
|
||||||
|
|
||||||
# Samples folders
|
|
||||||
- ^[Ss]amples/
|
|
||||||
|
|
||||||
# LICENSE, README, git config files
|
|
||||||
- ^COPYING$
|
|
||||||
- LICENSE$
|
|
||||||
- License$
|
|
||||||
- gitattributes$
|
|
||||||
- gitignore$
|
|
||||||
- gitmodules$
|
|
||||||
- ^README$
|
|
||||||
- ^readme$
|
|
||||||
|
|
||||||
# Test fixtures
|
# Test fixtures
|
||||||
- ^[Tt]est/fixtures/
|
- ^[Tt]ests?/fixtures/
|
||||||
|
- ^[Ss]pecs?/fixtures/
|
||||||
|
|
||||||
# PhoneGap/Cordova
|
# PhoneGap/Cordova
|
||||||
- (^|/)cordova([^.]*)\.js$
|
- (^|/)cordova([^.]*)\.js$
|
||||||
@@ -230,7 +285,7 @@
|
|||||||
# Vagrant
|
# Vagrant
|
||||||
- ^Vagrantfile$
|
- ^Vagrantfile$
|
||||||
|
|
||||||
# .DS_Store's
|
# .DS_Stores
|
||||||
- .[Dd][Ss]_[Ss]tore$
|
- .[Dd][Ss]_[Ss]tore$
|
||||||
|
|
||||||
# R packages
|
# R packages
|
||||||
@@ -248,3 +303,12 @@
|
|||||||
# ProGuard
|
# ProGuard
|
||||||
- proguard.pro
|
- proguard.pro
|
||||||
- proguard-rules.pro
|
- proguard-rules.pro
|
||||||
|
|
||||||
|
# PuPHPet
|
||||||
|
- ^puphpet/
|
||||||
|
|
||||||
|
# Android Google APIs
|
||||||
|
- (^|/)\.google_apis/
|
||||||
|
|
||||||
|
# Jenkins Pipeline
|
||||||
|
- ^Jenkinsfile$
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
module Linguist
|
module Linguist
|
||||||
VERSION = "4.2.6"
|
VERSION = "4.7.6"
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"repository": "https://github.com/github/linguist",
|
"repository": "https://github.com/github/linguist",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"season": "~>3.0"
|
"season": "~>5.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
58
samples/AMPL/CT2.mod
Normal file
58
samples/AMPL/CT2.mod
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
param num_beams; # number of beams
|
||||||
|
|
||||||
|
param num_rows >= 1, integer; # number of rows
|
||||||
|
param num_cols >= 1, integer; # number of columns
|
||||||
|
|
||||||
|
set BEAMS := 1 .. num_beams; # set of beams
|
||||||
|
|
||||||
|
set ROWS := 1 .. num_rows; # set of rows
|
||||||
|
set COLUMNS := 1 .. num_cols; # set of columns
|
||||||
|
|
||||||
|
# values for entries of each beam
|
||||||
|
param beam_values {BEAMS, ROWS, COLUMNS} >= 0;
|
||||||
|
|
||||||
|
# values of tumor
|
||||||
|
param tumor_values {ROWS, COLUMNS} >= 0;
|
||||||
|
|
||||||
|
# values of critical area
|
||||||
|
param critical_values {ROWS, COLUMNS} >= 0;
|
||||||
|
|
||||||
|
# critical maximum dosage requirement
|
||||||
|
param critical_max;
|
||||||
|
|
||||||
|
# tumor minimum dosage requirement
|
||||||
|
param tumor_min;
|
||||||
|
|
||||||
|
# dosage scalar of each beam
|
||||||
|
var X {i in BEAMS} >= 0;
|
||||||
|
|
||||||
|
|
||||||
|
# define the tumor area which includes the locations where tumor exists
|
||||||
|
set tumor_area := {k in ROWS, h in COLUMNS: tumor_values[k,h] > 0};
|
||||||
|
|
||||||
|
# define critical area
|
||||||
|
set critical_area := {k in ROWS, h in COLUMNS: critical_values[k,h] > 0};
|
||||||
|
|
||||||
|
var S {(k,h) in tumor_area} >= 0;
|
||||||
|
var T {(k,h) in critical_area} >= 0;
|
||||||
|
|
||||||
|
# maximize total dosage in tumor area
|
||||||
|
maximize total_tumor_dosage: sum {i in BEAMS} sum {(k,h) in tumor_area} X[i] * beam_values[i,k,h];
|
||||||
|
|
||||||
|
# minimize total dosage in critical area
|
||||||
|
minimize total_critical_dosage: sum {i in BEAMS} sum {(k,h) in critical_area} X[i] * beam_values[i,k,h];
|
||||||
|
|
||||||
|
# minimize total tumor slack
|
||||||
|
minimize total_tumor_slack: sum {(k,h) in tumor_area} S[k,h];
|
||||||
|
|
||||||
|
# minimize total critical area slack
|
||||||
|
minimize total_critical_slack: sum {(k,h) in critical_area} T[k,h];
|
||||||
|
|
||||||
|
# total dosage at each tumor location [k,h] should be >= min tumor dosage with slack variable
|
||||||
|
subject to tumor_limit {(k,h) in tumor_area} : sum {i in BEAMS} X[i] * beam_values[i,k,h] == tumor_min - S[k,h];
|
||||||
|
|
||||||
|
# total dosage at each critical location [k,h] should be = max critical dosage with slack variable
|
||||||
|
subject to critical_limit {(k,h) in critical_area} : sum {i in BEAMS} X[i] * beam_values[i,k,h] == critical_max + T[k,h];
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
25
samples/AMPL/toy.ampl
Normal file
25
samples/AMPL/toy.ampl
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
# A toy knapsack problem from the LocalSolver docs written in AMPL.
|
||||||
|
|
||||||
|
set I;
|
||||||
|
param Value{I};
|
||||||
|
param Weight{I};
|
||||||
|
param KnapsackBound;
|
||||||
|
var Take{I} binary;
|
||||||
|
|
||||||
|
maximize TotalValue: sum{i in I} Take[i] * Value[i];
|
||||||
|
s.t. WeightLimit: sum{i in I} Take[i] * Weight[i] <= KnapsackBound;
|
||||||
|
|
||||||
|
data;
|
||||||
|
|
||||||
|
param:
|
||||||
|
I: Weight Value :=
|
||||||
|
0 10 1
|
||||||
|
1 60 10
|
||||||
|
2 30 15
|
||||||
|
3 40 40
|
||||||
|
4 30 60
|
||||||
|
5 20 90
|
||||||
|
6 20 100
|
||||||
|
7 2 15;
|
||||||
|
|
||||||
|
param KnapsackBound := 102;
|
||||||
55
samples/API Blueprint/actions.apib
Normal file
55
samples/API Blueprint/actions.apib
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
FORMAT: 1A
|
||||||
|
|
||||||
|
# Advanced Action API
|
||||||
|
A resource action is – in fact – a state transition. This API example demonstrates an action - state transition - to another resource.
|
||||||
|
|
||||||
|
## API Blueprint
|
||||||
|
+ [Previous: Resource Model](11.%20Resource%20Model.md)
|
||||||
|
+ [This: Raw API Blueprint](https://raw.github.com/apiaryio/api-blueprint/master/examples/11.%20Advanced%20Action.md)
|
||||||
|
|
||||||
|
# Tasks [/tasks/tasks{?status,priority}]
|
||||||
|
|
||||||
|
+ Parameters
|
||||||
|
+ status (string)
|
||||||
|
+ priority (number)
|
||||||
|
|
||||||
|
## List All Tasks [GET]
|
||||||
|
|
||||||
|
+ Response 200 (application/json)
|
||||||
|
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"id": 123,
|
||||||
|
"name": "Exercise in gym",
|
||||||
|
"done": false,
|
||||||
|
"type": "task"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 124,
|
||||||
|
"name": "Shop for groceries",
|
||||||
|
"done": true,
|
||||||
|
"type": "task"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
## Retrieve Task [GET /task/{id}]
|
||||||
|
This is a state transition to another resource
|
||||||
|
|
||||||
|
+ Parameters
|
||||||
|
+ id (string)
|
||||||
|
|
||||||
|
+ Response 200 (application/json)
|
||||||
|
|
||||||
|
{
|
||||||
|
"id": 123,
|
||||||
|
"name": "Go to gym",
|
||||||
|
"done": false,
|
||||||
|
"type": "task"
|
||||||
|
}
|
||||||
|
|
||||||
|
## Delete Task [DELETE /task/{id}]
|
||||||
|
|
||||||
|
+ Parameters
|
||||||
|
+ id (string)
|
||||||
|
|
||||||
|
+ Response 204
|
||||||
39
samples/API Blueprint/attributes.apib
Normal file
39
samples/API Blueprint/attributes.apib
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
FORMAT: 1A
|
||||||
|
|
||||||
|
# Attributes API
|
||||||
|
This API example demonstrates how to describe body attributes of a request or response message.
|
||||||
|
|
||||||
|
In this case, the description is complementary (and duplicate!) to the provided JSON example in the body section. The [Advanced Attributes](09.%20Advanced%20Attributes.md) API example will demonstrate how to avoid duplicates and how to reuse attributes descriptions.
|
||||||
|
|
||||||
|
## API Blueprint
|
||||||
|
+ [Previous: Parameters](07.%20Parameters.md)
|
||||||
|
+ [This: Raw API Blueprint](https://raw.github.com/apiaryio/api-blueprint/master/examples/08.%20Attributes.md)
|
||||||
|
+ [Next: Advanced Attributes](09.%20Advanced%20Attributes.md)
|
||||||
|
|
||||||
|
# Group Coupons
|
||||||
|
|
||||||
|
## Coupon [/coupons/{id}]
|
||||||
|
A coupon contains information about a percent-off or amount-off discount you might want to apply to a customer.
|
||||||
|
|
||||||
|
### Retrieve a Coupon [GET]
|
||||||
|
Retrieves the coupon with the given ID.
|
||||||
|
|
||||||
|
+ Response 200 (application/json)
|
||||||
|
|
||||||
|
+ Attributes (object)
|
||||||
|
+ id: 250FF (string)
|
||||||
|
+ created: 1415203908 (number) - Time stamp
|
||||||
|
+ percent_off: 25 (number)
|
||||||
|
|
||||||
|
A positive integer between 1 and 100 that represents the discount the coupon will apply.
|
||||||
|
|
||||||
|
+ redeem_by (number) - Date after which the coupon can no longer be redeemed
|
||||||
|
|
||||||
|
+ Body
|
||||||
|
|
||||||
|
{
|
||||||
|
"id": "250FF",
|
||||||
|
"created": 1415203908,
|
||||||
|
"percent_off": 25,
|
||||||
|
"redeem_by:" null
|
||||||
|
}
|
||||||
18
samples/API Blueprint/simple.apib
Normal file
18
samples/API Blueprint/simple.apib
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
FORMAT: 1A
|
||||||
|
|
||||||
|
# The Simplest API
|
||||||
|
This is one of the simplest APIs written in the **API Blueprint**.
|
||||||
|
One plain resource combined with a method and that's it! We will explain what is going on in the next installment - [Resource and Actions](02.%20Resource%20and%20Actions.md).
|
||||||
|
|
||||||
|
**Note:** As we progress through the examples, do not also forget to view the [Raw](https://raw.github.com/apiaryio/api-blueprint/master/examples/01.%20Simplest%20API.md) code to see what is really going on in the API Blueprint, as opposed to just seeing the output of the Github Markdown parser.
|
||||||
|
|
||||||
|
Also please keep in mind that every single example in this course is a **real API Blueprint** and as such you can **parse** it with the [API Blueprint parser](https://github.com/apiaryio/drafter) or one of its [bindings](https://github.com/apiaryio/drafter#bindings).
|
||||||
|
|
||||||
|
## API Blueprint
|
||||||
|
+ [This: Raw API Blueprint](https://raw.github.com/apiaryio/api-blueprint/master/examples/01.%20Simplest%20API.md)
|
||||||
|
+ [Next: Resource and Actions](02.%20Resource%20and%20Actions.md)
|
||||||
|
|
||||||
|
# GET /message
|
||||||
|
+ Response 200 (text/plain)
|
||||||
|
|
||||||
|
Hello World!
|
||||||
@@ -1,215 +0,0 @@
|
|||||||
%{
|
|
||||||
#include "./../ATEXT/atextfun.hats"
|
|
||||||
%}
|
|
||||||
|
|
||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
|
|
||||||
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
|
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
||||||
|
|
||||||
<head>
|
|
||||||
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
|
|
||||||
<title>EFFECTIVATS-DiningPhil2</title>
|
|
||||||
#patscode_style()
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body>
|
|
||||||
|
|
||||||
<h1>
|
|
||||||
Effective ATS: Dining Philosophers
|
|
||||||
</h1>
|
|
||||||
|
|
||||||
In this article, I present an implementation of a slight variant of the
|
|
||||||
famous problem of 5-Dining-Philosophers by Dijkstra that makes simple but
|
|
||||||
convincing use of linear types.
|
|
||||||
|
|
||||||
<h2>
|
|
||||||
The Original Problem
|
|
||||||
</h2>
|
|
||||||
|
|
||||||
There are five philosophers sitting around a table and there are also 5
|
|
||||||
forks placed on the table such that each fork is located between the left
|
|
||||||
hand of a philosopher and the right hand of another philosopher. Each
|
|
||||||
philosopher does the following routine repeatedly: thinking and dining. In
|
|
||||||
order to dine, a philosopher needs to first acquire two forks: one located
|
|
||||||
on his left-hand side and the other on his right-hand side. After
|
|
||||||
finishing dining, a philosopher puts the two acquired forks onto the table:
|
|
||||||
one on his left-hand side and the other on his right-hand side.
|
|
||||||
|
|
||||||
<h2>
|
|
||||||
A Variant of the Original Problem
|
|
||||||
</h2>
|
|
||||||
|
|
||||||
The following twist is added to the original version:
|
|
||||||
|
|
||||||
<p>
|
|
||||||
|
|
||||||
After a fork is used, it becomes a "dirty" fork and needs to be put in a
|
|
||||||
tray for dirty forks. There is a cleaner who cleans dirty forks and then
|
|
||||||
puts them back on the table.
|
|
||||||
|
|
||||||
<h2>
|
|
||||||
Channels for Communication
|
|
||||||
</h2>
|
|
||||||
|
|
||||||
A channel is just a shared queue of fixed capacity. The following two
|
|
||||||
functions are for inserting an element into and taking an element out of a
|
|
||||||
given channel:
|
|
||||||
|
|
||||||
<pre
|
|
||||||
class="patsyntax">
|
|
||||||
#pats2xhtml_sats("\
|
|
||||||
fun{a:vt0p} channel_insert (channel (a), a): void
|
|
||||||
fun{a:vt0p} channel_takeout (chan: channel (a)): (a)
|
|
||||||
")</pre>
|
|
||||||
|
|
||||||
If [channel_insert] is called on a channel that is full, then the caller is
|
|
||||||
blocked until an element is taken out of the channel. If [channel_takeout]
|
|
||||||
is called on a channel that is empty, then the caller is blocked until an
|
|
||||||
element is inserted into the channel.
|
|
||||||
|
|
||||||
<h2>
|
|
||||||
A Channel for Each Fork
|
|
||||||
</h2>
|
|
||||||
|
|
||||||
Forks are resources given a linear type. Each fork is initially stored in a
|
|
||||||
channel, which can be obtained by calling the following function:
|
|
||||||
|
|
||||||
<pre
|
|
||||||
class="patsyntax">
|
|
||||||
#pats2xhtml_sats("\
|
|
||||||
fun fork_changet (n: nphil): channel(fork)
|
|
||||||
")</pre>
|
|
||||||
|
|
||||||
where the type [nphil] is defined to be [natLt(5)] (for natural numbers
|
|
||||||
less than 5). The channels for storing forks are chosen to be of capacity
|
|
||||||
2. The reason that channels of capacity 2 are chosen to store at most one
|
|
||||||
element (in each of them) is to guarantee that these channels can never be
|
|
||||||
full (so that there is no attempt made to send signals to awake callers
|
|
||||||
supposedly being blocked due to channels being full).
|
|
||||||
|
|
||||||
|
|
||||||
<h2>
|
|
||||||
A Channel for the Fork Tray
|
|
||||||
</h2>
|
|
||||||
|
|
||||||
A tray for storing "dirty" forks is also a channel, which can be obtained
|
|
||||||
by calling the following function:
|
|
||||||
|
|
||||||
<pre
|
|
||||||
class="patsyntax">
|
|
||||||
#pats2xhtml_sats("\
|
|
||||||
fun forktray_changet ((*void*)): channel(fork)
|
|
||||||
")</pre>
|
|
||||||
|
|
||||||
The capacity chosen for the channel is 6 (instead of 5) so that it can
|
|
||||||
never become full (as there are only 5 forks in total).
|
|
||||||
|
|
||||||
<h2>
|
|
||||||
Philosopher Loop
|
|
||||||
</h2>
|
|
||||||
|
|
||||||
Each philosopher is implemented as a loop:
|
|
||||||
|
|
||||||
<pre
|
|
||||||
class="patsyntax">
|
|
||||||
#pats2xhtml_dats('\
|
|
||||||
implement
|
|
||||||
phil_loop (n) = let
|
|
||||||
//
|
|
||||||
val () = phil_think (n)
|
|
||||||
//
|
|
||||||
val nl = phil_left (n) // = n
|
|
||||||
val nr = phil_right (n) // = (n+1) % 5
|
|
||||||
//
|
|
||||||
val ch_lfork = fork_changet (nl)
|
|
||||||
val ch_rfork = fork_changet (nr)
|
|
||||||
//
|
|
||||||
val lf = channel_takeout (ch_lfork)
|
|
||||||
val () = println! ("phil_loop(", n, ") picks left fork")
|
|
||||||
//
|
|
||||||
val () = randsleep (2) // sleep up to 2 seconds
|
|
||||||
//
|
|
||||||
val rf = channel_takeout (ch_rfork)
|
|
||||||
val () = println! ("phil_loop(", n, ") picks right fork")
|
|
||||||
//
|
|
||||||
val () = phil_dine (n, lf, rf)
|
|
||||||
//
|
|
||||||
val ch_forktray = forktray_changet ()
|
|
||||||
val () = channel_insert (ch_forktray, lf) // left fork to dirty tray
|
|
||||||
val () = channel_insert (ch_forktray, rf) // right fork to dirty tray
|
|
||||||
//
|
|
||||||
in
|
|
||||||
phil_loop (n)
|
|
||||||
end // end of [phil_loop]
|
|
||||||
')</pre>
|
|
||||||
|
|
||||||
It should be straighforward to follow the code for [phil_loop].
|
|
||||||
|
|
||||||
<h2>
|
|
||||||
Fork Cleaner Loop
|
|
||||||
</h2>
|
|
||||||
|
|
||||||
A cleaner is implemented as a loop:
|
|
||||||
|
|
||||||
<pre
|
|
||||||
class="patsyntax">
|
|
||||||
#pats2xhtml_dats('\
|
|
||||||
implement
|
|
||||||
cleaner_loop () = let
|
|
||||||
//
|
|
||||||
val ch = forktray_changet ()
|
|
||||||
val f0 = channel_takeout (ch) // [f0] is dirty
|
|
||||||
//
|
|
||||||
val () = cleaner_wash (f0) // washes dirty [f0]
|
|
||||||
val () = cleaner_return (f0) // puts back cleaned [f0]
|
|
||||||
//
|
|
||||||
in
|
|
||||||
cleaner_loop ()
|
|
||||||
end // end of [cleaner_loop]
|
|
||||||
')</pre>
|
|
||||||
|
|
||||||
The function [cleaner_return] first finds out the number of a given fork
|
|
||||||
and then uses the number to locate the channel for storing the fork. Its
|
|
||||||
actual implementation is given as follows:
|
|
||||||
|
|
||||||
<pre
|
|
||||||
class="patsyntax">
|
|
||||||
#pats2xhtml_dats('\
|
|
||||||
implement
|
|
||||||
cleaner_return (f) =
|
|
||||||
{
|
|
||||||
val n = fork_get_num (f)
|
|
||||||
val ch = fork_changet (n)
|
|
||||||
val () = channel_insert (ch, f)
|
|
||||||
}
|
|
||||||
')</pre>
|
|
||||||
|
|
||||||
It should now be straighforward to follow the code for [cleaner_loop].
|
|
||||||
|
|
||||||
<h2>
|
|
||||||
Testing
|
|
||||||
</h2>
|
|
||||||
|
|
||||||
The entire code of this implementation is stored in the following files:
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
DiningPhil2.sats
|
|
||||||
DiningPhil2.dats
|
|
||||||
DiningPhil2_fork.dats
|
|
||||||
DiningPhil2_thread.dats
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
There is also a Makefile available for compiling the ATS source code into
|
|
||||||
an excutable for testing. One should be able to encounter a deadlock after
|
|
||||||
running the simulation for a while.
|
|
||||||
|
|
||||||
<hr size="2">
|
|
||||||
|
|
||||||
This article is written by <a href="http://www.cs.bu.edu/~hwxi/">Hongwei Xi</a>.
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
|
|
||||||
%{
|
|
||||||
implement main () = fprint_filsub (stdout_ref, "main_atxt.txt")
|
|
||||||
%}
|
|
||||||
17
samples/ApacheConf/apache.vhost
Normal file
17
samples/ApacheConf/apache.vhost
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
#######################
|
||||||
|
# HOSTNAME
|
||||||
|
######################
|
||||||
|
|
||||||
|
<VirtualHost 127.0.0.1:PORT>
|
||||||
|
ServerAdmin patrick@heysparkbox.com
|
||||||
|
DocumentRoot "/var/www/HOSTNAME"
|
||||||
|
ServerName HOSTNAME
|
||||||
|
|
||||||
|
<Directory "/var/www/HOSTNAME">
|
||||||
|
Options Indexes MultiViews FollowSymLinks
|
||||||
|
AllowOverride All
|
||||||
|
Order allow,deny
|
||||||
|
Allow from all
|
||||||
|
DirectoryIndex index.php
|
||||||
|
</Directory>
|
||||||
|
</VirtualHost>
|
||||||
@@ -1,6 +1,9 @@
|
|||||||
AsciiDoc Home Page
|
AsciiDoc Home Page
|
||||||
==================
|
==================
|
||||||
|
|
||||||
|
Title
|
||||||
|
-----
|
||||||
|
|
||||||
Example Articles
|
Example Articles
|
||||||
~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~
|
||||||
- Item 1
|
- Item 1
|
||||||
|
|||||||
2841
samples/Assembly/forth.nasm
Normal file
2841
samples/Assembly/forth.nasm
Normal file
File diff suppressed because it is too large
Load Diff
245
samples/Assembly/fp_sqr32_160_comba.inc
Normal file
245
samples/Assembly/fp_sqr32_160_comba.inc
Normal file
@@ -0,0 +1,245 @@
|
|||||||
|
|
||||||
|
push r2
|
||||||
|
dint
|
||||||
|
nop
|
||||||
|
bis #MPYDLYWRTEN,&MPY32CTL0
|
||||||
|
bic #MPYDLY32,&MPY32CTL0
|
||||||
|
mov #SUMEXT,r13
|
||||||
|
clr r12
|
||||||
|
|
||||||
|
mov @r15+,r4
|
||||||
|
mov @r15+,r5
|
||||||
|
|
||||||
|
mov @r15+,r6
|
||||||
|
mov @r15+,r7
|
||||||
|
|
||||||
|
mov @r15+,r8
|
||||||
|
mov @r15+,r9
|
||||||
|
|
||||||
|
mov @r15+,r10
|
||||||
|
mov @r15+,r11
|
||||||
|
|
||||||
|
sub #2*8,r15
|
||||||
|
|
||||||
|
/* SELF_STEP_FIRST */
|
||||||
|
mov r4,&MPY32L
|
||||||
|
mov r5,&MPY32H
|
||||||
|
mov r4,&OP2L
|
||||||
|
mov r5,&OP2H
|
||||||
|
|
||||||
|
/* COLUMN_END */
|
||||||
|
mov &RES0,2*0(r14)
|
||||||
|
mov &RES1,2*(0+1)(r14)
|
||||||
|
mov &RES2,&RES0
|
||||||
|
mov &RES3,&RES1
|
||||||
|
mov r12,&RES2
|
||||||
|
clr &RES3
|
||||||
|
|
||||||
|
/* STEP_1 */
|
||||||
|
mov r4,&MAC32L
|
||||||
|
mov r5,&MAC32H
|
||||||
|
mov r6,&OP2L
|
||||||
|
mov r7,&OP2H
|
||||||
|
add &SUMEXT,r12
|
||||||
|
mov r6,&OP2L
|
||||||
|
mov r7,&OP2H
|
||||||
|
|
||||||
|
/* COLUMN_END */
|
||||||
|
mov &RES0,2*2(r14)
|
||||||
|
add @r13,r12
|
||||||
|
mov &RES1,2*(2+1)(r14)
|
||||||
|
mov &RES2,&RES0
|
||||||
|
mov &RES3,&RES1
|
||||||
|
mov r12,&RES2
|
||||||
|
clr &RES3
|
||||||
|
clr r12
|
||||||
|
|
||||||
|
/* STEP_1 */
|
||||||
|
mov r4,&MAC32L
|
||||||
|
mov r5,&MAC32H
|
||||||
|
mov r8,&OP2L
|
||||||
|
mov r9,&OP2H
|
||||||
|
add &SUMEXT,r12
|
||||||
|
mov r8,&OP2L
|
||||||
|
mov r9,&OP2H
|
||||||
|
|
||||||
|
/* SELF_STEP */
|
||||||
|
mov r6,&MAC32L
|
||||||
|
mov r7,&MAC32H
|
||||||
|
add @r13,r12
|
||||||
|
mov r6,&OP2L
|
||||||
|
mov r7,&OP2H
|
||||||
|
|
||||||
|
/* COLUMN_END */
|
||||||
|
mov &RES0,2*4(r14)
|
||||||
|
add @r13,r12
|
||||||
|
mov &RES1,2*(4+1)(r14)
|
||||||
|
mov &RES2,&RES0
|
||||||
|
mov &RES3,&RES1
|
||||||
|
mov r12,&RES2
|
||||||
|
clr &RES3
|
||||||
|
clr r12
|
||||||
|
|
||||||
|
/* STEP_1 */
|
||||||
|
mov r4,&MAC32L
|
||||||
|
mov r5,&MAC32H
|
||||||
|
mov r10,&OP2L
|
||||||
|
mov r11,&OP2H
|
||||||
|
add &SUMEXT,r12
|
||||||
|
mov r10,&OP2L
|
||||||
|
mov r11,&OP2H
|
||||||
|
|
||||||
|
/* STEP_2MORE */
|
||||||
|
mov r6,&MAC32L
|
||||||
|
mov r7,&MAC32H
|
||||||
|
add @r13,r12
|
||||||
|
mov r8,&OP2L
|
||||||
|
mov r9,&OP2H
|
||||||
|
add &SUMEXT,r12
|
||||||
|
mov r8,&OP2L
|
||||||
|
mov r9,&OP2H
|
||||||
|
|
||||||
|
/* COLUMN_END */
|
||||||
|
mov &RES0,2*6(r14)
|
||||||
|
add @r13,r12
|
||||||
|
mov &RES1,2*(6+1)(r14)
|
||||||
|
mov &RES2,&RES0
|
||||||
|
mov &RES3,&RES1
|
||||||
|
mov r12,&RES2
|
||||||
|
clr &RES3
|
||||||
|
clr r12
|
||||||
|
|
||||||
|
/* STEP_1 */
|
||||||
|
mov r4,&MAC32L
|
||||||
|
mov r5,&MAC32H
|
||||||
|
mov 2*8(r15),&OP2L
|
||||||
|
mov 2*9(r15),&OP2H
|
||||||
|
add &SUMEXT,r12
|
||||||
|
mov 2*8(r15),&OP2L
|
||||||
|
mov 2*9(r15),&OP2H
|
||||||
|
|
||||||
|
/* STEP_2MORE */
|
||||||
|
mov r6,&MAC32L
|
||||||
|
mov r7,&MAC32H
|
||||||
|
add @r13,r12
|
||||||
|
mov r10,&OP2L
|
||||||
|
mov r11,&OP2H
|
||||||
|
add &SUMEXT,r12
|
||||||
|
mov r10,&OP2L
|
||||||
|
mov r11,&OP2H
|
||||||
|
|
||||||
|
/* SELF_STEP */
|
||||||
|
mov r8,&MAC32L
|
||||||
|
mov r9,&MAC32H
|
||||||
|
add @r13,r12
|
||||||
|
mov r8,&OP2L
|
||||||
|
mov r9,&OP2H
|
||||||
|
|
||||||
|
/* COLUMN_END */
|
||||||
|
mov &RES0,2*8(r14)
|
||||||
|
add @r13,r12
|
||||||
|
mov &RES1,2*(8+1)(r14)
|
||||||
|
mov &RES2,&RES0
|
||||||
|
mov &RES3,&RES1
|
||||||
|
mov r12,&RES2
|
||||||
|
clr &RES3
|
||||||
|
clr r12
|
||||||
|
|
||||||
|
mov 2*8(r15),r4
|
||||||
|
mov 2*(8+1)(r15),r5
|
||||||
|
|
||||||
|
/* STEP_1 */
|
||||||
|
mov r6,&MAC32L
|
||||||
|
mov r7,&MAC32H
|
||||||
|
mov r4,&OP2L
|
||||||
|
mov r5,&OP2H
|
||||||
|
add &SUMEXT,r12
|
||||||
|
mov r4,&OP2L
|
||||||
|
mov r5,&OP2H
|
||||||
|
|
||||||
|
/* STEP_2MORE */
|
||||||
|
mov r8,&MAC32L
|
||||||
|
mov r9,&MAC32H
|
||||||
|
add @r13,r12
|
||||||
|
mov r10,&OP2L
|
||||||
|
mov r11,&OP2H
|
||||||
|
add &SUMEXT,r12
|
||||||
|
mov r10,&OP2L
|
||||||
|
mov r11,&OP2H
|
||||||
|
|
||||||
|
/* COLUMN_END */
|
||||||
|
mov &RES0,2*10(r14)
|
||||||
|
add @r13,r12
|
||||||
|
mov &RES1,2*(10+1)(r14)
|
||||||
|
mov &RES2,&RES0
|
||||||
|
mov &RES3,&RES1
|
||||||
|
mov r12,&RES2
|
||||||
|
clr &RES3
|
||||||
|
clr r12
|
||||||
|
|
||||||
|
/* STEP_1 */
|
||||||
|
mov r8,&MAC32L
|
||||||
|
mov r9,&MAC32H
|
||||||
|
mov r4,&OP2L
|
||||||
|
mov r5,&OP2H
|
||||||
|
add &SUMEXT,r12
|
||||||
|
mov r4,&OP2L
|
||||||
|
mov r5,&OP2H
|
||||||
|
|
||||||
|
/* SELF_STEP */
|
||||||
|
mov r10,&MAC32L
|
||||||
|
mov r11,&MAC32H
|
||||||
|
add @r13,r12
|
||||||
|
mov r10,&OP2L
|
||||||
|
mov r11,&OP2H
|
||||||
|
|
||||||
|
/* COLUMN_END */
|
||||||
|
mov &RES0,2*12(r14)
|
||||||
|
add @r13,r12
|
||||||
|
mov &RES1,2*(12+1)(r14)
|
||||||
|
mov &RES2,&RES0
|
||||||
|
mov &RES3,&RES1
|
||||||
|
mov r12,&RES2
|
||||||
|
clr &RES3
|
||||||
|
clr r12
|
||||||
|
|
||||||
|
/* STEP_1 */
|
||||||
|
mov r10,&MAC32L
|
||||||
|
mov r11,&MAC32H
|
||||||
|
mov r4,&OP2L
|
||||||
|
mov r5,&OP2H
|
||||||
|
add &SUMEXT,r12
|
||||||
|
mov r4,&OP2L
|
||||||
|
mov r5,&OP2H
|
||||||
|
|
||||||
|
/* COLUMN_END */
|
||||||
|
mov &RES0,2*14(r14)
|
||||||
|
add @r13,r12
|
||||||
|
mov &RES1,2*(14+1)(r14)
|
||||||
|
mov &RES2,&RES0
|
||||||
|
mov &RES3,&RES1
|
||||||
|
mov r12,&RES2
|
||||||
|
clr &RES3
|
||||||
|
clr r12
|
||||||
|
|
||||||
|
/* SELF_STEP_1 */
|
||||||
|
mov r4,&MAC32L
|
||||||
|
mov r5,&MAC32H
|
||||||
|
mov r4,&OP2L
|
||||||
|
mov r5,&OP2H
|
||||||
|
|
||||||
|
/* COLUMN_END */
|
||||||
|
mov &RES0,2*16(r14)
|
||||||
|
add @r13,r12
|
||||||
|
mov &RES1,2*(16+1)(r14)
|
||||||
|
mov &RES2,&RES0
|
||||||
|
mov &RES3,&RES1
|
||||||
|
mov r12,&RES2
|
||||||
|
clr &RES3
|
||||||
|
clr r12
|
||||||
|
|
||||||
|
/* END */
|
||||||
|
mov &RES0,2*18(r14)
|
||||||
|
mov &RES1,2*(18+1)(r14)
|
||||||
|
pop r2
|
||||||
|
eint
|
||||||
170
samples/Assembly/lib.inc
Normal file
170
samples/Assembly/lib.inc
Normal file
@@ -0,0 +1,170 @@
|
|||||||
|
|
||||||
|
; ------------------------------------------------------------------------
|
||||||
|
; 显示 AL 中的数字
|
||||||
|
; ------------------------------------------------------------------------
|
||||||
|
DispAL:
|
||||||
|
push ecx
|
||||||
|
push edx
|
||||||
|
push edi
|
||||||
|
|
||||||
|
mov edi, [dwDispPos]
|
||||||
|
|
||||||
|
mov ah, 0Fh ; 0000b: 黑底 1111b: 白字
|
||||||
|
mov dl, al
|
||||||
|
shr al, 4
|
||||||
|
mov ecx, 2
|
||||||
|
.begin:
|
||||||
|
and al, 01111b
|
||||||
|
cmp al, 9
|
||||||
|
ja .1
|
||||||
|
add al, '0'
|
||||||
|
jmp .2
|
||||||
|
.1:
|
||||||
|
sub al, 0Ah
|
||||||
|
add al, 'A'
|
||||||
|
.2:
|
||||||
|
mov [gs:edi], ax
|
||||||
|
add edi, 2
|
||||||
|
|
||||||
|
mov al, dl
|
||||||
|
loop .begin
|
||||||
|
;add edi, 2
|
||||||
|
|
||||||
|
mov [dwDispPos], edi
|
||||||
|
|
||||||
|
pop edi
|
||||||
|
pop edx
|
||||||
|
pop ecx
|
||||||
|
|
||||||
|
ret
|
||||||
|
; DispAL 结束-------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
; ------------------------------------------------------------------------
|
||||||
|
; 显示一个整形数
|
||||||
|
; ------------------------------------------------------------------------
|
||||||
|
DispInt:
|
||||||
|
mov eax, [esp + 4]
|
||||||
|
shr eax, 24
|
||||||
|
call DispAL
|
||||||
|
|
||||||
|
mov eax, [esp + 4]
|
||||||
|
shr eax, 16
|
||||||
|
call DispAL
|
||||||
|
|
||||||
|
mov eax, [esp + 4]
|
||||||
|
shr eax, 8
|
||||||
|
call DispAL
|
||||||
|
|
||||||
|
mov eax, [esp + 4]
|
||||||
|
call DispAL
|
||||||
|
|
||||||
|
mov ah, 07h ; 0000b: 黑底 0111b: 灰字
|
||||||
|
mov al, 'h'
|
||||||
|
push edi
|
||||||
|
mov edi, [dwDispPos]
|
||||||
|
mov [gs:edi], ax
|
||||||
|
add edi, 4
|
||||||
|
mov [dwDispPos], edi
|
||||||
|
pop edi
|
||||||
|
|
||||||
|
ret
|
||||||
|
; DispInt 结束------------------------------------------------------------
|
||||||
|
|
||||||
|
; ------------------------------------------------------------------------
|
||||||
|
; 显示一个字符串
|
||||||
|
; ------------------------------------------------------------------------
|
||||||
|
DispStr:
|
||||||
|
push ebp
|
||||||
|
mov ebp, esp
|
||||||
|
push ebx
|
||||||
|
push esi
|
||||||
|
push edi
|
||||||
|
|
||||||
|
mov esi, [ebp + 8] ; pszInfo
|
||||||
|
mov edi, [dwDispPos]
|
||||||
|
mov ah, 0Fh
|
||||||
|
.1:
|
||||||
|
lodsb
|
||||||
|
test al, al
|
||||||
|
jz .2
|
||||||
|
cmp al, 0Ah ; 是回车吗?
|
||||||
|
jnz .3
|
||||||
|
push eax
|
||||||
|
mov eax, edi
|
||||||
|
mov bl, 160
|
||||||
|
div bl
|
||||||
|
and eax, 0FFh
|
||||||
|
inc eax
|
||||||
|
mov bl, 160
|
||||||
|
mul bl
|
||||||
|
mov edi, eax
|
||||||
|
pop eax
|
||||||
|
jmp .1
|
||||||
|
.3:
|
||||||
|
mov [gs:edi], ax
|
||||||
|
add edi, 2
|
||||||
|
jmp .1
|
||||||
|
|
||||||
|
.2:
|
||||||
|
mov [dwDispPos], edi
|
||||||
|
|
||||||
|
pop edi
|
||||||
|
pop esi
|
||||||
|
pop ebx
|
||||||
|
pop ebp
|
||||||
|
ret
|
||||||
|
; DispStr 结束------------------------------------------------------------
|
||||||
|
|
||||||
|
; ------------------------------------------------------------------------
|
||||||
|
; 换行
|
||||||
|
; ------------------------------------------------------------------------
|
||||||
|
DispReturn:
|
||||||
|
push szReturn
|
||||||
|
call DispStr ;printf("\n");
|
||||||
|
add esp, 4
|
||||||
|
|
||||||
|
ret
|
||||||
|
; DispReturn 结束---------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
; ------------------------------------------------------------------------
|
||||||
|
; 内存拷贝,仿 memcpy
|
||||||
|
; ------------------------------------------------------------------------
|
||||||
|
; void* MemCpy(void* es:pDest, void* ds:pSrc, int iSize);
|
||||||
|
; ------------------------------------------------------------------------
|
||||||
|
MemCpy:
|
||||||
|
push ebp
|
||||||
|
mov ebp, esp
|
||||||
|
|
||||||
|
push esi
|
||||||
|
push edi
|
||||||
|
push ecx
|
||||||
|
|
||||||
|
mov edi, [ebp + 8] ; Destination
|
||||||
|
mov esi, [ebp + 12] ; Source
|
||||||
|
mov ecx, [ebp + 16] ; Counter
|
||||||
|
.1:
|
||||||
|
cmp ecx, 0 ; 判断计数器
|
||||||
|
jz .2 ; 计数器为零时跳出
|
||||||
|
|
||||||
|
mov al, [ds:esi] ; ┓
|
||||||
|
inc esi ; ┃
|
||||||
|
; ┣ 逐字节移动
|
||||||
|
mov byte [es:edi], al ; ┃
|
||||||
|
inc edi ; ┛
|
||||||
|
|
||||||
|
dec ecx ; 计数器减一
|
||||||
|
jmp .1 ; 循环
|
||||||
|
.2:
|
||||||
|
mov eax, [ebp + 8] ; 返回值
|
||||||
|
|
||||||
|
pop ecx
|
||||||
|
pop edi
|
||||||
|
pop esi
|
||||||
|
mov esp, ebp
|
||||||
|
pop ebp
|
||||||
|
|
||||||
|
ret ; 函数结束,返回
|
||||||
|
; MemCpy 结束-------------------------------------------------------------
|
||||||
|
|
||||||
321
samples/Assembly/macros.inc
Normal file
321
samples/Assembly/macros.inc
Normal file
@@ -0,0 +1,321 @@
|
|||||||
|
BLARGG_MACROS_INCLUDED = 1
|
||||||
|
|
||||||
|
; Allows extra error checking with modified version
|
||||||
|
; of ca65. Otherwise acts like a constant of 0.
|
||||||
|
ADDR = 0
|
||||||
|
|
||||||
|
; Switches to Segment and places Line there.
|
||||||
|
; Line can be an .align directive, .res, .byte, etc.
|
||||||
|
; Examples:
|
||||||
|
; seg_data BSS, .align 256
|
||||||
|
; seg_data RODATA, {message: .byte "Test",0}
|
||||||
|
.macro seg_data Segment, Line
|
||||||
|
.pushseg
|
||||||
|
.segment .string(Segment)
|
||||||
|
Line
|
||||||
|
.popseg
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
; Reserves Size bytes in Segment for Name.
|
||||||
|
; If Size is omitted, reserves one byte.
|
||||||
|
.macro seg_res Segment, Name, Size
|
||||||
|
.ifblank Size
|
||||||
|
seg_data Segment, Name: .res 1
|
||||||
|
.else
|
||||||
|
seg_data Segment, Name: .res Size
|
||||||
|
.endif
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
; Shortcuts for zeropage, bss, and stack
|
||||||
|
.define zp_res seg_res ZEROPAGE,
|
||||||
|
.define nv_res seg_res NVRAM,
|
||||||
|
.define bss_res seg_res BSS,
|
||||||
|
.define sp_res seg_res STACK,
|
||||||
|
.define zp_byte zp_res
|
||||||
|
|
||||||
|
; Copies byte from Src to Addr. If Src begins with #,
|
||||||
|
; it sets Addr to the immediate value.
|
||||||
|
; Out: A = byte copied
|
||||||
|
; Preserved: X, Y
|
||||||
|
.macro mov Addr, Src
|
||||||
|
lda Src
|
||||||
|
sta Addr
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
; Copies word from Src to Addr. If Src begins with #,
|
||||||
|
; it sets Addr the immediate value.
|
||||||
|
; Out: A = high byte of word
|
||||||
|
; Preserved: X, Y
|
||||||
|
.macro movw Addr, Src
|
||||||
|
.if .match( .left( 1, {Src} ), # )
|
||||||
|
lda #<(.right( .tcount( {Src} )-1, {Src} ))
|
||||||
|
sta Addr
|
||||||
|
lda #>(.right( .tcount( {Src} )-1, {Src} ))
|
||||||
|
sta 1+(Addr)
|
||||||
|
.else
|
||||||
|
lda Src
|
||||||
|
sta Addr
|
||||||
|
lda 1+(Src)
|
||||||
|
sta 1+(Addr)
|
||||||
|
.endif
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
; Increments 16-bit value at Addr.
|
||||||
|
; Out: EQ/NE based on resulting 16-bit value
|
||||||
|
; Preserved: A, X, Y
|
||||||
|
.macro incw Addr
|
||||||
|
.local @Skip
|
||||||
|
inc Addr
|
||||||
|
bne @Skip
|
||||||
|
inc 1+(Addr)
|
||||||
|
@Skip:
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
; Adds Src to word at Addr.
|
||||||
|
; Out: A = high byte of result, carry set appropriately
|
||||||
|
; Preserved: X, Y
|
||||||
|
.macro addw Addr, Src
|
||||||
|
.if .match( .left( 1, {Src} ), # )
|
||||||
|
addw_ Addr,(.right( .tcount( {Src} )-1, {Src} ))
|
||||||
|
.else
|
||||||
|
lda Addr
|
||||||
|
clc
|
||||||
|
adc Src
|
||||||
|
sta Addr
|
||||||
|
|
||||||
|
lda 1+(Addr)
|
||||||
|
adc 1+(Src)
|
||||||
|
sta 1+(Addr)
|
||||||
|
.endif
|
||||||
|
.endmacro
|
||||||
|
.macro addw_ Addr, Imm
|
||||||
|
lda Addr
|
||||||
|
clc
|
||||||
|
adc #<Imm
|
||||||
|
sta Addr
|
||||||
|
|
||||||
|
;.if (Imm >> 8) <> 0
|
||||||
|
lda 1+(Addr)
|
||||||
|
adc #>Imm
|
||||||
|
sta 1+(Addr)
|
||||||
|
;.else
|
||||||
|
; .local @Skip
|
||||||
|
; bcc @Skip
|
||||||
|
; inc 1+(Addr)
|
||||||
|
;@Skip:
|
||||||
|
;.endif
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
; Splits list of words into tables of low and high bytes
|
||||||
|
; Example: split_words foo, {$1234, $5678}
|
||||||
|
; expands to:
|
||||||
|
; foo_l: $34, $78
|
||||||
|
; foo_h: $12, $56
|
||||||
|
; foo_count = 2
|
||||||
|
.macro split_words Label, Words
|
||||||
|
.ident (.concat (.string(Label), "_l")): .lobytes Words
|
||||||
|
.ident (.concat (.string(Label), "_h")): .hibytes Words
|
||||||
|
.ident (.concat (.string(Label), "_count")) = * - .ident (.concat (.string(Label), "_h"))
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
.macro SELECT Bool, True, False, Extra
|
||||||
|
.ifndef Bool
|
||||||
|
False Extra
|
||||||
|
.elseif Bool <> 0
|
||||||
|
True Extra
|
||||||
|
.else
|
||||||
|
False Extra
|
||||||
|
.endif
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
.macro DEFAULT Name, Value
|
||||||
|
.ifndef Name
|
||||||
|
Name = Value
|
||||||
|
.endif
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
.ifp02
|
||||||
|
; 6502 doesn't define these alternate names
|
||||||
|
.define blt bcc
|
||||||
|
.define bge bcs
|
||||||
|
.endif
|
||||||
|
.define jlt jcc
|
||||||
|
.define jge jcs
|
||||||
|
|
||||||
|
; Jxx Target = Bxx Target, except it can go farther than
|
||||||
|
; 128 bytes. Implemented via branch around a JMP.
|
||||||
|
|
||||||
|
; Don't use ca65's longbranch, because they fail for @labels
|
||||||
|
;.macpack longbranch
|
||||||
|
|
||||||
|
.macro jeq Target
|
||||||
|
bne *+5
|
||||||
|
jmp Target
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
.macro jne Target
|
||||||
|
beq *+5
|
||||||
|
jmp Target
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
.macro jmi Target
|
||||||
|
bpl *+5
|
||||||
|
jmp Target
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
.macro jpl Target
|
||||||
|
bmi *+5
|
||||||
|
jmp Target
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
.macro jcs Target
|
||||||
|
bcc *+5
|
||||||
|
jmp Target
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
.macro jcc Target
|
||||||
|
bcs *+5
|
||||||
|
jmp Target
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
.macro jvs Target
|
||||||
|
bvc *+5
|
||||||
|
jmp Target
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
.macro jvc Target
|
||||||
|
bvs *+5
|
||||||
|
jmp Target
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
|
||||||
|
; Passes constant data to routine in addr
|
||||||
|
; Preserved: A, X, Y
|
||||||
|
.macro jsr_with_addr routine,data
|
||||||
|
.local Addr
|
||||||
|
pha
|
||||||
|
lda #<Addr
|
||||||
|
sta addr
|
||||||
|
lda #>Addr
|
||||||
|
sta addr+1
|
||||||
|
pla
|
||||||
|
jsr routine
|
||||||
|
seg_data RODATA,{Addr: data}
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
; Calls routine multiple times, with A having the
|
||||||
|
; value 'start' the first time, 'start+step' the
|
||||||
|
; second time, up to 'end' for the last time.
|
||||||
|
.macro for_loop routine,start,end,step
|
||||||
|
.local @for_loop
|
||||||
|
lda #start
|
||||||
|
@for_loop:
|
||||||
|
pha
|
||||||
|
jsr routine
|
||||||
|
pla
|
||||||
|
clc
|
||||||
|
adc #step
|
||||||
|
cmp #<((end)+(step))
|
||||||
|
bne @for_loop
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
; Calls routine n times. The value of A in the routine
|
||||||
|
; counts from 0 to n-1.
|
||||||
|
.macro loop_n_times routine,n
|
||||||
|
for_loop routine,0,n-1,+1
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
; Same as for_loop, except uses 16-bit value in YX.
|
||||||
|
; -256 <= step <= 255
|
||||||
|
.macro for_loop16 routine,start,end,step
|
||||||
|
.if (step) < -256 || (step) > 255
|
||||||
|
.error "Step must be within -256 to 255"
|
||||||
|
.endif
|
||||||
|
.local @for_loop_skip
|
||||||
|
.local @for_loop
|
||||||
|
ldy #>(start)
|
||||||
|
lda #<(start)
|
||||||
|
@for_loop:
|
||||||
|
tax
|
||||||
|
pha
|
||||||
|
tya
|
||||||
|
pha
|
||||||
|
jsr routine
|
||||||
|
pla
|
||||||
|
tay
|
||||||
|
pla
|
||||||
|
clc
|
||||||
|
adc #step
|
||||||
|
.if (step) > 0
|
||||||
|
bcc @for_loop_skip
|
||||||
|
iny
|
||||||
|
.else
|
||||||
|
bcs @for_loop_skip
|
||||||
|
dey
|
||||||
|
.endif
|
||||||
|
@for_loop_skip:
|
||||||
|
cmp #<((end)+(step))
|
||||||
|
bne @for_loop
|
||||||
|
cpy #>((end)+(step))
|
||||||
|
bne @for_loop
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
; Stores byte at addr
|
||||||
|
; Preserved: X, Y
|
||||||
|
.macro setb addr, byte
|
||||||
|
lda #byte
|
||||||
|
sta addr
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
; Stores word at addr
|
||||||
|
; Preserved: X, Y
|
||||||
|
.macro setw addr, word
|
||||||
|
lda #<(word)
|
||||||
|
sta addr
|
||||||
|
lda #>(word)
|
||||||
|
sta addr+1
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
; Loads XY with 16-bit immediate or value at address
|
||||||
|
.macro ldxy Arg
|
||||||
|
.if .match( .left( 1, {Arg} ), # )
|
||||||
|
ldy #<(.right( .tcount( {Arg} )-1, {Arg} ))
|
||||||
|
ldx #>(.right( .tcount( {Arg} )-1, {Arg} ))
|
||||||
|
.else
|
||||||
|
ldy (Arg)
|
||||||
|
ldx (Arg)+1
|
||||||
|
.endif
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
; Increments XY as 16-bit register, in CONSTANT time.
|
||||||
|
; Z flag set based on entire result.
|
||||||
|
; Preserved: A
|
||||||
|
; Time: 7 clocks
|
||||||
|
.macro inxy
|
||||||
|
iny ; 2
|
||||||
|
beq *+4 ; 3
|
||||||
|
; -1
|
||||||
|
bne *+3 ; 3
|
||||||
|
; -1
|
||||||
|
inx ; 2
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
; Negates A and adds it to operand
|
||||||
|
.macro subaf Operand
|
||||||
|
eor #$FF
|
||||||
|
sec
|
||||||
|
adc Operand
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
; Initializes CPU registers to reasonable values
|
||||||
|
; Preserved: A, Y
|
||||||
|
.macro init_cpu_regs
|
||||||
|
sei
|
||||||
|
cld ; unnecessary on NES, but might help on clone
|
||||||
|
ldx #$FF
|
||||||
|
txs
|
||||||
|
.ifndef BUILD_NSF
|
||||||
|
inx
|
||||||
|
stx PPUCTRL
|
||||||
|
.endif
|
||||||
|
.endmacro
|
||||||
195
samples/Brainfuck/factor.b
Normal file
195
samples/Brainfuck/factor.b
Normal file
@@ -0,0 +1,195 @@
|
|||||||
|
* factor an arbitrarily large positive integer
|
||||||
|
*
|
||||||
|
* Copyright (C) 1999 by Brian Raiter
|
||||||
|
* under the GNU General Public License
|
||||||
|
|
||||||
|
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>-
|
||||||
|
|
||||||
|
*
|
||||||
|
* read in the number
|
||||||
|
*
|
||||||
|
|
||||||
|
<<<<<<<<<+
|
||||||
|
[-[>>>>>>>>>>][-]<<<<<<<<<<[[->>>>>>>>>>+<<<<<<<<<<]<<<<<<<<<<]
|
||||||
|
>>>>>>>>>>,----------]
|
||||||
|
>>>>>>>>>>[------------------------------------->>>>>>>>>->]
|
||||||
|
<[+>[>>>>>>>>>+>]<-<<<<<<<<<<]-
|
||||||
|
|
||||||
|
*
|
||||||
|
* display the number and initialize the loop variable to two
|
||||||
|
*
|
||||||
|
|
||||||
|
[>++++++++++++++++++++++++++++++++++++++++++++++++.
|
||||||
|
------------------------------------------------<<<<<<<<<<<]
|
||||||
|
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.
|
||||||
|
--------------------------.[-]
|
||||||
|
>>>>>>>>>>>>++<<<<+
|
||||||
|
|
||||||
|
*
|
||||||
|
* the main loop
|
||||||
|
*
|
||||||
|
|
||||||
|
[ [-]>>
|
||||||
|
|
||||||
|
*
|
||||||
|
* make copies of the number and the loop variable
|
||||||
|
*
|
||||||
|
|
||||||
|
[>>>>[-]>[-]>[-]>[-]
|
||||||
|
>[-]>[-]
|
||||||
|
<<<<<<<[->>>+>+<<<<]>>>>>>>>]
|
||||||
|
<<<<<<<<<<[>>>>>>[-<<<<+>>>>]<<<<<<<<<<<<<<<<]>>>>>>>>>>
|
||||||
|
[>[->>>+>>+<<<<<]>>>>>>>>>]
|
||||||
|
<<<<<<<<<<[>>>>>>[-<<<<<+>>>>>]<<<<<<<<<<<<<<<<]>>>>>>>>>>
|
||||||
|
|
||||||
|
*
|
||||||
|
* divide the number by the loop variable
|
||||||
|
*
|
||||||
|
|
||||||
|
[>>>[-]>>>[-]>[-]>>>] initialize
|
||||||
|
<<<<<<<<<<[<<<<<<<<<<]
|
||||||
|
>>>>>>>>>[-]>>>>>>>+<<<<<<<<[+]+
|
||||||
|
[ ->> double divisor until above dividend
|
||||||
|
[>>>>>>[->++<]>>>>]<<<<<<<<<<
|
||||||
|
[>>>>>>>>[-]>[-]
|
||||||
|
<<<<[->>>++<<<]<<<<<<<<<<<<<<<]>>>>>>>>>>
|
||||||
|
[>>>>>>>>[->+<[->+<[->+<[->+<[->+<[->+<[->+<[->+<[->+<
|
||||||
|
[->--------->>>>>>>>>+<<<<<<<<<<[->+<]]]]]]]]]]]>>]
|
||||||
|
<<<<<<<<<<[>>>>>>>>>[-<+<<<+>>>>]<<<<<<<<<<<<<<<<<<<]>>>>>>>>>>
|
||||||
|
[>>>>>>>[-<+>[-<+>[-<+>[-<+>[-<+>[-<+>[-<+>[-<+>[-<+>
|
||||||
|
[-<--------->>>>>>>>>>>+<<<<<<<<<<[-<+>]]]]]]]]]]]>>>]
|
||||||
|
<<<<<<<<<<
|
||||||
|
[>>>>[->>>+>>+<<<<<]<<<<<<<<<<<<<<]
|
||||||
|
>>>>>>>>>>[>>>>>>>[-<<<+>>>]>>>]<<<<<<<<<<
|
||||||
|
[>>>>>>>>[->-<]>
|
||||||
|
[<<<<<<<<<[<[-]>>>>>>>>>>[-<<<<<<<<<<+>>>>>>>>>>]<<<<<<<<<<<<<<<<<<<]
|
||||||
|
>>>>>>>>>>>>>>>>>>>]
|
||||||
|
<<<<<<<<<<<<<<<<<<<]
|
||||||
|
>>>>>>>>>[+[+[+[+[+[+[+[+[+[+[[-]<+>]]]]]]]]]]]<
|
||||||
|
]
|
||||||
|
>>>>>>>>
|
||||||
|
[ subtract divisor from dividend
|
||||||
|
<<<<<<
|
||||||
|
[>>>>>>>>[-]>[-]<<<<<[->>>+>+<<<<]>>>>>>]<<<<<<<<<<
|
||||||
|
[>>>>>>>>[-<<<<+>>>>]<<<[->>>+>+<<<<]<<<<<<<<<<<<<<<]>>>>>>>>>>
|
||||||
|
[>>>>>>>>>[-<<<<+>>>>]>]<<<<<<<<<<
|
||||||
|
[>>>>>>>>[-<->]<<<<<<<<<<<<<<<<<<]>>>>>>>>>>
|
||||||
|
[>>>>>>>[->+<[->+<[->+<[->+<[->+<[->+<[->+<[->+<[->+<[->+<
|
||||||
|
[++++++++++[+>-<]>>>>>>>>>>-<<<<<<<<<<]]]]]]]]]]]>>>]
|
||||||
|
>>>>>>>+
|
||||||
|
[ if difference is nonnegative then
|
||||||
|
[-]<<<<<<<<<<<<<<<<< replace dividend and increment quotient
|
||||||
|
[>>>>[-]>>>>[-<<<<+>>>>]<<[->>+<<]<<<<<<<<<<<<<<<<]>>>>>>>>>>
|
||||||
|
[>>>>>>>>[->+<<<+>>]>>]<<<<<<<<<<
|
||||||
|
[>>>[->>>>>>+<<<<<<]<<<<<<<<<<<<<]>>>>>>>>>>
|
||||||
|
[>>>>>>>>>[-<<<<<<+>>>>>>[-<<<<<<+>>>>>>
|
||||||
|
[-<<<<<<+>>>>>>[-<<<<<<+>>>>>>
|
||||||
|
[-<<<<<<+>>>>>>[-<<<<<<+>>>>>>
|
||||||
|
[-<<<<<<+>>>>>>[-<<<<<<+>>>>>>
|
||||||
|
[-<<<<<<+>>>>>>[-<<<<<<--------->>>>>>>>>>>>>>>>+<<<<<<<<<<
|
||||||
|
[-<<<<<<+>>>>>>]]]]]]]]]]]>]
|
||||||
|
>>>>>>>
|
||||||
|
] halve divisor and loop until zero
|
||||||
|
<<<<<<<<<<<<<<<<<[<<<<<<<<<<]>>>>>>>>>>
|
||||||
|
[>>>>>>>>[-]<<[->+<]<[->>>+<<<]>>>>>]<<<<<<<<<<
|
||||||
|
[+>>>>>>>[-<<<<<<<+>>>>>>>[-<<<<<<<->>>>>>+>
|
||||||
|
[-<<<<<<<+>>>>>>>[-<<<<<<<->>>>>>+>
|
||||||
|
[-<<<<<<<+>>>>>>>[-<<<<<<<->>>>>>+>
|
||||||
|
[-<<<<<<<+>>>>>>>[-<<<<<<<->>>>>>+>
|
||||||
|
[-<<<<<<<+>>>>>>>]]]]]]]]]<<<<<<<
|
||||||
|
[->>>>>>>+<<<<<<<]-<<<<<<<<<<]
|
||||||
|
>>>>>>>
|
||||||
|
[-<<<<<<<<<<<+>>>>>>>>>>>]
|
||||||
|
>>>[>>>>>>>[-<<<<<<<<<<<+++++>>>>>>>>>>>]>>>]<<<<<<<<<<
|
||||||
|
[+>>>>>>>>[-<<<<<<<<+>>>>>>>>[-<<<<<<<<->>>>>+>>>
|
||||||
|
[-<<<<<<<<+>>>>>>>>[-<<<<<<<<->>>>>+>>>
|
||||||
|
[-<<<<<<<<+>>>>>>>>[-<<<<<<<<->>>>>+>>>
|
||||||
|
[-<<<<<<<<+>>>>>>>>[-<<<<<<<<->>>>>+>>>
|
||||||
|
[-<<<<<<<<+>>>>>>>>]]]]]]]]]<<<<<<<<
|
||||||
|
[->>>>>>>>+<<<<<<<<]-<<<<<<<<<<]
|
||||||
|
>>>>>>>>[-<<<<<<<<<<<<<+>>>>>>>>>>>>>]>>
|
||||||
|
[>>>>>>>>[-<<<<<<<<<<<<<+++++>>>>>>>>>>>>>]>>]<<<<<<<<<<
|
||||||
|
[<<<<<<<<<<]>>>>>>>>>>
|
||||||
|
>>>>>>
|
||||||
|
]
|
||||||
|
<<<<<<
|
||||||
|
|
||||||
|
*
|
||||||
|
* make copies of the loop variable and the quotient
|
||||||
|
*
|
||||||
|
|
||||||
|
[>>>[->>>>+>+<<<<<]>>>>>>>]
|
||||||
|
<<<<<<<<<<
|
||||||
|
[>>>>>>>[-<<<<+>>>>]<<<<<[->>>>>+>>+<<<<<<<]<<<<<<<<<<<<]
|
||||||
|
>>>>>>>>>>[>>>>>>>[-<<<<<+>>>>>]>>>]<<<<<<<<<<
|
||||||
|
|
||||||
|
*
|
||||||
|
* break out of the loop if the quotient is larger than the loop variable
|
||||||
|
*
|
||||||
|
|
||||||
|
[>>>>>>>>>[-<->]<
|
||||||
|
[<<<<<<<<
|
||||||
|
[<<[-]>>>>>>>>>>[-<<<<<<<<<<+>>>>>>>>>>]<<<<<<<<<<<<<<<<<<]
|
||||||
|
>>>>>>>>>>>>>>>>>>]<<<<<<<<<<<<<<<<<<]
|
||||||
|
>>>>>>>>[>-<[+[+[+[+[+[+[+[+[+[[-]>+<]]]]]]]]]]]>+
|
||||||
|
|
||||||
|
[ [-]
|
||||||
|
|
||||||
|
*
|
||||||
|
* partially increment the loop variable
|
||||||
|
*
|
||||||
|
|
||||||
|
<[-]+>>>>+>>>>>>>>[>>>>>>>>>>]<<<<<<<<<<
|
||||||
|
|
||||||
|
*
|
||||||
|
* examine the remainder for nonzero digits
|
||||||
|
*
|
||||||
|
|
||||||
|
[<<<<<<[<<<<[<<<<<<<<<<]>>>>+<<<<<<<<<<]<<<<]
|
||||||
|
>>>>>>>>>>>>>>>>>>>>[>>>>>>>>>>]<<<<<<<<<<[<<<<<<<<<<]
|
||||||
|
>>>>-
|
||||||
|
|
||||||
|
[ [+]
|
||||||
|
|
||||||
|
*
|
||||||
|
* decrement the loop variable and replace the number with the quotient
|
||||||
|
*
|
||||||
|
|
||||||
|
>>>>>>>>-<<[>[-]>>[-<<+>>]>>>>>>>]<<<<<<<<<<
|
||||||
|
|
||||||
|
*
|
||||||
|
* display the loop variable
|
||||||
|
*
|
||||||
|
|
||||||
|
[+>>[>>>>>>>>+>>]<<-<<<<<<<<<<]-
|
||||||
|
[>>++++++++++++++++++++++++++++++++++++++++++++++++.
|
||||||
|
------------------------------------------------<<<<<<<<<<<<]
|
||||||
|
++++++++++++++++++++++++++++++++.[-]>>>>
|
||||||
|
|
||||||
|
]
|
||||||
|
|
||||||
|
*
|
||||||
|
* normalize the loop variable
|
||||||
|
*
|
||||||
|
|
||||||
|
>>>>>>
|
||||||
|
[>>[->>>>>+<<<<<[->>>>>+<<<<<
|
||||||
|
[->>>>>+<<<<<[->>>>>+<<<<<
|
||||||
|
[->>>>>+<<<<<[->>>>>+<<<<<
|
||||||
|
[->>>>>+<<<<<[->>>>>+<<<<<
|
||||||
|
[->>>>>+<<<<<[->>>>>--------->>>>>+<<<<<<<<<<
|
||||||
|
[->>>>>+<<<<<]]]]]]]]]]]>>>>>>>>]
|
||||||
|
<<<<<<<<<<[>>>>>>>[-<<<<<+>>>>>]<<<<<<<<<<<<<<<<<]
|
||||||
|
>>>>>>>>>
|
||||||
|
|
||||||
|
]<
|
||||||
|
|
||||||
|
]>>
|
||||||
|
|
||||||
|
*
|
||||||
|
* display the number and end
|
||||||
|
*
|
||||||
|
|
||||||
|
[>>>>>>>>>>]<<<<<<<<<<[+>[>>>>>>>>>+>]<-<<<<<<<<<<]-
|
||||||
|
[>++++++++++++++++++++++++++++++++++++++++++++++++.<<<<<<<<<<<]
|
||||||
|
++++++++++.
|
||||||
13
samples/Brainfuck/fib100.bf
Normal file
13
samples/Brainfuck/fib100.bf
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
# Calculate and output all fibonacci numbers under 100
|
||||||
|
|
||||||
|
+++++++++++
|
||||||
|
>+>>>>++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
>++++++++++++++++++++++++++++++++<<<<<<[>[>>>>>>+>
|
||||||
|
+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]<[>++++++++++[-
|
||||||
|
<-[>>+>+<<<-]>>>[<<<+>>>-]+<[>[-]<[-]]>[<<[>>>+<<<
|
||||||
|
-]>>[-]]<<]>>>[>>+>+<<<-]>>>[<<<+>>>-]+<[>[-]<[-]]
|
||||||
|
>[<<+>>[-]]<<<<<<<]>>>>>[+++++++++++++++++++++++++
|
||||||
|
+++++++++++++++++++++++.[-]]++++++++++<[->-<]>++++
|
||||||
|
++++++++++++++++++++++++++++++++++++++++++++.[-]<<
|
||||||
|
<<<<<<<<<<[>>>+>+<<<<-]>>>>[<<<<+>>>>-]<-[>>.>.<<<
|
||||||
|
[-]]<<[>>+>+<<<-]>>>[<<<+>>>-]<<[<+>-]>[<+>-]<<<-]
|
||||||
4
samples/Brainfuck/hello.bf
Normal file
4
samples/Brainfuck/hello.bf
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
// More complex version of hello world
|
||||||
|
|
||||||
|
>++++++++[<+++++++++>-]<.>>+>+>++>[-]+<[>[->+<<++++>]<<]>.+++++++..+++.>
|
||||||
|
>+++++++.<<<[[-]<[-]>]<+++++++++++++++.>>.+++.------.--------.>>+.>++++.
|
||||||
3
samples/Brainfuck/helloworld.bf
Normal file
3
samples/Brainfuck/helloworld.bf
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
// Hello World
|
||||||
|
|
||||||
|
++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.
|
||||||
30
samples/Brainfuck/rot13.bf
Normal file
30
samples/Brainfuck/rot13.bf
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
# ROT13 cipher
|
||||||
|
|
||||||
|
-,+[ Read first character and start outer character reading loop
|
||||||
|
-[ Skip forward if character is 0
|
||||||
|
>>++++[>++++++++<-] Set up divisor (32) for division loop
|
||||||
|
(MEMORY LAYOUT: dividend copy remainder divisor quotient zero zero)
|
||||||
|
<+<-[ Set up dividend (x minus 1) and enter division loop
|
||||||
|
>+>+>-[>>>] Increase copy and remainder / reduce divisor / Normal case: skip forward
|
||||||
|
<[[>+<-]>>+>] Special case: move remainder back to divisor and increase quotient
|
||||||
|
<<<<<- Decrement dividend
|
||||||
|
] End division loop
|
||||||
|
]>>>[-]+ End skip loop; zero former divisor and reuse space for a flag
|
||||||
|
>--[-[<->+++[-]]]<[ Zero that flag unless quotient was 2 or 3; zero quotient; check flag
|
||||||
|
++++++++++++<[ If flag then set up divisor (13) for second division loop
|
||||||
|
(MEMORY LAYOUT: zero copy dividend divisor remainder quotient zero zero)
|
||||||
|
>-[>+>>] Reduce divisor; Normal case: increase remainder
|
||||||
|
>[+[<+>-]>+>>] Special case: increase remainder / move it back to divisor / increase quotient
|
||||||
|
<<<<<- Decrease dividend
|
||||||
|
] End division loop
|
||||||
|
>>[<+>-] Add remainder back to divisor to get a useful 13
|
||||||
|
>[ Skip forward if quotient was 0
|
||||||
|
-[ Decrement quotient and skip forward if quotient was 1
|
||||||
|
-<<[-]>> Zero quotient and divisor if quotient was 2
|
||||||
|
]<<[<<->>-]>> Zero divisor and subtract 13 from copy if quotient was 1
|
||||||
|
]<<[<<+>>-] Zero divisor and add 13 to copy if quotient was 0
|
||||||
|
] End outer skip loop (jump to here if ((character minus 1)/32) was not 2 or 3)
|
||||||
|
<[-] Clear remainder from first division if second division was skipped
|
||||||
|
<.[-] Output ROT13ed character from copy and clear it
|
||||||
|
<-,+ Read next character
|
||||||
|
] End character reading loop
|
||||||
86
samples/C#/build.cake
Normal file
86
samples/C#/build.cake
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// ARGUMENTS
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
var target = Argument<string>("target", "Default");
|
||||||
|
var configuration = Argument<string>("configuration", "Release");
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// GLOBAL VARIABLES
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
var solutions = GetFiles("./**/*.sln");
|
||||||
|
var solutionPaths = solutions.Select(solution => solution.GetDirectory());
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// SETUP / TEARDOWN
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
Setup(() =>
|
||||||
|
{
|
||||||
|
// Executed BEFORE the first task.
|
||||||
|
Information("Running tasks...");
|
||||||
|
});
|
||||||
|
|
||||||
|
Teardown(() =>
|
||||||
|
{
|
||||||
|
// Executed AFTER the last task.
|
||||||
|
Information("Finished running tasks.");
|
||||||
|
});
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// TASK DEFINITIONS
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
Task("Clean")
|
||||||
|
.Does(() =>
|
||||||
|
{
|
||||||
|
// Clean solution directories.
|
||||||
|
foreach(var path in solutionPaths)
|
||||||
|
{
|
||||||
|
Information("Cleaning {0}", path);
|
||||||
|
CleanDirectories(path + "/**/bin/" + configuration);
|
||||||
|
CleanDirectories(path + "/**/obj/" + configuration);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Task("Restore")
|
||||||
|
.Does(() =>
|
||||||
|
{
|
||||||
|
// Restore all NuGet packages.
|
||||||
|
foreach(var solution in solutions)
|
||||||
|
{
|
||||||
|
Information("Restoring {0}...", solution);
|
||||||
|
NuGetRestore(solution);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Task("Build")
|
||||||
|
.IsDependentOn("Clean")
|
||||||
|
.IsDependentOn("Restore")
|
||||||
|
.Does(() =>
|
||||||
|
{
|
||||||
|
// Build all solutions.
|
||||||
|
foreach(var solution in solutions)
|
||||||
|
{
|
||||||
|
Information("Building {0}", solution);
|
||||||
|
MSBuild(solution, settings =>
|
||||||
|
settings.SetPlatformTarget(PlatformTarget.MSIL)
|
||||||
|
.WithProperty("TreatWarningsAsErrors","true")
|
||||||
|
.WithTarget("Build")
|
||||||
|
.SetConfiguration(configuration));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// TARGETS
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
Task("Default")
|
||||||
|
.IsDependentOn("Build");
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// EXECUTION
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
RunTarget(target);
|
||||||
57
samples/C++/ClasspathVMSystemProperties.inc
Normal file
57
samples/C++/ClasspathVMSystemProperties.inc
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
//===- ClasspathVMSystem/Properties.cpp -----------------------------------===//
|
||||||
|
//===--------------------- GNU classpath gnu/classpath/VMSystemProperties -===//
|
||||||
|
//
|
||||||
|
// The VMKit project
|
||||||
|
//
|
||||||
|
// This file is distributed under the University of Illinois Open Source
|
||||||
|
// License. See LICENSE.TXT for details.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
#include <sys/utsname.h>
|
||||||
|
|
||||||
|
#include "types.h"
|
||||||
|
|
||||||
|
#include "Classpath.h"
|
||||||
|
#include "JavaArray.h"
|
||||||
|
#include "JavaClass.h"
|
||||||
|
#include "JavaObject.h"
|
||||||
|
#include "JavaThread.h"
|
||||||
|
#include "JavaUpcalls.h"
|
||||||
|
#include "Jnjvm.h"
|
||||||
|
|
||||||
|
#include "SetProperties.inc"
|
||||||
|
|
||||||
|
using namespace j3;
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
|
||||||
|
|
||||||
|
JNIEXPORT void JNICALL Java_gnu_classpath_VMSystemProperties_preInit(
|
||||||
|
#ifdef NATIVE_JNI
|
||||||
|
JNIEnv *env,
|
||||||
|
jclass clazz,
|
||||||
|
#endif
|
||||||
|
JavaObject* prop) {
|
||||||
|
|
||||||
|
llvm_gcroot(prop, 0);
|
||||||
|
|
||||||
|
BEGIN_NATIVE_EXCEPTION(0)
|
||||||
|
|
||||||
|
setProperties(prop);
|
||||||
|
|
||||||
|
END_NATIVE_EXCEPTION
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" void Java_gnu_classpath_VMSystemProperties_postInit__Ljava_util_Properties_2(JavaObject* prop) {
|
||||||
|
|
||||||
|
llvm_gcroot(prop, 0);
|
||||||
|
|
||||||
|
BEGIN_NATIVE_EXCEPTION(0)
|
||||||
|
|
||||||
|
setCommandLineProperties(prop);
|
||||||
|
|
||||||
|
END_NATIVE_EXCEPTION
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
2764
samples/C++/initClasses.inc
Normal file
2764
samples/C++/initClasses.inc
Normal file
File diff suppressed because it is too large
Load Diff
34
samples/C++/instances.inc
Normal file
34
samples/C++/instances.inc
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
#include "QPBO.h"
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#pragma warning(disable: 4661)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Instantiations
|
||||||
|
|
||||||
|
template class QPBO<int>;
|
||||||
|
template class QPBO<float>;
|
||||||
|
template class QPBO<double>;
|
||||||
|
|
||||||
|
template <>
|
||||||
|
inline void QPBO<int>::get_type_information(char*& type_name, char*& type_format)
|
||||||
|
{
|
||||||
|
type_name = "int";
|
||||||
|
type_format = "d";
|
||||||
|
}
|
||||||
|
|
||||||
|
template <>
|
||||||
|
inline void QPBO<float>::get_type_information(char*& type_name, char*& type_format)
|
||||||
|
{
|
||||||
|
type_name = "float";
|
||||||
|
type_format = "f";
|
||||||
|
}
|
||||||
|
|
||||||
|
template <>
|
||||||
|
inline void QPBO<double>::get_type_information(char*& type_name, char*& type_format)
|
||||||
|
{
|
||||||
|
type_name = "double";
|
||||||
|
type_format = "Lf";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
116
samples/C++/qsciprinter.cp
Normal file
116
samples/C++/qsciprinter.cp
Normal file
@@ -0,0 +1,116 @@
|
|||||||
|
// This module defines interface to the QsciPrinter class.
|
||||||
|
//
|
||||||
|
// Copyright (c) 2011 Riverbank Computing Limited <info@riverbankcomputing.com>
|
||||||
|
//
|
||||||
|
// This file is part of QScintilla.
|
||||||
|
//
|
||||||
|
// This file may be used under the terms of the GNU General Public
|
||||||
|
// License versions 2.0 or 3.0 as published by the Free Software
|
||||||
|
// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3
|
||||||
|
// included in the packaging of this file. Alternatively you may (at
|
||||||
|
// your option) use any later version of the GNU General Public
|
||||||
|
// License if such license has been publicly approved by Riverbank
|
||||||
|
// Computing Limited (or its successors, if any) and the KDE Free Qt
|
||||||
|
// Foundation. In addition, as a special exception, Riverbank gives you
|
||||||
|
// certain additional rights. These rights are described in the Riverbank
|
||||||
|
// GPL Exception version 1.1, which can be found in the file
|
||||||
|
// GPL_EXCEPTION.txt in this package.
|
||||||
|
//
|
||||||
|
// If you are unsure which license is appropriate for your use, please
|
||||||
|
// contact the sales department at sales@riverbankcomputing.com.
|
||||||
|
//
|
||||||
|
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||||
|
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef QSCIPRINTER_H
|
||||||
|
#define QSCIPRINTER_H
|
||||||
|
|
||||||
|
#ifdef __APPLE__
|
||||||
|
extern "C++" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <qprinter.h>
|
||||||
|
|
||||||
|
#include <Qsci/qsciglobal.h>
|
||||||
|
#include <Qsci/qsciscintilla.h>
|
||||||
|
|
||||||
|
|
||||||
|
QT_BEGIN_NAMESPACE
|
||||||
|
class QRect;
|
||||||
|
class QPainter;
|
||||||
|
QT_END_NAMESPACE
|
||||||
|
|
||||||
|
class QsciScintillaBase;
|
||||||
|
|
||||||
|
|
||||||
|
//! \brief The QsciPrinter class is a sub-class of the Qt QPrinter class that
|
||||||
|
//! is able to print the text of a Scintilla document.
|
||||||
|
//!
|
||||||
|
//! The class can be further sub-classed to alter to layout of the text, adding
|
||||||
|
//! headers and footers for example.
|
||||||
|
class QSCINTILLA_EXPORT QsciPrinter : public QPrinter
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
//! Constructs a printer paint device with mode \a mode.
|
||||||
|
QsciPrinter(PrinterMode mode = ScreenResolution);
|
||||||
|
|
||||||
|
//! Destroys the QsciPrinter instance.
|
||||||
|
virtual ~QsciPrinter();
|
||||||
|
|
||||||
|
//! Format a page, by adding headers and footers for example, before the
|
||||||
|
//! document text is drawn on it. \a painter is the painter to be used to
|
||||||
|
//! add customised text and graphics. \a drawing is true if the page is
|
||||||
|
//! actually being drawn rather than being sized. \a painter drawing
|
||||||
|
//! methods must only be called when \a drawing is true. \a area is the
|
||||||
|
//! area of the page that will be used to draw the text. This should be
|
||||||
|
//! modified if it is necessary to reserve space for any customised text or
|
||||||
|
//! graphics. By default the area is relative to the printable area of the
|
||||||
|
//! page. Use QPrinter::setFullPage() because calling printRange() if you
|
||||||
|
//! want to try and print over the whole page. \a pagenr is the number of
|
||||||
|
//! the page. The first page is numbered 1.
|
||||||
|
virtual void formatPage(QPainter &painter, bool drawing, QRect &area,
|
||||||
|
int pagenr);
|
||||||
|
|
||||||
|
//! Return the number of points to add to each font when printing.
|
||||||
|
//!
|
||||||
|
//! \sa setMagnification()
|
||||||
|
int magnification() const {return mag;}
|
||||||
|
|
||||||
|
//! Sets the number of points to add to each font when printing to \a
|
||||||
|
//! magnification.
|
||||||
|
//!
|
||||||
|
//! \sa magnification()
|
||||||
|
virtual void setMagnification(int magnification);
|
||||||
|
|
||||||
|
//! Print a range of lines from the Scintilla instance \a qsb. \a from is
|
||||||
|
//! the first line to print and a negative value signifies the first line
|
||||||
|
//! of text. \a to is the last line to print and a negative value
|
||||||
|
//! signifies the last line of text. true is returned if there was no
|
||||||
|
//! error.
|
||||||
|
virtual int printRange(QsciScintillaBase *qsb, int from = -1, int to = -1);
|
||||||
|
|
||||||
|
//! Return the line wrap mode used when printing. The default is
|
||||||
|
//! QsciScintilla::WrapWord.
|
||||||
|
//!
|
||||||
|
//! \sa setWrapMode()
|
||||||
|
QsciScintilla::WrapMode wrapMode() const {return wrap;}
|
||||||
|
|
||||||
|
//! Sets the line wrap mode used when printing to \a wmode.
|
||||||
|
//!
|
||||||
|
//! \sa wrapMode()
|
||||||
|
virtual void setWrapMode(QsciScintilla::WrapMode wmode);
|
||||||
|
|
||||||
|
private:
|
||||||
|
int mag;
|
||||||
|
QsciScintilla::WrapMode wrap;
|
||||||
|
|
||||||
|
QsciPrinter(const QsciPrinter &);
|
||||||
|
QsciPrinter &operator=(const QsciPrinter &);
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef __APPLE__
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
2310
samples/C/filenames/script
Executable file
2310
samples/C/filenames/script
Executable file
File diff suppressed because it is too large
Load Diff
166
samples/C/pqiv.h
Normal file
166
samples/C/pqiv.h
Normal file
@@ -0,0 +1,166 @@
|
|||||||
|
/**
|
||||||
|
* pqiv
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013-2014, Phillip Berndt
|
||||||
|
*
|
||||||
|
* This program 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 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
* This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
// This file contains the definition of files, image types and
|
||||||
|
// the plugin infrastructure. It should be included in file type
|
||||||
|
// handlers.
|
||||||
|
|
||||||
|
#ifndef _PQIV_H_INCLUDED
|
||||||
|
#define _PQIV_H_INCLUDED
|
||||||
|
|
||||||
|
#include <glib.h>
|
||||||
|
#include <gtk/gtk.h>
|
||||||
|
#include <gio/gio.h>
|
||||||
|
#include "lib/bostree.h"
|
||||||
|
|
||||||
|
#ifndef PQIV_VERSION
|
||||||
|
#define PQIV_VERSION "2.3"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define FILE_FLAGS_ANIMATION (guint)(1)
|
||||||
|
#define FILE_FLAGS_MEMORY_IMAGE (guint)(1<<1)
|
||||||
|
|
||||||
|
// The structure for images {{{
|
||||||
|
typedef struct file_type_handler_struct_t file_type_handler_t;
|
||||||
|
typedef struct {
|
||||||
|
// File type
|
||||||
|
const file_type_handler_t *file_type;
|
||||||
|
|
||||||
|
// Special flags
|
||||||
|
// FILE_FLAGS_ANIMATION -> Animation functions are invoked
|
||||||
|
// Set by file type handlers
|
||||||
|
// FILE_FLAGS_MEMORY_IMAGE -> File lives in memory
|
||||||
|
guint file_flags;
|
||||||
|
|
||||||
|
// The file name to display and to sort by
|
||||||
|
gchar *display_name;
|
||||||
|
|
||||||
|
// The URI or file name of the file
|
||||||
|
gchar *file_name;
|
||||||
|
|
||||||
|
// If the file is a memory image, the actual image data
|
||||||
|
GBytes *file_data;
|
||||||
|
|
||||||
|
// The file monitor structure is used for inotify-watching of
|
||||||
|
// the files
|
||||||
|
GFileMonitor *file_monitor;
|
||||||
|
|
||||||
|
// This flag stores whether this image is currently loaded
|
||||||
|
// and valid. i.e. if it is set, you can assume that
|
||||||
|
// private_data contains a representation of the image;
|
||||||
|
// if not, you can NOT assume that it does not.
|
||||||
|
gboolean is_loaded;
|
||||||
|
|
||||||
|
// Cached image size
|
||||||
|
guint width;
|
||||||
|
guint height;
|
||||||
|
|
||||||
|
// File-type specific data, allocated and freed by the file type handlers
|
||||||
|
void *private;
|
||||||
|
} file_t;
|
||||||
|
// }}}
|
||||||
|
// Definition of the built-in file types {{{
|
||||||
|
|
||||||
|
// If you want to implement your own file type, you'll have to implement the
|
||||||
|
// following functions and a non-static initialization function named
|
||||||
|
// file_type_NAME_initializer that fills a file_type_handler_t with pointers to
|
||||||
|
// the functions. Store the file in backends/NAME.c and adjust the Makefile to
|
||||||
|
// add the required libraries if your backend is listed in the $(BACKENDS)
|
||||||
|
// variable.
|
||||||
|
|
||||||
|
typedef enum { PARAMETER, RECURSION, INOTIFY, BROWSE_ORIGINAL_PARAMETER, FILTER_OUTPUT } load_images_state_t;
|
||||||
|
// Allocation function: Allocate the ->private structure within a file and add the
|
||||||
|
// image(s) to the list of available images via load_images_handle_parameter_add_file()
|
||||||
|
// If an image is not to be loaded for any reason, the file structure should be
|
||||||
|
// deallocated using file_free()
|
||||||
|
// Returns a pointer to the first added image
|
||||||
|
// Optional, you can also set the pointer to this function to NULL.
|
||||||
|
typedef BOSNode *(*file_type_alloc_fn_t)(load_images_state_t state, file_t *file);
|
||||||
|
|
||||||
|
// Deallocation, if a file is removed from the images list. Free the ->private structure.
|
||||||
|
// Only called if ->private is non-NULL.
|
||||||
|
typedef void (*file_type_free_fn_t)(file_t *file);
|
||||||
|
|
||||||
|
// Actually load a file into memory
|
||||||
|
typedef void (*file_type_load_fn_t)(file_t *file, GInputStream *data, GError **error_pointer);
|
||||||
|
|
||||||
|
// Unload a file
|
||||||
|
typedef void (*file_type_unload_fn_t)(file_t *file);
|
||||||
|
|
||||||
|
// Animation support: Initialize memory for animations, return ms until first frame
|
||||||
|
// Optional, you can also set the pointer to this function to NULL.
|
||||||
|
typedef double (*file_type_animation_initialize_fn_t)(file_t *file);
|
||||||
|
|
||||||
|
// Animation support: Advance to the next frame, return ms until next frame
|
||||||
|
// Optional, you can also set the pointer to this function to NULL.
|
||||||
|
typedef double (*file_type_animation_next_frame_fn_t)(file_t *file);
|
||||||
|
|
||||||
|
// Draw the current view to a cairo context
|
||||||
|
typedef void (*file_type_draw_fn_t)(file_t *file, cairo_t *cr);
|
||||||
|
|
||||||
|
struct file_type_handler_struct_t {
|
||||||
|
// All files will be filtered with this filter. If it lets it pass,
|
||||||
|
// a handler is assigned to a file. If none do, the file is
|
||||||
|
// discarded if it was found during directory traversal or
|
||||||
|
// loaded using the first image backend if it was an explicit
|
||||||
|
// parameter.
|
||||||
|
GtkFileFilter *file_types_handled;
|
||||||
|
|
||||||
|
// Pointers to the functions defined above
|
||||||
|
file_type_alloc_fn_t alloc_fn;
|
||||||
|
file_type_free_fn_t free_fn;
|
||||||
|
file_type_load_fn_t load_fn;
|
||||||
|
file_type_unload_fn_t unload_fn;
|
||||||
|
file_type_animation_initialize_fn_t animation_initialize_fn;
|
||||||
|
file_type_animation_next_frame_fn_t animation_next_frame_fn;
|
||||||
|
file_type_draw_fn_t draw_fn;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Initialization function: Tell pqiv about a backend
|
||||||
|
typedef void (*file_type_initializer_fn_t)(file_type_handler_t *info);
|
||||||
|
|
||||||
|
// pqiv symbols available to plugins {{{
|
||||||
|
|
||||||
|
// Global cancellable that should be used for every i/o operation
|
||||||
|
extern GCancellable *image_loader_cancellable;
|
||||||
|
|
||||||
|
// Current scale level. For backends that don't support cairo natively.
|
||||||
|
extern gdouble current_scale_level;
|
||||||
|
|
||||||
|
// Load a file from disc/memory/network
|
||||||
|
GInputStream *image_loader_stream_file(file_t *file, GError **error_pointer);
|
||||||
|
|
||||||
|
// Add a file to the list of loaded files
|
||||||
|
// Should be called at least once in a file_type_alloc_fn_t, with the state being
|
||||||
|
// forwarded unaltered.
|
||||||
|
BOSNode *load_images_handle_parameter_add_file(load_images_state_t state, file_t *file);
|
||||||
|
|
||||||
|
// Load all data from an input stream into memory, conveinience function
|
||||||
|
GBytes *g_input_stream_read_completely(GInputStream *input_stream, GCancellable *cancellable, GError **error_pointer);
|
||||||
|
|
||||||
|
// Free a file
|
||||||
|
void file_free(file_t *file);
|
||||||
|
|
||||||
|
// }}}
|
||||||
|
|
||||||
|
// File type handlers, used in the initializer and file type guessing
|
||||||
|
extern file_type_handler_t file_type_handlers[];
|
||||||
|
|
||||||
|
/* }}} */
|
||||||
|
|
||||||
|
#endif
|
||||||
343
samples/CLIPS/demo.clp
Normal file
343
samples/CLIPS/demo.clp
Normal file
@@ -0,0 +1,343 @@
|
|||||||
|
;;;***************************
|
||||||
|
;;;* DEFFACTS KNOWLEDGE BASE *
|
||||||
|
;;;***************************
|
||||||
|
|
||||||
|
(deffacts MAIN::knowledge-base
|
||||||
|
(welcome (message WelcomeMessage))
|
||||||
|
(goal (variable type.animal))
|
||||||
|
(legalanswers (values yes no))
|
||||||
|
(displayanswers (values "Yes" "No"))
|
||||||
|
(rule (if backbone is yes)
|
||||||
|
(then superphylum is backbone))
|
||||||
|
(rule (if backbone is no)
|
||||||
|
(then superphylum is jellyback))
|
||||||
|
(question (variable backbone)
|
||||||
|
(query backbone.query))
|
||||||
|
(rule (if superphylum is backbone and
|
||||||
|
warm.blooded is yes)
|
||||||
|
(then phylum is warm))
|
||||||
|
(rule (if superphylum is backbone and
|
||||||
|
warm.blooded is no)
|
||||||
|
(then phylum is cold))
|
||||||
|
(question (variable warm.blooded)
|
||||||
|
(query warm.blooded.query))
|
||||||
|
(rule (if superphylum is jellyback and
|
||||||
|
live.prime.in.soil is yes)
|
||||||
|
(then phylum is soil))
|
||||||
|
(rule (if superphylum is jellyback and
|
||||||
|
live.prime.in.soil is no)
|
||||||
|
(then phylum is elsewhere))
|
||||||
|
(question (variable live.prime.in.soil)
|
||||||
|
(query live.prime.in.soil.query))
|
||||||
|
(rule (if phylum is warm and
|
||||||
|
has.breasts is yes)
|
||||||
|
(then class is breasts))
|
||||||
|
(rule (if phylum is warm and
|
||||||
|
has.breasts is no)
|
||||||
|
(then type.animal is bird))
|
||||||
|
(question (variable has.breasts)
|
||||||
|
(query has.breasts.query))
|
||||||
|
(rule (if phylum is cold and
|
||||||
|
always.in.water is yes)
|
||||||
|
(then class is water))
|
||||||
|
(rule (if phylum is cold and
|
||||||
|
always.in.water is no)
|
||||||
|
(then class is dry))
|
||||||
|
(question (variable always.in.water)
|
||||||
|
(query always.in.water.query))
|
||||||
|
(rule (if phylum is soil and
|
||||||
|
flat.bodied is yes)
|
||||||
|
(then type.animal is flatworm))
|
||||||
|
(rule (if phylum is soil and
|
||||||
|
flat.bodied is no)
|
||||||
|
(then type.animal is worm.leech))
|
||||||
|
(question (variable flat.bodied)
|
||||||
|
(query flat.bodied.query))
|
||||||
|
(rule (if phylum is elsewhere and
|
||||||
|
body.in.segments is yes)
|
||||||
|
(then class is segments))
|
||||||
|
(rule (if phylum is elsewhere and
|
||||||
|
body.in.segments is no)
|
||||||
|
(then class is unified))
|
||||||
|
(question (variable body.in.segments)
|
||||||
|
(query body.in.segments.query))
|
||||||
|
(rule (if class is breasts and
|
||||||
|
can.eat.meat is yes)
|
||||||
|
(then order is meat))
|
||||||
|
(rule (if class is breasts and
|
||||||
|
can.eat.meat is no)
|
||||||
|
(then order is vegy))
|
||||||
|
(question (variable can.eat.meat)
|
||||||
|
(query can.eat.meat.query))
|
||||||
|
(rule (if class is water and
|
||||||
|
boney is yes)
|
||||||
|
(then type.animal is fish))
|
||||||
|
(rule (if class is water and
|
||||||
|
boney is no)
|
||||||
|
(then type.animal is shark.ray))
|
||||||
|
(question (variable boney)
|
||||||
|
(query boney.query))
|
||||||
|
(rule (if class is dry and
|
||||||
|
scaly is yes)
|
||||||
|
(then order is scales))
|
||||||
|
(rule (if class is dry and
|
||||||
|
scaly is no)
|
||||||
|
(then order is soft))
|
||||||
|
(question (variable scaly)
|
||||||
|
(query scaly.query))
|
||||||
|
(rule (if class is segments and
|
||||||
|
shell is yes)
|
||||||
|
(then order is shell))
|
||||||
|
(rule (if class is segments and
|
||||||
|
shell is no)
|
||||||
|
(then type.animal is centipede.millipede.insect))
|
||||||
|
(question (variable shell)
|
||||||
|
(query shell.query))
|
||||||
|
(rule (if class is unified and
|
||||||
|
digest.cells is yes)
|
||||||
|
(then order is cells))
|
||||||
|
(rule (if class is unified and
|
||||||
|
digest.cells is no)
|
||||||
|
(then order is stomach))
|
||||||
|
(question (variable digest.cells)
|
||||||
|
(query digest.cells.query))
|
||||||
|
(rule (if order is meat and
|
||||||
|
fly is yes)
|
||||||
|
(then type.animal is bat))
|
||||||
|
(rule (if order is meat and
|
||||||
|
fly is no)
|
||||||
|
(then family is nowings))
|
||||||
|
(question (variable fly)
|
||||||
|
(query fly.query))
|
||||||
|
(rule (if order is vegy and
|
||||||
|
hooves is yes)
|
||||||
|
(then family is hooves))
|
||||||
|
(rule (if order is vegy and
|
||||||
|
hooves is no)
|
||||||
|
(then family is feet))
|
||||||
|
(question (variable hooves)
|
||||||
|
(query hooves.query))
|
||||||
|
(rule (if order is scales and
|
||||||
|
rounded.shell is yes)
|
||||||
|
(then type.animal is turtle))
|
||||||
|
(rule (if order is scales and
|
||||||
|
rounded.shell is no)
|
||||||
|
(then family is noshell))
|
||||||
|
(question (variable rounded.shell)
|
||||||
|
(query rounded.shell.query))
|
||||||
|
(rule (if order is soft and
|
||||||
|
jump is yes)
|
||||||
|
(then type.animal is frog))
|
||||||
|
(rule (if order is soft and
|
||||||
|
jump is no)
|
||||||
|
(then type.animal is salamander))
|
||||||
|
(question (variable jump)
|
||||||
|
(query jump.query))
|
||||||
|
(rule (if order is shell and
|
||||||
|
tail is yes)
|
||||||
|
(then type.animal is lobster))
|
||||||
|
(rule (if order is shell and
|
||||||
|
tail is no)
|
||||||
|
(then type.animal is crab))
|
||||||
|
(question (variable tail)
|
||||||
|
(query tail.query))
|
||||||
|
(rule (if order is cells and
|
||||||
|
stationary is yes)
|
||||||
|
(then family is stationary))
|
||||||
|
(rule (if order is cells and
|
||||||
|
stationary is no)
|
||||||
|
(then type.animal is jellyfish))
|
||||||
|
(question (variable stationary)
|
||||||
|
(query stationary.query))
|
||||||
|
(rule (if order is stomach and
|
||||||
|
multicelled is yes)
|
||||||
|
(then family is multicelled))
|
||||||
|
(rule (if order is stomach and
|
||||||
|
multicelled is no)
|
||||||
|
(then type.animal is protozoa))
|
||||||
|
(question (variable multicelled)
|
||||||
|
(query multicelled.query))
|
||||||
|
(rule (if family is nowings and
|
||||||
|
opposing.thumb is yes)
|
||||||
|
(then genus is thumb))
|
||||||
|
(rule (if family is nowings and
|
||||||
|
opposing.thumb is no)
|
||||||
|
(then genus is nothumb))
|
||||||
|
(question (variable opposing.thumb)
|
||||||
|
(query opposing.thumb.query))
|
||||||
|
(rule (if family is hooves and
|
||||||
|
two.toes is yes)
|
||||||
|
(then genus is twotoes))
|
||||||
|
(rule (if family is hooves and
|
||||||
|
two.toes is no)
|
||||||
|
(then genus is onetoe))
|
||||||
|
(question (variable two.toes)
|
||||||
|
(query two.toes.query))
|
||||||
|
(rule (if family is feet and
|
||||||
|
live.in.water is yes)
|
||||||
|
(then genus is water))
|
||||||
|
(rule (if family is feet and
|
||||||
|
live.in.water is no)
|
||||||
|
(then genus is dry))
|
||||||
|
(question (variable live.in.water)
|
||||||
|
(query live.in.water.query))
|
||||||
|
(rule (if family is noshell and
|
||||||
|
limbs is yes)
|
||||||
|
(then type.animal is crocodile.alligator))
|
||||||
|
(rule (if family is noshell and
|
||||||
|
limbs is no)
|
||||||
|
(then type.animal is snake))
|
||||||
|
(question (variable limbs)
|
||||||
|
(query limbs.query))
|
||||||
|
(rule (if family is stationary and
|
||||||
|
spikes is yes)
|
||||||
|
(then type.animal is sea.anemone))
|
||||||
|
(rule (if family is stationary and
|
||||||
|
spikes is no)
|
||||||
|
(then type.animal is coral.sponge))
|
||||||
|
(question (variable spikes)
|
||||||
|
(query spikes.query))
|
||||||
|
(rule (if family is multicelled and
|
||||||
|
spiral.shell is yes)
|
||||||
|
(then type.animal is snail))
|
||||||
|
(rule (if family is multicelled and
|
||||||
|
spiral.shell is no)
|
||||||
|
(then genus is noshell))
|
||||||
|
(question (variable spiral.shell)
|
||||||
|
(query spiral.shell.query))
|
||||||
|
(rule (if genus is thumb and
|
||||||
|
prehensile.tail is yes)
|
||||||
|
(then type.animal is monkey))
|
||||||
|
(rule (if genus is thumb and
|
||||||
|
prehensile.tail is no)
|
||||||
|
(then species is notail))
|
||||||
|
(question (variable prehensile.tail)
|
||||||
|
(query prehensile.tail.query))
|
||||||
|
(rule (if genus is nothumb and
|
||||||
|
over.400 is yes)
|
||||||
|
(then species is 400))
|
||||||
|
(rule (if genus is nothumb and
|
||||||
|
over.400 is no)
|
||||||
|
(then species is under400))
|
||||||
|
(question (variable over.400)
|
||||||
|
(query over.400.query))
|
||||||
|
(rule (if genus is twotoes and
|
||||||
|
horns is yes)
|
||||||
|
(then species is horns))
|
||||||
|
(rule (if genus is twotoes and
|
||||||
|
horns is no)
|
||||||
|
(then species is nohorns))
|
||||||
|
(question (variable horns)
|
||||||
|
(query horns.query))
|
||||||
|
(rule (if genus is onetoe and
|
||||||
|
plating is yes)
|
||||||
|
(then type.animal is rhinoceros))
|
||||||
|
(rule (if genus is onetoe and
|
||||||
|
plating is no)
|
||||||
|
(then type.animal is horse.zebra))
|
||||||
|
(question (variable plating)
|
||||||
|
(query plating.query))
|
||||||
|
(rule (if genus is water and
|
||||||
|
hunted is yes)
|
||||||
|
(then type.animal is whale))
|
||||||
|
(rule (if genus is water and
|
||||||
|
hunted is no)
|
||||||
|
(then type.animal is dolphin.porpoise))
|
||||||
|
(question (variable hunted)
|
||||||
|
(query hunted.query))
|
||||||
|
(rule (if genus is dry and
|
||||||
|
front.teeth is yes)
|
||||||
|
(then species is teeth))
|
||||||
|
(rule (if genus is dry and
|
||||||
|
front.teeth is no)
|
||||||
|
(then species is noteeth))
|
||||||
|
(question (variable front.teeth)
|
||||||
|
(query front.teeth.query))
|
||||||
|
(rule (if genus is noshell and
|
||||||
|
bivalve is yes)
|
||||||
|
(then type.animal is clam.oyster))
|
||||||
|
(rule (if genus is noshell and
|
||||||
|
bivalve is no)
|
||||||
|
(then type.animal is squid.octopus))
|
||||||
|
(question (variable bivalve)
|
||||||
|
(query bivalve.query))
|
||||||
|
(rule (if species is notail and
|
||||||
|
nearly.hairless is yes)
|
||||||
|
(then type.animal is man))
|
||||||
|
(rule (if species is notail and
|
||||||
|
nearly.hairless is no)
|
||||||
|
(then subspecies is hair))
|
||||||
|
(question (variable nearly.hairless)
|
||||||
|
(query nearly.hairless.query))
|
||||||
|
(rule (if species is 400 and
|
||||||
|
land.based is yes)
|
||||||
|
(then type.animal is bear.tiger.lion))
|
||||||
|
(rule (if species is 400 and
|
||||||
|
land.based is no)
|
||||||
|
(then type.animal is walrus))
|
||||||
|
(question (variable land.based)
|
||||||
|
(query land.based.query))
|
||||||
|
(rule (if species is under400 and
|
||||||
|
thintail is yes)
|
||||||
|
(then type.animal is cat))
|
||||||
|
(rule (if species is under400 and
|
||||||
|
thintail is no)
|
||||||
|
(then type.animal is coyote.wolf.fox.dog))
|
||||||
|
(question (variable thintail)
|
||||||
|
(query thintail.query))
|
||||||
|
(rule (if species is nohorns and
|
||||||
|
lives.in.desert is yes)
|
||||||
|
(then type.animal is camel))
|
||||||
|
(rule (if species is nohorns and
|
||||||
|
lives.in.desert is no and
|
||||||
|
semi.aquatic is no)
|
||||||
|
(then type.animal is giraffe))
|
||||||
|
(rule (if species is nohorns and
|
||||||
|
lives.in.desert is no and
|
||||||
|
semi.aquatic is yes)
|
||||||
|
(then type.animal is hippopotamus))
|
||||||
|
(question (variable lives.in.desert)
|
||||||
|
(query lives.in.desert.query))
|
||||||
|
(question (variable semi.aquatic)
|
||||||
|
(query semi.aquatic.query))
|
||||||
|
(rule (if species is teeth and
|
||||||
|
large.ears is yes)
|
||||||
|
(then type.animal is rabbit))
|
||||||
|
(rule (if species is teeth and
|
||||||
|
large.ears is no)
|
||||||
|
(then type.animal is rat.mouse.squirrel.beaver.porcupine))
|
||||||
|
(question (variable large.ears)
|
||||||
|
(query large.ears.query))
|
||||||
|
(rule (if species is noteeth and
|
||||||
|
pouch is yes)
|
||||||
|
(then type.animal is kangaroo.koala.bear))
|
||||||
|
(rule (if species is noteeth and
|
||||||
|
pouch is no)
|
||||||
|
(then type.animal is mole.shrew.elephant))
|
||||||
|
(question (variable pouch)
|
||||||
|
(query pouch.query))
|
||||||
|
(rule (if subspecies is hair and
|
||||||
|
long.powerful.arms is yes)
|
||||||
|
(then type.animal is orangutan.gorilla.chimpanzee))
|
||||||
|
(rule (if subspecies is hair and
|
||||||
|
long.powerful.arms is no)
|
||||||
|
(then type.animal is baboon))
|
||||||
|
(question (variable long.powerful.arms)
|
||||||
|
(query long.powerful.arms.query))
|
||||||
|
(rule (if species is horns and
|
||||||
|
fleece is yes)
|
||||||
|
(then type.animal is sheep.goat))
|
||||||
|
(rule (if species is horns and
|
||||||
|
fleece is no)
|
||||||
|
(then subsubspecies is nofleece))
|
||||||
|
(question (variable fleece)
|
||||||
|
(query fleece.query))
|
||||||
|
(rule (if subsubspecies is nofleece and
|
||||||
|
domesticated is yes)
|
||||||
|
(then type.animal is cow))
|
||||||
|
(rule (if subsubspecies is nofleece and
|
||||||
|
domesticated is no)
|
||||||
|
(then type.animal is deer.moose.antelope))
|
||||||
|
(question (variable domesticated)
|
||||||
|
(query domesticated.query))
|
||||||
|
(answer (prefix "I think your animal is a ") (variable type.animal) (postfix ".")))
|
||||||
281
samples/CLIPS/sudoku.clp
Normal file
281
samples/CLIPS/sudoku.clp
Normal file
@@ -0,0 +1,281 @@
|
|||||||
|
;;; http://www.angusj.com/sudoku/hints
|
||||||
|
;;; http://www.scanraid.com/BasicStrategies.htm
|
||||||
|
;;; http://www.sudokuoftheday.com/pages/techniques-overview
|
||||||
|
;;; http://www.sudokuonline.us/sudoku_solving_techniques
|
||||||
|
;;; http://www.sadmansoftware.com/sudoku/techniques.htm
|
||||||
|
;;; http://www.krazydad.com/blog/2005/09/29/an-index-of-sudoku-strategies/
|
||||||
|
|
||||||
|
;;; #######################
|
||||||
|
;;; DEFTEMPLATES & DEFFACTS
|
||||||
|
;;; #######################
|
||||||
|
|
||||||
|
(deftemplate possible
|
||||||
|
(slot row)
|
||||||
|
(slot column)
|
||||||
|
(slot value)
|
||||||
|
(slot group)
|
||||||
|
(slot id))
|
||||||
|
|
||||||
|
(deftemplate impossible
|
||||||
|
(slot id)
|
||||||
|
(slot value)
|
||||||
|
(slot priority)
|
||||||
|
(slot reason))
|
||||||
|
|
||||||
|
(deftemplate technique-employed
|
||||||
|
(slot reason)
|
||||||
|
(slot priority))
|
||||||
|
|
||||||
|
(deftemplate technique
|
||||||
|
(slot name)
|
||||||
|
(slot priority))
|
||||||
|
|
||||||
|
(deffacts startup
|
||||||
|
(phase grid-values))
|
||||||
|
|
||||||
|
(deftemplate size-value
|
||||||
|
(slot size)
|
||||||
|
(slot value))
|
||||||
|
|
||||||
|
(deffacts values
|
||||||
|
(size-value (size 1) (value 1))
|
||||||
|
(size-value (size 2) (value 2))
|
||||||
|
(size-value (size 2) (value 3))
|
||||||
|
(size-value (size 2) (value 4))
|
||||||
|
(size-value (size 3) (value 5))
|
||||||
|
(size-value (size 3) (value 6))
|
||||||
|
(size-value (size 3) (value 7))
|
||||||
|
(size-value (size 3) (value 8))
|
||||||
|
(size-value (size 3) (value 9))
|
||||||
|
(size-value (size 4) (value 10))
|
||||||
|
(size-value (size 4) (value 11))
|
||||||
|
(size-value (size 4) (value 12))
|
||||||
|
(size-value (size 4) (value 13))
|
||||||
|
(size-value (size 4) (value 14))
|
||||||
|
(size-value (size 4) (value 15))
|
||||||
|
(size-value (size 4) (value 16))
|
||||||
|
(size-value (size 5) (value 17))
|
||||||
|
(size-value (size 5) (value 18))
|
||||||
|
(size-value (size 5) (value 19))
|
||||||
|
(size-value (size 5) (value 20))
|
||||||
|
(size-value (size 5) (value 21))
|
||||||
|
(size-value (size 5) (value 22))
|
||||||
|
(size-value (size 5) (value 23))
|
||||||
|
(size-value (size 5) (value 24))
|
||||||
|
(size-value (size 5) (value 25)))
|
||||||
|
|
||||||
|
;;; ###########
|
||||||
|
;;; SETUP RULES
|
||||||
|
;;; ###########
|
||||||
|
|
||||||
|
;;; ***********
|
||||||
|
;;; stress-test
|
||||||
|
;;; ***********
|
||||||
|
|
||||||
|
(defrule stress-test
|
||||||
|
|
||||||
|
(declare (salience 10))
|
||||||
|
|
||||||
|
(phase match)
|
||||||
|
|
||||||
|
(stress-test)
|
||||||
|
|
||||||
|
(priority ?last)
|
||||||
|
|
||||||
|
(not (priority ?p&:(> ?p ?last)))
|
||||||
|
|
||||||
|
(technique (priority ?next&:(> ?next ?last)))
|
||||||
|
|
||||||
|
(not (technique (priority ?p&:(> ?p ?last)&:(< ?p ?next))))
|
||||||
|
|
||||||
|
=>
|
||||||
|
|
||||||
|
(assert (priority ?next)))
|
||||||
|
|
||||||
|
;;; *****************
|
||||||
|
;;; enable-techniques
|
||||||
|
;;; *****************
|
||||||
|
|
||||||
|
(defrule enable-techniques
|
||||||
|
|
||||||
|
(declare (salience 10))
|
||||||
|
|
||||||
|
(phase match)
|
||||||
|
|
||||||
|
(size ?)
|
||||||
|
|
||||||
|
(not (possible (value any)))
|
||||||
|
|
||||||
|
=>
|
||||||
|
|
||||||
|
(assert (priority 1)))
|
||||||
|
|
||||||
|
;;; **********
|
||||||
|
;;; expand-any
|
||||||
|
;;; **********
|
||||||
|
|
||||||
|
(defrule expand-any
|
||||||
|
|
||||||
|
(declare (salience 10))
|
||||||
|
|
||||||
|
(phase expand-any)
|
||||||
|
|
||||||
|
?f <- (possible (row ?r) (column ?c) (value any) (group ?g) (id ?id))
|
||||||
|
|
||||||
|
(not (possible (value any) (id ?id2&:(< ?id2 ?id))))
|
||||||
|
|
||||||
|
(size ?s)
|
||||||
|
|
||||||
|
(size-value (size ?as&:(<= ?as ?s)) (value ?v))
|
||||||
|
|
||||||
|
(not (possible (row ?r) (column ?c) (value ?v)))
|
||||||
|
|
||||||
|
(not (and (size-value (value ?v2&:(< ?v2 ?v)))
|
||||||
|
|
||||||
|
(not (possible (row ?r) (column ?c) (value ?v2)))))
|
||||||
|
|
||||||
|
=>
|
||||||
|
|
||||||
|
(assert (possible (row ?r) (column ?c) (value ?v) (group ?g) (id ?id))))
|
||||||
|
|
||||||
|
;;; *****************
|
||||||
|
;;; position-expanded
|
||||||
|
;;; *****************
|
||||||
|
|
||||||
|
(defrule position-expanded
|
||||||
|
|
||||||
|
(declare (salience 10))
|
||||||
|
|
||||||
|
(phase expand-any)
|
||||||
|
|
||||||
|
?f <- (possible (row ?r) (column ?c) (value any) (group ?g) (id ?id))
|
||||||
|
|
||||||
|
(size ?s)
|
||||||
|
|
||||||
|
(not (and (size-value (size ?as&:(<= ?as ?s)) (value ?v))
|
||||||
|
|
||||||
|
(not (possible (row ?r) (column ?c) (value ?v)))))
|
||||||
|
|
||||||
|
=>
|
||||||
|
|
||||||
|
(retract ?f))
|
||||||
|
|
||||||
|
;;; ###########
|
||||||
|
;;; PHASE RULES
|
||||||
|
;;; ###########
|
||||||
|
|
||||||
|
;;; ***************
|
||||||
|
;;; expand-any-done
|
||||||
|
;;; ***************
|
||||||
|
|
||||||
|
(defrule expand-any-done
|
||||||
|
|
||||||
|
(declare (salience 10))
|
||||||
|
|
||||||
|
?f <- (phase expand-any)
|
||||||
|
|
||||||
|
(not (possible (value any)))
|
||||||
|
|
||||||
|
=>
|
||||||
|
|
||||||
|
(retract ?f)
|
||||||
|
|
||||||
|
(assert (phase initial-output))
|
||||||
|
(assert (print-position 1 1)))
|
||||||
|
|
||||||
|
;;; ***********
|
||||||
|
;;; begin-match
|
||||||
|
;;; ***********
|
||||||
|
|
||||||
|
(defrule begin-match
|
||||||
|
|
||||||
|
(declare (salience -20))
|
||||||
|
|
||||||
|
?f <- (phase initial-output)
|
||||||
|
|
||||||
|
=>
|
||||||
|
|
||||||
|
(retract ?f)
|
||||||
|
|
||||||
|
(assert (phase match)))
|
||||||
|
|
||||||
|
;;; *****************
|
||||||
|
;;; begin-elimination
|
||||||
|
;;; *****************
|
||||||
|
|
||||||
|
(defrule begin-elimination
|
||||||
|
|
||||||
|
(declare (salience -20))
|
||||||
|
|
||||||
|
?f <- (phase match)
|
||||||
|
|
||||||
|
(not (not (impossible)))
|
||||||
|
|
||||||
|
=>
|
||||||
|
|
||||||
|
(retract ?f)
|
||||||
|
|
||||||
|
(assert (phase elimination)))
|
||||||
|
|
||||||
|
;;; *************
|
||||||
|
;;; next-priority
|
||||||
|
;;; *************
|
||||||
|
|
||||||
|
(defrule next-priority
|
||||||
|
|
||||||
|
(declare (salience -20))
|
||||||
|
|
||||||
|
(phase match)
|
||||||
|
|
||||||
|
(not (impossible))
|
||||||
|
|
||||||
|
(priority ?last)
|
||||||
|
|
||||||
|
(not (priority ?p&:(> ?p ?last)))
|
||||||
|
|
||||||
|
(technique (priority ?next&:(> ?next ?last)))
|
||||||
|
|
||||||
|
(not (technique (priority ?p&:(> ?p ?last)&:(< ?p ?next))))
|
||||||
|
|
||||||
|
=>
|
||||||
|
|
||||||
|
(assert (priority ?next)))
|
||||||
|
|
||||||
|
;;; ************
|
||||||
|
;;; begin-output
|
||||||
|
;;; ************
|
||||||
|
|
||||||
|
(defrule begin-output
|
||||||
|
|
||||||
|
(declare (salience -20))
|
||||||
|
|
||||||
|
?f <- (phase match)
|
||||||
|
|
||||||
|
(not (impossible))
|
||||||
|
|
||||||
|
(priority ?last)
|
||||||
|
|
||||||
|
(not (priority ?p&:(> ?p ?last)))
|
||||||
|
|
||||||
|
(not (technique (priority ?next&:(> ?next ?last))))
|
||||||
|
|
||||||
|
=>
|
||||||
|
|
||||||
|
(retract ?f)
|
||||||
|
|
||||||
|
(assert (phase final-output))
|
||||||
|
(assert (print-position 1 1)))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
15
samples/CMake/sample1.cmake
Normal file
15
samples/CMake/sample1.cmake
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
cmake_minimum_required(VERSION 2.6)
|
||||||
|
|
||||||
|
enable_testing()
|
||||||
|
|
||||||
|
set(CMAKE_BUILD_TYPE debug)
|
||||||
|
|
||||||
|
include_directories("/usr/local/include")
|
||||||
|
|
||||||
|
find_library(ssl_LIBRARY NAMES ssl PATHS "/usr/local/lib")
|
||||||
|
|
||||||
|
add_custom_command(OUTPUT "ver.c" "ver.h" COMMAND ./ver.sh)
|
||||||
|
|
||||||
|
add_executable(foo foo.c bar.c baz.c ver.c)
|
||||||
|
|
||||||
|
target_link_libraries(foo ${ssl_LIBRARY})
|
||||||
25
samples/CMake/sample2.cmake
Normal file
25
samples/CMake/sample2.cmake
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
|
||||||
|
|
||||||
|
project(PCLVisualizer)
|
||||||
|
target_link_libraries (PCLVisualizer ${PCL_LIBRARIES})
|
||||||
|
|
||||||
|
#it seems it's needed only on OS X 10.9
|
||||||
|
find_package(GLEW REQUIRED)
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I/usr/include -v")
|
||||||
|
|
||||||
|
find_package(PCL 1.7 REQUIRED)
|
||||||
|
|
||||||
|
include_directories(${PCL_INCLUDE_DIRS})
|
||||||
|
link_directories(${PCL_LIBRARY_DIRS})
|
||||||
|
add_definitions(${PCL_DEFINITIONS})
|
||||||
|
|
||||||
|
set(PCL_BUILD_TYPE Release)
|
||||||
|
|
||||||
|
file(GLOB PCL_openni_viewer_SRC
|
||||||
|
"src/*.h"
|
||||||
|
"src/*.cpp"
|
||||||
|
)
|
||||||
|
add_executable(PCLVisualizer ${PCL_openni_viewer_SRC})
|
||||||
|
|
||||||
|
#add this line to solve probem in mac os x 10.9
|
||||||
|
target_link_libraries(PCLVisualizer ${PCL_COMMON_LIBRARIES} ${PCL_IO_LIBRARIES} ${PCL_VISUALIZATION_LIBRARIES} ${PCL_FEATURES_LIBRARIES})
|
||||||
33
samples/CMake/sample3.cmake
Normal file
33
samples/CMake/sample3.cmake
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
# Specifications for building user and development documentation.
|
||||||
|
#
|
||||||
|
# ====================================================================
|
||||||
|
# Copyright (c) 2009 Ian Blumel. All rights reserved.
|
||||||
|
#
|
||||||
|
# This software is licensed as described in the file LICENSE, which
|
||||||
|
# you should have received as part of this distribution.
|
||||||
|
# ====================================================================
|
||||||
|
|
||||||
|
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
|
||||||
|
|
||||||
|
FIND_FILE( SPHINX sphinx-build.exe)
|
||||||
|
|
||||||
|
# If we are windows call to the make.bat file, otherwise rely on the Makefile
|
||||||
|
# to handle the processing.
|
||||||
|
IF(WIN32)
|
||||||
|
SET(SPHINX_MAKE make.bat)
|
||||||
|
ELSE(WIN32)
|
||||||
|
SET(SPHINX_MAKE make)
|
||||||
|
ENDIF(WIN32)
|
||||||
|
|
||||||
|
ADD_CUSTOM_TARGET(
|
||||||
|
doc_usr
|
||||||
|
COMMAND ${SPHINX_MAKE} html
|
||||||
|
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/usr
|
||||||
|
)
|
||||||
|
|
||||||
|
ADD_CUSTOM_TARGET(
|
||||||
|
doc_dev
|
||||||
|
COMMAND ${SPHINX_MAKE} html
|
||||||
|
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/dev
|
||||||
|
)
|
||||||
|
|
||||||
33
samples/CMake/sample4.cmake
Normal file
33
samples/CMake/sample4.cmake
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
cmake_minimum_required (VERSION 2.6)
|
||||||
|
|
||||||
|
set (CMAKE_RUNTIME_OUTPUT_DIRECTORY "bin")
|
||||||
|
|
||||||
|
list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/vala)
|
||||||
|
find_package(Vala REQUIRED)
|
||||||
|
include(ValaPrecompile)
|
||||||
|
include(ValaVersion)
|
||||||
|
ensure_vala_version("0.11.0" MINIMUM)
|
||||||
|
|
||||||
|
project (template C)
|
||||||
|
|
||||||
|
find_package(PkgConfig)
|
||||||
|
|
||||||
|
pkg_check_modules(GOBJECT REQUIRED gobject-2.0)
|
||||||
|
add_definitions(${GOBJECT_CFLAGS} ${GOBJECT_CFLAGS_OTHER})
|
||||||
|
link_libraries(${GOBJECT_LIBRARIES})
|
||||||
|
link_directories(${GOBJECT_LIBRARY_DIRS})
|
||||||
|
|
||||||
|
|
||||||
|
vala_precompile(VALA_C
|
||||||
|
src/template.vala
|
||||||
|
PACKAGES
|
||||||
|
OPTIONS
|
||||||
|
--thread
|
||||||
|
CUSTOM_VAPIS
|
||||||
|
GENERATE_VAPI
|
||||||
|
GENERATE_HEADER
|
||||||
|
DIRECTORY
|
||||||
|
gen
|
||||||
|
)
|
||||||
|
|
||||||
|
add_executable("template" ${VALA_C})
|
||||||
89
samples/CMake/sample5.cmake
Normal file
89
samples/CMake/sample5.cmake
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
# - Check if the STDCALL function exists.
|
||||||
|
# This works for non-cdecl functions (kernel32 functions, for example)
|
||||||
|
# CHECK_STDCALL_FUNCTION_EXISTS(FUNCTION FUNCTION_DUMMY_ARGS VARIABLE)
|
||||||
|
# - macro which checks if the stdcall function exists
|
||||||
|
# FUNCTION_DECLARATION - the definition of the function ( e.g.: Sleep(500) )
|
||||||
|
# VARIABLE - variable to store the result
|
||||||
|
#
|
||||||
|
# The following variables may be set before calling this macro to
|
||||||
|
# modify the way the check is run:
|
||||||
|
#
|
||||||
|
# CMAKE_REQUIRED_FLAGS = string of compile command line flags
|
||||||
|
# CMAKE_REQUIRED_DEFINITIONS = list of macros to define (-DFOO=bar)
|
||||||
|
# CMAKE_REQUIRED_INCLUDES = list of include directories
|
||||||
|
# CMAKE_REQUIRED_LIBRARIES = list of libraries to link
|
||||||
|
# CMAKE_EXTRA_INCLUDE_FILES = list of extra includes to check in
|
||||||
|
|
||||||
|
MACRO(CHECK_STDCALL_FUNCTION_EXISTS FUNCTION_DECLARATION VARIABLE)
|
||||||
|
IF("${VARIABLE}" MATCHES "^${VARIABLE}$")
|
||||||
|
#get includes
|
||||||
|
SET(CHECK_STDCALL_FUNCTION_PREMAIN)
|
||||||
|
FOREACH(def ${CMAKE_EXTRA_INCLUDE_FILES})
|
||||||
|
SET(CHECK_STDCALL_FUNCTION_PREMAIN "${CHECK_STDCALL_FUNCTION_PREMAIN}#include \"${def}\"\n")
|
||||||
|
ENDFOREACH(def)
|
||||||
|
|
||||||
|
#add some default includes
|
||||||
|
IF ( HAVE_WINDOWS_H )
|
||||||
|
SET(CHECK_STDCALL_FUNCTION_PREMAIN "${CHECK_STDCALL_FUNCTION_PREMAIN}#include \"windows.h\"\n")
|
||||||
|
ENDIF ( HAVE_WINDOWS_H )
|
||||||
|
IF ( HAVE_UNISTD_H )
|
||||||
|
SET(CHECK_STDCALL_FUNCTION_PREMAIN "${CHECK_STDCALL_FUNCTION_PREMAIN}#include \"unistd.h\"\n")
|
||||||
|
ENDIF ( HAVE_UNISTD_H )
|
||||||
|
IF ( HAVE_DIRECT_H )
|
||||||
|
SET(CHECK_STDCALL_FUNCTION_PREMAIN "${CHECK_STDCALL_FUNCTION_PREMAIN}#include \"direct.h\"\n")
|
||||||
|
ENDIF ( HAVE_DIRECT_H )
|
||||||
|
IF ( HAVE_IO_H )
|
||||||
|
SET(CHECK_STDCALL_FUNCTION_PREMAIN "${CHECK_STDCALL_FUNCTION_PREMAIN}#include \"io.h\"\n")
|
||||||
|
ENDIF ( HAVE_IO_H )
|
||||||
|
IF ( HAVE_SYS_TIMEB_H )
|
||||||
|
SET(CHECK_STDCALL_FUNCTION_PREMAIN "${CHECK_STDCALL_FUNCTION_PREMAIN}#include \"sys/timeb.h\"\n")
|
||||||
|
ENDIF ( HAVE_SYS_TIMEB_H )
|
||||||
|
|
||||||
|
STRING(REGEX REPLACE "(\\(.*\\))" "" CHECK_STDCALL_FUNCTION_EXISTS_FUNCTION ${FUNCTION_DECLARATION} )
|
||||||
|
|
||||||
|
SET(MACRO_CHECK_STDCALL_FUNCTION_DEFINITIONS "${CMAKE_REQUIRED_FLAGS}")
|
||||||
|
MESSAGE(STATUS "Looking for ${CHECK_STDCALL_FUNCTION_EXISTS_FUNCTION}")
|
||||||
|
|
||||||
|
IF(CMAKE_REQUIRED_LIBRARIES)
|
||||||
|
SET(CHECK_STDCALL_FUNCTION_EXISTS_ADD_LIBRARIES
|
||||||
|
"-DLINK_LIBRARIES:STRING=${CMAKE_REQUIRED_LIBRARIES}")
|
||||||
|
ELSE(CMAKE_REQUIRED_LIBRARIES)
|
||||||
|
SET(CHECK_STDCALL_FUNCTION_EXISTS_ADD_LIBRARIES)
|
||||||
|
ENDIF(CMAKE_REQUIRED_LIBRARIES)
|
||||||
|
|
||||||
|
IF(CMAKE_REQUIRED_INCLUDES)
|
||||||
|
SET(CHECK_STDCALL_FUNCTION_EXISTS_ADD_INCLUDES
|
||||||
|
"-DINCLUDE_DIRECTORIES:STRING=${CMAKE_REQUIRED_INCLUDES}")
|
||||||
|
ELSE(CMAKE_REQUIRED_INCLUDES)
|
||||||
|
SET(CHECK_STDCALL_FUNCTION_EXISTS_ADD_INCLUDES)
|
||||||
|
ENDIF(CMAKE_REQUIRED_INCLUDES)
|
||||||
|
|
||||||
|
SET(CHECK_STDCALL_FUNCTION_DECLARATION ${FUNCTION_DECLARATION})
|
||||||
|
CONFIGURE_FILE("${clucene-shared_SOURCE_DIR}/cmake/CheckStdCallFunctionExists.cpp.in"
|
||||||
|
"${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckStdCallFunctionExists.cpp" IMMEDIATE @ONLY)
|
||||||
|
FILE(READ "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckStdCallFunctionExists.cpp"
|
||||||
|
CHECK_STDCALL_FUNCTION_CONTENT)
|
||||||
|
|
||||||
|
TRY_COMPILE(${VARIABLE}
|
||||||
|
${CMAKE_BINARY_DIR}
|
||||||
|
"${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckStdCallFunctionExists.cpp"
|
||||||
|
COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS}
|
||||||
|
CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=${MACRO_CHECK_STDCALL_FUNCTION_DEFINITIONS}
|
||||||
|
"${CHECK_STDCALL_FUNCTION_EXISTS_ADD_LIBRARIES}"
|
||||||
|
"${CHECK_STDCALL_FUNCTION_EXISTS_ADD_INCLUDES}"
|
||||||
|
OUTPUT_VARIABLE OUTPUT)
|
||||||
|
IF(${VARIABLE})
|
||||||
|
SET(${VARIABLE} 1 CACHE INTERNAL "Have function ${FUNCTION_DECLARATION}")
|
||||||
|
MESSAGE(STATUS "Looking for ${FUNCTION_DECLARATION} - found")
|
||||||
|
FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
|
||||||
|
"Determining if the stdcall function ${FUNCTION_DECLARATION} exists passed with the following output:\n"
|
||||||
|
"${OUTPUT}\nCheckStdCallFunctionExists.cpp:\n${CHECK_STDCALL_FUNCTION_CONTENT}\n\n")
|
||||||
|
ELSE(${VARIABLE})
|
||||||
|
MESSAGE(STATUS "Looking for ${FUNCTION_DECLARATION} - not found")
|
||||||
|
SET(${VARIABLE} "" CACHE INTERNAL "Have function ${FUNCTION_DECLARATION}")
|
||||||
|
FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
|
||||||
|
"Determining if the stdcall function ${FUNCTION_DECLARATION} exists failed with the following output:\n"
|
||||||
|
"${OUTPUT}\nCheckStdCallFunctionExists.cpp:\n${CHECK_STDCALL_FUNCTION_CONTENT}\n\n")
|
||||||
|
ENDIF(${VARIABLE})
|
||||||
|
ENDIF("${VARIABLE}" MATCHES "^${VARIABLE}$")
|
||||||
|
ENDMACRO(CHECK_STDCALL_FUNCTION_EXISTS)
|
||||||
22
samples/CMake/uninstall.cmake.in
Normal file
22
samples/CMake/uninstall.cmake.in
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
IF (NOT EXISTS "@PROJECT_BINARY_DIR@/install_manifest.txt")
|
||||||
|
MESSAGE (FATAL_ERROR "Cannot find install manifest: \"@PROJECT_BINARY_DIR@/install_manifest.txt\"")
|
||||||
|
ENDIF (NOT EXISTS "@PROJECT_BINARY_DIR@/install_manifest.txt")
|
||||||
|
|
||||||
|
FILE (READ "@PROJECT_BINARY_DIR@/install_manifest.txt" files)
|
||||||
|
STRING (REGEX REPLACE "\n" ";" files "${files}")
|
||||||
|
FOREACH (file ${files})
|
||||||
|
MESSAGE (STATUS "Uninstalling \"$ENV{DESTDIR}${file}\"")
|
||||||
|
IF (EXISTS "$ENV{DESTDIR}${file}")
|
||||||
|
EXEC_PROGRAM (
|
||||||
|
"@CMAKE_COMMAND@" ARGS "-E remove \"$ENV{DESTDIR}${file}\""
|
||||||
|
OUTPUT_VARIABLE rm_out
|
||||||
|
RETURN_VALUE rm_retval
|
||||||
|
)
|
||||||
|
IF (NOT "${rm_retval}" STREQUAL 0)
|
||||||
|
MESSAGE (FATAL_ERROR "Problem when removing \"$ENV{DESTDIR}${file}\"")
|
||||||
|
ENDIF (NOT "${rm_retval}" STREQUAL 0)
|
||||||
|
ELSE (EXISTS "$ENV{DESTDIR}${file}")
|
||||||
|
MESSAGE (STATUS "File \"$ENV{DESTDIR}${file}\" does not exist.")
|
||||||
|
ENDIF (EXISTS "$ENV{DESTDIR}${file}")
|
||||||
|
ENDFOREACH (file)
|
||||||
|
|
||||||
@@ -58,6 +58,34 @@ var BA: [BlockSpace] int;
|
|||||||
forall ba in BA do
|
forall ba in BA do
|
||||||
ba = here.id;
|
ba = here.id;
|
||||||
|
|
||||||
|
//
|
||||||
|
// The 'hasSingleLocalSubdomain' method on arrays will return true if the
|
||||||
|
// index set for a locale can be represented by a single domain.
|
||||||
|
//
|
||||||
|
if !BA.hasSingleLocalSubdomain() then
|
||||||
|
halt("For a Block distribution, the index set per locale should be \
|
||||||
|
represented by a single domain");
|
||||||
|
|
||||||
|
//
|
||||||
|
// If the distribution's subdomains can be represented as single subdomain,
|
||||||
|
// we can use the 'localSubdomain' method to get the index set for the
|
||||||
|
// current locale.
|
||||||
|
//
|
||||||
|
// Below, we'll use the index set to confirm that the array elements have the
|
||||||
|
// correct locale id.
|
||||||
|
//
|
||||||
|
|
||||||
|
for L in Locales {
|
||||||
|
on L {
|
||||||
|
const indices = BA.localSubdomain();
|
||||||
|
for i in indices {
|
||||||
|
if BA[i] != L.id then
|
||||||
|
halt("Error: incorrect locale id");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Output the Block-distributed array to visually see how the elements
|
// Output the Block-distributed array to visually see how the elements
|
||||||
// are partitioned across the locales.
|
// are partitioned across the locales.
|
||||||
@@ -104,6 +132,14 @@ writeln("Block Array Index Map");
|
|||||||
writeln(BA2);
|
writeln(BA2);
|
||||||
writeln();
|
writeln();
|
||||||
|
|
||||||
|
//
|
||||||
|
// We can use the 'targetLocales' method available on an array to get the
|
||||||
|
// locales array used as targets.
|
||||||
|
//
|
||||||
|
for (L, ML) in zip(BA2.targetLocales(), MyLocales) do
|
||||||
|
if L != ML then
|
||||||
|
halt("Error: BA2.targetLocales() should equal MyLocales");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -126,6 +162,18 @@ writeln("Cyclic Array Index Map");
|
|||||||
writeln(CA);
|
writeln(CA);
|
||||||
writeln();
|
writeln();
|
||||||
|
|
||||||
|
//
|
||||||
|
// The domain returned by 'localSubdomain' need not be a dense block, as is
|
||||||
|
// the case for the Cyclic Distribution.
|
||||||
|
//
|
||||||
|
on Locales[0] {
|
||||||
|
const indices = CA.localSubdomain();
|
||||||
|
for i in indices {
|
||||||
|
if CA[i] != 0 then
|
||||||
|
halt("Error: Cyclic array values on Locale 0 should be zero");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Next, we'll declare a Block-Cyclic distribution. These
|
// Next, we'll declare a Block-Cyclic distribution. These
|
||||||
@@ -146,6 +194,46 @@ writeln("Block-Cyclic Array Index Map");
|
|||||||
writeln(BCA);
|
writeln(BCA);
|
||||||
writeln();
|
writeln();
|
||||||
|
|
||||||
|
//
|
||||||
|
// A locale's index set for a Block-Cyclic distribution cannot be represented
|
||||||
|
// by a single subdomain.
|
||||||
|
//
|
||||||
|
if BCA.hasSingleLocalSubdomain() then
|
||||||
|
halt("A Block-Cyclic index set cannot be represented by a single subdomain");
|
||||||
|
|
||||||
|
//
|
||||||
|
// If the local index set cannot be represented by a single subdomain,
|
||||||
|
// we can use the 'localSubdomains' iterator to yield a number of domains
|
||||||
|
// that represent the whole index set.
|
||||||
|
//
|
||||||
|
// Let's write a function that will use 'localSubdomains' to verify the
|
||||||
|
// correctness of the array values.
|
||||||
|
//
|
||||||
|
|
||||||
|
proc verifyID(Data: []) {
|
||||||
|
for L in Locales {
|
||||||
|
on L {
|
||||||
|
for indices in Data.localSubdomains() {
|
||||||
|
for i in indices {
|
||||||
|
if Data[i] != L.id then
|
||||||
|
halt("Error: incorrect locale id");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
verifyID(BCA);
|
||||||
|
|
||||||
|
//
|
||||||
|
// The 'localSubdomains' iterator is also available on distributions that
|
||||||
|
// can represent a locale's index set with a single domain. This allows us to
|
||||||
|
// write more general code that will work for all distributions.
|
||||||
|
//
|
||||||
|
// This means that we can call the 'verifyID' function on any array, like the
|
||||||
|
// 'BA' array from earlier.
|
||||||
|
//
|
||||||
|
verifyID(BA);
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// The ReplicatedDist distribution is different: each of the
|
// The ReplicatedDist distribution is different: each of the
|
||||||
|
|||||||
@@ -292,14 +292,14 @@ proc main() {
|
|||||||
LagrangeLeapFrog();
|
LagrangeLeapFrog();
|
||||||
|
|
||||||
if debug {
|
if debug {
|
||||||
// deprint("[[ Forces ]]", fx, fy, fz);
|
deprintatomic("[[ Forces ]]", fx, fy, fz);
|
||||||
deprint("[[ Positions ]]", x, y, z);
|
deprint("[[ Positions ]]", x, y, z);
|
||||||
deprint("[[ p, e, q ]]", p, e, q);
|
deprint("[[ p, e, q ]]", p, e, q);
|
||||||
}
|
}
|
||||||
if showProgress then
|
if showProgress then
|
||||||
writeln("time = ", format("%e", time), ", dt=", format("%e", deltatime),
|
writef("time = %er, dt=%er, %s", time, deltatime,
|
||||||
if doTiming then ", elapsed = " + (getCurrentTime()-iterTime)
|
if doTiming then ", elapsed = " + (getCurrentTime()-iterTime) +"\n"
|
||||||
else "");
|
else "\n");
|
||||||
}
|
}
|
||||||
if (cycle == maxcycles) {
|
if (cycle == maxcycles) {
|
||||||
writeln("Stopped early due to reaching maxnumsteps");
|
writeln("Stopped early due to reaching maxnumsteps");
|
||||||
@@ -314,12 +314,10 @@ proc main() {
|
|||||||
if printCoords {
|
if printCoords {
|
||||||
var outfile = open("coords.out", iomode.cw);
|
var outfile = open("coords.out", iomode.cw);
|
||||||
var writer = outfile.writer();
|
var writer = outfile.writer();
|
||||||
var fmtstr = if debug then "%1.9e" else "%1.4e";
|
var fmtstr = if debug then "%1.9re %1.9er %1.9er\n"
|
||||||
for i in Nodes {
|
else "%1.4er %1.4er %1.4er\n";
|
||||||
writer.writeln(format(fmtstr, x[i]), " ",
|
for i in Nodes do
|
||||||
format(fmtstr, y[i]), " ",
|
writer.writef(fmtstr, x[i], y[i], z[i]);
|
||||||
format(fmtstr, z[i]));
|
|
||||||
}
|
|
||||||
writer.close();
|
writer.close();
|
||||||
outfile.close();
|
outfile.close();
|
||||||
}
|
}
|
||||||
@@ -479,7 +477,7 @@ inline proc localizeNeighborNodes(eli: index(Elems),
|
|||||||
y: [] real, ref y_local: 8*real,
|
y: [] real, ref y_local: 8*real,
|
||||||
z: [] real, ref z_local: 8*real) {
|
z: [] real, ref z_local: 8*real) {
|
||||||
|
|
||||||
for param i in 1..nodesPerElem {
|
for i in 1..nodesPerElem {
|
||||||
const noi = elemToNode[eli][i];
|
const noi = elemToNode[eli][i];
|
||||||
|
|
||||||
x_local[i] = x[noi];
|
x_local[i] = x[noi];
|
||||||
@@ -670,7 +668,7 @@ proc SumElemStressesToNodeForces(b_x: 8*real, b_y: 8*real, b_z: 8*real,
|
|||||||
ref fx: 8*real,
|
ref fx: 8*real,
|
||||||
ref fy: 8*real,
|
ref fy: 8*real,
|
||||||
ref fz: 8*real) {
|
ref fz: 8*real) {
|
||||||
for param i in 1..8 {
|
for i in 1..8 {
|
||||||
fx[i] = -(stress_xx * b_x[i]);
|
fx[i] = -(stress_xx * b_x[i]);
|
||||||
fy[i] = -(stress_yy * b_y[i]);
|
fy[i] = -(stress_yy * b_y[i]);
|
||||||
fz[i] = -(stress_zz * b_z[i]);
|
fz[i] = -(stress_zz * b_z[i]);
|
||||||
@@ -725,17 +723,17 @@ inline proc CalcElemFBHourglassForce(xd: 8*real, yd: 8*real, zd: 8*real,
|
|||||||
var hx, hy, hz: 4*real;
|
var hx, hy, hz: 4*real;
|
||||||
|
|
||||||
// reduction
|
// reduction
|
||||||
for param i in 1..4 {
|
for i in 1..4 {
|
||||||
for param j in 1..8 {
|
for j in 1..8 {
|
||||||
hx[i] += hourgam[j][i] * xd[j];
|
hx[i] += hourgam[j][i] * xd[j];
|
||||||
hy[i] += hourgam[j][i] * yd[j];
|
hy[i] += hourgam[j][i] * yd[j];
|
||||||
hz[i] += hourgam[j][i] * zd[j];
|
hz[i] += hourgam[j][i] * zd[j];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for param i in 1..8 {
|
for i in 1..8 {
|
||||||
var shx, shy, shz: real;
|
var shx, shy, shz: real;
|
||||||
for param j in 1..4 {
|
for j in 1..4 {
|
||||||
shx += hourgam[i][j] * hx[j];
|
shx += hourgam[i][j] * hx[j];
|
||||||
shy += hourgam[i][j] * hy[j];
|
shy += hourgam[i][j] * hy[j];
|
||||||
shz += hourgam[i][j] * hz[j];
|
shz += hourgam[i][j] * hz[j];
|
||||||
@@ -1088,16 +1086,16 @@ proc CalcFBHourglassForceForElems(determ, x8n, y8n, z8n, dvdx, dvdy, dvdz) {
|
|||||||
|
|
||||||
/* TODO: Can we enable this local block? */
|
/* TODO: Can we enable this local block? */
|
||||||
// local {
|
// local {
|
||||||
for param i in 1..4 {
|
for i in 1..4 {
|
||||||
var hourmodx, hourmody, hourmodz: real;
|
var hourmodx, hourmody, hourmodz: real;
|
||||||
// reduction
|
// reduction
|
||||||
for param j in 1..8 {
|
for j in 1..8 {
|
||||||
hourmodx += x8n[eli][j] * gammaCoef[i][j];
|
hourmodx += x8n[eli][j] * gammaCoef[i][j];
|
||||||
hourmody += y8n[eli][j] * gammaCoef[i][j];
|
hourmody += y8n[eli][j] * gammaCoef[i][j];
|
||||||
hourmodz += z8n[eli][j] * gammaCoef[i][j];
|
hourmodz += z8n[eli][j] * gammaCoef[i][j];
|
||||||
}
|
}
|
||||||
|
|
||||||
for param j in 1..8 {
|
for j in 1..8 {
|
||||||
hourgam[j][i] = gammaCoef[i][j] - volinv *
|
hourgam[j][i] = gammaCoef[i][j] - volinv *
|
||||||
(dvdx[eli][j] * hourmodx +
|
(dvdx[eli][j] * hourmodx +
|
||||||
dvdy[eli][j] * hourmody +
|
dvdy[eli][j] * hourmody +
|
||||||
@@ -1221,7 +1219,7 @@ proc CalcKinematicsForElems(dxx, dyy, dzz, const dt: real) {
|
|||||||
arealg[k] = CalcElemCharacteristicLength(x_local, y_local, z_local,
|
arealg[k] = CalcElemCharacteristicLength(x_local, y_local, z_local,
|
||||||
volume);
|
volume);
|
||||||
|
|
||||||
for param i in 1..8 {
|
for i in 1..8 {
|
||||||
x_local[i] -= dt2 * xd_local[i];
|
x_local[i] -= dt2 * xd_local[i];
|
||||||
y_local[i] -= dt2 * yd_local[i];
|
y_local[i] -= dt2 * yd_local[i];
|
||||||
z_local[i] -= dt2 * zd_local[i];
|
z_local[i] -= dt2 * zd_local[i];
|
||||||
@@ -1669,7 +1667,7 @@ proc CalcSoundSpeedForElems(vnewc, rho0:real, enewc, pnewc, pbvc, bvc) {
|
|||||||
|
|
||||||
|
|
||||||
iter elemToNodes(elem) {
|
iter elemToNodes(elem) {
|
||||||
for param i in 1..nodesPerElem do
|
for i in 1..nodesPerElem do
|
||||||
yield elemToNode[elem][i];
|
yield elemToNode[elem][i];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1679,14 +1677,19 @@ iter elemToNodesTuple(e) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
proc deprint(title:string, x:[?D] real, y:[D]real, z:[D]real) {
|
proc deprint(title:string, x:[?D] real, y:[D] real, z:[D] real) {
|
||||||
writeln(title);
|
writeln(title);
|
||||||
for i in D {
|
for i in D do
|
||||||
writeln(format("%3d", i), ": ",
|
writef("%3i: %3.4er %3.4er %3.4er\n",
|
||||||
format("%3.4e", x[i]), " ",
|
if use3DRepresentation then idx3DTo1D(i, D.dim(1).size) else i,
|
||||||
format("%3.4e", y[i]), " ",
|
x[i], y[i], z[i]);
|
||||||
format("%3.4e", z[i]));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
proc deprintatomic(title:string, x:[?D] atomic real, y:[] atomic real, z:[] atomic real) {
|
||||||
|
writeln(title);
|
||||||
|
for i in D do
|
||||||
|
writef("%3i: %3.4er %3.4er %3.4er\n",
|
||||||
|
if use3DRepresentation then idx3DTo1D(i, D.dim(1).size) else i,
|
||||||
|
x[i].peek(), y[i].peek(), z[i].peek());
|
||||||
|
}
|
||||||
|
|||||||
6
samples/Charity/example.ch
Normal file
6
samples/Charity/example.ch
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
%
|
||||||
|
% Some very badly written Charity
|
||||||
|
%
|
||||||
|
|
||||||
|
data LA(A) -> D = ss: A -> D
|
||||||
|
| ff: -> D.
|
||||||
172
samples/Clarion/CStringClass.clw
Normal file
172
samples/Clarion/CStringClass.clw
Normal file
@@ -0,0 +1,172 @@
|
|||||||
|
Member()
|
||||||
|
omit('***$***',_VER_C55)
|
||||||
|
_ABCDllMode_ EQUATE(0)
|
||||||
|
_ABCLinkMode_ EQUATE(1)
|
||||||
|
***$***
|
||||||
|
Include('Equates.CLW'),ONCE
|
||||||
|
Include('Keycodes.CLW'),ONCE
|
||||||
|
Include('Errors.CLW'),ONCE
|
||||||
|
Map
|
||||||
|
End ! map
|
||||||
|
Include('CStringClass.inc'),ONCE
|
||||||
|
CStringClass.Construct PROCEDURE ! Declare Procedure
|
||||||
|
CODE
|
||||||
|
SELF.bufferSize = DEFAULT_CS_BUFFER_SIZE
|
||||||
|
SELF.CS &= New(CSTRING(SELF.bufferSize))
|
||||||
|
CStringClass.Destruct PROCEDURE ! Declare Procedure
|
||||||
|
CODE
|
||||||
|
Dispose(SELF.cs)
|
||||||
|
CStringClass.Cat PROCEDURE (STRING pStr) !,*CSTRING,PROC ! Declare Procedure
|
||||||
|
newLen LONG,AUTO
|
||||||
|
oldCS &CSTRING
|
||||||
|
CODE
|
||||||
|
newLen = Len(pStr)
|
||||||
|
IF (newLen+SELF.strLength+2) > SELF.newStrSize
|
||||||
|
! Only grow the internal string if the result of the cat will be larger than the string currently is.
|
||||||
|
! The reason for the "+2" is because this is used in the string slicing outside this IF. Without this matching +2 there is potential for an out of bounds slice which would be bad!
|
||||||
|
|
||||||
|
! Save a temporary copy of the old string so we can us it in the concatination after we have grown it!
|
||||||
|
oldCS &= New(CSTRING(SELF.strLength+1))
|
||||||
|
oldCS = SELF.CS
|
||||||
|
Dispose(SELF.CS)
|
||||||
|
|
||||||
|
SELF.newStrSize = newLen + SELF.strLength + 1 + SELF.bufferSize
|
||||||
|
SELF.CS &= New(CSTRING(SELF.newStrSize))
|
||||||
|
SELF.CS = oldCS
|
||||||
|
Dispose(oldCS)
|
||||||
|
END
|
||||||
|
|
||||||
|
! Append the new string directly to the end of the old one.
|
||||||
|
SELF.CS[SELF.strLength+1 : SELF.strLength+newLen] = pStr
|
||||||
|
! And terminate the CSTRING manually
|
||||||
|
SELF.CS[SELF.strLength+newLen+1] = '<0>'
|
||||||
|
|
||||||
|
! This is the same as doing "SELF.strLength = Len(SELF.CS)" but the Len() is _really_ slow on large strings. This is much faster!
|
||||||
|
SELF.strLength += newLen
|
||||||
|
|
||||||
|
! This is what it used to be:
|
||||||
|
! SELF.Str(SELF.Str() & s)
|
||||||
|
! It is a nice and neat solution but performance, especially on large strings was terrible!
|
||||||
|
|
||||||
|
RETURN SELF.Str()
|
||||||
|
CStringClass.Str PROCEDURE (STRING pStr) !,*CSTRING, PROC ! Declare Procedure
|
||||||
|
CODE
|
||||||
|
IF Len(pStr) > SELF.newStrSize
|
||||||
|
! Only Dispose/New the internal string if the new one requires it.
|
||||||
|
! This might be slightly innefficient in terms of memory usage when the string gets smaller
|
||||||
|
! But it is _vasty_ better for performance when the string gets added to a lot.
|
||||||
|
Dispose(SELF.CS)
|
||||||
|
SELF.newStrSize = Len(pStr) + 1 + SELF.bufferSize
|
||||||
|
SELF.CS &= New(CSTRING(SELF.newStrSize))
|
||||||
|
END
|
||||||
|
|
||||||
|
SELF.CS = pStr
|
||||||
|
SELF.strLength = Len(SELF.CS)
|
||||||
|
|
||||||
|
RETURN SELF.CS
|
||||||
|
CStringClass.Len PROCEDURE !,LONG ! Declare Procedure
|
||||||
|
CODE
|
||||||
|
RETURN SELF.strLength
|
||||||
|
CStringClass.Replace PROCEDURE (STRING pFind, STRING pReplace) !,*CSTRING,PROC ! Declare Procedure
|
||||||
|
! FindString , ReplaceWith
|
||||||
|
locate LONG,AUTO
|
||||||
|
lastLocate LONG
|
||||||
|
CODE
|
||||||
|
LOOP
|
||||||
|
locate = InString(Upper(pFind), Upper(SELF.Str()), 1, lastLocate+1)
|
||||||
|
IF ~locate
|
||||||
|
BREAK
|
||||||
|
END
|
||||||
|
|
||||||
|
! So we dont end up having recursive replacement.
|
||||||
|
lastLocate = locate + Len(pReplace)-1
|
||||||
|
|
||||||
|
SELF.Str(Sub(SELF.Str(), 1, locate-1) & |
|
||||||
|
pReplace & |
|
||||||
|
Sub(SELF.Str(), locate+Len(pFind), SELF.Len()) |
|
||||||
|
)
|
||||||
|
END
|
||||||
|
|
||||||
|
RETURN SELF.Str()
|
||||||
|
CStringClass.Str PROCEDURE () !,*CSTRING ! Declare Procedure 3
|
||||||
|
CODE
|
||||||
|
RETURN SELF.CS
|
||||||
|
!------------------------------------------------------------------------------
|
||||||
|
CStringClass.Contains PROCEDURE (STRING pFind, BYTE pCaseSensitive=TRUE) !,BYTE ! Declare Procedure
|
||||||
|
! Returns a value (TRUE) indicating whether the specified String occurs within this string.
|
||||||
|
! Second parameter defaults to a case sensitive search.
|
||||||
|
CODE
|
||||||
|
IF pCaseSensitive = TRUE
|
||||||
|
IF InString(pFind, SELF.Str(), 1 , 1) > 0
|
||||||
|
RETURN TRUE
|
||||||
|
END
|
||||||
|
ELSE
|
||||||
|
IF InString(Lower(pFind), SELF.Lower(), 1 , 1) > 0
|
||||||
|
RETURN TRUE
|
||||||
|
END
|
||||||
|
END
|
||||||
|
|
||||||
|
RETURN FALSE
|
||||||
|
CStringClass.Lower PROCEDURE () !,STRING ! Declare Procedure
|
||||||
|
! Returns a "Lowered" version of the self.cs doesnt change the self.cs
|
||||||
|
CODE
|
||||||
|
RETURN Lower(SELF.CS)
|
||||||
|
CStringClass.SubString PROCEDURE (LONG pPosition, LONG pLength) !,STRING,PROC ! Declare Procedure
|
||||||
|
CODE
|
||||||
|
RETURN Sub(SELF.Str(), pPosition, pLength)
|
||||||
|
CStringClass.ToLower PROCEDURE () !,*CSTRING,PROC ! Declare Procedure
|
||||||
|
! Converts this string to lowercase and returns the converted string
|
||||||
|
|
||||||
|
CODE
|
||||||
|
RETURN SELF.Str(SELF.Lower())
|
||||||
|
CStringClass.ToUpper PROCEDURE () !,*CSTRING,PROC ! Declare Procedure
|
||||||
|
! Converts this string to uppercase and returns the converted string
|
||||||
|
|
||||||
|
CODE
|
||||||
|
RETURN SELF.Str(SELF.Upper())
|
||||||
|
CStringClass.Trim PROCEDURE () !,*CSTRING,PROC ! Declare Procedure
|
||||||
|
CODE
|
||||||
|
SELF.Str(Left(SELF.Str()))
|
||||||
|
SELF.Str(Clip(SELF.Str()))
|
||||||
|
RETURN SELF.Str()
|
||||||
|
CStringClass.Upper PROCEDURE () !,STRING ! Declare Procedure
|
||||||
|
CODE
|
||||||
|
RETURN Upper(SELF.Str())
|
||||||
|
CStringClass.IndexOf PROCEDURE (STRING pLookIn, BYTE pCaseSensitive=TRUE) !,LONG ! Declare Procedure
|
||||||
|
! Returns the index of the first parameter (pLookIn) is found within the SELF.CS
|
||||||
|
! zero if it is not found
|
||||||
|
CODE
|
||||||
|
IF pCaseSensitive = TRUE
|
||||||
|
RETURN InString(SELF.Str(), pLookIn, 1 , 1)
|
||||||
|
ELSE
|
||||||
|
RETURN InString(SELF.Lower(), Lower(pLookIn), 1 , 1)
|
||||||
|
END
|
||||||
|
CStringClass.FoundIn PROCEDURE (STRING pLookIn, BYTE pCaseSensitive=TRUE) !,BYTE ! Declare Procedure
|
||||||
|
! Returns TRUE if the first parameter (pLookIn) is found within the SELF.CS
|
||||||
|
! FALSE if it is no
|
||||||
|
CODE
|
||||||
|
IF SELF.IndexOf(pLookIn, pCaseSensitive) > 0
|
||||||
|
RETURN TRUE
|
||||||
|
ELSE
|
||||||
|
RETURN FALSE
|
||||||
|
END
|
||||||
|
CStringClass.SetBuffer PROCEDURE (LONG pNewBuffer) ! Declare Procedure
|
||||||
|
CODE
|
||||||
|
SELF.bufferSize = pNewBuffer
|
||||||
|
CStringClass.EscapeXml PROCEDURE (<STRING pStr>) !,STRING ! Declare Procedure
|
||||||
|
CS CStringClass
|
||||||
|
CODE
|
||||||
|
IF Omitted(pStr)=FALSE
|
||||||
|
CS.Str(pStr)
|
||||||
|
ELSE
|
||||||
|
! Make a copy so we don't alter the original
|
||||||
|
CS.Str(SELF.Str())
|
||||||
|
END
|
||||||
|
CS.Replace('&', '&')
|
||||||
|
CS.Replace('<', '<')
|
||||||
|
CS.Replace('>', '>')
|
||||||
|
CS.Replace('"', '"')
|
||||||
|
CS.Replace('''', ''')
|
||||||
|
|
||||||
|
RETURN CS.Str()
|
||||||
|
|
||||||
68
samples/Clarion/ConsoleSupport.clw
Normal file
68
samples/Clarion/ConsoleSupport.clw
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
Member()
|
||||||
|
Include('ConsoleSupport.inc'),ONCE
|
||||||
|
Map
|
||||||
|
MODULE('32-bit Windows API')
|
||||||
|
! General functions
|
||||||
|
GetLastError(),DWORD,PASCAL
|
||||||
|
|
||||||
|
! Console functions
|
||||||
|
GetStdHandle(DWORD),HANDLE,PASCAL,PROC,RAW
|
||||||
|
WriteConsole(Handle,Long,Dword,long,long),bool,Raw,Pascal,name('WriteConsoleA')
|
||||||
|
ReadConsole(Handle,Long,Dword,long,long),bool,Raw,Pascal,name('ReadConsoleA')
|
||||||
|
SetConsoleTitle(Long),Bool,Raw,Pascal,name('SetConsoleTitleA')
|
||||||
|
GetConsoleTitle(Long,dword),Bool,Raw,Pascal,name('GetConsoleTitleA')
|
||||||
|
SetConsoleMode(Handle,dWord),BOOL,RAW,PASCAL
|
||||||
|
GetConsoleMode(Handle,Long),BOOL,RAW,PASCAL
|
||||||
|
End
|
||||||
|
End
|
||||||
|
|
||||||
|
ConsoleSupport.Construct PROCEDURE
|
||||||
|
|
||||||
|
CODE
|
||||||
|
|
||||||
|
ConsoleSupport.Destruct PROCEDURE
|
||||||
|
|
||||||
|
CODE
|
||||||
|
|
||||||
|
ConsoleSupport.Init PROCEDURE () !,BYTE,VIRTUAL
|
||||||
|
CODE
|
||||||
|
|
||||||
|
SELF.OutputHandle = GetStdHandle(STD_OUTPUT_HANDLE)
|
||||||
|
If SELF.OutputHandle = INVALID_HANDLE_VALUE
|
||||||
|
Halt(1,'Unable to get output handle (' & GetLastError() & ')')
|
||||||
|
RETURN INVALID_HANDLE_VALUE
|
||||||
|
End
|
||||||
|
|
||||||
|
SELF.InputHandle = GetStdHandle(STD_INPUT_HANDLE)
|
||||||
|
if SELF.InputHandle = INVALID_HANDLE_VALUE
|
||||||
|
Halt(2,'Unable to get console input handle (' & GetLastError() & ')')
|
||||||
|
RETURN INVALID_HANDLE_VALUE
|
||||||
|
End
|
||||||
|
|
||||||
|
If ~SetConsoleMode(SELF.InputHandle,ENABLE_PROCESSED_INPUT )
|
||||||
|
Halt(3,'Unable to set console mode (' & GetLastError() & ')')
|
||||||
|
RETURN INVALID_OTHER
|
||||||
|
End
|
||||||
|
|
||||||
|
RETURN FALSE
|
||||||
|
|
||||||
|
ConsoleSupport.WriteLine PROCEDURE (STRING pText) !,BYTE,PROC,VIRTUAL
|
||||||
|
CODE
|
||||||
|
SELF.TextBuffer = SELF.Prefix & pText & '<13,10>'
|
||||||
|
If WriteConsole(SELF.OutputHandle, ADDRESS(SELF.TextBuffer), LEN(SELF.TextBuffer),ADDRESS(SELF.BytesWritten), NULL) = 0
|
||||||
|
Halt(4,'WriteConsoleError (' & GetLastError() & ')')
|
||||||
|
RETURN -1
|
||||||
|
End
|
||||||
|
RETURN FALSE
|
||||||
|
|
||||||
|
Consolesupport.ReadKey PROCEDURE () !,STRING,PROC,VIRTUAL
|
||||||
|
CODE
|
||||||
|
SELF.WriteLine('Press any key to continue...')
|
||||||
|
Clear(SELF.InBuffer)
|
||||||
|
Loop
|
||||||
|
IF ReadConsole(SELF.InputHandle,Address(SELF.InBuffer),100,Address(SELF.BytesRead),NULL) = 0 THEN
|
||||||
|
Halt(5,'Error on read console (' & GetLastError() & ')')
|
||||||
|
Break
|
||||||
|
End
|
||||||
|
Until SELF.BytesRead > 0
|
||||||
|
RETURN SELF.InBuffer
|
||||||
10
samples/Clarion/HelloWorld.clw
Normal file
10
samples/Clarion/HelloWorld.clw
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
PROGRAM
|
||||||
|
|
||||||
|
MAP
|
||||||
|
END
|
||||||
|
|
||||||
|
CODE
|
||||||
|
|
||||||
|
MESSAGE('Hello World!')
|
||||||
|
|
||||||
|
RETURN
|
||||||
12
samples/Clarion/hello.clw
Normal file
12
samples/Clarion/hello.clw
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
MEMBER()
|
||||||
|
INCLUDE('HelloClass.inc'),ONCE
|
||||||
|
MAP
|
||||||
|
END
|
||||||
|
|
||||||
|
HelloClass.Construct PROCEDURE
|
||||||
|
CODE
|
||||||
|
HelloClass.Destruct PROCEDURE() !,VIRTUAL
|
||||||
|
CODE
|
||||||
|
HelloClass.SayHello PROCEDURE
|
||||||
|
CODE
|
||||||
|
MESSAGE('Hello World!')
|
||||||
133
samples/Click/sr2.click
Normal file
133
samples/Click/sr2.click
Normal file
@@ -0,0 +1,133 @@
|
|||||||
|
rates :: AvailableRates
|
||||||
|
elementclass sr2 {
|
||||||
|
$sr2_ip, $sr2_nm, $wireless_mac, $gateway, $probes|
|
||||||
|
|
||||||
|
|
||||||
|
arp :: ARPTable();
|
||||||
|
lt :: LinkTable(IP $sr2_ip);
|
||||||
|
|
||||||
|
|
||||||
|
gw :: SR2GatewaySelector(ETHTYPE 0x062c,
|
||||||
|
IP $sr2_ip,
|
||||||
|
ETH $wireless_mac,
|
||||||
|
LT lt,
|
||||||
|
ARP arp,
|
||||||
|
PERIOD 15,
|
||||||
|
GW $gateway);
|
||||||
|
|
||||||
|
|
||||||
|
gw -> SR2SetChecksum -> [0] output;
|
||||||
|
|
||||||
|
set_gw :: SR2SetGateway(SEL gw);
|
||||||
|
|
||||||
|
|
||||||
|
es :: SR2ETTStat(ETHTYPE 0x0641,
|
||||||
|
ETH $wireless_mac,
|
||||||
|
IP $sr2_ip,
|
||||||
|
PERIOD 30000,
|
||||||
|
TAU 300000,
|
||||||
|
ARP arp,
|
||||||
|
PROBES $probes,
|
||||||
|
ETT metric,
|
||||||
|
RT rates);
|
||||||
|
|
||||||
|
|
||||||
|
metric :: SR2ETTMetric(LT lt);
|
||||||
|
|
||||||
|
|
||||||
|
forwarder :: SR2Forwarder(ETHTYPE 0x0643,
|
||||||
|
IP $sr2_ip,
|
||||||
|
ETH $wireless_mac,
|
||||||
|
ARP arp,
|
||||||
|
LT lt);
|
||||||
|
|
||||||
|
|
||||||
|
querier :: SR2Querier(ETH $wireless_mac,
|
||||||
|
SR forwarder,
|
||||||
|
LT lt,
|
||||||
|
ROUTE_DAMPENING true,
|
||||||
|
TIME_BEFORE_SWITCH 5,
|
||||||
|
DEBUG true);
|
||||||
|
|
||||||
|
|
||||||
|
query_forwarder :: SR2MetricFlood(ETHTYPE 0x0644,
|
||||||
|
IP $sr2_ip,
|
||||||
|
ETH $wireless_mac,
|
||||||
|
LT lt,
|
||||||
|
ARP arp,
|
||||||
|
DEBUG false);
|
||||||
|
|
||||||
|
query_responder :: SR2QueryResponder(ETHTYPE 0x0645,
|
||||||
|
IP $sr2_ip,
|
||||||
|
ETH $wireless_mac,
|
||||||
|
LT lt,
|
||||||
|
ARP arp,
|
||||||
|
DEBUG true);
|
||||||
|
|
||||||
|
|
||||||
|
query_responder -> SR2SetChecksum -> [0] output;
|
||||||
|
query_forwarder -> SR2SetChecksum -> SR2Print(forwarding) -> [0] output;
|
||||||
|
query_forwarder [1] -> query_responder;
|
||||||
|
|
||||||
|
data_ck :: SR2SetChecksum()
|
||||||
|
|
||||||
|
input [1]
|
||||||
|
-> host_cl :: IPClassifier(dst net $sr2_ip mask $sr2_nm,
|
||||||
|
-)
|
||||||
|
-> querier
|
||||||
|
-> data_ck;
|
||||||
|
|
||||||
|
|
||||||
|
host_cl [1] -> [0] set_gw [0] -> querier;
|
||||||
|
|
||||||
|
forwarder[0]
|
||||||
|
-> dt ::DecIPTTL
|
||||||
|
-> data_ck
|
||||||
|
-> [2] output;
|
||||||
|
|
||||||
|
|
||||||
|
dt[1]
|
||||||
|
-> Print(ttl-error)
|
||||||
|
-> ICMPError($sr2_ip, timeexceeded, 0)
|
||||||
|
-> querier;
|
||||||
|
|
||||||
|
|
||||||
|
// queries
|
||||||
|
querier [1] -> [1] query_forwarder;
|
||||||
|
es -> SetTimestamp() -> [1] output;
|
||||||
|
|
||||||
|
|
||||||
|
forwarder[1] //ip packets to me
|
||||||
|
-> SR2StripHeader()
|
||||||
|
-> CheckIPHeader()
|
||||||
|
-> from_gw_cl :: IPClassifier(src net $sr2_ip mask $sr2_nm,
|
||||||
|
-)
|
||||||
|
-> [3] output;
|
||||||
|
|
||||||
|
from_gw_cl [1] -> [1] set_gw [1] -> [3] output;
|
||||||
|
|
||||||
|
input [0]
|
||||||
|
-> ncl :: Classifier(
|
||||||
|
12/0643 , //sr2_forwarder
|
||||||
|
12/0644 , //sr2
|
||||||
|
12/0645 , //replies
|
||||||
|
12/0641 , //sr2_es
|
||||||
|
12/062c , //sr2_gw
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
ncl[0] -> SR2CheckHeader() -> [0] forwarder;
|
||||||
|
ncl[1] -> SR2CheckHeader() -> PrintSR(query) -> query_forwarder
|
||||||
|
ncl[2] -> SR2CheckHeader() -> query_responder;
|
||||||
|
ncl[3] -> es;
|
||||||
|
ncl[4] -> SR2CheckHeader() -> gw;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Idle -> s :: sr2(2.0.0.1, 255.0.0.0, 00:00:00:00:00:01, false, "12 60 12 1500") -> Discard;
|
||||||
|
Idle -> [1] s;
|
||||||
|
s[1] -> Discard;
|
||||||
|
s[2] -> Discard;
|
||||||
|
s[3] -> Discard;
|
||||||
142
samples/Click/thomer-nat.click
Normal file
142
samples/Click/thomer-nat.click
Normal file
@@ -0,0 +1,142 @@
|
|||||||
|
// This Click configuration implements a firewall and NAT, roughly based on the
|
||||||
|
// mazu-nat.click example.
|
||||||
|
//
|
||||||
|
// This example assumes there is one interface that is IP-aliased. In this
|
||||||
|
// example, eth0 and eth0:0 have IP addresses 66.68.65.90 and 192.168.1.1,
|
||||||
|
// respectively. There is a local network, 192.168.1.0/24, and an upstream
|
||||||
|
// gateway, 66.58.65.89. Traffic from the local network is NATed.
|
||||||
|
//
|
||||||
|
// Connections can be initiated from the NAT box itself, also.
|
||||||
|
//
|
||||||
|
// For bugs, suggestions, and, corrections, please email me.
|
||||||
|
//
|
||||||
|
// Author: Thomer M. Gil (click@thomer.com)
|
||||||
|
|
||||||
|
AddressInfo(
|
||||||
|
eth0-in 192.168.1.1 192.168.1.0/24 00:0d:87:9d:1c:e9,
|
||||||
|
eth0-ex 66.58.65.90 00:0d:87:9d:1c:e9,
|
||||||
|
gw-addr 66.58.65.89 00:20:6f:14:54:c2
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
elementclass SniffGatewayDevice {
|
||||||
|
$device |
|
||||||
|
from :: FromDevice($device)
|
||||||
|
-> t1 :: Tee
|
||||||
|
-> output;
|
||||||
|
input -> q :: Queue(1024)
|
||||||
|
-> t2 :: PullTee
|
||||||
|
-> to :: ToDevice($device);
|
||||||
|
t1[1] -> ToHostSniffers;
|
||||||
|
t2[1] -> ToHostSniffers($device);
|
||||||
|
ScheduleInfo(from .1, to 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
device :: SniffGatewayDevice(eth0);
|
||||||
|
arpq_in :: ARPQuerier(eth0-in) -> device;
|
||||||
|
ip_to_extern :: GetIPAddress(16)
|
||||||
|
-> CheckIPHeader
|
||||||
|
-> EtherEncap(0x800, eth0-ex, gw-addr)
|
||||||
|
-> device;
|
||||||
|
ip_to_host :: EtherEncap(0x800, gw-addr, eth0-ex)
|
||||||
|
-> ToHost;
|
||||||
|
ip_to_intern :: GetIPAddress(16)
|
||||||
|
-> CheckIPHeader
|
||||||
|
-> arpq_in;
|
||||||
|
|
||||||
|
|
||||||
|
arp_class :: Classifier(
|
||||||
|
12/0806 20/0001, // [0] ARP requests
|
||||||
|
12/0806 20/0002, // [1] ARP replies to host
|
||||||
|
12/0800); // [2] IP packets
|
||||||
|
|
||||||
|
device -> arp_class;
|
||||||
|
|
||||||
|
// ARP crap
|
||||||
|
arp_class[0] -> ARPResponder(eth0-in, eth0-ex) -> device;
|
||||||
|
arp_class[1] -> arp_t :: Tee;
|
||||||
|
arp_t[0] -> ToHost;
|
||||||
|
arp_t[1] -> [1]arpq_in;
|
||||||
|
|
||||||
|
|
||||||
|
// IP packets
|
||||||
|
arp_class[2] -> Strip(14)
|
||||||
|
-> CheckIPHeader
|
||||||
|
-> ipclass :: IPClassifier(dst host eth0-ex,
|
||||||
|
dst host eth0-in,
|
||||||
|
src net eth0-in);
|
||||||
|
|
||||||
|
// Define pattern NAT
|
||||||
|
iprw :: IPRewriterPatterns(NAT eth0-ex 50000-65535 - -);
|
||||||
|
|
||||||
|
// Rewriting rules for UDP/TCP packets
|
||||||
|
// output[0] rewritten to go into the wild
|
||||||
|
// output[1] rewritten to come back from the wild or no match
|
||||||
|
rw :: IPRewriter(pattern NAT 0 1,
|
||||||
|
pass 1);
|
||||||
|
|
||||||
|
// Rewriting rules for ICMP packets
|
||||||
|
irw :: ICMPPingRewriter(eth0-ex, -);
|
||||||
|
irw[0] -> ip_to_extern;
|
||||||
|
irw[1] -> icmp_me_or_intern :: IPClassifier(dst host eth0-ex, -);
|
||||||
|
icmp_me_or_intern[0] -> ip_to_host;
|
||||||
|
icmp_me_or_intern[1] -> ip_to_intern;
|
||||||
|
|
||||||
|
// Rewriting rules for ICMP error packets
|
||||||
|
ierw :: ICMPRewriter(rw irw);
|
||||||
|
ierw[0] -> icmp_me_or_intern;
|
||||||
|
ierw[1] -> icmp_me_or_intern;
|
||||||
|
|
||||||
|
|
||||||
|
// Packets directed at eth0-ex.
|
||||||
|
// Send it through IPRewriter(pass). If there was a mapping, it will be
|
||||||
|
// rewritten such that dst is eth0-in:net, otherwise dst will still be for
|
||||||
|
// eth0-ex.
|
||||||
|
ipclass[0] -> [1]rw;
|
||||||
|
|
||||||
|
// packets that were rewritten, heading into the wild world.
|
||||||
|
rw[0] -> ip_to_extern;
|
||||||
|
|
||||||
|
// packets that come back from the wild or are not part of an established
|
||||||
|
// connection.
|
||||||
|
rw[1] -> established_class :: IPClassifier(dst host eth0-ex,
|
||||||
|
dst net eth0-in);
|
||||||
|
|
||||||
|
// not established yet or returning packets for a connection that was
|
||||||
|
// established from this host itself.
|
||||||
|
established_class[0] ->
|
||||||
|
firewall :: IPClassifier(dst tcp port ssh,
|
||||||
|
dst tcp port smtp,
|
||||||
|
dst tcp port domain,
|
||||||
|
dst udp port domain,
|
||||||
|
icmp type echo-reply,
|
||||||
|
proto icmp,
|
||||||
|
port > 4095,
|
||||||
|
-);
|
||||||
|
|
||||||
|
firewall[0] -> ip_to_host; // ssh
|
||||||
|
firewall[1] -> ip_to_host; // smtp
|
||||||
|
firewall[2] -> ip_to_host; // domain (t)
|
||||||
|
firewall[3] -> ip_to_host; // domain (u)
|
||||||
|
firewall[4] -> [0]irw; // icmp reply
|
||||||
|
firewall[5] -> [0]ierw; // other icmp
|
||||||
|
firewall[6] -> ip_to_host; // port > 4095, probably for connection
|
||||||
|
// originating from host itself
|
||||||
|
firewall[7] -> Discard; // don't allow incoming for port <= 4095
|
||||||
|
|
||||||
|
// established connection
|
||||||
|
established_class[1] -> ip_to_intern;
|
||||||
|
|
||||||
|
// To eth0-in. Only accept from inside network.
|
||||||
|
ipclass[1] -> IPClassifier(src net eth0-in) -> ip_to_host;
|
||||||
|
|
||||||
|
// Packets from eth0-in:net either stay on local network or go to the wild.
|
||||||
|
// Those that go into the wild need to go through the appropriate rewriting
|
||||||
|
// element. (Either UDP/TCP rewriter or ICMP rewriter.)
|
||||||
|
ipclass[2] -> inter_class :: IPClassifier(dst net eth0-in, -);
|
||||||
|
inter_class[0] -> ip_to_intern;
|
||||||
|
inter_class[1] -> ip_udp_class :: IPClassifier(tcp or udp,
|
||||||
|
icmp type echo);
|
||||||
|
ip_udp_class[0] -> [0]rw;
|
||||||
|
ip_udp_class[1] -> [0]irw;
|
||||||
15
samples/Clojure/build.boot
Normal file
15
samples/Clojure/build.boot
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
;; from: https://github.com/boot-clj/boot#configure-task-options
|
||||||
|
|
||||||
|
(set-env!
|
||||||
|
:source-paths #{"src"}
|
||||||
|
:dependencies '[[me.raynes/conch "0.8.0"]])
|
||||||
|
|
||||||
|
(task-options!
|
||||||
|
pom {:project 'my-project
|
||||||
|
:version "0.1.0"}
|
||||||
|
jar {:manifest {"Foo" "bar"}})
|
||||||
|
|
||||||
|
(deftask build
|
||||||
|
"Build my project."
|
||||||
|
[]
|
||||||
|
(comp (pom) (jar) (install)))
|
||||||
17
samples/CoffeeScript/build.cake
Normal file
17
samples/CoffeeScript/build.cake
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
fs = require 'fs'
|
||||||
|
|
||||||
|
{print} = require 'sys'
|
||||||
|
{spawn} = require 'child_process'
|
||||||
|
|
||||||
|
build = (callback) ->
|
||||||
|
coffee = spawn 'coffee', ['-c', '-o', '.', '.']
|
||||||
|
coffee.stderr.on 'data', (data) ->
|
||||||
|
process.stderr.write data.toString()
|
||||||
|
coffee.stdout.on 'data', (data) ->
|
||||||
|
print data.toString()
|
||||||
|
coffee.on 'exit', (code) ->
|
||||||
|
callback?() if code is 0
|
||||||
|
|
||||||
|
task 'build', 'Build from source', ->
|
||||||
|
build()
|
||||||
|
|
||||||
164
samples/Common Lisp/array.l
Normal file
164
samples/Common Lisp/array.l
Normal file
@@ -0,0 +1,164 @@
|
|||||||
|
;;; -*- Mode: Lisp; Package: LISP -*-
|
||||||
|
;;;
|
||||||
|
;;; This file is part of xyzzy.
|
||||||
|
;;;
|
||||||
|
|
||||||
|
(provide "array")
|
||||||
|
|
||||||
|
(in-package "lisp")
|
||||||
|
|
||||||
|
(export '(make-vector make-array vector array-dimensions array-in-bounds-p
|
||||||
|
upgraded-array-element-type adjust-array))
|
||||||
|
|
||||||
|
(defun upgraded-array-element-type (type)
|
||||||
|
(cond ((or (eq type 't)
|
||||||
|
(null type))
|
||||||
|
't)
|
||||||
|
((member type '(character base-character standard-char
|
||||||
|
extended-character) :test #'eq)
|
||||||
|
'character)
|
||||||
|
(t
|
||||||
|
(setq type (car (si:canonicalize-type type)))
|
||||||
|
(cond ((or (eq type 't)
|
||||||
|
(null type))
|
||||||
|
't)
|
||||||
|
((member type '(character base-character standard-char
|
||||||
|
extended-character) :test #'eq)
|
||||||
|
'character)
|
||||||
|
(t 't)))))
|
||||||
|
|
||||||
|
(defun check-array-initialize-option (ies-p ics-p displaced-to)
|
||||||
|
(let ((x 0))
|
||||||
|
(and ies-p (incf x))
|
||||||
|
(and ics-p (incf x))
|
||||||
|
(and displaced-to (incf x))
|
||||||
|
(when (> x 1)
|
||||||
|
(error ":initial-element, :initial-contents, :displaced-to"))))
|
||||||
|
|
||||||
|
(defun make-vector (length &key
|
||||||
|
(element-type t)
|
||||||
|
(initial-element nil ies-p)
|
||||||
|
(initial-contents nil ics-p)
|
||||||
|
fill-pointer
|
||||||
|
adjustable
|
||||||
|
displaced-to
|
||||||
|
(displaced-index-offset 0))
|
||||||
|
(setq element-type (upgraded-array-element-type element-type))
|
||||||
|
(check-array-initialize-option ies-p ics-p displaced-to)
|
||||||
|
(let ((vector (si:*make-vector length element-type initial-element adjustable
|
||||||
|
fill-pointer displaced-to displaced-index-offset)))
|
||||||
|
(when ics-p
|
||||||
|
(si:*copy-into-seq vector initial-contents))
|
||||||
|
vector))
|
||||||
|
|
||||||
|
(defun make-array (dimensions &rest rest
|
||||||
|
&key
|
||||||
|
(element-type t)
|
||||||
|
(initial-element nil ies-p)
|
||||||
|
(initial-contents nil ics-p)
|
||||||
|
fill-pointer
|
||||||
|
adjustable
|
||||||
|
displaced-to
|
||||||
|
(displaced-index-offset 0))
|
||||||
|
(cond ((integerp dimensions)
|
||||||
|
(apply #'make-vector dimensions rest))
|
||||||
|
((= (length dimensions) 1)
|
||||||
|
(apply #'make-vector (car dimensions) rest))
|
||||||
|
(t
|
||||||
|
(setq element-type (upgraded-array-element-type element-type))
|
||||||
|
(check-array-initialize-option ies-p ics-p displaced-to)
|
||||||
|
(when fill-pointer
|
||||||
|
(error ":fill-pointer"))
|
||||||
|
(let ((array (si:*make-array dimensions element-type
|
||||||
|
initial-element adjustable
|
||||||
|
displaced-to displaced-index-offset)))
|
||||||
|
(when ics-p
|
||||||
|
(let ((dims (make-list (array-rank array)
|
||||||
|
:initial-element 0))
|
||||||
|
(stack (list initial-contents))
|
||||||
|
(rank (1- (array-rank array))))
|
||||||
|
(dolist (x dims)
|
||||||
|
(push (elt (car stack) 0) stack))
|
||||||
|
(dotimes (i (array-total-size array))
|
||||||
|
(setf (row-major-aref array i) (car stack))
|
||||||
|
(do ((x dims (cdr x))
|
||||||
|
(j rank (1- j)))
|
||||||
|
((null x))
|
||||||
|
(pop stack)
|
||||||
|
(incf (car x))
|
||||||
|
(when (< (car x) (array-dimension array j))
|
||||||
|
(do ((r (- rank j) (1- r)))
|
||||||
|
((< r 0))
|
||||||
|
(push (elt (car stack) (nth r dims)) stack))
|
||||||
|
(return))
|
||||||
|
(setf (car x) 0)))))
|
||||||
|
array))))
|
||||||
|
|
||||||
|
(defun vector (&rest list)
|
||||||
|
(make-vector (length list) :element-type t :initial-contents list))
|
||||||
|
|
||||||
|
(defun array-dimensions (array)
|
||||||
|
(do ((i (1- (array-rank array)) (1- i))
|
||||||
|
(dims '()))
|
||||||
|
((minusp i) dims)
|
||||||
|
(push (array-dimension array i) dims)))
|
||||||
|
|
||||||
|
(defun array-in-bounds-p (array &rest subscripts)
|
||||||
|
(let ((r (array-rank array)))
|
||||||
|
(when (/= r (length subscripts))
|
||||||
|
(error "subscripts: ~S" subscripts))
|
||||||
|
(do ((i 0 (1+ i))
|
||||||
|
(s subscripts (cdr s)))
|
||||||
|
((= i r) t)
|
||||||
|
(unless (<= 0 (car s) (1- (array-dimension array i)))
|
||||||
|
(return nil)))))
|
||||||
|
|
||||||
|
(defun adjust-array (old-array
|
||||||
|
dimensions
|
||||||
|
&rest rest
|
||||||
|
&key
|
||||||
|
(element-type nil ets-p)
|
||||||
|
initial-element
|
||||||
|
(initial-contents nil ics-p)
|
||||||
|
(fill-pointer nil fps-p)
|
||||||
|
displaced-to
|
||||||
|
displaced-index-offset)
|
||||||
|
(when (/= (length dimensions) (array-rank old-array))
|
||||||
|
(error "?"))
|
||||||
|
(unless ets-p
|
||||||
|
(push (array-element-type old-array) rest)
|
||||||
|
(push :element-type rest))
|
||||||
|
(when (adjustable-array-p old-array)
|
||||||
|
(push t rest)
|
||||||
|
(push :adjustable rest))
|
||||||
|
(cond (fps-p
|
||||||
|
(unless (array-has-fill-pointer-p old-array)
|
||||||
|
(error "?")))
|
||||||
|
(t
|
||||||
|
(when (array-has-fill-pointer-p old-array)
|
||||||
|
(push (fill-pointer old-array) rest)
|
||||||
|
(push :fill-pointer rest))))
|
||||||
|
(when (eq old-array displaced-to)
|
||||||
|
(error "?"))
|
||||||
|
(let ((new-array (apply #'make-array dimensions rest)))
|
||||||
|
(or ics-p displaced-to
|
||||||
|
(copy-array-partially old-array new-array))
|
||||||
|
(cond ((adjustable-array-p old-array)
|
||||||
|
(si:*replace-array old-array new-array)
|
||||||
|
old-array)
|
||||||
|
(t
|
||||||
|
new-array))))
|
||||||
|
|
||||||
|
(defun copy-array-partially (src dst)
|
||||||
|
(let* ((dims (mapcar #'min (array-dimensions src) (array-dimensions dst)))
|
||||||
|
(r (array-rank src))
|
||||||
|
(s (make-list r :initial-element 0)))
|
||||||
|
(setq r (1- r))
|
||||||
|
(dotimes (x (apply #'* dims))
|
||||||
|
(setf (apply #'aref dst s) (apply #'aref src s))
|
||||||
|
(do ((i r (1- i)))
|
||||||
|
((minusp i))
|
||||||
|
(incf (nth i s))
|
||||||
|
(when (< (nth i s) (nth i dims))
|
||||||
|
(return))
|
||||||
|
(setf (nth i s) 0)))))
|
||||||
1201
samples/Common Lisp/common.l
Normal file
1201
samples/Common Lisp/common.l
Normal file
File diff suppressed because it is too large
Load Diff
2
samples/Common Lisp/config.sexp
Normal file
2
samples/Common Lisp/config.sexp
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
((exe_name hello)
|
||||||
|
(link_order (world hello)))
|
||||||
2
samples/Common Lisp/hello.lisp
Normal file
2
samples/Common Lisp/hello.lisp
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
(DEFUN HELLO ()
|
||||||
|
(PRINT 'HELLO))
|
||||||
103
samples/Common Lisp/rss.sexp
Normal file
103
samples/Common Lisp/rss.sexp
Normal file
@@ -0,0 +1,103 @@
|
|||||||
|
|
||||||
|
(:TURTLE
|
||||||
|
|
||||||
|
(:@PREFIX "rdf:" "<http://www.w3.org/1999/02/22-rdf-syntax-ns#>")
|
||||||
|
(:@PREFIX "owl:" "<http://www.w3.org/2002/07/owl#>")
|
||||||
|
(:@PREFIX "dc:" "<http://purl.org/dc/elements/1.1/>")
|
||||||
|
(:@PREFIX "xsd:" "<http://www.w3.org/2001/XMLSchema#>")
|
||||||
|
(:@PREFIX "rdfs:" "<http://www.w3.org/2000/01/rdf-schema#>")
|
||||||
|
|
||||||
|
(:TRIPLES (:URIREF "<http://purl.org/rss/1.0/channel>")
|
||||||
|
|
||||||
|
(:PREDICATE-OBJECT-LIST
|
||||||
|
(:URIREF #1="<http://www.w3.org/1999/02/22-rdf-syntax-ns#type>")
|
||||||
|
(:OBJECTS
|
||||||
|
(:QNAME "rdfs:Class")))
|
||||||
|
|
||||||
|
(:PREDICATE-OBJECT-LIST
|
||||||
|
(:QNAME "rdfs:comment")
|
||||||
|
(:OBJECTS
|
||||||
|
(:STRING "An RSS information channel.")))
|
||||||
|
|
||||||
|
(:PREDICATE-OBJECT-LIST
|
||||||
|
(:QNAME "rdfs:isDefinedBy")
|
||||||
|
(:OBJECTS
|
||||||
|
(:URIREF "<http://purl.org/rss/1.0/>")))
|
||||||
|
|
||||||
|
(:PREDICATE-OBJECT-LIST
|
||||||
|
(:QNAME "rdfs:label")
|
||||||
|
(:OBJECTS
|
||||||
|
(:STRING "Channel"))))
|
||||||
|
|
||||||
|
(:TRIPLES (:URIREF "<http://purl.org/rss/1.0/description>")
|
||||||
|
|
||||||
|
(:PREDICATE-OBJECT-LIST
|
||||||
|
(:URIREF #1#)
|
||||||
|
(:OBJECTS
|
||||||
|
(:QNAME "rdf:Property")))
|
||||||
|
|
||||||
|
(:PREDICATE-OBJECT-LIST (:QNAME "rdfs:comment")
|
||||||
|
(:OBJECTS (:STRING "A short text description of the subject.")))
|
||||||
|
(:PREDICATE-OBJECT-LIST (:QNAME "rdfs:isDefinedBy")
|
||||||
|
(:OBJECTS (:URIREF "<http://purl.org/rss/1.0/>")))
|
||||||
|
(:PREDICATE-OBJECT-LIST (:QNAME "rdfs:label") (:OBJECTS (:STRING "Description")))
|
||||||
|
(:PREDICATE-OBJECT-LIST (:QNAME "rdfs:subPropertyOf") (:OBJECTS (:QNAME "dc:description"))))
|
||||||
|
(:TRIPLES (:URIREF "<http://purl.org/rss/1.0/image>")
|
||||||
|
(:PREDICATE-OBJECT-LIST (:URIREF #1#) (:OBJECTS (:QNAME "rdfs:Class")))
|
||||||
|
(:PREDICATE-OBJECT-LIST (:QNAME "rdfs:comment") (:OBJECTS (:STRING "An RSS image.")))
|
||||||
|
(:PREDICATE-OBJECT-LIST (:QNAME "rdfs:isDefinedBy")
|
||||||
|
(:OBJECTS (:URIREF "<http://purl.org/rss/1.0/>")))
|
||||||
|
(:PREDICATE-OBJECT-LIST (:QNAME "rdfs:label") (:OBJECTS (:STRING "Image"))))
|
||||||
|
(:TRIPLES (:URIREF "<http://purl.org/rss/1.0/item>")
|
||||||
|
(:PREDICATE-OBJECT-LIST (:URIREF #1#) (:OBJECTS (:QNAME "rdfs:Class")))
|
||||||
|
(:PREDICATE-OBJECT-LIST (:QNAME "rdfs:comment") (:OBJECTS (:STRING "An RSS item.")))
|
||||||
|
(:PREDICATE-OBJECT-LIST (:QNAME "rdfs:isDefinedBy")
|
||||||
|
(:OBJECTS (:URIREF "<http://purl.org/rss/1.0/>")))
|
||||||
|
(:PREDICATE-OBJECT-LIST (:QNAME "rdfs:label") (:OBJECTS (:STRING "Item"))))
|
||||||
|
(:TRIPLES (:URIREF "<http://purl.org/rss/1.0/items>")
|
||||||
|
(:PREDICATE-OBJECT-LIST (:URIREF #1#) (:OBJECTS (:QNAME "rdf:Property")))
|
||||||
|
(:PREDICATE-OBJECT-LIST (:QNAME "rdfs:comment")
|
||||||
|
(:OBJECTS
|
||||||
|
(:STRING "Points to a list of rss:item elements that are members of the subject channel.")))
|
||||||
|
(:PREDICATE-OBJECT-LIST (:QNAME "rdfs:isDefinedBy")
|
||||||
|
(:OBJECTS (:URIREF "<http://purl.org/rss/1.0/>")))
|
||||||
|
(:PREDICATE-OBJECT-LIST (:QNAME "rdfs:label") (:OBJECTS (:STRING "Items"))))
|
||||||
|
(:TRIPLES (:URIREF "<http://purl.org/rss/1.0/link>")
|
||||||
|
(:PREDICATE-OBJECT-LIST (:URIREF #1#) (:OBJECTS (:QNAME "rdf:Property")))
|
||||||
|
(:PREDICATE-OBJECT-LIST (:QNAME "rdfs:comment")
|
||||||
|
(:OBJECTS (:STRING "The URL to which an HTML rendering of the subject will link.")))
|
||||||
|
(:PREDICATE-OBJECT-LIST (:QNAME "rdfs:isDefinedBy")
|
||||||
|
(:OBJECTS (:URIREF "<http://purl.org/rss/1.0/>")))
|
||||||
|
(:PREDICATE-OBJECT-LIST (:QNAME "rdfs:label") (:OBJECTS (:STRING "Link")))
|
||||||
|
(:PREDICATE-OBJECT-LIST (:QNAME "rdfs:subPropertyOf") (:OBJECTS (:QNAME "dc:identifier"))))
|
||||||
|
(:TRIPLES (:URIREF "<http://purl.org/rss/1.0/name>")
|
||||||
|
(:PREDICATE-OBJECT-LIST (:URIREF #1#) (:OBJECTS (:QNAME "rdf:Property")))
|
||||||
|
(:PREDICATE-OBJECT-LIST (:QNAME "rdfs:comment")
|
||||||
|
(:OBJECTS (:STRING "The text input field's (variable) name.")))
|
||||||
|
(:PREDICATE-OBJECT-LIST (:QNAME "rdfs:isDefinedBy")
|
||||||
|
(:OBJECTS (:URIREF "<http://purl.org/rss/1.0/>")))
|
||||||
|
(:PREDICATE-OBJECT-LIST (:QNAME "rdfs:label") (:OBJECTS (:STRING "Name"))))
|
||||||
|
(:TRIPLES (:URIREF "<http://purl.org/rss/1.0/textinput>")
|
||||||
|
(:PREDICATE-OBJECT-LIST (:URIREF #1#) (:OBJECTS (:QNAME "rdfs:Class")))
|
||||||
|
(:PREDICATE-OBJECT-LIST (:QNAME "rdfs:comment") (:OBJECTS (:STRING "An RSS text input.")))
|
||||||
|
(:PREDICATE-OBJECT-LIST (:QNAME "rdfs:isDefinedBy")
|
||||||
|
(:OBJECTS (:URIREF "<http://purl.org/rss/1.0/>")))
|
||||||
|
(:PREDICATE-OBJECT-LIST (:QNAME "rdfs:label") (:OBJECTS (:STRING "Text Input"))))
|
||||||
|
(:TRIPLES (:URIREF "<http://purl.org/rss/1.0/title>")
|
||||||
|
(:PREDICATE-OBJECT-LIST (:URIREF #1#) (:OBJECTS (:QNAME "rdf:Property")))
|
||||||
|
(:PREDICATE-OBJECT-LIST (:QNAME "rdfs:comment")
|
||||||
|
(:OBJECTS (:STRING "A descriptive title for the channel.")))
|
||||||
|
(:PREDICATE-OBJECT-LIST (:QNAME "rdfs:isDefinedBy")
|
||||||
|
(:OBJECTS (:URIREF "<http://purl.org/rss/1.0/>")))
|
||||||
|
(:PREDICATE-OBJECT-LIST (:QNAME "rdfs:label") (:OBJECTS (:STRING "Title")))
|
||||||
|
(:PREDICATE-OBJECT-LIST (:QNAME "rdfs:subPropertyOf") (:OBJECTS (:QNAME "dc:title"))))
|
||||||
|
(:TRIPLES (:URIREF "<http://purl.org/rss/1.0/url>")
|
||||||
|
(:PREDICATE-OBJECT-LIST (:URIREF #1#) (:OBJECTS (:QNAME "rdf:Property")))
|
||||||
|
(:PREDICATE-OBJECT-LIST (:QNAME "rdfs:comment")
|
||||||
|
(:OBJECTS
|
||||||
|
(:STRING
|
||||||
|
"The URL of the image to used in the 'src' attribute of the channel's image tag when rendered as HTML.")))
|
||||||
|
(:PREDICATE-OBJECT-LIST (:QNAME "rdfs:isDefinedBy")
|
||||||
|
(:OBJECTS (:URIREF "<http://purl.org/rss/1.0/>")))
|
||||||
|
(:PREDICATE-OBJECT-LIST (:QNAME "rdfs:label") (:OBJECTS (:STRING "URL")))
|
||||||
|
(:PREDICATE-OBJECT-LIST (:QNAME "rdfs:subPropertyOf") (:OBJECTS (:QNAME "dc:identifier")))))
|
||||||
21
samples/Common Lisp/sample.lsp
Normal file
21
samples/Common Lisp/sample.lsp
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
;;;; -*- lisp -*-
|
||||||
|
|
||||||
|
(in-package :foo)
|
||||||
|
|
||||||
|
;;; Header comment.
|
||||||
|
(defvar *foo*)
|
||||||
|
|
||||||
|
(eval-when (:execute :compile-toplevel :load-toplevel)
|
||||||
|
(defun add (x &optional y &key z)
|
||||||
|
(declare (ignore z))
|
||||||
|
;; Inline comment.
|
||||||
|
(+ x (or y 1))))
|
||||||
|
|
||||||
|
#|
|
||||||
|
Multi-line comment.
|
||||||
|
|#
|
||||||
|
|
||||||
|
(defmacro foo (x &body b)
|
||||||
|
(if x
|
||||||
|
`(1+ ,x) ;After-line comment.
|
||||||
|
42))
|
||||||
318
samples/D/mpq.d
Normal file
318
samples/D/mpq.d
Normal file
@@ -0,0 +1,318 @@
|
|||||||
|
/*
|
||||||
|
* mpq.d -- D programming language module for libmpq
|
||||||
|
*
|
||||||
|
* Copyright (c) 2008 Georg Lukas <georg@op-co.de>
|
||||||
|
*
|
||||||
|
* This program 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 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program 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 this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
*
|
||||||
|
* This module is written to support Phobos. Patches to allow binding to
|
||||||
|
* Tango are welcome.
|
||||||
|
*/
|
||||||
|
|
||||||
|
module mpq;
|
||||||
|
|
||||||
|
/* the following pragma does not work on DMD/Linux, generates a warning on
|
||||||
|
* GDC/Linux and has not been tested on Windows. Commented out for now. */
|
||||||
|
// pragma(lib, "libmpq");
|
||||||
|
|
||||||
|
import std.string; // for format() and toStringz()
|
||||||
|
import std.traits; // for ParameterTypeTuple!()
|
||||||
|
|
||||||
|
/* XXX: this assumes that libmpq is compiled with Large File Support on */
|
||||||
|
alias long off_t;
|
||||||
|
|
||||||
|
/* libmpq error return values */
|
||||||
|
const LIBMPQ_ERROR_OPEN = -1; /* open error on file. */
|
||||||
|
const LIBMPQ_ERROR_CLOSE = -2; /* close error on file. */
|
||||||
|
const LIBMPQ_ERROR_SEEK = -3; /* lseek error on file. */
|
||||||
|
const LIBMPQ_ERROR_READ = -4; /* read error on file. */
|
||||||
|
const LIBMPQ_ERROR_WRITE = -5; /* write error on file. */
|
||||||
|
const LIBMPQ_ERROR_MALLOC = -6; /* memory allocation error. */
|
||||||
|
const LIBMPQ_ERROR_FORMAT = -7; /* format errror. */
|
||||||
|
const LIBMPQ_ERROR_NOT_INITIALIZED = -8; /* init() wasn't called. */
|
||||||
|
const LIBMPQ_ERROR_SIZE = -9; /* buffer size is to small. */
|
||||||
|
const LIBMPQ_ERROR_EXIST = -10; /* file or block does not exist in archive. */
|
||||||
|
const LIBMPQ_ERROR_DECRYPT = -11; /* we don't know the decryption seed. */
|
||||||
|
const LIBMPQ_ERROR_UNPACK = -12; /* error on unpacking file. */
|
||||||
|
|
||||||
|
/** libmpq internal meta-data for an archive */
|
||||||
|
extern struct mpq_archive_s;
|
||||||
|
|
||||||
|
extern(C) {
|
||||||
|
|
||||||
|
/* libmpq__generic information about library. */
|
||||||
|
char *libmpq__version();
|
||||||
|
|
||||||
|
/* libmpq__generic mpq archive information. */
|
||||||
|
int libmpq__archive_open(mpq_archive_s **mpq_archive, char *mpq_filename, off_t archive_offset);
|
||||||
|
int libmpq__archive_close(mpq_archive_s *mpq_archive);
|
||||||
|
int libmpq__archive_packed_size(mpq_archive_s *mpq_archive, off_t *packed_size);
|
||||||
|
int libmpq__archive_unpacked_size(mpq_archive_s *mpq_archive, off_t *unpacked_size);
|
||||||
|
int libmpq__archive_offset(mpq_archive_s *mpq_archive, off_t *offset);
|
||||||
|
int libmpq__archive_version(mpq_archive_s *mpq_archive, uint *version_);
|
||||||
|
int libmpq__archive_files(mpq_archive_s *mpq_archive, uint *files);
|
||||||
|
|
||||||
|
/* libmpq__generic file processing functions. */
|
||||||
|
int libmpq__file_packed_size(mpq_archive_s *mpq_archive, uint file_number, off_t *packed_size);
|
||||||
|
int libmpq__file_unpacked_size(mpq_archive_s *mpq_archive, uint file_number, off_t *unpacked_size);
|
||||||
|
int libmpq__file_offset(mpq_archive_s *mpq_archive, uint file_number, off_t *offset);
|
||||||
|
int libmpq__file_blocks(mpq_archive_s *mpq_archive, uint file_number, uint *blocks);
|
||||||
|
int libmpq__file_encrypted(mpq_archive_s *mpq_archive, uint file_number, uint *encrypted);
|
||||||
|
int libmpq__file_compressed(mpq_archive_s *mpq_archive, uint file_number, uint *compressed);
|
||||||
|
int libmpq__file_imploded(mpq_archive_s *mpq_archive, uint file_number, uint *imploded);
|
||||||
|
int libmpq__file_number(mpq_archive_s *mpq_archive, char *filename, uint *number);
|
||||||
|
int libmpq__file_read(mpq_archive_s *mpq_archive, uint file_number, ubyte *out_buf, off_t out_size, off_t *transferred);
|
||||||
|
|
||||||
|
/* libmpq__generic block processing functions. */
|
||||||
|
int libmpq__block_open_offset(mpq_archive_s *mpq_archive, uint file_number);
|
||||||
|
int libmpq__block_close_offset(mpq_archive_s *mpq_archive, uint file_number);
|
||||||
|
int libmpq__block_unpacked_size(mpq_archive_s *mpq_archive, uint file_number, uint block_number, off_t *unpacked_size);
|
||||||
|
int libmpq__block_read(mpq_archive_s *mpq_archive, uint file_number, uint block_number, ubyte *out_buf, off_t out_size, off_t *transferred);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** exception class for failed libmpq calls */
|
||||||
|
class MPQException : Exception {
|
||||||
|
const string[] Errors = [
|
||||||
|
"unknown error",
|
||||||
|
"open error on file",
|
||||||
|
"close error on file",
|
||||||
|
"lseek error on file",
|
||||||
|
"read error on file",
|
||||||
|
"write error on file",
|
||||||
|
"memory allocation error",
|
||||||
|
"format errror",
|
||||||
|
"init() wasn't called",
|
||||||
|
"buffer size is to small",
|
||||||
|
"file or block does not exist in archive",
|
||||||
|
"we don't know the decryption seed",
|
||||||
|
"error on unpacking file"];
|
||||||
|
|
||||||
|
public int errno;
|
||||||
|
this(char[] fnname = "unknown_function", int errno = 0) {
|
||||||
|
|
||||||
|
this.errno = errno;
|
||||||
|
if (-errno >= Errors.length)
|
||||||
|
errno = 0;
|
||||||
|
super(std.string.format("Error in %s(): %s (%d)",
|
||||||
|
fnname, Errors[-errno], errno));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** template to wrap function calls and throw exceptions in case of error
|
||||||
|
*
|
||||||
|
* thanks for the idea to while(nan) blog,
|
||||||
|
* http://while-nan.blogspot.com/2007/06/wrapping-functions-for-fun-and-profit.html
|
||||||
|
*
|
||||||
|
* use: MPQ_CHECKERR(libmpq__archive_open)(&m, "foo.mpq", -1);
|
||||||
|
* returns the retval of archive_open on success;
|
||||||
|
* throws an MPQException on failure.
|
||||||
|
*
|
||||||
|
* @param Fn libmpq__function reference
|
||||||
|
* @param args libmpq__function parameters
|
||||||
|
* @return return value of libmpq__function on success
|
||||||
|
* @throw MPQException on error
|
||||||
|
*/
|
||||||
|
int MPQ_CHECKERR(alias Fn)(ParameterTypeTuple!(Fn) args)
|
||||||
|
{
|
||||||
|
int result = Fn(args);
|
||||||
|
if (result < 0) {
|
||||||
|
/* XXX: relying on non-specified stringof() behaviour */
|
||||||
|
throw new MPQException((&Fn).stringof[2..$], result);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** mixin alias to wrap library functions into MPQ_CHECKERR.
|
||||||
|
*
|
||||||
|
* alias mpq.func_name(...) to MPQ_CHECKERR(libmpq__func_name)(...)
|
||||||
|
* @param func_name name of the function to be wrapped
|
||||||
|
*/
|
||||||
|
template MPQ_FUNC(char[] func_name) {
|
||||||
|
const char[] MPQ_FUNC = "alias MPQ_CHECKERR!(libmpq__" ~ func_name ~ ") " ~ func_name ~ ";";
|
||||||
|
}
|
||||||
|
|
||||||
|
alias libmpq__version libversion; /* must be direct alias because it returns char*, not error int */
|
||||||
|
mixin(MPQ_FUNC!("archive_open"));
|
||||||
|
mixin(MPQ_FUNC!("archive_close"));
|
||||||
|
mixin(MPQ_FUNC!("archive_packed_size"));
|
||||||
|
mixin(MPQ_FUNC!("archive_unpacked_size"));
|
||||||
|
mixin(MPQ_FUNC!("archive_offset"));
|
||||||
|
mixin(MPQ_FUNC!("archive_version"));
|
||||||
|
mixin(MPQ_FUNC!("archive_files"));
|
||||||
|
mixin(MPQ_FUNC!("file_packed_size"));
|
||||||
|
mixin(MPQ_FUNC!("file_unpacked_size"));
|
||||||
|
mixin(MPQ_FUNC!("file_offset"));
|
||||||
|
mixin(MPQ_FUNC!("file_blocks"));
|
||||||
|
mixin(MPQ_FUNC!("file_encrypted"));
|
||||||
|
mixin(MPQ_FUNC!("file_compressed"));
|
||||||
|
mixin(MPQ_FUNC!("file_imploded"));
|
||||||
|
mixin(MPQ_FUNC!("file_number"));
|
||||||
|
mixin(MPQ_FUNC!("file_read"));
|
||||||
|
mixin(MPQ_FUNC!("block_open_offset"));
|
||||||
|
mixin(MPQ_FUNC!("block_close_offset"));
|
||||||
|
mixin(MPQ_FUNC!("block_unpacked_size"));
|
||||||
|
mixin(MPQ_FUNC!("block_read"));
|
||||||
|
|
||||||
|
/** getter function named name for returning archive_* single values:
|
||||||
|
*
|
||||||
|
* <type> Archive.<name>() { return libmpq__archive_<name>() }
|
||||||
|
*
|
||||||
|
* @param type return type for the original function reference
|
||||||
|
* @param name name of the original function
|
||||||
|
* @param name2 name for the prototype (defaults to name, used for "version")
|
||||||
|
* @return getter function mixin
|
||||||
|
*/
|
||||||
|
template MPQ_A_GET(char[] type, char[] name, char[] name2 = name) {
|
||||||
|
const char[] MPQ_A_GET = type ~ " " ~ name2 ~ "() { " ~
|
||||||
|
type ~ " ret; " ~
|
||||||
|
"archive_" ~ name ~ "(m, &ret); return ret;" ~
|
||||||
|
"}";
|
||||||
|
}
|
||||||
|
|
||||||
|
/** wrapper class for an MPQ Archive
|
||||||
|
*
|
||||||
|
* syntax: auto a = new mpq.Archive("somefile.mpq");
|
||||||
|
*/
|
||||||
|
class Archive {
|
||||||
|
mpq_archive_s *m;
|
||||||
|
File listfile;
|
||||||
|
char[][] listfiledata;
|
||||||
|
|
||||||
|
this(char[] archivename, off_t offset = -1) {
|
||||||
|
archive_open(&m, toStringz(archivename), offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
mixin(MPQ_A_GET!("off_t", "packed_size"));
|
||||||
|
mixin(MPQ_A_GET!("off_t", "unpacked_size"));
|
||||||
|
mixin(MPQ_A_GET!("off_t", "offset"));
|
||||||
|
mixin(MPQ_A_GET!("uint", "version", "version_"));
|
||||||
|
mixin(MPQ_A_GET!("uint", "files"));
|
||||||
|
|
||||||
|
~this() {
|
||||||
|
archive_close(m);
|
||||||
|
}
|
||||||
|
|
||||||
|
mpq_archive_s* archive() {
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
File opIndex(char[] fname) {
|
||||||
|
return new File(this, fname);
|
||||||
|
}
|
||||||
|
File opIndex(int fno) {
|
||||||
|
return new File(this, fno);
|
||||||
|
}
|
||||||
|
|
||||||
|
char[][] filelist() {
|
||||||
|
try {
|
||||||
|
if (!listfile) {
|
||||||
|
listfile = this["(listfile)"];
|
||||||
|
listfiledata = (cast(char[])listfile.read()).splitlines();
|
||||||
|
}
|
||||||
|
return listfiledata;
|
||||||
|
} catch (MPQException e) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/+uint filenumber(char[] filename) {
|
||||||
|
try {
|
||||||
|
if (!listfile) {
|
||||||
|
listfile = this["(listfile)"];
|
||||||
|
listfiledata = (cast(char[])listfile.read()).splitlines();
|
||||||
|
}
|
||||||
|
return listfiledata;
|
||||||
|
} catch (MPQException e) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
}+/
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** getter function named name for returning file_* single values:
|
||||||
|
*
|
||||||
|
* <type> File.<name>() { return libmpq__file_<name>() }
|
||||||
|
*
|
||||||
|
* @param type return type for the original function reference
|
||||||
|
* @param name name of the original function
|
||||||
|
* @param name2 name for the prototype (defaults to name, used for "version")
|
||||||
|
* @return getter function mixin
|
||||||
|
*/
|
||||||
|
template MPQ_F_GET(char[] type, char[] name, char[] name2 = name) {
|
||||||
|
const char[] MPQ_F_GET = type ~ " " ~ name2 ~ "() { " ~
|
||||||
|
type ~ " ret; " ~
|
||||||
|
"file_" ~ name ~ "(am, fileno, &ret); " ~
|
||||||
|
"return ret;" ~
|
||||||
|
"}";
|
||||||
|
}
|
||||||
|
|
||||||
|
/** wrapper class for a single file in an MPQ Archive
|
||||||
|
*
|
||||||
|
* syntax:
|
||||||
|
* auto a = new mpq.Archive("somefile.mpq");
|
||||||
|
* auto f = a["(listfile)"];
|
||||||
|
* auto f2 = a[0];
|
||||||
|
* auto f3 = new File(a, "(listfile)");
|
||||||
|
*/
|
||||||
|
class File {
|
||||||
|
Archive a;
|
||||||
|
mpq_archive_s* am;
|
||||||
|
char[] filename;
|
||||||
|
uint fileno;
|
||||||
|
|
||||||
|
this(Archive a, int fileno) {
|
||||||
|
this.a = a;
|
||||||
|
this.am = a.archive();
|
||||||
|
if (fileno >= a.files) {
|
||||||
|
throw new MPQException(format("File(%d)", fileno),
|
||||||
|
LIBMPQ_ERROR_EXIST);
|
||||||
|
}
|
||||||
|
this.filename = format("file%04d.xxx", fileno);
|
||||||
|
this.fileno = fileno;
|
||||||
|
}
|
||||||
|
|
||||||
|
this(Archive a, char[] filename) {
|
||||||
|
this.a = a;
|
||||||
|
this.am = a.archive();
|
||||||
|
this.filename = filename;
|
||||||
|
/* this line will throw an exception when the file is not there */
|
||||||
|
mpq.file_number(am, toStringz(filename), &this.fileno);
|
||||||
|
}
|
||||||
|
|
||||||
|
mixin(MPQ_F_GET!("off_t", "packed_size"));
|
||||||
|
mixin(MPQ_F_GET!("off_t", "unpacked_size"));
|
||||||
|
mixin(MPQ_F_GET!("off_t", "offset"));
|
||||||
|
mixin(MPQ_F_GET!("uint", "blocks"));
|
||||||
|
mixin(MPQ_F_GET!("uint", "encrypted"));
|
||||||
|
mixin(MPQ_F_GET!("uint", "compressed"));
|
||||||
|
mixin(MPQ_F_GET!("uint", "imploded"));
|
||||||
|
|
||||||
|
uint no() { return fileno; }
|
||||||
|
char[] name() { return filename; }
|
||||||
|
|
||||||
|
ubyte[] read() {
|
||||||
|
ubyte[] content;
|
||||||
|
content.length = this.unpacked_size();
|
||||||
|
off_t trans;
|
||||||
|
mpq.file_read(am, fileno, content.ptr, content.length, &trans);
|
||||||
|
content.length = trans;
|
||||||
|
return content;
|
||||||
|
}
|
||||||
|
}
|
||||||
443
samples/DIGITAL Command Language/fis_gtm_kitinstal.com
Normal file
443
samples/DIGITAL Command Language/fis_gtm_kitinstal.com
Normal file
@@ -0,0 +1,443 @@
|
|||||||
|
$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||||
|
$! !
|
||||||
|
$! Copyright 2001, 2011 Fidelity Information Services, Inc !
|
||||||
|
$! !
|
||||||
|
$! This source code contains the intellectual property !
|
||||||
|
$! of its copyright holder(s), and is made available !
|
||||||
|
$! under a license. If you do not know the terms of !
|
||||||
|
$! the license, please stop and do not read further. !
|
||||||
|
$! !
|
||||||
|
$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||||
|
$!
|
||||||
|
$!
|
||||||
|
$! KITINSTAL.COM PROCEDURE FOR THE GT.M PRODUCT
|
||||||
|
$!
|
||||||
|
$ ON CONTROL_Y THEN VMI$CALLBACK CONTROL_Y
|
||||||
|
$! ON WARNING THEN EXIT $STATUS !! allow warning errors for INSTALL REPLACE
|
||||||
|
$ IF P1 .EQS. "VMI$_INSTALL" THEN GOTO INSTALL
|
||||||
|
$ IF P1 .EQS. "VMI$_POSTINSTALL" THEN GOTO POSTINSTALL
|
||||||
|
$ IF P1 .EQS. "VMI$_IVP" THEN GOTO IVP
|
||||||
|
$ EXIT VMI$_UNSUPPORTED
|
||||||
|
$!
|
||||||
|
$INSTALL:
|
||||||
|
$ TYPE SYS$INPUT
|
||||||
|
|
||||||
|
GT.M (c) COPYRIGHT 1985 - 2000 by Sanchez Computer Associates
|
||||||
|
ALL RIGHTS RESERVED
|
||||||
|
|
||||||
|
$! the following 2 lines must be maintained
|
||||||
|
$ GTM$VMS_VERSION :== 072 ! Minimum VMS version required
|
||||||
|
$ ALPHA = (f$getsyi("arch_name") .eqs. "Alpha")
|
||||||
|
$ IF ALPHA
|
||||||
|
$ THEN
|
||||||
|
$ GTM$DISK_SPACE == 28000 ! Minumum disk space on system disk required
|
||||||
|
$ ELSE
|
||||||
|
$ GTM$DISK_SPACE == 16000 ! Minumum disk space on system disk required
|
||||||
|
$ ENDIF
|
||||||
|
$ IF F$ELEMENT(0,",",VMI$VMS_VERSION) .EQS. "RELEASED"
|
||||||
|
$ THEN
|
||||||
|
$ GTM$VMS_IS == F$ELEMENT(1,",",VMI$VMS_VERSION)
|
||||||
|
$ IF GTM$VMS_IS .LTS. GTM$VMS_VERSION
|
||||||
|
$ THEN
|
||||||
|
$ VMI$CALLBACK MESSAGE E VMSMISMATCH "This GT.M kit requires an existing VMS''GTM$VMS_VERSION' system."
|
||||||
|
$ EXIT VMI$_FAILURE
|
||||||
|
$ ENDIF
|
||||||
|
$ ELSE
|
||||||
|
$ GTM$VMS_IS :==
|
||||||
|
$ WRITE SYS$OUTPUT " No VMS version checking performed for field test versions."
|
||||||
|
$ ENDIF
|
||||||
|
$ IF (GTM$VMS_IS .GES. "052") THEN T1 = F$VERIFY(VMI$KIT_DEBUG)
|
||||||
|
$ VMI$CALLBACK CHECK_NET_UTILIZATION GTM$ROOM 'GTM$DISK_SPACE'
|
||||||
|
$ IF .NOT. GTM$ROOM
|
||||||
|
$ THEN
|
||||||
|
$ VMI$CALLBACK MESSAGE E NOSPACE "There is not enough disk space -- GT.M needs ''GTM$DISK_SPACE' blocks."
|
||||||
|
$ EXIT VMI$_FAILURE
|
||||||
|
$ ENDIF
|
||||||
|
$! setup default answers
|
||||||
|
$ GTM$DOPURGE :== YES
|
||||||
|
$ GTM$RUN_IVP :== YES
|
||||||
|
$ GTM$STD_CNF :== YES
|
||||||
|
$ GTM$DST_OWN :== SYSTEM
|
||||||
|
$ IF F$IDENTIFIER(GTM$DST_OWN,"NAME_TO_NUMBER") .EQ. 0 THEN GTM$DST_OWN :== 1,4
|
||||||
|
$ GTM$SYS_DST :== YES
|
||||||
|
$ GTM$DST_DIR :== GTM_DIST
|
||||||
|
$ GTM$DST_CRE == GTM$DST_DIR
|
||||||
|
$ GTM$DST_DEV :==
|
||||||
|
$ GTM$STARTDB :== YES
|
||||||
|
$ GTM$MGR_COM :== YES
|
||||||
|
$ GTM$HLP_DIR :== NO
|
||||||
|
$ GTM$DEF_DCL :== YES
|
||||||
|
$ GTM$DEF_SYS :== YES
|
||||||
|
$ GTM$LNK_LOG :== YES
|
||||||
|
$ GTM$INSTALL :== YES
|
||||||
|
$ GTM$DEF_GLD :== YES
|
||||||
|
$ GTM$GBL_DIR :== MUMPS.GLD
|
||||||
|
$ GTM$DEF_RTN :== YES
|
||||||
|
$ GTM$RTN_DIR :== [],GTM$DIST:
|
||||||
|
$ GTM$PCT_RTN :== YES
|
||||||
|
$ VMI$CALLBACK ASK GTM$DOPURGE "Do you want to purge files replaced by this installation" 'GTM$DOPURGE' B -
|
||||||
|
"@VMI$KWD:GTMKITHLP HELP_PURGE"
|
||||||
|
$ IF .NOT. GTM$DOPURGE THEN VMI$CALLBACK SET PURGE NO
|
||||||
|
$ VMI$CALLBACK ASK GTM$STD_CNF "Do you want the standard GT.M configuration (performs INSTALL)" 'GTM$STD_CNF' B -
|
||||||
|
"@VMI$KWD:GTMKITHLP HELP_STD_CNF"
|
||||||
|
$ IF GTM$STD_CNF
|
||||||
|
$ THEN
|
||||||
|
$ GTM$SYS_DST == 1
|
||||||
|
$ GTM$STARTDB == 1
|
||||||
|
$ GTM$MGR_COM == 1
|
||||||
|
$ GTM$HLP_DIR == 0
|
||||||
|
$ GTM$DEF_DCL == 1
|
||||||
|
$ GTM$DEF_SYS == 1
|
||||||
|
$ GTM$INSTALL == 1
|
||||||
|
$ GTM$LNK_LOG == 1
|
||||||
|
$ GTM$INSTALL == 1
|
||||||
|
$ GTM$DEF_GLD == 1
|
||||||
|
$ GTM$DEF_RTN == 1
|
||||||
|
$ GTM$PCT_RTN == 1
|
||||||
|
$ GTM$DST_LOG :== SYS$COMMON:['GTM$DST_DIR']
|
||||||
|
$ GTM$DIR_TYPE :== COMMON
|
||||||
|
$ ELSE ! Not standard configuration
|
||||||
|
$ VMI$CALLBACK ASK GTM$DST_OWN "What UIC should own the GT.M distribution" 'GTM$DST_OWN' S "@VMI$KWD:GTMKITHLP HELP_DST_OWN"
|
||||||
|
$ GTM$DST_OWN == GTM$DST_OWN - "[" - "]"
|
||||||
|
$ VMI$CALLBACK ASK GTM$SYS_DST "Do you want the GT.M distribution to go into a System Directory" 'GTM$SYS_DST' B -
|
||||||
|
"@VMI$KWD:GTMKITHLP HELP_SYS_DST"
|
||||||
|
$ IF GTM$SYS_DST
|
||||||
|
$ THEN
|
||||||
|
$ VMI$CALLBACK ASK GTM$DST_DIR "In what System Directory do you want to place GT.M" 'GTM$DST_DIR' S -
|
||||||
|
"@VMI$KWD:GTMKITHLP HELP_SYS_DIR"
|
||||||
|
$ GTM$DST_DIR == GTM$DST_DIR - "[" - "]"
|
||||||
|
$ GTM$DST_CRE == GTM$DST_DIR
|
||||||
|
$ GTM$DST_LOG :== SYS$COMMON:['GTM$DST_DIR']
|
||||||
|
$ GTM$DIR_TYPE :== COMMON
|
||||||
|
$ ELSE ! Not system disk
|
||||||
|
$ VMI$CALLBACK ASK GTM$DST_DEV "On which device do you want to place GT.M" "''GTM$DST_DEV'" S "@VMI$KWD:GTMKITHLP HELP_DST_DEV"
|
||||||
|
$ VMI$CALLBACK ASK GTM$DST_DIR "In what directory on that device do you want to place GT.M" 'GTM$DST_DIR' S -
|
||||||
|
"@VMI$KWD:GTMKITHLP HELP_DST_DIR"
|
||||||
|
$ GTM$DST_DEV == GTM$DST_DEV - ":"
|
||||||
|
$ GTM$DST_DIR == GTM$DST_DIR - "[" - "]"
|
||||||
|
$ GTM$DST_LOG :== 'GTM$DST_DEV':['GTM$DST_DIR']
|
||||||
|
$ GTM$DST_CRE == GTM$DST_LOG
|
||||||
|
$ GTM$DIR_TYPE :== USER
|
||||||
|
$ ENDIF ! system disk
|
||||||
|
$ VMI$CALLBACK ASK GTM$STARTDB "Do you want GTMSTART.COM in the startup database" 'GTM$STARTDB' B -
|
||||||
|
"@VMI$KWD:GTMKITHLP HELP_STARTDB"
|
||||||
|
$ IF .NOT. GTM$STARTDB
|
||||||
|
$ THEN
|
||||||
|
$ VMI$CALLBACK ASK GTM$MGR_COM "Do you want the GT.M .COM files in SYS$MANAGER" 'GTM$MGR_COM' B -
|
||||||
|
"@VMI$KWD:GTMKITHLP HELP_MGR_COM"
|
||||||
|
$ ENDIF
|
||||||
|
$ VMI$CALLBACK ASK GTM$HLP_DIR "Do you want the GT.M help files in SYS$HELP" 'GTM$HLP_DIR' B "@VMI$KWD:GTMKITHLP HELP_HLP_DIR"
|
||||||
|
$ VMI$CALLBACK ASK GTM$DEF_DCL "Do you want to define GT.M commands to the system" 'GTM$DEF_DCL' B -
|
||||||
|
"@VMI$KWD:GTMKITHLP HELP_DEF_DCL"
|
||||||
|
$ VMI$CALLBACK ASK GTM$DEF_SYS "Do you want to define GT.M logical names in the System Table" 'GTM$DEF_SYS' B -
|
||||||
|
"@VMI$KWD:GTMKITHLP HELP_DEF_SYS"
|
||||||
|
$ VMI$CALLBACK ASK GTM$LNK_LOG "Do you want to define the LNK$LIBRARY logical names" 'GTM$LNK_LOG' B -
|
||||||
|
"@VMI$KWD:GTMKITHLP HELP_LNK_LOG"
|
||||||
|
$ VMI$CALLBACK ASK GTM$RUN_IVP "Do you want to run the IVP (performs INSTALL)" 'GTM$RUN_IVP' B -
|
||||||
|
"@VMI$KWD:GTMKITHLP HELP_RUN_IVP"
|
||||||
|
$ IF GTM$RUN_IVP
|
||||||
|
$ THEN
|
||||||
|
$ GTM$PCT_RTN == 1
|
||||||
|
$ ELSE
|
||||||
|
$ VMI$CALLBACK ASK GTM$PCT_RTN "Do you want to compile the GT.M percent routines (performs INSTALL)" 'GTM$PCT_RTN' B -
|
||||||
|
"@VMI$KWD:GTMKITHLP HELP_PCT_RTN"
|
||||||
|
$ ENDIF
|
||||||
|
$ IF (GTM$RUN_IVP .OR. GTM$PCT_RTN)
|
||||||
|
$ THEN
|
||||||
|
$ GTM$INSTALL == 1
|
||||||
|
$ ELSE
|
||||||
|
$ VMI$CALLBACK ASK GTM$INSTALL "Do you want to INSTALL the GT.M shareable images now" 'GTM$INSTALL' B -
|
||||||
|
"@VMI$KWD:GTMKITHLP HELP_INSTALL"
|
||||||
|
$ ENDIF
|
||||||
|
$ VMI$CALLBACK ASK GTM$DEF_RTN "Do you want to have a default definition for GTM$ROUTINES" 'GTM$DEF_RTN' B -
|
||||||
|
"@VMI$KWD:GTMKITHLP HELP_DEF_RTN"
|
||||||
|
$ IF GTM$DEF_RTN
|
||||||
|
$ THEN
|
||||||
|
$ VMI$CALLBACK ASK GTM$RTN_DIR "What is the search specification for GTM$ROUTINES" 'GTM$RTN_DIR' S -
|
||||||
|
"@VMI$KWD:GTMKITHLP HELP_RTN_DIR"
|
||||||
|
$ ENDIF
|
||||||
|
$ VMI$CALLBACK ASK GTM$DEF_GLD "Do you want to have a default definition for GTM$GBLDIR" 'GTM$DEF_GLD' B -
|
||||||
|
"@VMI$KWD:GTMKITHLP HELP_DEF_GLD"
|
||||||
|
$ IF GTM$DEF_GLD
|
||||||
|
$ THEN
|
||||||
|
$ VMI$CALLBACK ASK GTM$GBL_DIR "What is the file specification for GTM$GBLDIR" 'GTM$GBL_DIR' S -
|
||||||
|
"@VMI$KWD:GTMKITHLP HELP_GBL_DIR"
|
||||||
|
$ ENDIF
|
||||||
|
$ ENDIF ! standard configuration
|
||||||
|
$! tell them what's happening
|
||||||
|
$ IF GTM$MGR_COM
|
||||||
|
$ THEN
|
||||||
|
$ WRITE SYS$OUTPUT " The following command files are created and copied to SYS$MANAGER:"
|
||||||
|
$ ELSE
|
||||||
|
$ WRITE SYS$OUTPUT " The following command files are created:"
|
||||||
|
$ ENDIF
|
||||||
|
$ TYPE SYS$INPUT
|
||||||
|
|
||||||
|
GTMINSTALL.COM
|
||||||
|
GTMLOGICALS.COM
|
||||||
|
GTMLOGIN.COM
|
||||||
|
GTMSTART.COM
|
||||||
|
GTMSTOP.COM
|
||||||
|
|
||||||
|
Each file contains its own user documentation.
|
||||||
|
|
||||||
|
All the questions have been asked. Installation now proceeds without your
|
||||||
|
manual intervention for about 10-15 minutes.
|
||||||
|
$ IF GTM$RUN_IVP THEN WRITE SYS$OUTPUT " Finally the Installation Verification Procedure tests the installation."
|
||||||
|
$ WRITE SYS$OUTPUT ""
|
||||||
|
$ VMI$CALLBACK CREATE_DIRECTORY 'GTM$DIR_TYPE' 'GTM$DST_CRE' "/OWNER_UIC=[''GTM$DST_OWN'] /PROTECTION=(WO:RE)"
|
||||||
|
$ VMI$CALLBACK RESTORE_SAVESET B
|
||||||
|
$ VMI$CALLBACK RESTORE_SAVESET C
|
||||||
|
$ WRITE SYS$OUTPUT ""
|
||||||
|
$ VMI$CALLBACK MESSAGE I CRECOM "Creating command files."
|
||||||
|
$! Create GTMINSTALL.COM
|
||||||
|
$ OPEN /WRITE OUFILE VMI$KWD:GTMINSTALL.COM
|
||||||
|
$ WRITE OUFILE "$!"
|
||||||
|
$ WRITE OUFILE "$! GTMINSTALL.COM installs GTMSECSHR and other GT.M images."
|
||||||
|
$ WRITE OUFILE "$! GTMSECSHR is a small protected image and must be installed."
|
||||||
|
$ WRITE OUFILE "$! GTMSHR is the run-time library and is installed for performance."
|
||||||
|
$ WRITE OUFILE "$! GTM$DMOD and MCOMPILE are small images frequently used in development."
|
||||||
|
$ WRITE OUFILE "$!"
|
||||||
|
$ WRITE OUFILE "$ INSTALL"
|
||||||
|
$ WRITE OUFILE "REPLACE /OPEN/SHARED/HEADER/PROTECTED GTMSECSHR"
|
||||||
|
$ WRITE OUFILE "REPLACE /OPEN/SHARED/HEADER GTMSHR"
|
||||||
|
$ WRITE OUFILE "REPLACE /OPEN/SHARED/HEADER GTM$DMOD"
|
||||||
|
$ WRITE OUFILE "REPLACE /OPEN/SHARED/HEADER MCOMPILE"
|
||||||
|
$ WRITE OUFILE "$ EXIT"
|
||||||
|
$ CLOSE OUFILE
|
||||||
|
$! Create GTMLOGICALS.COM
|
||||||
|
$ GTM$HLP_LOG :== GTM$DIST
|
||||||
|
$ IF GTM$HLP_DIR THEN GTM$HLP_LOG :== SYS$HELP
|
||||||
|
$ OPEN /WRITE OUFILE VMI$KWD:GTMLOGICALS.COM
|
||||||
|
$ WRITE OUFILE "$!"
|
||||||
|
$ WRITE OUFILE "$! GTMLOGICALS.COM defines the logical names required to use GT.M."
|
||||||
|
$ WRITE OUFILE "$! By default the definitions are placed in the PROCESS table."
|
||||||
|
$ WRITE OUFILE "$! Parameter 1, if supplied should be the name of a logical name table"
|
||||||
|
$ WRITE OUFILE "$! and/or the mode of definition."
|
||||||
|
$ WRITE OUFILE "$! Assignments in a ""permanent"" table reduce GT.M activation time."
|
||||||
|
$ WRITE OUFILE "$!"
|
||||||
|
$ IF GTM$LNK_LOG THEN WRITE OUFILE "$! The LNK$LIBRARY names many require adjustment to your environment."
|
||||||
|
$ IF GTM$DEF_GLD THEN WRITE OUFILE "$! GTM$GBLDIR is defined to provide default access to a global directory."
|
||||||
|
$ IF GTM$DEF_RTN THEN WRITE OUFILE "$! GTM$ROUTINES is defined to provide access to the GT.M utilities."
|
||||||
|
$ IF GTM$DEF_RTN THEN WRITE OUFILE "$! You may wish to define a different structure for $ZROUTINES."
|
||||||
|
$ WRITE OUFILE "$!"
|
||||||
|
$ WRITE OUFILE "$ IF (P1 .NES. """") .AND. (F$EXTRACT(0,1,P1) .NES. ""/"") THEN P1 := /'P1"
|
||||||
|
$ WRITE OUFILE "$ DEFINE 'P1' GTM$DIST ''GTM$DST_LOG'"
|
||||||
|
$ IF GTM$DEF_GLD THEN WRITE OUFILE "$ DEFINE 'P1' GTM$GBLDIR ''GTM$GBL_DIR'"
|
||||||
|
$ IF GTM$DEF_RTN THEN WRITE OUFILE "$ DEFINE 'P1' GTM$ROUTINES ""''GTM$RTN_DIR'"""
|
||||||
|
$ WRITE OUFILE "$ DEFINE 'P1' GTM$HELP ''GTM$HLP_LOG'"
|
||||||
|
$ WRITE OUFILE "$ DEFINE 'P1' GTMSHR GTM$DIST:GTMSHR.EXE"
|
||||||
|
$ WRITE OUFILE "$ DEFINE 'P1' GTMSECSHR GTM$DIST:GTMSECSHR.EXE"
|
||||||
|
$ WRITE OUFILE "$ DEFINE 'P1' GTM$DMOD GTM$DIST:GTM$DMOD.EXE"
|
||||||
|
$ WRITE OUFILE "$ DEFINE 'P1' MCOMPILE GTM$DIST:MCOMPILE.EXE"
|
||||||
|
$ IF GTM$LNK_LOG
|
||||||
|
$ THEN
|
||||||
|
$ N1 = 0
|
||||||
|
$ DN = 0
|
||||||
|
$ T1 = F$TRNLNM("LNK$LIBRARY")
|
||||||
|
$ IF (T1 .EQS. "") .OR. (F$LOCATE("GTMLIB",T1) .NE. F$LENGTH(T1)) .OR. (F$LOCATE("GTMSHR",T1) .NE. F$LENGTH(T1))
|
||||||
|
$ THEN
|
||||||
|
$ WRITE OUFILE "$ DEFINE 'P1' LNK$LIBRARY GTM$DIST:GTMLIB.OLB"
|
||||||
|
$ DN = 1
|
||||||
|
$ ELSE ! lnk$library is in use
|
||||||
|
$LNK_LOOP:
|
||||||
|
$ N1 = N1 + 1
|
||||||
|
$ T1 = F$TRNLNM("LNK$LIBRARY_''N1'")
|
||||||
|
$ IF (T1 .EQS. "") .OR. (F$LOCATE("GTMLIB",T1) .NE. F$LENGTH(T1)) .OR. (F$LOCATE("GTMSHR",T1) .NE. F$LENGTH(T1))
|
||||||
|
$ THEN
|
||||||
|
$ WRITE OUFILE "$ DEFINE 'P1' LNK$LIBRARY_''N1' GTM$DIST:GTMLIB.OLB"
|
||||||
|
$ DN = 1
|
||||||
|
$ ENDIF
|
||||||
|
$ IF (.NOT. DN) .AND. (N1 .LT. 998) THEN GOTO LNK_LOOP
|
||||||
|
$ ENDIF ! gtmlib handling
|
||||||
|
$ IF DN ! placed gtmlib
|
||||||
|
$ THEN
|
||||||
|
$ N1 = N1 + 1
|
||||||
|
$ WRITE OUFILE "$ DEFINE 'P1' LNK$LIBRARY_''N1' GTM$DIST:GTMSHR.OLB"
|
||||||
|
$ ELSE
|
||||||
|
$ VMI$CALLBACK MESSAGE I NOLNKLOG "No LNK$LIBRARY logical names available"
|
||||||
|
$ ENDIF
|
||||||
|
$ ENDIF ! setting up LNK$LIBRARYs
|
||||||
|
$ WRITE OUFILE "$ EXIT"
|
||||||
|
$ CLOSE OUFILE
|
||||||
|
$! Create GTMLOGIN.COM
|
||||||
|
$ OPEN /WRITE OUFILE VMI$KWD:GTMLOGIN.COM
|
||||||
|
$ WRITE OUFILE "$!"
|
||||||
|
$ WRITE OUFILE "$! GTMLOGIN.COM performs process specific setup for GT.M."
|
||||||
|
$ WRITE OUFILE "$! It calls GTMLOGICALS.COM if the logical names are not"
|
||||||
|
$ WRITE OUFILE "$! in the SYSTEM table."
|
||||||
|
$ WRITE OUFILE "$! It defines symbols to access GT.M images."
|
||||||
|
$ WRITE OUFILE "$! It defines GT.M commands locally if they are not defined to the system."
|
||||||
|
$ WRITE OUFILE "$! When the command and logical names are not defined on a process level,"
|
||||||
|
$ WRITE OUFILE "$! a production user may save start-up time by not using GTMLOGIN."
|
||||||
|
$ WRITE OUFILE "$! CCE is infrequently used, but may be defined as a foreign command."
|
||||||
|
$ WRITE OUFILE "$!"
|
||||||
|
$ IF .NOT. GTM$DEF_SYS
|
||||||
|
$ THEN
|
||||||
|
$ WRITE OUFILE "$ dir = F$ENVIRONMENT(""PROCEDURE"")"
|
||||||
|
$ WRITE OUFILE "$ dir = F$PARSE(dir,,,""DEVICE"") + F$PARSE(dir,,,""DIRECTORY"")"
|
||||||
|
$ WRITE OUFILE "$ @'dir'GTMLOGICALS.COM"
|
||||||
|
$ ENDIF
|
||||||
|
$ IF .NOT. GTM$DEF_DCL THEN WRITE OUFILE "$ SET COMMAND GTM$DIST:GTMCOMMANDS.CLD"
|
||||||
|
$ WRITE OUFILE "$ DSE :== $GTM$DIST:DSE.EXE ! Database System Editor"
|
||||||
|
$ WRITE OUFILE "$ GDE :== $GTM$DIST:GDE.EXE ! Global Directory Editor"
|
||||||
|
$ WRITE OUFILE "$ GTM :== MUMPS/DIRECT ! Direct Mode MUMPS"
|
||||||
|
$ WRITE OUFILE "$ LKE :== $GTM$DIST:LKE.EXE ! Lock Editor"
|
||||||
|
$ WRITE OUFILE "$ MUPI*P :== $GTM$DIST:MUPIP.EXE ! MUMPS Peripheral Interchange Program"
|
||||||
|
$ WRITE OUFILE "$ EXIT"
|
||||||
|
$ WRITE OUFILE "$ CCE :== $GTM$DIST:CCE.EXE ! GT.CX Operator Interface Program"
|
||||||
|
$ WRITE OUFILE "$ EXIT"
|
||||||
|
$ CLOSE OUFILE
|
||||||
|
$! Create GTMSTART.COM
|
||||||
|
$ OPEN /WRITE OUFILE VMI$KWD:GTMSTART.COM
|
||||||
|
$ WRITE OUFILE "$!"
|
||||||
|
$ WRITE OUFILE "$! GTMSTART.COM should be placed in the VMS startup database."
|
||||||
|
$ WRITE OUFILE "$! It invokes GTMLOGICALS.COM and GTMINSTALL.COM."
|
||||||
|
$ WRITE OUFILE "$!"
|
||||||
|
$ WRITE OUFILE "$ dir = F$ENVIRONMENT(""PROCEDURE"")"
|
||||||
|
$ WRITE OUFILE "$ dir = F$PARSE(dir,,,""DEVICE"") + F$PARSE(dir,,,""DIRECTORY"")"
|
||||||
|
$ IF GTM$DEF_SYS THEN WRITE OUFILE "$ IF P1 .EQS. """" .OR. (P1 .EQS. ""FULL"") THEN P1 := SYSTEM/EXEC"
|
||||||
|
$ WRITE OUFILE "$ @'dir'GTMLOGICALS 'P1'"
|
||||||
|
$ WRITE OUFILE "$ @'dir'GTMINSTALL"
|
||||||
|
$ WRITE OUFILE "$ EXIT"
|
||||||
|
$ CLOSE OUFILE
|
||||||
|
$! Create GTMSTOP.COM
|
||||||
|
$ OPEN /WRITE OUFILE VMI$KWD:GTMSTOP.COM
|
||||||
|
$ WRITE OUFILE "$!"
|
||||||
|
$ WRITE OUFILE "$! GTMSTOP.COM stops all the active GT.M processes and does a RUNDOWN."
|
||||||
|
$ WRITE OUFILE "$! Place an invocation or copy of this procedure in the site specific"
|
||||||
|
$ WRITE OUFILE "$! shutdown: SYS$MANAGER:SYSHUTDWN to ensure all GT.M databases are"
|
||||||
|
$ WRITE OUFILE "$! properly closed before VMS terminates. GTMSTOP should follow"
|
||||||
|
$ WRITE OUFILE "$! GTCMSTOP and precede GTCXSTOP, if they are used."
|
||||||
|
$ WRITE OUFILE "$! If GTMSTOP is not intended to disable subsequent use of GT.M,"
|
||||||
|
$ WRITE OUFILE "$! add a comment (!) before the INSTALL REMOVE GTMSECSHR."
|
||||||
|
$ WRITE OUFILE "$!"
|
||||||
|
$ IF .NOT. GTM$DEF_SYS
|
||||||
|
$ THEN
|
||||||
|
$ WRITE OUFILE "$ dir = F$ENVIRONMENT(""PROCEDURE"")"
|
||||||
|
$ WRITE OUFILE "$ dir = F$PARSE(dir,,,""DEVICE"") + F$PARSE(dir,,,""DIRECTORY"")"
|
||||||
|
$ WRITE OUFILE "$ @'dir'GTMLOGICALS.COM"
|
||||||
|
$ ENDIF
|
||||||
|
$ WRITE OUFILE "$ MUPIP := $GTM$DIST:MUPIP.EXE"
|
||||||
|
$ WRITE OUFILE "$ STOP := $GTM$DIST:GTM$STOP"
|
||||||
|
$ WRITE OUFILE "$ STOP 'P1'"
|
||||||
|
$ WRITE OUFILE "$ MUPIP RUNDOWN"
|
||||||
|
$ WRITE OUFILE "$ INSTALL REMOVE GTMSECSHR"
|
||||||
|
$ WRITE OUFILE "$ EXIT"
|
||||||
|
$ IF GTM$DEF_SYS THEN WRITE OUFILE "$ IF P2 .EQS. """" THEN P2 := /SYSTEM/EXEC"
|
||||||
|
$ WRITE OUFILE "$ DEASSIGN 'P2' GTMSECSHR"
|
||||||
|
$ CLOSE OUFILE
|
||||||
|
$ VMI$CALLBACK MESSAGE I PREINS "Preparing files for installation."
|
||||||
|
$! GTMFILES.KIT must be maintained as kit contents change
|
||||||
|
$ GTM$HLP_LOG == GTM$DST_LOG
|
||||||
|
$ IF GTM$HLP_DIR THEN GTM$HLP_LOG :== VMI$ROOT:[SYSHLP]
|
||||||
|
$ OPEN /WRITE OUFILE VMI$KWD:GTMFILES.KIT
|
||||||
|
$ IF GTM$MGR_COM
|
||||||
|
$ THEN
|
||||||
|
$ WRITE OUFILE "GTM$ GTMINSTALL.COM VMI$ROOT:[SYSMGR] C"
|
||||||
|
$ WRITE OUFILE "GTM$ GTMLOGICALS.COM VMI$ROOT:[SYSMGR] C"
|
||||||
|
$ WRITE OUFILE "GTM$ GTMLOGIN.COM VMI$ROOT:[SYSMGR] C"
|
||||||
|
$ WRITE OUFILE "GTM$ GTMSTART.COM VMI$ROOT:[SYSMGR] C"
|
||||||
|
$ WRITE OUFILE "GTM$ GTMSTOP.COM VMI$ROOT:[SYSMGR] C"
|
||||||
|
$ ENDIF
|
||||||
|
$ WRITE OUFILE "GTM$ GTMINSTALL.COM ''GTM$DST_LOG'"
|
||||||
|
$ WRITE OUFILE "GTM$ GTMLOGICALS.COM ''GTM$DST_LOG'"
|
||||||
|
$ WRITE OUFILE "GTM$ GTMLOGIN.COM ''GTM$DST_LOG'"
|
||||||
|
$ WRITE OUFILE "GTM$ GTMSTART.COM ''GTM$DST_LOG'"
|
||||||
|
$ WRITE OUFILE "GTM$ GTMSTOP.COM ''GTM$DST_LOG'"
|
||||||
|
$ WRITE OUFILE "GTM$ DSE.HLB ''GTM$HLP_LOG'"
|
||||||
|
$ WRITE OUFILE "GTM$ GDE.HLB ''GTM$HLP_LOG'"
|
||||||
|
$ WRITE OUFILE "GTM$ LKE.HLB ''GTM$HLP_LOG'"
|
||||||
|
$ WRITE OUFILE "GTM$ MUMPS.HLB ''GTM$HLP_LOG'"
|
||||||
|
$ WRITE OUFILE "GTM$ MUPIP.HLB ''GTM$HLP_LOG'"
|
||||||
|
$ WRITE OUFILE "GTM$ GTMLIB.OLB ''GTM$DST_LOG'"
|
||||||
|
$ WRITE OUFILE "GTM$ GTMSHR.OLB ''GTM$DST_LOG'"
|
||||||
|
$ WRITE OUFILE "GTM$ GTMZCALL.MLB ''GTM$DST_LOG'"
|
||||||
|
$ IF ALPHA
|
||||||
|
$ THEN
|
||||||
|
$ WRITE OUFILE "GTM$ GTM$DEFAULTS.M64 ''GTM$DST_LOG'"
|
||||||
|
$ ELSE
|
||||||
|
$ WRITE OUFILE "GTM$ GTM$DEFAULTS.MAR ''GTM$DST_LOG'"
|
||||||
|
$ ENDIF
|
||||||
|
$ WRITE OUFILE "GTM$ GTM$CE.H ''GTM$DST_LOG'"
|
||||||
|
$ WRITE OUFILE "GTM$ GTMCOLLECT.OPT ''GTM$DST_LOG'"
|
||||||
|
$ WRITE OUFILE "GTM$ GTMCOMMANDS.CLD ''GTM$DST_LOG' C"
|
||||||
|
$ WRITE OUFILE "GTM$ *.M ''GTM$DST_LOG'"
|
||||||
|
$ CLOSE OUFILE
|
||||||
|
$! GTMIMAGES.KIT must be maintained as kit contents change
|
||||||
|
$ OPEN /WRITE OUFILE VMI$KWD:GTMIMAGES.KIT
|
||||||
|
$ WRITE OUFILE "GTM$ GTMSECSHR.EXE ''GTM$DST_LOG'"
|
||||||
|
$ WRITE OUFILE "GTM$ GTMSHR.EXE ''GTM$DST_LOG'"
|
||||||
|
$ WRITE OUFILE "GTM$ DSE.EXE ''GTM$DST_LOG'"
|
||||||
|
$ WRITE OUFILE "GTM$ GDE.EXE ''GTM$DST_LOG'"
|
||||||
|
$ WRITE OUFILE "GTM$ GTM$DMOD.EXE ''GTM$DST_LOG'"
|
||||||
|
$ WRITE OUFILE "GTM$ LKE.EXE ''GTM$DST_LOG'"
|
||||||
|
$ WRITE OUFILE "GTM$ MCOMPILE.EXE ''GTM$DST_LOG'"
|
||||||
|
$ WRITE OUFILE "GTM$ MUPIP.EXE ''GTM$DST_LOG'"
|
||||||
|
$ WRITE OUFILE "GTM$ GTM$STOP.EXE ''GTM$DST_LOG'"
|
||||||
|
$ CLOSE OUFILE
|
||||||
|
$! Provide with file.KITs
|
||||||
|
$ VMI$CALLBACK PROVIDE_FILE "" VMI$KWD:GTMFILES.KIT "" T
|
||||||
|
$ VMI$CALLBACK PROVIDE_IMAGE "" VMI$KWD:GTMIMAGES.KIT "" T
|
||||||
|
$ VMI$CALLBACK MESSAGE I FININS "Finalizing the installation."
|
||||||
|
$ IF GTM$DEF_DCL THEN VMI$CALLBACK PROVIDE_DCL_COMMAND GTMCOMMANDS.CLD
|
||||||
|
$ IF GTM$STARTDB THEN VMI$CALLBACK MODIFY_STARTUP_DB ADD GTMSTART.COM LPMAIN
|
||||||
|
$! GTM$INSTALL is TRUE if GTM$RUN_IVP or GTM$PCT_RTN
|
||||||
|
$ IF GTM$INSTALL THEN VMI$CALLBACK SET POSTINSTALL YES
|
||||||
|
$ IF GTM$RUN_IVP THEN VMI$CALLBACK SET IVP YES
|
||||||
|
$ EXIT VMI$_SUCCESS
|
||||||
|
$!
|
||||||
|
$POSTINSTALL:
|
||||||
|
$ ON CONTROL_Y THEN EXIT VMI$_FAILURE
|
||||||
|
$! remove MUPIP from command tables for change from V2.4 to V2.5
|
||||||
|
$ SET NOON
|
||||||
|
$ DEFINE /USER_MODE SYS$OUTPUT NL:
|
||||||
|
$ DEFINE /USER_MODE SYS$ERROR NL:
|
||||||
|
$ SET COMMAND /TABLE=SYS$COMMON:[SYSLIB]DCLTABLES /OUTPUT=SYS$COMMON:[SYSLIB]DCLTABLES /DELETE=MUPIP
|
||||||
|
$ DEFINE /USER_MODE SYS$OUTPUT NL:
|
||||||
|
$ DEFINE /USER_MODE SYS$ERROR NL:
|
||||||
|
$ SET COMMAND /DELETE=MUPIP
|
||||||
|
$ SET ON
|
||||||
|
$ IF GTM$MGR_COM
|
||||||
|
$ THEN
|
||||||
|
$ T1 := SYS$MANAGER:
|
||||||
|
$ ELSE
|
||||||
|
$ T1 = GTM$DST_LOG
|
||||||
|
$ ENDIF
|
||||||
|
$ @'T1'GTMSTART
|
||||||
|
$ @'T1'GTMLOGIN
|
||||||
|
$ ON CONTROL_Y THEN EXIT VMI$_FAILURE
|
||||||
|
$ SET DEFAULT GTM$DIST
|
||||||
|
$ T2 = F$ENVIRONMENT("PROTECTION")
|
||||||
|
$ SET PROTECTION=(S=REWD,O=REWD,G=REWD,W=RE)/DEFAULT
|
||||||
|
$ MUMPS GTM$DMOD.M
|
||||||
|
$ IF GTM$LNK_LOG
|
||||||
|
$ THEN
|
||||||
|
$ T1 :=
|
||||||
|
$ ELSE
|
||||||
|
$ T1 :=,GTMLIB.OLB/LIB,GTMSHR.OLB/LIB
|
||||||
|
$ ENDIF
|
||||||
|
$ LINK GTM$DMOD.OBJ/NOTRACE'T1
|
||||||
|
$ IF GTM$PCT_RTN
|
||||||
|
$ THEN
|
||||||
|
$ TYPE SYS$INPUT
|
||||||
|
|
||||||
|
Compiling the GT.M percent (%) routines.
|
||||||
|
$ MUMPS *
|
||||||
|
$ IF GTM$DOPURGE THEN PURGE *.*
|
||||||
|
$ SET DEFAULT VMI$KWD
|
||||||
|
$ ENDIF ! percent routines
|
||||||
|
$ SET PROTECTION=('T2')/DEFAULT
|
||||||
|
$ EXIT VMI$_SUCCESS
|
||||||
|
$!
|
||||||
|
$IVP:
|
||||||
|
$! The real Installation Verification Procedure.
|
||||||
|
$ TYPE SYS$INPUT
|
||||||
|
|
||||||
|
GT.M Installation Verification Procedure
|
||||||
|
|
||||||
|
$! Extract the IVP .COM file from the text library.
|
||||||
|
$ LIBRARIAN /EXTRACT=GTM$IVP /OUTPUT=GTM$IVP.COM GTM$IVP.TLB
|
||||||
|
$ @GTM$IVP
|
||||||
|
$ EXIT $STATUS
|
||||||
|
$!
|
||||||
867
samples/DIGITAL Command Language/ghostpdl_zlib_make_vms.com
Normal file
867
samples/DIGITAL Command Language/ghostpdl_zlib_make_vms.com
Normal file
@@ -0,0 +1,867 @@
|
|||||||
|
$! make libz under VMS written by
|
||||||
|
$! Martin P.J. Zinser
|
||||||
|
$!
|
||||||
|
$! In case of problems with the install you might contact me at
|
||||||
|
$! zinser@zinser.no-ip.info(preferred) or
|
||||||
|
$! martin.zinser@eurexchange.com (work)
|
||||||
|
$!
|
||||||
|
$! Make procedure history for Zlib
|
||||||
|
$!
|
||||||
|
$!------------------------------------------------------------------------------
|
||||||
|
$! Version history
|
||||||
|
$! 0.01 20060120 First version to receive a number
|
||||||
|
$! 0.02 20061008 Adapt to new Makefile.in
|
||||||
|
$! 0.03 20091224 Add support for large file check
|
||||||
|
$! 0.04 20100110 Add new gzclose, gzlib, gzread, gzwrite
|
||||||
|
$! 0.05 20100221 Exchange zlibdefs.h by zconf.h.in
|
||||||
|
$! 0.06 20120111 Fix missing amiss_err, update zconf_h.in, fix new exmples
|
||||||
|
$! subdir path, update module search in makefile.in
|
||||||
|
$! 0.07 20120115 Triggered by work done by Alexey Chupahin completly redesigned
|
||||||
|
$! shared image creation
|
||||||
|
$! 0.08 20120219 Make it work on VAX again, pre-load missing symbols to shared
|
||||||
|
$! image
|
||||||
|
$! 0.09 20120305 SMS. P1 sets builder ("MMK", "MMS", " " (built-in)).
|
||||||
|
$! "" -> automatic, preference: MMK, MMS, built-in.
|
||||||
|
$!
|
||||||
|
$ on error then goto err_exit
|
||||||
|
$!
|
||||||
|
$ true = 1
|
||||||
|
$ false = 0
|
||||||
|
$ tmpnam = "temp_" + f$getjpi("","pid")
|
||||||
|
$ tt = tmpnam + ".txt"
|
||||||
|
$ tc = tmpnam + ".c"
|
||||||
|
$ th = tmpnam + ".h"
|
||||||
|
$ define/nolog tconfig 'th'
|
||||||
|
$ its_decc = false
|
||||||
|
$ its_vaxc = false
|
||||||
|
$ its_gnuc = false
|
||||||
|
$ s_case = False
|
||||||
|
$!
|
||||||
|
$! Setup variables holding "config" information
|
||||||
|
$!
|
||||||
|
$ Make = "''p1'"
|
||||||
|
$ name = "Zlib"
|
||||||
|
$ version = "?.?.?"
|
||||||
|
$ v_string = "ZLIB_VERSION"
|
||||||
|
$ v_file = "zlib.h"
|
||||||
|
$ ccopt = "/include = []"
|
||||||
|
$ lopts = ""
|
||||||
|
$ dnsrl = ""
|
||||||
|
$ aconf_in_file = "zconf.h.in#zconf.h_in#zconf_h.in"
|
||||||
|
$ conf_check_string = ""
|
||||||
|
$ linkonly = false
|
||||||
|
$ optfile = name + ".opt"
|
||||||
|
$ mapfile = name + ".map"
|
||||||
|
$ libdefs = ""
|
||||||
|
$ vax = f$getsyi("HW_MODEL").lt.1024
|
||||||
|
$ axp = f$getsyi("HW_MODEL").ge.1024 .and. f$getsyi("HW_MODEL").lt.4096
|
||||||
|
$ ia64 = f$getsyi("HW_MODEL").ge.4096
|
||||||
|
$!
|
||||||
|
$! 2012-03-05 SMS.
|
||||||
|
$! Why is this needed? And if it is needed, why not simply ".not. vax"?
|
||||||
|
$!
|
||||||
|
$!!! if axp .or. ia64 then set proc/parse=extended
|
||||||
|
$!
|
||||||
|
$ whoami = f$parse(f$environment("Procedure"),,,,"NO_CONCEAL")
|
||||||
|
$ mydef = F$parse(whoami,,,"DEVICE")
|
||||||
|
$ mydir = f$parse(whoami,,,"DIRECTORY") - "]["
|
||||||
|
$ myproc = f$parse(whoami,,,"Name") + f$parse(whoami,,,"type")
|
||||||
|
$!
|
||||||
|
$! Check for MMK/MMS
|
||||||
|
$!
|
||||||
|
$ if (Make .eqs. "")
|
||||||
|
$ then
|
||||||
|
$ If F$Search ("Sys$System:MMS.EXE") .nes. "" Then Make = "MMS"
|
||||||
|
$ If F$Type (MMK) .eqs. "STRING" Then Make = "MMK"
|
||||||
|
$ else
|
||||||
|
$ Make = f$edit( Make, "trim")
|
||||||
|
$ endif
|
||||||
|
$!
|
||||||
|
$ gosub find_version
|
||||||
|
$!
|
||||||
|
$ open/write topt tmp.opt
|
||||||
|
$ open/write optf 'optfile'
|
||||||
|
$!
|
||||||
|
$ gosub check_opts
|
||||||
|
$!
|
||||||
|
$! Look for the compiler used
|
||||||
|
$!
|
||||||
|
$ gosub check_compiler
|
||||||
|
$ close topt
|
||||||
|
$ close optf
|
||||||
|
$!
|
||||||
|
$ if its_decc
|
||||||
|
$ then
|
||||||
|
$ ccopt = "/prefix=all" + ccopt
|
||||||
|
$ if f$trnlnm("SYS") .eqs. ""
|
||||||
|
$ then
|
||||||
|
$ if axp
|
||||||
|
$ then
|
||||||
|
$ define sys sys$library:
|
||||||
|
$ else
|
||||||
|
$ ccopt = "/decc" + ccopt
|
||||||
|
$ define sys decc$library_include:
|
||||||
|
$ endif
|
||||||
|
$ endif
|
||||||
|
$!
|
||||||
|
$! 2012-03-05 SMS.
|
||||||
|
$! Why /NAMES = AS_IS? Why not simply ".not. vax"? And why not on VAX?
|
||||||
|
$!
|
||||||
|
$ if axp .or. ia64
|
||||||
|
$ then
|
||||||
|
$ ccopt = ccopt + "/name=as_is/opt=(inline=speed)"
|
||||||
|
$ s_case = true
|
||||||
|
$ endif
|
||||||
|
$ endif
|
||||||
|
$ if its_vaxc .or. its_gnuc
|
||||||
|
$ then
|
||||||
|
$ if f$trnlnm("SYS").eqs."" then define sys sys$library:
|
||||||
|
$ endif
|
||||||
|
$!
|
||||||
|
$! Build a fake configure input header
|
||||||
|
$!
|
||||||
|
$ open/write conf_hin config.hin
|
||||||
|
$ write conf_hin "#undef _LARGEFILE64_SOURCE"
|
||||||
|
$ close conf_hin
|
||||||
|
$!
|
||||||
|
$!
|
||||||
|
$ i = 0
|
||||||
|
$FIND_ACONF:
|
||||||
|
$ fname = f$element(i,"#",aconf_in_file)
|
||||||
|
$ if fname .eqs. "#" then goto AMISS_ERR
|
||||||
|
$ if f$search(fname) .eqs. ""
|
||||||
|
$ then
|
||||||
|
$ i = i + 1
|
||||||
|
$ goto find_aconf
|
||||||
|
$ endif
|
||||||
|
$ open/read/err=aconf_err aconf_in 'fname'
|
||||||
|
$ open/write aconf zconf.h
|
||||||
|
$ACONF_LOOP:
|
||||||
|
$ read/end_of_file=aconf_exit aconf_in line
|
||||||
|
$ work = f$edit(line, "compress,trim")
|
||||||
|
$ if f$extract(0,6,work) .nes. "#undef"
|
||||||
|
$ then
|
||||||
|
$ if f$extract(0,12,work) .nes. "#cmakedefine"
|
||||||
|
$ then
|
||||||
|
$ write aconf line
|
||||||
|
$ endif
|
||||||
|
$ else
|
||||||
|
$ cdef = f$element(1," ",work)
|
||||||
|
$ gosub check_config
|
||||||
|
$ endif
|
||||||
|
$ goto aconf_loop
|
||||||
|
$ACONF_EXIT:
|
||||||
|
$ write aconf ""
|
||||||
|
$ write aconf "/* VMS specifics added by make_vms.com: */"
|
||||||
|
$ write aconf "#define VMS 1"
|
||||||
|
$ write aconf "#include <unistd.h>"
|
||||||
|
$ write aconf "#include <unixio.h>"
|
||||||
|
$ write aconf "#ifdef _LARGEFILE"
|
||||||
|
$ write aconf "# define off64_t __off64_t"
|
||||||
|
$ write aconf "# define fopen64 fopen"
|
||||||
|
$ write aconf "# define fseeko64 fseeko"
|
||||||
|
$ write aconf "# define lseek64 lseek"
|
||||||
|
$ write aconf "# define ftello64 ftell"
|
||||||
|
$ write aconf "#endif"
|
||||||
|
$ write aconf "#if !defined( __VAX) && (__CRTL_VER >= 70312000)"
|
||||||
|
$ write aconf "# define HAVE_VSNPRINTF"
|
||||||
|
$ write aconf "#endif"
|
||||||
|
$ close aconf_in
|
||||||
|
$ close aconf
|
||||||
|
$ if f$search("''th'") .nes. "" then delete 'th';*
|
||||||
|
$! Build the thing plain or with mms
|
||||||
|
$!
|
||||||
|
$ write sys$output "Compiling Zlib sources ..."
|
||||||
|
$ if make.eqs.""
|
||||||
|
$ then
|
||||||
|
$ if (f$search( "example.obj;*") .nes. "") then delete example.obj;*
|
||||||
|
$ if (f$search( "minigzip.obj;*") .nes. "") then delete minigzip.obj;*
|
||||||
|
$ CALL MAKE adler32.OBJ "CC ''CCOPT' adler32" -
|
||||||
|
adler32.c zlib.h zconf.h
|
||||||
|
$ CALL MAKE compress.OBJ "CC ''CCOPT' compress" -
|
||||||
|
compress.c zlib.h zconf.h
|
||||||
|
$ CALL MAKE crc32.OBJ "CC ''CCOPT' crc32" -
|
||||||
|
crc32.c zlib.h zconf.h
|
||||||
|
$ CALL MAKE deflate.OBJ "CC ''CCOPT' deflate" -
|
||||||
|
deflate.c deflate.h zutil.h zlib.h zconf.h
|
||||||
|
$ CALL MAKE gzclose.OBJ "CC ''CCOPT' gzclose" -
|
||||||
|
gzclose.c zutil.h zlib.h zconf.h
|
||||||
|
$ CALL MAKE gzlib.OBJ "CC ''CCOPT' gzlib" -
|
||||||
|
gzlib.c zutil.h zlib.h zconf.h
|
||||||
|
$ CALL MAKE gzread.OBJ "CC ''CCOPT' gzread" -
|
||||||
|
gzread.c zutil.h zlib.h zconf.h
|
||||||
|
$ CALL MAKE gzwrite.OBJ "CC ''CCOPT' gzwrite" -
|
||||||
|
gzwrite.c zutil.h zlib.h zconf.h
|
||||||
|
$ CALL MAKE infback.OBJ "CC ''CCOPT' infback" -
|
||||||
|
infback.c zutil.h inftrees.h inflate.h inffast.h inffixed.h
|
||||||
|
$ CALL MAKE inffast.OBJ "CC ''CCOPT' inffast" -
|
||||||
|
inffast.c zutil.h zlib.h zconf.h inffast.h
|
||||||
|
$ CALL MAKE inflate.OBJ "CC ''CCOPT' inflate" -
|
||||||
|
inflate.c zutil.h zlib.h zconf.h infblock.h
|
||||||
|
$ CALL MAKE inftrees.OBJ "CC ''CCOPT' inftrees" -
|
||||||
|
inftrees.c zutil.h zlib.h zconf.h inftrees.h
|
||||||
|
$ CALL MAKE trees.OBJ "CC ''CCOPT' trees" -
|
||||||
|
trees.c deflate.h zutil.h zlib.h zconf.h
|
||||||
|
$ CALL MAKE uncompr.OBJ "CC ''CCOPT' uncompr" -
|
||||||
|
uncompr.c zlib.h zconf.h
|
||||||
|
$ CALL MAKE zutil.OBJ "CC ''CCOPT' zutil" -
|
||||||
|
zutil.c zutil.h zlib.h zconf.h
|
||||||
|
$ write sys$output "Building Zlib ..."
|
||||||
|
$ CALL MAKE libz.OLB "lib/crea libz.olb *.obj" *.OBJ
|
||||||
|
$ write sys$output "Building example..."
|
||||||
|
$ CALL MAKE example.OBJ "CC ''CCOPT' [.test]example" -
|
||||||
|
[.test]example.c zlib.h zconf.h
|
||||||
|
$ call make example.exe "LINK example,libz.olb/lib" example.obj libz.olb
|
||||||
|
$ write sys$output "Building minigzip..."
|
||||||
|
$ CALL MAKE minigzip.OBJ "CC ''CCOPT' [.test]minigzip" -
|
||||||
|
[.test]minigzip.c zlib.h zconf.h
|
||||||
|
$ call make minigzip.exe -
|
||||||
|
"LINK minigzip,libz.olb/lib" -
|
||||||
|
minigzip.obj libz.olb
|
||||||
|
$ else
|
||||||
|
$ gosub crea_mms
|
||||||
|
$ write sys$output "Make ''name' ''version' with ''Make' "
|
||||||
|
$ 'make'
|
||||||
|
$ endif
|
||||||
|
$!
|
||||||
|
$! Create shareable image
|
||||||
|
$!
|
||||||
|
$ gosub crea_olist
|
||||||
|
$ write sys$output "Creating libzshr.exe"
|
||||||
|
$ call map_2_shopt 'mapfile' 'optfile'
|
||||||
|
$ LINK_'lopts'/SHARE=libzshr.exe modules.opt/opt,'optfile'/opt
|
||||||
|
$ write sys$output "Zlib build completed"
|
||||||
|
$ delete/nolog tmp.opt;*
|
||||||
|
$ exit
|
||||||
|
$AMISS_ERR:
|
||||||
|
$ write sys$output "No source for config.hin found."
|
||||||
|
$ write sys$output "Tried any of ''aconf_in_file'"
|
||||||
|
$ goto err_exit
|
||||||
|
$CC_ERR:
|
||||||
|
$ write sys$output "C compiler required to build ''name'"
|
||||||
|
$ goto err_exit
|
||||||
|
$ERR_EXIT:
|
||||||
|
$ set message/facil/ident/sever/text
|
||||||
|
$ close/nolog optf
|
||||||
|
$ close/nolog topt
|
||||||
|
$ close/nolog aconf_in
|
||||||
|
$ close/nolog aconf
|
||||||
|
$ close/nolog out
|
||||||
|
$ close/nolog min
|
||||||
|
$ close/nolog mod
|
||||||
|
$ close/nolog h_in
|
||||||
|
$ write sys$output "Exiting..."
|
||||||
|
$ exit 2
|
||||||
|
$!
|
||||||
|
$!
|
||||||
|
$MAKE: SUBROUTINE !SUBROUTINE TO CHECK DEPENDENCIES
|
||||||
|
$ V = 'F$Verify(0)
|
||||||
|
$! P1 = What we are trying to make
|
||||||
|
$! P2 = Command to make it
|
||||||
|
$! P3 - P8 What it depends on
|
||||||
|
$
|
||||||
|
$ If F$Search(P1) .Eqs. "" Then Goto Makeit
|
||||||
|
$ Time = F$CvTime(F$File(P1,"RDT"))
|
||||||
|
$arg=3
|
||||||
|
$Loop:
|
||||||
|
$ Argument = P'arg
|
||||||
|
$ If Argument .Eqs. "" Then Goto Exit
|
||||||
|
$ El=0
|
||||||
|
$Loop2:
|
||||||
|
$ File = F$Element(El," ",Argument)
|
||||||
|
$ If File .Eqs. " " Then Goto Endl
|
||||||
|
$ AFile = ""
|
||||||
|
$Loop3:
|
||||||
|
$ OFile = AFile
|
||||||
|
$ AFile = F$Search(File)
|
||||||
|
$ If AFile .Eqs. "" .Or. AFile .Eqs. OFile Then Goto NextEl
|
||||||
|
$ If F$CvTime(F$File(AFile,"RDT")) .Ges. Time Then Goto Makeit
|
||||||
|
$ Goto Loop3
|
||||||
|
$NextEL:
|
||||||
|
$ El = El + 1
|
||||||
|
$ Goto Loop2
|
||||||
|
$EndL:
|
||||||
|
$ arg=arg+1
|
||||||
|
$ If arg .Le. 8 Then Goto Loop
|
||||||
|
$ Goto Exit
|
||||||
|
$
|
||||||
|
$Makeit:
|
||||||
|
$ VV=F$VERIFY(0)
|
||||||
|
$ write sys$output P2
|
||||||
|
$ 'P2
|
||||||
|
$ VV='F$Verify(VV)
|
||||||
|
$Exit:
|
||||||
|
$ If V Then Set Verify
|
||||||
|
$ENDSUBROUTINE
|
||||||
|
$!------------------------------------------------------------------------------
|
||||||
|
$!
|
||||||
|
$! Check command line options and set symbols accordingly
|
||||||
|
$!
|
||||||
|
$!------------------------------------------------------------------------------
|
||||||
|
$! Version history
|
||||||
|
$! 0.01 20041206 First version to receive a number
|
||||||
|
$! 0.02 20060126 Add new "HELP" target
|
||||||
|
$ CHECK_OPTS:
|
||||||
|
$ i = 1
|
||||||
|
$ OPT_LOOP:
|
||||||
|
$ if i .lt. 9
|
||||||
|
$ then
|
||||||
|
$ cparm = f$edit(p'i',"upcase")
|
||||||
|
$!
|
||||||
|
$! Check if parameter actually contains something
|
||||||
|
$!
|
||||||
|
$ if f$edit(cparm,"trim") .nes. ""
|
||||||
|
$ then
|
||||||
|
$ if cparm .eqs. "DEBUG"
|
||||||
|
$ then
|
||||||
|
$ ccopt = ccopt + "/noopt/deb"
|
||||||
|
$ lopts = lopts + "/deb"
|
||||||
|
$ endif
|
||||||
|
$ if f$locate("CCOPT=",cparm) .lt. f$length(cparm)
|
||||||
|
$ then
|
||||||
|
$ start = f$locate("=",cparm) + 1
|
||||||
|
$ len = f$length(cparm) - start
|
||||||
|
$ ccopt = ccopt + f$extract(start,len,cparm)
|
||||||
|
$ if f$locate("AS_IS",f$edit(ccopt,"UPCASE")) .lt. f$length(ccopt) -
|
||||||
|
then s_case = true
|
||||||
|
$ endif
|
||||||
|
$ if cparm .eqs. "LINK" then linkonly = true
|
||||||
|
$ if f$locate("LOPTS=",cparm) .lt. f$length(cparm)
|
||||||
|
$ then
|
||||||
|
$ start = f$locate("=",cparm) + 1
|
||||||
|
$ len = f$length(cparm) - start
|
||||||
|
$ lopts = lopts + f$extract(start,len,cparm)
|
||||||
|
$ endif
|
||||||
|
$ if f$locate("CC=",cparm) .lt. f$length(cparm)
|
||||||
|
$ then
|
||||||
|
$ start = f$locate("=",cparm) + 1
|
||||||
|
$ len = f$length(cparm) - start
|
||||||
|
$ cc_com = f$extract(start,len,cparm)
|
||||||
|
if (cc_com .nes. "DECC") .and. -
|
||||||
|
(cc_com .nes. "VAXC") .and. -
|
||||||
|
(cc_com .nes. "GNUC")
|
||||||
|
$ then
|
||||||
|
$ write sys$output "Unsupported compiler choice ''cc_com' ignored"
|
||||||
|
$ write sys$output "Use DECC, VAXC, or GNUC instead"
|
||||||
|
$ else
|
||||||
|
$ if cc_com .eqs. "DECC" then its_decc = true
|
||||||
|
$ if cc_com .eqs. "VAXC" then its_vaxc = true
|
||||||
|
$ if cc_com .eqs. "GNUC" then its_gnuc = true
|
||||||
|
$ endif
|
||||||
|
$ endif
|
||||||
|
$ if f$locate("MAKE=",cparm) .lt. f$length(cparm)
|
||||||
|
$ then
|
||||||
|
$ start = f$locate("=",cparm) + 1
|
||||||
|
$ len = f$length(cparm) - start
|
||||||
|
$ mmks = f$extract(start,len,cparm)
|
||||||
|
$ if (mmks .eqs. "MMK") .or. (mmks .eqs. "MMS")
|
||||||
|
$ then
|
||||||
|
$ make = mmks
|
||||||
|
$ else
|
||||||
|
$ write sys$output "Unsupported make choice ''mmks' ignored"
|
||||||
|
$ write sys$output "Use MMK or MMS instead"
|
||||||
|
$ endif
|
||||||
|
$ endif
|
||||||
|
$ if cparm .eqs. "HELP" then gosub bhelp
|
||||||
|
$ endif
|
||||||
|
$ i = i + 1
|
||||||
|
$ goto opt_loop
|
||||||
|
$ endif
|
||||||
|
$ return
|
||||||
|
$!------------------------------------------------------------------------------
|
||||||
|
$!
|
||||||
|
$! Look for the compiler used
|
||||||
|
$!
|
||||||
|
$! Version history
|
||||||
|
$! 0.01 20040223 First version to receive a number
|
||||||
|
$! 0.02 20040229 Save/set value of decc$no_rooted_search_lists
|
||||||
|
$! 0.03 20060202 Extend handling of GNU C
|
||||||
|
$! 0.04 20090402 Compaq -> hp
|
||||||
|
$CHECK_COMPILER:
|
||||||
|
$ if (.not. (its_decc .or. its_vaxc .or. its_gnuc))
|
||||||
|
$ then
|
||||||
|
$ its_decc = (f$search("SYS$SYSTEM:DECC$COMPILER.EXE") .nes. "")
|
||||||
|
$ its_vaxc = .not. its_decc .and. (F$Search("SYS$System:VAXC.Exe") .nes. "")
|
||||||
|
$ its_gnuc = .not. (its_decc .or. its_vaxc) .and. (f$trnlnm("gnu_cc") .nes. "")
|
||||||
|
$ endif
|
||||||
|
$!
|
||||||
|
$! Exit if no compiler available
|
||||||
|
$!
|
||||||
|
$ if (.not. (its_decc .or. its_vaxc .or. its_gnuc))
|
||||||
|
$ then goto CC_ERR
|
||||||
|
$ else
|
||||||
|
$ if its_decc
|
||||||
|
$ then
|
||||||
|
$ write sys$output "CC compiler check ... hp C"
|
||||||
|
$ if f$trnlnm("decc$no_rooted_search_lists") .nes. ""
|
||||||
|
$ then
|
||||||
|
$ dnrsl = f$trnlnm("decc$no_rooted_search_lists")
|
||||||
|
$ endif
|
||||||
|
$ define/nolog decc$no_rooted_search_lists 1
|
||||||
|
$ else
|
||||||
|
$ if its_vaxc then write sys$output "CC compiler check ... VAX C"
|
||||||
|
$ if its_gnuc
|
||||||
|
$ then
|
||||||
|
$ write sys$output "CC compiler check ... GNU C"
|
||||||
|
$ if f$trnlnm(topt) then write topt "gnu_cc:[000000]gcclib.olb/lib"
|
||||||
|
$ if f$trnlnm(optf) then write optf "gnu_cc:[000000]gcclib.olb/lib"
|
||||||
|
$ cc = "gcc"
|
||||||
|
$ endif
|
||||||
|
$ if f$trnlnm(topt) then write topt "sys$share:vaxcrtl.exe/share"
|
||||||
|
$ if f$trnlnm(optf) then write optf "sys$share:vaxcrtl.exe/share"
|
||||||
|
$ endif
|
||||||
|
$ endif
|
||||||
|
$ return
|
||||||
|
$!------------------------------------------------------------------------------
|
||||||
|
$!
|
||||||
|
$! If MMS/MMK are available dump out the descrip.mms if required
|
||||||
|
$!
|
||||||
|
$CREA_MMS:
|
||||||
|
$ write sys$output "Creating descrip.mms..."
|
||||||
|
$ create descrip.mms
|
||||||
|
$ open/append out descrip.mms
|
||||||
|
$ copy sys$input: out
|
||||||
|
$ deck
|
||||||
|
# descrip.mms: MMS description file for building zlib on VMS
|
||||||
|
# written by Martin P.J. Zinser
|
||||||
|
# <zinser@zinser.no-ip.info or martin.zinser@eurexchange.com>
|
||||||
|
|
||||||
|
OBJS = adler32.obj, compress.obj, crc32.obj, gzclose.obj, gzlib.obj\
|
||||||
|
gzread.obj, gzwrite.obj, uncompr.obj, infback.obj\
|
||||||
|
deflate.obj, trees.obj, zutil.obj, inflate.obj, \
|
||||||
|
inftrees.obj, inffast.obj
|
||||||
|
|
||||||
|
$ eod
|
||||||
|
$ write out "CFLAGS=", ccopt
|
||||||
|
$ write out "LOPTS=", lopts
|
||||||
|
$ write out "all : example.exe minigzip.exe libz.olb"
|
||||||
|
$ copy sys$input: out
|
||||||
|
$ deck
|
||||||
|
@ write sys$output " Example applications available"
|
||||||
|
|
||||||
|
libz.olb : libz.olb($(OBJS))
|
||||||
|
@ write sys$output " libz available"
|
||||||
|
|
||||||
|
example.exe : example.obj libz.olb
|
||||||
|
link $(LOPTS) example,libz.olb/lib
|
||||||
|
|
||||||
|
minigzip.exe : minigzip.obj libz.olb
|
||||||
|
link $(LOPTS) minigzip,libz.olb/lib
|
||||||
|
|
||||||
|
clean :
|
||||||
|
delete *.obj;*,libz.olb;*,*.opt;*,*.exe;*
|
||||||
|
|
||||||
|
|
||||||
|
# Other dependencies.
|
||||||
|
adler32.obj : adler32.c zutil.h zlib.h zconf.h
|
||||||
|
compress.obj : compress.c zlib.h zconf.h
|
||||||
|
crc32.obj : crc32.c zutil.h zlib.h zconf.h
|
||||||
|
deflate.obj : deflate.c deflate.h zutil.h zlib.h zconf.h
|
||||||
|
example.obj : [.test]example.c zlib.h zconf.h
|
||||||
|
gzclose.obj : gzclose.c zutil.h zlib.h zconf.h
|
||||||
|
gzlib.obj : gzlib.c zutil.h zlib.h zconf.h
|
||||||
|
gzread.obj : gzread.c zutil.h zlib.h zconf.h
|
||||||
|
gzwrite.obj : gzwrite.c zutil.h zlib.h zconf.h
|
||||||
|
inffast.obj : inffast.c zutil.h zlib.h zconf.h inftrees.h inffast.h
|
||||||
|
inflate.obj : inflate.c zutil.h zlib.h zconf.h
|
||||||
|
inftrees.obj : inftrees.c zutil.h zlib.h zconf.h inftrees.h
|
||||||
|
minigzip.obj : [.test]minigzip.c zlib.h zconf.h
|
||||||
|
trees.obj : trees.c deflate.h zutil.h zlib.h zconf.h
|
||||||
|
uncompr.obj : uncompr.c zlib.h zconf.h
|
||||||
|
zutil.obj : zutil.c zutil.h zlib.h zconf.h
|
||||||
|
infback.obj : infback.c zutil.h inftrees.h inflate.h inffast.h inffixed.h
|
||||||
|
$ eod
|
||||||
|
$ close out
|
||||||
|
$ return
|
||||||
|
$!------------------------------------------------------------------------------
|
||||||
|
$!
|
||||||
|
$! Read list of core library sources from makefile.in and create options
|
||||||
|
$! needed to build shareable image
|
||||||
|
$!
|
||||||
|
$CREA_OLIST:
|
||||||
|
$ open/read min makefile.in
|
||||||
|
$ open/write mod modules.opt
|
||||||
|
$ src_check_list = "OBJZ =#OBJG ="
|
||||||
|
$MRLOOP:
|
||||||
|
$ read/end=mrdone min rec
|
||||||
|
$ i = 0
|
||||||
|
$SRC_CHECK_LOOP:
|
||||||
|
$ src_check = f$element(i, "#", src_check_list)
|
||||||
|
$ i = i+1
|
||||||
|
$ if src_check .eqs. "#" then goto mrloop
|
||||||
|
$ if (f$extract(0,6,rec) .nes. src_check) then goto src_check_loop
|
||||||
|
$ rec = rec - src_check
|
||||||
|
$ gosub extra_filnam
|
||||||
|
$ if (f$element(1,"\",rec) .eqs. "\") then goto mrloop
|
||||||
|
$MRSLOOP:
|
||||||
|
$ read/end=mrdone min rec
|
||||||
|
$ gosub extra_filnam
|
||||||
|
$ if (f$element(1,"\",rec) .nes. "\") then goto mrsloop
|
||||||
|
$MRDONE:
|
||||||
|
$ close min
|
||||||
|
$ close mod
|
||||||
|
$ return
|
||||||
|
$!------------------------------------------------------------------------------
|
||||||
|
$!
|
||||||
|
$! Take record extracted in crea_olist and split it into single filenames
|
||||||
|
$!
|
||||||
|
$EXTRA_FILNAM:
|
||||||
|
$ myrec = f$edit(rec - "\", "trim,compress")
|
||||||
|
$ i = 0
|
||||||
|
$FELOOP:
|
||||||
|
$ srcfil = f$element(i," ", myrec)
|
||||||
|
$ if (srcfil .nes. " ")
|
||||||
|
$ then
|
||||||
|
$ write mod f$parse(srcfil,,,"NAME"), ".obj"
|
||||||
|
$ i = i + 1
|
||||||
|
$ goto feloop
|
||||||
|
$ endif
|
||||||
|
$ return
|
||||||
|
$!------------------------------------------------------------------------------
|
||||||
|
$!
|
||||||
|
$! Find current Zlib version number
|
||||||
|
$!
|
||||||
|
$FIND_VERSION:
|
||||||
|
$ open/read h_in 'v_file'
|
||||||
|
$hloop:
|
||||||
|
$ read/end=hdone h_in rec
|
||||||
|
$ rec = f$edit(rec,"TRIM")
|
||||||
|
$ if (f$extract(0,1,rec) .nes. "#") then goto hloop
|
||||||
|
$ rec = f$edit(rec - "#", "TRIM")
|
||||||
|
$ if f$element(0," ",rec) .nes. "define" then goto hloop
|
||||||
|
$ if f$element(1," ",rec) .eqs. v_string
|
||||||
|
$ then
|
||||||
|
$ version = 'f$element(2," ",rec)'
|
||||||
|
$ goto hdone
|
||||||
|
$ endif
|
||||||
|
$ goto hloop
|
||||||
|
$hdone:
|
||||||
|
$ close h_in
|
||||||
|
$ return
|
||||||
|
$!------------------------------------------------------------------------------
|
||||||
|
$!
|
||||||
|
$CHECK_CONFIG:
|
||||||
|
$!
|
||||||
|
$ in_ldef = f$locate(cdef,libdefs)
|
||||||
|
$ if (in_ldef .lt. f$length(libdefs))
|
||||||
|
$ then
|
||||||
|
$ write aconf "#define ''cdef' 1"
|
||||||
|
$ libdefs = f$extract(0,in_ldef,libdefs) + -
|
||||||
|
f$extract(in_ldef + f$length(cdef) + 1, -
|
||||||
|
f$length(libdefs) - in_ldef - f$length(cdef) - 1, -
|
||||||
|
libdefs)
|
||||||
|
$ else
|
||||||
|
$ if (f$type('cdef') .eqs. "INTEGER")
|
||||||
|
$ then
|
||||||
|
$ write aconf "#define ''cdef' ", 'cdef'
|
||||||
|
$ else
|
||||||
|
$ if (f$type('cdef') .eqs. "STRING")
|
||||||
|
$ then
|
||||||
|
$ write aconf "#define ''cdef' ", """", '''cdef'', """"
|
||||||
|
$ else
|
||||||
|
$ gosub check_cc_def
|
||||||
|
$ endif
|
||||||
|
$ endif
|
||||||
|
$ endif
|
||||||
|
$ return
|
||||||
|
$!------------------------------------------------------------------------------
|
||||||
|
$!
|
||||||
|
$! Check if this is a define relating to the properties of the C/C++
|
||||||
|
$! compiler
|
||||||
|
$!
|
||||||
|
$ CHECK_CC_DEF:
|
||||||
|
$ if (cdef .eqs. "_LARGEFILE64_SOURCE")
|
||||||
|
$ then
|
||||||
|
$ copy sys$input: 'tc'
|
||||||
|
$ deck
|
||||||
|
#include "tconfig"
|
||||||
|
#define _LARGEFILE
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
int main(){
|
||||||
|
FILE *fp;
|
||||||
|
fp = fopen("temp.txt","r");
|
||||||
|
fseeko(fp,1,SEEK_SET);
|
||||||
|
fclose(fp);
|
||||||
|
}
|
||||||
|
|
||||||
|
$ eod
|
||||||
|
$ test_inv = false
|
||||||
|
$ comm_h = false
|
||||||
|
$ gosub cc_prop_check
|
||||||
|
$ return
|
||||||
|
$ endif
|
||||||
|
$ write aconf "/* ", line, " */"
|
||||||
|
$ return
|
||||||
|
$!------------------------------------------------------------------------------
|
||||||
|
$!
|
||||||
|
$! Check for properties of C/C++ compiler
|
||||||
|
$!
|
||||||
|
$! Version history
|
||||||
|
$! 0.01 20031020 First version to receive a number
|
||||||
|
$! 0.02 20031022 Added logic for defines with value
|
||||||
|
$! 0.03 20040309 Make sure local config file gets not deleted
|
||||||
|
$! 0.04 20041230 Also write include for configure run
|
||||||
|
$! 0.05 20050103 Add processing of "comment defines"
|
||||||
|
$CC_PROP_CHECK:
|
||||||
|
$ cc_prop = true
|
||||||
|
$ is_need = false
|
||||||
|
$ is_need = (f$extract(0,4,cdef) .eqs. "NEED") .or. (test_inv .eq. true)
|
||||||
|
$ if f$search(th) .eqs. "" then create 'th'
|
||||||
|
$ set message/nofac/noident/nosever/notext
|
||||||
|
$ on error then continue
|
||||||
|
$ cc 'tmpnam'
|
||||||
|
$ if .not. ($status) then cc_prop = false
|
||||||
|
$ on error then continue
|
||||||
|
$! The headers might lie about the capabilities of the RTL
|
||||||
|
$ link 'tmpnam',tmp.opt/opt
|
||||||
|
$ if .not. ($status) then cc_prop = false
|
||||||
|
$ set message/fac/ident/sever/text
|
||||||
|
$ on error then goto err_exit
|
||||||
|
$ delete/nolog 'tmpnam'.*;*/exclude='th'
|
||||||
|
$ if (cc_prop .and. .not. is_need) .or. -
|
||||||
|
(.not. cc_prop .and. is_need)
|
||||||
|
$ then
|
||||||
|
$ write sys$output "Checking for ''cdef'... yes"
|
||||||
|
$ if f$type('cdef_val'_yes) .nes. ""
|
||||||
|
$ then
|
||||||
|
$ if f$type('cdef_val'_yes) .eqs. "INTEGER" -
|
||||||
|
then call write_config f$fao("#define !AS !UL",cdef,'cdef_val'_yes)
|
||||||
|
$ if f$type('cdef_val'_yes) .eqs. "STRING" -
|
||||||
|
then call write_config f$fao("#define !AS !AS",cdef,'cdef_val'_yes)
|
||||||
|
$ else
|
||||||
|
$ call write_config f$fao("#define !AS 1",cdef)
|
||||||
|
$ endif
|
||||||
|
$ if (cdef .eqs. "HAVE_FSEEKO") .or. (cdef .eqs. "_LARGE_FILES") .or. -
|
||||||
|
(cdef .eqs. "_LARGEFILE64_SOURCE") then -
|
||||||
|
call write_config f$string("#define _LARGEFILE 1")
|
||||||
|
$ else
|
||||||
|
$ write sys$output "Checking for ''cdef'... no"
|
||||||
|
$ if (comm_h)
|
||||||
|
$ then
|
||||||
|
call write_config f$fao("/* !AS */",line)
|
||||||
|
$ else
|
||||||
|
$ if f$type('cdef_val'_no) .nes. ""
|
||||||
|
$ then
|
||||||
|
$ if f$type('cdef_val'_no) .eqs. "INTEGER" -
|
||||||
|
then call write_config f$fao("#define !AS !UL",cdef,'cdef_val'_no)
|
||||||
|
$ if f$type('cdef_val'_no) .eqs. "STRING" -
|
||||||
|
then call write_config f$fao("#define !AS !AS",cdef,'cdef_val'_no)
|
||||||
|
$ else
|
||||||
|
$ call write_config f$fao("#undef !AS",cdef)
|
||||||
|
$ endif
|
||||||
|
$ endif
|
||||||
|
$ endif
|
||||||
|
$ return
|
||||||
|
$!------------------------------------------------------------------------------
|
||||||
|
$!
|
||||||
|
$! Check for properties of C/C++ compiler with multiple result values
|
||||||
|
$!
|
||||||
|
$! Version history
|
||||||
|
$! 0.01 20040127 First version
|
||||||
|
$! 0.02 20050103 Reconcile changes from cc_prop up to version 0.05
|
||||||
|
$CC_MPROP_CHECK:
|
||||||
|
$ cc_prop = true
|
||||||
|
$ i = 1
|
||||||
|
$ idel = 1
|
||||||
|
$ MT_LOOP:
|
||||||
|
$ if f$type(result_'i') .eqs. "STRING"
|
||||||
|
$ then
|
||||||
|
$ set message/nofac/noident/nosever/notext
|
||||||
|
$ on error then continue
|
||||||
|
$ cc 'tmpnam'_'i'
|
||||||
|
$ if .not. ($status) then cc_prop = false
|
||||||
|
$ on error then continue
|
||||||
|
$! The headers might lie about the capabilities of the RTL
|
||||||
|
$ link 'tmpnam'_'i',tmp.opt/opt
|
||||||
|
$ if .not. ($status) then cc_prop = false
|
||||||
|
$ set message/fac/ident/sever/text
|
||||||
|
$ on error then goto err_exit
|
||||||
|
$ delete/nolog 'tmpnam'_'i'.*;*
|
||||||
|
$ if (cc_prop)
|
||||||
|
$ then
|
||||||
|
$ write sys$output "Checking for ''cdef'... ", mdef_'i'
|
||||||
|
$ if f$type(mdef_'i') .eqs. "INTEGER" -
|
||||||
|
then call write_config f$fao("#define !AS !UL",cdef,mdef_'i')
|
||||||
|
$ if f$type('cdef_val'_yes) .eqs. "STRING" -
|
||||||
|
then call write_config f$fao("#define !AS !AS",cdef,mdef_'i')
|
||||||
|
$ goto msym_clean
|
||||||
|
$ else
|
||||||
|
$ i = i + 1
|
||||||
|
$ goto mt_loop
|
||||||
|
$ endif
|
||||||
|
$ endif
|
||||||
|
$ write sys$output "Checking for ''cdef'... no"
|
||||||
|
$ call write_config f$fao("#undef !AS",cdef)
|
||||||
|
$ MSYM_CLEAN:
|
||||||
|
$ if (idel .le. msym_max)
|
||||||
|
$ then
|
||||||
|
$ delete/sym mdef_'idel'
|
||||||
|
$ idel = idel + 1
|
||||||
|
$ goto msym_clean
|
||||||
|
$ endif
|
||||||
|
$ return
|
||||||
|
$!------------------------------------------------------------------------------
|
||||||
|
$!
|
||||||
|
$! Write configuration to both permanent and temporary config file
|
||||||
|
$!
|
||||||
|
$! Version history
|
||||||
|
$! 0.01 20031029 First version to receive a number
|
||||||
|
$!
|
||||||
|
$WRITE_CONFIG: SUBROUTINE
|
||||||
|
$ write aconf 'p1'
|
||||||
|
$ open/append confh 'th'
|
||||||
|
$ write confh 'p1'
|
||||||
|
$ close confh
|
||||||
|
$ENDSUBROUTINE
|
||||||
|
$!------------------------------------------------------------------------------
|
||||||
|
$!
|
||||||
|
$! Analyze the project map file and create the symbol vector for a shareable
|
||||||
|
$! image from it
|
||||||
|
$!
|
||||||
|
$! Version history
|
||||||
|
$! 0.01 20120128 First version
|
||||||
|
$! 0.02 20120226 Add pre-load logic
|
||||||
|
$!
|
||||||
|
$ MAP_2_SHOPT: Subroutine
|
||||||
|
$!
|
||||||
|
$ SAY := "WRITE_ SYS$OUTPUT"
|
||||||
|
$!
|
||||||
|
$ IF F$SEARCH("''P1'") .EQS. ""
|
||||||
|
$ THEN
|
||||||
|
$ SAY "MAP_2_SHOPT-E-NOSUCHFILE: Error, inputfile ''p1' not available"
|
||||||
|
$ goto exit_m2s
|
||||||
|
$ ENDIF
|
||||||
|
$ IF "''P2'" .EQS. ""
|
||||||
|
$ THEN
|
||||||
|
$ SAY "MAP_2_SHOPT: Error, no output file provided"
|
||||||
|
$ goto exit_m2s
|
||||||
|
$ ENDIF
|
||||||
|
$!
|
||||||
|
$ module1 = "deflate#deflateEnd#deflateInit_#deflateParams#deflateSetDictionary"
|
||||||
|
$ module2 = "gzclose#gzerror#gzgetc#gzgets#gzopen#gzprintf#gzputc#gzputs#gzread"
|
||||||
|
$ module3 = "gzseek#gztell#inflate#inflateEnd#inflateInit_#inflateSetDictionary"
|
||||||
|
$ module4 = "inflateSync#uncompress#zlibVersion#compress"
|
||||||
|
$ open/read map 'p1
|
||||||
|
$ if axp .or. ia64
|
||||||
|
$ then
|
||||||
|
$ open/write aopt a.opt
|
||||||
|
$ open/write bopt b.opt
|
||||||
|
$ write aopt " CASE_SENSITIVE=YES"
|
||||||
|
$ write bopt "SYMBOL_VECTOR= (-"
|
||||||
|
$ mod_sym_num = 1
|
||||||
|
$ MOD_SYM_LOOP:
|
||||||
|
$ if f$type(module'mod_sym_num') .nes. ""
|
||||||
|
$ then
|
||||||
|
$ mod_in = 0
|
||||||
|
$ MOD_SYM_IN:
|
||||||
|
$ shared_proc = f$element(mod_in, "#", module'mod_sym_num')
|
||||||
|
$ if shared_proc .nes. "#"
|
||||||
|
$ then
|
||||||
|
$ write aopt f$fao(" symbol_vector=(!AS/!AS=PROCEDURE)",-
|
||||||
|
f$edit(shared_proc,"upcase"),shared_proc)
|
||||||
|
$ write bopt f$fao("!AS=PROCEDURE,-",shared_proc)
|
||||||
|
$ mod_in = mod_in + 1
|
||||||
|
$ goto mod_sym_in
|
||||||
|
$ endif
|
||||||
|
$ mod_sym_num = mod_sym_num + 1
|
||||||
|
$ goto mod_sym_loop
|
||||||
|
$ endif
|
||||||
|
$MAP_LOOP:
|
||||||
|
$ read/end=map_end map line
|
||||||
|
$ if (f$locate("{",line).lt. f$length(line)) .or. -
|
||||||
|
(f$locate("global:", line) .lt. f$length(line))
|
||||||
|
$ then
|
||||||
|
$ proc = true
|
||||||
|
$ goto map_loop
|
||||||
|
$ endif
|
||||||
|
$ if f$locate("}",line).lt. f$length(line) then proc = false
|
||||||
|
$ if f$locate("local:", line) .lt. f$length(line) then proc = false
|
||||||
|
$ if proc
|
||||||
|
$ then
|
||||||
|
$ shared_proc = f$edit(line,"collapse")
|
||||||
|
$ chop_semi = f$locate(";", shared_proc)
|
||||||
|
$ if chop_semi .lt. f$length(shared_proc) then -
|
||||||
|
shared_proc = f$extract(0, chop_semi, shared_proc)
|
||||||
|
$ write aopt f$fao(" symbol_vector=(!AS/!AS=PROCEDURE)",-
|
||||||
|
f$edit(shared_proc,"upcase"),shared_proc)
|
||||||
|
$ write bopt f$fao("!AS=PROCEDURE,-",shared_proc)
|
||||||
|
$ endif
|
||||||
|
$ goto map_loop
|
||||||
|
$MAP_END:
|
||||||
|
$ close/nolog aopt
|
||||||
|
$ close/nolog bopt
|
||||||
|
$ open/append libopt 'p2'
|
||||||
|
$ open/read aopt a.opt
|
||||||
|
$ open/read bopt b.opt
|
||||||
|
$ALOOP:
|
||||||
|
$ read/end=aloop_end aopt line
|
||||||
|
$ write libopt line
|
||||||
|
$ goto aloop
|
||||||
|
$ALOOP_END:
|
||||||
|
$ close/nolog aopt
|
||||||
|
$ sv = ""
|
||||||
|
$BLOOP:
|
||||||
|
$ read/end=bloop_end bopt svn
|
||||||
|
$ if (svn.nes."")
|
||||||
|
$ then
|
||||||
|
$ if (sv.nes."") then write libopt sv
|
||||||
|
$ sv = svn
|
||||||
|
$ endif
|
||||||
|
$ goto bloop
|
||||||
|
$BLOOP_END:
|
||||||
|
$ write libopt f$extract(0,f$length(sv)-2,sv), "-"
|
||||||
|
$ write libopt ")"
|
||||||
|
$ close/nolog bopt
|
||||||
|
$ delete/nolog/noconf a.opt;*,b.opt;*
|
||||||
|
$ else
|
||||||
|
$ if vax
|
||||||
|
$ then
|
||||||
|
$ open/append libopt 'p2'
|
||||||
|
$ mod_sym_num = 1
|
||||||
|
$ VMOD_SYM_LOOP:
|
||||||
|
$ if f$type(module'mod_sym_num') .nes. ""
|
||||||
|
$ then
|
||||||
|
$ mod_in = 0
|
||||||
|
$ VMOD_SYM_IN:
|
||||||
|
$ shared_proc = f$element(mod_in, "#", module'mod_sym_num')
|
||||||
|
$ if shared_proc .nes. "#"
|
||||||
|
$ then
|
||||||
|
$ write libopt f$fao("UNIVERSAL=!AS",-
|
||||||
|
f$edit(shared_proc,"upcase"))
|
||||||
|
$ mod_in = mod_in + 1
|
||||||
|
$ goto vmod_sym_in
|
||||||
|
$ endif
|
||||||
|
$ mod_sym_num = mod_sym_num + 1
|
||||||
|
$ goto vmod_sym_loop
|
||||||
|
$ endif
|
||||||
|
$VMAP_LOOP:
|
||||||
|
$ read/end=vmap_end map line
|
||||||
|
$ if (f$locate("{",line).lt. f$length(line)) .or. -
|
||||||
|
(f$locate("global:", line) .lt. f$length(line))
|
||||||
|
$ then
|
||||||
|
$ proc = true
|
||||||
|
$ goto vmap_loop
|
||||||
|
$ endif
|
||||||
|
$ if f$locate("}",line).lt. f$length(line) then proc = false
|
||||||
|
$ if f$locate("local:", line) .lt. f$length(line) then proc = false
|
||||||
|
$ if proc
|
||||||
|
$ then
|
||||||
|
$ shared_proc = f$edit(line,"collapse")
|
||||||
|
$ chop_semi = f$locate(";", shared_proc)
|
||||||
|
$ if chop_semi .lt. f$length(shared_proc) then -
|
||||||
|
shared_proc = f$extract(0, chop_semi, shared_proc)
|
||||||
|
$ write libopt f$fao("UNIVERSAL=!AS",-
|
||||||
|
f$edit(shared_proc,"upcase"))
|
||||||
|
$ endif
|
||||||
|
$ goto vmap_loop
|
||||||
|
$VMAP_END:
|
||||||
|
$ else
|
||||||
|
$ write sys$output "Unknown Architecture (Not VAX, AXP, or IA64)"
|
||||||
|
$ write sys$output "No options file created"
|
||||||
|
$ endif
|
||||||
|
$ endif
|
||||||
|
$ EXIT_M2S:
|
||||||
|
$ close/nolog map
|
||||||
|
$ close/nolog libopt
|
||||||
|
$ endsubroutine
|
||||||
342
samples/DIGITAL Command Language/libxslt_build.com
Normal file
342
samples/DIGITAL Command Language/libxslt_build.com
Normal file
@@ -0,0 +1,342 @@
|
|||||||
|
$! BUILD_XSLT.COM
|
||||||
|
$!
|
||||||
|
$! Build the XSLT library
|
||||||
|
$!
|
||||||
|
$! Arguments:
|
||||||
|
$!
|
||||||
|
$! p1 - "DEBUG" is you want to build with debug
|
||||||
|
$!
|
||||||
|
$! This package requires libxml to have already been installed. You need
|
||||||
|
$! to ensure that the logical name LIBXML is defined and points to the
|
||||||
|
$! directory containing libxml's .h files
|
||||||
|
$!
|
||||||
|
$! This procedure creates the object libraries
|
||||||
|
$!
|
||||||
|
$! XML_LIBDIR:LIBXSLT.OLB
|
||||||
|
$! XML_LIBDIR:LIBEXSLT.OLB
|
||||||
|
$!
|
||||||
|
$! and the program
|
||||||
|
$!
|
||||||
|
$! XSLTPROC
|
||||||
|
$!
|
||||||
|
$! After the library is built, you can link these routines into
|
||||||
|
$! your code with the command
|
||||||
|
$!
|
||||||
|
$! LINK your_modules,XML_LIBDIR:LIBEXSLT/LIB,LIBXSLT/LIBRARY,LIBXML/LIB
|
||||||
|
$!
|
||||||
|
$! Change History
|
||||||
|
$! --------------
|
||||||
|
$! Command file author : John A Fotheringham (jaf@jafsoft.com)
|
||||||
|
$! Last update : 2 Nov 2001
|
||||||
|
$!
|
||||||
|
$!- configuration -------------------------------------------------------------
|
||||||
|
$!
|
||||||
|
$!- compile command.
|
||||||
|
$!
|
||||||
|
$ cc_opts = "/INCLUDE=([],XML_SRCDIR:,[-.libxslt])/NAMES=(SHORTENED)/FLOAT=IEEE/IEEE_MODE=DENORM_RESULTS"
|
||||||
|
$!
|
||||||
|
$ if p1.eqs."DEBUG"
|
||||||
|
$ then
|
||||||
|
$ debug = "Y"
|
||||||
|
$ cc_command = "CC''cc_opts'/DEBUG/NOOPTIMIZE/LIST/SHOW=ALL"
|
||||||
|
$ else
|
||||||
|
$ debug = "N"
|
||||||
|
$ cc_command = "CC''cc_opts'"
|
||||||
|
$ endif
|
||||||
|
$!
|
||||||
|
$!- configure multiple build passes for each library. -------------------------
|
||||||
|
$!
|
||||||
|
$! For each pass:
|
||||||
|
$!
|
||||||
|
$! "libname" is the name of the library or module being created
|
||||||
|
$!
|
||||||
|
$! "progname" is the name of the program being created
|
||||||
|
$!
|
||||||
|
$! "src" is the list of sources to be built into the library or program
|
||||||
|
$! - This should be compared to the definition of
|
||||||
|
$! "<NAME>_la_SOURCES" in the MAKEFILE.IN file in
|
||||||
|
$! corresponding directory.
|
||||||
|
$!
|
||||||
|
$ num_passes = 3 ! two libraries and a program
|
||||||
|
$!
|
||||||
|
$!- pass 1 - library LIBXSLT
|
||||||
|
$!
|
||||||
|
$ libname_1 = "LIBXSLT"
|
||||||
|
$ h_file_1 = "xslt.h"
|
||||||
|
$ progname_1 = ""
|
||||||
|
$!
|
||||||
|
$ ! see "libxslt_la_SOURCES" in [.libxslt]makefile.in
|
||||||
|
$ src_1 = "xslt.c xsltutils.c pattern.c templates.c variables.c keys.c"
|
||||||
|
$ src_1 = src_1 + " numbers.c extensions.c extra.c functions.c"
|
||||||
|
$ src_1 = src_1 + " namespaces.c imports.c attributes.c documents.c"
|
||||||
|
$ src_1 = src_1 + " preproc.c transform.c security.c"
|
||||||
|
$!
|
||||||
|
$!- pass 2 - library LIBEXSLT
|
||||||
|
$!
|
||||||
|
$ libname_2 = "LIBEXSLT"
|
||||||
|
$ h_file_2 = "exslt.h"
|
||||||
|
$ progname_2 = ""
|
||||||
|
$!
|
||||||
|
$ ! see "libexslt_la_SOURCES" in [.libexslt]makefile.in
|
||||||
|
$ src_2 = "exslt.c common.c math.c sets.c functions.c strings.c date.c saxon.c dynamic.c"
|
||||||
|
$!
|
||||||
|
$!- pass 3 - program XSLTPROC
|
||||||
|
$!
|
||||||
|
$ libname_3 = ""
|
||||||
|
$ h_file_3 = ""
|
||||||
|
$ progname_3 = "XSLTPROC"
|
||||||
|
$!
|
||||||
|
$ ! see "xsltproc_SOURCES" in [.xsltproc]makefile.in
|
||||||
|
$ src_3 = "xsltproc.c"
|
||||||
|
$!
|
||||||
|
$!- set up and check logicals -----------------------------------------------
|
||||||
|
$!
|
||||||
|
$! XML_LIBDIR - object library directory
|
||||||
|
$! XML_SRCDIR - top-level build directory of libxml package -- needed for config.h and trio.h
|
||||||
|
$! LIBXML - source directory containing .h files for libxml package
|
||||||
|
$!
|
||||||
|
$ if f$trnlnm("XML_LIBDIR").eqs.""
|
||||||
|
$ then
|
||||||
|
$ on error then continue
|
||||||
|
$ globfile = f$search("[--...]libxml.olb")
|
||||||
|
$ if globfile.eqs.""
|
||||||
|
$ then
|
||||||
|
$ write sys$output ""
|
||||||
|
$ write sys$output " You need to define the XML_LIBDIR logical name to"
|
||||||
|
$ write sys$output " point to the directory containing your object"
|
||||||
|
$ write sys$output " libraries. This should already contain LIBXML.OLB"
|
||||||
|
$ write sys$output " from the libxml package, and will be the directory"
|
||||||
|
$ write sys$output " the new LIBXSLT.OLB library will be placed in"
|
||||||
|
$ write sys$output ""
|
||||||
|
$ exit
|
||||||
|
$ else
|
||||||
|
$ srcdir = f$parse(globfile,,,"DEVICE") + f$parse(globfile,,,"DIRECTORY")
|
||||||
|
$ define/process XML_LIBDIR "''srcdir'"
|
||||||
|
$ write sys$output "Defining XML_LIBDIR as ""''srcdir'"""
|
||||||
|
$ endif
|
||||||
|
$ endif
|
||||||
|
$!
|
||||||
|
$ if f$trnlnm("libxml").eqs.""
|
||||||
|
$ then
|
||||||
|
$ ! look for globals.h in a directory installed paralle to this one
|
||||||
|
$ on error then continue
|
||||||
|
$ globfile = f$search("[--...]globals.h")
|
||||||
|
$ if globfile.eqs.""
|
||||||
|
$ then
|
||||||
|
$ write sys$output ""
|
||||||
|
$ write sys$output " You need to define a LIBXML logical directory to"
|
||||||
|
$ write sys$output " point to the directory containing the .h files"
|
||||||
|
$ write sys$output " for the libxml package"
|
||||||
|
$ write sys$output ""
|
||||||
|
$ exit
|
||||||
|
$ else
|
||||||
|
$ srcdir = f$element(0,"]",globfile)+ "]"
|
||||||
|
$ define/process LIBXML "''srcdir'"
|
||||||
|
$ write sys$output "Defining LIBXML as ""''srcdir'"""
|
||||||
|
$ endif
|
||||||
|
$ endif
|
||||||
|
$!
|
||||||
|
$ if f$trnlnm("XML_SRCDIR").eqs.""
|
||||||
|
$ then
|
||||||
|
$ globfile = f$search("[--...]globals.c")
|
||||||
|
$ if globfile.eqs.""
|
||||||
|
$ then
|
||||||
|
$ write sys$output "Can't locate globals.c. You need to manually define a XML_SRCDIR logical"
|
||||||
|
$ exit
|
||||||
|
$ else
|
||||||
|
$ srcdir = f$parse(globfile,,,"DEVICE") + f$parse(globfile,,,"DIRECTORY")
|
||||||
|
$ define/process XML_SRCDIR "''srcdir'"
|
||||||
|
$ write sys$output "Defining XML_SRCDIR as ""''srcdir'"""
|
||||||
|
$ endif
|
||||||
|
$ endif
|
||||||
|
$!
|
||||||
|
$!- set up some working logicals -------------------
|
||||||
|
$!
|
||||||
|
$ pass_no = 1
|
||||||
|
$ set_pass_logical:
|
||||||
|
$!
|
||||||
|
$ if pass_no.le.num_passes
|
||||||
|
$ then
|
||||||
|
$!
|
||||||
|
$ Libname = libname_'pass_no'
|
||||||
|
$ progname = progname_'pass_no'
|
||||||
|
$ if libname.nes.""
|
||||||
|
$ then
|
||||||
|
$ logname = "''libname'_SRCDIR"
|
||||||
|
$ else
|
||||||
|
$ logname = "''progname'_SRCDIR"
|
||||||
|
$ endif
|
||||||
|
$ findfile = f$element(0," ",src_'pass_no')
|
||||||
|
$!
|
||||||
|
$!--- set up a source directory logical
|
||||||
|
$!
|
||||||
|
$ if f$trnlnm("''logname'").eqs.""
|
||||||
|
$ then
|
||||||
|
$ ! look for the target file in a parallel subdirectory
|
||||||
|
$ globfile = f$search("[-...]''findfile'")
|
||||||
|
$ if globfile.eqs.""
|
||||||
|
$ then
|
||||||
|
$ write sys$output "Can't locate ''findfile'. You need to manually define a ''logname' logical"
|
||||||
|
$ exit
|
||||||
|
$ else
|
||||||
|
$ srcdir = f$element(0,"]",globfile)+ "]"
|
||||||
|
$ define/process 'logname' "''srcdir'"
|
||||||
|
$ write sys$output "Defining ''logname' as ""''srcdir'"""
|
||||||
|
$ endif
|
||||||
|
$ endif
|
||||||
|
$!
|
||||||
|
$!--- if it's a library, set up a logical pointing to the .h files
|
||||||
|
$!
|
||||||
|
$ if libname.nes.""
|
||||||
|
$ then
|
||||||
|
$ if f$trnlnm("''libname'").eqs.""
|
||||||
|
$ then
|
||||||
|
$ ! look for the target .h file in a parallel subdirectory
|
||||||
|
$ h_file = h_file_'pass_no'
|
||||||
|
$ globfile = f$search("[-...]''h_file'")
|
||||||
|
$ if globfile.eqs.""
|
||||||
|
$ then
|
||||||
|
$ write sys$output "Can't locate ''h_file'. You need to manually define a ''libname' logical"
|
||||||
|
$ exit
|
||||||
|
$ else
|
||||||
|
$ includedir = f$element(0,"]",globfile)+ "]"
|
||||||
|
$ define/process 'libname' "''includedir'"
|
||||||
|
$ write sys$output "Defining ''libname' as ""''includedir'"""
|
||||||
|
$ endif
|
||||||
|
$ endif
|
||||||
|
$ endif
|
||||||
|
$!
|
||||||
|
$ pass_no = pass_no +1
|
||||||
|
$ goto set_pass_logical
|
||||||
|
$!
|
||||||
|
$ endif ! for each pass
|
||||||
|
$!
|
||||||
|
$!- set up error handling (such as it is) -------------------------------------
|
||||||
|
$!
|
||||||
|
$ exit_status = 1
|
||||||
|
$ saved_default = f$environment("default")
|
||||||
|
$ on error then goto ERROR_OUT
|
||||||
|
$ on control_y then goto ERROR_OUT
|
||||||
|
$!
|
||||||
|
$ goto start_here
|
||||||
|
$ start_here: ! move this line to debug/rerun parts of this command file
|
||||||
|
$!
|
||||||
|
$!- compile modules into the library ------------------------------------------
|
||||||
|
$!
|
||||||
|
$!
|
||||||
|
$ pass_no = 1 ! make three passes, one for each library, one for XSLTPROC
|
||||||
|
$ pass_loop:
|
||||||
|
$!
|
||||||
|
$ if pass_no.le.num_passes
|
||||||
|
$ then
|
||||||
|
$ Libname = libname_'pass_no'
|
||||||
|
$ progname = progname_'pass_no'
|
||||||
|
$ if libname.nes.""
|
||||||
|
$ then
|
||||||
|
$ logname = "''libname'_SRCDIR"
|
||||||
|
$ pass_description = "the XML_LIBDIR:''libname'.OLB object library"
|
||||||
|
$ else
|
||||||
|
$ logname = "''progname'_SRCDIR"
|
||||||
|
$ pass_description = "the programs in ''progname'"
|
||||||
|
$ endif
|
||||||
|
$ src = src_'pass_no'
|
||||||
|
$!
|
||||||
|
$!- create the library if need
|
||||||
|
$!
|
||||||
|
$ if libname.nes.""
|
||||||
|
$ then
|
||||||
|
$ if f$search("XML_LIBDIR:''libname'.OLB").eqs.""
|
||||||
|
$ then
|
||||||
|
$ write sys$output "Creating new object library XML_LIBDIR:''libname'.OLB..."
|
||||||
|
$ library/create XML_LIBDIR:'libname'.OLB
|
||||||
|
$ endif
|
||||||
|
$ endif
|
||||||
|
$!
|
||||||
|
$!- move to the source directory
|
||||||
|
$!
|
||||||
|
$ set def 'logname'
|
||||||
|
$!
|
||||||
|
$!- define the library and link commands (link command not used as is)
|
||||||
|
$!
|
||||||
|
$ if libname.nes.""
|
||||||
|
$ then
|
||||||
|
$ lib_command = "LIBRARY/REPLACE XML_LIBDIR:''libname'.OLB"
|
||||||
|
$ link_command = ""
|
||||||
|
$ else
|
||||||
|
$ lib_command = ""
|
||||||
|
$ link_command = "LINK"
|
||||||
|
$ endif
|
||||||
|
$!
|
||||||
|
$ write sys$output ""
|
||||||
|
$ write sys$output "Building ''pass_description'
|
||||||
|
$ write sys$output ""
|
||||||
|
$!
|
||||||
|
$ s_no = 0
|
||||||
|
$ src = f$edit(src,"COMPRESS")
|
||||||
|
$!
|
||||||
|
$ source_loop:
|
||||||
|
$!
|
||||||
|
$ next_source = f$element (S_no," ",src)
|
||||||
|
$ if next_source.nes."" .and. next_source.nes." "
|
||||||
|
$ then
|
||||||
|
$ call build 'next_source'
|
||||||
|
$ s_no = s_no + 1
|
||||||
|
$ goto source_loop
|
||||||
|
$ endif
|
||||||
|
$!
|
||||||
|
$ pass_no = pass_no + 1
|
||||||
|
$ goto pass_loop
|
||||||
|
$!
|
||||||
|
$ endif ! for each pass
|
||||||
|
$!
|
||||||
|
$!- Th-th-th-th-th-that's all folks! ------------------------------------------
|
||||||
|
$!
|
||||||
|
$EXIT_OUT:
|
||||||
|
$!
|
||||||
|
$ set def 'saved_default
|
||||||
|
$ exit 'exit_status
|
||||||
|
$!
|
||||||
|
$
|
||||||
|
$ERROR_OUT:
|
||||||
|
$ exit_status = $status
|
||||||
|
$ write sys$output "''f$message(exit_status)'"
|
||||||
|
$ goto EXIT_OUT
|
||||||
|
$!
|
||||||
|
$!- the BUILD subroutine. Compile then insert into library or link as required
|
||||||
|
$!
|
||||||
|
$BUILD: subroutine
|
||||||
|
$ on warning then goto EXIT_BUILD
|
||||||
|
$ source_file = p1
|
||||||
|
$ name = f$element(0,".",source_file)
|
||||||
|
$ object_file = f$fao("XML_LIBDIR:!AS.OBJ",name)
|
||||||
|
$!
|
||||||
|
$!- compile
|
||||||
|
$ write sys$output "Compiling ",p1,p2,"..."
|
||||||
|
$ cc_command /object='object_file 'source_file' 'p2'
|
||||||
|
$!
|
||||||
|
$!- insert into library if command defined
|
||||||
|
$!
|
||||||
|
$ if lib_command.nes.""
|
||||||
|
$ then
|
||||||
|
$ lib_command 'object_file'
|
||||||
|
$ delete/nolog 'object_file';*
|
||||||
|
$ endif
|
||||||
|
$!
|
||||||
|
$!- link module if command defined
|
||||||
|
$!
|
||||||
|
$ if link_command.nes.""
|
||||||
|
$ then
|
||||||
|
$ text = f$element(0,".",p1) ! lose the ".c"
|
||||||
|
$ write sys$output "Linking ",text,"..."
|
||||||
|
$ dbgopts = ""
|
||||||
|
$ if debug then dbgopts = "/DEBUG"
|
||||||
|
$ link_command'dbgopts' 'object_file',-
|
||||||
|
XML_LIBDIR:libexslt/lib,-
|
||||||
|
XML_LIBDIR:libxslt/lib,-
|
||||||
|
XML_LIBDIR:libxml/library
|
||||||
|
$ endif
|
||||||
|
$!
|
||||||
|
$EXIT_BUILD:
|
||||||
|
$ exit $status
|
||||||
|
$!
|
||||||
|
$endsubroutine
|
||||||
10
samples/DIGITAL Command Language/vmsbackup_build.com
Normal file
10
samples/DIGITAL Command Language/vmsbackup_build.com
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
$! Compiling with VAXC is said to work, but it requires the usual cruft
|
||||||
|
$! (vaxcrtl and all), and to avoid hair we don't supply said cruft here.
|
||||||
|
$ CC/DECC/PREFIX=all VMSBACKUP.C/DEFINE=(HAVE_MT_IOCTLS=0,HAVE_UNIXIO_H=1)
|
||||||
|
$ CC/DECC/PREFIX=all DCLMAIN.C
|
||||||
|
$! Probably we don't want match as it probably doesn't implement VMS-style
|
||||||
|
$! matching, but I haven't looking into the issues yet.
|
||||||
|
$ CC/DECC/PREFIX=all match
|
||||||
|
$ LINK/exe=VMSBACKUP.EXE -
|
||||||
|
vmsbackup.obj,dclmain.obj,match.obj,sys$input/opt
|
||||||
|
identification="VMSBACKUP4.1.1"
|
||||||
13
samples/DNS Zone/sample.arpa
Normal file
13
samples/DNS Zone/sample.arpa
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
$ORIGIN 0.0.0.c.2.1.0.3.0.0.2.1.e.f.f.3.ip6.arpa.
|
||||||
|
$TTL 60
|
||||||
|
@ IN SOA ns root (
|
||||||
|
2002042901 ; SERIAL
|
||||||
|
7200 ; REFRESH
|
||||||
|
600 ; RETRY
|
||||||
|
36000000 ; EXPIRE
|
||||||
|
120 ; MINIMUM
|
||||||
|
)
|
||||||
|
|
||||||
|
NS ns.example.com.
|
||||||
|
|
||||||
|
c.a.7.e.d.7.e.f.f.f.0.2.8.0.a.0 PTR sip01.example.com.
|
||||||
12
samples/DNS Zone/sneaky.net.zone
Normal file
12
samples/DNS Zone/sneaky.net.zone
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
$TTL 3d
|
||||||
|
@ IN SOA root.localhost. root.sneaky.net. (
|
||||||
|
2015042907 ; serial
|
||||||
|
3d ; refresh
|
||||||
|
1h ; retry
|
||||||
|
12d ; expire
|
||||||
|
2h ; negative response TTL
|
||||||
|
)
|
||||||
|
IN NS root.localhost.
|
||||||
|
IN NS localhost. ; secondary name server is preferably externally maintained
|
||||||
|
|
||||||
|
www IN A 3.141.59.26
|
||||||
23
samples/DTrace/counts.d
Normal file
23
samples/DTrace/counts.d
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
/*
|
||||||
|
* This software is in the public domain.
|
||||||
|
*
|
||||||
|
* $Id: counts.d 10510 2005-08-15 01:46:19Z kateturner $
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma D option quiet
|
||||||
|
|
||||||
|
self int tottime;
|
||||||
|
BEGIN {
|
||||||
|
tottime = timestamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
php$target:::function-entry
|
||||||
|
@counts[copyinstr(arg0)] = count();
|
||||||
|
}
|
||||||
|
|
||||||
|
END {
|
||||||
|
printf("Total time: %dus\n", (timestamp - tottime) / 1000);
|
||||||
|
printf("# calls by function:\n");
|
||||||
|
printa("%-40s %@d\n", @counts);
|
||||||
|
}
|
||||||
|
|
||||||
73
samples/DTrace/javascript-trace.d
Normal file
73
samples/DTrace/javascript-trace.d
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
/* -*- Mode: dtrace-script; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||||
|
/* ***** BEGIN LICENSE BLOCK *****
|
||||||
|
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||||
|
*
|
||||||
|
* The contents of this file are subject to the Mozilla Public License Version
|
||||||
|
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||||
|
* the License. You may obtain a copy of the License at
|
||||||
|
* http://www.mozilla.org/MPL/
|
||||||
|
*
|
||||||
|
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||||
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||||
|
* for the specific language governing rights and limitations under the
|
||||||
|
* License.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Alternatively, the contents of this file may be used under the terms of
|
||||||
|
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||||
|
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||||
|
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||||
|
* of those above. If you wish to allow use of your version of this file only
|
||||||
|
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||||
|
* use your version of this file under the terms of the MPL, indicate your
|
||||||
|
* decision by deleting the provisions above and replace them with the notice
|
||||||
|
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||||
|
* the provisions above, a recipient may use your version of this file under
|
||||||
|
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||||
|
*
|
||||||
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* javascript provider probes
|
||||||
|
*
|
||||||
|
* function-entry (filename, classname, funcname)
|
||||||
|
* function-info (filename, classname, funcname, lineno,
|
||||||
|
* runfilename, runlineno)
|
||||||
|
* function-args (filename, classname, funcname, argc, argv, argv0,
|
||||||
|
* argv1, argv2, argv3, argv4)
|
||||||
|
* function-rval (filename, classname, funcname, lineno, rval, rval0)
|
||||||
|
* function-return (filename, classname, funcname)
|
||||||
|
* object-create-start (filename, classname)
|
||||||
|
* object-create (filename, classname, *object, rlineno)
|
||||||
|
* object-create-done (filename, classname)
|
||||||
|
* object-finalize (NULL, classname, *object)
|
||||||
|
* execute-start (filename, lineno)
|
||||||
|
* execute-done (filename, lineno)
|
||||||
|
*/
|
||||||
|
|
||||||
|
provider javascript {
|
||||||
|
probe function__entry(char *, char *, char *);
|
||||||
|
probe function__info(char *, char *, char *, int, char *, int);
|
||||||
|
probe function__args(char *, char *, char *, int, void *, void *, void *,
|
||||||
|
void *, void *, void *);
|
||||||
|
probe function__rval(char *, char *, char *, int, void *, void *);
|
||||||
|
probe function__return(char *, char *, char *);
|
||||||
|
probe object__create__start(char *, char *);
|
||||||
|
probe object__create__done(char *, char *);
|
||||||
|
/* XXX must use unsigned longs here instead of uintptr_t for OS X
|
||||||
|
(Apple radar: 5194316 & 5565198) */
|
||||||
|
probe object__create(char *, char *, unsigned long, int);
|
||||||
|
probe object__finalize(char *, char *, unsigned long);
|
||||||
|
probe execute__start(char *, int);
|
||||||
|
probe execute__done(char *, int);
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
#pragma D attributes Unstable/Unstable/Common provider mozilla provider
|
||||||
|
#pragma D attributes Private/Private/Unknown provider mozilla module
|
||||||
|
#pragma D attributes Private/Private/Unknown provider mozilla function
|
||||||
|
#pragma D attributes Unstable/Unstable/Common provider mozilla name
|
||||||
|
#pragma D attributes Unstable/Unstable/Common provider mozilla args
|
||||||
|
*/
|
||||||
|
|
||||||
93
samples/DTrace/probes.d
Normal file
93
samples/DTrace/probes.d
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
/* ----------
|
||||||
|
* DTrace probes for PostgreSQL backend
|
||||||
|
*
|
||||||
|
* Copyright (c) 2006-2009, PostgreSQL Global Development Group
|
||||||
|
*
|
||||||
|
* $PostgreSQL: pgsql/src/backend/utils/probes.d,v 1.11 2009/04/02 20:59:10 momjian Exp $
|
||||||
|
* ----------
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Typedefs used in PostgreSQL.
|
||||||
|
*
|
||||||
|
* NOTE: Do not use system-provided typedefs (e.g. uintptr_t, uint32_t, etc)
|
||||||
|
* in probe definitions, as they cause compilation errors on Mac OS X 10.5.
|
||||||
|
*/
|
||||||
|
#define LocalTransactionId unsigned int
|
||||||
|
#define LWLockId int
|
||||||
|
#define LWLockMode int
|
||||||
|
#define LOCKMODE int
|
||||||
|
#define BlockNumber unsigned int
|
||||||
|
#define Oid unsigned int
|
||||||
|
#define ForkNumber int
|
||||||
|
#define bool char
|
||||||
|
|
||||||
|
provider postgresql {
|
||||||
|
|
||||||
|
probe transaction__start(LocalTransactionId);
|
||||||
|
probe transaction__commit(LocalTransactionId);
|
||||||
|
probe transaction__abort(LocalTransactionId);
|
||||||
|
|
||||||
|
probe lwlock__acquire(LWLockId, LWLockMode);
|
||||||
|
probe lwlock__release(LWLockId);
|
||||||
|
probe lwlock__wait__start(LWLockId, LWLockMode);
|
||||||
|
probe lwlock__wait__done(LWLockId, LWLockMode);
|
||||||
|
probe lwlock__condacquire(LWLockId, LWLockMode);
|
||||||
|
probe lwlock__condacquire__fail(LWLockId, LWLockMode);
|
||||||
|
|
||||||
|
probe lock__wait__start(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, LOCKMODE);
|
||||||
|
probe lock__wait__done(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, LOCKMODE);
|
||||||
|
|
||||||
|
probe query__parse__start(const char *);
|
||||||
|
probe query__parse__done(const char *);
|
||||||
|
probe query__rewrite__start(const char *);
|
||||||
|
probe query__rewrite__done(const char *);
|
||||||
|
probe query__plan__start();
|
||||||
|
probe query__plan__done();
|
||||||
|
probe query__execute__start();
|
||||||
|
probe query__execute__done();
|
||||||
|
probe query__start(const char *);
|
||||||
|
probe query__done(const char *);
|
||||||
|
probe statement__status(const char *);
|
||||||
|
|
||||||
|
probe sort__start(int, bool, int, int, bool);
|
||||||
|
probe sort__done(bool, long);
|
||||||
|
|
||||||
|
probe buffer__read__start(ForkNumber, BlockNumber, Oid, Oid, Oid, bool, bool);
|
||||||
|
probe buffer__read__done(ForkNumber, BlockNumber, Oid, Oid, Oid, bool, bool, bool);
|
||||||
|
probe buffer__flush__start(ForkNumber, BlockNumber, Oid, Oid, Oid);
|
||||||
|
probe buffer__flush__done(ForkNumber, BlockNumber, Oid, Oid, Oid);
|
||||||
|
|
||||||
|
probe buffer__checkpoint__start(int);
|
||||||
|
probe buffer__checkpoint__sync__start();
|
||||||
|
probe buffer__checkpoint__done();
|
||||||
|
probe buffer__sync__start(int, int);
|
||||||
|
probe buffer__sync__written(int);
|
||||||
|
probe buffer__sync__done(int, int, int);
|
||||||
|
probe buffer__write__dirty__start(ForkNumber, BlockNumber, Oid, Oid, Oid);
|
||||||
|
probe buffer__write__dirty__done(ForkNumber, BlockNumber, Oid, Oid, Oid);
|
||||||
|
|
||||||
|
probe deadlock__found();
|
||||||
|
|
||||||
|
probe checkpoint__start(int);
|
||||||
|
probe checkpoint__done(int, int, int, int, int);
|
||||||
|
probe clog__checkpoint__start(bool);
|
||||||
|
probe clog__checkpoint__done(bool);
|
||||||
|
probe subtrans__checkpoint__start(bool);
|
||||||
|
probe subtrans__checkpoint__done(bool);
|
||||||
|
probe multixact__checkpoint__start(bool);
|
||||||
|
probe multixact__checkpoint__done(bool);
|
||||||
|
probe twophase__checkpoint__start();
|
||||||
|
probe twophase__checkpoint__done();
|
||||||
|
|
||||||
|
probe smgr__md__read__start(ForkNumber, BlockNumber, Oid, Oid, Oid);
|
||||||
|
probe smgr__md__read__done(ForkNumber, BlockNumber, Oid, Oid, Oid, int, int);
|
||||||
|
probe smgr__md__write__start(ForkNumber, BlockNumber, Oid, Oid, Oid);
|
||||||
|
probe smgr__md__write__done(ForkNumber, BlockNumber, Oid, Oid, Oid, int, int);
|
||||||
|
|
||||||
|
probe xlog__insert(unsigned char, unsigned char);
|
||||||
|
probe xlog__switch();
|
||||||
|
probe wal__buffer__write__dirty__start();
|
||||||
|
probe wal__buffer__write__dirty__done();
|
||||||
|
};
|
||||||
44
samples/Eiffel/application.e
Normal file
44
samples/Eiffel/application.e
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
note
|
||||||
|
description : "nino application root class"
|
||||||
|
date : "$Date$"
|
||||||
|
revision : "$Revision$"
|
||||||
|
|
||||||
|
class
|
||||||
|
APPLICATION
|
||||||
|
|
||||||
|
inherit
|
||||||
|
ARGUMENTS
|
||||||
|
|
||||||
|
HTTP_SERVER_SHARED_CONFIGURATION
|
||||||
|
|
||||||
|
create
|
||||||
|
make
|
||||||
|
|
||||||
|
feature {NONE} -- Initialization
|
||||||
|
|
||||||
|
make
|
||||||
|
-- Run application.
|
||||||
|
local
|
||||||
|
l_server : HTTP_SERVER
|
||||||
|
l_cfg: HTTP_SERVER_CONFIGURATION
|
||||||
|
l_http_handler : HTTP_HANDLER
|
||||||
|
do
|
||||||
|
create l_cfg.make
|
||||||
|
l_cfg.http_server_port := 9_000
|
||||||
|
l_cfg.document_root := default_document_root
|
||||||
|
set_server_configuration (l_cfg)
|
||||||
|
debug ("nino")
|
||||||
|
l_cfg.set_is_verbose (True)
|
||||||
|
end
|
||||||
|
|
||||||
|
create l_server.make (l_cfg)
|
||||||
|
create {APPLICATION_CONNECTION_HANDLER} l_http_handler.make (l_server)
|
||||||
|
l_server.setup (l_http_handler)
|
||||||
|
end
|
||||||
|
|
||||||
|
feature -- Access
|
||||||
|
|
||||||
|
default_document_root: STRING = "webroot"
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
82
samples/Eiffel/book_collection.e
Normal file
82
samples/Eiffel/book_collection.e
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
class
|
||||||
|
BOOK_COLLECTION
|
||||||
|
|
||||||
|
create
|
||||||
|
make
|
||||||
|
|
||||||
|
feature {NONE} -- Initialization
|
||||||
|
|
||||||
|
make (a_name: STRING_32)
|
||||||
|
-- Create a book collection with `a_name' as `name'.
|
||||||
|
do
|
||||||
|
set_name (a_name)
|
||||||
|
create book_index.make (10)
|
||||||
|
ensure
|
||||||
|
name_set: name = a_name
|
||||||
|
end
|
||||||
|
|
||||||
|
feature -- Access
|
||||||
|
|
||||||
|
name: STRING_32
|
||||||
|
-- Name.
|
||||||
|
|
||||||
|
books: LIST [BOOK]
|
||||||
|
-- collection of book.
|
||||||
|
do
|
||||||
|
create {LINKED_LIST [BOOK]} Result.make
|
||||||
|
across
|
||||||
|
book_index as it
|
||||||
|
loop
|
||||||
|
Result.append (it.item)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
books_by_author (a_author: STRING_32): LIST [BOOK]
|
||||||
|
-- Books wrote by `a_author' in this collection.
|
||||||
|
do
|
||||||
|
if attached book_index [a_author] as l_result then
|
||||||
|
Result := l_result
|
||||||
|
else
|
||||||
|
create {LINKED_LIST [BOOK]} Result.make
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
feature -- Change
|
||||||
|
|
||||||
|
set_name (a_name: STRING_32)
|
||||||
|
-- Set `name' with `a_name'.
|
||||||
|
do
|
||||||
|
name := a_name
|
||||||
|
ensure
|
||||||
|
name_set: name = a_name
|
||||||
|
end
|
||||||
|
|
||||||
|
add_book (a_book: BOOK)
|
||||||
|
-- Extend collection with `a_book'.
|
||||||
|
local
|
||||||
|
l: detachable LIST [BOOK]
|
||||||
|
do
|
||||||
|
l := book_index.at (a_book.author.name)
|
||||||
|
if l = Void then
|
||||||
|
create {LINKED_LIST [BOOK]} l.make
|
||||||
|
book_index.put (l, a_book.author.name)
|
||||||
|
end
|
||||||
|
l.force (a_book)
|
||||||
|
end
|
||||||
|
|
||||||
|
add_books (book_list: like books)
|
||||||
|
-- Append collection with `book_list'.
|
||||||
|
do
|
||||||
|
across
|
||||||
|
book_list as it
|
||||||
|
loop
|
||||||
|
add_book (it.item)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
feature {NONE} -- Implementation
|
||||||
|
|
||||||
|
book_index: HASH_TABLE [LIST [BOOK], STRING_32]
|
||||||
|
-- Association of author name and its books.
|
||||||
|
|
||||||
|
end -- class BOOK_COLLECTION
|
||||||
41
samples/Eiffel/git_checkout_command.e
Normal file
41
samples/Eiffel/git_checkout_command.e
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
note
|
||||||
|
description: "Git checkout command."
|
||||||
|
author: "Olivier Ligot"
|
||||||
|
|
||||||
|
class
|
||||||
|
GIT_CHECKOUT_COMMAND
|
||||||
|
|
||||||
|
inherit
|
||||||
|
GIT_COMMAND
|
||||||
|
|
||||||
|
create
|
||||||
|
make,
|
||||||
|
make_master
|
||||||
|
|
||||||
|
feature {NONE} -- Initialization
|
||||||
|
|
||||||
|
make (a_branch: STRING)
|
||||||
|
-- Checkout the branch `a_branch'.
|
||||||
|
do
|
||||||
|
initialize
|
||||||
|
arguments.force_last (a_branch)
|
||||||
|
branch := a_branch
|
||||||
|
ensure
|
||||||
|
branch_set: branch = a_branch
|
||||||
|
end
|
||||||
|
|
||||||
|
make_master
|
||||||
|
-- Checkout the master branch.
|
||||||
|
do
|
||||||
|
make ("master")
|
||||||
|
end
|
||||||
|
|
||||||
|
feature -- Access
|
||||||
|
|
||||||
|
branch: STRING
|
||||||
|
-- Branch to checkout
|
||||||
|
|
||||||
|
name: STRING = "checkout"
|
||||||
|
-- Git subcommand name
|
||||||
|
|
||||||
|
end
|
||||||
10
samples/Elixir/filenames/mix.lock
Normal file
10
samples/Elixir/filenames/mix.lock
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
%{"cowboy": {:hex, :cowboy, "1.0.0"},
|
||||||
|
"cowlib": {:hex, :cowlib, "1.0.1"},
|
||||||
|
"hackney": {:hex, :hackney, "0.14.3"},
|
||||||
|
"hound": {:hex, :hound, "0.6.0"},
|
||||||
|
"httpoison": {:hex, :httpoison, "0.5.0"},
|
||||||
|
"idna": {:hex, :idna, "1.0.1"},
|
||||||
|
"phoenix": {:hex, :phoenix, "0.10.0"},
|
||||||
|
"plug": {:hex, :plug, "0.11.1"},
|
||||||
|
"poison": {:hex, :poison, "1.3.1"},
|
||||||
|
"ranch": {:hex, :ranch, "1.0.0"}}
|
||||||
29
samples/Emacs Lisp/.emacs.desktop
Normal file
29
samples/Emacs Lisp/.emacs.desktop
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
;; -*- mode: emacs-lisp; coding: emacs-mule; -*-
|
||||||
|
;; --------------------------------------------------------------------------
|
||||||
|
;; Desktop File for Emacs
|
||||||
|
;; --------------------------------------------------------------------------
|
||||||
|
;; Created Sat Jan 3 12:46:35 2015
|
||||||
|
;; Desktop file format version 206
|
||||||
|
;; Emacs version 24.3.1
|
||||||
|
|
||||||
|
;; Global section:
|
||||||
|
(setq desktop-missing-file-warning nil)
|
||||||
|
(setq tags-file-name nil)
|
||||||
|
(setq tags-table-list nil)
|
||||||
|
(setq search-ring nil)
|
||||||
|
(setq regexp-search-ring nil)
|
||||||
|
(setq register-alist nil)
|
||||||
|
(setq file-name-history nil)
|
||||||
|
|
||||||
|
;; Buffer section -- buffers listed in same order as in buffer list:
|
||||||
|
(desktop-create-buffer 206
|
||||||
|
"/home/foo/bar"
|
||||||
|
"bar"
|
||||||
|
'fundamental-mode
|
||||||
|
nil
|
||||||
|
11572
|
||||||
|
'(11554 nil)
|
||||||
|
nil
|
||||||
|
nil
|
||||||
|
'((buffer-file-coding-system . undecided-unix)))
|
||||||
|
|
||||||
856
samples/Erlang/elixir_parser.yrl
Normal file
856
samples/Erlang/elixir_parser.yrl
Normal file
@@ -0,0 +1,856 @@
|
|||||||
|
Nonterminals
|
||||||
|
grammar expr_list
|
||||||
|
expr container_expr block_expr access_expr
|
||||||
|
no_parens_expr no_parens_zero_expr no_parens_one_expr no_parens_one_ambig_expr
|
||||||
|
bracket_expr bracket_at_expr bracket_arg matched_expr unmatched_expr max_expr
|
||||||
|
unmatched_op_expr matched_op_expr no_parens_op_expr no_parens_many_expr
|
||||||
|
comp_op_eol at_op_eol unary_op_eol and_op_eol or_op_eol capture_op_eol
|
||||||
|
add_op_eol mult_op_eol two_op_eol three_op_eol pipe_op_eol stab_op_eol
|
||||||
|
arrow_op_eol match_op_eol when_op_eol in_op_eol in_match_op_eol
|
||||||
|
type_op_eol rel_op_eol
|
||||||
|
open_paren close_paren empty_paren eoe
|
||||||
|
list list_args open_bracket close_bracket
|
||||||
|
tuple open_curly close_curly
|
||||||
|
bit_string open_bit close_bit
|
||||||
|
map map_op map_close map_args map_expr struct_op
|
||||||
|
assoc_op_eol assoc_expr assoc_base assoc_update assoc_update_kw assoc
|
||||||
|
container_args_base container_args
|
||||||
|
call_args_parens_expr call_args_parens_base call_args_parens parens_call
|
||||||
|
call_args_no_parens_one call_args_no_parens_ambig call_args_no_parens_expr
|
||||||
|
call_args_no_parens_comma_expr call_args_no_parens_all call_args_no_parens_many
|
||||||
|
call_args_no_parens_many_strict
|
||||||
|
stab stab_eoe stab_expr stab_op_eol_and_expr stab_parens_many
|
||||||
|
kw_eol kw_base kw call_args_no_parens_kw_expr call_args_no_parens_kw
|
||||||
|
dot_op dot_alias dot_alias_container
|
||||||
|
dot_identifier dot_op_identifier dot_do_identifier
|
||||||
|
dot_paren_identifier dot_bracket_identifier
|
||||||
|
do_block fn_eoe do_eoe end_eoe block_eoe block_item block_list
|
||||||
|
.
|
||||||
|
|
||||||
|
Terminals
|
||||||
|
identifier kw_identifier kw_identifier_safe kw_identifier_unsafe bracket_identifier
|
||||||
|
paren_identifier do_identifier block_identifier
|
||||||
|
fn 'end' aliases
|
||||||
|
number atom atom_safe atom_unsafe bin_string list_string sigil
|
||||||
|
dot_call_op op_identifier
|
||||||
|
comp_op at_op unary_op and_op or_op arrow_op match_op in_op in_match_op
|
||||||
|
type_op dual_op add_op mult_op two_op three_op pipe_op stab_op when_op assoc_op
|
||||||
|
capture_op rel_op
|
||||||
|
'true' 'false' 'nil' 'do' eol ';' ',' '.'
|
||||||
|
'(' ')' '[' ']' '{' '}' '<<' '>>' '%{}' '%'
|
||||||
|
.
|
||||||
|
|
||||||
|
Rootsymbol grammar.
|
||||||
|
|
||||||
|
%% Two shift/reduce conflicts coming from call_args_parens.
|
||||||
|
Expect 2.
|
||||||
|
|
||||||
|
%% Changes in ops and precedence should be reflected on lib/elixir/lib/macro.ex
|
||||||
|
%% Note though the operator => in practice has lower precedence than all others,
|
||||||
|
%% its entry in the table is only to support the %{user | foo => bar} syntax.
|
||||||
|
Left 5 do.
|
||||||
|
Right 10 stab_op_eol. %% ->
|
||||||
|
Left 20 ','.
|
||||||
|
Nonassoc 30 capture_op_eol. %% &
|
||||||
|
Left 40 in_match_op_eol. %% <-, \\ (allowed in matches along =)
|
||||||
|
Right 50 when_op_eol. %% when
|
||||||
|
Right 60 type_op_eol. %% ::
|
||||||
|
Right 70 pipe_op_eol. %% |
|
||||||
|
Right 80 assoc_op_eol. %% =>
|
||||||
|
Right 90 match_op_eol. %% =
|
||||||
|
Left 130 or_op_eol. %% ||, |||, or
|
||||||
|
Left 140 and_op_eol. %% &&, &&&, and
|
||||||
|
Left 150 comp_op_eol. %% ==, !=, =~, ===, !==
|
||||||
|
Left 160 rel_op_eol. %% <, >, <=, >=
|
||||||
|
Left 170 arrow_op_eol. %% |>, <<<, >>>, ~>>, <<~, ~>, <~, <~>, <|>
|
||||||
|
Left 180 in_op_eol. %% in
|
||||||
|
Left 190 three_op_eol. %% ^^^
|
||||||
|
Right 200 two_op_eol. %% ++, --, .., <>
|
||||||
|
Left 210 add_op_eol. %% +, -
|
||||||
|
Left 220 mult_op_eol. %% *, /
|
||||||
|
Nonassoc 300 unary_op_eol. %% +, -, !, ^, not, ~~~
|
||||||
|
Left 310 dot_call_op.
|
||||||
|
Left 310 dot_op. %% .
|
||||||
|
Nonassoc 320 at_op_eol. %% @
|
||||||
|
Nonassoc 330 dot_identifier.
|
||||||
|
|
||||||
|
%%% MAIN FLOW OF EXPRESSIONS
|
||||||
|
|
||||||
|
grammar -> eoe : nil.
|
||||||
|
grammar -> expr_list : to_block('$1').
|
||||||
|
grammar -> eoe expr_list : to_block('$2').
|
||||||
|
grammar -> expr_list eoe : to_block('$1').
|
||||||
|
grammar -> eoe expr_list eoe : to_block('$2').
|
||||||
|
grammar -> '$empty' : nil.
|
||||||
|
|
||||||
|
% Note expressions are on reverse order
|
||||||
|
expr_list -> expr : ['$1'].
|
||||||
|
expr_list -> expr_list eoe expr : ['$3'|'$1'].
|
||||||
|
|
||||||
|
expr -> matched_expr : '$1'.
|
||||||
|
expr -> no_parens_expr : '$1'.
|
||||||
|
expr -> unmatched_expr : '$1'.
|
||||||
|
|
||||||
|
%% In Elixir we have three main call syntaxes: with parentheses,
|
||||||
|
%% without parentheses and with do blocks. They are represented
|
||||||
|
%% in the AST as matched, no_parens and unmatched.
|
||||||
|
%%
|
||||||
|
%% Calls without parentheses are further divided according to how
|
||||||
|
%% problematic they are:
|
||||||
|
%%
|
||||||
|
%% (a) no_parens_one: a call with one unproblematic argument
|
||||||
|
%% (e.g. `f a` or `f g a` and similar) (includes unary operators)
|
||||||
|
%%
|
||||||
|
%% (b) no_parens_many: a call with several arguments (e.g. `f a, b`)
|
||||||
|
%%
|
||||||
|
%% (c) no_parens_one_ambig: a call with one argument which is
|
||||||
|
%% itself a no_parens_many or no_parens_one_ambig (e.g. `f g a, b`
|
||||||
|
%% or `f g h a, b` and similar)
|
||||||
|
%%
|
||||||
|
%% Note, in particular, that no_parens_one_ambig expressions are
|
||||||
|
%% ambiguous and are interpreted such that the outer function has
|
||||||
|
%% arity 1 (e.g. `f g a, b` is interpreted as `f(g(a, b))` rather
|
||||||
|
%% than `f(g(a), b)`). Hence the name, no_parens_one_ambig.
|
||||||
|
%%
|
||||||
|
%% The distinction is required because we can't, for example, have
|
||||||
|
%% a function call with a do block as argument inside another do
|
||||||
|
%% block call, unless there are parentheses:
|
||||||
|
%%
|
||||||
|
%% if if true do true else false end do #=> invalid
|
||||||
|
%% if(if true do true else false end) do #=> valid
|
||||||
|
%%
|
||||||
|
%% Similarly, it is not possible to nest calls without parentheses
|
||||||
|
%% if their arity is more than 1:
|
||||||
|
%%
|
||||||
|
%% foo a, bar b, c #=> invalid
|
||||||
|
%% foo(a, bar b, c) #=> invalid
|
||||||
|
%% foo bar a, b #=> valid
|
||||||
|
%% foo a, bar(b, c) #=> valid
|
||||||
|
%%
|
||||||
|
%% So the different grammar rules need to take into account
|
||||||
|
%% if calls without parentheses are do blocks in particular
|
||||||
|
%% segments and act accordingly.
|
||||||
|
matched_expr -> matched_expr matched_op_expr : build_op(element(1, '$2'), '$1', element(2, '$2')).
|
||||||
|
matched_expr -> unary_op_eol matched_expr : build_unary_op('$1', '$2').
|
||||||
|
matched_expr -> at_op_eol matched_expr : build_unary_op('$1', '$2').
|
||||||
|
matched_expr -> capture_op_eol matched_expr : build_unary_op('$1', '$2').
|
||||||
|
matched_expr -> no_parens_one_expr : '$1'.
|
||||||
|
matched_expr -> no_parens_zero_expr : '$1'.
|
||||||
|
matched_expr -> access_expr : '$1'.
|
||||||
|
matched_expr -> access_expr kw_identifier : throw_invalid_kw_identifier('$2').
|
||||||
|
|
||||||
|
unmatched_expr -> matched_expr unmatched_op_expr : build_op(element(1, '$2'), '$1', element(2, '$2')).
|
||||||
|
unmatched_expr -> unmatched_expr matched_op_expr : build_op(element(1, '$2'), '$1', element(2, '$2')).
|
||||||
|
unmatched_expr -> unmatched_expr unmatched_op_expr : build_op(element(1, '$2'), '$1', element(2, '$2')).
|
||||||
|
unmatched_expr -> unmatched_expr no_parens_op_expr : build_op(element(1, '$2'), '$1', element(2, '$2')).
|
||||||
|
unmatched_expr -> unary_op_eol expr : build_unary_op('$1', '$2').
|
||||||
|
unmatched_expr -> at_op_eol expr : build_unary_op('$1', '$2').
|
||||||
|
unmatched_expr -> capture_op_eol expr : build_unary_op('$1', '$2').
|
||||||
|
unmatched_expr -> block_expr : '$1'.
|
||||||
|
|
||||||
|
no_parens_expr -> matched_expr no_parens_op_expr : build_op(element(1, '$2'), '$1', element(2, '$2')).
|
||||||
|
no_parens_expr -> unary_op_eol no_parens_expr : build_unary_op('$1', '$2').
|
||||||
|
no_parens_expr -> at_op_eol no_parens_expr : build_unary_op('$1', '$2').
|
||||||
|
no_parens_expr -> capture_op_eol no_parens_expr : build_unary_op('$1', '$2').
|
||||||
|
no_parens_expr -> no_parens_one_ambig_expr : '$1'.
|
||||||
|
no_parens_expr -> no_parens_many_expr : '$1'.
|
||||||
|
|
||||||
|
block_expr -> parens_call call_args_parens do_block : build_identifier('$1', '$2' ++ '$3').
|
||||||
|
block_expr -> parens_call call_args_parens call_args_parens do_block : build_nested_parens('$1', '$2', '$3' ++ '$4').
|
||||||
|
block_expr -> dot_do_identifier do_block : build_identifier('$1', '$2').
|
||||||
|
block_expr -> dot_identifier call_args_no_parens_all do_block : build_identifier('$1', '$2' ++ '$3').
|
||||||
|
|
||||||
|
matched_op_expr -> match_op_eol matched_expr : {'$1', '$2'}.
|
||||||
|
matched_op_expr -> add_op_eol matched_expr : {'$1', '$2'}.
|
||||||
|
matched_op_expr -> mult_op_eol matched_expr : {'$1', '$2'}.
|
||||||
|
matched_op_expr -> two_op_eol matched_expr : {'$1', '$2'}.
|
||||||
|
matched_op_expr -> three_op_eol matched_expr : {'$1', '$2'}.
|
||||||
|
matched_op_expr -> and_op_eol matched_expr : {'$1', '$2'}.
|
||||||
|
matched_op_expr -> or_op_eol matched_expr : {'$1', '$2'}.
|
||||||
|
matched_op_expr -> in_op_eol matched_expr : {'$1', '$2'}.
|
||||||
|
matched_op_expr -> in_match_op_eol matched_expr : {'$1', '$2'}.
|
||||||
|
matched_op_expr -> type_op_eol matched_expr : {'$1', '$2'}.
|
||||||
|
matched_op_expr -> when_op_eol matched_expr : {'$1', '$2'}.
|
||||||
|
matched_op_expr -> pipe_op_eol matched_expr : {'$1', '$2'}.
|
||||||
|
matched_op_expr -> comp_op_eol matched_expr : {'$1', '$2'}.
|
||||||
|
matched_op_expr -> rel_op_eol matched_expr : {'$1', '$2'}.
|
||||||
|
matched_op_expr -> arrow_op_eol matched_expr : {'$1', '$2'}.
|
||||||
|
%% Warn for no parens subset
|
||||||
|
matched_op_expr -> arrow_op_eol no_parens_one_expr : warn_pipe('$1', '$2'), {'$1', '$2'}.
|
||||||
|
|
||||||
|
unmatched_op_expr -> match_op_eol unmatched_expr : {'$1', '$2'}.
|
||||||
|
unmatched_op_expr -> add_op_eol unmatched_expr : {'$1', '$2'}.
|
||||||
|
unmatched_op_expr -> mult_op_eol unmatched_expr : {'$1', '$2'}.
|
||||||
|
unmatched_op_expr -> two_op_eol unmatched_expr : {'$1', '$2'}.
|
||||||
|
unmatched_op_expr -> three_op_eol unmatched_expr : {'$1', '$2'}.
|
||||||
|
unmatched_op_expr -> and_op_eol unmatched_expr : {'$1', '$2'}.
|
||||||
|
unmatched_op_expr -> or_op_eol unmatched_expr : {'$1', '$2'}.
|
||||||
|
unmatched_op_expr -> in_op_eol unmatched_expr : {'$1', '$2'}.
|
||||||
|
unmatched_op_expr -> in_match_op_eol unmatched_expr : {'$1', '$2'}.
|
||||||
|
unmatched_op_expr -> type_op_eol unmatched_expr : {'$1', '$2'}.
|
||||||
|
unmatched_op_expr -> when_op_eol unmatched_expr : {'$1', '$2'}.
|
||||||
|
unmatched_op_expr -> pipe_op_eol unmatched_expr : {'$1', '$2'}.
|
||||||
|
unmatched_op_expr -> comp_op_eol unmatched_expr : {'$1', '$2'}.
|
||||||
|
unmatched_op_expr -> rel_op_eol unmatched_expr : {'$1', '$2'}.
|
||||||
|
unmatched_op_expr -> arrow_op_eol unmatched_expr : {'$1', '$2'}.
|
||||||
|
|
||||||
|
no_parens_op_expr -> match_op_eol no_parens_expr : {'$1', '$2'}.
|
||||||
|
no_parens_op_expr -> add_op_eol no_parens_expr : {'$1', '$2'}.
|
||||||
|
no_parens_op_expr -> mult_op_eol no_parens_expr : {'$1', '$2'}.
|
||||||
|
no_parens_op_expr -> two_op_eol no_parens_expr : {'$1', '$2'}.
|
||||||
|
no_parens_op_expr -> three_op_eol no_parens_expr : {'$1', '$2'}.
|
||||||
|
no_parens_op_expr -> and_op_eol no_parens_expr : {'$1', '$2'}.
|
||||||
|
no_parens_op_expr -> or_op_eol no_parens_expr : {'$1', '$2'}.
|
||||||
|
no_parens_op_expr -> in_op_eol no_parens_expr : {'$1', '$2'}.
|
||||||
|
no_parens_op_expr -> in_match_op_eol no_parens_expr : {'$1', '$2'}.
|
||||||
|
no_parens_op_expr -> type_op_eol no_parens_expr : {'$1', '$2'}.
|
||||||
|
no_parens_op_expr -> when_op_eol no_parens_expr : {'$1', '$2'}.
|
||||||
|
no_parens_op_expr -> pipe_op_eol no_parens_expr : {'$1', '$2'}.
|
||||||
|
no_parens_op_expr -> comp_op_eol no_parens_expr : {'$1', '$2'}.
|
||||||
|
no_parens_op_expr -> rel_op_eol no_parens_expr : {'$1', '$2'}.
|
||||||
|
no_parens_op_expr -> arrow_op_eol no_parens_expr : {'$1', '$2'}.
|
||||||
|
%% Warn for no parens subset
|
||||||
|
no_parens_op_expr -> arrow_op_eol no_parens_one_ambig_expr : warn_pipe('$1', '$2'), {'$1', '$2'}.
|
||||||
|
no_parens_op_expr -> arrow_op_eol no_parens_many_expr : warn_pipe('$1', '$2'), {'$1', '$2'}.
|
||||||
|
|
||||||
|
%% Allow when (and only when) with keywords
|
||||||
|
no_parens_op_expr -> when_op_eol call_args_no_parens_kw : {'$1', '$2'}.
|
||||||
|
|
||||||
|
no_parens_one_ambig_expr -> dot_op_identifier call_args_no_parens_ambig : build_identifier('$1', '$2').
|
||||||
|
no_parens_one_ambig_expr -> dot_identifier call_args_no_parens_ambig : build_identifier('$1', '$2').
|
||||||
|
|
||||||
|
no_parens_many_expr -> dot_op_identifier call_args_no_parens_many_strict : build_identifier('$1', '$2').
|
||||||
|
no_parens_many_expr -> dot_identifier call_args_no_parens_many_strict : build_identifier('$1', '$2').
|
||||||
|
|
||||||
|
no_parens_one_expr -> dot_op_identifier call_args_no_parens_one : build_identifier('$1', '$2').
|
||||||
|
no_parens_one_expr -> dot_identifier call_args_no_parens_one : build_identifier('$1', '$2').
|
||||||
|
no_parens_zero_expr -> dot_do_identifier : build_identifier('$1', nil).
|
||||||
|
no_parens_zero_expr -> dot_identifier : build_identifier('$1', nil).
|
||||||
|
|
||||||
|
%% From this point on, we just have constructs that can be
|
||||||
|
%% used with the access syntax. Notice that (dot_)identifier
|
||||||
|
%% is not included in this list simply because the tokenizer
|
||||||
|
%% marks identifiers followed by brackets as bracket_identifier.
|
||||||
|
access_expr -> bracket_at_expr : '$1'.
|
||||||
|
access_expr -> bracket_expr : '$1'.
|
||||||
|
access_expr -> at_op_eol number : build_unary_op('$1', ?exprs('$2')).
|
||||||
|
access_expr -> unary_op_eol number : build_unary_op('$1', ?exprs('$2')).
|
||||||
|
access_expr -> capture_op_eol number : build_unary_op('$1', ?exprs('$2')).
|
||||||
|
access_expr -> fn_eoe stab end_eoe : build_fn('$1', reverse('$2')).
|
||||||
|
access_expr -> open_paren stab close_paren : build_stab(reverse('$2')).
|
||||||
|
access_expr -> open_paren stab ';' close_paren : build_stab(reverse('$2')).
|
||||||
|
access_expr -> open_paren ';' stab ';' close_paren : build_stab(reverse('$3')).
|
||||||
|
access_expr -> open_paren ';' stab close_paren : build_stab(reverse('$3')).
|
||||||
|
access_expr -> open_paren ';' close_paren : build_stab([]).
|
||||||
|
access_expr -> empty_paren : nil.
|
||||||
|
access_expr -> number : ?exprs('$1').
|
||||||
|
access_expr -> list : element(1, '$1').
|
||||||
|
access_expr -> map : '$1'.
|
||||||
|
access_expr -> tuple : '$1'.
|
||||||
|
access_expr -> 'true' : ?id('$1').
|
||||||
|
access_expr -> 'false' : ?id('$1').
|
||||||
|
access_expr -> 'nil' : ?id('$1').
|
||||||
|
access_expr -> bin_string : build_bin_string('$1').
|
||||||
|
access_expr -> list_string : build_list_string('$1').
|
||||||
|
access_expr -> bit_string : '$1'.
|
||||||
|
access_expr -> sigil : build_sigil('$1').
|
||||||
|
access_expr -> max_expr : '$1'.
|
||||||
|
|
||||||
|
%% Aliases and properly formed calls. Used by map_expr.
|
||||||
|
max_expr -> atom : ?exprs('$1').
|
||||||
|
max_expr -> atom_safe : build_quoted_atom('$1', true).
|
||||||
|
max_expr -> atom_unsafe : build_quoted_atom('$1', false).
|
||||||
|
max_expr -> parens_call call_args_parens : build_identifier('$1', '$2').
|
||||||
|
max_expr -> parens_call call_args_parens call_args_parens : build_nested_parens('$1', '$2', '$3').
|
||||||
|
max_expr -> dot_alias : '$1'.
|
||||||
|
|
||||||
|
bracket_arg -> open_bracket kw close_bracket : build_list('$1', '$2').
|
||||||
|
bracket_arg -> open_bracket container_expr close_bracket : build_list('$1', '$2').
|
||||||
|
bracket_arg -> open_bracket container_expr ',' close_bracket : build_list('$1', '$2').
|
||||||
|
|
||||||
|
bracket_expr -> dot_bracket_identifier bracket_arg : build_access(build_identifier('$1', nil), '$2').
|
||||||
|
bracket_expr -> access_expr bracket_arg : build_access('$1', '$2').
|
||||||
|
|
||||||
|
bracket_at_expr -> at_op_eol dot_bracket_identifier bracket_arg :
|
||||||
|
build_access(build_unary_op('$1', build_identifier('$2', nil)), '$3').
|
||||||
|
bracket_at_expr -> at_op_eol access_expr bracket_arg :
|
||||||
|
build_access(build_unary_op('$1', '$2'), '$3').
|
||||||
|
|
||||||
|
%% Blocks
|
||||||
|
|
||||||
|
do_block -> do_eoe 'end' : [[{do, nil}]].
|
||||||
|
do_block -> do_eoe stab end_eoe : [[{do, build_stab(reverse('$2'))}]].
|
||||||
|
do_block -> do_eoe block_list 'end' : [[{do, nil}|'$2']].
|
||||||
|
do_block -> do_eoe stab_eoe block_list 'end' : [[{do, build_stab(reverse('$2'))}|'$3']].
|
||||||
|
|
||||||
|
eoe -> eol : '$1'.
|
||||||
|
eoe -> ';' : '$1'.
|
||||||
|
eoe -> eol ';' : '$1'.
|
||||||
|
|
||||||
|
fn_eoe -> 'fn' : '$1'.
|
||||||
|
fn_eoe -> 'fn' eoe : '$1'.
|
||||||
|
|
||||||
|
do_eoe -> 'do' : '$1'.
|
||||||
|
do_eoe -> 'do' eoe : '$1'.
|
||||||
|
|
||||||
|
end_eoe -> 'end' : '$1'.
|
||||||
|
end_eoe -> eoe 'end' : '$2'.
|
||||||
|
|
||||||
|
block_eoe -> block_identifier : '$1'.
|
||||||
|
block_eoe -> block_identifier eoe : '$1'.
|
||||||
|
|
||||||
|
stab -> stab_expr : ['$1'].
|
||||||
|
stab -> stab eoe stab_expr : ['$3'|'$1'].
|
||||||
|
|
||||||
|
stab_eoe -> stab : '$1'.
|
||||||
|
stab_eoe -> stab eoe : '$1'.
|
||||||
|
|
||||||
|
%% Here, `element(1, Token)` is the stab operator,
|
||||||
|
%% while `element(2, Token)` is the expression.
|
||||||
|
stab_expr -> expr :
|
||||||
|
'$1'.
|
||||||
|
stab_expr -> stab_op_eol_and_expr :
|
||||||
|
build_op(element(1, '$1'), [], element(2, '$1')).
|
||||||
|
stab_expr -> empty_paren stab_op_eol_and_expr :
|
||||||
|
build_op(element(1, '$2'), [], element(2, '$2')).
|
||||||
|
stab_expr -> call_args_no_parens_all stab_op_eol_and_expr :
|
||||||
|
build_op(element(1, '$2'), unwrap_when(unwrap_splice('$1')), element(2, '$2')).
|
||||||
|
stab_expr -> stab_parens_many stab_op_eol_and_expr :
|
||||||
|
build_op(element(1, '$2'), unwrap_splice('$1'), element(2, '$2')).
|
||||||
|
stab_expr -> stab_parens_many when_op expr stab_op_eol_and_expr :
|
||||||
|
build_op(element(1, '$4'), [{'when', meta_from_token('$2'), unwrap_splice('$1') ++ ['$3']}], element(2, '$4')).
|
||||||
|
|
||||||
|
stab_op_eol_and_expr -> stab_op_eol expr : {'$1', '$2'}.
|
||||||
|
stab_op_eol_and_expr -> stab_op_eol : warn_empty_stab_clause('$1'), {'$1', nil}.
|
||||||
|
|
||||||
|
block_item -> block_eoe stab_eoe : {?exprs('$1'), build_stab(reverse('$2'))}.
|
||||||
|
block_item -> block_eoe : {?exprs('$1'), nil}.
|
||||||
|
|
||||||
|
block_list -> block_item : ['$1'].
|
||||||
|
block_list -> block_item block_list : ['$1'|'$2'].
|
||||||
|
|
||||||
|
%% Helpers
|
||||||
|
|
||||||
|
open_paren -> '(' : '$1'.
|
||||||
|
open_paren -> '(' eol : '$1'.
|
||||||
|
close_paren -> ')' : '$1'.
|
||||||
|
close_paren -> eol ')' : '$2'.
|
||||||
|
|
||||||
|
empty_paren -> open_paren ')' : '$1'.
|
||||||
|
|
||||||
|
open_bracket -> '[' : '$1'.
|
||||||
|
open_bracket -> '[' eol : '$1'.
|
||||||
|
close_bracket -> ']' : '$1'.
|
||||||
|
close_bracket -> eol ']' : '$2'.
|
||||||
|
|
||||||
|
open_bit -> '<<' : '$1'.
|
||||||
|
open_bit -> '<<' eol : '$1'.
|
||||||
|
close_bit -> '>>' : '$1'.
|
||||||
|
close_bit -> eol '>>' : '$2'.
|
||||||
|
|
||||||
|
open_curly -> '{' : '$1'.
|
||||||
|
open_curly -> '{' eol : '$1'.
|
||||||
|
close_curly -> '}' : '$1'.
|
||||||
|
close_curly -> eol '}' : '$2'.
|
||||||
|
|
||||||
|
% Operators
|
||||||
|
|
||||||
|
add_op_eol -> add_op : '$1'.
|
||||||
|
add_op_eol -> add_op eol : '$1'.
|
||||||
|
add_op_eol -> dual_op : '$1'.
|
||||||
|
add_op_eol -> dual_op eol : '$1'.
|
||||||
|
|
||||||
|
mult_op_eol -> mult_op : '$1'.
|
||||||
|
mult_op_eol -> mult_op eol : '$1'.
|
||||||
|
|
||||||
|
two_op_eol -> two_op : '$1'.
|
||||||
|
two_op_eol -> two_op eol : '$1'.
|
||||||
|
|
||||||
|
three_op_eol -> three_op : '$1'.
|
||||||
|
three_op_eol -> three_op eol : '$1'.
|
||||||
|
|
||||||
|
pipe_op_eol -> pipe_op : '$1'.
|
||||||
|
pipe_op_eol -> pipe_op eol : '$1'.
|
||||||
|
|
||||||
|
capture_op_eol -> capture_op : '$1'.
|
||||||
|
capture_op_eol -> capture_op eol : '$1'.
|
||||||
|
|
||||||
|
unary_op_eol -> unary_op : '$1'.
|
||||||
|
unary_op_eol -> unary_op eol : '$1'.
|
||||||
|
unary_op_eol -> dual_op : '$1'.
|
||||||
|
unary_op_eol -> dual_op eol : '$1'.
|
||||||
|
|
||||||
|
match_op_eol -> match_op : '$1'.
|
||||||
|
match_op_eol -> match_op eol : '$1'.
|
||||||
|
|
||||||
|
and_op_eol -> and_op : '$1'.
|
||||||
|
and_op_eol -> and_op eol : '$1'.
|
||||||
|
|
||||||
|
or_op_eol -> or_op : '$1'.
|
||||||
|
or_op_eol -> or_op eol : '$1'.
|
||||||
|
|
||||||
|
in_op_eol -> in_op : '$1'.
|
||||||
|
in_op_eol -> in_op eol : '$1'.
|
||||||
|
|
||||||
|
in_match_op_eol -> in_match_op : '$1'.
|
||||||
|
in_match_op_eol -> in_match_op eol : '$1'.
|
||||||
|
|
||||||
|
type_op_eol -> type_op : '$1'.
|
||||||
|
type_op_eol -> type_op eol : '$1'.
|
||||||
|
|
||||||
|
when_op_eol -> when_op : '$1'.
|
||||||
|
when_op_eol -> when_op eol : '$1'.
|
||||||
|
|
||||||
|
stab_op_eol -> stab_op : '$1'.
|
||||||
|
stab_op_eol -> stab_op eol : '$1'.
|
||||||
|
|
||||||
|
at_op_eol -> at_op : '$1'.
|
||||||
|
at_op_eol -> at_op eol : '$1'.
|
||||||
|
|
||||||
|
comp_op_eol -> comp_op : '$1'.
|
||||||
|
comp_op_eol -> comp_op eol : '$1'.
|
||||||
|
|
||||||
|
rel_op_eol -> rel_op : '$1'.
|
||||||
|
rel_op_eol -> rel_op eol : '$1'.
|
||||||
|
|
||||||
|
arrow_op_eol -> arrow_op : '$1'.
|
||||||
|
arrow_op_eol -> arrow_op eol : '$1'.
|
||||||
|
|
||||||
|
% Dot operator
|
||||||
|
|
||||||
|
dot_op -> '.' : '$1'.
|
||||||
|
dot_op -> '.' eol : '$1'.
|
||||||
|
|
||||||
|
dot_identifier -> identifier : '$1'.
|
||||||
|
dot_identifier -> matched_expr dot_op identifier : build_dot('$2', '$1', '$3').
|
||||||
|
|
||||||
|
dot_alias -> aliases : {'__aliases__', meta_from_token('$1', 0), ?exprs('$1')}.
|
||||||
|
dot_alias -> matched_expr dot_op aliases : build_dot_alias('$2', '$1', '$3').
|
||||||
|
dot_alias -> matched_expr dot_op dot_alias_container : build_dot_container('$2', '$1', '$3').
|
||||||
|
|
||||||
|
dot_alias_container -> open_curly '}' : [].
|
||||||
|
dot_alias_container -> open_curly container_args close_curly : '$2'.
|
||||||
|
|
||||||
|
dot_op_identifier -> op_identifier : '$1'.
|
||||||
|
dot_op_identifier -> matched_expr dot_op op_identifier : build_dot('$2', '$1', '$3').
|
||||||
|
|
||||||
|
dot_do_identifier -> do_identifier : '$1'.
|
||||||
|
dot_do_identifier -> matched_expr dot_op do_identifier : build_dot('$2', '$1', '$3').
|
||||||
|
|
||||||
|
dot_bracket_identifier -> bracket_identifier : '$1'.
|
||||||
|
dot_bracket_identifier -> matched_expr dot_op bracket_identifier : build_dot('$2', '$1', '$3').
|
||||||
|
|
||||||
|
dot_paren_identifier -> paren_identifier : '$1'.
|
||||||
|
dot_paren_identifier -> matched_expr dot_op paren_identifier : build_dot('$2', '$1', '$3').
|
||||||
|
|
||||||
|
parens_call -> dot_paren_identifier : '$1'.
|
||||||
|
parens_call -> matched_expr dot_call_op : {'.', meta_from_token('$2'), ['$1']}. % Fun/local calls
|
||||||
|
|
||||||
|
% Function calls with no parentheses
|
||||||
|
|
||||||
|
call_args_no_parens_expr -> matched_expr : '$1'.
|
||||||
|
call_args_no_parens_expr -> no_parens_expr : throw_no_parens_many_strict('$1').
|
||||||
|
|
||||||
|
call_args_no_parens_comma_expr -> matched_expr ',' call_args_no_parens_expr : ['$3', '$1'].
|
||||||
|
call_args_no_parens_comma_expr -> call_args_no_parens_comma_expr ',' call_args_no_parens_expr : ['$3'|'$1'].
|
||||||
|
|
||||||
|
call_args_no_parens_all -> call_args_no_parens_one : '$1'.
|
||||||
|
call_args_no_parens_all -> call_args_no_parens_ambig : '$1'.
|
||||||
|
call_args_no_parens_all -> call_args_no_parens_many : '$1'.
|
||||||
|
|
||||||
|
call_args_no_parens_one -> call_args_no_parens_kw : ['$1'].
|
||||||
|
call_args_no_parens_one -> matched_expr : ['$1'].
|
||||||
|
|
||||||
|
call_args_no_parens_ambig -> no_parens_expr : ['$1'].
|
||||||
|
|
||||||
|
call_args_no_parens_many -> matched_expr ',' call_args_no_parens_kw : ['$1', '$3'].
|
||||||
|
call_args_no_parens_many -> call_args_no_parens_comma_expr : reverse('$1').
|
||||||
|
call_args_no_parens_many -> call_args_no_parens_comma_expr ',' call_args_no_parens_kw : reverse(['$3'|'$1']).
|
||||||
|
|
||||||
|
call_args_no_parens_many_strict -> call_args_no_parens_many : '$1'.
|
||||||
|
call_args_no_parens_many_strict -> open_paren call_args_no_parens_kw close_paren : throw_no_parens_strict('$1').
|
||||||
|
call_args_no_parens_many_strict -> open_paren call_args_no_parens_many close_paren : throw_no_parens_strict('$1').
|
||||||
|
|
||||||
|
stab_parens_many -> open_paren call_args_no_parens_kw close_paren : ['$2'].
|
||||||
|
stab_parens_many -> open_paren call_args_no_parens_many close_paren : '$2'.
|
||||||
|
|
||||||
|
% Containers
|
||||||
|
|
||||||
|
container_expr -> matched_expr : '$1'.
|
||||||
|
container_expr -> unmatched_expr : '$1'.
|
||||||
|
container_expr -> no_parens_expr : throw_no_parens_container_strict('$1').
|
||||||
|
|
||||||
|
container_args_base -> container_expr : ['$1'].
|
||||||
|
container_args_base -> container_args_base ',' container_expr : ['$3'|'$1'].
|
||||||
|
|
||||||
|
container_args -> container_args_base : lists:reverse('$1').
|
||||||
|
container_args -> container_args_base ',' : lists:reverse('$1').
|
||||||
|
container_args -> container_args_base ',' kw : lists:reverse(['$3'|'$1']).
|
||||||
|
|
||||||
|
% Function calls with parentheses
|
||||||
|
|
||||||
|
call_args_parens_expr -> matched_expr : '$1'.
|
||||||
|
call_args_parens_expr -> unmatched_expr : '$1'.
|
||||||
|
call_args_parens_expr -> no_parens_expr : throw_no_parens_many_strict('$1').
|
||||||
|
|
||||||
|
call_args_parens_base -> call_args_parens_expr : ['$1'].
|
||||||
|
call_args_parens_base -> call_args_parens_base ',' call_args_parens_expr : ['$3'|'$1'].
|
||||||
|
|
||||||
|
call_args_parens -> empty_paren : [].
|
||||||
|
call_args_parens -> open_paren no_parens_expr close_paren : ['$2'].
|
||||||
|
call_args_parens -> open_paren kw close_paren : ['$2'].
|
||||||
|
call_args_parens -> open_paren call_args_parens_base close_paren : reverse('$2').
|
||||||
|
call_args_parens -> open_paren call_args_parens_base ',' kw close_paren : reverse(['$4'|'$2']).
|
||||||
|
|
||||||
|
% KV
|
||||||
|
|
||||||
|
kw_eol -> kw_identifier : ?exprs('$1').
|
||||||
|
kw_eol -> kw_identifier eol : ?exprs('$1').
|
||||||
|
kw_eol -> kw_identifier_safe : build_quoted_atom('$1', true).
|
||||||
|
kw_eol -> kw_identifier_safe eol : build_quoted_atom('$1', true).
|
||||||
|
kw_eol -> kw_identifier_unsafe : build_quoted_atom('$1', false).
|
||||||
|
kw_eol -> kw_identifier_unsafe eol : build_quoted_atom('$1', false).
|
||||||
|
|
||||||
|
kw_base -> kw_eol container_expr : [{'$1', '$2'}].
|
||||||
|
kw_base -> kw_base ',' kw_eol container_expr : [{'$3', '$4'}|'$1'].
|
||||||
|
|
||||||
|
kw -> kw_base : reverse('$1').
|
||||||
|
kw -> kw_base ',' : reverse('$1').
|
||||||
|
|
||||||
|
call_args_no_parens_kw_expr -> kw_eol matched_expr : {'$1', '$2'}.
|
||||||
|
call_args_no_parens_kw_expr -> kw_eol no_parens_expr : {'$1', '$2'}.
|
||||||
|
|
||||||
|
call_args_no_parens_kw -> call_args_no_parens_kw_expr : ['$1'].
|
||||||
|
call_args_no_parens_kw -> call_args_no_parens_kw_expr ',' call_args_no_parens_kw : ['$1'|'$3'].
|
||||||
|
|
||||||
|
% Lists
|
||||||
|
|
||||||
|
list_args -> kw : '$1'.
|
||||||
|
list_args -> container_args_base : reverse('$1').
|
||||||
|
list_args -> container_args_base ',' : reverse('$1').
|
||||||
|
list_args -> container_args_base ',' kw : reverse('$1', '$3').
|
||||||
|
|
||||||
|
list -> open_bracket ']' : build_list('$1', []).
|
||||||
|
list -> open_bracket list_args close_bracket : build_list('$1', '$2').
|
||||||
|
|
||||||
|
% Tuple
|
||||||
|
|
||||||
|
tuple -> open_curly '}' : build_tuple('$1', []).
|
||||||
|
tuple -> open_curly container_args close_curly : build_tuple('$1', '$2').
|
||||||
|
|
||||||
|
% Bitstrings
|
||||||
|
|
||||||
|
bit_string -> open_bit '>>' : build_bit('$1', []).
|
||||||
|
bit_string -> open_bit container_args close_bit : build_bit('$1', '$2').
|
||||||
|
|
||||||
|
% Map and structs
|
||||||
|
|
||||||
|
%% Allow unquote/@something/aliases inside maps and structs.
|
||||||
|
map_expr -> max_expr : '$1'.
|
||||||
|
map_expr -> dot_identifier : build_identifier('$1', nil).
|
||||||
|
map_expr -> at_op_eol map_expr : build_unary_op('$1', '$2').
|
||||||
|
|
||||||
|
assoc_op_eol -> assoc_op : '$1'.
|
||||||
|
assoc_op_eol -> assoc_op eol : '$1'.
|
||||||
|
|
||||||
|
assoc_expr -> matched_expr assoc_op_eol matched_expr : {'$1', '$3'}.
|
||||||
|
assoc_expr -> unmatched_expr assoc_op_eol unmatched_expr : {'$1', '$3'}.
|
||||||
|
assoc_expr -> matched_expr assoc_op_eol unmatched_expr : {'$1', '$3'}.
|
||||||
|
assoc_expr -> unmatched_expr assoc_op_eol matched_expr : {'$1', '$3'}.
|
||||||
|
assoc_expr -> map_expr : '$1'.
|
||||||
|
|
||||||
|
assoc_update -> matched_expr pipe_op_eol assoc_expr : {'$2', '$1', ['$3']}.
|
||||||
|
assoc_update -> unmatched_expr pipe_op_eol assoc_expr : {'$2', '$1', ['$3']}.
|
||||||
|
|
||||||
|
assoc_update_kw -> matched_expr pipe_op_eol kw : {'$2', '$1', '$3'}.
|
||||||
|
assoc_update_kw -> unmatched_expr pipe_op_eol kw : {'$2', '$1', '$3'}.
|
||||||
|
|
||||||
|
assoc_base -> assoc_expr : ['$1'].
|
||||||
|
assoc_base -> assoc_base ',' assoc_expr : ['$3'|'$1'].
|
||||||
|
|
||||||
|
assoc -> assoc_base : reverse('$1').
|
||||||
|
assoc -> assoc_base ',' : reverse('$1').
|
||||||
|
|
||||||
|
map_op -> '%{}' : '$1'.
|
||||||
|
map_op -> '%{}' eol : '$1'.
|
||||||
|
|
||||||
|
map_close -> kw close_curly : '$1'.
|
||||||
|
map_close -> assoc close_curly : '$1'.
|
||||||
|
map_close -> assoc_base ',' kw close_curly : reverse('$1', '$3').
|
||||||
|
|
||||||
|
map_args -> open_curly '}' : build_map('$1', []).
|
||||||
|
map_args -> open_curly map_close : build_map('$1', '$2').
|
||||||
|
map_args -> open_curly assoc_update close_curly : build_map_update('$1', '$2', []).
|
||||||
|
map_args -> open_curly assoc_update ',' close_curly : build_map_update('$1', '$2', []).
|
||||||
|
map_args -> open_curly assoc_update ',' map_close : build_map_update('$1', '$2', '$4').
|
||||||
|
map_args -> open_curly assoc_update_kw close_curly : build_map_update('$1', '$2', []).
|
||||||
|
|
||||||
|
struct_op -> '%' : '$1'.
|
||||||
|
|
||||||
|
map -> map_op map_args : '$2'.
|
||||||
|
map -> struct_op map_expr map_args : {'%', meta_from_token('$1'), ['$2', '$3']}.
|
||||||
|
map -> struct_op map_expr eol map_args : {'%', meta_from_token('$1'), ['$2', '$4']}.
|
||||||
|
|
||||||
|
Erlang code.
|
||||||
|
|
||||||
|
-define(file(), get(elixir_parser_file)).
|
||||||
|
-define(id(Token), element(1, Token)).
|
||||||
|
-define(location(Token), element(2, Token)).
|
||||||
|
-define(exprs(Token), element(3, Token)).
|
||||||
|
-define(meta(Node), element(2, Node)).
|
||||||
|
-define(rearrange_uop(Op), (Op == 'not' orelse Op == '!')).
|
||||||
|
|
||||||
|
%% The following directive is needed for (significantly) faster
|
||||||
|
%% compilation of the generated .erl file by the HiPE compiler
|
||||||
|
-compile([{hipe, [{regalloc, linear_scan}]}]).
|
||||||
|
-import(lists, [reverse/1, reverse/2]).
|
||||||
|
|
||||||
|
meta_from_token(Token, Counter) -> [{counter, Counter}|meta_from_token(Token)].
|
||||||
|
meta_from_token(Token) -> meta_from_location(?location(Token)).
|
||||||
|
|
||||||
|
meta_from_location({Line, Column, EndColumn})
|
||||||
|
when is_integer(Line), is_integer(Column), is_integer(EndColumn) -> [{line, Line}].
|
||||||
|
|
||||||
|
%% Operators
|
||||||
|
|
||||||
|
build_op({_Kind, Location, 'in'}, {UOp, _, [Left]}, Right) when ?rearrange_uop(UOp) ->
|
||||||
|
{UOp, meta_from_location(Location), [{'in', meta_from_location(Location), [Left, Right]}]};
|
||||||
|
|
||||||
|
build_op({_Kind, Location, Op}, Left, Right) ->
|
||||||
|
{Op, meta_from_location(Location), [Left, Right]}.
|
||||||
|
|
||||||
|
build_unary_op({_Kind, Location, Op}, Expr) ->
|
||||||
|
{Op, meta_from_location(Location), [Expr]}.
|
||||||
|
|
||||||
|
build_list(Marker, Args) ->
|
||||||
|
{Args, ?location(Marker)}.
|
||||||
|
|
||||||
|
build_tuple(_Marker, [Left, Right]) ->
|
||||||
|
{Left, Right};
|
||||||
|
build_tuple(Marker, Args) ->
|
||||||
|
{'{}', meta_from_token(Marker), Args}.
|
||||||
|
|
||||||
|
build_bit(Marker, Args) ->
|
||||||
|
{'<<>>', meta_from_token(Marker), Args}.
|
||||||
|
|
||||||
|
build_map(Marker, Args) ->
|
||||||
|
{'%{}', meta_from_token(Marker), Args}.
|
||||||
|
|
||||||
|
build_map_update(Marker, {Pipe, Left, Right}, Extra) ->
|
||||||
|
{'%{}', meta_from_token(Marker), [build_op(Pipe, Left, Right ++ Extra)]}.
|
||||||
|
|
||||||
|
%% Blocks
|
||||||
|
|
||||||
|
build_block([{Op, _, [_]}]=Exprs) when ?rearrange_uop(Op) -> {'__block__', [], Exprs};
|
||||||
|
build_block([{unquote_splicing, _, Args}]=Exprs) when
|
||||||
|
length(Args) =< 2 -> {'__block__', [], Exprs};
|
||||||
|
build_block([Expr]) -> Expr;
|
||||||
|
build_block(Exprs) -> {'__block__', [], Exprs}.
|
||||||
|
|
||||||
|
%% Dots
|
||||||
|
|
||||||
|
build_dot_alias(Dot, {'__aliases__', _, Left}, {'aliases', _, Right}) ->
|
||||||
|
{'__aliases__', meta_from_token(Dot), Left ++ Right};
|
||||||
|
|
||||||
|
build_dot_alias(_Dot, Atom, {'aliases', _, _} = Token) when is_atom(Atom) ->
|
||||||
|
throw_bad_atom(Token);
|
||||||
|
|
||||||
|
build_dot_alias(Dot, Other, {'aliases', _, Right}) ->
|
||||||
|
{'__aliases__', meta_from_token(Dot), [Other|Right]}.
|
||||||
|
|
||||||
|
build_dot_container(Dot, Left, Right) ->
|
||||||
|
Meta = meta_from_token(Dot),
|
||||||
|
{{'.', Meta, [Left, '{}']}, Meta, Right}.
|
||||||
|
|
||||||
|
build_dot(Dot, Left, Right) ->
|
||||||
|
{'.', meta_from_token(Dot), [Left, extract_identifier(Right)]}.
|
||||||
|
|
||||||
|
extract_identifier({Kind, _, Identifier}) when
|
||||||
|
Kind == identifier; Kind == bracket_identifier; Kind == paren_identifier;
|
||||||
|
Kind == do_identifier; Kind == op_identifier ->
|
||||||
|
Identifier.
|
||||||
|
|
||||||
|
%% Identifiers
|
||||||
|
|
||||||
|
build_nested_parens(Dot, Args1, Args2) ->
|
||||||
|
Identifier = build_identifier(Dot, Args1),
|
||||||
|
Meta = ?meta(Identifier),
|
||||||
|
{Identifier, Meta, Args2}.
|
||||||
|
|
||||||
|
build_identifier({'.', Meta, _} = Dot, Args) ->
|
||||||
|
FArgs = case Args of
|
||||||
|
nil -> [];
|
||||||
|
_ -> Args
|
||||||
|
end,
|
||||||
|
{Dot, Meta, FArgs};
|
||||||
|
|
||||||
|
build_identifier({op_identifier, Location, Identifier}, [Arg]) ->
|
||||||
|
{Identifier, [{ambiguous_op, nil}|meta_from_location(Location)], [Arg]};
|
||||||
|
|
||||||
|
build_identifier({_, Location, Identifier}, Args) ->
|
||||||
|
{Identifier, meta_from_location(Location), Args}.
|
||||||
|
|
||||||
|
%% Fn
|
||||||
|
|
||||||
|
build_fn(Op, [{'->', _, [_, _]}|_] = Stab) ->
|
||||||
|
{fn, meta_from_token(Op), build_stab(Stab)};
|
||||||
|
build_fn(Op, _Stab) ->
|
||||||
|
throw(meta_from_token(Op), "expected clauses to be defined with -> inside: ", "'fn'").
|
||||||
|
|
||||||
|
%% Access
|
||||||
|
|
||||||
|
build_access(Expr, {List, Location}) ->
|
||||||
|
Meta = meta_from_location(Location),
|
||||||
|
{{'.', Meta, ['Elixir.Access', get]}, Meta, [Expr, List]}.
|
||||||
|
|
||||||
|
%% Interpolation aware
|
||||||
|
|
||||||
|
build_sigil({sigil, Location, Sigil, Parts, Modifiers}) ->
|
||||||
|
Meta = meta_from_location(Location),
|
||||||
|
{list_to_atom("sigil_" ++ [Sigil]), Meta, [{'<<>>', Meta, string_parts(Parts)}, Modifiers]}.
|
||||||
|
|
||||||
|
build_bin_string({bin_string, _Location, [H]}) when is_binary(H) ->
|
||||||
|
H;
|
||||||
|
build_bin_string({bin_string, Location, Args}) ->
|
||||||
|
{'<<>>', meta_from_location(Location), string_parts(Args)}.
|
||||||
|
|
||||||
|
build_list_string({list_string, _Location, [H]}) when is_binary(H) ->
|
||||||
|
elixir_utils:characters_to_list(H);
|
||||||
|
build_list_string({list_string, Location, Args}) ->
|
||||||
|
Meta = meta_from_location(Location),
|
||||||
|
{{'.', Meta, ['Elixir.String', to_char_list]}, Meta, [{'<<>>', Meta, string_parts(Args)}]}.
|
||||||
|
|
||||||
|
build_quoted_atom({_, _Location, [H]}, Safe) when is_binary(H) ->
|
||||||
|
Op = binary_to_atom_op(Safe), erlang:Op(H, utf8);
|
||||||
|
build_quoted_atom({_, Location, Args}, Safe) ->
|
||||||
|
Meta = meta_from_location(Location),
|
||||||
|
{{'.', Meta, [erlang, binary_to_atom_op(Safe)]}, Meta, [{'<<>>', Meta, string_parts(Args)}, utf8]}.
|
||||||
|
|
||||||
|
binary_to_atom_op(true) -> binary_to_existing_atom;
|
||||||
|
binary_to_atom_op(false) -> binary_to_atom.
|
||||||
|
|
||||||
|
string_parts(Parts) ->
|
||||||
|
[string_part(Part) || Part <- Parts].
|
||||||
|
string_part(Binary) when is_binary(Binary) ->
|
||||||
|
Binary;
|
||||||
|
string_part({Location, Tokens}) ->
|
||||||
|
Form = string_tokens_parse(Tokens),
|
||||||
|
Meta = meta_from_location(Location),
|
||||||
|
{'::', Meta, [{{'.', Meta, ['Elixir.Kernel', to_string]}, Meta, [Form]}, {binary, Meta, nil}]}.
|
||||||
|
|
||||||
|
string_tokens_parse(Tokens) ->
|
||||||
|
case parse(Tokens) of
|
||||||
|
{ok, Forms} -> Forms;
|
||||||
|
{error, _} = Error -> throw(Error)
|
||||||
|
end.
|
||||||
|
|
||||||
|
%% Keywords
|
||||||
|
|
||||||
|
build_stab([{'->', Meta, [Left, Right]}|T]) ->
|
||||||
|
build_stab(Meta, T, Left, [Right], []);
|
||||||
|
|
||||||
|
build_stab(Else) ->
|
||||||
|
build_block(Else).
|
||||||
|
|
||||||
|
build_stab(Old, [{'->', New, [Left, Right]}|T], Marker, Temp, Acc) ->
|
||||||
|
H = {'->', Old, [Marker, build_block(reverse(Temp))]},
|
||||||
|
build_stab(New, T, Left, [Right], [H|Acc]);
|
||||||
|
|
||||||
|
build_stab(Meta, [H|T], Marker, Temp, Acc) ->
|
||||||
|
build_stab(Meta, T, Marker, [H|Temp], Acc);
|
||||||
|
|
||||||
|
build_stab(Meta, [], Marker, Temp, Acc) ->
|
||||||
|
H = {'->', Meta, [Marker, build_block(reverse(Temp))]},
|
||||||
|
reverse([H|Acc]).
|
||||||
|
|
||||||
|
%% Every time the parser sees a (unquote_splicing())
|
||||||
|
%% it assumes that a block is being spliced, wrapping
|
||||||
|
%% the splicing in a __block__. But in the stab clause,
|
||||||
|
%% we can have (unquote_splicing(1, 2, 3)) -> :ok, in such
|
||||||
|
%% case, we don't actually want the block, since it is
|
||||||
|
%% an arg style call. unwrap_splice unwraps the splice
|
||||||
|
%% from such blocks.
|
||||||
|
unwrap_splice([{'__block__', [], [{unquote_splicing, _, _}] = Splice}]) ->
|
||||||
|
Splice;
|
||||||
|
|
||||||
|
unwrap_splice(Other) -> Other.
|
||||||
|
|
||||||
|
unwrap_when(Args) ->
|
||||||
|
case elixir_utils:split_last(Args) of
|
||||||
|
{Start, {'when', Meta, [_, _] = End}} ->
|
||||||
|
[{'when', Meta, Start ++ End}];
|
||||||
|
{_, _} ->
|
||||||
|
Args
|
||||||
|
end.
|
||||||
|
|
||||||
|
to_block([One]) -> One;
|
||||||
|
to_block(Other) -> {'__block__', [], reverse(Other)}.
|
||||||
|
|
||||||
|
%% Warnings and errors
|
||||||
|
|
||||||
|
throw(Meta, Error, Token) ->
|
||||||
|
Line =
|
||||||
|
case lists:keyfind(line, 1, Meta) of
|
||||||
|
{line, L} -> L;
|
||||||
|
false -> 0
|
||||||
|
end,
|
||||||
|
throw({error, {Line, ?MODULE, [Error, Token]}}).
|
||||||
|
|
||||||
|
throw_bad_atom(Token) ->
|
||||||
|
throw(meta_from_token(Token), "atom cannot be followed by an alias. If the '.' was meant to be "
|
||||||
|
"part of the atom's name, the atom name must be quoted. Syntax error before: ", "'.'").
|
||||||
|
|
||||||
|
throw_no_parens_strict(Token) ->
|
||||||
|
throw(meta_from_token(Token), "unexpected parentheses. If you are making a "
|
||||||
|
"function call, do not insert spaces between the function name and the "
|
||||||
|
"opening parentheses. Syntax error before: ", "'('").
|
||||||
|
|
||||||
|
throw_no_parens_many_strict(Node) ->
|
||||||
|
throw(?meta(Node),
|
||||||
|
"unexpected comma. Parentheses are required to solve ambiguity in nested calls.\n\n"
|
||||||
|
"This error happens when you have nested function calls without parentheses. "
|
||||||
|
"For example:\n\n"
|
||||||
|
" one a, two b, c, d\n\n"
|
||||||
|
"In the example above, we don't know if the parameters \"c\" and \"d\" apply "
|
||||||
|
"to the function \"one\" or \"two\". You can solve this by explicitly adding "
|
||||||
|
"parentheses:\n\n"
|
||||||
|
" one a, two(b, c, d)\n\n"
|
||||||
|
"Elixir cannot compile otherwise. Syntax error before: ", "','").
|
||||||
|
|
||||||
|
throw_no_parens_container_strict(Node) ->
|
||||||
|
throw(?meta(Node),
|
||||||
|
"unexpected comma. Parentheses are required to solve ambiguity inside containers.\n\n"
|
||||||
|
"This error may happen when you forget a comma in a list or other container:\n\n"
|
||||||
|
" [a, b c, d]\n\n"
|
||||||
|
"Or when you have ambiguous calls:\n\n"
|
||||||
|
" [one, two three, four, five]\n\n"
|
||||||
|
"In the example above, we don't know if the parameters \"four\" and \"five\" "
|
||||||
|
"belongs to the list or the function \"two\". You can solve this by explicitly "
|
||||||
|
"adding parentheses:\n\n"
|
||||||
|
" [one, two(three, four), five]\n\n"
|
||||||
|
"Elixir cannot compile otherwise. Syntax error before: ", "','").
|
||||||
|
|
||||||
|
throw_invalid_kw_identifier({_, _, do} = Token) ->
|
||||||
|
throw(meta_from_token(Token), elixir_tokenizer:invalid_do_error("unexpected keyword \"do:\""), "'do:'");
|
||||||
|
throw_invalid_kw_identifier({_, _, KW} = Token) ->
|
||||||
|
throw(meta_from_token(Token), "syntax error before: ", "'" ++ atom_to_list(KW) ++ "':").
|
||||||
|
|
||||||
|
%% TODO: Make those warnings errors.
|
||||||
|
warn_empty_stab_clause({stab_op, {Line, _Begin, _End}, '->'}) ->
|
||||||
|
elixir_errors:warn(Line, ?file(),
|
||||||
|
"an expression is always required on the right side of ->. "
|
||||||
|
"Please provide a value after ->").
|
||||||
|
|
||||||
|
warn_pipe({arrow_op, {Line, _Begin, _End}, Op}, {_, [_|_], [_|_]}) ->
|
||||||
|
elixir_errors:warn(Line, ?file(),
|
||||||
|
io_lib:format(
|
||||||
|
"you are piping into a function call without parentheses, which may be ambiguous. "
|
||||||
|
"Please wrap the function you are piping into in parentheses. For example:\n\n"
|
||||||
|
" foo 1 ~ts bar 2 ~ts baz 3\n\n"
|
||||||
|
"Should be written as:\n\n"
|
||||||
|
" foo(1) ~ts bar(2) ~ts baz(3)\n",
|
||||||
|
[Op, Op, Op, Op]
|
||||||
|
)
|
||||||
|
);
|
||||||
|
warn_pipe(_Token, _) ->
|
||||||
|
ok.
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user