mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	Compare commits
	
		
			199 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 458831b885 | ||
|  | f5e4789ccb | ||
|  | 1b712d2800 | ||
|  | e274196441 | ||
|  | c4c3c27cfe | ||
|  | a2dd9d2c8c | ||
|  | b26d5bc1b1 | ||
|  | 607792e1b2 | ||
|  | fb38135a61 | ||
|  | a5d5b6e6c7 | ||
|  | 2fd2cdf68a | ||
|  | 11049ca3ca | ||
|  | c29bea19ef | ||
|  | 8c8434ed64 | ||
|  | 9281bd043a | ||
|  | 6771f7c272 | ||
|  | 76b896a66d | ||
|  | a12520763c | ||
|  | 819bb7caab | ||
|  | 152205a146 | ||
|  | 85dbcb5444 | ||
|  | df09a746a0 | ||
|  | 5199fcf0a2 | ||
|  | dd557ed00a | ||
|  | addf4e2485 | ||
|  | d9be472ccb | ||
|  | 32828a9af5 | ||
|  | d206131df0 | ||
|  | 65eaf98d0b | ||
|  | 12429b90fe | ||
|  | 621042e639 | ||
|  | 526244be11 | ||
|  | bc53d0b55e | ||
|  | 907d3c5a36 | ||
|  | 898f1e215e | ||
|  | 324ac83489 | ||
|  | 00a873dcc7 | ||
|  | bc34345a56 | ||
|  | 659d27cae5 | ||
|  | 29072d6eae | ||
|  | 1fd59361b5 | ||
|  | 5896bb8fa3 | ||
|  | ea1fc90cf5 | ||
|  | 463f48f04f | ||
|  | cd58a30c7c | ||
|  | c4260ae681 | ||
|  | d40b4a33de | ||
|  | 87498679bd | ||
|  | f4e254202b | ||
|  | e91d225e7d | ||
|  | b90d940aef | ||
|  | b83a364b0e | ||
|  | dbff196b08 | ||
|  | 5b7316fb2a | ||
|  | fa4dfe39ba | ||
|  | 89999e60bf | ||
|  | 4819fb12a3 | ||
|  | 27a4eeb206 | ||
|  | bacf4d5780 | ||
|  | f92fed60f8 | ||
|  | 5e797b548c | ||
|  | 700e2f1b2b | ||
|  | 861656978b | ||
|  | 9c05bdac85 | ||
|  | bd34c16c8f | ||
|  | 13109bb9b8 | ||
|  | 84f3b3720b | ||
|  | 858a66ccc8 | ||
|  | abb05eace6 | ||
|  | 62bd96a778 | ||
|  | 8cb736adfa | ||
|  | 0758c05186 | ||
|  | 62bc6f0457 | ||
|  | ea7e894139 | ||
|  | 21f0ac99e6 | ||
|  | b251866a29 | ||
|  | bf3db20a9d | ||
|  | bd55147847 | ||
|  | f4d64af39b | ||
|  | b7bda34645 | ||
|  | b13dea6df0 | ||
|  | 28a64c9318 | ||
|  | 74be618fff | ||
|  | 8bbe10bf50 | ||
|  | d275911624 | ||
|  | c26382301c | ||
|  | e12bc07041 | ||
|  | 20416369ac | ||
|  | 2be91e9b2e | ||
|  | dc1b8d9e80 | ||
|  | bf0a814514 | ||
|  | b14267d40f | ||
|  | 195a4115d8 | ||
|  | e1da8eb841 | ||
|  | 14738f037f | ||
|  | a437943516 | ||
|  | 900ee57de8 | ||
|  | 947f4e1c57 | ||
|  | d9f17a65dd | ||
|  | f71def19ae | ||
|  | e452e85cae | ||
|  | 5059fe90b0 | ||
|  | b90da731d6 | ||
|  | d2012519ba | ||
|  | 1b7f26091c | ||
|  | 548e4f1845 | ||
|  | 625bed8fca | ||
|  | db15367775 | ||
|  | 309d14a955 | ||
|  | 5ff16e1195 | ||
|  | cf43aa9111 | ||
|  | 138c1e6024 | ||
|  | 382870a881 | ||
|  | 31921838cd | ||
|  | a707587182 | ||
|  | bc482af999 | ||
|  | 6818744dae | ||
|  | 607185ac61 | ||
|  | 81b7a412c3 | ||
|  | 09b9a8b441 | ||
|  | 85479cc2de | ||
|  | 3ad4eb2b59 | ||
|  | 878fe95ec3 | ||
|  | 3d23d1be69 | ||
|  | 701e720ab8 | ||
|  | e709ce7d56 | ||
|  | 32c89a5405 | ||
|  | 1735982a73 | ||
|  | 625e0aa1af | ||
|  | 00e1a3f8fd | ||
|  | 539256b08e | ||
|  | ff791f5a39 | ||
|  | de4d48b0fe | ||
|  | b5c49f6d1c | ||
|  | 03cb7d6ffb | ||
|  | 304fc344a1 | ||
|  | 33c42638e9 | ||
|  | 9d940755e7 | ||
|  | bc04232f87 | ||
|  | e17ebec098 | ||
|  | a7cba23526 | ||
|  | 7cd23036a7 | ||
|  | 44c5413abf | ||
|  | 50ab58e91f | ||
|  | 1fd0732390 | ||
|  | ed1b9ee899 | ||
|  | d3c04d6310 | ||
|  | f66ffe305f | ||
|  | 2a9ff0083c | ||
|  | c1cf7ea825 | ||
|  | 67f7268a55 | ||
|  | a55ee7eb09 | ||
|  | 203f6d1944 | ||
|  | 42c68f21d1 | ||
|  | 7e8be1293e | ||
|  | 09c234ec26 | ||
|  | 65a26c3e73 | ||
|  | 98f35aefdc | ||
|  | 38a3714514 | ||
|  | 491700f925 | ||
|  | 4d033e7e83 | ||
|  | efc3638065 | ||
|  | b7685ab317 | ||
|  | 83c5f6a004 | ||
|  | aa5a94cc3e | ||
|  | a5b6331ab5 | ||
|  | 2164b28c64 | ||
|  | 0fb824b345 | ||
|  | 29ee094d66 | ||
|  | 4a7ae50ec8 | ||
|  | 398439a937 | ||
|  | a3bc3a7615 | ||
|  | 7989fbd613 | ||
|  | c389c79be9 | ||
|  | 1fd2f921fd | ||
|  | ed851849db | ||
|  | cfb9f6f0a4 | ||
|  | 3d5a0da62e | ||
|  | 4e15369f9a | ||
|  | 5b3152d99d | ||
|  | a6955f4edb | ||
|  | ac2723abe3 | ||
|  | 0d0e219532 | ||
|  | cf35807709 | ||
|  | c2b53db96d | ||
|  | 8e6efc3a7d | ||
|  | 4b6f05b4d1 | ||
|  | 7aad5f93e4 | ||
|  | 6d5da4c9ec | ||
|  | dcc598442b | ||
|  | 91877056fb | ||
|  | 868e9df434 | ||
|  | 9d569c8bd5 | ||
|  | 9ae0bdbb43 | ||
|  | a3aaa1ec4d | ||
|  | ee3c9bcdbd | ||
|  | aa78060e41 | ||
|  | 5fb6f34d8a | ||
|  | 7c1716aa1e | 
| @@ -1,4 +1,6 @@ | |||||||
| before_install:  | before_install:  | ||||||
|  |   - git fetch origin master:master | ||||||
|  |   - git fetch origin v2.0.0:v2.0.0 | ||||||
|   - sudo apt-get install libicu-dev -y |   - sudo apt-get install libicu-dev -y | ||||||
|   - gem update --system 2.1.11 |   - gem update --system 2.1.11 | ||||||
| rvm: | rvm: | ||||||
|   | |||||||
| @@ -143,8 +143,8 @@ If you are the current maintainer of this gem: | |||||||
|  0. Make sure your local dependencies are up to date: `bundle install` |  0. Make sure your local dependencies are up to date: `bundle install` | ||||||
|  0. Ensure that samples are updated: `bundle exec rake samples` |  0. Ensure that samples are updated: `bundle exec rake samples` | ||||||
|  0. Ensure that tests are green: `bundle exec rake test` |  0. Ensure that tests are green: `bundle exec rake test` | ||||||
|  0. Bump gem version in github-linguist.gemspec.  For example, [like this](https://github.com/github/linguist/commit/97908204a385940e47251af9ecb689e8f6515c48). |  0. Bump gem version in `lib/linguist/version.rb`.  For example, [like this](https://github.com/github/linguist/commit/8d2ea90a5ba3b2fe6e1508b7155aa4632eea2985). | ||||||
|  0. Make a PR to github/linguist.  For example, [#1075](https://github.com/github/linguist/pull/1075). |  0. Make a PR to github/linguist.  For example, [#1238](https://github.com/github/linguist/pull/1238). | ||||||
|  0. Build a local gem: `gem build github-linguist.gemspec` |  0. Build a local gem: `gem build github-linguist.gemspec` | ||||||
|  0. Testing: |  0. Testing: | ||||||
|    0. Bump the Gemfile and Gemfile.lock versions for an app which relies on this gem |    0. Bump the Gemfile and Gemfile.lock versions for an app which relies on this gem | ||||||
| @@ -152,4 +152,4 @@ If you are the current maintainer of this gem: | |||||||
|    0. Test behavior locally, branch deploy, whatever needs to happen |    0. Test behavior locally, branch deploy, whatever needs to happen | ||||||
|  0. Merge github/linguist PR |  0. Merge github/linguist PR | ||||||
|  0. Tag and push: `git tag vx.xx.xx; git push --tags` |  0. Tag and push: `git tag vx.xx.xx; git push --tags` | ||||||
|  0. Push to rubygems.org -- `gem push github-linguist-2.10.12.gem` |  0. Push to rubygems.org -- `gem push github-linguist-3.0.0.gem` | ||||||
|   | |||||||
| @@ -5,6 +5,7 @@ | |||||||
|  |  | ||||||
| require 'linguist/file_blob' | require 'linguist/file_blob' | ||||||
| require 'linguist/repository' | require 'linguist/repository' | ||||||
|  | require 'rugged' | ||||||
|  |  | ||||||
| path = ARGV[0] || Dir.pwd | path = ARGV[0] || Dir.pwd | ||||||
|  |  | ||||||
| @@ -18,7 +19,8 @@ ARGV.shift | |||||||
| breakdown = true if ARGV[0] == "--breakdown" | breakdown = true if ARGV[0] == "--breakdown" | ||||||
|  |  | ||||||
| if File.directory?(path) | if File.directory?(path) | ||||||
|   repo = Linguist::Repository.from_directory(path) |   rugged = Rugged::Repository.new(path) | ||||||
|  |   repo = Linguist::Repository.new(rugged, rugged.head.target_id) | ||||||
|   repo.languages.sort_by { |_, size| size }.reverse.each do |language, size| |   repo.languages.sort_by { |_, size| size }.reverse.each do |language, size| | ||||||
|     percentage = ((size / repo.size.to_f) * 100) |     percentage = ((size / repo.size.to_f) * 100) | ||||||
|     percentage = sprintf '%.2f' % percentage |     percentage = sprintf '%.2f' % percentage | ||||||
|   | |||||||
| @@ -13,10 +13,11 @@ Gem::Specification.new do |s| | |||||||
|   s.files = Dir['lib/**/*'] |   s.files = Dir['lib/**/*'] | ||||||
|   s.executables << 'linguist' |   s.executables << 'linguist' | ||||||
|  |  | ||||||
|   s.add_dependency 'charlock_holmes', '~> 0.7.1' |   s.add_dependency 'charlock_holmes', '~> 0.7.3' | ||||||
|   s.add_dependency 'escape_utils',    '~> 1.0.1' |   s.add_dependency 'escape_utils',    '~> 1.0.1' | ||||||
|   s.add_dependency 'mime-types',      '~> 1.19' |   s.add_dependency 'mime-types',      '~> 1.19' | ||||||
|   s.add_dependency 'pygments.rb',     '~> 0.5.4' |   s.add_dependency 'pygments.rb',     '~> 0.6.0' | ||||||
|  |   s.add_dependency 'rugged',          '~> 0.21.0' | ||||||
|  |  | ||||||
|   s.add_development_dependency 'json' |   s.add_development_dependency 'json' | ||||||
|   s.add_development_dependency 'mocha' |   s.add_development_dependency 'mocha' | ||||||
|   | |||||||
| @@ -112,6 +112,12 @@ module Linguist | |||||||
|       end |       end | ||||||
|     end |     end | ||||||
|  |  | ||||||
|  |     def ruby_encoding | ||||||
|  |       if hash = detect_encoding | ||||||
|  |         hash[:ruby_encoding] | ||||||
|  |       end | ||||||
|  |     end | ||||||
|  |  | ||||||
|     # Try to guess the encoding |     # Try to guess the encoding | ||||||
|     # |     # | ||||||
|     # Returns: a Hash, with :encoding, :confidence, :type |     # Returns: a Hash, with :encoding, :confidence, :type | ||||||
| @@ -256,10 +262,16 @@ module Linguist | |||||||
|           # without changing the encoding of `data`, and |           # without changing the encoding of `data`, and | ||||||
|           # also--importantly--without having to duplicate many (potentially |           # also--importantly--without having to duplicate many (potentially | ||||||
|           # large) strings. |           # large) strings. | ||||||
|           encoded_newlines = ["\r\n", "\r", "\n"]. |           begin | ||||||
|             map { |nl| nl.encode(encoding).force_encoding(data.encoding) } |             encoded_newlines = ["\r\n", "\r", "\n"]. | ||||||
|  |               map { |nl| nl.encode(ruby_encoding, "ASCII-8BIT").force_encoding(data.encoding) } | ||||||
|  |  | ||||||
|           data.split(Regexp.union(encoded_newlines), -1) |             data.split(Regexp.union(encoded_newlines), -1) | ||||||
|  |           rescue Encoding::ConverterNotFoundError | ||||||
|  |             # The data is not splittable in the detected encoding.  Assume it's | ||||||
|  |             # one big line. | ||||||
|  |             [data] | ||||||
|  |           end | ||||||
|         else |         else | ||||||
|           [] |           [] | ||||||
|         end |         end | ||||||
| @@ -301,15 +313,7 @@ module Linguist | |||||||
|     # |     # | ||||||
|     # Returns a Language or nil if none is detected |     # Returns a Language or nil if none is detected | ||||||
|     def language |     def language | ||||||
|       return @language if defined? @language |       @language ||= Language.detect(self) | ||||||
|  |  | ||||||
|       if defined?(@data) && @data.is_a?(String) |  | ||||||
|         data = @data |  | ||||||
|       else |  | ||||||
|         data = lambda { (binary_mime_type? || binary?) ? "" : self.data } |  | ||||||
|       end |  | ||||||
|  |  | ||||||
|       @language = Language.detect(name.to_s, data, mode) |  | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     # Internal: Get the lexer of the blob. |     # Internal: Get the lexer of the blob. | ||||||
|   | |||||||
| @@ -63,7 +63,8 @@ module Linguist | |||||||
|         generated_jni_header? || |         generated_jni_header? || | ||||||
|         composer_lock? || |         composer_lock? || | ||||||
|         node_modules? || |         node_modules? || | ||||||
|         vcr_cassette? |         vcr_cassette? || | ||||||
|  |         generated_by_zephir? | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     # Internal: Is the blob an XCode project file? |     # Internal: Is the blob an XCode project file? | ||||||
| @@ -237,6 +238,13 @@ module Linguist | |||||||
|       !!name.match(/composer.lock/) |       !!name.match(/composer.lock/) | ||||||
|     end |     end | ||||||
|  |  | ||||||
|  |     # Internal: Is the blob a generated by Zephir | ||||||
|  |     # | ||||||
|  |     # Returns true or false. | ||||||
|  |     def generated_by_zephir? | ||||||
|  |       !!name.match(/.\.zep\.(?:c|h|php)$/) | ||||||
|  |     end | ||||||
|  |  | ||||||
|     # Is the blob a VCR Cassette file? |     # Is the blob a VCR Cassette file? | ||||||
|     # |     # | ||||||
|     # Returns true or false |     # Returns true or false | ||||||
|   | |||||||
| @@ -92,18 +92,24 @@ module Linguist | |||||||
|  |  | ||||||
|     # Public: Detects the Language of the blob. |     # Public: Detects the Language of the blob. | ||||||
|     # |     # | ||||||
|     # name - String filename |     # blob - an object that includes the Linguist `BlobHelper` interface; | ||||||
|     # data - String blob data. A block also maybe passed in for lazy |     #       see Linguist::LazyBlob and Linguist::FileBlob for examples | ||||||
|     #        loading. This behavior is deprecated and you should always |  | ||||||
|     #        pass in a String. |  | ||||||
|     # mode - Optional String mode (defaults to nil) |  | ||||||
|     # |     # | ||||||
|     # Returns Language or nil. |     # Returns Language or nil. | ||||||
|     def self.detect(name, data, mode = nil) |     def self.detect(blob) | ||||||
|  |       name = blob.name.to_s | ||||||
|  |  | ||||||
|  |       # Check if the blob is possibly binary and bail early; this is a cheap | ||||||
|  |       # test that uses the extension name to guess a binary binary mime type. | ||||||
|  |       # | ||||||
|  |       # We'll perform a more comprehensive test later which actually involves | ||||||
|  |       # looking for binary characters in the blob | ||||||
|  |       return nil if blob.likely_binary? | ||||||
|  |  | ||||||
|       # A bit of an elegant hack. If the file is executable but extensionless, |       # A bit of an elegant hack. If the file is executable but extensionless, | ||||||
|       # append a "magic" extension so it can be classified with other |       # append a "magic" extension so it can be classified with other | ||||||
|       # languages that have shebang scripts. |       # languages that have shebang scripts. | ||||||
|       if File.extname(name).empty? && mode && (mode.to_i(8) & 05) == 05 |       if File.extname(name).empty? && blob.mode && (blob.mode.to_i(8) & 05) == 05 | ||||||
|         name += ".script!" |         name += ".script!" | ||||||
|       end |       end | ||||||
|  |  | ||||||
| @@ -114,11 +120,11 @@ module Linguist | |||||||
|       # extension at all, in the case of extensionless scripts), we need to continue |       # extension at all, in the case of extensionless scripts), we need to continue | ||||||
|       # our detection work |       # our detection work | ||||||
|       if possible_languages.length > 1 |       if possible_languages.length > 1 | ||||||
|         data = data.call() if data.respond_to?(:call) |         data = blob.data | ||||||
|         possible_language_names = possible_languages.map(&:name) |         possible_language_names = possible_languages.map(&:name) | ||||||
|  |  | ||||||
|         # Don't bother with emptiness |         # Don't bother with binary contents or an empty file | ||||||
|         if data.nil? || data == "" |         if blob.binary? || data.nil? || data == "" | ||||||
|           nil |           nil | ||||||
|         # Check if there's a shebang line and use that as authoritative |         # Check if there's a shebang line and use that as authoritative | ||||||
|         elsif (result = find_by_shebang(data)) && !result.empty? |         elsif (result = find_by_shebang(data)) && !result.empty? | ||||||
|   | |||||||
| @@ -89,7 +89,7 @@ Agda: | |||||||
|  |  | ||||||
| Alloy: | Alloy: | ||||||
|   type: programming  # 'modeling' would be more appropiate |   type: programming  # 'modeling' would be more appropiate | ||||||
|   lexer: Text only |   lexer: Alloy | ||||||
|   color: "#cc5c24" |   color: "#cc5c24" | ||||||
|   extensions: |   extensions: | ||||||
|   - .als |   - .als | ||||||
| @@ -157,6 +157,7 @@ Assembly: | |||||||
|   - nasm |   - nasm | ||||||
|   extensions: |   extensions: | ||||||
|   - .asm |   - .asm | ||||||
|  |   - .inc | ||||||
|  |  | ||||||
| Augeas: | Augeas: | ||||||
|   type: programming |   type: programming | ||||||
| @@ -221,6 +222,8 @@ BlitzBasic: | |||||||
|   - .decls |   - .decls | ||||||
|  |  | ||||||
| BlitzMax: | BlitzMax: | ||||||
|  |   type: programming | ||||||
|  |   color: "#cd6400" | ||||||
|   extensions: |   extensions: | ||||||
|   - .bmx |   - .bmx | ||||||
|  |  | ||||||
| @@ -430,6 +433,14 @@ Common Lisp: | |||||||
|   - clisp |   - clisp | ||||||
|   - ecl |   - ecl | ||||||
|  |  | ||||||
|  | Component Pascal: | ||||||
|  |   type: programming | ||||||
|  |   lexer: Delphi | ||||||
|  |   color: "#b0ce4e" | ||||||
|  |   extensions: | ||||||
|  |   - .cp | ||||||
|  |   - .cps | ||||||
|  |  | ||||||
| Coq: | Coq: | ||||||
|   type: programming |   type: programming | ||||||
|   extensions: |   extensions: | ||||||
| @@ -520,15 +531,6 @@ Dart: | |||||||
|   extensions: |   extensions: | ||||||
|   - .dart |   - .dart | ||||||
|  |  | ||||||
| DCPU-16 ASM: |  | ||||||
|   type: programming |  | ||||||
|   lexer: dasm16 |  | ||||||
|   extensions: |  | ||||||
|   - .dasm16 |  | ||||||
|   - .dasm |  | ||||||
|   aliases: |  | ||||||
|   - dasm16 |  | ||||||
|  |  | ||||||
| Diff: | Diff: | ||||||
|   extensions: |   extensions: | ||||||
|   - .diff |   - .diff | ||||||
| @@ -735,12 +737,14 @@ GLSL: | |||||||
|   - .glsl |   - .glsl | ||||||
|   - .fp |   - .fp | ||||||
|   - .frag |   - .frag | ||||||
|  |   - .frg | ||||||
|   - .fshader |   - .fshader | ||||||
|   - .geom |   - .geom | ||||||
|   - .glslv |   - .glslv | ||||||
|   - .gshader |   - .gshader | ||||||
|   - .shader |   - .shader | ||||||
|   - .vert |   - .vert | ||||||
|  |   - .vrx | ||||||
|   - .vshader |   - .vshader | ||||||
|  |  | ||||||
| Genshi: | Genshi: | ||||||
| @@ -798,6 +802,12 @@ Gosu: | |||||||
|   extensions: |   extensions: | ||||||
|   - .gs |   - .gs | ||||||
|  |  | ||||||
|  | Grace: | ||||||
|  |   type: programming | ||||||
|  |   lexer: Text only | ||||||
|  |   extensions: | ||||||
|  |   - .grace | ||||||
|  |  | ||||||
| Grammatical Framework: | Grammatical Framework: | ||||||
|   type: programming |   type: programming | ||||||
|   lexer: Haskell |   lexer: Haskell | ||||||
| @@ -932,7 +942,7 @@ Hy: | |||||||
|  |  | ||||||
| IDL: | IDL: | ||||||
|   type: programming |   type: programming | ||||||
|   lexer: Text only |   lexer: IDL | ||||||
|   color: "#e3592c" |   color: "#e3592c" | ||||||
|   extensions: |   extensions: | ||||||
|   - .pro |   - .pro | ||||||
| @@ -951,7 +961,7 @@ Inno Setup: | |||||||
|  |  | ||||||
| Idris: | Idris: | ||||||
|   type: programming |   type: programming | ||||||
|   lexer: Text only |   lexer: Idris | ||||||
|   extensions: |   extensions: | ||||||
|   - .idr |   - .idr | ||||||
|   - .lidr |   - .lidr | ||||||
| @@ -990,6 +1000,13 @@ Ioke: | |||||||
|   extensions: |   extensions: | ||||||
|   - .ik |   - .ik | ||||||
|  |  | ||||||
|  | Isabelle: | ||||||
|  |   type: programming | ||||||
|  |   lexer: Text only | ||||||
|  |   color: "#fdcd00" | ||||||
|  |   extensions: | ||||||
|  |   - .thy | ||||||
|  |  | ||||||
| J: | J: | ||||||
|   type: programming |   type: programming | ||||||
|   lexer: Text only |   lexer: Text only | ||||||
| @@ -1079,6 +1096,8 @@ JavaScript: | |||||||
|   - .pac |   - .pac | ||||||
|   - .sjs |   - .sjs | ||||||
|   - .ssjs |   - .ssjs | ||||||
|  |   - .xsjs | ||||||
|  |   - .xsjslib | ||||||
|   filenames: |   filenames: | ||||||
|   - Jakefile |   - Jakefile | ||||||
|   interpreters: |   interpreters: | ||||||
| @@ -1277,6 +1296,8 @@ Mathematica: | |||||||
|   type: programming |   type: programming | ||||||
|   extensions: |   extensions: | ||||||
|   - .mathematica |   - .mathematica | ||||||
|  |   - .m | ||||||
|  |   - .nb | ||||||
|   lexer: Text only |   lexer: Text only | ||||||
|  |  | ||||||
| Matlab: | Matlab: | ||||||
| @@ -1384,6 +1405,19 @@ Nimrod: | |||||||
|   - .nim |   - .nim | ||||||
|   - .nimrod |   - .nimrod | ||||||
|  |  | ||||||
|  | Nit: | ||||||
|  |   type: programming | ||||||
|  |   lexer: Text only | ||||||
|  |   color: "#0d8921" | ||||||
|  |   extensions: | ||||||
|  |   - .nit | ||||||
|  |  | ||||||
|  | Nix: | ||||||
|  |   type: programming | ||||||
|  |   lexer: Nix | ||||||
|  |   extensions: | ||||||
|  |   - .nix | ||||||
|  |  | ||||||
| Nu: | Nu: | ||||||
|   type: programming |   type: programming | ||||||
|   lexer: Scheme |   lexer: Scheme | ||||||
| @@ -1519,6 +1553,8 @@ PHP: | |||||||
|   - .phpt |   - .phpt | ||||||
|   filenames: |   filenames: | ||||||
|   - Phakefile |   - Phakefile | ||||||
|  |   interpreters: | ||||||
|  |   - php | ||||||
|  |  | ||||||
| Pan: | Pan: | ||||||
|   type: programming |   type: programming | ||||||
| @@ -1593,7 +1629,7 @@ Perl6: | |||||||
| Pike: | Pike: | ||||||
|   type: programming |   type: programming | ||||||
|   color: "#066ab2" |   color: "#066ab2" | ||||||
|   lexer: C |   lexer: Pike | ||||||
|   extensions: |   extensions: | ||||||
|   - .pike |   - .pike | ||||||
|   - .pmod |   - .pmod | ||||||
| @@ -1690,6 +1726,7 @@ Python: | |||||||
|   - .gyp |   - .gyp | ||||||
|   - .lmi |   - .lmi | ||||||
|   - .pyde |   - .pyde | ||||||
|  |   - .pyp | ||||||
|   - .pyt |   - .pyt | ||||||
|   - .pyw |   - .pyw | ||||||
|   - .wsgi |   - .wsgi | ||||||
| @@ -1715,6 +1752,12 @@ QML: | |||||||
|   extensions: |   extensions: | ||||||
|   - .qml |   - .qml | ||||||
|  |  | ||||||
|  | QMake: | ||||||
|  |   lexer: Text only | ||||||
|  |   extensions: | ||||||
|  |   - .pro | ||||||
|  |   - .pri | ||||||
|  |  | ||||||
| R: | R: | ||||||
|   type: programming |   type: programming | ||||||
|   color: "#198ce7" |   color: "#198ce7" | ||||||
| @@ -1854,13 +1897,17 @@ Ruby: | |||||||
|   interpreters: |   interpreters: | ||||||
|   - ruby |   - ruby | ||||||
|   filenames: |   filenames: | ||||||
|  |   - .pryrc | ||||||
|   - Appraisals |   - Appraisals | ||||||
|   - Berksfile |   - Berksfile | ||||||
|   - Buildfile |   - Buildfile | ||||||
|   - Gemfile |   - Gemfile | ||||||
|   - Gemfile.lock |   - Gemfile.lock | ||||||
|   - Guardfile |   - Guardfile | ||||||
|  |   - Jarfile | ||||||
|  |   - Mavenfile | ||||||
|   - Podfile |   - Podfile | ||||||
|  |   - Puppetfile | ||||||
|   - Thorfile |   - Thorfile | ||||||
|   - Vagrantfile |   - Vagrantfile | ||||||
|   - buildfile |   - buildfile | ||||||
| @@ -1895,6 +1942,13 @@ SQL: | |||||||
|   - .udf |   - .udf | ||||||
|   - .viw |   - .viw | ||||||
|  |  | ||||||
|  | STON: | ||||||
|  |   type: data | ||||||
|  |   group: Smalltalk | ||||||
|  |   lexer: JSON | ||||||
|  |   extensions: | ||||||
|  |   - .ston | ||||||
|  |  | ||||||
| Sage: | Sage: | ||||||
|   type: programming |   type: programming | ||||||
|   lexer: Python |   lexer: Python | ||||||
| @@ -1987,6 +2041,14 @@ Slash: | |||||||
|   extensions: |   extensions: | ||||||
|   - .sl |   - .sl | ||||||
|  |  | ||||||
|  | Slim: | ||||||
|  |   group: HTML | ||||||
|  |   type: markup | ||||||
|  |   lexer: Slim | ||||||
|  |   color: "#ff8877" | ||||||
|  |   extensions: | ||||||
|  |   - .slim | ||||||
|  |  | ||||||
| Smalltalk: | Smalltalk: | ||||||
|   type: programming |   type: programming | ||||||
|   color: "#596706" |   color: "#596706" | ||||||
| @@ -2017,8 +2079,9 @@ Standard ML: | |||||||
|   aliases: |   aliases: | ||||||
|   - sml |   - sml | ||||||
|   extensions: |   extensions: | ||||||
|   - .sml |   - .ML | ||||||
|   - .fun |   - .fun | ||||||
|  |   - .sml | ||||||
|  |  | ||||||
| Stata: | Stata: | ||||||
|   type: programming |   type: programming | ||||||
| @@ -2048,7 +2111,8 @@ SuperCollider: | |||||||
|  |  | ||||||
| Swift: | Swift: | ||||||
|   type: programming |   type: programming | ||||||
|   lexer: Text only |   lexer: Swift | ||||||
|  |   color: "#ffac45" | ||||||
|   extensions: |   extensions: | ||||||
|   - .swift |   - .swift | ||||||
|  |  | ||||||
| @@ -2160,6 +2224,14 @@ UnrealScript: | |||||||
|   extensions: |   extensions: | ||||||
|   - .uc |   - .uc | ||||||
|  |  | ||||||
|  | VCL: | ||||||
|  |   type: programming | ||||||
|  |   lexer: Perl | ||||||
|  |   ace_mode: perl | ||||||
|  |   color: "#0298c3" | ||||||
|  |   extensions: | ||||||
|  |   - .vcl | ||||||
|  |  | ||||||
| VHDL: | VHDL: | ||||||
|   type: programming |   type: programming | ||||||
|   lexer: vhdl |   lexer: vhdl | ||||||
| @@ -2255,6 +2327,7 @@ XML: | |||||||
|   - .launch |   - .launch | ||||||
|   - .mxml |   - .mxml | ||||||
|   - .nproj |   - .nproj | ||||||
|  |   - .nuspec | ||||||
|   - .osm |   - .osm | ||||||
|   - .plist |   - .plist | ||||||
|   - .pluginspec |   - .pluginspec | ||||||
| @@ -2326,6 +2399,17 @@ XSLT: | |||||||
|   - .xslt |   - .xslt | ||||||
|   - .xsl |   - .xsl | ||||||
|  |  | ||||||
|  | Xojo: | ||||||
|  |   type: programming | ||||||
|  |   lexer: VB.net | ||||||
|  |   extensions: | ||||||
|  |   - .xojo_code | ||||||
|  |   - .xojo_menu | ||||||
|  |   - .xojo_report | ||||||
|  |   - .xojo_script | ||||||
|  |   - .xojo_toolbar | ||||||
|  |   - .xojo_window | ||||||
|  |  | ||||||
| Xtend: | Xtend: | ||||||
|   type: programming |   type: programming | ||||||
|   extensions: |   extensions: | ||||||
| @@ -2348,6 +2432,14 @@ Zephir: | |||||||
|   extensions: |   extensions: | ||||||
|   - .zep |   - .zep | ||||||
|  |  | ||||||
|  | Zimpl: | ||||||
|  |   type: programming | ||||||
|  |   lexer: Text only | ||||||
|  |   extensions: | ||||||
|  |   - .zimpl | ||||||
|  |   - .zmpl | ||||||
|  |   - .zpl | ||||||
|  |  | ||||||
| eC: | eC: | ||||||
|   type: programming |   type: programming | ||||||
|   search_term: ec |   search_term: ec | ||||||
| @@ -2378,6 +2470,7 @@ mupad: | |||||||
| nesC: | nesC: | ||||||
|   type: programming |   type: programming | ||||||
|   color: "#ffce3b" |   color: "#ffce3b" | ||||||
|  |   lexer: nesC | ||||||
|   extensions: |   extensions: | ||||||
|   - .nc |   - .nc | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										37
									
								
								lib/linguist/lazy_blob.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								lib/linguist/lazy_blob.rb
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,37 @@ | |||||||
|  | require 'linguist/blob_helper' | ||||||
|  | require 'rugged' | ||||||
|  |  | ||||||
|  | module Linguist | ||||||
|  |   class LazyBlob | ||||||
|  |     include BlobHelper | ||||||
|  |  | ||||||
|  |     MAX_SIZE = 128 * 1024 | ||||||
|  |  | ||||||
|  |     attr_reader :repository | ||||||
|  |     attr_reader :oid | ||||||
|  |     attr_reader :name | ||||||
|  |     attr_reader :mode | ||||||
|  |  | ||||||
|  |     def initialize(repo, oid, name, mode = nil) | ||||||
|  |       @repository = repo | ||||||
|  |       @oid = oid | ||||||
|  |       @name = name | ||||||
|  |       @mode = mode | ||||||
|  |     end | ||||||
|  |  | ||||||
|  |     def data | ||||||
|  |       load_blob! | ||||||
|  |       @data | ||||||
|  |     end | ||||||
|  |  | ||||||
|  |     def size | ||||||
|  |       load_blob! | ||||||
|  |       @size | ||||||
|  |     end | ||||||
|  |  | ||||||
|  |     protected | ||||||
|  |     def load_blob! | ||||||
|  |       @data, @size = Rugged::Blob.to_buffer(repository, oid, MAX_SIZE) if @data.nil? | ||||||
|  |     end | ||||||
|  |   end | ||||||
|  | end | ||||||
| @@ -1,4 +1,5 @@ | |||||||
| require 'linguist/file_blob' | require 'linguist/lazy_blob' | ||||||
|  | require 'rugged' | ||||||
|  |  | ||||||
| module Linguist | module Linguist | ||||||
|   # A Repository is an abstraction of a Grit::Repo or a basic file |   # A Repository is an abstraction of a Grit::Repo or a basic file | ||||||
| @@ -7,100 +8,146 @@ module Linguist | |||||||
|   # Its primary purpose is for gathering language statistics across |   # Its primary purpose is for gathering language statistics across | ||||||
|   # the entire project. |   # the entire project. | ||||||
|   class Repository |   class Repository | ||||||
|     # Public: Initialize a new Repository from a File directory |     attr_reader :repository | ||||||
|     # |  | ||||||
|     # base_path - A path String |     # Public: Create a new Repository based on the stats of | ||||||
|     # |     # an existing one | ||||||
|     # Returns a Repository |     def self.incremental(repo, commit_oid, old_commit_oid, old_stats) | ||||||
|     def self.from_directory(base_path) |       repo = self.new(repo, commit_oid) | ||||||
|       new Dir["#{base_path}/**/*"]. |       repo.load_existing_stats(old_commit_oid, old_stats) | ||||||
|         select { |f| File.file?(f) }. |       repo | ||||||
|         map { |path| FileBlob.new(path, base_path) } |  | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     # Public: Initialize a new Repository |     # Public: Initialize a new Repository to be analyzed for language | ||||||
|  |     # data | ||||||
|     # |     # | ||||||
|     # enum - Enumerator that responds to `each` and |     # repo - a Rugged::Repository object | ||||||
|     #        yields Blob objects |     # commit_oid - the sha1 of the commit that will be analyzed; | ||||||
|  |     #              this is usually the master branch | ||||||
|     # |     # | ||||||
|     # Returns a Repository |     # Returns a Repository | ||||||
|     def initialize(enum) |     def initialize(repo, commit_oid) | ||||||
|       @enum = enum |       @repository = repo | ||||||
|       @computed_stats = false |       @commit_oid = commit_oid | ||||||
|       @language = @size = nil |  | ||||||
|       @sizes = Hash.new { 0 } |       raise TypeError, 'commit_oid must be a commit SHA1' unless commit_oid.is_a?(String) | ||||||
|       @file_breakdown = Hash.new { |h,k| h[k] = Array.new } |     end | ||||||
|  |  | ||||||
|  |     # Public: Load the results of a previous analysis on this repository | ||||||
|  |     # to speed up the new scan. | ||||||
|  |     # | ||||||
|  |     # The new analysis will be performed incrementally as to only take | ||||||
|  |     # into account the file changes since the last time the repository | ||||||
|  |     # was scanned | ||||||
|  |     # | ||||||
|  |     # old_commit_oid - the sha1 of the commit that was previously analyzed | ||||||
|  |     # old_stats - the result of the previous analysis, obtained by calling | ||||||
|  |     #             Repository#cache on the old repository | ||||||
|  |     # | ||||||
|  |     # Returns nothing | ||||||
|  |     def load_existing_stats(old_commit_oid, old_stats) | ||||||
|  |       @old_commit_oid = old_commit_oid | ||||||
|  |       @old_stats = old_stats | ||||||
|  |       nil | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     # Public: Returns a breakdown of language stats. |     # Public: Returns a breakdown of language stats. | ||||||
|     # |     # | ||||||
|     # Examples |     # Examples | ||||||
|     # |     # | ||||||
|     #   # => { Language['Ruby'] => 46319, |     #   # => { 'Ruby' => 46319, | ||||||
|     #          Language['JavaScript'] => 258 } |     #          'JavaScript' => 258 } | ||||||
|     # |     # | ||||||
|     # Returns a Hash of Language keys and Integer size values. |     # Returns a Hash of language names and Integer size values. | ||||||
|     def languages |     def languages | ||||||
|       compute_stats |       @sizes ||= begin | ||||||
|       @sizes |         sizes = Hash.new { 0 } | ||||||
|  |         cache.each do |_, (language, size)| | ||||||
|  |           sizes[language] += size | ||||||
|  |         end | ||||||
|  |         sizes | ||||||
|  |       end | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     # Public: Get primary Language of repository. |     # Public: Get primary Language of repository. | ||||||
|     # |     # | ||||||
|     # Returns a Language |     # Returns a language name | ||||||
|     def language |     def language | ||||||
|       compute_stats |       @language ||= begin | ||||||
|       @language |         primary = languages.max_by { |(_, size)| size } | ||||||
|  |         primary && primary[0] | ||||||
|  |       end | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     # Public: Get the total size of the repository. |     # Public: Get the total size of the repository. | ||||||
|     # |     # | ||||||
|     # Returns a byte size Integer |     # Returns a byte size Integer | ||||||
|     def size |     def size | ||||||
|       compute_stats |       @size ||= languages.inject(0) { |s,(_,v)| s + v } | ||||||
|       @size |  | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     # Public: Return the language breakdown of this repository by file |     # Public: Return the language breakdown of this repository by file | ||||||
|  |     # | ||||||
|  |     # Returns a map of language names => [filenames...] | ||||||
|     def breakdown_by_file |     def breakdown_by_file | ||||||
|       compute_stats |       @file_breakdown ||= begin | ||||||
|       @file_breakdown |         breakdown = Hash.new { |h,k| h[k] = Array.new } | ||||||
|  |         cache.each do |filename, (language, _)| | ||||||
|  |           breakdown[language] << filename | ||||||
|  |         end | ||||||
|  |         breakdown | ||||||
|  |       end | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     # Internal: Compute language breakdown for each blob in the Repository. |     # Public: Return the cached results of the analysis | ||||||
|     # |     # | ||||||
|     # Returns nothing |     # This is a per-file breakdown that can be passed to other instances | ||||||
|     def compute_stats |     # of Linguist::Repository to perform incremental scans | ||||||
|       return if @computed_stats |     # | ||||||
|  |     # Returns a map of filename => [language, size] | ||||||
|  |     def cache | ||||||
|  |       @cache ||= begin | ||||||
|  |         if @old_commit_oid == @commit_oid | ||||||
|  |           @old_stats | ||||||
|  |         else | ||||||
|  |           compute_stats(@old_commit_oid, @commit_oid, @old_stats) | ||||||
|  |         end | ||||||
|  |       end | ||||||
|  |     end | ||||||
|  |  | ||||||
|       @enum.each do |blob| |     protected | ||||||
|         # Skip files that are likely binary |     def compute_stats(old_commit_oid, commit_oid, cache = nil) | ||||||
|         next if blob.likely_binary? |       file_map = cache ? cache.dup : {} | ||||||
|  |       old_tree = old_commit_oid && Rugged::Commit.lookup(repository, old_commit_oid).tree | ||||||
|  |       new_tree = Rugged::Commit.lookup(repository, commit_oid).tree | ||||||
|  |  | ||||||
|         # Skip vendored or generated blobs |       diff = Rugged::Tree.diff(repository, old_tree, new_tree) | ||||||
|         next if blob.vendored? || blob.generated? || blob.language.nil? |  | ||||||
|  |  | ||||||
|         # Only include programming languages and acceptable markup languages |       diff.each_delta do |delta| | ||||||
|         if blob.language.type == :programming || Language.detectable_markup.include?(blob.language.name) |         old = delta.old_file[:path] | ||||||
|  |         new = delta.new_file[:path] | ||||||
|  |  | ||||||
|           # Build up the per-file breakdown stats |         file_map.delete(old) | ||||||
|           @file_breakdown[blob.language.group.name] << blob.name |         next if delta.binary | ||||||
|  |  | ||||||
|           @sizes[blob.language.group] += blob.size |         if [:added, :modified].include? delta.status | ||||||
|  |           # Skip submodules | ||||||
|  |           mode = delta.new_file[:mode] | ||||||
|  |           next if (mode & 040000) != 0 | ||||||
|  |  | ||||||
|  |           blob = Linguist::LazyBlob.new(repository, delta.new_file[:oid], new, mode.to_s(8)) | ||||||
|  |  | ||||||
|  |           # Skip vendored or generated blobs | ||||||
|  |           next if blob.vendored? || blob.generated? || blob.language.nil? | ||||||
|  |  | ||||||
|  |           # Only include programming languages and acceptable markup languages | ||||||
|  |           if blob.language.type == :programming || Language.detectable_markup.include?(blob.language.name) | ||||||
|  |             file_map[new] = [blob.language.group.name, blob.size] | ||||||
|  |           end | ||||||
|         end |         end | ||||||
|       end |       end | ||||||
|  |  | ||||||
|       # Compute total size |       file_map | ||||||
|       @size = @sizes.inject(0) { |s,(_,v)| s + v } |  | ||||||
|  |  | ||||||
|       # Get primary language |  | ||||||
|       if primary = @sizes.max_by { |(_, size)| size } |  | ||||||
|         @language = primary[0] |  | ||||||
|       end |  | ||||||
|  |  | ||||||
|       @computed_stats = true |  | ||||||
|  |  | ||||||
|       nil |  | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
| end | end | ||||||
|   | |||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -28,7 +28,7 @@ module Linguist | |||||||
|     # |     # | ||||||
|     # Returns nothing. |     # Returns nothing. | ||||||
|     def self.each(&block) |     def self.each(&block) | ||||||
|       Dir.entries(ROOT).each do |category| |       Dir.entries(ROOT).sort!.each do |category| | ||||||
|         next if category == '.' || category == '..' |         next if category == '.' || category == '..' | ||||||
|  |  | ||||||
|         # Skip text and binary for now |         # Skip text and binary for now | ||||||
|   | |||||||
| @@ -43,6 +43,7 @@ | |||||||
| # Vendored dependencies | # Vendored dependencies | ||||||
| - thirdparty/ | - thirdparty/ | ||||||
| - vendors?/ | - vendors?/ | ||||||
|  | - extern(al)?/ | ||||||
|  |  | ||||||
| # Debian packaging | # Debian packaging | ||||||
| - ^debian/ | - ^debian/ | ||||||
| @@ -168,6 +169,9 @@ | |||||||
| - (^|/)extjs/src/ | - (^|/)extjs/src/ | ||||||
| - (^|/)extjs/welcome/ | - (^|/)extjs/welcome/ | ||||||
|  |  | ||||||
|  | # Html5shiv | ||||||
|  | - (^|/)html5shiv(\.min)?\.js$ | ||||||
|  |  | ||||||
| # Samples folders | # Samples folders | ||||||
| - ^[Ss]amples/ | - ^[Ss]amples/ | ||||||
|  |  | ||||||
| @@ -196,3 +200,12 @@ | |||||||
|  |  | ||||||
| # Mercury --use-subdirs | # Mercury --use-subdirs | ||||||
| - Mercury/ | - Mercury/ | ||||||
|  |  | ||||||
|  | # R packages | ||||||
|  | - ^vignettes/ | ||||||
|  | - ^inst/extdata/ | ||||||
|  |  | ||||||
|  | # Octicons | ||||||
|  | - octicons.css | ||||||
|  | - octicons.min.css | ||||||
|  | - sprockets-octicons.scss | ||||||
|   | |||||||
| @@ -1,3 +1,3 @@ | |||||||
| module Linguist | module Linguist | ||||||
|   VERSION = "2.11.2" |   VERSION = "3.0.2" | ||||||
| end | end | ||||||
|   | |||||||
							
								
								
									
										2048
									
								
								samples/Assembly/ASSEMBLE.inc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2048
									
								
								samples/Assembly/ASSEMBLE.inc
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										350
									
								
								samples/Assembly/FASM.asm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										350
									
								
								samples/Assembly/FASM.asm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,350 @@ | |||||||
|  |  | ||||||
|  | ; flat assembler interface for Win32 | ||||||
|  | ; Copyright (c) 1999-2014, Tomasz Grysztar. | ||||||
|  | ; All rights reserved. | ||||||
|  |  | ||||||
|  | 	format	PE console | ||||||
|  |  | ||||||
|  | section '.text' code readable executable | ||||||
|  |  | ||||||
|  | start: | ||||||
|  |  | ||||||
|  | 	mov	[con_handle],STD_OUTPUT_HANDLE | ||||||
|  | 	mov	esi,_logo | ||||||
|  | 	call	display_string | ||||||
|  |  | ||||||
|  | 	call	get_params | ||||||
|  | 	jc	information | ||||||
|  |  | ||||||
|  | 	call	init_memory | ||||||
|  |  | ||||||
|  | 	mov	esi,_memory_prefix | ||||||
|  | 	call	display_string | ||||||
|  | 	mov	eax,[memory_end] | ||||||
|  | 	sub	eax,[memory_start] | ||||||
|  | 	add	eax,[additional_memory_end] | ||||||
|  | 	sub	eax,[additional_memory] | ||||||
|  | 	shr	eax,10 | ||||||
|  | 	call	display_number | ||||||
|  | 	mov	esi,_memory_suffix | ||||||
|  | 	call	display_string | ||||||
|  |  | ||||||
|  | 	call	[GetTickCount] | ||||||
|  | 	mov	[start_time],eax | ||||||
|  |  | ||||||
|  | 	call	preprocessor | ||||||
|  | 	call	parser | ||||||
|  | 	call	assembler | ||||||
|  | 	call	formatter | ||||||
|  |  | ||||||
|  | 	call	display_user_messages | ||||||
|  | 	movzx	eax,[current_pass] | ||||||
|  | 	inc	eax | ||||||
|  | 	call	display_number | ||||||
|  | 	mov	esi,_passes_suffix | ||||||
|  | 	call	display_string | ||||||
|  | 	call	[GetTickCount] | ||||||
|  | 	sub	eax,[start_time] | ||||||
|  | 	xor	edx,edx | ||||||
|  | 	mov	ebx,100 | ||||||
|  | 	div	ebx | ||||||
|  | 	or	eax,eax | ||||||
|  | 	jz	display_bytes_count | ||||||
|  | 	xor	edx,edx | ||||||
|  | 	mov	ebx,10 | ||||||
|  | 	div	ebx | ||||||
|  | 	push	edx | ||||||
|  | 	call	display_number | ||||||
|  | 	mov	dl,'.' | ||||||
|  | 	call	display_character | ||||||
|  | 	pop	eax | ||||||
|  | 	call	display_number | ||||||
|  | 	mov	esi,_seconds_suffix | ||||||
|  | 	call	display_string | ||||||
|  |       display_bytes_count: | ||||||
|  | 	mov	eax,[written_size] | ||||||
|  | 	call	display_number | ||||||
|  | 	mov	esi,_bytes_suffix | ||||||
|  | 	call	display_string | ||||||
|  | 	xor	al,al | ||||||
|  | 	jmp	exit_program | ||||||
|  |  | ||||||
|  | information: | ||||||
|  | 	mov	esi,_usage | ||||||
|  | 	call	display_string | ||||||
|  | 	mov	al,1 | ||||||
|  | 	jmp	exit_program | ||||||
|  |  | ||||||
|  | get_params: | ||||||
|  | 	mov	[input_file],0 | ||||||
|  | 	mov	[output_file],0 | ||||||
|  | 	mov	[symbols_file],0 | ||||||
|  | 	mov	[memory_setting],0 | ||||||
|  | 	mov	[passes_limit],100 | ||||||
|  | 	call	[GetCommandLine] | ||||||
|  | 	mov	esi,eax | ||||||
|  | 	mov	edi,params | ||||||
|  |     find_command_start: | ||||||
|  | 	lodsb | ||||||
|  | 	cmp	al,20h | ||||||
|  | 	je	find_command_start | ||||||
|  | 	cmp	al,22h | ||||||
|  | 	je	skip_quoted_name | ||||||
|  |     skip_name: | ||||||
|  | 	lodsb | ||||||
|  | 	cmp	al,20h | ||||||
|  | 	je	find_param | ||||||
|  | 	or	al,al | ||||||
|  | 	jz	all_params | ||||||
|  | 	jmp	skip_name | ||||||
|  |     skip_quoted_name: | ||||||
|  | 	lodsb | ||||||
|  | 	cmp	al,22h | ||||||
|  | 	je	find_param | ||||||
|  | 	or	al,al | ||||||
|  | 	jz	all_params | ||||||
|  | 	jmp	skip_quoted_name | ||||||
|  |     find_param: | ||||||
|  | 	lodsb | ||||||
|  | 	cmp	al,20h | ||||||
|  | 	je	find_param | ||||||
|  | 	cmp	al,'-' | ||||||
|  | 	je	option_param | ||||||
|  | 	cmp	al,0Dh | ||||||
|  | 	je	all_params | ||||||
|  | 	or	al,al | ||||||
|  | 	jz	all_params | ||||||
|  | 	cmp	[input_file],0 | ||||||
|  | 	jne	get_output_file | ||||||
|  | 	mov	[input_file],edi | ||||||
|  | 	jmp	process_param | ||||||
|  |       get_output_file: | ||||||
|  | 	cmp	[output_file],0 | ||||||
|  | 	jne	bad_params | ||||||
|  | 	mov	[output_file],edi | ||||||
|  |     process_param: | ||||||
|  | 	cmp	al,22h | ||||||
|  | 	je	string_param | ||||||
|  |     copy_param: | ||||||
|  | 	stosb | ||||||
|  | 	lodsb | ||||||
|  | 	cmp	al,20h | ||||||
|  | 	je	param_end | ||||||
|  | 	cmp	al,0Dh | ||||||
|  | 	je	param_end | ||||||
|  | 	or	al,al | ||||||
|  | 	jz	param_end | ||||||
|  | 	jmp	copy_param | ||||||
|  |     string_param: | ||||||
|  | 	lodsb | ||||||
|  | 	cmp	al,22h | ||||||
|  | 	je	string_param_end | ||||||
|  | 	cmp	al,0Dh | ||||||
|  | 	je	param_end | ||||||
|  | 	or	al,al | ||||||
|  | 	jz	param_end | ||||||
|  | 	stosb | ||||||
|  | 	jmp	string_param | ||||||
|  |     option_param: | ||||||
|  | 	lodsb | ||||||
|  | 	cmp	al,'m' | ||||||
|  | 	je	memory_option | ||||||
|  | 	cmp	al,'M' | ||||||
|  | 	je	memory_option | ||||||
|  | 	cmp	al,'p' | ||||||
|  | 	je	passes_option | ||||||
|  | 	cmp	al,'P' | ||||||
|  | 	je	passes_option | ||||||
|  | 	cmp	al,'s' | ||||||
|  | 	je	symbols_option | ||||||
|  | 	cmp	al,'S' | ||||||
|  | 	je	symbols_option | ||||||
|  |     bad_params: | ||||||
|  | 	stc | ||||||
|  | 	ret | ||||||
|  |     get_option_value: | ||||||
|  | 	xor	eax,eax | ||||||
|  | 	mov	edx,eax | ||||||
|  |     get_option_digit: | ||||||
|  | 	lodsb | ||||||
|  | 	cmp	al,20h | ||||||
|  | 	je	option_value_ok | ||||||
|  | 	cmp	al,0Dh | ||||||
|  | 	je	option_value_ok | ||||||
|  | 	or	al,al | ||||||
|  | 	jz	option_value_ok | ||||||
|  | 	sub	al,30h | ||||||
|  | 	jc	invalid_option_value | ||||||
|  | 	cmp	al,9 | ||||||
|  | 	ja	invalid_option_value | ||||||
|  | 	imul	edx,10 | ||||||
|  | 	jo	invalid_option_value | ||||||
|  | 	add	edx,eax | ||||||
|  | 	jc	invalid_option_value | ||||||
|  | 	jmp	get_option_digit | ||||||
|  |     option_value_ok: | ||||||
|  | 	dec	esi | ||||||
|  | 	clc | ||||||
|  | 	ret | ||||||
|  |     invalid_option_value: | ||||||
|  | 	stc | ||||||
|  | 	ret | ||||||
|  |     memory_option: | ||||||
|  | 	lodsb | ||||||
|  | 	cmp	al,20h | ||||||
|  | 	je	memory_option | ||||||
|  | 	cmp	al,0Dh | ||||||
|  | 	je	bad_params | ||||||
|  | 	or	al,al | ||||||
|  | 	jz	bad_params | ||||||
|  | 	dec	esi | ||||||
|  | 	call	get_option_value | ||||||
|  | 	or	edx,edx | ||||||
|  | 	jz	bad_params | ||||||
|  | 	cmp	edx,1 shl (32-10) | ||||||
|  | 	jae	bad_params | ||||||
|  | 	mov	[memory_setting],edx | ||||||
|  | 	jmp	find_param | ||||||
|  |     passes_option: | ||||||
|  | 	lodsb | ||||||
|  | 	cmp	al,20h | ||||||
|  | 	je	passes_option | ||||||
|  | 	cmp	al,0Dh | ||||||
|  | 	je	bad_params | ||||||
|  | 	or	al,al | ||||||
|  | 	jz	bad_params | ||||||
|  | 	dec	esi | ||||||
|  | 	call	get_option_value | ||||||
|  | 	or	edx,edx | ||||||
|  | 	jz	bad_params | ||||||
|  | 	cmp	edx,10000h | ||||||
|  | 	ja	bad_params | ||||||
|  | 	mov	[passes_limit],dx | ||||||
|  | 	jmp	find_param | ||||||
|  |     symbols_option: | ||||||
|  | 	mov	[symbols_file],edi | ||||||
|  |       find_symbols_file_name: | ||||||
|  | 	lodsb | ||||||
|  | 	cmp	al,20h | ||||||
|  | 	jne	process_param | ||||||
|  | 	jmp	find_symbols_file_name | ||||||
|  |     param_end: | ||||||
|  | 	dec	esi | ||||||
|  |     string_param_end: | ||||||
|  | 	xor	al,al | ||||||
|  | 	stosb | ||||||
|  | 	jmp	find_param | ||||||
|  |     all_params: | ||||||
|  | 	cmp	[input_file],0 | ||||||
|  | 	je	bad_params | ||||||
|  | 	clc | ||||||
|  | 	ret | ||||||
|  |  | ||||||
|  | include 'system.inc' | ||||||
|  |  | ||||||
|  | include '..\errors.inc' | ||||||
|  | include '..\symbdump.inc' | ||||||
|  | include '..\preproce.inc' | ||||||
|  | include '..\parser.inc' | ||||||
|  | include '..\exprpars.inc' | ||||||
|  | include '..\assemble.inc' | ||||||
|  | include '..\exprcalc.inc' | ||||||
|  | include '..\formats.inc' | ||||||
|  | include '..\x86_64.inc' | ||||||
|  | include '..\avx.inc' | ||||||
|  |  | ||||||
|  | include '..\tables.inc' | ||||||
|  | include '..\messages.inc' | ||||||
|  |  | ||||||
|  | section '.data' data readable writeable | ||||||
|  |  | ||||||
|  | include '..\version.inc' | ||||||
|  |  | ||||||
|  | _copyright db 'Copyright (c) 1999-2014, Tomasz Grysztar',0Dh,0Ah,0 | ||||||
|  |  | ||||||
|  | _logo db 'flat assembler  version ',VERSION_STRING,0 | ||||||
|  | _usage db 0Dh,0Ah | ||||||
|  |        db 'usage: fasm <source> [output]',0Dh,0Ah | ||||||
|  |        db 'optional settings:',0Dh,0Ah | ||||||
|  |        db ' -m <limit>    set the limit in kilobytes for the available memory',0Dh,0Ah | ||||||
|  |        db ' -p <limit>    set the maximum allowed number of passes',0Dh,0Ah | ||||||
|  |        db ' -s <file>     dump symbolic information for debugging',0Dh,0Ah | ||||||
|  |        db 0 | ||||||
|  | _memory_prefix db '  (',0 | ||||||
|  | _memory_suffix db ' kilobytes memory)',0Dh,0Ah,0 | ||||||
|  | _passes_suffix db ' passes, ',0 | ||||||
|  | _seconds_suffix db ' seconds, ',0 | ||||||
|  | _bytes_suffix db ' bytes.',0Dh,0Ah,0 | ||||||
|  |  | ||||||
|  | align 4 | ||||||
|  |  | ||||||
|  | include '..\variable.inc' | ||||||
|  |  | ||||||
|  | con_handle dd ? | ||||||
|  | memory_setting dd ? | ||||||
|  | start_time dd ? | ||||||
|  | bytes_count dd ? | ||||||
|  | displayed_count dd ? | ||||||
|  | character db ? | ||||||
|  | last_displayed rb 2 | ||||||
|  |  | ||||||
|  | params rb 1000h | ||||||
|  | options rb 1000h | ||||||
|  | buffer rb 4000h | ||||||
|  |  | ||||||
|  | stack 10000h | ||||||
|  |  | ||||||
|  | section '.idata' import data readable writeable | ||||||
|  |  | ||||||
|  |   dd 0,0,0,rva kernel_name,rva kernel_table | ||||||
|  |   dd 0,0,0,0,0 | ||||||
|  |  | ||||||
|  |   kernel_table: | ||||||
|  |     ExitProcess dd rva _ExitProcess | ||||||
|  |     CreateFile dd rva _CreateFileA | ||||||
|  |     ReadFile dd rva _ReadFile | ||||||
|  |     WriteFile dd rva _WriteFile | ||||||
|  |     CloseHandle dd rva _CloseHandle | ||||||
|  |     SetFilePointer dd rva _SetFilePointer | ||||||
|  |     GetCommandLine dd rva _GetCommandLineA | ||||||
|  |     GetEnvironmentVariable dd rva _GetEnvironmentVariable | ||||||
|  |     GetStdHandle dd rva _GetStdHandle | ||||||
|  |     VirtualAlloc dd rva _VirtualAlloc | ||||||
|  |     VirtualFree dd rva _VirtualFree | ||||||
|  |     GetTickCount dd rva _GetTickCount | ||||||
|  |     GetSystemTime dd rva _GetSystemTime | ||||||
|  |     GlobalMemoryStatus dd rva _GlobalMemoryStatus | ||||||
|  |     dd 0 | ||||||
|  |  | ||||||
|  |   kernel_name db 'KERNEL32.DLL',0 | ||||||
|  |  | ||||||
|  |   _ExitProcess dw 0 | ||||||
|  |     db 'ExitProcess',0 | ||||||
|  |   _CreateFileA dw 0 | ||||||
|  |     db 'CreateFileA',0 | ||||||
|  |   _ReadFile dw 0 | ||||||
|  |     db 'ReadFile',0 | ||||||
|  |   _WriteFile dw 0 | ||||||
|  |     db 'WriteFile',0 | ||||||
|  |   _CloseHandle dw 0 | ||||||
|  |     db 'CloseHandle',0 | ||||||
|  |   _SetFilePointer dw 0 | ||||||
|  |     db 'SetFilePointer',0 | ||||||
|  |   _GetCommandLineA dw 0 | ||||||
|  |     db 'GetCommandLineA',0 | ||||||
|  |   _GetEnvironmentVariable dw 0 | ||||||
|  |     db 'GetEnvironmentVariableA',0 | ||||||
|  |   _GetStdHandle dw 0 | ||||||
|  |     db 'GetStdHandle',0 | ||||||
|  |   _VirtualAlloc dw 0 | ||||||
|  |     db 'VirtualAlloc',0 | ||||||
|  |   _VirtualFree dw 0 | ||||||
|  |     db 'VirtualFree',0 | ||||||
|  |   _GetTickCount dw 0 | ||||||
|  |     db 'GetTickCount',0 | ||||||
|  |   _GetSystemTime dw 0 | ||||||
|  |     db 'GetSystemTime',0 | ||||||
|  |   _GlobalMemoryStatus dw 0 | ||||||
|  |     db 'GlobalMemoryStatus',0 | ||||||
|  |  | ||||||
|  | section '.reloc' fixups data readable discardable | ||||||
							
								
								
									
										503
									
								
								samples/Assembly/SYSTEM.inc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										503
									
								
								samples/Assembly/SYSTEM.inc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,503 @@ | |||||||
|  |  | ||||||
|  | ; flat assembler interface for Win32 | ||||||
|  | ; Copyright (c) 1999-2014, Tomasz Grysztar. | ||||||
|  | ; All rights reserved. | ||||||
|  |  | ||||||
|  | CREATE_NEW	       = 1 | ||||||
|  | CREATE_ALWAYS	       = 2 | ||||||
|  | OPEN_EXISTING	       = 3 | ||||||
|  | OPEN_ALWAYS	       = 4 | ||||||
|  | TRUNCATE_EXISTING      = 5 | ||||||
|  |  | ||||||
|  | FILE_SHARE_READ        = 1 | ||||||
|  | FILE_SHARE_WRITE       = 2 | ||||||
|  | FILE_SHARE_DELETE      = 4 | ||||||
|  |  | ||||||
|  | GENERIC_READ	       = 80000000h | ||||||
|  | GENERIC_WRITE	       = 40000000h | ||||||
|  |  | ||||||
|  | STD_INPUT_HANDLE       = 0FFFFFFF6h | ||||||
|  | STD_OUTPUT_HANDLE      = 0FFFFFFF5h | ||||||
|  | STD_ERROR_HANDLE       = 0FFFFFFF4h | ||||||
|  |  | ||||||
|  | MEM_COMMIT	       = 1000h | ||||||
|  | MEM_RESERVE	       = 2000h | ||||||
|  | MEM_DECOMMIT	       = 4000h | ||||||
|  | MEM_RELEASE	       = 8000h | ||||||
|  | MEM_FREE	       = 10000h | ||||||
|  | MEM_PRIVATE	       = 20000h | ||||||
|  | MEM_MAPPED	       = 40000h | ||||||
|  | MEM_RESET	       = 80000h | ||||||
|  | MEM_TOP_DOWN	       = 100000h | ||||||
|  |  | ||||||
|  | PAGE_NOACCESS	       = 1 | ||||||
|  | PAGE_READONLY	       = 2 | ||||||
|  | PAGE_READWRITE	       = 4 | ||||||
|  | PAGE_WRITECOPY	       = 8 | ||||||
|  | PAGE_EXECUTE	       = 10h | ||||||
|  | PAGE_EXECUTE_READ      = 20h | ||||||
|  | PAGE_EXECUTE_READWRITE = 40h | ||||||
|  | PAGE_EXECUTE_WRITECOPY = 80h | ||||||
|  | PAGE_GUARD	       = 100h | ||||||
|  | PAGE_NOCACHE	       = 200h | ||||||
|  |  | ||||||
|  | init_memory: | ||||||
|  | 	xor	eax,eax | ||||||
|  | 	mov	[memory_start],eax | ||||||
|  | 	mov	eax,esp | ||||||
|  | 	and	eax,not 0FFFh | ||||||
|  | 	add	eax,1000h-10000h | ||||||
|  | 	mov	[stack_limit],eax | ||||||
|  | 	mov	eax,[memory_setting] | ||||||
|  | 	shl	eax,10 | ||||||
|  | 	jnz	allocate_memory | ||||||
|  | 	push	buffer | ||||||
|  | 	call	[GlobalMemoryStatus] | ||||||
|  | 	mov	eax,dword [buffer+20] | ||||||
|  | 	mov	edx,dword [buffer+12] | ||||||
|  | 	cmp	eax,0 | ||||||
|  | 	jl	large_memory | ||||||
|  | 	cmp	edx,0 | ||||||
|  | 	jl	large_memory | ||||||
|  | 	shr	eax,2 | ||||||
|  | 	add	eax,edx | ||||||
|  | 	jmp	allocate_memory | ||||||
|  |     large_memory: | ||||||
|  | 	mov	eax,80000000h | ||||||
|  |     allocate_memory: | ||||||
|  | 	mov	edx,eax | ||||||
|  | 	shr	edx,2 | ||||||
|  | 	mov	ecx,eax | ||||||
|  | 	sub	ecx,edx | ||||||
|  | 	mov	[memory_end],ecx | ||||||
|  | 	mov	[additional_memory_end],edx | ||||||
|  | 	push	PAGE_READWRITE | ||||||
|  | 	push	MEM_COMMIT | ||||||
|  | 	push	eax | ||||||
|  | 	push	0 | ||||||
|  | 	call	[VirtualAlloc] | ||||||
|  | 	or	eax,eax | ||||||
|  | 	jz	not_enough_memory | ||||||
|  | 	mov	[memory_start],eax | ||||||
|  | 	add	eax,[memory_end] | ||||||
|  | 	mov	[memory_end],eax | ||||||
|  | 	mov	[additional_memory],eax | ||||||
|  | 	add	[additional_memory_end],eax | ||||||
|  | 	ret | ||||||
|  |     not_enough_memory: | ||||||
|  | 	mov	eax,[additional_memory_end] | ||||||
|  | 	shl	eax,1 | ||||||
|  | 	cmp	eax,4000h | ||||||
|  | 	jb	out_of_memory | ||||||
|  | 	jmp	allocate_memory | ||||||
|  |  | ||||||
|  | exit_program: | ||||||
|  | 	movzx	eax,al | ||||||
|  | 	push	eax | ||||||
|  | 	mov	eax,[memory_start] | ||||||
|  | 	test	eax,eax | ||||||
|  | 	jz	do_exit | ||||||
|  | 	push	MEM_RELEASE | ||||||
|  | 	push	0 | ||||||
|  | 	push	eax | ||||||
|  | 	call	[VirtualFree] | ||||||
|  |     do_exit: | ||||||
|  | 	call	[ExitProcess] | ||||||
|  |  | ||||||
|  | get_environment_variable: | ||||||
|  | 	mov	ecx,[memory_end] | ||||||
|  | 	sub	ecx,edi | ||||||
|  | 	cmp	ecx,4000h | ||||||
|  | 	jbe	buffer_for_variable_ok | ||||||
|  | 	mov	ecx,4000h | ||||||
|  |     buffer_for_variable_ok: | ||||||
|  | 	push	ecx | ||||||
|  | 	push	edi | ||||||
|  | 	push	esi | ||||||
|  | 	call	[GetEnvironmentVariable] | ||||||
|  | 	add	edi,eax | ||||||
|  | 	cmp	edi,[memory_end] | ||||||
|  | 	jae	out_of_memory | ||||||
|  | 	ret | ||||||
|  |  | ||||||
|  | open: | ||||||
|  | 	push	0 | ||||||
|  | 	push	0 | ||||||
|  | 	push	OPEN_EXISTING | ||||||
|  | 	push	0 | ||||||
|  | 	push	FILE_SHARE_READ | ||||||
|  | 	push	GENERIC_READ | ||||||
|  | 	push	edx | ||||||
|  | 	call	[CreateFile] | ||||||
|  | 	cmp	eax,-1 | ||||||
|  | 	je	file_error | ||||||
|  | 	mov	ebx,eax | ||||||
|  | 	clc | ||||||
|  | 	ret | ||||||
|  |     file_error: | ||||||
|  | 	stc | ||||||
|  | 	ret | ||||||
|  | create: | ||||||
|  | 	push	0 | ||||||
|  | 	push	0 | ||||||
|  | 	push	CREATE_ALWAYS | ||||||
|  | 	push	0 | ||||||
|  | 	push	FILE_SHARE_READ | ||||||
|  | 	push	GENERIC_WRITE | ||||||
|  | 	push	edx | ||||||
|  | 	call	[CreateFile] | ||||||
|  | 	cmp	eax,-1 | ||||||
|  | 	je	file_error | ||||||
|  | 	mov	ebx,eax | ||||||
|  | 	clc | ||||||
|  | 	ret | ||||||
|  | write: | ||||||
|  | 	push	0 | ||||||
|  | 	push	bytes_count | ||||||
|  | 	push	ecx | ||||||
|  | 	push	edx | ||||||
|  | 	push	ebx | ||||||
|  | 	call	[WriteFile] | ||||||
|  | 	or	eax,eax | ||||||
|  | 	jz	file_error | ||||||
|  | 	clc | ||||||
|  | 	ret | ||||||
|  | read: | ||||||
|  | 	mov	ebp,ecx | ||||||
|  | 	push	0 | ||||||
|  | 	push	bytes_count | ||||||
|  | 	push	ecx | ||||||
|  | 	push	edx | ||||||
|  | 	push	ebx | ||||||
|  | 	call	[ReadFile] | ||||||
|  | 	or	eax,eax | ||||||
|  | 	jz	file_error | ||||||
|  | 	cmp	ebp,[bytes_count] | ||||||
|  | 	jne	file_error | ||||||
|  | 	clc | ||||||
|  | 	ret | ||||||
|  | close: | ||||||
|  | 	push	ebx | ||||||
|  | 	call	[CloseHandle] | ||||||
|  | 	ret | ||||||
|  | lseek: | ||||||
|  | 	movzx	eax,al | ||||||
|  | 	push	eax | ||||||
|  | 	push	0 | ||||||
|  | 	push	edx | ||||||
|  | 	push	ebx | ||||||
|  | 	call	[SetFilePointer] | ||||||
|  | 	ret | ||||||
|  |  | ||||||
|  | display_string: | ||||||
|  | 	push	[con_handle] | ||||||
|  | 	call	[GetStdHandle] | ||||||
|  | 	mov	ebp,eax | ||||||
|  | 	mov	edi,esi | ||||||
|  | 	or	ecx,-1 | ||||||
|  | 	xor	al,al | ||||||
|  | 	repne	scasb | ||||||
|  | 	neg	ecx | ||||||
|  | 	sub	ecx,2 | ||||||
|  | 	push	0 | ||||||
|  | 	push	bytes_count | ||||||
|  | 	push	ecx | ||||||
|  | 	push	esi | ||||||
|  | 	push	ebp | ||||||
|  | 	call	[WriteFile] | ||||||
|  | 	ret | ||||||
|  | display_character: | ||||||
|  | 	push	ebx | ||||||
|  | 	mov	[character],dl | ||||||
|  | 	push	[con_handle] | ||||||
|  | 	call	[GetStdHandle] | ||||||
|  | 	mov	ebx,eax | ||||||
|  | 	push	0 | ||||||
|  | 	push	bytes_count | ||||||
|  | 	push	1 | ||||||
|  | 	push	character | ||||||
|  | 	push	ebx | ||||||
|  | 	call	[WriteFile] | ||||||
|  | 	pop	ebx | ||||||
|  | 	ret | ||||||
|  | display_number: | ||||||
|  | 	push	ebx | ||||||
|  | 	mov	ecx,1000000000 | ||||||
|  | 	xor	edx,edx | ||||||
|  | 	xor	bl,bl | ||||||
|  |       display_loop: | ||||||
|  | 	div	ecx | ||||||
|  | 	push	edx | ||||||
|  | 	cmp	ecx,1 | ||||||
|  | 	je	display_digit | ||||||
|  | 	or	bl,bl | ||||||
|  | 	jnz	display_digit | ||||||
|  | 	or	al,al | ||||||
|  | 	jz	digit_ok | ||||||
|  | 	not	bl | ||||||
|  |       display_digit: | ||||||
|  | 	mov	dl,al | ||||||
|  | 	add	dl,30h | ||||||
|  | 	push	ecx | ||||||
|  | 	call	display_character | ||||||
|  | 	pop	ecx | ||||||
|  |       digit_ok: | ||||||
|  | 	mov	eax,ecx | ||||||
|  | 	xor	edx,edx | ||||||
|  | 	mov	ecx,10 | ||||||
|  | 	div	ecx | ||||||
|  | 	mov	ecx,eax | ||||||
|  | 	pop	eax | ||||||
|  | 	or	ecx,ecx | ||||||
|  | 	jnz	display_loop | ||||||
|  | 	pop	ebx | ||||||
|  | 	ret | ||||||
|  |  | ||||||
|  | display_user_messages: | ||||||
|  | 	mov	[displayed_count],0 | ||||||
|  | 	call	show_display_buffer | ||||||
|  | 	cmp	[displayed_count],1 | ||||||
|  | 	jb	line_break_ok | ||||||
|  | 	je	make_line_break | ||||||
|  | 	mov	ax,word [last_displayed] | ||||||
|  | 	cmp	ax,0A0Dh | ||||||
|  | 	je	line_break_ok | ||||||
|  | 	cmp	ax,0D0Ah | ||||||
|  | 	je	line_break_ok | ||||||
|  |       make_line_break: | ||||||
|  | 	mov	word [buffer],0A0Dh | ||||||
|  | 	push	[con_handle] | ||||||
|  | 	call	[GetStdHandle] | ||||||
|  | 	push	0 | ||||||
|  | 	push	bytes_count | ||||||
|  | 	push	2 | ||||||
|  | 	push	buffer | ||||||
|  | 	push	eax | ||||||
|  | 	call	[WriteFile] | ||||||
|  |       line_break_ok: | ||||||
|  | 	ret | ||||||
|  | display_block: | ||||||
|  | 	add	[displayed_count],ecx | ||||||
|  | 	cmp	ecx,1 | ||||||
|  | 	ja	take_last_two_characters | ||||||
|  | 	jb	block_displayed | ||||||
|  | 	mov	al,[last_displayed+1] | ||||||
|  | 	mov	ah,[esi] | ||||||
|  | 	mov	word [last_displayed],ax | ||||||
|  | 	jmp	block_ok | ||||||
|  |       take_last_two_characters: | ||||||
|  | 	mov	ax,[esi+ecx-2] | ||||||
|  | 	mov	word [last_displayed],ax | ||||||
|  |       block_ok: | ||||||
|  | 	push	ecx | ||||||
|  | 	push	[con_handle] | ||||||
|  | 	call	[GetStdHandle] | ||||||
|  | 	pop	ecx | ||||||
|  | 	push	0 | ||||||
|  | 	push	bytes_count | ||||||
|  | 	push	ecx | ||||||
|  | 	push	esi | ||||||
|  | 	push	eax | ||||||
|  | 	call	[WriteFile] | ||||||
|  |       block_displayed: | ||||||
|  | 	ret | ||||||
|  |  | ||||||
|  | fatal_error: | ||||||
|  | 	mov	[con_handle],STD_ERROR_HANDLE | ||||||
|  | 	mov	esi,error_prefix | ||||||
|  | 	call	display_string | ||||||
|  | 	pop	esi | ||||||
|  | 	call	display_string | ||||||
|  | 	mov	esi,error_suffix | ||||||
|  | 	call	display_string | ||||||
|  | 	mov	al,0FFh | ||||||
|  | 	jmp	exit_program | ||||||
|  | assembler_error: | ||||||
|  | 	mov	[con_handle],STD_ERROR_HANDLE | ||||||
|  | 	call	display_user_messages | ||||||
|  | 	push	dword 0 | ||||||
|  | 	mov	ebx,[current_line] | ||||||
|  |       get_error_lines: | ||||||
|  | 	mov	eax,[ebx] | ||||||
|  | 	cmp	byte [eax],0 | ||||||
|  | 	je	get_next_error_line | ||||||
|  | 	push	ebx | ||||||
|  | 	test	byte [ebx+7],80h | ||||||
|  | 	jz	display_error_line | ||||||
|  | 	mov	edx,ebx | ||||||
|  |       find_definition_origin: | ||||||
|  | 	mov	edx,[edx+12] | ||||||
|  | 	test	byte [edx+7],80h | ||||||
|  | 	jnz	find_definition_origin | ||||||
|  | 	push	edx | ||||||
|  |       get_next_error_line: | ||||||
|  | 	mov	ebx,[ebx+8] | ||||||
|  | 	jmp	get_error_lines | ||||||
|  |       display_error_line: | ||||||
|  | 	mov	esi,[ebx] | ||||||
|  | 	call	display_string | ||||||
|  | 	mov	esi,line_number_start | ||||||
|  | 	call	display_string | ||||||
|  | 	mov	eax,[ebx+4] | ||||||
|  | 	and	eax,7FFFFFFFh | ||||||
|  | 	call	display_number | ||||||
|  | 	mov	dl,']' | ||||||
|  | 	call	display_character | ||||||
|  | 	pop	esi | ||||||
|  | 	cmp	ebx,esi | ||||||
|  | 	je	line_number_ok | ||||||
|  | 	mov	dl,20h | ||||||
|  | 	call	display_character | ||||||
|  | 	push	esi | ||||||
|  | 	mov	esi,[esi] | ||||||
|  | 	movzx	ecx,byte [esi] | ||||||
|  | 	inc	esi | ||||||
|  | 	call	display_block | ||||||
|  | 	mov	esi,line_number_start | ||||||
|  | 	call	display_string | ||||||
|  | 	pop	esi | ||||||
|  | 	mov	eax,[esi+4] | ||||||
|  | 	and	eax,7FFFFFFFh | ||||||
|  | 	call	display_number | ||||||
|  | 	mov	dl,']' | ||||||
|  | 	call	display_character | ||||||
|  |       line_number_ok: | ||||||
|  | 	mov	esi,line_data_start | ||||||
|  | 	call	display_string | ||||||
|  | 	mov	esi,ebx | ||||||
|  | 	mov	edx,[esi] | ||||||
|  | 	call	open | ||||||
|  | 	mov	al,2 | ||||||
|  | 	xor	edx,edx | ||||||
|  | 	call	lseek | ||||||
|  | 	mov	edx,[esi+8] | ||||||
|  | 	sub	eax,edx | ||||||
|  | 	jz	line_data_displayed | ||||||
|  | 	push	eax | ||||||
|  | 	xor	al,al | ||||||
|  | 	call	lseek | ||||||
|  | 	mov	ecx,[esp] | ||||||
|  | 	mov	edx,[additional_memory] | ||||||
|  | 	lea	eax,[edx+ecx] | ||||||
|  | 	cmp	eax,[additional_memory_end] | ||||||
|  | 	ja	out_of_memory | ||||||
|  | 	call	read | ||||||
|  | 	call	close | ||||||
|  | 	pop	ecx | ||||||
|  | 	mov	esi,[additional_memory] | ||||||
|  |       get_line_data: | ||||||
|  | 	mov	al,[esi] | ||||||
|  | 	cmp	al,0Ah | ||||||
|  | 	je	display_line_data | ||||||
|  | 	cmp	al,0Dh | ||||||
|  | 	je	display_line_data | ||||||
|  | 	cmp	al,1Ah | ||||||
|  | 	je	display_line_data | ||||||
|  | 	or	al,al | ||||||
|  | 	jz	display_line_data | ||||||
|  | 	inc	esi | ||||||
|  | 	loop	get_line_data | ||||||
|  |       display_line_data: | ||||||
|  | 	mov	ecx,esi | ||||||
|  | 	mov	esi,[additional_memory] | ||||||
|  | 	sub	ecx,esi | ||||||
|  | 	call	display_block | ||||||
|  |       line_data_displayed: | ||||||
|  | 	mov	esi,cr_lf | ||||||
|  | 	call	display_string | ||||||
|  | 	pop	ebx | ||||||
|  | 	or	ebx,ebx | ||||||
|  | 	jnz	display_error_line | ||||||
|  | 	mov	esi,error_prefix | ||||||
|  | 	call	display_string | ||||||
|  | 	pop	esi | ||||||
|  | 	call	display_string | ||||||
|  | 	mov	esi,error_suffix | ||||||
|  | 	call	display_string | ||||||
|  | 	mov	al,2 | ||||||
|  | 	jmp	exit_program | ||||||
|  |  | ||||||
|  | make_timestamp: | ||||||
|  | 	push	buffer | ||||||
|  | 	call	[GetSystemTime] | ||||||
|  | 	movzx	ecx,word [buffer] | ||||||
|  | 	mov	eax,ecx | ||||||
|  | 	sub	eax,1970 | ||||||
|  | 	mov	ebx,365 | ||||||
|  | 	mul	ebx | ||||||
|  | 	mov	ebp,eax | ||||||
|  | 	mov	eax,ecx | ||||||
|  | 	sub	eax,1969 | ||||||
|  | 	shr	eax,2 | ||||||
|  | 	add	ebp,eax | ||||||
|  | 	mov	eax,ecx | ||||||
|  | 	sub	eax,1901 | ||||||
|  | 	mov	ebx,100 | ||||||
|  | 	div	ebx | ||||||
|  | 	sub	ebp,eax | ||||||
|  | 	mov	eax,ecx | ||||||
|  | 	xor	edx,edx | ||||||
|  | 	sub	eax,1601 | ||||||
|  | 	mov	ebx,400 | ||||||
|  | 	div	ebx | ||||||
|  | 	add	ebp,eax | ||||||
|  | 	movzx	ecx,word [buffer+2] | ||||||
|  | 	mov	eax,ecx | ||||||
|  | 	dec	eax | ||||||
|  | 	mov	ebx,30 | ||||||
|  | 	mul	ebx | ||||||
|  | 	add	ebp,eax | ||||||
|  | 	cmp	ecx,8 | ||||||
|  | 	jbe	months_correction | ||||||
|  | 	mov	eax,ecx | ||||||
|  | 	sub	eax,7 | ||||||
|  | 	shr	eax,1 | ||||||
|  | 	add	ebp,eax | ||||||
|  | 	mov	ecx,8 | ||||||
|  |       months_correction: | ||||||
|  | 	mov	eax,ecx | ||||||
|  | 	shr	eax,1 | ||||||
|  | 	add	ebp,eax | ||||||
|  | 	cmp	ecx,2 | ||||||
|  | 	jbe	day_correction_ok | ||||||
|  | 	sub	ebp,2 | ||||||
|  | 	movzx	ecx,word [buffer] | ||||||
|  | 	test	ecx,11b | ||||||
|  | 	jnz	day_correction_ok | ||||||
|  | 	xor	edx,edx | ||||||
|  | 	mov	eax,ecx | ||||||
|  | 	mov	ebx,100 | ||||||
|  | 	div	ebx | ||||||
|  | 	or	edx,edx | ||||||
|  | 	jnz	day_correction | ||||||
|  | 	mov	eax,ecx | ||||||
|  | 	mov	ebx,400 | ||||||
|  | 	div	ebx | ||||||
|  | 	or	edx,edx | ||||||
|  | 	jnz	day_correction_ok | ||||||
|  |       day_correction: | ||||||
|  | 	inc	ebp | ||||||
|  |       day_correction_ok: | ||||||
|  | 	movzx	eax,word [buffer+6] | ||||||
|  | 	dec	eax | ||||||
|  | 	add	eax,ebp | ||||||
|  | 	mov	ebx,24 | ||||||
|  | 	mul	ebx | ||||||
|  | 	movzx	ecx,word [buffer+8] | ||||||
|  | 	add	eax,ecx | ||||||
|  | 	mov	ebx,60 | ||||||
|  | 	mul	ebx | ||||||
|  | 	movzx	ecx,word [buffer+10] | ||||||
|  | 	add	eax,ecx | ||||||
|  | 	mov	ebx,60 | ||||||
|  | 	mul	ebx | ||||||
|  | 	movzx	ecx,word [buffer+12] | ||||||
|  | 	add	eax,ecx | ||||||
|  | 	adc	edx,0 | ||||||
|  | 	ret | ||||||
|  |  | ||||||
|  | error_prefix db 'error: ',0 | ||||||
|  | error_suffix db '.' | ||||||
|  | cr_lf db 0Dh,0Ah,0 | ||||||
|  | line_number_start db ' [',0 | ||||||
|  | line_data_start db ':',0Dh,0Ah,0 | ||||||
							
								
								
									
										7060
									
								
								samples/Assembly/X86_64.inc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7060
									
								
								samples/Assembly/X86_64.inc
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										25
									
								
								samples/BlitzMax/sample.bmx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								samples/BlitzMax/sample.bmx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | |||||||
|  | SuperStrict | ||||||
|  |  | ||||||
|  | Framework Brl.StandardIO | ||||||
|  |  | ||||||
|  | Type TMyType | ||||||
|  | 	Field property:int | ||||||
|  |  | ||||||
|  | 	Function A:int(param:int) | ||||||
|  | 		'do nothing | ||||||
|  | 	End Function | ||||||
|  |  | ||||||
|  | 	Method B:int(param:int) | ||||||
|  | 		'do nothing | ||||||
|  | 	End Method | ||||||
|  | End Type | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Global my:TMyType = new TMyType | ||||||
|  | ?Win32 | ||||||
|  | 	my.A() | ||||||
|  | 	my.B() | ||||||
|  | ?Linux | ||||||
|  | 	my.B() | ||||||
|  | 	my.A() | ||||||
|  | ? | ||||||
							
								
								
									
										130
									
								
								samples/Component Pascal/Example.cp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										130
									
								
								samples/Component Pascal/Example.cp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,130 @@ | |||||||
|  | MODULE ObxControls; | ||||||
|  | (** | ||||||
|  |     project         = "BlackBox" | ||||||
|  |     organization    = "www.oberon.ch" | ||||||
|  |     contributors    = "Oberon microsystems" | ||||||
|  |     version         = "System/Rsrc/About" | ||||||
|  |     copyright       = "System/Rsrc/About" | ||||||
|  |     license         = "Docu/BB-License" | ||||||
|  |     changes         = "" | ||||||
|  |     issues          = "" | ||||||
|  |  | ||||||
|  | **) | ||||||
|  |  | ||||||
|  | IMPORT Dialog, Ports, Properties, Views; | ||||||
|  |  | ||||||
|  | CONST beginner = 0; advanced = 1; expert = 2; guru = 3;    (* user classes *) | ||||||
|  |  | ||||||
|  | TYPE | ||||||
|  |     View = POINTER TO RECORD (Views.View) | ||||||
|  |         size: INTEGER    (* border size in mm *) | ||||||
|  |     END; | ||||||
|  |  | ||||||
|  | VAR | ||||||
|  |     data*: RECORD | ||||||
|  |         class*: INTEGER;    (* current user class *) | ||||||
|  |         list*: Dialog.List;    (* list of currently available sizes, derived from class *) | ||||||
|  |         width*: INTEGER    (* width of next view to be opened. Derived from | ||||||
|  |                                     class, or entered through a text entry field *) | ||||||
|  |     END; | ||||||
|  |  | ||||||
|  |     predef: ARRAY 6 OF INTEGER;    (* table of predefined sizes *) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | PROCEDURE SetList; | ||||||
|  | BEGIN | ||||||
|  |     IF data.class = beginner THEN | ||||||
|  |         data.list.SetLen(1); | ||||||
|  |         data.list.SetItem(0, "default") | ||||||
|  |     ELSIF data.class = advanced THEN | ||||||
|  |         data.list.SetLen(4); | ||||||
|  |         data.list.SetItem(0, "default"); | ||||||
|  |         data.list.SetItem(1, "small"); | ||||||
|  |         data.list.SetItem(2, "medium"); | ||||||
|  |         data.list.SetItem(3, "large"); | ||||||
|  |     ELSE | ||||||
|  |         data.list.SetLen(6); | ||||||
|  |         data.list.SetItem(0, "default"); | ||||||
|  |         data.list.SetItem(1, "small"); | ||||||
|  |         data.list.SetItem(2, "medium"); | ||||||
|  |         data.list.SetItem(3, "large"); | ||||||
|  |         data.list.SetItem(4, "tiny"); | ||||||
|  |         data.list.SetItem(5, "huge"); | ||||||
|  |     END | ||||||
|  | END SetList; | ||||||
|  |  | ||||||
|  | (* View *) | ||||||
|  |  | ||||||
|  | PROCEDURE (v: View) CopyFromSimpleView (source: Views.View); | ||||||
|  | BEGIN | ||||||
|  |     v.size := source(View).size | ||||||
|  | END CopyFromSimpleView; | ||||||
|  |  | ||||||
|  | PROCEDURE (v: View) Restore (f: Views.Frame; l, t, r, b: INTEGER); | ||||||
|  | BEGIN    (* fill view with a red square of size v.size *) | ||||||
|  |     IF v.size = 0 THEN v.size := predef[0] END;    (* lazy initialization of size *) | ||||||
|  |     f.DrawRect(0, 0, v.size, v.size, Ports.fill, Ports.red) | ||||||
|  | END Restore; | ||||||
|  |  | ||||||
|  | PROCEDURE (v: View) HandlePropMsg (VAR msg: Views.PropMessage); | ||||||
|  | BEGIN | ||||||
|  |     WITH msg: Properties.SizePref DO | ||||||
|  |         IF v.size = 0 THEN v.size := predef[0] END;    (* lazy initialization of size *) | ||||||
|  |         msg.w := v.size; msg.h := v.size    (* tell environment about desired width and height *) | ||||||
|  |     ELSE    (* ignore other messages *) | ||||||
|  |     END | ||||||
|  | END HandlePropMsg; | ||||||
|  |  | ||||||
|  | (* notifiers *) | ||||||
|  |  | ||||||
|  | PROCEDURE ClassNotify* (op, from, to: INTEGER); | ||||||
|  | BEGIN    (* react to change in data.class *) | ||||||
|  |     IF op = Dialog.changed THEN | ||||||
|  |         IF (to = beginner) OR (to = advanced) & (data.list.index > 3) THEN | ||||||
|  |             (* if class is reduced, make sure that selection contains legal elements *) | ||||||
|  |             data.list.index := 0; data.width := predef[0];    (* modify interactor *) | ||||||
|  |             Dialog.Update(data)    (* redraw controls where necessary *) | ||||||
|  |         END; | ||||||
|  |         SetList; | ||||||
|  |         Dialog.UpdateList(data.list)    (* reconstruct list box contents *) | ||||||
|  |     END | ||||||
|  | END ClassNotify; | ||||||
|  |  | ||||||
|  | PROCEDURE ListNotify* (op, from, to: INTEGER); | ||||||
|  | BEGIN    (* reacto to change in data.list (index to was selected) *) | ||||||
|  |     IF op = Dialog.changed THEN | ||||||
|  |         data.width := predef[to];    (* modify interactor *) | ||||||
|  |         Dialog.Update(data)    (* redraw controls where necessary *) | ||||||
|  |     END | ||||||
|  | END ListNotify; | ||||||
|  |  | ||||||
|  | (* guards *) | ||||||
|  |  | ||||||
|  | PROCEDURE ListGuard* (VAR par: Dialog.Par); | ||||||
|  | BEGIN    (* disable list box for a beginner *) | ||||||
|  |     par.disabled := data.class = beginner | ||||||
|  | END ListGuard; | ||||||
|  |  | ||||||
|  | PROCEDURE WidthGuard* (VAR par: Dialog.Par); | ||||||
|  | BEGIN    (* make text entry field read-only if user is not guru *) | ||||||
|  |     par.readOnly := data.class # guru | ||||||
|  | END WidthGuard; | ||||||
|  |  | ||||||
|  | (* commands *) | ||||||
|  |  | ||||||
|  | PROCEDURE Open*; | ||||||
|  |     VAR v: View; | ||||||
|  | BEGIN | ||||||
|  |     NEW(v);    (* create and initialize a new view *) | ||||||
|  |     v.size := data.width * Ports.mm;    (* define view's size in function of class *) | ||||||
|  |     Views.OpenAux(v, "Example")    (* open the view in a window *) | ||||||
|  | END Open; | ||||||
|  |  | ||||||
|  | BEGIN    (* initialization of global variables *) | ||||||
|  |     predef[0] := 40; predef[1] := 30; predef[2] := 50;    (* predefined sizes *) | ||||||
|  |     predef[3] := 70; predef[4] := 20; predef[5] := 100; | ||||||
|  |     data.class := beginner;    (* default values *) | ||||||
|  |     data.list.index := 0; | ||||||
|  |     data.width := predef[0]; | ||||||
|  |     SetList | ||||||
|  | END ObxControls. | ||||||
							
								
								
									
										71
									
								
								samples/Component Pascal/Example2.cps
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										71
									
								
								samples/Component Pascal/Example2.cps
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,71 @@ | |||||||
|  | MODULE ObxFact; | ||||||
|  | (** | ||||||
|  |     project         = "BlackBox" | ||||||
|  |     organization    = "www.oberon.ch" | ||||||
|  |     contributors    = "Oberon microsystems" | ||||||
|  |     version         = "System/Rsrc/About" | ||||||
|  |     copyright       = "System/Rsrc/About" | ||||||
|  |     license         = "Docu/BB-License" | ||||||
|  |     changes         = "" | ||||||
|  |     issues          = "" | ||||||
|  |  | ||||||
|  | **) | ||||||
|  |  | ||||||
|  | IMPORT | ||||||
|  |     Stores, Models, TextModels, TextControllers, Integers; | ||||||
|  |  | ||||||
|  | PROCEDURE Read(r: TextModels.Reader; VAR x: Integers.Integer); | ||||||
|  |     VAR i, len, beg: INTEGER; ch: CHAR; buf: POINTER TO ARRAY OF CHAR; | ||||||
|  | BEGIN | ||||||
|  |     r.ReadChar(ch); | ||||||
|  |     WHILE ~r.eot & (ch <= " ") DO r.ReadChar(ch) END; | ||||||
|  |     ASSERT(~r.eot & (((ch >= "0") & (ch <= "9")) OR (ch = "-"))); | ||||||
|  |     beg := r.Pos() - 1; len := 0; | ||||||
|  |     REPEAT INC(len); r.ReadChar(ch) UNTIL r.eot OR (ch < "0") OR (ch > "9"); | ||||||
|  |     NEW(buf, len + 1); | ||||||
|  |     i := 0; r.SetPos(beg); | ||||||
|  |     REPEAT r.ReadChar(buf[i]); INC(i) UNTIL i = len; | ||||||
|  |     buf[i] := 0X; | ||||||
|  |     Integers.ConvertFromString(buf^, x) | ||||||
|  | END Read; | ||||||
|  |  | ||||||
|  | PROCEDURE Write(w: TextModels.Writer; x: Integers.Integer); | ||||||
|  |     VAR i: INTEGER; | ||||||
|  | BEGIN | ||||||
|  |     IF Integers.Sign(x) < 0 THEN w.WriteChar("-") END; | ||||||
|  |     i := Integers.Digits10Of(x); | ||||||
|  |     IF i # 0 THEN | ||||||
|  |         REPEAT DEC(i); w.WriteChar(Integers.ThisDigit10(x, i)) UNTIL i = 0 | ||||||
|  |     ELSE w.WriteChar("0") | ||||||
|  |     END | ||||||
|  | END Write; | ||||||
|  |  | ||||||
|  | PROCEDURE Compute*; | ||||||
|  |     VAR beg, end, i, n: INTEGER; ch: CHAR; | ||||||
|  |         s: Stores.Operation; | ||||||
|  |         r: TextModels.Reader; w: TextModels.Writer; attr: TextModels.Attributes; | ||||||
|  |         c: TextControllers.Controller; | ||||||
|  |         x: Integers.Integer; | ||||||
|  | BEGIN | ||||||
|  |     c := TextControllers.Focus(); | ||||||
|  |     IF (c # NIL) & c.HasSelection() THEN | ||||||
|  |         c.GetSelection(beg, end); | ||||||
|  |         r := c.text.NewReader(NIL); r.SetPos(beg); r.ReadChar(ch); | ||||||
|  |         WHILE ~r.eot & (beg < end) & (ch <= " ") DO r.ReadChar(ch); INC(beg) END; | ||||||
|  |         IF ~r.eot & (beg < end) THEN | ||||||
|  |             r.ReadPrev; Read(r, x); | ||||||
|  |             end := r.Pos(); r.ReadPrev; attr :=r.attr; | ||||||
|  |             IF (Integers.Sign(x) > 0) & (Integers.Compare(x, Integers.Long(MAX(LONGINT))) <= 0) THEN | ||||||
|  |                 n := SHORT(Integers.Short(x)); i := 2; x := Integers.Long(1); | ||||||
|  |                 WHILE i <= n DO x := Integers.Product(x, Integers.Long(i)); INC(i) END; | ||||||
|  |                 Models.BeginScript(c.text, "computation", s); | ||||||
|  |                 c.text.Delete(beg, end); | ||||||
|  |                 w := c.text.NewWriter(NIL); w.SetPos(beg); w.SetAttr(attr); | ||||||
|  |                 Write(w, x); | ||||||
|  |                 Models.EndScript(c.text, s) | ||||||
|  |             END | ||||||
|  |         END | ||||||
|  |     END | ||||||
|  | END Compute; | ||||||
|  |  | ||||||
|  | END ObxFact. | ||||||
							
								
								
									
										6
									
								
								samples/GLSL/myfragment.frg
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								samples/GLSL/myfragment.frg
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | |||||||
|  | varying vec4 v_color; | ||||||
|  |  | ||||||
|  | void main() | ||||||
|  | { | ||||||
|  | 	gl_FragColor = v_color; | ||||||
|  | } | ||||||
							
								
								
									
										12
									
								
								samples/GLSL/myvertex.vrx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								samples/GLSL/myvertex.vrx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | |||||||
|  | uniform mat4 u_MVPMatrix; | ||||||
|  |  | ||||||
|  | attribute vec4 a_position; | ||||||
|  | attribute vec4 a_color; | ||||||
|  |  | ||||||
|  | varying vec4 v_color; | ||||||
|  |  | ||||||
|  | void main() | ||||||
|  | { | ||||||
|  | 	v_color = a_color; | ||||||
|  | 	gl_Position =  u_MVPMatrix * pos; | ||||||
|  | } | ||||||
							
								
								
									
										6
									
								
								samples/Grace/ackerman_function.grace
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								samples/Grace/ackerman_function.grace
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | |||||||
|  | method ack (m : Number, n : Number) -> Number { | ||||||
|  |   print "ack {m} {n}" | ||||||
|  |   if (m < = 0) then {n + 1} | ||||||
|  |    elseif {n <= 0} then {ack((m -1), 1)} | ||||||
|  |    else {ack(m -1, ack(m, n-1))} | ||||||
|  | } | ||||||
							
								
								
									
										554
									
								
								samples/Grace/grace_IDE.grace
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										554
									
								
								samples/Grace/grace_IDE.grace
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,554 @@ | |||||||
|  | import "gtk" as gtk | ||||||
|  | import "io" as io | ||||||
|  | import "mgcollections" as collections | ||||||
|  | import "button_factory" as button_factory | ||||||
|  | import "dialog_factory" as dialog_factory | ||||||
|  | import "syntax_highlighter" as highlighter | ||||||
|  | import "auto_completer" as aComp | ||||||
|  |  | ||||||
|  | //TODO | ||||||
|  |  | ||||||
|  | // Autocomplete typing | ||||||
|  |  | ||||||
|  | // FileChooser | ||||||
|  | // Themes | ||||||
|  |  | ||||||
|  | // Details for the Top Level Window | ||||||
|  | def window = gtk.window(gtk.GTK_WINDOW_TOPLEVEL) | ||||||
|  | window.title := "Grace" | ||||||
|  | window.set_default_size(700, 700) | ||||||
|  | // ------------- | ||||||
|  |  | ||||||
|  | // Placeholder for the console window that can be popped out | ||||||
|  | // of the main window | ||||||
|  | var popped := gtk.window(gtk.GTK_WINDOW_TOPLEVEL) | ||||||
|  |  | ||||||
|  | // Initialise the Boxes | ||||||
|  | def mBox = gtk.box(gtk.GTK_ORIENTATION_VERTICAL, 2) | ||||||
|  | def buttonBox = gtk.box(gtk.GTK_ORIENTATION_HORIZONTAL, 2) | ||||||
|  | var consoleButtons := gtk.box(gtk.GTK_ORIENTATION_HORIZONTAL, 3) | ||||||
|  | var consoleBox := gtk.box(gtk.GTK_ORIENTATION_VERTICAL, 2) | ||||||
|  | var editorBox := gtk.box(gtk.GTK_ORIENTATION_VERTICAL, 2) | ||||||
|  | var splitPane := gtk.paned(gtk.GTK_ORIENTATION_VERTICAL, 2) | ||||||
|  | def menuBox = gtk.box(gtk.GTK_ORIENTATION_HORIZONTAL, 4) | ||||||
|  | // ------------- | ||||||
|  |  | ||||||
|  | // Initialise the buttons | ||||||
|  | def runButton = button_factory.make("run") | ||||||
|  | var clearButton := button_factory.make("clear") | ||||||
|  | var outButton := button_factory.make("out") | ||||||
|  | var errorButton := button_factory.make("error") | ||||||
|  | var popButton := button_factory.make("pop") | ||||||
|  | def newButton = button_factory.make("new") | ||||||
|  | def openButton = button_factory.make("open") | ||||||
|  | def saveButton = button_factory.make("save") | ||||||
|  | def saveAsButton = button_factory.make("saveAs") | ||||||
|  | def closeButton = button_factory.make("close") | ||||||
|  | // ------------- | ||||||
|  |  | ||||||
|  | // Details for the default text editor and scrolled window | ||||||
|  | var tEdit := gtk.text_view | ||||||
|  | tEdit.set_size_request(700, 400) | ||||||
|  |  | ||||||
|  | var scrolled_main := gtk.scrolled_window | ||||||
|  | scrolled_main.set_size_request(700, 400) | ||||||
|  | scrolled_main.add(tEdit) | ||||||
|  | // ------------- | ||||||
|  |  | ||||||
|  | // Widget that allows multiple files to be edited (tabs) | ||||||
|  | var notebook := gtk.notebook | ||||||
|  | notebook.scrollable := true | ||||||
|  | // ------------- | ||||||
|  |  | ||||||
|  | // Maps for holding the text_views and scrolled_windows | ||||||
|  | var editor_map := collections.map.new | ||||||
|  | editor_map.put(0, tEdit) | ||||||
|  | var scrolled_map := collections.map.new | ||||||
|  | scrolled_map.put(0, scrolled_main) | ||||||
|  |  | ||||||
|  | // ------------- | ||||||
|  |  | ||||||
|  | // Class that manages the syntax highlighting (This needs to be passed around otherwise | ||||||
|  | // the text_tag table gets confused, ie there can only be one) | ||||||
|  | def lighter = highlighter.Syntax_Highlighter.new(notebook, editor_map) | ||||||
|  | tEdit.buffer.on "changed" do { | ||||||
|  |     lighter.highlightLine | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Class that manages any auto completion that is required | ||||||
|  | def completer =  aComp.Auto_Completer.new(window, notebook, editor_map) | ||||||
|  |  | ||||||
|  | // Utility methods | ||||||
|  | // ------------- | ||||||
|  |  | ||||||
|  | method deleteCompileFiles(page_num : Number) { | ||||||
|  |     def cur_scrolled = scrolled_map.get(page_num) | ||||||
|  |     var filename := notebook.get_tab_label_text(cur_scrolled) | ||||||
|  |     filename := filename.substringFrom(0)to(filename.size - 7) //Removes .grace extension | ||||||
|  |  | ||||||
|  |     io.system("rm -f files/" ++ filename) | ||||||
|  |     io.system("rm -f files/" ++ filename ++ ".c") | ||||||
|  |     io.system("rm -f files/" ++ filename ++ ".gcn") | ||||||
|  |     io.system("rm -f files/" ++ filename ++ ".gct") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ------------- | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | var currentConsole := "output"      // Which console is being shown | ||||||
|  | var out := false | ||||||
|  |  | ||||||
|  |  | ||||||
|  | var outText := "" | ||||||
|  | var errorText := "" | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | // Give actions to the buttons | ||||||
|  | // ------------- | ||||||
|  |  | ||||||
|  | runButton.on "clicked" do { | ||||||
|  |     clearConsoles() | ||||||
|  |  | ||||||
|  |     // Get the details for the current page selected | ||||||
|  |     def cur_page_num = notebook.current_page | ||||||
|  |     def cur_page = editor_map.get(cur_page_num) | ||||||
|  |     def cur_scrolled = scrolled_map.get(cur_page_num) | ||||||
|  |     def cur_page_label = notebook.get_tab_label_text(cur_scrolled) | ||||||
|  |  | ||||||
|  |     // Initialise text iterators | ||||||
|  |     def sIter = gtk.text_iter | ||||||
|  |     def eIter = gtk.text_iter | ||||||
|  |  | ||||||
|  |     // Set one at the beggining and one at the end of the text | ||||||
|  |     cur_page.buffer.get_iter_at_offset(sIter, 0) | ||||||
|  |     cur_page.buffer.get_iter_at_offset(eIter, -1) | ||||||
|  |  | ||||||
|  |     // Get the text between the text iterators | ||||||
|  |     def text = cur_page.buffer.get_text(sIter, eIter, true) | ||||||
|  |  | ||||||
|  |     // Save the text to the file (in case the user hasn't already saved it) | ||||||
|  |     def file = io.open("files/" ++ cur_page_label, "w") | ||||||
|  |     file.write(text) | ||||||
|  |     file.close | ||||||
|  |  | ||||||
|  |     // Run the program and pipe the output and errors into files to be read | ||||||
|  |     io.system("../minigrace/minigrace " ++ "files/" ++ cur_page_label ++ " > output.txt 2> error.txt") | ||||||
|  |     def outputFile = io.open("output.txt", "r") | ||||||
|  |     def errorFile = io.open("error.txt", "r") | ||||||
|  |     outText := outputFile.read | ||||||
|  |     errorText := errorFile.read | ||||||
|  |  | ||||||
|  |     io.system("rm -f output.txt error.txt") | ||||||
|  |  | ||||||
|  |     var switched := false | ||||||
|  |  | ||||||
|  |     // Change the console to output if there is output text | ||||||
|  |     if((outText.size > 0) && (currentConsole != "output")) then { | ||||||
|  |         switch_to_output() | ||||||
|  |         switched := true | ||||||
|  |     } | ||||||
|  |     // Change the console to errors if there were errors | ||||||
|  |     if((errorText.size > 0) && (currentConsole != "errors")) then { | ||||||
|  |         switch_to_errors() | ||||||
|  |         switched := true | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     // Remember to populate the console if it wasn't switched | ||||||
|  |     if(!switched) then { | ||||||
|  |         populateConsoles | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | clearButton.on "clicked" do { | ||||||
|  |     clearConsoles() | ||||||
|  | } | ||||||
|  |  | ||||||
|  | outButton.on "clicked" do { | ||||||
|  |     switch_to_output() | ||||||
|  | } | ||||||
|  |  | ||||||
|  | errorButton.on "clicked" do { | ||||||
|  |     switch_to_errors() | ||||||
|  | } | ||||||
|  |  | ||||||
|  | popButton.on "clicked" do { | ||||||
|  |     if(out) then { | ||||||
|  |         popIn() | ||||||
|  |     } else { | ||||||
|  |         popOut() | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Gives a dialog to let the user create a new file to edit | ||||||
|  | newButton.on "clicked" do { | ||||||
|  |     def new_window_class = dialog_factory.new.new(notebook, editor_map, scrolled_map, lighter) | ||||||
|  |  | ||||||
|  |     def new_window = new_window_class.window() | ||||||
|  |     new_window.show_all | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Gives a dialog that lets the user open a file to edit | ||||||
|  | openButton.on "clicked" do { | ||||||
|  |     def open_window_class = dialog_factory.open.new(notebook, editor_map, scrolled_map, lighter) | ||||||
|  |  | ||||||
|  |     def open_window = open_window_class.window() | ||||||
|  |     open_window.show_all | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Saves the current file (if the name is Untitled.grace it will ask for a new name) | ||||||
|  | saveButton.on "clicked" do { | ||||||
|  |     def cur_page_num = notebook.current_page | ||||||
|  |     def cur_page = editor_map.get(cur_page_num) | ||||||
|  |     def cur_scrolled = scrolled_map.get(cur_page_num) | ||||||
|  |     def cur_page_label = notebook.get_tab_label_text(cur_scrolled) | ||||||
|  |  | ||||||
|  |     if(cur_page_label == "Untitled.grace") then { | ||||||
|  |         def saveAs_window_class = dialog_factory.save.new(notebook, editor_map, scrolled_map, true) | ||||||
|  |  | ||||||
|  |         def saveAs_window = saveAs_window_class.window() | ||||||
|  |         saveAs_window.show_all | ||||||
|  |     } else { | ||||||
|  |         // Initialise text iterators | ||||||
|  |         def sIter = gtk.text_iter | ||||||
|  |         def eIter = gtk.text_iter | ||||||
|  |  | ||||||
|  |         // Set one at the beggining and one at the end of the text | ||||||
|  |         cur_page.buffer.get_iter_at_offset(sIter, 0) | ||||||
|  |         cur_page.buffer.get_iter_at_offset(eIter, -1) | ||||||
|  |  | ||||||
|  |         // Get the text between the text iterators | ||||||
|  |         def text = cur_page.buffer.get_text(sIter, eIter, true) | ||||||
|  |  | ||||||
|  |         // Save the file | ||||||
|  |         def file = io.open("files/" ++ cur_page_label, "w") | ||||||
|  |         file.write(text) | ||||||
|  |         file.close | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Gives a dialog that lets the user save the file with a new name | ||||||
|  | saveAsButton.on "clicked" do { | ||||||
|  |     def saveAs_window_class = dialog_factory.save.new(notebook, editor_map, scrolled_map, false) | ||||||
|  |  | ||||||
|  |     def saveAs_window = saveAs_window_class.window() | ||||||
|  |     saveAs_window.show_all | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // This will close a tab on the notebook | ||||||
|  | // It also "removes" the page from the map, | ||||||
|  | // by creating a new temporary map and putting all but | ||||||
|  | // the removed page in. | ||||||
|  | closeButton.on "clicked" do { | ||||||
|  |     def page_num = notebook.current_page | ||||||
|  |     def num_pages = notebook.n_pages | ||||||
|  |  | ||||||
|  |     if(num_pages > 1) then { | ||||||
|  |         deleteCompileFiles(page_num) | ||||||
|  |  | ||||||
|  |         def e_map = collections.map.new | ||||||
|  |         def s_map = collections.map.new | ||||||
|  |  | ||||||
|  |         // Copy every page up to the current page into the new maps | ||||||
|  |         var x := 0 | ||||||
|  |         while {x < page_num} do { | ||||||
|  |             var eValue := editor_map.get(x) | ||||||
|  |             var sValue := scrolled_map.get(x) | ||||||
|  |             e_map.put(x, eValue) | ||||||
|  |             s_map.put(x, sValue) | ||||||
|  |  | ||||||
|  |             x := x + 1 | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // Copy every page after the current page into the new map (shifted one down) | ||||||
|  |         x := page_num + 1 | ||||||
|  |         while {x < num_pages} do { | ||||||
|  |             var eValue := editor_map.get(x) | ||||||
|  |             var sValue := scrolled_map.get(x) | ||||||
|  |             e_map.put((x - 1), eValue) | ||||||
|  |             s_map.put((x - 1), sValue) | ||||||
|  |  | ||||||
|  |             x := x + 1 | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         editor_map := e_map | ||||||
|  |         scrolled_map := s_map | ||||||
|  |         notebook.remove_page(page_num) | ||||||
|  |  | ||||||
|  |         notebook.show_all | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | } | ||||||
|  | // ------------- | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | // Consoles: | ||||||
|  | // ------------- | ||||||
|  |  | ||||||
|  | var outConsole := gtk.text_view | ||||||
|  | var outScroll := gtk.scrolled_window | ||||||
|  | var errorConsole := gtk.text_view | ||||||
|  | var errorScroll := gtk.scrolled_window | ||||||
|  | var errorTag := errorConsole.buffer.create_tag("fixed", "foreground", "red") | ||||||
|  |  | ||||||
|  |  | ||||||
|  | // Creates a new output console | ||||||
|  | method createOut { | ||||||
|  |     outConsole := gtk.text_view | ||||||
|  |     outScroll := gtk.scrolled_window | ||||||
|  |     outScroll.add(outConsole) | ||||||
|  |     if(out) then { | ||||||
|  |         outConsole.set_size_request(400, 400) | ||||||
|  |         outScroll.set_size_request(400, 400) | ||||||
|  |     } else { | ||||||
|  |         outConsole.set_size_request(700, 200) | ||||||
|  |         outScroll.set_size_request(700, 200) | ||||||
|  |     } | ||||||
|  |     outConsole.editable := false | ||||||
|  |     outConsole.buffer.set_text("[Output]:", -1) | ||||||
|  | } | ||||||
|  | createOut() | ||||||
|  |  | ||||||
|  | // Creates a new error console | ||||||
|  | method createError { | ||||||
|  |     errorConsole := gtk.text_view | ||||||
|  |     errorScroll := gtk.scrolled_window | ||||||
|  |     errorScroll.add(errorConsole) | ||||||
|  |     if(out) then { | ||||||
|  |         errorConsole.set_size_request(400, 400) | ||||||
|  |         errorScroll.set_size_request(400, 400) | ||||||
|  |     } else { | ||||||
|  |         errorConsole.set_size_request(700, 200) | ||||||
|  |         errorScroll.set_size_request(700, 200) | ||||||
|  |     } | ||||||
|  |     errorConsole.editable := false | ||||||
|  |     errorConsole.buffer.set_text("[Errors]:", -1) | ||||||
|  |     errorTag := errorConsole.buffer.create_tag("fixed", "foreground", "red") | ||||||
|  | } | ||||||
|  | createError() | ||||||
|  |  | ||||||
|  | // Switches the console being shown to be output. This requires | ||||||
|  | // the output console to be remade as it would have been destroyed when | ||||||
|  | // it was switched previously | ||||||
|  | method switch_to_output { | ||||||
|  |     if(currentConsole != "output") then { | ||||||
|  |         currentConsole := "output" | ||||||
|  |         consoleBox.remove(errorScroll)     // This destroys the errorConsole | ||||||
|  |  | ||||||
|  |         createOut() | ||||||
|  |  | ||||||
|  |         consoleBox.add(outScroll) | ||||||
|  |  | ||||||
|  |         populateConsoles() | ||||||
|  |         if(out) then { | ||||||
|  |             popped.show_all | ||||||
|  |         } else { | ||||||
|  |             window.show_all | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Switches the console being shown to be errors. This requires | ||||||
|  | // the error console to be remade as it would have been destroyed when | ||||||
|  | // it was switched previously | ||||||
|  | method switch_to_errors { | ||||||
|  |     if(currentConsole != "errors") then { | ||||||
|  |         currentConsole := "errors" | ||||||
|  |         consoleBox.remove(outScroll)       // This destroys the outConsole | ||||||
|  |  | ||||||
|  |         createError() | ||||||
|  |  | ||||||
|  |         consoleBox.add(errorScroll) | ||||||
|  |  | ||||||
|  |         populateConsoles() | ||||||
|  |         if(out) then { | ||||||
|  |             popped.show_all | ||||||
|  |         } else { | ||||||
|  |             window.show_all | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // If there is text to be put into the consoles this will add it | ||||||
|  | method populateConsoles { | ||||||
|  |     if((outText.size > 0) && (currentConsole == "output")) then { | ||||||
|  |         outConsole.buffer.set_text(outText, -1) | ||||||
|  |     } | ||||||
|  |     if((errorText.size > 0) && (currentConsole == "errors")) then { | ||||||
|  |         def sIter = gtk.text_iter | ||||||
|  |         def eIter = gtk.text_iter | ||||||
|  |  | ||||||
|  |         errorConsole.buffer.set_text(errorText, -1) | ||||||
|  |         errorConsole.buffer.get_iter_at_offset(sIter, 0) | ||||||
|  |         errorConsole.buffer.get_iter_at_offset(eIter, -1) | ||||||
|  |         errorConsole.buffer.apply_tag(errorTag, sIter, eIter) | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | method clearConsoles { | ||||||
|  |     if(currentConsole == "output") then { | ||||||
|  |         outConsole.buffer.set_text("[Output]:", -1) | ||||||
|  |         outText := "" | ||||||
|  |     } | ||||||
|  |     if(currentConsole == "errors") then { | ||||||
|  |         errorConsole.buffer.set_text("[Errors]:", -1) | ||||||
|  |         errorText := "" | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | // Identical as the popIn method, but can be connected to the window's destroy button | ||||||
|  | def popInBlock = { | ||||||
|  |     consoleBox.reparent(splitPane) | ||||||
|  |     popButton.label := "Pop Out" | ||||||
|  |  | ||||||
|  |     if(currentConsole == "output") then { | ||||||
|  |         outConsole.set_size_request(700, 200) | ||||||
|  |         outScroll.set_size_request(700, 200) | ||||||
|  |     } | ||||||
|  |     if(currentConsole == "errors") then { | ||||||
|  |      errorConsole.set_size_request(700, 200) | ||||||
|  |      errorScroll.set_size_request(700, 200) | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     def cur_page_num = notebook.current_page | ||||||
|  |     def cur_scrolled = scrolled_map.get(cur_page_num) | ||||||
|  |     def cur_page = editor_map.get(cur_page_num) | ||||||
|  |  | ||||||
|  |     cur_page.set_size_request(700, 400) | ||||||
|  |     cur_scrolled.set_size_request(700, 400) | ||||||
|  |  | ||||||
|  |     out := false | ||||||
|  |     popped.visible := false | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | // This pops the console out into a separate window | ||||||
|  | method popOut { | ||||||
|  |     popped := gtk.window(gtk.GTK_WINDOW_TOPLEVEL) | ||||||
|  |  | ||||||
|  |     consoleBox.reparent(popped) | ||||||
|  |     popButton.label := "Pop In" | ||||||
|  |  | ||||||
|  |     if(currentConsole == "output") then { | ||||||
|  |         outConsole.set_size_request(400, 400) | ||||||
|  |         outScroll.set_size_request(400, 400) | ||||||
|  |     } | ||||||
|  |     if(currentConsole == "errors") then { | ||||||
|  |         errorConsole.set_size_request(400, 400) | ||||||
|  |         errorScroll.set_size_request(400, 400) | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     def cur_page_num = notebook.current_page | ||||||
|  |     def cur_scrolled = scrolled_map.get(cur_page_num) | ||||||
|  |     def cur_page = editor_map.get(cur_page_num) | ||||||
|  |  | ||||||
|  |     cur_page.set_size_request(700, 580) | ||||||
|  |     cur_scrolled.set_size_request(700, 580) | ||||||
|  |  | ||||||
|  |     out := true | ||||||
|  |     popped.visible := true | ||||||
|  |     popped.connect("destroy", popInBlock) | ||||||
|  |     popped.show_all | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Puts the console back into the main window | ||||||
|  | method popIn { | ||||||
|  |     consoleBox.reparent(splitPane) | ||||||
|  |     popButton.label := "Pop Out" | ||||||
|  |  | ||||||
|  |     if(currentConsole == "output") then { | ||||||
|  |         outConsole.set_size_request(700, 200) | ||||||
|  |         outScroll.set_size_request(700, 200) | ||||||
|  |     } | ||||||
|  |     if(currentConsole == "errors") then { | ||||||
|  |         errorConsole.set_size_request(700, 200) | ||||||
|  |         errorScroll.set_size_request(700, 200) | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     def cur_page_num = notebook.current_page | ||||||
|  |     def cur_scrolled = scrolled_map.get(cur_page_num) | ||||||
|  |     def cur_page = editor_map.get(cur_page_num) | ||||||
|  |  | ||||||
|  |     cur_page.set_size_request(700, 400) | ||||||
|  |     cur_scrolled.set_size_request(700, 400) | ||||||
|  |  | ||||||
|  |     out := false | ||||||
|  |     popped.visible := false | ||||||
|  | } | ||||||
|  |  | ||||||
|  | clearConsoles() | ||||||
|  | // ------------- | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | // Patch everything together | ||||||
|  |  | ||||||
|  | var hSeparator1 := gtk.separator(gtk.GTK_ORIENTATION_HORIZONTAL) | ||||||
|  | var hSeparator2 := gtk.separator(gtk.GTK_ORIENTATION_HORIZONTAL) | ||||||
|  |  | ||||||
|  | menuBox.add(newButton) | ||||||
|  | menuBox.add(openButton) | ||||||
|  | menuBox.add(saveButton) | ||||||
|  | menuBox.add(saveAsButton) | ||||||
|  | buttonBox.add(runButton) | ||||||
|  | buttonBox.add(closeButton) | ||||||
|  |  | ||||||
|  | consoleButtons.add(outButton) | ||||||
|  | consoleButtons.add(errorButton) | ||||||
|  | consoleButtons.add(clearButton) | ||||||
|  | consoleButtons.add(popButton) | ||||||
|  |  | ||||||
|  | consoleBox.add(hSeparator1) | ||||||
|  | consoleBox.add(consoleButtons) | ||||||
|  | consoleBox.add(outScroll) | ||||||
|  |  | ||||||
|  | editorBox.add(hSeparator2) | ||||||
|  | notebook.add(scrolled_main) | ||||||
|  | notebook.set_tab_label_text(scrolled_main, "Untitled.grace") | ||||||
|  | editorBox.add(notebook) | ||||||
|  |  | ||||||
|  | splitPane.add1(editorBox) | ||||||
|  | splitPane.add2(consoleBox) | ||||||
|  |  | ||||||
|  | mBox.add(menuBox) | ||||||
|  | mBox.add(buttonBox) | ||||||
|  | mBox.add(splitPane) | ||||||
|  |  | ||||||
|  | window.add(mBox) | ||||||
|  |  | ||||||
|  | def exit = { | ||||||
|  |     var x := 0 | ||||||
|  |     while {x < notebook.n_pages} do { | ||||||
|  |         deleteCompileFiles(x) | ||||||
|  |  | ||||||
|  |         x := x + 1 | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     // Delete the compile files of the IDE | ||||||
|  |     io.system("rm -f Grace_IDE.gct Grace_IDE.c Grace_IDE.gcn") | ||||||
|  |     io.system("rm -f scanner.gct scanner.c scanner.gcn") | ||||||
|  |     io.system("rm -f syntax_highlighter.gct syntax_highlighter.c syntax_highlighter.gcn") | ||||||
|  |     io.system("rm -f syntax_colors.gct syntax_colors.c syntax_colors.gcn") | ||||||
|  |     io.system("rm -f button_factory.gct button_factory.c button_factory.gcn") | ||||||
|  |     io.system("rm -f dialog_factory.gct dialog_factory.c dialog_factory.gcn") | ||||||
|  |     io.system("rm -f auto_completer.gct auto_completer.c auto_completer.gcn") | ||||||
|  |  | ||||||
|  |     print "Grace IDE Closed Successfully" | ||||||
|  |     gtk.main_quit | ||||||
|  | } | ||||||
|  |  | ||||||
|  | window.connect("destroy", exit) | ||||||
|  | window.show_all | ||||||
|  |  | ||||||
|  | gtk.main | ||||||
							
								
								
									
										46
									
								
								samples/Isabelle/HelloWorld.thy
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								samples/Isabelle/HelloWorld.thy
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,46 @@ | |||||||
|  | theory HelloWorld | ||||||
|  | imports Main | ||||||
|  | begin | ||||||
|  |  | ||||||
|  | section{*Playing around with Isabelle*} | ||||||
|  |  | ||||||
|  | text{* creating a lemma with the name hello_world*} | ||||||
|  | lemma hello_world: "True" by simp | ||||||
|  |  | ||||||
|  | (*inspecting it*) | ||||||
|  | thm hello_world | ||||||
|  |  | ||||||
|  | text{* defining a string constant HelloWorld *} | ||||||
|  |  | ||||||
|  | definition HelloWorld :: "string" where | ||||||
|  |   "HelloWorld \<equiv> ''Hello World!''" | ||||||
|  |  | ||||||
|  | (*reversing HelloWorld twice yilds HelloWorld again*) | ||||||
|  | theorem "rev (rev HelloWorld) = HelloWorld" | ||||||
|  |   by (fact List.rev_rev_ident) | ||||||
|  |  | ||||||
|  | text{*now we delete the already proven List.rev_rev_ident lema and show it by hand*} | ||||||
|  | declare List.rev_rev_ident[simp del] | ||||||
|  | hide_fact List.rev_rev_ident | ||||||
|  |  | ||||||
|  | (*It's trivial since we can just 'execute' it*) | ||||||
|  | corollary "rev (rev HelloWorld) = HelloWorld" | ||||||
|  |   apply(simp add: HelloWorld_def) | ||||||
|  |   done | ||||||
|  |  | ||||||
|  | text{*does it hold in general?*} | ||||||
|  | theorem rev_rev_ident:"rev (rev l) = l" | ||||||
|  |   proof(induction l) | ||||||
|  |   case Nil thus ?case by simp | ||||||
|  |   next | ||||||
|  |   case (Cons l ls) | ||||||
|  |     assume IH: "rev (rev ls) = ls" | ||||||
|  |     have "rev (l#ls) = (rev ls) @ [l]" by simp | ||||||
|  |     hence "rev (rev (l#ls)) = rev ((rev ls) @ [l])" by simp | ||||||
|  |     also have "\<dots> = [l] @ rev (rev ls)" by simp | ||||||
|  |     finally show "rev (rev (l#ls)) = l#ls" using IH by simp | ||||||
|  |   qed | ||||||
|  |  | ||||||
|  | corollary "\<forall>(l::string). rev (rev l) = l" by(fastforce intro: rev_rev_ident) | ||||||
|  |  | ||||||
|  | end | ||||||
							
								
								
									
										24
									
								
								samples/JavaScript/helloHanaEndpoint.xsjs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								samples/JavaScript/helloHanaEndpoint.xsjs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,24 @@ | |||||||
|  | /* | ||||||
|  |  invoke endpoint by calling in a browser: | ||||||
|  |  http://<hanaserveradress>:<xsengineport(usually 8000)>/<path>/<to>/<endpoint>/helloHanaMath.xsjslib?x=4&y=2 | ||||||
|  |  e.g.: | ||||||
|  |  http://192.168.178.20:8000/geekflyer/linguist/helloHanaEndpoint.xsjs?x=4&y=2 | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | var hanaMath = $.import("./helloHanaMath.xsjslib"); | ||||||
|  |  | ||||||
|  | var x = parseFloat($.request.parameters.get("x")); | ||||||
|  | var y = parseFloat($.request.parameters.get("y")); | ||||||
|  |  | ||||||
|  |  | ||||||
|  | var result = hanaMath.multiply(x, y); | ||||||
|  |  | ||||||
|  | var output = { | ||||||
|  |     title: "Hello HANA XS - do some simple math", | ||||||
|  |     input: {x: x, y: y}, | ||||||
|  |     result: result | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | $.response.contentType = "application/json"; | ||||||
|  | $.response.statusCode = $.net.http.OK; | ||||||
|  | $.response.setBody(JSON.stringify(output)); | ||||||
							
								
								
									
										9
									
								
								samples/JavaScript/helloHanaMath.xsjslib
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								samples/JavaScript/helloHanaMath.xsjslib
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | |||||||
|  | /* simple hana xs demo library, which can be used by multiple endpoints */ | ||||||
|  |  | ||||||
|  | function multiply(x, y) { | ||||||
|  |     return x * y; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function add(x, y) { | ||||||
|  |     return x + y; | ||||||
|  | } | ||||||
							
								
								
									
										232
									
								
								samples/Mathematica/MiscCalculations.nb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										232
									
								
								samples/Mathematica/MiscCalculations.nb
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,232 @@ | |||||||
|  | (* Content-type: application/vnd.wolfram.mathematica *) | ||||||
|  |  | ||||||
|  | (*** Wolfram Notebook File ***) | ||||||
|  | (* http://www.wolfram.com/nb *) | ||||||
|  |  | ||||||
|  | (* CreatedBy='Mathematica 9.0' *) | ||||||
|  |  | ||||||
|  | (*CacheID: 234*) | ||||||
|  | (* Internal cache information: | ||||||
|  | NotebookFileLineBreakTest | ||||||
|  | NotebookFileLineBreakTest | ||||||
|  | NotebookDataPosition[       157,          7] | ||||||
|  | NotebookDataLength[      7164,        223] | ||||||
|  | NotebookOptionsPosition[      6163,        182] | ||||||
|  | NotebookOutlinePosition[      6508,        197] | ||||||
|  | CellTagsIndexPosition[      6465,        194] | ||||||
|  | WindowFrame->Normal*) | ||||||
|  |  | ||||||
|  | (* Beginning of Notebook Content *) | ||||||
|  | Notebook[{ | ||||||
|  |  | ||||||
|  | Cell[CellGroupData[{ | ||||||
|  | Cell[BoxData[ | ||||||
|  |  RowBox[{ | ||||||
|  |   RowBox[{"Solve", "[",  | ||||||
|  |    RowBox[{ | ||||||
|  |     RowBox[{"y", "'"}], "\[Equal]", " ", "xy"}], "]"}],  | ||||||
|  |   "\[IndentingNewLine]"}]], "Input", | ||||||
|  |  CellChangeTimes->{{3.6112716342092056`*^9, 3.6112716549793935`*^9}}], | ||||||
|  |  | ||||||
|  | Cell[BoxData[ | ||||||
|  |  RowBox[{"{",  | ||||||
|  |   RowBox[{"{",  | ||||||
|  |    RowBox[{"xy", "\[Rule]",  | ||||||
|  |     SuperscriptBox["y", "\[Prime]", | ||||||
|  |      MultilineFunction->None]}], "}"}], "}"}]], "Output", | ||||||
|  |  CellChangeTimes->{3.6112716579295626`*^9}] | ||||||
|  | }, Open  ]], | ||||||
|  |  | ||||||
|  | Cell[CellGroupData[{ | ||||||
|  |  | ||||||
|  | Cell[BoxData[ | ||||||
|  |  RowBox[{"Log", "[",  | ||||||
|  |   RowBox[{"Sin", "[", "38", "]"}], "]"}]], "Input", | ||||||
|  |  CellChangeTimes->{{3.611271663920905*^9, 3.6112716759275913`*^9}}], | ||||||
|  |  | ||||||
|  | Cell[BoxData[ | ||||||
|  |  RowBox[{"Log", "[",  | ||||||
|  |   RowBox[{"Sin", "[", "38", "]"}], "]"}]], "Output", | ||||||
|  |  CellChangeTimes->{3.611271678256725*^9}] | ||||||
|  | }, Open  ]], | ||||||
|  |  | ||||||
|  | Cell[CellGroupData[{ | ||||||
|  |  | ||||||
|  | Cell[BoxData[ | ||||||
|  |  RowBox[{"N", "[",  | ||||||
|  |   RowBox[{"Log", "[",  | ||||||
|  |    RowBox[{"Sin", "[", "38", "]"}], "]"}], "]"}]], "Input", | ||||||
|  |  NumberMarks->False], | ||||||
|  |  | ||||||
|  | Cell[BoxData[ | ||||||
|  |  RowBox[{"-", "1.2161514009320473`"}]], "Output", | ||||||
|  |  CellChangeTimes->{3.611271682061942*^9}] | ||||||
|  | }, Open  ]], | ||||||
|  |  | ||||||
|  | Cell[CellGroupData[{ | ||||||
|  |  | ||||||
|  | Cell[BoxData[ | ||||||
|  |  RowBox[{"Abs", "[",  | ||||||
|  |   RowBox[{"-", "1.2161514009320473`"}], "]"}]], "Input", | ||||||
|  |  NumberMarks->False], | ||||||
|  |  | ||||||
|  | Cell[BoxData["1.2161514009320473`"], "Output", | ||||||
|  |  CellChangeTimes->{3.6112716842780695`*^9}] | ||||||
|  | }, Open  ]], | ||||||
|  |  | ||||||
|  | Cell[CellGroupData[{ | ||||||
|  |  | ||||||
|  | Cell[BoxData[ | ||||||
|  |  RowBox[{"RealDigits", "[", "1.2161514009320473`", "]"}]], "Input", | ||||||
|  |  NumberMarks->False], | ||||||
|  |  | ||||||
|  | Cell[BoxData[ | ||||||
|  |  RowBox[{"{",  | ||||||
|  |   RowBox[{ | ||||||
|  |    RowBox[{"{",  | ||||||
|  |     RowBox[{ | ||||||
|  |     "1", ",", "2", ",", "1", ",", "6", ",", "1", ",", "5", ",", "1", ",", "4", | ||||||
|  |       ",", "0", ",", "0", ",", "9", ",", "3", ",", "2", ",", "0", ",", "4",  | ||||||
|  |      ",", "7"}], "}"}], ",", "1"}], "}"}]], "Output", | ||||||
|  |  CellChangeTimes->{3.611271685319129*^9}] | ||||||
|  | }, Open  ]], | ||||||
|  |  | ||||||
|  | Cell[CellGroupData[{ | ||||||
|  |  | ||||||
|  | Cell[BoxData[ | ||||||
|  |  RowBox[{ | ||||||
|  |   RowBox[{"Graph", "[",  | ||||||
|  |    RowBox[{"Log", "[", "x", "]"}], "]"}], "\[IndentingNewLine]"}]], "Input", | ||||||
|  |  CellChangeTimes->{{3.611271689258354*^9, 3.611271702038085*^9}}], | ||||||
|  |  | ||||||
|  | Cell[BoxData[ | ||||||
|  |  RowBox[{"Graph", "[",  | ||||||
|  |   RowBox[{"Log", "[", "x", "]"}], "]"}]], "Output", | ||||||
|  |  CellChangeTimes->{3.611271704295214*^9}] | ||||||
|  | }, Open  ]], | ||||||
|  |  | ||||||
|  | Cell[BoxData[""], "Input", | ||||||
|  |  CellChangeTimes->{{3.611271712769699*^9, 3.6112717423153887`*^9}}], | ||||||
|  |  | ||||||
|  | Cell[CellGroupData[{ | ||||||
|  |  | ||||||
|  | Cell[BoxData[ | ||||||
|  |  RowBox[{ | ||||||
|  |   RowBox[{"Plot", "[",  | ||||||
|  |    RowBox[{ | ||||||
|  |     RowBox[{"Log", "[", "x", "]"}], ",", " ",  | ||||||
|  |     RowBox[{"{",  | ||||||
|  |      RowBox[{"x", ",", " ", "0", ",", " ", "10"}], "}"}]}], "]"}],  | ||||||
|  |   "\[IndentingNewLine]"}]], "Input", | ||||||
|  |  CellChangeTimes->{{3.6112717573482485`*^9, 3.6112717747822456`*^9}}], | ||||||
|  |  | ||||||
|  | Cell[BoxData[ | ||||||
|  |  GraphicsBox[{{}, {},  | ||||||
|  |    {Hue[0.67, 0.6, 0.6], LineBox[CompressedData[" | ||||||
|  | 1:eJwVzXs81Pkex/GZH7XlsutSQprwqxTSZVfJGp9P6UYqlyxHUhTaLrq4JpVK | ||||||
|  | 0SHRisGWjYiEbHSvb+Q27rllmYwaY6JpwxgZTI7zx/vxejz/eht4H3PyoRgM | ||||||
|  | Rsj0/t+1MEPjP1Zc8O6L0tCYkJERTokxP5YLLR+MQy2qZWSzX62gWcaFn9s7 | ||||||
|  | 5sVFyohY4ZvLs5Ya6AheLQxnyIgFe4fllag6yH4zayhMcYw0FU5SRl8bweS/ | ||||||
|  | wyVFa0aJBsz2VDVrAl8V299DGKPk1yWJllEHmqD42vuI4RopiRvJlYS9bYLZ | ||||||
|  | a2c4j3pJyS8JbT7eeW/By6ht44vkEXKuxtRu1d4WOB5QmStjSUhO0eMleTda | ||||||
|  | 4EZtHmU5PEyaORsUFte1QFHRg6WjFcNkkZ/bC+11rVC0s8n9nf8wqVGINGNo | ||||||
|  | tkFRzD3HsYohosXu0misbAdxXml1VdQgKSi80nXErBNo/oP47aliMqAxEGvn | ||||||
|  | 1QlVgoRvezzExCjYznppYifkn+K6CVli8peV8m2BrBNM20LljlmfyXVurK97 | ||||||
|  | RRfcVCpPCXg8QIIF14a2eLyHn6Y4909//UTSlWsvqm/qge1fVjduzhISa/Zp | ||||||
|  | jwjPHvCM6ZD7BQgJz9/E/GtIDyRsSj3Svl5ItJtj+uru9cBdE2PXZH4vSeDY | ||||||
|  | 20arfYAT6Z3e8axecnFxw49TXR/gU5X5vDu5H4kfvE0RnxSAsqvDMcduPmFk | ||||||
|  | jD7rihGA7RmZ5qlYPuEo6vFq7gigR67QPetXPqnm+rJy2wUA0hVVHindZOmu | ||||||
|  | yQwfy17Y4OU185n7e/LpoNH9bqYQPPrPvwn+2kkOXT/zqim+DzJ72WEzdrcT | ||||||
|  | SprBJ7l9UD/Fag2c005SXasZhWV9kH51Z/aqhjZSo6dpc3WkD4L1tqolbGgj | ||||||
|  | JndzqmzdRPD67PLxVrNWIn7e0lS28BMs6Ba9FM1pJv7CZYLign6IeWFYmrqk | ||||||
|  | jvR4/jOrlNsPoqNsieZftcS5I9qsvrcf8tnmIzq6tcSiVnRKqDsALqbKTVU/ | ||||||
|  | 1RCFoiw1ragBULG3LYphVhNOuIF1yN7PkFMpYVXI35BSTZ2UdWpfgMls07e/ | ||||||
|  | 84QoGUQa8S0GgVn/55MIdixUWyWsOLtpEAIiTazYlglw2e3W2gVOg5BMOVFO | ||||||
|  | zolAxT/ZsvvwIJAvj7SczqbC+Hex37ubgxD8udJ0tkcmfOa55DRSQ8DwsFzc | ||||||
|  | 6lkIdRyjZa/rhsAywLBSze45xKnVGt/eJwFLB1UN7sVq8O7aRRTqRsFbq7Mr | ||||||
|  | JqcdTlREeh8zGoeOsKZ1bgF8KDqu4qxtK4c/T0q26boJ4PbpwwMrXRn4N9vd | ||||||
|  | qamzDy6kTzqOiJmo6OOuteZtPzBaevBFmALy6nNqfwkTw5JA39BdxjPwSH3B | ||||||
|  | vlWGX6FXmvyb8suZeCtkhRV5NAh2wkNnrp+YhaOXrkQMdg/Bjt54ExZLCdti | ||||||
|  | v+y2+XcYBt54R1TnKyOH4R+txpOAmXr7Apu9quiaByGbG0dACaRePMmPmLmw | ||||||
|  | vX84Swpbvrh/M3RRQziRFnP5wih0lB1gupuqY0FCbZyewzcoiS731JeqY4Zj | ||||||
|  | 3+qZP4yB74ygnoYGDcz5GOJ8uXwM9p88XaKSqonn9R26+EdlsMLPpMHeaw4K | ||||||
|  | rc1neaqOQ6OGqXLQurmYKexKyno4Ds8LLqSZKmhhhvxW6cjWCTjNNHaoe6+F | ||||||
|  | pidKHHi9E6DEC9vqXzwPGaH7eO6hkyDMNkhMD9fGsUD+Knv5JCQu1VF86qKD | ||||||
|  | h3vll15HyyE+1bfKS18XbTje/KqZ38E9cU+DikgXNYxUk++f/Q5jG7Nk6a/m | ||||||
|  | 49yHih6fJ7+DQLghtCxKD9We/pFtf2wKMtir5td7LcDHFdUyrmgK8i8Fqfst | ||||||
|  | Z2H5rdC2ZGMGRrns36YgZWHfc/sj7Z4MNOfdzo2qX4jaWiITpSQGcpal5ddv | ||||||
|  | 08c4nrYPVjPw3OurnG1P9ZGdfship5yB2+e7ZNUsMsAzD/MLtFcycb1/1W71 | ||||||
|  | Kwb4qn7LsIcnE9P1vBfVSQ1QUbd5z75rTFz05m7Sjt2GeHJ9UIrOCybGLy8z | ||||||
|  | bn5liLETFcsURUz0lSi+5RrTGL/GlX1jDoXeRcP6V67R6DRvQNHcmsIjF5wn | ||||||
|  | 7RJoPPVD0ph42kHOxe9U/qDR/97LrjtAYbQ0KC4+iUa6N+b4nPUUFqyTTSTf | ||||||
|  | pDFTFtw6bEOhrHSqPTuPRo1786Pv21IY36xytbyKxo0v5z7UdKEwNfPowctc | ||||||
|  | GuUeojTutDMDG2y21tIYpHQ98NxvFD7Sih+vbaBRfeZZ6YArhTx3zYMtbTRC | ||||||
|  | CmNNqTuFRgIdm48CGveGmxUf2kfhyuIw1h0hjasPiNIWelFoealL5iOiMZKf | ||||||
|  | HdA6bXujmw/6B2gk7zZK2PspPHlYnzU0RGN40raf1XwpDLc6L/tbMv0vikor | ||||||
|  | n/Yl1Y+tgVIayzZ/kIT6UcgpzIwZG6Px0d7RwA8HKcyIUPR7Nk7j8sLHN2/8 | ||||||
|  | TmGeo8+G8Ekab1ncfmR7iMJiw8oF1t9pnF9RQuTTfiVZIpuaonFCb+xJ0WEK | ||||||
|  | /wc13qzo | ||||||
|  |      "]]}}, | ||||||
|  |   AspectRatio->NCache[GoldenRatio^(-1), 0.6180339887498948], | ||||||
|  |   Axes->True, | ||||||
|  |   AxesLabel->{None, None}, | ||||||
|  |   AxesOrigin->{0, 0}, | ||||||
|  |   Method->{}, | ||||||
|  |   PlotRange->{{0, 10}, {-1.623796532045525, 2.3025850725858823`}}, | ||||||
|  |   PlotRangeClipping->True, | ||||||
|  |   PlotRangePadding->{ | ||||||
|  |     Scaled[0.02],  | ||||||
|  |     Scaled[0.02]}]], "Output", | ||||||
|  |  CellChangeTimes->{3.6112717778594217`*^9}] | ||||||
|  | }, Open  ]] | ||||||
|  | }, | ||||||
|  | WindowSize->{716, 833}, | ||||||
|  | WindowMargins->{{Automatic, 214}, {Automatic, 26}}, | ||||||
|  | FrontEndVersion->"9.0 for Microsoft Windows (64-bit) (January 25, 2013)", | ||||||
|  | StyleDefinitions->"Default.nb" | ||||||
|  | ] | ||||||
|  | (* End of Notebook Content *) | ||||||
|  |  | ||||||
|  | (* Internal cache information *) | ||||||
|  | (*CellTagsOutline | ||||||
|  | CellTagsIndex->{} | ||||||
|  | *) | ||||||
|  | (*CellTagsIndex | ||||||
|  | CellTagsIndex->{} | ||||||
|  | *) | ||||||
|  | (*NotebookFileOutline | ||||||
|  | Notebook[{ | ||||||
|  | Cell[CellGroupData[{ | ||||||
|  | Cell[579, 22, 224, 6, 52, "Input"], | ||||||
|  | Cell[806, 30, 211, 6, 31, "Output"] | ||||||
|  | }, Open  ]], | ||||||
|  | Cell[CellGroupData[{ | ||||||
|  | Cell[1054, 41, 155, 3, 31, "Input"], | ||||||
|  | Cell[1212, 46, 130, 3, 31, "Output"] | ||||||
|  | }, Open  ]], | ||||||
|  | Cell[CellGroupData[{ | ||||||
|  | Cell[1379, 54, 137, 4, 31, "Input"], | ||||||
|  | Cell[1519, 60, 105, 2, 31, "Output"] | ||||||
|  | }, Open  ]], | ||||||
|  | Cell[CellGroupData[{ | ||||||
|  | Cell[1661, 67, 113, 3, 31, "Input"], | ||||||
|  | Cell[1777, 72, 90, 1, 31, "Output"] | ||||||
|  | }, Open  ]], | ||||||
|  | Cell[CellGroupData[{ | ||||||
|  | Cell[1904, 78, 102, 2, 31, "Input"], | ||||||
|  | Cell[2009, 82, 321, 8, 31, "Output"] | ||||||
|  | }, Open  ]], | ||||||
|  | Cell[CellGroupData[{ | ||||||
|  | Cell[2367, 95, 191, 4, 52, "Input"], | ||||||
|  | Cell[2561, 101, 131, 3, 31, "Output"] | ||||||
|  | }, Open  ]], | ||||||
|  | Cell[2707, 107, 94, 1, 31, "Input"], | ||||||
|  | Cell[CellGroupData[{ | ||||||
|  | Cell[2826, 112, 299, 8, 52, "Input"], | ||||||
|  | Cell[3128, 122, 3019, 57, 265, "Output"] | ||||||
|  | }, Open  ]] | ||||||
|  | } | ||||||
|  | ] | ||||||
|  | *) | ||||||
|  |  | ||||||
|  | (* End of internal cache information *) | ||||||
							
								
								
									
										3666
									
								
								samples/Mathematica/MiscCalculations2.nb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3666
									
								
								samples/Mathematica/MiscCalculations2.nb
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										8
									
								
								samples/Mathematica/Problem12.m
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								samples/Mathematica/Problem12.m
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | |||||||
|  | (* ::Package:: *) | ||||||
|  |  | ||||||
|  | (* Problem12.m *) | ||||||
|  | (* Author: William Woodruff *) | ||||||
|  | (* Problem: What is the value of the first triangle number to have over five hundred divisors? *) | ||||||
|  |  | ||||||
|  | Do[If[Length[Divisors[Binomial[i + 1, 2]]] > 500,  | ||||||
|  |   Print[Binomial[i + 1, 2]]; Break[]], {i, 1000000}] | ||||||
							
								
								
									
										272
									
								
								samples/Nit/calculator.nit
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										272
									
								
								samples/Nit/calculator.nit
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,272 @@ | |||||||
|  | # This file is part of NIT ( http://www.nitlanguage.org ). | ||||||
|  | # | ||||||
|  | # Copyright 2013 Alexis Laferrière <alexis.laf@xymus.net> | ||||||
|  | # | ||||||
|  | # Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | # you may not use this file except in compliance with the License. | ||||||
|  | # You may obtain a copy of the License at | ||||||
|  | # | ||||||
|  | #     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | # | ||||||
|  | # Unless required by applicable law or agreed to in writing, software | ||||||
|  | # distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | # See the License for the specific language governing permissions and | ||||||
|  | # limitations under the License. | ||||||
|  |  | ||||||
|  | import gtk | ||||||
|  |  | ||||||
|  | class CalculatorContext | ||||||
|  | 	var result : nullable Float = null | ||||||
|  |  | ||||||
|  | 	var last_op : nullable Char = null | ||||||
|  |  | ||||||
|  | 	var current : nullable Float = null | ||||||
|  | 	var after_point : nullable Int = null | ||||||
|  |  | ||||||
|  | 	fun push_op( op : Char ) | ||||||
|  | 	do | ||||||
|  | 		apply_last_op_if_any | ||||||
|  | 		if op == 'C' then | ||||||
|  | 			self.result = 0.0 | ||||||
|  | 			last_op = null | ||||||
|  | 		else | ||||||
|  | 			last_op = op # store for next push_op | ||||||
|  | 		end | ||||||
|  |  | ||||||
|  | 		# prepare next current | ||||||
|  | 		after_point = null | ||||||
|  | 		current = null | ||||||
|  | 	end | ||||||
|  |  | ||||||
|  | 	fun push_digit( digit : Int ) | ||||||
|  | 	do | ||||||
|  | 		var current = current | ||||||
|  | 		if current == null then current = 0.0 | ||||||
|  |  | ||||||
|  | 		var after_point = after_point | ||||||
|  | 		if after_point == null then | ||||||
|  | 			current = current * 10.0 + digit.to_f | ||||||
|  | 		else | ||||||
|  | 			current = current + digit.to_f * 10.0.pow(after_point.to_f) | ||||||
|  | 			self.after_point -= 1 | ||||||
|  | 		end | ||||||
|  |  | ||||||
|  | 		self.current = current | ||||||
|  | 	end | ||||||
|  |  | ||||||
|  | 	fun switch_to_decimals | ||||||
|  | 	do | ||||||
|  | 		if self.current == null then current = 0.0 | ||||||
|  | 		if after_point != null then return | ||||||
|  |  | ||||||
|  | 		after_point = -1 | ||||||
|  | 	end | ||||||
|  |  | ||||||
|  | 	fun apply_last_op_if_any | ||||||
|  | 	do | ||||||
|  | 		var op = last_op | ||||||
|  |  | ||||||
|  | 		var result = result | ||||||
|  | 		if result == null then result = 0.0 | ||||||
|  |  | ||||||
|  | 		var current = current | ||||||
|  | 		if current == null then current = 0.0 | ||||||
|  |  | ||||||
|  | 		if op == null then | ||||||
|  | 			result = current | ||||||
|  | 		else if op == '+' then | ||||||
|  | 			result = result + current | ||||||
|  | 		else if op == '-' then | ||||||
|  | 			result = result - current | ||||||
|  | 		else if op == '/' then | ||||||
|  | 			result = result / current | ||||||
|  | 		else if op == '*' then | ||||||
|  | 			result = result * current | ||||||
|  | 		end | ||||||
|  | 		self.result = result | ||||||
|  | 		self.current = null | ||||||
|  | 	end | ||||||
|  | end | ||||||
|  |  | ||||||
|  | class CalculatorGui | ||||||
|  | 	super GtkCallable | ||||||
|  |  | ||||||
|  | 	var win : GtkWindow | ||||||
|  | 	var container : GtkGrid | ||||||
|  |  | ||||||
|  | 	var lbl_disp : GtkLabel | ||||||
|  | 	var but_eq : GtkButton | ||||||
|  | 	var but_dot : GtkButton | ||||||
|  |  | ||||||
|  | 	var context = new CalculatorContext | ||||||
|  |  | ||||||
|  | 	redef fun signal( sender, user_data ) | ||||||
|  | 	do | ||||||
|  | 		var after_point = context.after_point | ||||||
|  | 		if after_point == null then  | ||||||
|  | 		    after_point = 0 | ||||||
|  | 		else | ||||||
|  | 		    after_point = (after_point.abs) | ||||||
|  | 		end | ||||||
|  | 		 | ||||||
|  | 		if user_data isa Char then # is an operation | ||||||
|  | 			var c = user_data | ||||||
|  | 			if c == '.' then | ||||||
|  | 				but_dot.sensitive= false | ||||||
|  | 				context.switch_to_decimals | ||||||
|  | 				lbl_disp.text = "{context.current.to_i}." | ||||||
|  | 			else | ||||||
|  | 				but_dot.sensitive= true | ||||||
|  | 				context.push_op( c ) | ||||||
|  | 				 | ||||||
|  | 				var s = context.result.to_precision_native(6) | ||||||
|  | 				var index : nullable Int = null | ||||||
|  | 				for i in s.length.times do | ||||||
|  | 				    var chiffre = s.chars[i] | ||||||
|  | 				    if chiffre == '0' and index == null then | ||||||
|  | 					index = i | ||||||
|  | 				    else if chiffre != '0' then | ||||||
|  | 					index = null | ||||||
|  | 				    end | ||||||
|  | 				end | ||||||
|  | 				if index != null then | ||||||
|  | 					s = s.substring(0, index) | ||||||
|  | 					if s.chars[s.length-1] == ',' then s = s.substring(0, s.length-1) | ||||||
|  | 				end | ||||||
|  | 				lbl_disp.text = s | ||||||
|  | 			end | ||||||
|  | 		else if user_data isa Int then # is a number | ||||||
|  | 			var n = user_data | ||||||
|  | 			context.push_digit( n ) | ||||||
|  | 			lbl_disp.text = context.current.to_precision_native(after_point) | ||||||
|  | 		end | ||||||
|  | 	end | ||||||
|  |  | ||||||
|  | 	init | ||||||
|  | 	do | ||||||
|  | 		init_gtk | ||||||
|  |  | ||||||
|  | 		win = new GtkWindow( 0 ) | ||||||
|  |  | ||||||
|  | 		container = new GtkGrid(5,5,true) | ||||||
|  | 		win.add( container ) | ||||||
|  |  | ||||||
|  | 		lbl_disp = new GtkLabel( "_" ) | ||||||
|  | 		container.attach( lbl_disp, 0, 0, 5, 1 ) | ||||||
|  |  | ||||||
|  | 		# digits | ||||||
|  | 		for n in [0..9] do | ||||||
|  | 			var but = new GtkButton.with_label( n.to_s ) | ||||||
|  | 			but.request_size( 64, 64 ) | ||||||
|  | 			but.signal_connect( "clicked", self, n ) | ||||||
|  | 			if n == 0 then | ||||||
|  | 				container.attach( but, 0, 4, 1, 1 ) | ||||||
|  | 			else container.attach( but, (n-1)%3, 3-(n-1)/3, 1, 1 ) | ||||||
|  | 		end | ||||||
|  |  | ||||||
|  | 		# operators | ||||||
|  | 		var r = 1 | ||||||
|  | 		for op in ['+', '-', '*', '/' ] do | ||||||
|  | 			var but = new GtkButton.with_label( op.to_s ) | ||||||
|  | 			but.request_size( 64, 64 ) | ||||||
|  | 			but.signal_connect( "clicked", self, op ) | ||||||
|  | 			container.attach( but, 3, r, 1, 1 ) | ||||||
|  | 			r+=1 | ||||||
|  | 		end | ||||||
|  |  | ||||||
|  | 		# = | ||||||
|  | 		but_eq = new GtkButton.with_label( "=" ) | ||||||
|  | 		but_eq.request_size( 64, 64 ) | ||||||
|  | 		but_eq.signal_connect( "clicked", self, '=' ) | ||||||
|  | 		container.attach( but_eq, 4, 3, 1, 2 ) | ||||||
|  |  | ||||||
|  | 		# . | ||||||
|  | 		but_dot = new GtkButton.with_label( "." ) | ||||||
|  | 		but_dot.request_size( 64, 64 ) | ||||||
|  | 		but_dot.signal_connect( "clicked", self, '.' ) | ||||||
|  | 		container.attach( but_dot, 1, 4, 1, 1 ) | ||||||
|  |  | ||||||
|  | 		#C | ||||||
|  | 		var but_c =  new GtkButton.with_label( "C" ) | ||||||
|  | 		but_c.request_size( 64, 64 ) | ||||||
|  | 		but_c.signal_connect("clicked", self, 'C') | ||||||
|  | 		container.attach( but_c, 2, 4, 1, 1 ) | ||||||
|  |  | ||||||
|  | 		win.show_all | ||||||
|  | 	end | ||||||
|  | end | ||||||
|  |  | ||||||
|  | # context tests | ||||||
|  | var context = new CalculatorContext | ||||||
|  | context.push_digit( 1 ) | ||||||
|  | context.push_digit( 2 ) | ||||||
|  | context.push_op( '+' ) | ||||||
|  | context.push_digit( 3 ) | ||||||
|  | context.push_op( '*' ) | ||||||
|  | context.push_digit( 2 ) | ||||||
|  | context.push_op( '=' ) | ||||||
|  | var r = context.result.to_precision( 2 ) | ||||||
|  | assert r == "30.00" else print r | ||||||
|  |  | ||||||
|  | context = new CalculatorContext | ||||||
|  | context.push_digit( 1 ) | ||||||
|  | context.push_digit( 4 ) | ||||||
|  | context.switch_to_decimals | ||||||
|  | context.push_digit( 1 ) | ||||||
|  | context.push_op( '*' ) | ||||||
|  | context.push_digit( 3 ) | ||||||
|  | context.push_op( '=' ) | ||||||
|  | r = context.result.to_precision( 2 ) | ||||||
|  | assert r == "42.30" else print r | ||||||
|  |  | ||||||
|  | context.push_op( '+' ) | ||||||
|  | context.push_digit( 1 ) | ||||||
|  | context.push_digit( 1 ) | ||||||
|  | context.push_op( '=' ) | ||||||
|  | r = context.result.to_precision( 2 ) | ||||||
|  | assert r == "53.30" else print r | ||||||
|  |  | ||||||
|  | context = new CalculatorContext | ||||||
|  | context.push_digit( 4 ) | ||||||
|  | context.push_digit( 2 ) | ||||||
|  | context.switch_to_decimals | ||||||
|  | context.push_digit( 3 ) | ||||||
|  | context.push_op( '/' ) | ||||||
|  | context.push_digit( 3 ) | ||||||
|  | context.push_op( '=' ) | ||||||
|  | r = context.result.to_precision( 2 ) | ||||||
|  | assert r == "14.10" else print r | ||||||
|  |  | ||||||
|  | #test multiple decimals | ||||||
|  | context = new CalculatorContext | ||||||
|  | context.push_digit( 5 ) | ||||||
|  | context.push_digit( 0 ) | ||||||
|  | context.switch_to_decimals | ||||||
|  | context.push_digit( 1 ) | ||||||
|  | context.push_digit( 2 ) | ||||||
|  | context.push_digit( 3 ) | ||||||
|  | context.push_op( '+' ) | ||||||
|  | context.push_digit( 1 ) | ||||||
|  | context.push_op( '=' ) | ||||||
|  | r = context.result.to_precision( 3 ) | ||||||
|  | assert r == "51.123" else print r | ||||||
|  |  | ||||||
|  | #test 'C' button | ||||||
|  | context = new CalculatorContext | ||||||
|  | context.push_digit( 1 ) | ||||||
|  | context.push_digit( 0 ) | ||||||
|  | context.push_op( '+' ) | ||||||
|  | context.push_digit( 1 ) | ||||||
|  | context.push_digit( 0 ) | ||||||
|  | context.push_op( '=' ) | ||||||
|  | context.push_op( 'C' ) | ||||||
|  | r = context.result.to_precision( 1 ) | ||||||
|  | assert r == "0.0" else print r | ||||||
|  |  | ||||||
|  | # graphical application | ||||||
|  |  | ||||||
|  | if "NIT_TESTING".environ != "true" then | ||||||
|  | 	var app = new CalculatorGui | ||||||
|  | 	run_gtk | ||||||
|  | end | ||||||
							
								
								
									
										45
									
								
								samples/Nit/callback_chimpanze.nit
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								samples/Nit/callback_chimpanze.nit
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,45 @@ | |||||||
|  | # This file is part of NIT ( http://www.nitlanguage.org ). | ||||||
|  | # | ||||||
|  | # Copyright 2013 Matthieu Lucas <lucasmatthieu@gmail.com> | ||||||
|  | # | ||||||
|  | # Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | # you may not use this file except in compliance with the License. | ||||||
|  | # You may obtain a copy of the License at | ||||||
|  | # | ||||||
|  | # http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | # | ||||||
|  | # Unless required by applicable law or agreed to in writing, software | ||||||
|  | # distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | # See the License for the specific language governing permissions and | ||||||
|  | # limitations under the License. | ||||||
|  |  | ||||||
|  | # This sample has been implemented to show you how simple is it to play  | ||||||
|  | # with native callbacks (C) through an high level with NIT program. | ||||||
|  |  | ||||||
|  | module callback_chimpanze | ||||||
|  | import callback_monkey | ||||||
|  |  | ||||||
|  | class Chimpanze | ||||||
|  | 	super MonkeyActionCallable | ||||||
|  |  | ||||||
|  | 	fun create | ||||||
|  | 	do | ||||||
|  | 		var monkey = new Monkey | ||||||
|  | 		print "Hum, I'm sleeping ..." | ||||||
|  | 		# Invoking method which will take some time to compute, and  | ||||||
|  | 		# will be back in wokeUp method with information. | ||||||
|  | 		# - Callback method defined in MonkeyActionCallable Interface | ||||||
|  | 		monkey.wokeUpAction(self, "Hey, I'm awake.") | ||||||
|  | 	end | ||||||
|  |  | ||||||
|  | 	# Inherit callback method, defined by MonkeyActionCallable interface | ||||||
|  | 	# - Back of wokeUpAction method  | ||||||
|  | 	redef fun wokeUp( sender:Monkey, message:Object ) | ||||||
|  | 	do | ||||||
|  | 		print message | ||||||
|  | 	end | ||||||
|  | end | ||||||
|  |  | ||||||
|  | var m = new Chimpanze | ||||||
|  | m.create | ||||||
							
								
								
									
										92
									
								
								samples/Nit/callback_monkey.nit
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										92
									
								
								samples/Nit/callback_monkey.nit
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,92 @@ | |||||||
|  | # This file is part of NIT ( http://www.nitlanguage.org ). | ||||||
|  | # | ||||||
|  | # Copyright 2013 Matthieu Lucas <lucasmatthieu@gmail.com> | ||||||
|  | # | ||||||
|  | # Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | # you may not use this file except in compliance with the License. | ||||||
|  | # You may obtain a copy of the License at | ||||||
|  | # | ||||||
|  | # http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | # | ||||||
|  | # Unless required by applicable law or agreed to in writing, software | ||||||
|  | # distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | # See the License for the specific language governing permissions and | ||||||
|  | # limitations under the License. | ||||||
|  |  | ||||||
|  | # This sample has been implemented to show you how simple is it to play  | ||||||
|  | # with native callbacks (C) through an high level with NIT program. | ||||||
|  |  | ||||||
|  | module callback_monkey | ||||||
|  |  | ||||||
|  | in "C header" `{ | ||||||
|  | 	#include <stdio.h> | ||||||
|  | 	#include <stdlib.h> | ||||||
|  |  | ||||||
|  | 	typedef struct {  | ||||||
|  | 		int id; | ||||||
|  | 		int age; | ||||||
|  | 	} CMonkey; | ||||||
|  |  | ||||||
|  | 	typedef struct { | ||||||
|  | 		MonkeyActionCallable toCall; | ||||||
|  | 		Object message; | ||||||
|  | 	} MonkeyAction; | ||||||
|  | `} | ||||||
|  |  | ||||||
|  | in "C body" `{ | ||||||
|  | 	// Method which reproduce a callback answer | ||||||
|  | 	// Please note that a function pointer is only used to reproduce the callback | ||||||
|  | 	void cbMonkey(CMonkey *mkey, void callbackFunc(CMonkey*, MonkeyAction*), MonkeyAction *data) | ||||||
|  | 	{ | ||||||
|  | 		sleep(2); | ||||||
|  | 		callbackFunc( mkey, data ); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// Back of background treatment, will be redirected to callback function | ||||||
|  | 	void nit_monkey_callback_func( CMonkey *mkey, MonkeyAction *data ) | ||||||
|  | 	{ | ||||||
|  | 		// To call a your method, the signature must be written like this : | ||||||
|  | 		// <Interface Name>_<Method>... | ||||||
|  | 		MonkeyActionCallable_wokeUp( data->toCall, mkey, data->message ); | ||||||
|  | 	} | ||||||
|  | `} | ||||||
|  |  | ||||||
|  | # Implementable interface to get callback in defined methods | ||||||
|  | interface MonkeyActionCallable | ||||||
|  | 	fun wokeUp( sender:Monkey, message: Object) is abstract | ||||||
|  | end | ||||||
|  |  | ||||||
|  | # Defining my object type Monkey, which is, in a low level, a pointer to a C struct (CMonkey) | ||||||
|  | extern class Monkey `{ CMonkey * `} | ||||||
|  | 	 | ||||||
|  | 	new `{ | ||||||
|  | 		CMonkey *monkey = malloc( sizeof(CMonkey) ); | ||||||
|  | 		monkey->age = 10; | ||||||
|  | 		monkey->id = 1; | ||||||
|  | 		return monkey; | ||||||
|  | 	`} | ||||||
|  | 	 | ||||||
|  | 	# Object method which will get a callback in wokeUp method, defined in MonkeyActionCallable interface | ||||||
|  | 	# Must be defined as Nit/C method because of C call inside | ||||||
|  | 	fun wokeUpAction( toCall: MonkeyActionCallable, message: Object ) is extern import MonkeyActionCallable.wokeUp `{ | ||||||
|  |  | ||||||
|  | 		// Allocating memory to keep reference of received parameters : | ||||||
|  | 		// - Object receiver | ||||||
|  | 		// - Message  | ||||||
|  | 		MonkeyAction *data = malloc( sizeof(MonkeyAction) ); | ||||||
|  |  | ||||||
|  | 		// Incrementing reference counter to prevent from releasing | ||||||
|  | 		MonkeyActionCallable_incr_ref( toCall ); | ||||||
|  | 		Object_incr_ref( message ); | ||||||
|  | 		 | ||||||
|  | 		data->toCall = toCall; | ||||||
|  | 		data->message = message; | ||||||
|  | 		 | ||||||
|  | 		// Calling method which reproduce a callback by passing : | ||||||
|  | 		// - Receiver | ||||||
|  | 		// - Function pointer to object return method | ||||||
|  | 		// - Datas | ||||||
|  | 		cbMonkey( recv, &nit_monkey_callback_func, data ); | ||||||
|  | 	`} | ||||||
|  | end | ||||||
							
								
								
									
										167
									
								
								samples/Nit/circular_list.nit
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										167
									
								
								samples/Nit/circular_list.nit
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,167 @@ | |||||||
|  | # This file is part of NIT ( http://www.nitlanguage.org ). | ||||||
|  | # | ||||||
|  | # Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | # you may not use this file except in compliance with the License. | ||||||
|  | # You may obtain a copy of the License at | ||||||
|  | # | ||||||
|  | #     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | # | ||||||
|  | # Unless required by applicable law or agreed to in writing, software | ||||||
|  | # distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | # See the License for the specific language governing permissions and | ||||||
|  | # limitations under the License. | ||||||
|  |  | ||||||
|  | # Implementation of circular lists | ||||||
|  | # This example shows the usage of generics and somewhat a specialisation of collections. | ||||||
|  | module circular_list | ||||||
|  |  | ||||||
|  | # Sequences of elements implemented with a double-linked circular list | ||||||
|  | class CircularList[E] | ||||||
|  | 	# Like standard Array or LinkedList, CircularList is a Sequence. | ||||||
|  | 	super Sequence[E] | ||||||
|  |  | ||||||
|  | 	# The first node of the list if any | ||||||
|  | 	# The special case of an empty list is handled by a null node | ||||||
|  | 	private var node: nullable CLNode[E] = null | ||||||
|  |  | ||||||
|  | 	redef fun iterator do return new CircularListIterator[E](self) | ||||||
|  |  | ||||||
|  | 	redef fun first do return self.node.item | ||||||
|  |  | ||||||
|  | 	redef fun push(e) | ||||||
|  | 	do | ||||||
|  | 		var new_node = new CLNode[E](e) | ||||||
|  | 		var n = self.node | ||||||
|  | 		if n == null then | ||||||
|  | 			# the first node | ||||||
|  | 			self.node = new_node | ||||||
|  | 		else | ||||||
|  | 			# not the first one, so attach nodes correctly. | ||||||
|  | 			var old_last_node = n.prev | ||||||
|  | 			new_node.next = n | ||||||
|  | 			new_node.prev = old_last_node | ||||||
|  | 			old_last_node.next = new_node | ||||||
|  | 			n.prev = new_node | ||||||
|  | 		end | ||||||
|  | 	end | ||||||
|  |  | ||||||
|  | 	redef fun pop | ||||||
|  | 	do | ||||||
|  | 		var n = self.node | ||||||
|  | 		assert n != null | ||||||
|  | 		var prev = n.prev | ||||||
|  | 		if prev == n then | ||||||
|  | 			# the only node | ||||||
|  | 			self.node = null | ||||||
|  | 			return n.item | ||||||
|  | 		end | ||||||
|  | 		# not the only one do detach nodes correctly. | ||||||
|  | 		var prev_prev = prev.prev | ||||||
|  | 		n.prev = prev_prev | ||||||
|  | 		prev_prev.next = n | ||||||
|  | 		return prev.item | ||||||
|  | 	end | ||||||
|  |  | ||||||
|  | 	redef fun unshift(e) | ||||||
|  | 	do | ||||||
|  | 		# Circularity has benefits. | ||||||
|  | 		push(e) | ||||||
|  | 		self.node = self.node.prev | ||||||
|  | 	end | ||||||
|  |  | ||||||
|  | 	redef fun shift | ||||||
|  | 	do | ||||||
|  | 		# Circularity has benefits. | ||||||
|  | 		self.node = self.node.next | ||||||
|  | 		return self.pop | ||||||
|  | 	end | ||||||
|  |  | ||||||
|  | 	# Move the first at the last position, the second at the first, etc. | ||||||
|  | 	fun rotate | ||||||
|  | 	do | ||||||
|  | 		var n = self.node | ||||||
|  | 		if n == null then return | ||||||
|  | 		self.node = n.next | ||||||
|  | 	end | ||||||
|  |  | ||||||
|  | 	# Sort the list using the Josephus algorithm. | ||||||
|  | 	fun josephus(step: Int) | ||||||
|  | 	do | ||||||
|  | 		var res = new CircularList[E] | ||||||
|  | 		while not self.is_empty do | ||||||
|  | 			# count 'step' | ||||||
|  | 			for i in [1..step[ do self.rotate | ||||||
|  | 			# kill | ||||||
|  | 			var x = self.shift | ||||||
|  | 			res.add(x) | ||||||
|  | 		end | ||||||
|  | 		self.node = res.node | ||||||
|  | 	end | ||||||
|  | end | ||||||
|  |  | ||||||
|  | # Nodes of a CircularList | ||||||
|  | private class CLNode[E] | ||||||
|  | 	# The current item | ||||||
|  | 	var item: E | ||||||
|  |  | ||||||
|  | 	# The next item in the circular list. | ||||||
|  | 	# Because of circularity, there is always a next; | ||||||
|  | 	# so by default let it be self | ||||||
|  | 	var next: CLNode[E] = self | ||||||
|  |  | ||||||
|  | 	# The previous item in the circular list. | ||||||
|  | 	# Coherence between next and previous nodes has to be maintained by the | ||||||
|  | 	# circular list. | ||||||
|  | 	var prev: CLNode[E] = self | ||||||
|  | end | ||||||
|  |  | ||||||
|  | # An iterator of a CircularList. | ||||||
|  | private class CircularListIterator[E] | ||||||
|  | 	super IndexedIterator[E] | ||||||
|  |  | ||||||
|  | 	redef var index: Int | ||||||
|  |  | ||||||
|  | 	# The current node pointed. | ||||||
|  | 	# Is null if the list is empty. | ||||||
|  | 	var node: nullable CLNode[E] | ||||||
|  |  | ||||||
|  | 	# The list iterated. | ||||||
|  | 	var list: CircularList[E] | ||||||
|  |  | ||||||
|  | 	redef fun is_ok | ||||||
|  | 	do | ||||||
|  | 		# Empty lists are not OK. | ||||||
|  | 		# Pointing again the first node is not OK. | ||||||
|  | 		return self.node != null and (self.index == 0 or self.node != self.list.node) | ||||||
|  | 	end | ||||||
|  |  | ||||||
|  | 	redef fun next | ||||||
|  | 	do | ||||||
|  | 		self.node = self.node.next | ||||||
|  | 		self.index += 1 | ||||||
|  | 	end | ||||||
|  |  | ||||||
|  | 	redef fun item do return self.node.item | ||||||
|  |  | ||||||
|  | 	init(list: CircularList[E]) | ||||||
|  | 	do | ||||||
|  | 		self.node = list.node | ||||||
|  | 		self.list = list | ||||||
|  | 		self.index = 0 | ||||||
|  | 	end | ||||||
|  | end | ||||||
|  |  | ||||||
|  | var i = new CircularList[Int] | ||||||
|  | i.add_all([1, 2, 3, 4, 5, 6, 7]) | ||||||
|  | print i.first | ||||||
|  | print i.join(":") | ||||||
|  |  | ||||||
|  | i.push(8) | ||||||
|  | print i.shift | ||||||
|  | print i.pop | ||||||
|  | i.unshift(0) | ||||||
|  | print i.join(":") | ||||||
|  |  | ||||||
|  | i.josephus(3) | ||||||
|  | print i.join(":") | ||||||
							
								
								
									
										78
									
								
								samples/Nit/clock.nit
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								samples/Nit/clock.nit
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,78 @@ | |||||||
|  | # This file is part of NIT ( http://www.nitlanguage.org ). | ||||||
|  | # | ||||||
|  | # Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | # you may not use this file except in compliance with the License. | ||||||
|  | # You may obtain a copy of the License at | ||||||
|  | # | ||||||
|  | #     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | # | ||||||
|  | # Unless required by applicable law or agreed to in writing, software | ||||||
|  | # distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | # See the License for the specific language governing permissions and | ||||||
|  | # limitations under the License. | ||||||
|  |  | ||||||
|  | # This module provide a simple wall clock. | ||||||
|  | # It is an example of getters and setters. | ||||||
|  | # A beefed-up module is available in clock_more | ||||||
|  | module clock | ||||||
|  |  | ||||||
|  | # A simple wall clock with 60 minutes and 12 hours. | ||||||
|  | class Clock | ||||||
|  | 	# total number of minutes from 0 to 719 | ||||||
|  | 	var total_minutes: Int | ||||||
|  | 	# Note: only the read acces is public, the write access is private. | ||||||
|  |  | ||||||
|  | 	# number of minutes in the current hour (from 0 to 59) | ||||||
|  | 	fun minutes: Int do return self.total_minutes % 60 | ||||||
|  | 	 | ||||||
|  | 	# set the number of minutes in the current hour. | ||||||
|  | 	# if m < 0 or m >= 60, the hour will be changed accordinlgy | ||||||
|  | 	fun minutes=(m: Int) do self.total_minutes = self.hours * 60 + m | ||||||
|  |  | ||||||
|  | 	# number of hours (from 0 to 11) | ||||||
|  | 	fun hours: Int do return self.total_minutes / 60 | ||||||
|  |  | ||||||
|  | 	# set the number of hours | ||||||
|  | 	# the minutes will not be updated | ||||||
|  | 	fun hours=(h: Int) do self.total_minutes = h * 60 + minutes | ||||||
|  |  | ||||||
|  | 	# the position of the hour arrow in the [0..60[ interval | ||||||
|  | 	fun hour_pos: Int do return total_minutes / 12 | ||||||
|  |  | ||||||
|  | 	# replace the arrow of hours (from 0 to 59). | ||||||
|  | 	# the hours and the minutes will be updated. | ||||||
|  | 	fun hour_pos=(h: Int) do self.total_minutes = h * 12 | ||||||
|  |  | ||||||
|  | 	redef fun to_s do return "{hours}:{minutes}" | ||||||
|  |  | ||||||
|  | 	fun reset(hours, minutes: Int) do self.total_minutes = hours*60 + minutes | ||||||
|  |  | ||||||
|  | 	init(hours, minutes: Int) do self.reset(hours, minutes) | ||||||
|  |  | ||||||
|  | 	redef fun ==(o) | ||||||
|  | 	do | ||||||
|  | 		# Note: o is a nullable Object, a type test is required | ||||||
|  | 		# Thanks to adaptive typing, there is no downcast | ||||||
|  | 		# i.e. the code is safe! | ||||||
|  | 		return o isa Clock and self.total_minutes == o.total_minutes | ||||||
|  | 	end | ||||||
|  | end | ||||||
|  |  | ||||||
|  | var c = new Clock(10,50) | ||||||
|  | print "It's {c} o'clock." | ||||||
|  |  | ||||||
|  | c.minutes += 22 | ||||||
|  | print "Now it's {c} o'clock." | ||||||
|  |  | ||||||
|  | print "The short arrow in on the {c.hour_pos/5} and the long arrow in on the {c.minutes/5}." | ||||||
|  |  | ||||||
|  | c.hours -= 2 | ||||||
|  | print "Now it's {c} o'clock." | ||||||
|  |  | ||||||
|  | var c2 = new Clock(9, 11) | ||||||
|  | print "It's {c2} on the second clock." | ||||||
|  | print "The two clocks are synchronized: {c == c2}." | ||||||
|  | c2.minutes += 1 | ||||||
|  | print "It's now {c2} on the second clock." | ||||||
|  | print "The two clocks are synchronized: {c == c2}." | ||||||
							
								
								
									
										60
									
								
								samples/Nit/clock_more.nit
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								samples/Nit/clock_more.nit
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,60 @@ | |||||||
|  | # This file is part of NIT ( http://www.nitlanguage.org ). | ||||||
|  | # | ||||||
|  | # Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | # you may not use this file except in compliance with the License. | ||||||
|  | # You may obtain a copy of the License at | ||||||
|  | # | ||||||
|  | #     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | # | ||||||
|  | # Unless required by applicable law or agreed to in writing, software | ||||||
|  | # distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | # See the License for the specific language governing permissions and | ||||||
|  | # limitations under the License. | ||||||
|  |  | ||||||
|  | # This module beef up the clock module by allowing a clock to be comparable. | ||||||
|  | # It show the usage of class refinement | ||||||
|  | module clock_more | ||||||
|  |  | ||||||
|  | import clock | ||||||
|  |  | ||||||
|  | redef class Clock | ||||||
|  | 	# Clock are now comparable | ||||||
|  | 	super Comparable | ||||||
|  |  | ||||||
|  | 	# Comparaison of a clock make only sense with an other clock | ||||||
|  | 	redef type OTHER: Clock | ||||||
|  |  | ||||||
|  | 	redef fun <(o) | ||||||
|  | 	do | ||||||
|  | 		# Note: < is the only abstract method of Comparable. | ||||||
|  | 		#       All other operators and methods rely on < and ==. | ||||||
|  | 		return self.total_minutes < o.total_minutes | ||||||
|  | 	end | ||||||
|  | end | ||||||
|  |  | ||||||
|  | var c1 = new Clock(8, 12) | ||||||
|  | var c2 = new Clock(8, 13) | ||||||
|  | var c3 = new Clock(9, 13) | ||||||
|  |  | ||||||
|  | print "{c1}<{c2}? {c1<c2}" | ||||||
|  | print "{c1}<={c2}? {c1<=c2}" | ||||||
|  | print "{c1}>{c2}? {c1>c2}" | ||||||
|  | print "{c1}>={c2}? {c1>=c2}" | ||||||
|  | print "{c1}<=>{c2}? {c1<=>c2}" | ||||||
|  | print "{c1},{c2}? max={c1.max(c2)} min={c1.min(c2)}" | ||||||
|  | print "{c1}.is_between({c2}, {c3})? {c1.is_between(c2, c3)}" | ||||||
|  | print "{c2}.is_between({c1}, {c3})? {c2.is_between(c1, c3)}" | ||||||
|  |  | ||||||
|  | print "-" | ||||||
|  |  | ||||||
|  | c1.minutes += 1 | ||||||
|  |  | ||||||
|  | print "{c1}<{c2}? {c1<c2}" | ||||||
|  | print "{c1}<={c2}? {c1<=c2}" | ||||||
|  | print "{c1}>{c2}? {c1>c2}" | ||||||
|  | print "{c1}>={c2}? {c1>=c2}" | ||||||
|  | print "{c1}<=>{c2}? {c1<=>c2}" | ||||||
|  | print "{c1},{c2}? max={c1.max(c2)} min={c1.min(c2)}" | ||||||
|  | print "{c1}.is_between({c2}, {c3})? {c1.is_between(c2, c3)}" | ||||||
|  | print "{c2}.is_between({c1}, {c3})? {c2.is_between(c1, c3)}" | ||||||
							
								
								
									
										113
									
								
								samples/Nit/curl_http.nit
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										113
									
								
								samples/Nit/curl_http.nit
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,113 @@ | |||||||
|  | # This file is part of NIT ( http://www.nitlanguage.org ). | ||||||
|  | # | ||||||
|  | # Copyright 2013 Matthieu Lucas <lucasmatthieu@gmail.com> | ||||||
|  | # | ||||||
|  | # Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | # you may not use this file except in compliance with the License. | ||||||
|  | # You may obtain a copy of the License at | ||||||
|  | # | ||||||
|  | #     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | # | ||||||
|  | # Unless required by applicable law or agreed to in writing, software | ||||||
|  | # distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | # See the License for the specific language governing permissions and | ||||||
|  | # limitations under the License. | ||||||
|  |  | ||||||
|  | # Sample of the Curl module. | ||||||
|  | module curl_http | ||||||
|  |  | ||||||
|  | import curl | ||||||
|  |  | ||||||
|  | # Small class to represent an Http Fetcher | ||||||
|  | class MyHttpFetcher | ||||||
|  | 	super CurlCallbacks | ||||||
|  |  | ||||||
|  | 	var curl: Curl | ||||||
|  | 	var our_body: String = "" | ||||||
|  |  | ||||||
|  | 	init(curl: Curl) do self.curl = curl | ||||||
|  |  | ||||||
|  | 	# Release curl object | ||||||
|  | 	fun destroy do self.curl.destroy | ||||||
|  |  | ||||||
|  | 	# Header callback | ||||||
|  | 	redef fun header_callback(line: String) do | ||||||
|  | 		# We keep this callback silent for testing purposes | ||||||
|  | 		#if not line.has_prefix("Date:") then print "Header_callback : {line}" | ||||||
|  | 	end | ||||||
|  |  | ||||||
|  | 	# Body callback | ||||||
|  | 	redef fun body_callback(line: String) do self.our_body = "{self.our_body}{line}" | ||||||
|  |  | ||||||
|  | 	# Stream callback - Cf : No one is registered | ||||||
|  | 	redef fun stream_callback(buffer: String, size: Int, count: Int) do print "Stream_callback : {buffer} - {size} - {count}" | ||||||
|  | end | ||||||
|  |  | ||||||
|  |  | ||||||
|  | # Program | ||||||
|  | if args.length < 2 then | ||||||
|  | 	print "Usage: curl_http <method wished [POST, GET, GET_FILE]> <target url>" | ||||||
|  | else | ||||||
|  | 	var curl = new Curl | ||||||
|  | 	var url = args[1] | ||||||
|  | 	var request = new CurlHTTPRequest(url, curl) | ||||||
|  |  | ||||||
|  | 	# HTTP Get Request | ||||||
|  | 	if args[0] == "GET" then | ||||||
|  | 		request.verbose = false | ||||||
|  | 		var getResponse = request.execute | ||||||
|  |  | ||||||
|  | 		if getResponse isa CurlResponseSuccess then | ||||||
|  | 			print "Status code : {getResponse.status_code}" | ||||||
|  | 			print "Body : {getResponse.body_str}" | ||||||
|  | 		else if getResponse isa CurlResponseFailed then | ||||||
|  | 			print "Error code : {getResponse.error_code}" | ||||||
|  | 			print "Error msg : {getResponse.error_msg}" | ||||||
|  | 		end | ||||||
|  |  | ||||||
|  | 	# HTTP Post Request | ||||||
|  | 	else if args[0] == "POST" then | ||||||
|  | 		var myHttpFetcher = new MyHttpFetcher(curl) | ||||||
|  | 		request.delegate = myHttpFetcher | ||||||
|  |  | ||||||
|  | 		var postDatas = new HeaderMap | ||||||
|  | 		postDatas["Bugs Bunny"] = "Daffy Duck" | ||||||
|  | 		postDatas["Batman"] = "Robin likes special characters @#ùà!è§'(\"é&://,;<>∞~*" | ||||||
|  | 		postDatas["Batman"] = "Yes you can set multiple identical keys, but APACHE will consider only once, the last one" | ||||||
|  | 		request.datas = postDatas | ||||||
|  | 		request.verbose = false | ||||||
|  | 		var postResponse = request.execute | ||||||
|  |  | ||||||
|  | 		print "Our body from the callback : {myHttpFetcher.our_body}" | ||||||
|  |  | ||||||
|  | 		if postResponse isa CurlResponseSuccess then | ||||||
|  | 			print "*** Answer ***" | ||||||
|  | 			print "Status code : {postResponse.status_code}" | ||||||
|  | 			print "Body should be empty, because we decided to manage callbacks : {postResponse.body_str.length}" | ||||||
|  | 		else if postResponse isa CurlResponseFailed then | ||||||
|  | 			print "Error code : {postResponse.error_code}" | ||||||
|  | 			print "Error msg : {postResponse.error_msg}" | ||||||
|  | 		end | ||||||
|  |  | ||||||
|  | 	# HTTP Get to file Request | ||||||
|  | 	else if args[0] == "GET_FILE" then | ||||||
|  | 		var headers = new HeaderMap | ||||||
|  | 		headers["Accept"] = "Moo" | ||||||
|  | 		request.headers = headers | ||||||
|  | 		request.verbose = false | ||||||
|  | 		var downloadResponse = request.download_to_file(null) | ||||||
|  |  | ||||||
|  | 		if downloadResponse isa CurlFileResponseSuccess then | ||||||
|  | 			print "*** Answer ***" | ||||||
|  | 			print "Status code : {downloadResponse.status_code}" | ||||||
|  | 			print "Size downloaded : {downloadResponse.size_download}" | ||||||
|  | 		else if downloadResponse isa CurlResponseFailed then | ||||||
|  | 			print "Error code : {downloadResponse.error_code}" | ||||||
|  | 			print "Error msg : {downloadResponse.error_msg}" | ||||||
|  | 		end | ||||||
|  | 	# Program logic | ||||||
|  | 	else | ||||||
|  | 		print "Usage : Method[POST, GET, GET_FILE]" | ||||||
|  | 	end | ||||||
|  | end | ||||||
							
								
								
									
										59
									
								
								samples/Nit/curl_mail.nit
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								samples/Nit/curl_mail.nit
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,59 @@ | |||||||
|  | # This file is part of NIT ( http://www.nitlanguage.org ). | ||||||
|  | # | ||||||
|  | # Copyright 2013 Matthieu Lucas <lucasmatthieu@gmail.com> | ||||||
|  | # | ||||||
|  | # Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | # you may not use this file except in compliance with the License. | ||||||
|  | # You may obtain a copy of the License at | ||||||
|  | # | ||||||
|  | #     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | # | ||||||
|  | # Unless required by applicable law or agreed to in writing, software | ||||||
|  | # distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | # See the License for the specific language governing permissions and | ||||||
|  | # limitations under the License. | ||||||
|  |  | ||||||
|  | # Mail sender sample using the Curl module | ||||||
|  | module curl_mail | ||||||
|  |  | ||||||
|  | import curl | ||||||
|  |  | ||||||
|  | var curl = new Curl | ||||||
|  | var mail_request = new CurlMailRequest(curl) | ||||||
|  |  | ||||||
|  | # Networks | ||||||
|  | var response = mail_request.set_outgoing_server("smtps://smtp.example.org:465", "user@example.org", "mypassword") | ||||||
|  | if response isa CurlResponseFailed then | ||||||
|  | 	print "Error code : {response.error_code}" | ||||||
|  | 	print "Error msg : {response.error_msg}" | ||||||
|  | end | ||||||
|  |  | ||||||
|  | # Headers | ||||||
|  | mail_request.from = "Billy Bob" | ||||||
|  | mail_request.to = ["user@example.org"] | ||||||
|  | mail_request.cc = ["bob@example.org"] | ||||||
|  | mail_request.bcc = null | ||||||
|  |  | ||||||
|  | var headers_body = new HeaderMap | ||||||
|  | headers_body["Content-Type:"] = "text/html; charset=\"UTF-8\"" | ||||||
|  | headers_body["Content-Transfer-Encoding:"] = "quoted-printable" | ||||||
|  | mail_request.headers_body = headers_body | ||||||
|  |  | ||||||
|  | # Content | ||||||
|  | mail_request.body = "<h1>Here you can write HTML stuff.</h1>" | ||||||
|  | mail_request.subject = "Hello From My Nit Program" | ||||||
|  |  | ||||||
|  | # Others | ||||||
|  | mail_request.verbose = false | ||||||
|  |  | ||||||
|  | # Send mail | ||||||
|  | response = mail_request.execute | ||||||
|  | if response isa CurlResponseFailed then | ||||||
|  | 	print "Error code : {response.error_code}" | ||||||
|  | 	print "Error msg : {response.error_msg}" | ||||||
|  | else if response isa CurlMailResponseSuccess then | ||||||
|  | 	print "Mail Sent" | ||||||
|  | else | ||||||
|  | 	print "Unknown Curl Response type" | ||||||
|  | end | ||||||
							
								
								
									
										243
									
								
								samples/Nit/draw_operation.nit
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										243
									
								
								samples/Nit/draw_operation.nit
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,243 @@ | |||||||
|  | # This file is part of NIT ( http://www.nitlanguage.org ). | ||||||
|  | # | ||||||
|  | # Copyright 2012-2013 Alexis Laferrière <alexis.laf@xymus.net> | ||||||
|  | # | ||||||
|  | # Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | # you may not use this file except in compliance with the License. | ||||||
|  | # You may obtain a copy of the License at | ||||||
|  | # | ||||||
|  | #     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | # | ||||||
|  | # Unless required by applicable law or agreed to in writing, software | ||||||
|  | # distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | # See the License for the specific language governing permissions and | ||||||
|  | # limitations under the License. | ||||||
|  |  | ||||||
|  | # Draws an arithmetic operation to the terminal | ||||||
|  | module draw_operation | ||||||
|  |  | ||||||
|  | redef enum Int | ||||||
|  | 	fun n_chars: Int `{ | ||||||
|  | 		int c; | ||||||
|  | 		if ( abs(recv) >= 10 ) | ||||||
|  | 			c = 1+(int)log10f( (float)abs(recv) ); | ||||||
|  | 		else | ||||||
|  | 			c = 1; | ||||||
|  | 		if ( recv < 0 ) c ++; | ||||||
|  | 		return c; | ||||||
|  | 	`} | ||||||
|  | end | ||||||
|  |  | ||||||
|  | redef enum Char | ||||||
|  | 	fun as_operator(a, b: Int): Int | ||||||
|  | 	do | ||||||
|  | 		if self == '+' then return a + b | ||||||
|  | 		if self == '-' then return a - b | ||||||
|  | 		if self == '*' then return a * b | ||||||
|  | 		if self == '/' then return a / b | ||||||
|  | 		if self == '%' then return a % b | ||||||
|  | 		abort | ||||||
|  | 	end | ||||||
|  |  | ||||||
|  | 	fun override_dispc: Bool | ||||||
|  | 	do | ||||||
|  | 		return self == '+' or self == '-' or self == '*' or self == '/' or self == '%' | ||||||
|  | 	end | ||||||
|  |  | ||||||
|  | 	fun lines(s: Int): Array[Line] | ||||||
|  | 	do | ||||||
|  | 		if self == '+' then | ||||||
|  | 			return [new Line(new P(0,s/2),1,0,s), new Line(new P(s/2,1),0,1,s-2)] | ||||||
|  | 		else if self == '-' then | ||||||
|  | 			return [new Line(new P(0,s/2),1,0,s)] | ||||||
|  | 		else if self == '*' then | ||||||
|  | 			var lines = new Array[Line] | ||||||
|  | 			for y in [1..s-1[ do | ||||||
|  | 				lines.add( new Line(new P(1,y), 1,0,s-2) ) | ||||||
|  | 			end | ||||||
|  | 			return lines | ||||||
|  | 		else if self == '/' then | ||||||
|  | 			return [new Line(new P(s-1,0), -1,1, s )] | ||||||
|  | 		else if self == '%' then | ||||||
|  | 			var q4 = s/4 | ||||||
|  | 			var lines = [new Line(new P(s-1,0),-1,1,s)] | ||||||
|  | 			for l in [0..q4[ do | ||||||
|  | 				lines.append([ new Line( new P(0,l), 1,0,q4), new Line( new P(s-1,s-1-l), -1,0,q4) ]) | ||||||
|  | 			end | ||||||
|  | 			return lines | ||||||
|  | 		else if self == '1' then | ||||||
|  | 			return [new Line(new P(s/2,0), 0,1,s),new Line(new P(0,s-1),1,0,s), | ||||||
|  | 				new Line( new P(s/2,0),-1,1,s/2)] | ||||||
|  | 		else if self == '2' then | ||||||
|  | 			return [new Line(new P(0,0), 1,0,s),new Line(new P(s-1,0),0,1,s/2), | ||||||
|  | 				new Line( new P(0,s-1),1,0,s), new Line( new P(0,s/2), 0,1,s/2), | ||||||
|  | 				new Line( new P(0,s/2), 1,0,s)] | ||||||
|  | 		else if self == '3' then | ||||||
|  | 			return [new Line(new P(0,0), 1,0,s),new Line(new P(s-1,0),0,1,s), | ||||||
|  | 				new Line( new P(0,s-1),1,0,s), new Line( new P(0,s/2), 1,0,s)] | ||||||
|  | 		else if self == '4' then | ||||||
|  | 			return [new Line(new P(s-1,0),0,1,s), new Line( new P(0,0), 0,1,s/2), | ||||||
|  | 				new Line( new P(0,s/2), 1,0,s)] | ||||||
|  | 		else if self == '5' then | ||||||
|  | 			return [new Line(new P(0,0), 1,0,s),new Line(new P(s-1,s/2),0,1,s/2), | ||||||
|  | 				new Line( new P(0,s-1),1,0,s), new Line( new P(0,0), 0,1,s/2), | ||||||
|  | 				new Line( new P(0,s/2), 1,0,s)] | ||||||
|  | 		else if self == '6' then | ||||||
|  | 			return [new Line(new P(0,0), 1,0,s),new Line(new P(s-1,s/2),0,1,s/2), | ||||||
|  | 				new Line( new P(0,s-1),1,0,s), new Line( new P(0,0), 0,1,s), | ||||||
|  | 				new Line( new P(0,s/2), 1,0,s)] | ||||||
|  | 		else if self == '7' then | ||||||
|  | 			var tl = new P(0,0) | ||||||
|  | 			var tr = new P(s-1,0) | ||||||
|  | 			return [new Line(tl, 1,0,s), new Line(tr,-1,1,s)] | ||||||
|  | 		else if self == '8' then | ||||||
|  | 			return [new Line(new P(0,0), 1,0,s),new Line(new P(s-1,0),0,1,s), | ||||||
|  | 				new Line( new P(0,s-1),1,0,s), new Line( new P(0,0), 0,1,s), | ||||||
|  | 				new Line( new P(0,s/2), 1,0,s)] | ||||||
|  | 		else if self == '9' then | ||||||
|  | 			return [new Line(new P(0,0), 1,0,s),new Line(new P(s-1,0),0,1,s), | ||||||
|  | 				new Line( new P(0,s-1),1,0,s), new Line( new P(0,0), 0,1,s/2), | ||||||
|  | 				new Line( new P(0,s/2), 1,0,s)] | ||||||
|  | 		else if self == '0' then | ||||||
|  | 			return [new Line(new P(0,0), 1,0,s),new Line(new P(s-1,0),0,1,s), | ||||||
|  | 				new Line( new P(0,s-1),1,0,s), new Line( new P(0,0), 0,1,s)] | ||||||
|  | 		end | ||||||
|  | 		return new Array[Line] | ||||||
|  | 	end | ||||||
|  | end | ||||||
|  |  | ||||||
|  | class P | ||||||
|  | 	var x : Int | ||||||
|  | 	var y : Int | ||||||
|  | end | ||||||
|  |  | ||||||
|  | redef class String | ||||||
|  | 	# hack is to support a bug in the evaluation software | ||||||
|  | 	fun draw(dispc: Char, size, gap: Int, hack: Bool) | ||||||
|  | 	do | ||||||
|  | 		var w = size * length +(length-1)*gap | ||||||
|  | 		var h = size | ||||||
|  | 		var map = new Array[Array[Char]] | ||||||
|  | 		for x in [0..w[ do | ||||||
|  | 			map[x] = new Array[Char].filled_with( ' ',  h ) | ||||||
|  | 		end | ||||||
|  |  | ||||||
|  | 		var ci = 0 | ||||||
|  | 		for c in self.chars do | ||||||
|  | 			var local_dispc | ||||||
|  | 			if c.override_dispc then | ||||||
|  | 				local_dispc = c | ||||||
|  | 			else | ||||||
|  | 				local_dispc = dispc | ||||||
|  | 			end | ||||||
|  |  | ||||||
|  | 			var lines = c.lines( size ) | ||||||
|  | 			for line in lines do | ||||||
|  | 				var x = line.o.x+ci*size | ||||||
|  | 					x += ci*gap | ||||||
|  | 				var y = line.o.y | ||||||
|  | 				for s in [0..line.len[ do | ||||||
|  | 					assert map.length > x and map[x].length > y else print "setting {x},{y} as {local_dispc}" | ||||||
|  | 					map[x][y] = local_dispc | ||||||
|  | 					x += line.step_x | ||||||
|  | 					y += line.step_y | ||||||
|  | 				end | ||||||
|  | 			end | ||||||
|  |  | ||||||
|  | 			ci += 1 | ||||||
|  | 		end | ||||||
|  |  | ||||||
|  | 		if hack then | ||||||
|  | 			for c in [0..size[ do | ||||||
|  | 				map[c][0] = map[map.length-size+c][0] | ||||||
|  | 				map[map.length-size+c][0] = ' ' | ||||||
|  | 			end | ||||||
|  | 		end | ||||||
|  |  | ||||||
|  | 		for y in [0..h[ do | ||||||
|  | 			for x in [0..w[ do | ||||||
|  | 				printn map[x][y] | ||||||
|  | 			end | ||||||
|  | 			print "" | ||||||
|  | 		end | ||||||
|  | 	end | ||||||
|  | end | ||||||
|  |  | ||||||
|  | class Line | ||||||
|  | 	var o : P | ||||||
|  | 	var step_x : Int | ||||||
|  | 	var step_y : Int | ||||||
|  | 	var len : Int | ||||||
|  | end | ||||||
|  |  | ||||||
|  | var a | ||||||
|  | var b | ||||||
|  | var op_char | ||||||
|  | var disp_char | ||||||
|  | var disp_size | ||||||
|  | var disp_gap | ||||||
|  |  | ||||||
|  | if "NIT_TESTING".environ == "true" then | ||||||
|  | 	a = 567 | ||||||
|  | 	b = 13 | ||||||
|  | 	op_char = '*' | ||||||
|  | 	disp_char = 'O' | ||||||
|  | 	disp_size = 8 | ||||||
|  | 	disp_gap = 1 | ||||||
|  | else | ||||||
|  | 	printn "Left operand: " | ||||||
|  | 	a = gets.to_i | ||||||
|  |  | ||||||
|  | 	printn "Right operand: " | ||||||
|  | 	b = gets.to_i | ||||||
|  |  | ||||||
|  | 	printn "Operator (+, -, *, /, %): " | ||||||
|  | 	op_char = gets.chars[0] | ||||||
|  |  | ||||||
|  | 	printn "Char to display: " | ||||||
|  | 	disp_char = gets.chars[0] | ||||||
|  |  | ||||||
|  | 	printn "Size of text: " | ||||||
|  | 	disp_size = gets.to_i | ||||||
|  |  | ||||||
|  | 	printn "Space between digits: " | ||||||
|  | 	disp_gap = gets.to_i | ||||||
|  | end | ||||||
|  |  | ||||||
|  | var result = op_char.as_operator( a, b ) | ||||||
|  |  | ||||||
|  | var len_a = a.n_chars | ||||||
|  | var len_b = b.n_chars | ||||||
|  | var len_res = result.n_chars | ||||||
|  | var max_len = len_a.max( len_b.max( len_res ) ) + 1 | ||||||
|  |  | ||||||
|  | # draw first line | ||||||
|  | var d = max_len - len_a | ||||||
|  | var line_a = "" | ||||||
|  | for i in [0..d[ do line_a += " " | ||||||
|  | line_a += a.to_s | ||||||
|  | line_a.draw( disp_char, disp_size, disp_gap, false ) | ||||||
|  |  | ||||||
|  | print "" | ||||||
|  | # draw second line | ||||||
|  | d = max_len - len_b-1 | ||||||
|  | var line_b = op_char.to_s | ||||||
|  | for i in [0..d[ do line_b += " " | ||||||
|  | line_b += b.to_s | ||||||
|  | line_b.draw( disp_char, disp_size, disp_gap, false ) | ||||||
|  |  | ||||||
|  | # draw ----- | ||||||
|  | print "" | ||||||
|  | for i in [0..disp_size*max_len+(max_len-1)*disp_gap] do | ||||||
|  | 	printn "_" | ||||||
|  | end | ||||||
|  | print "" | ||||||
|  | print "" | ||||||
|  |  | ||||||
|  | # draw result | ||||||
|  | d = max_len - len_res | ||||||
|  | var line_res = "" | ||||||
|  | for i in [0..d[ do line_res += " " | ||||||
|  | line_res += result.to_s | ||||||
|  | line_res.draw( disp_char, disp_size, disp_gap, false ) | ||||||
							
								
								
									
										46
									
								
								samples/Nit/drop_privileges.nit
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								samples/Nit/drop_privileges.nit
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,46 @@ | |||||||
|  | # This file is part of NIT ( http://www.nitlanguage.org ). | ||||||
|  | # | ||||||
|  | # Copyright 2013 Alexis Laferrière <alexis.laf@xymus.net> | ||||||
|  | # | ||||||
|  | # Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | # you may not use this file except in compliance with the License. | ||||||
|  | # You may obtain a copy of the License at | ||||||
|  | # | ||||||
|  | #     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | # | ||||||
|  | # Unless required by applicable law or agreed to in writing, software | ||||||
|  | # distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | # See the License for the specific language governing permissions and | ||||||
|  | # limitations under the License. | ||||||
|  |  | ||||||
|  | # Example using the privileges module to drop privileges from root | ||||||
|  | module drop_privileges | ||||||
|  |  | ||||||
|  | import privileges | ||||||
|  |  | ||||||
|  | # basic command line options | ||||||
|  | var opts = new OptionContext | ||||||
|  | var opt_ug = new OptionUserAndGroup.for_dropping_privileges | ||||||
|  | opt_ug.mandatory = true | ||||||
|  | opts.add_option(opt_ug) | ||||||
|  |  | ||||||
|  | # parse and check command line options | ||||||
|  | opts.parse(args) | ||||||
|  | if not opts.errors.is_empty then | ||||||
|  | 	print opts.errors | ||||||
|  | 	print "Usage: drop_privileges [options]" | ||||||
|  | 	opts.usage | ||||||
|  | 	exit 1 | ||||||
|  | end | ||||||
|  |  | ||||||
|  | # original user | ||||||
|  | print "before {sys.uid}:{sys.gid}" | ||||||
|  |  | ||||||
|  | # make the switch | ||||||
|  | var user_group = opt_ug.value | ||||||
|  | assert user_group != null | ||||||
|  | user_group.drop_privileges | ||||||
|  |  | ||||||
|  | # final user | ||||||
|  | print "after {sys.uid}:{sys.egid}" | ||||||
							
								
								
									
										69
									
								
								samples/Nit/extern_methods.nit
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								samples/Nit/extern_methods.nit
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,69 @@ | |||||||
|  | # This file is part of NIT ( http://www.nitlanguage.org ). | ||||||
|  | # | ||||||
|  | # Copyright 2012-2013 Alexis Laferrière <alexis.laf@xymus.net> | ||||||
|  | # | ||||||
|  | # Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | # you may not use this file except in compliance with the License. | ||||||
|  | # You may obtain a copy of the License at | ||||||
|  | # | ||||||
|  | #     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | # | ||||||
|  | # Unless required by applicable law or agreed to in writing, software | ||||||
|  | # distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | # See the License for the specific language governing permissions and | ||||||
|  | # limitations under the License. | ||||||
|  |  | ||||||
|  | # This module illustrates some uses of the FFI, specifically | ||||||
|  | # how to use extern methods. Which means to implement a Nit method in C. | ||||||
|  | module extern_methods | ||||||
|  |  | ||||||
|  | redef enum Int | ||||||
|  | 	# Returns self'th fibonnaci number | ||||||
|  | 	# implemented here in C for optimization purposes | ||||||
|  | 	fun fib : Int import fib `{ | ||||||
|  | 		if ( recv < 2 ) | ||||||
|  | 			return recv; | ||||||
|  | 		else | ||||||
|  | 			return Int_fib( recv-1 ) + Int_fib( recv-2 ); | ||||||
|  | 	`} | ||||||
|  |  | ||||||
|  | 	# System call to sleep for "self" seconds | ||||||
|  | 	fun sleep `{ | ||||||
|  | 		sleep( recv ); | ||||||
|  | 	`} | ||||||
|  |  | ||||||
|  | 	# Return atan2l( self, x ) from libmath | ||||||
|  | 	fun atan_with( x : Int ) : Float `{ | ||||||
|  | 		return atan2( recv, x ); | ||||||
|  | 	`} | ||||||
|  |  | ||||||
|  | 	# This method callback to Nit methods from C code | ||||||
|  | 	# It will use from C code: | ||||||
|  | 	# * the local fib method | ||||||
|  | 	# * the + operator, a method of Int | ||||||
|  | 	# * to_s, a method of all objects | ||||||
|  | 	# * String.to_cstring, a method of String to return an equivalent char* | ||||||
|  | 	fun foo import fib, +, to_s, String.to_cstring `{ | ||||||
|  | 		long recv_fib = Int_fib( recv ); | ||||||
|  | 		long recv_plus_fib = Int__plus( recv, recv_fib ); | ||||||
|  |  | ||||||
|  | 		String nit_string = Int_to_s( recv_plus_fib ); | ||||||
|  | 		char *c_string = String_to_cstring( nit_string ); | ||||||
|  |  | ||||||
|  | 		printf( "from C: self + fib(self) = %s\n", c_string ); | ||||||
|  | 	`} | ||||||
|  |  | ||||||
|  | 	# Equivalent to foo but written in pure Nit | ||||||
|  | 	fun bar do print "from Nit: self + fib(self) = {self+self.fib}" | ||||||
|  | end | ||||||
|  |  | ||||||
|  | print 12.fib | ||||||
|  |  | ||||||
|  | print "sleeping 1 second..." | ||||||
|  | 1.sleep | ||||||
|  |  | ||||||
|  | print 100.atan_with( 200 ) | ||||||
|  | 8.foo | ||||||
|  | 8.bar | ||||||
|  |  | ||||||
							
								
								
									
										43
									
								
								samples/Nit/fibonacci.nit
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								samples/Nit/fibonacci.nit
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,43 @@ | |||||||
|  | # This file is part of NIT ( http://www.nitlanguage.org ). | ||||||
|  | # | ||||||
|  | # Copyright 2004-2008 Jean Privat <jean@pryen.org> | ||||||
|  | # | ||||||
|  | # Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | # you may not use this file except in compliance with the License. | ||||||
|  | # You may obtain a copy of the License at | ||||||
|  | # | ||||||
|  | #     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | # | ||||||
|  | # Unless required by applicable law or agreed to in writing, software | ||||||
|  | # distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | # See the License for the specific language governing permissions and | ||||||
|  | # limitations under the License. | ||||||
|  |  | ||||||
|  | # A simple exemple of refinement where a method is added to the integer class. | ||||||
|  | module fibonacci | ||||||
|  |  | ||||||
|  | redef class Int | ||||||
|  | 	# Calculate the self-th element of the fibonacci sequence. | ||||||
|  | 	fun fibonacci: Int | ||||||
|  | 	do | ||||||
|  | 		if self < 2 then | ||||||
|  | 			return 1 | ||||||
|  | 		else | ||||||
|  | 			return (self-2).fibonacci + (self-1).fibonacci | ||||||
|  | 		end | ||||||
|  | 	end  | ||||||
|  | end | ||||||
|  |  | ||||||
|  | # Print usage and exit. | ||||||
|  | fun usage | ||||||
|  | do | ||||||
|  | 	print "Usage: fibonnaci <integer>"  | ||||||
|  | 	exit 0  | ||||||
|  | end | ||||||
|  |  | ||||||
|  | # Main part | ||||||
|  | if args.length != 1 then | ||||||
|  | 	usage | ||||||
|  | end | ||||||
|  | print args.first.to_i.fibonacci | ||||||
							
								
								
									
										1
									
								
								samples/Nit/hello_world.nit
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								samples/Nit/hello_world.nit
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | |||||||
|  | print "hello world" | ||||||
							
								
								
									
										105
									
								
								samples/Nit/html_page.nit
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										105
									
								
								samples/Nit/html_page.nit
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,105 @@ | |||||||
|  | # This file is part of NIT ( http://www.nitlanguage.org ). | ||||||
|  | # | ||||||
|  | # Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | # you may not use this file except in compliance with the License. | ||||||
|  | # You may obtain a copy of the License at | ||||||
|  | # | ||||||
|  | #     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | # | ||||||
|  | # Unless required by applicable law or agreed to in writing, software | ||||||
|  | # distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | # See the License for the specific language governing permissions and | ||||||
|  | # limitations under the License. | ||||||
|  |  | ||||||
|  | import html | ||||||
|  |  | ||||||
|  | class NitHomepage | ||||||
|  | 	super HTMLPage | ||||||
|  |  | ||||||
|  | 	redef fun head do | ||||||
|  | 		add("meta").attr("charset", "utf-8") | ||||||
|  | 		add("title").text("Nit") | ||||||
|  | 		add("link").attr("rel", "icon").attr("href", "http://nitlanguage.org/favicon.ico").attr("type", "image/x-icon") | ||||||
|  | 		add("link").attr("rel", "stylesheet").attr("href", "http://nitlanguage.org/style.css").attr("type", "text/css") | ||||||
|  | 		add("link").attr("rel", "stylesheet").attr("href", "http://nitlanguage.org/local.css").attr("type", "text/css") | ||||||
|  | 	end | ||||||
|  |  | ||||||
|  | 	redef fun body do | ||||||
|  | 		open("article").add_class("page") | ||||||
|  | 			open("section").add_class("pageheader") | ||||||
|  | 				add_html("<a id='toptitle_first' class='toptitle'>the</a><a id='toptitle_second' class='toptitle' href=''>Nit</a><a id='toptitle_third' class='toptitle' href=''>Programming Language</a>") | ||||||
|  | 				open("header").add_class("header") | ||||||
|  | 					open("div").add_class("topsubtitle") | ||||||
|  | 						add("p").text("A Fun Language for Serious Programming") | ||||||
|  | 					close("div") | ||||||
|  | 				close("header") | ||||||
|  | 			close("section") | ||||||
|  |  | ||||||
|  | 			open("div").attr("id", "pagebody") | ||||||
|  | 				open("section").attr("id", "content") | ||||||
|  | 					add("h1").text("# What is Nit?") | ||||||
|  | 					add("p").text("Nit is an object-oriented programming language. The goal of Nit is to propose a robust statically typed programming language where structure is not a pain.") | ||||||
|  | 					add("p").text("So, what does the famous hello world program look like, in Nit?") | ||||||
|  | 					add_html("<pre><tt><span class='normal'>print </span><span class='string'>'Hello, World!'</span></tt></pre>") | ||||||
|  |  | ||||||
|  | 					add("h1").text("# Feature Highlights") | ||||||
|  | 					add("h2").text("Usability") | ||||||
|  | 					add("p").text("Nit's goal is to be usable by real programmers for real projects") | ||||||
|  |  | ||||||
|  | 					open("ul") | ||||||
|  | 						open("li") | ||||||
|  | 						add("a").attr("href", "http://en.wikipedia.org/wiki/KISS_principle").text("KISS principle") | ||||||
|  | 						close("li") | ||||||
|  | 						add("li").text("Script-like language without verbosity nor cryptic statements") | ||||||
|  | 						add("li").text("Painless static types: static typing should help programmers") | ||||||
|  | 						add("li").text("Efficient development, efficient execution, efficient evolution.") | ||||||
|  | 					close("ul") | ||||||
|  |  | ||||||
|  | 					add("h2").text("Robustness") | ||||||
|  | 					add("p").text("Nit will help you to write bug-free programs") | ||||||
|  |  | ||||||
|  | 					open("ul") | ||||||
|  | 						add("li").text("Strong static typing") | ||||||
|  | 						add("li").text("No more NullPointerException") | ||||||
|  | 					close("ul") | ||||||
|  |  | ||||||
|  | 					add("h2").text("Object-Oriented") | ||||||
|  | 					add("p").text("Nit's guideline is to follow the most powerful OO principles") | ||||||
|  |  | ||||||
|  | 					open("ul") | ||||||
|  | 						open("li") | ||||||
|  | 						add("a").attr("href", "./everything_is_an_object/").text("Everything is an object") | ||||||
|  | 						close("li") | ||||||
|  | 						open("li") | ||||||
|  | 						add("a").attr("href", "./multiple_inheritance/").text("Multiple inheritance") | ||||||
|  | 						close("li") | ||||||
|  | 						open("li") | ||||||
|  | 						add("a").attr("href", "./refinement/").text("Open classes") | ||||||
|  | 						close("li") | ||||||
|  | 						open("li") | ||||||
|  | 						add("a").attr("href", "./virtual_types/").text("Virtual types") | ||||||
|  | 						close("li") | ||||||
|  | 					close("ul") | ||||||
|  |  | ||||||
|  |  | ||||||
|  | 					add("h1").text("# Getting Started") | ||||||
|  | 					add("p").text("Get Nit from its Git repository:") | ||||||
|  |  | ||||||
|  | 					add_html("<pre><code>$ git clone http://nitlanguage.org/nit.git</code></pre>") | ||||||
|  | 					add("p").text("Build the compiler (may be long):") | ||||||
|  | 					add_html("<pre><code>$ cd nit\n") | ||||||
|  | 					add_html("$ make</code></pre>") | ||||||
|  | 					add("p").text("Compile a program:") | ||||||
|  | 					add_html("<pre><code>$ bin/nitc examples/hello_world.nit</code></pre>") | ||||||
|  | 					add("p").text("Execute the program:") | ||||||
|  | 					add_html("<pre><code>$ ./hello_world</code></pre>") | ||||||
|  | 				close("section") | ||||||
|  | 			close("div") | ||||||
|  | 		close("article") | ||||||
|  | 	end | ||||||
|  | end | ||||||
|  |  | ||||||
|  | var page = new NitHomepage | ||||||
|  | page.write_to stdout | ||||||
|  | page.write_to_file("nit.html") | ||||||
							
								
								
									
										100
									
								
								samples/Nit/int_stack.nit
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										100
									
								
								samples/Nit/int_stack.nit
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,100 @@ | |||||||
|  | # This file is part of NIT ( http://www.nitlanguage.org ). | ||||||
|  | # | ||||||
|  | # Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | # you may not use this file except in compliance with the License. | ||||||
|  | # You may obtain a copy of the License at | ||||||
|  | # | ||||||
|  | #     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | # | ||||||
|  | # Unless required by applicable law or agreed to in writing, software | ||||||
|  | # distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | # See the License for the specific language governing permissions and | ||||||
|  | # limitations under the License. | ||||||
|  |  | ||||||
|  | # An example that defines and uses stacks of integers. | ||||||
|  | # The implementation is done with a simple linked list. | ||||||
|  | # It features: free constructors, nullable types and some adaptive typing. | ||||||
|  | module int_stack | ||||||
|  |  | ||||||
|  | # A stack of integer implemented by a simple linked list. | ||||||
|  | # Note that this is only a toy class since a real linked list will gain to use | ||||||
|  | # generics and extends interfaces, like Collection, from the standard library. | ||||||
|  | class IntStack | ||||||
|  | 	# The head node of the list. | ||||||
|  | 	# Null means that the stack is empty. | ||||||
|  | 	private var head: nullable ISNode = null | ||||||
|  |  | ||||||
|  | 	# Add a new integer in the stack. | ||||||
|  | 	fun push(val: Int) | ||||||
|  | 	do | ||||||
|  | 		self.head = new ISNode(val, self.head) | ||||||
|  | 	end | ||||||
|  |  | ||||||
|  | 	# Remove and return the last pushed integer. | ||||||
|  | 	# Return null if the stack is empty. | ||||||
|  | 	fun pop: nullable Int | ||||||
|  | 	do | ||||||
|  | 		var head = self.head | ||||||
|  | 		if head == null then return null | ||||||
|  | 		# Note: the followings are statically safe because of the | ||||||
|  | 		# previous 'if'. | ||||||
|  | 		var val = head.val | ||||||
|  | 		self.head = head.next | ||||||
|  | 		return val | ||||||
|  | 	end | ||||||
|  |  | ||||||
|  | 	# Return the sum of all integers of the stack. | ||||||
|  | 	# Return 0 if the stack is empty. | ||||||
|  | 	fun sumall: Int | ||||||
|  | 	do | ||||||
|  | 		var sum = 0 | ||||||
|  | 		var cur = self.head | ||||||
|  | 		while cur != null do | ||||||
|  | 			# Note: the followings are statically safe because of | ||||||
|  | 			# the condition of the 'while'. | ||||||
|  | 			sum += cur.val | ||||||
|  | 			cur = cur.next | ||||||
|  | 		end | ||||||
|  | 		return sum | ||||||
|  | 	end | ||||||
|  |  | ||||||
|  | 	# Note: Because all attributes have a default value, a free constructor | ||||||
|  | 	# "init()" is implicitly defined. | ||||||
|  | end | ||||||
|  |  | ||||||
|  | # A node of a IntStack | ||||||
|  | private class ISNode | ||||||
|  | 	# The integer value stored in the node. | ||||||
|  | 	var val: Int | ||||||
|  |  | ||||||
|  | 	# The next node, if any. | ||||||
|  | 	var next: nullable ISNode | ||||||
|  |  | ||||||
|  | 	# Note: A free constructor "init(val: Int, next: nullable ISNode)" is | ||||||
|  | 	# implicitly defined. | ||||||
|  | end | ||||||
|  |  | ||||||
|  | var l = new IntStack | ||||||
|  | l.push(1) | ||||||
|  | l.push(2) | ||||||
|  | l.push(3) | ||||||
|  |  | ||||||
|  | print l.sumall | ||||||
|  |  | ||||||
|  | # Note: the 'for' control structure cannot be used on IntStack in its current state. | ||||||
|  | # It requires a more advanced topic. | ||||||
|  | # However, why not using the 'loop' control structure? | ||||||
|  | loop | ||||||
|  | 	var i = l.pop | ||||||
|  | 	if i == null then break | ||||||
|  | 	# The following is statically safe because of the previous 'if'. | ||||||
|  | 	print i * 10 | ||||||
|  | end | ||||||
|  |  | ||||||
|  | # Note: 'or else' is used to give an alternative of a null expression. | ||||||
|  | l.push(5) | ||||||
|  | print l.pop or else 0 # l.pop gives 5, so print 5 | ||||||
|  | print l.pop or else 0 # l.pop gives null, so print the alternative: 0 | ||||||
|  |  | ||||||
|  |  | ||||||
							
								
								
									
										193
									
								
								samples/Nit/opengles2_hello_triangle.nit
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										193
									
								
								samples/Nit/opengles2_hello_triangle.nit
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,193 @@ | |||||||
|  | # This file is part of NIT ( http://www.nitlanguage.org ). | ||||||
|  | # | ||||||
|  | # Copyright 2014 Alexis Laferrière <alexis.laf@xymus.net> | ||||||
|  | # | ||||||
|  | # Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | # you may not use this file except in compliance with the License. | ||||||
|  | # You may obtain a copy of the License at | ||||||
|  | # | ||||||
|  | #     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | # | ||||||
|  | # Unless required by applicable law or agreed to in writing, software | ||||||
|  | # distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | # See the License for the specific language governing permissions and | ||||||
|  | # limitations under the License. | ||||||
|  |  | ||||||
|  | # Basic example of OpenGL ES 2.0 usage from the book OpenGL ES 2.0 Programming Guide. | ||||||
|  | # | ||||||
|  | # Code reference: | ||||||
|  | # https://code.google.com/p/opengles-book-samples/source/browse/trunk/LinuxX11/Chapter_2/Hello_Triangle/Hello_Triangle.c  | ||||||
|  | module opengles2_hello_triangle | ||||||
|  |  | ||||||
|  | import glesv2 | ||||||
|  | import egl | ||||||
|  | import mnit_linux # for sdl | ||||||
|  | import x11 | ||||||
|  |  | ||||||
|  | if "NIT_TESTING".environ == "true" then exit(0) | ||||||
|  |  | ||||||
|  | var window_width = 800 | ||||||
|  | var window_height = 600 | ||||||
|  |  | ||||||
|  | # | ||||||
|  | ## SDL | ||||||
|  | # | ||||||
|  | var sdl_display = new SDLDisplay(window_width, window_height) | ||||||
|  | var sdl_wm_info = new SDLSystemWindowManagerInfo | ||||||
|  | var x11_window_handle = sdl_wm_info.x11_window_handle | ||||||
|  |  | ||||||
|  | # | ||||||
|  | ## X11 | ||||||
|  | # | ||||||
|  | var x_display = x_open_default_display | ||||||
|  | assert x_display != 0 else print "x11 fail" | ||||||
|  |  | ||||||
|  | # | ||||||
|  | ## EGL | ||||||
|  | # | ||||||
|  | var egl_display = new EGLDisplay(x_display) | ||||||
|  | assert egl_display.is_valid else print "EGL display is not valid" | ||||||
|  | egl_display.initialize | ||||||
|  |  | ||||||
|  | print "EGL version: {egl_display.version}" | ||||||
|  | print "EGL vendor: {egl_display.vendor}" | ||||||
|  | print "EGL extensions: {egl_display.extensions.join(", ")}" | ||||||
|  | print "EGL client APIs: {egl_display.client_apis.join(", ")}" | ||||||
|  |  | ||||||
|  | assert egl_display.is_valid else print egl_display.error | ||||||
|  |  | ||||||
|  | var config_chooser = new EGLConfigChooser | ||||||
|  | #config_chooser.surface_type_egl | ||||||
|  | config_chooser.blue_size = 8 | ||||||
|  | config_chooser.green_size = 8 | ||||||
|  | config_chooser.red_size = 8 | ||||||
|  | #config_chooser.alpha_size = 8 | ||||||
|  | #config_chooser.depth_size = 8 | ||||||
|  | #config_chooser.stencil_size = 8 | ||||||
|  | #config_chooser.sample_buffers = 1 | ||||||
|  | config_chooser.close | ||||||
|  |  | ||||||
|  | var configs = config_chooser.choose(egl_display) | ||||||
|  | assert configs != null else print "choosing config failed: {egl_display.error}" | ||||||
|  | assert not configs.is_empty else print "no EGL config" | ||||||
|  |  | ||||||
|  | print "{configs.length} EGL configs available" | ||||||
|  | for config in configs do | ||||||
|  | 	var attribs = config.attribs(egl_display) | ||||||
|  | 	print "* caveats: {attribs.caveat}" | ||||||
|  | 	print "  conformant to: {attribs.conformant}" | ||||||
|  | 	print "  size of RGBA: {attribs.red_size} {attribs.green_size} {attribs.blue_size} {attribs.alpha_size}" | ||||||
|  | 	print "  buffer, depth, stencil: {attribs.buffer_size} {attribs.depth_size} {attribs.stencil_size}" | ||||||
|  | end | ||||||
|  |  | ||||||
|  | var config = configs.first | ||||||
|  |  | ||||||
|  | var format = config.attribs(egl_display).native_visual_id | ||||||
|  |  | ||||||
|  | # TODO android part | ||||||
|  | # Opengles1Display_midway_init(recv, format); | ||||||
|  |  | ||||||
|  | var surface = egl_display.create_window_surface(config, x11_window_handle, [0]) | ||||||
|  | assert surface.is_ok else print egl_display.error | ||||||
|  |  | ||||||
|  | var context = egl_display.create_context(config) | ||||||
|  | assert context.is_ok else print egl_display.error | ||||||
|  |  | ||||||
|  | var make_current_res = egl_display.make_current(surface, surface, context) | ||||||
|  | assert make_current_res | ||||||
|  |  | ||||||
|  | var width = surface.attribs(egl_display).width | ||||||
|  | var height = surface.attribs(egl_display).height | ||||||
|  | print "Width: {width}" | ||||||
|  | print "Height: {height}" | ||||||
|  |  | ||||||
|  | assert egl_bind_opengl_es_api else print "eglBingAPI failed: {egl_display.error}" | ||||||
|  |  | ||||||
|  | # | ||||||
|  | ## GLESv2 | ||||||
|  | # | ||||||
|  |  | ||||||
|  | print "Can compile shaders? {gl_shader_compiler}" | ||||||
|  | assert_no_gl_error | ||||||
|  |  | ||||||
|  | assert gl_shader_compiler else print "Cannot compile shaders" | ||||||
|  |  | ||||||
|  | # gl program | ||||||
|  | print gl_error.to_s | ||||||
|  | var program = new GLProgram | ||||||
|  | if not program.is_ok then | ||||||
|  | 	print "Program is not ok: {gl_error.to_s}\nLog:" | ||||||
|  | 	print program.info_log | ||||||
|  | 	abort | ||||||
|  | end | ||||||
|  | assert_no_gl_error | ||||||
|  |  | ||||||
|  | # vertex shader | ||||||
|  | var vertex_shader = new GLVertexShader | ||||||
|  | assert vertex_shader.is_ok else print "Vertex shader is not ok: {gl_error}" | ||||||
|  | vertex_shader.source = """ | ||||||
|  | attribute vec4 vPosition;    | ||||||
|  | void main()                  | ||||||
|  | {                            | ||||||
|  |   gl_Position = vPosition;   | ||||||
|  | }                           """ | ||||||
|  | vertex_shader.compile | ||||||
|  | assert vertex_shader.is_compiled else print "Vertex shader compilation failed with: {vertex_shader.info_log} {program.info_log}" | ||||||
|  | assert_no_gl_error | ||||||
|  |  | ||||||
|  | # fragment shader | ||||||
|  | var fragment_shader = new GLFragmentShader | ||||||
|  | assert fragment_shader.is_ok else print "Fragment shader is not ok: {gl_error}" | ||||||
|  | fragment_shader.source = """ | ||||||
|  | precision mediump float; | ||||||
|  | void main() | ||||||
|  | { | ||||||
|  | 	gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); | ||||||
|  | } | ||||||
|  | """ | ||||||
|  | fragment_shader.compile | ||||||
|  | assert fragment_shader.is_compiled else print "Fragment shader compilation failed with: {fragment_shader.info_log}" | ||||||
|  | assert_no_gl_error | ||||||
|  |  | ||||||
|  | program.attach_shader vertex_shader | ||||||
|  | program.attach_shader fragment_shader | ||||||
|  | program.bind_attrib_location(0, "vPosition") | ||||||
|  | program.link | ||||||
|  | assert program.is_linked else print "Linking failed: {program.info_log}" | ||||||
|  | assert_no_gl_error | ||||||
|  |  | ||||||
|  | # draw! | ||||||
|  | var vertices = [0.0, 0.5, 0.0, -0.5, -0.5, 0.0, 0.5, -0.5, 0.0] | ||||||
|  | var vertex_array = new VertexArray(0, 3, vertices) | ||||||
|  | vertex_array.attrib_pointer | ||||||
|  | gl_clear_color(0.5, 0.0, 0.5, 1.0) | ||||||
|  | for i in [0..10000[ do | ||||||
|  | 	printn "." | ||||||
|  | 	assert_no_gl_error | ||||||
|  | 	gl_viewport(0, 0, width, height) | ||||||
|  | 	gl_clear_color_buffer | ||||||
|  | 	program.use | ||||||
|  | 	vertex_array.enable | ||||||
|  | 	vertex_array.draw_arrays_triangles | ||||||
|  | 	egl_display.swap_buffers(surface) | ||||||
|  | end | ||||||
|  |  | ||||||
|  | # delete | ||||||
|  | program.delete | ||||||
|  | vertex_shader.delete | ||||||
|  | fragment_shader.delete | ||||||
|  |  | ||||||
|  | # | ||||||
|  | ## EGL | ||||||
|  | # | ||||||
|  | # close | ||||||
|  | egl_display.make_current(new EGLSurface.none, new EGLSurface.none, new EGLContext.none) | ||||||
|  | egl_display.destroy_context(context) | ||||||
|  | egl_display.destroy_surface(surface) | ||||||
|  |  | ||||||
|  | # | ||||||
|  | ## SDL | ||||||
|  | # | ||||||
|  | # close | ||||||
|  | sdl_display.destroy | ||||||
							
								
								
									
										22
									
								
								samples/Nit/print_arguments.nit
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								samples/Nit/print_arguments.nit
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,22 @@ | |||||||
|  | # This file is part of NIT ( http://www.nitlanguage.org ). | ||||||
|  | # | ||||||
|  | # Copyright 2004-2008 Jean Privat <jean@pryen.org> | ||||||
|  | # | ||||||
|  | # Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | # you may not use this file except in compliance with the License. | ||||||
|  | # You may obtain a copy of the License at | ||||||
|  | # | ||||||
|  | #     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | # | ||||||
|  | # Unless required by applicable law or agreed to in writing, software | ||||||
|  | # distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | # See the License for the specific language governing permissions and | ||||||
|  | # limitations under the License. | ||||||
|  |  | ||||||
|  | # How to print arguments of the command line. | ||||||
|  | module print_arguments | ||||||
|  |  | ||||||
|  | for a in args do | ||||||
|  | 	print a | ||||||
|  | end | ||||||
							
								
								
									
										48
									
								
								samples/Nit/procedural_array.nit
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								samples/Nit/procedural_array.nit
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,48 @@ | |||||||
|  | # This file is part of NIT ( http://www.nitlanguage.org ). | ||||||
|  | # | ||||||
|  | # Copyright 2004-2008 Jean Privat <jean@pryen.org> | ||||||
|  | # | ||||||
|  | # Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | # you may not use this file except in compliance with the License. | ||||||
|  | # You may obtain a copy of the License at | ||||||
|  | # | ||||||
|  | #     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | # | ||||||
|  | # Unless required by applicable law or agreed to in writing, software | ||||||
|  | # distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | # See the License for the specific language governing permissions and | ||||||
|  | # limitations under the License. | ||||||
|  |  | ||||||
|  | # A procedural program (without explicit class definition). | ||||||
|  | # This program manipulates arrays of integers. | ||||||
|  | module procedural_array | ||||||
|  |  | ||||||
|  | # The sum of the elements of `a'. | ||||||
|  | # Uses a 'for' control structure. | ||||||
|  | fun array_sum(a: Array[Int]): Int | ||||||
|  | do | ||||||
|  | 	var sum = 0 | ||||||
|  | 	for i in a do | ||||||
|  | 		sum = sum + i | ||||||
|  | 	end | ||||||
|  | 	return sum | ||||||
|  | end | ||||||
|  |  | ||||||
|  | # The sum of the elements of `a' (alternative version). | ||||||
|  | # Uses a 'while' control structure. | ||||||
|  | fun array_sum_alt(a: Array[Int]): Int | ||||||
|  | do | ||||||
|  | 	var sum = 0 | ||||||
|  | 	var i = 0 | ||||||
|  | 	while i < a.length do | ||||||
|  | 		sum = sum + a[i] | ||||||
|  | 		i = i + 1 | ||||||
|  | 	end | ||||||
|  | 	return sum | ||||||
|  | end | ||||||
|  |  | ||||||
|  | # The main part of the program. | ||||||
|  | var a = [10, 5, 8, 9] | ||||||
|  | print(array_sum(a)) | ||||||
|  | print(array_sum_alt(a)) | ||||||
							
								
								
									
										38
									
								
								samples/Nit/socket_client.nit
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								samples/Nit/socket_client.nit
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | |||||||
|  | # This file is part of NIT ( http://www.nitlanguage.org ). | ||||||
|  | # | ||||||
|  | # Copyright 2013 Matthieu Lucas <lucasmatthieu@gmail.com> | ||||||
|  | # | ||||||
|  | # Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | # you may not use this file except in compliance with the License. | ||||||
|  | # You may obtain a copy of the License at | ||||||
|  | # | ||||||
|  | #     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | # | ||||||
|  | # Unless required by applicable law or agreed to in writing, software | ||||||
|  | # distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | # See the License for the specific language governing permissions and | ||||||
|  | # limitations under the License. | ||||||
|  |  | ||||||
|  | # Client sample using the Socket module which connect to the server sample. | ||||||
|  | module socket_client | ||||||
|  |  | ||||||
|  | import socket | ||||||
|  |  | ||||||
|  | if args.length < 2 then | ||||||
|  | 	print "Usage : socket_client <host> <port>" | ||||||
|  | 	return | ||||||
|  | end | ||||||
|  |  | ||||||
|  | var s = new Socket.client(args[0], args[1].to_i) | ||||||
|  | print "[HOST ADDRESS] : {s.address}" | ||||||
|  | print "[HOST] : {s.host}" | ||||||
|  | print "[PORT] : {s.port}" | ||||||
|  | print "Connecting ... {s.connected}" | ||||||
|  | if s.connected then | ||||||
|  | 	print "Writing ... Hello server !" | ||||||
|  | 	s.write("Hello server !") | ||||||
|  | 	print "[Response from server] : {s.read(100)}" | ||||||
|  | 	print "Closing ..." | ||||||
|  | 	s.close | ||||||
|  | end | ||||||
							
								
								
									
										52
									
								
								samples/Nit/socket_server.nit
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								samples/Nit/socket_server.nit
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,52 @@ | |||||||
|  | # This file is part of NIT ( http://www.nitlanguage.org ). | ||||||
|  | # | ||||||
|  | # Copyright 2013 Matthieu Lucas <lucasmatthieu@gmail.com> | ||||||
|  | # | ||||||
|  | # Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | # you may not use this file except in compliance with the License. | ||||||
|  | # You may obtain a copy of the License at | ||||||
|  | # | ||||||
|  | #     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | # | ||||||
|  | # Unless required by applicable law or agreed to in writing, software | ||||||
|  | # distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | # See the License for the specific language governing permissions and | ||||||
|  | # limitations under the License. | ||||||
|  |  | ||||||
|  | # Server sample using the Socket module which allow client to connect | ||||||
|  | module socket_server | ||||||
|  |  | ||||||
|  | import socket | ||||||
|  |  | ||||||
|  | if args.is_empty then | ||||||
|  | 	print "Usage : socket_server <port>" | ||||||
|  | 	return | ||||||
|  | end | ||||||
|  |  | ||||||
|  | var socket = new Socket.server(args[0].to_i, 1) | ||||||
|  | print "[PORT] : {socket.port.to_s}" | ||||||
|  |  | ||||||
|  | var clients = new Array[Socket] | ||||||
|  | var max = socket | ||||||
|  | loop | ||||||
|  | 	var fs = new SocketObserver(true, true, true) | ||||||
|  | 	fs.readset.set(socket) | ||||||
|  |  | ||||||
|  | 	for c in clients do fs.readset.set(c) | ||||||
|  |  | ||||||
|  | 	if fs.select(max, 4, 0) == 0 then | ||||||
|  | 		print "Error occured in select {sys.errno.strerror}" | ||||||
|  | 		break | ||||||
|  | 	end | ||||||
|  |  | ||||||
|  | 	if fs.readset.is_set(socket) then | ||||||
|  | 		var ns = socket.accept | ||||||
|  | 		print "Accepting {ns.address} ... " | ||||||
|  | 		print "[Message from {ns.address}] : {ns.read(100)}" | ||||||
|  | 		ns.write("Goodbye client.") | ||||||
|  | 		print "Closing {ns.address} ..." | ||||||
|  | 		ns.close | ||||||
|  | 	end | ||||||
|  | end | ||||||
|  |  | ||||||
							
								
								
									
										94
									
								
								samples/Nit/tmpl_composer.nit
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										94
									
								
								samples/Nit/tmpl_composer.nit
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,94 @@ | |||||||
|  | # This file is part of NIT ( http://www.nitlanguage.org ). | ||||||
|  | # | ||||||
|  | # Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | # you may not use this file except in compliance with the License. | ||||||
|  | # You may obtain a copy of the License at | ||||||
|  | # | ||||||
|  | #     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | # | ||||||
|  | # Unless required by applicable law or agreed to in writing, software | ||||||
|  | # distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | # See the License for the specific language governing permissions and | ||||||
|  | # limitations under the License. | ||||||
|  |  | ||||||
|  | import template | ||||||
|  |  | ||||||
|  | ### Here, definition of the specific templates | ||||||
|  |  | ||||||
|  | # The root template for composers | ||||||
|  | class TmplComposers | ||||||
|  | 	super Template | ||||||
|  |  | ||||||
|  | 	# Short list of composers | ||||||
|  | 	var composers = new Array[TmplComposer] | ||||||
|  |  | ||||||
|  | 	# Detailled list of composers | ||||||
|  | 	var composer_details = new Array[TmplComposerDetail] | ||||||
|  |  | ||||||
|  | 	# Add a composer in both lists | ||||||
|  | 	fun add_composer(firstname, lastname: String, birth, death: Int) | ||||||
|  | 	do | ||||||
|  | 		composers.add(new TmplComposer(lastname)) | ||||||
|  | 		composer_details.add(new TmplComposerDetail(firstname, lastname, birth, death)) | ||||||
|  | 	end | ||||||
|  |  | ||||||
|  | 	redef fun rendering do | ||||||
|  | 		add """ | ||||||
|  | COMPOSERS | ||||||
|  | ========= | ||||||
|  | """ | ||||||
|  | 		add_all composers | ||||||
|  | 		add """ | ||||||
|  |  | ||||||
|  | DETAILS | ||||||
|  | ======= | ||||||
|  | """ | ||||||
|  | 		add_all composer_details | ||||||
|  | 	end | ||||||
|  | end | ||||||
|  |  | ||||||
|  | # A composer in the short list of composers | ||||||
|  | class TmplComposer | ||||||
|  | 	super Template | ||||||
|  |  | ||||||
|  | 	# Short name | ||||||
|  | 	var name: String | ||||||
|  |  | ||||||
|  | 	init(name: String) do self.name = name | ||||||
|  |  | ||||||
|  | 	redef fun rendering do add "- {name}\n" | ||||||
|  | end | ||||||
|  |  | ||||||
|  | # A composer in the detailled list of composers | ||||||
|  | class TmplComposerDetail | ||||||
|  | 	super Template | ||||||
|  |  | ||||||
|  | 	var firstname: String | ||||||
|  | 	var lastname: String | ||||||
|  | 	var birth: Int | ||||||
|  | 	var death: Int | ||||||
|  |  | ||||||
|  | 	init(firstname, lastname: String, birth, death: Int) do | ||||||
|  | 		self.firstname = firstname | ||||||
|  | 		self.lastname = lastname | ||||||
|  | 		self.birth = birth | ||||||
|  | 		self.death = death | ||||||
|  | 	end | ||||||
|  |  | ||||||
|  | 	redef fun rendering do add """ | ||||||
|  |  | ||||||
|  | COMPOSER: {{{firstname}}} {{{lastname}}} | ||||||
|  | BIRTH...: {{{birth}}} | ||||||
|  | DEATH...: {{{death}}} | ||||||
|  | """ | ||||||
|  |  | ||||||
|  | end | ||||||
|  |  | ||||||
|  | ### Here a simple usage of the templates | ||||||
|  |  | ||||||
|  | var f = new TmplComposers | ||||||
|  | f.add_composer("Johann Sebastian", "Bach", 1685, 1750) | ||||||
|  | f.add_composer("George Frideric", "Handel", 1685, 1759) | ||||||
|  | f.add_composer("Wolfgang Amadeus", "Mozart", 1756, 1791) | ||||||
|  | f.write_to(stdout) | ||||||
							
								
								
									
										46
									
								
								samples/Nit/websocket_server.nit
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								samples/Nit/websocket_server.nit
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,46 @@ | |||||||
|  | # This file is part of NIT ( http://www.nitlanguage.org ). | ||||||
|  | # | ||||||
|  | # Copyright 2014 Lucas Bajolet <r4pass@hotmail.com> | ||||||
|  | # | ||||||
|  | # Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | # you may not use this file except in compliance with the License. | ||||||
|  | # You may obtain a copy of the License at | ||||||
|  | # | ||||||
|  | #     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | # | ||||||
|  | # Unless required by applicable law or agreed to in writing, software | ||||||
|  | # distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | # See the License for the specific language governing permissions and | ||||||
|  | # limitations under the License. | ||||||
|  |  | ||||||
|  | # Sample module for a minimal chat server using Websockets on port 8088 | ||||||
|  | module websocket_server | ||||||
|  |  | ||||||
|  | import websocket | ||||||
|  |  | ||||||
|  | var sock = new WebSocket(8088, 1) | ||||||
|  |  | ||||||
|  | var msg: String | ||||||
|  |  | ||||||
|  | if sock.listener.eof then | ||||||
|  | 	print sys.errno.strerror | ||||||
|  | end | ||||||
|  |  | ||||||
|  | sock.accept | ||||||
|  |  | ||||||
|  | while not sock.listener.eof do | ||||||
|  | 	if not sock.connected then sock.accept | ||||||
|  | 	if sys.stdin.poll_in then | ||||||
|  | 		msg = gets | ||||||
|  | 		printn "Received message : {msg}" | ||||||
|  | 		if msg == "exit" then sock.close | ||||||
|  | 		if msg == "disconnect" then sock.disconnect_client | ||||||
|  | 		sock.write(msg) | ||||||
|  | 	end | ||||||
|  | 	if sock.can_read(10) then | ||||||
|  | 		msg = sock.read_line | ||||||
|  | 		if msg != "" then print msg | ||||||
|  | 	end | ||||||
|  | end | ||||||
|  |  | ||||||
							
								
								
									
										80
									
								
								samples/Nix/nginx.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								samples/Nix/nginx.nix
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,80 @@ | |||||||
|  | { stdenv, fetchurl, fetchgit, openssl, zlib, pcre, libxml2, libxslt, expat | ||||||
|  | , rtmp ? false | ||||||
|  | , fullWebDAV ? false | ||||||
|  | , syslog ? false | ||||||
|  | , moreheaders ? false, ...}: | ||||||
|  |  | ||||||
|  | let | ||||||
|  |   version = "1.4.4"; | ||||||
|  |   mainSrc = fetchurl { | ||||||
|  |     url = "http://nginx.org/download/nginx-${version}.tar.gz"; | ||||||
|  |     sha256 = "1f82845mpgmhvm151fhn2cnqjggw9w7cvsqbva9rb320wmc9m63w"; | ||||||
|  |   }; | ||||||
|  |  | ||||||
|  |   rtmp-ext = fetchgit { | ||||||
|  |     url = git://github.com/arut/nginx-rtmp-module.git; | ||||||
|  |     rev = "1cfb7aeb582789f3b15a03da5b662d1811e2a3f1"; | ||||||
|  |     sha256 = "03ikfd2l8mzsjwx896l07rdrw5jn7jjfdiyl572yb9jfrnk48fwi"; | ||||||
|  |   }; | ||||||
|  |  | ||||||
|  |   dav-ext = fetchgit { | ||||||
|  |     url = git://github.com/arut/nginx-dav-ext-module.git; | ||||||
|  |     rev = "54cebc1f21fc13391aae692c6cce672fa7986f9d"; | ||||||
|  |     sha256 = "1dvpq1fg5rslnl05z8jc39sgnvh3akam9qxfl033akpczq1bh8nq"; | ||||||
|  |   }; | ||||||
|  |  | ||||||
|  |   syslog-ext = fetchgit { | ||||||
|  |     url = https://github.com/yaoweibin/nginx_syslog_patch.git; | ||||||
|  |     rev = "165affd9741f0e30c4c8225da5e487d33832aca3"; | ||||||
|  |     sha256 = "14dkkafjnbapp6jnvrjg9ip46j00cr8pqc2g7374z9aj7hrvdvhs"; | ||||||
|  |   }; | ||||||
|  |  | ||||||
|  |   moreheaders-ext = fetchgit { | ||||||
|  |     url = https://github.com/agentzh/headers-more-nginx-module.git; | ||||||
|  |     rev = "refs/tags/v0.23"; | ||||||
|  |     sha256 = "12pbjgsxnvcf2ff2i2qdn39q4cm5czlgrng96j8ml4cgxvnbdh39"; | ||||||
|  |   }; | ||||||
|  | in | ||||||
|  |  | ||||||
|  | stdenv.mkDerivation rec { | ||||||
|  |   name = "nginx-${version}"; | ||||||
|  |   src = mainSrc; | ||||||
|  |  | ||||||
|  |   buildInputs = [ openssl zlib pcre libxml2 libxslt | ||||||
|  |     ] ++ stdenv.lib.optional fullWebDAV expat; | ||||||
|  |  | ||||||
|  |   patches = if syslog then [ "${syslog-ext}/syslog_1.4.0.patch" ] else []; | ||||||
|  |  | ||||||
|  |   configureFlags = [ | ||||||
|  |     "--with-http_ssl_module" | ||||||
|  |     "--with-http_spdy_module" | ||||||
|  |     "--with-http_xslt_module" | ||||||
|  |     "--with-http_sub_module" | ||||||
|  |     "--with-http_dav_module" | ||||||
|  |     "--with-http_gzip_static_module" | ||||||
|  |     "--with-http_secure_link_module" | ||||||
|  |     "--with-ipv6" | ||||||
|  |     # Install destination problems | ||||||
|  |     # "--with-http_perl_module" | ||||||
|  |   ] ++ stdenv.lib.optional rtmp "--add-module=${rtmp-ext}" | ||||||
|  |     ++ stdenv.lib.optional fullWebDAV "--add-module=${dav-ext}" | ||||||
|  |     ++ stdenv.lib.optional syslog "--add-module=${syslog-ext}" | ||||||
|  |     ++ stdenv.lib.optional moreheaders "--add-module=${moreheaders-ext}"; | ||||||
|  |  | ||||||
|  |   preConfigure = '' | ||||||
|  |     export NIX_CFLAGS_COMPILE="$NIX_CFLAGS_COMPILE -I${libxml2 }/include/libxml2" | ||||||
|  |   ''; | ||||||
|  |  | ||||||
|  |   # escape example | ||||||
|  |   postInstall = '' | ||||||
|  |     mv $out/sbin $out/bin ''' ''${ | ||||||
|  |    ${ if true then ${ "" } else false } | ||||||
|  |   ''; | ||||||
|  |  | ||||||
|  |   meta = { | ||||||
|  |     description = "A reverse proxy and lightweight webserver"; | ||||||
|  |     maintainers = [ stdenv.lib.maintainers.raskin]; | ||||||
|  |     platforms = stdenv.lib.platforms.all; | ||||||
|  |     inherit version; | ||||||
|  |   }; | ||||||
|  | } | ||||||
							
								
								
									
										38
									
								
								samples/Pike/Error.pmod
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								samples/Pike/Error.pmod
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | |||||||
|  | #pike __REAL_VERSION__ | ||||||
|  |  | ||||||
|  | constant Generic = __builtin.GenericError; | ||||||
|  |  | ||||||
|  | constant Index = __builtin.IndexError; | ||||||
|  |  | ||||||
|  | constant BadArgument = __builtin.BadArgumentError; | ||||||
|  |  | ||||||
|  | constant Math = __builtin.MathError; | ||||||
|  |  | ||||||
|  | constant Resource = __builtin.ResourceError; | ||||||
|  |  | ||||||
|  | constant Permission = __builtin.PermissionError; | ||||||
|  |  | ||||||
|  | constant Decode = __builtin.DecodeError; | ||||||
|  |  | ||||||
|  | constant Cpp = __builtin.CppError; | ||||||
|  |  | ||||||
|  | constant Compilation = __builtin.CompilationError; | ||||||
|  |  | ||||||
|  | constant MasterLoad = __builtin.MasterLoadError; | ||||||
|  |  | ||||||
|  | constant ModuleLoad = __builtin.ModuleLoadError; | ||||||
|  |  | ||||||
|  | //! Returns an Error object for any argument it receives. If the | ||||||
|  | //! argument already is an Error object or is empty, it does nothing. | ||||||
|  | object mkerror(mixed error) | ||||||
|  | { | ||||||
|  |   if (error == UNDEFINED) | ||||||
|  |     return error; | ||||||
|  |   if (objectp(error) && error->is_generic_error) | ||||||
|  |     return error; | ||||||
|  |   if (arrayp(error)) | ||||||
|  |     return Error.Generic(@error); | ||||||
|  |   if (stringp(error)) | ||||||
|  |     return Error.Generic(error); | ||||||
|  |   return Error.Generic(sprintf("%O", error)); | ||||||
|  | } | ||||||
							
								
								
									
										360
									
								
								samples/Pike/FakeFile.pike
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										360
									
								
								samples/Pike/FakeFile.pike
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,360 @@ | |||||||
|  | #pike __REAL_VERSION__ | ||||||
|  |  | ||||||
|  | //! A string wrapper that pretends to be a @[Stdio.File] object | ||||||
|  | //! in addition to some features of a @[Stdio.FILE] object. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //! This constant can be used to distinguish a FakeFile object | ||||||
|  | //! from a real @[Stdio.File] object. | ||||||
|  | constant is_fake_file = 1; | ||||||
|  |  | ||||||
|  | protected string data; | ||||||
|  | protected int ptr; | ||||||
|  | protected int(0..1) r; | ||||||
|  | protected int(0..1) w; | ||||||
|  | protected int mtime; | ||||||
|  |  | ||||||
|  | protected function read_cb; | ||||||
|  | protected function read_oob_cb; | ||||||
|  | protected function write_cb; | ||||||
|  | protected function write_oob_cb; | ||||||
|  | protected function close_cb; | ||||||
|  |  | ||||||
|  | //! @seealso | ||||||
|  | //!   @[Stdio.File()->close()] | ||||||
|  | int close(void|string direction) { | ||||||
|  |   direction = lower_case(direction||"rw"); | ||||||
|  |   int cr = has_value(direction, "r"); | ||||||
|  |   int cw = has_value(direction, "w"); | ||||||
|  |  | ||||||
|  |   if(cr) { | ||||||
|  |     r = 0; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   if(cw) { | ||||||
|  |     w = 0; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   // FIXME: Close callback | ||||||
|  |   return 1; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | //! @decl void create(string data, void|string type, void|int pointer) | ||||||
|  | //! @seealso | ||||||
|  | //!   @[Stdio.File()->create()] | ||||||
|  | void create(string _data, void|string type, int|void _ptr) { | ||||||
|  |   if(!_data) error("No data string given to FakeFile.\n"); | ||||||
|  |   data = _data; | ||||||
|  |   ptr = _ptr; | ||||||
|  |   mtime = time(); | ||||||
|  |   if(type) { | ||||||
|  |     type = lower_case(type); | ||||||
|  |     if(has_value(type, "r")) | ||||||
|  |       r = 1; | ||||||
|  |     if(has_value(type, "w")) | ||||||
|  |       w = 1; | ||||||
|  |   } | ||||||
|  |   else | ||||||
|  |     r = w = 1; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | protected string make_type_str() { | ||||||
|  |   string type = ""; | ||||||
|  |   if(r) type += "r"; | ||||||
|  |   if(w) type += "w"; | ||||||
|  |   return type; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | //! @seealso | ||||||
|  | //!   @[Stdio.File()->dup()] | ||||||
|  | this_program dup() { | ||||||
|  |   return this_program(data, make_type_str(), ptr); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | //! Always returns 0. | ||||||
|  | //! @seealso | ||||||
|  | //!   @[Stdio.File()->errno()] | ||||||
|  | int errno() { return 0; } | ||||||
|  |  | ||||||
|  | //! Returns size and the creation time of the string. | ||||||
|  | Stdio.Stat stat() { | ||||||
|  |   Stdio.Stat st = Stdio.Stat(); | ||||||
|  |   st->size = sizeof(data); | ||||||
|  |   st->mtime=st->ctime=mtime; | ||||||
|  |   st->atime=time(); | ||||||
|  |   return st; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | //! @seealso | ||||||
|  | //!   @[Stdio.File()->line_iterator()] | ||||||
|  | String.SplitIterator line_iterator(int|void trim) { | ||||||
|  |   if(trim) | ||||||
|  |     return String.SplitIterator( data-"\r", '\n' ); | ||||||
|  |   return String.SplitIterator( data, '\n' ); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | protected mixed id; | ||||||
|  |  | ||||||
|  | //! @seealso | ||||||
|  | //!   @[Stdio.File()->query_id()] | ||||||
|  | mixed query_id() { return id; } | ||||||
|  |  | ||||||
|  | //! @seealso | ||||||
|  | //!   @[Stdio.File()->set_id()] | ||||||
|  | void set_id(mixed _id) { id = _id; } | ||||||
|  |  | ||||||
|  | //! @seealso | ||||||
|  | //!   @[Stdio.File()->read_function()] | ||||||
|  | function(:string) read_function(int nbytes) { | ||||||
|  |   return lambda() { return read(nbytes); }; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | //! @seealso | ||||||
|  | //!   @[Stdio.File()->peek()] | ||||||
|  | int(-1..1) peek(int|float|void timeout) { | ||||||
|  |   if(!r) return -1; | ||||||
|  |   if(ptr >= sizeof(data)) return 0; | ||||||
|  |   return 1; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | //! Always returns 0. | ||||||
|  | //! @seealso | ||||||
|  | //!   @[Stdio.File()->query_address()] | ||||||
|  | string query_address(void|int(0..1) is_local) { return 0; } | ||||||
|  |  | ||||||
|  | //! @seealso | ||||||
|  | //!   @[Stdio.File()->read()] | ||||||
|  | string read(void|int(0..) len, void|int(0..1) not_all) { | ||||||
|  |   if(!r) return 0; | ||||||
|  |   if (len < 0) error("Cannot read negative number of characters.\n"); | ||||||
|  |   int start=ptr; | ||||||
|  |   ptr += len; | ||||||
|  |   if(zero_type(len) || ptr>sizeof(data)) | ||||||
|  |     ptr = sizeof(data); | ||||||
|  |  | ||||||
|  |   // FIXME: read callback | ||||||
|  |   return data[start..ptr-1]; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | //! @seealso | ||||||
|  | //!   @[Stdio.FILE()->gets()] | ||||||
|  | string gets() { | ||||||
|  |   if(!r) return 0; | ||||||
|  |   string ret; | ||||||
|  |   sscanf(data,"%*"+(string)ptr+"s%[^\n]",ret); | ||||||
|  |   if(ret) | ||||||
|  |   { | ||||||
|  |     ptr+=sizeof(ret)+1; | ||||||
|  |     if(ptr>sizeof(data)) | ||||||
|  |     { | ||||||
|  |       ptr=sizeof(data); | ||||||
|  |       if(!sizeof(ret)) | ||||||
|  | 	ret = 0; | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   // FIXME: read callback | ||||||
|  |   return ret; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | //! @seealso | ||||||
|  | //!   @[Stdio.FILE()->getchar()] | ||||||
|  | int getchar() { | ||||||
|  |   if(!r) return 0; | ||||||
|  |   int c; | ||||||
|  |   if(catch(c=data[ptr])) | ||||||
|  |     c=-1; | ||||||
|  |   else | ||||||
|  |     ptr++; | ||||||
|  |  | ||||||
|  |   // FIXME: read callback | ||||||
|  |   return c; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | //! @seealso | ||||||
|  | //!   @[Stdio.FILE()->unread()] | ||||||
|  | void unread(string s) { | ||||||
|  |   if(!r) return; | ||||||
|  |   if(data[ptr-sizeof(s)..ptr-1]==s) | ||||||
|  |     ptr-=sizeof(s); | ||||||
|  |   else | ||||||
|  |   { | ||||||
|  |     data=s+data[ptr..]; | ||||||
|  |     ptr=0; | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | //! @seealso | ||||||
|  | //!   @[Stdio.File()->seek()] | ||||||
|  | int seek(int pos, void|int mult, void|int add) { | ||||||
|  |   if(mult) | ||||||
|  |     pos = pos*mult+add; | ||||||
|  |   if(pos<0) | ||||||
|  |   { | ||||||
|  |     pos = sizeof(data)+pos; | ||||||
|  |     if( pos < 0 ) | ||||||
|  | 	pos = 0; | ||||||
|  |   } | ||||||
|  |   ptr = pos; | ||||||
|  |   if( ptr > strlen( data ) ) | ||||||
|  |       ptr = strlen(data); | ||||||
|  |   return ptr; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | //! Always returns 1. | ||||||
|  | //! @seealso | ||||||
|  | //!   @[Stdio.File()->sync()] | ||||||
|  | int(1..1) sync() { return 1; } | ||||||
|  |  | ||||||
|  | //! @seealso | ||||||
|  | //!   @[Stdio.File()->tell()] | ||||||
|  | int tell() { return ptr; } | ||||||
|  |  | ||||||
|  | //! @seealso | ||||||
|  | //!   @[Stdio.File()->truncate()] | ||||||
|  | int(0..1) truncate(int length) { | ||||||
|  |   data = data[..length-1]; | ||||||
|  |   return sizeof(data)==length; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | //! @seealso | ||||||
|  | //!   @[Stdio.File()->write()] | ||||||
|  | int(-1..) write(string|array(string) str, mixed ... extra) { | ||||||
|  |   if(!w) return -1; | ||||||
|  |   if(arrayp(str)) str=str*""; | ||||||
|  |   if(sizeof(extra)) str=sprintf(str, @extra); | ||||||
|  |  | ||||||
|  |   if(ptr==sizeof(data)) { | ||||||
|  |     data += str; | ||||||
|  |     ptr = sizeof(data); | ||||||
|  |   } | ||||||
|  |   else if(sizeof(str)==1) | ||||||
|  |     data[ptr++] = str[0]; | ||||||
|  |   else { | ||||||
|  |     data = data[..ptr-1] + str + data[ptr+sizeof(str)..]; | ||||||
|  |     ptr += sizeof(str); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   // FIXME: write callback | ||||||
|  |   return sizeof(str); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | //! @seealso | ||||||
|  | //!   @[Stdio.File()->set_blocking] | ||||||
|  | void set_blocking() { | ||||||
|  |   close_cb = 0; | ||||||
|  |   read_cb = 0; | ||||||
|  |   read_oob_cb = 0; | ||||||
|  |   write_cb = 0; | ||||||
|  |   write_oob_cb = 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | //! @seealso | ||||||
|  | //!   @[Stdio.File()->set_blocking_keep_callbacks] | ||||||
|  | void set_blocking_keep_callbacks() { } | ||||||
|  |  | ||||||
|  | //! @seealso | ||||||
|  | //!   @[Stdio.File()->set_blocking] | ||||||
|  | void set_nonblocking(function rcb, function wcb, function ccb, | ||||||
|  | 		     function rocb, function wocb) { | ||||||
|  |   read_cb = rcb; | ||||||
|  |   write_cb = wcb; | ||||||
|  |   close_cb = ccb; | ||||||
|  |   read_oob_cb = rocb; | ||||||
|  |   write_oob_cb = wocb; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | //! @seealso | ||||||
|  | //!   @[Stdio.File()->set_blocking_keep_callbacks] | ||||||
|  | void set_nonblocking_keep_callbacks() { } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //! @seealso | ||||||
|  | //!   @[Stdio.File()->set_close_callback] | ||||||
|  | void set_close_callback(function cb) { close_cb = cb; } | ||||||
|  |  | ||||||
|  | //! @seealso | ||||||
|  | //!   @[Stdio.File()->set_read_callback] | ||||||
|  | void set_read_callback(function cb) { read_cb = cb; } | ||||||
|  |  | ||||||
|  | //! @seealso | ||||||
|  | //!   @[Stdio.File()->set_read_oob_callback] | ||||||
|  | void set_read_oob_callback(function cb) { read_oob_cb = cb; } | ||||||
|  |  | ||||||
|  | //! @seealso | ||||||
|  | //!   @[Stdio.File()->set_write_callback] | ||||||
|  | void set_write_callback(function cb) { write_cb = cb; } | ||||||
|  |  | ||||||
|  | //! @seealso | ||||||
|  | //!   @[Stdio.File()->set_write_oob_callback] | ||||||
|  | void set_write_oob_callback(function cb) { write_oob_cb = cb; } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //! @seealso | ||||||
|  | //!   @[Stdio.File()->query_close_callback] | ||||||
|  | function query_close_callback() { return close_cb; } | ||||||
|  |  | ||||||
|  | //! @seealso | ||||||
|  | //!   @[Stdio.File()->query_read_callback] | ||||||
|  | function query_read_callback() { return read_cb; } | ||||||
|  |  | ||||||
|  | //! @seealso | ||||||
|  | //!   @[Stdio.File()->query_read_oob_callback] | ||||||
|  | function query_read_oob_callback() { return read_oob_cb; } | ||||||
|  |  | ||||||
|  | //! @seealso | ||||||
|  | //!   @[Stdio.File()->query_write_callback] | ||||||
|  | function query_write_callback() { return write_cb; } | ||||||
|  |  | ||||||
|  | //! @seealso | ||||||
|  | //!   @[Stdio.File()->query_write_oob_callback] | ||||||
|  | function query_write_oob_callback() { return write_oob_cb; } | ||||||
|  |  | ||||||
|  | string _sprintf(int t) { | ||||||
|  |   return t=='O' && sprintf("%O(%d,%O)", this_program, sizeof(data), | ||||||
|  | 			   make_type_str()); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | // FakeFile specials. | ||||||
|  |  | ||||||
|  | //! A FakeFile can be casted to a string. | ||||||
|  | mixed cast(string to) { | ||||||
|  |   switch(to) { | ||||||
|  |   case "string": return data; | ||||||
|  |   case "object": return this; | ||||||
|  |   } | ||||||
|  |   error("Can not cast object to %O.\n", to); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | //! Sizeof on a FakeFile returns the size of its contents. | ||||||
|  | int(0..) _sizeof() { | ||||||
|  |   return sizeof(data); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | //! @ignore | ||||||
|  |  | ||||||
|  | #define NOPE(X) mixed X (mixed ... args) { error("This is a FakeFile. %s is not available.\n", #X); } | ||||||
|  | NOPE(assign); | ||||||
|  | NOPE(async_connect); | ||||||
|  | NOPE(connect); | ||||||
|  | NOPE(connect_unix); | ||||||
|  | NOPE(open); | ||||||
|  | NOPE(open_socket); | ||||||
|  | NOPE(pipe); | ||||||
|  | NOPE(tcgetattr); | ||||||
|  | NOPE(tcsetattr); | ||||||
|  |  | ||||||
|  | // Stdio.Fd | ||||||
|  | NOPE(dup2); | ||||||
|  | NOPE(lock); // We could implement this | ||||||
|  | NOPE(mode); // We could implement this | ||||||
|  | NOPE(proxy); // We could implement this | ||||||
|  | NOPE(query_fd); | ||||||
|  | NOPE(read_oob); | ||||||
|  | NOPE(set_close_on_exec); | ||||||
|  | NOPE(set_keepalive); | ||||||
|  | NOPE(trylock); // We could implement this | ||||||
|  | NOPE(write_oob); | ||||||
|  |  | ||||||
|  | //! @endignore | ||||||
							
								
								
									
										260
									
								
								samples/Prolog/format_spec.pl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										260
									
								
								samples/Prolog/format_spec.pl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,260 @@ | |||||||
|  | :- module(format_spec, [ format_error/2 | ||||||
|  |                        , format_spec/2 | ||||||
|  |                        , format_spec//1 | ||||||
|  |                        , spec_arity/2 | ||||||
|  |                        , spec_types/2 | ||||||
|  |                        ]). | ||||||
|  |  | ||||||
|  | :- use_module(library(dcg/basics), [eos//0, integer//1, string_without//2]). | ||||||
|  | :- use_module(library(error)). | ||||||
|  | :- use_module(library(when), [when/2]). | ||||||
|  |  | ||||||
|  | % TODO loading this module is optional | ||||||
|  | % TODO it's for my own convenience during development | ||||||
|  | %:- use_module(library(mavis)). | ||||||
|  |  | ||||||
|  | %% format_error(+Goal, -Error:string) is nondet. | ||||||
|  | % | ||||||
|  | %  True if Goal exhibits an Error in its format string. The | ||||||
|  | %  Error string describes what is wrong with Goal. Iterates each | ||||||
|  | %  error on backtracking. | ||||||
|  | % | ||||||
|  | %  Goal may be one of the following predicates: | ||||||
|  | % | ||||||
|  | %    * format/2 | ||||||
|  | %    * format/3 | ||||||
|  | %    * debug/3 | ||||||
|  | format_error(format(Format,Args), Error) :- | ||||||
|  |     format_error_(Format, Args,Error). | ||||||
|  | format_error(format(_,Format,Args), Error) :- | ||||||
|  |     format_error_(Format,Args,Error). | ||||||
|  | format_error(debug(_,Format,Args), Error) :- | ||||||
|  |     format_error_(Format,Args,Error). | ||||||
|  |  | ||||||
|  | format_error_(Format,Args,Error) :- | ||||||
|  |     format_spec(Format, Spec), | ||||||
|  |     !, | ||||||
|  |     is_list(Args), | ||||||
|  |     spec_types(Spec, Types), | ||||||
|  |     types_error(Args, Types, Error). | ||||||
|  | format_error_(Format,_,Error) :- | ||||||
|  |     % \+ format_spec(Format, _), | ||||||
|  |     format(string(Error), "Invalid format string: ~q", [Format]). | ||||||
|  |  | ||||||
|  | types_error(Args, Types, Error) :- | ||||||
|  |     length(Types, TypesLen), | ||||||
|  |     length(Args, ArgsLen), | ||||||
|  |     TypesLen =\= ArgsLen, | ||||||
|  |     !, | ||||||
|  |     format( string(Error) | ||||||
|  |           , "Wrong argument count. Expected ~d, got ~d" | ||||||
|  |           , [TypesLen, ArgsLen] | ||||||
|  |           ). | ||||||
|  | types_error(Args, Types, Error) :- | ||||||
|  |     types_error_(Args, Types, Error). | ||||||
|  |  | ||||||
|  | types_error_([Arg|_],[Type|_],Error) :- | ||||||
|  |     ground(Arg), | ||||||
|  |     \+ is_of_type(Type,Arg), | ||||||
|  |     message_to_string(error(type_error(Type,Arg),_Location),Error). | ||||||
|  | types_error_([_|Args],[_|Types],Error) :- | ||||||
|  |     types_error_(Args, Types, Error). | ||||||
|  |  | ||||||
|  |  | ||||||
|  | % check/0 augmentation | ||||||
|  | :- multifile check:checker/2. | ||||||
|  | :- dynamic check:checker/2. | ||||||
|  | check:checker(format_spec:checker, "format/2 strings and arguments"). | ||||||
|  |  | ||||||
|  | :- dynamic format_fail/3. | ||||||
|  |  | ||||||
|  | checker :- | ||||||
|  |     prolog_walk_code([ module_class([user]) | ||||||
|  |                      , infer_meta_predicates(false) | ||||||
|  |                      , autoload(false)  % format/{2,3} are always loaded | ||||||
|  |                      , undefined(ignore) | ||||||
|  |                      , trace_reference(_) | ||||||
|  |                      , on_trace(check_format) | ||||||
|  |                      ]), | ||||||
|  |     retract(format_fail(Goal,Location,Error)), | ||||||
|  |     print_message(warning, format_error(Goal,Location,Error)), | ||||||
|  |     fail.  % iterate all errors | ||||||
|  | checker.  % succeed even if no errors are found | ||||||
|  |  | ||||||
|  | check_format(Module:Goal, _Caller, Location) :- | ||||||
|  |     predicate_property(Module:Goal, imported_from(Source)), | ||||||
|  |     memberchk(Source, [system,prolog_debug]), | ||||||
|  |     can_check(Goal), | ||||||
|  |     format_error(Goal, Error), | ||||||
|  |     assert(format_fail(Goal, Location, Error)), | ||||||
|  |     fail. | ||||||
|  | check_format(_,_,_).  % succeed to avoid printing goals | ||||||
|  |  | ||||||
|  | % true if format_error/2 can check this goal | ||||||
|  | can_check(Goal) :- | ||||||
|  |     once(clause(format_error(Goal,_),_)). | ||||||
|  |  | ||||||
|  | prolog:message(format_error(Goal,Location,Error)) --> | ||||||
|  |     prolog:message_location(Location), | ||||||
|  |     ['~n    In goal: ~q~n    ~s'-[Goal,Error]]. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | %% format_spec(-Spec)// | ||||||
|  | % | ||||||
|  | %  DCG for parsing format strings. It doesn't yet generate format | ||||||
|  | %  strings from a spec.  See format_spec/2 for details. | ||||||
|  | format_spec([]) --> | ||||||
|  |     eos. | ||||||
|  | format_spec([escape(Numeric,Modifier,Action)|Rest]) --> | ||||||
|  |     "~", | ||||||
|  |     numeric_argument(Numeric), | ||||||
|  |     modifier_argument(Modifier), | ||||||
|  |     action(Action), | ||||||
|  |     format_spec(Rest). | ||||||
|  | format_spec([text(String)|Rest]) --> | ||||||
|  |     { when((ground(String);ground(Codes)),string_codes(String, Codes)) }, | ||||||
|  |     string_without("~", Codes), | ||||||
|  |     { Codes \= [] }, | ||||||
|  |     format_spec(Rest). | ||||||
|  |  | ||||||
|  |  | ||||||
|  | %% format_spec(+Format, -Spec:list) is semidet. | ||||||
|  | % | ||||||
|  | %  Parse a format string.  Each element of Spec is one of the following: | ||||||
|  | % | ||||||
|  | %    * `text(Text)` - text sent to the output as is | ||||||
|  | %    * `escape(Num,Colon,Action)` - a format escape | ||||||
|  | % | ||||||
|  | %  `Num` represents the optional numeric portion of an esape. `Colon` | ||||||
|  | %  represents the optional colon in an escape. `Action` is an atom | ||||||
|  | %  representing the action to be take by this escape. | ||||||
|  | format_spec(Format, Spec) :- | ||||||
|  |     when((ground(Format);ground(Codes)),text_codes(Format, Codes)), | ||||||
|  |     once(phrase(format_spec(Spec), Codes, [])). | ||||||
|  |  | ||||||
|  | %% spec_arity(+FormatSpec, -Arity:positive_integer) is det. | ||||||
|  | % | ||||||
|  | %  True if FormatSpec requires format/2 to have Arity arguments. | ||||||
|  | spec_arity(Spec, Arity) :- | ||||||
|  |     spec_types(Spec, Types), | ||||||
|  |     length(Types, Arity). | ||||||
|  |  | ||||||
|  |  | ||||||
|  | %% spec_types(+FormatSpec, -Types:list(type)) is det. | ||||||
|  | % | ||||||
|  | %  True if FormatSpec requires format/2 to have arguments of Types. Each | ||||||
|  | %  value of Types is a type as described by error:has_type/2. This | ||||||
|  | %  notion of types is compatible with library(mavis). | ||||||
|  | spec_types(Spec, Types) :- | ||||||
|  |     phrase(spec_types(Spec), Types). | ||||||
|  |  | ||||||
|  | spec_types([]) --> | ||||||
|  |     []. | ||||||
|  | spec_types([Item|Items]) --> | ||||||
|  |     item_types(Item), | ||||||
|  |     spec_types(Items). | ||||||
|  |  | ||||||
|  | item_types(text(_)) --> | ||||||
|  |     []. | ||||||
|  | item_types(escape(Numeric,_,Action)) --> | ||||||
|  |     numeric_types(Numeric), | ||||||
|  |     action_types(Action). | ||||||
|  |  | ||||||
|  | numeric_types(number(_)) --> | ||||||
|  |     []. | ||||||
|  | numeric_types(character(_)) --> | ||||||
|  |     []. | ||||||
|  | numeric_types(star) --> | ||||||
|  |     [number]. | ||||||
|  | numeric_types(nothing) --> | ||||||
|  |     []. | ||||||
|  |  | ||||||
|  | action_types(Action) --> | ||||||
|  |     { atom_codes(Action, [Code]) }, | ||||||
|  |     { action_types(Code, Types) }, | ||||||
|  |     phrase(Types). | ||||||
|  |  | ||||||
|  |  | ||||||
|  | %% text_codes(Text:text, Codes:codes). | ||||||
|  | text_codes(Var, Codes) :- | ||||||
|  |     var(Var), | ||||||
|  |     !, | ||||||
|  |     string_codes(Var, Codes). | ||||||
|  | text_codes(Atom, Codes) :- | ||||||
|  |     atom(Atom), | ||||||
|  |     !, | ||||||
|  |     atom_codes(Atom, Codes). | ||||||
|  | text_codes(String, Codes) :- | ||||||
|  |     string(String), | ||||||
|  |     !, | ||||||
|  |     string_codes(String, Codes). | ||||||
|  | text_codes(Codes, Codes) :- | ||||||
|  |     is_of_type(codes, Codes). | ||||||
|  |  | ||||||
|  |  | ||||||
|  | numeric_argument(number(N)) --> | ||||||
|  |     integer(N). | ||||||
|  | numeric_argument(character(C)) --> | ||||||
|  |     "`", | ||||||
|  |     [C]. | ||||||
|  | numeric_argument(star) --> | ||||||
|  |     "*". | ||||||
|  | numeric_argument(nothing) --> | ||||||
|  |     "". | ||||||
|  |  | ||||||
|  |  | ||||||
|  | modifier_argument(colon) --> | ||||||
|  |     ":". | ||||||
|  | modifier_argument(no_colon) --> | ||||||
|  |     \+ ":". | ||||||
|  |  | ||||||
|  |  | ||||||
|  | action(Action) --> | ||||||
|  |     [C], | ||||||
|  |     { is_action(C) }, | ||||||
|  |     { atom_codes(Action, [C]) }. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | %% is_action(+Action:integer) is semidet. | ||||||
|  | %% is_action(-Action:integer) is multi. | ||||||
|  | % | ||||||
|  | %  True if Action is a valid format/2 action character. Iterates all | ||||||
|  | %  acceptable action characters, if Action is unbound. | ||||||
|  | is_action(Action) :- | ||||||
|  |     action_types(Action, _). | ||||||
|  |  | ||||||
|  | %% action_types(?Action:integer, ?Types:list(type)) | ||||||
|  | % | ||||||
|  | %  True if Action consumes arguments matching Types. An action (like | ||||||
|  | %  `~`), which consumes no arguments, has `Types=[]`.  For example, | ||||||
|  | % | ||||||
|  | %      ?- action_types(0'~, Types). | ||||||
|  | %      Types = []. | ||||||
|  | %      ?- action_types(0'a, Types). | ||||||
|  | %      Types = [atom]. | ||||||
|  | action_types(0'~, []). | ||||||
|  | action_types(0'a, [atom]). | ||||||
|  | action_types(0'c, [integer]).  % specifically, a code | ||||||
|  | action_types(0'd, [integer]). | ||||||
|  | action_types(0'D, [integer]). | ||||||
|  | action_types(0'e, [float]). | ||||||
|  | action_types(0'E, [float]). | ||||||
|  | action_types(0'f, [float]). | ||||||
|  | action_types(0'g, [float]). | ||||||
|  | action_types(0'G, [float]). | ||||||
|  | action_types(0'i, [any]). | ||||||
|  | action_types(0'I, [integer]). | ||||||
|  | action_types(0'k, [any]). | ||||||
|  | action_types(0'n, []). | ||||||
|  | action_types(0'N, []). | ||||||
|  | action_types(0'p, [any]). | ||||||
|  | action_types(0'q, [any]). | ||||||
|  | action_types(0'r, [integer]). | ||||||
|  | action_types(0'R, [integer]). | ||||||
|  | action_types(0's, [text]). | ||||||
|  | action_types(0'@, [callable]). | ||||||
|  | action_types(0't, []). | ||||||
|  | action_types(0'|, []). | ||||||
|  | action_types(0'+, []). | ||||||
|  | action_types(0'w, [any]). | ||||||
|  | action_types(0'W, [any, list]). | ||||||
							
								
								
									
										194
									
								
								samples/Prolog/func.pl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										194
									
								
								samples/Prolog/func.pl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,194 @@ | |||||||
|  | :- module(func, [ op(675, xfy, ($)) | ||||||
|  |                 , op(650, xfy, (of)) | ||||||
|  |                 , ($)/2 | ||||||
|  |                 , (of)/2 | ||||||
|  |                 ]). | ||||||
|  | :- use_module(library(list_util), [xfy_list/3]). | ||||||
|  | :- use_module(library(function_expansion)). | ||||||
|  | :- use_module(library(arithmetic)). | ||||||
|  | :- use_module(library(error)). | ||||||
|  |  | ||||||
|  |  | ||||||
|  | % true if the module whose terms are being read has specifically | ||||||
|  | % imported library(func). | ||||||
|  | wants_func :- | ||||||
|  |     prolog_load_context(module, Module), | ||||||
|  |     Module \== func,  % we don't want func sugar ourselves | ||||||
|  |     predicate_property(Module:of(_,_),imported_from(func)). | ||||||
|  |  | ||||||
|  |  | ||||||
|  | %%  compile_function(+Term, -In, -Out, -Goal) is semidet. | ||||||
|  | % | ||||||
|  | %   True if Term represents a function from In to Out | ||||||
|  | %   implemented by calling Goal.  This multifile hook is | ||||||
|  | %   called by $/2 and of/2 to convert a term into a goal. | ||||||
|  | %   It's used at compile time for macro expansion. | ||||||
|  | %   It's used at run time to handle functions which aren't | ||||||
|  | %   known at compile time. | ||||||
|  | %   When called as a hook, Term is guaranteed to be =nonvar=. | ||||||
|  | % | ||||||
|  | %   For example, to treat library(assoc) terms as functions which | ||||||
|  | %   map a key to a value, one might define: | ||||||
|  | % | ||||||
|  | %       :- multifile compile_function/4. | ||||||
|  | %       compile_function(Assoc, Key, Value, Goal) :- | ||||||
|  | %           is_assoc(Assoc), | ||||||
|  | %           Goal = get_assoc(Key, Assoc, Value). | ||||||
|  | % | ||||||
|  | %   Then one could write: | ||||||
|  | % | ||||||
|  | %       list_to_assoc([a-1, b-2, c-3], Assoc), | ||||||
|  | %       Two = Assoc $ b, | ||||||
|  | :- multifile compile_function/4. | ||||||
|  | compile_function(Var, _, _, _) :- | ||||||
|  |     % variables storing functions must be evaluated at run time | ||||||
|  |     % and can't be compiled, a priori, into a goal | ||||||
|  |     var(Var), | ||||||
|  |     !, | ||||||
|  |     fail. | ||||||
|  | compile_function(Expr, In, Out, Out is Expr) :- | ||||||
|  |     % arithmetic expression of one variable are simply evaluated | ||||||
|  |     \+ string(Expr),  % evaluable/1 throws exception with strings | ||||||
|  |     arithmetic:evaluable(Expr), | ||||||
|  |     term_variables(Expr, [In]). | ||||||
|  | compile_function(F, In, Out, func:Goal) :- | ||||||
|  |     % composed functions | ||||||
|  |     function_composition_term(F), | ||||||
|  |     user:function_expansion(F, func:Functor, true), | ||||||
|  |     Goal =.. [Functor,In,Out]. | ||||||
|  | compile_function(F, In, Out, Goal) :- | ||||||
|  |     % string interpolation via format templates | ||||||
|  |     format_template(F), | ||||||
|  |     ( atom(F) -> | ||||||
|  |         Goal = format(atom(Out), F, In) | ||||||
|  |     ; string(F) -> | ||||||
|  |         Goal = format(string(Out), F, In) | ||||||
|  |     ; error:has_type(codes, F) -> | ||||||
|  |         Goal = format(codes(Out), F, In) | ||||||
|  |     ; fail  % to be explicit | ||||||
|  |     ). | ||||||
|  | compile_function(Dict, In, Out, Goal) :- | ||||||
|  |     is_dict(Dict), | ||||||
|  |     Goal = get_dict(In, Dict, Out). | ||||||
|  |  | ||||||
|  | %%	$(+Function, +Argument) is det. | ||||||
|  | % | ||||||
|  | %	Apply Function to an Argument.  A Function is any predicate | ||||||
|  | %	whose final argument generates output and whose penultimate argument | ||||||
|  | %	accepts input. | ||||||
|  | % | ||||||
|  | %	This is realized by expanding function application to chained | ||||||
|  | %	predicate calls at compile time.  Function application itself can | ||||||
|  | %	be chained. | ||||||
|  | % | ||||||
|  | %	== | ||||||
|  | %	Reversed = reverse $ sort $ [c,d,b]. | ||||||
|  | %	== | ||||||
|  | :- meta_predicate $(2,+). | ||||||
|  | $(_,_) :- | ||||||
|  |     throw(error(permission_error(call, predicate, ($)/2), | ||||||
|  |           context(_, '$/2 must be subject to goal expansion'))). | ||||||
|  |  | ||||||
|  | user:function_expansion($(F,X), Y, Goal) :- | ||||||
|  |     wants_func, | ||||||
|  |     ( func:compile_function(F, X, Y, Goal) -> | ||||||
|  |         true | ||||||
|  |     ; var(F) -> Goal =      % defer until run time | ||||||
|  |         ( func:compile_function(F, X, Y, P) -> | ||||||
|  |             call(P) | ||||||
|  |         ; call(F, X, Y) | ||||||
|  |         ) | ||||||
|  |     ; Goal = call(F, X, Y) | ||||||
|  |     ). | ||||||
|  |  | ||||||
|  |  | ||||||
|  | %%	of(+F, +G) is det. | ||||||
|  | % | ||||||
|  | %	Creates a new function by composing F and G.  The functions are | ||||||
|  | %	composed at compile time to create a new, compiled predicate which | ||||||
|  | %	behaves like a function.  Function composition can be chained. | ||||||
|  | %	Composed functions can also be applied with $/2. | ||||||
|  | % | ||||||
|  | %	== | ||||||
|  | %	Reversed = reverse of sort $ [c,d,b]. | ||||||
|  | %	== | ||||||
|  | :- meta_predicate of(2,2). | ||||||
|  | of(_,_). | ||||||
|  |  | ||||||
|  |  | ||||||
|  | %%  format_template(Format) is semidet. | ||||||
|  | % | ||||||
|  | %   True if Format is a template string suitable for format/3. | ||||||
|  | %   The current check is very naive and should be improved. | ||||||
|  | format_template(Format) :- | ||||||
|  |     atom(Format), !, | ||||||
|  |     atom_codes(Format, Codes), | ||||||
|  |     format_template(Codes). | ||||||
|  | format_template(Format) :- | ||||||
|  |     string(Format), | ||||||
|  |     !, | ||||||
|  |     string_codes(Format, Codes), | ||||||
|  |     format_template(Codes). | ||||||
|  | format_template(Format) :- | ||||||
|  |     error:has_type(codes, Format), | ||||||
|  |     memberchk(0'~, Format).  % ' fix syntax highlighting | ||||||
|  |  | ||||||
|  |  | ||||||
|  | % True if the argument is a function composition term | ||||||
|  | function_composition_term(of(_,_)). | ||||||
|  |  | ||||||
|  | % Converts a function composition term into a list of functions to compose | ||||||
|  | functions_to_compose(Term, Funcs) :- | ||||||
|  |     functor(Term, Op, 2), | ||||||
|  |     Op = (of), | ||||||
|  |     xfy_list(Op, Term, Funcs). | ||||||
|  |  | ||||||
|  | % Thread a state variable through a list of functions.  This is similar | ||||||
|  | % to a DCG expansion, but much simpler. | ||||||
|  | thread_state([], [], Out, Out). | ||||||
|  | thread_state([F|Funcs], [Goal|Goals], In, Out) :- | ||||||
|  |     ( compile_function(F, In, Tmp, Goal) -> | ||||||
|  |         true | ||||||
|  |     ; var(F) -> | ||||||
|  |         instantiation_error(F) | ||||||
|  |     ; F =.. [Functor|Args], | ||||||
|  |       append(Args, [In, Tmp], NewArgs), | ||||||
|  |       Goal =.. [Functor|NewArgs] | ||||||
|  |     ), | ||||||
|  |     thread_state(Funcs, Goals, Tmp, Out). | ||||||
|  |  | ||||||
|  | user:function_expansion(Term, func:Functor, true) :- | ||||||
|  |     wants_func, | ||||||
|  |     functions_to_compose(Term, Funcs), | ||||||
|  |     debug(func, 'building composed function for: ~w', [Term]), | ||||||
|  |     variant_sha1(Funcs, Sha), | ||||||
|  |     format(atom(Functor), 'composed_function_~w', [Sha]), | ||||||
|  |     debug(func, '  name: ~s', [Functor]), | ||||||
|  |     ( func:current_predicate(Functor/2) -> | ||||||
|  |         debug(func, '  composed predicate already exists', []) | ||||||
|  |     ; true -> | ||||||
|  |         reverse(Funcs, RevFuncs), | ||||||
|  |         thread_state(RevFuncs, Threaded, In, Out), | ||||||
|  |         xfy_list(',', Body, Threaded), | ||||||
|  |         Head =.. [Functor, In, Out], | ||||||
|  |         func:assert(Head :- Body), | ||||||
|  |         func:compile_predicates([Functor/2]) | ||||||
|  |     ). | ||||||
|  |  | ||||||
|  |  | ||||||
|  | % support foo(x,~,y) evaluation | ||||||
|  | user:function_expansion(Term, Output, Goal) :- | ||||||
|  |     wants_func, | ||||||
|  |     compound(Term), | ||||||
|  |  | ||||||
|  |     % has a single ~ argument | ||||||
|  |     setof( X | ||||||
|  |          , ( arg(X,Term,Arg), Arg == '~' ) | ||||||
|  |          , [N] | ||||||
|  |          ), | ||||||
|  |  | ||||||
|  |     % replace ~ with a variable | ||||||
|  |     Term =.. [Name|Args0], | ||||||
|  |     nth1(N, Args0, ~, Rest), | ||||||
|  |     nth1(N, Args, Output, Rest), | ||||||
|  |     Goal =.. [Name|Args]. | ||||||
							
								
								
									
										241
									
								
								samples/Python/Cinema4DPythonPlugin.pyp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										241
									
								
								samples/Python/Cinema4DPythonPlugin.pyp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,241 @@ | |||||||
|  | # | ||||||
|  | # Cinema 4D Python Plugin Source file | ||||||
|  | # https://github.com/nr-plugins/nr-xpresso-alignment-tools | ||||||
|  | # | ||||||
|  |  | ||||||
|  | # coding: utf-8 | ||||||
|  | # | ||||||
|  | # Copyright (C) 2012, Niklas Rosenstein | ||||||
|  | # Licensed under the GNU General Public License | ||||||
|  | # | ||||||
|  | # XPAT - XPresso Alignment Tools | ||||||
|  | # ============================== | ||||||
|  | # | ||||||
|  | # The XPAT plugin provides tools for aligning nodes in the Cinema 4D | ||||||
|  | # XPresso Editor, improving readability of complex XPresso set-ups | ||||||
|  | # immensively. | ||||||
|  | # | ||||||
|  | # Requirements: | ||||||
|  | # - MAXON Cinema 4D R13+ | ||||||
|  | # - Python `c4dtools` library. Get it from | ||||||
|  | #   http://github.com/NiklasRosenstein/c4dtools | ||||||
|  | # | ||||||
|  | # Author:  Niklas Rosenstein <rosensteinniklas@gmail.com> | ||||||
|  | # Version: 1.1 (01/06/2012) | ||||||
|  |  | ||||||
|  | import os | ||||||
|  | import sys | ||||||
|  | import json | ||||||
|  | import c4d | ||||||
|  | import c4dtools | ||||||
|  | import itertools | ||||||
|  |  | ||||||
|  | from c4d.modules import graphview as gv | ||||||
|  | from c4dtools.misc import graphnode | ||||||
|  |  | ||||||
|  | res, importer = c4dtools.prepare(__file__, __res__) | ||||||
|  | settings = c4dtools.helpers.Attributor({ | ||||||
|  |     'options_filename': res.file('config.json'), | ||||||
|  | }) | ||||||
|  |  | ||||||
|  | def align_nodes(nodes, mode, spacing): | ||||||
|  |     r""" | ||||||
|  |     Aligns the passed nodes horizontally and apply the minimum spacing | ||||||
|  |     between them. | ||||||
|  |     """ | ||||||
|  |  | ||||||
|  |     modes = ['horizontal', 'vertical'] | ||||||
|  |     if not nodes: | ||||||
|  |         return | ||||||
|  |     if mode not in modes: | ||||||
|  |         raise ValueError('invalid mode, choices are: ' + ', '.join(modes)) | ||||||
|  |  | ||||||
|  |     get_0 = lambda x: x.x | ||||||
|  |     get_1 = lambda x: x.y | ||||||
|  |     set_0 = lambda x, v: setattr(x, 'x', v) | ||||||
|  |     set_1 = lambda x, v: setattr(x, 'y', v) | ||||||
|  |  | ||||||
|  |     if mode == 'vertical': | ||||||
|  |         get_0, get_1 = get_1, get_0 | ||||||
|  |         set_0, set_1 = set_1, set_0 | ||||||
|  |  | ||||||
|  |     nodes = [graphnode.GraphNode(n) for n in nodes] | ||||||
|  |     nodes.sort(key=lambda n: get_0(n.position)) | ||||||
|  |     midpoint = graphnode.find_nodes_mid(nodes) | ||||||
|  |  | ||||||
|  |     # Apply the spacing between the nodes relative to the coordinate-systems | ||||||
|  |     # origin. We can offset them later because we now the nodes' midpoint | ||||||
|  |     # already. | ||||||
|  |     first_position = nodes[0].position | ||||||
|  |     new_positions = [] | ||||||
|  |     prev_offset = 0 | ||||||
|  |     for node in nodes: | ||||||
|  |         # Compute the relative position of the node. | ||||||
|  |         position = node.position | ||||||
|  |         set_0(position, get_0(position) - get_0(first_position)) | ||||||
|  |  | ||||||
|  |         # Obtain it's size and check if the node needs to be re-placed. | ||||||
|  |         size = node.size | ||||||
|  |         if get_0(position) < prev_offset: | ||||||
|  |             set_0(position, prev_offset) | ||||||
|  |             prev_offset += spacing + get_0(size) | ||||||
|  |         else: | ||||||
|  |             prev_offset = get_0(position) + get_0(size) + spacing | ||||||
|  |  | ||||||
|  |         set_1(position, get_1(midpoint)) | ||||||
|  |         new_positions.append(position) | ||||||
|  |  | ||||||
|  |     # Center the nodes again. | ||||||
|  |     bbox_size = prev_offset - spacing | ||||||
|  |     bbox_size_2 = bbox_size * 0.5 | ||||||
|  |     for node, position in itertools.izip(nodes, new_positions): | ||||||
|  |         # TODO: Here is some issue with offsetting the nodes. Some value | ||||||
|  |         # dependent on the spacing must be added here to not make the nodes | ||||||
|  |         # move horizontally/vertically although they have already been | ||||||
|  |         # aligned. | ||||||
|  |         set_0(position, get_0(midpoint) + get_0(position) - bbox_size_2 + spacing) | ||||||
|  |         node.position = position | ||||||
|  |  | ||||||
|  | def align_nodes_shortcut(mode, spacing): | ||||||
|  |     master = gv.GetMaster(0) | ||||||
|  |     if not master: | ||||||
|  |         return | ||||||
|  |  | ||||||
|  |     root = master.GetRoot() | ||||||
|  |     if not root: | ||||||
|  |         return | ||||||
|  |  | ||||||
|  |     nodes = graphnode.find_selected_nodes(root) | ||||||
|  |     if nodes: | ||||||
|  |         master.AddUndo() | ||||||
|  |         align_nodes(nodes, mode, spacing) | ||||||
|  |         c4d.EventAdd() | ||||||
|  |  | ||||||
|  |     return True | ||||||
|  |  | ||||||
|  | class XPAT_Options(c4dtools.helpers.Attributor): | ||||||
|  |     r""" | ||||||
|  |     This class organizes the options for the XPAT plugin, i.e. | ||||||
|  |     validating, loading and saving. | ||||||
|  |     """ | ||||||
|  |  | ||||||
|  |     defaults = { | ||||||
|  |         'hspace': 50, | ||||||
|  |         'vspace': 20, | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     def __init__(self, filename=None): | ||||||
|  |         super(XPAT_Options, self).__init__() | ||||||
|  |         self.load(filename) | ||||||
|  |  | ||||||
|  |     def load(self, filename=None): | ||||||
|  |         r""" | ||||||
|  |         Load the options from file pointed to by filename. If filename | ||||||
|  |         is None, it defaults to the filename defined in options in the | ||||||
|  |         global scope. | ||||||
|  |         """ | ||||||
|  |  | ||||||
|  |         if filename is None: | ||||||
|  |             filename = settings.options_filename | ||||||
|  |  | ||||||
|  |         if os.path.isfile(filename): | ||||||
|  |             self.dict_ = self.defaults.copy() | ||||||
|  |             with open(filename, 'rb') as fp: | ||||||
|  |                 self.dict_.update(json.load(fp)) | ||||||
|  |         else: | ||||||
|  |             self.dict_ = self.defaults.copy() | ||||||
|  |             self.save() | ||||||
|  |  | ||||||
|  |     def save(self, filename=None): | ||||||
|  |         r""" | ||||||
|  |         Save the options defined in XPAT_Options instance to HD. | ||||||
|  |         """ | ||||||
|  |  | ||||||
|  |         if filename is None: | ||||||
|  |             filename = settings.options_filename | ||||||
|  |  | ||||||
|  |         values = dict((k, v) for k, v in self.dict_.iteritems() | ||||||
|  |                       if k in self.defaults) | ||||||
|  |         with open(filename, 'wb') as fp: | ||||||
|  |             json.dump(values, fp) | ||||||
|  |  | ||||||
|  | class XPAT_OptionsDialog(c4d.gui.GeDialog): | ||||||
|  |     r""" | ||||||
|  |     This class implements the behavior of the XPAT options dialog, | ||||||
|  |     taking care of storing the options on the HD and loading them | ||||||
|  |     again on startup. | ||||||
|  |     """ | ||||||
|  |  | ||||||
|  |     # c4d.gui.GeDialog | ||||||
|  |  | ||||||
|  |     def CreateLayout(self): | ||||||
|  |         return self.LoadDialogResource(res.DLG_OPTIONS) | ||||||
|  |  | ||||||
|  |     def InitValues(self): | ||||||
|  |         self.SetLong(res.EDT_HSPACE, options.hspace) | ||||||
|  |         self.SetLong(res.EDT_VSPACE, options.vspace) | ||||||
|  |         return True | ||||||
|  |  | ||||||
|  |     def Command(self, id, msg): | ||||||
|  |         if id == res.BTN_SAVE: | ||||||
|  |             options.hspace = self.GetLong(res.EDT_HSPACE) | ||||||
|  |             options.vspace = self.GetLong(res.EDT_VSPACE) | ||||||
|  |             options.save() | ||||||
|  |             self.Close() | ||||||
|  |         return True | ||||||
|  |  | ||||||
|  | class XPAT_Command_OpenOptionsDialog(c4dtools.plugins.Command): | ||||||
|  |     r""" | ||||||
|  |     This Cinema 4D CommandData plugin opens the XPAT options dialog | ||||||
|  |     when being executed. | ||||||
|  |     """ | ||||||
|  |  | ||||||
|  |     def __init__(self): | ||||||
|  |         super(XPAT_Command_OpenOptionsDialog, self).__init__() | ||||||
|  |         self._dialog = None | ||||||
|  |  | ||||||
|  |     @property | ||||||
|  |     def dialog(self): | ||||||
|  |         if not self._dialog: | ||||||
|  |             self._dialog = XPAT_OptionsDialog() | ||||||
|  |         return self._dialog | ||||||
|  |  | ||||||
|  |     # c4dtools.plugins.Command | ||||||
|  |  | ||||||
|  |     PLUGIN_ID = 1029621 | ||||||
|  |     PLUGIN_NAME = res.string.XPAT_COMMAND_OPENOPTIONSDIALOG() | ||||||
|  |     PLUGIN_HELP = res.string.XPAT_COMMAND_OPENOPTIONSDIALOG_HELP() | ||||||
|  |  | ||||||
|  |     # c4d.gui.CommandData | ||||||
|  |  | ||||||
|  |     def Execute(self, doc): | ||||||
|  |         return self.dialog.Open(c4d.DLG_TYPE_MODAL) | ||||||
|  |  | ||||||
|  | class XPAT_Command_AlignHorizontal(c4dtools.plugins.Command): | ||||||
|  |  | ||||||
|  |     PLUGIN_ID = 1029538 | ||||||
|  |     PLUGIN_NAME = res.string.XPAT_COMMAND_ALIGNHORIZONTAL() | ||||||
|  |     PLUGIN_ICON = res.file('xpresso-align-h.png') | ||||||
|  |     PLUGIN_HELP = res.string.XPAT_COMMAND_ALIGNHORIZONTAL_HELP() | ||||||
|  |  | ||||||
|  |     def Execute(self, doc): | ||||||
|  |         align_nodes_shortcut('horizontal', options.hspace) | ||||||
|  |         return True | ||||||
|  |  | ||||||
|  | class XPAT_Command_AlignVertical(c4dtools.plugins.Command): | ||||||
|  |  | ||||||
|  |     PLUGIN_ID = 1029539 | ||||||
|  |     PLUGIN_NAME = res.string.XPAT_COMMAND_ALIGNVERTICAL() | ||||||
|  |     PLUGIN_ICON = res.file('xpresso-align-v.png') | ||||||
|  |     PLUGIN_HELP = res.string.XPAT_COMMAND_ALIGNVERTICAL_HELP() | ||||||
|  |  | ||||||
|  |     def Execute(self, doc): | ||||||
|  |         align_nodes_shortcut('vertical', options.vspace) | ||||||
|  |         return True | ||||||
|  |  | ||||||
|  | options = XPAT_Options() | ||||||
|  |  | ||||||
|  | if __name__ == '__main__': | ||||||
|  |     c4dtools.plugins.main() | ||||||
|  |  | ||||||
|  |  | ||||||
							
								
								
									
										30
									
								
								samples/QMake/complex.pro
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								samples/QMake/complex.pro
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,30 @@ | |||||||
|  | # This QMake file is complex, as it usese | ||||||
|  | # boolean operators and function calls | ||||||
|  |  | ||||||
|  | QT += core gui | ||||||
|  | greaterThan(QT_MAJOR_VERSION, 4): QT += widgets | ||||||
|  |  | ||||||
|  | # We could use some OpenGL right now | ||||||
|  | contains(QT_CONFIG, opengl) | contains(QT_CONFIG, opengles2) { | ||||||
|  |    QT += opengl | ||||||
|  | } else { | ||||||
|  |    DEFINES += QT_NO_OPENGL | ||||||
|  | } | ||||||
|  |  | ||||||
|  | TEMPLATE = app | ||||||
|  | win32 { | ||||||
|  |     TARGET = BlahApp | ||||||
|  |     RC_FILE = Resources/winres.rc | ||||||
|  | } | ||||||
|  | !win32 { TARGET = blahapp } | ||||||
|  |  | ||||||
|  | # Let's add a PRI file! | ||||||
|  | include(functions.pri) | ||||||
|  |  | ||||||
|  | SOURCES += file.cpp | ||||||
|  |  | ||||||
|  | HEADERS  += file.h | ||||||
|  |  | ||||||
|  | FORMS    += file.ui | ||||||
|  |  | ||||||
|  | RESOURCES += res.qrc | ||||||
							
								
								
									
										8
									
								
								samples/QMake/functions.pri
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								samples/QMake/functions.pri
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | |||||||
|  | # QMake include file that calls some functions | ||||||
|  | # and does nothing else... | ||||||
|  |  | ||||||
|  | exists(.git/HEAD) { | ||||||
|  |     system(git rev-parse HEAD >rev.txt) | ||||||
|  | } else { | ||||||
|  |     system(echo ThisIsNotAGitRepo >rev.txt) | ||||||
|  | } | ||||||
							
								
								
									
										2
									
								
								samples/QMake/qmake.script!
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								samples/QMake/qmake.script!
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,2 @@ | |||||||
|  | #!/usr/bin/qmake | ||||||
|  | message(This is QMake.) | ||||||
							
								
								
									
										17
									
								
								samples/QMake/simple.pro
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								samples/QMake/simple.pro
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | |||||||
|  | # Simple QMake file | ||||||
|  |  | ||||||
|  | CONFIG += qt | ||||||
|  | QT += core gui | ||||||
|  | TEMPLATE = app | ||||||
|  | TARGET = simpleapp | ||||||
|  |  | ||||||
|  | SOURCES += file.cpp \ | ||||||
|  |     file2.c \ | ||||||
|  |     This/Is/Folder/file3.cpp | ||||||
|  |  | ||||||
|  | HEADERS += file.h \ | ||||||
|  |     file2.h \ | ||||||
|  |     This/Is/Folder/file3.h | ||||||
|  |  | ||||||
|  | FORMS += This/Is/Folder/file3.ui \ | ||||||
|  |     Test.ui | ||||||
							
								
								
									
										19
									
								
								samples/Ruby/filenames/.pryrc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								samples/Ruby/filenames/.pryrc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,19 @@ | |||||||
|  | Pry.config.commands.import Pry::ExtendedCommands::Experimental | ||||||
|  |  | ||||||
|  | Pry.config.pager = false | ||||||
|  |  | ||||||
|  | Pry.config.color = false | ||||||
|  |  | ||||||
|  | Pry.config.commands.alias_command "lM", "ls -M" | ||||||
|  |  | ||||||
|  | Pry.config.commands.command "add", "Add a list of numbers together" do |*args| | ||||||
|  |   output.puts "Result is: #{args.map(&:to_i).inject(&:+)}" | ||||||
|  | end | ||||||
|  |  | ||||||
|  | Pry.config.history.should_save = false | ||||||
|  |  | ||||||
|  | Pry.config.prompt = [proc { "input> " }, | ||||||
|  |                      proc { "     | " }] | ||||||
|  |  | ||||||
|  | # Disable pry-buggy-plug: | ||||||
|  | Pry.plugins["buggy-plug"].disable! | ||||||
							
								
								
									
										1
									
								
								samples/STON/Array.ston
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								samples/STON/Array.ston
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | |||||||
|  | [1, 2, 3] | ||||||
							
								
								
									
										1
									
								
								samples/STON/Dictionary.ston
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								samples/STON/Dictionary.ston
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | |||||||
|  | {#a : 1, #b : 2} | ||||||
							
								
								
									
										4
									
								
								samples/STON/Rectangle.ston
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								samples/STON/Rectangle.ston
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,4 @@ | |||||||
|  | Rectangle { | ||||||
|  |    #origin : Point [ -40, -15 ], | ||||||
|  |    #corner : Point [ 60, 35 ] | ||||||
|  |  } | ||||||
							
								
								
									
										15
									
								
								samples/STON/TestDomainObject.ston
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								samples/STON/TestDomainObject.ston
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,15 @@ | |||||||
|  | TestDomainObject { | ||||||
|  |   #created : DateAndTime [ '2012-02-14T16:40:15+01:00' ], | ||||||
|  |   #modified : DateAndTime [ '2012-02-14T16:40:18+01:00' ], | ||||||
|  |   #integer : 39581, | ||||||
|  |   #float : 73.84789359463944, | ||||||
|  |   #description : 'This is a test', | ||||||
|  |   #color : #green, | ||||||
|  |   #tags : [ | ||||||
|  |     #two, | ||||||
|  |     #beta, | ||||||
|  |     #medium | ||||||
|  |   ], | ||||||
|  |   #bytes : ByteArray [ 'afabfdf61d030f43eb67960c0ae9f39f' ], | ||||||
|  |   #boolean : false | ||||||
|  | } | ||||||
							
								
								
									
										30
									
								
								samples/STON/ZNResponse.ston
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								samples/STON/ZNResponse.ston
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,30 @@ | |||||||
|  | ZnResponse { | ||||||
|  |    #headers : ZnHeaders { | ||||||
|  |      #headers : ZnMultiValueDictionary { | ||||||
|  |         'Date' : 'Fri, 04 May 2012 20:09:23 GMT', | ||||||
|  |         'Modification-Date' : 'Thu, 10 Feb 2011 08:32:30 GMT', | ||||||
|  |         'Content-Length' : '113', | ||||||
|  |         'Server' : 'Zinc HTTP Components 1.0', | ||||||
|  |         'Vary' : 'Accept-Encoding', | ||||||
|  |         'Connection' : 'close', | ||||||
|  |         'Content-Type' : 'text/html;charset=utf-8' | ||||||
|  |      } | ||||||
|  |    }, | ||||||
|  |    #entity : ZnStringEntity { | ||||||
|  |      #contentType : ZnMimeType { | ||||||
|  |         #main : 'text', | ||||||
|  |         #sub : 'html', | ||||||
|  |         #parameters : { | ||||||
|  |             'charset' : 'utf-8' | ||||||
|  |         } | ||||||
|  |      }, | ||||||
|  |      #contentLength : 113, | ||||||
|  |      #string : '<html>\n<head><title>Small</title></head>\n<body><h1>Small</h1><p>This is a small HTML document</p></body>\n</html>\n', | ||||||
|  |      #encoder : ZnUTF8Encoder { } | ||||||
|  |    }, | ||||||
|  |    #statusLine : ZnStatusLine { | ||||||
|  |      #version : 'HTTP/1.1', | ||||||
|  |      #code : 200, | ||||||
|  |      #reason : 'OK' | ||||||
|  |    } | ||||||
|  |  } | ||||||
							
								
								
									
										24
									
								
								samples/STON/methodProperties.ston
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								samples/STON/methodProperties.ston
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,24 @@ | |||||||
|  | { | ||||||
|  | 	"class" : { | ||||||
|  | 		 }, | ||||||
|  | 	"instance" : { | ||||||
|  | 		"clientList:listElement:" : "dkh 03/20/2014 16:27", | ||||||
|  | 		"copyObjectMenuAction:selectionIndex:" : "dkh 10/13/2013 10:20", | ||||||
|  | 		"definitionForSelection:" : "dkh 10/13/2013 10:15", | ||||||
|  | 		"editMenuActionSpec" : "dkh 10/13/2013 10:19", | ||||||
|  | 		"itemSelected:listElement:selectedIndex:shiftPressed:" : "dkh 10/20/2013 11:06", | ||||||
|  | 		"menuActionSpec:" : "dkh 10/19/2013 17:12", | ||||||
|  | 		"repository:" : "dkh 10/19/2013 17:36", | ||||||
|  | 		"theList" : "dkh 10/12/2013 15:51", | ||||||
|  | 		"versionInfoBlock:" : "dkh 10/19/2013 17:08", | ||||||
|  | 		"versionInfoDiffVsSelection:selectedIndex:" : "dkh 10/19/2013 17:48", | ||||||
|  | 		"versionInfoDiffVsWorkingCopy:selectedIndex:" : "dkh 10/20/2013 12:36", | ||||||
|  | 		"versionInfoSelect:selectedIndex:" : "dkh 10/12/2013 17:04", | ||||||
|  | 		"versionInfos" : "dkh 10/19/2013 17:13", | ||||||
|  | 		"versionSummaryIsClosing" : "dkh 10/20/2013 10:19", | ||||||
|  | 		"windowIsClosing:" : "dkh 10/20/2013 10:39", | ||||||
|  | 		"windowLabel" : "dkh 05/20/2014 11:00", | ||||||
|  | 		"windowLocation" : "dkh 05/23/2014 10:17", | ||||||
|  | 		"windowName" : "dkh 10/12/2013 16:00", | ||||||
|  | 		"workingCopy" : "dkh 10/12/2013 16:16", | ||||||
|  | 		"workingCopy:" : "dkh 10/12/2013 16:17" } } | ||||||
							
								
								
									
										19
									
								
								samples/STON/properties.ston
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								samples/STON/properties.ston
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,19 @@ | |||||||
|  | { | ||||||
|  | 	"category" : "Topez-Server-Core", | ||||||
|  | 	"classinstvars" : [ | ||||||
|  | 		 ], | ||||||
|  | 	"classvars" : [ | ||||||
|  | 		 ], | ||||||
|  | 	"commentStamp" : "", | ||||||
|  | 	"instvars" : [ | ||||||
|  | 		"workingCopy", | ||||||
|  | 		"repository", | ||||||
|  | 		"versionInfos", | ||||||
|  | 		"versionInfoBlock", | ||||||
|  | 		"selectedVersionInfo", | ||||||
|  | 		"versionInfoSummaryWindowId" ], | ||||||
|  | 	"name" : "TDVersionInfoBrowser", | ||||||
|  | 	"pools" : [ | ||||||
|  | 		 ], | ||||||
|  | 	"super" : "TDAbstractMonticelloToolBuilder", | ||||||
|  | 	"type" : "normal" } | ||||||
							
								
								
									
										31
									
								
								samples/Slim/sample.slim
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								samples/Slim/sample.slim
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,31 @@ | |||||||
|  | doctype html | ||||||
|  | html | ||||||
|  |   head | ||||||
|  |     title Slim Examples | ||||||
|  |     meta name="keywords" content="template language" | ||||||
|  |     meta name="author" content=author | ||||||
|  |     javascript: | ||||||
|  |       alert('Slim supports embedded javascript!') | ||||||
|  |  | ||||||
|  |   body | ||||||
|  |     h1 Markup examples | ||||||
|  |  | ||||||
|  |     #content | ||||||
|  |       p This example shows you how a basic Slim file looks like. | ||||||
|  |  | ||||||
|  |       == yield | ||||||
|  |  | ||||||
|  |       - unless items.empty? | ||||||
|  |         table | ||||||
|  |           - for item in items do | ||||||
|  |             tr | ||||||
|  |               td.name = item.name | ||||||
|  |               td.price = item.price | ||||||
|  |       - else | ||||||
|  |         p | ||||||
|  |          | No items found.  Please add some inventory. | ||||||
|  |            Thank you! | ||||||
|  |  | ||||||
|  |     div id="footer" | ||||||
|  |       = render 'footer' | ||||||
|  |       | Copyright © #{year} #{author} | ||||||
							
								
								
									
										75
									
								
								samples/Standard ML/Foo.ML
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								samples/Standard ML/Foo.ML
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,75 @@ | |||||||
|  |  | ||||||
|  | structure LazyBase:> LAZY_BASE = | ||||||
|  |    struct | ||||||
|  |       type 'a lazy = unit -> 'a | ||||||
|  |  | ||||||
|  |       exception Undefined | ||||||
|  |  | ||||||
|  |       fun delay f = f | ||||||
|  |  | ||||||
|  |       fun force f = f() | ||||||
|  |  | ||||||
|  |       val undefined = fn () => raise Undefined | ||||||
|  |    end | ||||||
|  |  | ||||||
|  | structure LazyMemoBase:> LAZY_BASE = | ||||||
|  |    struct  | ||||||
|  |  | ||||||
|  |       datatype 'a susp = NotYet of unit -> 'a | ||||||
|  |                        | Done of 'a | ||||||
|  |  | ||||||
|  |       type 'a lazy = unit -> 'a susp ref | ||||||
|  |  | ||||||
|  |       exception Undefined | ||||||
|  |  | ||||||
|  |       fun delay f =  | ||||||
|  |           let  | ||||||
|  |              val r = ref (NotYet f) | ||||||
|  |           in | ||||||
|  |              fn () => r | ||||||
|  |           end | ||||||
|  |  | ||||||
|  |       fun force f =  | ||||||
|  |           case f() of | ||||||
|  |              ref (Done x) => x | ||||||
|  |            | r as ref (NotYet f') => | ||||||
|  |              let | ||||||
|  |                 val a = f'() | ||||||
|  |              in | ||||||
|  |                 r := Done a | ||||||
|  |               ; a | ||||||
|  |              end | ||||||
|  |  | ||||||
|  |       val undefined = fn () => raise Undefined | ||||||
|  |    end | ||||||
|  |  | ||||||
|  | functor LazyFn(B: LAZY_BASE): LAZY' = | ||||||
|  |    struct | ||||||
|  |  | ||||||
|  |       open B | ||||||
|  |  | ||||||
|  |       fun inject x = delay (fn () => x) | ||||||
|  |  | ||||||
|  |       fun isUndefined x = | ||||||
|  |           (ignore (force x) | ||||||
|  |          ; false) | ||||||
|  |           handle Undefined => true | ||||||
|  |                                | ||||||
|  |       fun toString f x = if isUndefined x then "_|_" else f (force x) | ||||||
|  |  | ||||||
|  |       fun eqBy p (x,y) = p(force x,force y) | ||||||
|  |       fun eq (x,y) = eqBy op= (x,y) | ||||||
|  |       fun compare p (x,y) = p(force x,force y) | ||||||
|  |  | ||||||
|  |       structure Ops =  | ||||||
|  |          struct  | ||||||
|  |             val ! = force | ||||||
|  |             val ? = inject | ||||||
|  |          end | ||||||
|  |  | ||||||
|  |       fun map f x = delay (fn () => f (force x)) | ||||||
|  |  | ||||||
|  |    end | ||||||
|  |  | ||||||
|  | structure Lazy' = LazyFn(LazyBase) | ||||||
|  | structure LazyMemo = LazyFn(LazyMemoBase) | ||||||
							
								
								
									
										43
									
								
								samples/Text/ISO-2022-KR.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								samples/Text/ISO-2022-KR.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,43 @@ | |||||||
|  | $)C# | ||||||
|  | # Out-AnsiGraph.psm1 | ||||||
|  | # Author:       xcud | ||||||
|  | # History: | ||||||
|  | #       v0.1 September 21, 2009 initial version | ||||||
|  | # | ||||||
|  | # PS Example> ps | select -first 5 | sort -property VM |  | ||||||
|  | #             Out-AnsiGraph ProcessName, VM | ||||||
|  | #                 AEADISRV  14508032 | ||||||
|  | #                  audiodg  50757632 | ||||||
|  | #                  conhost  73740288 | ||||||
|  | # AppleMobileDeviceService  92061696 | ||||||
|  | #                    btdna  126443520 | ||||||
|  | # | ||||||
|  | function Out-AnsiGraph($Parameter1=$null) { | ||||||
|  | 	BEGIN { | ||||||
|  | 		$q = new-object Collections.queue | ||||||
|  | 		$max = 0; $namewidth = 0; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	PROCESS { | ||||||
|  | 		if($_) { | ||||||
|  | 			$name = $_.($Parameter1[0]); | ||||||
|  | 			$val = $_.($Parameter1[1]) | ||||||
|  | 			if($max -lt $val) { $max = $val}		  | ||||||
|  | 			if($namewidth -lt $name.length) {  | ||||||
|  | 				$namewidth = $name.length } | ||||||
|  | 			$q.enqueue(@($name, $val))			 | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	END { | ||||||
|  | 		$q | %{ | ||||||
|  | 			$graph = ""; 0..($_[1]/$max*20) |  | ||||||
|  | 				%{ $graph += "" } | ||||||
|  | 			$name = "{0,$namewidth}" -f $_[0] | ||||||
|  | 			"$name $graph " + $_[1] | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | Export-ModuleMember Out-AnsiGraph | ||||||
							
								
								
									
										703
									
								
								samples/Text/Visual_Battlers.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										703
									
								
								samples/Text/Visual_Battlers.rb
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,703 @@ | |||||||
|  | #============================================================================== | ||||||
|  | #  | ||||||
|  | # <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
									
								
								samples/Text/iso8859-8-i.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								samples/Text/iso8859-8-i.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | |||||||
|  | %<25><><EFBFBD> | ||||||
							
								
								
									
										152
									
								
								samples/VCL/varnish2_default.vcl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										152
									
								
								samples/VCL/varnish2_default.vcl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,152 @@ | |||||||
|  | /*- | ||||||
|  |  * Copyright (c) 2006 Verdens Gang AS | ||||||
|  |  * Copyright (c) 2006-2008 Linpro AS | ||||||
|  |  * All rights reserved. | ||||||
|  |  * | ||||||
|  |  * Author: Poul-Henning Kamp <phk@phk.freebsd.dk> | ||||||
|  |  * | ||||||
|  |  * Redistribution and use in source and binary forms, with or without | ||||||
|  |  * modification, are permitted provided that the following conditions | ||||||
|  |  * are met: | ||||||
|  |  * 1. Redistributions of source code must retain the above copyright | ||||||
|  |  *    notice, this list of conditions and the following disclaimer. | ||||||
|  |  * 2. Redistributions in binary form must reproduce the above copyright | ||||||
|  |  *    notice, this list of conditions and the following disclaimer in the | ||||||
|  |  *    documentation and/or other materials provided with the distribution. | ||||||
|  |  * | ||||||
|  |  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND | ||||||
|  |  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||||
|  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | ||||||
|  |  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE | ||||||
|  |  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||||
|  |  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||||
|  |  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR  | ||||||
|  |  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, | ||||||
|  |  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE | ||||||
|  |  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, | ||||||
|  |  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||||
|  |  * | ||||||
|  |  * $Id$ | ||||||
|  |  * | ||||||
|  |  * The default VCL code. | ||||||
|  |  * | ||||||
|  |  * NB! You do NOT need to copy & paste all of these functions into your | ||||||
|  |  * own vcl code, if you do not provide a definition of one of these | ||||||
|  |  * functions, the compiler will automatically fall back to the default | ||||||
|  |  * code from this file. | ||||||
|  |  * | ||||||
|  |  * This code will be prefixed with a backend declaration built from the | ||||||
|  |  * -b argument. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | sub vcl_recv { | ||||||
|  |     if (req.request != "GET" && | ||||||
|  |       req.request != "HEAD" && | ||||||
|  |       req.request != "PUT" && | ||||||
|  |       req.request != "POST" && | ||||||
|  |       req.request != "TRACE" && | ||||||
|  |       req.request != "OPTIONS" && | ||||||
|  |       req.request != "DELETE") { | ||||||
|  |         /* Non-RFC2616 or CONNECT which is weird. */ | ||||||
|  |         return (pipe); | ||||||
|  |     } | ||||||
|  |     if (req.request != "GET" && req.request != "HEAD") { | ||||||
|  |         /* We only deal with GET and HEAD by default */ | ||||||
|  |         return (pass); | ||||||
|  |     } | ||||||
|  |     if (req.http.Authorization || req.http.Cookie) { | ||||||
|  |         /* Not cacheable by default */ | ||||||
|  |         return (pass); | ||||||
|  |     } | ||||||
|  |     return (lookup); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | sub vcl_pipe { | ||||||
|  |     # Note that only the first request to the backend will have | ||||||
|  |     # X-Forwarded-For set.  If you use X-Forwarded-For and want to | ||||||
|  |     # have it set for all requests, make sure to have: | ||||||
|  |     # set req.http.connection = "close"; | ||||||
|  |     # here.  It is not set by default as it might break some broken web | ||||||
|  |     # applications, like IIS with NTLM authentication. | ||||||
|  |     return (pipe); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | sub vcl_pass { | ||||||
|  |     return (pass); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | sub vcl_hash { | ||||||
|  |     set req.hash += req.url; | ||||||
|  |     if (req.http.host) { | ||||||
|  |         set req.hash += req.http.host; | ||||||
|  |     } else { | ||||||
|  |         set req.hash += server.ip; | ||||||
|  |     } | ||||||
|  |     return (hash); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | sub vcl_hit { | ||||||
|  |     if (!obj.cacheable) { | ||||||
|  |         return (pass); | ||||||
|  |     } | ||||||
|  |     return (deliver); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | sub vcl_miss { | ||||||
|  |     return (fetch); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | sub vcl_fetch { | ||||||
|  |     if (!obj.cacheable) { | ||||||
|  |         return (pass); | ||||||
|  |     } | ||||||
|  |     if (obj.http.Set-Cookie) { | ||||||
|  |         return (pass); | ||||||
|  |     } | ||||||
|  |     set obj.prefetch =  -30s; | ||||||
|  |     return (deliver); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | sub vcl_deliver { | ||||||
|  |     return (deliver); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | sub vcl_discard { | ||||||
|  |     /* XXX: Do not redefine vcl_discard{}, it is not yet supported */ | ||||||
|  |     return (discard); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | sub vcl_prefetch { | ||||||
|  |     /* XXX: Do not redefine vcl_prefetch{}, it is not yet supported */ | ||||||
|  |     return (fetch); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | sub vcl_timeout { | ||||||
|  |     /* XXX: Do not redefine vcl_timeout{}, it is not yet supported */ | ||||||
|  |     return (discard); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | sub vcl_error { | ||||||
|  |     set obj.http.Content-Type = "text/html; charset=utf-8"; | ||||||
|  |     synthetic {" | ||||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||||
|  | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" | ||||||
|  |  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | ||||||
|  | <html> | ||||||
|  |   <head> | ||||||
|  |     <title>"} obj.status " " obj.response {"</title> | ||||||
|  |   </head> | ||||||
|  |   <body> | ||||||
|  |     <h1>Error "} obj.status " " obj.response {"</h1> | ||||||
|  |     <p>"} obj.response {"</p> | ||||||
|  |     <h3>Guru Meditation:</h3> | ||||||
|  |     <p>XID: "} req.xid {"</p> | ||||||
|  |     <hr> | ||||||
|  |     <address> | ||||||
|  |        <a href="http://www.varnish-cache.org/">Varnish cache server</a> | ||||||
|  |     </address> | ||||||
|  |   </body> | ||||||
|  | </html> | ||||||
|  | "}; | ||||||
|  |     return (deliver); | ||||||
|  | } | ||||||
							
								
								
									
										149
									
								
								samples/VCL/varnish3_default.vcl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										149
									
								
								samples/VCL/varnish3_default.vcl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,149 @@ | |||||||
|  | /*- | ||||||
|  |  * Copyright (c) 2006 Verdens Gang AS | ||||||
|  |  * Copyright (c) 2006-2011 Varnish Software AS | ||||||
|  |  * All rights reserved. | ||||||
|  |  * | ||||||
|  |  * Author: Poul-Henning Kamp <phk@phk.freebsd.dk> | ||||||
|  |  * | ||||||
|  |  * Redistribution and use in source and binary forms, with or without | ||||||
|  |  * modification, are permitted provided that the following conditions | ||||||
|  |  * are met: | ||||||
|  |  * 1. Redistributions of source code must retain the above copyright | ||||||
|  |  *    notice, this list of conditions and the following disclaimer. | ||||||
|  |  * 2. Redistributions in binary form must reproduce the above copyright | ||||||
|  |  *    notice, this list of conditions and the following disclaimer in the | ||||||
|  |  *    documentation and/or other materials provided with the distribution. | ||||||
|  |  * | ||||||
|  |  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND | ||||||
|  |  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||||
|  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | ||||||
|  |  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE | ||||||
|  |  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||||
|  |  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||||
|  |  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR  | ||||||
|  |  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, | ||||||
|  |  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE | ||||||
|  |  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, | ||||||
|  |  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||||
|  |  * | ||||||
|  |  * The default VCL code. | ||||||
|  |  * | ||||||
|  |  * NB! You do NOT need to copy & paste all of these functions into your | ||||||
|  |  * own vcl code, if you do not provide a definition of one of these | ||||||
|  |  * functions, the compiler will automatically fall back to the default | ||||||
|  |  * code from this file. | ||||||
|  |  * | ||||||
|  |  * This code will be prefixed with a backend declaration built from the | ||||||
|  |  * -b argument. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | sub vcl_recv { | ||||||
|  |     if (req.restarts == 0) { | ||||||
|  | 	if (req.http.x-forwarded-for) { | ||||||
|  | 	    set req.http.X-Forwarded-For = | ||||||
|  | 		req.http.X-Forwarded-For + ", " + client.ip; | ||||||
|  | 	} else { | ||||||
|  | 	    set req.http.X-Forwarded-For = client.ip; | ||||||
|  | 	} | ||||||
|  |     } | ||||||
|  |     if (req.request != "GET" && | ||||||
|  |       req.request != "HEAD" && | ||||||
|  |       req.request != "PUT" && | ||||||
|  |       req.request != "POST" && | ||||||
|  |       req.request != "TRACE" && | ||||||
|  |       req.request != "OPTIONS" && | ||||||
|  |       req.request != "DELETE") { | ||||||
|  |         /* Non-RFC2616 or CONNECT which is weird. */ | ||||||
|  |         return (pipe); | ||||||
|  |     } | ||||||
|  |     if (req.request != "GET" && req.request != "HEAD") { | ||||||
|  |         /* We only deal with GET and HEAD by default */ | ||||||
|  |         return (pass); | ||||||
|  |     } | ||||||
|  |     if (req.http.Authorization || req.http.Cookie) { | ||||||
|  |         /* Not cacheable by default */ | ||||||
|  |         return (pass); | ||||||
|  |     } | ||||||
|  |     return (lookup); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | sub vcl_pipe { | ||||||
|  |     # Note that only the first request to the backend will have | ||||||
|  |     # X-Forwarded-For set.  If you use X-Forwarded-For and want to | ||||||
|  |     # have it set for all requests, make sure to have: | ||||||
|  |     # set bereq.http.connection = "close"; | ||||||
|  |     # here.  It is not set by default as it might break some broken web | ||||||
|  |     # applications, like IIS with NTLM authentication. | ||||||
|  |     return (pipe); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | sub vcl_pass { | ||||||
|  |     return (pass); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | sub vcl_hash { | ||||||
|  |     hash_data(req.url); | ||||||
|  |     if (req.http.host) { | ||||||
|  |         hash_data(req.http.host); | ||||||
|  |     } else { | ||||||
|  |         hash_data(server.ip); | ||||||
|  |     } | ||||||
|  |     return (hash); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | sub vcl_hit { | ||||||
|  |     return (deliver); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | sub vcl_miss { | ||||||
|  |     return (fetch); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | sub vcl_fetch { | ||||||
|  |     if (beresp.ttl <= 0s || | ||||||
|  |         beresp.http.Set-Cookie || | ||||||
|  |         beresp.http.Vary == "*") { | ||||||
|  | 		/* | ||||||
|  | 		 * Mark as "Hit-For-Pass" for the next 2 minutes | ||||||
|  | 		 */ | ||||||
|  | 		set beresp.ttl = 120 s; | ||||||
|  | 		return (hit_for_pass); | ||||||
|  |     } | ||||||
|  |     return (deliver); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | sub vcl_deliver { | ||||||
|  |     return (deliver); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | sub vcl_error { | ||||||
|  |     set obj.http.Content-Type = "text/html; charset=utf-8"; | ||||||
|  |     set obj.http.Retry-After = "5"; | ||||||
|  |     synthetic {" | ||||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||||
|  | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" | ||||||
|  |  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | ||||||
|  | <html> | ||||||
|  |   <head> | ||||||
|  |     <title>"} + obj.status + " " + obj.response + {"</title> | ||||||
|  |   </head> | ||||||
|  |   <body> | ||||||
|  |     <h1>Error "} + obj.status + " " + obj.response + {"</h1> | ||||||
|  |     <p>"} + obj.response + {"</p> | ||||||
|  |     <h3>Guru Meditation:</h3> | ||||||
|  |     <p>XID: "} + req.xid + {"</p> | ||||||
|  |     <hr> | ||||||
|  |     <p>Varnish cache server</p> | ||||||
|  |   </body> | ||||||
|  | </html> | ||||||
|  | "}; | ||||||
|  |     return (deliver); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | sub vcl_init { | ||||||
|  | 	return (ok); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | sub vcl_fini { | ||||||
|  | 	return (ok); | ||||||
|  | } | ||||||
							
								
								
									
										21
									
								
								samples/XML/sample.nuspec
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								samples/XML/sample.nuspec
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | |||||||
|  | <?xml version="1.0"?> | ||||||
|  | <package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd"> | ||||||
|  |   <metadata> | ||||||
|  |     <id>Sample</id> | ||||||
|  |     <title>Sample</title> | ||||||
|  |     <version>0.101.0</version> | ||||||
|  |     <authors>Hugh Bot</authors> | ||||||
|  |     <owners>Hugh Bot</owners> | ||||||
|  |     <summary>A package of nuget</summary> | ||||||
|  |     <description> | ||||||
|  |       It just works | ||||||
|  |     </description> | ||||||
|  |     <projectUrl>http://hubot.github.com</projectUrl> | ||||||
|  |     <copyright/> | ||||||
|  |     <licenseUrl>https://github.com/github/hubot/LICENSEmd</licenseUrl> | ||||||
|  |     <requireLicenseAcceptance>false</requireLicenseAcceptance> | ||||||
|  |   </metadata> | ||||||
|  |   <files> | ||||||
|  |     <file src="tools\**" target="tools"/> | ||||||
|  |   </files> | ||||||
|  | </package> | ||||||
							
								
								
									
										22
									
								
								samples/Xojo/App.xojo_code
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								samples/Xojo/App.xojo_code
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,22 @@ | |||||||
|  | #tag Class | ||||||
|  | Protected Class App | ||||||
|  | Inherits Application | ||||||
|  | 	#tag Constant, Name = kEditClear, Type = String, Dynamic = False, Default = \"&Delete", Scope = Public | ||||||
|  | 		#Tag Instance, Platform = Windows, Language = Default, Definition  = \"&Delete" | ||||||
|  | 		#Tag Instance, Platform = Linux, Language = Default, Definition  = \"&Delete" | ||||||
|  | 	#tag EndConstant | ||||||
|  |  | ||||||
|  | 	#tag Constant, Name = kFileQuit, Type = String, Dynamic = False, Default = \"&Quit", Scope = Public | ||||||
|  | 		#Tag Instance, Platform = Windows, Language = Default, Definition  = \"E&xit" | ||||||
|  | 	#tag EndConstant | ||||||
|  |  | ||||||
|  | 	#tag Constant, Name = kFileQuitShortcut, Type = String, Dynamic = False, Default = \"", Scope = Public | ||||||
|  | 		#Tag Instance, Platform = Mac OS, Language = Default, Definition  = \"Cmd+Q" | ||||||
|  | 		#Tag Instance, Platform = Linux, Language = Default, Definition  = \"Ctrl+Q" | ||||||
|  | 	#tag EndConstant | ||||||
|  |  | ||||||
|  |  | ||||||
|  | 	#tag ViewBehavior | ||||||
|  | 	#tag EndViewBehavior | ||||||
|  | End Class | ||||||
|  | #tag EndClass | ||||||
							
								
								
									
										23
									
								
								samples/Xojo/BillingReport.xojo_report
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								samples/Xojo/BillingReport.xojo_report
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | |||||||
|  | #tag Report | ||||||
|  | Begin Report BillingReport | ||||||
|  |    Compatibility   =   "" | ||||||
|  |    Units           =   0 | ||||||
|  |    Width           =   8.5 | ||||||
|  |    Begin  PageHeader | ||||||
|  |       Type            =   1 | ||||||
|  |       Height          =   1.0 | ||||||
|  |    End | ||||||
|  |    Begin  Body | ||||||
|  |       Type            =   3 | ||||||
|  |       Height          =   2.0 | ||||||
|  |    End | ||||||
|  |    Begin  PageFooter | ||||||
|  |       Type            =   5 | ||||||
|  |       Height          =   1.0 | ||||||
|  |    End | ||||||
|  | End | ||||||
|  | #tag EndReport | ||||||
|  |  | ||||||
|  | #tag ReportCode | ||||||
|  | #tag EndReportCode | ||||||
|  |  | ||||||
							
								
								
									
										112
									
								
								samples/Xojo/MainMenuBar.xojo_menu
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										112
									
								
								samples/Xojo/MainMenuBar.xojo_menu
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,112 @@ | |||||||
|  | #tag Menu | ||||||
|  | Begin Menu MainMenuBar | ||||||
|  |    Begin MenuItem FileMenu | ||||||
|  |       SpecialMenu = 0 | ||||||
|  |       Text = "&File" | ||||||
|  |       Index = -2147483648 | ||||||
|  |       AutoEnable = True | ||||||
|  |       Visible = True | ||||||
|  |       Begin QuitMenuItem FileQuit | ||||||
|  |          SpecialMenu = 0 | ||||||
|  |          Text = "#App.kFileQuit" | ||||||
|  |          Index = -2147483648 | ||||||
|  |          ShortcutKey = "#App.kFileQuitShortcut" | ||||||
|  |          Shortcut = "#App.kFileQuitShortcut" | ||||||
|  |          AutoEnable = True | ||||||
|  |          Visible = True | ||||||
|  |       End | ||||||
|  |    End | ||||||
|  |    Begin MenuItem EditMenu | ||||||
|  |       SpecialMenu = 0 | ||||||
|  |       Text = "&Edit" | ||||||
|  |       Index = -2147483648 | ||||||
|  |       AutoEnable = True | ||||||
|  |       Visible = True | ||||||
|  |       Begin MenuItem EditUndo | ||||||
|  |          SpecialMenu = 0 | ||||||
|  |          Text = "&Undo" | ||||||
|  |          Index = -2147483648 | ||||||
|  |          ShortcutKey = "Z" | ||||||
|  |          Shortcut = "Cmd+Z" | ||||||
|  |          MenuModifier = True | ||||||
|  |          AutoEnable = True | ||||||
|  |          Visible = True | ||||||
|  |       End | ||||||
|  |       Begin MenuItem EditSeparator1 | ||||||
|  |          SpecialMenu = 0 | ||||||
|  |          Text = "-" | ||||||
|  |          Index = -2147483648 | ||||||
|  |          AutoEnable = True | ||||||
|  |          Visible = True | ||||||
|  |       End | ||||||
|  |       Begin MenuItem EditCut | ||||||
|  |          SpecialMenu = 0 | ||||||
|  |          Text = "Cu&t" | ||||||
|  |          Index = -2147483648 | ||||||
|  |          ShortcutKey = "X" | ||||||
|  |          Shortcut = "Cmd+X" | ||||||
|  |          MenuModifier = True | ||||||
|  |          AutoEnable = True | ||||||
|  |          Visible = True | ||||||
|  |       End | ||||||
|  |       Begin MenuItem EditCopy | ||||||
|  |          SpecialMenu = 0 | ||||||
|  |          Text = "&Copy" | ||||||
|  |          Index = -2147483648 | ||||||
|  |          ShortcutKey = "C" | ||||||
|  |          Shortcut = "Cmd+C" | ||||||
|  |          MenuModifier = True | ||||||
|  |          AutoEnable = True | ||||||
|  |          Visible = True | ||||||
|  |       End | ||||||
|  |       Begin MenuItem EditPaste | ||||||
|  |          SpecialMenu = 0 | ||||||
|  |          Text = "&Paste" | ||||||
|  |          Index = -2147483648 | ||||||
|  |          ShortcutKey = "V" | ||||||
|  |          Shortcut = "Cmd+V" | ||||||
|  |          MenuModifier = True | ||||||
|  |          AutoEnable = True | ||||||
|  |          Visible = True | ||||||
|  |       End | ||||||
|  |       Begin MenuItem EditClear | ||||||
|  |          SpecialMenu = 0 | ||||||
|  |          Text = "#App.kEditClear" | ||||||
|  |          Index = -2147483648 | ||||||
|  |          AutoEnable = True | ||||||
|  |          Visible = True | ||||||
|  |       End | ||||||
|  |       Begin MenuItem EditSeparator2 | ||||||
|  |          SpecialMenu = 0 | ||||||
|  |          Text = "-" | ||||||
|  |          Index = -2147483648 | ||||||
|  |          AutoEnable = True | ||||||
|  |          Visible = True | ||||||
|  |       End | ||||||
|  |       Begin MenuItem EditSelectAll | ||||||
|  |          SpecialMenu = 0 | ||||||
|  |          Text = "Select &All" | ||||||
|  |          Index = -2147483648 | ||||||
|  |          ShortcutKey = "A" | ||||||
|  |          Shortcut = "Cmd+A" | ||||||
|  |          MenuModifier = True | ||||||
|  |          AutoEnable = True | ||||||
|  |          Visible = True | ||||||
|  |       End | ||||||
|  |       Begin MenuItem UntitledSeparator | ||||||
|  |          SpecialMenu = 0 | ||||||
|  |          Text = "-" | ||||||
|  |          Index = -2147483648 | ||||||
|  |          AutoEnable = True | ||||||
|  |          Visible = True | ||||||
|  |       End | ||||||
|  |       Begin AppleMenuItem AboutItem | ||||||
|  |          SpecialMenu = 0 | ||||||
|  |          Text = "About This App..." | ||||||
|  |          Index = -2147483648 | ||||||
|  |          AutoEnable = True | ||||||
|  |          Visible = True | ||||||
|  |       End | ||||||
|  |    End | ||||||
|  | End | ||||||
|  | #tag EndMenu | ||||||
							
								
								
									
										14
									
								
								samples/Xojo/MyToolbar.xojo_toolbar
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								samples/Xojo/MyToolbar.xojo_toolbar
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | |||||||
|  | #tag Toolbar | ||||||
|  | Begin Toolbar MyToolbar | ||||||
|  | 	Begin ToolButton FirstItem | ||||||
|  | 		Caption = "First Item" | ||||||
|  | 		HelpTag = "" | ||||||
|  | 		Style = 0 | ||||||
|  | 	End | ||||||
|  | 	Begin ToolButton SecondItem | ||||||
|  | 		Caption = "Second Item" | ||||||
|  | 		HelpTag = "" | ||||||
|  | 		Style = 0 | ||||||
|  | 	End | ||||||
|  | End | ||||||
|  | #tag EndToolbar | ||||||
							
								
								
									
										304
									
								
								samples/Xojo/Window1.xojo_window
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										304
									
								
								samples/Xojo/Window1.xojo_window
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,304 @@ | |||||||
|  | #tag Window | ||||||
|  | Begin Window Window1 | ||||||
|  |    BackColor       =   &cFFFFFF00 | ||||||
|  |    Backdrop        =   0 | ||||||
|  |    CloseButton     =   True | ||||||
|  |    Compatibility   =   "" | ||||||
|  |    Composite       =   False | ||||||
|  |    Frame           =   0 | ||||||
|  |    FullScreen      =   False | ||||||
|  |    FullScreenButton=   False | ||||||
|  |    HasBackColor    =   False | ||||||
|  |    Height          =   400 | ||||||
|  |    ImplicitInstance=   True | ||||||
|  |    LiveResize      =   True | ||||||
|  |    MacProcID       =   0 | ||||||
|  |    MaxHeight       =   32000 | ||||||
|  |    MaximizeButton  =   True | ||||||
|  |    MaxWidth        =   32000 | ||||||
|  |    MenuBar         =   1153981589 | ||||||
|  |    MenuBarVisible  =   True | ||||||
|  |    MinHeight       =   64 | ||||||
|  |    MinimizeButton  =   True | ||||||
|  |    MinWidth        =   64 | ||||||
|  |    Placement       =   0 | ||||||
|  |    Resizeable      =   True | ||||||
|  |    Title           =   "Sample App" | ||||||
|  |    Visible         =   True | ||||||
|  |    Width           =   600 | ||||||
|  |    Begin PushButton HelloWorldButton | ||||||
|  |       AutoDeactivate  =   True | ||||||
|  |       Bold            =   False | ||||||
|  |       ButtonStyle     =   "0" | ||||||
|  |       Cancel          =   False | ||||||
|  |       Caption         =   "Push Me" | ||||||
|  |       Default         =   True | ||||||
|  |       Enabled         =   True | ||||||
|  |       Height          =   20 | ||||||
|  |       HelpTag         =   "" | ||||||
|  |       Index           =   -2147483648 | ||||||
|  |       InitialParent   =   "" | ||||||
|  |       Italic          =   False | ||||||
|  |       Left            =   260 | ||||||
|  |       LockBottom      =   False | ||||||
|  |       LockedInPosition=   False | ||||||
|  |       LockLeft        =   True | ||||||
|  |       LockRight       =   False | ||||||
|  |       LockTop         =   True | ||||||
|  |       Scope           =   0 | ||||||
|  |       TabIndex        =   0 | ||||||
|  |       TabPanelIndex   =   0 | ||||||
|  |       TabStop         =   True | ||||||
|  |       TextFont        =   "System" | ||||||
|  |       TextSize        =   0.0 | ||||||
|  |       TextUnit        =   0 | ||||||
|  |       Top             =   32 | ||||||
|  |       Underline       =   False | ||||||
|  |       Visible         =   True | ||||||
|  |       Width           =   80 | ||||||
|  |    End | ||||||
|  | End | ||||||
|  | #tag EndWindow | ||||||
|  |  | ||||||
|  | #tag WindowCode | ||||||
|  | #tag EndWindowCode | ||||||
|  |  | ||||||
|  | #tag Events HelloWorldButton | ||||||
|  | 	#tag Event | ||||||
|  | 		Sub Action() | ||||||
|  | 		  Dim total As Integer | ||||||
|  | 		   | ||||||
|  | 		  For i As Integer = 0 To 10 | ||||||
|  | 		    total = total + i | ||||||
|  | 		  Next | ||||||
|  | 		   | ||||||
|  | 		  MsgBox "Hello World! " + Str(total) | ||||||
|  | 		End Sub | ||||||
|  | 	#tag EndEvent | ||||||
|  | #tag EndEvents | ||||||
|  | #tag ViewBehavior | ||||||
|  | 	#tag ViewProperty | ||||||
|  | 		Name="BackColor" | ||||||
|  | 		Visible=true | ||||||
|  | 		Group="Appearance" | ||||||
|  | 		InitialValue="&hFFFFFF" | ||||||
|  | 		Type="Color" | ||||||
|  | 	#tag EndViewProperty | ||||||
|  | 	#tag ViewProperty | ||||||
|  | 		Name="Backdrop" | ||||||
|  | 		Visible=true | ||||||
|  | 		Group="Appearance" | ||||||
|  | 		Type="Picture" | ||||||
|  | 		EditorType="Picture" | ||||||
|  | 	#tag EndViewProperty | ||||||
|  | 	#tag ViewProperty | ||||||
|  | 		Name="CloseButton" | ||||||
|  | 		Visible=true | ||||||
|  | 		Group="Appearance" | ||||||
|  | 		InitialValue="True" | ||||||
|  | 		Type="Boolean" | ||||||
|  | 		EditorType="Boolean" | ||||||
|  | 	#tag EndViewProperty | ||||||
|  | 	#tag ViewProperty | ||||||
|  | 		Name="Composite" | ||||||
|  | 		Visible=true | ||||||
|  | 		Group="Appearance" | ||||||
|  | 		InitialValue="False" | ||||||
|  | 		Type="Boolean" | ||||||
|  | 	#tag EndViewProperty | ||||||
|  | 	#tag ViewProperty | ||||||
|  | 		Name="Frame" | ||||||
|  | 		Visible=true | ||||||
|  | 		Group="Appearance" | ||||||
|  | 		InitialValue="0" | ||||||
|  | 		Type="Integer" | ||||||
|  | 		EditorType="Enum" | ||||||
|  | 		#tag EnumValues | ||||||
|  | 			"0 - Document" | ||||||
|  | 			"1 - Movable Modal" | ||||||
|  | 			"2 - Modal Dialog" | ||||||
|  | 			"3 - Floating Window" | ||||||
|  | 			"4 - Plain Box" | ||||||
|  | 			"5 - Shadowed Box" | ||||||
|  | 			"6 - Rounded Window" | ||||||
|  | 			"7 - Global Floating Window" | ||||||
|  | 			"8 - Sheet Window" | ||||||
|  | 			"9 - Metal Window" | ||||||
|  | 			"10 - Drawer Window" | ||||||
|  | 			"11 - Modeless Dialog" | ||||||
|  | 		#tag EndEnumValues | ||||||
|  | 	#tag EndViewProperty | ||||||
|  | 	#tag ViewProperty | ||||||
|  | 		Name="FullScreen" | ||||||
|  | 		Group="Appearance" | ||||||
|  | 		InitialValue="False" | ||||||
|  | 		Type="Boolean" | ||||||
|  | 		EditorType="Boolean" | ||||||
|  | 	#tag EndViewProperty | ||||||
|  | 	#tag ViewProperty | ||||||
|  | 		Name="FullScreenButton" | ||||||
|  | 		Visible=true | ||||||
|  | 		Group="Appearance" | ||||||
|  | 		InitialValue="False" | ||||||
|  | 		Type="Boolean" | ||||||
|  | 		EditorType="Boolean" | ||||||
|  | 	#tag EndViewProperty | ||||||
|  | 	#tag ViewProperty | ||||||
|  | 		Name="HasBackColor" | ||||||
|  | 		Visible=true | ||||||
|  | 		Group="Appearance" | ||||||
|  | 		InitialValue="False" | ||||||
|  | 		Type="Boolean" | ||||||
|  | 	#tag EndViewProperty | ||||||
|  | 	#tag ViewProperty | ||||||
|  | 		Name="Height" | ||||||
|  | 		Visible=true | ||||||
|  | 		Group="Position" | ||||||
|  | 		InitialValue="400" | ||||||
|  | 		Type="Integer" | ||||||
|  | 	#tag EndViewProperty | ||||||
|  | 	#tag ViewProperty | ||||||
|  | 		Name="ImplicitInstance" | ||||||
|  | 		Visible=true | ||||||
|  | 		Group="Appearance" | ||||||
|  | 		InitialValue="True" | ||||||
|  | 		Type="Boolean" | ||||||
|  | 		EditorType="Boolean" | ||||||
|  | 	#tag EndViewProperty | ||||||
|  | 	#tag ViewProperty | ||||||
|  | 		Name="Interfaces" | ||||||
|  | 		Visible=true | ||||||
|  | 		Group="ID" | ||||||
|  | 		Type="String" | ||||||
|  | 	#tag EndViewProperty | ||||||
|  | 	#tag ViewProperty | ||||||
|  | 		Name="LiveResize" | ||||||
|  | 		Visible=true | ||||||
|  | 		Group="Appearance" | ||||||
|  | 		InitialValue="True" | ||||||
|  | 		Type="Boolean" | ||||||
|  | 		EditorType="Boolean" | ||||||
|  | 	#tag EndViewProperty | ||||||
|  | 	#tag ViewProperty | ||||||
|  | 		Name="MacProcID" | ||||||
|  | 		Visible=true | ||||||
|  | 		Group="Appearance" | ||||||
|  | 		InitialValue="0" | ||||||
|  | 		Type="Integer" | ||||||
|  | 	#tag EndViewProperty | ||||||
|  | 	#tag ViewProperty | ||||||
|  | 		Name="MaxHeight" | ||||||
|  | 		Visible=true | ||||||
|  | 		Group="Position" | ||||||
|  | 		InitialValue="32000" | ||||||
|  | 		Type="Integer" | ||||||
|  | 	#tag EndViewProperty | ||||||
|  | 	#tag ViewProperty | ||||||
|  | 		Name="MaximizeButton" | ||||||
|  | 		Visible=true | ||||||
|  | 		Group="Appearance" | ||||||
|  | 		InitialValue="True" | ||||||
|  | 		Type="Boolean" | ||||||
|  | 		EditorType="Boolean" | ||||||
|  | 	#tag EndViewProperty | ||||||
|  | 	#tag ViewProperty | ||||||
|  | 		Name="MaxWidth" | ||||||
|  | 		Visible=true | ||||||
|  | 		Group="Position" | ||||||
|  | 		InitialValue="32000" | ||||||
|  | 		Type="Integer" | ||||||
|  | 	#tag EndViewProperty | ||||||
|  | 	#tag ViewProperty | ||||||
|  | 		Name="MenuBar" | ||||||
|  | 		Visible=true | ||||||
|  | 		Group="Appearance" | ||||||
|  | 		Type="MenuBar" | ||||||
|  | 		EditorType="MenuBar" | ||||||
|  | 	#tag EndViewProperty | ||||||
|  | 	#tag ViewProperty | ||||||
|  | 		Name="MenuBarVisible" | ||||||
|  | 		Group="Appearance" | ||||||
|  | 		InitialValue="True" | ||||||
|  | 		Type="Boolean" | ||||||
|  | 		EditorType="Boolean" | ||||||
|  | 	#tag EndViewProperty | ||||||
|  | 	#tag ViewProperty | ||||||
|  | 		Name="MinHeight" | ||||||
|  | 		Visible=true | ||||||
|  | 		Group="Position" | ||||||
|  | 		InitialValue="64" | ||||||
|  | 		Type="Integer" | ||||||
|  | 	#tag EndViewProperty | ||||||
|  | 	#tag ViewProperty | ||||||
|  | 		Name="MinimizeButton" | ||||||
|  | 		Visible=true | ||||||
|  | 		Group="Appearance" | ||||||
|  | 		InitialValue="True" | ||||||
|  | 		Type="Boolean" | ||||||
|  | 		EditorType="Boolean" | ||||||
|  | 	#tag EndViewProperty | ||||||
|  | 	#tag ViewProperty | ||||||
|  | 		Name="MinWidth" | ||||||
|  | 		Visible=true | ||||||
|  | 		Group="Position" | ||||||
|  | 		InitialValue="64" | ||||||
|  | 		Type="Integer" | ||||||
|  | 	#tag EndViewProperty | ||||||
|  | 	#tag ViewProperty | ||||||
|  | 		Name="Name" | ||||||
|  | 		Visible=true | ||||||
|  | 		Group="ID" | ||||||
|  | 		Type="String" | ||||||
|  | 	#tag EndViewProperty | ||||||
|  | 	#tag ViewProperty | ||||||
|  | 		Name="Placement" | ||||||
|  | 		Visible=true | ||||||
|  | 		Group="Position" | ||||||
|  | 		InitialValue="0" | ||||||
|  | 		Type="Integer" | ||||||
|  | 		EditorType="Enum" | ||||||
|  | 		#tag EnumValues | ||||||
|  | 			"0 - Default" | ||||||
|  | 			"1 - Parent Window" | ||||||
|  | 			"2 - Main Screen" | ||||||
|  | 			"3 - Parent Window Screen" | ||||||
|  | 			"4 - Stagger" | ||||||
|  | 		#tag EndEnumValues | ||||||
|  | 	#tag EndViewProperty | ||||||
|  | 	#tag ViewProperty | ||||||
|  | 		Name="Resizeable" | ||||||
|  | 		Visible=true | ||||||
|  | 		Group="Appearance" | ||||||
|  | 		InitialValue="True" | ||||||
|  | 		Type="Boolean" | ||||||
|  | 		EditorType="Boolean" | ||||||
|  | 	#tag EndViewProperty | ||||||
|  | 	#tag ViewProperty | ||||||
|  | 		Name="Super" | ||||||
|  | 		Visible=true | ||||||
|  | 		Group="ID" | ||||||
|  | 		Type="String" | ||||||
|  | 	#tag EndViewProperty | ||||||
|  | 	#tag ViewProperty | ||||||
|  | 		Name="Title" | ||||||
|  | 		Visible=true | ||||||
|  | 		Group="Appearance" | ||||||
|  | 		InitialValue="Untitled" | ||||||
|  | 		Type="String" | ||||||
|  | 	#tag EndViewProperty | ||||||
|  | 	#tag ViewProperty | ||||||
|  | 		Name="Visible" | ||||||
|  | 		Visible=true | ||||||
|  | 		Group="Appearance" | ||||||
|  | 		InitialValue="True" | ||||||
|  | 		Type="Boolean" | ||||||
|  | 		EditorType="Boolean" | ||||||
|  | 	#tag EndViewProperty | ||||||
|  | 	#tag ViewProperty | ||||||
|  | 		Name="Width" | ||||||
|  | 		Visible=true | ||||||
|  | 		Group="Position" | ||||||
|  | 		InitialValue="600" | ||||||
|  | 		Type="Integer" | ||||||
|  | 	#tag EndViewProperty | ||||||
|  | #tag EndViewBehavior | ||||||
							
								
								
									
										17
									
								
								samples/Xojo/database.xojo_script
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								samples/Xojo/database.xojo_script
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | |||||||
|  | Dim dbFile As FolderItem | ||||||
|  | Dim db As New SQLiteDatabase | ||||||
|  | dbFile = GetFolderItem("Employees.sqlite") | ||||||
|  | db.DatabaseFile = dbFile | ||||||
|  | If db.Connect Then | ||||||
|  |   db.SQLExecute("BEGIN TRANSACTION") | ||||||
|  |   db.SQLExecute ("INSERT INTO Employees (Name,Job,YearJoined) VALUES "_ | ||||||
|  |     +"('Dr.Strangelove','Advisor',1962)") | ||||||
|  |   If db.Error then | ||||||
|  |     MsgBox("Error: " + db.ErrorMessage) | ||||||
|  |     db.Rollback | ||||||
|  |   Else | ||||||
|  |     db.Commit | ||||||
|  |   End If | ||||||
|  | Else | ||||||
|  |   MsgBox("The database couldn't be opened. Error: " + db.ErrorMessage) | ||||||
|  | End If | ||||||
							
								
								
									
										28
									
								
								samples/Zephir/filenames/exception.zep.c
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								samples/Zephir/filenames/exception.zep.c
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | |||||||
|  |  | ||||||
|  | #ifdef HAVE_CONFIG_H | ||||||
|  | #include "../../ext_config.h" | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #include <php.h> | ||||||
|  | #include "../../php_ext.h" | ||||||
|  | #include "../../ext.h" | ||||||
|  |  | ||||||
|  | #include <Zend/zend_operators.h> | ||||||
|  | #include <Zend/zend_exceptions.h> | ||||||
|  | #include <Zend/zend_interfaces.h> | ||||||
|  |  | ||||||
|  | #include "kernel/main.h" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * Test\Router\Exception | ||||||
|  |  * | ||||||
|  |  * Exceptions generated by the router | ||||||
|  |  */ | ||||||
|  | ZEPHIR_INIT_CLASS(Test_Router_Exception) { | ||||||
|  |  | ||||||
|  |     ZEPHIR_REGISTER_CLASS_EX(Test\\Router, Exception, test, router_exception, zend_exception_get_default(TSRMLS_C), NULL, 0); | ||||||
|  |  | ||||||
|  |     return SUCCESS; | ||||||
|  |  | ||||||
|  | } | ||||||
							
								
								
									
										4
									
								
								samples/Zephir/filenames/exception.zep.h
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								samples/Zephir/filenames/exception.zep.h
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,4 @@ | |||||||
|  |  | ||||||
|  | extern zend_class_entry *test_router_exception_ce; | ||||||
|  |  | ||||||
|  | ZEPHIR_INIT_CLASS(Test_Router_Exception); | ||||||
							
								
								
									
										8
									
								
								samples/Zephir/filenames/exception.zep.php
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								samples/Zephir/filenames/exception.zep.php
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | |||||||
|  | <?php | ||||||
|  |  | ||||||
|  | namespace Test\Router; | ||||||
|  |  | ||||||
|  | class Exception extends \Exception | ||||||
|  | { | ||||||
|  |  | ||||||
|  | } | ||||||
							
								
								
									
										21
									
								
								samples/Zimpl/sample.zmpl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								samples/Zimpl/sample.zmpl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | |||||||
|  | # $Id: queens3.zpl,v 1.3 2009/09/13 16:15:53 bzfkocht Exp $ | ||||||
|  | # | ||||||
|  | # This is a formulation of the n queens problem using binary variables. | ||||||
|  | # variables. Since the number of queens is maximized, the size of the | ||||||
|  | # board can be set arbitrarily. | ||||||
|  | # | ||||||
|  | param columns := 8; | ||||||
|  |  | ||||||
|  | set I   := { 1 .. columns }; | ||||||
|  | set IxI := I * I; | ||||||
|  |  | ||||||
|  | set TABU[<i,j> in IxI] := { <m,n> in IxI with  | ||||||
|  |    (m != i or n != j) and (m == i or n == j or abs(m - i) == abs(n - j)) }; | ||||||
|  |  | ||||||
|  | var x[IxI] binary; | ||||||
|  |  | ||||||
|  | maximize queens: sum <i,j> in IxI : x[i,j]; | ||||||
|  |  | ||||||
|  | subto c1: forall <i,j> in IxI do | ||||||
|  |    card(TABU[i,j]) - card(TABU[i,j]) * x[i,j] >= sum <m,n> in TABU[i,j] : x[m,n]; | ||||||
|  |     | ||||||
| @@ -97,15 +97,26 @@ class TestBlob < Test::Unit::TestCase | |||||||
|   def test_sloc |   def test_sloc | ||||||
|     assert_equal 2, blob("Ruby/foo.rb").sloc |     assert_equal 2, blob("Ruby/foo.rb").sloc | ||||||
|     assert_equal 3, blob("Text/utf16le-windows.txt").sloc |     assert_equal 3, blob("Text/utf16le-windows.txt").sloc | ||||||
|  |     assert_equal 1, blob("Text/iso8859-8-i.txt").sloc | ||||||
|   end |   end | ||||||
|  |  | ||||||
|   def test_encoding |   def test_encoding | ||||||
|     assert_equal "ISO-8859-2", blob("Text/README").encoding |     assert_equal "ISO-8859-2", blob("Text/README").encoding | ||||||
|  |     assert_equal "ISO-8859-2", blob("Text/README").ruby_encoding | ||||||
|     assert_equal "ISO-8859-1", blob("Text/dump.sql").encoding |     assert_equal "ISO-8859-1", blob("Text/dump.sql").encoding | ||||||
|  |     assert_equal "ISO-8859-1", blob("Text/dump.sql").ruby_encoding | ||||||
|     assert_equal "UTF-8", blob("Text/foo.txt").encoding |     assert_equal "UTF-8", blob("Text/foo.txt").encoding | ||||||
|  |     assert_equal "UTF-8", blob("Text/foo.txt").ruby_encoding | ||||||
|     assert_equal "UTF-16LE", blob("Text/utf16le.txt").encoding |     assert_equal "UTF-16LE", blob("Text/utf16le.txt").encoding | ||||||
|  |     assert_equal "UTF-16LE", blob("Text/utf16le.txt").ruby_encoding | ||||||
|     assert_equal "UTF-16LE", blob("Text/utf16le-windows.txt").encoding |     assert_equal "UTF-16LE", blob("Text/utf16le-windows.txt").encoding | ||||||
|  |     assert_equal "UTF-16LE", blob("Text/utf16le-windows.txt").ruby_encoding | ||||||
|  |     assert_equal "ISO-2022-KR", blob("Text/ISO-2022-KR.txt").encoding | ||||||
|  |     assert_equal "binary", blob("Text/ISO-2022-KR.txt").ruby_encoding | ||||||
|     assert_nil blob("Binary/dog.o").encoding |     assert_nil blob("Binary/dog.o").encoding | ||||||
|  |  | ||||||
|  |     assert_equal "windows-1252", blob("Text/Visual_Battlers.rb").encoding | ||||||
|  |     assert_equal "Windows-1252", blob("Text/Visual_Battlers.rb").ruby_encoding | ||||||
|   end |   end | ||||||
|  |  | ||||||
|   def test_binary |   def test_binary | ||||||
| @@ -236,6 +247,13 @@ class TestBlob < Test::Unit::TestCase | |||||||
|     # Generated VCR |     # Generated VCR | ||||||
|     assert blob("YAML/vcr_cassette.yml").generated? |     assert blob("YAML/vcr_cassette.yml").generated? | ||||||
|  |  | ||||||
|  |     # Generated by Zephir | ||||||
|  |     assert blob("Zephir/filenames/exception.zep.c").generated? | ||||||
|  |     assert blob("Zephir/filenames/exception.zep.h").generated? | ||||||
|  |     assert blob("Zephir/filenames/exception.zep.php").generated? | ||||||
|  |     assert !blob("Zephir/Router.zep").generated? | ||||||
|  |  | ||||||
|  |  | ||||||
|     assert Linguist::Generated.generated?("node_modules/grunt/lib/grunt.js", nil) |     assert Linguist::Generated.generated?("node_modules/grunt/lib/grunt.js", nil) | ||||||
|   end |   end | ||||||
|  |  | ||||||
| @@ -259,6 +277,10 @@ class TestBlob < Test::Unit::TestCase | |||||||
|  |  | ||||||
|     # 'thirdparty' directory |     # 'thirdparty' directory | ||||||
|     assert blob("thirdparty/lib/main.c").vendored? |     assert blob("thirdparty/lib/main.c").vendored? | ||||||
|  |      | ||||||
|  |     # 'extern(al)' directory | ||||||
|  |     assert blob("extern/util/__init__.py").vendored? | ||||||
|  |     assert blob("external/jquery.min.js").vendored? | ||||||
|  |  | ||||||
|     # C deps |     # C deps | ||||||
|     assert blob("deps/http_parser/http_parser.c").vendored? |     assert blob("deps/http_parser/http_parser.c").vendored? | ||||||
| @@ -364,6 +386,10 @@ class TestBlob < Test::Unit::TestCase | |||||||
|     # NuGet Packages |     # NuGet Packages | ||||||
|     assert blob("packages/Modernizr.2.0.6/Content/Scripts/modernizr-2.0.6-development-only.js").vendored? |     assert blob("packages/Modernizr.2.0.6/Content/Scripts/modernizr-2.0.6-development-only.js").vendored? | ||||||
|  |  | ||||||
|  |     # Html5shiv | ||||||
|  |     assert blob("Scripts/html5shiv.js").vendored? | ||||||
|  |     assert blob("Scripts/html5shiv.min.js").vendored? | ||||||
|  |  | ||||||
|     # Test fixtures |     # Test fixtures | ||||||
|     assert blob("test/fixtures/random.rkt").vendored? |     assert blob("test/fixtures/random.rkt").vendored? | ||||||
|     assert blob("Test/fixtures/random.rkt").vendored? |     assert blob("Test/fixtures/random.rkt").vendored? | ||||||
| @@ -384,6 +410,11 @@ class TestBlob < Test::Unit::TestCase | |||||||
|     assert blob("subproject/gradlew").vendored? |     assert blob("subproject/gradlew").vendored? | ||||||
|     assert blob("subproject/gradlew.bat").vendored? |     assert blob("subproject/gradlew.bat").vendored? | ||||||
|     assert blob("subproject/gradle/wrapper/gradle-wrapper.properties").vendored? |     assert blob("subproject/gradle/wrapper/gradle-wrapper.properties").vendored? | ||||||
|  |  | ||||||
|  |     # Octicons | ||||||
|  |     assert blob("octicons.css").vendored? | ||||||
|  |     assert blob("public/octicons.min.css").vendored? | ||||||
|  |     assert blob("public/octicons/sprockets-octicons.scss").vendored? | ||||||
|   end |   end | ||||||
|  |  | ||||||
|   def test_language |   def test_language | ||||||
|   | |||||||
| @@ -1,6 +1,7 @@ | |||||||
| require 'linguist/heuristics' | require 'linguist/heuristics' | ||||||
| require 'linguist/language' | require 'linguist/language' | ||||||
| require 'linguist/samples' | require 'linguist/samples' | ||||||
|  | require 'linguist/file_blob' | ||||||
|  |  | ||||||
| require 'test/unit' | require 'test/unit' | ||||||
|  |  | ||||||
| @@ -35,7 +36,8 @@ class TestHeuristcs < Test::Unit::TestCase | |||||||
|   end |   end | ||||||
|  |  | ||||||
|   def test_detect_still_works_if_nothing_matches |   def test_detect_still_works_if_nothing_matches | ||||||
|     match = Language.detect("Hello.m", fixture("Objective-C/hello.m")) |     blob = Linguist::FileBlob.new(File.join(samples_path, "Objective-C/hello.m")) | ||||||
|  |     match = Language.detect(blob) | ||||||
|     assert_equal Language["Objective-C"], match |     assert_equal Language["Objective-C"], match | ||||||
|   end |   end | ||||||
|    |    | ||||||
|   | |||||||
| @@ -3,22 +3,24 @@ require 'linguist/repository' | |||||||
| require 'test/unit' | require 'test/unit' | ||||||
|  |  | ||||||
| class TestRepository < Test::Unit::TestCase | class TestRepository < Test::Unit::TestCase | ||||||
|   include Linguist |   def rugged_repository | ||||||
|  |     @rugged ||= Rugged::Repository.new(File.expand_path("../../.git", __FILE__)) | ||||||
|   def repo(base_path) |  | ||||||
|     Repository.from_directory(base_path) |  | ||||||
|   end |   end | ||||||
|  |  | ||||||
|   def linguist_repo |   def master_oid | ||||||
|     repo(File.expand_path("../..", __FILE__)) |     'd40b4a33deba710e2f494db357c654fbe5d4b419' | ||||||
|  |   end | ||||||
|  |  | ||||||
|  |   def linguist_repo(oid = master_oid) | ||||||
|  |     Linguist::Repository.new(rugged_repository, oid) | ||||||
|   end |   end | ||||||
|  |  | ||||||
|   def test_linguist_language |   def test_linguist_language | ||||||
|     # assert_equal Language['Ruby'], linguist_repo.language |     assert_equal 'Ruby', linguist_repo.language | ||||||
|   end |   end | ||||||
|  |  | ||||||
|   def test_linguist_languages |   def test_linguist_languages | ||||||
|     # assert linguist_repo.languages[Language['Ruby']] > 10_000 |     assert linguist_repo.languages['Ruby'] > 10_000 | ||||||
|   end |   end | ||||||
|  |  | ||||||
|   def test_linguist_size |   def test_linguist_size | ||||||
| @@ -31,7 +33,18 @@ class TestRepository < Test::Unit::TestCase | |||||||
|     assert linguist_repo.breakdown_by_file["Ruby"].include?("lib/linguist/language.rb") |     assert linguist_repo.breakdown_by_file["Ruby"].include?("lib/linguist/language.rb") | ||||||
|   end |   end | ||||||
|  |  | ||||||
|   def test_binary_override |   def test_incremental_stats | ||||||
|     assert_equal repo(File.expand_path("../../samples/Nimrod", __FILE__)).language, Language["Nimrod"] |     old_commit = '3d7364877d6794f6cc2a86b493e893968a597332' | ||||||
|  |     old_repo = linguist_repo(old_commit) | ||||||
|  |  | ||||||
|  |     assert old_repo.languages['Ruby'] > 10_000 | ||||||
|  |     assert old_repo.size > 30_000 | ||||||
|  |  | ||||||
|  |     new_repo = Linguist::Repository.incremental(rugged_repository, master_oid, old_commit, old_repo.cache) | ||||||
|  |  | ||||||
|  |     assert new_repo.languages['Ruby'] > old_repo.languages['Ruby'] | ||||||
|  |     assert new_repo.size > old_repo.size | ||||||
|  |  | ||||||
|  |     assert_equal linguist_repo.cache, new_repo.cache | ||||||
|   end |   end | ||||||
| end | end | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user