mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	Compare commits
	
		
			493 Commits
		
	
	
		
			v2.10.15
			...
			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 | ||
|  | 37781cb58e | ||
|  | dcc598442b | ||
|  | 91877056fb | ||
|  | 868e9df434 | ||
|  | c3642ba7ed | ||
|  | 56f128af66 | ||
|  | c1e560b901 | ||
|  | 92bc1cdcdf | ||
|  | 9fde0ec447 | ||
|  | 297ef6195d | ||
|  | 9873157076 | ||
|  | 675c1f3c0b | ||
|  | fee7a34ddc | ||
|  | a148d52aed | ||
|  | 5da8831aff | ||
|  | e9ff0f4998 | ||
|  | 658bf98b4c | ||
|  | 452cfd32d7 | ||
|  | 3f1dc71cc2 | ||
|  | 256157cd42 | ||
|  | 843279ff1d | ||
|  | 8118546ac7 | ||
|  | 15c05c723e | ||
|  | d0d40c0d2e | ||
|  | f494972d04 | ||
|  | 1c4def7320 | ||
|  | 6e22b946bd | ||
|  | 0a54df3a12 | ||
|  | 20af70cd90 | ||
|  | a2f721d4ef | ||
|  | 03a1a733f6 | ||
|  | 4a76088b43 | ||
|  | 5a1dab8073 | ||
|  | 86a97610bd | ||
|  | 87bfe3657a | ||
|  | 3802e31b90 | ||
|  | 4eff60e4b1 | ||
|  | f103306e91 | ||
|  | 8b878784a4 | ||
|  | 44a0d19ac0 | ||
|  | 3023516796 | ||
|  | 6038a06c43 | ||
|  | 20735a4cdd | ||
|  | df3b1a983e | ||
|  | 84e43d7d3f | ||
|  | 7e81a9e50b | ||
|  | 28acee8e33 | ||
|  | 80184f1e1d | ||
|  | d893259e75 | ||
|  | d3f37f5013 | ||
|  | 0e6a46abfc | ||
|  | 49e27387b7 | ||
|  | c2495c27d3 | ||
|  | f0a3acd735 | ||
|  | 29d2930de8 | ||
|  | 2d82071103 | ||
|  | f4a3636371 | ||
|  | d8f96441da | ||
|  | cf5646d45a | ||
|  | 5c3d32cafd | ||
|  | ea45db38e9 | ||
|  | a978c4eb34 | ||
|  | 65302dbec7 | ||
|  | 3c82131863 | ||
|  | 00873da7a6 | ||
|  | a17f7d1cb2 | ||
|  | 9f850db126 | ||
|  | e513ac628a | ||
|  | 3dc11186a1 | ||
|  | 9d569c8bd5 | ||
|  | 26fbc45baf | ||
|  | 9ae0bdbb43 | ||
|  | a3aaa1ec4d | ||
|  | ee3c9bcdbd | ||
|  | dc1b0e3c48 | ||
|  | 869cf8ba11 | ||
|  | a2690b7dac | ||
|  | e2b1fe3641 | ||
|  | 0eebd42d72 | ||
|  | aa78060e41 | ||
|  | 89795ebd1f | ||
|  | 5fb6f34d8a | ||
|  | 3ecc1f883c | ||
|  | edf19a0941 | ||
|  | dfeaaaa17e | ||
|  | bcefa61fe0 | ||
|  | 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,12 +1,11 @@ | |||||||
| before_install:  | before_install:  | ||||||
|  |   - git fetch origin master:master | ||||||
|  |   - git fetch origin v2.0.0:v2.0.0 | ||||||
|   - sudo apt-get install libicu-dev -y |   - sudo apt-get install libicu-dev -y | ||||||
|   - gem update --system 2.1.11 |   - gem update --system 2.1.11 | ||||||
| rvm: | rvm: | ||||||
|   - 1.8.7 |  | ||||||
|   - 1.9.2 |  | ||||||
|   - 1.9.3 |   - 1.9.3 | ||||||
|   - 2.0.0 |   - 2.0.0 | ||||||
|   - 2.1.1 |   - 2.1.1 | ||||||
|   - ree |  | ||||||
| notifications: | notifications: | ||||||
|   disabled: true |   disabled: true | ||||||
|   | |||||||
							
								
								
									
										5
									
								
								Gemfile
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								Gemfile
									
									
									
									
										vendored
									
									
								
							| @@ -1,7 +1,2 @@ | |||||||
| source 'https://rubygems.org' | source 'https://rubygems.org' | ||||||
| gemspec | gemspec | ||||||
|  |  | ||||||
| if RUBY_VERSION < "1.9.3" |  | ||||||
|   # escape_utils 1.0.0 requires 1.9.3 and above |  | ||||||
|   gem "escape_utils", "0.3.2" |  | ||||||
| end |  | ||||||
|   | |||||||
							
								
								
									
										42
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										42
									
								
								README.md
									
									
									
									
									
								
							| @@ -106,8 +106,50 @@ To update the `samples.json` after adding new files to [`samples/`](https://gith | |||||||
|  |  | ||||||
|     bundle exec rake samples |     bundle exec rake samples | ||||||
|  |  | ||||||
|  | ### A note on language extensions | ||||||
|  |  | ||||||
|  | Linguist has a number of methods available to it for identifying the language of a particular file. The initial lookup is based upon the extension of the file, possible file extensions are defined in an array called `extensions`. Take a look at this example for example for `Perl`: | ||||||
|  |  | ||||||
|  | ``` | ||||||
|  | Perl: | ||||||
|  |   type: programming | ||||||
|  |   ace_mode: perl | ||||||
|  |   color: "#0298c3" | ||||||
|  |   extensions: | ||||||
|  |   - .pl | ||||||
|  |   - .PL | ||||||
|  |   - .perl | ||||||
|  |   - .ph | ||||||
|  |   - .plx | ||||||
|  |   - .pm | ||||||
|  |   - .pod | ||||||
|  |   - .psgi | ||||||
|  |   interpreters: | ||||||
|  |   - perl | ||||||
|  | ``` | ||||||
|  | Any of the extensions defined are valid but the first in this array should be the most popular. | ||||||
|  |  | ||||||
| ### Testing | ### Testing | ||||||
|  |  | ||||||
| Sometimes getting the tests running can be too much work, especially if you don't have much Ruby experience. It's okay: be lazy and let our build bot [Travis](http://travis-ci.org/#!/github/linguist) run the tests for you. Just open a pull request and the bot will start cranking away. | Sometimes getting the tests running can be too much work, especially if you don't have much Ruby experience. It's okay: be lazy and let our build bot [Travis](http://travis-ci.org/#!/github/linguist) run the tests for you. Just open a pull request and the bot will start cranking away. | ||||||
|  |  | ||||||
| Here's our current build status, which is hopefully green: [](http://travis-ci.org/github/linguist) | Here's our current build status, which is hopefully green: [](http://travis-ci.org/github/linguist) | ||||||
|  |  | ||||||
|  | ### Releasing | ||||||
|  |  | ||||||
|  | If you are the current maintainer of this gem: | ||||||
|  |  | ||||||
|  |  0. Create a branch for the release: `git checkout -b cut-release-vxx.xx.xx` | ||||||
|  |  0. Make sure your local dependencies are up to date: `bundle install` | ||||||
|  |  0. Ensure that samples are updated: `bundle exec rake samples` | ||||||
|  |  0. Ensure that tests are green: `bundle exec rake test` | ||||||
|  |  0. Bump gem version in `lib/linguist/version.rb`.  For example, [like this](https://github.com/github/linguist/commit/8d2ea90a5ba3b2fe6e1508b7155aa4632eea2985). | ||||||
|  |  0. Make a PR to github/linguist.  For example, [#1238](https://github.com/github/linguist/pull/1238). | ||||||
|  |  0. Build a local gem: `gem build github-linguist.gemspec` | ||||||
|  |  0. Testing: | ||||||
|  |    0. Bump the Gemfile and Gemfile.lock versions for an app which relies on this gem | ||||||
|  |    0. Install the new gem locally | ||||||
|  |    0. Test behavior locally, branch deploy, whatever needs to happen | ||||||
|  |  0. Merge github/linguist PR | ||||||
|  |  0. Tag and push: `git tag vx.xx.xx; git push --tags` | ||||||
|  |  0. Push to rubygems.org -- `gem push github-linguist-3.0.0.gem` | ||||||
|   | |||||||
| @@ -4,7 +4,9 @@ | |||||||
| #     usage: linguist <path> [<--breakdown>] | #     usage: linguist <path> [<--breakdown>] | ||||||
|  |  | ||||||
| require 'linguist/file_blob' | require 'linguist/file_blob' | ||||||
|  | require 'linguist/language' | ||||||
| require 'linguist/repository' | require 'linguist/repository' | ||||||
|  | require 'rugged' | ||||||
|  |  | ||||||
| path = ARGV[0] || Dir.pwd | path = ARGV[0] || Dir.pwd | ||||||
|  |  | ||||||
| @@ -18,7 +20,8 @@ ARGV.shift | |||||||
| breakdown = true if ARGV[0] == "--breakdown" | breakdown = true if ARGV[0] == "--breakdown" | ||||||
|  |  | ||||||
| if File.directory?(path) | if File.directory?(path) | ||||||
|   repo = Linguist::Repository.from_directory(path) |   rugged = Rugged::Repository.new(path) | ||||||
|  |   repo = Linguist::Repository.new(rugged, rugged.head.target_id) | ||||||
|   repo.languages.sort_by { |_, size| size }.reverse.each do |language, size| |   repo.languages.sort_by { |_, size| size }.reverse.each do |language, size| | ||||||
|     percentage = ((size / repo.size.to_f) * 100) |     percentage = ((size / repo.size.to_f) * 100) | ||||||
|     percentage = sprintf '%.2f' % percentage |     percentage = sprintf '%.2f' % percentage | ||||||
|   | |||||||
| @@ -13,10 +13,11 @@ Gem::Specification.new do |s| | |||||||
|   s.files = Dir['lib/**/*'] |   s.files = Dir['lib/**/*'] | ||||||
|   s.executables << 'linguist' |   s.executables << 'linguist' | ||||||
|  |  | ||||||
|   s.add_dependency 'charlock_holmes', '~> 0.6.6' |   s.add_dependency 'charlock_holmes', '~> 0.7.3' | ||||||
|   s.add_dependency 'escape_utils',    '>= 0.3.1' |   s.add_dependency 'escape_utils',    '~> 1.0.1' | ||||||
|   s.add_dependency 'mime-types',      '~> 1.19' |   s.add_dependency 'mime-types',      '~> 1.19' | ||||||
|   s.add_dependency 'pygments.rb',     '~> 0.5.4' |   s.add_dependency 'pygments.rb',     '~> 0.6.0' | ||||||
|  |   s.add_dependency 'rugged',          '~> 0.21.0' | ||||||
|  |  | ||||||
|   s.add_development_dependency 'json' |   s.add_development_dependency 'json' | ||||||
|   s.add_development_dependency 'mocha' |   s.add_development_dependency 'mocha' | ||||||
|   | |||||||
| @@ -1,6 +1,4 @@ | |||||||
| require 'linguist/generated' | require 'linguist/generated' | ||||||
| require 'linguist/language' |  | ||||||
|  |  | ||||||
| require 'charlock_holmes' | require 'charlock_holmes' | ||||||
| require 'escape_utils' | require 'escape_utils' | ||||||
| require 'mime/types' | require 'mime/types' | ||||||
| @@ -112,6 +110,12 @@ module Linguist | |||||||
|       end |       end | ||||||
|     end |     end | ||||||
|  |  | ||||||
|  |     def ruby_encoding | ||||||
|  |       if hash = detect_encoding | ||||||
|  |         hash[:ruby_encoding] | ||||||
|  |       end | ||||||
|  |     end | ||||||
|  |  | ||||||
|     # Try to guess the encoding |     # Try to guess the encoding | ||||||
|     # |     # | ||||||
|     # Returns: a Hash, with :encoding, :confidence, :type |     # Returns: a Hash, with :encoding, :confidence, :type | ||||||
| @@ -241,7 +245,31 @@ module Linguist | |||||||
|     def lines |     def lines | ||||||
|       @lines ||= |       @lines ||= | ||||||
|         if viewable? && data |         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 |         else | ||||||
|           [] |           [] | ||||||
|         end |         end | ||||||
| @@ -283,15 +311,7 @@ module Linguist | |||||||
|     # |     # | ||||||
|     # Returns a Language or nil if none is detected |     # Returns a Language or nil if none is detected | ||||||
|     def language |     def language | ||||||
|       return @language if defined? @language |       @language ||= Language.detect(self) | ||||||
|  |  | ||||||
|       if defined?(@data) && @data.is_a?(String) |  | ||||||
|         data = @data |  | ||||||
|       else |  | ||||||
|         data = lambda { (binary_mime_type? || binary?) ? "" : self.data } |  | ||||||
|       end |  | ||||||
|  |  | ||||||
|       @language = Language.detect(name.to_s, data, mode) |  | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     # Internal: Get the lexer of the blob. |     # Internal: Get the lexer of the blob. | ||||||
|   | |||||||
| @@ -52,5 +52,20 @@ module Linguist | |||||||
|     def size |     def size | ||||||
|       File.size(@path) |       File.size(@path) | ||||||
|     end |     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 | ||||||
| end | end | ||||||
|   | |||||||
| @@ -54,7 +54,7 @@ module Linguist | |||||||
|       name == 'Gemfile.lock' || |       name == 'Gemfile.lock' || | ||||||
|         minified_files? || |         minified_files? || | ||||||
|         compiled_coffeescript? || |         compiled_coffeescript? || | ||||||
|         xcode_project_file? || |         xcode_file? || | ||||||
|         generated_parser? || |         generated_parser? || | ||||||
|         generated_net_docfile? || |         generated_net_docfile? || | ||||||
|         generated_net_designer_file? || |         generated_net_designer_file? || | ||||||
| @@ -63,17 +63,18 @@ module Linguist | |||||||
|         generated_jni_header? || |         generated_jni_header? || | ||||||
|         composer_lock? || |         composer_lock? || | ||||||
|         node_modules? || |         node_modules? || | ||||||
|         vcr_cassette? |         vcr_cassette? || | ||||||
|  |         generated_by_zephir? | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     # Internal: Is the blob an XCode project file? |     # Internal: Is the blob an Xcode file? | ||||||
|     # |     # | ||||||
|     # Generated if the file extension is an XCode project |     # Generated if the file extension is an Xcode  | ||||||
|     # file extension. |     # file extension. | ||||||
|     # |     # | ||||||
|     # Returns true of false. |     # Returns true of false. | ||||||
|     def xcode_project_file? |     def xcode_file? | ||||||
|       ['.xib', '.nib', '.storyboard', '.pbxproj', '.xcworkspacedata', '.xcuserstate'].include?(extname) |       ['.nib', '.xcworkspacedata', '.xcuserstate'].include?(extname) | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     # Internal: Is the blob minified files? |     # Internal: Is the blob minified files? | ||||||
| @@ -234,7 +235,14 @@ module Linguist | |||||||
|     # |     # | ||||||
|     # Returns true or false. |     # Returns true or false. | ||||||
|     def composer_lock? |     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 |     end | ||||||
|  |  | ||||||
|     # Is the blob a VCR Cassette file? |     # Is the blob a VCR Cassette file? | ||||||
| @@ -248,3 +256,4 @@ module Linguist | |||||||
|     end |     end | ||||||
|   end |   end | ||||||
| end | end | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,7 +1,7 @@ | |||||||
| module Linguist | module Linguist | ||||||
|   # A collection of simple heuristics that can be used to better analyze languages. |   # A collection of simple heuristics that can be used to better analyze languages. | ||||||
|   class Heuristics |   class Heuristics | ||||||
|     ACTIVE = false |     ACTIVE = true | ||||||
|  |  | ||||||
|     # Public: Given an array of String language names, |     # Public: Given an array of String language names, | ||||||
|     # apply heuristics against the given data and return an array |     # apply heuristics against the given data and return an array | ||||||
| @@ -13,24 +13,13 @@ module Linguist | |||||||
|     # Returns an array of Languages or [] |     # Returns an array of Languages or [] | ||||||
|     def self.find_by_heuristics(data, languages) |     def self.find_by_heuristics(data, languages) | ||||||
|       if active? |       if active? | ||||||
|         if languages.all? { |l| ["Objective-C", "C++"].include?(l) } |  | ||||||
|           disambiguate_c(data, languages) |  | ||||||
|         end |  | ||||||
|         if languages.all? { |l| ["Perl", "Prolog"].include?(l) } |         if languages.all? { |l| ["Perl", "Prolog"].include?(l) } | ||||||
|           disambiguate_pl(data, languages) |           result = disambiguate_pl(data, languages) | ||||||
|         end |         end | ||||||
|         if languages.all? { |l| ["ECL", "Prolog"].include?(l) } |         if languages.all? { |l| ["ECL", "Prolog"].include?(l) } | ||||||
|           disambiguate_ecl(data, languages) |           result = 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) |  | ||||||
|         end |         end | ||||||
|  |         return result | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
|  |  | ||||||
|   | |||||||
| @@ -9,6 +9,8 @@ end | |||||||
| require 'linguist/classifier' | require 'linguist/classifier' | ||||||
| require 'linguist/heuristics' | require 'linguist/heuristics' | ||||||
| require 'linguist/samples' | require 'linguist/samples' | ||||||
|  | require 'linguist/file_blob' | ||||||
|  | require 'linguist/blob_helper' | ||||||
|  |  | ||||||
| module Linguist | module Linguist | ||||||
|   # Language names that are recognizable by GitHub. Defined languages |   # Language names that are recognizable by GitHub. Defined languages | ||||||
| @@ -24,7 +26,6 @@ module Linguist | |||||||
|     @extension_index          = Hash.new { |h,k| h[k] = [] } |     @extension_index          = Hash.new { |h,k| h[k] = [] } | ||||||
|     @interpreter_index        = Hash.new { |h,k| h[k] = [] } |     @interpreter_index        = Hash.new { |h,k| h[k] = [] } | ||||||
|     @filename_index           = Hash.new { |h,k| h[k] = [] } |     @filename_index           = Hash.new { |h,k| h[k] = [] } | ||||||
|     @primary_extension_index  = {} |  | ||||||
|  |  | ||||||
|     # Valid Languages types |     # Valid Languages types | ||||||
|     TYPES = [:data, :markup, :programming, :prose] |     TYPES = [:data, :markup, :programming, :prose] | ||||||
| @@ -80,12 +81,6 @@ module Linguist | |||||||
|         @extension_index[extension] << language |         @extension_index[extension] << language | ||||||
|       end |       end | ||||||
|  |  | ||||||
|       if @primary_extension_index.key?(language.primary_extension) |  | ||||||
|         raise ArgumentError, "Duplicate primary extension: #{language.primary_extension}" |  | ||||||
|       end |  | ||||||
|  |  | ||||||
|       @primary_extension_index[language.primary_extension] = language |  | ||||||
|  |  | ||||||
|       language.interpreters.each do |interpreter| |       language.interpreters.each do |interpreter| | ||||||
|         @interpreter_index[interpreter] << language |         @interpreter_index[interpreter] << language | ||||||
|       end |       end | ||||||
| @@ -99,18 +94,25 @@ module Linguist | |||||||
|  |  | ||||||
|     # Public: Detects the Language of the blob. |     # Public: Detects the Language of the blob. | ||||||
|     # |     # | ||||||
|     # name - String filename |     # blob - an object that includes the Linguist `BlobHelper` interface; | ||||||
|     # data - String blob data. A block also maybe passed in for lazy |     #       see Linguist::LazyBlob and Linguist::FileBlob for examples | ||||||
|     #        loading. This behavior is deprecated and you should always |  | ||||||
|     #        pass in a String. |  | ||||||
|     # mode - Optional String mode (defaults to nil) |  | ||||||
|     # |     # | ||||||
|     # Returns Language or nil. |     # Returns Language or nil. | ||||||
|     def self.detect(name, data, mode = nil) |     def self.detect(blob) | ||||||
|  |       name = blob.name.to_s | ||||||
|  |  | ||||||
|  |       # Check if the blob is possibly binary and bail early; this is a cheap | ||||||
|  |       # test that uses the extension name to guess a binary binary mime type. | ||||||
|  |       # | ||||||
|  |       # We'll perform a more comprehensive test later which actually involves | ||||||
|  |       # looking for binary characters in the blob | ||||||
|  |       return nil if blob.likely_binary? || blob.binary? | ||||||
|  |  | ||||||
|       # A bit of an elegant hack. If the file is executable but extensionless, |       # A bit of an elegant hack. If the file is executable but extensionless, | ||||||
|       # append a "magic" extension so it can be classified with other |       # append a "magic" extension so it can be classified with other | ||||||
|       # languages that have shebang scripts. |       # languages that have shebang scripts. | ||||||
|       if File.extname(name).empty? && mode && (mode.to_i(8) & 05) == 05 |       extension = FileBlob.new(name).extension | ||||||
|  |       if extension.empty? && blob.mode && (blob.mode.to_i(8) & 05) == 05 | ||||||
|         name += ".script!" |         name += ".script!" | ||||||
|       end |       end | ||||||
|  |  | ||||||
| @@ -121,10 +123,10 @@ module Linguist | |||||||
|       # extension at all, in the case of extensionless scripts), we need to continue |       # extension at all, in the case of extensionless scripts), we need to continue | ||||||
|       # our detection work |       # our detection work | ||||||
|       if possible_languages.length > 1 |       if possible_languages.length > 1 | ||||||
|         data = data.call() if data.respond_to?(:call) |         data = blob.data | ||||||
|         possible_language_names = possible_languages.map(&:name) |         possible_language_names = possible_languages.map(&:name) | ||||||
|  |  | ||||||
|         # Don't bother with emptiness |         # Don't bother with binary contents or an empty file | ||||||
|         if data.nil? || data == "" |         if data.nil? || data == "" | ||||||
|           nil |           nil | ||||||
|         # Check if there's a shebang line and use that as authoritative |         # Check if there's a shebang line and use that as authoritative | ||||||
| @@ -134,7 +136,7 @@ module Linguist | |||||||
|         elsif (determined = Heuristics.find_by_heuristics(data, possible_language_names)) && !determined.empty? |         elsif (determined = Heuristics.find_by_heuristics(data, possible_language_names)) && !determined.empty? | ||||||
|           determined.first |           determined.first | ||||||
|         # Lastly, fall back to the probablistic classifier. |         # 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`) |           # Return the actual Language object based of the string language name (i.e., first element of `#classify`) | ||||||
|           Language[classified[0]] |           Language[classified[0]] | ||||||
|         end |         end | ||||||
| @@ -190,9 +192,9 @@ module Linguist | |||||||
|     # |     # | ||||||
|     # Returns all matching Languages or [] if none were found. |     # Returns all matching Languages or [] if none were found. | ||||||
|     def self.find_by_filename(filename) |     def self.find_by_filename(filename) | ||||||
|       basename, extname = File.basename(filename), File.extname(filename) |       basename = File.basename(filename) | ||||||
|       langs = [@primary_extension_index[extname]] + |       extname = FileBlob.new(filename).extension | ||||||
|               @filename_index[basename] + |       langs = @filename_index[basename] + | ||||||
|               @extension_index[extname] |               @extension_index[extname] | ||||||
|       langs.compact.uniq |       langs.compact.uniq | ||||||
|     end |     end | ||||||
| @@ -299,15 +301,6 @@ module Linguist | |||||||
|       @interpreters = attributes[:interpreters]   || [] |       @interpreters = attributes[:interpreters]   || [] | ||||||
|       @filenames  = attributes[:filenames]  || [] |       @filenames  = attributes[:filenames]  || [] | ||||||
|  |  | ||||||
|       unless @primary_extension = attributes[:primary_extension] |  | ||||||
|         raise ArgumentError, "#{@name} is missing primary extension" |  | ||||||
|       end |  | ||||||
|  |  | ||||||
|       # Prepend primary extension unless its already included |  | ||||||
|       if primary_extension && !extensions.include?(primary_extension) |  | ||||||
|         @extensions = [primary_extension] + extensions |  | ||||||
|       end |  | ||||||
|  |  | ||||||
|       # Set popular, and searchable flags |       # Set popular, and searchable flags | ||||||
|       @popular    = attributes.key?(:popular)    ? attributes[:popular]    : false |       @popular    = attributes.key?(:popular)    ? attributes[:popular]    : false | ||||||
|       @searchable = attributes.key?(:searchable) ? attributes[:searchable] : true |       @searchable = attributes.key?(:searchable) ? attributes[:searchable] : true | ||||||
| @@ -395,20 +388,6 @@ module Linguist | |||||||
|     # Returns the extensions Array |     # Returns the extensions Array | ||||||
|     attr_reader :extensions |     attr_reader :extensions | ||||||
|  |  | ||||||
|     # Deprecated: Get primary extension |  | ||||||
|     # |  | ||||||
|     # Defaults to the first extension but can be overridden |  | ||||||
|     # in the languages.yml. |  | ||||||
|     # |  | ||||||
|     # The primary extension can not be nil. Tests should verify this. |  | ||||||
|     # |  | ||||||
|     # This attribute is only used by app/helpers/gists_helper.rb for |  | ||||||
|     # creating the language dropdown. It really should be using `name` |  | ||||||
|     # instead. Would like to drop primary extension. |  | ||||||
|     # |  | ||||||
|     # Returns the extension String. |  | ||||||
|     attr_reader :primary_extension |  | ||||||
|  |  | ||||||
|     # Public: Get interpreters |     # Public: Get interpreters | ||||||
|     # |     # | ||||||
|     # Examples |     # Examples | ||||||
| @@ -432,6 +411,22 @@ module Linguist | |||||||
|       (extensions + [primary_extension]).uniq |       (extensions + [primary_extension]).uniq | ||||||
|     end |     end | ||||||
|  |  | ||||||
|  |     # Deprecated: Get primary extension | ||||||
|  |     # | ||||||
|  |     # Defaults to the first extension but can be overridden | ||||||
|  |     # in the languages.yml. | ||||||
|  |     # | ||||||
|  |     # The primary extension can not be nil. Tests should verify this. | ||||||
|  |     # | ||||||
|  |     # This method is only used by app/helpers/gists_helper.rb for creating | ||||||
|  |     # the language dropdown. It really should be using `name` instead. | ||||||
|  |     # Would like to drop primary extension. | ||||||
|  |     # | ||||||
|  |     # Returns the extension String. | ||||||
|  |     def primary_extension | ||||||
|  |       extensions.first | ||||||
|  |     end | ||||||
|  |  | ||||||
|     # Public: Get URL escaped name. |     # Public: Get URL escaped name. | ||||||
|     # |     # | ||||||
|     # Examples |     # Examples | ||||||
| @@ -537,6 +532,7 @@ module Linguist | |||||||
|     if extnames = extensions[name] |     if extnames = extensions[name] | ||||||
|       extnames.each do |extname| |       extnames.each do |extname| | ||||||
|         if !options['extensions'].include?(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 |           options['extensions'] << extname | ||||||
|         end |         end | ||||||
|       end |       end | ||||||
| @@ -573,9 +569,8 @@ module Linguist | |||||||
|       :group_name        => options['group'], |       :group_name        => options['group'], | ||||||
|       :searchable        => options.key?('searchable') ? options['searchable'] : true, |       :searchable        => options.key?('searchable') ? options['searchable'] : true, | ||||||
|       :search_term       => options['search_term'], |       :search_term       => options['search_term'], | ||||||
|       :extensions        => options['extensions'].sort, |       :extensions        => [options['extensions'].first] + options['extensions'][1..-1].sort, | ||||||
|       :interpreters      => options['interpreters'].sort, |       :interpreters      => options['interpreters'].sort, | ||||||
|       :primary_extension => options['primary_extension'], |  | ||||||
|       :filenames         => options['filenames'], |       :filenames         => options['filenames'], | ||||||
|       :popular           => popular.include?(name) |       :popular           => popular.include?(name) | ||||||
|     ) |     ) | ||||||
|   | |||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										37
									
								
								lib/linguist/lazy_blob.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								lib/linguist/lazy_blob.rb
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,37 @@ | |||||||
|  | require 'linguist/blob_helper' | ||||||
|  | require 'rugged' | ||||||
|  |  | ||||||
|  | module Linguist | ||||||
|  |   class LazyBlob | ||||||
|  |     include BlobHelper | ||||||
|  |  | ||||||
|  |     MAX_SIZE = 128 * 1024 | ||||||
|  |  | ||||||
|  |     attr_reader :repository | ||||||
|  |     attr_reader :oid | ||||||
|  |     attr_reader :name | ||||||
|  |     attr_reader :mode | ||||||
|  |  | ||||||
|  |     def initialize(repo, oid, name, mode = nil) | ||||||
|  |       @repository = repo | ||||||
|  |       @oid = oid | ||||||
|  |       @name = name | ||||||
|  |       @mode = mode | ||||||
|  |     end | ||||||
|  |  | ||||||
|  |     def data | ||||||
|  |       load_blob! | ||||||
|  |       @data | ||||||
|  |     end | ||||||
|  |  | ||||||
|  |     def size | ||||||
|  |       load_blob! | ||||||
|  |       @size | ||||||
|  |     end | ||||||
|  |  | ||||||
|  |     protected | ||||||
|  |     def load_blob! | ||||||
|  |       @data, @size = Rugged::Blob.to_buffer(repository, oid, MAX_SIZE) if @data.nil? | ||||||
|  |     end | ||||||
|  |   end | ||||||
|  | end | ||||||
| @@ -1,4 +1,5 @@ | |||||||
| require 'linguist/file_blob' | require 'linguist/lazy_blob' | ||||||
|  | require 'rugged' | ||||||
|  |  | ||||||
| module Linguist | module Linguist | ||||||
|   # A Repository is an abstraction of a Grit::Repo or a basic file |   # A Repository is an abstraction of a Grit::Repo or a basic file | ||||||
| @@ -7,100 +8,146 @@ module Linguist | |||||||
|   # Its primary purpose is for gathering language statistics across |   # Its primary purpose is for gathering language statistics across | ||||||
|   # the entire project. |   # the entire project. | ||||||
|   class Repository |   class Repository | ||||||
|     # Public: Initialize a new Repository from a File directory |     attr_reader :repository | ||||||
|     # |  | ||||||
|     # base_path - A path String |     # Public: Create a new Repository based on the stats of | ||||||
|     # |     # an existing one | ||||||
|     # Returns a Repository |     def self.incremental(repo, commit_oid, old_commit_oid, old_stats) | ||||||
|     def self.from_directory(base_path) |       repo = self.new(repo, commit_oid) | ||||||
|       new Dir["#{base_path}/**/*"]. |       repo.load_existing_stats(old_commit_oid, old_stats) | ||||||
|         select { |f| File.file?(f) }. |       repo | ||||||
|         map { |path| FileBlob.new(path, base_path) } |  | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     # Public: Initialize a new Repository |     # Public: Initialize a new Repository to be analyzed for language | ||||||
|  |     # data | ||||||
|     # |     # | ||||||
|     # enum - Enumerator that responds to `each` and |     # repo - a Rugged::Repository object | ||||||
|     #        yields Blob objects |     # commit_oid - the sha1 of the commit that will be analyzed; | ||||||
|  |     #              this is usually the master branch | ||||||
|     # |     # | ||||||
|     # Returns a Repository |     # Returns a Repository | ||||||
|     def initialize(enum) |     def initialize(repo, commit_oid) | ||||||
|       @enum = enum |       @repository = repo | ||||||
|       @computed_stats = false |       @commit_oid = commit_oid | ||||||
|       @language = @size = nil |  | ||||||
|       @sizes = Hash.new { 0 } |       raise TypeError, 'commit_oid must be a commit SHA1' unless commit_oid.is_a?(String) | ||||||
|       @file_breakdown = Hash.new { |h,k| h[k] = Array.new } |     end | ||||||
|  |  | ||||||
|  |     # Public: Load the results of a previous analysis on this repository | ||||||
|  |     # to speed up the new scan. | ||||||
|  |     # | ||||||
|  |     # The new analysis will be performed incrementally as to only take | ||||||
|  |     # into account the file changes since the last time the repository | ||||||
|  |     # was scanned | ||||||
|  |     # | ||||||
|  |     # old_commit_oid - the sha1 of the commit that was previously analyzed | ||||||
|  |     # old_stats - the result of the previous analysis, obtained by calling | ||||||
|  |     #             Repository#cache on the old repository | ||||||
|  |     # | ||||||
|  |     # Returns nothing | ||||||
|  |     def load_existing_stats(old_commit_oid, old_stats) | ||||||
|  |       @old_commit_oid = old_commit_oid | ||||||
|  |       @old_stats = old_stats | ||||||
|  |       nil | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     # Public: Returns a breakdown of language stats. |     # Public: Returns a breakdown of language stats. | ||||||
|     # |     # | ||||||
|     # Examples |     # Examples | ||||||
|     # |     # | ||||||
|     #   # => { Language['Ruby'] => 46319, |     #   # => { 'Ruby' => 46319, | ||||||
|     #          Language['JavaScript'] => 258 } |     #          'JavaScript' => 258 } | ||||||
|     # |     # | ||||||
|     # Returns a Hash of Language keys and Integer size values. |     # Returns a Hash of language names and Integer size values. | ||||||
|     def languages |     def languages | ||||||
|       compute_stats |       @sizes ||= begin | ||||||
|       @sizes |         sizes = Hash.new { 0 } | ||||||
|  |         cache.each do |_, (language, size)| | ||||||
|  |           sizes[language] += size | ||||||
|  |         end | ||||||
|  |         sizes | ||||||
|  |       end | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     # Public: Get primary Language of repository. |     # Public: Get primary Language of repository. | ||||||
|     # |     # | ||||||
|     # Returns a Language |     # Returns a language name | ||||||
|     def language |     def language | ||||||
|       compute_stats |       @language ||= begin | ||||||
|       @language |         primary = languages.max_by { |(_, size)| size } | ||||||
|  |         primary && primary[0] | ||||||
|  |       end | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     # Public: Get the total size of the repository. |     # Public: Get the total size of the repository. | ||||||
|     # |     # | ||||||
|     # Returns a byte size Integer |     # Returns a byte size Integer | ||||||
|     def size |     def size | ||||||
|       compute_stats |       @size ||= languages.inject(0) { |s,(_,v)| s + v } | ||||||
|       @size |  | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     # Public: Return the language breakdown of this repository by file |     # Public: Return the language breakdown of this repository by file | ||||||
|  |     # | ||||||
|  |     # Returns a map of language names => [filenames...] | ||||||
|     def breakdown_by_file |     def breakdown_by_file | ||||||
|       compute_stats |       @file_breakdown ||= begin | ||||||
|       @file_breakdown |         breakdown = Hash.new { |h,k| h[k] = Array.new } | ||||||
|  |         cache.each do |filename, (language, _)| | ||||||
|  |           breakdown[language] << filename | ||||||
|  |         end | ||||||
|  |         breakdown | ||||||
|  |       end | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     # Internal: Compute language breakdown for each blob in the Repository. |     # Public: Return the cached results of the analysis | ||||||
|     # |     # | ||||||
|     # Returns nothing |     # This is a per-file breakdown that can be passed to other instances | ||||||
|     def compute_stats |     # of Linguist::Repository to perform incremental scans | ||||||
|       return if @computed_stats |     # | ||||||
|  |     # Returns a map of filename => [language, size] | ||||||
|  |     def cache | ||||||
|  |       @cache ||= begin | ||||||
|  |         if @old_commit_oid == @commit_oid | ||||||
|  |           @old_stats | ||||||
|  |         else | ||||||
|  |           compute_stats(@old_commit_oid, @commit_oid, @old_stats) | ||||||
|  |         end | ||||||
|  |       end | ||||||
|  |     end | ||||||
|  |  | ||||||
|       @enum.each do |blob| |     protected | ||||||
|         # Skip files that are likely binary |     def compute_stats(old_commit_oid, commit_oid, cache = nil) | ||||||
|         next if blob.likely_binary? |       file_map = cache ? cache.dup : {} | ||||||
|  |       old_tree = old_commit_oid && Rugged::Commit.lookup(repository, old_commit_oid).tree | ||||||
|  |       new_tree = Rugged::Commit.lookup(repository, commit_oid).tree | ||||||
|  |  | ||||||
|  |       diff = Rugged::Tree.diff(repository, old_tree, new_tree) | ||||||
|  |  | ||||||
|  |       diff.each_delta do |delta| | ||||||
|  |         old = delta.old_file[:path] | ||||||
|  |         new = delta.new_file[:path] | ||||||
|  |  | ||||||
|  |         file_map.delete(old) | ||||||
|  |         next if delta.binary | ||||||
|  |  | ||||||
|  |         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 |           # Skip vendored or generated blobs | ||||||
|           next if blob.vendored? || blob.generated? || blob.language.nil? |           next if blob.vendored? || blob.generated? || blob.language.nil? | ||||||
|  |  | ||||||
|           # Only include programming languages and acceptable markup languages |           # Only include programming languages and acceptable markup languages | ||||||
|           if blob.language.type == :programming || Language.detectable_markup.include?(blob.language.name) |           if blob.language.type == :programming || Language.detectable_markup.include?(blob.language.name) | ||||||
|  |             file_map[new] = [blob.language.group.name, blob.size] | ||||||
|           # Build up the per-file breakdown stats |           end | ||||||
|           @file_breakdown[blob.language.group.name] << blob.name |  | ||||||
|  |  | ||||||
|           @sizes[blob.language.group] += blob.size |  | ||||||
|         end |         end | ||||||
|       end |       end | ||||||
|  |  | ||||||
|       # Compute total size |       file_map | ||||||
|       @size = @sizes.inject(0) { |s,(_,v)| s + v } |  | ||||||
|  |  | ||||||
|       # Get primary language |  | ||||||
|       if primary = @sizes.max_by { |(_, size)| size } |  | ||||||
|         @language = primary[0] |  | ||||||
|       end |  | ||||||
|  |  | ||||||
|       @computed_stats = true |  | ||||||
|  |  | ||||||
|       nil |  | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
| end | end | ||||||
|   | |||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -28,7 +28,7 @@ module Linguist | |||||||
|     # |     # | ||||||
|     # Returns nothing. |     # Returns nothing. | ||||||
|     def self.each(&block) |     def self.each(&block) | ||||||
|       Dir.entries(ROOT).each do |category| |       Dir.entries(ROOT).sort!.each do |category| | ||||||
|         next if category == '.' || category == '..' |         next if category == '.' || category == '..' | ||||||
|  |  | ||||||
|         # Skip text and binary for now |         # Skip text and binary for now | ||||||
|   | |||||||
| @@ -36,13 +36,30 @@ | |||||||
| # Bootstrap minified css and js | # Bootstrap minified css and js | ||||||
| - (^|/)bootstrap([^.]*)(\.min)?\.(js|css)$ | - (^|/)bootstrap([^.]*)(\.min)?\.(js|css)$ | ||||||
|  |  | ||||||
|  | # Font Awesome | ||||||
|  | - font-awesome.min.css | ||||||
|  | - font-awesome.css | ||||||
|  |  | ||||||
| # Foundation css | # Foundation css | ||||||
| - foundation.min.css | - foundation.min.css | ||||||
| - foundation.css | - foundation.css | ||||||
|  |  | ||||||
|  | # Normalize.css | ||||||
|  | - normalize.css | ||||||
|  |  | ||||||
|  | # Bourbon SCSS | ||||||
|  | - (^|/)[Bb]ourbon/.*\.css$ | ||||||
|  | - (^|/)[Bb]ourbon/.*\.scss$ | ||||||
|  |  | ||||||
|  | # Animate.css | ||||||
|  | - animate.css | ||||||
|  | - animate.min.css | ||||||
|  |  | ||||||
| # Vendored dependencies | # Vendored dependencies | ||||||
| - thirdparty/ | - third[-_]?party/ | ||||||
|  | - 3rd[-_]?party/ | ||||||
| - vendors?/ | - vendors?/ | ||||||
|  | - extern(al)?/ | ||||||
|  |  | ||||||
| # Debian packaging | # Debian packaging | ||||||
| - ^debian/ | - ^debian/ | ||||||
| @@ -98,9 +115,20 @@ | |||||||
| # AngularJS | # AngularJS | ||||||
| - (^|/)angular([^.]*)(\.min)?\.js$ | - (^|/)angular([^.]*)(\.min)?\.js$ | ||||||
|  |  | ||||||
|  | # D3.js | ||||||
|  | - (^|\/)d3(\.v\d+)?([^.]*)(\.min)?\.js$ | ||||||
|  |  | ||||||
| # React | # React | ||||||
| - (^|/)react(-[^.]*)?(\.min)?\.js$ | - (^|/)react(-[^.]*)?(\.min)?\.js$ | ||||||
|  |  | ||||||
|  | # Modernizr | ||||||
|  | - (^|/)modernizr\-\d\.\d+(\.\d+)?(\.min)?\.js$ | ||||||
|  | - (^|/)modernizr\.custom\.\d+\.js$ | ||||||
|  |  | ||||||
|  | # Knockout | ||||||
|  | - (^|/)knockout-(\d+\.){3}(debug\.)?js$ | ||||||
|  | - knockout-min.js | ||||||
|  |  | ||||||
| ## Python ## | ## Python ## | ||||||
|  |  | ||||||
| # django | # django | ||||||
| @@ -117,6 +145,9 @@ | |||||||
|  |  | ||||||
| ## Obj-C ## | ## Obj-C ## | ||||||
|  |  | ||||||
|  | # Cocoapods | ||||||
|  | - ^Pods/ | ||||||
|  |  | ||||||
| # Sparkle | # Sparkle | ||||||
| - (^|/)Sparkle/ | - (^|/)Sparkle/ | ||||||
|  |  | ||||||
| @@ -141,7 +172,7 @@ | |||||||
| - (^|/)[Mm]icrosoft([Mm]vc)?([Aa]jax|[Vv]alidation)(\.debug)?\.js$ | - (^|/)[Mm]icrosoft([Mm]vc)?([Aa]jax|[Vv]alidation)(\.debug)?\.js$ | ||||||
|  |  | ||||||
| # NuGet | # NuGet | ||||||
| - ^[Pp]ackages/ | - ^[Pp]ackages\/.+\.\d+\/ | ||||||
|  |  | ||||||
| # ExtJS | # ExtJS | ||||||
| - (^|/)extjs/.*?\.js$ | - (^|/)extjs/.*?\.js$ | ||||||
| @@ -161,6 +192,9 @@ | |||||||
| - (^|/)extjs/src/ | - (^|/)extjs/src/ | ||||||
| - (^|/)extjs/welcome/ | - (^|/)extjs/welcome/ | ||||||
|  |  | ||||||
|  | # Html5shiv | ||||||
|  | - (^|/)html5shiv(\.min)?\.js$ | ||||||
|  |  | ||||||
| # Samples folders | # Samples folders | ||||||
| - ^[Ss]amples/ | - ^[Ss]amples/ | ||||||
|  |  | ||||||
| @@ -181,6 +215,9 @@ | |||||||
| - (^|/)cordova([^.]*)(\.min)?\.js$ | - (^|/)cordova([^.]*)(\.min)?\.js$ | ||||||
| - (^|/)cordova\-\d\.\d(\.\d)?(\.min)?\.js$ | - (^|/)cordova\-\d\.\d(\.\d)?(\.min)?\.js$ | ||||||
|  |  | ||||||
|  | # Foundation js | ||||||
|  | - foundation(\..*)?\.js$ | ||||||
|  |  | ||||||
| # Vagrant | # Vagrant | ||||||
| - ^Vagrantfile$ | - ^Vagrantfile$ | ||||||
|  |  | ||||||
| @@ -189,3 +226,12 @@ | |||||||
|  |  | ||||||
| # Mercury --use-subdirs | # Mercury --use-subdirs | ||||||
| - Mercury/ | - Mercury/ | ||||||
|  |  | ||||||
|  | # R packages | ||||||
|  | - ^vignettes/ | ||||||
|  | - ^inst/extdata/ | ||||||
|  |  | ||||||
|  | # Octicons | ||||||
|  | - octicons.css | ||||||
|  | - octicons.min.css | ||||||
|  | - sprockets-octicons.scss | ||||||
|   | |||||||
| @@ -1,3 +1,3 @@ | |||||||
| module Linguist | module Linguist | ||||||
|   VERSION = "2.10.15" |   VERSION = "3.1.5" | ||||||
| end | 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 | ||||||
							
								
								
									
										6
									
								
								samples/Haskell/Hello.hs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								samples/Haskell/Hello.hs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | |||||||
|  | import Data.Char | ||||||
|  |  | ||||||
|  | main :: IO () | ||||||
|  | main = do | ||||||
|  | 	let hello = "hello world" | ||||||
|  | 	putStrLn $ map toUpper hello | ||||||
							
								
								
									
										33
									
								
								samples/Haskell/Main.hs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								samples/Haskell/Main.hs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,33 @@ | |||||||
|  | module Main where | ||||||
|  |  | ||||||
|  | import Sudoku | ||||||
|  | import Data.Maybe | ||||||
|  |  | ||||||
|  |  | ||||||
|  | sudoku :: Sudoku | ||||||
|  | sudoku = [8, 0, 1, 3, 4, 0, 0, 0, 0, | ||||||
|  |           4, 3, 0, 8, 0, 0, 1, 0, 7, | ||||||
|  |           0, 0, 0, 0, 6, 0, 0, 0, 3, | ||||||
|  |           2, 0, 8, 0, 5, 0, 0, 0, 9, | ||||||
|  |           0, 0, 9, 0, 0, 0, 7, 0, 0, | ||||||
|  |           6, 0, 0, 0, 7, 0, 8, 0, 4, | ||||||
|  |           3, 0, 0, 0, 1, 0, 0, 0, 0, | ||||||
|  |           1, 0, 5, 0, 0, 6, 0, 4, 2, | ||||||
|  |           0, 0, 0, 0, 2, 4, 3, 0, 8] | ||||||
|  |  | ||||||
|  | {- | ||||||
|  | sudoku :: Sudoku | ||||||
|  | sudoku = [8, 6, 1, 3, 4, 7, 2, 9, 5, | ||||||
|  | 		  4, 3, 2, 8, 9, 5, 1, 6, 7, | ||||||
|  | 		  9, 5, 7, 1, 6, 2, 4, 8, 3, | ||||||
|  | 		  2, 7, 8, 4, 5, 1, 6, 3, 9, | ||||||
|  | 		  5, 4, 9, 6, 8, 3, 7, 2, 1, | ||||||
|  | 		  6, 1, 3, 2, 7, 9, 8, 5, 4, | ||||||
|  | 		  3, 2, 4, 9, 1, 8, 5, 7, 6, | ||||||
|  | 		  1, 8, 5, 7, 3, 6, 9, 4, 2, | ||||||
|  | 		  7, 9, 6, 5, 2, 4, 3, 1, 8] | ||||||
|  | -} | ||||||
|  | main :: IO () | ||||||
|  | main = do | ||||||
|  | 	putStrLn $ pPrint sudoku ++ "\n\n" | ||||||
|  | 	putStrLn $ pPrint $ fromMaybe [] $ solve sudoku | ||||||
							
								
								
									
										46
									
								
								samples/Haskell/Sudoku.hs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								samples/Haskell/Sudoku.hs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,46 @@ | |||||||
|  | module Sudoku | ||||||
|  | ( | ||||||
|  |   Sudoku, | ||||||
|  |   solve, | ||||||
|  |   isSolved, | ||||||
|  |   pPrint | ||||||
|  | ) where | ||||||
|  |  | ||||||
|  | import Data.Maybe | ||||||
|  | import Data.List | ||||||
|  | import Data.List.Split | ||||||
|  |  | ||||||
|  | type Sudoku = [Int] | ||||||
|  |  | ||||||
|  | solve :: Sudoku -> Maybe Sudoku | ||||||
|  | solve sudoku | ||||||
|  |   | isSolved sudoku = Just sudoku | ||||||
|  |   | otherwise = do | ||||||
|  |     index <- elemIndex 0 sudoku | ||||||
|  |     let sudokus = [nextTest sudoku index i | i <- [1..9], | ||||||
|  |                                   checkRow (nextTest sudoku index i) index, | ||||||
|  |                                   checkColumn (nextTest sudoku index i) index, | ||||||
|  |                                   checkBox (nextTest sudoku index i) index] | ||||||
|  |     listToMaybe $ mapMaybe solve sudokus | ||||||
|  |   where nextTest sudoku index i = take index sudoku ++ [i] ++ drop (index+1) sudoku | ||||||
|  |         checkRow sudoku index = (length $ getRow sudoku index) == (length $ nub $ getRow sudoku index) | ||||||
|  |         checkColumn sudoku index = (length $ getColumn sudoku index) == (length $ nub $ getColumn sudoku index) | ||||||
|  |         checkBox sudoku index = (length $ getBox sudoku index) == (length $ nub $ getBox sudoku index) | ||||||
|  |         getRow sudoku index = filter (/=0) $ (chunksOf 9 sudoku) !! (quot index 9) | ||||||
|  |         getColumn sudoku index = filter (/=0) $ (transpose $ chunksOf 9 sudoku) !! (mod index 9) | ||||||
|  |         getBox sudoku index = filter (/=0) $ (map concat $ concatMap transpose $ chunksOf 3 $ map (chunksOf 3) $ chunksOf 9 sudoku) | ||||||
|  |                                                                                 !! (3 * (quot index 27) + (quot (mod index 9) 3)) | ||||||
|  |  | ||||||
|  | isSolved :: Sudoku -> Bool | ||||||
|  | isSolved sudoku | ||||||
|  |   | product sudoku == 0 = False | ||||||
|  |   | map (length . nub) sudokuRows /= map length sudokuRows = False | ||||||
|  |   | map (length . nub) sudokuColumns /= map length sudokuColumns = False | ||||||
|  |   | map (length . nub) sudokuBoxes /= map length sudokuBoxes = False | ||||||
|  |   | otherwise = True | ||||||
|  |   where sudokuRows = chunksOf 9 sudoku | ||||||
|  |         sudokuColumns = transpose sudokuRows | ||||||
|  |         sudokuBoxes = map concat $ concatMap transpose $ chunksOf 3 $ map (chunksOf 3) $ chunksOf 9 sudoku | ||||||
|  |  | ||||||
|  | pPrint :: Sudoku -> String | ||||||
|  | pPrint sudoku = intercalate "\n" $ map (intercalate " " . map show) $ chunksOf 9 sudoku | ||||||
							
								
								
									
										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; | ||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user