mirror of
https://github.com/KevinMidboe/linguist.git
synced 2025-10-29 17:50:22 +00:00
Compare commits
156 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ee9cc24e52 | ||
|
|
0584fbf42b | ||
|
|
0239127db4 | ||
|
|
281d1ea91c | ||
|
|
df92ecaa55 | ||
|
|
60d40c8ad8 | ||
|
|
f428c561c9 | ||
|
|
8fbb7a1d93 | ||
|
|
e98223b2b3 | ||
|
|
410fe2843d | ||
|
|
dc8d69e0f4 | ||
|
|
a056765e38 | ||
|
|
4e7da98bfa | ||
|
|
0a56f5282d | ||
|
|
04b9ca2fd4 | ||
|
|
ddbe3df6de | ||
|
|
ab5c88a7f3 | ||
|
|
4046a0efe9 | ||
|
|
5aefc7cdff | ||
|
|
70eb779ce5 | ||
|
|
39f5d28348 | ||
|
|
e70407f16b | ||
|
|
c25475296d | ||
|
|
e97b7454e9 | ||
|
|
735caa03b1 | ||
|
|
f577aece08 | ||
|
|
b7f1bfdb92 | ||
|
|
b5301e280b | ||
|
|
741816db52 | ||
|
|
546a6e2a68 | ||
|
|
1be5e8c63e | ||
|
|
917a25317a | ||
|
|
949167e6ad | ||
|
|
a359905a06 | ||
|
|
4ce606306d | ||
|
|
707fcd29ea | ||
|
|
a5e6d37049 | ||
|
|
dacac135fb | ||
|
|
0ddf0d5d0d | ||
|
|
a97c69e06f | ||
|
|
79243b77fd | ||
|
|
5ab2720ddc | ||
|
|
c72a49b77f | ||
|
|
a0d92b80df | ||
|
|
1a32a6252b | ||
|
|
6df7cbaf6e | ||
|
|
0a90cd3a0a | ||
|
|
c529939481 | ||
|
|
db70630eaa | ||
|
|
24862d9759 | ||
|
|
cb5f2685cd | ||
|
|
baa298873a | ||
|
|
a8f57d37bf | ||
|
|
d97ee52f4e | ||
|
|
1cfdb6decd | ||
|
|
f93272f0bd | ||
|
|
e783e953d9 | ||
|
|
39cac919c7 | ||
|
|
fec82173d9 | ||
|
|
35efed73d4 | ||
|
|
21b8e16afc | ||
|
|
6efee51101 | ||
|
|
1490425ecb | ||
|
|
afac6a918d | ||
|
|
bf0e488c06 | ||
|
|
37c2bee3ae | ||
|
|
4debcabb88 | ||
|
|
5a0c637ad0 | ||
|
|
d91215680a | ||
|
|
0cbcbd4614 | ||
|
|
19135f08c3 | ||
|
|
855cc52f0f | ||
|
|
4e5da23474 | ||
|
|
3cca4ec0ac | ||
|
|
e393f7feb4 | ||
|
|
b76ac7bab0 | ||
|
|
a3c842ba18 | ||
|
|
1640370c9d | ||
|
|
b6427fa05a | ||
|
|
2a04d854cc | ||
|
|
6d190d7d7c | ||
|
|
b8a2bd595a | ||
|
|
8b7d5546f7 | ||
|
|
299a9c7bc9 | ||
|
|
37f8d5b5e1 | ||
|
|
2a6a59c047 | ||
|
|
583392d179 | ||
|
|
1488796779 | ||
|
|
7458a2f9ff | ||
|
|
348dab4b9f | ||
|
|
5c824e0771 | ||
|
|
b9c88a758c | ||
|
|
d002dfa70c | ||
|
|
d118017d27 | ||
|
|
d10d328eb1 | ||
|
|
e472d7b8b1 | ||
|
|
a54d6f3a8a | ||
|
|
ad778571a2 | ||
|
|
bb12b86445 | ||
|
|
ab61b06c34 | ||
|
|
de6b2f3307 | ||
|
|
5fd56c75d5 | ||
|
|
93186947c2 | ||
|
|
77444284e3 | ||
|
|
a1f26d64d5 | ||
|
|
3aec4dd2ea | ||
|
|
81b8c57bae | ||
|
|
0780b7239a | ||
|
|
1d626f7378 | ||
|
|
ff3438b810 | ||
|
|
1762c2cefd | ||
|
|
7aaf99c9b1 | ||
|
|
07cd9aa994 | ||
|
|
6ae4aa50e2 | ||
|
|
22fbcc244b | ||
|
|
1a3177409c | ||
|
|
de4b538d82 | ||
|
|
70b1ec97db | ||
|
|
a97e328484 | ||
|
|
e446b86b90 | ||
|
|
901e8da911 | ||
|
|
e9036d675e | ||
|
|
351e348ac0 | ||
|
|
feea9bfd30 | ||
|
|
f1282b857d | ||
|
|
70e0ce1d73 | ||
|
|
a5673e7fb6 | ||
|
|
d06529fd14 | ||
|
|
a02f19f5a3 | ||
|
|
a9a62fff15 | ||
|
|
7625c92307 | ||
|
|
7dd318ca76 | ||
|
|
e5bc2845cd | ||
|
|
4ddd8d9d2b | ||
|
|
37ffdb9020 | ||
|
|
dce00d01d9 | ||
|
|
768ec76ff0 | ||
|
|
8c841903a5 | ||
|
|
d4888098e5 | ||
|
|
a349daeaeb | ||
|
|
7a57a0b594 | ||
|
|
66eabd8bdc | ||
|
|
be82b55408 | ||
|
|
526ca1761a | ||
|
|
8655d966ad | ||
|
|
3fb4973aab | ||
|
|
1d4149168d | ||
|
|
26ab33754f | ||
|
|
4603f3b2e7 | ||
|
|
9d6b8b4715 | ||
|
|
897c2c5ab6 | ||
|
|
f3d654a965 | ||
|
|
bde19a76cc | ||
|
|
49ebf4b303 | ||
|
|
0017310dd1 | ||
|
|
81d9c682da |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -4,3 +4,4 @@ benchmark/
|
||||
lib/linguist/samples.json
|
||||
/grammars
|
||||
/node_modules
|
||||
test/fixtures/ace_modes.json
|
||||
|
||||
@@ -10,7 +10,7 @@ This can usually be solved either by adding a new filename or file name extensio
|
||||
|
||||
### Syntax highlighting looks wrong
|
||||
|
||||
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.
|
||||
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.
|
||||
|
||||
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).
|
||||
|
||||
|
||||
19
Rakefile
19
Rakefile
@@ -3,13 +3,14 @@ require 'rake/clean'
|
||||
require 'rake/testtask'
|
||||
require 'yaml'
|
||||
require 'yajl'
|
||||
require 'open-uri'
|
||||
|
||||
task :default => :test
|
||||
|
||||
Rake::TestTask.new
|
||||
|
||||
# Extend test task to check for samples
|
||||
task :test => :check_samples
|
||||
# Extend test task to check for samples and fetch latest Ace modes
|
||||
task :test => [:check_samples, :fetch_ace_modes]
|
||||
|
||||
desc "Check that we have samples.json generated"
|
||||
task :check_samples do
|
||||
@@ -18,6 +19,20 @@ task :check_samples do
|
||||
end
|
||||
end
|
||||
|
||||
desc "Fetch the latest Ace modes from its GitHub repository"
|
||||
task :fetch_ace_modes do
|
||||
ACE_FIXTURE_PATH = File.join('test', 'fixtures', 'ace_modes.json')
|
||||
|
||||
File.delete(ACE_FIXTURE_PATH) if File.exist?(ACE_FIXTURE_PATH)
|
||||
|
||||
begin
|
||||
ace_github_modes = open("https://api.github.com/repos/ajaxorg/ace/contents/lib/ace/mode").read
|
||||
File.write(ACE_FIXTURE_PATH, ace_github_modes)
|
||||
rescue OpenURI::HTTPError, SocketError
|
||||
# no internet? no problem.
|
||||
end
|
||||
end
|
||||
|
||||
task :samples do
|
||||
require 'linguist/samples'
|
||||
json = Yajl.dump(Linguist::Samples.data, :pretty => true)
|
||||
|
||||
75
grammars.yml
75
grammars.yml
@@ -9,8 +9,6 @@ http://svn.textmate.org/trunk/Review/Bundles/Forth.tmbundle:
|
||||
- source.forth
|
||||
http://svn.textmate.org/trunk/Review/Bundles/Parrot.tmbundle:
|
||||
- source.parrot.pir
|
||||
http://svn.textmate.org/trunk/Review/Bundles/Ruby%20Sass.tmbundle:
|
||||
- source.sass
|
||||
http://svn.textmate.org/trunk/Review/Bundles/SecondLife%20LSL.tmbundle:
|
||||
- source.lsl
|
||||
http://svn.textmate.org/trunk/Review/Bundles/VHDL.tmbundle:
|
||||
@@ -28,13 +26,13 @@ https://github.com/AlanQuatermain/go-tmbundle:
|
||||
- source.go
|
||||
https://github.com/Anomareh/PHP-Twig.tmbundle:
|
||||
- text.html.twig
|
||||
https://github.com/Cirru/sublime-cirru/raw/master/Cirru.tmLanguage:
|
||||
https://github.com/Cirru/sublime-cirru:
|
||||
- source.cirru
|
||||
https://github.com/Cykey/Sublime-Logos:
|
||||
- source.logos
|
||||
https://github.com/Drako/SublimeBrainfuck/raw/master/Brainfuck.tmLanguage:
|
||||
https://github.com/Drako/SublimeBrainfuck:
|
||||
- source.bf
|
||||
https://github.com/JohnNilsson/awk-sublime/raw/master/AWK.tmLanguage:
|
||||
https://github.com/JohnNilsson/awk-sublime:
|
||||
- source.awk
|
||||
https://github.com/JonBons/Sublime-SQF-Language:
|
||||
- source.sqf
|
||||
@@ -48,7 +46,7 @@ https://github.com/Red-Nova-Technologies/autoitv3-tmbundle:
|
||||
- source.autoit.3
|
||||
https://github.com/SalGnt/Sublime-VimL:
|
||||
- source.viml
|
||||
https://github.com/Shammah/boo-sublime/raw/master/Boo.tmLanguage:
|
||||
https://github.com/Shammah/boo-sublime:
|
||||
- source.boo
|
||||
https://github.com/SublimeText/ColdFusion:
|
||||
- source.cfscript
|
||||
@@ -76,6 +74,8 @@ https://github.com/aroben/ruby.tmbundle@4636a3023153c3034eb6ffc613899ba9cf33b41f
|
||||
- text.html.erb
|
||||
https://github.com/asbjornenge/Docker.tmbundle:
|
||||
- source.dockerfile
|
||||
https://github.com/atmarksharp/jasmin-sublime:
|
||||
- source.jasmin
|
||||
https://github.com/atom/language-clojure:
|
||||
- source.clojure
|
||||
https://github.com/atom/language-coffee-script:
|
||||
@@ -85,6 +85,8 @@ https://github.com/atom/language-csharp:
|
||||
- source.cs
|
||||
- source.csx
|
||||
- source.nant-build
|
||||
https://github.com/atom/language-gfm:
|
||||
- source.gfm
|
||||
https://github.com/atom/language-javascript:
|
||||
- source.js
|
||||
- source.js.regexp
|
||||
@@ -92,9 +94,14 @@ https://github.com/atom/language-python:
|
||||
- source.python
|
||||
- source.regexp.python
|
||||
- text.python.traceback
|
||||
https://github.com/atom/language-sass:
|
||||
- source.css.scss
|
||||
- source.sass
|
||||
https://github.com/atom/language-shellscript:
|
||||
- source.shell
|
||||
- text.shell-session
|
||||
https://github.com/atom/language-yaml:
|
||||
- source.yaml
|
||||
https://github.com/austinwagner/sublime-sourcepawn:
|
||||
- source.sp
|
||||
https://github.com/bfad/Sublime-Lasso:
|
||||
@@ -105,7 +112,8 @@ https://github.com/brandonwamboldt/sublime-nginx:
|
||||
- source.nginx
|
||||
https://github.com/bro/bro-sublime:
|
||||
- source.bro
|
||||
https://github.com/carsonoid/sublime_man_page_support/raw/master/man-groff.tmLanguage:
|
||||
https://github.com/carsonoid/sublime_man_page_support:
|
||||
- source.man
|
||||
- text.groff
|
||||
https://github.com/ccreutzig/sublime-MuPAD:
|
||||
- source.mupad
|
||||
@@ -122,7 +130,7 @@ https://github.com/clemos/haxe-sublime-bundle:
|
||||
https://github.com/cucumber/cucumber-tmbundle:
|
||||
- source.ruby.rspec.cucumber.steps
|
||||
- text.gherkin.feature
|
||||
https://github.com/daaain/Handlebars/raw/master/Handlebars.tmLanguage:
|
||||
https://github.com/daaain/Handlebars:
|
||||
- text.html.handlebars
|
||||
https://github.com/davidpeckham/powershell.tmbundle:
|
||||
- source.powershell
|
||||
@@ -133,9 +141,12 @@ https://github.com/elixir-lang/elixir-tmbundle:
|
||||
- source.elixir
|
||||
- text.elixir
|
||||
- text.html.elixir
|
||||
https://github.com/eregon/oz-tmbundle/raw/master/Syntaxes/Oz.tmLanguage:
|
||||
- source.oz
|
||||
https://github.com/ericzou/ebundles/raw/master/Bundles/MSDOS%20batch%20file.tmbundle/Syntaxes/MSDOS%20batch%20file.tmLanguage:
|
||||
- source.dosbatch
|
||||
https://github.com/euler0/sublime-glsl/raw/master/GLSL.tmLanguage:
|
||||
https://github.com/euler0/sublime-glsl:
|
||||
- source.essl
|
||||
- source.glsl
|
||||
https://github.com/fancy-lang/fancy-tmbundle:
|
||||
- source.fancy
|
||||
@@ -143,33 +154,39 @@ https://github.com/fsharp/fsharpbinding:
|
||||
- source.fsharp
|
||||
https://github.com/gingerbeardman/monkey.tmbundle:
|
||||
- source.monkey
|
||||
https://github.com/guillermooo/dart-sublime-bundle/raw/master/Dart.tmLanguage:
|
||||
https://github.com/guillermooo/dart-sublime-bundle:
|
||||
- source.dart
|
||||
https://github.com/harrism/sublimetext-cuda-cpp/raw/master/cuda-c%2B%2B.tmLanguage:
|
||||
- source.pubspec
|
||||
- text.dart-doccomments
|
||||
https://github.com/harrism/sublimetext-cuda-cpp:
|
||||
- source.cuda-c++
|
||||
https://github.com/hww3/pike-textmate:
|
||||
- source.pike
|
||||
https://github.com/jeancharles-roger/ceylon-sublimetext/raw/master/Ceylon.tmLanguage:
|
||||
https://github.com/jeancharles-roger/ceylon-sublimetext:
|
||||
- module.ceylon
|
||||
- source.ceylon
|
||||
https://github.com/jfairbank/Sublime-Text-2-OpenEdge-ABL:
|
||||
- source.abl
|
||||
https://github.com/jhasse/sublime-rust:
|
||||
- source.rust
|
||||
https://github.com/johanasplund/sublime-befunge/raw/master/Befunge-93.tmLanguage:
|
||||
https://github.com/johanasplund/sublime-befunge:
|
||||
- source.befunge
|
||||
https://github.com/joshaven/RDoc.tmbundle:
|
||||
- text.rdoc
|
||||
https://github.com/jpcamara/Textmate-Gosu-Bundle/raw/master/Gosu.tmbundle/Syntaxes/Gosu.tmLanguage:
|
||||
https://github.com/jpcamara/Textmate-Gosu-Bundle:
|
||||
- source.gosu.2
|
||||
https://github.com/kswedberg/jquery-tmbundle:
|
||||
- source.js.jquery
|
||||
https://github.com/laughedelic/sublime-idris/raw/master/Idris.tmLanguage:
|
||||
https://github.com/l15n/fish-tmbundle:
|
||||
- source.fish
|
||||
https://github.com/laughedelic/sublime-idris:
|
||||
- source.idris
|
||||
https://github.com/lavrton/sublime-better-typescript:
|
||||
- source.ts
|
||||
https://github.com/leafo/moonscript-tmbundle:
|
||||
- source.moonscript
|
||||
https://github.com/lsf37/Isabelle.tmbundle:
|
||||
- source.isabelle.root
|
||||
- source.isabelle.theory
|
||||
https://github.com/lunixbochs/x86-assembly-textmate-bundle:
|
||||
- source.asm.x86
|
||||
@@ -190,14 +207,15 @@ https://github.com/mgalloy/idl.tmbundle:
|
||||
- text.idl-idldoc
|
||||
https://github.com/michaeledgar/protobuf-tmbundle:
|
||||
- source.protobuf
|
||||
https://github.com/mkolosick/Sublime-Coq/raw/master/Coq.tmLanguage:
|
||||
https://github.com/mkolosick/Sublime-Coq:
|
||||
- source.coq
|
||||
https://github.com/mokus0/Agda.tmbundle:
|
||||
- source.agda
|
||||
https://github.com/nanoant/Julia.tmbundle:
|
||||
- source.julia
|
||||
https://github.com/nanoant/assembly.tmbundle/raw/master/Syntaxes/objdump%20C%2B%2B.tmLanguage:
|
||||
https://github.com/nanoant/assembly.tmbundle:
|
||||
- objdump.x86asm
|
||||
- source.x86asm
|
||||
https://github.com/nilium/ooc.tmbundle:
|
||||
- source.ooc
|
||||
https://github.com/paulmillr/LiveScript.tmbundle:
|
||||
@@ -211,6 +229,8 @@ https://github.com/pvl/abap.tmbundle:
|
||||
https://github.com/scalate/Scalate.tmbundle:
|
||||
- source.scaml
|
||||
- text.html.ssp
|
||||
https://github.com/sebgod/mercury-tmlanguage:
|
||||
- source.mercury
|
||||
https://github.com/shadanan/mathematica-tmbundle:
|
||||
- source.mathematica
|
||||
https://github.com/shellderp/sublime-robot-plugin:
|
||||
@@ -223,8 +243,9 @@ https://github.com/skozlovf/Sublime-QML:
|
||||
- source.qml
|
||||
https://github.com/slash-lang/Slash.tmbundle:
|
||||
- text.html.slash
|
||||
https://github.com/slavapestov/factor/raw/master/misc/Factor.tmbundle/Syntaxes/Factor.tmLanguage:
|
||||
https://github.com/slavapestov/factor:
|
||||
- source.factor
|
||||
- text.html.factor
|
||||
https://github.com/slim-template/ruby-slim.tmbundle:
|
||||
- text.slim
|
||||
https://github.com/staltz/SublimeXtend:
|
||||
@@ -234,6 +255,8 @@ https://github.com/statatmbundle/Stata.tmbundle:
|
||||
- source.stata
|
||||
https://github.com/technosophos/Vala-TMBundle:
|
||||
- source.vala
|
||||
https://github.com/tenbits/sublime-mask/raw/release/Syntaxes/mask.tmLanguage:
|
||||
- source.mask
|
||||
https://github.com/textmate/ant.tmbundle:
|
||||
- text.xml.ant
|
||||
https://github.com/textmate/antlr.tmbundle:
|
||||
@@ -248,10 +271,6 @@ https://github.com/textmate/asp.tmbundle:
|
||||
- text.html.asp
|
||||
https://github.com/textmate/bison.tmbundle:
|
||||
- source.bison
|
||||
https://github.com/textmate/c.tmbundle:
|
||||
- source.c
|
||||
- source.c++
|
||||
- source.c.platform
|
||||
https://github.com/textmate/capnproto.tmbundle:
|
||||
- source.capnp
|
||||
https://github.com/textmate/cmake.tmbundle:
|
||||
@@ -323,8 +342,6 @@ https://github.com/textmate/lua.tmbundle:
|
||||
- source.lua
|
||||
https://github.com/textmate/make.tmbundle:
|
||||
- source.makefile
|
||||
https://github.com/textmate/markdown.tmbundle:
|
||||
- text.html.markdown
|
||||
https://github.com/textmate/matlab.tmbundle:
|
||||
- source.matlab
|
||||
- source.octave
|
||||
@@ -404,19 +421,19 @@ https://github.com/textmate/verilog.tmbundle:
|
||||
https://github.com/textmate/xml.tmbundle:
|
||||
- text.xml
|
||||
- text.xml.xsl
|
||||
https://github.com/textmate/yaml.tmbundle:
|
||||
- source.yaml
|
||||
https://github.com/tomas-stefano/smalltalk-tmbundle:
|
||||
- source.smalltalk
|
||||
https://github.com/vic/ioke-outdated/raw/master/share/TextMate/Ioke.tmbundle/Syntaxes/Ioke.tmLanguage:
|
||||
https://github.com/vic/ioke-outdated:
|
||||
- source.ioke
|
||||
https://github.com/vkostyukov/kotlin-sublime-package:
|
||||
- source.Kotlin
|
||||
https://github.com/vmg/c.tmbundle:
|
||||
- source.c
|
||||
- source.c++
|
||||
- source.c.platform
|
||||
https://github.com/vmg/zephir-sublime:
|
||||
- source.php.zephir
|
||||
https://github.com/whitequark/llvm.tmbundle:
|
||||
- source.llvm
|
||||
https://github.com/wmertens/sublime-nix:
|
||||
- source.nix
|
||||
https://raw.githubusercontent.com/eregon/oz-tmbundle/master/Syntaxes/Oz.tmLanguage:
|
||||
- source.oz
|
||||
|
||||
@@ -53,7 +53,7 @@ module Linguist
|
||||
|
||||
# Internal: Check if this heuristic matches the candidate languages.
|
||||
def matches?(candidates)
|
||||
candidates.all? { |l| @languages.include?(l.name) }
|
||||
candidates.any? && candidates.all? { |l| @languages.include?(l.name) }
|
||||
end
|
||||
|
||||
# Internal: Perform the heuristic
|
||||
@@ -61,6 +61,14 @@ module Linguist
|
||||
@heuristic.call(data)
|
||||
end
|
||||
|
||||
disambiguate "BitBake", "BlitzBasic" do |data|
|
||||
if /^\s*; /.match(data) || data.include?("End Function")
|
||||
Language["BlitzBasic"]
|
||||
elsif /^\s*(# |include|require)\b/.match(data)
|
||||
Language["BitBake"]
|
||||
end
|
||||
end
|
||||
|
||||
disambiguate "Objective-C", "C++", "C" do |data|
|
||||
if (/@(interface|class|protocol|property|end|synchronised|selector|implementation)\b/.match(data))
|
||||
Language["Objective-C"]
|
||||
@@ -129,7 +137,7 @@ module Linguist
|
||||
disambiguate "FORTRAN", "Forth" do |data|
|
||||
if /^: /.match(data)
|
||||
Language["Forth"]
|
||||
elsif /^([c*][^a-z]| subroutine\s)/i.match(data)
|
||||
elsif /^([c*][^a-z]| (subroutine|program)\s|!)/i.match(data)
|
||||
Language["FORTRAN"]
|
||||
end
|
||||
end
|
||||
@@ -137,9 +145,9 @@ module Linguist
|
||||
disambiguate "F#", "Forth", "GLSL" do |data|
|
||||
if /^(: |new-device)/.match(data)
|
||||
Language["Forth"]
|
||||
elsif /^(#light|import|let|module|namespace|open|type)/.match(data)
|
||||
elsif /^\s*(#light|import|let|module|namespace|open|type)/.match(data)
|
||||
Language["F#"]
|
||||
elsif /^(#include|#pragma|precision|uniform|varying|void)/.match(data)
|
||||
elsif /^\s*(#include|#pragma|precision|uniform|varying|void)/.match(data)
|
||||
Language["GLSL"]
|
||||
end
|
||||
end
|
||||
@@ -156,5 +164,22 @@ module Linguist
|
||||
end
|
||||
end
|
||||
|
||||
disambiguate "TypeScript", "XML" do |data|
|
||||
if data.include?("<TS ")
|
||||
Language["XML"]
|
||||
else
|
||||
Language["TypeScript"]
|
||||
end
|
||||
end
|
||||
|
||||
disambiguate "Frege", "Forth", "Text" 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
|
||||
end
|
||||
end
|
||||
|
||||
@@ -269,8 +269,12 @@ module Linguist
|
||||
|
||||
# Public: A List of languages compatible with Ace.
|
||||
#
|
||||
# TODO: Remove this method in a 5.x release. Every language now needs an ace_mode
|
||||
# key, so this function isn't doing anything unique anymore.
|
||||
#
|
||||
# Returns an Array of Languages.
|
||||
def self.ace_modes
|
||||
warn "This method will be deprecated in a future 5.x release. Every language now has an `ace_mode` set."
|
||||
@ace_modes ||= all.select(&:ace_mode).sort_by { |lang| lang.name.downcase }
|
||||
end
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -3,7 +3,6 @@
|
||||
# This file should only be edited by GitHub staff
|
||||
|
||||
- ActionScript
|
||||
- Bash
|
||||
- C
|
||||
- C#
|
||||
- C++
|
||||
@@ -27,3 +26,4 @@
|
||||
- SQL
|
||||
- Scala
|
||||
- Scheme
|
||||
- Shell
|
||||
|
||||
@@ -34,10 +34,6 @@ module Linguist
|
||||
Dir.entries(ROOT).sort!.each do |category|
|
||||
next if category == '.' || category == '..'
|
||||
|
||||
# Skip text and binary for now
|
||||
# Possibly reconsider this later
|
||||
next if category == 'Text' || category == 'Binary'
|
||||
|
||||
dirname = File.join(ROOT, category)
|
||||
Dir.entries(dirname).each do |filename|
|
||||
next if filename == '.' || filename == '..'
|
||||
|
||||
@@ -18,23 +18,32 @@ module Linguist
|
||||
#
|
||||
# Returns a String or nil
|
||||
def self.interpreter(data)
|
||||
lines = data.lines
|
||||
return unless match = /^#! ?(.*)$/.match(lines.first)
|
||||
shebang = data.lines.first
|
||||
|
||||
tokens = match[1].split(' ')
|
||||
script = tokens.first.split('/').last
|
||||
# First line must start with #!
|
||||
return unless shebang && shebang.start_with?("#!")
|
||||
|
||||
# Get the parts of the shebang without the #!
|
||||
tokens = shebang.sub(/^#!\s*/, '').strip.split(' ')
|
||||
|
||||
# There was nothing after the #!
|
||||
return if tokens.empty?
|
||||
|
||||
# Get the name of the interpreter
|
||||
script = File.basename(tokens.first)
|
||||
|
||||
# Get next argument if interpreter was /usr/bin/env
|
||||
script = tokens[1] if script == 'env'
|
||||
|
||||
# If script has an invalid shebang, we might get here
|
||||
# Interpreter was /usr/bin/env with no arguments
|
||||
return unless script
|
||||
|
||||
# "python2.6" -> "python2"
|
||||
script.sub! $1, '' if script =~ /(\.\d+)$/
|
||||
script.sub! /(\.\d+)$/, ''
|
||||
|
||||
# Check for multiline shebang hacks that call `exec`
|
||||
if script == 'sh' &&
|
||||
lines.first(5).any? { |l| l.match(/exec (\w+).+\$0.+\$@/) }
|
||||
data.lines.first(5).any? { |l| l.match(/exec (\w+).+\$0.+\$@/) }
|
||||
script = $1
|
||||
end
|
||||
|
||||
|
||||
@@ -32,6 +32,7 @@
|
||||
|
||||
# Erlang bundles
|
||||
- ^rebar$
|
||||
- erlang.mk
|
||||
|
||||
# Go dependencies
|
||||
- Godeps/_workspace/
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
module Linguist
|
||||
VERSION = "4.2.0"
|
||||
VERSION = "4.2.5"
|
||||
end
|
||||
|
||||
25
samples/BitBake/gstreamer-libav.bb
Normal file
25
samples/BitBake/gstreamer-libav.bb
Normal file
@@ -0,0 +1,25 @@
|
||||
include gstreamer1.0-libav.inc
|
||||
|
||||
LIC_FILES_CHKSUM = "file://COPYING;md5=b234ee4d69f5fce4486a80fdaf4a4263 \
|
||||
file://COPYING.LIB;md5=6762ed442b3822387a51c92d928ead0d \
|
||||
file://ext/libav/gstav.h;beginline=1;endline=18;md5=a752c35267d8276fd9ca3db6994fca9c \
|
||||
file://gst-libs/ext/libav/LICENSE;md5=23a54f59b82572c203a559346e89ed57 \
|
||||
file://gst-libs/ext/libav/COPYING.GPLv2;md5=b234ee4d69f5fce4486a80fdaf4a4263 \
|
||||
file://gst-libs/ext/libav/COPYING.GPLv3;md5=d32239bcb673463ab874e80d47fae504 \
|
||||
file://gst-libs/ext/libav/COPYING.LGPLv2.1;md5=bd7a443320af8c812e4c18d1b79df004 \
|
||||
file://gst-libs/ext/libav/COPYING.LGPLv3;md5=e6a600fd5e1d9cbde2d983680233ad02"
|
||||
|
||||
SRC_URI = " \
|
||||
http://gstreamer.freedesktop.org/src/gst-libav/gst-libav-${PV}.tar.xz \
|
||||
file://0001-Disable-yasm-for-libav-when-disable-yasm.patch \
|
||||
"
|
||||
SRC_URI[md5sum] = "86540dee14d31daf976eb2713f2294f3"
|
||||
SRC_URI[sha256sum] = "585eb7971006100ad771a852e07bd2f3e23bcc6eb0b1253a40b5a0e40e4e7418"
|
||||
|
||||
LIBAV_EXTRA_CONFIGURE_COMMON_ARG = "--target-os=linux \
|
||||
--cc='${CC}' --as='${CC}' --ld='${CC}' --nm='${NM}' --ar='${AR}' \
|
||||
--ranlib='${RANLIB}' \
|
||||
${GSTREAMER_1_0_DEBUG}"
|
||||
|
||||
S = "${WORKDIR}/gst-libav-${PV}"
|
||||
|
||||
13
samples/BitBake/qtbase-native.bb
Normal file
13
samples/BitBake/qtbase-native.bb
Normal file
@@ -0,0 +1,13 @@
|
||||
require qt5-git.inc
|
||||
require ${PN}.inc
|
||||
|
||||
do_install_append() {
|
||||
# for modules which are still using syncqt and call qtPrepareTool(QMAKE_SYNCQT, syncqt)
|
||||
# e.g. qt3d, qtwayland
|
||||
ln -sf syncqt.pl ${D}${OE_QMAKE_PATH_QT_BINS}/syncqt
|
||||
}
|
||||
|
||||
QT_MODULE_BRANCH = "release"
|
||||
# v5.2.1 + 168 commits
|
||||
SRCREV = "08cbbde61778276ccdda73d89fd64d02c623779f"
|
||||
|
||||
26
samples/C#/AssemblyInfo.cs
Normal file
26
samples/C#/AssemblyInfo.cs
Normal file
@@ -0,0 +1,26 @@
|
||||
using System.Reflection;
|
||||
using System.Runtime.CompilerServices;
|
||||
|
||||
// Information about this assembly is defined by the following attributes.
|
||||
// Change them to the values specific to your project.
|
||||
|
||||
[assembly: AssemblyTitle("Simple")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("")]
|
||||
[assembly: AssemblyProduct("")]
|
||||
[assembly: AssemblyCopyright("")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
|
||||
// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}".
|
||||
// The form "{Major}.{Minor}.*" will automatically update the build and revision,
|
||||
// and "{Major}.{Minor}.{Build}.*" will update just the revision.
|
||||
|
||||
[assembly: AssemblyVersion("1.0.*")]
|
||||
|
||||
// The following attributes are used to specify the signing key for the assembly,
|
||||
// if desired. See the Mono documentation for more information about signing.
|
||||
|
||||
//[assembly: AssemblyDelaySign(false)]
|
||||
//[assembly: AssemblyKeyFile("")]
|
||||
20
samples/C#/BsonPropertyValue.cs
Normal file
20
samples/C#/BsonPropertyValue.cs
Normal file
@@ -0,0 +1,20 @@
|
||||
using System;
|
||||
|
||||
namespace MongoDB.Serialization.Descriptors
|
||||
{
|
||||
internal class BsonPropertyValue
|
||||
{
|
||||
public bool IsDictionary { get; private set; }
|
||||
|
||||
public Type Type { get; private set; }
|
||||
|
||||
public object Value { get; private set; }
|
||||
|
||||
public BsonPropertyValue(Type type, object value, bool isDictionary)
|
||||
{
|
||||
Type = type;
|
||||
Value = value;
|
||||
IsDictionary = isDictionary;
|
||||
}
|
||||
}
|
||||
}
|
||||
153
samples/C#/MongoExpressionVisitor.cs
Normal file
153
samples/C#/MongoExpressionVisitor.cs
Normal file
@@ -0,0 +1,153 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Linq;
|
||||
using System.Linq.Expressions;
|
||||
|
||||
namespace MongoDB.Linq.Expressions
|
||||
{
|
||||
internal class MongoExpressionVisitor : ExpressionVisitor
|
||||
{
|
||||
protected override Expression Visit(Expression exp)
|
||||
{
|
||||
if (exp == null)
|
||||
return null;
|
||||
switch ((MongoExpressionType)exp.NodeType)
|
||||
{
|
||||
case MongoExpressionType.Collection:
|
||||
return VisitCollection((CollectionExpression)exp);
|
||||
case MongoExpressionType.Field:
|
||||
return VisitField((FieldExpression)exp);
|
||||
case MongoExpressionType.Projection:
|
||||
return VisitProjection((ProjectionExpression)exp);
|
||||
case MongoExpressionType.Select:
|
||||
return VisitSelect((SelectExpression)exp);
|
||||
case MongoExpressionType.Aggregate:
|
||||
return VisitAggregate((AggregateExpression)exp);
|
||||
case MongoExpressionType.AggregateSubquery:
|
||||
return VisitAggregateSubquery((AggregateSubqueryExpression)exp);
|
||||
case MongoExpressionType.Scalar:
|
||||
return VisitScalar((ScalarExpression)exp);
|
||||
default:
|
||||
return base.Visit(exp);
|
||||
}
|
||||
}
|
||||
|
||||
protected virtual Expression VisitAggregate(AggregateExpression aggregate)
|
||||
{
|
||||
var exp = Visit(aggregate.Argument);
|
||||
if (exp != aggregate.Argument)
|
||||
return new AggregateExpression(aggregate.Type, aggregate.AggregateType, exp, aggregate.Distinct);
|
||||
|
||||
return aggregate;
|
||||
}
|
||||
|
||||
protected virtual Expression VisitAggregateSubquery(AggregateSubqueryExpression aggregateSubquery)
|
||||
{
|
||||
Expression e = Visit(aggregateSubquery.AggregateAsSubquery);
|
||||
ScalarExpression subquery = (ScalarExpression)e;
|
||||
if (subquery != aggregateSubquery.AggregateAsSubquery)
|
||||
return new AggregateSubqueryExpression(aggregateSubquery.GroupByAlias, aggregateSubquery.AggregateInGroupSelect, subquery);
|
||||
return aggregateSubquery;
|
||||
}
|
||||
|
||||
protected virtual Expression VisitCollection(CollectionExpression collection)
|
||||
{
|
||||
return collection;
|
||||
}
|
||||
|
||||
protected virtual Expression VisitField(FieldExpression field)
|
||||
{
|
||||
var e = Visit(field.Expression);
|
||||
if (field.Expression != e)
|
||||
field = new FieldExpression(e, field.Alias, field.Name);
|
||||
|
||||
return field;
|
||||
}
|
||||
|
||||
protected virtual Expression VisitProjection(ProjectionExpression projection)
|
||||
{
|
||||
var source = (SelectExpression)Visit(projection.Source);
|
||||
var projector = Visit(projection.Projector);
|
||||
if (source != projection.Source || projector != projection.Projector)
|
||||
return new ProjectionExpression(source, projector, projection.Aggregator);
|
||||
return projection;
|
||||
}
|
||||
|
||||
protected ReadOnlyCollection<OrderExpression> VisitOrderBy(ReadOnlyCollection<OrderExpression> orderBys)
|
||||
{
|
||||
if (orderBys != null)
|
||||
{
|
||||
List<OrderExpression> alternate = null;
|
||||
for (int i = 0, n = orderBys.Count; i < n; i++)
|
||||
{
|
||||
OrderExpression expr = orderBys[i];
|
||||
Expression e = this.Visit(expr.Expression);
|
||||
if (alternate == null && e != expr.Expression)
|
||||
alternate = orderBys.Take(i).ToList();
|
||||
if (alternate != null)
|
||||
alternate.Add(new OrderExpression(expr.OrderType, e));
|
||||
}
|
||||
if (alternate != null)
|
||||
return alternate.AsReadOnly();
|
||||
}
|
||||
return orderBys;
|
||||
}
|
||||
|
||||
protected virtual Expression VisitScalar(ScalarExpression scalar)
|
||||
{
|
||||
SelectExpression select = (SelectExpression)Visit(scalar.Select);
|
||||
if (select != scalar.Select)
|
||||
return new ScalarExpression(scalar.Type, select);
|
||||
return scalar;
|
||||
}
|
||||
|
||||
protected virtual Expression VisitSelect(SelectExpression select)
|
||||
{
|
||||
var from = VisitSource(select.From);
|
||||
var where = Visit(select.Where);
|
||||
var groupBy = Visit(select.GroupBy);
|
||||
var orderBy = VisitOrderBy(select.OrderBy);
|
||||
var skip = Visit(select.Skip);
|
||||
var take = Visit(select.Take);
|
||||
var fields = VisitFieldDeclarationList(select.Fields);
|
||||
if (from != select.From || where != select.Where || orderBy != select.OrderBy || groupBy != select.GroupBy || skip != select.Skip || take != select.Take || fields != select.Fields)
|
||||
return new SelectExpression(select.Alias, fields, from, where, orderBy, groupBy, select.IsDistinct, skip, take);
|
||||
return select;
|
||||
}
|
||||
|
||||
protected virtual Expression VisitSource(Expression source)
|
||||
{
|
||||
return Visit(source);
|
||||
}
|
||||
|
||||
protected virtual Expression VisitSubquery(SubqueryExpression subquery)
|
||||
{
|
||||
switch ((MongoExpressionType)subquery.NodeType)
|
||||
{
|
||||
case MongoExpressionType.Scalar:
|
||||
return VisitScalar((ScalarExpression)subquery);
|
||||
}
|
||||
return subquery;
|
||||
}
|
||||
|
||||
protected virtual ReadOnlyCollection<FieldDeclaration> VisitFieldDeclarationList(ReadOnlyCollection<FieldDeclaration> fields)
|
||||
{
|
||||
if (fields == null)
|
||||
return fields;
|
||||
|
||||
List<FieldDeclaration> alternate = null;
|
||||
for (int i = 0, n = fields.Count; i < n; i++)
|
||||
{
|
||||
var f = fields[i];
|
||||
var e = Visit(f.Expression);
|
||||
if (f.Expression != e && alternate == null)
|
||||
alternate = fields.Take(i).ToList();
|
||||
if (alternate != null)
|
||||
alternate.Add(new FieldDeclaration(f.Name, e));
|
||||
}
|
||||
if (alternate != null)
|
||||
return alternate.AsReadOnly();
|
||||
return fields;
|
||||
}
|
||||
}
|
||||
}
|
||||
47
samples/C/bitmap.h
Normal file
47
samples/C/bitmap.h
Normal file
@@ -0,0 +1,47 @@
|
||||
#pragma once
|
||||
|
||||
/* Copyright © 2010 Christoph Sünderhauf
|
||||
*
|
||||
* This file is part of Xelix.
|
||||
*
|
||||
* Xelix 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.
|
||||
*
|
||||
* Xelix 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 Xelix. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "generic.h"
|
||||
|
||||
typedef struct {
|
||||
uint32_t numbits;
|
||||
/* an array large enough for numbits to fit in. Might
|
||||
* (if numbits%8!=0) have some spare bits at the end
|
||||
*/
|
||||
uint32_t* bits;
|
||||
} bitmap_t;
|
||||
|
||||
|
||||
// creates a new bitmap.
|
||||
// CONTENT IS RANDOM! - use bitmap_clearall() to clear the bitmap.
|
||||
bitmap_t bitmap_init(uint32_t numbits);
|
||||
|
||||
// returns 1 or 0
|
||||
uint8_t bitmap_get(bitmap_t bitmap, uint32_t bitnum);
|
||||
// sets a bit (to 1)
|
||||
void bitmap_set(bitmap_t bitmap, uint32_t bitnum);
|
||||
// clears a bit (to 0)
|
||||
void bitmap_clear(bitmap_t bitmap, uint32_t bitnum);
|
||||
|
||||
// clears every bit to 0
|
||||
void bitmap_clearAll(bitmap_t bitmap);
|
||||
|
||||
// finds the first bit set to 0 returns 0 if no cleared bit found (0 is also returned if the first bit is cleared)
|
||||
uint32_t bitmap_findFirstClear(bitmap_t bitmap);
|
||||
44
samples/C/color.h
Normal file
44
samples/C/color.h
Normal file
@@ -0,0 +1,44 @@
|
||||
#pragma once
|
||||
|
||||
/* Copyright © 2011 Fritz Grimpen
|
||||
*
|
||||
* This file is part of Xelix.
|
||||
*
|
||||
* Xelix 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.
|
||||
*
|
||||
* Xelix 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 Xelix. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <lib/generic.h>
|
||||
|
||||
typedef struct {
|
||||
uint32_t background;
|
||||
uint32_t foreground;
|
||||
} console_color_t;
|
||||
|
||||
#define CONSOLE_COLOR_BLACK 0x0
|
||||
#define CONSOLE_COLOR_BLUE 0x1
|
||||
#define CONSOLE_COLOR_GREEN 0x2
|
||||
#define CONSOLE_COLOR_CYAN 0x3
|
||||
#define CONSOLE_COLOR_RED 0x4
|
||||
#define CONSOLE_COLOR_MAGENTA 0x5
|
||||
#define CONSOLE_COLOR_BROWN 0x6
|
||||
#define CONSOLE_COLOR_LGREY 0x7
|
||||
#define CONSOLE_COLOR_DGREY 0x8
|
||||
#define CONSOLE_COLOR_LBLUE 0x9
|
||||
#define CONSOLE_COLOR_LGREEN 0xa
|
||||
#define CONSOLE_COLOR_LCYAN 0xb
|
||||
#define CONSOLE_COLOR_LRED 0xc
|
||||
#define CONSOLE_COLOR_LMAGENTA 0xd
|
||||
#define CONSOLE_COLOR_YELLOW 0xe
|
||||
#define CONSOLE_COLOR_WHITE 0xf
|
||||
|
||||
52
samples/C/driver.h
Normal file
52
samples/C/driver.h
Normal file
@@ -0,0 +1,52 @@
|
||||
#pragma once
|
||||
|
||||
/* Copyright © 2011 Fritz Grimpen
|
||||
*
|
||||
* This file is part of Xelix.
|
||||
*
|
||||
* Xelix 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.
|
||||
*
|
||||
* Xelix 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 Xelix. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <lib/generic.h>
|
||||
#include <console/info.h>
|
||||
|
||||
#define CONSOLE_DRV_CAP_CLEAR 0x01
|
||||
#define CONSOLE_DRV_CAP_SCROLL 0x02
|
||||
#define CONSOLE_DRV_CAP_SET_CURSOR 0x04
|
||||
|
||||
// Input modifier keys
|
||||
typedef struct {
|
||||
bool shift_left:1;
|
||||
bool shift_right:1;
|
||||
bool control_left:1;
|
||||
bool control_right:1;
|
||||
bool alt:1;
|
||||
bool super:1;
|
||||
} console_modifiers_t;
|
||||
|
||||
typedef struct {
|
||||
char character;
|
||||
console_modifiers_t* modifiers;
|
||||
} console_read_t;
|
||||
|
||||
typedef struct {
|
||||
int (*write)(console_info_t*, char);
|
||||
console_read_t* (*read)(console_info_t*);
|
||||
|
||||
int capabilities;
|
||||
|
||||
int (*_clear)(console_info_t*);
|
||||
int (*scroll)(console_info_t*, int32_t);
|
||||
void (*setCursor)(console_info_t*, uint32_t, uint32_t);
|
||||
} console_driver_t;
|
||||
70
samples/C/elf.h
Normal file
70
samples/C/elf.h
Normal file
@@ -0,0 +1,70 @@
|
||||
#pragma once
|
||||
|
||||
/* Copyright © 2011 Lukas Martini
|
||||
*
|
||||
* This file is part of Xelix.
|
||||
*
|
||||
* Xelix 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.
|
||||
*
|
||||
* Xelix 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 Xelix. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <lib/generic.h>
|
||||
#include <tasks/scheduler.h>
|
||||
|
||||
#define ELF_TYPE_NONE 0
|
||||
#define ELF_TYPE_REL 1
|
||||
#define ELF_TYPE_EXEC 2
|
||||
#define ELF_TYPE_DYN 3
|
||||
#define ELF_TYPE_CORE 4
|
||||
|
||||
#define ELF_ARCH_NONE 0
|
||||
#define ELF_ARCH_386 3
|
||||
|
||||
#define ELF_VERSION_CURRENT 1
|
||||
|
||||
typedef struct {
|
||||
unsigned char magic[4];
|
||||
/* Note: There _is_ other stuff in here, but we don't need it */
|
||||
unsigned char pad[12];
|
||||
} __attribute__((packed)) elf_ident_t;
|
||||
|
||||
typedef struct {
|
||||
uint32_t type;
|
||||
uint32_t offset;
|
||||
void* virtaddr;
|
||||
void* physaddr;
|
||||
uint32_t filesize;
|
||||
uint32_t memsize;
|
||||
uint32_t flags;
|
||||
uint32_t alignment;
|
||||
} __attribute__((packed)) elf_program_t;
|
||||
|
||||
typedef struct {
|
||||
elf_ident_t ident;
|
||||
uint16_t type; /* Object file type */
|
||||
uint16_t machine; /* Architecture */
|
||||
uint32_t version; /* Object file version */
|
||||
void* entry; /* Entry point virtual address */
|
||||
uint32_t phoff; /* Program header table file offset */
|
||||
uint32_t shoff; /* Section header table file offset */
|
||||
uint32_t flags; /* Processor-specific flags */
|
||||
uint16_t ehsize; /* ELF header size in bytes */
|
||||
uint16_t phentsize; /* Program header table entry size */
|
||||
uint16_t phnum; /* Program header table entry count */
|
||||
uint16_t shentsize; /* Section header table entry size */
|
||||
uint16_t shnum; /* Section header table entry count */
|
||||
uint16_t shstrndx; /* Section header string table index */
|
||||
} __attribute__((packed)) elf_t;
|
||||
|
||||
task_t* elf_load(elf_t* bin, char* name, char** environ, char** argv, int argc);
|
||||
task_t* elf_load_file(char* path, char** environ, char** argv, int argc);
|
||||
45
samples/C/filter.h
Normal file
45
samples/C/filter.h
Normal file
@@ -0,0 +1,45 @@
|
||||
#pragma once
|
||||
|
||||
/* Copyright © 2011 Fritz Grimpen
|
||||
*
|
||||
* This file is part of Xelix.
|
||||
*
|
||||
* Xelix 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.
|
||||
*
|
||||
* Xelix 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 Xelix. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <lib/generic.h>
|
||||
#include <console/info.h>
|
||||
#include <console/driver.h>
|
||||
|
||||
struct console_filter {
|
||||
// General callback for all actions etc.
|
||||
// Preferred prototype:
|
||||
// char <name>(char c, console_info_t *info, console_driver_t *input, console_driver_t *output);
|
||||
char (*callback)(char, console_info_t*, console_driver_t*, console_driver_t*);
|
||||
|
||||
// Specific callbacks for read and write
|
||||
// Preferred prototype:
|
||||
// char <name>(char c, console_info_t *info, console_driver_t *input);
|
||||
char (*read_callback)(char, console_info_t*, console_driver_t*);
|
||||
|
||||
// Preferred prototype:
|
||||
// char <name>(char c, console_info_t *info, console_driver_t *output);
|
||||
char (*write_callback)(char, console_info_t*, console_driver_t*);
|
||||
|
||||
// The next filter in the filter chain
|
||||
struct console_filter* next;
|
||||
};
|
||||
|
||||
typedef struct console_filter console_filter_t;
|
||||
|
||||
44
samples/C/info.h
Normal file
44
samples/C/info.h
Normal file
@@ -0,0 +1,44 @@
|
||||
#pragma once
|
||||
|
||||
/* Copyright © 2011 Fritz Grimpen
|
||||
*
|
||||
* This file is part of Xelix.
|
||||
*
|
||||
* Xelix 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.
|
||||
*
|
||||
* Xelix 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 Xelix. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <lib/generic.h>
|
||||
#include <console/color.h>
|
||||
|
||||
typedef struct {
|
||||
uint32_t cursor_x;
|
||||
uint32_t cursor_y;
|
||||
|
||||
uint32_t rows;
|
||||
uint32_t columns;
|
||||
|
||||
uint32_t tabstop;
|
||||
|
||||
console_color_t default_color;
|
||||
console_color_t current_color;
|
||||
|
||||
uint8_t nonblocking;
|
||||
uint8_t reverse_video;
|
||||
uint8_t bold;
|
||||
uint8_t blink;
|
||||
uint8_t underline;
|
||||
uint8_t newline_mode;
|
||||
uint8_t auto_echo;
|
||||
uint8_t handle_backspace;
|
||||
} console_info_t;
|
||||
47
samples/C/interface.h
Normal file
47
samples/C/interface.h
Normal file
@@ -0,0 +1,47 @@
|
||||
#pragma once
|
||||
|
||||
/* Copyright © 2011 Fritz Grimpen
|
||||
*
|
||||
* This file is part of Xelix.
|
||||
*
|
||||
* Xelix 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.
|
||||
*
|
||||
* Xelix 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 Xelix. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <lib/generic.h>
|
||||
#include <console/info.h>
|
||||
#include <console/filter.h>
|
||||
#include <console/driver.h>
|
||||
|
||||
typedef struct {
|
||||
console_info_t info;
|
||||
|
||||
console_filter_t* input_filter;
|
||||
console_filter_t* output_filter;
|
||||
|
||||
console_driver_t* input_driver;
|
||||
console_driver_t* output_driver;
|
||||
} console_t;
|
||||
|
||||
console_t* default_console;
|
||||
|
||||
// Generate raw console, connected to the Display, Keyboard and the
|
||||
// ECMA-48-Filter
|
||||
void console_init();
|
||||
|
||||
size_t console_write(console_t* console, const char* buffer, int32_t length);
|
||||
#define console_write2(console, buffer) console_write(console, buffer, strlen(buffer))
|
||||
size_t console_read(console_t* console, char* buffer, size_t length);
|
||||
size_t console_scroll(console_t* console, int32_t pages);
|
||||
|
||||
void console_clear(console_t* console);
|
||||
50
samples/C/ip4.h
Normal file
50
samples/C/ip4.h
Normal file
@@ -0,0 +1,50 @@
|
||||
#pragma once
|
||||
|
||||
/* Copyright © 2011 Lukas Martini
|
||||
*
|
||||
* This file is part of Xelix.
|
||||
*
|
||||
* Xelix 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.
|
||||
*
|
||||
* Xelix 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 Xelix. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <lib/generic.h>
|
||||
#include <net/net.h>
|
||||
|
||||
#define IP4_TOS_ICMP 0
|
||||
|
||||
typedef uint32_t ip4_addr_t;
|
||||
|
||||
typedef struct {
|
||||
unsigned int hl:4; /* both fields are 4 bits */
|
||||
unsigned int version:4;
|
||||
uint8_t tos;
|
||||
uint16_t len;
|
||||
uint16_t id;
|
||||
uint16_t off;
|
||||
uint8_t ttl;
|
||||
uint8_t p;
|
||||
uint16_t checksum;
|
||||
ip4_addr_t src;
|
||||
ip4_addr_t dst;
|
||||
} ip4_header_t;
|
||||
|
||||
typedef struct {
|
||||
uint8_t type;
|
||||
uint8_t code;
|
||||
uint16_t checksum;
|
||||
uint16_t id;
|
||||
uint16_t sequence;
|
||||
} ip4_icmp_header_t;
|
||||
|
||||
void ip4_receive(net_device_t* origin, net_l2proto_t proto, size_t size, void* raw);
|
||||
110
samples/C/multiboot.h
Normal file
110
samples/C/multiboot.h
Normal file
@@ -0,0 +1,110 @@
|
||||
#pragma once
|
||||
|
||||
/* Copyright © 2010, 2011 Lukas Martini
|
||||
*
|
||||
* This file is part of Xelix.
|
||||
*
|
||||
* Xelix 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.
|
||||
*
|
||||
* Xelix 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 Xelix. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <lib/generic.h>
|
||||
|
||||
#define MULTIBOOT_KERNELMAGIC 0x2BADB002
|
||||
|
||||
#define MULTIBOOT_FLAG_MEM 0x001
|
||||
#define MULTIBOOT_FLAG_DEVICE 0x002
|
||||
#define MULTIBOOT_FLAG_CMDLINE 0x004
|
||||
#define MULTIBOOT_FLAG_MODS 0x008
|
||||
#define MULTIBOOT_FLAG_AOUT 0x010
|
||||
#define MULTIBOOT_FLAG_ELF 0x020
|
||||
#define MULTIBOOT_FLAG_MMAP 0x040
|
||||
#define MULTIBOOT_FLAG_CONFIG 0x080
|
||||
#define MULTIBOOT_FLAG_LOADER 0x100
|
||||
#define MULTIBOOT_FLAG_APM 0x200
|
||||
#define MULTIBOOT_FLAG_VBE 0x400
|
||||
|
||||
// The symbol table for a.out.
|
||||
typedef struct
|
||||
{
|
||||
uint32_t tabSize;
|
||||
uint32_t strSize;
|
||||
uint32_t addr;
|
||||
uint32_t reserved;
|
||||
} __attribute__((packed)) multiboot_aoutSymbolTable_t;
|
||||
|
||||
// The section header table for ELF.
|
||||
typedef struct
|
||||
{
|
||||
uint32_t num;
|
||||
uint32_t size;
|
||||
uint32_t addr;
|
||||
uint32_t shndx;
|
||||
} __attribute__((packed)) multiboot_elfSectionHeaderTable_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint32_t size;
|
||||
uint64_t addr;
|
||||
uint64_t length;
|
||||
uint32_t type;
|
||||
} __attribute__((packed)) multiboot_memoryMap_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint32_t start;
|
||||
uint32_t end;
|
||||
char* cmdLine;
|
||||
uint32_t reserved;
|
||||
} __attribute__((packed)) multiboot_module_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint32_t flags;
|
||||
uint32_t memLower;
|
||||
uint32_t memUpper;
|
||||
uint32_t bootDevice;
|
||||
char* cmdLine;
|
||||
uint32_t modsCount;
|
||||
multiboot_module_t* modsAddr;
|
||||
|
||||
union
|
||||
{
|
||||
multiboot_aoutSymbolTable_t aoutSym;
|
||||
multiboot_elfSectionHeaderTable_t elfSec;
|
||||
} u;
|
||||
|
||||
uint32_t mmapLength;
|
||||
uint32_t mmapAddr;
|
||||
|
||||
uint32_t drivesLength;
|
||||
uint32_t drivesAddr;
|
||||
|
||||
// ROM configuration table
|
||||
uint32_t configTable;
|
||||
|
||||
char* bootLoaderName;
|
||||
uint32_t apmTable;
|
||||
|
||||
// Video
|
||||
uint32_t vbeControlInfo;
|
||||
uint32_t vbeModeInfo;
|
||||
uint16_t vbeMode;
|
||||
uint16_t vbeInterfaceSeg;
|
||||
uint16_t vbeInterfaceOff;
|
||||
uint16_t vbeInterfaceLen;
|
||||
} __attribute__((packed)) multiboot_info_t;
|
||||
|
||||
multiboot_info_t* multiboot_info;
|
||||
|
||||
void arch_multiboot_printInfo();
|
||||
43
samples/C/portio.h
Normal file
43
samples/C/portio.h
Normal file
@@ -0,0 +1,43 @@
|
||||
#pragma once
|
||||
|
||||
/* Copyright © 2011 Lukas Martini
|
||||
*
|
||||
* This file is part of Xelix.
|
||||
*
|
||||
* Xelix 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.
|
||||
*
|
||||
* Xelix 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 Xelix. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <lib/generic.h>
|
||||
#include <lib/stdint.h>
|
||||
|
||||
// Legacy
|
||||
#define outb(args...) portio_out8(args)
|
||||
#define outw(args...) portio_out16(args)
|
||||
#define outl(args...) portio_out32(args)
|
||||
#define outq(args...) portio_out64(args)
|
||||
|
||||
#define inb(args...) portio_in8(args)
|
||||
#define inw(args...) portio_in16(args)
|
||||
#define inl(args...) portio_in32(args)
|
||||
#define inq(args...) portio_in64(args)
|
||||
|
||||
void portio_out8(uint16_t port, uint8_t value);
|
||||
void portio_out16(uint16_t port, uint16_t value);
|
||||
void portio_out32(uint16_t port, uint32_t value);
|
||||
void portio_out64(uint16_t port, uint64_t value);
|
||||
|
||||
uint8_t portio_in8(uint16_t port);
|
||||
uint16_t portio_in16(uint16_t port);
|
||||
uint32_t portio_in32(uint16_t port);
|
||||
uint64_t portio_in64(uint16_t port);
|
||||
69
samples/C/scheduler.h
Normal file
69
samples/C/scheduler.h
Normal file
@@ -0,0 +1,69 @@
|
||||
#pragma once
|
||||
|
||||
/* Copyright © 2011 Lukas Martini
|
||||
*
|
||||
* This file is part of Xelix.
|
||||
*
|
||||
* Xelix 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.
|
||||
*
|
||||
* Xelix 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 Xelix. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <lib/generic.h>
|
||||
#include <hw/cpu.h>
|
||||
#include <memory/vmem.h>
|
||||
|
||||
#define SCHEDULER_MAXNAME 256
|
||||
#define SCHEDULER_TASK_PATH_MAX 256
|
||||
|
||||
// Single linked list
|
||||
typedef struct task {
|
||||
uint32_t pid;
|
||||
char name[SCHEDULER_MAXNAME];
|
||||
struct task *parent;
|
||||
cpu_state_t* state;
|
||||
struct task* next;
|
||||
struct task* previous;
|
||||
|
||||
void* stack;
|
||||
void* entry;
|
||||
struct vmem_context *memory_context;
|
||||
|
||||
// Current task state
|
||||
enum {
|
||||
TASK_STATE_KILLED,
|
||||
TASK_STATE_TERMINATED,
|
||||
TASK_STATE_BLOCKING,
|
||||
TASK_STATE_STOPPED,
|
||||
TASK_STATE_RUNNING
|
||||
} task_state;
|
||||
|
||||
char** environ;
|
||||
char** argv;
|
||||
int argc;
|
||||
|
||||
// TODO Is this actually the same as PATH_MAX in our toolchain?
|
||||
char cwd[SCHEDULER_TASK_PATH_MAX + 1];
|
||||
} task_t;
|
||||
|
||||
int scheduler_state;
|
||||
|
||||
task_t* scheduler_new(void* entry, task_t* parent, char name[SCHEDULER_MAXNAME],
|
||||
char** environ, char** argv, int argc, struct vmem_context* memory_context, bool map_structs);
|
||||
void scheduler_add(task_t *task);
|
||||
void scheduler_terminate_current();
|
||||
task_t* scheduler_get_current();
|
||||
task_t* scheduler_select(cpu_state_t* lastRegs);
|
||||
void scheduler_init();
|
||||
void scheduler_yield();
|
||||
void scheduler_remove(task_t *t);
|
||||
task_t* scheduler_fork(task_t* to_fork, cpu_state_t* state);
|
||||
95
samples/C/syscalls.h
Normal file
95
samples/C/syscalls.h
Normal file
@@ -0,0 +1,95 @@
|
||||
#pragma once
|
||||
|
||||
/* Copyright © 2011 Fritz Grimpen
|
||||
*
|
||||
* This file is part of Xelix.
|
||||
*
|
||||
* Xelix 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.
|
||||
*
|
||||
* Xelix 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 Xelix. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <lib/generic.h>
|
||||
#include <tasks/syscall.h>
|
||||
|
||||
#include "syscalls/write.h"
|
||||
#include "syscalls/exit.h"
|
||||
#include "syscalls/getpid.h"
|
||||
#include "syscalls/getppid.h"
|
||||
#include "syscalls/read.h"
|
||||
#include "syscalls/brk.h"
|
||||
#include "syscalls/mmap.h"
|
||||
#include "syscalls/munmap.h"
|
||||
#include "syscalls/test.h"
|
||||
#include "syscalls/hostname.h"
|
||||
#include "syscalls/uname.h"
|
||||
#include "syscalls/open.h"
|
||||
#include "syscalls/execve.h"
|
||||
#include "syscalls/seek.h"
|
||||
#include "syscalls/opendir.h"
|
||||
#include "syscalls/readdir.h"
|
||||
#include "syscalls/kill.h"
|
||||
#include "syscalls/getexecdata.h"
|
||||
#include "syscalls/cwd.h"
|
||||
#include "syscalls/fork.h"
|
||||
|
||||
syscall_t syscall_table[] = {
|
||||
NULL,
|
||||
sys_exit, // 1
|
||||
sys_read, // 2
|
||||
sys_write, // 3
|
||||
sys_getpid, // 4
|
||||
sys_brk, // 5
|
||||
sys_getppid, // 6
|
||||
sys_mmap, // 7
|
||||
sys_munmap, // 8
|
||||
sys_test, // 9
|
||||
sys_get_hostname, // 10
|
||||
sys_set_hostname, // 11
|
||||
sys_uname, // 12
|
||||
sys_open, // 13
|
||||
sys_execve, // 14
|
||||
sys_seek, // 15
|
||||
sys_opendir, // 16
|
||||
sys_readdir, // 17
|
||||
sys_kill, // 18
|
||||
sys_getexecdata, // 19
|
||||
sys_chdir, // 20
|
||||
sys_getcwd, // 21
|
||||
sys_fork, // 22
|
||||
};
|
||||
|
||||
char* syscall_name_table[] = {
|
||||
NULL,
|
||||
"exit", // 1
|
||||
"read", // 2
|
||||
"write", // 3
|
||||
"getpid", // 4
|
||||
"brk", // 5
|
||||
"getppid", // 6
|
||||
"mmap", // 7
|
||||
"munmap", // 8
|
||||
"test", // 9
|
||||
"get_hostname", // 10
|
||||
"set_hostname", // 11
|
||||
"uname", // 12
|
||||
"open", // 13
|
||||
"execve", // 14
|
||||
"seek", // 15
|
||||
"opendir", // 16
|
||||
"readdir", // 17
|
||||
"kill", // 18
|
||||
"getexecdata", // 19
|
||||
"chdir", // 20
|
||||
"getcwd", // 21
|
||||
"fork", // 22
|
||||
};
|
||||
56
samples/C/vfs.h
Normal file
56
samples/C/vfs.h
Normal file
@@ -0,0 +1,56 @@
|
||||
#pragma once
|
||||
|
||||
/* Copyright © 2010, 2011 Lukas Martini
|
||||
*
|
||||
* This file is part of Xelix.
|
||||
*
|
||||
* Xelix 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.
|
||||
*
|
||||
* Xelix 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 Xelix. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <lib/generic.h>
|
||||
|
||||
#define VFS_SEEK_SET 0
|
||||
#define VFS_SEEK_CUR 1
|
||||
#define VFS_SEEK_END 2
|
||||
|
||||
typedef struct {
|
||||
uint64_t num;
|
||||
char path[512];
|
||||
char mount_path[512];
|
||||
uint32_t offset;
|
||||
uint32_t mountpoint;
|
||||
} vfs_file_t;
|
||||
|
||||
typedef struct {
|
||||
uint64_t num;
|
||||
char path[512];
|
||||
char mount_path[512];
|
||||
uint32_t mountpoint;
|
||||
} vfs_dir_t;
|
||||
|
||||
typedef void* (*vfs_read_callback_t)(char* path, uint32_t offset, uint32_t size);
|
||||
typedef char* (*vfs_read_dir_callback_t)(char* path, uint32_t offset);
|
||||
|
||||
|
||||
// Used to always store the last read/write attempt (used for kernel panic debugging)
|
||||
char vfs_last_read_attempt[512];
|
||||
|
||||
vfs_file_t* vfs_get_from_id(uint32_t id);
|
||||
vfs_dir_t* vfs_get_dir_from_id(uint32_t id);
|
||||
void* vfs_read(vfs_file_t* fp, uint32_t size);
|
||||
char* vfs_dir_read(vfs_dir_t* dir, uint32_t offset);
|
||||
void vfs_seek(vfs_file_t* fp, uint32_t offset, int origin);
|
||||
vfs_file_t* vfs_open(char* path);
|
||||
vfs_dir_t* vfs_dir_open(char* path);
|
||||
int vfs_mount(char* path, vfs_read_callback_t read_callback, vfs_read_dir_callback_t read_dir_callback);
|
||||
94
samples/C/vmem.h
Normal file
94
samples/C/vmem.h
Normal file
@@ -0,0 +1,94 @@
|
||||
#pragma once
|
||||
|
||||
/* Copyright © 2011 Fritz Grimpen
|
||||
* Copyright © 2013 Lukas Martini
|
||||
*
|
||||
* This file is part of Xelix.
|
||||
*
|
||||
* Xelix 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.
|
||||
*
|
||||
* Xelix 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 Xelix. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <lib/generic.h>
|
||||
|
||||
struct vmem_context;
|
||||
|
||||
struct vmem_page
|
||||
{
|
||||
enum
|
||||
{
|
||||
VMEM_SECTION_STACK, /* Initial stack */
|
||||
VMEM_SECTION_CODE, /* Contains program code and is read-only */
|
||||
VMEM_SECTION_DATA, /* Contains static data */
|
||||
VMEM_SECTION_HEAP, /* Allocated by brk(2) at runtime */
|
||||
VMEM_SECTION_MMAP, /* Allocated by mmap(2) at runtime */
|
||||
VMEM_SECTION_KERNEL, /* Contains kernel-internal data */
|
||||
VMEM_SECTION_UNMAPPED /* Unmapped */
|
||||
} section;
|
||||
|
||||
bool readonly:1;
|
||||
bool cow:1; /* Copy-on-Write mechanism */
|
||||
bool allocated:1;
|
||||
|
||||
void *cow_src_addr;
|
||||
void *virt_addr;
|
||||
void *phys_addr;
|
||||
};
|
||||
|
||||
typedef void (*vmem_iterator_t)(struct vmem_context *, struct vmem_page *, uint32_t);
|
||||
|
||||
/* Initialize vmem_kernelContext for paging_init() */
|
||||
void vmem_init();
|
||||
struct vmem_context *vmem_kernelContext;
|
||||
struct vmem_context *vmem_currentContext;
|
||||
struct vmem_context *vmem_processContext;
|
||||
void *vmem_faultAddress;
|
||||
|
||||
/* Some callbacks for magic functions */
|
||||
void (*vmem_applyPage)(struct vmem_context *, struct vmem_page *);
|
||||
|
||||
/* Generate new page context */
|
||||
struct vmem_context *vmem_new();
|
||||
struct vmem_page *vmem_new_page();
|
||||
|
||||
int vmem_add_page(struct vmem_context *ctx, struct vmem_page *pg);
|
||||
|
||||
struct vmem_page *vmem_get_page_phys(struct vmem_context *ctx, void *phys_addr);
|
||||
struct vmem_page *vmem_get_page_virt(struct vmem_context *ctx, void *virt_addr);
|
||||
struct vmem_page *vmem_get_page(struct vmem_context *ctx, uint32_t offset);
|
||||
|
||||
/* Remove pages in a specific context by physical or virtual address */
|
||||
struct vmem_page *vmem_rm_page_phys(struct vmem_context *ctx, void *phys_addr);
|
||||
struct vmem_page *vmem_rm_page_virt(struct vmem_context *ctx, void *virt_addr);
|
||||
|
||||
/* Iterator */
|
||||
int vmem_iterate(struct vmem_context *ctx, vmem_iterator_t callback);
|
||||
|
||||
uint32_t vmem_count_pages(struct vmem_context *ctx);
|
||||
void vmem_dump_page(struct vmem_page *pg);
|
||||
void vmem_dump(struct vmem_context *ctx);
|
||||
void vmem_handle_fault(uint32_t code, void *addr, void *instruction);
|
||||
|
||||
/* Get/Set cached paging context */
|
||||
void vmem_set_cache(struct vmem_context *ctx, void *cache);
|
||||
void *vmem_get_cache(struct vmem_context *ctx);
|
||||
|
||||
#ifdef __i386__
|
||||
#define PAGE_SIZE 4096
|
||||
#define VMEM_ALIGN(x) (typeof(x))(((intptr_t)(x) & 0xFFFFF000) + 0x1000)
|
||||
#define VMEM_ALIGN_DOWN(x) (typeof(x))( \
|
||||
((intptr_t)(x) - ((intptr_t)(x) % PAGE_SIZE)))
|
||||
#else
|
||||
#define PAGE_SIZE 0
|
||||
#define VMEM_ALIGN(x) (x)
|
||||
#endif
|
||||
12
samples/CMake/filenames/CMakeLists.txt
Normal file
12
samples/CMake/filenames/CMakeLists.txt
Normal file
@@ -0,0 +1,12 @@
|
||||
cmake_minimum_required(VERSION 2.8)
|
||||
|
||||
project(Foo)
|
||||
|
||||
set(CMAKE_SKIP_RPATH TRUE)
|
||||
set(CMAKE_INSTALL_PREFIX "/usr/local")
|
||||
|
||||
add_subdirectory(bar)
|
||||
|
||||
add_executable(foo foo.c)
|
||||
target_link_libraries(foo pthread)
|
||||
install(TARGETS foo DESTINATION bin)
|
||||
49
samples/F#/Combinators.fs
Normal file
49
samples/F#/Combinators.fs
Normal file
@@ -0,0 +1,49 @@
|
||||
namespace Nessos.FsPickler.Combinators
|
||||
|
||||
open Nessos.FsPickler
|
||||
open Nessos.FsPickler.Json
|
||||
|
||||
/// Json pickling methods
|
||||
[<RequireQualifiedAccess>]
|
||||
module Json =
|
||||
|
||||
let private jsonSerializer = lazy(FsPickler.CreateJson(omitHeader = true))
|
||||
|
||||
/// <summary>
|
||||
/// Pickles a value to Json.
|
||||
/// </summary>
|
||||
/// <param name="pickler">utilized pickler.</param>
|
||||
/// <param name="value">input value.</param>
|
||||
let pickle (pickler : Pickler<'T>) (value : 'T) : string =
|
||||
jsonSerializer.Value.PickleToString (pickler, value)
|
||||
|
||||
/// <summary>
|
||||
/// Unpickles a value from Json.
|
||||
/// </summary>
|
||||
/// <param name="pickler">utilized pickler.</param>
|
||||
/// <param name="pickle">input pickle.</param>
|
||||
let unpickle (pickler : Pickler<'T>) (pickle : string) : 'T =
|
||||
jsonSerializer.Value.UnPickleOfString (pickler, pickle)
|
||||
|
||||
|
||||
/// Bson pickling methods
|
||||
[<RequireQualifiedAccess>]
|
||||
module Bson =
|
||||
|
||||
let private bsonPickler = lazy(FsPickler.CreateBson())
|
||||
|
||||
/// <summary>
|
||||
/// Pickles a value to Bson.
|
||||
/// </summary>
|
||||
/// <param name="pickler">utilized pickler.</param>
|
||||
/// <param name="value">input value.</param>
|
||||
let pickle (pickler : Pickler<'T>) (value : 'T) : byte [] =
|
||||
bsonPickler.Value.Pickle (pickler, value)
|
||||
|
||||
/// <summary>
|
||||
/// Unpickles a value from bson.
|
||||
/// </summary>
|
||||
/// <param name="pickler">utilized pickler.</param>
|
||||
/// <param name="pickle">input pickle.</param>
|
||||
let unpickle (pickler : Pickler<'T>) (pickle : byte []) : 'T =
|
||||
bsonPickler.Value.UnPickle (pickler, pickle)
|
||||
65
samples/F#/JsonFormat.fs
Normal file
65
samples/F#/JsonFormat.fs
Normal file
@@ -0,0 +1,65 @@
|
||||
namespace Nessos.FsPickler.Json
|
||||
|
||||
open System
|
||||
open System.IO
|
||||
open System.Text
|
||||
|
||||
open Newtonsoft.Json
|
||||
|
||||
open Nessos.FsPickler
|
||||
|
||||
/// <summary>
|
||||
/// Factory methods for the Json serialization format.
|
||||
/// </summary>
|
||||
type JsonPickleFormatProvider internal (indent, omitHeader) as self =
|
||||
|
||||
let isCustomSeq isTopLevelSequence =
|
||||
isTopLevelSequence && self.OmitHeader && self.UseCustomTopLevelSequenceSeparator
|
||||
|
||||
let mutable sequenceSeparator = " "
|
||||
|
||||
member val Indent = indent with get,set
|
||||
member val OmitHeader = omitHeader with get,set
|
||||
member val UseCustomTopLevelSequenceSeparator = false with get,set
|
||||
|
||||
member __.SequenceSeparator
|
||||
with get () = sequenceSeparator
|
||||
and set sep =
|
||||
if sep <> null && String.IsNullOrWhiteSpace sep then
|
||||
sequenceSeparator <- sep
|
||||
else
|
||||
invalidArg "SequenceSeparator" "should be non-null whitespace."
|
||||
|
||||
interface ITextPickleFormatProvider with
|
||||
member __.Name = "Json"
|
||||
|
||||
// see discussion : https://github.com/nessos/FsPickler/issues/17
|
||||
member __.DefaultEncoding = new UTF8Encoding(false) :> Encoding
|
||||
|
||||
member __.CreateWriter (stream, encoding, isTopLevelSequence, leaveOpen) =
|
||||
#if NET40
|
||||
if leaveOpen then raise <| new NotSupportedException("'leaveOpen' not supported in .NET 40.")
|
||||
let sw = new StreamWriter(stream, encoding)
|
||||
#else
|
||||
let sw = new StreamWriter(stream, encoding, 1024, leaveOpen)
|
||||
#endif
|
||||
let jw = new JsonTextWriter(sw)
|
||||
new JsonPickleWriter(jw, __.OmitHeader, __.Indent, isCustomSeq isTopLevelSequence, sequenceSeparator, leaveOpen) :> _
|
||||
|
||||
member __.CreateReader (stream, encoding, isTopLevelSequence, leaveOpen) =
|
||||
#if NET40
|
||||
if leaveOpen then raise <| new NotSupportedException("'leaveOpen' not supported in .NET 40.")
|
||||
let sr = new StreamReader(stream, encoding)
|
||||
#else
|
||||
let sr = new StreamReader(stream, encoding, true, 1024, leaveOpen)
|
||||
#endif
|
||||
let jr = new JsonTextReader(sr)
|
||||
new JsonPickleReader(jr, __.OmitHeader, isCustomSeq isTopLevelSequence, leaveOpen) :> _
|
||||
|
||||
member __.CreateWriter (textWriter, isTopLevelSequence, leaveOpen) =
|
||||
let jw = new JsonTextWriter(textWriter)
|
||||
new JsonPickleWriter(jw, __.OmitHeader, __.Indent, isCustomSeq isTopLevelSequence, sequenceSeparator, leaveOpen) :> _
|
||||
|
||||
member __.CreateReader (textReader, isTopLevelSequence, leaveOpen) =
|
||||
let jr = new JsonTextReader(textReader)
|
||||
new JsonPickleReader(jr, __.OmitHeader, isCustomSeq isTopLevelSequence, leaveOpen) :> _
|
||||
202
samples/F#/JsonReader.fs
Normal file
202
samples/F#/JsonReader.fs
Normal file
@@ -0,0 +1,202 @@
|
||||
namespace Nessos.FsPickler.Json
|
||||
|
||||
open System
|
||||
open System.Collections.Generic
|
||||
open System.Globalization
|
||||
open System.IO
|
||||
open System.Numerics
|
||||
open System.Text
|
||||
|
||||
open Newtonsoft.Json
|
||||
|
||||
open Nessos.FsPickler
|
||||
|
||||
/// <summary>
|
||||
/// Json format deserializer
|
||||
/// </summary>
|
||||
type internal JsonPickleReader (jsonReader : JsonReader, omitHeader, isTopLevelSequence, leaveOpen) =
|
||||
|
||||
do
|
||||
jsonReader.CloseInput <- not leaveOpen
|
||||
jsonReader.SupportMultipleContent <- isTopLevelSequence
|
||||
|
||||
let isBsonReader = match jsonReader with :? Bson.BsonReader -> true | _ -> false
|
||||
|
||||
let mutable depth = 0
|
||||
let arrayStack = new Stack<int> ()
|
||||
do arrayStack.Push Int32.MinValue
|
||||
|
||||
// do not write tag if omitting header or array element
|
||||
let omitTag () = (omitHeader && depth = 0) || arrayStack.Peek() = depth - 1
|
||||
|
||||
interface IPickleFormatReader with
|
||||
|
||||
member __.BeginReadRoot (tag : string) =
|
||||
do jsonReader.Read() |> ignore
|
||||
|
||||
if omitHeader then () else
|
||||
|
||||
if jsonReader.TokenType <> JsonToken.StartObject then raise <| new FormatException("invalid json root object.")
|
||||
else
|
||||
do jsonReader.MoveNext()
|
||||
let version = jsonReader.ReadPrimitiveAs<string> false "FsPickler"
|
||||
if version <> jsonFormatVersion then
|
||||
let v = Version(version)
|
||||
raise <| new FormatException(sprintf "Invalid FsPickler format version %O." version)
|
||||
|
||||
let sTag = jsonReader.ReadPrimitiveAs<string> false "type"
|
||||
if tag <> sTag then
|
||||
raise <| new InvalidPickleTypeException(tag, sTag)
|
||||
|
||||
member __.EndReadRoot () =
|
||||
if not omitHeader then jsonReader.Read() |> ignore
|
||||
|
||||
member __.BeginReadObject (tag : string) =
|
||||
|
||||
if not <| omitTag () then
|
||||
jsonReader.ReadProperty tag
|
||||
jsonReader.MoveNext ()
|
||||
|
||||
if isTopLevelSequence && depth = 0 then
|
||||
arrayStack.Push depth
|
||||
depth <- depth + 1
|
||||
ObjectFlags.IsSequenceHeader
|
||||
|
||||
else
|
||||
match jsonReader.TokenType with
|
||||
| JsonToken.Null -> ObjectFlags.IsNull
|
||||
| JsonToken.StartArray ->
|
||||
jsonReader.MoveNext()
|
||||
arrayStack.Push depth
|
||||
depth <- depth + 1
|
||||
ObjectFlags.IsSequenceHeader
|
||||
|
||||
| JsonToken.StartObject ->
|
||||
do jsonReader.MoveNext()
|
||||
depth <- depth + 1
|
||||
|
||||
if jsonReader.ValueAs<string> () = "_flags" then
|
||||
jsonReader.MoveNext()
|
||||
let csvFlags = jsonReader.ValueAs<string>()
|
||||
jsonReader.MoveNext()
|
||||
parseFlagCsv csvFlags
|
||||
else
|
||||
ObjectFlags.None
|
||||
|
||||
| token -> raise <| new FormatException(sprintf "expected start of Json object but was '%O'." token)
|
||||
|
||||
|
||||
member __.EndReadObject () =
|
||||
if isTopLevelSequence && depth = 1 then
|
||||
arrayStack.Pop () |> ignore
|
||||
depth <- depth - 1
|
||||
jsonReader.Read() |> ignore
|
||||
else
|
||||
match jsonReader.TokenType with
|
||||
| JsonToken.Null -> ()
|
||||
| JsonToken.EndObject -> depth <- depth - 1
|
||||
| JsonToken.EndArray ->
|
||||
arrayStack.Pop() |> ignore
|
||||
depth <- depth - 1
|
||||
|
||||
| token -> raise <| new FormatException(sprintf "expected end of Json object but was '%O'." token)
|
||||
|
||||
if omitHeader && depth = 0 then ()
|
||||
else jsonReader.Read() |> ignore
|
||||
|
||||
member __.SerializeUnionCaseNames = true
|
||||
|
||||
member __.PreferLengthPrefixInSequences = false
|
||||
member __.ReadNextSequenceElement () =
|
||||
if isTopLevelSequence && depth = 1 then
|
||||
jsonReader.TokenType <> JsonToken.None
|
||||
else
|
||||
jsonReader.TokenType <> JsonToken.EndArray
|
||||
|
||||
member __.ReadCachedObjectId () = jsonReader.ReadPrimitiveAs<int64> false "id"
|
||||
|
||||
member __.ReadBoolean tag = jsonReader.ReadPrimitiveAs<bool> (omitTag ()) tag
|
||||
member __.ReadByte tag = jsonReader.ReadPrimitiveAs<int64> (omitTag ()) tag |> byte
|
||||
member __.ReadSByte tag = jsonReader.ReadPrimitiveAs<int64> (omitTag ()) tag |> sbyte
|
||||
|
||||
member __.ReadInt16 tag = jsonReader.ReadPrimitiveAs<int64> (omitTag ()) tag |> int16
|
||||
member __.ReadInt32 tag = jsonReader.ReadPrimitiveAs<int64> (omitTag ()) tag |> int
|
||||
member __.ReadInt64 tag = jsonReader.ReadPrimitiveAs<int64> (omitTag ()) tag
|
||||
|
||||
member __.ReadUInt16 tag = jsonReader.ReadPrimitiveAs<int64> (omitTag ()) tag |> uint16
|
||||
member __.ReadUInt32 tag = jsonReader.ReadPrimitiveAs<int64> (omitTag ()) tag |> uint32
|
||||
member __.ReadUInt64 tag = jsonReader.ReadPrimitiveAs<int64> (omitTag ()) tag |> uint64
|
||||
|
||||
member __.ReadSingle tag =
|
||||
if not <| omitTag () then
|
||||
jsonReader.ReadProperty tag
|
||||
jsonReader.MoveNext()
|
||||
|
||||
let value =
|
||||
match jsonReader.TokenType with
|
||||
| JsonToken.Float -> jsonReader.ValueAs<double> () |> single
|
||||
| JsonToken.String -> Single.Parse(jsonReader.ValueAs<string>(), CultureInfo.InvariantCulture)
|
||||
| _ -> raise <| new FormatException("not a float.")
|
||||
|
||||
jsonReader.Read() |> ignore
|
||||
value
|
||||
|
||||
member __.ReadDouble tag =
|
||||
if not <| omitTag () then
|
||||
jsonReader.ReadProperty tag
|
||||
jsonReader.MoveNext()
|
||||
|
||||
let value =
|
||||
match jsonReader.TokenType with
|
||||
| JsonToken.Float -> jsonReader.ValueAs<double> ()
|
||||
| JsonToken.String -> Double.Parse(jsonReader.ValueAs<string>(), CultureInfo.InvariantCulture)
|
||||
| _ -> raise <| new FormatException("not a float.")
|
||||
|
||||
jsonReader.Read() |> ignore
|
||||
value
|
||||
|
||||
member __.ReadChar tag = let value = jsonReader.ReadPrimitiveAs<string> (omitTag ()) tag in value.[0]
|
||||
member __.ReadString tag = jsonReader.ReadPrimitiveAs<string> (omitTag ()) tag
|
||||
member __.ReadBigInteger tag = jsonReader.ReadPrimitiveAs<string> (omitTag ()) tag |> BigInteger.Parse
|
||||
|
||||
member __.ReadGuid tag =
|
||||
if isBsonReader then
|
||||
jsonReader.ReadPrimitiveAs<Guid> (omitTag ()) tag
|
||||
else
|
||||
jsonReader.ReadPrimitiveAs<string> (omitTag ()) tag |> Guid.Parse
|
||||
|
||||
member __.ReadTimeSpan tag = jsonReader.ReadPrimitiveAs<string> (omitTag ()) tag |> TimeSpan.Parse
|
||||
member __.ReadDecimal tag = jsonReader.ReadPrimitiveAs<string> (omitTag ()) tag |> decimal
|
||||
|
||||
// BSON spec mandates the use of Unix time;
|
||||
// this has millisecond precision which results in loss of accuracy w.r.t. ticks
|
||||
// since the goal of FsPickler is to offer faithful representations of .NET objects
|
||||
// we choose to override the spec and serialize ticks outright.
|
||||
// see also https://json.codeplex.com/discussions/212067
|
||||
member __.ReadDate tag =
|
||||
if isBsonReader then
|
||||
let ticks = jsonReader.ReadPrimitiveAs<int64> (omitTag ()) tag
|
||||
DateTime(ticks)
|
||||
else
|
||||
jsonReader.ReadPrimitiveAs<DateTime> (omitTag ()) tag
|
||||
|
||||
member __.ReadBytes tag =
|
||||
if not <| omitTag () then
|
||||
jsonReader.ReadProperty tag
|
||||
jsonReader.Read() |> ignore
|
||||
|
||||
let bytes =
|
||||
if jsonReader.TokenType = JsonToken.Null then null
|
||||
elif isBsonReader then jsonReader.ValueAs<byte []> ()
|
||||
else
|
||||
let base64 = jsonReader.ValueAs<string> ()
|
||||
Convert.FromBase64String base64
|
||||
|
||||
jsonReader.Read() |> ignore
|
||||
|
||||
bytes
|
||||
|
||||
member __.IsPrimitiveArraySerializationSupported = false
|
||||
member __.ReadPrimitiveArray _ _ = raise <| new NotImplementedException()
|
||||
|
||||
member __.Dispose () = (jsonReader :> IDisposable).Dispose()
|
||||
85
samples/F#/JsonSerializer.fs
Normal file
85
samples/F#/JsonSerializer.fs
Normal file
@@ -0,0 +1,85 @@
|
||||
namespace Nessos.FsPickler.Json
|
||||
|
||||
open System
|
||||
|
||||
open Nessos.FsPickler
|
||||
|
||||
type internal OAttribute = System.Runtime.InteropServices.OptionalAttribute
|
||||
type internal DAttribute = System.Runtime.InteropServices.DefaultParameterValueAttribute
|
||||
|
||||
/// <summary>
|
||||
/// Json pickler instance.
|
||||
/// </summary>
|
||||
type JsonSerializer =
|
||||
inherit FsPicklerTextSerializer
|
||||
|
||||
val private format : JsonPickleFormatProvider
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new Json pickler instance.
|
||||
/// </summary>
|
||||
/// <param name="indent">indent out Json pickles.</param>
|
||||
/// <param name="omitHeader">omit FsPickler header in Json pickles.</param>
|
||||
/// <param name="typeConverter">specify a custom type name converter.</param>
|
||||
new ([<O;D(null)>] ?indent, [<O;D(null)>] ?omitHeader, [<O;D(null)>] ?typeConverter) =
|
||||
let indent = defaultArg indent false
|
||||
let omitHeader = defaultArg omitHeader false
|
||||
let json = new JsonPickleFormatProvider(indent, omitHeader)
|
||||
{
|
||||
inherit FsPicklerTextSerializer(json, ?typeConverter = typeConverter)
|
||||
format = json
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets whether Json output should be indented.
|
||||
/// </summary>
|
||||
member x.Indent
|
||||
with get () = x.format.Indent
|
||||
and set b = x.format.Indent <- b
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets whether FsPickler headers should be ignored in pickle format.
|
||||
/// </summary>
|
||||
member x.OmitHeader
|
||||
with get () = x.format.OmitHeader
|
||||
and set b = x.format.OmitHeader <- b
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets a non-null whitespace string that serves as a custom, top-level sequence separator.
|
||||
/// </summary>
|
||||
member x.SequenceSeparator
|
||||
with get () = x.format.SequenceSeparator
|
||||
and set sep = x.format.SequenceSeparator <- sep
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets whether top-level sequences should be serialized using the custom separator.
|
||||
/// </summary>
|
||||
member x.UseCustomTopLevelSequenceSeparator
|
||||
with get () = x.format.UseCustomTopLevelSequenceSeparator
|
||||
and set e = x.format.UseCustomTopLevelSequenceSeparator <- e
|
||||
|
||||
/// <summary>
|
||||
/// BSON pickler instance.
|
||||
/// </summary>
|
||||
type BsonSerializer([<O;D(null)>] ?typeConverter) =
|
||||
inherit FsPicklerSerializer(new BsonPickleFormatProvider(), ?typeConverter = typeConverter)
|
||||
|
||||
|
||||
/// FsPickler static methods.
|
||||
type FsPickler =
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new Json pickler instance.
|
||||
/// </summary>
|
||||
/// <param name="indent">indent out Json pickles.</param>
|
||||
/// <param name="omitHeader">omit FsPickler header in Json pickles.</param>
|
||||
/// <param name="typeConverter">specify a custom type name converter.</param>
|
||||
static member CreateJson([<O;D(null)>] ?indent, [<O;D(null)>] ?omitHeader, [<O;D(null)>] ?typeConverter) =
|
||||
new JsonSerializer(?indent = indent, ?omitHeader = omitHeader, ?typeConverter = typeConverter)
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new Bson pickler instance.
|
||||
/// </summary>
|
||||
/// <param name="typeConverter">specify a custom type name converter.</param>
|
||||
static member CreateBson([<O;D(null)>] ?typeConverter) =
|
||||
new BsonSerializer(?typeConverter = typeConverter)
|
||||
142
samples/F#/JsonWriter.fs
Normal file
142
samples/F#/JsonWriter.fs
Normal file
@@ -0,0 +1,142 @@
|
||||
namespace Nessos.FsPickler.Json
|
||||
|
||||
open System
|
||||
open System.IO
|
||||
open System.Collections.Generic
|
||||
|
||||
open Newtonsoft.Json
|
||||
|
||||
open Nessos.FsPickler
|
||||
|
||||
/// <summary>
|
||||
/// Json format serializer.
|
||||
/// </summary>
|
||||
type internal JsonPickleWriter (jsonWriter : JsonWriter, omitHeader, indented, isTopLevelSequence, separator, leaveOpen) =
|
||||
|
||||
do
|
||||
jsonWriter.Formatting <- if indented then Formatting.Indented else Formatting.None
|
||||
jsonWriter.CloseOutput <- not leaveOpen
|
||||
|
||||
let isBsonWriter = match jsonWriter with :? Bson.BsonWriter -> true | _ -> false
|
||||
|
||||
let mutable depth = 0
|
||||
let mutable isTopLevelSequenceHead = false
|
||||
let mutable currentValueIsNull = false
|
||||
|
||||
let arrayStack = new Stack<int> ()
|
||||
do arrayStack.Push Int32.MinValue
|
||||
|
||||
// do not write tag if omitting header or array element
|
||||
let omitTag () = (omitHeader && depth = 0) || arrayStack.Peek() = depth - 1
|
||||
|
||||
interface IPickleFormatWriter with
|
||||
|
||||
member __.BeginWriteRoot (tag : string) =
|
||||
if omitHeader then () else
|
||||
|
||||
jsonWriter.WriteStartObject()
|
||||
writePrimitive jsonWriter false "FsPickler" jsonFormatVersion
|
||||
writePrimitive jsonWriter false "type" tag
|
||||
|
||||
member __.EndWriteRoot () =
|
||||
if not omitHeader then jsonWriter.WriteEnd()
|
||||
|
||||
member __.BeginWriteObject (tag : string) (flags : ObjectFlags) =
|
||||
|
||||
if not <| omitTag () then
|
||||
jsonWriter.WritePropertyName tag
|
||||
|
||||
if flags.HasFlag ObjectFlags.IsNull then
|
||||
currentValueIsNull <- true
|
||||
jsonWriter.WriteNull()
|
||||
|
||||
elif flags.HasFlag ObjectFlags.IsSequenceHeader then
|
||||
if isTopLevelSequence && depth = 0 then
|
||||
isTopLevelSequenceHead <- true
|
||||
else
|
||||
jsonWriter.WriteStartArray()
|
||||
|
||||
arrayStack.Push depth
|
||||
depth <- depth + 1
|
||||
else
|
||||
jsonWriter.WriteStartObject()
|
||||
depth <- depth + 1
|
||||
|
||||
if flags = ObjectFlags.None then ()
|
||||
else
|
||||
let flagCsv = mkFlagCsv flags
|
||||
writePrimitive jsonWriter false "_flags" flagCsv
|
||||
|
||||
member __.EndWriteObject () =
|
||||
if currentValueIsNull then
|
||||
currentValueIsNull <- false
|
||||
else
|
||||
depth <- depth - 1
|
||||
if arrayStack.Peek () = depth then
|
||||
if isTopLevelSequence && depth = 0 then ()
|
||||
else
|
||||
jsonWriter.WriteEndArray()
|
||||
|
||||
arrayStack.Pop () |> ignore
|
||||
else
|
||||
jsonWriter.WriteEndObject()
|
||||
|
||||
member __.SerializeUnionCaseNames = true
|
||||
|
||||
member __.PreferLengthPrefixInSequences = false
|
||||
member __.WriteNextSequenceElement hasNext =
|
||||
if isTopLevelSequence && depth = 1 then
|
||||
if isTopLevelSequenceHead then
|
||||
isTopLevelSequenceHead <- false
|
||||
else
|
||||
jsonWriter.WriteWhitespace separator
|
||||
|
||||
member __.WriteCachedObjectId id = writePrimitive jsonWriter false "id" id
|
||||
|
||||
member __.WriteBoolean (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value
|
||||
member __.WriteByte (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value
|
||||
member __.WriteSByte (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value
|
||||
|
||||
member __.WriteInt16 (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value
|
||||
member __.WriteInt32 (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value
|
||||
member __.WriteInt64 (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value
|
||||
|
||||
member __.WriteUInt16 (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value
|
||||
member __.WriteUInt32 (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value
|
||||
member __.WriteUInt64 (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value
|
||||
|
||||
member __.WriteSingle (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value
|
||||
member __.WriteDouble (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value
|
||||
member __.WriteDecimal (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag (string value)
|
||||
|
||||
member __.WriteChar (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value
|
||||
member __.WriteString (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value
|
||||
member __.WriteBigInteger (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag (string value)
|
||||
|
||||
member __.WriteGuid (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value
|
||||
member __.WriteTimeSpan (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag (string value)
|
||||
|
||||
// BSON spec mandates the use of Unix time;
|
||||
// this has millisecond precision which results in loss of accuracy w.r.t. ticks
|
||||
// since the goal of FsPickler is to offer faithful representations of .NET objects
|
||||
// we choose to override the spec and serialize ticks outright.
|
||||
// see also https://json.codeplex.com/discussions/212067
|
||||
member __.WriteDate (tag : string) value =
|
||||
if isBsonWriter then
|
||||
writePrimitive jsonWriter (omitTag ()) tag value.Ticks
|
||||
else
|
||||
writePrimitive jsonWriter (omitTag ()) tag value
|
||||
|
||||
member __.WriteBytes (tag : string) (value : byte []) =
|
||||
if not <| omitTag () then
|
||||
jsonWriter.WritePropertyName tag
|
||||
|
||||
if obj.ReferenceEquals(value, null) then
|
||||
jsonWriter.WriteNull()
|
||||
else
|
||||
jsonWriter.WriteValue value
|
||||
|
||||
member __.IsPrimitiveArraySerializationSupported = false
|
||||
member __.WritePrimitiveArray _ _ = raise <| NotSupportedException()
|
||||
|
||||
member __.Dispose () = jsonWriter.Flush()
|
||||
68
samples/F#/PerformanceTesters.fs
Normal file
68
samples/F#/PerformanceTesters.fs
Normal file
@@ -0,0 +1,68 @@
|
||||
namespace Nessos.FsPickler.Tests
|
||||
|
||||
open PerfUtil
|
||||
open PerfUtil.NUnit
|
||||
|
||||
open NUnit.Framework
|
||||
|
||||
open Nessos.FsPickler
|
||||
open Nessos.FsPickler.Json
|
||||
|
||||
[<AbstractClass>]
|
||||
type PerfTester () =
|
||||
inherit NUnitPerf<Serializer> ()
|
||||
|
||||
let tests = PerfTest.OfModuleMarker<PerformanceTests.Marker> ()
|
||||
|
||||
override __.PerfTests = tests
|
||||
|
||||
|
||||
type ``Serializer Comparison`` () =
|
||||
inherit PerfTester()
|
||||
|
||||
let fsp = FsPickler.initBinary()
|
||||
let bfs = new BinaryFormatterSerializer() :> Serializer
|
||||
let ndc = new NetDataContractSerializer() :> Serializer
|
||||
let jdn = new JsonDotNetSerializer() :> Serializer
|
||||
let bdn = new JsonDotNetBsonSerializer () :> Serializer
|
||||
let pbn = new ProtoBufSerializer() :> Serializer
|
||||
let ssj = new ServiceStackJsonSerializer() :> Serializer
|
||||
let sst = new ServiceStackTypeSerializer() :> Serializer
|
||||
|
||||
let comparer = new WeightedComparer(spaceFactor = 0.2, leastAcceptableImprovementFactor = 1.)
|
||||
let tester = new ImplementationComparer<_>(fsp, [bfs;ndc;jdn;bdn;pbn;ssj;sst], throwOnError = true, warmup = true, comparer = comparer)
|
||||
|
||||
override __.PerfTester = tester :> _
|
||||
|
||||
|
||||
type ``FsPickler Formats Comparison`` () =
|
||||
inherit PerfTester ()
|
||||
|
||||
let binary = FsPickler.initBinary()
|
||||
let json = FsPickler.initJson()
|
||||
let bson = FsPickler.initBson()
|
||||
let xml = FsPickler.initXml()
|
||||
|
||||
let tester = new ImplementationComparer<_>(binary, [json ; bson; xml], warmup = true, throwOnError = false)
|
||||
|
||||
override __.PerfTester = tester :> _
|
||||
|
||||
|
||||
type ``Past FsPickler Versions Comparison`` () =
|
||||
inherit PerfTester ()
|
||||
|
||||
let persistResults = true
|
||||
let persistenceFile = "fspPerf.xml"
|
||||
|
||||
let fsp = FsPickler.initBinary()
|
||||
let version = typeof<FsPickler>.Assembly.GetName().Version
|
||||
let comparer = new WeightedComparer(spaceFactor = 0.2, leastAcceptableImprovementFactor = 0.8)
|
||||
let tester =
|
||||
new PastImplementationComparer<Serializer>(
|
||||
fsp, version, historyFile = persistenceFile, throwOnError = true, warmup = true, comparer = comparer)
|
||||
|
||||
override __.PerfTester = tester :> _
|
||||
|
||||
[<TestFixtureTearDown>]
|
||||
member __.Persist() =
|
||||
if persistResults then tester.PersistCurrentResults ()
|
||||
207
samples/F#/PerformanceTests.fs
Normal file
207
samples/F#/PerformanceTests.fs
Normal file
@@ -0,0 +1,207 @@
|
||||
namespace Nessos.FsPickler.Tests
|
||||
|
||||
open System
|
||||
open System.Collections.Generic
|
||||
|
||||
open PerfUtil
|
||||
|
||||
open Nessos.FsPickler
|
||||
open Nessos.FsPickler.Tests.Serializer
|
||||
open Nessos.FsPickler.Tests.TestTypes
|
||||
|
||||
module PerformanceTests =
|
||||
|
||||
type Marker = class end
|
||||
|
||||
let guid = Guid.NewGuid()
|
||||
|
||||
[<PerfTest(1000)>]
|
||||
let ``Value: Guid`` s = roundtrip guid s
|
||||
|
||||
let date = DateTime.Now
|
||||
|
||||
[<PerfTest(1000)>]
|
||||
let ``Value: DateTime`` s = roundtrip date s
|
||||
|
||||
[<PerfTest(10000)>]
|
||||
let ``Value: String`` s = roundtrip stringValue s
|
||||
|
||||
|
||||
let boxed = box ([| 1 .. 1000 |], "lorem ipsum")
|
||||
|
||||
[<PerfTest(1000)>]
|
||||
let ``Boxed Object`` s = roundtrip boxed s
|
||||
|
||||
let fsClass = new Class(42, stringValue)
|
||||
|
||||
[<PerfTest(10000)>]
|
||||
let ``Class: Simple F# Class`` s = roundtrip fsClass s
|
||||
|
||||
let serializableClass = new SerializableClass<_>(42, stringValue, [|1..1000|])
|
||||
|
||||
[<PerfTest(10000)>]
|
||||
let ``Class: ISerializable`` s = roundtrip serializableClass s
|
||||
|
||||
let boxedClass = box(Some 42)
|
||||
|
||||
[<PerfTest(10000)>]
|
||||
let ``Subtype Resolution`` s = roundtrip boxedClass s
|
||||
|
||||
let floatArray = Array.init 100000 (fun i -> float i)
|
||||
|
||||
[<PerfTest(10)>]
|
||||
let ``Array: Float`` s = roundtrip floatArray s
|
||||
|
||||
let intArray = Array.init 100000 id
|
||||
|
||||
[<PerfTest(10)>]
|
||||
let ``Array: Int`` s = roundtrip intArray s
|
||||
|
||||
let stringArray = Array.init 10000 (fun i -> stringValue + string i)
|
||||
|
||||
[<PerfTest(100)>]
|
||||
let ``Array: String`` s = roundtrip stringArray s
|
||||
|
||||
let kvarr = [|1..10000|] |> Array.map (fun i -> i, string i)
|
||||
|
||||
[<PerfTest(100)>]
|
||||
let ``Array: Key-Value Pairs`` s = roundtrip kvarr s
|
||||
|
||||
let duArray = [| for i in 1 .. 10000 -> (Something ("asdasdasdas", i)) |]
|
||||
|
||||
[<PerfTest(100)>]
|
||||
let ``Array: Discriminated Unions`` s = roundtrip duArray s
|
||||
|
||||
let objArray =
|
||||
[|
|
||||
box 2; box 3; box "hello" ; box <| Some 3; box(2,3) ;
|
||||
box <| new Class(2, stringValue) ; box <| new SerializableClass<int option>(2, stringValue, Some 12);
|
||||
box stringValue
|
||||
|]
|
||||
|
||||
[<PerfTest(1000)>]
|
||||
let ``Array: Objects`` s = roundtrip objArray s
|
||||
|
||||
|
||||
let array3D = Array3D.init 100 100 100 (fun i j k -> float (i * j + k))
|
||||
|
||||
[<PerfTest(10)>]
|
||||
let ``Array: Rank-3 Float`` s = roundtrip array3D s
|
||||
|
||||
let bclDict = dict [ for i in 1 .. 1000 -> (string i, i)]
|
||||
|
||||
[<PerfTest(100)>]
|
||||
let ``.NET Dictionary`` s = roundtrip bclDict s
|
||||
|
||||
let bclStack = new Stack<string>([for i in 1 .. 1000 -> string i])
|
||||
|
||||
[<PerfTest(100)>]
|
||||
let ``.NET Stack`` s = roundtrip bclStack s
|
||||
|
||||
let bclList = new List<string * int>([for i in 1 .. 1000 -> string i, i])
|
||||
|
||||
[<PerfTest(100)>]
|
||||
let ``.NET List`` s = roundtrip bclList s
|
||||
|
||||
let bclSet = new SortedSet<_>([for i in 1 .. 1000 -> string i])
|
||||
|
||||
[<PerfTest(100)>]
|
||||
let ``.NET Set`` s = roundtrip bclSet s
|
||||
|
||||
let smallTuple = (1, DateTime.Now,"hello")
|
||||
|
||||
[<PerfTest(10000)>]
|
||||
let ``FSharp: Tuple Small`` s = roundtrip smallTuple s
|
||||
|
||||
let largeTuple = (stringValue, 1, 2, 3, true, "", Some(3.14, [2]), 3, 2, 1, stringValue)
|
||||
|
||||
[<PerfTest(10000)>]
|
||||
let ``FSharp: Tuple Large`` s =
|
||||
roundtrip largeTuple s
|
||||
|
||||
let intList = [1..1000]
|
||||
|
||||
[<PerfTest(1000)>]
|
||||
let ``FSharp: List Int`` s = roundtrip intList s
|
||||
|
||||
let stringList = [ for i in 1 .. 1000 -> stringValue + string i ]
|
||||
|
||||
[<PerfTest(1000)>]
|
||||
let ``FSharp: List String`` s = roundtrip stringList s
|
||||
|
||||
let pairList = [ for i in 1 .. 1000 -> (string i, i) ]
|
||||
|
||||
[<PerfTest(1000)>]
|
||||
let ``FSharp: List Key-Value`` s = roundtrip pairList s
|
||||
|
||||
let nestedLst = let n = [1..1000] in [for _ in 1 .. 100 -> n]
|
||||
|
||||
[<PerfTest(1000)>]
|
||||
let ``FSharp: List Nested`` s = roundtrip nestedLst s
|
||||
|
||||
let union = SomethingElse(stringValue, 42, box (Some 42))
|
||||
|
||||
[<PerfTest(10000)>]
|
||||
let ``FSharp: Union`` s = roundtrip union s
|
||||
|
||||
let record = { Int = 42 ; String = stringValue ; Tuple = (13, "") }
|
||||
|
||||
[<PerfTest(10000)>]
|
||||
let ``FSharp: Record`` s = roundtrip record s
|
||||
|
||||
let peano = int2Peano 100
|
||||
|
||||
[<PerfTest(100)>]
|
||||
let ``FSharp: Peano Rectype`` s = roundtrip peano s
|
||||
|
||||
let closure = (@) [ Some([1..100], Set.ofList [1..100]) ]
|
||||
|
||||
[<PerfTest(1000)>]
|
||||
let ``FSharp: Curried Function`` s = roundtrip closure s
|
||||
|
||||
let binTree = mkTree 10
|
||||
|
||||
[<PerfTest(100)>]
|
||||
let ``FSharp: Binary Tree`` s = roundtrip binTree s
|
||||
|
||||
let intSet = [1..1000] |> List.map string |> set
|
||||
|
||||
[<PerfTest(1000)>]
|
||||
let ``FSharp: Set`` s = roundtrip intSet s
|
||||
|
||||
let fsMap = [1..1000] |> Seq.map (fun i -> (string i,i)) |> Map.ofSeq
|
||||
|
||||
[<PerfTest(1000)>]
|
||||
let ``FSharp: Map`` s = roundtrip fsMap s
|
||||
|
||||
let testType = typeof<int * string option * Map<int * string [], string ref option>>
|
||||
|
||||
[<PerfTest(1000)>]
|
||||
let ``Reflection: Type`` s = roundtrip testType s
|
||||
|
||||
let quotationSmall = <@ fun x -> pown 2 x @>
|
||||
|
||||
let quotationLarge =
|
||||
<@
|
||||
async {
|
||||
let rec fibAsync n =
|
||||
async {
|
||||
match n with
|
||||
| _ when n < 0 -> return invalidArg "negative" "n"
|
||||
| _ when n < 2 -> return n
|
||||
| n ->
|
||||
let! fn = fibAsync (n-1)
|
||||
let! fnn = fibAsync (n-2)
|
||||
return fn + fnn
|
||||
}
|
||||
|
||||
let! values = [1..100] |> Seq.map fibAsync |> Async.Parallel
|
||||
return Seq.sum values
|
||||
}
|
||||
@>
|
||||
|
||||
[<PerfTest(10000)>]
|
||||
let ``FSharp: Quotation Small`` s = roundtrip quotationSmall s
|
||||
|
||||
[<PerfTest(1000)>]
|
||||
let ``FSharp: Quotation Large`` s = roundtrip quotationLarge s
|
||||
244
samples/Forth/asm.fr
Normal file
244
samples/Forth/asm.fr
Normal file
@@ -0,0 +1,244 @@
|
||||
\ Copyright 2013-2014 Lars Brinkhoff
|
||||
|
||||
\ Assembler for x86.
|
||||
|
||||
\ Adds to FORTH vocabulary: ASSEMBLER CODE ;CODE.
|
||||
\ Creates ASSEMBLER vocabulary with: END-CODE and x86 opcodes.
|
||||
|
||||
\ Conventional prefix syntax: "<source> <destination> <opcode>,".
|
||||
\ Addressing modes:
|
||||
\ - immediate: "n #"
|
||||
\ - direct: n
|
||||
\ - register: <reg>
|
||||
\ - indirect: "<reg> )"
|
||||
\ - indirect with displacement: "n <reg> )#"
|
||||
\ - indexed: not supported yet
|
||||
|
||||
require lib/common.fth
|
||||
require search.fth
|
||||
|
||||
vocabulary assembler
|
||||
also assembler definitions
|
||||
|
||||
\ Access to the target image.
|
||||
' header, defer header, is header,
|
||||
' cell defer cell is cell
|
||||
' dp defer dp is dp
|
||||
0 value delta
|
||||
|
||||
: aligned cell + 1 - cell negate nand invert ;
|
||||
: align dp @ aligned dp ! ;
|
||||
: allot dp +! ;
|
||||
: here dp @ ;
|
||||
: cells cell * ;
|
||||
: c! delta + c! ;
|
||||
: c, here c! 1 allot ;
|
||||
: h, dup c, 8 rshift c, ;
|
||||
: , dup h, 16 rshift h, ;
|
||||
|
||||
base @ hex
|
||||
|
||||
\ This constant signals that an operand is not a direct address.
|
||||
deadbeef constant -addr
|
||||
|
||||
\ Assembler state.
|
||||
variable opcode
|
||||
variable d
|
||||
variable s
|
||||
variable dir?
|
||||
variable mrrm defer ?mrrm,
|
||||
variable sib defer ?sib,
|
||||
variable disp defer ?disp,
|
||||
variable imm defer ?imm,
|
||||
defer imm,
|
||||
defer immediate-opcode
|
||||
defer reg
|
||||
defer ?opsize
|
||||
|
||||
\ Set opcode. And destination: register or memory.
|
||||
: opcode! 3@ is immediate-opcode >r opcode ! ;
|
||||
: !reg dir? @ if 2 d ! then dir? off ;
|
||||
: !mem dir? off ;
|
||||
|
||||
\ Set bits in mod/reg/rm byte.
|
||||
: -mrrm ['] nop is ?mrrm, ;
|
||||
: mod! mrrm c0 !bits ;
|
||||
: reg@ mrrm 38 @bits ;
|
||||
: reg! mrrm 38 !bits ;
|
||||
: rm@ mrrm 7 @bits ;
|
||||
: rm! rm@ 3 lshift reg! mrrm 7 !bits ;
|
||||
: reg>opcode rm@ opcode 07 !bits ;
|
||||
: opcode>reg opcode @ dup 3 rshift rm! 8 rshift opcode ! ;
|
||||
|
||||
\ Write parts of instruction to memory.
|
||||
: ds d @ s @ + ;
|
||||
: ?twobyte dup FF > if dup 8 rshift c, then ;
|
||||
: opcode, opcode @ ?twobyte ds + c, ;
|
||||
: mrrm, mrrm @ c, ;
|
||||
: sib, sib @ c, ;
|
||||
: imm8, imm @ c, ;
|
||||
: imm16, imm @ h, ;
|
||||
: imm32, imm @ , ;
|
||||
: disp8, disp @ c, ;
|
||||
: disp32, disp @ , ;
|
||||
|
||||
\ Set operand size.
|
||||
: -opsize 2drop r> drop ;
|
||||
: opsize! is imm, s ! ['] -opsize is ?opsize ;
|
||||
: !op8 0 ['] imm8, ?opsize ;
|
||||
: !op32 1 ['] imm32, ?opsize ;
|
||||
: !op16 1 ['] imm16, ?opsize 66 c, ;
|
||||
|
||||
\ Set SIB byte.
|
||||
: !sib ['] sib, is ?sib, ;
|
||||
: sib! 3 lshift + sib ! !sib ;
|
||||
|
||||
\ Set displacement.
|
||||
: byte? -80 80 within ;
|
||||
: disp! is ?disp, disp ! ;
|
||||
: !disp8 ['] disp8, disp! ;
|
||||
: !disp32 ['] disp32, disp! ;
|
||||
: !disp ( a -- u ) dup byte? if !disp8 40 else !disp32 80 then ;
|
||||
: -pc here 5 + negate ;
|
||||
: relative -pc disp +! ;
|
||||
|
||||
\ Set immediate operand.
|
||||
: imm! imm ! ['] imm, is ?imm, ;
|
||||
|
||||
\ Implements addressing modes: register, indirect, indexed, and direct.
|
||||
: reg1 rm! !reg ;
|
||||
: reg2 3 lshift reg! ;
|
||||
: !reg2 ['] reg2 is reg ;
|
||||
: ind dup mod! rm! !mem !reg2 ;
|
||||
: ind# swap !disp + ind ;
|
||||
: idx 04 ind sib! ;
|
||||
: idx# rot !disp 04 + ind sib! ;
|
||||
: addr !disp32 05 ind ;
|
||||
|
||||
\ Reset assembler state.
|
||||
: 0opsize ['] opsize! is ?opsize ;
|
||||
: 0ds d off s off ;
|
||||
: 0reg ['] reg1 is reg ;
|
||||
: 0mrrm c0 mrrm ! ['] mrrm, is ?mrrm, ;
|
||||
: 0sib ['] nop is ?sib, ;
|
||||
: 0disp ['] nop is ?disp, ;
|
||||
: 0imm imm off ['] nop is ?imm, 0 is imm, ;
|
||||
: 0asm 0imm 0disp 0reg 0ds 0mrrm 0sib 0opsize dir? on ;
|
||||
|
||||
\ Enter and exit assembler mode.
|
||||
: start-code also assembler 0asm ;
|
||||
: end-code align previous ;
|
||||
|
||||
\ Implements addressing mode: immediate.
|
||||
: imm8? imm @ byte? ;
|
||||
: ?sign-extend d off imm8? if 2 d ! ['] imm8, is ?imm, then ;
|
||||
: alu# opcode @ reg! 80 opcode ! ?sign-extend ;
|
||||
: mov# B0 s @ 3 lshift + rm@ + opcode ! 0ds -mrrm ;
|
||||
: push# imm8? if ['] imm8, 6A else ['] imm32, 68 then dup opcode ! rm! is ?imm, ;
|
||||
: test# F6 opcode ! ;
|
||||
: imm-op imm! immediate-opcode ;
|
||||
|
||||
\ Process one operand. All operands except a direct address
|
||||
\ have the stack picture ( n*x xt -addr ).
|
||||
: addr? dup -addr <> ;
|
||||
: op addr? if addr else drop execute then ;
|
||||
|
||||
\ Define instruction formats.
|
||||
: instruction, opcode! opcode, ?mrrm, ?sib, ?disp, ?imm, 0asm ;
|
||||
: mnemonic ( u a "name" -- ) create ['] nop 3, does> instruction, ;
|
||||
: format: create ] !csp does> mnemonic ;
|
||||
: immediate: ' latestxt >body ! ;
|
||||
|
||||
\ Instruction formats.
|
||||
format: 0op -mrrm ;
|
||||
format: 1reg op reg>opcode 0ds -mrrm ;
|
||||
format: 1op opcode>reg op d off ;
|
||||
format: 2op op op ;
|
||||
format: 2op-d op op d off ;
|
||||
format: 2op-ds op op 0ds ;
|
||||
format: 1addr op relative -mrrm ;
|
||||
format: 1imm8 !op8 op -mrrm ;
|
||||
|
||||
\ Instruction mnemonics.
|
||||
00 2op add, immediate: alu#
|
||||
08 2op or, immediate: alu#
|
||||
0F44 2op-ds cmove, \ Todo: other condition codes.
|
||||
0FB6 2op-ds movzx,
|
||||
0FBE 2op-ds movsx,
|
||||
10 2op adc, immediate: alu#
|
||||
18 2op sbb, immediate: alu#
|
||||
20 2op and, immediate: alu#
|
||||
26 0op es,
|
||||
28 2op sub, immediate: alu#
|
||||
2E 0op cs,
|
||||
30 2op xor, immediate: alu#
|
||||
36 0op ss,
|
||||
38 2op cmp, immediate: alu#
|
||||
3E 0op ds,
|
||||
50 1reg push, immediate: push#
|
||||
58 1reg pop,
|
||||
64 0op fs,
|
||||
65 0op gs,
|
||||
\ 70 jcc
|
||||
84 2op-d test, immediate: test#
|
||||
86 2op-d xchg,
|
||||
88 2op mov, immediate: mov#
|
||||
8D 2op-ds lea,
|
||||
\ 8F/0 pop, rm
|
||||
90 0op nop,
|
||||
C3 0op ret,
|
||||
\ C6/0 immediate mov to r/m
|
||||
\ C7/0 immediate mov to r/m
|
||||
CD 1imm8 int,
|
||||
E8 1addr call,
|
||||
E9 1addr jmp,
|
||||
\ EB jmp rel8
|
||||
F0 0op lock,
|
||||
F2 0op rep,
|
||||
F3 0op repz,
|
||||
F4 0op hlt,
|
||||
F5 0op cmc,
|
||||
F610 1op not,
|
||||
F618 1op neg,
|
||||
F8 0op clc,
|
||||
F9 0op stc,
|
||||
FA 0op cli,
|
||||
FB 0op sti,
|
||||
FC 0op cld,
|
||||
FD 0op std,
|
||||
\ FE 0 inc rm
|
||||
\ FF 1 dec rm
|
||||
\ FF 2 call rm
|
||||
\ FF 4 jmp rm
|
||||
\ FF 6 push rm
|
||||
|
||||
: sp? dup 4 = ;
|
||||
|
||||
\ Addressing mode syntax: immediate, indirect, and displaced indirect.
|
||||
: # ['] imm-op -addr ;
|
||||
: ) 2drop sp? if 4 ['] idx else ['] ind then -addr 0reg 0opsize ;
|
||||
: )# 2drop sp? if 4 ['] idx# else ['] ind# then -addr 0reg 0opsize ;
|
||||
|
||||
\ Define registers.
|
||||
: reg8 create , does> @ ['] reg -addr !op8 ;
|
||||
: reg16 create , does> @ ['] reg -addr !op16 ;
|
||||
: reg32 create , does> @ ['] reg -addr !op32 ;
|
||||
: reg: dup reg8 dup reg16 dup reg32 1+ ;
|
||||
|
||||
\ Register names.
|
||||
0
|
||||
reg: al ax eax reg: cl cx ecx reg: dl dx edx reg: bl bx ebx
|
||||
reg: ah sp esp reg: ch bp ebp reg: dh si esi reg: bh di edi
|
||||
drop
|
||||
|
||||
\ Runtime for ;CODE. CODE! is defined elsewhere.
|
||||
: (;code) r> code! ;
|
||||
|
||||
base ! only forth definitions also assembler
|
||||
|
||||
\ Standard assembler entry points.
|
||||
: code parse-name header, ?code, start-code ;
|
||||
: ;code postpone (;code) reveal postpone [ ?csp start-code ; immediate
|
||||
|
||||
0asm
|
||||
previous
|
||||
56
samples/Jasmin/if1.j
Normal file
56
samples/Jasmin/if1.j
Normal file
@@ -0,0 +1,56 @@
|
||||
.class public if1
|
||||
.super java/lang/Object
|
||||
;
|
||||
; standard initializer (calls java.lang.Object's initializer)
|
||||
;
|
||||
.method public <init>()V
|
||||
aload_0
|
||||
invokenonvirtual java/lang/Object/<init>()V
|
||||
return
|
||||
.end method
|
||||
|
||||
.method public static main([Ljava/lang/String;)V
|
||||
|
||||
.limit locals 1
|
||||
.limit stack 5
|
||||
BeginGlobal:
|
||||
.line 2
|
||||
ldc 0x1
|
||||
ldc 0x1
|
||||
if_icmpeq If556261059
|
||||
goto IfElse556261059
|
||||
If556261059:
|
||||
.line 3
|
||||
.line 3
|
||||
getstatic java/lang/System/out Ljava/io/PrintStream;
|
||||
ldc 0x1
|
||||
invokevirtual java/io/PrintStream/print(I)V
|
||||
goto IfDone556261059
|
||||
IfElse556261059:
|
||||
.line 5
|
||||
.line 5
|
||||
getstatic java/lang/System/out Ljava/io/PrintStream;
|
||||
ldc 0x2
|
||||
invokevirtual java/io/PrintStream/print(I)V
|
||||
IfDone556261059:
|
||||
|
||||
.line 6
|
||||
getstatic java/lang/System/out Ljava/io/PrintStream;
|
||||
ldc 0x3
|
||||
invokevirtual java/io/PrintStream/print(I)V
|
||||
|
||||
.line 7
|
||||
ldc 0x1
|
||||
ldc 0x1
|
||||
if_icmpne IfNot-920218690
|
||||
.line 8
|
||||
.line 8
|
||||
getstatic java/lang/System/out Ljava/io/PrintStream;
|
||||
ldc 0x4
|
||||
invokevirtual java/io/PrintStream/print(I)V
|
||||
IfNot-920218690:
|
||||
|
||||
EndGlobal:
|
||||
return
|
||||
.end method
|
||||
|
||||
167
samples/Jasmin/if2.j
Normal file
167
samples/Jasmin/if2.j
Normal file
@@ -0,0 +1,167 @@
|
||||
.class public if2
|
||||
.super java/lang/Object
|
||||
;
|
||||
; standard initializer (calls java.lang.Object's initializer)
|
||||
;
|
||||
.method public <init>()V
|
||||
aload_0
|
||||
invokenonvirtual java/lang/Object/<init>()V
|
||||
return
|
||||
.end method
|
||||
|
||||
.method public static main([Ljava/lang/String;)V
|
||||
|
||||
.limit locals 1
|
||||
.limit stack 5
|
||||
BeginGlobal:
|
||||
.line 2
|
||||
ldc 0x1
|
||||
ldc 0x1
|
||||
if_icmpeq Cmp1893841232
|
||||
ldc 0x0
|
||||
goto CmpDone1893841232
|
||||
Cmp1893841232:
|
||||
ldc 0x1
|
||||
CmpDone1893841232:
|
||||
ldc 0x1
|
||||
if_icmpeq If-1736765035
|
||||
goto IfElse-1736765035
|
||||
If-1736765035:
|
||||
.line 2
|
||||
.line 3
|
||||
getstatic java/lang/System/out Ljava/io/PrintStream;
|
||||
ldc 0x1
|
||||
invokevirtual java/io/PrintStream/print(I)V
|
||||
goto IfDone-1736765035
|
||||
IfElse-1736765035:
|
||||
.line 4
|
||||
.line 4
|
||||
ldc 0x2
|
||||
ldc 0x1
|
||||
if_icmpeq Cmp-1460884369
|
||||
ldc 0x0
|
||||
goto CmpDone-1460884369
|
||||
Cmp-1460884369:
|
||||
ldc 0x1
|
||||
CmpDone-1460884369:
|
||||
ldc 0x1
|
||||
if_icmpeq If-247349760
|
||||
goto IfElse-247349760
|
||||
If-247349760:
|
||||
.line 4
|
||||
.line 5
|
||||
getstatic java/lang/System/out Ljava/io/PrintStream;
|
||||
ldc 0x2
|
||||
invokevirtual java/io/PrintStream/print(I)V
|
||||
goto IfDone-247349760
|
||||
IfElse-247349760:
|
||||
.line 6
|
||||
.line 7
|
||||
getstatic java/lang/System/out Ljava/io/PrintStream;
|
||||
ldc 0x3
|
||||
invokevirtual java/io/PrintStream/print(I)V
|
||||
IfDone-247349760:
|
||||
IfDone-1736765035:
|
||||
|
||||
.line 10
|
||||
ldc 0x1
|
||||
ldc 0x2
|
||||
if_icmpeq Cmp933554851
|
||||
ldc 0x0
|
||||
goto CmpDone933554851
|
||||
Cmp933554851:
|
||||
ldc 0x1
|
||||
CmpDone933554851:
|
||||
ldc 0x1
|
||||
if_icmpeq If1623625546
|
||||
goto IfElse1623625546
|
||||
If1623625546:
|
||||
.line 10
|
||||
.line 11
|
||||
getstatic java/lang/System/out Ljava/io/PrintStream;
|
||||
ldc 0x1
|
||||
invokevirtual java/io/PrintStream/print(I)V
|
||||
goto IfDone1623625546
|
||||
IfElse1623625546:
|
||||
.line 12
|
||||
.line 12
|
||||
ldc 0x2
|
||||
ldc 0x2
|
||||
if_icmpeq Cmp1572138409
|
||||
ldc 0x0
|
||||
goto CmpDone1572138409
|
||||
Cmp1572138409:
|
||||
ldc 0x1
|
||||
CmpDone1572138409:
|
||||
ldc 0x1
|
||||
if_icmpeq If126354425
|
||||
goto IfElse126354425
|
||||
If126354425:
|
||||
.line 12
|
||||
.line 13
|
||||
getstatic java/lang/System/out Ljava/io/PrintStream;
|
||||
ldc 0x2
|
||||
invokevirtual java/io/PrintStream/print(I)V
|
||||
goto IfDone126354425
|
||||
IfElse126354425:
|
||||
.line 14
|
||||
.line 15
|
||||
getstatic java/lang/System/out Ljava/io/PrintStream;
|
||||
ldc 0x3
|
||||
invokevirtual java/io/PrintStream/print(I)V
|
||||
IfDone126354425:
|
||||
IfDone1623625546:
|
||||
|
||||
.line 18
|
||||
ldc 0x1
|
||||
ldc 0x2
|
||||
if_icmpeq Cmp126493150
|
||||
ldc 0x0
|
||||
goto CmpDone126493150
|
||||
Cmp126493150:
|
||||
ldc 0x1
|
||||
CmpDone126493150:
|
||||
ldc 0x1
|
||||
if_icmpeq If1522284422
|
||||
goto IfElse1522284422
|
||||
If1522284422:
|
||||
.line 18
|
||||
.line 19
|
||||
getstatic java/lang/System/out Ljava/io/PrintStream;
|
||||
ldc 0x1
|
||||
invokevirtual java/io/PrintStream/print(I)V
|
||||
goto IfDone1522284422
|
||||
IfElse1522284422:
|
||||
.line 20
|
||||
.line 20
|
||||
ldc 0x2
|
||||
ldc 0x1
|
||||
if_icmpeq Cmp-906666545
|
||||
ldc 0x0
|
||||
goto CmpDone-906666545
|
||||
Cmp-906666545:
|
||||
ldc 0x1
|
||||
CmpDone-906666545:
|
||||
ldc 0x1
|
||||
if_icmpeq If1083939031
|
||||
goto IfElse1083939031
|
||||
If1083939031:
|
||||
.line 20
|
||||
.line 21
|
||||
getstatic java/lang/System/out Ljava/io/PrintStream;
|
||||
ldc 0x2
|
||||
invokevirtual java/io/PrintStream/print(I)V
|
||||
goto IfDone1083939031
|
||||
IfElse1083939031:
|
||||
.line 22
|
||||
.line 23
|
||||
getstatic java/lang/System/out Ljava/io/PrintStream;
|
||||
ldc 0x3
|
||||
invokevirtual java/io/PrintStream/print(I)V
|
||||
IfDone1083939031:
|
||||
IfDone1522284422:
|
||||
|
||||
EndGlobal:
|
||||
return
|
||||
.end method
|
||||
|
||||
55
samples/Jasmin/if3.j
Normal file
55
samples/Jasmin/if3.j
Normal file
@@ -0,0 +1,55 @@
|
||||
.class public if3
|
||||
.super java/lang/Object
|
||||
;
|
||||
; standard initializer (calls java.lang.Object's initializer)
|
||||
;
|
||||
.method public <init>()V
|
||||
aload_0
|
||||
invokenonvirtual java/lang/Object/<init>()V
|
||||
return
|
||||
.end method
|
||||
|
||||
.method public static main([Ljava/lang/String;)V
|
||||
|
||||
.limit locals 1
|
||||
.limit stack 5
|
||||
BeginGlobal:
|
||||
.line 2
|
||||
ldc 0x1
|
||||
ldc 0x1
|
||||
if_icmpeq If-811796083
|
||||
goto IfElse-811796083
|
||||
If-811796083:
|
||||
.line 3
|
||||
.line 3
|
||||
ldc 0x0
|
||||
ldc 0x1
|
||||
if_icmpeq If-1001319390
|
||||
goto IfElse-1001319390
|
||||
If-1001319390:
|
||||
.line 4
|
||||
.line 4
|
||||
getstatic java/lang/System/out Ljava/io/PrintStream;
|
||||
ldc 0x1
|
||||
invokevirtual java/io/PrintStream/print(I)V
|
||||
goto IfDone-1001319390
|
||||
IfElse-1001319390:
|
||||
.line 6
|
||||
.line 6
|
||||
getstatic java/lang/System/out Ljava/io/PrintStream;
|
||||
ldc 0x2
|
||||
invokevirtual java/io/PrintStream/print(I)V
|
||||
IfDone-1001319390:
|
||||
goto IfDone-811796083
|
||||
IfElse-811796083:
|
||||
.line 8
|
||||
.line 8
|
||||
getstatic java/lang/System/out Ljava/io/PrintStream;
|
||||
ldc 0x3
|
||||
invokevirtual java/io/PrintStream/print(I)V
|
||||
IfDone-811796083:
|
||||
|
||||
EndGlobal:
|
||||
return
|
||||
.end method
|
||||
|
||||
37
samples/Jasmin/if4.j
Normal file
37
samples/Jasmin/if4.j
Normal file
@@ -0,0 +1,37 @@
|
||||
.class public if4
|
||||
.super java/lang/Object
|
||||
;
|
||||
; standard initializer (calls java.lang.Object's initializer)
|
||||
;
|
||||
.method public <init>()V
|
||||
aload_0
|
||||
invokenonvirtual java/lang/Object/<init>()V
|
||||
return
|
||||
.end method
|
||||
|
||||
.method public static main([Ljava/lang/String;)V
|
||||
|
||||
.limit locals 1
|
||||
.limit stack 5
|
||||
BeginGlobal:
|
||||
.line 2
|
||||
ldc 0x1
|
||||
ldc 0x1
|
||||
if_icmpne IfNot1919266740
|
||||
.line 2
|
||||
.line 2
|
||||
ldc 0x1
|
||||
ldc 0x1
|
||||
if_icmpne IfNot613368541
|
||||
.line 2
|
||||
.line 2
|
||||
getstatic java/lang/System/out Ljava/io/PrintStream;
|
||||
ldc 0x1
|
||||
invokevirtual java/io/PrintStream/print(I)V
|
||||
IfNot613368541:
|
||||
IfNot1919266740:
|
||||
|
||||
EndGlobal:
|
||||
return
|
||||
.end method
|
||||
|
||||
54
samples/Jasmin/op1.j
Normal file
54
samples/Jasmin/op1.j
Normal file
@@ -0,0 +1,54 @@
|
||||
.class public op1
|
||||
.super java/lang/Object
|
||||
;
|
||||
; standard initializer (calls java.lang.Object's initializer)
|
||||
;
|
||||
.method public <init>()V
|
||||
aload_0
|
||||
invokenonvirtual java/lang/Object/<init>()V
|
||||
return
|
||||
.end method
|
||||
|
||||
.method public static main([Ljava/lang/String;)V
|
||||
|
||||
.limit locals 1
|
||||
.limit stack 5
|
||||
BeginGlobal:
|
||||
.line 2
|
||||
getstatic java/lang/System/out Ljava/io/PrintStream;
|
||||
ldc 0x1
|
||||
ldc 0x1
|
||||
iadd
|
||||
invokevirtual java/io/PrintStream/println(I)V
|
||||
|
||||
.line 3
|
||||
getstatic java/lang/System/out Ljava/io/PrintStream;
|
||||
ldc 0xa
|
||||
ldc 0x5
|
||||
isub
|
||||
invokevirtual java/io/PrintStream/println(I)V
|
||||
|
||||
.line 4
|
||||
getstatic java/lang/System/out Ljava/io/PrintStream;
|
||||
ldc 0x15
|
||||
ldc 0x3
|
||||
idiv
|
||||
invokevirtual java/io/PrintStream/println(I)V
|
||||
|
||||
.line 5
|
||||
getstatic java/lang/System/out Ljava/io/PrintStream;
|
||||
ldc 0x159
|
||||
ldc 0x38
|
||||
imul
|
||||
invokevirtual java/io/PrintStream/println(I)V
|
||||
|
||||
.line 6
|
||||
getstatic java/lang/System/out Ljava/io/PrintStream;
|
||||
ldc 0x52
|
||||
ldc 0x9
|
||||
irem
|
||||
invokevirtual java/io/PrintStream/println(I)V
|
||||
|
||||
EndGlobal:
|
||||
return
|
||||
.end method
|
||||
34
samples/Jasmin/op2.j
Normal file
34
samples/Jasmin/op2.j
Normal file
@@ -0,0 +1,34 @@
|
||||
.class public op2
|
||||
.super java/lang/Object
|
||||
;
|
||||
; standard initializer (calls java.lang.Object's initializer)
|
||||
;
|
||||
.method public <init>()V
|
||||
aload_0
|
||||
invokenonvirtual java/lang/Object/<init>()V
|
||||
return
|
||||
.end method
|
||||
|
||||
.method public static main([Ljava/lang/String;)V
|
||||
|
||||
.limit locals 1
|
||||
.limit stack 5
|
||||
BeginGlobal:
|
||||
.line 2
|
||||
getstatic java/lang/System/out Ljava/io/PrintStream;
|
||||
ldc 0x1
|
||||
ldc 0x0
|
||||
iand
|
||||
invokevirtual java/io/PrintStream/println(Z)V
|
||||
|
||||
.line 3
|
||||
getstatic java/lang/System/out Ljava/io/PrintStream;
|
||||
ldc 0x1
|
||||
ldc 0x0
|
||||
ior
|
||||
invokevirtual java/io/PrintStream/println(Z)V
|
||||
|
||||
EndGlobal:
|
||||
return
|
||||
.end method
|
||||
|
||||
68
samples/Jasmin/op3.j
Normal file
68
samples/Jasmin/op3.j
Normal file
@@ -0,0 +1,68 @@
|
||||
.class public op3
|
||||
.super java/lang/Object
|
||||
;
|
||||
; standard initializer (calls java.lang.Object's initializer)
|
||||
;
|
||||
.method public <init>()V
|
||||
aload_0
|
||||
invokenonvirtual java/lang/Object/<init>()V
|
||||
return
|
||||
.end method
|
||||
|
||||
.method public static main([Ljava/lang/String;)V
|
||||
|
||||
.limit locals 1
|
||||
.limit stack 5
|
||||
BeginGlobal:
|
||||
.line 2
|
||||
getstatic java/lang/System/out Ljava/io/PrintStream;
|
||||
ldc 0x0
|
||||
ldc 0x1
|
||||
if_icmpeq Cmp-1307183590
|
||||
ldc 0x0
|
||||
goto CmpDone-1307183590
|
||||
Cmp-1307183590:
|
||||
ldc 0x1
|
||||
CmpDone-1307183590:
|
||||
invokevirtual java/io/PrintStream/println(Z)V
|
||||
|
||||
.line 3
|
||||
getstatic java/lang/System/out Ljava/io/PrintStream;
|
||||
ldc 0x0
|
||||
ldc 0x0
|
||||
if_icmpeq Cmp-1443270821
|
||||
ldc 0x0
|
||||
goto CmpDone-1443270821
|
||||
Cmp-1443270821:
|
||||
ldc 0x1
|
||||
CmpDone-1443270821:
|
||||
invokevirtual java/io/PrintStream/println(Z)V
|
||||
|
||||
.line 4
|
||||
getstatic java/lang/System/out Ljava/io/PrintStream;
|
||||
ldc 0x1
|
||||
ldc 0x1
|
||||
if_icmpeq Cmp1759327329
|
||||
ldc 0x0
|
||||
goto CmpDone1759327329
|
||||
Cmp1759327329:
|
||||
ldc 0x1
|
||||
CmpDone1759327329:
|
||||
invokevirtual java/io/PrintStream/println(Z)V
|
||||
|
||||
.line 5
|
||||
getstatic java/lang/System/out Ljava/io/PrintStream;
|
||||
ldc 0x1
|
||||
ldc 0x0
|
||||
if_icmpeq Cmp-678570146
|
||||
ldc 0x0
|
||||
goto CmpDone-678570146
|
||||
Cmp-678570146:
|
||||
ldc 0x1
|
||||
CmpDone-678570146:
|
||||
invokevirtual java/io/PrintStream/println(Z)V
|
||||
|
||||
EndGlobal:
|
||||
return
|
||||
.end method
|
||||
|
||||
68
samples/Jasmin/op4.j
Normal file
68
samples/Jasmin/op4.j
Normal file
@@ -0,0 +1,68 @@
|
||||
.class public op4
|
||||
.super java/lang/Object
|
||||
;
|
||||
; standard initializer (calls java.lang.Object's initializer)
|
||||
;
|
||||
.method public <init>()V
|
||||
aload_0
|
||||
invokenonvirtual java/lang/Object/<init>()V
|
||||
return
|
||||
.end method
|
||||
|
||||
.method public static main([Ljava/lang/String;)V
|
||||
|
||||
.limit locals 1
|
||||
.limit stack 5
|
||||
BeginGlobal:
|
||||
.line 2
|
||||
getstatic java/lang/System/out Ljava/io/PrintStream;
|
||||
ldc 0x0
|
||||
ldc 0x1
|
||||
if_icmpne Cmp-191731100
|
||||
ldc 0x0
|
||||
goto CmpDone-191731100
|
||||
Cmp-191731100:
|
||||
ldc 0x1
|
||||
CmpDone-191731100:
|
||||
invokevirtual java/io/PrintStream/println(Z)V
|
||||
|
||||
.line 3
|
||||
getstatic java/lang/System/out Ljava/io/PrintStream;
|
||||
ldc 0x0
|
||||
ldc 0x0
|
||||
if_icmpne Cmp-901585603
|
||||
ldc 0x0
|
||||
goto CmpDone-901585603
|
||||
Cmp-901585603:
|
||||
ldc 0x1
|
||||
CmpDone-901585603:
|
||||
invokevirtual java/io/PrintStream/println(Z)V
|
||||
|
||||
.line 4
|
||||
getstatic java/lang/System/out Ljava/io/PrintStream;
|
||||
ldc 0x1
|
||||
ldc 0x1
|
||||
if_icmpne Cmp1522577937
|
||||
ldc 0x0
|
||||
goto CmpDone1522577937
|
||||
Cmp1522577937:
|
||||
ldc 0x1
|
||||
CmpDone1522577937:
|
||||
invokevirtual java/io/PrintStream/println(Z)V
|
||||
|
||||
.line 5
|
||||
getstatic java/lang/System/out Ljava/io/PrintStream;
|
||||
ldc 0x1
|
||||
ldc 0x0
|
||||
if_icmpne Cmp-1653028684
|
||||
ldc 0x0
|
||||
goto CmpDone-1653028684
|
||||
Cmp-1653028684:
|
||||
ldc 0x1
|
||||
CmpDone-1653028684:
|
||||
invokevirtual java/io/PrintStream/println(Z)V
|
||||
|
||||
EndGlobal:
|
||||
return
|
||||
.end method
|
||||
|
||||
93
samples/JavaScript/namespace.js
Normal file
93
samples/JavaScript/namespace.js
Normal file
@@ -0,0 +1,93 @@
|
||||
(function(root, factory) {
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
define(['lodash'], factory);
|
||||
} else if (typeof exports !== 'undefined') {
|
||||
module.exports = factory(require('lodash'));
|
||||
} else {
|
||||
root.Namespace = factory(root._);
|
||||
}
|
||||
})(this, function(_) {
|
||||
'use strict';
|
||||
|
||||
/**
|
||||
* @module namespace
|
||||
* @class namespace
|
||||
*/
|
||||
function Namespace() {}
|
||||
|
||||
/**
|
||||
* Regex for splitting keypaths into arrays.
|
||||
*
|
||||
* @private
|
||||
* @const {RegExp}
|
||||
* @type
|
||||
*/
|
||||
var KEYPATH_SPLITTER = /\./g;
|
||||
|
||||
/**
|
||||
* An internal cache to avoid calculating a keypath more than once.
|
||||
*
|
||||
* @private
|
||||
* @type {Object}
|
||||
*/
|
||||
var _keypaths = {};
|
||||
|
||||
_.extend(Namespace.prototype, {
|
||||
|
||||
/**
|
||||
* Adds a definition to the namespace object.
|
||||
*
|
||||
* @public
|
||||
* @instance
|
||||
* @method add
|
||||
* @param {String} keypath - The keypath for the definition to be added at.
|
||||
* @param {Function|Object} definition - The definition to be added.
|
||||
* @return {Function|Object} - The definition.
|
||||
*/
|
||||
add: function(keypath, definition) {
|
||||
return this._walk(keypath, function(memo, name, index, keypath) {
|
||||
if (index + 1 === keypath.length) {
|
||||
memo[name] = _.extend(definition, memo[name]);
|
||||
}
|
||||
return memo[name] || (memo[name] = {});
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Retrieves a definition from the namespace safely.
|
||||
*
|
||||
* @public
|
||||
* @instance
|
||||
* @method get
|
||||
* @param {String} keypath - The keypath to lookup a definition for.
|
||||
* @returns {Function|Object|undefined} - The definition if it exists, otherwise `undefined`.
|
||||
*/
|
||||
get: function(keypath) {
|
||||
return this._walk(keypath);
|
||||
},
|
||||
|
||||
/**
|
||||
* An internal function for walking a keypath.
|
||||
*
|
||||
* @private
|
||||
* @instance
|
||||
* @method _walk
|
||||
* @param {String} keypath - The keypath to walk through.
|
||||
* @param {Function} [callback] - An optional callback to be called at each item in the path.
|
||||
* @returns {function|Object|undefined} - The reduced keypath.
|
||||
*/
|
||||
_walk: function(keypath, callback) {
|
||||
return _.reduce(
|
||||
_keypaths[keypath] || (_keypaths[keypath] = keypath.split(KEYPATH_SPLITTER)),
|
||||
callback || function(memo, name) {
|
||||
return memo && memo[name];
|
||||
},
|
||||
this
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
return Namespace;
|
||||
});
|
||||
|
||||
//# sourceMappingURL=namespace.js.map
|
||||
434
samples/Objective-J/AppController.j
Normal file
434
samples/Objective-J/AppController.j
Normal file
@@ -0,0 +1,434 @@
|
||||
//
|
||||
// AppController.j
|
||||
// FlickrPhoto
|
||||
//
|
||||
// Created by Ross Boucher.
|
||||
// Copyright 2008 - 2010, 280 North, Inc. All rights reserved.
|
||||
|
||||
@import <Foundation/Foundation.j>
|
||||
@import <AppKit/AppKit.j>
|
||||
|
||||
var SliderToolbarItemIdentifier = "SliderToolbarItemIdentifier",
|
||||
AddToolbarItemIdentifier = "AddToolbarItemIdentifier",
|
||||
RemoveToolbarItemIdentifier = "RemoveToolbarItemIdentifier";
|
||||
|
||||
/*
|
||||
Important note about CPJSONPConnection: CPJSONPConnection is ONLY for JSONP APIs.
|
||||
If aren't sure you NEED JSONP (see http://ajaxian.com/archives/jsonp-json-with-padding ),
|
||||
you most likely don't want to use CPJSONPConnection, but rather the more standard
|
||||
CPURLConnection. CPJSONPConnection is designed for cross-domain
|
||||
connections, and if you are making requests to the same domain (as most web
|
||||
applications do), you do not need it.
|
||||
*/
|
||||
|
||||
@implementation AppController : CPObject
|
||||
{
|
||||
CPString lastIdentifier;
|
||||
CPDictionary photosets;
|
||||
|
||||
CPCollectionView listCollectionView;
|
||||
CPCollectionView photosCollectionView;
|
||||
}
|
||||
|
||||
- (void)applicationDidFinishLaunching:(CPNotification)aNotification
|
||||
{
|
||||
//the first thing we need to do is create a window to take up the full screen
|
||||
//we'll also create a toolbar to go with it, and grab its size for future reference
|
||||
|
||||
var theWindow = [[CPWindow alloc] initWithContentRect:CGRectMakeZero() styleMask:CPBorderlessBridgeWindowMask],
|
||||
contentView = [theWindow contentView],
|
||||
toolbar = [[CPToolbar alloc] initWithIdentifier:"Photos"],
|
||||
bounds = [contentView bounds];
|
||||
|
||||
//we tell the toolbar that we want to be its delegate and attach it to theWindow
|
||||
[toolbar setDelegate:self];
|
||||
[toolbar setVisible:true];
|
||||
[theWindow setToolbar:toolbar];
|
||||
|
||||
photosets = [CPDictionary dictionary]; //storage for our sets of photos return from Flickr
|
||||
|
||||
//now we create a scroll view to contain the list of collections of photos (photosets)
|
||||
//inside the scroll view, we'll place our collection view, which manages a collection of "cells"
|
||||
//each cell will represent one photo collection, and choosing cells will select that collection
|
||||
|
||||
var listScrollView = [[CPScrollView alloc] initWithFrame:CGRectMake(0, 0, 200, CGRectGetHeight(bounds) - 58)];
|
||||
[listScrollView setAutohidesScrollers:YES];
|
||||
[listScrollView setAutoresizingMask:CPViewHeightSizable];
|
||||
[[listScrollView contentView] setBackgroundColor:[CPColor colorWithRed:213.0 / 255.0 green:221.0 / 255.0 blue:230.0 / 255.0 alpha:1.0]];
|
||||
|
||||
//we create the collection view cells by creating a single prototype (CPCollectionViewItem) and setting its view.
|
||||
//the CPCollectionView class will then duplicate this item as many times as it needs
|
||||
|
||||
var photosListItem = [[CPCollectionViewItem alloc] init];
|
||||
[photosListItem setView:[[PhotosListCell alloc] initWithFrame:CGRectMakeZero()]];
|
||||
|
||||
listCollectionView = [[CPCollectionView alloc] initWithFrame:CGRectMake(0, 0, 200, 0)];
|
||||
|
||||
[listCollectionView setDelegate:self]; //we want delegate methods
|
||||
[listCollectionView setItemPrototype:photosListItem]; //set the item prototype
|
||||
|
||||
[listCollectionView setMinItemSize:CGSizeMake(20.0, 45.0)];
|
||||
[listCollectionView setMaxItemSize:CGSizeMake(1000.0, 45.0)];
|
||||
[listCollectionView setMaxNumberOfColumns:1]; //setting a single column will make this appear as a vertical list
|
||||
|
||||
[listCollectionView setVerticalMargin:0.0];
|
||||
[listCollectionView setAutoresizingMask:CPViewWidthSizable];
|
||||
|
||||
//finally, we put our collection view inside the scroll view as it's document view, so it can be scrolled
|
||||
[listScrollView setDocumentView:listCollectionView];
|
||||
|
||||
//and we add it to the window's content view, so it will show up on the screen
|
||||
[contentView addSubview:listScrollView];
|
||||
|
||||
//repeat the process with another collection view for the actual photos
|
||||
//this time we'll use a different view for the prototype (PhotoCell)
|
||||
|
||||
var photoItem = [[CPCollectionViewItem alloc] init];
|
||||
[photoItem setView:[[PhotoCell alloc] initWithFrame:CGRectMake(0, 0, 150, 150)]];
|
||||
|
||||
var scrollView = [[CPScrollView alloc] initWithFrame:CGRectMake(200, 0, CGRectGetWidth(bounds) - 200, CGRectGetHeight(bounds) - 58)];
|
||||
|
||||
photosCollectionView = [[CPCollectionView alloc] initWithFrame:CGRectMake(0, 0, CGRectGetWidth(bounds) - 200, 0)];
|
||||
|
||||
[photosCollectionView setDelegate:self];
|
||||
[photosCollectionView setItemPrototype:photoItem];
|
||||
|
||||
[photosCollectionView setMinItemSize:CGSizeMake(150, 150)];
|
||||
[photosCollectionView setMaxItemSize:CGSizeMake(150, 150)];
|
||||
[photosCollectionView setAutoresizingMask:CPViewWidthSizable];
|
||||
|
||||
[scrollView setAutoresizingMask:CPViewHeightSizable | CPViewWidthSizable];
|
||||
[scrollView setDocumentView:photosCollectionView];
|
||||
[scrollView setAutohidesScrollers:YES];
|
||||
|
||||
[[scrollView contentView] setBackgroundColor:[CPColor colorWithCalibratedWhite:0.25 alpha:1.0]];
|
||||
|
||||
[contentView addSubview:scrollView];
|
||||
|
||||
//bring forward the window to display it
|
||||
[theWindow orderFront:self];
|
||||
|
||||
//get the most interesting photos on flickr
|
||||
var request = [CPURLRequest requestWithURL:"http://www.flickr.com/services/rest/?method=flickr.interestingness.getList&per_page=20&format=json&api_key=ca4dd89d3dfaeaf075144c3fdec76756"];
|
||||
|
||||
// see important note about CPJSONPConnection above
|
||||
var connection = [CPJSONPConnection sendRequest:request callback:"jsoncallback" delegate:self];
|
||||
|
||||
lastIdentifier = "Interesting Photos";
|
||||
}
|
||||
|
||||
- (void)add:(id)sender
|
||||
{
|
||||
var string = prompt("Enter a tag to search Flickr for photos.");
|
||||
|
||||
if (string)
|
||||
{
|
||||
//create a new request for the photos with the tag returned from the javascript prompt
|
||||
var request = [CPURLRequest requestWithURL:"http://www.flickr.com/services/rest/?"+
|
||||
"method=flickr.photos.search&tags="+encodeURIComponent(string)+
|
||||
"&media=photos&machine_tag_mode=any&per_page=20&format=json&api_key=ca4dd89d3dfaeaf075144c3fdec76756"];
|
||||
|
||||
// see important note about CPJSONPConnection above
|
||||
[CPJSONPConnection sendRequest:request callback:"jsoncallback" delegate:self];
|
||||
|
||||
lastIdentifier = string;
|
||||
}
|
||||
}
|
||||
|
||||
- (void)remove:(id)sender
|
||||
{
|
||||
//remove this photo
|
||||
[self removeImageListWithIdentifier:[[photosets allKeys] objectAtIndex:[[listCollectionView selectionIndexes] firstIndex]]];
|
||||
}
|
||||
|
||||
- (void)addImageList:(CPArray)images withIdentifier:(CPString)aString
|
||||
{
|
||||
[photosets setObject:images forKey:aString];
|
||||
|
||||
[listCollectionView setContent:[[photosets allKeys] copy]];
|
||||
[listCollectionView setSelectionIndexes:[CPIndexSet indexSetWithIndex:[[photosets allKeys] indexOfObject:aString]]];
|
||||
}
|
||||
|
||||
- (void)removeImageListWithIdentifier:(CPString)aString
|
||||
{
|
||||
var nextIndex = MAX([[listCollectionView content] indexOfObject:aString] - 1, 0);
|
||||
|
||||
[photosets removeObjectForKey:aString];
|
||||
|
||||
[listCollectionView setContent:[[photosets allKeys] copy]];
|
||||
[listCollectionView setSelectionIndexes:[CPIndexSet indexSetWithIndex:nextIndex]];
|
||||
}
|
||||
|
||||
- (void)adjustImageSize:(id)sender
|
||||
{
|
||||
var newSize = [sender value];
|
||||
|
||||
[photosCollectionView setMinItemSize:CGSizeMake(newSize, newSize)];
|
||||
[photosCollectionView setMaxItemSize:CGSizeMake(newSize, newSize)];
|
||||
}
|
||||
|
||||
- (void)collectionViewDidChangeSelection:(CPCollectionView)aCollectionView
|
||||
{
|
||||
if (aCollectionView == listCollectionView)
|
||||
{
|
||||
var listIndex = [[listCollectionView selectionIndexes] firstIndex];
|
||||
|
||||
if (listIndex === CPNotFound)
|
||||
return;
|
||||
|
||||
var key = [listCollectionView content][listIndex];
|
||||
|
||||
[photosCollectionView setContent:[photosets objectForKey:key]];
|
||||
[photosCollectionView setSelectionIndexes:[CPIndexSet indexSet]];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)connection:(CPJSONPConnection)aConnection didReceiveData:(CPString)data
|
||||
{
|
||||
//this method is called when the network request returns. the data is the returned
|
||||
//information from flickr. we set the array of photo urls as the data to our collection view
|
||||
|
||||
[self addImageList:data.photos.photo withIdentifier:lastIdentifier];
|
||||
}
|
||||
|
||||
- (void)connection:(CPJSONPConnection)aConnection didFailWithError:(CPString)error
|
||||
{
|
||||
alert(error); //a network error occurred
|
||||
}
|
||||
|
||||
//these two methods are the toolbar delegate methods, and tell the toolbar what it should display to the user
|
||||
|
||||
- (CPArray)toolbarAllowedItemIdentifiers:(CPToolbar)aToolbar
|
||||
{
|
||||
return [self toolbarDefaultItemIdentifiers:aToolbar];
|
||||
}
|
||||
|
||||
- (CPArray)toolbarDefaultItemIdentifiers:(CPToolbar)aToolbar
|
||||
{
|
||||
return [AddToolbarItemIdentifier, RemoveToolbarItemIdentifier, CPToolbarFlexibleSpaceItemIdentifier, SliderToolbarItemIdentifier];
|
||||
}
|
||||
|
||||
//this delegate method returns the actual toolbar item for the given identifier
|
||||
|
||||
- (CPToolbarItem)toolbar:(CPToolbar)aToolbar itemForItemIdentifier:(CPString)anItemIdentifier willBeInsertedIntoToolbar:(BOOL)aFlag
|
||||
{
|
||||
var toolbarItem = [[CPToolbarItem alloc] initWithItemIdentifier:anItemIdentifier];
|
||||
|
||||
if (anItemIdentifier == SliderToolbarItemIdentifier)
|
||||
{
|
||||
[toolbarItem setView:[[PhotoResizeView alloc] initWithFrame:CGRectMake(0, 0, 180, 32)]];
|
||||
[toolbarItem setMinSize:CGSizeMake(180, 32)];
|
||||
[toolbarItem setMaxSize:CGSizeMake(180, 32)];
|
||||
[toolbarItem setLabel:"Scale"];
|
||||
}
|
||||
else if (anItemIdentifier == AddToolbarItemIdentifier)
|
||||
{
|
||||
var image = [[CPImage alloc] initWithContentsOfFile:[[CPBundle mainBundle] pathForResource:"add.png"] size:CPSizeMake(30, 25)],
|
||||
highlighted = [[CPImage alloc] initWithContentsOfFile:[[CPBundle mainBundle] pathForResource:"addHighlighted.png"] size:CPSizeMake(30, 25)];
|
||||
|
||||
[toolbarItem setImage:image];
|
||||
[toolbarItem setAlternateImage:highlighted];
|
||||
|
||||
[toolbarItem setTarget:self];
|
||||
[toolbarItem setAction:@selector(add:)];
|
||||
[toolbarItem setLabel:"Add Photo List"];
|
||||
|
||||
[toolbarItem setMinSize:CGSizeMake(32, 32)];
|
||||
[toolbarItem setMaxSize:CGSizeMake(32, 32)];
|
||||
}
|
||||
else if (anItemIdentifier == RemoveToolbarItemIdentifier)
|
||||
{
|
||||
var image = [[CPImage alloc] initWithContentsOfFile:[[CPBundle mainBundle] pathForResource:"remove.png"] size:CPSizeMake(30, 25)],
|
||||
highlighted = [[CPImage alloc] initWithContentsOfFile:[[CPBundle mainBundle] pathForResource:"removeHighlighted.png"] size:CPSizeMake(30, 25)];
|
||||
|
||||
[toolbarItem setImage:image];
|
||||
[toolbarItem setAlternateImage:highlighted];
|
||||
|
||||
[toolbarItem setTarget:self];
|
||||
[toolbarItem setAction:@selector(remove:)];
|
||||
[toolbarItem setLabel:"Remove Photo List"];
|
||||
|
||||
[toolbarItem setMinSize:CGSizeMake(32, 32)];
|
||||
[toolbarItem setMaxSize:CGSizeMake(32, 32)];
|
||||
}
|
||||
|
||||
return toolbarItem;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
/*
|
||||
This code demonstrates how to add a category to an existing class.
|
||||
In this case, we are adding the class method +flickr_labelWithText: to
|
||||
the CPTextField class. Later on, we can call [CPTextField flickr_labelWithText:"foo"]
|
||||
to return a new text field with the string foo.
|
||||
Best practices suggest prefixing category methods with your unique prefix, to prevent collisions.
|
||||
*/
|
||||
|
||||
@implementation CPTextField (CreateLabel)
|
||||
|
||||
+ (CPTextField)flickr_labelWithText:(CPString)aString
|
||||
{
|
||||
var label = [[CPTextField alloc] initWithFrame:CGRectMakeZero()];
|
||||
|
||||
[label setStringValue:aString];
|
||||
[label sizeToFit];
|
||||
[label setTextShadowColor:[CPColor whiteColor]];
|
||||
[label setTextShadowOffset:CGSizeMake(0, 1)];
|
||||
|
||||
return label;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
// This class wraps our slider + labels combo
|
||||
|
||||
@implementation PhotoResizeView : CPView
|
||||
{
|
||||
}
|
||||
|
||||
- (id)initWithFrame:(CGRect)aFrame
|
||||
{
|
||||
self = [super initWithFrame:aFrame];
|
||||
|
||||
var slider = [[CPSlider alloc] initWithFrame:CGRectMake(30, CGRectGetHeight(aFrame) / 2.0 - 8, CGRectGetWidth(aFrame) - 65, 24)];
|
||||
|
||||
[slider setMinValue:50.0];
|
||||
[slider setMaxValue:250.0];
|
||||
[slider setIntValue:150.0];
|
||||
[slider setAction:@selector(adjustImageSize:)];
|
||||
|
||||
[self addSubview:slider];
|
||||
|
||||
var label = [CPTextField flickr_labelWithText:"50"];
|
||||
[label setFrameOrigin:CGPointMake(0, CGRectGetHeight(aFrame) / 2.0 - 4.0)];
|
||||
[self addSubview:label];
|
||||
|
||||
label = [CPTextField flickr_labelWithText:"250"];
|
||||
[label setFrameOrigin:CGPointMake(CGRectGetWidth(aFrame) - CGRectGetWidth([label frame]), CGRectGetHeight(aFrame) / 2.0 - 4.0)];
|
||||
[self addSubview:label];
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
// This class displays a single photo collection inside our list of photo collecitions
|
||||
|
||||
@implementation PhotosListCell : CPView
|
||||
{
|
||||
CPTextField label;
|
||||
CPView highlightView;
|
||||
}
|
||||
|
||||
- (void)setRepresentedObject:(JSObject)anObject
|
||||
{
|
||||
if (!label)
|
||||
{
|
||||
label = [[CPTextField alloc] initWithFrame:CGRectInset([self bounds], 4, 4)];
|
||||
|
||||
[label setFont:[CPFont systemFontOfSize:16.0]];
|
||||
[label setTextShadowColor:[CPColor whiteColor]];
|
||||
[label setTextShadowOffset:CGSizeMake(0, 1)];
|
||||
|
||||
[self addSubview:label];
|
||||
}
|
||||
|
||||
[label setStringValue:anObject];
|
||||
[label sizeToFit];
|
||||
|
||||
[label setFrameOrigin:CGPointMake(10,CGRectGetHeight([label bounds]) / 2.0)];
|
||||
}
|
||||
|
||||
- (void)setSelected:(BOOL)flag
|
||||
{
|
||||
if (!highlightView)
|
||||
{
|
||||
highlightView = [[CPView alloc] initWithFrame:CGRectCreateCopy([self bounds])];
|
||||
[highlightView setBackgroundColor:[CPColor blueColor]];
|
||||
}
|
||||
|
||||
if (flag)
|
||||
{
|
||||
[self addSubview:highlightView positioned:CPWindowBelow relativeTo:label];
|
||||
[label setTextColor:[CPColor whiteColor]];
|
||||
[label setTextShadowColor:[CPColor blackColor]];
|
||||
}
|
||||
else
|
||||
{
|
||||
[highlightView removeFromSuperview];
|
||||
[label setTextColor:[CPColor blackColor]];
|
||||
[label setTextShadowColor:[CPColor whiteColor]];
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
// This class displays a single photo from our collection
|
||||
|
||||
@implementation PhotoCell : CPView
|
||||
{
|
||||
CPImage image;
|
||||
CPImageView imageView;
|
||||
CPView highlightView;
|
||||
}
|
||||
|
||||
- (void)setRepresentedObject:(JSObject)anObject
|
||||
{
|
||||
if (!imageView)
|
||||
{
|
||||
imageView = [[CPImageView alloc] initWithFrame:CGRectMakeCopy([self bounds])];
|
||||
[imageView setAutoresizingMask:CPViewWidthSizable | CPViewHeightSizable];
|
||||
[imageView setImageScaling:CPScaleProportionally];
|
||||
[imageView setHasShadow:YES];
|
||||
[self addSubview:imageView];
|
||||
}
|
||||
|
||||
[image setDelegate:nil];
|
||||
|
||||
image = [[CPImage alloc] initWithContentsOfFile:thumbForFlickrPhoto(anObject)];
|
||||
|
||||
[image setDelegate:self];
|
||||
|
||||
if ([image loadStatus] == CPImageLoadStatusCompleted)
|
||||
[imageView setImage:image];
|
||||
else
|
||||
[imageView setImage:nil];
|
||||
}
|
||||
|
||||
- (void)imageDidLoad:(CPImage)anImage
|
||||
{
|
||||
[imageView setImage:anImage];
|
||||
}
|
||||
|
||||
- (void)setSelected:(BOOL)flag
|
||||
{
|
||||
if (!highlightView)
|
||||
{
|
||||
highlightView = [[CPView alloc] initWithFrame:[self bounds]];
|
||||
[highlightView setBackgroundColor:[CPColor colorWithCalibratedWhite:0.8 alpha:0.6]];
|
||||
[highlightView setAutoresizingMask:CPViewWidthSizable | CPViewHeightSizable];
|
||||
}
|
||||
|
||||
if (flag)
|
||||
{
|
||||
[highlightView setFrame:[self bounds]];
|
||||
[self addSubview:highlightView positioned:CPWindowBelow relativeTo:imageView];
|
||||
}
|
||||
else
|
||||
[highlightView removeFromSuperview];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
// helper javascript functions for turning a Flickr photo object into a URL for getting the image
|
||||
|
||||
function urlForFlickrPhoto(photo)
|
||||
{
|
||||
return "http://farm" + photo.farm + ".static.flickr.com/" + photo.server + "/" + photo.id+"_" + photo.secret + ".jpg";
|
||||
}
|
||||
|
||||
function thumbForFlickrPhoto(photo)
|
||||
{
|
||||
return "http://farm" + photo.farm + ".static.flickr.com/" + photo.server + "/" + photo.id + "_" + photo.secret + "_m.jpg";
|
||||
}
|
||||
88
samples/Objective-J/LightsOff.j
Normal file
88
samples/Objective-J/LightsOff.j
Normal file
@@ -0,0 +1,88 @@
|
||||
@import <Foundation/CPObject.j>
|
||||
@import <AppKit/CPView.j>
|
||||
@import <AppKit/CPButton.j>
|
||||
@import <AppKit/CPWebView.j>
|
||||
@import "LOBoard.j"
|
||||
|
||||
@implementation LOInfoView : CPView
|
||||
{
|
||||
}
|
||||
|
||||
- (void)drawRect:(CGRect)r
|
||||
{
|
||||
[[CPColor whiteColor] setFill]
|
||||
var path = [CPBezierPath bezierPath];
|
||||
[path appendBezierPathWithRoundedRect:CGRectMake(5, 0, CGRectGetWidth([self bounds]) - 10.0, CGRectGetHeight([self bounds])) xRadius:10 yRadius:10];
|
||||
[path fill];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation AppController : CPObject
|
||||
{
|
||||
}
|
||||
|
||||
- (CPPanel)initInfoWindow
|
||||
{
|
||||
var infoWindow = [[CPPanel alloc] initWithContentRect:CGRectMake(400, 50, 320, 480) styleMask:CPHUDBackgroundWindowMask | CPResizableWindowMask];
|
||||
[infoWindow setFloatingPanel:YES];
|
||||
|
||||
var _infoContent = [infoWindow contentView],
|
||||
_iconImage = [[CPImage alloc] initWithContentsOfFile:"Resources/icon.png" size:CPSizeMake(59, 60)],
|
||||
_iconView = [[CPImageView alloc] initWithFrame:CGRectMake(125, 0, 59, 60)];
|
||||
|
||||
[_iconView setImage:_iconImage];
|
||||
[_infoContent addSubview:_iconView];
|
||||
|
||||
var _infoView = [[LOInfoView alloc] initWithFrame:CGRectMake(0, 65, 320, 395)],
|
||||
_webView = [[CPWebView alloc] initWithFrame:CGRectMake(20, 0, 270, 370)];
|
||||
|
||||
[_webView loadHTMLString:@"<center><h3>Lights Off</h3></center> <p>Lights Off is a fantastic game exclusively for iPhone and iPod touch and inspired by Tiger Electronic's 'Lights Out'.</p> <p>The goal of the game is simply to switch all of the lights off, but it's harder than it looks! Give the first few levels a try in the playable demo to the left.</p><center><img src='Resources/avail_on_app_store.png'></center>"];
|
||||
|
||||
[_infoView addSubview:_webView];
|
||||
|
||||
[_infoContent addSubview:_infoView];
|
||||
|
||||
return infoWindow;
|
||||
}
|
||||
|
||||
- (void)applicationDidFinishLaunching:(CPNotification)aNotification
|
||||
{
|
||||
/* Enable Logging (DEBUG) */
|
||||
// CPLogRegister(CPLogPopup);
|
||||
|
||||
var rootWindow = [[CPWindow alloc] initWithContentRect:CGRectMakeZero() styleMask:CPBorderlessBridgeWindowMask];
|
||||
[rootWindow setBackgroundColor:[CPColor grayColor]];
|
||||
[rootWindow orderFront:self];
|
||||
|
||||
var infoWindow = [self initInfoWindow],
|
||||
gameWindow = [[CPPanel alloc] initWithContentRect:CGRectMake(50, 50, 324, 482) styleMask:CPHUDBackgroundWindowMask];
|
||||
[gameWindow setFloatingPanel:YES];
|
||||
[gameWindow setTitle:@"Lights Off"];
|
||||
|
||||
contentView = [gameWindow contentView];
|
||||
|
||||
var _board = [[LOBoard alloc] initWithFrame:CGRectMake(2, 0, 320, 480)],
|
||||
_bgImage = [[CPImage alloc] initWithContentsOfFile:"Resources/lo-background.png" size:CPSizeMake(320, 480)];
|
||||
[_board setImage:_bgImage];
|
||||
[_board resetBoard];
|
||||
|
||||
var _buttonImage = [[CPImage alloc] initWithContentsOfFile:"Resources/button-reset.png" size:CPSizeMake(90, 28)],
|
||||
_buttonPressImage = [[CPImage alloc] initWithContentsOfFile:"Resources/button-reset-press.png" size:CPSizeMake(90, 28)],
|
||||
_resetButton = [[CPButton alloc] initWithFrame:CGRectMake(195, 422, 90, 28)];
|
||||
|
||||
[_resetButton setImage:_buttonImage];
|
||||
[_resetButton setAlternateImage:_buttonPressImage];
|
||||
[_resetButton setBordered:NO];
|
||||
|
||||
[contentView addSubview:_board];
|
||||
[contentView addSubview:_resetButton];
|
||||
|
||||
[_resetButton setTarget:_board];
|
||||
[_resetButton setAction:@selector(resetBoard)];
|
||||
|
||||
[gameWindow orderFront:self];
|
||||
[infoWindow orderFront:self];
|
||||
}
|
||||
|
||||
@end
|
||||
47
samples/Objective-J/iTunesLayout.j
Normal file
47
samples/Objective-J/iTunesLayout.j
Normal file
@@ -0,0 +1,47 @@
|
||||
|
||||
@import <Foundation/CPObject.j>
|
||||
|
||||
|
||||
@implementation AppController : CPObject
|
||||
{
|
||||
}
|
||||
|
||||
- (void)applicationDidFinishLaunching:(CPNotification)aNotification
|
||||
{
|
||||
// The end result of this layout will be the kind of master/detail/auxilliary view
|
||||
// found in iTunes, Mail, and many other apps.
|
||||
|
||||
var theWindow = [[CPWindow alloc] initWithContentRect:CGRectMakeZero() styleMask:CPBorderlessBridgeWindowMask],
|
||||
contentView = [theWindow contentView];
|
||||
|
||||
var navigationArea = [[CPView alloc] initWithFrame:CGRectMake(0.0, 0.0, 150.0, CGRectGetHeight([contentView bounds]) - 150.0)];
|
||||
|
||||
[navigationArea setBackgroundColor:[CPColor redColor]];
|
||||
|
||||
// This view will grow in height, but stay fixed width attached to the left side of the screen.
|
||||
[navigationArea setAutoresizingMask:CPViewHeightSizable | CPViewMaxXMargin];
|
||||
|
||||
[contentView addSubview:navigationArea];
|
||||
|
||||
var metaDataArea = [[CPView alloc] initWithFrame:CGRectMake(0.0, CGRectGetMaxY([navigationArea frame]), 150.0, 150.0)];
|
||||
|
||||
[metaDataArea setBackgroundColor:[CPColor greenColor]];
|
||||
|
||||
// This view will stay the same size in both directions, and fixed to the lower left corner.
|
||||
[metaDataArea setAutoresizingMask:CPViewMinYMargin | CPViewMaxXMargin];
|
||||
|
||||
[contentView addSubview:metaDataArea];
|
||||
|
||||
var contentArea = [[CPView alloc] initWithFrame:CGRectMake(150.0, 0.0, CGRectGetWidth([contentView bounds]) - 150.0, CGRectGetHeight([contentView bounds]))];
|
||||
|
||||
[contentArea setBackgroundColor:[CPColor blueColor]];
|
||||
|
||||
// This view will grow in both height an width.
|
||||
[contentArea setAutoresizingMask:CPViewWidthSizable | CPViewHeightSizable];
|
||||
|
||||
[contentView addSubview:contentArea];
|
||||
|
||||
[theWindow orderFront:self];
|
||||
}
|
||||
|
||||
@end
|
||||
76
samples/Public Key/gpg_key.asc
Normal file
76
samples/Public Key/gpg_key.asc
Normal file
@@ -0,0 +1,76 @@
|
||||
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||
Version: GnuPG v2
|
||||
|
||||
mQINBFJJNS0BEADE9QkGDstkCAbUWIMnyzfYb+Z7KdF1vFR2WLe4yov9lwQ1gfjy
|
||||
3lV5AZfEmNe+AGTRney/jpp9It0wyVQWvKM7N9yvFkWRVHq/thz8oDz/SknBoD1F
|
||||
jACJgPXGlK3+YiXa03e3XM1JZxBgvHEH4MQTnNHQ2N7ey2J3oZ6NtOkZdu1xHKZS
|
||||
hn1WUR9zRMa1XK1yLAowlKThnPk+jQVrMrwLtjoJ4wyWHGz+sZJw0IkV/7YJa2it
|
||||
0h7z2x0JmkkiNtYGmbwiTKIIbR2ZcjXLN/VgQ5dvMJDHqkiuVG8VCZ5RetYbLPza
|
||||
6+xsJoByuAzK5Zgg8lB73TgjkJYN19F56W10e5b+4VUYjU1g7rFbYh0JRz4u6IVJ
|
||||
4lJykVHTCIVbGPNeBlqw/LeGnDsXV3a9OGnWvHZzLzFEp9RZwrUMOFUtdkEwZU+j
|
||||
nt/I7c1+RVrmjW0aNulR9fywD+GdaTEnxl08m2yNokMdjy6Z43yUNbYf4F5HFYCi
|
||||
wZRD40jHb8N89DPZhdZaDub5F+ePfy3+JIXm1e8rdWjr1z9UjF8eX5XQ89OVNS62
|
||||
Kb2VM5YT/gCa/4Iwaoag/URVyB/BDJIuqjBpu6Al6zdtuOkvbawoezrqaWN6JJF7
|
||||
BBaVYy2AS5OjGtu8Uxfz0iYevwql1lIczK2c0E+InNNyFPOu/rpppgURwQARAQAB
|
||||
tCRSeWFuIEphY29icyA8cnlhbi5tamFjb2JzQGdtYWlsLmNvbT6JAjkEEwECACMF
|
||||
AlOeONMCGwMHCwkIBwMCAQYVCAIJCgsEFgIDAQIeAQIXgAAKCRC9jrHuX4qBgQJ7
|
||||
D/kBzMpbQeoZ6LCIRs2Yngalc+8U+Td9GSjdmo1oIjrYtowSTeOQcoIznv8gKY2n
|
||||
yUypNNsgYtT8lpMtnT6BjHJU05vdGBVZDbD6NnxcgIwo3DM9I9eazjy9oHVIXPDu
|
||||
offTfwFmVEIlWWLcn0bHzyy70Gp7p0J3QbEN1Q2nXNX5LXzqfPlaeLpwotnSiKD8
|
||||
xNZ/iKVhMduLOZ6YY2jDcdlYba1hDoDHgO1Xh0wR2ZO7Yl50XM4mQlMudX1YsTuy
|
||||
dLEbEtX+CR2uMpvhPYUhQzE4st9r7ZPlUO33cOn5FCyn29EB5DyMpILjS6M9Vlwa
|
||||
oByPOhsCg7U23gviGxx7h/9dSFx6pZ7/Ejhwq+NgtmnMn+xQ5SL0UgVm1O3lruf+
|
||||
0OxlkShpx85PRJIr+lJvFAulb+h5kjzDTV5ekqL0poGlRzLvC4xSbEzYdpBN2mbD
|
||||
sR2yR4KJ6K972CufYTdKVk2hnvlYunP1Yg7NYaQvSITKbcZ+M6tvAkbXyOV6MGVV
|
||||
u8dhKwKmR4+s8Rajf0x2n2wl7DZy5sdSmSIGPMYOskgsVxXcuaWa7DEqcjrdoGPQ
|
||||
uJiBubAQnMKnUvOwY1dsD3H7FQu3INQbarngcPUfxKjGWRveGYYQtAf5FF5Cuj7T
|
||||
OuQM2+CVaPWlrj944IEGWp75ezWDCsEMTQZC7B86BDer2bQvUnlhbiBKYWNvYnMg
|
||||
KER1a2VsYW5hKSA8cnlhbi5tamFjb2JzQGdtYWlsLmNvbT6JAjMEMAECAB0FAlOe
|
||||
OU8WHQBSZW1vdmVkIHRoZSBjb21tZW50LgAKCRC9jrHuX4qBgTLxEACrFljsl+8F
|
||||
EPHZ2fhMr+2601RktBttkl3RgFMpaXKBBuiGwaatfo9k6GsXaVfzAXpR7jf1RxUr
|
||||
qzJ3H8YT5mvnXzVSe0i42Ykfj8+SxsggfcJfLZfyMtTsT0mE1WCb1JaTfn0HyYum
|
||||
kuVtCm3pBhrwlyEGjRMx1HKeOnQCXYLjtTgjsmlitRl/mwKpHkTuKOdt9rpTU77H
|
||||
x3+Hi5YEeSDd5jEujj0THC98WcokhBuKT3Ki805jqPuyFIN17+cJK8rHEQSnZOLG
|
||||
Xj/VzogQ/t2OZw5IpmdLefLRTCvcZNsfqsHLc543+C0dzK3eL2z+g/rOU0VnVjf9
|
||||
ANKZHzoUkYSmKDS/JQDXgCgKC5FjtyEjvP4xgQasqmtt3FWT/CljxEqP5tXGdLnE
|
||||
MBeKJO9UkomG2bHTeJhS5yVL53ULtMvNmQX+21zz7QQdbL6wIKw7MwjhmkuUAeKG
|
||||
+6ZfqEJnCCEvOp8Q0RddQ00JLneY54WuR1I17+peDIc59zS+wpwCcHA2MiVBwouB
|
||||
2eUYb0O+TBdcrx/NMoIQWJ6QK2z/CP90tCKcMvCoU0fCRwkiWk9CFcrk0MAbPt8N
|
||||
C3LV3Xr9qFBAyPRsg8SkTzeWf9oCsQDydWTN+UydHMbdTnQLs4qCt5/i3jOmYpSK
|
||||
j5f5VcqO+Uq8fcAFasQt8giSuzBrcdW4+4kCOAQTAQIAIgUCUkk1LQIbAwYLCQgH
|
||||
AwIGFQgCCQoLBBYCAwECHgECF4AACgkQvY6x7l+KgYFlkxAAkHwIjv9bIcHhQ5HK
|
||||
It6ZKPTEuZJM5VUYGO3o0bA8wPRGapJ+6ndCbeC7/U+W8ShfNJM789cFLTN0dQbU
|
||||
jbbkucTCqG+0lAgimP7KiCLx2Hs3McdOTHt3m4dzPiUsz1waNDkrD3QzU6k6jebW
|
||||
ApAzhMkYH1IALxd4yScNR2CPcdV/YQUt4OG0+h69rubsHbszQOpAsFoygNAZGWbD
|
||||
6i4gQz5CYat+TCmooI/kJh/cdZ+IFfwZXfQHndwsmByqZYydu4Lc0i/KgaW4r4fp
|
||||
u5/L19qWPjoJKQf8y1aiVjEq/QCi0fKEAIhrOJq6Woyv97WDsGu5u0yDIOpCInSC
|
||||
5J8okLl2CtATYh9YayxAHyus/137skhJwwLwAadpmsXeZR+xOpE8HMXxS8DiVH+O
|
||||
nu3beOZnY6g4g8/uxzY0FpQ6MB1DRVPRxPZ/+3RjMqAjSRFVZag3zwv19Qu/IHhR
|
||||
uQal7eR5Ml0MqTBPl2cKt3iKmrY2RIMfLC2Emv5cH5y3iep7A6FrLn4fiS6u0AXJ
|
||||
NmPk23C65K/dlIdytm9qZi7EJpOw0IE1x4UU6wNS+kM4mqnWtzCZvMIhq2lQY1k0
|
||||
PEB2NAGrOgNRkr6MsL4XOQhy6lT18sO39LTWdMoz0IviGSpdO9MukxhraBt/6GWK
|
||||
YP8E+8TwsCqxq2LD/9E8G4n9IaC5Ag0EUkk1LQEQAK5R+XG9q2rcVkZhsTOOJf6k
|
||||
Bc/aYYsEJktnZD7jqFRUve9p/K31qPL/qtMyLxQqRJla9PUiPtwY1vZo+omtg1Eh
|
||||
eu2Na6z7m5ZuFE7GkS2hvFlM/STqiZ09Vrv8CaCb8Vs/sbrsupgeNGOTZOf53DHF
|
||||
VszV9C1KY5Ux+t7gua0mKwBOrk4l5ctGDsV7GE8BsplfZHwsYKW2ez4462s2lgDf
|
||||
H+nBxToT0pv5OVvE6Iv5oXUTaotpOm2s/leNiHBYOS+qYXq58LcvjNaFY6ROexWW
|
||||
JQbaK8jEYP5HKSA7p2+5Cnf1FNP4LjH0dnT3OOC5PTlZ9Di4reLtLlsmCQkhRRyx
|
||||
tjZfWCNDI70pme0SMXUe4lYnLjNTrmryu9PV0RYaMAL1VZYhrMLCT0SMaHNm1gKN
|
||||
+j00X8bGTEvA9bTzWo2oOS0r1hw0AdgfeFaMvSzTaiZfrB5a6UEDDMwrraaTwlPp
|
||||
SXVL9OWtdvr5kuIwMG6uHxGXmDHkxQsm0jqiWMl8y43QJ1qJQ02DYyAFGH/liKmt
|
||||
j46fxRWxoCUVF6xaBf7zQv3h5YouM+tVe0X/bcZKGc+tFbngy8MtP3cuv5I1UZ+C
|
||||
Gg9mttl8/SrLtpOtHSkKtJqU69sVVZazRn/GXApnhTdSMySCkmwdafEnK73izBt/
|
||||
SJiaoDIvVejvuIt5jFudABEBAAGJAh8EGAECAAkFAlJJNS0CGwwACgkQvY6x7l+K
|
||||
gYFX2xAAhiK/NeQdoZ44MqNxeXyo+xqBAotYGXZ5G8pNc07FtDcU/Ile4PKpmrVG
|
||||
zH0de0Gw1e2gTHmDJHMadPGjaYqDK6ZTXE4M58u7KAoQNQIXU4URHmTSBreB3qVp
|
||||
kXepM6lGZq5/DXOT2r+OzyCDI3isza2Xqzy6doC2/QGPMG3GMgc1aolToPznSTWX
|
||||
KIlOuEpvGvZICprlb4fOVAa6nGF5WFi+kyF4UpkxOniaVW6fAfezlBEiQKlJe2Rh
|
||||
SsDBbS2DmRw/6TEWzd2DVobfWfK+wWDLqm6L+zS3StkMCm3A6UKkoHZzWAAbKqta
|
||||
sbQPFFfJnKyWXi0kjiAHlycdMouSgk1JY72fCxHUMxYRLKHGvpX1o2MlqUkjn5Yv
|
||||
OVD9U8w4BUnv/iXd0Txdp1nkz/NLM174HCrQKSfubKNL1K53K0+iFNo4Ow2RJodR
|
||||
71SGZgfkBxjD4bkJhaLB9xUmBkz6PaQl7pRVBtS7INbEbiyR2QvMYwsn7XwY92iI
|
||||
WQ1yopiNGIub7pvrhs/qpzmftb/r9OaiGUoXB0FeQnDHo7x0vulX+0nU9crPcVCe
|
||||
h/qQe/KCbs6ZuUkKKG9Y4XreJ8S1s3iGsVefwHQ/mjRB1b857of+61K4pquQ4u9J
|
||||
svBlAR7nTIPqbZDw1lf5V2UrsyXQ2xBpCp5WGlRZ+SGvB0zvlzU=
|
||||
=xJ8l
|
||||
-----END PGP PUBLIC KEY BLOCK-----
|
||||
1
samples/Public Key/id.pub
Normal file
1
samples/Public Key/id.pub
Normal file
@@ -0,0 +1 @@
|
||||
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQConqV+vS0WfY9swk8St+JcRuhft0jTg4IrAEfmxahSLurkbf54jbe8mrNn96Nm2gkRzs2RNVQ9r4dZzdhKTUk395Vs3LbX3cfdRNaCrs3udqhRZK7Go69DQECnEHFNczBxSrhT5DoO4nuzVimHgSsX7rHKHo6J7SDNowf83/nLUr7SAJvOeQo5yZQqqZQi5NXqH6pEOQtWPILdbZWuhq8s4JIXc38I+w3IXEJ0ttsfkyShv85bhwSFzrOlq2oGY37YVWeXPREXg9ksA6rlxe29SIdAQbINlgJ/ELzDVMYiaQkI5opAvI2EzPVd4325PcMgyFM/weO9F6bKZaGCNyt3
|
||||
1
samples/Public Key/id_rsa.pub
Normal file
1
samples/Public Key/id_rsa.pub
Normal file
@@ -0,0 +1 @@
|
||||
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQCw3QQtYgRViVH8ZpkQ2A7BuCeyPYC4hB9kKNhxwUfJ2hFgW8soGMBhsLN+vOeAJ2IXDMsezJO2/qhoZFQMvHoWpWTRTLPeNtBsKD+nhOZX28A4D+QRzVZ6hdWoh9W+mIP69MIT3aX35oLb86IycbNdRJlEK4FAUt7tjezNkU7boQ== root@use1-2.nitrousbox.com
|
||||
15
samples/Public Key/sunCert.asc
Normal file
15
samples/Public Key/sunCert.asc
Normal file
@@ -0,0 +1,15 @@
|
||||
Type Bits/KeyID Date User ID
|
||||
pub 1024/79949ADD 2005/08/07 sun <sun.strongswan.org>
|
||||
|
||||
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||
Version: 2.6.3i
|
||||
|
||||
mQCNA0L2Km8AAAEEANRAVMn8HBxfYaGhLqtQ3IZJArn9wpcQ+7sH/F9PaXIjzHRQ
|
||||
rfFkfmxxp9lVjCk0LM/BnnlnUmyz6F8K7V0Gi40Am4+ln1zHvZZIQJYGrDhDnjb7
|
||||
I5TVeD4Ib5bQ1CoUbIhv2LocCeR6OjefQgGmerC5RQ3d5ci7uB0pVpd5lJrdAAUR
|
||||
tBhzdW4gPHN1bi5zdHJvbmdzd2FuLm9yZz6JAJUDBRBC9ipvHSlWl3mUmt0BAUZR
|
||||
A/43nuZbxADMSviu54Mj8pvQbYeGLQVabiWT6h7L0ZPX4MWpFH3dTixBfRrZRSsj
|
||||
0AgiMMuZAMebfOe+Xf9uDQv7p1yumEiNg43tg85zyawkARWNTZZ04woxtvAqNwXn
|
||||
lQotGz7YA6JMxry9RQo5yI4Y4dPnVZ/o8eDpP0+I88cOhQ==
|
||||
=lLvB
|
||||
-----END PGP PUBLIC KEY BLOCK-----
|
||||
137
samples/PureBasic/Example_Sine.pb
Normal file
137
samples/PureBasic/Example_Sine.pb
Normal file
@@ -0,0 +1,137 @@
|
||||
EnableExplicit
|
||||
|
||||
; ##################################################### Includes ####################################################
|
||||
|
||||
XIncludeFile "Includes/AudioOut.pbi"
|
||||
|
||||
; ##################################################### Prototypes ##################################################
|
||||
|
||||
; ##################################################### Structures ##################################################
|
||||
|
||||
; ##################################################### Constants ###################################################
|
||||
|
||||
#Samplerate = 44100
|
||||
|
||||
; ##################################################### Structures ##################################################
|
||||
|
||||
Structure Main
|
||||
*AudioOut
|
||||
|
||||
Quit.i
|
||||
EndStructure
|
||||
Global Main.Main
|
||||
|
||||
Structure Main_Window
|
||||
ID.i
|
||||
|
||||
TrackBar.i [10]
|
||||
EndStructure
|
||||
Global Main_Window.Main_Window
|
||||
|
||||
; ##################################################### Variables ###################################################
|
||||
|
||||
Global Frequency.d = 1000
|
||||
Global Amplitude.d = 0.25
|
||||
|
||||
; ##################################################### Procedures ##################################################
|
||||
|
||||
Procedure Main_Window_Open()
|
||||
Main_Window\ID = OpenWindow(#PB_Any, 0, 0, 800, 100, "AudioOut Example", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered)
|
||||
|
||||
If Main_Window\ID
|
||||
|
||||
Main_Window\TrackBar[0] = TrackBarGadget(#PB_Any, 10, 10, 780, 30, 0, 20000)
|
||||
SetGadgetState(Main_Window\TrackBar[0], Frequency)
|
||||
|
||||
Main_Window\TrackBar[1] = TrackBarGadget(#PB_Any, 10, 40, 780, 30, 0, 1000)
|
||||
SetGadgetState(Main_Window\TrackBar[1], Amplitude*1000)
|
||||
|
||||
EndIf
|
||||
EndProcedure
|
||||
|
||||
Procedure Notifier_CallBack(*AudioOut)
|
||||
Protected *Temp, Temp_Size.i
|
||||
Static Rotation.d
|
||||
|
||||
While AudioOut::GetQueuedBlocks(*AudioOut) <= 3
|
||||
|
||||
Temp_Size = AudioOut::GetBufferBlocksize(*AudioOut)
|
||||
If Temp_Size > 0
|
||||
*Temp = AllocateMemory(Temp_Size)
|
||||
|
||||
Define Left.d, Right.d, i
|
||||
For i = 0 To Temp_Size / 4 - 1
|
||||
Left = Sin(Rotation) * Amplitude
|
||||
Right = Sin(Rotation) * Amplitude
|
||||
|
||||
PokeW(*Temp + i*4 , Left*32767)
|
||||
PokeW(*Temp + i*4 + 2, Right*32767)
|
||||
|
||||
Rotation + 2.0*#PI / #Samplerate * Frequency
|
||||
Next
|
||||
|
||||
AudioOut::Write_Data(Main\AudioOut, *Temp, Temp_Size)
|
||||
|
||||
FreeMemory(*Temp)
|
||||
EndIf
|
||||
|
||||
Wend
|
||||
EndProcedure
|
||||
|
||||
; ##################################################### Initialisation ##############################################
|
||||
|
||||
Main_Window_Open()
|
||||
|
||||
AudioOut::GetDevices()
|
||||
|
||||
ForEach AudioOut::Device()
|
||||
Debug PeekS(AudioOut::@Device()\szPname)
|
||||
Next
|
||||
|
||||
Main\AudioOut = AudioOut::Initialize(#WAVE_MAPPER, #Samplerate, 2, 16, @Notifier_CallBack())
|
||||
|
||||
If Not Main\AudioOut
|
||||
Debug AudioOut::GetError()
|
||||
End
|
||||
EndIf
|
||||
|
||||
Notifier_CallBack(Main\AudioOut)
|
||||
|
||||
; ##################################################### Main ########################################################
|
||||
|
||||
Repeat
|
||||
|
||||
Repeat
|
||||
Select WaitWindowEvent(100)
|
||||
Case #PB_Event_Gadget
|
||||
Select EventGadget()
|
||||
Case Main_Window\TrackBar[0]
|
||||
Frequency = GetGadgetState(Main_Window\TrackBar[0])
|
||||
Debug Frequency
|
||||
|
||||
Case Main_Window\TrackBar[1]
|
||||
Amplitude = GetGadgetState(Main_Window\TrackBar[1]) / 1000
|
||||
|
||||
EndSelect
|
||||
|
||||
Case #PB_Event_CloseWindow
|
||||
Main\Quit = #True
|
||||
|
||||
Case 0
|
||||
Break
|
||||
EndSelect
|
||||
ForEver
|
||||
|
||||
Until Main\Quit
|
||||
|
||||
; ##################################################### End #########################################################
|
||||
|
||||
AudioOut::Deinitialize(Main\AudioOut)
|
||||
|
||||
; IDE Options = PureBasic 5.30 Beta 2 (Windows - x64)
|
||||
; CursorPosition = 109
|
||||
; FirstLine = 79
|
||||
; Folding = -
|
||||
; EnableUnicode
|
||||
; EnableThread
|
||||
; EnableXP
|
||||
203
samples/PureBasic/Memory.pbi
Normal file
203
samples/PureBasic/Memory.pbi
Normal file
@@ -0,0 +1,203 @@
|
||||
|
||||
Structure Memory_Operation
|
||||
Src_Offset.q
|
||||
Src_Size.q
|
||||
|
||||
Dst_Offset.q
|
||||
Dst_Size.q
|
||||
|
||||
Copy_Size.q
|
||||
EndStructure
|
||||
|
||||
; #### Cuts the Offset's / Sizes of the memory operation to prevent memory violations
|
||||
Procedure Memory_Operation_Check(*Memory_Operation.Memory_Operation)
|
||||
Protected Temp.q
|
||||
|
||||
If *Memory_Operation\Src_Offset < 0
|
||||
*Memory_Operation\Copy_Size + *Memory_Operation\Src_Offset
|
||||
*Memory_Operation\Dst_Offset - *Memory_Operation\Src_Offset
|
||||
*Memory_Operation\Src_Offset - *Memory_Operation\Src_Offset
|
||||
EndIf
|
||||
|
||||
If *Memory_Operation\Dst_Offset < 0
|
||||
*Memory_Operation\Copy_Size + *Memory_Operation\Dst_Offset
|
||||
*Memory_Operation\Src_Offset - *Memory_Operation\Dst_Offset
|
||||
*Memory_Operation\Dst_Offset - *Memory_Operation\Dst_Offset
|
||||
EndIf
|
||||
|
||||
Temp = *Memory_Operation\Src_Size - *Memory_Operation\Src_Offset
|
||||
If *Memory_Operation\Copy_Size > Temp
|
||||
*Memory_Operation\Copy_Size = Temp
|
||||
EndIf
|
||||
|
||||
Temp = *Memory_Operation\Dst_Size - *Memory_Operation\Dst_Offset
|
||||
If *Memory_Operation\Copy_Size > Temp
|
||||
*Memory_Operation\Copy_Size = Temp
|
||||
EndIf
|
||||
|
||||
If *Memory_Operation\Copy_Size < 0
|
||||
*Memory_Operation\Copy_Size = 0
|
||||
EndIf
|
||||
|
||||
ProcedureReturn #True
|
||||
EndProcedure
|
||||
|
||||
; #### Fills a *Destination with a specified amount of data.
|
||||
; #### It cuts everything, to prevent memory violations
|
||||
Procedure Memory_Range_Fill(Ascii.a, Fill_Size.q, *Dst, Dst_Offset.q, Dst_Size.q=-1)
|
||||
Protected Temp.q
|
||||
|
||||
If Not *Dst
|
||||
ProcedureReturn #False
|
||||
EndIf
|
||||
|
||||
If Dst_Size = -1
|
||||
Dst_Size.q = MemorySize(*Dst)
|
||||
EndIf
|
||||
|
||||
If Dst_Offset < 0
|
||||
Fill_Size + Dst_Offset
|
||||
Dst_Offset - Dst_Offset
|
||||
EndIf
|
||||
|
||||
Temp = Dst_Size - Dst_Offset
|
||||
If Fill_Size > Temp
|
||||
Fill_Size = Temp
|
||||
EndIf
|
||||
|
||||
If Fill_Size > 0
|
||||
FillMemory(*Dst+Dst_Offset, Fill_Size, Ascii)
|
||||
EndIf
|
||||
|
||||
ProcedureReturn #True
|
||||
EndProcedure
|
||||
|
||||
; #### Copies a specified amount of data (Copy_Size) from the source to the destination.
|
||||
; #### It cuts everything, to prevent memory violations
|
||||
Procedure Memory_Range_Copy(*Src, Src_Offset.q, *Dst, Dst_Offset.q, Copy_Size.q, Src_Size.q=-1, Dst_Size.q=-1)
|
||||
Protected Temp.q
|
||||
If Not *Src
|
||||
ProcedureReturn #False
|
||||
EndIf
|
||||
|
||||
If Not *Dst
|
||||
ProcedureReturn #False
|
||||
EndIf
|
||||
|
||||
If Src_Size = -1
|
||||
Src_Size.q = MemorySize(*Src)
|
||||
EndIf
|
||||
If Dst_Size = -1
|
||||
Dst_Size.q = MemorySize(*Dst)
|
||||
EndIf
|
||||
|
||||
If Src_Offset < 0
|
||||
Copy_Size + Src_Offset
|
||||
Dst_Offset - Src_Offset
|
||||
Src_Offset - Src_Offset
|
||||
EndIf
|
||||
|
||||
If Dst_Offset < 0
|
||||
Copy_Size + Dst_Offset
|
||||
Src_Offset - Dst_Offset
|
||||
Dst_Offset - Dst_Offset
|
||||
EndIf
|
||||
|
||||
Temp = Src_Size - Src_Offset
|
||||
If Copy_Size > Temp
|
||||
Copy_Size = Temp
|
||||
EndIf
|
||||
|
||||
Temp = Dst_Size - Dst_Offset
|
||||
If Copy_Size > Temp
|
||||
Copy_Size = Temp
|
||||
EndIf
|
||||
|
||||
If Copy_Size > 0
|
||||
CopyMemory(*Src+Src_Offset, *Dst+Dst_Offset, Copy_Size)
|
||||
EndIf
|
||||
|
||||
ProcedureReturn #True
|
||||
EndProcedure
|
||||
|
||||
; #### Copies (MoveMemory) a specified amount of data (Copy_Size) from the source to the destination.
|
||||
; #### It cuts everything, to prevent memory violations
|
||||
Procedure Memory_Range_Move(*Src, Src_Offset.q, *Dst, Dst_Offset.q, Copy_Size.q, Src_Size.q=-1, Dst_Size.q=-1)
|
||||
Protected Temp.q
|
||||
If Not *Src
|
||||
ProcedureReturn #False
|
||||
EndIf
|
||||
|
||||
If Not *Dst
|
||||
ProcedureReturn #False
|
||||
EndIf
|
||||
|
||||
If Src_Size = -1
|
||||
Src_Size.q = MemorySize(*Src)
|
||||
EndIf
|
||||
If Dst_Size = -1
|
||||
Dst_Size.q = MemorySize(*Dst)
|
||||
EndIf
|
||||
|
||||
If Src_Offset < 0
|
||||
Copy_Size + Src_Offset
|
||||
Dst_Offset - Src_Offset
|
||||
Src_Offset - Src_Offset
|
||||
EndIf
|
||||
|
||||
If Dst_Offset < 0
|
||||
Copy_Size + Dst_Offset
|
||||
Src_Offset - Dst_Offset
|
||||
Dst_Offset - Dst_Offset
|
||||
EndIf
|
||||
|
||||
Temp = Src_Size - Src_Offset
|
||||
If Copy_Size > Temp
|
||||
Copy_Size = Temp
|
||||
EndIf
|
||||
|
||||
Temp = Dst_Size - Dst_Offset
|
||||
If Copy_Size > Temp
|
||||
Copy_Size = Temp
|
||||
EndIf
|
||||
|
||||
If Copy_Size > 0
|
||||
MoveMemory(*Src+Src_Offset, *Dst+Dst_Offset, Copy_Size)
|
||||
EndIf
|
||||
|
||||
ProcedureReturn #True
|
||||
EndProcedure
|
||||
|
||||
; #### Mirrors the memory, usable for little/big endian switching
|
||||
Procedure Memory_Mirror(*Memory, Memory_Size)
|
||||
Protected Elements, i
|
||||
Protected Temp.a, *A.Ascii, *B.Ascii
|
||||
|
||||
If Not *Memory
|
||||
ProcedureReturn #False
|
||||
EndIf
|
||||
|
||||
If Memory_Size < 1
|
||||
ProcedureReturn #True
|
||||
EndIf
|
||||
|
||||
Elements = Memory_Size/2
|
||||
*A = *Memory
|
||||
*B = *Memory + Memory_Size - 1
|
||||
|
||||
For i = 0 To Elements - 1
|
||||
Temp = *A\a
|
||||
*A\a = *B\a
|
||||
*B\a = Temp
|
||||
*A + 1
|
||||
*B - 1
|
||||
Next
|
||||
|
||||
ProcedureReturn #True
|
||||
EndProcedure
|
||||
; IDE Options = PureBasic 5.31 (Windows - x64)
|
||||
; CursorPosition = 190
|
||||
; FirstLine = 177
|
||||
; Folding = -
|
||||
; EnableXP
|
||||
; DisableDebugger
|
||||
@@ -1,12 +0,0 @@
|
||||
$blue: #3bbfce;
|
||||
$margin: 16px;
|
||||
|
||||
.content_navigation {
|
||||
color: $blue;
|
||||
}
|
||||
|
||||
.border {
|
||||
padding: $margin / 2;
|
||||
margin: $margin / 2;
|
||||
border: 2px $blue solid;
|
||||
}
|
||||
55
samples/Shell/filenames/9fs
Normal file
55
samples/Shell/filenames/9fs
Normal file
@@ -0,0 +1,55 @@
|
||||
#!/bin/rc
|
||||
# 9fs filesystem [mountpoint] - srv & mount filesystem, usually from plan 9
|
||||
|
||||
rfork e
|
||||
switch($1){
|
||||
case ''
|
||||
echo usage: 9fs service '[mountpoint]' >[1=2]
|
||||
exit usage
|
||||
case kfs
|
||||
if(! test -f /srv/kfs)
|
||||
disk/kfs
|
||||
mount -c /srv/kfs /n/kfs
|
||||
case dump
|
||||
mount /srv/boot /n/dump dump >[2]/dev/null ||
|
||||
mount /srv/boot /n/dump main/archive ||
|
||||
mount /srv/boot /n/dump dump # again to print error
|
||||
case snap
|
||||
mount /srv/boot /n/snap main/snapshot
|
||||
case other
|
||||
mount -C /srv/boot /n/other other
|
||||
case juke # ye olde file server
|
||||
srv -q il!jukefs && mount /srv/il!jukefs /n/juke
|
||||
case sources
|
||||
srv -nq tcp!sources.cs.bell-labs.com sources /n/sources
|
||||
case sourcesdump
|
||||
9fs sources
|
||||
mount -n /srv/sources /n/sourcesdump main/archive
|
||||
case sourcessnap
|
||||
9fs sources
|
||||
mount -n /srv/sources /n/sourcessnap main/snapshot
|
||||
# arbitrary venti archives
|
||||
case vac:*
|
||||
vacfs <{echo $1}
|
||||
case *.vac
|
||||
if (test -e $1)
|
||||
score=$1
|
||||
if not if (! ~ $1 /* && test -e $home/lib/vac/$1)
|
||||
score=$home/lib/vac/$1
|
||||
if not if (! ~ $1 /* && test -e /lib/vac/$1)
|
||||
score=/lib/vac/$1
|
||||
if not {
|
||||
echo $0: $1: no such score file >[1=2]
|
||||
exit 'no score file'
|
||||
}
|
||||
vacfs -m /n/`{basename $1 .vac} `{cat $score}
|
||||
case wiki
|
||||
srv -m 'net!plan9.bell-labs.com!wiki' wiki /mnt/wiki
|
||||
case *
|
||||
switch($#*){
|
||||
case 1
|
||||
srv -m $1
|
||||
case *
|
||||
srv -m $1 $1 $2
|
||||
}
|
||||
}
|
||||
149
samples/Shell/filenames/man
Normal file
149
samples/Shell/filenames/man
Normal file
@@ -0,0 +1,149 @@
|
||||
#!/bin/rc
|
||||
# man - print manual pages
|
||||
rfork e
|
||||
|
||||
. /sys/man/fonts
|
||||
|
||||
cmd=n
|
||||
sec=()
|
||||
S=/sys/man
|
||||
d=0
|
||||
|
||||
fn roff {
|
||||
preproc=()
|
||||
postproc=cat
|
||||
x=`{doctype $2}
|
||||
if (~ $1 t) {
|
||||
if(~ $x *grap*)
|
||||
preproc=($preproc grap)
|
||||
if(~ $x *pic*)
|
||||
preproc=($preproc pic)
|
||||
Nflag=-Tutf
|
||||
}
|
||||
if not {
|
||||
Nflag='-N'
|
||||
Lflag='-rL1000i'
|
||||
# setting L changes page length to infinity (sed script removes empty lines)
|
||||
if (grep -s '^\.(2C|sp *[0-9]*\.)' $2)
|
||||
postproc=col
|
||||
}
|
||||
if(~ $x *eqn*)
|
||||
preproc=($preproc eqn)
|
||||
if(~ $x *tbl*)
|
||||
preproc=($preproc tbl)
|
||||
{echo -n $FONTS; cat $2 </dev/null} |
|
||||
switch($#preproc) {
|
||||
case 0
|
||||
troff $Nflag $Lflag -$MAN
|
||||
case 1
|
||||
$preproc | troff $Nflag $Lflag -$MAN
|
||||
case 2
|
||||
$preproc(1) | $preproc(2) | troff $Nflag $Lflag -$MAN
|
||||
case 3
|
||||
$preproc(1) | $preproc(2) | $preproc(3) |
|
||||
troff $Nflag $Lflag -$MAN
|
||||
case *
|
||||
$preproc(1) | $preproc(2) | $preproc(3) |
|
||||
$preproc(4) | troff $Nflag $Lflag -$MAN
|
||||
} | $postproc
|
||||
}
|
||||
|
||||
fn page {
|
||||
if(test -d /mnt/wsys/acme)
|
||||
/bin/page -w
|
||||
if not
|
||||
/bin/page
|
||||
}
|
||||
|
||||
|
||||
search=yes
|
||||
while(~ $d 0) {
|
||||
if(~ $#* 0) {
|
||||
echo 'Usage: man [-bntpPSw] [0-9] [0-9] ... name1 name2 ...' >[1=2]
|
||||
exit
|
||||
}
|
||||
if(test -d $S/$1){
|
||||
sec=($sec $1)
|
||||
shift
|
||||
}
|
||||
if not
|
||||
switch($1) {
|
||||
case -b ; cmd=b ; shift
|
||||
case -n ; cmd=n ; shift
|
||||
case -P ; cmd=P ; shift
|
||||
case -p ; cmd=p ; shift
|
||||
case -S ; search=no ; shift
|
||||
case -t ; cmd=t ; shift
|
||||
case -w ; cmd=w ; shift
|
||||
case * ; d=1
|
||||
}
|
||||
}
|
||||
if(~ $#sec 0) {
|
||||
sec=`{ls -pd $S/[0-9]* }
|
||||
}
|
||||
ix=$S/$sec/INDEX
|
||||
if(~ $#* 1) pat='^'^$1^' '
|
||||
if not pat='^('^`{echo $* | sed 's/ /|/g'}^') '
|
||||
fils=()
|
||||
if(~ $search yes)
|
||||
for(i in $S/$sec){
|
||||
if(/bin/test -f $i/INDEX){
|
||||
try=`{grep -i $pat $i/INDEX | sed 's/^[^ ]* //' | sort -u}
|
||||
if(! ~ $#try 0)
|
||||
fils=($fils $i/$try)
|
||||
}
|
||||
}
|
||||
# bug: should also do following loop if not all pages found
|
||||
if(~ $#fils 0) {
|
||||
# nothing in INDEX. try for file of given name
|
||||
for(i) {
|
||||
if(~ $i intro) i=0intro
|
||||
for(n in $sec) {
|
||||
try=`{echo $S/$n/$i | tr A-Z a-z}
|
||||
if (/bin/test -f $try)
|
||||
fils=($fils $try)
|
||||
}
|
||||
}
|
||||
if(~ $#fils 0) {
|
||||
echo 'man: no manual page' >[1=2]
|
||||
exit 'no man'
|
||||
}
|
||||
}
|
||||
for(i in $fils) {
|
||||
if(! /bin/test -f $i)
|
||||
echo need $i >[1=2]
|
||||
if not {
|
||||
switch($cmd) {
|
||||
case w
|
||||
echo $i
|
||||
|
||||
case t
|
||||
roff t $i
|
||||
|
||||
case p
|
||||
roff t $i | grep -v '^x X html' | proof
|
||||
|
||||
case P
|
||||
roff t $i | page
|
||||
|
||||
case n
|
||||
roff n $i | sed '
|
||||
${
|
||||
/^$/p
|
||||
}
|
||||
//N
|
||||
/^\n$/D'
|
||||
|
||||
case b
|
||||
x=`{echo $i | sed 's;/sys/man/(.*)/(.*);\1 \2;'}
|
||||
if(~ $x(2) 0intro) x=($x(1) intro)
|
||||
roff n $i | sed '
|
||||
${
|
||||
/^$/p
|
||||
}
|
||||
//N
|
||||
/^\n$/D' |
|
||||
plumb -i -d edit -a 'action=showdata filename=/man/'$x(2)^'('$x(1)^')'
|
||||
}
|
||||
}
|
||||
}
|
||||
1
samples/Smalltalk/Booleans.cs
Normal file
1
samples/Smalltalk/Booleans.cs
Normal file
File diff suppressed because one or more lines are too long
1
samples/Smalltalk/Collections.cs
Normal file
1
samples/Smalltalk/Collections.cs
Normal file
File diff suppressed because one or more lines are too long
@@ -1,703 +0,0 @@
|
||||
#==============================================================================
|
||||
#
|
||||
# <20><> Yanfly Engine Ace - Visual Battlers v1.01
|
||||
# -- Last Updated: 2012.07.24
|
||||
# -- Level: Easy
|
||||
# -- Requires: n/a
|
||||
#
|
||||
# <20><> Modified by:
|
||||
# -- Yami
|
||||
# -- Kread-Ex
|
||||
# -- Archeia_Nessiah
|
||||
#==============================================================================
|
||||
|
||||
$imported = {} if $imported.nil?
|
||||
$imported["YEA-VisualBattlers"] = true
|
||||
|
||||
#==============================================================================
|
||||
# <20><> Updates
|
||||
# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
# 2012.12.18 - Added preset views and able to change direction in-game.
|
||||
# 2012.07.24 - Finished Script.
|
||||
# 2012.01.05 - Started Script.
|
||||
#
|
||||
#==============================================================================
|
||||
# <20><> Introduction
|
||||
# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
# This script provides a visual for all actors by default charsets. The actions
|
||||
# and movements are alike Final Fantasy 1, only move forward and backward when
|
||||
# start and finish actions.
|
||||
#
|
||||
#==============================================================================
|
||||
# <20><> Instructions
|
||||
# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
# To change the player direction in-game, use the snippet below in a script
|
||||
# call:
|
||||
#
|
||||
# $game_system.party_direction = n
|
||||
#
|
||||
# To install this script, open up your script editor and copy/paste this script
|
||||
# to an open slot below <20><> Materials but above <20><> Main. Remember to save.
|
||||
#
|
||||
#==============================================================================
|
||||
# <20><> Compatibility
|
||||
# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
# This script is made strictly for RPG Maker VX Ace. It is highly unlikely that
|
||||
# it will run with RPG Maker VX without adjusting.
|
||||
#
|
||||
#==============================================================================
|
||||
|
||||
module YEA
|
||||
module VISUAL_BATTLERS
|
||||
|
||||
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
||||
# - Party Location Setting -
|
||||
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
||||
# These settings are adjusted for Party Location. Each Actor will have
|
||||
# coordinates calculated by below formula. There are two samples coordinates
|
||||
# below, change PARTY_DIRECTION to the base index you want to use.
|
||||
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
||||
PARTY_DIRECTION = 6 # This direction is opposite from actual direction.
|
||||
|
||||
PARTY_LOCATION_BASE_COORDINATES ={
|
||||
# Index => [base_x, base_y, mod_x, mod_y],
|
||||
2 => [ 250, 290, 40, 0], #UP
|
||||
4 => [ 150, 280, 20, -20], #LEFT
|
||||
3 => [ 460, 280, 30, -10], #RIGHT
|
||||
6 => [ 460, 230, 20, 20], #DEFAULT RIGHT
|
||||
8 => [ 260, 230, 40, 0], #DOWN
|
||||
} # Do not remove this.
|
||||
|
||||
PARTY_LOCATION_FORMULA_X = "base_x + index * mod_x"
|
||||
PARTY_LOCATION_FORMULA_Y = "base_y + index * mod_y"
|
||||
|
||||
end # VISUAL_BATTLERS
|
||||
end # YEA
|
||||
|
||||
#==============================================================================
|
||||
# <20><> Editting anything past this point may potentially result in causing
|
||||
# computer damage, incontinence, explosion of user's head, coma, death, and/or
|
||||
# halitosis so edit at your own risk.
|
||||
#==============================================================================
|
||||
|
||||
#==============================================================================
|
||||
# ? <20><> Direction
|
||||
#==============================================================================
|
||||
|
||||
module Direction
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# self.correct
|
||||
#--------------------------------------------------------------------------
|
||||
def self.correct(direction)
|
||||
case direction
|
||||
when 1; return 4
|
||||
when 3; return 6
|
||||
when 7; return 4
|
||||
when 9; return 6
|
||||
else; return direction
|
||||
end
|
||||
end
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# self.opposite
|
||||
#--------------------------------------------------------------------------
|
||||
def self.opposite(direction)
|
||||
case direction
|
||||
when 1; return 6
|
||||
when 2; return 8
|
||||
when 3; return 4
|
||||
when 4; return 6
|
||||
when 6; return 4
|
||||
when 7; return 6
|
||||
when 8; return 2
|
||||
when 9; return 4
|
||||
else; return direction
|
||||
end
|
||||
end
|
||||
|
||||
end # Direction
|
||||
|
||||
#==============================================================================
|
||||
# ? <20><> Game_System
|
||||
#==============================================================================
|
||||
|
||||
class Game_System; attr_accessor :party_direction; end
|
||||
|
||||
#==============================================================================
|
||||
# ? <20><> Game_BattleCharacter
|
||||
#==============================================================================
|
||||
|
||||
class Game_BattleCharacter < Game_Character
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# initialize
|
||||
#--------------------------------------------------------------------------
|
||||
def initialize(actor)
|
||||
super()
|
||||
setup_actor(actor)
|
||||
@move_x_rate = 0
|
||||
@move_y_rate = 0
|
||||
end
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# setup_actor
|
||||
#--------------------------------------------------------------------------
|
||||
def setup_actor(actor)
|
||||
@actor = actor
|
||||
@step_anime = true
|
||||
set_graphic(@actor.character_name, @actor.character_index)
|
||||
setup_coordinates
|
||||
dr = $game_system.party_direction || YEA::VISUAL_BATTLERS::PARTY_DIRECTION
|
||||
direction = Direction.opposite(dr)
|
||||
set_direction(Direction.correct(direction))
|
||||
end
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# sprite=
|
||||
#--------------------------------------------------------------------------
|
||||
def sprite=(sprite)
|
||||
@sprite = sprite
|
||||
end
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# setup_coordinates
|
||||
#--------------------------------------------------------------------------
|
||||
def setup_coordinates
|
||||
location = ($game_system.party_direction ||
|
||||
YEA::VISUAL_BATTLERS::PARTY_DIRECTION)
|
||||
base_x = YEA::VISUAL_BATTLERS::PARTY_LOCATION_BASE_COORDINATES[location][0]
|
||||
base_y = YEA::VISUAL_BATTLERS::PARTY_LOCATION_BASE_COORDINATES[location][1]
|
||||
mod_x = YEA::VISUAL_BATTLERS::PARTY_LOCATION_BASE_COORDINATES[location][2]
|
||||
mod_y = YEA::VISUAL_BATTLERS::PARTY_LOCATION_BASE_COORDINATES[location][3]
|
||||
@actor.screen_x = eval(YEA::VISUAL_BATTLERS::PARTY_LOCATION_FORMULA_X)
|
||||
@actor.screen_y = eval(YEA::VISUAL_BATTLERS::PARTY_LOCATION_FORMULA_Y)
|
||||
@actor.origin_x = @actor.screen_x
|
||||
@actor.origin_y = @actor.screen_y
|
||||
@actor.create_move_to(screen_x, screen_y, 1)
|
||||
end
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# index
|
||||
#--------------------------------------------------------------------------
|
||||
def index
|
||||
return @actor.index
|
||||
end
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# screen_x
|
||||
#--------------------------------------------------------------------------
|
||||
def screen_x
|
||||
return @actor.screen_x
|
||||
end
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# screen_y
|
||||
#--------------------------------------------------------------------------
|
||||
def screen_y
|
||||
return @actor.screen_y
|
||||
end
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# screen_z
|
||||
#--------------------------------------------------------------------------
|
||||
def screen_z
|
||||
return @actor.screen_z
|
||||
end
|
||||
|
||||
end # Game_BattleCharacter
|
||||
|
||||
#==============================================================================
|
||||
# ? <20><> Game_Battler
|
||||
#==============================================================================
|
||||
|
||||
class Game_Battler < Game_BattlerBase
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# public instance variables
|
||||
#--------------------------------------------------------------------------
|
||||
attr_accessor :moved_back
|
||||
attr_accessor :origin_x
|
||||
attr_accessor :origin_y
|
||||
attr_accessor :screen_x
|
||||
attr_accessor :screen_y
|
||||
attr_accessor :started_turn
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# alias method: execute_damage
|
||||
#--------------------------------------------------------------------------
|
||||
alias game_battler_execute_damage_vb execute_damage
|
||||
def execute_damage(user)
|
||||
game_battler_execute_damage_vb(user)
|
||||
if @result.hp_damage > 0
|
||||
move_backward(24, 6) unless @moved_back
|
||||
@moved_back = true
|
||||
end
|
||||
end
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# face_opposing_party
|
||||
#--------------------------------------------------------------------------
|
||||
def face_opposing_party
|
||||
direction = ($game_system.party_direction ||
|
||||
YEA::VISUAL_BATTLERS::PARTY_DIRECTION)
|
||||
character.set_direction(Direction.correct(direction)) rescue 0
|
||||
end
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# new method: face_coordinate
|
||||
#--------------------------------------------------------------------------
|
||||
def face_coordinate(destination_x, destination_y)
|
||||
x1 = Integer(@screen_x)
|
||||
x2 = Integer(destination_x)
|
||||
y1 = Graphics.height - Integer(@screen_y)
|
||||
y2 = Graphics.height - Integer(destination_y)
|
||||
return if x1 == x2 and y1 == y2
|
||||
#---
|
||||
angle = Integer(Math.atan2((y2-y1),(x2-x1)) * 1800 / Math::PI)
|
||||
if (0..225) === angle or (-225..0) === angle
|
||||
direction = 6
|
||||
elsif (226..675) === angle
|
||||
direction = 9
|
||||
elsif (676..1125) === angle
|
||||
direction = 8
|
||||
elsif (1126..1575) === angle
|
||||
direction = 7
|
||||
elsif (1576..1800) === angle or (-1800..-1576) === angle
|
||||
direction = 4
|
||||
elsif (-1575..-1126) === angle
|
||||
direction = 1
|
||||
elsif (-1125..-676) === angle
|
||||
direction = 2
|
||||
elsif (-675..-226) === angle
|
||||
direction = 3
|
||||
end
|
||||
#---
|
||||
character.set_direction(Direction.correct(direction)) rescue 0
|
||||
end
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# create_move_to
|
||||
#--------------------------------------------------------------------------
|
||||
def create_move_to(destination_x, destination_y, frames = 12)
|
||||
@destination_x = destination_x
|
||||
@destination_y = destination_y
|
||||
frames = [frames, 1].max
|
||||
@move_x_rate = [(@screen_x - @destination_x).abs / frames, 2].max
|
||||
@move_y_rate = [(@screen_y - @destination_y).abs / frames, 2].max
|
||||
end
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# update_move_to
|
||||
#--------------------------------------------------------------------------
|
||||
def update_move_to
|
||||
@move_x_rate = 0 if @screen_x == @destination_x || @move_x_rate.nil?
|
||||
@move_y_rate = 0 if @screen_y == @destination_y || @move_y_rate.nil?
|
||||
value = [(@screen_x - @destination_x).abs, @move_x_rate].min
|
||||
@screen_x += (@destination_x > @screen_x) ? value : -value
|
||||
value = [(@screen_y - @destination_y).abs, @move_y_rate].min
|
||||
@screen_y += (@destination_y > @screen_y) ? value : -value
|
||||
end
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# move_forward
|
||||
#--------------------------------------------------------------------------
|
||||
def move_forward(distance = 24, frames = 12)
|
||||
direction = forward_direction
|
||||
move_direction(direction, distance, frames)
|
||||
end
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# move_backward
|
||||
#--------------------------------------------------------------------------
|
||||
def move_backward(distance = 24, frames = 12)
|
||||
direction = Direction.opposite(forward_direction)
|
||||
move_direction(direction, distance, frames)
|
||||
end
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# move_direction
|
||||
#--------------------------------------------------------------------------
|
||||
def move_direction(direction, distance = 24, frames = 12)
|
||||
case direction
|
||||
when 1; move_x = distance / -2; move_y = distance / 2
|
||||
when 2; move_x = distance * 0; move_y = distance * 1
|
||||
when 3; move_x = distance / -2; move_y = distance / 2
|
||||
when 4; move_x = distance * -1; move_y = distance * 0
|
||||
when 6; move_x = distance * 1; move_y = distance * 0
|
||||
when 7; move_x = distance / -2; move_y = distance / -2
|
||||
when 8; move_x = distance * 0; move_y = distance * -1
|
||||
when 9; move_x = distance / 2; move_y = distance / -2
|
||||
else; return
|
||||
end
|
||||
destination_x = @screen_x + move_x
|
||||
destination_y = @screen_y + move_y
|
||||
create_move_to(destination_x, destination_y, frames)
|
||||
end
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# forward_direction
|
||||
#--------------------------------------------------------------------------
|
||||
def forward_direction
|
||||
return ($game_system.party_direction ||
|
||||
YEA::VISUAL_BATTLERS::PARTY_DIRECTION)
|
||||
end
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# move_origin
|
||||
#--------------------------------------------------------------------------
|
||||
def move_origin
|
||||
create_move_to(@origin_x, @origin_y)
|
||||
face_coordinate(@origin_x, @origin_y)
|
||||
@moved_back = false
|
||||
end
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# moving?
|
||||
#--------------------------------------------------------------------------
|
||||
def moving?
|
||||
return false if dead? || !exist?
|
||||
return @move_x_rate != 0 || @move_y_rate != 0
|
||||
end
|
||||
|
||||
end # Game_Battler
|
||||
|
||||
#==============================================================================
|
||||
# ? <20><> Game_Actor
|
||||
#==============================================================================
|
||||
|
||||
class Game_Actor < Game_Battler
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# overwrite method: use_sprite?
|
||||
#--------------------------------------------------------------------------
|
||||
def use_sprite?
|
||||
return true
|
||||
end
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# new method: screen_x
|
||||
#--------------------------------------------------------------------------
|
||||
def screen_x
|
||||
return @screen_x rescue 0
|
||||
end
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# new method: screen_y
|
||||
#--------------------------------------------------------------------------
|
||||
def screen_y
|
||||
return @screen_y rescue 0
|
||||
end
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# new method: screen_z
|
||||
#--------------------------------------------------------------------------
|
||||
def screen_z
|
||||
return 100
|
||||
end
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# new method: sprite
|
||||
#--------------------------------------------------------------------------
|
||||
def sprite
|
||||
index = $game_party.battle_members.index(self)
|
||||
return SceneManager.scene.spriteset.actor_sprites[index]
|
||||
end
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# new method: character
|
||||
#--------------------------------------------------------------------------
|
||||
def character
|
||||
return sprite.character_base
|
||||
end
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# face_opposing_party
|
||||
#--------------------------------------------------------------------------
|
||||
def face_opposing_party
|
||||
dr = $game_system.party_direction || YEA::VISUAL_BATTLERS::PARTY_DIRECTION
|
||||
direction = Direction.opposite(dr)
|
||||
character.set_direction(Direction.correct(direction)) rescue 0
|
||||
end
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# forward_direction
|
||||
#--------------------------------------------------------------------------
|
||||
def forward_direction
|
||||
return Direction.opposite(($game_system.party_direction ||
|
||||
YEA::VISUAL_BATTLERS::PARTY_DIRECTION))
|
||||
end
|
||||
|
||||
end # Game_Actor
|
||||
|
||||
#==============================================================================
|
||||
# ? <20><> Game_Enemy
|
||||
#==============================================================================
|
||||
|
||||
class Game_Enemy < Game_Battler
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# new method: sprite
|
||||
#--------------------------------------------------------------------------
|
||||
def sprite
|
||||
return SceneManager.scene.spriteset.enemy_sprites.reverse[self.index]
|
||||
end
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# new method: character
|
||||
#--------------------------------------------------------------------------
|
||||
def character
|
||||
return sprite
|
||||
end
|
||||
|
||||
end # Game_Enemy
|
||||
|
||||
#==============================================================================
|
||||
# ? <20><> Game_Troop
|
||||
#==============================================================================
|
||||
|
||||
class Game_Troop < Game_Unit
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# alias method: setup
|
||||
#--------------------------------------------------------------------------
|
||||
alias game_troop_setup_vb setup
|
||||
def setup(troop_id)
|
||||
game_troop_setup_vb(troop_id)
|
||||
set_coordinates
|
||||
end
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# new method: set_coordinates
|
||||
#--------------------------------------------------------------------------
|
||||
def set_coordinates
|
||||
for member in members
|
||||
member.origin_x = member.screen_x
|
||||
member.origin_y = member.screen_y
|
||||
member.create_move_to(member.screen_x, member.screen_y, 1)
|
||||
end
|
||||
end
|
||||
|
||||
end # Game_Troop
|
||||
|
||||
#==============================================================================
|
||||
# ? <20><> Sprite_Battler
|
||||
#==============================================================================
|
||||
|
||||
class Sprite_Battler < Sprite_Base
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# public instance_variable
|
||||
#--------------------------------------------------------------------------
|
||||
attr_accessor :character_base
|
||||
attr_accessor :character_sprite
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# alias method: dispose
|
||||
#--------------------------------------------------------------------------
|
||||
alias sprite_battler_dispose_vb dispose
|
||||
def dispose
|
||||
dispose_character_sprite
|
||||
sprite_battler_dispose_vb
|
||||
end
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# new method: dispose_character_sprite
|
||||
#--------------------------------------------------------------------------
|
||||
def dispose_character_sprite
|
||||
@character_sprite.dispose unless @character_sprite.nil?
|
||||
end
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# alias method: update
|
||||
#--------------------------------------------------------------------------
|
||||
alias sprite_battler_update_vb update
|
||||
def update
|
||||
sprite_battler_update_vb
|
||||
return if @battler.nil?
|
||||
update_move_to
|
||||
update_character_base
|
||||
update_character_sprite
|
||||
end
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# new method: update_character_base
|
||||
#--------------------------------------------------------------------------
|
||||
def update_character_base
|
||||
return if @character_base.nil?
|
||||
@character_base.update
|
||||
end
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# new method: update_character_sprite
|
||||
#--------------------------------------------------------------------------
|
||||
def update_character_sprite
|
||||
return if @character_sprite.nil?
|
||||
@character_sprite.update
|
||||
end
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# new method: update_move_to
|
||||
#--------------------------------------------------------------------------
|
||||
def update_move_to
|
||||
@battler.update_move_to
|
||||
end
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# new method: moving?
|
||||
#--------------------------------------------------------------------------
|
||||
def moving?
|
||||
return false if @battler.nil?
|
||||
return @battler.moving?
|
||||
end
|
||||
|
||||
end # Sprite_Battler
|
||||
|
||||
#==============================================================================
|
||||
# ? <20><> Sprite_BattleCharacter
|
||||
#==============================================================================
|
||||
|
||||
class Sprite_BattleCharacter < Sprite_Character
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# initialize
|
||||
#--------------------------------------------------------------------------
|
||||
def initialize(viewport, character = nil)
|
||||
super(viewport, character)
|
||||
character.sprite = self
|
||||
end
|
||||
|
||||
end # Sprite_BattleCharacter
|
||||
|
||||
#==============================================================================
|
||||
# ? <20><> Spriteset_Battle
|
||||
#==============================================================================
|
||||
|
||||
class Spriteset_Battle
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# public instance_variable
|
||||
#--------------------------------------------------------------------------
|
||||
attr_accessor :actor_sprites
|
||||
attr_accessor :enemy_sprites
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# overwrite method: create_actors
|
||||
#--------------------------------------------------------------------------
|
||||
def create_actors
|
||||
total = $game_party.max_battle_members
|
||||
@current_party = $game_party.battle_members.clone
|
||||
@actor_sprites = Array.new(total) { Sprite_Battler.new(@viewport1) }
|
||||
for actor in $game_party.battle_members
|
||||
@actor_sprites[actor.index].battler = actor
|
||||
create_actor_sprite(actor)
|
||||
end
|
||||
end
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# new method: create_actor_sprite
|
||||
#--------------------------------------------------------------------------
|
||||
def create_actor_sprite(actor)
|
||||
character = Game_BattleCharacter.new(actor)
|
||||
character_sprite = Sprite_BattleCharacter.new(@viewport1, character)
|
||||
@actor_sprites[actor.index].character_base = character
|
||||
@actor_sprites[actor.index].character_sprite = character_sprite
|
||||
actor.face_opposing_party
|
||||
end
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# alias method: update_actors
|
||||
#--------------------------------------------------------------------------
|
||||
alias spriteset_battle_update_actors_vb update_actors
|
||||
def update_actors
|
||||
if @current_party != $game_party.battle_members
|
||||
dispose_actors
|
||||
create_actors
|
||||
end
|
||||
spriteset_battle_update_actors_vb
|
||||
end
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# new method: moving?
|
||||
#--------------------------------------------------------------------------
|
||||
def moving?
|
||||
return battler_sprites.any? {|sprite| sprite.moving? }
|
||||
end
|
||||
|
||||
end # Spriteset_Battle
|
||||
|
||||
#==============================================================================
|
||||
# ? <20><> Scene_Battle
|
||||
#==============================================================================
|
||||
|
||||
class Scene_Battle < Scene_Base
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# public instance variables
|
||||
#--------------------------------------------------------------------------
|
||||
attr_accessor :spriteset
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# alias method: process_action_end
|
||||
#--------------------------------------------------------------------------
|
||||
alias scene_battle_process_action_end_vb process_action_end
|
||||
def process_action_end
|
||||
start_battler_move_origin
|
||||
scene_battle_process_action_end_vb
|
||||
end
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# alias method: execute_action
|
||||
#--------------------------------------------------------------------------
|
||||
alias scene_battle_execute_action_vb execute_action
|
||||
def execute_action
|
||||
start_battler_move_forward
|
||||
scene_battle_execute_action_vb
|
||||
end
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# new method: start_battler_move_forward
|
||||
#--------------------------------------------------------------------------
|
||||
def start_battler_move_forward
|
||||
return if @subject.started_turn
|
||||
@subject.started_turn = true
|
||||
@subject.move_forward
|
||||
wait_for_moving
|
||||
end
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# new method: start_battler_move_origin
|
||||
#--------------------------------------------------------------------------
|
||||
def start_battler_move_origin
|
||||
@subject.started_turn = nil
|
||||
move_battlers_origin
|
||||
wait_for_moving
|
||||
@subject.face_opposing_party rescue 0
|
||||
end
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# new method: move_battlers_origin
|
||||
#--------------------------------------------------------------------------
|
||||
def move_battlers_origin
|
||||
for member in all_battle_members
|
||||
next if member.dead?
|
||||
next unless member.exist?
|
||||
member.move_origin
|
||||
end
|
||||
end
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# new method: wait_for_moving
|
||||
#--------------------------------------------------------------------------
|
||||
def wait_for_moving
|
||||
update_for_wait
|
||||
update_for_wait while @spriteset.moving?
|
||||
end
|
||||
|
||||
end # Scene_Battle
|
||||
|
||||
#==============================================================================
|
||||
#
|
||||
# <20><> End of File
|
||||
#
|
||||
#==============================================================================
|
||||
@@ -1 +0,0 @@
|
||||
DROP ALL TABLES
|
||||
@@ -1 +0,0 @@
|
||||
{"foo": "bar"}
|
||||
1
samples/Text/messages.fr
Normal file
1
samples/Text/messages.fr
Normal file
@@ -0,0 +1 @@
|
||||
the green potato=la pomme de terre verte
|
||||
1
samples/Text/readme.txt
Normal file
1
samples/Text/readme.txt
Normal file
@@ -0,0 +1 @@
|
||||
Read me now!
|
||||
25
samples/WebIDL/AnimationEvent.webidl
Normal file
25
samples/WebIDL/AnimationEvent.webidl
Normal file
@@ -0,0 +1,25 @@
|
||||
/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||
* You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
*
|
||||
* The origin of this IDL file is
|
||||
* http://www.w3.org/TR/css3-animations/#animation-events-
|
||||
* http://dev.w3.org/csswg/css3-animations/#animation-events-
|
||||
*
|
||||
* Copyright © 2012 W3C® (MIT, ERCIM, Keio), All Rights Reserved. W3C
|
||||
* liability, trademark and document use rules apply.
|
||||
*/
|
||||
|
||||
[Constructor(DOMString type, optional AnimationEventInit eventInitDict)]
|
||||
interface AnimationEvent : Event {
|
||||
readonly attribute DOMString animationName;
|
||||
readonly attribute float elapsedTime;
|
||||
readonly attribute DOMString pseudoElement;
|
||||
};
|
||||
|
||||
dictionary AnimationEventInit : EventInit {
|
||||
DOMString animationName = "";
|
||||
float elapsedTime = 0;
|
||||
DOMString pseudoElement = "";
|
||||
};
|
||||
35
samples/WebIDL/Fetch.webidl
Normal file
35
samples/WebIDL/Fetch.webidl
Normal file
@@ -0,0 +1,35 @@
|
||||
/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||
* You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
*
|
||||
* The origin of this IDL file is
|
||||
* http://fetch.spec.whatwg.org/
|
||||
*/
|
||||
|
||||
typedef object JSON;
|
||||
// FIXME(nsm): Bug 739173: FormData is not available in workers.
|
||||
// typedef (ArrayBuffer or ArrayBufferView or Blob or FormData or USVString or URLSearchParams) BodyInit;
|
||||
typedef (ArrayBuffer or ArrayBufferView or Blob or USVString or URLSearchParams) BodyInit;
|
||||
|
||||
[NoInterfaceObject, Exposed=(Window,Worker)]
|
||||
interface Body {
|
||||
readonly attribute boolean bodyUsed;
|
||||
[Throws]
|
||||
Promise<ArrayBuffer> arrayBuffer();
|
||||
[Throws]
|
||||
Promise<Blob> blob();
|
||||
// FIXME(nsm): Bug 739173 FormData is not supported in workers.
|
||||
// Promise<FormData> formData();
|
||||
[Throws]
|
||||
Promise<JSON> json();
|
||||
[Throws]
|
||||
Promise<USVString> text();
|
||||
};
|
||||
|
||||
[NoInterfaceObject, Exposed=(Window,Worker)]
|
||||
interface GlobalFetch {
|
||||
[Throws, Func="mozilla::dom::Headers::PrefEnabled"]
|
||||
Promise<Response> fetch(RequestInfo input, optional RequestInit init);
|
||||
};
|
||||
|
||||
47
samples/XML/pt_BR.ts
Normal file
47
samples/XML/pt_BR.ts
Normal file
@@ -0,0 +1,47 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE TS>
|
||||
<TS version="2.0" language="pt_BR">
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<message>
|
||||
<location filename="../forms/mainwindow.ui" line="22"/>
|
||||
<source>United Kingdom</source>
|
||||
<translation>Reino Unido</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../forms/mainwindow.ui" line="38"/>
|
||||
<source>God save the Queen</source>
|
||||
<translation>Deus salve a Rainha</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="46"/>
|
||||
<source>England</source>
|
||||
<translation>Inglaterra</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="47"/>
|
||||
<source>Wales</source>
|
||||
<translation>Gales</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="48"/>
|
||||
<source>Scotland</source>
|
||||
<translation>Escócia</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="49"/>
|
||||
<source>Northern Ireland</source>
|
||||
<translation>Irlanda Norte</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="51"/>
|
||||
<source>Portuguese</source>
|
||||
<translation>Português</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="52"/>
|
||||
<source>English</source>
|
||||
<translation>Inglês</translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
||||
@@ -13,6 +13,9 @@ set +x
|
||||
|
||||
mkdir -p ./vendor/gems
|
||||
|
||||
# Clean out any unversioned files
|
||||
git clean -fd
|
||||
|
||||
bundle install --local --path ./vendor/gems
|
||||
bundle exec rake samples
|
||||
bundle exec rake
|
||||
|
||||
@@ -14,7 +14,7 @@ CSONC = File.expand_path("../../node_modules/.bin/csonc", __FILE__)
|
||||
|
||||
class TarballPackage
|
||||
def self.fetch(tmp_dir, url)
|
||||
`curl --silent --location --max-time 10 --output "#{tmp_dir}/archive" "#{url}"`
|
||||
`curl --silent --location --max-time 30 --output "#{tmp_dir}/archive" "#{url}"`
|
||||
raise "Failed to fetch GH package: #{url} #{$?.to_s}" unless $?.success?
|
||||
|
||||
output = File.join(tmp_dir, 'extracted')
|
||||
|
||||
|
Before Width: | Height: | Size: 5.4 KiB After Width: | Height: | Size: 5.4 KiB |
|
Before Width: | Height: | Size: 5.4 KiB After Width: | Height: | Size: 5.4 KiB |
1
test/fixtures/Data/bootstrap.css.map
vendored
Normal file
1
test/fixtures/Data/bootstrap.css.map
vendored
Normal file
File diff suppressed because one or more lines are too long
0
samples/Text/md → test/fixtures/Data/md
vendored
0
samples/Text/md → test/fixtures/Data/md
vendored
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user