mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	Compare commits
	
		
			421 Commits
		
	
	
		
			v2.11.0
			...
			test/attri
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 8f86998866 | ||
|  | d4c8fb8a28 | ||
|  | 351c1cc8fd | ||
|  | 7ee006cbcb | ||
|  | 525304738e | ||
|  | 4a017d9033 | ||
|  | 6f896d988f | ||
|  | 35a9d241fc | ||
|  | 9ba0a7db64 | ||
|  | 9968503872 | ||
|  | 34218c5f58 | ||
|  | ebd41f1f20 | ||
|  | 62b1816297 | ||
|  | 2dfb864e4e | ||
|  | 2d1e1d4747 | ||
|  | f785aa0ae2 | ||
|  | cc476e212e | ||
|  | bca9716fc6 | ||
|  | fae6dbfebd | ||
|  | a7a0800b46 | ||
|  | 305293d3e5 | ||
|  | 17d4eb7a5e | ||
|  | f97e103b6d | ||
|  | dafca264b2 | ||
|  | be970e9e3d | ||
|  | e76837fa20 | ||
|  | e1b3403dc8 | ||
|  | 79da17c5c8 | ||
|  | e9623d542d | ||
|  | bc999f4067 | ||
|  | 474e536ae8 | ||
|  | 79647c5bb4 | ||
|  | 5409c39e35 | ||
|  | 5d4a24dd4f | ||
|  | c97abe7ef5 | ||
|  | edaea7bede | ||
|  | 909bce8ed9 | ||
|  | 4090c492e8 | ||
|  | a24afb0e12 | ||
|  | bc01f8b25f | ||
|  | 077c4141d6 | ||
|  | e5f20314e9 | ||
|  | 8a61bcb6b5 | ||
|  | 61b301b380 | ||
|  | be86f28be1 | ||
|  | a443380869 | ||
|  | 3d1d431cda | ||
|  | 9559ece8af | ||
|  | 8f56a1096d | ||
|  | 0ec85f902a | ||
|  | a47dde2166 | ||
|  | abdd6bfbd2 | ||
|  | d64104f472 | ||
|  | 1cd5ae2d57 | ||
|  | e27bf1627d | ||
|  | 0689d64efd | ||
|  | 3ba47aec38 | ||
|  | b90253981b | ||
|  | 513f678b6c | ||
|  | 478b9cf189 | ||
|  | 6675baff13 | ||
|  | a6efeebd21 | ||
|  | 6e2bb25b6e | ||
|  | a54edf71d1 | ||
|  | 8ff7eaf893 | ||
|  | a8d3872002 | ||
|  | dea03b7a46 | ||
|  | f5723dcccf | ||
|  | d772d1f162 | ||
|  | 46cfd16ae7 | ||
|  | 315243350b | ||
|  | 886d8a7293 | ||
|  | 54318f4001 | ||
|  | b3aee8abab | ||
|  | 1bdbadc1b3 | ||
|  | e0997b311b | ||
|  | 3c2ca312b9 | ||
|  | 315df1339a | ||
|  | e03b3e5ec4 | ||
|  | 43923976c2 | ||
|  | 6b8ee2f3f7 | ||
|  | b8e570bb3d | ||
|  | 69ff3c79b4 | ||
|  | eff4da20f8 | ||
|  | 473688b109 | ||
|  | 7bfb6ed5d7 | ||
|  | 276080aeec | ||
|  | 41c880afc7 | ||
|  | 3d242c3a3a | ||
|  | 9325b07d68 | ||
|  | ddeeb5d416 | ||
|  | c8bc0a5c79 | ||
|  | f58522d5a9 | ||
|  | 27a621531b | ||
|  | 0235433b7e | ||
|  | 6b5d1fe25b | ||
|  | f811ab1b28 | ||
|  | fc73f51855 | ||
|  | dd181421a7 | ||
|  | f6e2189739 | ||
|  | d61f31d3ed | ||
|  | 4e83a6ad23 | ||
|  | 7fc39dc8d1 | ||
|  | f10154a782 | ||
|  | 8761dc4e17 | ||
|  | 5a044b1c07 | ||
|  | 0100b76412 | ||
|  | c8754292f4 | ||
|  | 61faea0298 | ||
|  | b9ecf61dcb | ||
|  | 437f81c4a0 | ||
|  | 26dad7dada | ||
|  | b1e5d6f8f8 | ||
|  | 8c7b54d6e3 | ||
|  | fea0d8963c | ||
|  | 7aca52c68c | ||
|  | 529d3faaf8 | ||
|  | 9f0f4657a2 | ||
|  | 90ff1b5896 | ||
|  | feb82e34d6 | ||
|  | 4d7a34c177 | ||
|  | 5c3385ecd8 | ||
|  | a1af3a509c | ||
|  | 2913a87cc4 | ||
|  | 69cc86c572 | ||
|  | 60144c907e | ||
|  | 1828cf6fc7 | ||
|  | ad4d273241 | ||
|  | 0d03a94cde | ||
|  | 6af5adaac1 | ||
|  | 17a28f2e91 | ||
|  | baaa7a5c13 | ||
|  | cfeb2a833c | ||
|  | e6fd58b3aa | ||
|  | 2ef905ef1e | ||
|  | db80aa84dc | ||
|  | f404cc16a1 | ||
|  | 8b4acf7023 | ||
|  | 7393c2ef91 | ||
|  | 4948ec2999 | ||
|  | 408a325732 | ||
|  | 5ca211b9f7 | ||
|  | bc7596a8b5 | ||
|  | 6762ca8aa7 | ||
|  | bb7d6ab429 | ||
|  | 986611ac36 | ||
|  | 94b4ad1de6 | ||
|  | 3e2f18bf3f | ||
|  | 48c06cc299 | ||
|  | f10821ac49 | ||
|  | cd5298dee6 | ||
|  | a8c955609a | ||
|  | c5acce0604 | ||
|  | a6ccce7b76 | ||
|  | aa72012d41 | ||
|  | 458831b885 | ||
|  | f5e4789ccb | ||
|  | 1b712d2800 | ||
|  | e274196441 | ||
|  | c4c3c27cfe | ||
|  | a2dd9d2c8c | ||
|  | 06e095e5fc | ||
|  | 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 | ||
|  | 2f4ea20fdd | ||
|  | fa4dfe39ba | ||
|  | 89999e60bf | ||
|  | 4819fb12a3 | ||
|  | 27a4eeb206 | ||
|  | bacf4d5780 | ||
|  | f92fed60f8 | ||
|  | 5e797b548c | ||
|  | 700e2f1b2b | ||
|  | 861656978b | ||
|  | 9c05bdac85 | ||
|  | bd34c16c8f | ||
|  | 81fcb4452e | ||
|  | 4f1a5cd456 | ||
|  | 13109bb9b8 | ||
|  | 84f3b3720b | ||
|  | 858a66ccc8 | ||
|  | abb05eace6 | ||
|  | 62bd96a778 | ||
|  | 8cb736adfa | ||
|  | 0758c05186 | ||
|  | 62bc6f0457 | ||
|  | ea7e894139 | ||
|  | 21f0ac99e6 | ||
|  | b251866a29 | ||
|  | bf3db20a9d | ||
|  | bd55147847 | ||
|  | f4d64af39b | ||
|  | b7bda34645 | ||
|  | b13dea6df0 | ||
|  | 28a64c9318 | ||
|  | 74be618fff | ||
|  | 8bbe10bf50 | ||
|  | d275911624 | ||
|  | c26382301c | ||
|  | ae2d3d7e61 | ||
|  | 58ae0908e3 | ||
|  | e12bc07041 | ||
|  | 20416369ac | ||
|  | 2be91e9b2e | ||
|  | e91caeaade | ||
|  | dc1b8d9e80 | ||
|  | bf0a814514 | ||
|  | b14267d40f | ||
|  | 195a4115d8 | ||
|  | e1da8eb841 | ||
|  | bd694c60e1 | ||
|  | 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 | ||
|  | 280ef7d1bd | ||
|  | 8d2ea90a5b | ||
|  | 4bf7abd73d | ||
|  | 8f251e6756 | ||
|  | 4cd35c1f33 | ||
|  | 78fda33707 | ||
|  | 5c6a98f479 | ||
|  | efbcb942c3 | ||
|  | f3da1bc3b1 | ||
|  | 72a6186f08 | ||
|  | 8cde6d2e8f | ||
|  | 4f2c7fdc3c | ||
|  | 5a830504a4 | ||
|  | 086fb09038 | ||
|  | 5544a041ce | ||
|  | 6447333368 | ||
|  | 1d6a42f0eb | ||
|  | de14b75517 | ||
|  | 0f302713da | ||
|  | a66d064d4a | ||
|  | 4fefe2020f | ||
|  | 72fab07a14 | ||
|  | adbf4f6b17 | ||
|  | cfcf4ca915 | ||
|  | c427fba87f | ||
|  | ab14bcab03 | ||
|  | 78de3fb959 | ||
|  | b9eda90ddd | ||
|  | 66b346c8fb | ||
|  | 8215b225d9 | ||
|  | 41da8c6352 | ||
|  | 04f4b05412 | ||
|  | b7dad4df5e | ||
|  | 1a98ccbf5f | ||
|  | 8d16a3365e | ||
|  | 67bf48fafc | ||
|  | 9a3c9a8c19 | ||
|  | 6a192dae63 | ||
|  | f5895216a8 | ||
|  | 09a33f8daa | ||
|  | 185db0e8d5 | ||
|  | 85efbde3f7 | ||
|  | 93d7aa3d07 | ||
|  | e96096f786 | ||
|  | 0a850eeddd | ||
|  | 42658ffd61 | ||
|  | 24fc2842d2 | ||
|  | ac2723abe3 | ||
|  | 0d0e219532 | ||
|  | cf35807709 | ||
|  | c2b53db96d | ||
|  | 8e6efc3a7d | ||
|  | 4b6f05b4d1 | ||
|  | 7aad5f93e4 | ||
|  | 9b6a7622d2 | ||
|  | 6c666075b5 | ||
|  | 6d26bf5c82 | ||
|  | 6d5da4c9ec | ||
|  | 51dde1f6a4 | ||
|  | 13c9259d23 | ||
|  | a22c2d678b | ||
|  | 5c36f8df85 | ||
|  | dcc598442b | ||
|  | 91877056fb | ||
|  | 868e9df434 | ||
|  | c3642ba7ed | ||
|  | a148d52aed | ||
|  | 9d569c8bd5 | ||
|  | 26fbc45baf | ||
|  | 9ae0bdbb43 | ||
|  | a3aaa1ec4d | ||
|  | ee3c9bcdbd | ||
|  | aa78060e41 | ||
|  | 89795ebd1f | ||
|  | 5fb6f34d8a | ||
|  | 3ecc1f883c | ||
|  | 7c1716aa1e | 
							
								
								
									
										9
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | ||||
| Gemfile linguist-vendored=true | ||||
| lib/linguist.rb linguist-language=Java | ||||
| test/*.rb linguist-language=Java | ||||
| Rakefile linguist-generated | ||||
| test/fixtures/* linguist-vendored=false | ||||
| README.md linguist-documentation=false | ||||
| samples/Arduino/* linguist-documentation | ||||
| samples/Markdown/*.md linguist-detectable=true | ||||
| samples/HTML/*.html linguist-detectable=false | ||||
| @@ -1,4 +1,6 @@ | ||||
| before_install:  | ||||
|   - git fetch origin master:master | ||||
|   - git fetch origin v2.0.0:v2.0.0 | ||||
|   - sudo apt-get install libicu-dev -y | ||||
|   - gem update --system 2.1.11 | ||||
| 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. Ensure that samples are updated: `bundle exec rake samples` | ||||
|  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. Make a PR to github/linguist.  For example, [#1075](https://github.com/github/linguist/pull/1075). | ||||
|  0. Bump gem version in `lib/linguist/version.rb`.  For example, [like this](https://github.com/github/linguist/commit/8d2ea90a5ba3b2fe6e1508b7155aa4632eea2985). | ||||
|  0. Make a PR to github/linguist.  For example, [#1238](https://github.com/github/linguist/pull/1238). | ||||
|  0. Build a local gem: `gem build github-linguist.gemspec` | ||||
|  0. Testing: | ||||
|    0. Bump the Gemfile and Gemfile.lock versions for an app which relies on this gem | ||||
| @@ -152,4 +152,4 @@ If you are the current maintainer of this gem: | ||||
|    0. Test behavior locally, branch deploy, whatever needs to happen | ||||
|  0. Merge github/linguist PR | ||||
|  0. Tag and push: `git tag vx.xx.xx; git push --tags` | ||||
|  0. Push to rubygems.org -- `gem push github-linguist-2.10.12.gem` | ||||
|  0. Push to rubygems.org -- `gem push github-linguist-3.0.0.gem` | ||||
|   | ||||
| @@ -4,7 +4,9 @@ | ||||
| #     usage: linguist <path> [<--breakdown>] | ||||
|  | ||||
| require 'linguist/file_blob' | ||||
| require 'linguist/language' | ||||
| require 'linguist/repository' | ||||
| require 'rugged' | ||||
|  | ||||
| path = ARGV[0] || Dir.pwd | ||||
|  | ||||
| @@ -18,7 +20,8 @@ ARGV.shift | ||||
| breakdown = true if ARGV[0] == "--breakdown" | ||||
|  | ||||
| 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| | ||||
|     percentage = ((size / repo.size.to_f) * 100) | ||||
|     percentage = sprintf '%.2f' % percentage | ||||
| @@ -28,7 +31,7 @@ if File.directory?(path) | ||||
|     puts | ||||
|     file_breakdown = repo.breakdown_by_file | ||||
|     file_breakdown.each do |lang, files| | ||||
|       puts "#{lang}:"  | ||||
|       puts "#{lang}:" | ||||
|       files.each do |file| | ||||
|         puts file | ||||
|       end | ||||
|   | ||||
| @@ -13,10 +13,11 @@ Gem::Specification.new do |s| | ||||
|   s.files = Dir['lib/**/*'] | ||||
|   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 '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 'mocha' | ||||
|   | ||||
| @@ -1,6 +1,4 @@ | ||||
| require 'linguist/generated' | ||||
| require 'linguist/language' | ||||
|  | ||||
| require 'charlock_holmes' | ||||
| require 'escape_utils' | ||||
| require 'mime/types' | ||||
| @@ -112,6 +110,12 @@ module Linguist | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     def ruby_encoding | ||||
|       if hash = detect_encoding | ||||
|         hash[:ruby_encoding] | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     # Try to guess the encoding | ||||
|     # | ||||
|     # Returns: a Hash, with :encoding, :confidence, :type | ||||
| @@ -241,7 +245,31 @@ module Linguist | ||||
|     def lines | ||||
|       @lines ||= | ||||
|         if viewable? && data | ||||
|           data.split(/\r\n|\r|\n/, -1) | ||||
|           # `data` is usually encoded as ASCII-8BIT even when the content has | ||||
|           # been detected as a different encoding. However, we are not allowed | ||||
|           # to change the encoding of `data` because we've made the implicit | ||||
|           # guarantee that each entry in `lines` is encoded the same way as | ||||
|           # `data`. | ||||
|           # | ||||
|           # Instead, we re-encode each possible newline sequence as the | ||||
|           # detected encoding, then force them back to the encoding of `data` | ||||
|           # (usually a binary encoding like ASCII-8BIT). This means that the | ||||
|           # byte sequence will match how newlines are likely encoded in the | ||||
|           # file, but we don't have to change the encoding of `data` as far as | ||||
|           # Ruby is concerned. This allows us to correctly parse out each line | ||||
|           # without changing the encoding of `data`, and | ||||
|           # also--importantly--without having to duplicate many (potentially | ||||
|           # large) strings. | ||||
|           begin | ||||
|             encoded_newlines = ["\r\n", "\r", "\n"]. | ||||
|               map { |nl| nl.encode(ruby_encoding, "ASCII-8BIT").force_encoding(data.encoding) } | ||||
|  | ||||
|             data.split(Regexp.union(encoded_newlines), -1) | ||||
|           rescue Encoding::ConverterNotFoundError | ||||
|             # The data is not splittable in the detected encoding.  Assume it's | ||||
|             # one big line. | ||||
|             [data] | ||||
|           end | ||||
|         else | ||||
|           [] | ||||
|         end | ||||
| @@ -283,15 +311,7 @@ module Linguist | ||||
|     # | ||||
|     # Returns a Language or nil if none is detected | ||||
|     def language | ||||
|       return @language if defined? @language | ||||
|  | ||||
|       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) | ||||
|       @language ||= Language.detect(self) | ||||
|     end | ||||
|  | ||||
|     # Internal: Get the lexer of the blob. | ||||
|   | ||||
| @@ -52,5 +52,20 @@ module Linguist | ||||
|     def size | ||||
|       File.size(@path) | ||||
|     end | ||||
|  | ||||
|     # Public: Get file extension. | ||||
|     # | ||||
|     # Returns a String. | ||||
|     def extension | ||||
|       # File.extname returns nil if the filename is an extension. | ||||
|       extension = File.extname(name) | ||||
|       basename = File.basename(name) | ||||
|       # Checks if the filename is an extension. | ||||
|       if extension.empty? && basename[0] == "." | ||||
|         basename | ||||
|       else | ||||
|         extension | ||||
|       end | ||||
|     end | ||||
|   end | ||||
| end | ||||
|   | ||||
| @@ -54,7 +54,7 @@ module Linguist | ||||
|       name == 'Gemfile.lock' || | ||||
|         minified_files? || | ||||
|         compiled_coffeescript? || | ||||
|         xcode_project_file? || | ||||
|         xcode_file? || | ||||
|         generated_parser? || | ||||
|         generated_net_docfile? || | ||||
|         generated_net_designer_file? || | ||||
| @@ -63,17 +63,18 @@ module Linguist | ||||
|         generated_jni_header? || | ||||
|         composer_lock? || | ||||
|         node_modules? || | ||||
|         vcr_cassette? | ||||
|         vcr_cassette? || | ||||
|         generated_by_zephir? | ||||
|     end | ||||
|  | ||||
|     # Internal: Is the blob an XCode project file? | ||||
|     # Internal: Is the blob an Xcode file? | ||||
|     # | ||||
|     # Generated if the file extension is an XCode project | ||||
|     # Generated if the file extension is an Xcode  | ||||
|     # file extension. | ||||
|     # | ||||
|     # Returns true of false. | ||||
|     def xcode_project_file? | ||||
|       ['.xib', '.nib', '.storyboard', '.pbxproj', '.xcworkspacedata', '.xcuserstate'].include?(extname) | ||||
|     def xcode_file? | ||||
|       ['.nib', '.xcworkspacedata', '.xcuserstate'].include?(extname) | ||||
|     end | ||||
|  | ||||
|     # Internal: Is the blob minified files? | ||||
| @@ -234,7 +235,14 @@ module Linguist | ||||
|     # | ||||
|     # Returns true or false. | ||||
|     def composer_lock? | ||||
|       !!name.match(/composer.lock/) | ||||
|       !!name.match(/composer\.lock/) | ||||
|     end | ||||
|  | ||||
|     # Internal: Is the blob a generated by Zephir | ||||
|     # | ||||
|     # Returns true or false. | ||||
|     def generated_by_zephir? | ||||
|       !!name.match(/.\.zep\.(?:c|h|php)$/) | ||||
|     end | ||||
|  | ||||
|     # Is the blob a VCR Cassette file? | ||||
| @@ -248,3 +256,4 @@ module Linguist | ||||
|     end | ||||
|   end | ||||
| end | ||||
|  | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| module Linguist | ||||
|   # A collection of simple heuristics that can be used to better analyze languages. | ||||
|   class Heuristics | ||||
|     ACTIVE = false | ||||
|     ACTIVE = true | ||||
|  | ||||
|     # Public: Given an array of String language names, | ||||
|     # apply heuristics against the given data and return an array | ||||
| @@ -13,24 +13,13 @@ module Linguist | ||||
|     # Returns an array of Languages or [] | ||||
|     def self.find_by_heuristics(data, languages) | ||||
|       if active? | ||||
|         if languages.all? { |l| ["Objective-C", "C++"].include?(l) } | ||||
|           disambiguate_c(data, languages) | ||||
|         end | ||||
|         if languages.all? { |l| ["Perl", "Prolog"].include?(l) } | ||||
|           disambiguate_pl(data, languages) | ||||
|           result = disambiguate_pl(data, languages) | ||||
|         end | ||||
|         if languages.all? { |l| ["ECL", "Prolog"].include?(l) } | ||||
|           disambiguate_ecl(data, languages) | ||||
|         end | ||||
|         if languages.all? { |l| ["TypeScript", "XML"].include?(l) } | ||||
|           disambiguate_ts(data, languages) | ||||
|         end | ||||
|         if languages.all? { |l| ["Common Lisp", "OpenCL"].include?(l) } | ||||
|           disambiguate_cl(data, languages) | ||||
|         end | ||||
|         if languages.all? { |l| ["Rebol", "R"].include?(l) } | ||||
|           disambiguate_r(data, languages) | ||||
|           result = disambiguate_ecl(data, languages) | ||||
|         end | ||||
|         return result | ||||
|       end | ||||
|     end | ||||
|  | ||||
|   | ||||
| @@ -9,6 +9,8 @@ end | ||||
| require 'linguist/classifier' | ||||
| require 'linguist/heuristics' | ||||
| require 'linguist/samples' | ||||
| require 'linguist/file_blob' | ||||
| require 'linguist/blob_helper' | ||||
|  | ||||
| module Linguist | ||||
|   # Language names that are recognizable by GitHub. Defined languages | ||||
| @@ -92,18 +94,25 @@ module Linguist | ||||
|  | ||||
|     # Public: Detects the Language of the blob. | ||||
|     # | ||||
|     # name - String filename | ||||
|     # data - String blob data. A block also maybe passed in for lazy | ||||
|     #        loading. This behavior is deprecated and you should always | ||||
|     #        pass in a String. | ||||
|     # mode - Optional String mode (defaults to nil) | ||||
|     # blob - an object that includes the Linguist `BlobHelper` interface; | ||||
|     #       see Linguist::LazyBlob and Linguist::FileBlob for examples | ||||
|     # | ||||
|     # 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? || blob.binary? | ||||
|  | ||||
|       # A bit of an elegant hack. If the file is executable but extensionless, | ||||
|       # append a "magic" extension so it can be classified with other | ||||
|       # languages that have shebang scripts. | ||||
|       if File.extname(name).empty? && mode && (mode.to_i(8) & 05) == 05 | ||||
|       extension = FileBlob.new(name).extension | ||||
|       if extension.empty? && blob.mode && (blob.mode.to_i(8) & 05) == 05 | ||||
|         name += ".script!" | ||||
|       end | ||||
|  | ||||
| @@ -114,10 +123,10 @@ module Linguist | ||||
|       # extension at all, in the case of extensionless scripts), we need to continue | ||||
|       # our detection work | ||||
|       if possible_languages.length > 1 | ||||
|         data = data.call() if data.respond_to?(:call) | ||||
|         data = blob.data | ||||
|         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 == "" | ||||
|           nil | ||||
|         # Check if there's a shebang line and use that as authoritative | ||||
| @@ -127,7 +136,7 @@ module Linguist | ||||
|         elsif (determined = Heuristics.find_by_heuristics(data, possible_language_names)) && !determined.empty? | ||||
|           determined.first | ||||
|         # Lastly, fall back to the probablistic classifier. | ||||
|         elsif classified = Classifier.classify(Samples::DATA, data, possible_language_names ).first | ||||
|         elsif classified = Classifier.classify(Samples::DATA, data, possible_language_names).first | ||||
|           # Return the actual Language object based of the string language name (i.e., first element of `#classify`) | ||||
|           Language[classified[0]] | ||||
|         end | ||||
| @@ -183,7 +192,8 @@ module Linguist | ||||
|     # | ||||
|     # Returns all matching Languages or [] if none were found. | ||||
|     def self.find_by_filename(filename) | ||||
|       basename, extname = File.basename(filename), File.extname(filename) | ||||
|       basename = File.basename(filename) | ||||
|       extname = FileBlob.new(filename).extension | ||||
|       langs = @filename_index[basename] + | ||||
|               @extension_index[extname] | ||||
|       langs.compact.uniq | ||||
| @@ -395,7 +405,7 @@ module Linguist | ||||
|     # | ||||
|     # Returns the extensions Array | ||||
|     attr_reader :filenames | ||||
|      | ||||
|  | ||||
|     # Public: Return all possible extensions for language | ||||
|     def all_extensions | ||||
|       (extensions + [primary_extension]).uniq | ||||
| @@ -522,6 +532,7 @@ module Linguist | ||||
|     if extnames = extensions[name] | ||||
|       extnames.each do |extname| | ||||
|         if !options['extensions'].include?(extname) | ||||
|           warn "#{name} has a sample with extension (#{extname}) that isn't explicitly defined in languages.yml" unless extname == '.script!' | ||||
|           options['extensions'] << extname | ||||
|         end | ||||
|       end | ||||
|   | ||||
| @@ -28,6 +28,16 @@ ABAP: | ||||
|   extensions: | ||||
|   - .abap | ||||
|  | ||||
| AGS Script: | ||||
|   type: programming | ||||
|   lexer: C++ | ||||
|   color: "#B9D9FF" | ||||
|   aliases: | ||||
|   - ags | ||||
|   extensions: | ||||
|   - .asc | ||||
|   - .ash | ||||
|  | ||||
| ANTLR: | ||||
|   type: programming | ||||
|   color: "#9DC3FF" | ||||
| @@ -35,6 +45,12 @@ ANTLR: | ||||
|   extensions: | ||||
|   - .g4 | ||||
|  | ||||
| APL: | ||||
|   type: programming | ||||
|   color: "#8a0707" | ||||
|   extensions: | ||||
|   - .apl | ||||
|  | ||||
| ASP: | ||||
|   type: programming | ||||
|   color: "#6a40fd" | ||||
| @@ -89,7 +105,7 @@ Agda: | ||||
|  | ||||
| Alloy: | ||||
|   type: programming  # 'modeling' would be more appropiate | ||||
|   lexer: Text only | ||||
|   lexer: Alloy | ||||
|   color: "#cc5c24" | ||||
|   extensions: | ||||
|   - .als | ||||
| @@ -221,6 +237,8 @@ BlitzBasic: | ||||
|   - .decls | ||||
|  | ||||
| BlitzMax: | ||||
|   type: programming | ||||
|   color: "#cd6400" | ||||
|   extensions: | ||||
|   - .bmx | ||||
|  | ||||
| @@ -258,6 +276,7 @@ C: | ||||
|   extensions: | ||||
|   - .c | ||||
|   - .cats | ||||
|   - .h | ||||
|   - .w | ||||
|  | ||||
| C#: | ||||
| @@ -286,6 +305,7 @@ C++: | ||||
|   - .cc | ||||
|   - .cxx | ||||
|   - .H | ||||
|   - .h | ||||
|   - .h++ | ||||
|   - .hh | ||||
|   - .hpp | ||||
| @@ -293,6 +313,7 @@ C++: | ||||
|   - .inl | ||||
|   - .tcc | ||||
|   - .tpp | ||||
|   - .ipp | ||||
|  | ||||
| C-ObjDump: | ||||
|   type: data | ||||
| @@ -318,7 +339,7 @@ CLIPS: | ||||
| CMake: | ||||
|   extensions: | ||||
|   - .cmake | ||||
|   - .cmake.in | ||||
|   - .in | ||||
|   filenames: | ||||
|   - CMakeLists.txt | ||||
|  | ||||
| @@ -343,6 +364,14 @@ Ceylon: | ||||
|   extensions: | ||||
|   - .ceylon | ||||
|  | ||||
| Chapel: | ||||
|   type: programming | ||||
|   color: "#8dc63f" | ||||
|   aliases: | ||||
|   - chpl | ||||
|   extensions: | ||||
|   - .chpl | ||||
|  | ||||
| ChucK: | ||||
|   lexer: Java | ||||
|   extensions: | ||||
| @@ -351,9 +380,8 @@ ChucK: | ||||
| Cirru: | ||||
|   type: programming | ||||
|   color: "#aaaaff" | ||||
|   # ace_mode: cirru | ||||
|   # lexer: Cirru | ||||
|   lexer: Text only | ||||
|   ace_mode: cirru | ||||
|   lexer: Cirru | ||||
|   extensions: | ||||
|   - .cirru | ||||
|  | ||||
| @@ -377,7 +405,7 @@ Clojure: | ||||
|   - .cljscm | ||||
|   - .cljx | ||||
|   - .hic | ||||
|   - .cljs.hl | ||||
|   - .hl | ||||
|   filenames: | ||||
|   - riemann.config | ||||
|  | ||||
| @@ -400,14 +428,27 @@ CoffeeScript: | ||||
|  | ||||
| ColdFusion: | ||||
|   type: programming | ||||
|   group: ColdFusion | ||||
|   lexer: Coldfusion HTML | ||||
|   ace_mode: coldfusion | ||||
|   color: "#ed2cd6" | ||||
|   search_term: cfm | ||||
|   aliases: | ||||
|   - cfm | ||||
|   - cfml | ||||
|   extensions: | ||||
|   - .cfm | ||||
|  | ||||
| ColdFusion CFC: | ||||
|   type: programming | ||||
|   group: ColdFusion | ||||
|   lexer: Coldfusion CFC | ||||
|   ace_mode: coldfusion | ||||
|   color: "#ed2cd6" | ||||
|   search_term: cfc | ||||
|   aliases: | ||||
|   - cfc | ||||
|   extensions: | ||||
|   - .cfc | ||||
|  | ||||
| Common Lisp: | ||||
| @@ -429,10 +470,19 @@ Common Lisp: | ||||
|   - clisp | ||||
|   - ecl | ||||
|  | ||||
| Component Pascal: | ||||
|   type: programming | ||||
|   lexer: Delphi | ||||
|   color: "#b0ce4e" | ||||
|   extensions: | ||||
|   - .cp | ||||
|   - .cps | ||||
|  | ||||
| Coq: | ||||
|   type: programming | ||||
|   extensions: | ||||
|   - .coq | ||||
|   - .v | ||||
|  | ||||
| Cpp-ObjDump: | ||||
|   type: data | ||||
| @@ -468,6 +518,12 @@ Cuda: | ||||
|   - .cu | ||||
|   - .cuh | ||||
|  | ||||
| Cycript: | ||||
|   type: programming | ||||
|   lexer: JavaScript | ||||
|   extensions: | ||||
|   - .cy | ||||
|  | ||||
| Cython: | ||||
|   type: programming | ||||
|   group: Python | ||||
| @@ -519,18 +575,10 @@ Dart: | ||||
|   extensions: | ||||
|   - .dart | ||||
|  | ||||
| DCPU-16 ASM: | ||||
|   type: programming | ||||
|   lexer: dasm16 | ||||
|   extensions: | ||||
|   - .dasm16 | ||||
|   - .dasm | ||||
|   aliases: | ||||
|   - dasm16 | ||||
|  | ||||
| Diff: | ||||
|   extensions: | ||||
|   - .diff | ||||
|   - .patch | ||||
|  | ||||
| Dogescript: | ||||
|   type: programming | ||||
| @@ -579,7 +627,7 @@ Eagle: | ||||
|  | ||||
| Eiffel: | ||||
|   type: programming | ||||
|   lexer: Text only | ||||
|   lexer: Eiffel | ||||
|   color: "#946d57" | ||||
|   extensions: | ||||
|   - .e | ||||
| @@ -599,7 +647,7 @@ Elm: | ||||
|  | ||||
| Emacs Lisp: | ||||
|   type: programming | ||||
|   lexer: Scheme | ||||
|   lexer: Common Lisp | ||||
|   color: "#c065db" | ||||
|   aliases: | ||||
|   - elisp | ||||
| @@ -610,11 +658,20 @@ Emacs Lisp: | ||||
|   - .el | ||||
|   - .emacs | ||||
|  | ||||
| EmberScript: | ||||
|   type: programming | ||||
|   color: "#f64e3e" | ||||
|   lexer: CoffeeScript | ||||
|   extensions: | ||||
|   - .em | ||||
|   - .emberscript | ||||
|  | ||||
| Erlang: | ||||
|   type: programming | ||||
|   color: "#0faf8d" | ||||
|   extensions: | ||||
|   - .erl | ||||
|   - .escript | ||||
|   - .hrl | ||||
|  | ||||
| F#: | ||||
| @@ -690,6 +747,7 @@ Forth: | ||||
|   extensions: | ||||
|   - .fth | ||||
|   - .4th | ||||
|   - .forth | ||||
|  | ||||
| Frege: | ||||
|   type: programming | ||||
| @@ -705,6 +763,12 @@ Game Maker Language: | ||||
|   extensions: | ||||
|   - .gml | ||||
|  | ||||
| GAMS: | ||||
|   type: programming | ||||
|   lexer: Text only | ||||
|   extensions: | ||||
|   - .gms | ||||
|  | ||||
| GAP: | ||||
|   type: programming | ||||
|   lexer: Text only | ||||
| @@ -728,12 +792,14 @@ GLSL: | ||||
|   - .glsl | ||||
|   - .fp | ||||
|   - .frag | ||||
|   - .frg | ||||
|   - .fshader | ||||
|   - .geom | ||||
|   - .glslv | ||||
|   - .gshader | ||||
|   - .shader | ||||
|   - .vert | ||||
|   - .vrx | ||||
|   - .vshader | ||||
|  | ||||
| Genshi: | ||||
| @@ -790,6 +856,15 @@ Gosu: | ||||
|   color: "#82937f" | ||||
|   extensions: | ||||
|   - .gs | ||||
|   - .gst | ||||
|   - .gsx | ||||
|   - .vark | ||||
|  | ||||
| Grace: | ||||
|   type: programming | ||||
|   lexer: Text only | ||||
|   extensions: | ||||
|   - .grace | ||||
|  | ||||
| Grammatical Framework: | ||||
|   type: programming | ||||
| @@ -819,6 +894,10 @@ Groovy: | ||||
|   color: "#e69f56" | ||||
|   extensions: | ||||
|   - .groovy | ||||
|   - .gradle | ||||
|   - .grt | ||||
|   - .gtpl | ||||
|   - .gvy | ||||
|   interpreters: | ||||
|   - groovy | ||||
|  | ||||
| @@ -838,7 +917,6 @@ HTML: | ||||
|   extensions: | ||||
|   - .html | ||||
|   - .htm | ||||
|   - .html.hl | ||||
|   - .st | ||||
|   - .xhtml | ||||
|  | ||||
| @@ -858,9 +936,7 @@ HTML+ERB: | ||||
|   - erb | ||||
|   extensions: | ||||
|   - .erb | ||||
|   - .erb.deface | ||||
|   - .html.erb | ||||
|   - .html.erb.deface | ||||
|   - .deface | ||||
|  | ||||
| HTML+PHP: | ||||
|   type: markup | ||||
| @@ -878,17 +954,14 @@ Haml: | ||||
|   type: markup | ||||
|   extensions: | ||||
|   - .haml | ||||
|   - .haml.deface | ||||
|   - .html.haml.deface | ||||
|   - .deface | ||||
|  | ||||
| Handlebars: | ||||
|   type: markup | ||||
|   lexer: Text only | ||||
|   lexer: Handlebars | ||||
|   extensions: | ||||
|   - .handlebars | ||||
|   - .hbs | ||||
|   - .html.handlebars | ||||
|   - .html.hbs | ||||
|  | ||||
| Harbour: | ||||
|   type: programming | ||||
| @@ -907,14 +980,14 @@ Haskell: | ||||
| Haxe: | ||||
|   type: programming | ||||
|   ace_mode: haxe | ||||
|   color: "#346d51" | ||||
|   color: "#f7941e" | ||||
|   extensions: | ||||
|   - .hx | ||||
|   - .hxsl | ||||
|  | ||||
| Hy: | ||||
|   type: programming | ||||
|   lexer: Clojure | ||||
|   lexer: Hy | ||||
|   ace_mode: clojure | ||||
|   color: "#7891b1" | ||||
|   extensions: | ||||
| @@ -922,10 +995,17 @@ Hy: | ||||
|  | ||||
| IDL: | ||||
|   type: programming | ||||
|   lexer: Text only | ||||
|   lexer: IDL | ||||
|   color: "#e3592c" | ||||
|   extensions: | ||||
|   - .pro | ||||
|   - .dlm | ||||
|  | ||||
| IGOR Pro: | ||||
|   type: programming | ||||
|   lexer: Igor | ||||
|   extensions: | ||||
|   - .ipf | ||||
|  | ||||
| INI: | ||||
|   type: data | ||||
| @@ -941,14 +1021,14 @@ Inno Setup: | ||||
|  | ||||
| Idris: | ||||
|   type: programming | ||||
|   lexer: Text only | ||||
|   lexer: Idris | ||||
|   extensions: | ||||
|   - .idr | ||||
|   - .lidr | ||||
|  | ||||
| Inform 7: | ||||
|   type: programming | ||||
|   lexer: Text only | ||||
|   lexer: Inform 7 | ||||
|   wrap: true | ||||
|   extensions: | ||||
|   - .ni | ||||
| @@ -980,6 +1060,13 @@ Ioke: | ||||
|   extensions: | ||||
|   - .ik | ||||
|  | ||||
| Isabelle: | ||||
|   type: programming | ||||
|   lexer: Text only | ||||
|   color: "#fdcd00" | ||||
|   extensions: | ||||
|   - .thy | ||||
|  | ||||
| J: | ||||
|   type: programming | ||||
|   lexer: Text only | ||||
| @@ -993,6 +1080,7 @@ JSON: | ||||
|   searchable: false | ||||
|   extensions: | ||||
|   - .json | ||||
|   - .lock | ||||
|   - .sublime-keymap | ||||
|   - .sublime-mousemap | ||||
|   - .sublime-project | ||||
| @@ -1059,6 +1147,7 @@ JavaScript: | ||||
|   - ._js | ||||
|   - .bones | ||||
|   - .es6 | ||||
|   - .frag | ||||
|   - .jake | ||||
|   - .jsfl | ||||
|   - .jsm | ||||
| @@ -1068,6 +1157,8 @@ JavaScript: | ||||
|   - .pac | ||||
|   - .sjs | ||||
|   - .ssjs | ||||
|   - .xsjs | ||||
|   - .xsjslib | ||||
|   filenames: | ||||
|   - Jakefile | ||||
|   interpreters: | ||||
| @@ -1112,12 +1203,31 @@ LLVM: | ||||
|   extensions: | ||||
|   - .ll | ||||
|  | ||||
| LSL: | ||||
|   type: programming | ||||
|   lexer: LSL | ||||
|   ace_mode: lsl | ||||
|   extensions: | ||||
|   - .lsl | ||||
|   interpreters: | ||||
|   - lsl | ||||
|   color: '#3d9970' | ||||
|  | ||||
| LabVIEW: | ||||
|   type: programming | ||||
|   lexer: Text only | ||||
|   extensions: | ||||
|   - .lvproj | ||||
|  | ||||
| Lasso: | ||||
|   type: programming | ||||
|   lexer: Lasso | ||||
|   color: "#2584c3" | ||||
|   extensions: | ||||
|   - .lasso | ||||
|   - .las | ||||
|   - .lasso9 | ||||
|   - .ldml | ||||
|  | ||||
| Latte: | ||||
|   type: markup | ||||
| @@ -1196,6 +1306,14 @@ Logtalk: | ||||
|   - .lgt | ||||
|   - .logtalk | ||||
|  | ||||
| LookML: | ||||
|   type: programming | ||||
|   lexer: YAML | ||||
|   ace_mode: yaml | ||||
|   color: "#652B81" | ||||
|   extensions: | ||||
|   - .lookml | ||||
|  | ||||
| Lua: | ||||
|   type: programming | ||||
|   ace_mode: lua | ||||
| @@ -1203,6 +1321,7 @@ Lua: | ||||
|   extensions: | ||||
|   - .lua | ||||
|   - .nse | ||||
|   - .pd_lua | ||||
|   - .rbxs | ||||
|   interpreters: | ||||
|   - lua | ||||
| @@ -1250,6 +1369,7 @@ Markdown: | ||||
|   - .md | ||||
|   - .markdown | ||||
|   - .mkd | ||||
|   - .mkdn | ||||
|   - .mkdown | ||||
|   - .ron | ||||
|  | ||||
| @@ -1265,7 +1385,9 @@ Mathematica: | ||||
|   type: programming | ||||
|   extensions: | ||||
|   - .mathematica | ||||
|   lexer: Text only | ||||
|   - .m | ||||
|   - .nb | ||||
|   lexer: Mathematica | ||||
|  | ||||
| Matlab: | ||||
|   type: programming | ||||
| @@ -1313,7 +1435,7 @@ MiniD: # Legacy | ||||
| Mirah: | ||||
|   type: programming | ||||
|   lexer: Ruby | ||||
|   search_term: ruby | ||||
|   search_term: mirah | ||||
|   color: "#c7a938" | ||||
|   extensions: | ||||
|   - .druby | ||||
| @@ -1345,6 +1467,7 @@ Myghty: | ||||
| NSIS: | ||||
|   extensions: | ||||
|   - .nsi | ||||
|   - .nsh | ||||
|  | ||||
| Nemerle: | ||||
|   type: programming | ||||
| @@ -1372,6 +1495,19 @@ Nimrod: | ||||
|   - .nim | ||||
|   - .nimrod | ||||
|  | ||||
| Nit: | ||||
|   type: programming | ||||
|   lexer: Text only | ||||
|   color: "#0d8921" | ||||
|   extensions: | ||||
|   - .nit | ||||
|  | ||||
| Nix: | ||||
|   type: programming | ||||
|   lexer: Nix | ||||
|   extensions: | ||||
|   - .nix | ||||
|  | ||||
| Nu: | ||||
|   type: programming | ||||
|   lexer: Scheme | ||||
| @@ -1396,6 +1532,7 @@ OCaml: | ||||
|   color: "#3be133" | ||||
|   extensions: | ||||
|   - .ml | ||||
|   - .eliom | ||||
|   - .eliomi | ||||
|   - .ml4 | ||||
|   - .mli | ||||
| @@ -1416,6 +1553,7 @@ Objective-C: | ||||
|   - objc | ||||
|   extensions: | ||||
|   - .m | ||||
|   - .h | ||||
|  | ||||
| Objective-C++: | ||||
|   type: programming | ||||
| @@ -1447,6 +1585,13 @@ Opa: | ||||
|   extensions: | ||||
|   - .opa | ||||
|  | ||||
| Opal: | ||||
|   type: programming | ||||
|   color: "#f7ede0" | ||||
|   lexer: Text only | ||||
|   extensions: | ||||
|   - .opal | ||||
|  | ||||
| OpenCL: | ||||
|   type: programming | ||||
|   group: C | ||||
| @@ -1463,6 +1608,13 @@ OpenEdge ABL: | ||||
|   - abl | ||||
|   extensions: | ||||
|   - .p | ||||
|   - .cls | ||||
|  | ||||
| OpenSCAD: | ||||
|   type: programming | ||||
|   lexer: Text only | ||||
|   extensions: | ||||
|   - .scad | ||||
|  | ||||
| Org: | ||||
|   type: prose | ||||
| @@ -1471,6 +1623,14 @@ Org: | ||||
|   extensions: | ||||
|   - .org | ||||
|  | ||||
| Ox: | ||||
|   type: programming | ||||
|   lexer: Text only | ||||
|   extensions: | ||||
|   - .ox | ||||
|   - .oxh | ||||
|   - .oxo | ||||
|  | ||||
| Oxygene: | ||||
|   type: programming | ||||
|   lexer: Text only | ||||
| @@ -1493,12 +1653,22 @@ PHP: | ||||
|   - .php | ||||
|   - .aw | ||||
|   - .ctp | ||||
|   - .module | ||||
|   - .php3 | ||||
|   - .php4 | ||||
|   - .php5 | ||||
|   - .phpt | ||||
|   filenames: | ||||
|   - Phakefile | ||||
|   interpreters: | ||||
|   - php | ||||
|  | ||||
| Pan: | ||||
|   type: programming | ||||
|   lexer: Pan | ||||
|   color: '#cc0000' | ||||
|   extensions: | ||||
|   - .pan | ||||
|  | ||||
| Parrot: | ||||
|   type: programming | ||||
| @@ -1532,6 +1702,7 @@ Pascal: | ||||
|   extensions: | ||||
|   - .pas | ||||
|   - .dfm | ||||
|   - .dpr | ||||
|   - .lpr | ||||
|  | ||||
| Perl: | ||||
| @@ -1541,12 +1712,15 @@ Perl: | ||||
|   extensions: | ||||
|   - .pl | ||||
|   - .PL | ||||
|   - .cgi | ||||
|   - .fcgi | ||||
|   - .perl | ||||
|   - .ph | ||||
|   - .plx | ||||
|   - .pm | ||||
|   - .pod | ||||
|   - .psgi | ||||
|   - .t | ||||
|   interpreters: | ||||
|   - perl | ||||
|  | ||||
| @@ -1563,10 +1737,17 @@ Perl6: | ||||
|   - .pl6 | ||||
|   - .pm6 | ||||
|  | ||||
| PigLatin: | ||||
|   type: programming | ||||
|   color: "#fcd7de" | ||||
|   lexer: Text only | ||||
|   extensions: | ||||
|   - .pig | ||||
|  | ||||
| Pike: | ||||
|   type: programming | ||||
|   color: "#066ab2" | ||||
|   lexer: C | ||||
|   lexer: Pike | ||||
|   extensions: | ||||
|   - .pike | ||||
|   - .pmod | ||||
| @@ -1613,9 +1794,9 @@ Prolog: | ||||
|   type: programming | ||||
|   color: "#74283c" | ||||
|   extensions: | ||||
|   - .prolog | ||||
|   - .ecl | ||||
|   - .pl | ||||
|   - .ecl | ||||
|   - .prolog | ||||
|  | ||||
| Propeller Spin: | ||||
|   type: programming | ||||
| @@ -1660,9 +1841,11 @@ Python: | ||||
|   color: "#3581ba" | ||||
|   extensions: | ||||
|   - .py | ||||
|   - .cgi | ||||
|   - .gyp | ||||
|   - .lmi | ||||
|   - .pyde | ||||
|   - .pyp | ||||
|   - .pyt | ||||
|   - .pyw | ||||
|   - .wsgi | ||||
| @@ -1688,6 +1871,12 @@ QML: | ||||
|   extensions: | ||||
|   - .qml | ||||
|  | ||||
| QMake: | ||||
|   lexer: Text only | ||||
|   extensions: | ||||
|   - .pro | ||||
|   - .pri | ||||
|  | ||||
| R: | ||||
|   type: programming | ||||
|   color: "#198ce7" | ||||
| @@ -1698,6 +1887,8 @@ R: | ||||
|   extensions: | ||||
|   - .r | ||||
|   - .R | ||||
|   - .Rd | ||||
|   - .rd | ||||
|   - .rsx | ||||
|   filenames: | ||||
|   - .Rprofile | ||||
| @@ -1706,7 +1897,7 @@ R: | ||||
|  | ||||
| RDoc: | ||||
|   type: prose | ||||
|   lexer: Text only | ||||
|   lexer: Rd | ||||
|   ace_mode: rdoc | ||||
|   wrap: true | ||||
|   extensions: | ||||
| @@ -1746,6 +1937,7 @@ Racket: | ||||
|   - .rkt | ||||
|   - .rktd | ||||
|   - .rktl | ||||
|   - .scrbl | ||||
|  | ||||
| Ragel in Ruby Host: | ||||
|   type: programming | ||||
| @@ -1779,7 +1971,7 @@ Red: | ||||
|   extensions: | ||||
|   - .red | ||||
|   - .reds | ||||
|    | ||||
|  | ||||
| Redcode: | ||||
|   extensions: | ||||
|   - .cw | ||||
| @@ -1815,7 +2007,10 @@ Ruby: | ||||
|   - .god | ||||
|   - .irbrc | ||||
|   - .mspec | ||||
|   - .pluginspec | ||||
|   - .podspec | ||||
|   - .rabl | ||||
|   - .rake | ||||
|   - .rbuild | ||||
|   - .rbw | ||||
|   - .rbx | ||||
| @@ -1825,13 +2020,17 @@ Ruby: | ||||
|   interpreters: | ||||
|   - ruby | ||||
|   filenames: | ||||
|   - .pryrc | ||||
|   - Appraisals | ||||
|   - Berksfile | ||||
|   - Buildfile | ||||
|   - Gemfile | ||||
|   - Gemfile.lock | ||||
|   - Guardfile | ||||
|   - Jarfile | ||||
|   - Mavenfile | ||||
|   - Podfile | ||||
|   - Puppetfile | ||||
|   - Thorfile | ||||
|   - Vagrantfile | ||||
|   - buildfile | ||||
| @@ -1842,6 +2041,13 @@ Rust: | ||||
|   extensions: | ||||
|   - .rs | ||||
|  | ||||
| SAS: | ||||
|   type: programming | ||||
|   color: "#1E90FF" | ||||
|   lexer: Text only | ||||
|   extensions: | ||||
|   - .sas | ||||
|  | ||||
| SCSS: | ||||
|   type: markup | ||||
|   group: CSS | ||||
| @@ -1849,8 +2055,16 @@ SCSS: | ||||
|   extensions: | ||||
|   - .scss | ||||
|  | ||||
| SQL: | ||||
| SQF: | ||||
|   type: programming | ||||
|   color: "#FFCB1F" | ||||
|   lexer: C++ | ||||
|   extensions: | ||||
|   - .sqf | ||||
|   - .hqf | ||||
|  | ||||
| SQL: | ||||
|   type: data | ||||
|   ace_mode: sql | ||||
|   extensions: | ||||
|   - .sql | ||||
| @@ -1859,6 +2073,13 @@ SQL: | ||||
|   - .udf | ||||
|   - .viw | ||||
|  | ||||
| STON: | ||||
|   type: data | ||||
|   group: Smalltalk | ||||
|   lexer: JSON | ||||
|   extensions: | ||||
|   - .ston | ||||
|  | ||||
| Sage: | ||||
|   type: programming | ||||
|   lexer: Python | ||||
| @@ -1871,6 +2092,7 @@ Sass: | ||||
|   group: CSS | ||||
|   extensions: | ||||
|   - .sass | ||||
|   - .scss | ||||
|  | ||||
| Scala: | ||||
|   type: programming | ||||
| @@ -1878,6 +2100,7 @@ Scala: | ||||
|   color: "#7dd3b0" | ||||
|   extensions: | ||||
|   - .scala | ||||
|   - .sbt | ||||
|   - .sc | ||||
|  | ||||
| Scaml: | ||||
| @@ -1893,6 +2116,7 @@ Scheme: | ||||
|   - .scm | ||||
|   - .sld | ||||
|   - .sls | ||||
|   - .sps | ||||
|   - .ss | ||||
|   interpreters: | ||||
|   - guile | ||||
| @@ -1904,6 +2128,8 @@ Scilab: | ||||
|   type: programming | ||||
|   extensions: | ||||
|   - .sci | ||||
|   - .sce | ||||
|   - .tst | ||||
|  | ||||
| Self: | ||||
|   type: programming | ||||
| @@ -1923,8 +2149,11 @@ Shell: | ||||
|   - zsh | ||||
|   extensions: | ||||
|   - .sh | ||||
|   - .bash | ||||
|   - .bats | ||||
|   - .cgi | ||||
|   - .tmux | ||||
|   - .zsh | ||||
|   interpreters: | ||||
|   - bash | ||||
|   - sh | ||||
| @@ -1951,6 +2180,14 @@ Slash: | ||||
|   extensions: | ||||
|   - .sl | ||||
|  | ||||
| Slim: | ||||
|   group: HTML | ||||
|   type: markup | ||||
|   lexer: Slim | ||||
|   color: "#ff8877" | ||||
|   extensions: | ||||
|   - .slim | ||||
|  | ||||
| Smalltalk: | ||||
|   type: programming | ||||
|   color: "#596706" | ||||
| @@ -1981,8 +2218,10 @@ Standard ML: | ||||
|   aliases: | ||||
|   - sml | ||||
|   extensions: | ||||
|   - .sml | ||||
|   - .ML | ||||
|   - .fun | ||||
|   - .sig | ||||
|   - .sml | ||||
|  | ||||
| Stata: | ||||
|   type: programming | ||||
| @@ -2010,6 +2249,13 @@ SuperCollider: | ||||
|   extensions: | ||||
|   - .scd | ||||
|  | ||||
| Swift: | ||||
|   type: programming | ||||
|   lexer: Swift | ||||
|   color: "#ffac45" | ||||
|   extensions: | ||||
|   - .swift | ||||
|  | ||||
| SystemVerilog: | ||||
|   type: programming | ||||
|   color: "#343761" | ||||
| @@ -2055,10 +2301,13 @@ TeX: | ||||
|   extensions: | ||||
|   - .tex | ||||
|   - .aux | ||||
|   - .bbx | ||||
|   - .bib | ||||
|   - .cbx | ||||
|   - .cls | ||||
|   - .dtx | ||||
|   - .ins | ||||
|   - .lbx | ||||
|   - .ltx | ||||
|   - .mkii | ||||
|   - .mkiv | ||||
| @@ -2118,6 +2367,14 @@ UnrealScript: | ||||
|   extensions: | ||||
|   - .uc | ||||
|  | ||||
| VCL: | ||||
|   type: programming | ||||
|   lexer: Perl | ||||
|   ace_mode: perl | ||||
|   color: "#0298c3" | ||||
|   extensions: | ||||
|   - .vcl | ||||
|  | ||||
| VHDL: | ||||
|   type: programming | ||||
|   lexer: vhdl | ||||
| @@ -2167,6 +2424,7 @@ Visual Basic: | ||||
|   extensions: | ||||
|   - .vb | ||||
|   - .bas | ||||
|   - .cls | ||||
|   - .frm | ||||
|   - .frx | ||||
|   - .vba | ||||
| @@ -2195,11 +2453,13 @@ XML: | ||||
|   - wsdl | ||||
|   extensions: | ||||
|   - .xml | ||||
|   - .ant | ||||
|   - .axml | ||||
|   - .ccxml | ||||
|   - .clixml | ||||
|   - .cproject | ||||
|   - .csproj | ||||
|   - .ct | ||||
|   - .dita | ||||
|   - .ditamap | ||||
|   - .ditaval | ||||
| @@ -2207,11 +2467,13 @@ XML: | ||||
|   - .fsproj | ||||
|   - .glade | ||||
|   - .grxml | ||||
|   - .ivy | ||||
|   - .jelly | ||||
|   - .kml | ||||
|   - .launch | ||||
|   - .mxml | ||||
|   - .nproj | ||||
|   - .nuspec | ||||
|   - .osm | ||||
|   - .plist | ||||
|   - .pluginspec | ||||
| @@ -2283,6 +2545,17 @@ XSLT: | ||||
|   - .xslt | ||||
|   - .xsl | ||||
|  | ||||
| Xojo: | ||||
|   type: programming | ||||
|   lexer: VB.net | ||||
|   extensions: | ||||
|   - .xojo_code | ||||
|   - .xojo_menu | ||||
|   - .xojo_report | ||||
|   - .xojo_script | ||||
|   - .xojo_toolbar | ||||
|   - .xojo_window | ||||
|  | ||||
| Xtend: | ||||
|   type: programming | ||||
|   extensions: | ||||
| @@ -2305,6 +2578,14 @@ Zephir: | ||||
|   extensions: | ||||
|   - .zep | ||||
|  | ||||
| Zimpl: | ||||
|   type: programming | ||||
|   lexer: Text only | ||||
|   extensions: | ||||
|   - .zimpl | ||||
|   - .zmpl | ||||
|   - .zpl | ||||
|  | ||||
| eC: | ||||
|   type: programming | ||||
|   search_term: ec | ||||
| @@ -2335,6 +2616,7 @@ mupad: | ||||
| nesC: | ||||
|   type: programming | ||||
|   color: "#ffce3b" | ||||
|   lexer: nesC | ||||
|   extensions: | ||||
|   - .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 | ||||
|   # 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 | ||||
|   # the entire project. | ||||
|   class Repository | ||||
|     # Public: Initialize a new Repository from a File directory | ||||
|     # | ||||
|     # base_path - A path String | ||||
|     # | ||||
|     # Returns a Repository | ||||
|     def self.from_directory(base_path) | ||||
|       new Dir["#{base_path}/**/*"]. | ||||
|         select { |f| File.file?(f) }. | ||||
|         map { |path| FileBlob.new(path, base_path) } | ||||
|     attr_reader :repository | ||||
|  | ||||
|     # Public: Create a new Repository based on the stats of | ||||
|     # an existing one | ||||
|     def self.incremental(repo, commit_oid, old_commit_oid, old_stats) | ||||
|       repo = self.new(repo, commit_oid) | ||||
|       repo.load_existing_stats(old_commit_oid, old_stats) | ||||
|       repo | ||||
|     end | ||||
|  | ||||
|     # Public: Initialize a new Repository | ||||
|     # Public: Initialize a new Repository to be analyzed for language | ||||
|     # data | ||||
|     # | ||||
|     # enum - Enumerator that responds to `each` and | ||||
|     #        yields Blob objects | ||||
|     # repo - a Rugged::Repository object | ||||
|     # commit_oid - the sha1 of the commit that will be analyzed; | ||||
|     #              this is usually the master branch | ||||
|     # | ||||
|     # Returns a Repository | ||||
|     def initialize(enum) | ||||
|       @enum = enum | ||||
|       @computed_stats = false | ||||
|       @language = @size = nil | ||||
|       @sizes = Hash.new { 0 } | ||||
|       @file_breakdown = Hash.new { |h,k| h[k] = Array.new } | ||||
|     def initialize(repo, commit_oid) | ||||
|       @repository = repo | ||||
|       @commit_oid = commit_oid | ||||
|  | ||||
|       raise TypeError, 'commit_oid must be a commit SHA1' unless commit_oid.is_a?(String) | ||||
|     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 | ||||
|  | ||||
|     # Public: Returns a breakdown of language stats. | ||||
|     # | ||||
|     # Examples | ||||
|     # | ||||
|     #   # => { Language['Ruby'] => 46319, | ||||
|     #          Language['JavaScript'] => 258 } | ||||
|     #   # => { 'Ruby' => 46319, | ||||
|     #          'JavaScript' => 258 } | ||||
|     # | ||||
|     # Returns a Hash of Language keys and Integer size values. | ||||
|     # Returns a Hash of language names and Integer size values. | ||||
|     def languages | ||||
|       compute_stats | ||||
|       @sizes | ||||
|       @sizes ||= begin | ||||
|         sizes = Hash.new { 0 } | ||||
|         cache.each do |_, (language, size)| | ||||
|           sizes[language] += size | ||||
|         end | ||||
|         sizes | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     # Public: Get primary Language of repository. | ||||
|     # | ||||
|     # Returns a Language | ||||
|     # Returns a language name | ||||
|     def language | ||||
|       compute_stats | ||||
|       @language | ||||
|       @language ||= begin | ||||
|         primary = languages.max_by { |(_, size)| size } | ||||
|         primary && primary[0] | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     # Public: Get the total size of the repository. | ||||
|     # | ||||
|     # Returns a byte size Integer | ||||
|     def size | ||||
|       compute_stats | ||||
|       @size | ||||
|       @size ||= languages.inject(0) { |s,(_,v)| s + v } | ||||
|     end | ||||
|  | ||||
|     # Public: Return the language breakdown of this repository by file | ||||
|     # | ||||
|     # Returns a map of language names => [filenames...] | ||||
|     def breakdown_by_file | ||||
|       compute_stats | ||||
|       @file_breakdown | ||||
|       @file_breakdown ||= begin | ||||
|         breakdown = Hash.new { |h,k| h[k] = Array.new } | ||||
|         cache.each do |filename, (language, _)| | ||||
|           breakdown[language] << filename | ||||
|         end | ||||
|         breakdown | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     # Internal: Compute language breakdown for each blob in the Repository. | ||||
|     # Public: Return the cached results of the analysis | ||||
|     # | ||||
|     # Returns nothing | ||||
|     def compute_stats | ||||
|       return if @computed_stats | ||||
|     # This is a per-file breakdown that can be passed to other instances | ||||
|     # of Linguist::Repository to perform incremental scans | ||||
|     # | ||||
|     # 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| | ||||
|         # Skip files that are likely binary | ||||
|         next if blob.likely_binary? | ||||
|     protected | ||||
|     def compute_stats(old_commit_oid, commit_oid, cache = nil) | ||||
|       file_map = cache ? cache.dup : {} | ||||
|       old_tree = old_commit_oid && Rugged::Commit.lookup(repository, old_commit_oid).tree | ||||
|       new_tree = Rugged::Commit.lookup(repository, commit_oid).tree | ||||
|  | ||||
|         # Skip vendored or generated blobs | ||||
|         next if blob.vendored? || blob.generated? || blob.language.nil? | ||||
|       diff = Rugged::Tree.diff(repository, old_tree, new_tree) | ||||
|  | ||||
|         # Only include programming languages and acceptable markup languages | ||||
|         if blob.language.type == :programming || Language.detectable_markup.include?(blob.language.name) | ||||
|       diff.each_delta do |delta| | ||||
|         old = delta.old_file[:path] | ||||
|         new = delta.new_file[:path] | ||||
|  | ||||
|           # Build up the per-file breakdown stats | ||||
|           @file_breakdown[blob.language.group.name] << blob.name | ||||
|         file_map.delete(old) | ||||
|         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 | ||||
|  | ||||
|       # Compute total size | ||||
|       @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 | ||||
|       file_map | ||||
|     end | ||||
|   end | ||||
| end | ||||
|   | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -28,7 +28,7 @@ module Linguist | ||||
|     # | ||||
|     # Returns nothing. | ||||
|     def self.each(&block) | ||||
|       Dir.entries(ROOT).each do |category| | ||||
|       Dir.entries(ROOT).sort!.each do |category| | ||||
|         next if category == '.' || category == '..' | ||||
|  | ||||
|         # Skip text and binary for now | ||||
|   | ||||
| @@ -36,13 +36,30 @@ | ||||
| # Bootstrap minified css and js | ||||
| - (^|/)bootstrap([^.]*)(\.min)?\.(js|css)$ | ||||
|  | ||||
| # Font Awesome | ||||
| - font-awesome.min.css | ||||
| - font-awesome.css | ||||
|  | ||||
| # Foundation css | ||||
| - foundation.min.css | ||||
| - foundation.css | ||||
|  | ||||
| # Normalize.css | ||||
| - normalize.css | ||||
|  | ||||
| # Bourbon SCSS | ||||
| - (^|/)[Bb]ourbon/.*\.css$ | ||||
| - (^|/)[Bb]ourbon/.*\.scss$ | ||||
|  | ||||
| # Animate.css | ||||
| - animate.css | ||||
| - animate.min.css | ||||
|  | ||||
| # Vendored dependencies | ||||
| - thirdparty/ | ||||
| - third[-_]?party/ | ||||
| - 3rd[-_]?party/ | ||||
| - vendors?/ | ||||
| - extern(al)?/ | ||||
|  | ||||
| # Debian packaging | ||||
| - ^debian/ | ||||
| @@ -108,6 +125,10 @@ | ||||
| - (^|/)modernizr\-\d\.\d+(\.\d+)?(\.min)?\.js$ | ||||
| - (^|/)modernizr\.custom\.\d+\.js$ | ||||
|  | ||||
| # Knockout | ||||
| - (^|/)knockout-(\d+\.){3}(debug\.)?js$ | ||||
| - knockout-min.js | ||||
|  | ||||
| ## Python ## | ||||
|  | ||||
| # django | ||||
| @@ -124,6 +145,9 @@ | ||||
|  | ||||
| ## Obj-C ## | ||||
|  | ||||
| # Cocoapods | ||||
| - ^Pods/ | ||||
|  | ||||
| # Sparkle | ||||
| - (^|/)Sparkle/ | ||||
|  | ||||
| @@ -148,7 +172,7 @@ | ||||
| - (^|/)[Mm]icrosoft([Mm]vc)?([Aa]jax|[Vv]alidation)(\.debug)?\.js$ | ||||
|  | ||||
| # NuGet | ||||
| - ^[Pp]ackages/ | ||||
| - ^[Pp]ackages\/.+\.\d+\/ | ||||
|  | ||||
| # ExtJS | ||||
| - (^|/)extjs/.*?\.js$ | ||||
| @@ -168,6 +192,9 @@ | ||||
| - (^|/)extjs/src/ | ||||
| - (^|/)extjs/welcome/ | ||||
|  | ||||
| # Html5shiv | ||||
| - (^|/)html5shiv(\.min)?\.js$ | ||||
|  | ||||
| # Samples folders | ||||
| - ^[Ss]amples/ | ||||
|  | ||||
| @@ -188,6 +215,9 @@ | ||||
| - (^|/)cordova([^.]*)(\.min)?\.js$ | ||||
| - (^|/)cordova\-\d\.\d(\.\d)?(\.min)?\.js$ | ||||
|  | ||||
| # Foundation js | ||||
| - foundation(\..*)?\.js$ | ||||
|  | ||||
| # Vagrant | ||||
| - ^Vagrantfile$ | ||||
|  | ||||
| @@ -196,3 +226,12 @@ | ||||
|  | ||||
| # Mercury --use-subdirs | ||||
| - Mercury/ | ||||
|  | ||||
| # R packages | ||||
| - ^vignettes/ | ||||
| - ^inst/extdata/ | ||||
|  | ||||
| # Octicons | ||||
| - octicons.css | ||||
| - octicons.min.css | ||||
| - sprockets-octicons.scss | ||||
|   | ||||
| @@ -1,3 +1,3 @@ | ||||
| module Linguist | ||||
|   VERSION = "2.11.0" | ||||
|   VERSION = "3.1.5" | ||||
| end | ||||
|   | ||||
							
								
								
									
										521
									
								
								samples/AGS Script/GlobalScript.asc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										521
									
								
								samples/AGS Script/GlobalScript.asc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,521 @@ | ||||
| // main global script file | ||||
|  | ||||
| // A function that initializes a bunch of stuff. | ||||
| function initialize_control_panel() {  | ||||
|   // Centre the control panel | ||||
|   gPanel.Centre();  | ||||
|   // Centre the Restart dialog as well | ||||
|   gRestartYN.Centre();  | ||||
|   if (!IsSpeechVoxAvailable()) {  | ||||
|     // If there is no speech-vox file, and therefore no speech, | ||||
|     // disable all the controls related with speech. | ||||
|     lblVoice.Visible = false;   | ||||
|     btnVoice.Visible = false;   | ||||
|     sldVoice.Visible = false; | ||||
|   } | ||||
|   else { | ||||
|     // If there *is*, then set it to voice and text. It's best to use | ||||
|     // both whenever possible, for the player's sake. | ||||
|     SetVoiceMode(eSpeechVoiceAndText);  | ||||
|     // And reflect this in the control panel. | ||||
|     btnVoice.Text = "Voice and Text";  | ||||
|   } | ||||
|   if (!System.SupportsGammaControl) { | ||||
|     // If we can't change the gamma settings, disable the relevant options. | ||||
|     sldGamma.Visible = false;  | ||||
|     lblGamma.Visible = false; | ||||
|   }  | ||||
|    | ||||
|   //And now, set all the defaults | ||||
|   System.Volume = 100; | ||||
|   sldAudio.Value = System.Volume; | ||||
|   SetGameSpeed(40); | ||||
|   sldSpeed.Value = 40; | ||||
|   if (IsSpeechVoxAvailable()) { | ||||
|      SetVoiceMode(eSpeechVoiceAndText); | ||||
|      btnVoice.Text = "Voice and Text"; | ||||
|      sldVoice.Value = 255; | ||||
|      SetSpeechVolume(255); | ||||
|   } | ||||
|   if (System.SupportsGammaControl) { | ||||
|     System.Gamma = 100; | ||||
|     sldGamma.Value = 100; | ||||
|   } | ||||
| } | ||||
|  | ||||
| // Called when the game starts, before the first room is loaded | ||||
| function game_start() {    | ||||
|   // Put the code all in a function and then just call the function.  | ||||
|   // It saves cluttering up places like game_start. | ||||
|   initialize_control_panel();  | ||||
|   // Use the KeyboardMovement module to, per default, replicate the standard | ||||
|   // keyboard movement of most Sierra games. See KeyboardMovement.txt for more info | ||||
|   KeyboardMovement.SetMode(eKeyboardMovement_Tapping);  | ||||
| } | ||||
|  | ||||
| function repeatedly_execute() { | ||||
|    | ||||
|   // Put here anything you want to happen every game cycle, even when | ||||
|   // the game is paused. This will not run when the game is blocked | ||||
|   // inside a command like a blocking Walk() | ||||
|    | ||||
|   if (IsGamePaused() == 1) return; | ||||
|  | ||||
|   // Put here anything you want to happen every game cycle, but not | ||||
|   // when the game is paused. | ||||
| } | ||||
|  | ||||
| function repeatedly_execute_always() { | ||||
|    | ||||
|   // Put anything you want to happen every game cycle, even | ||||
|   // when the game is blocked inside a command like a | ||||
|   // blocking Walk(). | ||||
|   // You cannot run blocking commands from this function. | ||||
|    | ||||
| } | ||||
|  | ||||
| function show_inventory_window ()  | ||||
| { | ||||
|   gInventory.Visible = true; | ||||
|   // switch to the Use cursor (to select items with) | ||||
|   mouse.Mode = eModeInteract; | ||||
|   // But, override the appearance to look like the arrow | ||||
|   mouse.UseModeGraphic(eModePointer); | ||||
| } | ||||
|  | ||||
| function show_save_game_dialog() | ||||
| { | ||||
|   gSaveGame.Visible = true; | ||||
|   // Get the list of save games | ||||
|   lstSaveGamesList.FillSaveGameList(); | ||||
|   if (lstSaveGamesList.ItemCount > 0) | ||||
|   { | ||||
|     // If there is at least one, set the default text | ||||
|     // to be the first game's name | ||||
|     txtNewSaveName.Text = lstSaveGamesList.Items[0]; | ||||
|   } | ||||
|   else | ||||
|   { | ||||
|     // No save games yet, default empty text. | ||||
|     txtNewSaveName.Text = ""; | ||||
|   } | ||||
|   mouse.UseModeGraphic(eModePointer); | ||||
|   gIconbar.Visible = false; | ||||
| } | ||||
|  | ||||
| function show_restore_game_dialog() | ||||
| { | ||||
|   gRestoreGame.Visible = true; | ||||
|   lstRestoreGamesList.FillSaveGameList(); | ||||
|   mouse.UseModeGraphic(eModePointer); | ||||
|   gIconbar.Visible = false; | ||||
| } | ||||
|  | ||||
| function close_save_game_dialog() | ||||
| { | ||||
|   gSaveGame.Visible = false; | ||||
|   mouse.UseDefaultGraphic(); | ||||
|   gIconbar.Visible = true; | ||||
| } | ||||
|  | ||||
| function close_restore_game_dialog() | ||||
| { | ||||
|   gRestoreGame.Visible = false; | ||||
|   mouse.UseDefaultGraphic(); | ||||
|   gIconbar.Visible = true; | ||||
| } | ||||
|  | ||||
| // Called when a key is pressed. keycode holds the key's ASCII code | ||||
| function on_key_press(eKeyCode keycode) { | ||||
|   // The following is called before "if game is paused keycode=0", so | ||||
|   // it'll happen even when the game is paused. | ||||
|    | ||||
|   if ((keycode == eKeyEscape) && gRestartYN.Visible) { | ||||
|     //Use ESC to cancel restart. | ||||
|     gRestartYN.Visible = false;  | ||||
|     gIconbar.Visible = true; | ||||
|     // If the panel's not ON, then the player must have gotten here by tapping F9, | ||||
|     // therefore his cursor needs restoring. If the panel IS on, then it doesn't, | ||||
|     // because it's already a pointer. Get used to thinking like this!! | ||||
|     if (!gPanel.Visible) mouse.UseDefaultGraphic();  | ||||
|     return; | ||||
|   } | ||||
|   if ((keycode == eKeyEscape) && gPanel.Visible) { | ||||
|     // Use ESC to turn the panel off. | ||||
|     gPanel.Visible = false;  | ||||
|     mouse.UseDefaultGraphic(); | ||||
|     gIconbar.Visible = true; | ||||
|     return; | ||||
|   } | ||||
|   if ((keycode == eKeyEscape) && (gSaveGame.Visible)) | ||||
|   { | ||||
|     // Use ESC to close the save game dialog | ||||
|     close_save_game_dialog(); | ||||
|     return; | ||||
|   } | ||||
|   if ((keycode == eKeyEscape) && (gRestoreGame.Visible)) | ||||
|   { | ||||
|     // Use ESC to close the restore game dialog | ||||
|     close_restore_game_dialog(); | ||||
|     return; | ||||
|   } | ||||
|    | ||||
|   if (keycode == eKeyReturn) {  | ||||
|     // ENTER, in this case merely confirms restart | ||||
|     if (gRestartYN.Visible) RestartGame(); | ||||
|   } | ||||
|  | ||||
|   if (IsGamePaused() || (IsInterfaceEnabled() == 0)) | ||||
|   { | ||||
|     // If the game is paused with a modal GUI on the | ||||
|     // screen, or the player interface is disabled in | ||||
|     // a cut scene, ignore any keypresses. | ||||
|     return; | ||||
|   } | ||||
|  | ||||
|   // FUNCTION KEYS AND SYSTEM SHORTCUTS | ||||
|   if (keycode == eKeyEscape) { | ||||
|     // ESC | ||||
|     gPanel.Visible = true;  | ||||
|     gIconbar.Visible = false; | ||||
|     mouse.UseModeGraphic(eModePointer); | ||||
|   } | ||||
|   if (keycode == eKeyCtrlQ)  QuitGame(1);   // Ctrl-Q | ||||
|   if (keycode == eKeyF5) show_save_game_dialog();   // F5 | ||||
|   if (keycode == eKeyF7) show_restore_game_dialog();  // F7 | ||||
|   if (keycode == eKeyF9) { | ||||
|     // F9, asks the player to confirm restarting (so much better to always confirm first) | ||||
|     gRestartYN.Visible = true;   | ||||
|     gIconbar.Visible = false; | ||||
|     mouse.UseModeGraphic(eModePointer); | ||||
|   } | ||||
|   if (keycode == eKeyF12) SaveScreenShot("scrnshot.bmp");  // F12 | ||||
|   if (keycode == eKeyTab)   show_inventory_window();  // Tab, show inventory | ||||
|  | ||||
|   // GAME COMMAND SHORTCUTS | ||||
|   if (keycode == 'W') mouse.Mode=eModeWalkto; //Notice this alternate way to indicate keycodes. | ||||
|   if (keycode == 'L') mouse.Mode=eModeLookat; //Note that all we do here is set modes. | ||||
|   if (keycode == 'U') mouse.Mode=eModeInteract; //If you want something else to happen, such as GUI buttons highlighting, | ||||
|   if (keycode == 'T') mouse.Mode=eModeTalkto; //you'll need some more scripting done. | ||||
|   if (keycode == 'I') mouse.Mode=eModeUseinv; //But this will, as-is, give you some standard keyboard shortcuts your players will very much appreciate. | ||||
|  | ||||
|   // For extra cursor modes, such as pick up, feel free to add as you will. | ||||
|   // Uncomment the line below if you use the "Pick Up" mode. | ||||
|   //if (keycode == 'P' || keycode == 'G') mouse.Mode=eModePickup;  | ||||
|  | ||||
|   // DEBUG FUNCTIONS | ||||
|   if (keycode == eKeyCtrlS)  Debug(0,0);  // Ctrl-S, give all inventory | ||||
|   if (keycode == eKeyCtrlV)  Debug(1,0);  // Ctrl-V, version | ||||
|   if (keycode == eKeyCtrlA)  Debug(2,0);  // Ctrl-A, show walkable areas | ||||
|   if (keycode == eKeyCtrlX)  Debug(3,0);  // Ctrl-X, teleport to room | ||||
|   if (keycode == eKeyCtrlW && game.debug_mode)  | ||||
|     player.PlaceOnWalkableArea(); //Ctrl-W, move to walkable area  | ||||
| } | ||||
|  | ||||
|  | ||||
| function on_mouse_click(MouseButton button) { | ||||
|   // called when a mouse button is clicked. button is either LEFT or RIGHT | ||||
|   if (IsGamePaused() == 1) { | ||||
|     // Game is paused, so do nothing (ie. don't allow mouse click) | ||||
|   } | ||||
|   else if (button == eMouseLeft) { | ||||
|     ProcessClick(mouse.x, mouse.y, mouse.Mode ); | ||||
|   } | ||||
|   else if (button == eMouseRight || button == eMouseWheelSouth){ | ||||
|     // right-click our mouse-wheel down, so cycle cursor | ||||
|     mouse.SelectNextMode(); | ||||
|   } | ||||
|   else if (button == eMouseMiddle) {  | ||||
|     // Middle-button-click, default make character walk to clicked area (a little shortcut) | ||||
|     // Could have been just "player.Walk(mouse.x,mouse.y)", but it's best to | ||||
|     // leave our options open - what if you have a special script triggered | ||||
|     // on "walking" mode? | ||||
|     ProcessClick(mouse.x, mouse.y, eModeWalkto);  | ||||
|   } | ||||
|   else if (button == eMouseWheelNorth) {  | ||||
|     // Mouse-wheel up, cycle cursors  | ||||
|     // If mode isn't WALK, set the previous mode (notice usage of numbers instead | ||||
|     // of eNums, when it suits us)... | ||||
|     if (mouse.Mode>0) mouse.Mode=mouse.Mode-1;  | ||||
|     else  | ||||
|     {  | ||||
|       // ...but if it is WALK mode... | ||||
|       if (player.ActiveInventory!=null)  | ||||
|       { | ||||
|         //...and the player has a selected inventory item, set mouse mode to UseInv.  | ||||
|         mouse.Mode=eModeUseinv;  | ||||
|       } | ||||
|       else  | ||||
|       { | ||||
|         // If they don't, however, just set it to mode TALK (change this line if you add more cursor modes) | ||||
|         mouse.Mode=eModeTalkto;  | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| function interface_click(int interface, int button) { | ||||
|   // This function is obsolete, from 2.62 and earlier versions. | ||||
| } | ||||
|  | ||||
| function btnInvUp_Click(GUIControl *control, MouseButton button) { | ||||
|   invCustomInv.ScrollUp(); | ||||
| } | ||||
|  | ||||
| function btnInvDown_Click(GUIControl *control, MouseButton button) { | ||||
|   invCustomInv.ScrollDown(); | ||||
| } | ||||
|  | ||||
| function btnInvOK_Click(GUIControl *control, MouseButton button) { | ||||
| 	// They pressed the OK button, close the GUI | ||||
| 	gInventory.Visible = false; | ||||
| 	mouse.UseDefaultGraphic(); | ||||
| } | ||||
|  | ||||
| function btnInvSelect_Click(GUIControl *control, MouseButton button) { | ||||
|    | ||||
| 	// They pressed SELECT, so switch to the Get cursor | ||||
| 	mouse.Mode = eModeInteract; | ||||
| 	// But, override the appearance to look like the arrow | ||||
| 	mouse.UseModeGraphic(eModePointer); | ||||
| } | ||||
|  | ||||
| function btnIconInv_Click(GUIControl *control, MouseButton button) { | ||||
|    | ||||
|   show_inventory_window(); | ||||
| } | ||||
|  | ||||
| function btnIconCurInv_Click(GUIControl *control, MouseButton button) { | ||||
|    | ||||
|   if (player.ActiveInventory != null) | ||||
|     mouse.Mode = eModeUseinv; | ||||
| } | ||||
|  | ||||
| function btnIconSave_Click(GUIControl *control, MouseButton button)  | ||||
| { | ||||
|   show_save_game_dialog(); | ||||
| } | ||||
|  | ||||
| function btnIconLoad_Click(GUIControl *control, MouseButton button)  | ||||
| { | ||||
|   show_restore_game_dialog(); | ||||
| } | ||||
|  | ||||
| function btnIconExit_Click(GUIControl *control, MouseButton button) { | ||||
|    | ||||
|   QuitGame(1); | ||||
| } | ||||
|  | ||||
| function btnIconAbout_Click(GUIControl *control, MouseButton button) { | ||||
|    | ||||
|   gPanel.Visible=true; | ||||
|   gIconbar.Visible=false; | ||||
|   mouse.UseModeGraphic(eModePointer); | ||||
| } | ||||
|  | ||||
| function cEgo_Look() | ||||
| { | ||||
|   Display("Damn, I'm looking good!"); | ||||
| } | ||||
|  | ||||
| function cEgo_Interact() | ||||
| { | ||||
|   Display("You rub your hands up and down your clothes."); | ||||
| } | ||||
|  | ||||
| function cEgo_Talk() | ||||
| { | ||||
|   Display("Talking to yourself is a sign of madness!"); | ||||
| } | ||||
|  | ||||
| //START OF CONTROL PANEL FUNCTIONS | ||||
| function btnSave_OnClick(GUIControl *control, MouseButton button) | ||||
| { | ||||
|   gPanel.Visible = false; | ||||
|   mouse.UseDefaultGraphic(); | ||||
|   gIconbar.Visible = true; | ||||
|   Wait(1); | ||||
|   btnIconSave_Click(btnIconSave, eMouseLeft); | ||||
| } | ||||
|  | ||||
| function gControl_OnClick(GUI *theGui, MouseButton button) | ||||
| { | ||||
|  | ||||
| } | ||||
|  | ||||
| function btnAbout_OnClick(GUIControl *control, MouseButton button) | ||||
| { | ||||
| Display("Adventure Game Studio run-time engine default game."); | ||||
| } | ||||
|  | ||||
| function btnQuit_OnClick(GUIControl *control, MouseButton button) | ||||
| { | ||||
|   gPanel.Visible = false; | ||||
|   Wait(1); | ||||
|   QuitGame(1); | ||||
|   gPanel.Visible = true; | ||||
|   gIconbar.Visible = false; | ||||
|   mouse.UseModeGraphic(eModePointer); | ||||
| } | ||||
|  | ||||
| function btnLoad_OnClick(GUIControl *control, MouseButton button) | ||||
| { | ||||
|   gPanel.Visible = false; | ||||
|   mouse.UseDefaultGraphic(); | ||||
|   gIconbar.Visible = true; | ||||
|   Wait(1); | ||||
|   btnIconLoad_Click(btnIconLoad, eMouseLeft); | ||||
| } | ||||
|  | ||||
| function btnResume_OnClick(GUIControl *control, MouseButton button) | ||||
| { | ||||
|   gPanel.Visible = false; | ||||
|   mouse.UseDefaultGraphic(); | ||||
|   gIconbar.Visible = true; | ||||
| } | ||||
|  | ||||
| function sldAudio_OnChange(GUIControl *control) | ||||
| { | ||||
|   System.Volume = sldAudio.Value; | ||||
| } | ||||
|  | ||||
| function sldVoice_OnChange(GUIControl *control) | ||||
| { | ||||
|   // Sets voice volume. Note that we don't check for the existence of speech.vox -  | ||||
|   // we did that in game_start, so if it's not there the slider won't even be available. | ||||
|   SetSpeechVolume(sldVoice.Value);  | ||||
| } | ||||
|  | ||||
| function btnVoice_OnClick(GUIControl *control, MouseButton button) | ||||
| { | ||||
|   // Note that we don't check for the existence of speech.vox - we did that in game_start, | ||||
|   // so if it's not there the button won't even be available. | ||||
|   if (btnVoice.Text == "Voice and Text") {  | ||||
|     SetVoiceMode(eSpeechVoiceOnly);  | ||||
|     btnVoice.Text = "Voice only"; | ||||
|   } | ||||
|   else if (btnVoice.Text == "Voice only") { | ||||
|     SetVoiceMode(eSpeechTextOnly); | ||||
|     btnVoice.Text = "Text only"; | ||||
|   } | ||||
|   else if (btnVoice.Text == "Text only") { | ||||
|     SetVoiceMode(eSpeechVoiceAndText); | ||||
|     btnVoice.Text = "Voice and Text"; | ||||
|   } | ||||
| } | ||||
|  | ||||
| function sldGamma_OnChange(GUIControl *control) | ||||
| { | ||||
|   // Set the gamma. Note there's no need to check for anything else, as we ensured, | ||||
|   // in game_start, that the slider won't even appear if it's not possible to do this. | ||||
|   System.Gamma = sldGamma.Value;  | ||||
| } | ||||
|  | ||||
| function btnDefault_OnClick(GUIControl *control, MouseButton button) | ||||
| { | ||||
|   // Reset everything to default. You'll have to edit these as well as the sliders | ||||
|   // if you'd rather have different default parameters. | ||||
|   System.Volume = 100; | ||||
|   sldAudio.Value = System.Volume; | ||||
|   sldSpeed.Value = 40; | ||||
|   SetGameSpeed(40); | ||||
|   if (IsSpeechVoxAvailable()) { | ||||
|      SetVoiceMode(eSpeechVoiceAndText); | ||||
|      btnVoice.Text = "Voice and Text"; | ||||
|      sldVoice.Value = 255; | ||||
|      SetSpeechVolume(255); | ||||
|   } | ||||
|   if (System.SupportsGammaControl) { | ||||
|     System.Gamma = 100; | ||||
|     sldGamma.Value = 100; | ||||
|   } | ||||
| } | ||||
| //END OF CONTROL PANEL FUNCTIONS | ||||
|  | ||||
| function dialog_request(int param)  | ||||
| { | ||||
|   // This is used by the dialog text parser if you need to process | ||||
|   // text that the player types in to the parser. | ||||
|   // It is not used by default. | ||||
| } | ||||
|  | ||||
| function sldSpeed_OnChange(GUIControl *control) | ||||
| { | ||||
|   SetGameSpeed(sldSpeed.Value); | ||||
| } | ||||
|  | ||||
| function btnRestart_OnClick(GUIControl *control, MouseButton button) | ||||
| { | ||||
|   gRestartYN.Visible=true; | ||||
|   gIconbar.Visible=false; | ||||
| } | ||||
|  | ||||
| function btnRestartYes_OnClick(GUIControl *control, MouseButton button) | ||||
| { | ||||
|   RestartGame(); | ||||
| } | ||||
|  | ||||
| function btnRestartNo_OnClick(GUIControl *control, MouseButton button) | ||||
| { | ||||
|   gRestartYN.Visible = false; | ||||
|   gIconbar.Visible = true; | ||||
|   // If the panel's not ON, then the player must have gotten here by tapping F9, | ||||
|   // therefore his cursor needs restoring. If the panel IS on, then it doesn't, | ||||
|   // because it's already a pointer. Get used to thinking like this!! | ||||
|   if (!gPanel.Visible) mouse.UseDefaultGraphic();  | ||||
| } | ||||
|  | ||||
| function btnCancelSave_OnClick(GUIControl *control, MouseButton button) | ||||
| { | ||||
|   close_save_game_dialog(); | ||||
| } | ||||
|  | ||||
| function btnSaveGame_OnClick(GUIControl *control, MouseButton button) | ||||
| { | ||||
|   int gameSlotToSaveInto = lstSaveGamesList.ItemCount + 1; | ||||
|   int i = 0; | ||||
|   while (i < lstSaveGamesList.ItemCount) | ||||
|   { | ||||
|     if (lstSaveGamesList.Items[i] == txtNewSaveName.Text) | ||||
|     { | ||||
|       gameSlotToSaveInto = lstSaveGamesList.SaveGameSlots[i]; | ||||
|     } | ||||
|     i++; | ||||
|   } | ||||
|   SaveGameSlot(gameSlotToSaveInto, txtNewSaveName.Text); | ||||
|   close_save_game_dialog(); | ||||
| } | ||||
|  | ||||
| function btnCancelRestore_OnClick(GUIControl *control, MouseButton button) | ||||
| { | ||||
|   close_restore_game_dialog(); | ||||
| } | ||||
|  | ||||
| function btnRestoreGame_OnClick(GUIControl *control, MouseButton button) | ||||
| { | ||||
|   if (lstRestoreGamesList.SelectedIndex >= 0) | ||||
|   { | ||||
|     RestoreGameSlot(lstRestoreGamesList.SaveGameSlots[lstRestoreGamesList.SelectedIndex]); | ||||
|   } | ||||
|   close_restore_game_dialog(); | ||||
| } | ||||
|  | ||||
| function lstSaveGamesList_OnSelectionCh(GUIControl *control) | ||||
| { | ||||
|   txtNewSaveName.Text = lstSaveGamesList.Items[lstSaveGamesList.SelectedIndex]; | ||||
| } | ||||
|  | ||||
| function txtNewSaveName_OnActivate(GUIControl *control) | ||||
| { | ||||
|   // Pressing return in the text box simulates clicking the Save button | ||||
|   btnSaveGame_OnClick(control, eMouseLeft); | ||||
| } | ||||
|  | ||||
| function btnDeleteSave_OnClick(GUIControl *control, MouseButton button) | ||||
| { | ||||
|   if (lstSaveGamesList.SelectedIndex >= 0) | ||||
|   { | ||||
|     DeleteSaveSlot(lstSaveGamesList.SaveGameSlots[lstSaveGamesList.SelectedIndex]); | ||||
|     lstSaveGamesList.FillSaveGameList(); | ||||
|   } | ||||
| } | ||||
							
								
								
									
										4
									
								
								samples/AGS Script/GlobalScript.ash
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								samples/AGS Script/GlobalScript.ash
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,4 @@ | ||||
| // Main header script - this will be included into every script in | ||||
| // the game (local and global). Do not place functions here; rather, | ||||
| // place import definitions and #define names here to be used by all | ||||
| // scripts. | ||||
							
								
								
									
										216
									
								
								samples/AGS Script/KeyboardMovement_102.asc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										216
									
								
								samples/AGS Script/KeyboardMovement_102.asc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,216 @@ | ||||
| // Main script for module 'KeyboardMovement' | ||||
|  | ||||
| //**************************************************************************************************** | ||||
| // DEFINITIONS | ||||
| //**************************************************************************************************** | ||||
|  | ||||
| #define DISTANCE 10000// distance player walks in Tapping mode before he stops | ||||
|  | ||||
| enum KeyboardMovement_Directions { | ||||
| 	eKeyboardMovement_Stop,  | ||||
| 	eKeyboardMovement_DownLeft,  | ||||
| 	eKeyboardMovement_Down,  | ||||
| 	eKeyboardMovement_DownRight,  | ||||
| 	eKeyboardMovement_Left,  | ||||
| 	eKeyboardMovement_Right,  | ||||
| 	eKeyboardMovement_UpLeft,  | ||||
| 	eKeyboardMovement_Up,  | ||||
| 	eKeyboardMovement_UpRight | ||||
| }; | ||||
|  | ||||
| //**************************************************************************************************** | ||||
| // VARIABLES | ||||
| //**************************************************************************************************** | ||||
|  | ||||
| // keycodes as variables for future key customization functions (static variables?): | ||||
| int KeyboardMovement_KeyDown = 380; // down arrow | ||||
| int KeyboardMovement_KeyLeft = 375; // left arrow | ||||
| int KeyboardMovement_KeyRight = 377; // right arrow | ||||
| int KeyboardMovement_KeyUp = 372; // up arrow | ||||
| int KeyboardMovement_KeyDownRight = 381; // PgDn (numpad) | ||||
| int KeyboardMovement_KeyUpRight = 373; // PgUp (numpad) | ||||
| int KeyboardMovement_KeyDownLeft = 379; // End (numpad) | ||||
| int KeyboardMovement_KeyUpLeft = 371; // Home (numpad) | ||||
| int KeyboardMovement_KeyStop = 376; // 5 (numpad) | ||||
|  | ||||
| KeyboardMovement_Modes KeyboardMovement_Mode = eKeyboardMovement_None; // stores current keyboard control mode (disabled by default) | ||||
|  | ||||
| KeyboardMovement_Directions KeyboardMovement_CurrentDirection = eKeyboardMovement_Stop; // stores current walking direction of player character | ||||
|  | ||||
| //**************************************************************************************************** | ||||
| // USER FUNCTIONS | ||||
| //**************************************************************************************************** | ||||
|  | ||||
| //==================================================================================================== | ||||
|  | ||||
| static function KeyboardMovement::SetMode(KeyboardMovement_Modes mode) { | ||||
| 	KeyboardMovement_Mode = mode; | ||||
| } | ||||
|  | ||||
| //==================================================================================================== | ||||
|  | ||||
| // key customization functions here | ||||
|  | ||||
| //==================================================================================================== | ||||
|  | ||||
| //**************************************************************************************************** | ||||
| // EVENT HANDLER FUNCTIONS | ||||
| //**************************************************************************************************** | ||||
|  | ||||
| //==================================================================================================== | ||||
|  | ||||
| function repeatedly_execute() { | ||||
|  | ||||
| 	//-------------------------------------------------- | ||||
| 	// Pressing mode | ||||
| 	//-------------------------------------------------- | ||||
|  | ||||
| 	if ((IsGamePaused() == true) || (KeyboardMovement_Mode != eKeyboardMovement_Pressing) || (IsInterfaceEnabled() == false) || (player.on == false)) return 0; | ||||
| 	  // if game is paused, module or mode disabled, interface disabled or player character hidden, quit function | ||||
|  | ||||
| 	KeyboardMovement_Directions newdirection; // declare variable storing new direction | ||||
|  | ||||
| 	// get new direction: | ||||
| 	if ( ((IsKeyPressed(KeyboardMovement_KeyDown)) && (IsKeyPressed(KeyboardMovement_KeyRight))) || (IsKeyPressed(KeyboardMovement_KeyDownRight)) ) newdirection = eKeyboardMovement_DownRight; // if down&right arrows or PgDn (numeric pad) held down, set new direction to Down-Right | ||||
| 	else if ( ((IsKeyPressed(KeyboardMovement_KeyUp)) && (IsKeyPressed(KeyboardMovement_KeyRight))) || (IsKeyPressed(KeyboardMovement_KeyUpRight)) ) newdirection = eKeyboardMovement_UpRight; // up&right arrows or PgUp (numpad) | ||||
| 	else if ( ((IsKeyPressed(KeyboardMovement_KeyDown)) && (IsKeyPressed(KeyboardMovement_KeyLeft))) || (IsKeyPressed(KeyboardMovement_KeyDownLeft)) ) newdirection = eKeyboardMovement_DownLeft; // down&left arrows or End (numpad) | ||||
| 	else if ( ((IsKeyPressed(KeyboardMovement_KeyUp)) && (IsKeyPressed(KeyboardMovement_KeyLeft))) || (IsKeyPressed(KeyboardMovement_KeyUpLeft)) ) newdirection = eKeyboardMovement_UpLeft; // up&left arrows or Home (numpad) | ||||
| 	else if (IsKeyPressed(KeyboardMovement_KeyDown)) newdirection = eKeyboardMovement_Down; // down arrow | ||||
| 	else if (IsKeyPressed(KeyboardMovement_KeyLeft)) newdirection = eKeyboardMovement_Left; // left arrow | ||||
| 	else if (IsKeyPressed(KeyboardMovement_KeyRight)) newdirection = eKeyboardMovement_Right; // right arrow | ||||
| 	else if (IsKeyPressed(KeyboardMovement_KeyUp)) newdirection = eKeyboardMovement_Up; // up arrow | ||||
| 	else newdirection = eKeyboardMovement_Stop; // if none of the above held down, set it to stop player character | ||||
|  | ||||
| 	if (IsKeyPressed(KeyboardMovement_KeyStop)) newdirection = eKeyboardMovement_Stop; // if 5 (numeric pad) held down, stop player character, regardless of whether some of the above are held down | ||||
|  | ||||
| 	if (newdirection != KeyboardMovement_CurrentDirection) { // if new direction is different from current direction | ||||
|  | ||||
| 		if (newdirection == eKeyboardMovement_Stop) player.StopMoving(); // if new direction is the Stop command, stop movement of player character | ||||
| 		else { // if new direction is NOT the Stop command | ||||
|  | ||||
| 			int dx, dy; // declare variables storing new walk coordinates | ||||
| 			if (newdirection == eKeyboardMovement_DownRight) { | ||||
| 				dx = DISTANCE; | ||||
| 				dy = DISTANCE; | ||||
| 			} | ||||
| 			else if (newdirection == eKeyboardMovement_UpRight) { | ||||
| 				dx = DISTANCE; | ||||
| 				dy = -DISTANCE; | ||||
| 			} | ||||
| 			else if (newdirection == eKeyboardMovement_DownLeft) { | ||||
| 				dx = -DISTANCE; | ||||
| 				dy = DISTANCE; | ||||
| 			} | ||||
| 			else if (newdirection == eKeyboardMovement_UpLeft) { | ||||
| 				dx = -DISTANCE; | ||||
| 				dy = -DISTANCE; | ||||
| 			} | ||||
| 			else if (newdirection == eKeyboardMovement_Down) { | ||||
| 				dx = 0; | ||||
| 				dy = DISTANCE; | ||||
| 			} | ||||
| 			else if (newdirection == eKeyboardMovement_Left) { | ||||
| 				dx = -DISTANCE; | ||||
| 				dy = 0; | ||||
| 			} | ||||
| 			else if (newdirection == eKeyboardMovement_Right) { | ||||
| 				dx = DISTANCE; | ||||
| 				dy = 0; | ||||
| 			} | ||||
| 			else if (newdirection == eKeyboardMovement_Up) { | ||||
| 				dx = 0; | ||||
| 				dy = -DISTANCE; | ||||
| 			} | ||||
|  | ||||
| 			player.WalkStraight(player.x + dx, player.y + dy, eNoBlock); // walk player character to the new coordinates | ||||
| 		} | ||||
| 		KeyboardMovement_CurrentDirection = newdirection; // update current direction to new direction | ||||
|  | ||||
| 	} | ||||
|  | ||||
| } | ||||
|  | ||||
| //==================================================================================================== | ||||
|  | ||||
| function on_key_press(int keycode) { | ||||
|  | ||||
| 	//-------------------------------------------------- | ||||
| 	// Tapping mode | ||||
| 	//-------------------------------------------------- | ||||
|  | ||||
| 	if ((IsGamePaused() == true) || (KeyboardMovement_Mode != eKeyboardMovement_Tapping) || (IsInterfaceEnabled() == false) || (player.on == false)) return 0; | ||||
| 	  // if game is paused, module or mode disabled, interface disabled or player character hidden, quit function | ||||
|  | ||||
| 	KeyboardMovement_Directions newdirection; // declare variable storing new direction | ||||
|  | ||||
| 	// get new direction: | ||||
| 	if (keycode == KeyboardMovement_KeyDownRight) newdirection = eKeyboardMovement_DownRight; // if down-right key pressed, set new direction to Down-Right | ||||
| 	else if (keycode == KeyboardMovement_KeyUpRight) newdirection = eKeyboardMovement_UpRight; | ||||
| 	else if (keycode == KeyboardMovement_KeyDownLeft) newdirection = eKeyboardMovement_DownLeft; | ||||
| 	else if (keycode == KeyboardMovement_KeyUpLeft) newdirection = eKeyboardMovement_UpLeft; | ||||
| 	else if (keycode == KeyboardMovement_KeyDown) newdirection = eKeyboardMovement_Down; | ||||
| 	else if (keycode == KeyboardMovement_KeyLeft) newdirection = eKeyboardMovement_Left; | ||||
| 	else if (keycode == KeyboardMovement_KeyRight) newdirection = eKeyboardMovement_Right; | ||||
| 	else if (keycode == KeyboardMovement_KeyUp) newdirection = eKeyboardMovement_Up; | ||||
| 	else if (keycode == KeyboardMovement_KeyStop) newdirection = eKeyboardMovement_Stop; // if stop key pressed, set to stop player character | ||||
|  | ||||
| 	if (newdirection != KeyboardMovement_CurrentDirection) { // if new direction is different from current direction | ||||
|  | ||||
| 		if (newdirection == eKeyboardMovement_Stop) player.StopMoving(); // if new direction is the Stop command, stop movement of player character | ||||
| 		else { // if new direction is NOT the Stop command | ||||
|  | ||||
| 			int dx, dy; // declare variables storing new walk coordinates | ||||
| 			if (newdirection == eKeyboardMovement_DownRight) { | ||||
| 				dx = DISTANCE; | ||||
| 				dy = DISTANCE; | ||||
| 			} | ||||
| 			else if (newdirection == eKeyboardMovement_UpRight) { | ||||
| 				dx = DISTANCE; | ||||
| 				dy = -DISTANCE; | ||||
| 			} | ||||
| 			else if (newdirection == eKeyboardMovement_DownLeft) { | ||||
| 				dx = -DISTANCE; | ||||
| 				dy = DISTANCE; | ||||
| 			} | ||||
| 			else if (newdirection == eKeyboardMovement_UpLeft) { | ||||
| 				dx = -DISTANCE; | ||||
| 				dy = -DISTANCE; | ||||
| 			} | ||||
| 			else if (newdirection == eKeyboardMovement_Down) { | ||||
| 				dx = 0; | ||||
| 				dy = DISTANCE; | ||||
| 			} | ||||
| 			else if (newdirection == eKeyboardMovement_Left) { | ||||
| 				dx = -DISTANCE; | ||||
| 				dy = 0; | ||||
| 			} | ||||
| 			else if (newdirection == eKeyboardMovement_Right) { | ||||
| 				dx = DISTANCE; | ||||
| 				dy = 0; | ||||
| 			} | ||||
| 			else if (newdirection == eKeyboardMovement_Up) { | ||||
| 				dx = 0; | ||||
| 				dy = -DISTANCE; | ||||
| 			} | ||||
|  | ||||
| 			player.WalkStraight(player.x + dx, player.y + dy, eNoBlock); // walk player character to the new coordinates | ||||
| 		} | ||||
| 		KeyboardMovement_CurrentDirection = newdirection; // update current direction to new direction | ||||
|  | ||||
| 	} | ||||
| 	else { // if new direction is same as current direction | ||||
| 		player.StopMoving(); // stop player character | ||||
| 		KeyboardMovement_CurrentDirection = eKeyboardMovement_Stop; // update current direction | ||||
| 	} | ||||
|  | ||||
| } | ||||
|  | ||||
| //==================================================================================================== | ||||
|  | ||||
| function on_event(EventType event, int data) { | ||||
|  | ||||
| 	if (event == eEventLeaveRoom) KeyboardMovement_CurrentDirection = eKeyboardMovement_Stop; | ||||
|  | ||||
| } | ||||
|  | ||||
| //==================================================================================================== | ||||
							
								
								
									
										13
									
								
								samples/AGS Script/KeyboardMovement_102.ash
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								samples/AGS Script/KeyboardMovement_102.ash
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | ||||
| // Script header for module 'KeyboardMovement' | ||||
|  | ||||
| #define KeyboardMovement_VERSION 101 | ||||
|  | ||||
| enum KeyboardMovement_Modes { | ||||
| 	eKeyboardMovement_None,  | ||||
| 	eKeyboardMovement_Tapping,  | ||||
| 	eKeyboardMovement_Pressing | ||||
| }; | ||||
|  | ||||
| struct KeyboardMovement { | ||||
| 	import static function SetMode(KeyboardMovement_Modes mode); | ||||
| }; | ||||
							
								
								
									
										18
									
								
								samples/APL/DeepakChopra.apl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								samples/APL/DeepakChopra.apl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,18 @@ | ||||
| ⍝   You can try this at http://tryapl.org/ | ||||
| ⍝   I can not explain how much I suddenly love this crypto-language | ||||
|  | ||||
|  | ||||
|  | ||||
| Starts     ← 'Experiential truth ' 'The physical world ' 'Non-judgment '       'Quantum physics ' | ||||
| Middles    ← 'nurtures an '        'projects onto '      'imparts reality to ' 'constructs with ' | ||||
| Qualifiers ← 'abundance of '       'the barrier of '     'self-righteous '     'potential ' | ||||
| Finishes   ← 'marvel.'             'choices.'            'creativity.'         'actions.' | ||||
|  | ||||
| rf     ← {(?⍴⍵)⊃⍵} | ||||
| erf    ← {rf ¨ ⍵} | ||||
|  | ||||
| deepak ← {erf Starts Middles Qualifiers Finishes} | ||||
|  | ||||
|  | ||||
|  | ||||
| deepak ⍬ | ||||
							
								
								
									
										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 | ||||
							
								
								
									
										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() | ||||
| ? | ||||
							
								
								
									
										664
									
								
								samples/C++/epoll_reactor.ipp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										664
									
								
								samples/C++/epoll_reactor.ipp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,664 @@ | ||||
| // | ||||
| // detail/impl/epoll_reactor.ipp | ||||
| // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||
| // | ||||
| // Copyright (c) 2003-2013 Christopher M. Kohlhoff (chris at kohlhoff dot com) | ||||
| // | ||||
| // Distributed under the Boost Software License, Version 1.0. (See accompanying | ||||
| // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) | ||||
| // | ||||
|  | ||||
| #ifndef BOOST_ASIO_DETAIL_IMPL_EPOLL_REACTOR_IPP | ||||
| #define BOOST_ASIO_DETAIL_IMPL_EPOLL_REACTOR_IPP | ||||
|  | ||||
| #if defined(_MSC_VER) && (_MSC_VER >= 1200) | ||||
| # pragma once | ||||
| #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) | ||||
|  | ||||
| #include <boost/asio/detail/config.hpp> | ||||
|  | ||||
| #if defined(BOOST_ASIO_HAS_EPOLL) | ||||
|  | ||||
| #include <cstddef> | ||||
| #include <sys/epoll.h> | ||||
| #include <boost/asio/detail/epoll_reactor.hpp> | ||||
| #include <boost/asio/detail/throw_error.hpp> | ||||
| #include <boost/asio/error.hpp> | ||||
|  | ||||
| #if defined(BOOST_ASIO_HAS_TIMERFD) | ||||
| # include <sys/timerfd.h> | ||||
| #endif // defined(BOOST_ASIO_HAS_TIMERFD) | ||||
|  | ||||
| #include <boost/asio/detail/push_options.hpp> | ||||
|  | ||||
| namespace boost { | ||||
| namespace asio { | ||||
| namespace detail { | ||||
|  | ||||
| epoll_reactor::epoll_reactor(boost::asio::io_service& io_service) | ||||
|   : boost::asio::detail::service_base<epoll_reactor>(io_service), | ||||
|     io_service_(use_service<io_service_impl>(io_service)), | ||||
|     mutex_(), | ||||
|     interrupter_(), | ||||
|     epoll_fd_(do_epoll_create()), | ||||
|     timer_fd_(do_timerfd_create()), | ||||
|     shutdown_(false) | ||||
| { | ||||
|   // Add the interrupter's descriptor to epoll. | ||||
|   epoll_event ev = { 0, { 0 } }; | ||||
|   ev.events = EPOLLIN | EPOLLERR | EPOLLET; | ||||
|   ev.data.ptr = &interrupter_; | ||||
|   epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, interrupter_.read_descriptor(), &ev); | ||||
|   interrupter_.interrupt(); | ||||
|  | ||||
|   // Add the timer descriptor to epoll. | ||||
|   if (timer_fd_ != -1) | ||||
|   { | ||||
|     ev.events = EPOLLIN | EPOLLERR; | ||||
|     ev.data.ptr = &timer_fd_; | ||||
|     epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, timer_fd_, &ev); | ||||
|   } | ||||
| } | ||||
|  | ||||
| epoll_reactor::~epoll_reactor() | ||||
| { | ||||
|   if (epoll_fd_ != -1) | ||||
|     close(epoll_fd_); | ||||
|   if (timer_fd_ != -1) | ||||
|     close(timer_fd_); | ||||
| } | ||||
|  | ||||
| void epoll_reactor::shutdown_service() | ||||
| { | ||||
|   mutex::scoped_lock lock(mutex_); | ||||
|   shutdown_ = true; | ||||
|   lock.unlock(); | ||||
|  | ||||
|   op_queue<operation> ops; | ||||
|  | ||||
|   while (descriptor_state* state = registered_descriptors_.first()) | ||||
|   { | ||||
|     for (int i = 0; i < max_ops; ++i) | ||||
|       ops.push(state->op_queue_[i]); | ||||
|     state->shutdown_ = true; | ||||
|     registered_descriptors_.free(state); | ||||
|   } | ||||
|  | ||||
|   timer_queues_.get_all_timers(ops); | ||||
|  | ||||
|   io_service_.abandon_operations(ops); | ||||
| } | ||||
|  | ||||
| void epoll_reactor::fork_service(boost::asio::io_service::fork_event fork_ev) | ||||
| { | ||||
|   if (fork_ev == boost::asio::io_service::fork_child) | ||||
|   { | ||||
|     if (epoll_fd_ != -1) | ||||
|       ::close(epoll_fd_); | ||||
|     epoll_fd_ = -1; | ||||
|     epoll_fd_ = do_epoll_create(); | ||||
|  | ||||
|     if (timer_fd_ != -1) | ||||
|       ::close(timer_fd_); | ||||
|     timer_fd_ = -1; | ||||
|     timer_fd_ = do_timerfd_create(); | ||||
|  | ||||
|     interrupter_.recreate(); | ||||
|  | ||||
|     // Add the interrupter's descriptor to epoll. | ||||
|     epoll_event ev = { 0, { 0 } }; | ||||
|     ev.events = EPOLLIN | EPOLLERR | EPOLLET; | ||||
|     ev.data.ptr = &interrupter_; | ||||
|     epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, interrupter_.read_descriptor(), &ev); | ||||
|     interrupter_.interrupt(); | ||||
|  | ||||
|     // Add the timer descriptor to epoll. | ||||
|     if (timer_fd_ != -1) | ||||
|     { | ||||
|       ev.events = EPOLLIN | EPOLLERR; | ||||
|       ev.data.ptr = &timer_fd_; | ||||
|       epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, timer_fd_, &ev); | ||||
|     } | ||||
|  | ||||
|     update_timeout(); | ||||
|  | ||||
|     // Re-register all descriptors with epoll. | ||||
|     mutex::scoped_lock descriptors_lock(registered_descriptors_mutex_); | ||||
|     for (descriptor_state* state = registered_descriptors_.first(); | ||||
|         state != 0; state = state->next_) | ||||
|     { | ||||
|       ev.events = state->registered_events_; | ||||
|       ev.data.ptr = state; | ||||
|       int result = epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, state->descriptor_, &ev); | ||||
|       if (result != 0) | ||||
|       { | ||||
|         boost::system::error_code ec(errno, | ||||
|             boost::asio::error::get_system_category()); | ||||
|         boost::asio::detail::throw_error(ec, "epoll re-registration"); | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| void epoll_reactor::init_task() | ||||
| { | ||||
|   io_service_.init_task(); | ||||
| } | ||||
|  | ||||
| int epoll_reactor::register_descriptor(socket_type descriptor, | ||||
|     epoll_reactor::per_descriptor_data& descriptor_data) | ||||
| { | ||||
|   descriptor_data = allocate_descriptor_state(); | ||||
|  | ||||
|   { | ||||
|     mutex::scoped_lock descriptor_lock(descriptor_data->mutex_); | ||||
|  | ||||
|     descriptor_data->reactor_ = this; | ||||
|     descriptor_data->descriptor_ = descriptor; | ||||
|     descriptor_data->shutdown_ = false; | ||||
|   } | ||||
|  | ||||
|   epoll_event ev = { 0, { 0 } }; | ||||
|   ev.events = EPOLLIN | EPOLLERR | EPOLLHUP | EPOLLPRI | EPOLLET; | ||||
|   descriptor_data->registered_events_ = ev.events; | ||||
|   ev.data.ptr = descriptor_data; | ||||
|   int result = epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, descriptor, &ev); | ||||
|   if (result != 0) | ||||
|     return errno; | ||||
|  | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
| int epoll_reactor::register_internal_descriptor( | ||||
|     int op_type, socket_type descriptor, | ||||
|     epoll_reactor::per_descriptor_data& descriptor_data, reactor_op* op) | ||||
| { | ||||
|   descriptor_data = allocate_descriptor_state(); | ||||
|  | ||||
|   { | ||||
|     mutex::scoped_lock descriptor_lock(descriptor_data->mutex_); | ||||
|  | ||||
|     descriptor_data->reactor_ = this; | ||||
|     descriptor_data->descriptor_ = descriptor; | ||||
|     descriptor_data->shutdown_ = false; | ||||
|     descriptor_data->op_queue_[op_type].push(op); | ||||
|   } | ||||
|  | ||||
|   epoll_event ev = { 0, { 0 } }; | ||||
|   ev.events = EPOLLIN | EPOLLERR | EPOLLHUP | EPOLLPRI | EPOLLET; | ||||
|   descriptor_data->registered_events_ = ev.events; | ||||
|   ev.data.ptr = descriptor_data; | ||||
|   int result = epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, descriptor, &ev); | ||||
|   if (result != 0) | ||||
|     return errno; | ||||
|  | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
| void epoll_reactor::move_descriptor(socket_type, | ||||
|     epoll_reactor::per_descriptor_data& target_descriptor_data, | ||||
|     epoll_reactor::per_descriptor_data& source_descriptor_data) | ||||
| { | ||||
|   target_descriptor_data = source_descriptor_data; | ||||
|   source_descriptor_data = 0; | ||||
| } | ||||
|  | ||||
| void epoll_reactor::start_op(int op_type, socket_type descriptor, | ||||
|     epoll_reactor::per_descriptor_data& descriptor_data, reactor_op* op, | ||||
|     bool is_continuation, bool allow_speculative) | ||||
| { | ||||
|   if (!descriptor_data) | ||||
|   { | ||||
|     op->ec_ = boost::asio::error::bad_descriptor; | ||||
|     post_immediate_completion(op, is_continuation); | ||||
|     return; | ||||
|   } | ||||
|  | ||||
|   mutex::scoped_lock descriptor_lock(descriptor_data->mutex_); | ||||
|  | ||||
|   if (descriptor_data->shutdown_) | ||||
|   { | ||||
|     post_immediate_completion(op, is_continuation); | ||||
|     return; | ||||
|   } | ||||
|  | ||||
|   if (descriptor_data->op_queue_[op_type].empty()) | ||||
|   { | ||||
|     if (allow_speculative | ||||
|         && (op_type != read_op | ||||
|           || descriptor_data->op_queue_[except_op].empty())) | ||||
|     { | ||||
|       if (op->perform()) | ||||
|       { | ||||
|         descriptor_lock.unlock(); | ||||
|         io_service_.post_immediate_completion(op, is_continuation); | ||||
|         return; | ||||
|       } | ||||
|  | ||||
|       if (op_type == write_op) | ||||
|       { | ||||
|         if ((descriptor_data->registered_events_ & EPOLLOUT) == 0) | ||||
|         { | ||||
|           epoll_event ev = { 0, { 0 } }; | ||||
|           ev.events = descriptor_data->registered_events_ | EPOLLOUT; | ||||
|           ev.data.ptr = descriptor_data; | ||||
|           if (epoll_ctl(epoll_fd_, EPOLL_CTL_MOD, descriptor, &ev) == 0) | ||||
|           { | ||||
|             descriptor_data->registered_events_ |= ev.events; | ||||
|           } | ||||
|           else | ||||
|           { | ||||
|             op->ec_ = boost::system::error_code(errno, | ||||
|                 boost::asio::error::get_system_category()); | ||||
|             io_service_.post_immediate_completion(op, is_continuation); | ||||
|             return; | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|       if (op_type == write_op) | ||||
|       { | ||||
|         descriptor_data->registered_events_ |= EPOLLOUT; | ||||
|       } | ||||
|  | ||||
|       epoll_event ev = { 0, { 0 } }; | ||||
|       ev.events = descriptor_data->registered_events_; | ||||
|       ev.data.ptr = descriptor_data; | ||||
|       epoll_ctl(epoll_fd_, EPOLL_CTL_MOD, descriptor, &ev); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   descriptor_data->op_queue_[op_type].push(op); | ||||
|   io_service_.work_started(); | ||||
| } | ||||
|  | ||||
| void epoll_reactor::cancel_ops(socket_type, | ||||
|     epoll_reactor::per_descriptor_data& descriptor_data) | ||||
| { | ||||
|   if (!descriptor_data) | ||||
|     return; | ||||
|  | ||||
|   mutex::scoped_lock descriptor_lock(descriptor_data->mutex_); | ||||
|  | ||||
|   op_queue<operation> ops; | ||||
|   for (int i = 0; i < max_ops; ++i) | ||||
|   { | ||||
|     while (reactor_op* op = descriptor_data->op_queue_[i].front()) | ||||
|     { | ||||
|       op->ec_ = boost::asio::error::operation_aborted; | ||||
|       descriptor_data->op_queue_[i].pop(); | ||||
|       ops.push(op); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   descriptor_lock.unlock(); | ||||
|  | ||||
|   io_service_.post_deferred_completions(ops); | ||||
| } | ||||
|  | ||||
| void epoll_reactor::deregister_descriptor(socket_type descriptor, | ||||
|     epoll_reactor::per_descriptor_data& descriptor_data, bool closing) | ||||
| { | ||||
|   if (!descriptor_data) | ||||
|     return; | ||||
|  | ||||
|   mutex::scoped_lock descriptor_lock(descriptor_data->mutex_); | ||||
|  | ||||
|   if (!descriptor_data->shutdown_) | ||||
|   { | ||||
|     if (closing) | ||||
|     { | ||||
|       // The descriptor will be automatically removed from the epoll set when | ||||
|       // it is closed. | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|       epoll_event ev = { 0, { 0 } }; | ||||
|       epoll_ctl(epoll_fd_, EPOLL_CTL_DEL, descriptor, &ev); | ||||
|     } | ||||
|  | ||||
|     op_queue<operation> ops; | ||||
|     for (int i = 0; i < max_ops; ++i) | ||||
|     { | ||||
|       while (reactor_op* op = descriptor_data->op_queue_[i].front()) | ||||
|       { | ||||
|         op->ec_ = boost::asio::error::operation_aborted; | ||||
|         descriptor_data->op_queue_[i].pop(); | ||||
|         ops.push(op); | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     descriptor_data->descriptor_ = -1; | ||||
|     descriptor_data->shutdown_ = true; | ||||
|  | ||||
|     descriptor_lock.unlock(); | ||||
|  | ||||
|     free_descriptor_state(descriptor_data); | ||||
|     descriptor_data = 0; | ||||
|  | ||||
|     io_service_.post_deferred_completions(ops); | ||||
|   } | ||||
| } | ||||
|  | ||||
| void epoll_reactor::deregister_internal_descriptor(socket_type descriptor, | ||||
|     epoll_reactor::per_descriptor_data& descriptor_data) | ||||
| { | ||||
|   if (!descriptor_data) | ||||
|     return; | ||||
|  | ||||
|   mutex::scoped_lock descriptor_lock(descriptor_data->mutex_); | ||||
|  | ||||
|   if (!descriptor_data->shutdown_) | ||||
|   { | ||||
|     epoll_event ev = { 0, { 0 } }; | ||||
|     epoll_ctl(epoll_fd_, EPOLL_CTL_DEL, descriptor, &ev); | ||||
|  | ||||
|     op_queue<operation> ops; | ||||
|     for (int i = 0; i < max_ops; ++i) | ||||
|       ops.push(descriptor_data->op_queue_[i]); | ||||
|  | ||||
|     descriptor_data->descriptor_ = -1; | ||||
|     descriptor_data->shutdown_ = true; | ||||
|  | ||||
|     descriptor_lock.unlock(); | ||||
|  | ||||
|     free_descriptor_state(descriptor_data); | ||||
|     descriptor_data = 0; | ||||
|   } | ||||
| } | ||||
|  | ||||
| void epoll_reactor::run(bool block, op_queue<operation>& ops) | ||||
| { | ||||
|   // This code relies on the fact that the task_io_service queues the reactor | ||||
|   // task behind all descriptor operations generated by this function. This | ||||
|   // means, that by the time we reach this point, any previously returned | ||||
|   // descriptor operations have already been dequeued. Therefore it is now safe | ||||
|   // for us to reuse and return them for the task_io_service to queue again. | ||||
|  | ||||
|   // Calculate a timeout only if timerfd is not used. | ||||
|   int timeout; | ||||
|   if (timer_fd_ != -1) | ||||
|     timeout = block ? -1 : 0; | ||||
|   else | ||||
|   { | ||||
|     mutex::scoped_lock lock(mutex_); | ||||
|     timeout = block ? get_timeout() : 0; | ||||
|   } | ||||
|  | ||||
|   // Block on the epoll descriptor. | ||||
|   epoll_event events[128]; | ||||
|   int num_events = epoll_wait(epoll_fd_, events, 128, timeout); | ||||
|  | ||||
| #if defined(BOOST_ASIO_HAS_TIMERFD) | ||||
|   bool check_timers = (timer_fd_ == -1); | ||||
| #else // defined(BOOST_ASIO_HAS_TIMERFD) | ||||
|   bool check_timers = true; | ||||
| #endif // defined(BOOST_ASIO_HAS_TIMERFD) | ||||
|  | ||||
|   // Dispatch the waiting events. | ||||
|   for (int i = 0; i < num_events; ++i) | ||||
|   { | ||||
|     void* ptr = events[i].data.ptr; | ||||
|     if (ptr == &interrupter_) | ||||
|     { | ||||
|       // No need to reset the interrupter since we're leaving the descriptor | ||||
|       // in a ready-to-read state and relying on edge-triggered notifications | ||||
|       // to make it so that we only get woken up when the descriptor's epoll | ||||
|       // registration is updated. | ||||
|  | ||||
| #if defined(BOOST_ASIO_HAS_TIMERFD) | ||||
|       if (timer_fd_ == -1) | ||||
|         check_timers = true; | ||||
| #else // defined(BOOST_ASIO_HAS_TIMERFD) | ||||
|       check_timers = true; | ||||
| #endif // defined(BOOST_ASIO_HAS_TIMERFD) | ||||
|     } | ||||
| #if defined(BOOST_ASIO_HAS_TIMERFD) | ||||
|     else if (ptr == &timer_fd_) | ||||
|     { | ||||
|       check_timers = true; | ||||
|     } | ||||
| #endif // defined(BOOST_ASIO_HAS_TIMERFD) | ||||
|     else | ||||
|     { | ||||
|       // The descriptor operation doesn't count as work in and of itself, so we | ||||
|       // don't call work_started() here. This still allows the io_service to | ||||
|       // stop if the only remaining operations are descriptor operations. | ||||
|       descriptor_state* descriptor_data = static_cast<descriptor_state*>(ptr); | ||||
|       descriptor_data->set_ready_events(events[i].events); | ||||
|       ops.push(descriptor_data); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   if (check_timers) | ||||
|   { | ||||
|     mutex::scoped_lock common_lock(mutex_); | ||||
|     timer_queues_.get_ready_timers(ops); | ||||
|  | ||||
| #if defined(BOOST_ASIO_HAS_TIMERFD) | ||||
|     if (timer_fd_ != -1) | ||||
|     { | ||||
|       itimerspec new_timeout; | ||||
|       itimerspec old_timeout; | ||||
|       int flags = get_timeout(new_timeout); | ||||
|       timerfd_settime(timer_fd_, flags, &new_timeout, &old_timeout); | ||||
|     } | ||||
| #endif // defined(BOOST_ASIO_HAS_TIMERFD) | ||||
|   } | ||||
| } | ||||
|  | ||||
| void epoll_reactor::interrupt() | ||||
| { | ||||
|   epoll_event ev = { 0, { 0 } }; | ||||
|   ev.events = EPOLLIN | EPOLLERR | EPOLLET; | ||||
|   ev.data.ptr = &interrupter_; | ||||
|   epoll_ctl(epoll_fd_, EPOLL_CTL_MOD, interrupter_.read_descriptor(), &ev); | ||||
| } | ||||
|  | ||||
| int epoll_reactor::do_epoll_create() | ||||
| { | ||||
| #if defined(EPOLL_CLOEXEC) | ||||
|   int fd = epoll_create1(EPOLL_CLOEXEC); | ||||
| #else // defined(EPOLL_CLOEXEC) | ||||
|   int fd = -1; | ||||
|   errno = EINVAL; | ||||
| #endif // defined(EPOLL_CLOEXEC) | ||||
|  | ||||
|   if (fd == -1 && (errno == EINVAL || errno == ENOSYS)) | ||||
|   { | ||||
|     fd = epoll_create(epoll_size); | ||||
|     if (fd != -1) | ||||
|       ::fcntl(fd, F_SETFD, FD_CLOEXEC); | ||||
|   } | ||||
|  | ||||
|   if (fd == -1) | ||||
|   { | ||||
|     boost::system::error_code ec(errno, | ||||
|         boost::asio::error::get_system_category()); | ||||
|     boost::asio::detail::throw_error(ec, "epoll"); | ||||
|   } | ||||
|  | ||||
|   return fd; | ||||
| } | ||||
|  | ||||
| int epoll_reactor::do_timerfd_create() | ||||
| { | ||||
| #if defined(BOOST_ASIO_HAS_TIMERFD) | ||||
| # if defined(TFD_CLOEXEC) | ||||
|   int fd = timerfd_create(CLOCK_MONOTONIC, TFD_CLOEXEC); | ||||
| # else // defined(TFD_CLOEXEC) | ||||
|   int fd = -1; | ||||
|   errno = EINVAL; | ||||
| # endif // defined(TFD_CLOEXEC) | ||||
|  | ||||
|   if (fd == -1 && errno == EINVAL) | ||||
|   { | ||||
|     fd = timerfd_create(CLOCK_MONOTONIC, 0); | ||||
|     if (fd != -1) | ||||
|       ::fcntl(fd, F_SETFD, FD_CLOEXEC); | ||||
|   } | ||||
|  | ||||
|   return fd; | ||||
| #else // defined(BOOST_ASIO_HAS_TIMERFD) | ||||
|   return -1; | ||||
| #endif // defined(BOOST_ASIO_HAS_TIMERFD) | ||||
| } | ||||
|  | ||||
| epoll_reactor::descriptor_state* epoll_reactor::allocate_descriptor_state() | ||||
| { | ||||
|   mutex::scoped_lock descriptors_lock(registered_descriptors_mutex_); | ||||
|   return registered_descriptors_.alloc(); | ||||
| } | ||||
|  | ||||
| void epoll_reactor::free_descriptor_state(epoll_reactor::descriptor_state* s) | ||||
| { | ||||
|   mutex::scoped_lock descriptors_lock(registered_descriptors_mutex_); | ||||
|   registered_descriptors_.free(s); | ||||
| } | ||||
|  | ||||
| void epoll_reactor::do_add_timer_queue(timer_queue_base& queue) | ||||
| { | ||||
|   mutex::scoped_lock lock(mutex_); | ||||
|   timer_queues_.insert(&queue); | ||||
| } | ||||
|  | ||||
| void epoll_reactor::do_remove_timer_queue(timer_queue_base& queue) | ||||
| { | ||||
|   mutex::scoped_lock lock(mutex_); | ||||
|   timer_queues_.erase(&queue); | ||||
| } | ||||
|  | ||||
| void epoll_reactor::update_timeout() | ||||
| { | ||||
| #if defined(BOOST_ASIO_HAS_TIMERFD) | ||||
|   if (timer_fd_ != -1) | ||||
|   { | ||||
|     itimerspec new_timeout; | ||||
|     itimerspec old_timeout; | ||||
|     int flags = get_timeout(new_timeout); | ||||
|     timerfd_settime(timer_fd_, flags, &new_timeout, &old_timeout); | ||||
|     return; | ||||
|   } | ||||
| #endif // defined(BOOST_ASIO_HAS_TIMERFD) | ||||
|   interrupt(); | ||||
| } | ||||
|  | ||||
| int epoll_reactor::get_timeout() | ||||
| { | ||||
|   // By default we will wait no longer than 5 minutes. This will ensure that | ||||
|   // any changes to the system clock are detected after no longer than this. | ||||
|   return timer_queues_.wait_duration_msec(5 * 60 * 1000); | ||||
| } | ||||
|  | ||||
| #if defined(BOOST_ASIO_HAS_TIMERFD) | ||||
| int epoll_reactor::get_timeout(itimerspec& ts) | ||||
| { | ||||
|   ts.it_interval.tv_sec = 0; | ||||
|   ts.it_interval.tv_nsec = 0; | ||||
|  | ||||
|   long usec = timer_queues_.wait_duration_usec(5 * 60 * 1000 * 1000); | ||||
|   ts.it_value.tv_sec = usec / 1000000; | ||||
|   ts.it_value.tv_nsec = usec ? (usec % 1000000) * 1000 : 1; | ||||
|  | ||||
|   return usec ? 0 : TFD_TIMER_ABSTIME; | ||||
| } | ||||
| #endif // defined(BOOST_ASIO_HAS_TIMERFD) | ||||
|  | ||||
| struct epoll_reactor::perform_io_cleanup_on_block_exit | ||||
| { | ||||
|   explicit perform_io_cleanup_on_block_exit(epoll_reactor* r) | ||||
|     : reactor_(r), first_op_(0) | ||||
|   { | ||||
|   } | ||||
|  | ||||
|   ~perform_io_cleanup_on_block_exit() | ||||
|   { | ||||
|     if (first_op_) | ||||
|     { | ||||
|       // Post the remaining completed operations for invocation. | ||||
|       if (!ops_.empty()) | ||||
|         reactor_->io_service_.post_deferred_completions(ops_); | ||||
|  | ||||
|       // A user-initiated operation has completed, but there's no need to | ||||
|       // explicitly call work_finished() here. Instead, we'll take advantage of | ||||
|       // the fact that the task_io_service will call work_finished() once we | ||||
|       // return. | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|       // No user-initiated operations have completed, so we need to compensate | ||||
|       // for the work_finished() call that the task_io_service will make once | ||||
|       // this operation returns. | ||||
|       reactor_->io_service_.work_started(); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   epoll_reactor* reactor_; | ||||
|   op_queue<operation> ops_; | ||||
|   operation* first_op_; | ||||
| }; | ||||
|  | ||||
| epoll_reactor::descriptor_state::descriptor_state() | ||||
|   : operation(&epoll_reactor::descriptor_state::do_complete) | ||||
| { | ||||
| } | ||||
|  | ||||
| operation* epoll_reactor::descriptor_state::perform_io(uint32_t events) | ||||
| { | ||||
|   mutex_.lock(); | ||||
|   perform_io_cleanup_on_block_exit io_cleanup(reactor_); | ||||
|   mutex::scoped_lock descriptor_lock(mutex_, mutex::scoped_lock::adopt_lock); | ||||
|  | ||||
|   // Exception operations must be processed first to ensure that any | ||||
|   // out-of-band data is read before normal data. | ||||
|   static const int flag[max_ops] = { EPOLLIN, EPOLLOUT, EPOLLPRI }; | ||||
|   for (int j = max_ops - 1; j >= 0; --j) | ||||
|   { | ||||
|     if (events & (flag[j] | EPOLLERR | EPOLLHUP)) | ||||
|     { | ||||
|       while (reactor_op* op = op_queue_[j].front()) | ||||
|       { | ||||
|         if (op->perform()) | ||||
|         { | ||||
|           op_queue_[j].pop(); | ||||
|           io_cleanup.ops_.push(op); | ||||
|         } | ||||
|         else | ||||
|           break; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   // The first operation will be returned for completion now. The others will | ||||
|   // be posted for later by the io_cleanup object's destructor. | ||||
|   io_cleanup.first_op_ = io_cleanup.ops_.front(); | ||||
|   io_cleanup.ops_.pop(); | ||||
|   return io_cleanup.first_op_; | ||||
| } | ||||
|  | ||||
| void epoll_reactor::descriptor_state::do_complete( | ||||
|     io_service_impl* owner, operation* base, | ||||
|     const boost::system::error_code& ec, std::size_t bytes_transferred) | ||||
| { | ||||
|   if (owner) | ||||
|   { | ||||
|     descriptor_state* descriptor_data = static_cast<descriptor_state*>(base); | ||||
|     uint32_t events = static_cast<uint32_t>(bytes_transferred); | ||||
|     if (operation* op = descriptor_data->perform_io(events)) | ||||
|     { | ||||
|       op->complete(*owner, ec, 0); | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| } // namespace detail | ||||
| } // namespace asio | ||||
| } // namespace boost | ||||
|  | ||||
| #include <boost/asio/detail/pop_options.hpp> | ||||
|  | ||||
| #endif // defined(BOOST_ASIO_HAS_EPOLL) | ||||
|  | ||||
| #endif // BOOST_ASIO_DETAIL_IMPL_EPOLL_REACTOR_IPP | ||||
							
								
								
									
										304
									
								
								samples/Chapel/distributions.chpl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										304
									
								
								samples/Chapel/distributions.chpl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,304 @@ | ||||
| // | ||||
| // Distributions Primer | ||||
| // | ||||
| // This primer demonstrates uses of some of Chapel's standard | ||||
| // distributions.  To use these distributions in a Chapel program, | ||||
| // the respective module must be used: | ||||
| // | ||||
| use BlockDist, CyclicDist, BlockCycDist, ReplicatedDist; | ||||
| use DimensionalDist2D, ReplicatedDim, BlockCycDim; | ||||
|  | ||||
| // | ||||
| // For each distribution, we'll create a distributed domain and array | ||||
| // and then initialize it just to give a brief flavor of how the | ||||
| // distribution maps across locales.  Running this example on 6 | ||||
| // locales does a nice job of illustrating the distribution | ||||
| // characteristics. | ||||
| // | ||||
| // All of these distributions support options to map to a different | ||||
| // virtual locale grid than the one used by default (a | ||||
| // multidimensional factoring of the built-in Locales array), as well | ||||
| // as to control the amount of parallelism used in data parallel | ||||
| // loops.  See the Standard Distributions chapter of the language spec | ||||
| // for more details. | ||||
| // | ||||
|  | ||||
| // | ||||
| // Make the program size configurable from the command line. | ||||
| // | ||||
| config const n = 8; | ||||
|  | ||||
| // | ||||
| // Declare a 2-dimensional domain Space that we will later use to | ||||
| // initialize the distributed domains. | ||||
| // | ||||
| const Space = {1..n, 1..n}; | ||||
|  | ||||
| // | ||||
| // The Block distribution distributes a bounding box from | ||||
| // n-dimensional space across the target locale array viewed as an | ||||
| // n-dimensional virtual locale grid.  The bounding box is blocked | ||||
| // into roughly equal portions across the locales.  Note that domains | ||||
| // declared over a Block distribution can also store indices outside | ||||
| // of the bounding box; the bounding box is merely used to compute | ||||
| // the blocking of space. | ||||
| // | ||||
| // In this example, we declare a 2-dimensional Block-distributed | ||||
| // domain BlockSpace and a Block-distributed array BA declared over | ||||
| // the domain. | ||||
| // | ||||
| const BlockSpace = Space dmapped Block(boundingBox=Space); | ||||
| var BA: [BlockSpace] int; | ||||
|  | ||||
| // | ||||
| // To illustrate how the index set is distributed across locales, | ||||
| // we'll use a forall loop to initialize each array element to the | ||||
| // locale ID that stores that index/element/iteration. | ||||
| // | ||||
| forall ba in BA do | ||||
|   ba = here.id; | ||||
|  | ||||
| // | ||||
| // Output the Block-distributed array to visually see how the elements | ||||
| // are partitioned across the locales. | ||||
| // | ||||
| writeln("Block Array Index Map"); | ||||
| writeln(BA); | ||||
| writeln(); | ||||
|  | ||||
| // | ||||
| // Most of Chapel's standard distributions support an optional | ||||
| // targetLocales argument that permits you to pass in your own | ||||
| // array of locales to be targeted.  In general, the targetLocales | ||||
| // argument should match the rank of the distribution.  So for | ||||
| // example, to map a Block to a [numLocales x 1] view of the | ||||
| // locale set, one could do something like this: | ||||
|  | ||||
| // | ||||
| // We start by creating our own array of the locale values.  Here | ||||
| // we use the standard array reshape function for convenience, | ||||
| // but more generally, this array could be accessed/assigned like any | ||||
| // other. | ||||
| // | ||||
|  | ||||
| var MyLocaleView = {0..#numLocales, 1..1}; | ||||
| var MyLocales: [MyLocaleView] locale = reshape(Locales, MyLocaleView); | ||||
|  | ||||
| // | ||||
| // Then we'll declare a distributed domain/array that targets | ||||
| // this view of the locales: | ||||
| //  | ||||
|  | ||||
| const BlockSpace2 = Space dmapped Block(boundingBox=Space, | ||||
|                                         targetLocales=MyLocales); | ||||
| var BA2: [BlockSpace2] int; | ||||
|  | ||||
| // | ||||
| // Then we'll do a similar computation as before to verify where | ||||
| // everything ended up: | ||||
| // | ||||
| forall ba in BA2 do | ||||
|   ba = here.id; | ||||
|  | ||||
| writeln("Block Array Index Map"); | ||||
| writeln(BA2); | ||||
| writeln(); | ||||
|  | ||||
|  | ||||
|  | ||||
| // | ||||
| // Next, we'll perform a similar computation for the Cyclic distribution. | ||||
| // Cyclic distributions start at a designated n-dimensional index and | ||||
| // distribute the n-dimensional space across an n-dimensional array | ||||
| // of locales in a round-robin fashion (in each dimension).  As with | ||||
| // the Block distribution, domains may be declared using the | ||||
| // distribution who have lower indices that the starting index; that | ||||
| // value should just be considered a parameterization of how the | ||||
| // distribution is defined. | ||||
| // | ||||
| const CyclicSpace = Space dmapped Cyclic(startIdx=Space.low); | ||||
| var CA: [CyclicSpace] int; | ||||
|  | ||||
| forall ca in CA do | ||||
|   ca = here.id; | ||||
|  | ||||
| writeln("Cyclic Array Index Map"); | ||||
| writeln(CA); | ||||
| writeln(); | ||||
|  | ||||
|  | ||||
| // | ||||
| // Next, we'll declare a Block-Cyclic distribution.  These | ||||
| // distributions also deal out indices in a round-robin fashion, | ||||
| // but rather than dealing out singleton indices, they deal out blocks | ||||
| // of indices.  Thus, the BlockCyclic distribution is parameterized | ||||
| // by a starting index (as with Cyclic) and a block size (per | ||||
| // dimension) specifying how large the chunks to be dealt out are. | ||||
| //  | ||||
| const BlkCycSpace = Space dmapped BlockCyclic(startIdx=Space.low,  | ||||
|                                               blocksize=(2, 3)); | ||||
| var BCA: [BlkCycSpace] int; | ||||
|  | ||||
| forall bca in BCA do | ||||
|   bca = here.id; | ||||
|  | ||||
| writeln("Block-Cyclic Array Index Map"); | ||||
| writeln(BCA); | ||||
| writeln(); | ||||
|  | ||||
|  | ||||
| // | ||||
| // The ReplicatedDist distribution is different: each of the | ||||
| // original domain's indices - and the corresponding array elements - | ||||
| // is replicated onto each locale. (Note: consistency among these | ||||
| // array replicands is NOT maintained automatically.) | ||||
| // | ||||
| // This replication is observable in some cases but not others, | ||||
| // as shown below. Note: this behavior may change in the future. | ||||
| // | ||||
| const ReplicatedSpace = Space dmapped ReplicatedDist(); | ||||
| var RA: [ReplicatedSpace] int; | ||||
|  | ||||
| // The replication is observable - this visits each replicand. | ||||
| forall ra in RA do | ||||
|   ra = here.id; | ||||
|  | ||||
| writeln("Replicated Array Index Map, ", RA.numElements, " elements total"); | ||||
| writeln(RA); | ||||
| writeln(); | ||||
|  | ||||
| // | ||||
| // The replication is observable when the replicated array is | ||||
| // on the left-hand side. If the right-hand side is not replicated, | ||||
| // it is copied into each replicand. | ||||
| // We illustrate this using a non-distributed array. | ||||
| // | ||||
| var A: [Space] int = [(i,j) in Space] i*100 + j; | ||||
| RA = A; | ||||
| writeln("Replicated Array after being array-assigned into"); | ||||
| writeln(RA); | ||||
| writeln(); | ||||
|  | ||||
| // | ||||
| // Analogously, each replicand will be visited and | ||||
| // other participated expressions will be computed on each locale | ||||
| // (a) when the replicated array is assigned a scalar: | ||||
| //       RA = 5; | ||||
| // (b) when it appears first in a zippered forall loop: | ||||
| //       forall (ra, a) in zip(RA, A) do ...; | ||||
| // (c) when it appears in a for loop: | ||||
| //       for ra in RA do ...; | ||||
| // | ||||
| // Zippering (RA,A) or (A,RA) in a 'for' loop will generate | ||||
| // an error due to their different number of elements. | ||||
|  | ||||
| // Let RA store the Index Map again, for the examples below. | ||||
| forall ra in RA do | ||||
|   ra = here.id; | ||||
|  | ||||
| // | ||||
| // Only the local replicand is accessed - replication is NOT observable | ||||
| // and consistency is NOT maintained - when: | ||||
| // (a) the replicated array is indexed - an individual element is read... | ||||
| // | ||||
| on Locales(0) do | ||||
|   writeln("on ", here, ": ", RA(Space.low)); | ||||
| on Locales(LocaleSpace.high) do | ||||
|   writeln("on ", here, ": ", RA(Space.low)); | ||||
| writeln(); | ||||
|  | ||||
| // ...or an individual element is written; | ||||
| on Locales(LocaleSpace.high) do | ||||
|   RA(Space.low) = 7777; | ||||
|  | ||||
| writeln("Replicated Array after being indexed into"); | ||||
| writeln(RA); | ||||
| writeln(); | ||||
|  | ||||
| // | ||||
| // (b) the replicated array is on the right-hand side of an assignment... | ||||
| // | ||||
| on Locales(LocaleSpace.high) do | ||||
|   A = RA + 4; | ||||
| writeln("Non-Replicated Array after assignment from Replicated Array + 4"); | ||||
| writeln(A); | ||||
| writeln(); | ||||
|  | ||||
| // | ||||
| // (c) ...or, generally, the replicated array or domain participates | ||||
| //     in a zippered forall loop, but not in the first position. | ||||
| //     The loop could look like: | ||||
| // | ||||
| //       forall (a, (i,j), ra) in (A, ReplicatedSpace, RA) do ...; | ||||
| // | ||||
|  | ||||
|  | ||||
| // | ||||
| // The DimensionalDist2D distribution lets us build a 2D distribution | ||||
| // as a composition of specifiers for individual dimensions. | ||||
| // Under such a "dimensional" distribution each dimension is handled | ||||
| // independently of the other. | ||||
| // | ||||
| // The dimension specifiers are similar to the corresponding multi-dimensional | ||||
| // distributions in constructor arguments and index-to-locale mapping rules. | ||||
| // However, instead of an array of locales, a specifier constructor | ||||
| // accepts just the number of locales that the indices in the corresponding | ||||
| // dimension will be distributed across. | ||||
| // | ||||
| // The DimensionalDist2D constructor requires: | ||||
| // * an [0..nl1-1, 0..nl2-1] array of locales, where | ||||
| //   nl1 and nl2 are the number of locales in each dimension, and | ||||
| // * two dimension specifiers, created for nl1 and nl2 locale counts, resp. | ||||
| // | ||||
| // Presently, the following dimension specifiers are available | ||||
| // (shown here with their constructor arguments): | ||||
| // | ||||
| // * ReplicatedDim(numLocales) | ||||
| // * BlockDim(numLocales, boundingBoxLow, boundingBoxHigh) | ||||
| // * BlockCyclicDim(lowIdx, blockSize, numLocales) | ||||
| // | ||||
|  | ||||
| // | ||||
| // The following example creates a dimensional distribution that | ||||
| // replicates over 2 locales (when available) in the first dimemsion | ||||
| // and distributes using block-cyclic distribution in the second dimension. | ||||
| // The example computes nl1 and nl2 and reshapes MyLocales correspondingly. | ||||
| // | ||||
|  | ||||
| var (nl1, nl2) = if numLocales == 1 then (1, 1) else (2, numLocales/2); | ||||
| MyLocaleView = {0..#nl1, 0..#nl2}; | ||||
| MyLocales = reshape(Locales[0..#nl1*nl2], MyLocaleView); | ||||
|  | ||||
| const DimReplicatedBlockcyclicSpace = Space | ||||
|   dmapped DimensionalDist2D(MyLocales, | ||||
|                             new ReplicatedDim(numLocales = nl1), | ||||
|                             new BlockCyclicDim(numLocales = nl2, | ||||
|                                                lowIdx = 1, blockSize = 2)); | ||||
|  | ||||
| var DRBA: [DimReplicatedBlockcyclicSpace] int; | ||||
|  | ||||
| // The ReplicatedDim specifier always accesses the local replicand. | ||||
| // (This differs from how the ReplicatedDist distribution works.) | ||||
| // | ||||
| // This example visits each replicand. The behavior is the same | ||||
| // regardless of the second index into MyLocales below. | ||||
|  | ||||
| for locId1 in 0..#nl1 do on MyLocales[locId1, 0] { | ||||
|  | ||||
|   forall drba in DRBA do | ||||
|     drba = here.id; | ||||
|  | ||||
|   writeln("Dimensional2D(Replicated,BlockCyclic) Array Index Map", | ||||
|           " from ", here); | ||||
|  | ||||
|   // Technicality: 'writeln(DRBA)' would read DRBA always on Locale 0. | ||||
|   // Since we want to see what DRBA contains on the current locale, | ||||
|   // we use 'Helper' that is mapped using the default distribution. | ||||
|   // 'Helper = DRBA' captures the view of DRBA on the current locale, | ||||
|   // which we then print out. | ||||
|  | ||||
|   const Helper: [Space] int = DRBA; | ||||
|   writeln(Helper); | ||||
|   writeln(); | ||||
|  | ||||
| } | ||||
							
								
								
									
										1
									
								
								samples/Chapel/hello.chpl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								samples/Chapel/hello.chpl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| writeln("Hello, world!");    // print 'Hello, world!' to the console | ||||
							
								
								
									
										1692
									
								
								samples/Chapel/lulesh.chpl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1692
									
								
								samples/Chapel/lulesh.chpl
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										147
									
								
								samples/Chapel/nbody.chpl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										147
									
								
								samples/Chapel/nbody.chpl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,147 @@ | ||||
| /* The Computer Language Benchmarks Game | ||||
|    http://benchmarksgame.alioth.debian.org/ | ||||
|  | ||||
|    contributed by Albert Sidelnik | ||||
|    modified by Brad Chamberlain | ||||
| */ | ||||
|  | ||||
|  | ||||
| // | ||||
| // The number of timesteps to simulate; may be set via the command-line | ||||
| // | ||||
| config const n = 10000; | ||||
|  | ||||
| // | ||||
| // Constants representing pi, the solar mass, and the number of days per year | ||||
| // | ||||
| const pi = 3.141592653589793, | ||||
|       solarMass = 4 * pi**2, | ||||
|       daysPerYear = 365.24; | ||||
|  | ||||
| // | ||||
| // a record representing one of the bodies in the solar system | ||||
| // | ||||
| record body { | ||||
|   var pos: 3*real; | ||||
|   var v: 3*real; | ||||
|   var mass: real;  // does not change after it is set up | ||||
| } | ||||
|  | ||||
| // | ||||
| // the array of bodies that we'll be simulating | ||||
| // | ||||
| var bodies = [/* sun */ | ||||
|               new body(mass = solarMass), | ||||
|  | ||||
|               /* jupiter */ | ||||
|               new body(pos = ( 4.84143144246472090e+00, | ||||
|                               -1.16032004402742839e+00, | ||||
|                               -1.03622044471123109e-01), | ||||
|                          v = ( 1.66007664274403694e-03 * daysPerYear, | ||||
|                                7.69901118419740425e-03 * daysPerYear, | ||||
|                               -6.90460016972063023e-05 * daysPerYear), | ||||
|                       mass =   9.54791938424326609e-04 * solarMass), | ||||
|    | ||||
|               /* saturn */ | ||||
|               new body(pos = ( 8.34336671824457987e+00, | ||||
|                                4.12479856412430479e+00, | ||||
|                               -4.03523417114321381e-01), | ||||
|                          v = (-2.76742510726862411e-03 * daysPerYear, | ||||
|                                4.99852801234917238e-03 * daysPerYear, | ||||
|                                2.30417297573763929e-05 * daysPerYear), | ||||
|                       mass =   2.85885980666130812e-04 * solarMass), | ||||
|  | ||||
|               /* uranus */ | ||||
|               new body(pos = ( 1.28943695621391310e+01, | ||||
|                               -1.51111514016986312e+01, | ||||
|                               -2.23307578892655734e-01), | ||||
|                          v = ( 2.96460137564761618e-03 * daysPerYear, | ||||
|                                2.37847173959480950e-03 * daysPerYear, | ||||
|                               -2.96589568540237556e-05 * daysPerYear), | ||||
|                       mass =   4.36624404335156298e-05 * solarMass), | ||||
|  | ||||
|               /* neptune */ | ||||
|               new body(pos = ( 1.53796971148509165e+01, | ||||
|                               -2.59193146099879641e+01, | ||||
|                                1.79258772950371181e-01), | ||||
|                          v = ( 2.68067772490389322e-03 * daysPerYear, | ||||
|                                1.62824170038242295e-03 * daysPerYear, | ||||
|                               -9.51592254519715870e-05 * daysPerYear), | ||||
|                       mass =   5.15138902046611451e-05 * solarMass) | ||||
|               ]; | ||||
|  | ||||
| // | ||||
| // the number of bodies to be simulated | ||||
| // | ||||
| const numbodies = bodies.numElements; | ||||
|  | ||||
| // | ||||
| // The computation involves initializing the sun's velocity, | ||||
| // writing the initial energy, advancing the system through 'n' | ||||
| // timesteps, and writing the final energy. | ||||
| // | ||||
| proc main() { | ||||
|   initSun(); | ||||
|  | ||||
|   writef("%.9r\n", energy()); | ||||
|   for 1..n do | ||||
|     advance(0.01); | ||||
|   writef("%.9r\n", energy()); | ||||
| } | ||||
|  | ||||
| // | ||||
| // compute the sun's initial velocity | ||||
| // | ||||
| proc initSun() { | ||||
|   const p = + reduce (for b in bodies do (b.v * b.mass)); | ||||
|   bodies[1].v = -p / solarMass; | ||||
| } | ||||
|  | ||||
| // | ||||
| // advance the positions and velocities of all the bodies | ||||
| // | ||||
| proc advance(dt) { | ||||
|   for i in 1..numbodies { | ||||
|     for j in i+1..numbodies { | ||||
|       updateVelocities(bodies[i], bodies[j]); | ||||
|        | ||||
|       inline proc updateVelocities(ref b1, ref b2) { | ||||
|         const dpos = b1.pos - b2.pos, | ||||
|                mag = dt / sqrt(sumOfSquares(dpos))**3; | ||||
|          | ||||
|         b1.v -= dpos * b2.mass * mag; | ||||
|         b2.v += dpos * b1.mass * mag; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|    | ||||
|   for b in bodies do | ||||
|     b.pos += dt * b.v; | ||||
| } | ||||
|  | ||||
| // | ||||
| // compute the energy of the bodies | ||||
| // | ||||
| proc energy() { | ||||
|   var e = 0.0; | ||||
|    | ||||
|   for i in 1..numbodies { | ||||
|     const b1 = bodies[i]; | ||||
|      | ||||
|     e += 0.5 * b1.mass * sumOfSquares(b1.v); | ||||
|      | ||||
|     for j in i+1..numbodies { | ||||
|       const b2 = bodies[j]; | ||||
|        | ||||
|       e -= (b1.mass * b2.mass) / sqrt(sumOfSquares(b1.pos - b2.pos)); | ||||
|     } | ||||
|   } | ||||
|    | ||||
|   return e; | ||||
| } | ||||
|  | ||||
| // | ||||
| // a helper routine to compute the sum of squares of a 3-tuple's components | ||||
| // | ||||
| inline proc sumOfSquares(x) | ||||
|   return x(1)**2 + x(2)**2 + x(3)**2; | ||||
							
								
								
									
										145
									
								
								samples/Chapel/quicksort.chpl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										145
									
								
								samples/Chapel/quicksort.chpl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,145 @@ | ||||
| // | ||||
| // An example of a parallel quick sort implementation that uses | ||||
| // "cobegin" to make each recursive call in parallel and "serial" to | ||||
| // limit the number of threads. | ||||
| // | ||||
|  | ||||
| use Random, Time; // for random number generation and the Timer class | ||||
|  | ||||
| var timer: Timer; // to time the sort | ||||
|  | ||||
| config var n: int = 2**15;      // the size of the array to be sorted | ||||
| config var thresh: int = 1;     // the recursive depth to serialize | ||||
| config var verbose: int = 0;    // print out this many elements in array | ||||
| config var timing: bool = true; // set timing to false to disable timer | ||||
|  | ||||
| var A: [1..n] real; // array of real numbers | ||||
|  | ||||
| // | ||||
| // initialize array with random numbers | ||||
| // | ||||
| fillRandom(A); | ||||
|  | ||||
| // | ||||
| // print out front of array if verbose flag is set | ||||
| // | ||||
| if verbose > 0 then | ||||
|   writeln("A[1..", verbose, "] = ", A[1..verbose]); | ||||
|  | ||||
| // | ||||
| // start timer, call parallel quick sort routine, stop timer | ||||
| // | ||||
| if timing then timer.start(); | ||||
| pqsort(A, thresh); | ||||
| if timing then timer.stop(); | ||||
|  | ||||
| // | ||||
| // report sort time | ||||
| // | ||||
| if timing then writeln("sorted in ", timer.elapsed(), " seconds"); | ||||
|  | ||||
| // | ||||
| // print out front of array if verbose flag is set | ||||
| //   values should now be in sorted order | ||||
| // | ||||
| if verbose > 0 then | ||||
|   writeln("A[1..", verbose, "] = ", A[1..verbose]); | ||||
|  | ||||
| // | ||||
| // verify that array is sorted or halt | ||||
| // | ||||
| for i in 2..n do | ||||
|   if A(i) < A(i-1) then | ||||
|     halt("A(", i-1, ") == ", A(i-1), " > A(", i, ") == ", A(i)); | ||||
|  | ||||
| writeln("verification success"); | ||||
|  | ||||
| // | ||||
| // pqsort -- parallel quick sort | ||||
| // | ||||
| //   arr: generic 1D array of values (real, int, ...) | ||||
| //   thresh: number of recursive calls to make before serializing | ||||
| //   low: lower bound of array to start sort at, defaults to whole array | ||||
| //   high: upper bound of array to stop sort at, defaults to whole array | ||||
| // | ||||
| proc pqsort(arr: [], | ||||
|            thresh: int, | ||||
|            low: int = arr.domain.low, | ||||
|            high: int = arr.domain.high) where arr.rank == 1 { | ||||
|  | ||||
|   // | ||||
|   // base case: arr[low..high] is small enough to bubble sort | ||||
|   // | ||||
|   if high - low < 8 { | ||||
|     bubbleSort(arr, low, high); | ||||
|     return; | ||||
|   } | ||||
|  | ||||
|   // | ||||
|   // determine pivot and partition arr[low..high] | ||||
|   // | ||||
|   const pivotVal = findPivot(); | ||||
|   const pivotLoc = partition(pivotVal); | ||||
|  | ||||
|   // | ||||
|   // make recursive calls to parallel quick sort each unsorted half of | ||||
|   // the array; if thresh is 0 or less, start executing conquer tasks | ||||
|   // serially | ||||
|   // | ||||
|   serial thresh <= 0 do cobegin { | ||||
|     pqsort(arr, thresh-1, low, pivotLoc-1); | ||||
|     pqsort(arr, thresh-1, pivotLoc+1, high); | ||||
|   } | ||||
|  | ||||
|   // | ||||
|   // findPivot -- helper routine to find pivot value using simple | ||||
|   //              median-of-3 method, returns pivot value | ||||
|   // | ||||
|   proc findPivot() { | ||||
|     const mid = low + (high-low+1) / 2; | ||||
|  | ||||
|     if arr(mid) < arr(low) then arr(mid) <=> arr(low); | ||||
|     if arr(high) < arr(low) then arr(high) <=> arr(low); | ||||
|     if arr(high) < arr(mid) then arr(high) <=> arr(mid); | ||||
|  | ||||
|     const pivotVal = arr(mid); | ||||
|     arr(mid) = arr(high-1); | ||||
|     arr(high-1) = pivotVal; | ||||
|  | ||||
|     return pivotVal; | ||||
|   } | ||||
|  | ||||
|   // | ||||
|   // partition -- helper routine to partition array such that all | ||||
|   //              values less than pivot are to its left and all | ||||
|   //              values greater than pivot are to its right, returns | ||||
|   //              pivot location | ||||
|   // | ||||
|   proc partition(pivotVal) { | ||||
|     var ilo = low, ihi = high-1; | ||||
|     while (ilo < ihi) { | ||||
|       do { ilo += 1; } while arr(ilo) < pivotVal; | ||||
|       do { ihi -= 1; } while pivotVal < arr(ihi); | ||||
|       if (ilo < ihi) { | ||||
|         arr(ilo) <=> arr(ihi); | ||||
|       } | ||||
|     } | ||||
|     arr(high-1) = arr(ilo); | ||||
|     arr(ilo) = pivotVal; | ||||
|     return ilo; | ||||
|   } | ||||
| } | ||||
|  | ||||
| // | ||||
| // bubbleSort -- bubble sort for base case of quick sort | ||||
| // | ||||
| //   arr: generic 1D array of values (real, int, ...) | ||||
| //   low: lower bound of array to start sort at | ||||
| //   high: upper bound of array to stop sort at | ||||
| // | ||||
| proc bubbleSort(arr: [], low: int, high: int) where arr.rank == 1 { | ||||
|   for i in low..high do | ||||
|     for j in low..high-1 do | ||||
|       if arr(j) > arr(j+1) then | ||||
|         arr(j) <=> arr(j+1); | ||||
| } | ||||
							
								
								
									
										146
									
								
								samples/Clojure/index.cljs.hl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										146
									
								
								samples/Clojure/index.cljs.hl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,146 @@ | ||||
| ;; Copyright (c) Alan Dipert and Micha Niskin. All rights reserved. | ||||
| ;; The use and distribution terms for this software are covered by the | ||||
| ;; Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php) | ||||
| ;; which can be found in the file epl-v10.html at the root of this distribution. | ||||
| ;; By using this software in any fashion, you are agreeing to be bound by | ||||
| ;; the terms of this license. | ||||
| ;; You must not remove this notice, or any other, from this software. | ||||
|  | ||||
| (page "index.html" | ||||
|   (:refer-clojure :exclude [nth]) | ||||
|   (:require | ||||
|    [tailrecursion.hoplon.reload        :refer [reload-all]] | ||||
|    [tailrecursion.hoplon.util          :refer [nth name pluralize]] | ||||
|    [tailrecursion.hoplon.storage-atom  :refer [local-storage]])) | ||||
|  | ||||
| ;; utility functions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||||
|  | ||||
| (declare route state editing) | ||||
|  | ||||
| (reload-all) | ||||
|  | ||||
| (def mapvi  (comp vec map-indexed)) | ||||
|  | ||||
| (defn dissocv [v i] | ||||
|   (let [z (- (dec (count v)) i)] | ||||
|     (cond (neg?  z) v | ||||
|           (zero? z) (pop v) | ||||
|           (pos?  z) (into (subvec v 0 i) (subvec v (inc i)))))) | ||||
|  | ||||
| (defn decorate [todo route editing i] | ||||
|   (let [{done? :completed text :text} todo] | ||||
|     (-> todo (assoc :editing (= editing i) | ||||
|                     :visible (and (not (empty? text)) | ||||
|                                   (or (= "#/" route) | ||||
|                                       (and (= "#/active" route) (not done?)) | ||||
|                                       (and (= "#/completed" route) done?))))))) | ||||
|  | ||||
| ;; persisted state cell (AKA: stem cell) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||||
|  | ||||
| (def   state        (-> (cell []) (local-storage ::store))) | ||||
|  | ||||
| ;; local state cells ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||||
|  | ||||
| (defc  loaded?      false) | ||||
| (defc  editing      nil) | ||||
| (def   route        (route-cell "#/")) | ||||
|  | ||||
| ;; formula cells (computed state) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||||
|  | ||||
| (defc= completed    (filter :completed state)) | ||||
| (defc= active       (remove :completed state)) | ||||
| (defc= plural-item  (pluralize "item" (count active))) | ||||
| (defc= todos        (mapvi #(list %1 (decorate %2 route editing %1)) state)) | ||||
|  | ||||
| ;; state transition functions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||||
|  | ||||
| (defn  todo        [t]   {:completed false :text t}) | ||||
| (defn  destroy!    [i]   (swap! state dissocv i)) | ||||
| (defn  done!       [i v] (swap! state assoc-in [i :completed] v)) | ||||
| (defn  clear-done! [& _] (swap! state #(vec (remove :completed %)))) | ||||
| (defn  new!        [t]   (when (not (empty? t)) (swap! state conj (todo t)))) | ||||
| (defn  all-done!   [v]   (swap! state #(mapv (fn [x] (assoc x :completed v)) %))) | ||||
| (defn  editing!    [i v] (reset! editing (if v i nil))) | ||||
| (defn  text!       [i v] (if (empty? v) (destroy! i) (swap! state assoc-in [i :text] v))) | ||||
|  | ||||
| ;; page ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||||
|  | ||||
| (html :lang "en" | ||||
|   (head | ||||
|     (meta :charset "utf-8") | ||||
|     (meta :http-equiv "X-UA-Compatible" :content "IE=edge,chrome=1") | ||||
|     (link :rel "stylesheet" :href "base.css") | ||||
|     (title "Hoplon • TodoMVC")) | ||||
|   (body | ||||
|     (noscript | ||||
|       (div :id "noscript" | ||||
|         (p "JavaScript is required to view this page."))) | ||||
|     (div | ||||
|       (section :id "todoapp" | ||||
|         (header :id "header" | ||||
|           (h1 "todos") | ||||
|           (form :on-submit #(do (new! (val-id :new-todo)) | ||||
|                                 (do! (by-id :new-todo) :value "")) | ||||
|             (input | ||||
|               :id "new-todo" | ||||
|               :type "text" | ||||
|               :autofocus true | ||||
|               :placeholder "What needs to be done?" | ||||
|               :on-blur #(do! (by-id :new-todo) :value "")))) | ||||
|         (section | ||||
|           :id "main" | ||||
|           :do-toggle (cell= (not (and (empty? active) (empty? completed)))) | ||||
|           (input | ||||
|             :id "toggle-all" | ||||
|             :type "checkbox" | ||||
|             :do-attr (cell= {:checked (empty? active)})  | ||||
|             :on-click #(all-done! (val-id :toggle-all))) | ||||
|           (label :for "toggle-all" | ||||
|             "Mark all as complete") | ||||
|           (ul :id "todo-list" | ||||
|             (loop-tpl | ||||
|               :reverse true | ||||
|               :bind-ids [done# edit#] | ||||
|               :bindings [[i {edit? :editing done? :completed todo-text :text show? :visible}] todos]  | ||||
|               (li | ||||
|                 :do-class (cell= {:completed done? :editing edit?})  | ||||
|                 :do-toggle show? | ||||
|                 (div :class "view" :on-dblclick #(editing! @i true) | ||||
|                   (input | ||||
|                     :id done#  | ||||
|                     :type "checkbox" | ||||
|                     :class "toggle" | ||||
|                     :do-attr (cell= {:checked done?})  | ||||
|                     :on-click #(done! @i (val-id done#))) | ||||
|                   (label (text "~{todo-text}")) | ||||
|                   (button | ||||
|                     :type "submit" | ||||
|                     :class "destroy" | ||||
|                     :on-click  #(destroy! @i))) | ||||
|                 (form :on-submit #(editing! @i false) | ||||
|                   (input | ||||
|                     :id edit# | ||||
|                     :type "text" | ||||
|                     :class "edit" | ||||
|                     :do-value todo-text | ||||
|                     :do-focus edit? | ||||
|                     :on-blur #(when @edit? (editing! @i false)) | ||||
|                     :on-change #(when @edit? (text! @i (val-id edit#))))))))) | ||||
|         (footer  | ||||
|           :id "footer" | ||||
|           :do-toggle (cell= (not (and (empty? active) (empty? completed)))) | ||||
|           (span :id "todo-count" | ||||
|             (strong (text "~(count active) ")) | ||||
|             (span (text "~{plural-item} left"))) | ||||
|           (ul :id "filters" | ||||
|             (li (a :href "#/"          :do-class (cell= {:selected (= "#/" route)})          "All")) | ||||
|             (li (a :href "#/active"    :do-class (cell= {:selected (= "#/active" route)})    "Active")) | ||||
|             (li (a :href "#/completed" :do-class (cell= {:selected (= "#/completed" route)}) "Completed"))) | ||||
|           (button | ||||
|             :type      "submit" | ||||
|             :id        "clear-completed" | ||||
|             :on-click  #(clear-done!) | ||||
|             (text "Clear completed (~(count completed))")))) | ||||
|       (footer :id "info"  | ||||
|         (p "Double-click to edit a todo") | ||||
|         (p "Part of " (a :href "http://github.com/tailrecursion/hoplon-demos/" "hoplon-demos"))))))  | ||||
							
								
								
									
										239
									
								
								samples/ColdFusion CFC/exampleScript.cfc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										239
									
								
								samples/ColdFusion CFC/exampleScript.cfc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,239 @@ | ||||
| /** | ||||
| ******************************************************************************** | ||||
| ContentBox - A Modular Content Platform | ||||
| Copyright 2012 by Luis Majano and Ortus Solutions, Corp | ||||
| www.gocontentbox.org | www.luismajano.com | www.ortussolutions.com | ||||
| ******************************************************************************** | ||||
| Apache License, Version 2.0 | ||||
|  | ||||
| Copyright Since [2012] [Luis Majano and Ortus Solutions,Corp] | ||||
|  | ||||
| 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 generic content service for content objects | ||||
| */ | ||||
| component extends="coldbox.system.orm.hibernate.VirtualEntityService" singleton{ | ||||
|  | ||||
| 	// DI | ||||
| 	property name="settingService"			inject="id:settingService@cb"; | ||||
| 	property name="cacheBox"				inject="cachebox"; | ||||
| 	property name="log"						inject="logbox:logger:{this}"; | ||||
| 	property name="customFieldService" 	 	inject="customFieldService@cb"; | ||||
| 	property name="categoryService" 	 	inject="categoryService@cb"; | ||||
| 	property name="commentService" 	 		inject="commentService@cb"; | ||||
| 	property name="contentVersionService"	inject="contentVersionService@cb"; | ||||
| 	property name="authorService"			inject="authorService@cb"; | ||||
| 	property name="populator"				inject="wirebox:populator"; | ||||
| 	property name="systemUtil"				inject="SystemUtil@cb"; | ||||
| 	 | ||||
| 	/* | ||||
| 	* Constructor | ||||
| 	* @entityName.hint The content entity name to bind this service to. | ||||
| 	*/ | ||||
| 	ContentService function init(entityName="cbContent"){ | ||||
| 		// init it | ||||
| 		super.init(entityName=arguments.entityName, useQueryCaching=true); | ||||
|  | ||||
| 		// Test scope coloring in pygments | ||||
| 		this.colorTestVar = "Just for testing pygments!"; | ||||
| 		cookie.colorTestVar = ""; | ||||
| 		client.colorTestVar = "" | ||||
| 		session.colorTestVar = ""; | ||||
| 		application.colorTestVar = ""; | ||||
|  | ||||
| 		return this; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	* Clear all content caches | ||||
| 	* @async.hint Run it asynchronously or not, defaults to false | ||||
| 	*/ | ||||
| 	function clearAllCaches(boolean async=false){ | ||||
| 		var settings = settingService.getAllSettings(asStruct=true); | ||||
| 		// Get appropriate cache provider | ||||
| 		var cache = cacheBox.getCache( settings.cb_content_cacheName ); | ||||
| 		cache.clearByKeySnippet(keySnippet="cb-content",async=arguments.async); | ||||
| 		return this; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	* Clear all page wrapper caches | ||||
| 	* @async.hint Run it asynchronously or not, defaults to false | ||||
| 	*/ | ||||
| 	function clearAllPageWrapperCaches(boolean async=false){ | ||||
| 		var settings = settingService.getAllSettings(asStruct=true); | ||||
| 		// Get appropriate cache provider | ||||
| 		var cache = cacheBox.getCache( settings.cb_content_cacheName ); | ||||
| 		cache.clearByKeySnippet(keySnippet="cb-content-pagewrapper",async=arguments.async); | ||||
| 		return this; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	* Clear all page wrapper caches | ||||
| 	* @slug.hint The slug partial to clean on | ||||
| 	* @async.hint Run it asynchronously or not, defaults to false | ||||
| 	*/ | ||||
| 	function clearPageWrapperCaches(required any slug, boolean async=false){ | ||||
| 		var settings = settingService.getAllSettings(asStruct=true); | ||||
| 		// Get appropriate cache provider | ||||
| 		var cache = cacheBox.getCache( settings.cb_content_cacheName ); | ||||
| 		cache.clearByKeySnippet(keySnippet="cb-content-pagewrapper-#arguments.slug#",async=arguments.async); | ||||
| 		return this; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	* Clear a page wrapper cache | ||||
| 	* @slug.hint The slug to clean | ||||
| 	* @async.hint Run it asynchronously or not, defaults to false | ||||
| 	*/ | ||||
| 	function clearPageWrapper(required any slug, boolean async=false){ | ||||
| 		var settings = settingService.getAllSettings(asStruct=true); | ||||
| 		// Get appropriate cache provider | ||||
| 		var cache = cacheBox.getCache( settings.cb_content_cacheName ); | ||||
| 		cache.clear("cb-content-pagewrapper-#arguments.slug#/"); | ||||
| 		return this; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	* Searches published content with cool paramters, remember published content only | ||||
| 	* @searchTerm.hint The search term to search | ||||
| 	* @max.hint The maximum number of records to paginate | ||||
| 	* @offset.hint The offset in the pagination | ||||
| 	* @asQuery.hint Return as query or array of objects, defaults to array of objects | ||||
| 	* @sortOrder.hint The sorting of the search results, defaults to publishedDate DESC | ||||
| 	* @isPublished.hint Search for published, non-published or both content objects [true, false, 'all'] | ||||
| 	* @searchActiveContent.hint Search only content titles or both title and active content. Defaults to both. | ||||
| 	*/ | ||||
| 	function searchContent( | ||||
| 		any searchTerm="",  | ||||
| 		numeric max=0,  | ||||
| 		numeric offset=0,  | ||||
| 		boolean asQuery=false,  | ||||
| 		any sortOrder="publishedDate DESC",  | ||||
| 		any isPublished=true,  | ||||
| 		boolean searchActiveContent=true){ | ||||
|  | ||||
| 		var results = {}; | ||||
| 		var c = newCriteria(); | ||||
|  | ||||
| 		// only published content | ||||
| 		if( isBoolean( arguments.isPublished ) ){ | ||||
| 			// Published bit | ||||
| 			c.isEq( "isPublished", javaCast( "Boolean", arguments.isPublished ) ); | ||||
| 			// Published eq true evaluate other params | ||||
| 			if( arguments.isPublished ){ | ||||
| 				c.isLt("publishedDate", now() ) | ||||
| 				.$or( c.restrictions.isNull("expireDate"), c.restrictions.isGT("expireDate", now() ) ) | ||||
| 				.isEq("passwordProtection",""); | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		// Search Criteria | ||||
| 		if( len( arguments.searchTerm ) ){ | ||||
| 			// like disjunctions | ||||
| 			c.createAlias("activeContent","ac"); | ||||
| 			// Do we search title and active content or just title? | ||||
| 			if( arguments.searchActiveContent ){ | ||||
| 				c.$or( c.restrictions.like("title","%#arguments.searchTerm#%"), | ||||
| 				  	  c.restrictions.like("ac.content", "%#arguments.searchTerm#%") ); | ||||
| 			} | ||||
| 			else{ | ||||
| 				c.like( "title", "%#arguments.searchTerm#%" );  | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		// run criteria query and projections count | ||||
| 		results.count = c.count( "contentID" ); | ||||
| 		results.content = c.resultTransformer( c.DISTINCT_ROOT_ENTITY ) | ||||
| 							.list(offset=arguments.offset, max=arguments.max, sortOrder=arguments.sortOrder, asQuery=arguments.asQuery); | ||||
| 	 | ||||
| 		return results; | ||||
| 	} | ||||
|  | ||||
| /********************************************* PRIVATE *********************************************/ | ||||
| 	 | ||||
|  | ||||
| 	/** | ||||
| 	* Update the content hits | ||||
| 	* @contentID.hint The content id to update | ||||
| 	*/ | ||||
| 	private function syncUpdateHits(required contentID){ | ||||
| 		var q = new Query(sql="UPDATE cb_content SET hits = hits + 1 WHERE contentID = #arguments.contentID#").execute(); | ||||
| 		return this; | ||||
| 	} | ||||
| 	 | ||||
| 	 | ||||
| 	private function closureTest(){ | ||||
| 		methodCall( | ||||
| 			param1, | ||||
| 			function( arg1, required arg2 ){ | ||||
| 				var settings = settingService.getAllSettings(asStruct=true); | ||||
| 				// Get appropriate cache provider | ||||
| 				var cache = cacheBox.getCache( settings.cb_content_cacheName ); | ||||
| 				cache.clear("cb-content-pagewrapper-#arguments.slug#/"); | ||||
| 				return this; | ||||
| 			}, | ||||
| 			param1 | ||||
| 		); | ||||
| 	} | ||||
| 	 | ||||
| 	private function StructliteralTest(){ | ||||
| 		return { | ||||
| 			foo = bar, | ||||
| 			brad = 'Wood', | ||||
| 			func = function( arg1, required arg2 ){ | ||||
| 				var settings = settingService.getAllSettings(asStruct=true); | ||||
| 				// Get appropriate cache provider | ||||
| 				var cache = cacheBox.getCache( settings.cb_content_cacheName ); | ||||
| 				cache.clear("cb-content-pagewrapper-#arguments.slug#/"); | ||||
| 				return this; | ||||
| 			}, | ||||
| 			array = [ | ||||
| 				1, | ||||
| 				2, | ||||
| 				3, | ||||
| 				4, | ||||
| 				5, | ||||
| 				'test', | ||||
| 				'testing', | ||||
| 				'testerton', | ||||
| 				{ | ||||
| 					foo = true, | ||||
| 					brad = false, | ||||
| 					wood = null | ||||
| 				} | ||||
| 			], | ||||
| 			last = "final" | ||||
| 		}; | ||||
| 	} | ||||
| 	 | ||||
| 	private function arrayliteralTest(){ | ||||
| 		return [ | ||||
| 			1, | ||||
| 			2, | ||||
| 			3, | ||||
| 			4, | ||||
| 			5, | ||||
| 			'test', | ||||
| 			'testing', | ||||
| 			'testerton', | ||||
| 			{ | ||||
| 				foo = true, | ||||
| 				brad = false, | ||||
| 				wood = null | ||||
| 			}, | ||||
| 			'testy-von-testavich' | ||||
| 		]; | ||||
| 	} | ||||
| 	 | ||||
| } | ||||
							
								
								
									
										18
									
								
								samples/ColdFusion CFC/exampleTag.cfc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								samples/ColdFusion CFC/exampleTag.cfc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,18 @@ | ||||
| <cfcomponent> | ||||
| 	 | ||||
| 	<cffunction name="init" access="public" returntype="any"> | ||||
| 		<cfargument name="arg1" type="any" required="true"> | ||||
| 		<cfset this.myVariable = arguments.arg1> | ||||
|  | ||||
| 		<cfreturn this> | ||||
| 	</cffunction> | ||||
|  | ||||
| 	<cffunction name="testFunc" access="private" returntype="void"> | ||||
| 		<cfargument name="arg1" type="any" required="false"> | ||||
| 		 | ||||
| 		<cfif structKeyExists(arguments, "arg1")> | ||||
| 			<cfset writeoutput("Argument exists")> | ||||
| 		</cfif> | ||||
| 	</cffunction> | ||||
| 	 | ||||
| </cfcomponent> | ||||
							
								
								
									
										50
									
								
								samples/ColdFusion/example.cfm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								samples/ColdFusion/example.cfm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,50 @@ | ||||
| <!--- cfcomment ---> | ||||
| <!--- nested <!--- cfcomment ---> ---> | ||||
| <!--- multi-line | ||||
| nested | ||||
| <!--- | ||||
| cfcomment | ||||
| ---> | ||||
| ---> | ||||
| <!-- html comment --> | ||||
| <html> | ||||
| <head> | ||||
| <title>Date Functions</title> | ||||
| </head> | ||||
| <body> | ||||
| <cfset RightNow = Now()> | ||||
| <cfoutput> | ||||
|  #RightNow#<br /> | ||||
|  #DateFormat(RightNow)#<br /> | ||||
|  #DateFormat(RightNow,"mm/dd/yy")#<br /> | ||||
|  #TimeFormat(RightNow)#<br /> | ||||
|  #TimeFormat(RightNow,"hh:mm tt")#<br /> | ||||
|  #IsDate(RightNow)#<br /> | ||||
|  #IsDate("January 31, 2007")#<br /> | ||||
|  #IsDate("foo")#<br /> | ||||
|  #DaysInMonth(RightNow)# | ||||
| </cfoutput> | ||||
| <cfset x="x"> | ||||
| <cfset y="y"> | ||||
| <cfset z="z"> | ||||
| <cfoutput group="x"> | ||||
|     #x# | ||||
|     <cfoutput>#y#</cfoutput> | ||||
|     #z# | ||||
| </cfoutput> | ||||
| </body> | ||||
| </html> | ||||
|  | ||||
| <cfset person = "Paul"> | ||||
| <cfset greeting = "Hello #person#"> | ||||
|  | ||||
| <cfset greeting = "Hello" & " world!"> | ||||
| <cfset a = 5> | ||||
| <cfset b = 10> | ||||
| <cfset c = a^b> | ||||
| <cfset c = a MOD b> | ||||
| <cfset c = a / b> | ||||
| <cfset c = a * b> | ||||
| <cfset c = a + b> | ||||
| <cfset c = a - b> | ||||
| <!--- <!-- another <!--- nested --> ---> comment ---> | ||||
							
								
								
									
										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. | ||||
							
								
								
									
										580
									
								
								samples/Cycript/utils.cy
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										580
									
								
								samples/Cycript/utils.cy
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,580 @@ | ||||
| (function(utils) { | ||||
| 	// Load C functions declared in utils.loadFuncs | ||||
| 	var shouldLoadCFuncs = true; | ||||
| 	// Expose the C functions to cycript's global scope | ||||
| 	var shouldExposeCFuncs = true; | ||||
| 	// Expose C constants to cycript's global scope | ||||
| 	var shouldExposeConsts = true; | ||||
| 	// Expose functions defined here to cycript's global scope | ||||
| 	var shouldExposeFuncs = true; | ||||
| 	// Which functions to expose | ||||
| 	var funcsToExpose = ["exec", "include", "sizeof", "logify", "apply", "str2voidPtr", "voidPtr2str", "double2voidPtr", "voidPtr2double", "isMemoryReadable", "isObject", "makeStruct"]; | ||||
| 	 | ||||
| 	// C functions that utils.loadFuncs loads | ||||
| 	var CFuncsDeclarations = [ | ||||
| 		// <stdlib.h> | ||||
| 		"void *calloc(size_t num, size_t size)", | ||||
| 		// <string.h> | ||||
| 		"char *strcpy(char *restrict dst, const char *restrict src)", | ||||
| 		"char *strdup(const char *s1)", | ||||
| 		"void* memset(void* dest, int ch, size_t count)", | ||||
| 		// <stdio.h> | ||||
| 		"FILE *fopen(const char *, const char *)", | ||||
| 		"int fclose(FILE *)", | ||||
| 		"size_t fread(void *restrict, size_t, size_t, FILE *restrict)", | ||||
| 		"size_t fwrite(const void *restrict, size_t, size_t, FILE *restrict)", | ||||
| 		// <mach.h> | ||||
| 		"mach_port_t mach_task_self()", | ||||
| 		"kern_return_t task_for_pid(mach_port_name_t target_tport, int pid, mach_port_name_t *tn)", | ||||
| 		"kern_return_t mach_vm_protect(vm_map_t target_task, mach_vm_address_t address, mach_vm_size_t size, boolean_t set_maximum, vm_prot_t new_protection)", | ||||
| 		"kern_return_t mach_vm_write(vm_map_t target_task, mach_vm_address_t address, vm_offset_t data, mach_msg_type_number_t dataCnt)", | ||||
| 		"kern_return_t mach_vm_read(vm_map_t target_task, mach_vm_address_t address, mach_vm_size_t size, vm_offset_t *data, mach_msg_type_number_t *dataCnt)", | ||||
| 	]; | ||||
| 	 | ||||
| 	/* | ||||
| 		Replacement for eval that can handle @encode etc. | ||||
| 		 | ||||
| 		Usage: | ||||
| 			cy# utils.exec("@encode(void *(int, char))") | ||||
| 			@encode(void*(int,char)) | ||||
| 	*/ | ||||
| 	utils.exec = function(str) { | ||||
| 		var mkdir = @encode(int (const char *, int))(dlsym(RTLD_DEFAULT, "mkdir")); | ||||
| 		var tempnam = @encode(char *(const char *, const char *))(dlsym(RTLD_DEFAULT, "tempnam")); | ||||
| 		var fopen = @encode(void *(const char *, const char *))(dlsym(RTLD_DEFAULT, "fopen")); | ||||
| 		var fclose = @encode(int (void *))(dlsym(RTLD_DEFAULT, "fclose")); | ||||
| 		var fwrite = @encode(int (const char *, int, int, void *))(dlsym(RTLD_DEFAULT, "fwrite")); | ||||
| 		var symlink = @encode(int (const char *, const char *))(dlsym(RTLD_DEFAULT, "symlink")); | ||||
| 		var unlink = @encode(int (const char *))(dlsym(RTLD_DEFAULT, "unlink")); | ||||
| 		var getenv = @encode(const char *(const char *))(dlsym(RTLD_DEFAULT, "getenv")); | ||||
| 		var setenv = @encode(int (const char *, const char *, int))(dlsym(RTLD_DEFAULT, "setenv")); | ||||
| 		 | ||||
| 		var libdir = "/usr/lib/cycript0.9"; | ||||
| 		var dir = libdir + "/tmp"; | ||||
|  | ||||
| 		mkdir(dir, 0777); | ||||
| 		 | ||||
| 		// This is needed because tempnam seems to ignore the first argument on i386 | ||||
| 		var old_tmpdir = getenv("TMPDIR"); | ||||
| 		setenv("TMPDIR", dir, 1); | ||||
|  | ||||
| 		// No freeing :( | ||||
| 		var f = tempnam(dir, "exec-"); | ||||
| 		setenv("TMPDIR", old_tmpdir, 1); | ||||
| 		if(!f) { | ||||
| 			return false; | ||||
| 		} | ||||
|  | ||||
| 		symlink(f, f + ".cy"); | ||||
| 		 | ||||
| 		str = "exports.result = " + str; | ||||
|  | ||||
| 		var handle = fopen(f, "w"); | ||||
| 		fwrite(str, str.length, 1, handle); | ||||
| 		fclose(handle); | ||||
| 		 | ||||
| 		var r; | ||||
| 		var except = null; | ||||
| 		try { | ||||
| 			r = require(f.replace(libdir + "/", "")); | ||||
| 		} catch(e) { | ||||
| 			except = e; | ||||
| 		} | ||||
|  | ||||
| 		unlink(f + ".cy"); | ||||
| 		unlink(f); | ||||
| 		 | ||||
| 		if(except !== null) { | ||||
| 			throw except; | ||||
| 		} | ||||
|  | ||||
| 		return r.result; | ||||
| 	}; | ||||
| 	 | ||||
| 	/* | ||||
| 		Applies known typedefs | ||||
| 		Used in utils.include and utils.makeStruct | ||||
| 		 | ||||
| 		Usage: | ||||
| 			cy# utils.applyTypedefs("mach_vm_address_t") | ||||
| 			"uint64_t" | ||||
| 	*/ | ||||
| 	utils.applyTypedefs = function(str) { | ||||
| 		var typedefs = { | ||||
| 			"struct": "", | ||||
| 			"restrict": "", | ||||
| 			"FILE": "void", | ||||
| 			"size_t": "uint64_t", | ||||
| 			"uintptr_t": "unsigned long", | ||||
| 			"kern_return_t": "int", | ||||
| 			"mach_port_t": "unsigned int", | ||||
| 			"mach_port_name_t": "unsigned int", | ||||
| 			"vm_offset_t": "unsigned long", | ||||
| 			"vm_size_t": "unsigned long", | ||||
| 			"mach_vm_address_t": "uint64_t", | ||||
| 			"mach_vm_offset_t": "uint64_t", | ||||
| 			"mach_vm_size_t": "uint64_t", | ||||
| 			"vm_map_offset_t": "uint64_t", | ||||
| 			"vm_map_address_t": "uint64_t", | ||||
| 			"vm_map_size_t": "uint64_t", | ||||
| 			"mach_port_context_t": "uint64_t", | ||||
| 			"vm_map_t": "unsigned int", | ||||
| 			"boolean_t": "unsigned int", | ||||
| 			"vm_prot_t": "int", | ||||
| 			"mach_msg_type_number_t": "unsigned int", | ||||
| 			"cpu_type_t": "int", | ||||
| 			"cpu_subtype_t": "int", | ||||
| 			"cpu_threadtype_t": "int", | ||||
| 		}; | ||||
| 		 | ||||
| 		for(var k in typedefs) { | ||||
| 			str = str.replace(new RegExp("(\\s|\\*|,|\\(|^)" + k + "(\\s|\\*|,|\\)|$)", "g"), "$1" + typedefs[k] + "$2"); | ||||
| 		} | ||||
| 		 | ||||
| 		return str; | ||||
| 	}; | ||||
| 	 | ||||
| 	/* | ||||
| 		Parses a C function declaration and returns the function name and cycript type | ||||
| 		If load is true, tries to load it into cycript using utils.exec | ||||
| 		 | ||||
| 		Usage: | ||||
| 			cy# var str = "void *calloc(size_t num, size_t size)"; | ||||
| 			"void *calloc(size_t num, size_t size)" | ||||
| 			cy# utils.include(str) | ||||
| 			["calloc","@encode(void *(uint64_t num,  uint64_t size))(140735674376857)"] | ||||
| 			cy# var ret = utils.include(str, true) | ||||
| 			["calloc",0x7fff93e0e299] | ||||
| 			cy# ret[1].type | ||||
| 			@encode(void*(unsigned long long int,unsigned long long int)) | ||||
| 			cy# ret[1](100, 1) | ||||
| 			0x100444100 | ||||
| 	*/ | ||||
| 	utils.include = function(str, load) { | ||||
| 		var re = /^\s*([^(]*(?:\s+|\*))(\w*)\s*\(([^)]*)\)\s*;?\s*$/; | ||||
| 		var match = re.exec(str); | ||||
| 		if(!match) { | ||||
| 			return -1; | ||||
| 		} | ||||
| 		var rType = utils.applyTypedefs(match[1]); | ||||
| 		var name = match[2]; | ||||
| 		var args = match[3]; | ||||
|  | ||||
| 		var argsRe = /([^,]+)(?:,|$)/g; | ||||
| 		var argsTypes = []; | ||||
| 		while((match = argsRe.exec(args)) !== null) { | ||||
| 			var type = utils.applyTypedefs(match[1]); | ||||
| 			argsTypes.push(type); | ||||
| 		} | ||||
| 		 | ||||
| 		var encodeString = "@encode("; | ||||
| 		encodeString += rType + "("; | ||||
| 		encodeString += argsTypes.join(", ") + "))"; | ||||
|  | ||||
| 		var fun = dlsym(RTLD_DEFAULT, name); | ||||
| 		if(fun !== null) { | ||||
| 			encodeString += "(" + fun + ")"; | ||||
| 			if(load) { | ||||
| 				return [name, utils.exec(encodeString)]; | ||||
| 			} | ||||
| 		} else if(load) { | ||||
| 			throw "Function couldn't be found with dlsym!"; | ||||
| 		} | ||||
|  | ||||
| 		return [name, encodeString]; | ||||
| 	}; | ||||
| 	 | ||||
| 	/* | ||||
| 		Loads the function declaration in the defs array using utils.exec and exposes to cycript's global scope | ||||
| 		Is automatically called if shouldLoadCFuncs is true | ||||
| 	*/ | ||||
| 	utils.funcs = {}; | ||||
| 	utils.loadfuncs = function(expose) { | ||||
| 		for(var i = 0; i < CFuncsDeclarations.length; i++) { | ||||
| 			try { | ||||
| 				var o = utils.include(CFuncsDeclarations[i], true); | ||||
| 				utils.funcs[o[0]] = o[1]; | ||||
| 				if(expose) { | ||||
| 					Cycript.all[o[0]] = o[1]; | ||||
| 				} | ||||
| 			} catch(e) { | ||||
| 				system.print("Failed to load function: " + i); | ||||
| 				try { | ||||
| 					system.print(utils.include(CFuncsDeclarations[i])); | ||||
| 				} catch(e2) { | ||||
| 					 | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	}; | ||||
| 	 | ||||
| 	/* | ||||
| 		Calculates the size of a type like the C operator sizeof | ||||
| 		 | ||||
| 		Usage: | ||||
| 			cy# utils.sizeof(int) | ||||
| 			4 | ||||
| 			cy# utils.sizeof(@encode(void *)) | ||||
| 			8 | ||||
| 			cy# utils.sizeof("mach_vm_address_t") | ||||
| 			8 | ||||
| 	*/ | ||||
| 	utils.sizeof = function(type) { | ||||
| 		if(typeof type === "string") { | ||||
| 			type = utils.applyTypedefs(type); | ||||
| 			type = utils.exec("@encode(" + type + ")"); | ||||
| 		} | ||||
| 		 | ||||
| 		// (const) char * has "infinite" preceision | ||||
| 		if(type.toString().slice(-1) === "*") { | ||||
| 			return utils.sizeof(@encode(void *)); | ||||
| 		} | ||||
| 		 | ||||
| 		// float and double | ||||
| 		if(type.toString() === @encode(float).toString()) { | ||||
| 			return 4; | ||||
| 		} else if (type.toString() === @encode(double).toString()) { | ||||
| 			return 8; | ||||
| 		} | ||||
|  | ||||
| 		var typeInstance = type(0); | ||||
| 		 | ||||
| 		if(typeInstance instanceof Object) { | ||||
| 			// Arrays | ||||
| 			if("length" in typeInstance) { | ||||
| 				return typeInstance.length * utils.sizeof(typeInstance.type); | ||||
| 			} | ||||
| 			 | ||||
| 			// Structs | ||||
| 			if(typeInstance.toString() === "[object Struct]") { | ||||
| 				var typeStr = type.toString(); | ||||
| 				var arrayTypeStr = "[2" + typeStr + "]"; | ||||
| 				var arrayType = new Type(arrayTypeStr); | ||||
| 				 | ||||
| 				var arrayInstance = new arrayType; | ||||
| 				 | ||||
| 				return @encode(void *)(&(arrayInstance[1])) - @encode(void *)(&(arrayInstance[0])); | ||||
| 			} | ||||
| 		} | ||||
| 		 | ||||
| 		for(var i = 0; i < 5; i++) { | ||||
| 			var maxSigned = Math.pow(2, 8 * Math.pow(2, i) - 1) - 1; | ||||
| 			if(i === 3) { | ||||
| 				// Floating point fix ;^) | ||||
| 				maxSigned /= 1000; | ||||
| 			} | ||||
|  | ||||
| 			// can't use !== or sizeof(void *) === 0.5 | ||||
| 			if(type(maxSigned) != maxSigned) { | ||||
| 				return Math.pow(2, i - 1); | ||||
| 			} | ||||
| 		} | ||||
| 	}; | ||||
| 	 | ||||
| 	/* | ||||
| 		Logs a specific message sent to an instance of a class like logify.pl in theos | ||||
| 		Requires Cydia Substrate (com.saurik.substrate.MS) and NSLog (org.cycript.NSLog) modules | ||||
| 		Returns the old message returned by MS.hookMessage (Note: this is not just the old message!) | ||||
| 		 | ||||
| 		Usage: | ||||
| 			cy# var oldm = utils.logify(objc_getMetaClass(NSNumber), @selector(numberWithDouble:)) | ||||
| 			... | ||||
| 			cy# var n = [NSNumber numberWithDouble:1.5] | ||||
| 			2014-07-28 02:26:39.805 cycript[71213:507] +[<NSNumber: 0x10032d0c4> numberWithDouble:1.5] | ||||
| 			2014-07-28 02:26:39.806 cycript[71213:507]  = 1.5 | ||||
| 			@1.5 | ||||
| 	*/ | ||||
| 	utils.logify = function(cls, sel) { | ||||
| 		@import com.saurik.substrate.MS; | ||||
| 		@import org.cycript.NSLog; | ||||
| 		 | ||||
| 		var oldm = {}; | ||||
| 		 | ||||
| 		MS.hookMessage(cls, sel, function() { | ||||
| 			var args = [].slice.call(arguments); | ||||
| 			 | ||||
| 			var selFormat = sel.toString().replace(/:/g, ":%@ ").trim(); | ||||
| 			var logFormat = "%@[<%@: 0x%@> " + selFormat + "]"; | ||||
| 			 | ||||
| 			var standardArgs = [logFormat, class_isMetaClass(cls)? "+": "-", cls.toString(), (&this).valueOf().toString(16)]; | ||||
| 			var logArgs = standardArgs.concat(args); | ||||
| 			 | ||||
| 			NSLog.apply(null, logArgs); | ||||
| 			 | ||||
| 			var r = oldm->apply(this, arguments); | ||||
| 			 | ||||
| 			if(r !== undefined) { | ||||
| 				NSLog(" = %@", r); | ||||
| 			} | ||||
| 			 | ||||
| 			return r; | ||||
| 		}, oldm); | ||||
| 		 | ||||
| 		return oldm; | ||||
| 	}; | ||||
| 	 | ||||
| 	/* | ||||
| 		Calls a C function by providing its name and arguments | ||||
| 		Doesn't support structs | ||||
| 		Return value is always a void pointer | ||||
| 		 | ||||
| 		Usage: | ||||
| 			cy# utils.apply("printf", ["%s %.3s, %d -> %c, float: %f\n", "foo", "barrrr", 97, 97, 1.5]) | ||||
| 			foo bar, 97 -> a, float: 1.500000 | ||||
| 			0x22 | ||||
| 	*/ | ||||
| 	utils.apply = function(fun, args) { | ||||
| 		if(!(args instanceof Array)) { | ||||
| 			throw "Args needs to be an array!"; | ||||
| 		} | ||||
| 		 | ||||
| 		var argc = args.length; | ||||
| 		var voidPtr = @encode(void *); | ||||
| 		var argTypes = []; | ||||
| 		for(var i = 0; i < argc; i++) { | ||||
| 			var argType = voidPtr; | ||||
| 			 | ||||
| 			var arg = args[i]; | ||||
| 			if(typeof arg === "string") { | ||||
| 				argType = @encode(char *); | ||||
| 			} | ||||
| 			if(typeof arg === "number" && arg % 1 !== 0) { | ||||
| 				argType = @encode(double); | ||||
| 			} | ||||
| 			 | ||||
| 			argTypes.push(argType); | ||||
| 		} | ||||
| 		 | ||||
| 		var type = voidPtr.functionWith.apply(voidPtr, argTypes); | ||||
| 		 | ||||
| 		if(typeof fun === "string") { | ||||
| 			fun = dlsym(RTLD_DEFAULT, fun); | ||||
| 		} | ||||
| 		 | ||||
| 		if(!fun) { | ||||
| 			throw "Function not found!"; | ||||
| 		} | ||||
|  | ||||
| 		return type(fun).apply(null, args); | ||||
| 	}; | ||||
| 	 | ||||
| 	/* | ||||
| 		Converts a string (char *) to a void pointer (void *) | ||||
| 		You can't cast to strings to void pointers and vice versa in cycript. Blame saurik. | ||||
| 		 | ||||
| 		Usage: | ||||
| 			cy# var voidPtr = utils.str2voidPtr("foobar") | ||||
| 			0x100331590 | ||||
| 			cy# utils.voidPtr2str(voidPtr) | ||||
| 			"foobar" | ||||
| 	*/ | ||||
| 	utils.str2voidPtr = function(str) { | ||||
| 		var strdup = @encode(void *(char *))(dlsym(RTLD_DEFAULT, "strdup")); | ||||
| 		return strdup(str); | ||||
| 	}; | ||||
| 	 | ||||
| 	/* | ||||
| 		The inverse function of str2voidPtr | ||||
| 	*/ | ||||
| 	utils.voidPtr2str = function(voidPtr) { | ||||
| 		var strdup = @encode(char *(void *))(dlsym(RTLD_DEFAULT, "strdup")); | ||||
| 		return strdup(voidPtr); | ||||
| 	}; | ||||
| 	 | ||||
| 	/* | ||||
| 		Converts a double into a void pointer | ||||
| 		This can be used to view the binary representation of a floating point number | ||||
| 		 | ||||
| 		Usage: | ||||
| 			cy# var n = utils.double2voidPtr(-1.5) | ||||
| 			0xbff8000000000000 | ||||
| 			cy# utils.voidPtr2double(n) | ||||
| 			-1.5 | ||||
| 	*/ | ||||
| 	utils.double2voidPtr = function(n) { | ||||
| 		var doublePtr = new double; | ||||
| 		*doublePtr = n; | ||||
| 		 | ||||
| 		var voidPtrPtr = @encode(void **)(doublePtr); | ||||
| 		 | ||||
| 		return *voidPtrPtr; | ||||
| 	}; | ||||
| 	 | ||||
| 	/* | ||||
| 		The inverse function of double2voidPtr | ||||
| 	*/ | ||||
| 	utils.voidPtr2double = function(voidPtr) { | ||||
| 		var voidPtrPtr = new @encode(void **); | ||||
| 		*voidPtrPtr = voidPtr; | ||||
| 		 | ||||
| 		var doublePtr = @encode(double *)(voidPtrPtr); | ||||
| 		 | ||||
| 		return *doublePtr; | ||||
| 	}; | ||||
| 	 | ||||
| 	/* | ||||
| 		Determines in a safe way if a memory location is readable | ||||
| 		 | ||||
| 		Usage: | ||||
| 			cy# utils.isMemoryReadable(0) | ||||
| 			false | ||||
| 			cy# utils.isMemoryReadable(0x1337) | ||||
| 			false | ||||
| 			cy# utils.isMemoryReadable(NSObject) | ||||
| 			true | ||||
| 			cy# var a = malloc(100); utils.isMemoryReadable(a) | ||||
| 			true | ||||
| 	*/ | ||||
| 	utils.isMemoryReadable = function(ptr) { | ||||
| 		if(typeof ptr === "string") { | ||||
| 			return true; | ||||
| 		} | ||||
| 		 | ||||
| 		var fds = new @encode(int [2]); | ||||
| 		utils.apply("pipe", [fds]); | ||||
| 		var result = utils.apply("write", [fds[1], ptr, 1]) == 1; | ||||
| 		 | ||||
| 		utils.apply("close", [fds[0]]); | ||||
| 		utils.apply("close", [fds[1]]); | ||||
| 		 | ||||
| 		return result; | ||||
| 	}; | ||||
| 	 | ||||
| 	/* | ||||
| 		Determines in a safe way if the memory location contains an Objective-C object | ||||
|  | ||||
| 		Usage: | ||||
| 			cy# utils.isObject(0) | ||||
| 			false | ||||
| 			cy# utils.isObject(0x1337) | ||||
| 			false | ||||
| 			cy# utils.isObject(NSObject) | ||||
| 			true | ||||
| 			cy# utils.isObject(objc_getMetaClass(NSObject)) | ||||
| 			true | ||||
| 			cy# utils.isObject([new NSObject init]) | ||||
| 			true | ||||
| 			cy# var a = malloc(100); utils.isObject(a) | ||||
| 			false | ||||
| 			cy# *@encode(void **)(a) = NSObject; utils.isObject(a) | ||||
| 			true | ||||
| 	*/ | ||||
| 	utils.isObject = function(obj) { | ||||
| 		obj = @encode(void *)(obj); | ||||
| 		var lastObj = -1; | ||||
| 		 | ||||
| 		function objc_isa_ptr(obj) { | ||||
| 			// See http://www.sealiesoftware.com/blog/archive/2013/09/24/objc_explain_Non-pointer_isa.html | ||||
| 			var objc_debug_isa_class_mask = 0x00000001fffffffa; | ||||
| 			obj = (obj & 1)? (obj & objc_debug_isa_class_mask): obj; | ||||
| 			 | ||||
| 			if((obj & (utils.sizeof(@encode(void *)) - 1)) != 0) { | ||||
| 				return null; | ||||
| 			} else { | ||||
| 				return obj; | ||||
| 			} | ||||
| 		} | ||||
| 		 | ||||
| 		function ptrValue(obj) { | ||||
| 			return obj? obj.valueOf(): null; | ||||
| 		} | ||||
| 		 | ||||
| 		var foundMetaClass = false; | ||||
| 		 | ||||
| 		for(obj = objc_isa_ptr(obj); utils.isMemoryReadable(obj); ) { | ||||
| 			obj = *@encode(void **)(obj); | ||||
| 			 | ||||
| 			if(ptrValue(obj) == ptrValue(lastObj)) { | ||||
| 				foundMetaClass = true; | ||||
| 				break; | ||||
| 			} | ||||
| 			 | ||||
| 			lastObj = obj; | ||||
| 		} | ||||
| 		 | ||||
| 		if(!foundMetaClass) { | ||||
| 			return false; | ||||
| 		} | ||||
| 		 | ||||
| 		if(lastObj === -1 || lastObj === null) { | ||||
| 			return false; | ||||
| 		} | ||||
| 		 | ||||
| 		var obj_class = objc_isa_ptr(@encode(void **)(obj)[1]); | ||||
| 		 | ||||
| 		if(!utils.isMemoryReadable(obj_class)) { | ||||
| 			return false; | ||||
| 		} | ||||
| 		 | ||||
| 		var metaclass = objc_isa_ptr(@encode(void **)(obj_class)[0]); | ||||
| 		var superclass = objc_isa_ptr(@encode(void **)(obj_class)[1]); | ||||
| 		 | ||||
| 		return ptrValue(obj) == ptrValue(metaclass) && superclass == null; | ||||
| 	}; | ||||
| 	 | ||||
| 	/* | ||||
| 		Creates a cycript struct type from a C struct definition | ||||
| 		 | ||||
| 		Usage: | ||||
| 			cy# var foo = makeStruct("int a; short b; char c; uint64_t d; double e;", "foo"); | ||||
| 			@encode(foo) | ||||
| 			cy# var f = new foo | ||||
| 			&{a:0,b:0,c:0,d:0,e:0} | ||||
| 			cy# f->a = 100; f | ||||
| 			&{a:100,b:0,c:0,d:0,e:0} | ||||
| 			cy# *@encode(int *)(f) | ||||
| 			100 | ||||
| 	*/ | ||||
| 	utils.makeStruct = function(str, name) {		 | ||||
| 		var fieldRe = /(?:\s|\n)*([^;]+\s*(?:\s|\*))([^;]+)\s*;/g; | ||||
| 		 | ||||
| 		if(!name) { | ||||
| 			name = "struct" + Math.floor(Math.random() * 100000); | ||||
| 		} | ||||
| 		var typeStr = "{" + name + "="; | ||||
| 		 | ||||
| 		while((match = fieldRe.exec(str)) !== null) { | ||||
| 			var fieldType = utils.applyTypedefs(match[1]); | ||||
| 			var fieldName = match[2]; | ||||
| 			var encodedType = utils.exec("@encode(" + fieldType + ")").toString(); | ||||
| 			 | ||||
| 			typeStr += '"' + fieldName + '"' + encodedType; | ||||
| 		} | ||||
| 		 | ||||
| 		typeStr += "}"; | ||||
| 		 | ||||
| 		return new Type(typeStr); | ||||
| 	}; | ||||
| 	 | ||||
| 	// Various constants | ||||
| 	utils.constants = { | ||||
| 		VM_PROT_NONE:       0x0, | ||||
| 		VM_PROT_READ:       0x1, | ||||
| 		VM_PROT_WRITE:      0x2, | ||||
| 		VM_PROT_EXECUTE:    0x4, | ||||
| 		VM_PROT_NO_CHANGE:  0x8, | ||||
| 		VM_PROT_COPY:       0x10, | ||||
| 		VM_PROT_WANTS_COPY: 0x10, | ||||
| 		VM_PROT_IS_MASK:    0x40, | ||||
| 	}; | ||||
| 	var c = utils.constants; | ||||
| 	c.VM_PROT_DEFAULT = c.VM_PROT_READ | c.VM_PROT_WRITE; | ||||
| 	c.VM_PROT_ALL =     c.VM_PROT_READ | c.VM_PROT_WRITE | c.VM_PROT_EXECUTE; | ||||
| 	 | ||||
| 	if(shouldExposeConsts) { | ||||
| 		for(var k in c) { | ||||
| 			Cycript.all[k] = c[k]; | ||||
| 		} | ||||
| 	} | ||||
| 	 | ||||
| 	if(shouldExposeFuncs) { | ||||
| 		for(var i = 0; i < funcsToExpose.length; i++) { | ||||
| 			var name = funcsToExpose[i]; | ||||
| 			Cycript.all[name] = utils[name]; | ||||
| 		} | ||||
| 	} | ||||
| 	 | ||||
| 	if(shouldLoadCFuncs) { | ||||
| 		utils.loadfuncs(shouldExposeCFuncs); | ||||
| 	} | ||||
| })(exports); | ||||
							
								
								
									
										23
									
								
								samples/EmberScript/momentComponent.em
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								samples/EmberScript/momentComponent.em
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| class App.FromNowView extends Ember.View | ||||
|     tagName: 'time' | ||||
|     template: Ember.Handlebars.compile '{{view.output}}' | ||||
|     output: ~> | ||||
|         return moment(@value).fromNow() | ||||
|  | ||||
|     didInsertElement: -> | ||||
|         @tick() | ||||
|  | ||||
|     tick: -> | ||||
|         f = -> | ||||
|             @notifyPropertyChange 'output' | ||||
|             @tick() | ||||
|  | ||||
|         nextTick = Ember.run.later(this, f, 1000) | ||||
|         @set 'nextTick', nextTick | ||||
|  | ||||
|     willDestroyElement: -> | ||||
|         nextTick = @nextTick | ||||
|         Ember.run.cancel nextTick | ||||
|  | ||||
| Ember.Handlebars.helper 'fromNow', App.FromNowView | ||||
|  | ||||
							
								
								
									
										76
									
								
								samples/GAMS/transport.gms
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								samples/GAMS/transport.gms
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,76 @@ | ||||
| *Basic example of transport model from GAMS model library | ||||
|  | ||||
| $Title  A Transportation Problem (TRNSPORT,SEQ=1) | ||||
| $Ontext | ||||
|  | ||||
| This problem finds a least cost shipping schedule that meets | ||||
| requirements at markets and supplies at factories. | ||||
|  | ||||
|  | ||||
| Dantzig, G B, Chapter 3.3. In Linear Programming and Extensions. | ||||
| Princeton University Press, Princeton, New Jersey, 1963. | ||||
|  | ||||
| This formulation is described in detail in: | ||||
| Rosenthal, R E, Chapter 2: A GAMS Tutorial. In GAMS: A User's Guide. | ||||
| The Scientific Press, Redwood City, California, 1988. | ||||
|  | ||||
| The line numbers will not match those in the book because of these | ||||
| comments. | ||||
|  | ||||
| $Offtext | ||||
|  | ||||
|  | ||||
|   Sets | ||||
|        i   canning plants   / seattle, san-diego / | ||||
|        j   markets          / new-york, chicago, topeka / ; | ||||
|   Parameters | ||||
|        a(i)  capacity of plant i in cases | ||||
|          /    seattle     350 | ||||
|               san-diego   600  / | ||||
|        b(j)  demand at market j in cases | ||||
|          /    new-york    325 | ||||
|               chicago     300 | ||||
|               topeka      275  / ; | ||||
|   Table d(i,j)  distance in thousands of miles | ||||
|                     new-york       chicago      topeka | ||||
|       seattle          2.5           1.7          1.8 | ||||
|       san-diego        2.5           1.8          1.4  ; | ||||
|   Scalar f  freight in dollars per case per thousand miles  /90/ ; | ||||
|   Parameter c(i,j)  transport cost in thousands of dollars per case ; | ||||
|             c(i,j) = f * d(i,j) / 1000 ; | ||||
|   Variables | ||||
|        x(i,j)  shipment quantities in cases | ||||
|        z       total transportation costs in thousands of dollars ; | ||||
|  | ||||
|   Positive Variable x ; | ||||
|  | ||||
|   Equations | ||||
|        cost        define objective function | ||||
|        supply(i)   observe supply limit at plant i | ||||
|        demand(j)   satisfy demand at market j ; | ||||
|  | ||||
|   cost ..        z  =e=  sum((i,j), c(i,j)*x(i,j)) ; | ||||
|  | ||||
|   supply(i) ..   sum(j, x(i,j))  =l=  a(i) ; | ||||
|  | ||||
|   demand(j) ..   sum(i, x(i,j))  =g=  b(j) ; | ||||
|  | ||||
|   Model transport /all/ ; | ||||
|  | ||||
|   Solve transport using lp minimizing z ; | ||||
|  | ||||
|   Display x.l, x.m ; | ||||
|  | ||||
| $ontext | ||||
| #user model library stuff | ||||
| Main topic Basic GAMS | ||||
| Featured item 1 Trnsport model | ||||
| Featured item 2 | ||||
| Featured item 3 | ||||
| Featured item 4 | ||||
| Description | ||||
| Basic example of transport model from GAMS model library | ||||
|  | ||||
|  | ||||
|  | ||||
| $offtext | ||||
							
								
								
									
										9
									
								
								samples/GLSL/SimpleLighting.gl2.frag
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								samples/GLSL/SimpleLighting.gl2.frag
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | ||||
| static const char* SimpleFragmentShader = STRINGIFY( | ||||
|  | ||||
| varying vec4 FrontColor; | ||||
|  | ||||
| void main(void) | ||||
| { | ||||
|     gl_FragColor = FrontColor; | ||||
| } | ||||
| ); | ||||
							
								
								
									
										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; | ||||
| } | ||||
							
								
								
									
										48
									
								
								samples/GLSL/recurse1.frag
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								samples/GLSL/recurse1.frag
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,48 @@ | ||||
| #version 330 core | ||||
|  | ||||
| // cross-unit recursion | ||||
|  | ||||
| void main() {} | ||||
|  | ||||
| // two-level recursion | ||||
|  | ||||
| float cbar(int); | ||||
|  | ||||
| void cfoo(float) | ||||
| { | ||||
| 	cbar(2); | ||||
| } | ||||
|  | ||||
| // four-level, out of order | ||||
|  | ||||
| void CB(); | ||||
| void CD(); | ||||
| void CA() { CB(); } | ||||
| void CC() { CD(); } | ||||
|  | ||||
| // high degree | ||||
|  | ||||
| void CBT(); | ||||
| void CDT(); | ||||
| void CAT() { CBT(); CBT(); CBT(); } | ||||
| void CCT() { CDT(); CDT(); CBT(); } | ||||
|  | ||||
| // not recursive | ||||
|  | ||||
| void norA() {} | ||||
| void norB() { norA(); } | ||||
| void norC() { norA(); } | ||||
| void norD() { norA(); } | ||||
| void norE() { norB(); } | ||||
| void norF() { norB(); } | ||||
| void norG() { norE(); } | ||||
| void norH() { norE(); } | ||||
| void norI() { norE(); } | ||||
|  | ||||
| // not recursive, but with a call leading into a cycle if ignoring direction | ||||
|  | ||||
| void norcA() { } | ||||
| void norcB() { norcA(); } | ||||
| void norcC() { norcB(); } | ||||
| void norcD() { norcC(); norcB(); } // head of cycle | ||||
| void norcE() { norcD(); } // lead into cycle | ||||
							
								
								
									
										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 | ||||
							
								
								
									
										2
									
								
								samples/Groovy/script.gvy
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								samples/Groovy/script.gvy
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,2 @@ | ||||
| #!/usr/bin/env groovy | ||||
| println "Hello World" | ||||
							
								
								
									
										9
									
								
								samples/Groovy/template.grt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								samples/Groovy/template.grt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | ||||
| html { | ||||
|   head { | ||||
|     component "bootstrap" | ||||
|     title "Bootstrap Template" | ||||
|   } | ||||
|    | ||||
|   html { | ||||
|   } | ||||
| } | ||||
							
								
								
									
										9
									
								
								samples/Groovy/template.gtpl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								samples/Groovy/template.gtpl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | ||||
| html { | ||||
|   head { | ||||
|     title "Example Template" | ||||
|   } | ||||
|    | ||||
|   body { | ||||
|     p "This is a quick template example" | ||||
|   } | ||||
| } | ||||
							
								
								
									
										31
									
								
								samples/HTML+ERB/fishbowl.html.erb.deface
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								samples/HTML+ERB/fishbowl.html.erb.deface
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,31 @@ | ||||
| <!-- insert_before '[data-hook="buttons"]' --> | ||||
| <% if Spree::Config[:enable_fishbowl] %> | ||||
| <div class="row"> | ||||
|   <div class="twelve columns" id="fishbowl_preferences"> | ||||
|     <fieldset class="no-border-bottom"> | ||||
|       <legend align="center"><%= t(:fishbowl_settings)%></legend> | ||||
|       <% @fishbowl_options.each do |key| %> | ||||
|           <div class="field"> | ||||
|             <%= label_tag(key, t(key.to_s.gsub('fishbowl_', '').to_sym) + ': ') + tag(:br) %> | ||||
|             <%= text_field_tag('preferences[' + key.to_s + ']', Spree::Config[key], { :size => 10, :class => 'fullwidth' }) %> | ||||
|           </div> | ||||
|       <% end %> | ||||
|       <div class="field"> | ||||
|         <%= hidden_field_tag 'preferences[fishbowl_always_fetch_current_inventory]', '0' %> | ||||
|         <%= check_box_tag('preferences[fishbowl_always_fetch_current_inventory]', "1", Spree::Config[:fishbowl_always_fetch_current_inventory]) %> | ||||
|         <%= t(:always_fetch_current_inventory) %> | ||||
|       </div> | ||||
|       <% if !@location_groups.empty? %> | ||||
|         <div class="field"> | ||||
|           <%= label_tag(:fishbowl_location_group, t(:location_group) + ': ') + tag(:br) %> | ||||
|           <%= select('preferences', 'fishbowl_location_group', @location_groups, { :selected => Spree::Config[:fishbowl_location_group]}, { :class => ['select2', 'fullwidth'] }) %> | ||||
|         </div> | ||||
|       <% end %> | ||||
|     </fieldset> | ||||
|   </div> | ||||
| </div> | ||||
|  | ||||
| <script type="text/javascript"> | ||||
|   $('.select2').select2(); | ||||
| </script> | ||||
| <% end %> | ||||
							
								
								
									
										39
									
								
								samples/HTML+ERB/index.html.erb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								samples/HTML+ERB/index.html.erb
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,39 @@ | ||||
| <% provide(:title, @header) %> | ||||
| <% present @users do |user_presenter| %> | ||||
| 	<div class="row key-header"> | ||||
| 		<h1><%= @header %></h1> | ||||
| 	</div> | ||||
|  | ||||
| 	<div class='row'> | ||||
| 		<div class='small-12 columns'> | ||||
| 			<%= will_paginate %> | ||||
| 		</div> | ||||
| 	</div> | ||||
| 	<div class="row key-table"> | ||||
| 		<div class="small-12 columns"> | ||||
| 			<div class="row key-table-row"> | ||||
| 				<div class="small-2 columns">Name</div> | ||||
| 				<div class="small-3 columns">Email</div> | ||||
| 				<div class="small-1 columns">Chords</div> | ||||
| 				<div class="small-1 columns">Keys</div> | ||||
| 				<div class="small-1 columns">Tunings</div> | ||||
| 				<div class="small-1 columns">Credits</div> | ||||
| 				<div class="small-1 columns">Prem?</div> | ||||
| 				<div class="small-2 columns">Since?</div> | ||||
| 			</div> | ||||
|  | ||||
| 			<% if @users == [] %> | ||||
| 				<div class="row key-table-row"> | ||||
| 					<div class="small-4 small-centered columns">No Users</div> | ||||
| 				</div> | ||||
| 			<% else %> | ||||
| 				<%= render @users %> | ||||
| 			<% end %> | ||||
| 		</div> | ||||
| 	</div> | ||||
| 	<div class='row'> | ||||
| 		<div class='small-12 columns'> | ||||
| 			<%= will_paginate %> | ||||
| 		</div> | ||||
| 	</div> | ||||
| <% end %> | ||||
							
								
								
									
										29
									
								
								samples/Haml/buttons.html.haml.deface
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								samples/Haml/buttons.html.haml.deface
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,29 @@ | ||||
| / | ||||
|   replace '.actions' | ||||
|  | ||||
| .pull-right | ||||
|   .btn-group | ||||
|     = link_to page.url, target: "_blank", title: t('.view_live_html'), class: "tip btn btn-xs btn-default" do | ||||
|       %i.icon-picture.row-black | ||||
|        | ||||
|     = link_to refinery.edit_admin_page_path(page.nested_url, | ||||
|         switch_locale: (page.translations.first.locale unless page.translated_to_default_locale?)), | ||||
|         title: t('edit', :scope => 'refinery.admin.pages'), | ||||
|         class: "tip btn btn-xs btn-default" do | ||||
|       %i.icon-edit.row-blue | ||||
|        | ||||
|      | ||||
|     - if page.deletable? | ||||
|       = link_to refinery.admin_page_path(page.nested_url),  | ||||
|           methode: :delete, | ||||
|           title: t('delete', :scope => 'refinery.admin.pages'),  | ||||
|           class: "tip cancel confirm-delete btn btn-xs btn-default",  | ||||
|           data: { confirm: t('message', scope: 'refinery.admin.delete', title: page_title_with_translations(page)) } do | ||||
|         %i.icon-trash.row-red | ||||
|     - else | ||||
|       %button.btn.btn-xs.btn-default.disabled | ||||
|         %i.icon-trash | ||||
|        | ||||
|   .btn-group | ||||
|     = link_to refinery.new_admin_page_path(:parent_id => page.id), title: t('new', :scope => 'refinery.admin.pages'), class: "tip btn btn-xs btn-default" do | ||||
|       %i.icon-plus.row-green | ||||
							
								
								
									
										38
									
								
								samples/IGOR Pro/functions.ipf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								samples/IGOR Pro/functions.ipf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | ||||
| #pragma rtGlobals=3 | ||||
|  | ||||
| Function FooBar() | ||||
| 	return 0 | ||||
| End | ||||
|  | ||||
| Function FooBarSubType() : ButtonControl | ||||
| 	return 0 | ||||
| End | ||||
|  | ||||
| Function/D FooBarVar() | ||||
| 	return 0 | ||||
| End | ||||
|  | ||||
| static Function FooBarStatic() | ||||
| 	return 0 | ||||
| End | ||||
|  | ||||
| threadsafe static Function FooBarStaticThreadsafe() | ||||
| 	return 0 | ||||
| End | ||||
|  | ||||
| threadsafe Function FooBarThread() | ||||
| 	return 0 | ||||
| End | ||||
|  | ||||
| Function CallOperationsAndBuiltInFuncs(string var) | ||||
|  | ||||
| 	string someDQString = "abcd" | ||||
|  | ||||
| 	Make/N=(1,2,3,4) myWave | ||||
| 	Redimension/N=(-1,-1,-1,5) myWave | ||||
|  | ||||
| 	print strlen(someDQString) | ||||
|  | ||||
| 	return 0 | ||||
| End | ||||
|  | ||||
							
								
								
									
										21
									
								
								samples/IGOR Pro/generic.ipf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								samples/IGOR Pro/generic.ipf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | ||||
| #pragma rtGlobals=3 | ||||
|  | ||||
| StrConstant myConstString="abcd" | ||||
| // some comment | ||||
| constant myConst=123 | ||||
|  | ||||
| Structure struct1 | ||||
| 	string str | ||||
| 	variable var | ||||
| EndStructure | ||||
|  | ||||
| static Structure struct2 | ||||
| 	string str | ||||
| 	variable var | ||||
| EndStructure | ||||
|  | ||||
| #include "someFile" | ||||
|  | ||||
| #ifdef NOT_DEFINED | ||||
| 	// conditional compilation | ||||
| #endif | ||||
							
								
								
									
										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; | ||||
| } | ||||
							
								
								
									
										7
									
								
								samples/JavaScript/intro.js.frag
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								samples/JavaScript/intro.js.frag
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| (function(window, angular) { | ||||
|  | ||||
| Array.prototype.last = function() { | ||||
|     return this[this.length-1]; | ||||
| }; | ||||
|  | ||||
| var app = angular.module('ConwayGameOfLife', []); | ||||
							
								
								
									
										3
									
								
								samples/JavaScript/outro.js.frag
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								samples/JavaScript/outro.js.frag
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
|  | ||||
| })(window, window.angular); | ||||
|  | ||||
							
								
								
									
										74
									
								
								samples/LSL/LSL.lsl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								samples/LSL/LSL.lsl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,74 @@ | ||||
| /* | ||||
|     Testing syntax highlighting | ||||
|     for the Linden Scripting Language | ||||
| */ | ||||
|  | ||||
| integer someIntNormal       = 3672; | ||||
| integer someIntHex          = 0x00000000; | ||||
| integer someIntMath         = PI_BY_TWO; | ||||
|  | ||||
| integer event               = 5673;// 'event' is invalid.illegal | ||||
|  | ||||
| key someKeyTexture          = TEXTURE_DEFAULT; | ||||
| string someStringSpecial    = EOF; | ||||
|  | ||||
| some_user_defined_function_without_return_type(string inputAsString) | ||||
| { | ||||
|     llSay(PUBLIC_CHANNEL, inputAsString); | ||||
| } | ||||
|  | ||||
| string user_defined_function_returning_a_string(key inputAsKey) | ||||
| { | ||||
|     return (string)inputAsKey; | ||||
| } | ||||
|  | ||||
| default | ||||
| { | ||||
|     state_entry() | ||||
|     { | ||||
|         key someKey = NULL_KEY; | ||||
|         someKey = llGetOwner(); | ||||
|  | ||||
|         string someString = user_defined_function_returning_a_string(someKey); | ||||
|  | ||||
|         some_user_defined_function_without_return_type(someString); | ||||
|     } | ||||
|  | ||||
|     touch_start(integer num_detected) | ||||
|     { | ||||
|         list agentsInRegion = llGetAgentList(AGENT_LIST_REGION, []); | ||||
|         integer numOfAgents = llGetListLength(agentsInRegion); | ||||
|  | ||||
|         integer index;                                                          // defaults to 0 | ||||
|         for (; index <= numOfAgents - 1; index++)                               // for each agent in region | ||||
|         { | ||||
|             llRegionSayTo(llList2Key(agentsInRegion, index), PUBLIC_CHANNEL, "Hello, Avatar!"); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     touch_end(integer num_detected) | ||||
|     { | ||||
|         someIntNormal       = 3672; | ||||
|         someIntHex          = 0x00000000; | ||||
|         someIntMath         = PI_BY_TWO; | ||||
|  | ||||
|         event               = 5673;// 'event' is invalid.illegal | ||||
|  | ||||
|         someKeyTexture      = TEXTURE_DEFAULT; | ||||
|         someStringSpecial   = EOF; | ||||
|  | ||||
|         llSetInventoryPermMask("some item", MASK_NEXT, PERM_ALL);// 'llSetInventoryPermMask' is reserved.godmode | ||||
|  | ||||
|         llWhisper(PUBLIC_CHANNEL, "Leaving \"default\" now..."); | ||||
|         state other; | ||||
|     } | ||||
| } | ||||
|  | ||||
| state other | ||||
| { | ||||
|     state_entry() | ||||
|     { | ||||
|         llWhisper(PUBLIC_CHANNEL, "Entered \"state other\", returning to \"default\" again..."); | ||||
|         state default; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										43
									
								
								samples/LookML/comments.view.lookml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								samples/LookML/comments.view.lookml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,43 @@ | ||||
| - view: comments | ||||
|   fields: | ||||
|  | ||||
|   - dimension: id | ||||
|     primary_key: true | ||||
|     type: int | ||||
|     sql: ${TABLE}.id | ||||
|  | ||||
|   - dimension: body | ||||
|     sql: ${TABLE}.body | ||||
|  | ||||
|   - dimension_group: created | ||||
|     type: time | ||||
|     timeframes: [time, date, week, month] | ||||
|     sql: ${TABLE}.created_at | ||||
|  | ||||
|   - dimension: headline_id | ||||
|     type: int | ||||
|     hidden: true | ||||
|     sql: ${TABLE}.headline_id | ||||
|  | ||||
|   - dimension_group: updated | ||||
|     type: time | ||||
|     timeframes: [time, date, week, month] | ||||
|     sql: ${TABLE}.updated_at | ||||
|  | ||||
|   - dimension: user_id | ||||
|     type: int | ||||
|     hidden: true | ||||
|     sql: ${TABLE}.user_id | ||||
|  | ||||
|   - measure: count | ||||
|     type: count | ||||
|     detail: detail* | ||||
|  | ||||
|  | ||||
|   # ----- Detail ------ | ||||
|   sets: | ||||
|     detail: | ||||
|       - id | ||||
|       - headlines.id | ||||
|       - headlines.name | ||||
|       - users.id | ||||
							
								
								
									
										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; | ||||
|   }; | ||||
| } | ||||
							
								
								
									
										9
									
								
								samples/Opal/DeepakChopra.opal
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								samples/Opal/DeepakChopra.opal
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | ||||
| -- Deepak Chopra nonsense text generator | ||||
| -- see https://github.com/StoneCypher/DeepakChopra_Opal/ | ||||
|  | ||||
| starts = ["Experiential truth ", "The physical world ", "Non-judgment ", "Quantum physics "] | ||||
| middles = ["nurtures an ", "projects onto ", "imparts reality to ", "constructs with "] | ||||
| qualifiers = ["abundance of ", "the barrier of ", "self-righteous ", "potential "] | ||||
| finishes = ["marvel.", "choices.", "creativity.", "actions."] | ||||
|  | ||||
| alert starts.sample + middles.sample + qualifiers.sample + finishes.sample | ||||
							
								
								
									
										13
									
								
								samples/OpenSCAD/not_simple.scad
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								samples/OpenSCAD/not_simple.scad
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | ||||
| // A more complicated 3D shape in OpenSCAD | ||||
| $fn=32; | ||||
|  | ||||
| difference() { | ||||
|     // main shape | ||||
|     union() { | ||||
|         translate( [ 0, 0,  2 ] ) cube( [ 15, 15, 4 ], center=true ); | ||||
|         translate( [ 0, 0, 13 ] ) cylinder( h=25, r1=5, r2=3, center=true ); | ||||
|         translate( [ 0, 0, 28 ] ) sphere( r=6 ); | ||||
|     } | ||||
|     // hole through center | ||||
|     translate( [ 0, 0, 17 ] ) cylinder( h=35, r=2, center=true ); | ||||
| } | ||||
							
								
								
									
										3
									
								
								samples/OpenSCAD/simple.scad
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								samples/OpenSCAD/simple.scad
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| // Simple sphere in OpenSCAD | ||||
|  | ||||
| sphere( r=10 ); | ||||
							
								
								
									
										72
									
								
								samples/Ox/IJCEmet2009.oxh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								samples/Ox/IJCEmet2009.oxh
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,72 @@ | ||||
| /** Replicate Imai, Jain and Ching Econometrica 2009 (incomplete). | ||||
|  | ||||
| **/ | ||||
| #include "IJCEmet2009.h" | ||||
|  | ||||
| Kapital::Kapital(L,const N,const entrant,const exit,const KP){ | ||||
| 	StateVariable(L,N); | ||||
| 	this.entrant = entrant; | ||||
| 	this.exit = exit; | ||||
| 	this.KP = KP; | ||||
| 	actual = Kbar*vals/(N-1); | ||||
| 	upper = log(actual~.Inf); | ||||
| 	} | ||||
|  | ||||
| Kapital::Transit(FeasA) { | ||||
| 	decl ent =CV(entrant), stayout = FeasA[][exit.pos], tprob, sigu = CV(KP[SigU]); | ||||
| 	if (!v && !ent) return { <0>, ones(stayout) }; | ||||
| 	tprob = ent ? probn( (upper-CV(KP[Kbe]))/sigu ) | ||||
| 	           : probn( (upper-(CV(KP[Kb0])+CV(KP[Kb2])*upper[v])) / sigu ); | ||||
| 	tprob = tprob[1:] - tprob[:N-1]; | ||||
| 	return { vals, tprob.*(1-stayout)+(1.0~zeros(1,N-1)).*stayout }; | ||||
| 	} | ||||
|  | ||||
| FirmEntry::Run() { | ||||
| 	Initialize(); | ||||
| 	GenerateSample(); | ||||
| 	BDP->BayesianDP(); | ||||
| 	} | ||||
|  | ||||
| FirmEntry::Initialize() { | ||||
| 	Rust::Initialize(Reachable,0); | ||||
| 	sige = new StDeviations("sige",<0.3,0.3>,0); | ||||
| 	entrant = new LaggedAction("entrant",d); | ||||
| 	KP = new array[Kparams]; | ||||
| 		KP[Kbe] = new Positive("be",0.5); | ||||
| 		KP[Kb0] = new Free("b0",0.0); | ||||
| 		KP[Kb1] = new Determined("b1",0.0); | ||||
| 		KP[Kb2] = new Positive("b2",0.4); | ||||
| 		KP[SigU] = new Positive("sigu",0.4); | ||||
| 	EndogenousStates(K = new Kapital("K",KN,entrant,d,KP),entrant); | ||||
| 	SetDelta(new Probability("delta",0.85)); | ||||
| 	kcoef = new Positive("kcoef",0.1); | ||||
| 	ecost = new Negative("ec",-0.4); | ||||
| 	CreateSpaces(); | ||||
| 	} | ||||
|  | ||||
| FirmEntry::GenerateSample() { | ||||
| 	Volume = LOUD; | ||||
| 	EM = new ValueIteration(0); | ||||
| //	EM -> Solve(0,0); | ||||
| 	data = new DataSet(0,EM); | ||||
| 	data->Simulate(DataN,DataT,0,FALSE); | ||||
| 	data->Print("firmentry.xls"); | ||||
| 	BDP = new ImaiJainChing("FMH",data,EM,ecost,sige,kcoef,KP,delta); | ||||
| 	} | ||||
|  | ||||
| /** Capital stock can be positive only for incumbents. | ||||
| **/ | ||||
| FirmEntry::Reachable()	{ return CV(entrant)*CV(K) ? 0 : new FirmEntry() ;	} | ||||
|  | ||||
| /** The one period return. | ||||
| <DD> | ||||
| <pre>U = </pre> | ||||
| </DD> | ||||
| **/ | ||||
| FirmEntry::Utility()  { | ||||
| 	decl ent = CV(entrant), | ||||
| 		 u = | ||||
| 		     ent*CV(ecost)+(1-ent)*CV(kcoef)*AV(K) | ||||
| 		   | 0.0; | ||||
| 	return u; | ||||
| 	} | ||||
							
								
								
									
										63
									
								
								samples/Ox/ParallelObjective.ox
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								samples/Ox/ParallelObjective.ox
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,63 @@ | ||||
| /** Client and Server classes for parallel optimization using CFMPI.**/ | ||||
| #include "ParallelObjective.h" | ||||
|  | ||||
| /** Set up MPI Client-Server support for objective optimization. | ||||
| @param obj `Objective' to parallelize | ||||
| @param DONOTUSECLIENT TRUE (default): client node does no object evaluation<br>FALSE after putting servers to work Client node does one evaluation. | ||||
| **/ | ||||
| ParallelObjective(obj,DONOTUSECLIENT) { | ||||
| 	if (isclass(obj.p2p)) {oxwarning("P2P object already exists for "+obj.L+". Nothing changed"); return;} | ||||
| 	obj.p2p = new P2P(DONOTUSECLIENT,new ObjClient(obj),new ObjServer(obj)); | ||||
| 	} | ||||
|  | ||||
| ObjClient::ObjClient(obj) { this.obj = obj;    } | ||||
|  | ||||
| ObjClient::Execute() {    } | ||||
|  | ||||
| ObjServer::ObjServer(obj) { | ||||
|     this.obj = obj; | ||||
|     basetag = P2P::STOP_TAG+1; | ||||
|     iml = obj.NvfuncTerms; | ||||
|     Nparams = obj.nstruct; | ||||
|     } | ||||
|  | ||||
| /** Wait on the objective client. | ||||
| **/ | ||||
| ObjServer::Loop(nxtmsgsz) { | ||||
|     Nparams = nxtmsgsz;   //free param length is no greater than Nparams | ||||
|     if (Volume>QUIET) println("ObjServer server ",ID," Nparams ",Nparams); | ||||
|     Server::Loop(Nparams); | ||||
|     Recv(ANY_TAG);                      //receive the ending parameter vector | ||||
|     obj->Encode(Buffer[:Nparams-1]);   //encode it. | ||||
|     } | ||||
|  | ||||
| /** Do the objective evaluation. | ||||
| Receive structural parameter vector and `Objective::Encode`() it. | ||||
| Call `Objective::vfunc`(). | ||||
| @return Nparams (max. length of next expected message); | ||||
| **/ | ||||
| ObjServer::Execute() { | ||||
| 	obj->Decode(Buffer[:obj.nfree-1]); | ||||
| 	Buffer = obj.cur.V[] = obj->vfunc(); | ||||
|     if (Volume>QUIET) println("Server Executive: ",ID," vfunc[0]= ",Buffer[0]); | ||||
| 	return obj.nstruct; | ||||
| 	} | ||||
|  | ||||
| CstrServer::CstrServer(obj) { ObjServer(obj);	} | ||||
|  | ||||
| SepServer::SepServer(obj) { ObjServer(obj);	} | ||||
|  | ||||
| CstrServer::Execute() { | ||||
| 	obj->Encode(Buffer); | ||||
| 	obj->Lagrangian(0); | ||||
| 	return rows(Buffer = obj.cur->Vec()); | ||||
| 	} | ||||
|  | ||||
| /** Separable objective evaluations. | ||||
| **/ | ||||
| SepServer::Execute() { | ||||
| 	obj.Kvar.v = imod(Tag-basetag,obj.K); | ||||
| 	obj->Encode(Buffer,TRUE); | ||||
| 	Buffer = obj.Kvar->PDF() * obj->vfunc(); | ||||
| 	return obj.NvfuncTerms; | ||||
| 	} | ||||
							
								
								
									
										38
									
								
								samples/Ox/particle.oxo
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								samples/Ox/particle.oxo
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | ||||
| nldge::ParticleLogLikeli() | ||||
| {	decl it, ip, | ||||
| 		 mss, mbas, ms, my, mx, vw, vwi, dws, | ||||
| 		 mhi, mhdet, loglikeli, mData, | ||||
| 		 vxm, vxs, mxm=<>, mxsu=<>, mxsl=<>, | ||||
| 		 time, timeall, timeran=0, timelik=0, timefun=0, timeint=0, timeres=0; | ||||
|  | ||||
| 	mData = GetData(m_asY); | ||||
| 	mhdet = sqrt((2*M_PI)^m_cY * determinant(m_mMSbE.^2));		// covariance determinant | ||||
| 	mhi   = invert(m_mMSbE.^2);					// invert covariance of measurement shocks | ||||
|  | ||||
| 	ms 	  = m_vSss + zeros(m_cPar, m_cS);			// start particles | ||||
| 	mx 	  = m_vXss + zeros(m_cPar, m_cX);			// steady state of state and policy | ||||
|  | ||||
| 	loglikeli = 0;							// init likelihood | ||||
| 																								//timeall=timer(); | ||||
| 	for(it = 0; it < sizer(mData); it++) | ||||
| 	{ | ||||
| 		mss = rann(m_cPar, m_cSS) * m_mSSbE;			// state noise | ||||
| 		fg(&ms, ms, mx, mss);					// transition prior as proposal | ||||
| 		mx = m_oApprox.FastInterpolate(ms); 			// interpolate | ||||
| 		fy(&my, ms, mx, zeros(m_cPar, m_cMS));			// evaluate importance weights | ||||
| 		my -= mData[it][];					// observation error | ||||
|  | ||||
| 		vw = exp(-0.5 * outer(my,mhi,'d')' )/mhdet;		// vw = exp(-0.5 * sumr(my*mhi .*my ) )/mhdet; | ||||
|  | ||||
| 		vw = vw .== .NaN .? 0 .: vw;				// no policy can happen for extrem particles | ||||
| 		dws = sumc(vw); | ||||
| 		if(dws==0) return -.Inf;				// or extremely wrong parameters | ||||
| 		loglikeli += log(dws/m_cPar)	;			// loglikelihood contribution | ||||
| 																										//timelik += (timer()-time)/100; | ||||
| 																										//time=timer(); | ||||
| 		vwi = resample(vw/dws)-1;				// selection step in c++ | ||||
| 		ms = ms[vwi][];						// on normalized weights | ||||
| 		mx = mx[vwi][]; | ||||
| 																	} | ||||
| 	return loglikeli; | ||||
| } | ||||
							
								
								
									
										34
									
								
								samples/PHP/filenames/.php
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										34
									
								
								samples/PHP/filenames/.php
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,34 @@ | ||||
| #!/usr/bin/env php | ||||
| <? | ||||
| $aMenuLinks = Array( | ||||
| 	Array( | ||||
| 		"Blog",  | ||||
| 		SITE_DIR,  | ||||
| 		Array(),  | ||||
| 		Array(),  | ||||
| 		""  | ||||
| 	), | ||||
| 	Array( | ||||
| 		"Photos",  | ||||
| 		SITE_DIR."photo/",  | ||||
| 		Array(),  | ||||
| 		Array(),  | ||||
| 		""  | ||||
| 	), | ||||
| 	Array( | ||||
| 		"About me",  | ||||
| 		SITE_DIR."about.php",  | ||||
| 		Array(),  | ||||
| 		Array(),  | ||||
| 		""  | ||||
| 	), | ||||
| 	Array( | ||||
| 		"Contact",  | ||||
| 		SITE_DIR."contacts.php",  | ||||
| 		Array(),  | ||||
| 		Array(),  | ||||
| 		""  | ||||
| 	), | ||||
|  | ||||
| ); | ||||
| ?> | ||||
							
								
								
									
										54
									
								
								samples/Pan/test.pan
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								samples/Pan/test.pan
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,54 @@ | ||||
| object template pantest; | ||||
|  | ||||
| # Very simple pan test file | ||||
| "/long/decimal" = 123; | ||||
| "/long/octal" = 0755; | ||||
| "/long/hexadecimal" = 0xFF; | ||||
|  | ||||
| "/double/simple" = 0.01; | ||||
| "/double/pi" = 3.14159; | ||||
| "/double/exponent" = 1e-8; | ||||
| "/double/scientific" = 1.3E10; | ||||
|  | ||||
| "/string/single" = 'Faster, but escapes like \t, \n and \x3d don''t work, but '' should work.'; | ||||
| "/string/double" = "Slower, but escapes like \t, \n and \x3d do work"; | ||||
|  | ||||
| variable TEST = 2; | ||||
|  | ||||
| "/x2" = to_string(TEST); | ||||
| "/x2" ?= 'Default value'; | ||||
|  | ||||
| "/x3" = 1 + 2 + value("/long/decimal"); | ||||
|  | ||||
| "/x4" = undef; | ||||
|  | ||||
| "/x5" = null; | ||||
|  | ||||
| variable e ?= error("Test error message"); | ||||
|  | ||||
| # include gmond config for services-monitoring | ||||
| include { 'site/ganglia/gmond/services-monitoring' }; | ||||
|  | ||||
| "/software/packages"=pkg_repl("httpd","2.2.3-43.sl5.3",PKG_ARCH_DEFAULT); | ||||
| "/software/packages"=pkg_repl("php"); | ||||
|  | ||||
| # Example function | ||||
| function show_things_view_for_stuff = { | ||||
|     thing = ARGV[0]; | ||||
|     foreach( i; mything; STUFF ) { | ||||
|         if ( thing == mything ) { | ||||
|             return( true ); | ||||
|         } else { | ||||
|             return SELF; | ||||
|         }; | ||||
|     }; | ||||
|     false; | ||||
| }; | ||||
|  | ||||
| variable HERE = <<EOF; | ||||
| ; This example demonstrates an in-line heredoc style config file | ||||
| [main] | ||||
| awesome = true | ||||
| EOF | ||||
|  | ||||
| variable small = false;#This should be highlighted normally again. | ||||
							
								
								
									
										447
									
								
								samples/Perl/example.cgi
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										447
									
								
								samples/Perl/example.cgi
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,447 @@ | ||||
| #!/usr/bin/perl | ||||
|  | ||||
| # v1.0 | ||||
| # nagiostat, program to insert performance-data from Nagios into RRD-archives | ||||
| # Copyright (C) 2004  Carl Bingel / Svensk IT konsult AB | ||||
| # | ||||
| # This program is free software; you can redistribute it and/or | ||||
| # modify it under the terms of the GNU General Public License | ||||
| # as published by the Free Software Foundation; either version 2 | ||||
| # of the License, or (at your option) any later version. | ||||
| # | ||||
| # This program is distributed in the hope that it will be useful, | ||||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| # GNU General Public License for more details. | ||||
| # | ||||
| # You should have received a copy of the GNU General Public License | ||||
| # along with this program; if not, write to the Free Software | ||||
| # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. | ||||
|  | ||||
| use strict; | ||||
|  | ||||
| ## Basic configuration options | ||||
| my $BASE_DIR = "/usr/share/nagiostat"; | ||||
| my $CONFIG_FILE = "/etc/nagios/nagiostat.conf";  ## Config-file location | ||||
| my $DEBUG_LOG_FILE = "/var/spool/nagiostat/debug.log";    ## Specify where to create log-file and what filename (must be writable by nagios-user!) | ||||
| my $DEBUGLEVEL = 1;              ## 0=Nothing, 1=Errors, 2=Warnings, 3=Debug | ||||
| my $DEBUGOUTPUT = 0;		 ## 0=file, 1=STDERR, 2=STDOUT (for cgi) | ||||
|  | ||||
| require 'shellwords.pl'; | ||||
|  | ||||
| ## Global vars | ||||
| my $DEBUG_TIMESTAMP=0; | ||||
|  | ||||
| ## Find out how program is run | ||||
| if( $ARGV[0] eq "-t") {		## -t = test configuration-file | ||||
|   print STDERR "nagiostat: Testing configuration-file..\n"; | ||||
|   $DEBUGLEVEL=3; | ||||
|   $DEBUGOUTPUT=1;    ## output errors to console and not file | ||||
|   my $c = &read_config(); | ||||
|   abort(); | ||||
| } elsif( $ARGV[0] eq "-p") {	## -p = parse performance-data (when started by nagios) | ||||
|   &parse_perfdata(); | ||||
| } else { | ||||
|   if( exists $ENV{'GATEWAY_INTERFACE'}) {	## we are run as a CGI-script! | ||||
|     $DEBUGOUTPUT=2;  ## output errors to web-browser | ||||
|     &run_as_cgi(); | ||||
|   } else {                                ## print some help-info | ||||
|     print STDERR "nagiostat: usage: | ||||
|         -t	Test configuration-file | ||||
|         -p	Parse/import performance-data (used when called from nagios) | ||||
| "; | ||||
|   } | ||||
| } | ||||
|  | ||||
| abort(); | ||||
|  | ||||
| sub abort { | ||||
|    ## logfile: write blank if we wrote anything... | ||||
|    if( $DEBUG_TIMESTAMP!=0) { | ||||
|      debug( 1, "");	 | ||||
|    } | ||||
|    exit; | ||||
| } | ||||
|  | ||||
| ## | ||||
| ##  Program is called as CGI | ||||
| ## | ||||
| sub run_as_cgi { | ||||
|    use CGI; | ||||
|    my $cgi = new CGI; | ||||
|     | ||||
|    my $graph_name = $cgi->param( "graph_name"); | ||||
|    my $graph_iteration = $cgi->param( "graph_iteration"); | ||||
|  | ||||
|    if( $graph_iteration eq "") { | ||||
|       print "Content-type: text/html\nExpires: 0\n\n"; | ||||
|    } else { | ||||
|       print "Content-type: image/gif\nExpires: 0\n\n"; | ||||
|    } | ||||
|  | ||||
|    my $config = read_config(); | ||||
|  | ||||
|    if( $graph_name eq "") {       | ||||
|       ## | ||||
|       ## display index of graphs | ||||
|       ## | ||||
|       display_htmltemplate( $config->{'htmltemplatepath'}."/".$config->{'graphindextemplate'}, $graph_name, $config); | ||||
|    } else {                      ## display graph | ||||
|       if( ! exists $config->{'graphs'}->{$graph_name}) { | ||||
|          debug( 1, "ERROR: Graph '$graph_name' does not exist!"); | ||||
|          exit; | ||||
|       } elsif( $graph_iteration eq "") { | ||||
|          ## | ||||
|          ## Display HTML-page with all the graphs | ||||
|          ## | ||||
|          if( ! -r $config->{'htmltemplatepath'}."/".$config->{'graphs'}->{$graph_name}->{'htmltemplate'}) { | ||||
|             debug( 1, "ERROR: HTML-template '".($config->{'htmltemplatepath'}."/".$config->{'graphs'}->{$graph_name}->{'htmltemplate'})."' is not readable by effective userid!"); | ||||
|             exit; | ||||
|          } | ||||
|          display_htmltemplate( $config->{'htmltemplatepath'}."/".$config->{'graphs'}->{$graph_name}->{'htmltemplate'}, $graph_name, $config); | ||||
|       } else {                    | ||||
|          ## | ||||
|          ## generate graph (call 'rrdtool graph') | ||||
|          ## | ||||
|          my $rrdtool_cmdline = $config->{'rrdtoolpath'}." graph - ".join( " ", @{$config->{'plottemplates'}->{ $config->{'graphs'}->{$graph_name}->{'plottemplate'} } });  | ||||
|           | ||||
|          ## expand variables | ||||
|          my $rrdarchive = $config->{'rrdarchivepath'}."/".$config->{'graphs'}->{$graph_name}->{'rrdfilename'}; | ||||
|          $rrdtool_cmdline =~ s/\$f/$rrdarchive/g; | ||||
|          my $t_start = $config->{'graphtimetemplates'}->{ $config->{'graphs'}->{$graph_name}->{'graphtimetemplate'} }->[$graph_iteration]->{'starttime'}; | ||||
|          $rrdtool_cmdline =~ s/\$s/$t_start/g; | ||||
|          my $t_end = $config->{'graphtimetemplates'}->{ $config->{'graphs'}->{$graph_name}->{'graphtimetemplate'} }->[$graph_iteration]->{'endtime'}; | ||||
|          $rrdtool_cmdline =~ s/\$e/$t_end/g; | ||||
|          my $t_descr = $config->{'graphtimetemplates'}->{ $config->{'graphs'}->{$graph_name}->{'graphtimetemplate'} }->[$graph_iteration]->{'description'}; | ||||
|          $rrdtool_cmdline =~ s/\$d/$t_descr/g; | ||||
|  | ||||
|          ## Call rrdtool (should probably be fixed to call it in a better way, like exec) | ||||
|          print `$rrdtool_cmdline`; | ||||
|       } | ||||
|  | ||||
|    } | ||||
|  | ||||
| } | ||||
|  | ||||
| ## Display HTML template (and do variable-substitution and other stuff) | ||||
| ## | ||||
| sub display_htmltemplate { | ||||
|    my( $filename, $graph_name, $config) = @_; | ||||
|  | ||||
|    if( -r $filename) { | ||||
|       open( HTML, $filename); | ||||
|       while( <HTML>) { | ||||
|          ## All is a big regex.. :-) | ||||
|          s/\$(\w+)/my $t=sub {    | ||||
|             my $varname = $_[0]; | ||||
|             if( $varname eq "GRAPHNAME") {                           ## return the name of the graph | ||||
|                if( $config->{'graphs'}->{$graph_name}->{'title'} ne "") { | ||||
|                   return( $config->{'graphs'}->{$graph_name}->{'title'}); | ||||
|                } else { | ||||
|                   return( "Graph ".$graph_name); | ||||
|                } | ||||
|             } elsif( $varname eq "CURRENTTIME") {                    ## return current date-time | ||||
|                return( localtime()); | ||||
|             } elsif( $varname eq "GRAPHINDEX" || $varname eq "GRAPHINDEX_ONEROW") {    ## return HTML-code for index of the different graphs | ||||
|                my $return_html; | ||||
|                foreach my $gn ( sort keys %{$config->{'graphs'}}) {            | ||||
|                      $return_html.=(($varname eq "GRAPHINDEX")?"<LI>":""). | ||||
|                      "<A HREF=\"?graph_name=$gn\">".($config->{'graphs'}->{$gn}->{'title'})."<\/A>".                  # must escape slash since were inside an regex! | ||||
|                      (($varname eq "GRAPHINDEX_ONEROW")?"  ":""); | ||||
|                } | ||||
|                return( $return_html); | ||||
|             } elsif( $varname eq "GRAPH_AUTOGENERATE") {             ## return HTML-code for displaying the actual graph-images | ||||
|                my $iteration_id=0; | ||||
|                my $return_html; | ||||
|                foreach my $time ( @{ $config->{'graphtimetemplates'}->{ $config->{'graphs'}->{$graph_name}->{'graphtimetemplate'} } }) { | ||||
|                  $return_html.="<P>".($time->{'description'})."<BR><IMG SRC=\"?graph_name=$graph_name&graph_iteration=$iteration_id\">";  | ||||
|                  $iteration_id++; | ||||
|                } | ||||
|                return( $return_html); | ||||
|             } else {                                                 ## unknown variable | ||||
|                return( "##UNKNOWN-VARIABLE##"); | ||||
|             } | ||||
|          }; &$t($1)/eig;   ## i thought that regex would never end! | ||||
|          print; | ||||
|       } | ||||
|       close( HTML); | ||||
|    } else { | ||||
|       print "ERROR: HTML-template '$filename' does not exist or is not readable by effective userid."; | ||||
|    } | ||||
|  | ||||
| } | ||||
|  | ||||
| ## | ||||
| ##  Process incoming performance-data (parse output from check-plugin and insert values into rrd-archives) | ||||
| ## | ||||
| sub parse_perfdata { | ||||
|  | ||||
|   $DEBUG_TIMESTAMP=0; | ||||
|    | ||||
|   my $config = read_config(); | ||||
|  | ||||
|   my $rrd_updates; | ||||
|  | ||||
|   ##  Provide more symbolic names (same names as the macros in nagios configuration-file) | ||||
|  | ||||
|   my( $LASTCHECK, $HOSTNAME, $SERVICEDESCR, $SERVICESTATE, $OUTPUT, $PERFDATA) = split( /\|!!\|/, $ARGV[1]); | ||||
|   debug( 3, "**INCOMING PERFDATA:\n  LASTCHECK=$LASTCHECK\n  HOSTNAME=$HOSTNAME\n  SERVICEDESCR=\"$SERVICEDESCR\"\n  SERVICESTATE=\"$SERVICESTATE\"\n  OUTPUT=\"$OUTPUT\"\n  PERFDATA=\"$PERFDATA\""); | ||||
|    | ||||
|   my $host_and_descr_found; | ||||
|   ## Loop through all host_regexes | ||||
|   foreach my $host_regex ( keys %{$config->{'regexes'}}) { | ||||
|     ## Loop through all service_description_regexes | ||||
|     foreach my $service_regex ( keys %{$config->{'regexes'}->{$host_regex}}) { | ||||
|       if( ($HOSTNAME =~ m/$host_regex/i) && ($SERVICEDESCR =~ m/$service_regex/i) ) {     ## match! | ||||
|         $host_and_descr_found=1; | ||||
|         ## Loop through all InsertValue-lines with same host and service_description match | ||||
|         foreach my $insert_value ( @{$config->{'regexes'}->{$host_regex}->{$service_regex}} ) { | ||||
|           ## Loop through all regexes that should match values in the output/perfdata | ||||
|           foreach my $regex ( @{ $config->{'valueregextemplates'}->{$insert_value->{'regextemplate'}} }) { | ||||
|              my $regex_string = $regex->{'regex'}; | ||||
|              if( $regex->{'regex_what'} eq "output") {         ## do regex on "output" | ||||
|                 if( $OUTPUT =~ m/$regex_string/) { | ||||
|                    debug( 3, " +VALUE: ".$1); | ||||
|                    push( @{$rrd_updates->{$insert_value->{'rrdarchive'}}->{'value'}}, $1); | ||||
|                    push( @{$rrd_updates->{$insert_value->{'rrdarchive'}}->{'dsaname'}}, $regex->{'dsaname'}); | ||||
|                    $rrd_updates->{$insert_value->{'rrdarchive'}}->{'rrdcreatetemplate'} = $insert_value->{'rrdcreatetemplate'};  #$config->{'regexes'}->{$host_regex}->{$service_regex}->[0]->{'rrdcreatetemplate'}; | ||||
|                 } else { | ||||
|                    debug( 2, "**WARNING: No match for value with regex on output '$regex_string'."); | ||||
|                 } | ||||
|              } else {                                          ## do regex on "perfdata" | ||||
|                 if( $PERFDATA =~ m/$regex_string/) { | ||||
|                    debug( 3, " +VALUE: ".$1); | ||||
|                    push( @{$rrd_updates->{$insert_value->{'rrdarchive'}}->{'value'}}, $1); | ||||
|                    push( @{$rrd_updates->{$insert_value->{'rrdarchive'}}->{'dsaname'}}, $regex->{'dsaname'}); | ||||
|                    $rrd_updates->{$insert_value->{'rrdarchive'}}->{'rrdcreatetemplate'} = $insert_value->{'rrdcreatetemplate'};  #$config->{'regexes'}->{$host_regex}->{$service_regex}->[0]->{'rrdcreatetemplate'}; | ||||
|                 } else { | ||||
|                    debug( 2, "**WARNING: No match for value with regex on perfdata '$regex_string'."); | ||||
|                 } | ||||
|              } | ||||
|           } | ||||
|         } | ||||
|          | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|    | ||||
|   if( !$host_and_descr_found) { | ||||
|     debug( 2, "**WARNING: Hostname and description didn't match any of the regexes in the config-file."); | ||||
|   } else { | ||||
|     ## | ||||
|     ## Insert the value into the RRD by calling the rrdtool (may be several rrd-archives) | ||||
|     ## | ||||
|     foreach my $archive ( keys %{$rrd_updates}) { | ||||
|       debug( 3, " =INSERT into '$archive': ".join( ",", @{$rrd_updates->{$archive}->{'value'}} )." DSA-names=".join( ",", @{$rrd_updates->{$archive}->{'dsaname'}}) ); | ||||
|        | ||||
|       my $rrdarchive_filename = $config->{'rrdarchivepath'}."/".$archive; | ||||
|        | ||||
|       ## Create RRD-Archive (according to template) if it does not exist | ||||
|       if( ! -e $rrdarchive_filename) { | ||||
|          my $rrdtool_cmdline = $config->{'rrdtoolpath'}." create ".$rrdarchive_filename." ".(join( " ", @{$config->{'rrdcreatetemplates'}->{$rrd_updates->{$archive}->{'rrdcreatetemplate'}}})); | ||||
|          debug( 2, "**CREATING: $rrdarchive_filename, cmdline='".$rrdtool_cmdline."'."); | ||||
|          `$rrdtool_cmdline`; | ||||
|       } | ||||
|  | ||||
|       ## Check if rrd-archive is writable | ||||
|       if( ! -w $rrdarchive_filename) {					## check wheter RRD-archive exists | ||||
|         debug( 1, "!!ERROR: RRD-archive '".$rrdarchive_filename."' does not exist or is not writable by effective UID."); abort(); | ||||
|       } | ||||
|  | ||||
|       ## Assemle command-line for rrdtool | ||||
|       my $rrdtool_cmdline = $config->{'rrdtoolpath'}." update ".$rrdarchive_filename. | ||||
| 	                    " --template ".join( ":", @{$rrd_updates->{$archive}->{'dsaname'}}). | ||||
|                             " $LASTCHECK:".join( ":", @{$rrd_updates->{$archive}->{'value'}}); | ||||
|       debug( 3, " !RRDCMDLINE: ".$rrdtool_cmdline); | ||||
|       my $result = `$rrdtool_cmdline`; | ||||
|       if( $result ne "") { | ||||
|         debug( 1, "!!RESULT: $result"); | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## | ||||
| ##  Read config-file and check for errors | ||||
| ## | ||||
| sub read_config { | ||||
|   my $config; | ||||
|   open( CONFIG, $CONFIG_FILE); | ||||
|   my( $line_counter); | ||||
|   while( <CONFIG>) { | ||||
|     $line_counter++; | ||||
|     chomp; | ||||
|     my( @args) = &shellwords( $_); | ||||
|     my $orig_confline = $_; | ||||
|     $args[0] = uc( $args[0]); | ||||
|    | ||||
|     if( $args[0] eq "INSERTVALUE") {	##  INSERTVALUE-command | ||||
|       shift @args; | ||||
|       my( $rrd_filename, $rrdcreatetemplate, $hostname_regex, $servicedescr_regex, $regex_template) = @args; | ||||
|  | ||||
|       if( ! exists $config->{'rrdcreatetemplates'}->{$rrdcreatetemplate}) { | ||||
|          debug( 1, "!!ERROR: RRDCreateTemplate '$rrdcreatetemplate' is not defined but refered to in line $line_counter."); abort(); | ||||
|       } | ||||
|       if( $hostname_regex !~ m/^\/(.*)\/$/) {			## verify hostname regex | ||||
|         debug( 1, "!!ERROR: Hostname regex should be enclosed in slashes, i.e. /HOSTNAME/ and optionally enclosed in quotes if needed. Conf-line $line_counter."); abort(); | ||||
|       } else { | ||||
|         $hostname_regex = $1; | ||||
|       } | ||||
|       if( $servicedescr_regex !~ m/^\/(.*)\/$/) {			## verify service description regex | ||||
|         debug( 1, "!!ERROR: Service-description regex should be enclosed in slashes, i.e. /SERVICEDESCR/ and optionally enclosed in quotes if needed. Config-line $line_counter."); | ||||
|         abort(); | ||||
|       } else { | ||||
|         $servicedescr_regex = $1; | ||||
|       } | ||||
|       if( ! exists $config->{'valueregextemplates'}->{$regex_template}) {  ## verify value-regex-template exists | ||||
|          debug( 1, "!!ERROR: VALUEREGEXTEMPLATE '$regex_template' is not defined on line $line_counter."); abort(); | ||||
|       } | ||||
|       push( @{$config->{'regexes'}->{$hostname_regex}->{$servicedescr_regex}}, { | ||||
|             'rrdarchive' => $rrd_filename, | ||||
|             'rrdcreatetemplate' => $rrdcreatetemplate, | ||||
|             'regextemplate' => $regex_template | ||||
|             } ); | ||||
|     } elsif( $args[0] =~ m/^(\s*)#/ || $args[0] eq "") {	## comment or blank row | ||||
|       ## do nuthin | ||||
|     } elsif( $args[0] eq "RRDTOOLPATH") {               ## RRDToolPath args: path | ||||
|       $config->{'rrdtoolpath'} = $args[1]; | ||||
|     } elsif( $args[0] eq "PLOTTEMPLATE") {		## PlotTemplate args: name,htmltemplate,parameters.. | ||||
|       shift @args; | ||||
|       my( $name, @params) = @args; | ||||
|       if( $name eq "") { | ||||
|         debug( 1, "!!ERROR: PLOTTEMPLATE-name must be specified on line $line_counter."); abort(); | ||||
|       } | ||||
|       if( exists $config->{'plottemplates'}->{$name}) { | ||||
|         debug( 1, "!!ERROR: PLOTTTEMPLATE-names must be uniqe. Duplicate name found on line: $line_counter."); abort(); | ||||
|       } | ||||
|       $config->{'plottemplates'}->{$name} = [ @params]; | ||||
|     } elsif( $args[0] eq "GRAPHTIMETEMPLATE") {         ## GraphTimeTemplate args: name,parameters.. | ||||
|       shift @args; | ||||
|       my( $name, @params) = @args; | ||||
|       if( $name eq "") { | ||||
|         debug( 1, "!!ERROR: GRAPHTIMETEMPLATE-name must be specified on line $line_counter."); abort(); | ||||
|       } | ||||
|       if( exists $config->{'graphtimetemplates'}->{$name}) { | ||||
|         debug( 1, "!!ERROR: GRAPHTIMETEMPLATE-names must be uniqe. Duplicate name found on line: $line_counter."); abort(); | ||||
|       } | ||||
|       foreach my $time_template (@params) { | ||||
|          my( $t_start, $t_end, @t_descr) = split( /:/, $time_template); | ||||
|          my $t_descr = join( ":", @t_descr);    # workaround if ':' is used in description-string | ||||
|          if( $t_start eq "" || $t_end eq "") { | ||||
|             debug( 1, "!!ERROR: GRAPHTIMETEMPLATE, each time-definition should be defined as '<starttime>:<endtime>:<description>' on line $line_counter."); | ||||
|          } | ||||
|          push( @{$config->{'graphtimetemplates'}->{$name}}, { | ||||
|              'starttime' => $t_start, | ||||
|              'endtime' => $t_end, | ||||
|              'description' => $t_descr | ||||
|          }); | ||||
|       } | ||||
|     } elsif( $args[0] eq "RRDCREATETEMPLATE") {         ## RRDCreateTemplate | ||||
|       shift @args; | ||||
|       my( $name, @params) = @args; | ||||
|       if( $name eq "") { | ||||
|         debug( 1, "!!ERROR: RRDCREATETEMPLATE-name must be specified on line $line_counter."); abort(); | ||||
|       } | ||||
|       if( exists $config->{'rrdcreatetemplates'}->{$name}) { | ||||
|         debug( 1, "!!ERROR: RRDCREATETEMPLATE-names must be uniq. Duplicate name found on line: $line_counter."); abort(); | ||||
|       } | ||||
|       $config->{'rrdcreatetemplates'}->{$name} = [ @params]; | ||||
|     } elsif( $args[0] eq "VALUEREGEXTEMPLATE") {        ## ValueRegexTemplate | ||||
|       shift @args; | ||||
|       my( $template_name, @regexes) = @args; | ||||
|       if( $template_name eq "") { | ||||
|          debug( 1, "!!ERROR: VALUEREGEXTEMPLATE-name must be specified on line $line_counter."); abort(); | ||||
|       } | ||||
|       foreach my $r (@regexes) { | ||||
|          if( $r !~ m/^(output|perfdata):(\w+):\/(.*)\/$/) { | ||||
|            debug( 1, "!!ERROR: Value-regex should be formatted as 'output:dsaname:/regex/' or 'perfdata:dsaname:/regex/' depending on in which field to extract the data. The value should be within parantheses in the regex. Config-line $line_counter."); | ||||
|            abort(); | ||||
|          } else { | ||||
|            my( $regex_what, $dsa_name, $regex) = ( $1, $2, $3); | ||||
|            push( @{$config->{'valueregextemplates'}->{$template_name}}, {  | ||||
|                    'regex_what' => $regex_what,  | ||||
|                    'regex' => $regex,  | ||||
|                    'dsaname' => $dsa_name | ||||
|                   } ); | ||||
|          } | ||||
|       } | ||||
|     } elsif( $args[0] eq "RRDARCHIVEPATH") {            ## RRDARCHIVEPATH | ||||
|       $config->{'rrdarchivepath'} = $args[1]; | ||||
|     } elsif( $args[0] eq "HTMLTEMPLATEPATH") {          ## HTMLTemplatePath | ||||
|       $config->{'htmltemplatepath'} = $args[1]; | ||||
|     } elsif( $args[0] eq "GRAPHINDEXTEMPLATE") {        ## GraphIndexTemplate | ||||
|       $config->{'graphindextemplate'} = $args[1]; | ||||
|     } elsif( $args[0] eq "GRAPH") {			## GRAPH args: name,rrdfilename,rrdcreatetemplate,graphtimetemplate,plottemplate,htmltemplate | ||||
|       if( $args[1] eq "") { | ||||
| 	debug( 1, "!!ERROR: GRAPH-name must be specified on line $line_counter."); abort(); | ||||
|       } | ||||
|       if( ! exists $config->{'graphtimetemplates'}->{$args[3]}) { | ||||
|         debug( 1, "!!ERROR: Unknown GRAPHTIMETEMPLATE on line $line_counter."); abort(); | ||||
|       } | ||||
|       if( ! exists $config->{'plottemplates'}->{$args[4]}) { | ||||
|         debug( 1, "!!ERROR: Unknown PLOTTEMPLATE on line $line_counter."); abort(); | ||||
|       } | ||||
|       if( exists $config->{'graphs'}->{$args[1]}) { | ||||
|         debug( 1, "!!ERROR: Graphnames must be uniqe. Duplicate name found on line: $line_counter."); | ||||
|         abort(); | ||||
|       } else { | ||||
|         $config->{'graphs'}->{$args[1]} = { | ||||
| 		'graphname' => $args[1], | ||||
| 		'rrdfilename' => $args[2], | ||||
|                 'graphtimetemplate' => $args[3], | ||||
|                 'plottemplate' => $args[4], | ||||
|                 'htmltemplate' => $args[5], | ||||
|                 'title' => $args[6] | ||||
|         }; | ||||
|       } | ||||
|     } else { | ||||
|       debug( 1, "!!ERROR: Unknown config-file directive on line $line_counter: '".$args[0]."'"); | ||||
|     } | ||||
|   } | ||||
|   close( CONFIG); | ||||
|  | ||||
|   if( ! -x $config->{'rrdtoolpath'}) { | ||||
|     debug( 1, "!!ERROR: RRDTOOLPATH does not point to executable rrdtool-binary."); | ||||
|     abort(); | ||||
|   } | ||||
|   if( ! -x $config->{'rrdarchivepath'}) { | ||||
|      debug( 1, "!!ERROR: RRDARCHIVEPATH, '".($config->{'rrdarchivepath'})."' is not readable by effective userid."); abort(); | ||||
|   } | ||||
|   if( ! -x $config->{'htmltemplatepath'}) { | ||||
|      debug( 1, "!!ERROR: HTMLTEMPLATEPATH, '".($config->{'htmltemplatepath'})."' is not readable by effective userid."); abort(); | ||||
|   } | ||||
|  | ||||
|   return( $config); | ||||
| } | ||||
|  | ||||
|  | ||||
| ##  | ||||
| ##  Write debug-output/logging | ||||
| ## | ||||
| sub debug { | ||||
|   my( $level, $msg) = @_; | ||||
|   if( $DEBUGLEVEL >= $level) { | ||||
|  | ||||
|     ## write timestamp | ||||
|     if( !$DEBUG_TIMESTAMP) {	 | ||||
|       $DEBUG_TIMESTAMP=1; | ||||
|       debug( 1, scalar localtime()); | ||||
|     } | ||||
|  | ||||
|     ## write to file or STDERR | ||||
|     if( $DEBUGOUTPUT == 0) { | ||||
|       open( DEBUGOUTPUT, ">>".$DEBUG_LOG_FILE); | ||||
|       print DEBUGOUTPUT $msg."\n"; | ||||
|       close( DEBUGOUTPUT); | ||||
|     } elsif( $DEBUGOUTPUT == 2) { | ||||
|       print "<BR><PRE>$msg</PRE>"; | ||||
|     } else { | ||||
|       print STDERR $msg."\n"; | ||||
|     } | ||||
|  | ||||
|   } | ||||
| } | ||||
							
								
								
									
										11
									
								
								samples/Perl/strict.t
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								samples/Perl/strict.t
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | ||||
| use Test::Base; | ||||
|  | ||||
| __DATA__ | ||||
| === Strict Test | ||||
|  | ||||
| --- perl strict | ||||
| my $x = 5; | ||||
| --- strict | ||||
| use strict; | ||||
| use warnings; | ||||
| my $x = 5; | ||||
							
								
								
									
										10
									
								
								samples/PigLatin/example.pig
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								samples/PigLatin/example.pig
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | ||||
| /** | ||||
|  * sample.pig | ||||
|  */ | ||||
|  | ||||
| REGISTER $SOME_JAR; | ||||
|  | ||||
| A = LOAD 'person' USING PigStorage() AS (name:chararray, age:int); -- Load person | ||||
| B = FOREACH A generate name; | ||||
| DUMP B; | ||||
|  | ||||
							
								
								
									
										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 | ||||
							
								
								
									
										1051
									
								
								samples/Prolog/admin.pl
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										1051
									
								
								samples/Prolog/admin.pl
									
									
									
									
									
										Executable file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user