mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	Compare commits
	
		
			430 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | e78e9e4747 | ||
|  | 81f9079f43 | ||
|  | 16eaa533b6 | ||
|  | 2e521a6c74 | ||
|  | 56a65d0975 | ||
|  | e4c6c1d245 | ||
|  | a9f366aed2 | ||
|  | 96bd08e391 | ||
|  | 02fe28eb25 | ||
|  | e77530b390 | ||
|  | d0370a3b4c | ||
|  | ebce4890b2 | ||
|  | 1bc87aadb3 | ||
|  | 53a532dc76 | ||
|  | 0669a83e40 | ||
|  | c4ab3b276f | ||
|  | 920f825496 | ||
|  | f28573420e | ||
|  | c471990aa3 | ||
|  | baf56666d4 | ||
|  | cbbc05f7b8 | ||
|  | 051906727b | ||
|  | cfd5cbaba0 | ||
|  | caaad886c3 | ||
|  | 2305f9051c | ||
|  | 392ab2960f | ||
|  | 1e134b5754 | ||
|  | d356ea28af | ||
|  | a015138dcd | ||
|  | ff99d1bac8 | ||
|  | f4af4727a1 | ||
|  | 2c3069db77 | ||
|  | 8845cd9c58 | ||
|  | 090f765c7e | ||
|  | b58c0e8f3e | ||
|  | b4ff170603 | ||
|  | 3bc540a283 | ||
|  | 25b761b506 | ||
|  | 1e502808c9 | ||
|  | 27e0c8f78a | ||
|  | 897218678e | ||
|  | 4eb33fe3be | ||
|  | 0614055efd | ||
|  | e70f3f595a | ||
|  | 28af996bf9 | ||
|  | 8bd8f0960c | ||
|  | 255db77f1f | ||
|  | 8b0b14c9a6 | ||
|  | 95e83311b6 | ||
|  | 6c07476c45 | ||
|  | 1968f8193c | ||
|  | 5155ad89e8 | ||
|  | c2505e8b7b | ||
|  | b38f4b786b | ||
|  | 1a04c79738 | ||
|  | a464c234b8 | ||
|  | aa2319a052 | ||
|  | f22181f47d | ||
|  | 3191ff498d | ||
|  | 91ea482ea6 | ||
|  | 905d87a112 | ||
|  | 8eae4e56ef | ||
|  | 5466fcfd2f | ||
|  | 176a0e9926 | ||
|  | aa049b4677 | ||
|  | 5c19f1f546 | ||
|  | 9ae19a1f94 | ||
|  | 8cf3b7ad51 | ||
|  | 03d16835aa | ||
|  | 7174130e46 | ||
|  | 59f64c47b1 | ||
|  | f3655e8a1e | ||
|  | f97d796f90 | ||
|  | d342aa4841 | ||
|  | 5c655e3b20 | ||
|  | 9a0ac4a477 | ||
|  | 8ea9632ccf | ||
|  | 03ef4f30e8 | ||
|  | 12228fb525 | ||
|  | 92897046ed | ||
|  | 91aa843a4e | ||
|  | c3145d3c08 | ||
|  | 1ad2123896 | ||
|  | 9b9a256c60 | ||
|  | 0f3644d23a | ||
|  | 04d3023f76 | ||
|  | 5c7aa5406a | ||
|  | bce676e902 | ||
|  | 7c9fd59a99 | ||
|  | b89d1a2e77 | ||
|  | f8c5015b20 | ||
|  | f28cdc8a15 | ||
|  | 0e147f1f66 | ||
|  | a91705724d | ||
|  | 5e3e8133fb | ||
|  | 5a3758f1c7 | ||
|  | 57237106f3 | ||
|  | 99ad2368b0 | ||
|  | 21d7f99a4e | ||
|  | 24b368a30c | ||
|  | 7c8bc8561d | ||
|  | ce37cd665d | ||
|  | bd0f4f6f78 | ||
|  | 4867db8831 | ||
|  | e6ab516fb7 | ||
|  | 7501b82df1 | ||
|  | aa6b881971 | ||
|  | 3928734d0f | ||
|  | c7868a95bc | ||
|  | 2012647f78 | ||
|  | 84471a5463 | ||
|  | 57a3c14f2b | ||
|  | d9914307eb | ||
|  | 71cdf46197 | ||
|  | 8a27884c70 | ||
|  | b881e3e6cb | ||
|  | ca718d8f2a | ||
|  | c6625b1b8a | ||
|  | 16a6d680c4 | ||
|  | 270fa8f5d3 | ||
|  | b1f5e93b4a | ||
|  | 79a61c72e1 | ||
|  | 3f04c11537 | ||
|  | b2270613d7 | ||
|  | 0fe854421b | ||
|  | de074f421e | ||
|  | 27590c39bd | ||
|  | 67191d4d5e | ||
|  | 00764f3d59 | ||
|  | 4a2cb32149 | ||
|  | 1a11664239 | ||
|  | 9520cbb44c | ||
|  | 1aea6b2cdb | ||
|  | 6ff950341a | ||
|  | b9501e42b2 | ||
|  | 065c809dd5 | ||
|  | 5b9ea4a78f | ||
|  | b72c4d4400 | ||
|  | d46e214985 | ||
|  | 799c47ce7a | ||
|  | b5121e59dd | ||
|  | f6a7b4929f | ||
|  | 162b77ab5a | ||
|  | 92904efd45 | ||
|  | 93fabe487f | ||
|  | 74d704bea2 | ||
|  | ee1bd50dd1 | ||
|  | 07096f84f5 | ||
|  | a9b3bd632b | ||
|  | eec324890e | ||
|  | ca6ac8f0db | ||
|  | 60ab4a5fe7 | ||
|  | 10eb5830f0 | ||
|  | 835ceae6f6 | ||
|  | abe3aa47f6 | ||
|  | 53e34072ed | ||
|  | f83f761d0a | ||
|  | 9c18bf3a89 | ||
|  | f6e1ab444e | ||
|  | 0ae8b2959d | ||
|  | 46b0b1e5e2 | ||
|  | b44dfb4ab8 | ||
|  | 868e528810 | ||
|  | 0a4c850ef1 | ||
|  | b3c4232251 | ||
|  | 0c38df47b9 | ||
|  | bfd4005760 | ||
|  | fc9fad15a3 | ||
|  | b5091e88ad | ||
|  | 2610808b6d | ||
|  | 3cfee4f214 | ||
|  | 70fd116eaf | ||
|  | 62aac9c2f7 | ||
|  | afcf1c6c22 | ||
|  | f3f0365b13 | ||
|  | 9bc12843fe | ||
|  | 5e3ceddf69 | ||
|  | d377e23193 | ||
|  | e6dabd59ad | ||
|  | f0c7380132 | ||
|  | 697ad4c568 | ||
|  | 1efd9b384d | ||
|  | c1e71dc215 | ||
|  | d2c7d27d13 | ||
|  | 1efd4c83f9 | ||
|  | 0f7677423f | ||
|  | 2a0b0e9f93 | ||
|  | faec60188f | ||
|  | 709a688858 | ||
|  | 2448ff8314 | ||
|  | 311202102d | ||
|  | 6812a22706 | ||
|  | fb727ce731 | ||
|  | 6af499e352 | ||
|  | 66ec33cf8e | ||
|  | f2694f3a74 | ||
|  | d069d0e444 | ||
|  | 56ee61b17c | ||
|  | b945726017 | ||
|  | 6f8a7d1070 | ||
|  | b032886c21 | ||
|  | 988739d566 | ||
|  | 8cd80801e8 | ||
|  | c3b7a1a6fb | ||
|  | 9d0eff75ad | ||
|  | 3ccb548b6d | ||
|  | eeedd53f32 | ||
|  | 11a3b5b73c | ||
|  | eacc48e8c7 | ||
|  | 5b72b4d353 | ||
|  | 3f940ce8b8 | ||
|  | b2e3ea2334 | ||
|  | 4637da8c32 | ||
|  | 6b88c5ba86 | ||
|  | 5fdb596214 | ||
|  | c989b02285 | ||
|  | c8301dc20b | ||
|  | ca4ea03828 | ||
|  | ae27c71d5a | ||
|  | 3d1555e278 | ||
|  | 54fab9eb4e | ||
|  | 8fea8a0b47 | ||
|  | f14ae8e51b | ||
|  | 6b60e5e786 | ||
|  | 40413dfcc7 | ||
|  | 07f5ad1daa | ||
|  | 57f5a3e780 | ||
|  | 3be007526c | ||
|  | 9bfbd0550c | ||
|  | 0301a5dcdf | ||
|  | db994a1197 | ||
|  | 855c13ea2a | ||
|  | bfa7eced44 | ||
|  | b1d103b1f3 | ||
|  | fc816d3429 | ||
|  | 04a4e8c8e6 | ||
|  | ab69fd01ac | ||
|  | cc6106f31b | ||
|  | ead85379ed | ||
|  | f8d6be55ee | ||
|  | a241d75043 | ||
|  | 864a6c0a20 | ||
|  | 1c20c54191 | ||
|  | 4d722d1fd1 | ||
|  | b67254e986 | ||
|  | 041cf9c94e | ||
|  | b08c5a8421 | ||
|  | 125eaa4cc3 | ||
|  | 6b001cf861 | ||
|  | 5c4129f85b | ||
|  | fa56879790 | ||
|  | 41713d7719 | ||
|  | 17a9463588 | ||
|  | fb9f271720 | ||
|  | 8de50edb41 | ||
|  | ab33fccddd | ||
|  | bd95ac0beb | ||
|  | 7b3efb185f | ||
|  | a0065febe2 | ||
|  | 9374784651 | ||
|  | aa6af3deed | ||
|  | a19e501b44 | ||
|  | 889a395340 | ||
|  | eb8eb28ca7 | ||
|  | 697b3351e6 | ||
|  | 9fd80bfd67 | ||
|  | 7b58b1ea59 | ||
|  | c454396c26 | ||
|  | 2e9d8f5520 | ||
|  | c8ea3fba5a | ||
|  | 56af13047c | ||
|  | c46900396a | ||
|  | b235ed1223 | ||
|  | 16d9612603 | ||
|  | 721e5b4656 | ||
|  | 9b8b39f444 | ||
|  | e32a837fb2 | ||
|  | 9961f8bc1c | ||
|  | c066867d59 | ||
|  | 21093165e1 | ||
|  | df88de14e3 | ||
|  | 94de431aa5 | ||
|  | 502557a97f | ||
|  | 52938f6dbf | ||
|  | d87fad649c | ||
|  | d8666e5309 | ||
|  | 0c071990cb | ||
|  | 77dfb19a50 | ||
|  | 49254f1f74 | ||
|  | 9dd952c175 | ||
|  | 0b9897db1f | ||
|  | 9d11128362 | ||
|  | ee17ab3e26 | ||
|  | 06af36dac2 | ||
|  | 51d6d741e5 | ||
|  | b593a8ae67 | ||
|  | 7b30240a7f | ||
|  | 71f124faa5 | ||
|  | 470bd34349 | ||
|  | 65087dd7b8 | ||
|  | 89c5361f25 | ||
|  | f82cc26e4f | ||
|  | 15232fc072 | ||
|  | 0a7aab947c | ||
|  | 5906fa81bb | ||
|  | 1b2f574af2 | ||
|  | ca4bc6110f | ||
|  | a944769d61 | ||
|  | 98a31515ef | ||
|  | 3e665099ac | ||
|  | 5400b534e4 | ||
|  | 6f2d4dc195 | ||
|  | 4f7fac3ba1 | ||
|  | fd6569830a | ||
|  | 5d4cad6394 | ||
|  | b790a49282 | ||
|  | 537b83c759 | ||
|  | c0b9e2c3f4 | ||
|  | f488b9b9f7 | ||
|  | 7060b116f4 | ||
|  | 0f4cf11294 | ||
|  | 048496723b | ||
|  | 70068f74f1 | ||
|  | 6f197bacc7 | ||
|  | 24a89d2d75 | ||
|  | 1ac16cbec7 | ||
|  | 8144438f39 | ||
|  | f141abbc73 | ||
|  | 5329b96793 | ||
|  | 7a70931066 | ||
|  | 9a070d7bb3 | ||
|  | 189b2d684b | ||
|  | 71dfac26fe | ||
|  | efdc790374 | ||
|  | a3613dc438 | ||
|  | 97afedd861 | ||
|  | 00a436f175 | ||
|  | aa2e3000cd | ||
|  | 10e0fa4360 | ||
|  | 0473af368f | ||
|  | b82f563c38 | ||
|  | 344297895b | ||
|  | d3c525645b | ||
|  | 59d02e5138 | ||
|  | 8522dc1d33 | ||
|  | 53d238f310 | ||
|  | 92ed2d189e | ||
|  | 7133c3b11a | ||
|  | d72114083b | ||
|  | 683925fcd5 | ||
|  | 1c8bf32d35 | ||
|  | 28913833f4 | ||
|  | c6752be546 | ||
|  | 395e474cad | ||
|  | 16ea189aa6 | ||
|  | ac81fc5da9 | ||
|  | 58191c10b3 | ||
|  | c2ca23d580 | ||
|  | b5dfb40c7d | ||
|  | 7e647fd915 | ||
|  | 5b9f9bc0e6 | ||
|  | b1c057fa30 | ||
|  | ca348dd373 | ||
|  | b802045c5c | ||
|  | 3c244a9501 | ||
|  | 832a7b9b06 | ||
|  | e7d856345f | ||
|  | ac559effaa | ||
|  | 95d0daba80 | ||
|  | a0ad1523a1 | ||
|  | 06c049b8c0 | ||
|  | 24c7380765 | ||
|  | 73ef1bf156 | ||
|  | c8b30a62f9 | ||
|  | 48dfdd2dfe | ||
|  | 68727f724a | ||
|  | f46e053633 | ||
|  | d2e739ba8c | ||
|  | 37174e1d2c | ||
|  | cdb5206def | ||
|  | d636eaf1e3 | ||
|  | 49f3eb1286 | ||
|  | 8ab94a8643 | ||
|  | f72c337c5b | ||
|  | d22321de07 | ||
|  | 473e5db51f | ||
|  | 8b9fc4683a | ||
|  | 3b4415cc3c | ||
|  | 2afce1754a | ||
|  | f232b93214 | ||
|  | db64f192fa | ||
|  | ca96ecdc55 | ||
|  | 2a06d1aa19 | ||
|  | b2fa2a1f46 | ||
|  | 6839516b5c | ||
|  | 2fddaaf3d7 | ||
|  | 741d246581 | ||
|  | 7b185cc2f3 | ||
|  | 33dc865c30 | ||
|  | 0d469e2966 | ||
|  | 538f479b60 | ||
|  | 88cc73fa49 | ||
|  | 01bb6c37ab | ||
|  | 4d2b38497d | ||
|  | fc5ae1cfbc | ||
|  | 7e76d1cc6b | ||
|  | cf834e8a21 | ||
|  | ee61466042 | ||
|  | 35884d482c | ||
|  | 802de8112c | ||
|  | 9a76cfc85f | ||
|  | dc41dd888d | ||
|  | 827ad80311 | ||
|  | 9e3d8ac4e9 | ||
|  | 1b327e29ba | ||
|  | 26a35ea43d | ||
|  | 81ebef2e29 | ||
|  | 1068cfb4b5 | ||
|  | 73b1737dc7 | ||
|  | 1d86f40fcd | ||
|  | 59fb481138 | ||
|  | 16e22b3b77 | ||
|  | aa701c6766 | ||
|  | ed4bbe97d1 | ||
|  | f05c437221 | ||
|  | 483488a2fa | ||
|  | b36c4f2428 | ||
|  | 924fddf698 | ||
|  | 23e55e92ca | ||
|  | 0cfdbfb91c | 
							
								
								
									
										211
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										211
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
								
							| @@ -7,9 +7,6 @@ | ||||
| [submodule "vendor/grammars/sublime-cirru"] | ||||
| 	path = vendor/grammars/sublime-cirru | ||||
| 	url = https://github.com/Cirru/sublime-cirru | ||||
| [submodule "vendor/grammars/Sublime-Logos"] | ||||
| 	path = vendor/grammars/Sublime-Logos | ||||
| 	url = https://github.com/Cykey/Sublime-Logos | ||||
| [submodule "vendor/grammars/SublimeBrainfuck"] | ||||
| 	path = vendor/grammars/SublimeBrainfuck | ||||
| 	url = https://github.com/Drako/SublimeBrainfuck | ||||
| @@ -25,18 +22,9 @@ | ||||
| [submodule "vendor/grammars/Sublime-REBOL"] | ||||
| 	path = vendor/grammars/Sublime-REBOL | ||||
| 	url = https://github.com/Oldes/Sublime-REBOL | ||||
| [submodule "vendor/grammars/Sublime-Inform"] | ||||
| 	path = vendor/grammars/Sublime-Inform | ||||
| 	url = https://github.com/PogiNate/Sublime-Inform | ||||
| [submodule "vendor/grammars/autoitv3-tmbundle"] | ||||
| 	path = vendor/grammars/autoitv3-tmbundle | ||||
| 	url = https://github.com/Red-Nova-Technologies/autoitv3-tmbundle | ||||
| [submodule "vendor/grammars/Sublime-VimL"] | ||||
| 	path = vendor/grammars/Sublime-VimL | ||||
| 	url = https://github.com/SalGnt/Sublime-VimL | ||||
| [submodule "vendor/grammars/boo-sublime"] | ||||
| 	path = vendor/grammars/boo-sublime | ||||
| 	url = https://github.com/Shammah/boo-sublime | ||||
| [submodule "vendor/grammars/ColdFusion"] | ||||
| 	path = vendor/grammars/ColdFusion | ||||
| 	url = https://github.com/SublimeText/ColdFusion | ||||
| @@ -91,9 +79,6 @@ | ||||
| [submodule "vendor/grammars/language-yaml"] | ||||
| 	path = vendor/grammars/language-yaml | ||||
| 	url = https://github.com/atom/language-yaml | ||||
| [submodule "vendor/grammars/sublime-sourcepawn"] | ||||
| 	path = vendor/grammars/sublime-sourcepawn | ||||
| 	url = https://github.com/austinwagner/sublime-sourcepawn | ||||
| [submodule "vendor/grammars/Sublime-Lasso"] | ||||
| 	path = vendor/grammars/Sublime-Lasso | ||||
| 	url = https://github.com/bfad/Sublime-Lasso | ||||
| @@ -112,9 +97,6 @@ | ||||
| [submodule "vendor/grammars/sublime-MuPAD"] | ||||
| 	path = vendor/grammars/sublime-MuPAD | ||||
| 	url = https://github.com/ccreutzig/sublime-MuPAD | ||||
| [submodule "vendor/grammars/nesC.tmbundle"] | ||||
| 	path = vendor/grammars/nesC.tmbundle | ||||
| 	url = https://github.com/cdwilson/nesC.tmbundle | ||||
| [submodule "vendor/grammars/haxe-sublime-bundle"] | ||||
| 	path = vendor/grammars/haxe-sublime-bundle | ||||
| 	url = https://github.com/clemos/haxe-sublime-bundle | ||||
| @@ -136,9 +118,6 @@ | ||||
| [submodule "vendor/grammars/fancy-tmbundle"] | ||||
| 	path = vendor/grammars/fancy-tmbundle | ||||
| 	url = https://github.com/fancy-lang/fancy-tmbundle | ||||
| [submodule "vendor/grammars/monkey.tmbundle"] | ||||
| 	path = vendor/grammars/monkey.tmbundle | ||||
| 	url = https://github.com/gingerbeardman/monkey.tmbundle | ||||
| [submodule "vendor/grammars/dart-sublime-bundle"] | ||||
| 	path = vendor/grammars/dart-sublime-bundle | ||||
| 	url = https://github.com/guillermooo/dart-sublime-bundle | ||||
| @@ -169,18 +148,12 @@ | ||||
| [submodule "vendor/grammars/fish-tmbundle"] | ||||
| 	path = vendor/grammars/fish-tmbundle | ||||
| 	url = https://github.com/l15n/fish-tmbundle | ||||
| [submodule "vendor/grammars/sublime-idris"] | ||||
| 	path = vendor/grammars/sublime-idris | ||||
| 	url = https://github.com/laughedelic/sublime-idris | ||||
| [submodule "vendor/grammars/moonscript-tmbundle"] | ||||
| 	path = vendor/grammars/moonscript-tmbundle | ||||
| 	url = https://github.com/leafo/moonscript-tmbundle | ||||
| [submodule "vendor/grammars/Isabelle.tmbundle"] | ||||
| 	path = vendor/grammars/Isabelle.tmbundle | ||||
| 	url = https://github.com/lsf37/Isabelle.tmbundle | ||||
| [submodule "vendor/grammars/x86-assembly-textmate-bundle"] | ||||
| 	path = vendor/grammars/x86-assembly-textmate-bundle | ||||
| 	url = https://github.com/lunixbochs/x86-assembly-textmate-bundle | ||||
| [submodule "vendor/grammars/Alloy.tmbundle"] | ||||
| 	path = vendor/grammars/Alloy.tmbundle | ||||
| 	url = https://github.com/macekond/Alloy.tmbundle | ||||
| @@ -211,9 +184,6 @@ | ||||
| [submodule "vendor/grammars/Julia.tmbundle"] | ||||
| 	path = vendor/grammars/Julia.tmbundle | ||||
| 	url = https://github.com/nanoant/Julia.tmbundle | ||||
| [submodule "vendor/grammars/assembly.tmbundle"] | ||||
| 	path = vendor/grammars/assembly.tmbundle | ||||
| 	url = https://github.com/nanoant/assembly.tmbundle | ||||
| [submodule "vendor/grammars/ooc.tmbundle"] | ||||
| 	path = vendor/grammars/ooc.tmbundle | ||||
| 	url = https://github.com/nilium/ooc.tmbundle | ||||
| @@ -223,9 +193,6 @@ | ||||
| [submodule "vendor/grammars/sublime-tea"] | ||||
| 	path = vendor/grammars/sublime-tea | ||||
| 	url = https://github.com/pferruggiaro/sublime-tea | ||||
| [submodule "vendor/grammars/puppet-textmate-bundle"] | ||||
| 	path = vendor/grammars/puppet-textmate-bundle | ||||
| 	url = https://github.com/puppet-textmate-bundle/puppet-textmate-bundle | ||||
| [submodule "vendor/grammars/abap.tmbundle"] | ||||
| 	path = vendor/grammars/abap.tmbundle | ||||
| 	url = https://github.com/pvl/abap.tmbundle | ||||
| @@ -343,9 +310,6 @@ | ||||
| [submodule "vendor/grammars/latex.tmbundle"] | ||||
| 	path = vendor/grammars/latex.tmbundle | ||||
| 	url = https://github.com/textmate/latex.tmbundle | ||||
| [submodule "vendor/grammars/less.tmbundle"] | ||||
| 	path = vendor/grammars/less.tmbundle | ||||
| 	url = https://github.com/textmate/less.tmbundle | ||||
| [submodule "vendor/grammars/lilypond.tmbundle"] | ||||
| 	path = vendor/grammars/lilypond.tmbundle | ||||
| 	url = https://github.com/textmate/lilypond.tmbundle | ||||
| @@ -400,9 +364,6 @@ | ||||
| [submodule "vendor/grammars/r.tmbundle"] | ||||
| 	path = vendor/grammars/r.tmbundle | ||||
| 	url = https://github.com/textmate/r.tmbundle | ||||
| [submodule "vendor/grammars/restructuredtext.tmbundle"] | ||||
| 	path = vendor/grammars/restructuredtext.tmbundle | ||||
| 	url = https://github.com/textmate/restructuredtext.tmbundle | ||||
| [submodule "vendor/grammars/ruby-haml.tmbundle"] | ||||
| 	path = vendor/grammars/ruby-haml.tmbundle | ||||
| 	url = https://github.com/textmate/ruby-haml.tmbundle | ||||
| @@ -454,9 +415,6 @@ | ||||
| [submodule "vendor/grammars/llvm.tmbundle"] | ||||
| 	path = vendor/grammars/llvm.tmbundle | ||||
| 	url = https://github.com/whitequark/llvm.tmbundle | ||||
| [submodule "vendor/grammars/sublime-nix"] | ||||
| 	path = vendor/grammars/sublime-nix | ||||
| 	url = https://github.com/wmertens/sublime-nix | ||||
| [submodule "vendor/grammars/oz-tmbundle"] | ||||
| 	path = vendor/grammars/oz-tmbundle | ||||
| 	url = https://github.com/eregon/oz-tmbundle | ||||
| @@ -485,9 +443,6 @@ | ||||
| [submodule "vendor/grammars/Scalate.tmbundle"] | ||||
| 	path = vendor/grammars/Scalate.tmbundle | ||||
| 	url = https://github.com/scalate/Scalate.tmbundle | ||||
| [submodule "vendor/grammars/Elm.tmLanguage"] | ||||
| 	path = vendor/grammars/Elm.tmLanguage | ||||
| 	url = https://github.com/deadfoxygrandpa/Elm.tmLanguage | ||||
| [submodule "vendor/grammars/sublime-bsv"] | ||||
| 	path = vendor/grammars/sublime-bsv | ||||
| 	url = https://github.com/thotypous/sublime-bsv | ||||
| @@ -515,24 +470,9 @@ | ||||
| [submodule "vendor/grammars/liquid.tmbundle"] | ||||
| 	path = vendor/grammars/liquid.tmbundle | ||||
| 	url = https://github.com/bastilian/validcode-textmate-bundles | ||||
| [submodule "vendor/grammars/ats.sublime"] | ||||
| 	path = vendor/grammars/ats.sublime | ||||
| 	url = https://github.com/steinwaywhw/ats-mode-sublimetext | ||||
| [submodule "vendor/grammars/Modelica"] | ||||
| 	path = vendor/grammars/Modelica | ||||
| 	url = https://github.com/BorisChumichev/modelicaSublimeTextPackage | ||||
| [submodule "vendor/grammars/sublime-apl"] | ||||
| 	path = vendor/grammars/sublime-apl | ||||
| 	url = https://github.com/StoneCypher/sublime-apl | ||||
| [submodule "vendor/grammars/CLIPS-sublime"] | ||||
| 	path = vendor/grammars/CLIPS-sublime | ||||
| 	url = https://github.com/psicomante/CLIPS-sublime | ||||
| [submodule "vendor/grammars/Creole"] | ||||
| 	path = vendor/grammars/Creole | ||||
| 	url = https://github.com/Siddley/Creole | ||||
| [submodule "vendor/grammars/GDScript-sublime"] | ||||
| 	path = vendor/grammars/GDScript-sublime | ||||
| 	url = https://github.com/beefsack/GDScript-sublime | ||||
| [submodule "vendor/grammars/sublime-golo"] | ||||
| 	path = vendor/grammars/sublime-golo | ||||
| 	url = https://github.com/TypeUnsafe/sublime-golo | ||||
| @@ -545,9 +485,6 @@ | ||||
| [submodule "vendor/grammars/G-Code"] | ||||
| 	path = vendor/grammars/G-Code | ||||
| 	url = https://github.com/robotmaster/sublime-text-syntax-highlighting | ||||
| [submodule "vendor/grammars/grace-tmbundle"] | ||||
| 	path = vendor/grammars/grace-tmbundle | ||||
| 	url = https://github.com/zmthy/grace-tmbundle | ||||
| [submodule "vendor/grammars/sublime-text-ox"] | ||||
| 	path = vendor/grammars/sublime-text-ox | ||||
| 	url = https://github.com/andreashetland/sublime-text-ox | ||||
| @@ -557,9 +494,6 @@ | ||||
| [submodule "vendor/grammars/ec.tmbundle"] | ||||
| 	path = vendor/grammars/ec.tmbundle | ||||
| 	url = https://github.com/ecere/ec.tmbundle | ||||
| [submodule "vendor/grammars/InnoSetup"] | ||||
| 	path = vendor/grammars/InnoSetup | ||||
| 	url = https://github.com/idleberg/InnoSetup-Sublime-Text | ||||
| [submodule "vendor/grammars/gap-tmbundle"] | ||||
| 	path = vendor/grammars/gap-tmbundle | ||||
| 	url = https://github.com/dhowden/gap-tmbundle | ||||
| @@ -581,9 +515,6 @@ | ||||
| [submodule "vendor/grammars/SublimeClarion"] | ||||
| 	path = vendor/grammars/SublimeClarion | ||||
| 	url = https://github.com/fushnisoft/SublimeClarion | ||||
| [submodule "vendor/grammars/oracle.tmbundle"] | ||||
| 	path = vendor/grammars/oracle.tmbundle | ||||
| 	url = https://github.com/mulander/oracle.tmbundle.git | ||||
| [submodule "vendor/grammars/BrightScript.tmbundle"] | ||||
| 	path = vendor/grammars/BrightScript.tmbundle | ||||
| 	url = https://github.com/cmink/BrightScript.tmbundle | ||||
| @@ -593,18 +524,12 @@ | ||||
| [submodule "vendor/grammars/asciidoc.tmbundle"] | ||||
| 	path = vendor/grammars/asciidoc.tmbundle | ||||
| 	url = https://github.com/zuckschwerdt/asciidoc.tmbundle | ||||
| [submodule "vendor/grammars/sublime-text-pig-latin"] | ||||
| 	path = vendor/grammars/sublime-text-pig-latin | ||||
| 	url = https://github.com/goblindegook/sublime-text-pig-latin | ||||
| [submodule "vendor/grammars/Lean.tmbundle"] | ||||
| 	path = vendor/grammars/Lean.tmbundle | ||||
| 	url = https://github.com/leanprover/Lean.tmbundle | ||||
| [submodule "vendor/grammars/ampl"] | ||||
| 	path = vendor/grammars/ampl | ||||
| 	url = https://github.com/ampl/sublime-ampl | ||||
| [submodule "vendor/grammars/openscad.tmbundle"] | ||||
| 	path = vendor/grammars/openscad.tmbundle | ||||
| 	url = https://github.com/tbuser/openscad.tmbundle | ||||
| [submodule "vendor/grammars/sublime-varnish"] | ||||
| 	path = vendor/grammars/sublime-varnish | ||||
| 	url = https://github.com/brandonwamboldt/sublime-varnish | ||||
| @@ -656,9 +581,12 @@ | ||||
| [submodule "vendor/grammars/language-ncl"] | ||||
| 	path = vendor/grammars/language-ncl | ||||
| 	url = https://github.com/rpavlick/language-ncl.git | ||||
| [submodule "vendor/grammars/pawn-sublime-language"] | ||||
| 	path = vendor/grammars/pawn-sublime-language | ||||
| 	url = https://github.com/Southclaw/pawn-sublime-language.git | ||||
| [submodule "vendor/grammars/atom-language-purescript"] | ||||
| 	path = vendor/grammars/atom-language-purescript | ||||
| 	url = https://github.com/freebroccolo/atom-language-purescript | ||||
| 	url = https://github.com/purescript-contrib/atom-language-purescript | ||||
| [submodule "vendor/grammars/vue-syntax-highlight"] | ||||
| 	path = vendor/grammars/vue-syntax-highlight | ||||
| 	url = https://github.com/vuejs/vue-syntax-highlight | ||||
| @@ -679,13 +607,142 @@ | ||||
| 	url = https://github.com/CausalityLtd/sublime-pony | ||||
| [submodule "vendor/grammars/X10"] | ||||
| 	path = vendor/grammars/X10 | ||||
| 	url = git@github.com:x10-lang/x10-highlighting.git | ||||
| 	url = https://github.com/x10-lang/x10-highlighting | ||||
| [submodule "vendor/grammars/language-babel"] | ||||
| 	path = vendor/grammars/language-babel | ||||
| 	url = https://github.com/gandm/language-babel | ||||
| [submodule "vendor/grammars/UrWeb-Language-Definition"] | ||||
| 	path = vendor/grammars/UrWeb-Language-Definition | ||||
| 	url = https://github.com/gwalborn/UrWeb-Language-Definition.git | ||||
| [submodule "vendor/grammars/Stata.tmbundle"] | ||||
| 	path = vendor/grammars/Stata.tmbundle | ||||
| 	url = https://github.com/pschumm/Stata.tmbundle | ||||
| [submodule "vendor/grammars/FreeMarker.tmbundle"] | ||||
| 	path = vendor/grammars/FreeMarker.tmbundle | ||||
| 	url = https://github.com/freemarker/FreeMarker.tmbundle | ||||
| [submodule "vendor/grammars/MagicPython"] | ||||
| 	path = vendor/grammars/MagicPython | ||||
| 	url = https://github.com/MagicStack/MagicPython | ||||
| [submodule "vendor/grammars/language-click"] | ||||
| 	path = vendor/grammars/language-click | ||||
| 	url = https://github.com/stenverbois/language-click.git | ||||
| [submodule "vendor/grammars/language-maxscript"] | ||||
| 	path = vendor/grammars/language-maxscript | ||||
| 	url = https://github.com/Alhadis/language-maxscript | ||||
| [submodule "vendor/grammars/language-renpy"] | ||||
| 	path = vendor/grammars/language-renpy | ||||
| 	url = https://github.com/williamd1k0/language-renpy.git | ||||
| [submodule "vendor/grammars/language-inform7"] | ||||
| 	path = vendor/grammars/language-inform7 | ||||
| 	url = https://github.com/erkyrath/language-inform7 | ||||
| [submodule "vendor/grammars/atom-language-stan"] | ||||
| 	path = vendor/grammars/atom-language-stan | ||||
| 	url = https://github.com/jrnold/atom-language-stan | ||||
| [submodule "vendor/grammars/language-yang"] | ||||
| 	path = vendor/grammars/language-yang | ||||
| 	url = https://github.com/DzonyKalafut/language-yang.git | ||||
| [submodule "vendor/grammars/perl6fe"] | ||||
| 	path = vendor/grammars/perl6fe | ||||
| 	url = https://github.com/MadcapJake/language-perl6fe.git | ||||
| [submodule "vendor/grammars/language-less"] | ||||
| 	path = vendor/grammars/language-less | ||||
| 	url = https://github.com/atom/language-less.git | ||||
| [submodule "vendor/grammars/language-povray"] | ||||
| 	path = vendor/grammars/language-povray | ||||
| 	url = https://github.com/c-lipka/language-povray | ||||
| [submodule "vendor/grammars/sublime-terra"] | ||||
| 	path = vendor/grammars/sublime-terra | ||||
| 	url = https://github.com/pyk/sublime-terra | ||||
| [submodule "vendor/grammars/SublimePuppet"] | ||||
| 	path = vendor/grammars/SublimePuppet | ||||
| 	url = https://github.com/russCloak/SublimePuppet | ||||
| [submodule "vendor/grammars/sublimeassembly"] | ||||
| 	path = vendor/grammars/sublimeassembly | ||||
| 	url = https://github.com/Nessphoro/sublimeassembly | ||||
| [submodule "vendor/grammars/monkey"] | ||||
| 	path = vendor/grammars/monkey | ||||
| 	url = https://github.com/gingerbeardman/monkey.tmbundle | ||||
| [submodule "vendor/grammars/assembly"] | ||||
| 	path = vendor/grammars/assembly | ||||
| 	url = https://github.com/nanoant/assembly.tmbundle | ||||
| [submodule "vendor/grammars/boo"] | ||||
| 	path = vendor/grammars/boo | ||||
| 	url = https://github.com/Shammah/boo-sublime | ||||
| [submodule "vendor/grammars/logos"] | ||||
| 	path = vendor/grammars/logos | ||||
| 	url = https://github.com/Cykey/Sublime-Logos | ||||
| [submodule "vendor/grammars/pig-latin"] | ||||
| 	path = vendor/grammars/pig-latin | ||||
| 	url = https://github.com/goblindegook/sublime-text-pig-latin | ||||
| [submodule "vendor/grammars/sourcepawn"] | ||||
| path = vendor/grammars/sourcepawn | ||||
| url = https://github.com/austinwagner/sublime-sourcepawn | ||||
| [submodule "vendor/grammars/gdscript"] | ||||
| 	path = vendor/grammars/gdscript | ||||
| 	url = https://github.com/beefsack/GDScript-sublime | ||||
| [submodule "vendor/grammars/nesC"] | ||||
| 	path = vendor/grammars/nesC | ||||
| 	url = https://github.com/cdwilson/nesC.tmbundle | ||||
| [submodule "vendor/grammars/ats"] | ||||
| 	path = vendor/grammars/ats | ||||
| 	url = https://github.com/steinwaywhw/ats-mode-sublimetext | ||||
| [submodule "vendor/grammars/grace"] | ||||
| 	path = vendor/grammars/grace | ||||
| 	url = https://github.com/zmthy/grace-tmbundle | ||||
| [submodule "vendor/grammars/ejs-tmbundle"] | ||||
| 	path = vendor/grammars/ejs-tmbundle | ||||
| 	url = https://github.com/gregory-m/ejs-tmbundle | ||||
| [submodule "vendor/grammars/nix"] | ||||
| 	path = vendor/grammars/nix | ||||
| 	url = https://github.com/wmertens/sublime-nix | ||||
| [submodule "vendor/grammars/idris"] | ||||
| 	path = vendor/grammars/idris | ||||
| 	url = https://github.com/idris-hackers/idris-sublime.git | ||||
| [submodule "vendor/grammars/atomic-dreams"] | ||||
| 	path = vendor/grammars/atomic-dreams | ||||
| 	url = https://github.com/PJB3005/atomic-dreams | ||||
| [submodule "vendor/grammars/language-apl"] | ||||
| 	path = vendor/grammars/language-apl | ||||
| 	url = https://github.com/Alhadis/language-apl.git | ||||
| [submodule "vendor/grammars/language-graphql"] | ||||
| 	path = vendor/grammars/language-graphql | ||||
| 	url = https://github.com/rmosolgo/language-graphql | ||||
| [submodule "vendor/grammars/language-toc-wow"] | ||||
| 	path = vendor/grammars/language-toc-wow | ||||
| 	url = https://github.com/nebularg/language-toc-wow | ||||
| [submodule "vendor/grammars/sublime-autoit"] | ||||
| 	path = vendor/grammars/sublime-autoit | ||||
| 	url = https://github.com/AutoIt/SublimeAutoItScript | ||||
| [submodule "vendor/grammars/TLA"] | ||||
| 	path = vendor/grammars/TLA | ||||
| 	url = https://github.com/agentultra/TLAGrammar | ||||
| [submodule "vendor/grammars/sublime-clips"] | ||||
| 	path = vendor/grammars/sublime-clips | ||||
| 	url = https://github.com/psicomante/CLIPS-sublime | ||||
| [submodule "vendor/grammars/creole"] | ||||
| 	path = vendor/grammars/creole | ||||
| 	url = https://github.com/Siddley/Creole | ||||
| [submodule "vendor/grammars/language-csound"] | ||||
| 	path = vendor/grammars/language-csound | ||||
| 	url = https://github.com/nwhetsell/language-csound | ||||
| [submodule "vendor/grammars/language-wavefront"] | ||||
| 	path = vendor/grammars/language-wavefront | ||||
| 	url = https://github.com/Alhadis/language-wavefront | ||||
| [submodule "vendor/grammars/nu.tmbundle"] | ||||
| 	path = vendor/grammars/nu.tmbundle | ||||
| 	url = https://github.com/jsallis/nu.tmbundle | ||||
| [submodule "vendor/grammars/Elm"] | ||||
| 	path = vendor/grammars/Elm | ||||
| 	url = https://github.com/elm-community/Elm.tmLanguage | ||||
| [submodule "vendor/grammars/language-restructuredtext"] | ||||
| 	path = vendor/grammars/language-restructuredtext | ||||
| 	url = https://github.com/Lukasa/language-restructuredtext | ||||
| [submodule "vendor/grammars/atom-language-clean"] | ||||
| 	path = vendor/grammars/atom-language-clean | ||||
| 	url = https://github.com/timjs/atom-language-clean.git | ||||
| [submodule "vendor/grammars/language-turing"] | ||||
| 	path = vendor/grammars/language-turing | ||||
| 	url = https://github.com/Alhadis/language-turing | ||||
| [submodule "vendor/grammars/atom-language-srt"] | ||||
| 	path = vendor/grammars/atom-language-srt | ||||
| 	url = https://github.com/314eter/atom-language-srt | ||||
|   | ||||
| @@ -6,6 +6,9 @@ addons: | ||||
|     - libicu-dev | ||||
|     - libicu48 | ||||
| before_install: script/travis/before_install | ||||
| script: | ||||
|   - bundle exec rake | ||||
|   - script/licensed verify | ||||
| rvm: | ||||
|   - 2.0.0 | ||||
|   - 2.1 | ||||
|   | ||||
| @@ -1,8 +1,6 @@ | ||||
| # Contributing | ||||
|  | ||||
| [code-of-conduct]: http://todogroup.org/opencodeofconduct/#Linguist/opensource@github.com | ||||
|  | ||||
| Hi there! We're thrilled that you'd like to contribute to this project. Your help is essential for keeping it great. This project adheres to the [Open Code of Conduct][code-of-conduct]. By participating, you are expected to uphold this code. | ||||
| Hi there! We're thrilled that you'd like to contribute to this project. Your help is essential for keeping it great. This project adheres to the [Contributor Covenant Code of Conduct](http://contributor-covenant.org/). By participating, you are expected to uphold this code. | ||||
|  | ||||
| The majority of contributions won't need to touch any Ruby code at all. | ||||
|  | ||||
| @@ -33,6 +31,7 @@ To add support for a new language: | ||||
| 0. Add a grammar for your language. Please only add grammars that have a license that permits redistribution. | ||||
|   0. Add your grammar as a submodule: `git submodule add https://github.com/JaneSmith/MyGrammar vendor/grammars/MyGrammar`. | ||||
|   0. Add your grammar to [`grammars.yml`][grammars] by running `script/convert-grammars --add vendor/grammars/MyGrammar`. | ||||
|   0. Download the license for the grammar: `script/licensed`. Be careful to only commit the file for the new grammar, as this script may update licenses for other grammars as well. | ||||
| 0. Add samples for your language to the [samples directory][samples] in the correct subdirectory. | ||||
| 0. Open a pull request, linking to a [GitHub search result](https://github.com/search?utf8=%E2%9C%93&q=extension%3Aboot+NOT+nothack&type=Code&ref=searchresults) showing in-the-wild usage. | ||||
|  | ||||
| @@ -78,8 +77,20 @@ Sometimes getting the tests running can be too much work, especially if you don' | ||||
|  | ||||
| Here's our current build status: [](https://travis-ci.org/github/linguist) | ||||
|  | ||||
| ## Maintainers | ||||
|  | ||||
| ## Releasing | ||||
| Linguist is maintained with :heart: by: | ||||
|  | ||||
| - @arfon (GitHub Staff) | ||||
| - @larsbrinkhoff | ||||
| - @pchaigno | ||||
|   | ||||
| As Linguist is a production dependency for GitHub we have a couple of workflow restrictions: | ||||
|  | ||||
| - Anyone with commit rights can merge Pull Requests provided that there is a :+1: from a GitHub member of staff | ||||
| - Releases are performed by GitHub staff so we can ensure GitHub.com always stays up to date with the latest release of Linguist and there are no regressions in production. | ||||
|  | ||||
| ### Releasing | ||||
|  | ||||
| If you are the current maintainer of this gem: | ||||
|  | ||||
|   | ||||
							
								
								
									
										1
									
								
								Gemfile
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								Gemfile
									
									
									
									
									
								
							| @@ -1,4 +1,3 @@ | ||||
| source 'https://rubygems.org' | ||||
| gemspec :name => "github-linguist" | ||||
| gemspec :name => "github-linguist-grammars" | ||||
| gem 'byebug' if RUBY_VERSION >= '2.0' | ||||
|   | ||||
							
								
								
									
										2
									
								
								LICENSE
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								LICENSE
									
									
									
									
									
								
							| @@ -1,4 +1,4 @@ | ||||
| Copyright (c) 2011-2015 GitHub, Inc. | ||||
| Copyright (c) 2011-2016 GitHub, Inc. | ||||
|  | ||||
| Permission is hereby granted, free of charge, to any person | ||||
| obtaining a copy of this software and associated documentation | ||||
|   | ||||
							
								
								
									
										22
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										22
									
								
								README.md
									
									
									
									
									
								
							| @@ -43,7 +43,7 @@ special-vendored-path/* linguist-vendored | ||||
| jquery.js linguist-vendored=false | ||||
| ``` | ||||
|  | ||||
| Similar to vendored files, Linguist excludes documentation files from your project's language stats. (Unlike vendored files, documentation files are displayed in diffs on github.com.) [lib/linguist/documentation.yml](lib/linguist/documentation.yml) lists common documentation paths and excludes them from the language statistics for your repository. | ||||
| Just like vendored files, Linguist excludes documentation files from your project's language stats. [lib/linguist/documentation.yml](lib/linguist/documentation.yml) lists common documentation paths and excludes them from the language statistics for your repository. | ||||
|  | ||||
| Use the `linguist-documentation` attribute to mark or unmark paths as documentation. | ||||
|  | ||||
| @@ -53,12 +53,25 @@ project-docs/* linguist-documentation | ||||
| docs/formatter.rb linguist-documentation=false | ||||
| ``` | ||||
|  | ||||
| #### Generated file detection | ||||
|  | ||||
| Not all plain text files are true source files. Generated files like minified js and compiled CoffeeScript can be detected and excluded from language stats. As an added bonus, unlike vendored and documentation files, these files are suppressed in diffs. | ||||
|  | ||||
| ```ruby | ||||
| Linguist::FileBlob.new("underscore.min.js").generated? # => true | ||||
| ``` | ||||
|  | ||||
| See [Linguist::Generated#generated?](https://github.com/github/linguist/blob/master/lib/linguist/generated.rb). | ||||
|  | ||||
| ### Using Emacs or Vim modelines | ||||
|  | ||||
| Alternatively, you can use Vim or Emacs style modelines to set the language for a single file. Modelines can be placed anywhere within a file and are respected when determining how to syntax-highlight a file on GitHub.com | ||||
|  | ||||
| ##### Vim | ||||
| ``` | ||||
| # Some examples of various styles: | ||||
| vim: syntax=java | ||||
| vim: set syntax=ruby: | ||||
| vim: set filetype=prolog: | ||||
| vim: set ft=cpp: | ||||
| ``` | ||||
| @@ -111,4 +124,9 @@ lib/linguist.rb | ||||
|  | ||||
| Please check out our [contributing guidelines](CONTRIBUTING.md). | ||||
|  | ||||
| ## | ||||
| ## License | ||||
|  | ||||
| The language grammars included in this gem are covered by their repositories' | ||||
| respective licenses. `grammars.yml` specifies the repository for each grammar. | ||||
|  | ||||
| All other files are covered by the MIT license, see `LICENSE`. | ||||
|   | ||||
							
								
								
									
										8
									
								
								Rakefile
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								Rakefile
									
									
									
									
									
								
							| @@ -40,18 +40,14 @@ task :samples do | ||||
| end | ||||
|  | ||||
| task :build_gem => :samples do | ||||
|   rm_rf "grammars" | ||||
|   sh "script/convert-grammars" | ||||
|   languages = YAML.load_file("lib/linguist/languages.yml") | ||||
|   File.write("lib/linguist/languages.json", Yajl.dump(languages)) | ||||
|   `gem build github-linguist.gemspec` | ||||
|   File.delete("lib/linguist/languages.json") | ||||
| end | ||||
|  | ||||
| task :build_grammars_gem do | ||||
|   rm_rf "grammars" | ||||
|   sh "script/convert-grammars" | ||||
|   sh "gem", "build", "github-linguist-grammars.gemspec" | ||||
| end | ||||
|  | ||||
| namespace :benchmark do | ||||
|   benchmark_path = "benchmark/results" | ||||
|  | ||||
|   | ||||
| @@ -50,6 +50,7 @@ class GitLinguist | ||||
|  | ||||
|   def clear_language_stats | ||||
|     File.unlink(cache_file) | ||||
|   rescue Errno::ENOENT | ||||
|   end | ||||
|  | ||||
|   def disable_language_stats | ||||
| @@ -110,7 +111,7 @@ def git_linguist(args) | ||||
|   parser.parse!(args) | ||||
|  | ||||
|   git_dir = `git rev-parse --git-dir`.strip | ||||
|   raise "git-linguist must be ran in a Git repository" unless $?.success? | ||||
|   raise "git-linguist must be ran in a Git repository (#{Dir.pwd})" unless $?.success? | ||||
|   wrapper = GitLinguist.new(git_dir, commit, incremental) | ||||
|  | ||||
|   case args.pop | ||||
|   | ||||
| @@ -1,14 +0,0 @@ | ||||
| require File.expand_path('../lib/linguist/version', __FILE__) | ||||
|  | ||||
| Gem::Specification.new do |s| | ||||
|   s.name    = 'github-linguist-grammars' | ||||
|   s.version = Linguist::VERSION | ||||
|   s.summary = "Language grammars for use with github-linguist" | ||||
|  | ||||
|   s.authors  = "GitHub" | ||||
|   s.homepage = "https://github.com/github/linguist" | ||||
|  | ||||
|   s.files = ['lib/linguist/grammars.rb'] + Dir['grammars/*'] | ||||
|  | ||||
|   s.add_development_dependency 'plist', '~>3.1' | ||||
| end | ||||
| @@ -10,7 +10,7 @@ Gem::Specification.new do |s| | ||||
|   s.homepage = "https://github.com/github/linguist" | ||||
|   s.license  = "MIT" | ||||
|  | ||||
|   s.files = Dir['lib/**/*'] - ['lib/linguist/grammars.rb'] + ['LICENSE'] | ||||
|   s.files = Dir['lib/**/*'] + Dir['grammars/*'] + ['LICENSE'] | ||||
|   s.executables = ['linguist', 'git-linguist'] | ||||
|  | ||||
|   s.add_dependency 'charlock_holmes', '~> 0.7.3' | ||||
| @@ -20,10 +20,11 @@ Gem::Specification.new do |s| | ||||
|  | ||||
|   s.add_development_dependency 'minitest', '>= 5.0' | ||||
|   s.add_development_dependency 'mocha' | ||||
|   s.add_development_dependency 'plist', '~>3.1' | ||||
|   s.add_development_dependency 'pry' | ||||
|   s.add_development_dependency 'rake' | ||||
|   s.add_development_dependency 'yajl-ruby' | ||||
|   s.add_development_dependency 'color-proximity', '~> 0.2.1' | ||||
|   s.add_development_dependency 'licensee', '6.0.0b1' | ||||
|   s.add_development_dependency 'licensed' | ||||
|  | ||||
| end | ||||
|   | ||||
							
								
								
									
										142
									
								
								grammars.yml
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										142
									
								
								grammars.yml
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							| @@ -18,8 +18,6 @@ http://svn.textmate.org/trunk/Review/Bundles/XQuery.tmbundle: | ||||
| https://bitbucket.org/Clams/sublimesystemverilog/get/default.tar.gz: | ||||
| - source.systemverilog | ||||
| - source.ucfconstraints | ||||
| https://fan.googlecode.com/hg-history/Build%201.0.55/adm/tools/textmate/Fan.tmbundle/Syntaxes/Fan.tmLanguage: | ||||
| - source.fan | ||||
| vendor/grammars/Agda.tmbundle: | ||||
| - source.agda | ||||
| vendor/grammars/Alloy.tmbundle: | ||||
| @@ -29,18 +27,14 @@ vendor/grammars/AutoHotkey/: | ||||
| vendor/grammars/BrightScript.tmbundle/: | ||||
| - source.brightauthorproject | ||||
| - source.brightscript | ||||
| vendor/grammars/CLIPS-sublime: | ||||
| - source.clips | ||||
| vendor/grammars/ColdFusion: | ||||
| - source.cfscript | ||||
| - source.cfscript.cfc | ||||
| - text.cfml.basic | ||||
| - text.html.cfm | ||||
| vendor/grammars/Creole: | ||||
| - text.html.creole | ||||
| vendor/grammars/Docker.tmbundle: | ||||
| - source.dockerfile | ||||
| vendor/grammars/Elm.tmLanguage: | ||||
| vendor/grammars/Elm/: | ||||
| - source.elm | ||||
| vendor/grammars/FreeMarker.tmbundle: | ||||
| - text.html.ftl | ||||
| @@ -50,14 +44,10 @@ vendor/grammars/G-Code/: | ||||
| - source.MOD | ||||
| - source.apt | ||||
| - source.gcode | ||||
| vendor/grammars/GDScript-sublime/: | ||||
| - source.gdscript | ||||
| vendor/grammars/Handlebars: | ||||
| - text.html.handlebars | ||||
| vendor/grammars/IDL-Syntax: | ||||
| - source.webidl | ||||
| vendor/grammars/InnoSetup/: | ||||
| - source.inno | ||||
| vendor/grammars/Isabelle.tmbundle: | ||||
| - source.isabelle.root | ||||
| - source.isabelle.theory | ||||
| @@ -69,6 +59,9 @@ vendor/grammars/Lean.tmbundle: | ||||
| - source.lean | ||||
| vendor/grammars/LiveScript.tmbundle: | ||||
| - source.livescript | ||||
| vendor/grammars/MagicPython: | ||||
| - source.python | ||||
| - source.regexp.python | ||||
| vendor/grammars/Modelica/: | ||||
| - source.modelica | ||||
| vendor/grammars/NSIS: | ||||
| @@ -103,12 +96,8 @@ vendor/grammars/Sublime-Coq: | ||||
| - source.coq | ||||
| vendor/grammars/Sublime-HTTP: | ||||
| - source.httpspec | ||||
| vendor/grammars/Sublime-Inform: | ||||
| - source.Inform7 | ||||
| vendor/grammars/Sublime-Lasso: | ||||
| - file.lasso | ||||
| vendor/grammars/Sublime-Logos: | ||||
| - source.logos | ||||
| vendor/grammars/Sublime-Loom: | ||||
| - source.loomscript | ||||
| vendor/grammars/Sublime-Modula-2/: | ||||
| @@ -133,15 +122,19 @@ vendor/grammars/SublimeBrainfuck: | ||||
| vendor/grammars/SublimeClarion/: | ||||
| - source.clarion | ||||
| vendor/grammars/SublimePapyrus/: | ||||
| - source.compiled-papyrus | ||||
| - source.papyrus | ||||
| - source.papyrus-assembly | ||||
| - source.papyrus.skyrim | ||||
| vendor/grammars/SublimePuppet/: | ||||
| - source.puppet | ||||
| vendor/grammars/SublimeXtend: | ||||
| - source.xtend | ||||
| vendor/grammars/TLA: | ||||
| - source.tla | ||||
| vendor/grammars/TXL/: | ||||
| - source.txl | ||||
| vendor/grammars/Textmate-Gosu-Bundle: | ||||
| - source.gosu.2 | ||||
| vendor/grammars/UrWeb-Language-Definition: | ||||
| - source.ur | ||||
| vendor/grammars/VBDotNetSyntax: | ||||
| - source.vbnet | ||||
| vendor/grammars/Vala-TMBundle: | ||||
| @@ -175,7 +168,7 @@ vendor/grammars/asciidoc.tmbundle/: | ||||
| vendor/grammars/asp.tmbundle: | ||||
| - source.asp | ||||
| - text.html.asp | ||||
| vendor/grammars/assembly.tmbundle: | ||||
| vendor/grammars/assembly/: | ||||
| - objdump.x86asm | ||||
| - source.x86asm | ||||
| vendor/grammars/atom-fsharp/: | ||||
| @@ -183,20 +176,27 @@ vendor/grammars/atom-fsharp/: | ||||
| - source.fsharp.fsi | ||||
| - source.fsharp.fsl | ||||
| - source.fsharp.fsx | ||||
| vendor/grammars/atom-language-clean: | ||||
| - source.clean | ||||
| vendor/grammars/atom-language-purescript/: | ||||
| - source.purescript | ||||
| vendor/grammars/atom-language-srt: | ||||
| - text.srt | ||||
| vendor/grammars/atom-language-stan/: | ||||
| - source.stan | ||||
| vendor/grammars/atom-salt: | ||||
| - source.python.salt | ||||
| - source.yaml.salt | ||||
| vendor/grammars/ats.sublime: | ||||
| vendor/grammars/atomic-dreams/: | ||||
| - source.dm | ||||
| - source.dmf | ||||
| vendor/grammars/ats: | ||||
| - source.ats | ||||
| vendor/grammars/autoitv3-tmbundle: | ||||
| - source.autoit.3 | ||||
| vendor/grammars/awk-sublime: | ||||
| - source.awk | ||||
| vendor/grammars/bison.tmbundle: | ||||
| - source.bison | ||||
| vendor/grammars/boo-sublime: | ||||
| vendor/grammars/boo/: | ||||
| - source.boo | ||||
| vendor/grammars/bro-sublime: | ||||
| - source.bro | ||||
| @@ -221,6 +221,8 @@ vendor/grammars/cool-tmbundle: | ||||
| vendor/grammars/cpp-qt.tmbundle: | ||||
| - source.c++.qt | ||||
| - source.qmake | ||||
| vendor/grammars/creole/: | ||||
| - text.html.creole | ||||
| vendor/grammars/css.tmbundle: | ||||
| - source.css | ||||
| vendor/grammars/cucumber-tmbundle: | ||||
| @@ -247,6 +249,8 @@ vendor/grammars/ec.tmbundle/: | ||||
| - source.c.ec | ||||
| vendor/grammars/eiffel.tmbundle: | ||||
| - source.eiffel | ||||
| vendor/grammars/ejs-tmbundle: | ||||
| - text.html.js | ||||
| vendor/grammars/elixir-tmbundle: | ||||
| - source.elixir | ||||
| - text.elixir | ||||
| @@ -266,13 +270,15 @@ vendor/grammars/fortran.tmbundle: | ||||
| - source.fortran.modern | ||||
| vendor/grammars/gap-tmbundle/: | ||||
| - source.gap | ||||
| vendor/grammars/gdscript/: | ||||
| - source.gdscript | ||||
| vendor/grammars/gettext.tmbundle: | ||||
| - source.po | ||||
| vendor/grammars/gnuplot-tmbundle: | ||||
| - source.gnuplot | ||||
| vendor/grammars/go-tmbundle: | ||||
| - source.go | ||||
| vendor/grammars/grace-tmbundle/: | ||||
| vendor/grammars/grace: | ||||
| - source.grace | ||||
| vendor/grammars/gradle.tmbundle: | ||||
| - source.groovy.gradle | ||||
| @@ -295,6 +301,8 @@ vendor/grammars/idl.tmbundle: | ||||
| - source.idl | ||||
| - source.idl-dlm | ||||
| - text.idl-idldoc | ||||
| vendor/grammars/idris/: | ||||
| - source.idris | ||||
| vendor/grammars/ini.tmbundle: | ||||
| - source.ini | ||||
| vendor/grammars/io.tmbundle: | ||||
| @@ -319,9 +327,13 @@ vendor/grammars/json.tmbundle: | ||||
| - source.json | ||||
| vendor/grammars/kotlin-sublime-package: | ||||
| - source.Kotlin | ||||
| vendor/grammars/language-apl: | ||||
| - source.apl | ||||
| vendor/grammars/language-babel/: | ||||
| - source.js.jsx | ||||
| - source.regexp.babel | ||||
| vendor/grammars/language-click/: | ||||
| - source.click | ||||
| vendor/grammars/language-clojure: | ||||
| - source.clojure | ||||
| vendor/grammars/language-coffee-script: | ||||
| @@ -329,15 +341,24 @@ vendor/grammars/language-coffee-script: | ||||
| - source.litcoffee | ||||
| vendor/grammars/language-crystal: | ||||
| - source.crystal | ||||
| - text.html.ecr | ||||
| vendor/grammars/language-csharp: | ||||
| - source.cake | ||||
| - source.cs | ||||
| - source.csx | ||||
| - source.nant-build | ||||
| vendor/grammars/language-csound: | ||||
| - source.csound | ||||
| - source.csound-document | ||||
| - source.csound-score | ||||
| vendor/grammars/language-gfm: | ||||
| - source.gfm | ||||
| vendor/grammars/language-graphql: | ||||
| - source.graphql | ||||
| vendor/grammars/language-hy: | ||||
| - source.hy | ||||
| vendor/grammars/language-inform7: | ||||
| - source.inform7 | ||||
| vendor/grammars/language-javascript: | ||||
| - source.js | ||||
| - source.js.regexp | ||||
| @@ -345,22 +366,39 @@ vendor/grammars/language-javascript: | ||||
| vendor/grammars/language-jsoniq/: | ||||
| - source.jq | ||||
| - source.xq | ||||
| vendor/grammars/language-less/: | ||||
| - source.css.less | ||||
| vendor/grammars/language-maxscript: | ||||
| - source.maxscript | ||||
| vendor/grammars/language-ncl: | ||||
| - source.ncl | ||||
| vendor/grammars/language-povray: | ||||
| - source.pov-ray sdl | ||||
| vendor/grammars/language-python: | ||||
| - source.python | ||||
| - source.regexp.python | ||||
| - text.python.console | ||||
| - text.python.traceback | ||||
| vendor/grammars/language-renpy: | ||||
| - source.renpy | ||||
| vendor/grammars/language-restructuredtext: | ||||
| - text.restructuredtext | ||||
| vendor/grammars/language-shellscript: | ||||
| - source.shell | ||||
| - text.shell-session | ||||
| vendor/grammars/language-supercollider: | ||||
| - source.supercollider | ||||
| vendor/grammars/language-toc-wow: | ||||
| - source.toc | ||||
| vendor/grammars/language-turing: | ||||
| - source.turing | ||||
| vendor/grammars/language-wavefront: | ||||
| - source.wavefront.mtl | ||||
| - source.wavefront.obj | ||||
| vendor/grammars/language-xbase: | ||||
| - source.harbour | ||||
| vendor/grammars/language-yaml: | ||||
| - source.yaml | ||||
| vendor/grammars/language-yang/: | ||||
| - source.yang | ||||
| vendor/grammars/latex.tmbundle: | ||||
| - text.bibtex | ||||
| - text.log.latex | ||||
| @@ -368,8 +406,6 @@ vendor/grammars/latex.tmbundle: | ||||
| - text.tex.latex | ||||
| - text.tex.latex.beamer | ||||
| - text.tex.latex.memoir | ||||
| vendor/grammars/less.tmbundle: | ||||
| - source.css.less | ||||
| vendor/grammars/lilypond.tmbundle: | ||||
| - source.lilypond | ||||
| vendor/grammars/liquid.tmbundle: | ||||
| @@ -378,6 +414,8 @@ vendor/grammars/lisp.tmbundle: | ||||
| - source.lisp | ||||
| vendor/grammars/llvm.tmbundle: | ||||
| - source.llvm | ||||
| vendor/grammars/logos: | ||||
| - source.logos | ||||
| vendor/grammars/logtalk.tmbundle: | ||||
| - source.logtalk | ||||
| vendor/grammars/lua.tmbundle: | ||||
| @@ -397,16 +435,20 @@ vendor/grammars/mediawiki.tmbundle/: | ||||
| - text.html.mediawiki | ||||
| vendor/grammars/mercury-tmlanguage: | ||||
| - source.mercury | ||||
| vendor/grammars/monkey.tmbundle: | ||||
| vendor/grammars/monkey/: | ||||
| - source.monkey | ||||
| vendor/grammars/moonscript-tmbundle: | ||||
| - source.moonscript | ||||
| vendor/grammars/nemerle.tmbundle: | ||||
| - source.nemerle | ||||
| vendor/grammars/nesC.tmbundle: | ||||
| vendor/grammars/nesC: | ||||
| - source.nesc | ||||
| vendor/grammars/ninja.tmbundle: | ||||
| - source.ninja | ||||
| vendor/grammars/nix: | ||||
| - source.nix | ||||
| vendor/grammars/nu.tmbundle: | ||||
| - source.nu | ||||
| vendor/grammars/objective-c.tmbundle: | ||||
| - source.objc | ||||
| - source.objc++ | ||||
| @@ -421,21 +463,25 @@ vendor/grammars/ooc.tmbundle: | ||||
| - source.ooc | ||||
| vendor/grammars/opa.tmbundle: | ||||
| - source.opa | ||||
| vendor/grammars/openscad.tmbundle/: | ||||
| - source.scad | ||||
| vendor/grammars/oracle.tmbundle: | ||||
| - source.plsql.oracle | ||||
| vendor/grammars/oz-tmbundle/Syntaxes/Oz.tmLanguage: | ||||
| - source.oz | ||||
| vendor/grammars/pascal.tmbundle: | ||||
| - source.pascal | ||||
| vendor/grammars/pawn-sublime-language/: | ||||
| - source.pawn | ||||
| vendor/grammars/perl.tmbundle/: | ||||
| - source.perl | ||||
| - source.perl.6 | ||||
| vendor/grammars/perl6fe: | ||||
| - source.meta-info | ||||
| - source.perl6fe | ||||
| - source.regexp.perl6fe | ||||
| vendor/grammars/php-smarty.tmbundle: | ||||
| - text.html.smarty | ||||
| vendor/grammars/php.tmbundle: | ||||
| - text.html.php | ||||
| vendor/grammars/pig-latin/: | ||||
| - source.pig_latin | ||||
| vendor/grammars/pike-textmate: | ||||
| - source.pike | ||||
| vendor/grammars/postscript.tmbundle: | ||||
| @@ -446,16 +492,12 @@ vendor/grammars/processing.tmbundle: | ||||
| - source.processing | ||||
| vendor/grammars/protobuf-tmbundle: | ||||
| - source.protobuf | ||||
| vendor/grammars/puppet-textmate-bundle: | ||||
| - source.puppet | ||||
| vendor/grammars/python-django.tmbundle: | ||||
| - source.python.django | ||||
| - text.html.django | ||||
| vendor/grammars/r.tmbundle: | ||||
| - source.r | ||||
| - text.tex.latex.rd | ||||
| vendor/grammars/restructuredtext.tmbundle: | ||||
| - text.restructuredtext | ||||
| vendor/grammars/ruby-haml.tmbundle: | ||||
| - text.haml | ||||
| vendor/grammars/ruby-slim.tmbundle: | ||||
| @@ -464,8 +506,8 @@ vendor/grammars/ruby.tmbundle: | ||||
| - source.ruby | ||||
| - text.html.erb | ||||
| vendor/grammars/sas.tmbundle: | ||||
| - source.SASLog | ||||
| - source.sas | ||||
| - source.sas_log | ||||
| vendor/grammars/sass-textmate-bundle: | ||||
| - source.sass | ||||
| vendor/grammars/scala.tmbundle: | ||||
| @@ -479,6 +521,8 @@ vendor/grammars/smali-sublime/smali.tmLanguage: | ||||
| - source.smali | ||||
| vendor/grammars/smalltalk-tmbundle: | ||||
| - source.smalltalk | ||||
| vendor/grammars/sourcepawn/: | ||||
| - source.sp | ||||
| vendor/grammars/sql.tmbundle: | ||||
| - source.sql | ||||
| vendor/grammars/st2-zonefile: | ||||
| @@ -488,23 +532,23 @@ vendor/grammars/standard-ml.tmbundle: | ||||
| - source.ml | ||||
| vendor/grammars/sublime-MuPAD: | ||||
| - source.mupad | ||||
| vendor/grammars/sublime-apl/: | ||||
| - source.apl | ||||
| vendor/grammars/sublime-aspectj/: | ||||
| - source.aspectj | ||||
| vendor/grammars/sublime-autoit/: | ||||
| - source.autoit | ||||
| vendor/grammars/sublime-befunge: | ||||
| - source.befunge | ||||
| vendor/grammars/sublime-bsv: | ||||
| - source.bsv | ||||
| vendor/grammars/sublime-cirru: | ||||
| - source.cirru | ||||
| vendor/grammars/sublime-clips/: | ||||
| - source.clips | ||||
| vendor/grammars/sublime-glsl: | ||||
| - source.essl | ||||
| - source.glsl | ||||
| vendor/grammars/sublime-golo/: | ||||
| - source.golo | ||||
| vendor/grammars/sublime-idris: | ||||
| - source.idris | ||||
| vendor/grammars/sublime-mask: | ||||
| - source.mask | ||||
| vendor/grammars/sublime-netlinx: | ||||
| @@ -512,8 +556,6 @@ vendor/grammars/sublime-netlinx: | ||||
| - source.netlinx.erb | ||||
| vendor/grammars/sublime-nginx: | ||||
| - source.nginx | ||||
| vendor/grammars/sublime-nix: | ||||
| - source.nix | ||||
| vendor/grammars/sublime-opal/: | ||||
| - source.opal | ||||
| - source.opalsysdefs | ||||
| @@ -523,17 +565,15 @@ vendor/grammars/sublime-robot-plugin: | ||||
| - text.robot | ||||
| vendor/grammars/sublime-rust: | ||||
| - source.rust | ||||
| vendor/grammars/sublime-sourcepawn: | ||||
| - source.sp | ||||
| vendor/grammars/sublime-spintools/: | ||||
| - source.regexp.spin | ||||
| - source.spin | ||||
| vendor/grammars/sublime-tea: | ||||
| - source.tea | ||||
| vendor/grammars/sublime-terra: | ||||
| - source.terra | ||||
| vendor/grammars/sublime-text-ox/: | ||||
| - source.ox | ||||
| vendor/grammars/sublime-text-pig-latin/: | ||||
| - source.pig_latin | ||||
| vendor/grammars/sublime-typescript/: | ||||
| - source.ts | ||||
| - source.tsx | ||||
| @@ -547,6 +587,8 @@ vendor/grammars/sublime_cobol: | ||||
| vendor/grammars/sublime_man_page_support: | ||||
| - source.man | ||||
| - text.groff | ||||
| vendor/grammars/sublimeassembly/: | ||||
| - source.assembly | ||||
| vendor/grammars/sublimeprolog/: | ||||
| - source.prolog | ||||
| - source.prolog.eclipse | ||||
| @@ -568,8 +610,6 @@ vendor/grammars/verilog.tmbundle: | ||||
| - source.verilog | ||||
| vendor/grammars/vue-syntax-highlight: | ||||
| - text.html.vue | ||||
| vendor/grammars/x86-assembly-textmate-bundle: | ||||
| - source.asm.x86 | ||||
| vendor/grammars/xc.tmbundle/: | ||||
| - source.xc | ||||
| vendor/grammars/xml.tmbundle: | ||||
|   | ||||
| @@ -1,5 +1,6 @@ | ||||
| require 'linguist/blob_helper' | ||||
| require 'linguist/generated' | ||||
| require 'linguist/grammars' | ||||
| require 'linguist/heuristics' | ||||
| require 'linguist/language' | ||||
| require 'linguist/repository' | ||||
| @@ -8,13 +9,91 @@ require 'linguist/shebang' | ||||
| require 'linguist/version' | ||||
|  | ||||
| class << Linguist | ||||
|   # Public: Detects the Language of the blob. | ||||
|   # | ||||
|   # blob - an object that includes the Linguist `BlobHelper` interface; | ||||
|   #       see Linguist::LazyBlob and Linguist::FileBlob for examples | ||||
|   # | ||||
|   # Returns Language or nil. | ||||
|   def detect(blob) | ||||
|     # Bail early if the blob is binary or empty. | ||||
|     return nil if blob.likely_binary? || blob.binary? || blob.empty? | ||||
|  | ||||
|     Linguist.instrument("linguist.detection", :blob => blob) do | ||||
|       # Call each strategy until one candidate is returned. | ||||
|       languages = [] | ||||
|       returning_strategy = nil | ||||
|  | ||||
|       STRATEGIES.each do |strategy| | ||||
|         returning_strategy = strategy | ||||
|         candidates = Linguist.instrument("linguist.strategy", :blob => blob, :strategy => strategy, :candidates => languages) do | ||||
|           strategy.call(blob, languages) | ||||
|         end | ||||
|         if candidates.size == 1 | ||||
|           languages = candidates | ||||
|           break | ||||
|         elsif candidates.size > 1 | ||||
|           # More than one candidate was found, pass them to the next strategy. | ||||
|           languages = candidates | ||||
|         else | ||||
|           # No candidates, try the next strategy | ||||
|         end | ||||
|       end | ||||
|  | ||||
|       Linguist.instrument("linguist.detected", :blob => blob, :strategy => returning_strategy, :language => languages.first) | ||||
|  | ||||
|       languages.first | ||||
|     end | ||||
|   end | ||||
|  | ||||
|   # Internal: The strategies used to detect the language of a file. | ||||
|   # | ||||
|   # A strategy is an object that has a `.call` method that takes two arguments: | ||||
|   # | ||||
|   #   blob - An object that quacks like a blob. | ||||
|   #   languages - An Array of candidate Language objects that were returned by the | ||||
|   #               previous strategy. | ||||
|   # | ||||
|   # A strategy should return an Array of Language candidates. | ||||
|   # | ||||
|   # Strategies are called in turn until a single Language is returned. | ||||
|   STRATEGIES = [ | ||||
|     Linguist::Strategy::Modeline, | ||||
|     Linguist::Shebang, | ||||
|     Linguist::Strategy::Filename, | ||||
|     Linguist::Heuristics, | ||||
|     Linguist::Classifier | ||||
|   ] | ||||
|  | ||||
|   # Public: Set an instrumenter. | ||||
|   # | ||||
|   #     class CustomInstrumenter | ||||
|   #       def instrument(name, payload = {}) | ||||
|   #         warn "Instrumenting #{name}: #{payload[:blob]}" | ||||
|   #       end | ||||
|   #     end | ||||
|   # | ||||
|   #     Linguist.instrumenter = CustomInstrumenter | ||||
|   # | ||||
|   # The instrumenter must conform to the `ActiveSupport::Notifications` | ||||
|   # interface, which defines `#instrument` and accepts: | ||||
|   # | ||||
|   # name    - the String name of the event (e.g. "linguist.detected") | ||||
|   # payload - a Hash of the exception context. | ||||
|   attr_accessor :instrumenter | ||||
|  | ||||
|   # Internal: Perform instrumentation on a block | ||||
|   # | ||||
|   #     Linguist.instrument("linguist.dosomething", :blob => blob) do | ||||
|   #       # logic to instrument here. | ||||
|   #     end | ||||
|   # | ||||
|   def instrument(*args, &bk) | ||||
|     if instrumenter | ||||
|       instrumenter.instrument(*args, &bk) | ||||
|     else | ||||
|       yield if block_given? | ||||
|     elsif block_given? | ||||
|       yield | ||||
|     end | ||||
|   end | ||||
|  | ||||
| end | ||||
|   | ||||
| @@ -63,7 +63,7 @@ module Linguist | ||||
|     # | ||||
|     # Returns an Array | ||||
|     def extensions | ||||
|       basename, *segments = name.downcase.split(".") | ||||
|       _, *segments = name.downcase.split(".") | ||||
|  | ||||
|       segments.map.with_index do |segment, index| | ||||
|         "." + segments[index..-1].join(".") | ||||
|   | ||||
| @@ -6,7 +6,7 @@ require 'yaml' | ||||
|  | ||||
| module Linguist | ||||
|   # DEPRECATED Avoid mixing into Blob classes. Prefer functional interfaces | ||||
|   # like `Language.detect` over `Blob#language`. Functions are much easier to | ||||
|   # like `Linguist.detect` over `Blob#language`. Functions are much easier to | ||||
|   # cache and compose. | ||||
|   # | ||||
|   # Avoid adding additional bloat to this module. | ||||
| @@ -325,7 +325,7 @@ module Linguist | ||||
|     # | ||||
|     # Returns a Language or nil if none is detected | ||||
|     def language | ||||
|       @language ||= Language.detect(self) | ||||
|       @language ||= Linguist.detect(self) | ||||
|     end | ||||
|  | ||||
|     # Internal: Get the TextMate compatible scope for the blob | ||||
|   | ||||
| @@ -56,9 +56,11 @@ module Linguist | ||||
|       generated_net_specflow_feature_file? || | ||||
|       composer_lock? || | ||||
|       node_modules? || | ||||
|       npm_shrinkwrap? || | ||||
|       godeps? || | ||||
|       generated_by_zephir? || | ||||
|       minified_files? || | ||||
|       has_source_map? || | ||||
|       source_map? || | ||||
|       compiled_coffeescript? || | ||||
|       generated_parser? || | ||||
| @@ -72,7 +74,9 @@ module Linguist | ||||
|       vcr_cassette? || | ||||
|       generated_module? || | ||||
|       generated_unity3d_meta? || | ||||
|       generated_racc? | ||||
|       generated_racc? || | ||||
|       generated_jflex? || | ||||
|       generated_grammarkit? | ||||
|     end | ||||
|  | ||||
|     # Internal: Is the blob an Xcode file? | ||||
| @@ -102,6 +106,21 @@ module Linguist | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     # Internal: Does the blob contain a source map reference? | ||||
|     # | ||||
|     # We assume that if one of the last 2 lines starts with a source map | ||||
|     # reference, then the current file was generated from other files. | ||||
|     # | ||||
|     # We use the last 2 lines because the last line might be empty. | ||||
|     # | ||||
|     # We only handle JavaScript, no CSS support yet. | ||||
|     # | ||||
|     # Returns true or false. | ||||
|     def has_source_map? | ||||
|       return false unless extname.downcase == '.js' | ||||
|       lines.last(2).any? { |line| line.start_with?('//# sourceMappingURL') } | ||||
|     end | ||||
|  | ||||
|     # Internal: Is the blob a generated source map? | ||||
|     # | ||||
|     # Source Maps usually have .css.map or .js.map extensions. In case they | ||||
| @@ -285,6 +304,13 @@ module Linguist | ||||
|       !!name.match(/node_modules\//) | ||||
|     end | ||||
|  | ||||
|     # Internal: Is the blob a generated npm shrinkwrap file. | ||||
|     # | ||||
|     # Returns true or false. | ||||
|     def npm_shrinkwrap? | ||||
|       !!name.match(/npm-shrinkwrap\.json/) | ||||
|     end | ||||
|  | ||||
|     # Internal: Is the blob part of Godeps/, | ||||
|     # which are not meant for humans in pull requests. | ||||
|     # | ||||
| @@ -373,5 +399,32 @@ module Linguist | ||||
|       return false unless lines.count > 2 | ||||
|       return lines[2].start_with?("# This file is automatically generated by Racc") | ||||
|     end | ||||
|  | ||||
|     # Internal: Is this a JFlex-generated file? | ||||
|     # | ||||
|     # A JFlex-generated file contains: | ||||
|     # /* The following code was generated by JFlex x.y.z on d/at/e ti:me */ | ||||
|     # on the first line. | ||||
|     # | ||||
|     # Return true or false | ||||
|     def generated_jflex? | ||||
|       return false unless extname == '.java' | ||||
|       return false unless lines.count > 1 | ||||
|       return lines[0].start_with?("/* The following code was generated by JFlex ") | ||||
|     end | ||||
|  | ||||
|     # Internal: Is this a GrammarKit-generated file? | ||||
|     # | ||||
|     # A GrammarKit-generated file typically contain: | ||||
|     # // This is a generated file. Not intended for manual editing. | ||||
|     # on the first line. This is not always the case, as it's possible to | ||||
|     # customize the class header. | ||||
|     # | ||||
|     # Return true or false | ||||
|     def generated_grammarkit? | ||||
|       return false unless extname == '.java' | ||||
|       return false unless lines.count > 1 | ||||
|       return lines[0].start_with?("// This is a generated file. Not intended for manual editing.") | ||||
|     end | ||||
|   end | ||||
| end | ||||
|   | ||||
| @@ -1,6 +1,3 @@ | ||||
| # Note: This file is included in the github-linguist-grammars gem, not the | ||||
| # github-linguist gem. | ||||
|  | ||||
| module Linguist | ||||
|   module Grammars | ||||
|     # Get the path to the directory containing the language grammar JSON files. | ||||
|   | ||||
| @@ -86,6 +86,14 @@ module Linguist | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     disambiguate ".builds" do |data| | ||||
|       if /^(\s*)(<Project|<Import|<Property|<?xml|xmlns)/i.match(data) | ||||
|         Language["XML"] | ||||
|       else | ||||
|         Language["Text"] | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     disambiguate ".ch" do |data| | ||||
|       if /^\s*#\s*(if|ifdef|ifndef|define|command|xcommand|translate|xtranslate|include|pragma|undef)\b/i.match(data) | ||||
|         Language["xBase"] | ||||
| @@ -128,10 +136,18 @@ module Linguist | ||||
|       end | ||||
|     end | ||||
|      | ||||
|     disambiguate ".es" do |data| | ||||
|       if /^\s*(?:%%|main\s*\(.*?\)\s*->)/.match(data) | ||||
|         Language["Erlang"] | ||||
|       elsif /(?:\/\/|("|')use strict\1|export\s+default\s|\/\*.*?\*\/)/m.match(data) | ||||
|         Language["JavaScript"] | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     disambiguate ".for", ".f" do |data| | ||||
|       if /^: /.match(data) | ||||
|         Language["Forth"] | ||||
|       elsif /^([c*][^a-z]|      (subroutine|program)\s|\s*!)/i.match(data) | ||||
|       elsif /^([c*][^abd-z]|      (subroutine|program|end)\s|\s*!)/i.match(data) | ||||
|         Language["FORTRAN"] | ||||
|       end | ||||
|     end | ||||
| @@ -171,6 +187,12 @@ module Linguist | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     disambiguate ".inc" do |data| | ||||
|       if /^<\?(?:php)?/.match(data) | ||||
|         Language["PHP"] | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     disambiguate ".l" do |data| | ||||
|       if /\(def(un|macro)\s/.match(data) | ||||
|         Language["Common Lisp"] | ||||
| @@ -238,8 +260,10 @@ module Linguist | ||||
|     disambiguate ".ms" do |data| | ||||
|       if /^[.'][a-z][a-z](\s|$)/i.match(data) | ||||
|         Language["Groff"] | ||||
|       elsif /((^|\s)move?[. ])|\.(include|globa?l)\s/.match(data) | ||||
|       elsif /(?<!\S)\.(include|globa?l)\s/.match(data) || /(?<!\/\*)(\A|\n)\s*\.[A-Za-z]/.match(data.gsub(/"([^\\"]|\\.)*"|'([^\\']|\\.)*'|\\\s*(?:--.*)?\n/, "")) | ||||
|         Language["GAS"] | ||||
|       else | ||||
|         Language["MAXScript"] | ||||
|       end | ||||
|     end | ||||
|  | ||||
| @@ -274,19 +298,27 @@ module Linguist | ||||
|     end | ||||
|  | ||||
|     disambiguate ".pl" do |data| | ||||
|       if /^(use v6|(my )?class|module)/.match(data) | ||||
|         Language["Perl6"] | ||||
|       if /^[^#]+:-/.match(data) | ||||
|         Language["Prolog"] | ||||
|       elsif /use strict|use\s+v?5\./.match(data) | ||||
|         Language["Perl"] | ||||
|       elsif /^[^#]+:-/.match(data) | ||||
|         Language["Prolog"] | ||||
|       elsif /^(use v6|(my )?class|module)/.match(data) | ||||
|         Language["Perl6"] | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     disambiguate ".pm", ".t" do |data| | ||||
|       if /^(use v6|(my )?class|module)/.match(data) | ||||
|       if /use strict|use\s+v?5\./.match(data) | ||||
|         Language["Perl"] | ||||
|       elsif /^(use v6|(my )?class|module)/.match(data) | ||||
|         Language["Perl6"] | ||||
|       elsif /use strict|use\s+v?5\./.match(data) | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     disambiguate ".pod" do |data| | ||||
|       if /^=\w+$/.match(data) | ||||
|         Language["Pod"] | ||||
|       else | ||||
|         Language["Perl"] | ||||
|       end | ||||
|     end | ||||
| @@ -303,6 +335,14 @@ module Linguist | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     disambiguate ".props" do |data| | ||||
|       if /^(\s*)(<Project|<Import|<Property|<?xml|xmlns)/i.match(data) | ||||
|         Language["XML"] | ||||
|       elsif /\w+\s*=\s*/i.match(data) | ||||
|         Language["INI"] | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     disambiguate ".r" do |data| | ||||
|       if /\bRebol\b/i.match(data) | ||||
|         Language["Rebol"] | ||||
| @@ -311,6 +351,14 @@ module Linguist | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     disambiguate ".rpy" do |data| | ||||
|       if /(^(import|from|class|def)\s)/m.match(data) | ||||
|         Language["Python"] | ||||
|       else | ||||
|         Language["Ren'Py"] | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     disambiguate ".rs" do |data| | ||||
|       if /^(use |fn |mod |pub |macro_rules|impl|#!?\[)/.match(data) | ||||
|         Language["Rust"] | ||||
| @@ -328,13 +376,13 @@ module Linguist | ||||
|     end | ||||
|  | ||||
|     disambiguate ".sql" do |data| | ||||
|       if /^\\i\b|AS \$\$|LANGUAGE '+plpgsql'+/i.match(data) || /SECURITY (DEFINER|INVOKER)/i.match(data) || /BEGIN( WORK| TRANSACTION)?;/i.match(data) | ||||
|       if /^\\i\b|AS \$\$|LANGUAGE '?plpgsql'?/i.match(data) || /SECURITY (DEFINER|INVOKER)/i.match(data) || /BEGIN( WORK| TRANSACTION)?;/i.match(data) | ||||
|         #Postgres | ||||
|         Language["PLpgSQL"] | ||||
|       elsif /(alter module)|(language sql)|(begin( NOT)+ atomic)/i.match(data)  || /signal SQLSTATE '[0-9]+'/i.match(data) | ||||
|         #IBM db2 | ||||
|         Language["SQLPL"] | ||||
|       elsif /pragma|\$\$PLSQL_|XMLTYPE|sysdate|systimestamp|\.nextval|connect by|AUTHID (DEFINER|CURRENT_USER)/i.match(data) || /constructor\W+function/i.match(data) | ||||
|       elsif /\$\$PLSQL_|XMLTYPE|sysdate|systimestamp|\.nextval|connect by|AUTHID (DEFINER|CURRENT_USER)/i.match(data) || /constructor\W+function/i.match(data) | ||||
|         #Oracle | ||||
|         Language["PLSQL"] | ||||
|       elsif ! /begin|boolean|package|exception/i.match(data) | ||||
| @@ -343,6 +391,28 @@ module Linguist | ||||
|       end | ||||
|     end | ||||
|      | ||||
|     disambiguate ".srt" do |data| | ||||
|       if /^(\d{2}:\d{2}:\d{2},\d{3})\s*(-->)\s*(\d{2}:\d{2}:\d{2},\d{3})$/.match(data) | ||||
|         Language["SubRip Text"] | ||||
|       end | ||||
|     end | ||||
|      | ||||
|     disambiguate ".t" do |data| | ||||
|       if /^\s*%|^\s*var\s+\w+\s*:\s*\w+/.match(data) | ||||
|         Language["Turing"] | ||||
|       elsif /^\s*use\s+v6\s*;/.match(data) | ||||
|         Language["Perl6"] | ||||
|       end | ||||
|     end | ||||
|      | ||||
|     disambiguate ".toc" do |data| | ||||
|       if /^## |@no-lib-strip@/.match(data) | ||||
|         Language["World of Warcraft Addon Data"] | ||||
|       elsif /^\\(contentsline|defcounter|beamer|boolfalse)/.match(data) | ||||
|         Language["TeX"] | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     disambiguate ".ts" do |data| | ||||
|       if data.include?("<TS ") | ||||
|         Language["XML"] | ||||
|   | ||||
| @@ -87,14 +87,6 @@ module Linguist | ||||
|       language | ||||
|     end | ||||
|  | ||||
|     STRATEGIES = [ | ||||
|       Linguist::Strategy::Modeline, | ||||
|       Linguist::Shebang, | ||||
|       Linguist::Strategy::Filename, | ||||
|       Linguist::Heuristics, | ||||
|       Linguist::Classifier | ||||
|     ] | ||||
|  | ||||
|     # Public: Detects the Language of the blob. | ||||
|     # | ||||
|     # blob - an object that includes the Linguist `BlobHelper` interface; | ||||
| @@ -102,34 +94,8 @@ module Linguist | ||||
|     # | ||||
|     # Returns Language or nil. | ||||
|     def self.detect(blob) | ||||
|       # Bail early if the blob is binary or empty. | ||||
|       return nil if blob.likely_binary? || blob.binary? || blob.empty? | ||||
|  | ||||
|       Linguist.instrument("linguist.detection", :blob => blob) do | ||||
|         # Call each strategy until one candidate is returned. | ||||
|         languages = [] | ||||
|         returning_strategy = nil | ||||
|  | ||||
|         STRATEGIES.each do |strategy| | ||||
|           returning_strategy = strategy | ||||
|           candidates = Linguist.instrument("linguist.strategy", :blob => blob, :strategy => strategy, :candidates => languages) do | ||||
|             strategy.call(blob, languages) | ||||
|           end | ||||
|           if candidates.size == 1 | ||||
|             languages = candidates | ||||
|             break | ||||
|           elsif candidates.size > 1 | ||||
|             # More than one candidate was found, pass them to the next strategy. | ||||
|             languages = candidates | ||||
|           else | ||||
|             # No candidates, try the next strategy | ||||
|           end | ||||
|         end | ||||
|  | ||||
|         Linguist.instrument("linguist.detected", :blob => blob, :strategy => returning_strategy, :language => languages.first) | ||||
|  | ||||
|         languages.first | ||||
|       end | ||||
|       warn "[DEPRECATED] `Linguist::Language.detect` is deprecated. Use `Linguist.detect`. #{caller[0]}" | ||||
|       Linguist.detect(blob) | ||||
|     end | ||||
|  | ||||
|     # Public: Get all Languages | ||||
|   | ||||
							
								
								
									
										418
									
								
								lib/linguist/languages.yml
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										418
									
								
								lib/linguist/languages.yml
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -28,6 +28,7 @@ module Linguist | ||||
|       @oid = oid | ||||
|       @path = path | ||||
|       @mode = mode | ||||
|       @data = nil | ||||
|     end | ||||
|  | ||||
|     def git_attributes | ||||
| @@ -86,8 +87,8 @@ module Linguist | ||||
|     protected | ||||
|  | ||||
|     # Returns true if the attribute is present and not the string "false". | ||||
|     def boolean_attribute(attr) | ||||
|       attr != "false" | ||||
|     def boolean_attribute(attribute) | ||||
|       attribute != "false" | ||||
|     end | ||||
|  | ||||
|     def load_blob! | ||||
|   | ||||
| @@ -30,6 +30,9 @@ module Linguist | ||||
|       @repository = repo | ||||
|       @commit_oid = commit_oid | ||||
|  | ||||
|       @old_commit_oid = nil | ||||
|       @old_stats = nil | ||||
|  | ||||
|       raise TypeError, 'commit_oid must be a commit SHA1' unless commit_oid.is_a?(String) | ||||
|     end | ||||
|  | ||||
|   | ||||
| @@ -21,7 +21,7 @@ module Linguist | ||||
|     def self.cache | ||||
|       @cache ||= begin | ||||
|         serializer = defined?(Yajl) ? Yajl : YAML | ||||
|         serializer.load(File.read(PATH)) | ||||
|         serializer.load(File.read(PATH, encoding: 'utf-8')) | ||||
|       end | ||||
|     end | ||||
|  | ||||
|   | ||||
| @@ -42,10 +42,10 @@ module Linguist | ||||
|       return unless script | ||||
|  | ||||
|       # "python2.6" -> "python2" | ||||
|       script.sub! /(\.\d+)$/, '' | ||||
|       script.sub!(/(\.\d+)$/, '') | ||||
|  | ||||
|       # #! perl -> perl | ||||
|       script.sub! /^#!\s*/, '' | ||||
|       script.sub!(/^#!\s*/, '') | ||||
|  | ||||
|       # Check for multiline shebang hacks that call `exec` | ||||
|       if script == 'sh' && | ||||
|   | ||||
| @@ -1,8 +1,23 @@ | ||||
| module Linguist | ||||
|   module Strategy | ||||
|     class Modeline | ||||
|       EmacsModeline = /-\*-\s*(?:(?!mode)[\w-]+\s*:\s*(?:[\w+-]+)\s*;?\s*)*(?:mode\s*:)?\s*([\w+-]+)\s*(?:;\s*(?!mode)[\w-]+\s*:\s*[\w+-]+\s*)*;?\s*-\*-/i | ||||
|       VimModeline = /vim:\s*set.*\s(?:ft|filetype)=(\w+)\s?.*:/i | ||||
|       EMACS_MODELINE = /-\*-\s*(?:(?!mode)[\w-]+\s*:\s*(?:[\w+-]+)\s*;?\s*)*(?:mode\s*:)?\s*([\w+-]+)\s*(?:;\s*(?!mode)[\w-]+\s*:\s*[\w+-]+\s*)*;?\s*-\*-/i | ||||
|  | ||||
|       # First form vim modeline | ||||
|       # [text]{white}{vi:|vim:|ex:}[white]{options} | ||||
|       # ex: 'vim: syntax=ruby' | ||||
|       VIM_MODELINE_1 = /(?:vim|vi|ex):\s*(?:ft|filetype|syntax)=(\w+)\s?/i | ||||
|  | ||||
|       # Second form vim modeline (compatible with some versions of Vi) | ||||
|       # [text]{white}{vi:|vim:|Vim:|ex:}[white]se[t] {options}:[text] | ||||
|       # ex: 'vim set syntax=ruby:' | ||||
|       VIM_MODELINE_2 = /(?:vim|vi|Vim|ex):\s*se(?:t)?.*\s(?:ft|filetype|syntax)=(\w+)\s?.*:/i | ||||
|  | ||||
|       MODELINES = [EMACS_MODELINE, VIM_MODELINE_1, VIM_MODELINE_2] | ||||
|  | ||||
|       # Scope of the search for modelines | ||||
|       # Number of lines to check at the beginning and at the end of the file | ||||
|       SEARCH_SCOPE = 5 | ||||
|  | ||||
|       # Public: Detects language based on Vim and Emacs modelines | ||||
|       # | ||||
| @@ -15,14 +30,16 @@ module Linguist | ||||
|       # Returns an Array with one Language if the blob has a Vim or Emacs modeline | ||||
|       # that matches a Language name or alias. Returns an empty array if no match. | ||||
|       def self.call(blob, _ = nil) | ||||
|         Array(Language.find_by_alias(modeline(blob.data))) | ||||
|         header = blob.lines.first(SEARCH_SCOPE).join("\n") | ||||
|         footer = blob.lines.last(SEARCH_SCOPE).join("\n") | ||||
|         Array(Language.find_by_alias(modeline(header + footer))) | ||||
|       end | ||||
|  | ||||
|       # Public: Get the modeline from the first n-lines of the file | ||||
|       # | ||||
|       # Returns a String or nil | ||||
|       def self.modeline(data) | ||||
|         match = data.match(EmacsModeline) || data.match(VimModeline) | ||||
|         match = MODELINES.map { |regex| data.match(regex) }.reject(&:nil?).first | ||||
|         match[1] if match | ||||
|       end | ||||
|     end | ||||
|   | ||||
| @@ -20,10 +20,17 @@ | ||||
| - ^deps/ | ||||
| - ^tools/ | ||||
| - (^|/)configure$ | ||||
| - (^|/)configure.ac$ | ||||
| - (^|/)config.guess$ | ||||
| - (^|/)config.sub$ | ||||
|  | ||||
| # stuff autogenerated by autoconf - still C deps | ||||
| - (^|/)aclocal.m4 | ||||
| - (^|/)libtool.m4 | ||||
| - (^|/)ltoptions.m4 | ||||
| - (^|/)ltsugar.m4 | ||||
| - (^|/)ltversion.m4 | ||||
| - (^|/)lt~obsolete.m4 | ||||
|  | ||||
| # Linters | ||||
| - cpplint.py | ||||
|  | ||||
| @@ -95,7 +102,7 @@ | ||||
| - jquery.fn.gantt.js | ||||
|  | ||||
| # jQuery fancyBox | ||||
| - jquery.fancybox.js | ||||
| - jquery.fancybox.(js|css) | ||||
|  | ||||
| # Fuel UX | ||||
| - fuelux.js | ||||
| @@ -146,6 +153,9 @@ | ||||
| - (^|/)tiny_mce([^.]*)\.js$ | ||||
| - (^|/)tiny_mce/(langs|plugins|themes|utils) | ||||
|  | ||||
| # Ace Editor | ||||
| - (^|/)ace-builds/ | ||||
|  | ||||
| # MathJax | ||||
| - (^|/)MathJax/ | ||||
|  | ||||
| @@ -183,6 +193,7 @@ | ||||
|  | ||||
| # django | ||||
| - (^|/)admin_media/ | ||||
| - (^|/)env/ | ||||
|  | ||||
| # Fabric | ||||
| - ^fabfile\.py$ | ||||
| @@ -302,3 +313,6 @@ | ||||
|  | ||||
| # Android Google APIs | ||||
| - (^|/)\.google_apis/ | ||||
|  | ||||
| # Jenkins Pipeline | ||||
| - ^Jenkinsfile$ | ||||
|   | ||||
| @@ -1,3 +1,3 @@ | ||||
| module Linguist | ||||
|   VERSION = "4.7.1" | ||||
|   VERSION = "4.8.7" | ||||
| end | ||||
|   | ||||
| @@ -2,5 +2,6 @@ | ||||
|   "repository": "https://github.com/github/linguist", | ||||
|   "dependencies": { | ||||
|     "season": "~>5.0" | ||||
|   } | ||||
|   }, | ||||
|   "license": "MIT" | ||||
| } | ||||
|   | ||||
							
								
								
									
										7
									
								
								samples/APL/hashbang
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										7
									
								
								samples/APL/hashbang
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| #!/usr/local/bin/apl --script | ||||
| NEWLINE ← ⎕UCS 10 | ||||
| HEADERS ← 'Content-Type: text/plain', NEWLINE | ||||
| HEADERS | ||||
| ⍝ ⎕←HEADERS | ||||
| ⍝ ⍕⎕TS | ||||
| )OFF | ||||
							
								
								
									
										70
									
								
								samples/Alpine Abuild/filenames/APKBUILD
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								samples/Alpine Abuild/filenames/APKBUILD
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,70 @@ | ||||
| # Contributor: Natanael Copa <ncopa@alpinelinux.org> | ||||
| # Maintainer: Natanael Copa <ncopa@alpinelinux.org> | ||||
| pkgname=abuild | ||||
| pkgver=2.27.0 | ||||
| _ver=${pkgver%_git*} | ||||
| pkgrel=0 | ||||
| pkgdesc="Script to build Alpine Packages" | ||||
| url="http://git.alpinelinux.org/cgit/abuild/" | ||||
| arch="all" | ||||
| license="GPL2" | ||||
| depends="fakeroot sudo pax-utils openssl apk-tools>=2.0.7-r1 libc-utils | ||||
| 	attr tar pkgconf patch" | ||||
| if [ "$CBUILD" = "$CHOST" ]; then | ||||
| 	depends="$depends curl" | ||||
| fi | ||||
| makedepends_build="pkgconfig" | ||||
| makedepends_host="openssl-dev" | ||||
| makedepends="$makedepends_host $makedepends_build" | ||||
| install="$pkgname.pre-install $pkgname.pre-upgrade" | ||||
| subpackages="apkbuild-cpan:cpan apkbuild-gem-resolver:gems" | ||||
| options="suid" | ||||
| pkggroups="abuild" | ||||
| source="http://dev.alpinelinux.org/archive/abuild/abuild-$_ver.tar.xz | ||||
| 	" | ||||
|  | ||||
| _builddir="$srcdir/$pkgname-$_ver" | ||||
| prepare() { | ||||
| 	cd "$_builddir" | ||||
| 	for i in $source; do | ||||
| 		case $i in | ||||
| 		*.patch) | ||||
| 			msg "Applying $i" | ||||
| 			patch -p1 -i "$srcdir"/$i || return 1 | ||||
| 			;; | ||||
| 		esac | ||||
| 	done | ||||
| 	sed -i -e "/^CHOST=/s/=.*/=$CHOST/" abuild.conf | ||||
| } | ||||
|  | ||||
| build() { | ||||
| 	cd "$_builddir" | ||||
| 	make || return 1 | ||||
| } | ||||
|  | ||||
| package() { | ||||
| 	cd "$_builddir" | ||||
| 	make install DESTDIR="$pkgdir" || return 1 | ||||
| 	install -m 644 abuild.conf "$pkgdir"/etc/abuild.conf || return 1 | ||||
| 	install -d -m 775 -g abuild "$pkgdir"/var/cache/distfiles || return 1 | ||||
| } | ||||
|  | ||||
| cpan() { | ||||
| 	pkgdesc="Script to generate perl APKBUILD from CPAN" | ||||
| 	depends="perl perl-libwww perl-json" | ||||
| 	arch="noarch" | ||||
| 	mkdir -p "$subpkgdir"/usr/bin | ||||
| 	mv "$pkgdir"/usr/bin/apkbuild-cpan "$subpkgdir"/usr/bin/ | ||||
| } | ||||
|  | ||||
| gems() { | ||||
| 	pkgdesc="APKBUILD dependency resolver for RubyGems" | ||||
| 	depends="ruby ruby-augeas" | ||||
| 	arch="noarch" | ||||
| 	mkdir -p "$subpkgdir"/usr/bin | ||||
| 	mv "$pkgdir"/usr/bin/apkbuild-gem-resolver "$subpkgdir"/usr/bin/ | ||||
| } | ||||
|  | ||||
| md5sums="c67e4c971c54b4d550e16db3ba331f96  abuild-2.27.0.tar.xz" | ||||
| sha256sums="c8db017e3dd168edb20ceeb91971535cf66b8c95f29d3288f88ac755bffc60e5  abuild-2.27.0.tar.xz" | ||||
| sha512sums="98e1da4e47f3ab68700b3bc992c83e103f770f3196e433788ee74145f57cd33e5239c87f0a7a15f7266840d5bad893fc8c0d4c826d663df53deaee2678c56984  abuild-2.27.0.tar.xz" | ||||
							
								
								
									
										86
									
								
								samples/C#/build.cake
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										86
									
								
								samples/C#/build.cake
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,86 @@ | ||||
| /////////////////////////////////////////////////////////////////////////////// | ||||
| // ARGUMENTS | ||||
| /////////////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
| var target = Argument<string>("target", "Default"); | ||||
| var configuration = Argument<string>("configuration", "Release"); | ||||
|  | ||||
| /////////////////////////////////////////////////////////////////////////////// | ||||
| // GLOBAL VARIABLES | ||||
| /////////////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
| var solutions = GetFiles("./**/*.sln"); | ||||
| var solutionPaths = solutions.Select(solution => solution.GetDirectory()); | ||||
|  | ||||
| /////////////////////////////////////////////////////////////////////////////// | ||||
| // SETUP / TEARDOWN | ||||
| /////////////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
| Setup(() => | ||||
| { | ||||
|     // Executed BEFORE the first task. | ||||
|     Information("Running tasks..."); | ||||
| }); | ||||
|  | ||||
| Teardown(() => | ||||
| { | ||||
|     // Executed AFTER the last task. | ||||
|     Information("Finished running tasks."); | ||||
| }); | ||||
|  | ||||
| /////////////////////////////////////////////////////////////////////////////// | ||||
| // TASK DEFINITIONS | ||||
| /////////////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
| Task("Clean") | ||||
|     .Does(() => | ||||
| { | ||||
|     // Clean solution directories. | ||||
|     foreach(var path in solutionPaths) | ||||
|     { | ||||
|         Information("Cleaning {0}", path); | ||||
|         CleanDirectories(path + "/**/bin/" + configuration); | ||||
|         CleanDirectories(path + "/**/obj/" + configuration); | ||||
|     } | ||||
| }); | ||||
|  | ||||
| Task("Restore") | ||||
|     .Does(() => | ||||
| { | ||||
|     // Restore all NuGet packages. | ||||
|     foreach(var solution in solutions) | ||||
|     { | ||||
|         Information("Restoring {0}...", solution); | ||||
|         NuGetRestore(solution); | ||||
|     } | ||||
| }); | ||||
|  | ||||
| Task("Build") | ||||
|     .IsDependentOn("Clean") | ||||
|     .IsDependentOn("Restore") | ||||
|     .Does(() => | ||||
| { | ||||
|     // Build all solutions. | ||||
|     foreach(var solution in solutions) | ||||
|     { | ||||
|         Information("Building {0}", solution); | ||||
|         MSBuild(solution, settings =>  | ||||
|             settings.SetPlatformTarget(PlatformTarget.MSIL) | ||||
|                 .WithProperty("TreatWarningsAsErrors","true") | ||||
|                 .WithTarget("Build") | ||||
|                 .SetConfiguration(configuration)); | ||||
|     } | ||||
| }); | ||||
|  | ||||
| /////////////////////////////////////////////////////////////////////////////// | ||||
| // TARGETS | ||||
| /////////////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
| Task("Default") | ||||
|     .IsDependentOn("Build"); | ||||
|  | ||||
| /////////////////////////////////////////////////////////////////////////////// | ||||
| // EXECUTION | ||||
| /////////////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
| RunTarget(target); | ||||
							
								
								
									
										397
									
								
								samples/C/main.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										397
									
								
								samples/C/main.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,397 @@ | ||||
| // Copyright 2014 the V8 project authors. All rights reserved. | ||||
| // Use of this source code is governed by a BSD-style license that can be | ||||
| // found in the LICENSE file. | ||||
|  | ||||
| #include "src/runtime/runtime-utils.h" | ||||
|  | ||||
| #include "src/arguments.h" | ||||
| #include "src/compiler.h" | ||||
| #include "src/deoptimizer.h" | ||||
| #include "src/frames-inl.h" | ||||
| #include "src/full-codegen/full-codegen.h" | ||||
| #include "src/isolate-inl.h" | ||||
| #include "src/messages.h" | ||||
| #include "src/v8threads.h" | ||||
| #include "src/vm-state-inl.h" | ||||
|  | ||||
| namespace v8 { | ||||
| namespace internal { | ||||
|  | ||||
| RUNTIME_FUNCTION(Runtime_CompileLazy) { | ||||
| 	HandleScope scope(isolate); | ||||
| 	DCHECK_EQ(1, args.length()); | ||||
| 	CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); | ||||
|  | ||||
| #ifdef DEBUG | ||||
| 	if (FLAG_trace_lazy && !function->shared()->is_compiled()) { | ||||
| 		PrintF("[unoptimized: "); | ||||
| 		function->PrintName(); | ||||
| 		PrintF("]\n"); | ||||
| 	} | ||||
| #endif | ||||
|  | ||||
| 	StackLimitCheck check(isolate); | ||||
| 	if (check.JsHasOverflowed(1 * KB)) return isolate->StackOverflow(); | ||||
| 	if (!Compiler::Compile(function, Compiler::KEEP_EXCEPTION)) { | ||||
| 		return isolate->heap()->exception(); | ||||
| 	} | ||||
| 	DCHECK(function->is_compiled()); | ||||
| 	return function->code(); | ||||
| } | ||||
|  | ||||
| RUNTIME_FUNCTION(Runtime_CompileBaseline) { | ||||
| 	HandleScope scope(isolate); | ||||
| 	DCHECK_EQ(1, args.length()); | ||||
| 	CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); | ||||
| 	StackLimitCheck check(isolate); | ||||
| 	if (check.JsHasOverflowed(1 * KB)) return isolate->StackOverflow(); | ||||
| 	if (!Compiler::CompileBaseline(function)) { | ||||
| 		return isolate->heap()->exception(); | ||||
| 	} | ||||
| 	DCHECK(function->is_compiled()); | ||||
| 	return function->code(); | ||||
| } | ||||
|  | ||||
| RUNTIME_FUNCTION(Runtime_CompileOptimized_Concurrent) { | ||||
| 	HandleScope scope(isolate); | ||||
| 	DCHECK_EQ(1, args.length()); | ||||
| 	CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); | ||||
| 	StackLimitCheck check(isolate); | ||||
| 	if (check.JsHasOverflowed(1 * KB)) return isolate->StackOverflow(); | ||||
| 	if (!Compiler::CompileOptimized(function, Compiler::CONCURRENT)) { | ||||
| 		return isolate->heap()->exception(); | ||||
| 	} | ||||
| 	DCHECK(function->is_compiled()); | ||||
| 	return function->code(); | ||||
| } | ||||
|  | ||||
|  | ||||
| RUNTIME_FUNCTION(Runtime_CompileOptimized_NotConcurrent) { | ||||
| 	HandleScope scope(isolate); | ||||
| 	DCHECK_EQ(1, args.length()); | ||||
| 	CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); | ||||
| 	StackLimitCheck check(isolate); | ||||
| 	if (check.JsHasOverflowed(1 * KB)) return isolate->StackOverflow(); | ||||
| 	if (!Compiler::CompileOptimized(function, Compiler::NOT_CONCURRENT)) { | ||||
| 		return isolate->heap()->exception(); | ||||
| 	} | ||||
| 	DCHECK(function->is_compiled()); | ||||
| 	return function->code(); | ||||
| } | ||||
|  | ||||
|  | ||||
| RUNTIME_FUNCTION(Runtime_NotifyStubFailure) { | ||||
| 	HandleScope scope(isolate); | ||||
| 	DCHECK(args.length() == 0); | ||||
| 	Deoptimizer* deoptimizer = Deoptimizer::Grab(isolate); | ||||
| 	DCHECK(AllowHeapAllocation::IsAllowed()); | ||||
| 	delete deoptimizer; | ||||
| 	return isolate->heap()->undefined_value(); | ||||
| } | ||||
|  | ||||
|  | ||||
| class ActivationsFinder : public ThreadVisitor { | ||||
| public: | ||||
| 	Code* code_; | ||||
| 	bool has_code_activations_; | ||||
|  | ||||
| 	explicit ActivationsFinder(Code* code) | ||||
| 		: code_(code), has_code_activations_(false) {} | ||||
|  | ||||
| 	void VisitThread(Isolate* isolate, ThreadLocalTop* top) { | ||||
| 		JavaScriptFrameIterator it(isolate, top); | ||||
| 		VisitFrames(&it); | ||||
| 	} | ||||
|  | ||||
| 	void VisitFrames(JavaScriptFrameIterator* it) { | ||||
| 		for (; !it->done(); it->Advance()) { | ||||
| 			JavaScriptFrame* frame = it->frame(); | ||||
| 			if (code_->contains(frame->pc())) has_code_activations_ = true; | ||||
| 		} | ||||
| 	} | ||||
| }; | ||||
|  | ||||
|  | ||||
| RUNTIME_FUNCTION(Runtime_NotifyDeoptimized) { | ||||
| 	HandleScope scope(isolate); | ||||
| 	DCHECK(args.length() == 1); | ||||
| 	CONVERT_SMI_ARG_CHECKED(type_arg, 0); | ||||
| 	Deoptimizer::BailoutType type = | ||||
| 		static_cast<Deoptimizer::BailoutType>(type_arg); | ||||
| 	Deoptimizer* deoptimizer = Deoptimizer::Grab(isolate); | ||||
| 	DCHECK(AllowHeapAllocation::IsAllowed()); | ||||
| 	TimerEventScope<TimerEventDeoptimizeCode> timer(isolate); | ||||
| 	TRACE_EVENT0("v8", "V8.DeoptimizeCode"); | ||||
|  | ||||
| 	Handle<JSFunction> function = deoptimizer->function(); | ||||
| 	Handle<Code> optimized_code = deoptimizer->compiled_code(); | ||||
|  | ||||
| 	DCHECK(optimized_code->kind() == Code::OPTIMIZED_FUNCTION); | ||||
| 	DCHECK(type == deoptimizer->bailout_type()); | ||||
|  | ||||
| 	// Make sure to materialize objects before causing any allocation. | ||||
| 	JavaScriptFrameIterator it(isolate); | ||||
| 	deoptimizer->MaterializeHeapObjects(&it); | ||||
| 	delete deoptimizer; | ||||
|  | ||||
| 	// Ensure the context register is updated for materialized objects. | ||||
| 	JavaScriptFrameIterator top_it(isolate); | ||||
| 	JavaScriptFrame* top_frame = top_it.frame(); | ||||
| 	isolate->set_context(Context::cast(top_frame->context())); | ||||
|  | ||||
| 	if (type == Deoptimizer::LAZY) { | ||||
| 		return isolate->heap()->undefined_value(); | ||||
| 	} | ||||
|  | ||||
| 	// Search for other activations of the same optimized code. | ||||
| 	// At this point {it} is at the topmost frame of all the frames materialized | ||||
| 	// by the deoptimizer. Note that this frame does not necessarily represent | ||||
| 	// an activation of {function} because of potential inlined tail-calls. | ||||
| 	ActivationsFinder activations_finder(*optimized_code); | ||||
| 	activations_finder.VisitFrames(&it); | ||||
| 	isolate->thread_manager()->IterateArchivedThreads(&activations_finder); | ||||
|  | ||||
| 	if (!activations_finder.has_code_activations_) { | ||||
| 		if (function->code() == *optimized_code) { | ||||
| 			if (FLAG_trace_deopt) { | ||||
| 				PrintF("[removing optimized code for: "); | ||||
| 				function->PrintName(); | ||||
| 				PrintF("]\n"); | ||||
| 			} | ||||
| 			function->ReplaceCode(function->shared()->code()); | ||||
| 		} | ||||
| 		// Evict optimized code for this function from the cache so that it | ||||
| 		// doesn't get used for new closures. | ||||
| 		function->shared()->EvictFromOptimizedCodeMap(*optimized_code, "notify deoptimized"); | ||||
| 	} else { | ||||
| 		// TODO(titzer): we should probably do DeoptimizeCodeList(code) | ||||
| 		// unconditionally if the code is not already marked for deoptimization. | ||||
| 		// If there is an index by shared function info, all the better. | ||||
| 		Deoptimizer::DeoptimizeFunction(*function); | ||||
| 	} | ||||
|  | ||||
| 	return isolate->heap()->undefined_value(); | ||||
| } | ||||
|  | ||||
|  | ||||
| static bool IsSuitableForOnStackReplacement( | ||||
| 	Isolate* isolate, | ||||
| 	Handle<JSFunction> function | ||||
| ) { | ||||
| 	// Keep track of whether we've succeeded in optimizing. | ||||
| 	if (function->shared()->optimization_disabled()) return false; | ||||
| 	// If we are trying to do OSR when there are already optimized | ||||
| 	// activations of the function, it means (a) the function is directly or | ||||
| 	// indirectly recursive and (b) an optimized invocation has been | ||||
| 	// deoptimized so that we are currently in an unoptimized activation. | ||||
| 	// Check for optimized activations of this function. | ||||
| 	for (JavaScriptFrameIterator it(isolate); !it.done(); it.Advance()) { | ||||
| 		JavaScriptFrame* frame = it.frame(); | ||||
| 		if (frame->is_optimized() && frame->function() == *function) return false; | ||||
| 	} | ||||
|  | ||||
| 	return true; | ||||
| } | ||||
|  | ||||
|  | ||||
| RUNTIME_FUNCTION(Runtime_CompileForOnStackReplacement) { | ||||
| 	HandleScope scope(isolate); | ||||
| 	DCHECK(args.length() == 1); | ||||
| 	CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); | ||||
| 	Handle<Code> caller_code(function->shared()->code()); | ||||
|  | ||||
| 	// We're not prepared to handle a function with arguments object. | ||||
| 	DCHECK(!function->shared()->uses_arguments()); | ||||
|  | ||||
| 	RUNTIME_ASSERT(FLAG_use_osr); | ||||
|  | ||||
| 	// Passing the PC in the javascript frame from the caller directly is | ||||
| 	// not GC safe, so we walk the stack to get it. | ||||
| 	JavaScriptFrameIterator it(isolate); | ||||
| 	JavaScriptFrame* frame = it.frame(); | ||||
| 	if (!caller_code->contains(frame->pc())) { | ||||
| 		// Code on the stack may not be the code object referenced by the shared | ||||
| 		// function info.	It may have been replaced to include deoptimization data. | ||||
| 		caller_code = Handle<Code>(frame->LookupCode()); | ||||
| 	} | ||||
|  | ||||
| 	uint32_t pc_offset = | ||||
| 		static_cast<uint32_t>(frame->pc() - caller_code->instruction_start()); | ||||
|  | ||||
| #ifdef DEBUG | ||||
| 	DCHECK_EQ(frame->function(), *function); | ||||
| 	DCHECK_EQ(frame->LookupCode(), *caller_code); | ||||
| 	DCHECK(caller_code->contains(frame->pc())); | ||||
| #endif	// DEBUG | ||||
|  | ||||
| 	BailoutId ast_id = caller_code->TranslatePcOffsetToAstId(pc_offset); | ||||
| 	DCHECK(!ast_id.IsNone()); | ||||
|  | ||||
| 	MaybeHandle<Code> maybe_result; | ||||
| 	if (IsSuitableForOnStackReplacement(isolate, function)) { | ||||
| 		if (FLAG_trace_osr) { | ||||
| 			PrintF("[OSR - Compiling: "); | ||||
| 			function->PrintName(); | ||||
| 			PrintF(" at -*- scheme -*- %d]\n", ast_id.ToInt()); | ||||
| 		} | ||||
| 		maybe_result = Compiler::GetOptimizedCodeForOSR(function, ast_id, frame); | ||||
| 	} | ||||
|  | ||||
| 	// Revert the patched back edge table, regardless of whether OSR succeeds. | ||||
| 	BackEdgeTable::Revert(isolate, *caller_code); | ||||
|  | ||||
| 	// Check whether we ended up with usable optimized code. | ||||
| 	Handle<Code> result; | ||||
| 	if (maybe_result.ToHandle(&result) | ||||
| 	&& result->kind() == Code::OPTIMIZED_FUNCTION) { | ||||
| 		DeoptimizationInputData* data = | ||||
| 			DeoptimizationInputData::cast(result->deoptimization_data()); | ||||
| 		 | ||||
| 		if (data->OsrPcOffset()->value() >= 0) { | ||||
| 			DCHECK(BailoutId(data->OsrAstId()->value()) == ast_id); | ||||
| 			if (FLAG_trace_osr) { | ||||
| 				PrintF("[OSR - Entry at AST id %d, offset %d in optimized code]\n", | ||||
| 					ast_id.ToInt(), data->OsrPcOffset()->value()); | ||||
| 			} | ||||
| 			// TODO(titzer): this is a massive hack to make the deopt counts | ||||
| 			// match. Fix heuristics for reenabling optimizations! | ||||
| 			function->shared()->increment_deopt_count(); | ||||
|  | ||||
| 			if (result->is_turbofanned()) { | ||||
| 				// TurboFanned OSR code cannot be installed into the function. | ||||
| 				// But the function is obviously hot, so optimize it next time. | ||||
| 				function->ReplaceCode( | ||||
| 					isolate->builtins()->builtin(Builtins::kCompileOptimized)); | ||||
| 			} else { | ||||
| 				// Crankshafted OSR code can be installed into the function. | ||||
| 				function->ReplaceCode(*result); | ||||
| 			} | ||||
| 			return *result; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// Failed. | ||||
| 	if (FLAG_trace_osr) { | ||||
| 		PrintF("[OSR - Failed: "); | ||||
| 		function->PrintName(); | ||||
| 		PrintF(" at AST id %d]\n", ast_id.ToInt()); | ||||
| 	} | ||||
|  | ||||
| 	if (!function->IsOptimized()) { | ||||
| 		function->ReplaceCode(function->shared()->code()); | ||||
| 	} | ||||
| 	return NULL; | ||||
| } | ||||
|  | ||||
|  | ||||
| RUNTIME_FUNCTION(Runtime_TryInstallOptimizedCode) { | ||||
| 	HandleScope scope(isolate); | ||||
| 	DCHECK(args.length() == 1); | ||||
| 	CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); | ||||
|  | ||||
| 	// First check if this is a real stack overflow. | ||||
| 	StackLimitCheck check(isolate); | ||||
| 	if (check.JsHasOverflowed()) { | ||||
| 		SealHandleScope shs(isolate); | ||||
| 		return isolate->StackOverflow(); | ||||
| 	} | ||||
|  | ||||
| 	isolate->optimizing_compile_dispatcher()->InstallOptimizedFunctions(); | ||||
| 	return (function->IsOptimized()) | ||||
| 		? function->code() | ||||
| 		: function->shared()->code(); | ||||
| } | ||||
|  | ||||
|  | ||||
| bool CodeGenerationFromStringsAllowed( | ||||
| 	Isolate* isolate, | ||||
| 	Handle<Context> context | ||||
| ){ | ||||
| 	DCHECK(context->allow_code_gen_from_strings()->IsFalse()); | ||||
| 	// Check with callback if set. | ||||
| 	AllowCodeGenerationFromStringsCallback callback = | ||||
| 			isolate->allow_code_gen_callback(); | ||||
| 	if (callback == NULL) { | ||||
| 		// No callback set and code generation disallowed. | ||||
| 		return false; | ||||
| 	} else { | ||||
| 		// Callback set. Let it decide if code generation is allowed. | ||||
| 		VMState<EXTERNAL> state(isolate); | ||||
| 		return callback(v8::Utils::ToLocal(context)); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| static Object* CompileGlobalEval( | ||||
| 	Isolate* isolate, | ||||
| 	Handle<String> source, | ||||
| 	Handle<SharedFunctionInfo> outer_info, | ||||
| 	LanguageMode language_mode, | ||||
| 	int eval_scope_position, | ||||
| 	int eval_position | ||||
| ){ | ||||
| 	Handle<Context> context = Handle<Context>(isolate->context()); | ||||
| 	Handle<Context> native_context = Handle<Context>(context->native_context()); | ||||
|  | ||||
| 	// Check if native context allows code generation from | ||||
| 	// strings. Throw an exception if it doesn't. | ||||
| 	if (native_context->allow_code_gen_from_strings()->IsFalse() && | ||||
| 	!CodeGenerationFromStringsAllowed(isolate, native_context)) { | ||||
| 		Handle<Object> error_message = | ||||
| 				native_context->ErrorMessageForCodeGenerationFromStrings(); | ||||
| 		Handle<Object> error; | ||||
| 		MaybeHandle<Object> maybe_error = isolate->factory()->NewEvalError( | ||||
| 				MessageTemplate::kCodeGenFromStrings, error_message); | ||||
| 		if (maybe_error.ToHandle(&error)) isolate->Throw(*error); | ||||
| 		return isolate->heap()->exception(); | ||||
| 	} | ||||
|  | ||||
| 	// Deal with a normal eval call with a string argument. Compile it | ||||
| 	// and return the compiled function bound in the local context. | ||||
| 	static const ParseRestriction restriction = NO_PARSE_RESTRICTION; | ||||
| 	Handle<JSFunction> compiled; | ||||
| 	ASSIGN_RETURN_ON_EXCEPTION_VALUE( | ||||
| 		isolate, compiled, | ||||
| 		Compiler::GetFunctionFromEval( | ||||
| 			source, outer_info, context, language_mode, | ||||
| 			restriction, eval_scope_position, eval_position | ||||
| 		), | ||||
| 		isolate->heap()->exception() | ||||
| 	); | ||||
| 	return *compiled; | ||||
| } | ||||
|  | ||||
|  | ||||
| RUNTIME_FUNCTION(Runtime_ResolvePossiblyDirectEval) { | ||||
| 	HandleScope scope(isolate); | ||||
| 	DCHECK(args.length() == 6); | ||||
|  | ||||
| 	Handle<Object> callee = args.at<Object>(0); | ||||
|  | ||||
| 	// If "eval" didn't refer to the original GlobalEval, it's not a | ||||
| 	// direct call to eval. | ||||
| 	// (And even if it is, but the first argument isn't a string, just let | ||||
| 	// execution default to an indirect call to eval, which will also return | ||||
| 	// the first argument without doing anything). | ||||
| 	if (*callee != isolate->native_context()->global_eval_fun() || !args[1]->IsString()) { | ||||
| 		return *callee; | ||||
| 	} | ||||
|  | ||||
| 	DCHECK(args[3]->IsSmi()); | ||||
| 	DCHECK(is_valid_language_mode(args.smi_at(3))); | ||||
| 	LanguageMode language_mode = static_cast<LanguageMode>(args.smi_at(3)); | ||||
| 	DCHECK(args[4]->IsSmi()); | ||||
| 	Handle<SharedFunctionInfo> outer_info(args.at<JSFunction>(2)->shared(), isolate); | ||||
| 	return CompileGlobalEval( | ||||
| 		isolate, | ||||
| 		args.at<String>(1), | ||||
| 		outer_info, | ||||
| 		language_mode, | ||||
| 		args.smi_at(4), | ||||
| 		args.smi_at(5) | ||||
| 	); | ||||
| } | ||||
| }	// namespace internal | ||||
| }	// namespace v8 | ||||
|  | ||||
| /* vim: set shiftwidth=4 softtabstop=0 cindent cinoptions={1s: */ | ||||
|  | ||||
							
								
								
									
										133
									
								
								samples/Click/sr2.click
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										133
									
								
								samples/Click/sr2.click
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,133 @@ | ||||
| rates :: AvailableRates | ||||
| elementclass sr2 { | ||||
|   $sr2_ip, $sr2_nm, $wireless_mac, $gateway, $probes| | ||||
|  | ||||
|  | ||||
| arp :: ARPTable(); | ||||
| lt :: LinkTable(IP $sr2_ip); | ||||
|  | ||||
|  | ||||
| gw :: SR2GatewaySelector(ETHTYPE 0x062c, | ||||
| 		      IP $sr2_ip, | ||||
| 		      ETH $wireless_mac, | ||||
| 		      LT lt, | ||||
| 		      ARP arp, | ||||
| 		      PERIOD 15, | ||||
| 		      GW $gateway); | ||||
|  | ||||
|  | ||||
| gw -> SR2SetChecksum -> [0] output; | ||||
|  | ||||
| set_gw :: SR2SetGateway(SEL gw); | ||||
|  | ||||
|  | ||||
| es :: SR2ETTStat(ETHTYPE 0x0641,  | ||||
| 	      ETH $wireless_mac,  | ||||
| 	      IP $sr2_ip,  | ||||
| 	      PERIOD 30000, | ||||
| 	      TAU 300000, | ||||
| 	      ARP arp, | ||||
| 	      PROBES $probes, | ||||
| 	      ETT metric, | ||||
| 	      RT rates); | ||||
|  | ||||
|  | ||||
| metric :: SR2ETTMetric(LT lt); | ||||
|  | ||||
|  | ||||
| forwarder :: SR2Forwarder(ETHTYPE 0x0643,  | ||||
| 			      IP $sr2_ip,  | ||||
| 			      ETH $wireless_mac,  | ||||
| 			      ARP arp,  | ||||
| 			      LT lt); | ||||
|  | ||||
|  | ||||
| querier :: SR2Querier(ETH $wireless_mac,  | ||||
| 		     SR forwarder, | ||||
| 		     LT lt,  | ||||
| 		     ROUTE_DAMPENING true, | ||||
| 		     TIME_BEFORE_SWITCH 5, | ||||
| 		     DEBUG true); | ||||
|  | ||||
|  | ||||
| query_forwarder :: SR2MetricFlood(ETHTYPE 0x0644, | ||||
| 			       IP $sr2_ip,  | ||||
| 			       ETH $wireless_mac,  | ||||
| 			       LT lt,  | ||||
| 			       ARP arp, | ||||
| 			       DEBUG false); | ||||
|  | ||||
| query_responder :: SR2QueryResponder(ETHTYPE 0x0645, | ||||
| 				    IP $sr2_ip,  | ||||
| 				    ETH $wireless_mac,  | ||||
| 				    LT lt,  | ||||
| 				    ARP arp, | ||||
| 				    DEBUG true); | ||||
|  | ||||
|  | ||||
| query_responder -> SR2SetChecksum -> [0] output; | ||||
| query_forwarder -> SR2SetChecksum -> SR2Print(forwarding) -> [0] output; | ||||
| query_forwarder [1] -> query_responder; | ||||
|  | ||||
| data_ck :: SR2SetChecksum()  | ||||
|  | ||||
| input [1]  | ||||
| -> host_cl :: IPClassifier(dst net $sr2_ip mask $sr2_nm, | ||||
| 				-) | ||||
| -> querier | ||||
| -> data_ck; | ||||
|  | ||||
|  | ||||
| host_cl [1] -> [0] set_gw [0] -> querier; | ||||
|  | ||||
| forwarder[0]  | ||||
|   -> dt ::DecIPTTL | ||||
|   -> data_ck | ||||
|   -> [2] output; | ||||
|  | ||||
|  | ||||
| dt[1]  | ||||
| -> Print(ttl-error)  | ||||
| -> ICMPError($sr2_ip, timeexceeded, 0)  | ||||
| -> querier; | ||||
|  | ||||
|  | ||||
| // queries | ||||
| querier [1] -> [1] query_forwarder; | ||||
| es -> SetTimestamp() -> [1] output; | ||||
|  | ||||
|  | ||||
| forwarder[1] //ip packets to me | ||||
|   -> SR2StripHeader() | ||||
|   -> CheckIPHeader() | ||||
|   -> from_gw_cl :: IPClassifier(src net $sr2_ip mask $sr2_nm, | ||||
| 				-) | ||||
|   -> [3] output; | ||||
|  | ||||
| from_gw_cl [1] -> [1] set_gw [1] -> [3] output; | ||||
|  | ||||
|  input [0] | ||||
|    -> ncl :: Classifier( | ||||
| 			12/0643 , //sr2_forwarder | ||||
| 			12/0644 , //sr2 | ||||
| 			12/0645 , //replies | ||||
| 			12/0641 , //sr2_es | ||||
| 			12/062c , //sr2_gw | ||||
| 			); | ||||
|   | ||||
|   | ||||
|  ncl[0] -> SR2CheckHeader() -> [0] forwarder; | ||||
|  ncl[1] -> SR2CheckHeader() -> PrintSR(query) -> query_forwarder | ||||
|  ncl[2] -> SR2CheckHeader() -> query_responder; | ||||
|  ncl[3] -> es; | ||||
|  ncl[4] -> SR2CheckHeader() -> gw; | ||||
|   | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| Idle -> s :: sr2(2.0.0.1, 255.0.0.0, 00:00:00:00:00:01, false, "12 60 12 1500") -> Discard; | ||||
| Idle -> [1] s; | ||||
| s[1] -> Discard; | ||||
| s[2] -> Discard; | ||||
| s[3] -> Discard; | ||||
							
								
								
									
										142
									
								
								samples/Click/thomer-nat.click
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										142
									
								
								samples/Click/thomer-nat.click
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,142 @@ | ||||
| // This Click configuration implements a firewall and NAT, roughly based on the | ||||
| // mazu-nat.click example. | ||||
| // | ||||
| // This example assumes there is one interface that is IP-aliased.  In this | ||||
| // example, eth0 and eth0:0 have IP addresses 66.68.65.90 and 192.168.1.1, | ||||
| // respectively.  There is a local network, 192.168.1.0/24, and an upstream | ||||
| // gateway, 66.58.65.89.  Traffic from the local network is NATed. | ||||
| // | ||||
| // Connections can be initiated from the NAT box itself, also. | ||||
| //  | ||||
| // For bugs, suggestions, and, corrections, please email me. | ||||
| // | ||||
| // Author: Thomer M. Gil (click@thomer.com) | ||||
|  | ||||
| AddressInfo( | ||||
|     eth0-in     192.168.1.1     192.168.1.0/24  00:0d:87:9d:1c:e9, | ||||
|     eth0-ex     66.58.65.90                     00:0d:87:9d:1c:e9, | ||||
|     gw-addr     66.58.65.89                     00:20:6f:14:54:c2 | ||||
| ); | ||||
|  | ||||
|  | ||||
| elementclass SniffGatewayDevice { | ||||
|   $device | | ||||
|   from :: FromDevice($device) | ||||
|     -> t1 :: Tee | ||||
|     -> output; | ||||
|   input -> q :: Queue(1024) | ||||
|     -> t2 :: PullTee | ||||
|     -> to :: ToDevice($device); | ||||
|   t1[1] -> ToHostSniffers; | ||||
|   t2[1] -> ToHostSniffers($device); | ||||
|   ScheduleInfo(from .1, to 1); | ||||
| } | ||||
|  | ||||
|  | ||||
| device :: SniffGatewayDevice(eth0); | ||||
| arpq_in :: ARPQuerier(eth0-in) -> device; | ||||
| ip_to_extern :: GetIPAddress(16) | ||||
|         -> CheckIPHeader | ||||
|         -> EtherEncap(0x800, eth0-ex, gw-addr) | ||||
|         -> device; | ||||
| ip_to_host :: EtherEncap(0x800, gw-addr, eth0-ex) | ||||
|         -> ToHost; | ||||
| ip_to_intern :: GetIPAddress(16) | ||||
|         -> CheckIPHeader | ||||
|         -> arpq_in; | ||||
|  | ||||
|                   | ||||
| arp_class :: Classifier( | ||||
|         12/0806 20/0001,        // [0] ARP requests | ||||
|         12/0806 20/0002,        // [1] ARP replies to host | ||||
|         12/0800);               // [2] IP packets | ||||
|  | ||||
| device -> arp_class; | ||||
|  | ||||
| // ARP crap | ||||
| arp_class[0] -> ARPResponder(eth0-in, eth0-ex) -> device; | ||||
| arp_class[1] -> arp_t :: Tee; | ||||
|                 arp_t[0] -> ToHost; | ||||
|                 arp_t[1] -> [1]arpq_in; | ||||
|  | ||||
|  | ||||
| // IP packets | ||||
| arp_class[2] -> Strip(14) | ||||
|    -> CheckIPHeader | ||||
|    -> ipclass :: IPClassifier(dst host eth0-ex, | ||||
|                               dst host eth0-in, | ||||
|                               src net eth0-in); | ||||
|  | ||||
| // Define pattern NAT | ||||
| iprw :: IPRewriterPatterns(NAT eth0-ex 50000-65535 - -); | ||||
|  | ||||
| // Rewriting rules for UDP/TCP packets | ||||
| // output[0] rewritten to go into the wild | ||||
| // output[1] rewritten to come back from the wild or no match | ||||
| rw :: IPRewriter(pattern NAT 0 1, | ||||
|                  pass 1); | ||||
|  | ||||
| // Rewriting rules for ICMP packets | ||||
| irw :: ICMPPingRewriter(eth0-ex, -); | ||||
| irw[0] -> ip_to_extern; | ||||
| irw[1] -> icmp_me_or_intern :: IPClassifier(dst host eth0-ex, -); | ||||
|           icmp_me_or_intern[0] -> ip_to_host; | ||||
|           icmp_me_or_intern[1] -> ip_to_intern; | ||||
|  | ||||
| // Rewriting rules for ICMP error packets | ||||
| ierw :: ICMPRewriter(rw irw); | ||||
| ierw[0] -> icmp_me_or_intern; | ||||
| ierw[1] -> icmp_me_or_intern; | ||||
|  | ||||
|  | ||||
| // Packets directed at eth0-ex. | ||||
| // Send it through IPRewriter(pass).  If there was a mapping, it will be | ||||
| // rewritten such that dst is eth0-in:net, otherwise dst will still be for | ||||
| // eth0-ex. | ||||
| ipclass[0] -> [1]rw; | ||||
|  | ||||
| // packets that were rewritten, heading into the wild world. | ||||
| rw[0] -> ip_to_extern; | ||||
|  | ||||
| // packets that come back from the wild or are not part of an established | ||||
| // connection. | ||||
| rw[1] -> established_class :: IPClassifier(dst host eth0-ex, | ||||
|                                            dst net eth0-in); | ||||
|  | ||||
|          // not established yet or returning packets for a connection that was | ||||
|          // established from this host itself. | ||||
|          established_class[0] -> | ||||
|            firewall :: IPClassifier(dst tcp port ssh, | ||||
|                                     dst tcp port smtp, | ||||
|                                     dst tcp port domain, | ||||
|                                     dst udp port domain, | ||||
|                                     icmp type echo-reply, | ||||
|                                     proto icmp, | ||||
|                                     port > 4095, | ||||
|                                     -); | ||||
|  | ||||
|                                     firewall[0] -> ip_to_host; // ssh | ||||
|                                     firewall[1] -> ip_to_host; // smtp | ||||
|                                     firewall[2] -> ip_to_host; // domain (t) | ||||
|                                     firewall[3] -> ip_to_host; // domain (u) | ||||
|                                     firewall[4] -> [0]irw;     // icmp reply | ||||
|                                     firewall[5] -> [0]ierw;    // other icmp | ||||
|                                     firewall[6] -> ip_to_host; // port > 4095, probably for connection | ||||
|                                                                // originating from host itself | ||||
|                                     firewall[7] -> Discard;    // don't allow incoming for port <= 4095 | ||||
|  | ||||
|         // established connection | ||||
|         established_class[1] -> ip_to_intern; | ||||
|  | ||||
| // To eth0-in.  Only accept from inside network. | ||||
| ipclass[1] -> IPClassifier(src net eth0-in) -> ip_to_host; | ||||
|  | ||||
| // Packets from eth0-in:net either stay on local network or go to the wild. | ||||
| // Those that go into the wild need to go through the appropriate rewriting | ||||
| // element.  (Either UDP/TCP rewriter or ICMP rewriter.) | ||||
| ipclass[2] -> inter_class :: IPClassifier(dst net eth0-in, -); | ||||
|               inter_class[0] -> ip_to_intern; | ||||
|               inter_class[1] -> ip_udp_class :: IPClassifier(tcp or udp, | ||||
|                                                              icmp type echo); | ||||
|                                 ip_udp_class[0] -> [0]rw; | ||||
|                                 ip_udp_class[1] -> [0]irw; | ||||
							
								
								
									
										17
									
								
								samples/CoffeeScript/build.cake
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								samples/CoffeeScript/build.cake
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | ||||
| fs = require 'fs' | ||||
|  | ||||
| {print} = require 'sys' | ||||
| {spawn} = require 'child_process' | ||||
|  | ||||
| build = (callback) -> | ||||
| 	coffee = spawn 'coffee', ['-c', '-o', '.', '.'] | ||||
| 	coffee.stderr.on 'data', (data) -> | ||||
| 		process.stderr.write data.toString() | ||||
| 	coffee.stdout.on 'data', (data) -> | ||||
| 		print data.toString() | ||||
| 	coffee.on 'exit', (code) -> | ||||
| 		callback?() if code is 0 | ||||
|  | ||||
| task 'build', 'Build from source',  -> | ||||
| 	build()  | ||||
| 	 | ||||
							
								
								
									
										21
									
								
								samples/Csound Document/allglass.csd
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										21
									
								
								samples/Csound Document/allglass.csd
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,21 @@ | ||||
| <CsoundSynthesizer> | ||||
| <CsInstruments> | ||||
| sr     = 44100 | ||||
| kr     = 44100 | ||||
| ksmps  = 1 | ||||
| nchnls = 2 | ||||
|  | ||||
| ; pvanal -n 512 -w 8 allglass1-L.wav allglass1-L.pvc | ||||
| ; pvanal -n 512 -w 8 allglass1-R.wav allglass1-R.pvc | ||||
| instr 1 | ||||
|   ktime line 0, p3, 17.5018 | ||||
|   arL pvoc ktime, 1, "allglass1-L.pvc" | ||||
|   arR pvoc ktime, 1, "allglass1-R.pvc" | ||||
|   out arL, arR | ||||
| endin | ||||
| </CsInstruments> | ||||
| <CsScore> | ||||
| i 1 0 70.0073 | ||||
| e | ||||
| </CsScore> | ||||
| </CsoundSynthesizer> | ||||
							
								
								
									
										34
									
								
								samples/Csound Document/interp.csd
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										34
									
								
								samples/Csound Document/interp.csd
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,34 @@ | ||||
| <CsoundSynthesizer> | ||||
| <CsInstruments> | ||||
| sr     = 44100 | ||||
| kr     = 44100 | ||||
| ksmps  = 1 | ||||
| nchnls = 2 | ||||
|  | ||||
| ; pvanal -n 1024 -w 2 partA-L.wav partA-L.pvc | ||||
| ; pvanal -n 1024 -w 2 partA-R.wav partA-R.pvc | ||||
| ; pvanal -n 1024 -w 2 partB.wav partB.pvc | ||||
| instr 1 | ||||
|   iscale = 1 | ||||
|  | ||||
|   ktimpnt1     line 0, iscale*(82196/44100), 82196/44100 | ||||
|   ktimpnt2     linseg 0, iscale*1.25, 0, iscale*(103518/44100), 103518/44100 | ||||
|   kfreqscale   linseg 1, iscale*0.5, 1, iscale*1.6, 0.8 | ||||
|   kfreqinterpL linseg 0, iscale*0.25, 0, iscale*1.6, 1 | ||||
|   kampinterpL  linseg 0, iscale*0.25, 0, iscale*1.6, 1 | ||||
|   kfreqinterpR linseg 0, iscale*0.5, 0, iscale*1.2, 1 | ||||
|   kampinterpR  linseg 0, iscale*0.5, 0, iscale*1.2, 1 | ||||
|  | ||||
|         pvbufread ktimpnt1, "partB.pvc" | ||||
|   apvcL pvinterp ktimpnt2, 1, "partA-L.pvc", kfreqscale, 1, 1, 1, 1-kfreqinterpL, 1-kampinterpL | ||||
|         pvbufread ktimpnt1, "partB.pvc" | ||||
|   apvcR pvinterp ktimpnt2, 1, "partA-R.pvc", kfreqscale, 1, 1, 1, 1-kfreqinterpR, 1-kampinterpR | ||||
|  | ||||
|   outs apvcL*0.8, apvcR*0.8 | ||||
| endin | ||||
| </CsInstruments> | ||||
| <CsScore> | ||||
| i 1 0 7 | ||||
| e | ||||
| </CsScore> | ||||
| </CsoundSynthesizer> | ||||
							
								
								
									
										253
									
								
								samples/Csound Document/test.csd
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										253
									
								
								samples/Csound Document/test.csd
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,253 @@ | ||||
| <CsoundSynthesizer> | ||||
| <CsInstruments> | ||||
| // Csound single-line comments can be preceded by a pair of forward slashes... | ||||
| ; ...or a semicolon. | ||||
|  | ||||
| /* Block comments begin with /* and end with */ | ||||
|  | ||||
| // Orchestras begin with a header of audio parameters. | ||||
| nchnls = 1 | ||||
| nchnls_i = 1 | ||||
| sr = 44100 | ||||
| 0dbfs = 1 | ||||
| ksmps = 10 | ||||
|  | ||||
| // The control rate kr = sr / ksmps can be omitted when the number of audio | ||||
| // samples in a control period (ksmps) is set, but kr may appear in older | ||||
| // orchestras. | ||||
| kr = 4410 | ||||
|  | ||||
| // Orchestras contain instruments. These begin with the keyword instr followed | ||||
| // by a comma-separated list of numbers or names of the instrument. Instruments | ||||
| // end at the endin keyword and cannot be nested. | ||||
| instr 1, N_a_M_e_, +Name | ||||
|   // Instruments contain statements. Here is a typical statement: | ||||
|   aSignal oscil 0dbfs, 440, 1 | ||||
|   // Statements are terminated with a newline (possibly preceded by a comment). | ||||
|   // To write a statement on several lines, precede the newline with a | ||||
|   // backslash. | ||||
|   prints \ | ||||
|     "hello, world\n";comment | ||||
|  | ||||
|   // Csound 6 introduced function syntax for opcodes with one or zero outputs. | ||||
|   // The oscil statement above is the same as | ||||
|   aSignal = oscil(0dbfs, 440, 1) | ||||
|  | ||||
|   // Instruments can contain control structures. | ||||
|   kNote = p3 | ||||
|   if (kNote == 0) then | ||||
|     kFrequency = 220 | ||||
|   elseif kNote == 1 then // Parentheses around binary expressions are optional. | ||||
|     kFrequency = 440 | ||||
|   endif | ||||
|  | ||||
|   // Csound 6 introduced looping structures. | ||||
|   iIndex = 0 | ||||
|   while iIndex < 5 do | ||||
|     print iIndex | ||||
|     iIndex += 1 | ||||
|   od | ||||
|   iIndex = 0 | ||||
|   until iIndex >= 5 do | ||||
|     print iIndex | ||||
|     iIndex += 1 | ||||
|   enduntil | ||||
|   // Both kinds of loops can be terminated by either od or enduntil. | ||||
|  | ||||
|   // Single-line strings are enclosed in double-quotes. | ||||
|   prints "string\\\r\n\t\"" | ||||
|   // Multi-line strings are enclosed in pairs of curly braces. | ||||
|   prints {{ | ||||
|     hello, | ||||
|  | ||||
|     world | ||||
|   }} | ||||
|  | ||||
|   // Instruments often end with a statement containing an output opcode. | ||||
|   outc aSignal | ||||
| endin | ||||
|  | ||||
| // Orchestras can also contain user-defined opcodes (UDOs). Here is an | ||||
| // oscillator with one audio-rate output and two control-rate inputs: | ||||
| opcode anOscillator, a, kk | ||||
|   kAmplitude, kFrequency xin | ||||
|   aSignal vco2 kAmplitude, kFrequency | ||||
|   xout aSignal | ||||
| endop | ||||
| instr TestOscillator | ||||
|   outc(anOscillator(0dbfs, 110)) | ||||
| endin | ||||
|  | ||||
| // Python can be executed in Csound | ||||
| // <https://csound.github.io/docs/manual/pyrun.html>. So can Lua | ||||
| // <https://csound.github.io/docs/manual/lua.html>. | ||||
| pyruni {{ | ||||
| import random | ||||
|  | ||||
| pool = [(1 + i / 10.0) ** 1.2 for i in range(100)] | ||||
|  | ||||
| def get_number_from_pool(n, p): | ||||
|   if random.random() < p: | ||||
|     i = int(random.random() * len(pool)) | ||||
|     pool[i] = n; | ||||
|   return random.choice(pool) | ||||
| }} | ||||
|  | ||||
| // The Csound preprocessor supports conditional compilation and including files. | ||||
| #ifdef DEBUG | ||||
| #undef DEBUG | ||||
| #include "filename.orc" | ||||
| #endif | ||||
|  | ||||
| // The preprocessor also supports object- and function-like macros. This is an | ||||
| // object-like macro that defines a number: | ||||
| #define A_HZ #440# | ||||
|  | ||||
| // This is a function-like macro: | ||||
| #define OSCIL_MACRO(VOLUME'FREQUENCY'TABLE) #oscil $VOLUME, $FREQUENCY, $TABLE# | ||||
|  | ||||
| // Bodies of macros are enclosed in # and can contain newlines. The arguments of | ||||
| // function-like macros are separated by single-quotes. Uses of macros are | ||||
| // prefixed with a dollar sign. | ||||
| instr TestMacro | ||||
|   aSignal $OSCIL_MACRO(1'$A_HZ'1) | ||||
|   // Not unlike PHP, macros expand in double-quoted strings. | ||||
|   prints "The frequency of the oscillator is $A_HZ Hz.\n" | ||||
|   out aSignal | ||||
| endin | ||||
|  | ||||
| // Here are other things to note about Csound. | ||||
|  | ||||
| // There are two bitwise NOT operators, ~ and ¬ (U+00AC). The latter is common | ||||
| // on keyboards in the United Kingdom | ||||
| // <https://en.wikipedia.org/wiki/British_and_American_keyboards>. | ||||
| instr TestBitwiseNOT | ||||
|   print ~42 | ||||
|   print ¬42 | ||||
| endin | ||||
|  | ||||
| // Csound uses # for bitwise XOR, which the Csound manual calls bitwise | ||||
| // non-equivalence <https://csound.github.io/docs/manual/opnonequiv.html>. | ||||
| instr TestBitwiseXOR | ||||
|   print 0 # 0 | ||||
|   print 0 # 1 | ||||
|   print 1 # 0 | ||||
|   print 1 # 1 | ||||
| endin | ||||
|  | ||||
| // Loops and if-then statements are relatively recent additions to Csound. There | ||||
| // are many flow-control opcodes that involve goto and labels. | ||||
| instr TestGoto | ||||
|   // This... | ||||
|   if p3 > 0 goto if_label | ||||
|   goto else_label | ||||
| if_label: | ||||
|   prints "if branch\n" | ||||
|   goto endif_label | ||||
| else_label: | ||||
|   prints "else branch\n" | ||||
| endif_label: | ||||
|  | ||||
|   // ...is the same as this. | ||||
|   if p3 > 0 then | ||||
|     prints "if branch\n" | ||||
|   else | ||||
|     prints "else branch\n" | ||||
|   endif | ||||
|  | ||||
|   // This... | ||||
|   iIndex = 0 | ||||
| loop_label: | ||||
|   print iIndex | ||||
|   iIndex += 1 | ||||
|   if iIndex < 10 goto loop_label | ||||
|  | ||||
|   // ...is the same as this... | ||||
|   iIndex = 0 | ||||
| loop_lt_label: | ||||
|   print iIndex | ||||
|   loop_lt iIndex, 1, 10, loop_lt_label | ||||
|  | ||||
|   // ...and this. | ||||
|   iIndex = 0 | ||||
|   while iIndex < 10 do | ||||
|     print iIndex | ||||
|     iIndex += 1 | ||||
|   od | ||||
| endin | ||||
|  | ||||
| // The prints and printks opcodes | ||||
| // <https://github.com/csound/csound/blob/develop/OOps/ugrw1.c#L831>, arguably | ||||
| // the primary methods of logging output, treat certain sequences of characters | ||||
| // different from printf in C. | ||||
| instr TestPrints | ||||
|   // ^ prints an ESCAPE character (U+001B), not a CIRCUMFLEX ACCENT character | ||||
|   // (U+005E). ^^ prints a CIRCUMFLEX ACCENT. | ||||
|   prints "^^\n" | ||||
|   // ~ prints an ESCAPE character (U+001B) followed by a [, not a TILDE | ||||
|   // character (U+007E). ~~ prints a TILDE. | ||||
|   prints "~~\n" | ||||
|   // \A, \B, \N, \R, and \T correspond to the escaped lowercase characters (that | ||||
|   // is, BELL (U+0007), BACKSPACE (U+0008), new line (U+000A), CARRIAGE RETURN | ||||
|   // (U+000D), and tab (U+0009)). | ||||
|   prints "\T\R\N" | ||||
|   // %n, %r, and %t are the same as \n, \r, and \t, as are %N, %R, and %T. | ||||
|   prints "%t%r%n" | ||||
|   // %! prints a semicolon. This is a hold-over from old versions of Csound that | ||||
|   // allowed comments to begin in strings. | ||||
|   prints "; %!\n" | ||||
| endin | ||||
|  | ||||
| // The arguments of function-like macros can be separated by # instead of '. | ||||
| // These two lines define the same macro. | ||||
| #define OSCIL_MACRO(VOLUME'FREQUENCY'TABLE) #oscil $VOLUME, $FREQUENCY, $TABLE# | ||||
| #define OSCIL_MACRO(VOLUME#FREQUENCY#TABLE) #oscil $VOLUME, $FREQUENCY, $TABLE# | ||||
|  | ||||
| // Uses of macros can optionally be suffixed with a period. | ||||
| instr TestMacroPeriodSuffix | ||||
|   aSignal $OSCIL_MACRO.(1'$A_HZ'1) | ||||
|   prints "The frequency of the oscillator is $A_HZ.Hz.\n" | ||||
|   out aSignal | ||||
| endin | ||||
|  | ||||
| // Csound has @ and @@ operator-like macros that, when followed by a literal | ||||
| // non-negative integer, expand to the next power of 2 and the next power of 2 | ||||
| // plus 1: | ||||
| //    @x = 2^(ceil(log2(x + 1))), x >= 0 | ||||
| //   @@0 = 2 | ||||
| //   @@x = 2^(ceil(log2(x))) + 1, x > 0 | ||||
| instr TestAt | ||||
|   prints "%d  %2d  %2d\n", 0, @0, @@0 | ||||
|   prints "%d  %2d  %2d\n", 1, @1, @@1 | ||||
|   prints "%d  %2d  %2d\n", 2, @2, @@2 | ||||
|   prints "%d  %2d  %2d\n", 3, @3, @@3 | ||||
|   prints "%d  %2d  %2d\n", 4, @4, @@4 | ||||
|   prints "%d  %2d  %2d\n", 5, @5, @@5 | ||||
|   prints "%d  %2d  %2d\n", 6, @6, @@6 | ||||
|   prints "%d  %2d  %2d\n", 7, @7, @@7 | ||||
|   prints "%d  %2d  %2d\n", 8, @8, @@8 | ||||
|   prints "%d  %2d  %2d\n", 9, @9, @@9 | ||||
| endin | ||||
|  | ||||
| // Including newlines in macros can lead to confusing code. | ||||
| instr MacroAbuse | ||||
|   if 1 == 1 then | ||||
|     prints "on\n" | ||||
| #define FOO# | ||||
| BAR | ||||
| #endif // This ends the if block. It is not a preprocessor directive. | ||||
| endin | ||||
| </CsInstruments> | ||||
| <CsScore> | ||||
| f 1 0 16384 10 1 | ||||
| i "N_a_M_e_" 0 2 | ||||
| i "TestOscillator" 2 2 | ||||
| i "TestBitwiseNOT" 0 1 | ||||
| i "TestBitwiseXOR" 0 1 | ||||
| i "TestGoto" 0 1 | ||||
| i "TestMacroPeriodSuffix" 4 1 | ||||
| i "TestAt" 0 1 | ||||
| i "MacroAbuse" 0 1 | ||||
| e | ||||
| </CsScore> | ||||
| </CsoundSynthesizer> | ||||
							
								
								
									
										2
									
								
								samples/Csound Score/allglass.sco
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										2
									
								
								samples/Csound Score/allglass.sco
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,2 @@ | ||||
| i 1 0 70.0073 | ||||
| e | ||||
							
								
								
									
										2
									
								
								samples/Csound Score/interp.sco
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										2
									
								
								samples/Csound Score/interp.sco
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,2 @@ | ||||
| i 1 0 7 | ||||
| e | ||||
							
								
								
									
										10
									
								
								samples/Csound Score/test.sco
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								samples/Csound Score/test.sco
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | ||||
| f 1 0 16384 10 1 | ||||
| i "N_a_M_e_" 0 2 | ||||
| i "TestOscillator" 2 2 | ||||
| i "TestBitwiseNOT" 0 1 | ||||
| i "TestBitwiseXOR" 0 1 | ||||
| i "TestGoto" 0 1 | ||||
| i "TestMacroPeriodSuffix" 4 1 | ||||
| i "TestAt" 0 1 | ||||
| i "MacroAbuse" 0 1 | ||||
| e | ||||
							
								
								
									
										13
									
								
								samples/Csound/allglass.orc
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										13
									
								
								samples/Csound/allglass.orc
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,13 @@ | ||||
| sr     = 44100 | ||||
| kr     = 44100 | ||||
| ksmps  = 1 | ||||
| nchnls = 2 | ||||
|  | ||||
| ; pvanal -n 512 -w 8 allglass1-L.wav allglass1-L.pvc | ||||
| ; pvanal -n 512 -w 8 allglass1-R.wav allglass1-R.pvc | ||||
| instr 1 | ||||
|   ktime line 0, p3, 17.5018 | ||||
|   arL pvoc ktime, 1, "allglass1-L.pvc" | ||||
|   arR pvoc ktime, 1, "allglass1-R.pvc" | ||||
|   out arL, arR | ||||
| endin | ||||
							
								
								
									
										26
									
								
								samples/Csound/interp.orc
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										26
									
								
								samples/Csound/interp.orc
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,26 @@ | ||||
| sr     = 44100 | ||||
| kr     = 44100 | ||||
| ksmps  = 1 | ||||
| nchnls = 2 | ||||
|  | ||||
| ; pvanal -n 1024 -w 2 partA-L.wav partA-L.pvc | ||||
| ; pvanal -n 1024 -w 2 partA-R.wav partA-R.pvc | ||||
| ; pvanal -n 1024 -w 2 partB.wav partB.pvc | ||||
| instr 1 | ||||
|   iscale = 1 | ||||
|  | ||||
|   ktimpnt1     line 0, iscale*(82196/44100), 82196/44100 | ||||
|   ktimpnt2     linseg 0, iscale*1.25, 0, iscale*(103518/44100), 103518/44100 | ||||
|   kfreqscale   linseg 1, iscale*0.5, 1, iscale*1.6, 0.8 | ||||
|   kfreqinterpL linseg 0, iscale*0.25, 0, iscale*1.6, 1 | ||||
|   kampinterpL  linseg 0, iscale*0.25, 0, iscale*1.6, 1 | ||||
|   kfreqinterpR linseg 0, iscale*0.5, 0, iscale*1.2, 1 | ||||
|   kampinterpR  linseg 0, iscale*0.5, 0, iscale*1.2, 1 | ||||
|  | ||||
|         pvbufread ktimpnt1, "partB.pvc" | ||||
|   apvcL pvinterp ktimpnt2, 1, "partA-L.pvc", kfreqscale, 1, 1, 1, 1-kfreqinterpL, 1-kampinterpL | ||||
|         pvbufread ktimpnt1, "partB.pvc" | ||||
|   apvcR pvinterp ktimpnt2, 1, "partA-R.pvc", kfreqscale, 1, 1, 1, 1-kfreqinterpR, 1-kampinterpR | ||||
|  | ||||
|   outs apvcL*0.8, apvcR*0.8 | ||||
| endin | ||||
							
								
								
									
										250
									
								
								samples/Csound/test.orc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										250
									
								
								samples/Csound/test.orc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,250 @@ | ||||
| // Csound single-line comments can be preceded by a pair of forward slashes... | ||||
| ; ...or a semicolon. | ||||
|  | ||||
| /* Block comments begin with /* and end with */ | ||||
|  | ||||
| // Orchestras begin with a header of audio parameters. | ||||
| nchnls = 1 | ||||
| nchnls_i = 1 | ||||
| sr = 44100 | ||||
| 0dbfs = 1 | ||||
| ksmps = 10 | ||||
|  | ||||
| // The control rate kr = sr / ksmps can be omitted when the number of audio | ||||
| // samples in a control period (ksmps) is set, but kr may appear in older | ||||
| // orchestras. | ||||
| kr = 4410 | ||||
|  | ||||
| // Orchestras contain instruments. These begin with the keyword instr followed | ||||
| // by a comma-separated list of numbers or names of the instrument. Instruments | ||||
| // end at the endin keyword and cannot be nested. | ||||
| instr 1, N_a_M_e_, +Name | ||||
|   // Instruments contain statements. Here is a typical statement: | ||||
|   aSignal oscil 0dbfs, 440, 1 | ||||
|   // Statements are terminated with a newline (possibly preceded by a comment). | ||||
|   // To write a statement on several lines, precede the newline with a | ||||
|   // backslash. | ||||
|   prints \ | ||||
|     "hello, world\n";comment | ||||
|  | ||||
|   // Csound 6 introduced function syntax for opcodes with one or zero outputs. | ||||
|   // The oscil statement above is the same as | ||||
|   aSignal = oscil(0dbfs, 440, 1) | ||||
|  | ||||
|   // Instruments can contain control structures. | ||||
|   kNote = p3 | ||||
|   if (kNote == 0) then | ||||
|     kFrequency = 220 | ||||
|   elseif kNote == 1 then // Parentheses around binary expressions are optional. | ||||
|     kFrequency = 440 | ||||
|   endif | ||||
|  | ||||
|   // Csound 6 introduced looping structures. | ||||
|   iIndex = 0 | ||||
|   while iIndex < 5 do | ||||
|     print iIndex | ||||
|     iIndex += 1 | ||||
|   od | ||||
|   iIndex = 0 | ||||
|   until iIndex >= 5 do | ||||
|     print iIndex | ||||
|     iIndex += 1 | ||||
|   enduntil | ||||
|   // Both kinds of loops can be terminated by either od or enduntil. | ||||
|  | ||||
|   // Single-line strings are enclosed in double-quotes. | ||||
|   prints "string\\\r\n\t\"" | ||||
|   // Multi-line strings are enclosed in pairs of curly braces. | ||||
|   prints {{ | ||||
|     hello, | ||||
|  | ||||
|     world | ||||
|   }} | ||||
|  | ||||
|   // Instruments often end with a statement containing an output opcode. | ||||
|   outc aSignal | ||||
| endin | ||||
|  | ||||
| // Orchestras can also contain user-defined opcodes (UDOs). Here is an | ||||
| // oscillator with one audio-rate output and two control-rate inputs: | ||||
| opcode anOscillator, a, kk | ||||
|   kAmplitude, kFrequency xin | ||||
|   aSignal vco2 kAmplitude, kFrequency | ||||
|   xout aSignal | ||||
| endop | ||||
| instr TestOscillator | ||||
|   outc(anOscillator(0dbfs, 110)) | ||||
| endin | ||||
|  | ||||
| // Python can be executed in Csound | ||||
| // <https://csound.github.io/docs/manual/pyrun.html>. So can Lua | ||||
| // <https://csound.github.io/docs/manual/lua.html>. | ||||
| pyruni {{ | ||||
| import random | ||||
|  | ||||
| pool = [(1 + i / 10.0) ** 1.2 for i in range(100)] | ||||
|  | ||||
| def get_number_from_pool(n, p): | ||||
|   if random.random() < p: | ||||
|     i = int(random.random() * len(pool)) | ||||
|     pool[i] = n; | ||||
|   return random.choice(pool) | ||||
| }} | ||||
|  | ||||
| // The Csound preprocessor supports conditional compilation and including files. | ||||
| #ifdef DEBUG | ||||
| #undef DEBUG | ||||
| #include "filename.orc" | ||||
| #endif | ||||
|  | ||||
| // The preprocessor also supports object- and function-like macros. This is an | ||||
| // object-like macro that defines a number: | ||||
| #define A_HZ #440# | ||||
|  | ||||
| // This is a function-like macro: | ||||
| #define OSCIL_MACRO(VOLUME'FREQUENCY'TABLE) #oscil $VOLUME, $FREQUENCY, $TABLE# | ||||
|  | ||||
| // Bodies of macros are enclosed in # and can contain newlines. The arguments of | ||||
| // function-like macros are separated by single-quotes. Uses of macros are | ||||
| // prefixed with a dollar sign. | ||||
| instr TestMacro | ||||
|   aSignal $OSCIL_MACRO(1'$A_HZ'1) | ||||
|   // Not unlike PHP, macros expand in double-quoted strings. | ||||
|   prints "The frequency of the oscillator is $A_HZ Hz.\n" | ||||
|   out aSignal | ||||
| endin | ||||
|  | ||||
| // Here are other things to note about Csound. | ||||
|  | ||||
| // There are two bitwise NOT operators, ~ and ¬ (U+00AC). The latter is common | ||||
| // on keyboards in the United Kingdom | ||||
| // <https://en.wikipedia.org/wiki/British_and_American_keyboards>. | ||||
| instr TestBitwiseNOT | ||||
|   print ~42 | ||||
|   print ¬42 | ||||
| endin | ||||
|  | ||||
| // Csound uses # for bitwise XOR, which the Csound manual calls bitwise | ||||
| // non-equivalence <https://csound.github.io/docs/manual/opnonequiv.html>. | ||||
| instr TestBitwiseXOR | ||||
|   print 0 # 0 | ||||
|   print 0 # 1 | ||||
|   print 1 # 0 | ||||
|   print 1 # 1 | ||||
| endin | ||||
|  | ||||
| // Loops and if-then statements are relatively recent additions to Csound. There | ||||
| // are many flow-control opcodes that involve goto and labels. | ||||
| instr TestGoto | ||||
|   // This... | ||||
|   if p3 > 0 goto if_label | ||||
|   goto else_label | ||||
| if_label: | ||||
|   prints "if branch\n" | ||||
|   goto endif_label | ||||
| else_label: | ||||
|   prints "else branch\n" | ||||
| endif_label: | ||||
|  | ||||
|   // ...is the same as this. | ||||
|   if p3 > 0 then | ||||
|     prints "if branch\n" | ||||
|   else | ||||
|     prints "else branch\n" | ||||
|   endif | ||||
|  | ||||
|   // This... | ||||
|   iIndex = 0 | ||||
| loop_label: | ||||
|   print iIndex | ||||
|   iIndex += 1 | ||||
|   if iIndex < 10 goto loop_label | ||||
|  | ||||
|   // ...is the same as this... | ||||
|   iIndex = 0 | ||||
| loop_lt_label: | ||||
|   print iIndex | ||||
|   loop_lt iIndex, 1, 10, loop_lt_label | ||||
|  | ||||
|   // ...and this. | ||||
|   iIndex = 0 | ||||
|   while iIndex < 10 do | ||||
|     print iIndex | ||||
|     iIndex += 1 | ||||
|   od | ||||
| endin | ||||
|  | ||||
| // The prints and printks opcodes | ||||
| // <https://github.com/csound/csound/blob/develop/OOps/ugrw1.c#L831>, arguably | ||||
| // the primary methods of logging output, treat certain sequences of characters | ||||
| // different from printf in C. | ||||
| instr TestPrints | ||||
|   // ^ prints an ESCAPE character (U+001B), not a CIRCUMFLEX ACCENT character | ||||
|   // (U+005E). ^^ prints a CIRCUMFLEX ACCENT. | ||||
|   prints "^^\n" | ||||
|   // ~ prints an ESCAPE character (U+001B) followed by a [, not a TILDE | ||||
|   // character (U+007E). ~~ prints a TILDE. | ||||
|   prints "~~\n" | ||||
|   // \A, \B, \N, \R, and \T correspond to the escaped lowercase characters (that | ||||
|   // is, BELL (U+0007), BACKSPACE (U+0008), new line (U+000A), CARRIAGE RETURN | ||||
|   // (U+000D), and tab (U+0009)). | ||||
|   prints "\T\R\N" | ||||
|   // %n, %r, and %t are the same as \n, \r, and \t, as are %N, %R, and %T. | ||||
|   prints "%t%r%n" | ||||
|   // %! prints a semicolon. This is a hold-over from old versions of Csound that | ||||
|   // allowed comments to begin in strings. | ||||
|   prints "; %!\n" | ||||
| endin | ||||
|  | ||||
| // The arguments of function-like macros can be separated by # instead of '. | ||||
| // These two lines define the same macro. | ||||
| #define OSCIL_MACRO(VOLUME'FREQUENCY'TABLE) #oscil $VOLUME, $FREQUENCY, $TABLE# | ||||
| #define OSCIL_MACRO(VOLUME#FREQUENCY#TABLE) #oscil $VOLUME, $FREQUENCY, $TABLE# | ||||
|  | ||||
| // Uses of macros can optionally be suffixed with a period. | ||||
| instr TestMacroPeriodSuffix | ||||
|   aSignal $OSCIL_MACRO.(1'$A_HZ'1) | ||||
|   prints "The frequency of the oscillator is $A_HZ.Hz.\n" | ||||
|   out aSignal | ||||
| endin | ||||
|  | ||||
| // Csound has @ and @@ operator-like macros that, when followed by a literal | ||||
| // non-negative integer, expand to the next power of 2 and the next power of 2 | ||||
| // plus 1: | ||||
| //    @x = 2^(ceil(log2(x + 1))), x >= 0 | ||||
| //   @@0 = 2 | ||||
| //   @@x = 2^(ceil(log2(x))) + 1, x > 0 | ||||
| instr TestAt | ||||
|   prints "%d  %2d  %2d\n", 0, @0, @@0 | ||||
|   prints "%d  %2d  %2d\n", 1, @1, @@1 | ||||
|   prints "%d  %2d  %2d\n", 2, @2, @@2 | ||||
|   prints "%d  %2d  %2d\n", 3, @3, @@3 | ||||
|   prints "%d  %2d  %2d\n", 4, @4, @@4 | ||||
|   prints "%d  %2d  %2d\n", 5, @5, @@5 | ||||
|   prints "%d  %2d  %2d\n", 6, @6, @@6 | ||||
|   prints "%d  %2d  %2d\n", 7, @7, @@7 | ||||
|   prints "%d  %2d  %2d\n", 8, @8, @@8 | ||||
|   prints "%d  %2d  %2d\n", 9, @9, @@9 | ||||
| endin | ||||
|  | ||||
| // Including newlines in macros can lead to confusing code. | ||||
| instr MacroAbuse | ||||
|   if 1 == 1 then | ||||
|     prints "on\n" | ||||
| #define FOO# | ||||
| BAR | ||||
| #endif // This ends the if block. It is not a preprocessor directive. | ||||
| endin | ||||
|  | ||||
| scoreline_i {{ | ||||
| f 1 0 16384 10 1 | ||||
| i "N_a_M_e_" 0 2 | ||||
| i "TestOscillator" 2 2 | ||||
| i "TestBitwiseNOT" 0 1 | ||||
| i "TestBitwiseXOR" 0 1 | ||||
| i "TestGoto" 0 1 | ||||
| i "TestMacroPeriodSuffix" 4 1 | ||||
| i "TestAt" 0 1 | ||||
| i "MacroAbuse" 0 1 | ||||
| e | ||||
| }} | ||||
							
								
								
									
										13
									
								
								samples/EJS/dash.ejs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								samples/EJS/dash.ejs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | ||||
| <% include parts/depend %> | ||||
|  | ||||
| <div class="row"> | ||||
|   <% if (user.primaryAccount == "teacher") { %> | ||||
|     <% include teacher/sidebar %> | ||||
|     <% include teacher/dashboard %> | ||||
|   <% } else if (user.primaryAccount == "student") { %> | ||||
|     <% include student/sidebar %> | ||||
|     <% include student/dashboard %> | ||||
|   <% } else { %> | ||||
|     <center><h2>There seems to be a problem</h2></center> | ||||
|   <% } %> | ||||
| </div> | ||||
							
								
								
									
										102
									
								
								samples/EJS/page.ejs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										102
									
								
								samples/EJS/page.ejs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,102 @@ | ||||
| <% include ../parts/depend %> | ||||
|  | ||||
| <div class="row"> | ||||
|   <% include sidebar %> | ||||
|   <div class="col-lg-offset-3 col-lg-9 main-content"> | ||||
|     <div class="page-title"> | ||||
|       <h1>Pieces</h1> | ||||
|       <% if (pieces.length == 1) { %> | ||||
|         <p>You have | ||||
|           <strong>1</strong> | ||||
|           piece to practice</p> | ||||
|       <% } else { %> | ||||
|         <p>You have | ||||
|           <strong><%= pieces.length %></strong> | ||||
|           pieces to practice</p> | ||||
|       <% } %> | ||||
|     </div> | ||||
|     <div class="row"> | ||||
|       <% if (pieces == undefined || pieces.length == 0) { %> | ||||
|         <div class="error-main"> | ||||
|           <h1>No Pieces</h1> | ||||
|           <p>You have no | ||||
|             <strong>Pieces</strong> | ||||
|             assigned.</p> | ||||
|         </div> | ||||
|       <% } else { %> | ||||
|         <div class="col-lg-12 section-title"> | ||||
|           <div style="margin-top: 10px; margin-bottom: 10px;" class="btn-group" role="group"> | ||||
|             <button id="inProgressButton" type="button" class="btn btn-md btn-super-round btn-focus-off btn-primary btn-primary-active">In Progress</button> | ||||
|             <button id="completedButton" type="button" class="btn btn-md btn-super-round btn-focus-off btn-purple">Completed</button> | ||||
|           </div> | ||||
|         </div> | ||||
|  | ||||
|         <div id="inProgressPieces"> | ||||
|           <% if (inProgressPieces == undefined || inProgressPieces.length == 0) { %> | ||||
|             <center> | ||||
|               <h2>No Pieces in Progress</h2> | ||||
|             </center> | ||||
|           <% } else { %> | ||||
|             <% for (var i = 0; i < inProgressPieces.length; i++) { %> | ||||
|               <div class="col-lg-6"> | ||||
|                 <div class="box"> | ||||
|                   <div class="title"> | ||||
|                     <h1> | ||||
|                       <a href="/pieces/practice/<%= inProgressPieces[i].id %>"><%= inProgressPieces[i].title %></a> | ||||
|                     </h1> | ||||
|                     <p>By | ||||
|                       <strong><%= inProgressPieces[i].author %></strong> | ||||
|                     </p> | ||||
|                     <p> | ||||
|                       Teacher: | ||||
|                       <strong><%= inProgressPieces[i].teacherName %></strong> | ||||
|                     </p> | ||||
|                     <p>Average Practice Time: | ||||
|                       <strong><%= inProgressPieces[i].averagePracticeTime %> | ||||
|                         mins</strong> | ||||
|                     </p> | ||||
|                     <a href="/pieces/practice/<%= inProgressPieces[i].id %>" class="btn btn-success btn-block">Practice | ||||
|                       <%= inProgressPieces[i].title %></a> | ||||
|                   </div> | ||||
|                 </div> | ||||
|               </div> | ||||
|             <% } %> | ||||
|           <% } %> | ||||
|         </div> | ||||
|  | ||||
|         <div id="completedPieces" style="display: none;"> | ||||
|           <% if (completedPieces == undefined || completedPieces.length == 0) { %> | ||||
|             <center> | ||||
|               <h2>No Completed Pieces</h2> | ||||
|             </center> | ||||
|           <% } else { %> | ||||
|             <% for (var i = 0; i < completedPieces.length; i++) { %> | ||||
|               <div class="col-lg-6"> | ||||
|                 <div class="box"> | ||||
|                   <div class="title"> | ||||
|                     <h1> | ||||
|                       <a href="/pieces/practice/<%= completedPieces[i].id %>"><%= completedPieces[i].title %></a> | ||||
|                     </h1> | ||||
|                     <p>By | ||||
|                       <strong><%= completedPieces[i].author %></strong> | ||||
|                     </p> | ||||
|                     <p> | ||||
|                       Teacher: | ||||
|                       <strong><%= completedPieces[i].teacherName %></strong> | ||||
|                     </p> | ||||
|                     <p>Average Practice Time: | ||||
|                       <strong><%= completedPieces[i].averagePracticeTime %> | ||||
|                         mins</strong> | ||||
|                     </p> | ||||
|                     <a href="/pieces/practice/<%= completedPieces[i].id %>" class="btn btn-success btn-block">Practice | ||||
|                       <%= completedPieces[i].title %></a> | ||||
|                   </div> | ||||
|                 </div> | ||||
|               </div> | ||||
|             <% } %> | ||||
|           <% } %> | ||||
|         </div> | ||||
|       <% } %> | ||||
|     </div> | ||||
|   </div> | ||||
| </div> | ||||
							
								
								
									
										26
									
								
								samples/Erlang/170-os-daemons.es
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										26
									
								
								samples/Erlang/170-os-daemons.es
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,26 @@ | ||||
| #! /usr/bin/env escript | ||||
|  | ||||
| % 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. | ||||
|  | ||||
| loop() -> | ||||
| 	loop(io:read("")). | ||||
|  | ||||
| loop({ok, _}) -> | ||||
| 	loop(io:read("")); | ||||
| loop(eof) -> | ||||
| 	stop; | ||||
| loop({error, Reason}) -> | ||||
| 	throw({error, Reason}). | ||||
|  | ||||
| main([]) -> | ||||
| 	loop(). | ||||
							
								
								
									
										856
									
								
								samples/Erlang/elixir_parser.yrl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										856
									
								
								samples/Erlang/elixir_parser.yrl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,856 @@ | ||||
| Nonterminals | ||||
|   grammar expr_list | ||||
|   expr container_expr block_expr access_expr | ||||
|   no_parens_expr no_parens_zero_expr no_parens_one_expr no_parens_one_ambig_expr | ||||
|   bracket_expr bracket_at_expr bracket_arg matched_expr unmatched_expr max_expr | ||||
|   unmatched_op_expr matched_op_expr no_parens_op_expr no_parens_many_expr | ||||
|   comp_op_eol at_op_eol unary_op_eol and_op_eol or_op_eol capture_op_eol | ||||
|   add_op_eol mult_op_eol two_op_eol three_op_eol pipe_op_eol stab_op_eol | ||||
|   arrow_op_eol match_op_eol when_op_eol in_op_eol in_match_op_eol | ||||
|   type_op_eol rel_op_eol | ||||
|   open_paren close_paren empty_paren eoe | ||||
|   list list_args open_bracket close_bracket | ||||
|   tuple open_curly close_curly | ||||
|   bit_string open_bit close_bit | ||||
|   map map_op map_close map_args map_expr struct_op | ||||
|   assoc_op_eol assoc_expr assoc_base assoc_update assoc_update_kw assoc | ||||
|   container_args_base container_args | ||||
|   call_args_parens_expr call_args_parens_base call_args_parens parens_call | ||||
|   call_args_no_parens_one call_args_no_parens_ambig call_args_no_parens_expr | ||||
|   call_args_no_parens_comma_expr call_args_no_parens_all call_args_no_parens_many | ||||
|   call_args_no_parens_many_strict | ||||
|   stab stab_eoe stab_expr stab_op_eol_and_expr stab_parens_many | ||||
|   kw_eol kw_base kw call_args_no_parens_kw_expr call_args_no_parens_kw | ||||
|   dot_op dot_alias dot_alias_container | ||||
|   dot_identifier dot_op_identifier dot_do_identifier | ||||
|   dot_paren_identifier dot_bracket_identifier | ||||
|   do_block fn_eoe do_eoe end_eoe block_eoe block_item block_list | ||||
|   . | ||||
|  | ||||
| Terminals | ||||
|   identifier kw_identifier kw_identifier_safe kw_identifier_unsafe bracket_identifier | ||||
|   paren_identifier do_identifier block_identifier | ||||
|   fn 'end' aliases | ||||
|   number atom atom_safe atom_unsafe bin_string list_string sigil | ||||
|   dot_call_op op_identifier | ||||
|   comp_op at_op unary_op and_op or_op arrow_op match_op in_op in_match_op | ||||
|   type_op dual_op add_op mult_op two_op three_op pipe_op stab_op when_op assoc_op | ||||
|   capture_op rel_op | ||||
|   'true' 'false' 'nil' 'do' eol ';' ',' '.' | ||||
|   '(' ')' '[' ']' '{' '}' '<<' '>>' '%{}' '%' | ||||
|   . | ||||
|  | ||||
| Rootsymbol grammar. | ||||
|  | ||||
| %% Two shift/reduce conflicts coming from call_args_parens. | ||||
| Expect 2. | ||||
|  | ||||
| %% Changes in ops and precedence should be reflected on lib/elixir/lib/macro.ex | ||||
| %% Note though the operator => in practice has lower precedence than all others, | ||||
| %% its entry in the table is only to support the %{user | foo => bar} syntax. | ||||
| Left       5 do. | ||||
| Right     10 stab_op_eol.     %% -> | ||||
| Left      20 ','. | ||||
| Nonassoc  30 capture_op_eol.  %% & | ||||
| Left      40 in_match_op_eol. %% <-, \\ (allowed in matches along =) | ||||
| Right     50 when_op_eol.     %% when | ||||
| Right     60 type_op_eol.     %% :: | ||||
| Right     70 pipe_op_eol.     %% | | ||||
| Right     80 assoc_op_eol.    %% => | ||||
| Right     90 match_op_eol.    %% = | ||||
| Left     130 or_op_eol.       %% ||, |||, or | ||||
| Left     140 and_op_eol.      %% &&, &&&, and | ||||
| Left     150 comp_op_eol.     %% ==, !=, =~, ===, !== | ||||
| Left     160 rel_op_eol.      %% <, >, <=, >= | ||||
| Left     170 arrow_op_eol.    %% |>, <<<, >>>, ~>>, <<~, ~>, <~, <~>, <|> | ||||
| Left     180 in_op_eol.       %% in | ||||
| Left     190 three_op_eol.    %% ^^^ | ||||
| Right    200 two_op_eol.      %% ++, --, .., <> | ||||
| Left     210 add_op_eol.      %% +, - | ||||
| Left     220 mult_op_eol.     %% *, / | ||||
| Nonassoc 300 unary_op_eol.    %% +, -, !, ^, not, ~~~ | ||||
| Left     310 dot_call_op. | ||||
| Left     310 dot_op.          %% . | ||||
| Nonassoc 320 at_op_eol.       %% @ | ||||
| Nonassoc 330 dot_identifier. | ||||
|  | ||||
| %%% MAIN FLOW OF EXPRESSIONS | ||||
|  | ||||
| grammar -> eoe : nil. | ||||
| grammar -> expr_list : to_block('$1'). | ||||
| grammar -> eoe expr_list : to_block('$2'). | ||||
| grammar -> expr_list eoe : to_block('$1'). | ||||
| grammar -> eoe expr_list eoe : to_block('$2'). | ||||
| grammar -> '$empty' : nil. | ||||
|  | ||||
| % Note expressions are on reverse order | ||||
| expr_list -> expr : ['$1']. | ||||
| expr_list -> expr_list eoe expr : ['$3'|'$1']. | ||||
|  | ||||
| expr -> matched_expr : '$1'. | ||||
| expr -> no_parens_expr : '$1'. | ||||
| expr -> unmatched_expr : '$1'. | ||||
|  | ||||
| %% In Elixir we have three main call syntaxes: with parentheses, | ||||
| %% without parentheses and with do blocks. They are represented | ||||
| %% in the AST as matched, no_parens and unmatched. | ||||
| %% | ||||
| %% Calls without parentheses are further divided according to how | ||||
| %% problematic they are: | ||||
| %% | ||||
| %% (a) no_parens_one: a call with one unproblematic argument | ||||
| %% (e.g. `f a` or `f g a` and similar) (includes unary operators) | ||||
| %% | ||||
| %% (b) no_parens_many: a call with several arguments (e.g. `f a, b`) | ||||
| %% | ||||
| %% (c) no_parens_one_ambig: a call with one argument which is | ||||
| %% itself a no_parens_many or no_parens_one_ambig (e.g. `f g a, b` | ||||
| %% or `f g h a, b` and similar) | ||||
| %% | ||||
| %% Note, in particular, that no_parens_one_ambig expressions are | ||||
| %% ambiguous and are interpreted such that the outer function has | ||||
| %% arity 1 (e.g. `f g a, b` is interpreted as `f(g(a, b))` rather | ||||
| %% than `f(g(a), b)`). Hence the name, no_parens_one_ambig. | ||||
| %% | ||||
| %% The distinction is required because we can't, for example, have | ||||
| %% a function call with a do block as argument inside another do | ||||
| %% block call, unless there are parentheses: | ||||
| %% | ||||
| %%   if if true do true else false end do  #=> invalid | ||||
| %%   if(if true do true else false end) do #=> valid | ||||
| %% | ||||
| %% Similarly, it is not possible to nest calls without parentheses | ||||
| %% if their arity is more than 1: | ||||
| %% | ||||
| %%   foo a, bar b, c  #=> invalid | ||||
| %%   foo(a, bar b, c) #=> invalid | ||||
| %%   foo bar a, b     #=> valid | ||||
| %%   foo a, bar(b, c) #=> valid | ||||
| %% | ||||
| %% So the different grammar rules need to take into account | ||||
| %% if calls without parentheses are do blocks in particular | ||||
| %% segments and act accordingly. | ||||
| matched_expr -> matched_expr matched_op_expr : build_op(element(1, '$2'), '$1', element(2, '$2')). | ||||
| matched_expr -> unary_op_eol matched_expr : build_unary_op('$1', '$2'). | ||||
| matched_expr -> at_op_eol matched_expr : build_unary_op('$1', '$2'). | ||||
| matched_expr -> capture_op_eol matched_expr : build_unary_op('$1', '$2'). | ||||
| matched_expr -> no_parens_one_expr : '$1'. | ||||
| matched_expr -> no_parens_zero_expr : '$1'. | ||||
| matched_expr -> access_expr : '$1'. | ||||
| matched_expr -> access_expr kw_identifier : throw_invalid_kw_identifier('$2'). | ||||
|  | ||||
| unmatched_expr -> matched_expr unmatched_op_expr : build_op(element(1, '$2'), '$1', element(2, '$2')). | ||||
| unmatched_expr -> unmatched_expr matched_op_expr : build_op(element(1, '$2'), '$1', element(2, '$2')). | ||||
| unmatched_expr -> unmatched_expr unmatched_op_expr : build_op(element(1, '$2'), '$1', element(2, '$2')). | ||||
| unmatched_expr -> unmatched_expr no_parens_op_expr : build_op(element(1, '$2'), '$1', element(2, '$2')). | ||||
| unmatched_expr -> unary_op_eol expr : build_unary_op('$1', '$2'). | ||||
| unmatched_expr -> at_op_eol expr : build_unary_op('$1', '$2'). | ||||
| unmatched_expr -> capture_op_eol expr : build_unary_op('$1', '$2'). | ||||
| unmatched_expr -> block_expr : '$1'. | ||||
|  | ||||
| no_parens_expr -> matched_expr no_parens_op_expr : build_op(element(1, '$2'), '$1', element(2, '$2')). | ||||
| no_parens_expr -> unary_op_eol no_parens_expr : build_unary_op('$1', '$2'). | ||||
| no_parens_expr -> at_op_eol no_parens_expr : build_unary_op('$1', '$2'). | ||||
| no_parens_expr -> capture_op_eol no_parens_expr : build_unary_op('$1', '$2'). | ||||
| no_parens_expr -> no_parens_one_ambig_expr : '$1'. | ||||
| no_parens_expr -> no_parens_many_expr : '$1'. | ||||
|  | ||||
| block_expr -> parens_call call_args_parens do_block : build_identifier('$1', '$2' ++ '$3'). | ||||
| block_expr -> parens_call call_args_parens call_args_parens do_block : build_nested_parens('$1', '$2', '$3' ++ '$4'). | ||||
| block_expr -> dot_do_identifier do_block : build_identifier('$1', '$2'). | ||||
| block_expr -> dot_identifier call_args_no_parens_all do_block : build_identifier('$1', '$2' ++ '$3'). | ||||
|  | ||||
| matched_op_expr -> match_op_eol matched_expr : {'$1', '$2'}. | ||||
| matched_op_expr -> add_op_eol matched_expr : {'$1', '$2'}. | ||||
| matched_op_expr -> mult_op_eol matched_expr : {'$1', '$2'}. | ||||
| matched_op_expr -> two_op_eol matched_expr : {'$1', '$2'}. | ||||
| matched_op_expr -> three_op_eol matched_expr : {'$1', '$2'}. | ||||
| matched_op_expr -> and_op_eol matched_expr : {'$1', '$2'}. | ||||
| matched_op_expr -> or_op_eol matched_expr : {'$1', '$2'}. | ||||
| matched_op_expr -> in_op_eol matched_expr : {'$1', '$2'}. | ||||
| matched_op_expr -> in_match_op_eol matched_expr : {'$1', '$2'}. | ||||
| matched_op_expr -> type_op_eol matched_expr : {'$1', '$2'}. | ||||
| matched_op_expr -> when_op_eol matched_expr : {'$1', '$2'}. | ||||
| matched_op_expr -> pipe_op_eol matched_expr : {'$1', '$2'}. | ||||
| matched_op_expr -> comp_op_eol matched_expr : {'$1', '$2'}. | ||||
| matched_op_expr -> rel_op_eol matched_expr : {'$1', '$2'}. | ||||
| matched_op_expr -> arrow_op_eol matched_expr : {'$1', '$2'}. | ||||
| %% Warn for no parens subset | ||||
| matched_op_expr -> arrow_op_eol no_parens_one_expr : warn_pipe('$1', '$2'), {'$1', '$2'}. | ||||
|  | ||||
| unmatched_op_expr -> match_op_eol unmatched_expr : {'$1', '$2'}. | ||||
| unmatched_op_expr -> add_op_eol unmatched_expr : {'$1', '$2'}. | ||||
| unmatched_op_expr -> mult_op_eol unmatched_expr : {'$1', '$2'}. | ||||
| unmatched_op_expr -> two_op_eol unmatched_expr : {'$1', '$2'}. | ||||
| unmatched_op_expr -> three_op_eol unmatched_expr : {'$1', '$2'}. | ||||
| unmatched_op_expr -> and_op_eol unmatched_expr : {'$1', '$2'}. | ||||
| unmatched_op_expr -> or_op_eol unmatched_expr : {'$1', '$2'}. | ||||
| unmatched_op_expr -> in_op_eol unmatched_expr : {'$1', '$2'}. | ||||
| unmatched_op_expr -> in_match_op_eol unmatched_expr : {'$1', '$2'}. | ||||
| unmatched_op_expr -> type_op_eol unmatched_expr : {'$1', '$2'}. | ||||
| unmatched_op_expr -> when_op_eol unmatched_expr : {'$1', '$2'}. | ||||
| unmatched_op_expr -> pipe_op_eol unmatched_expr : {'$1', '$2'}. | ||||
| unmatched_op_expr -> comp_op_eol unmatched_expr : {'$1', '$2'}. | ||||
| unmatched_op_expr -> rel_op_eol unmatched_expr : {'$1', '$2'}. | ||||
| unmatched_op_expr -> arrow_op_eol unmatched_expr : {'$1', '$2'}. | ||||
|  | ||||
| no_parens_op_expr -> match_op_eol no_parens_expr : {'$1', '$2'}. | ||||
| no_parens_op_expr -> add_op_eol no_parens_expr : {'$1', '$2'}. | ||||
| no_parens_op_expr -> mult_op_eol no_parens_expr : {'$1', '$2'}. | ||||
| no_parens_op_expr -> two_op_eol no_parens_expr : {'$1', '$2'}. | ||||
| no_parens_op_expr -> three_op_eol no_parens_expr : {'$1', '$2'}. | ||||
| no_parens_op_expr -> and_op_eol no_parens_expr : {'$1', '$2'}. | ||||
| no_parens_op_expr -> or_op_eol no_parens_expr : {'$1', '$2'}. | ||||
| no_parens_op_expr -> in_op_eol no_parens_expr : {'$1', '$2'}. | ||||
| no_parens_op_expr -> in_match_op_eol no_parens_expr : {'$1', '$2'}. | ||||
| no_parens_op_expr -> type_op_eol no_parens_expr : {'$1', '$2'}. | ||||
| no_parens_op_expr -> when_op_eol no_parens_expr : {'$1', '$2'}. | ||||
| no_parens_op_expr -> pipe_op_eol no_parens_expr : {'$1', '$2'}. | ||||
| no_parens_op_expr -> comp_op_eol no_parens_expr : {'$1', '$2'}. | ||||
| no_parens_op_expr -> rel_op_eol no_parens_expr : {'$1', '$2'}. | ||||
| no_parens_op_expr -> arrow_op_eol no_parens_expr : {'$1', '$2'}. | ||||
| %% Warn for no parens subset | ||||
| no_parens_op_expr -> arrow_op_eol no_parens_one_ambig_expr : warn_pipe('$1', '$2'), {'$1', '$2'}. | ||||
| no_parens_op_expr -> arrow_op_eol no_parens_many_expr : warn_pipe('$1', '$2'), {'$1', '$2'}. | ||||
|  | ||||
| %% Allow when (and only when) with keywords | ||||
| no_parens_op_expr -> when_op_eol call_args_no_parens_kw : {'$1', '$2'}. | ||||
|  | ||||
| no_parens_one_ambig_expr -> dot_op_identifier call_args_no_parens_ambig : build_identifier('$1', '$2'). | ||||
| no_parens_one_ambig_expr -> dot_identifier call_args_no_parens_ambig : build_identifier('$1', '$2'). | ||||
|  | ||||
| no_parens_many_expr -> dot_op_identifier call_args_no_parens_many_strict : build_identifier('$1', '$2'). | ||||
| no_parens_many_expr -> dot_identifier call_args_no_parens_many_strict : build_identifier('$1', '$2'). | ||||
|  | ||||
| no_parens_one_expr -> dot_op_identifier call_args_no_parens_one : build_identifier('$1', '$2'). | ||||
| no_parens_one_expr -> dot_identifier call_args_no_parens_one : build_identifier('$1', '$2'). | ||||
| no_parens_zero_expr -> dot_do_identifier : build_identifier('$1', nil). | ||||
| no_parens_zero_expr -> dot_identifier : build_identifier('$1', nil). | ||||
|  | ||||
| %% From this point on, we just have constructs that can be | ||||
| %% used with the access syntax. Notice that (dot_)identifier | ||||
| %% is not included in this list simply because the tokenizer | ||||
| %% marks identifiers followed by brackets as bracket_identifier. | ||||
| access_expr -> bracket_at_expr : '$1'. | ||||
| access_expr -> bracket_expr : '$1'. | ||||
| access_expr -> at_op_eol number : build_unary_op('$1', ?exprs('$2')). | ||||
| access_expr -> unary_op_eol number : build_unary_op('$1', ?exprs('$2')). | ||||
| access_expr -> capture_op_eol number : build_unary_op('$1', ?exprs('$2')). | ||||
| access_expr -> fn_eoe stab end_eoe : build_fn('$1', reverse('$2')). | ||||
| access_expr -> open_paren stab close_paren : build_stab(reverse('$2')). | ||||
| access_expr -> open_paren stab ';' close_paren : build_stab(reverse('$2')). | ||||
| access_expr -> open_paren ';' stab ';' close_paren : build_stab(reverse('$3')). | ||||
| access_expr -> open_paren ';' stab close_paren : build_stab(reverse('$3')). | ||||
| access_expr -> open_paren ';' close_paren : build_stab([]). | ||||
| access_expr -> empty_paren : nil. | ||||
| access_expr -> number : ?exprs('$1'). | ||||
| access_expr -> list : element(1, '$1'). | ||||
| access_expr -> map : '$1'. | ||||
| access_expr -> tuple : '$1'. | ||||
| access_expr -> 'true' : ?id('$1'). | ||||
| access_expr -> 'false' : ?id('$1'). | ||||
| access_expr -> 'nil' : ?id('$1'). | ||||
| access_expr -> bin_string  : build_bin_string('$1'). | ||||
| access_expr -> list_string : build_list_string('$1'). | ||||
| access_expr -> bit_string : '$1'. | ||||
| access_expr -> sigil : build_sigil('$1'). | ||||
| access_expr -> max_expr : '$1'. | ||||
|  | ||||
| %% Aliases and properly formed calls. Used by map_expr. | ||||
| max_expr -> atom : ?exprs('$1'). | ||||
| max_expr -> atom_safe : build_quoted_atom('$1', true). | ||||
| max_expr -> atom_unsafe : build_quoted_atom('$1', false). | ||||
| max_expr -> parens_call call_args_parens : build_identifier('$1', '$2'). | ||||
| max_expr -> parens_call call_args_parens call_args_parens : build_nested_parens('$1', '$2', '$3'). | ||||
| max_expr -> dot_alias : '$1'. | ||||
|  | ||||
| bracket_arg -> open_bracket kw close_bracket : build_list('$1', '$2'). | ||||
| bracket_arg -> open_bracket container_expr close_bracket : build_list('$1', '$2'). | ||||
| bracket_arg -> open_bracket container_expr ',' close_bracket : build_list('$1', '$2'). | ||||
|  | ||||
| bracket_expr -> dot_bracket_identifier bracket_arg : build_access(build_identifier('$1', nil), '$2'). | ||||
| bracket_expr -> access_expr bracket_arg : build_access('$1', '$2'). | ||||
|  | ||||
| bracket_at_expr -> at_op_eol dot_bracket_identifier bracket_arg : | ||||
|                      build_access(build_unary_op('$1', build_identifier('$2', nil)), '$3'). | ||||
| bracket_at_expr -> at_op_eol access_expr bracket_arg : | ||||
|                      build_access(build_unary_op('$1', '$2'), '$3'). | ||||
|  | ||||
| %% Blocks | ||||
|  | ||||
| do_block -> do_eoe 'end' : [[{do, nil}]]. | ||||
| do_block -> do_eoe stab end_eoe : [[{do, build_stab(reverse('$2'))}]]. | ||||
| do_block -> do_eoe block_list 'end' : [[{do, nil}|'$2']]. | ||||
| do_block -> do_eoe stab_eoe block_list 'end' : [[{do, build_stab(reverse('$2'))}|'$3']]. | ||||
|  | ||||
| eoe -> eol : '$1'. | ||||
| eoe -> ';' : '$1'. | ||||
| eoe -> eol ';' : '$1'. | ||||
|  | ||||
| fn_eoe -> 'fn' : '$1'. | ||||
| fn_eoe -> 'fn' eoe : '$1'. | ||||
|  | ||||
| do_eoe -> 'do' : '$1'. | ||||
| do_eoe -> 'do' eoe : '$1'. | ||||
|  | ||||
| end_eoe -> 'end' : '$1'. | ||||
| end_eoe -> eoe 'end' : '$2'. | ||||
|  | ||||
| block_eoe -> block_identifier : '$1'. | ||||
| block_eoe -> block_identifier eoe : '$1'. | ||||
|  | ||||
| stab -> stab_expr : ['$1']. | ||||
| stab -> stab eoe stab_expr : ['$3'|'$1']. | ||||
|  | ||||
| stab_eoe -> stab : '$1'. | ||||
| stab_eoe -> stab eoe : '$1'. | ||||
|  | ||||
| %% Here, `element(1, Token)` is the stab operator, | ||||
| %% while `element(2, Token)` is the expression. | ||||
| stab_expr -> expr : | ||||
|                '$1'. | ||||
| stab_expr -> stab_op_eol_and_expr : | ||||
|                build_op(element(1, '$1'), [], element(2, '$1')). | ||||
| stab_expr -> empty_paren stab_op_eol_and_expr : | ||||
|                build_op(element(1, '$2'), [], element(2, '$2')). | ||||
| stab_expr -> call_args_no_parens_all stab_op_eol_and_expr : | ||||
|                build_op(element(1, '$2'), unwrap_when(unwrap_splice('$1')), element(2, '$2')). | ||||
| stab_expr -> stab_parens_many stab_op_eol_and_expr : | ||||
|                build_op(element(1, '$2'), unwrap_splice('$1'), element(2, '$2')). | ||||
| stab_expr -> stab_parens_many when_op expr stab_op_eol_and_expr : | ||||
|                build_op(element(1, '$4'), [{'when', meta_from_token('$2'), unwrap_splice('$1') ++ ['$3']}], element(2, '$4')). | ||||
|  | ||||
| stab_op_eol_and_expr -> stab_op_eol expr : {'$1', '$2'}. | ||||
| stab_op_eol_and_expr -> stab_op_eol : warn_empty_stab_clause('$1'), {'$1', nil}. | ||||
|  | ||||
| block_item -> block_eoe stab_eoe : {?exprs('$1'), build_stab(reverse('$2'))}. | ||||
| block_item -> block_eoe : {?exprs('$1'), nil}. | ||||
|  | ||||
| block_list -> block_item : ['$1']. | ||||
| block_list -> block_item block_list : ['$1'|'$2']. | ||||
|  | ||||
| %% Helpers | ||||
|  | ||||
| open_paren -> '('      : '$1'. | ||||
| open_paren -> '(' eol  : '$1'. | ||||
| close_paren -> ')'     : '$1'. | ||||
| close_paren -> eol ')' : '$2'. | ||||
|  | ||||
| empty_paren -> open_paren ')' : '$1'. | ||||
|  | ||||
| open_bracket  -> '['     : '$1'. | ||||
| open_bracket  -> '[' eol : '$1'. | ||||
| close_bracket -> ']'     : '$1'. | ||||
| close_bracket -> eol ']' : '$2'. | ||||
|  | ||||
| open_bit  -> '<<'     : '$1'. | ||||
| open_bit  -> '<<' eol : '$1'. | ||||
| close_bit -> '>>'     : '$1'. | ||||
| close_bit -> eol '>>' : '$2'. | ||||
|  | ||||
| open_curly  -> '{'     : '$1'. | ||||
| open_curly  -> '{' eol : '$1'. | ||||
| close_curly -> '}'     : '$1'. | ||||
| close_curly -> eol '}' : '$2'. | ||||
|  | ||||
| % Operators | ||||
|  | ||||
| add_op_eol -> add_op : '$1'. | ||||
| add_op_eol -> add_op eol : '$1'. | ||||
| add_op_eol -> dual_op : '$1'. | ||||
| add_op_eol -> dual_op eol : '$1'. | ||||
|  | ||||
| mult_op_eol -> mult_op : '$1'. | ||||
| mult_op_eol -> mult_op eol : '$1'. | ||||
|  | ||||
| two_op_eol -> two_op : '$1'. | ||||
| two_op_eol -> two_op eol : '$1'. | ||||
|  | ||||
| three_op_eol -> three_op : '$1'. | ||||
| three_op_eol -> three_op eol : '$1'. | ||||
|  | ||||
| pipe_op_eol -> pipe_op : '$1'. | ||||
| pipe_op_eol -> pipe_op eol : '$1'. | ||||
|  | ||||
| capture_op_eol -> capture_op : '$1'. | ||||
| capture_op_eol -> capture_op eol : '$1'. | ||||
|  | ||||
| unary_op_eol -> unary_op : '$1'. | ||||
| unary_op_eol -> unary_op eol : '$1'. | ||||
| unary_op_eol -> dual_op : '$1'. | ||||
| unary_op_eol -> dual_op eol : '$1'. | ||||
|  | ||||
| match_op_eol -> match_op : '$1'. | ||||
| match_op_eol -> match_op eol : '$1'. | ||||
|  | ||||
| and_op_eol -> and_op : '$1'. | ||||
| and_op_eol -> and_op eol : '$1'. | ||||
|  | ||||
| or_op_eol -> or_op : '$1'. | ||||
| or_op_eol -> or_op eol : '$1'. | ||||
|  | ||||
| in_op_eol -> in_op : '$1'. | ||||
| in_op_eol -> in_op eol : '$1'. | ||||
|  | ||||
| in_match_op_eol -> in_match_op : '$1'. | ||||
| in_match_op_eol -> in_match_op eol : '$1'. | ||||
|  | ||||
| type_op_eol -> type_op : '$1'. | ||||
| type_op_eol -> type_op eol : '$1'. | ||||
|  | ||||
| when_op_eol -> when_op : '$1'. | ||||
| when_op_eol -> when_op eol : '$1'. | ||||
|  | ||||
| stab_op_eol -> stab_op : '$1'. | ||||
| stab_op_eol -> stab_op eol : '$1'. | ||||
|  | ||||
| at_op_eol -> at_op : '$1'. | ||||
| at_op_eol -> at_op eol : '$1'. | ||||
|  | ||||
| comp_op_eol -> comp_op : '$1'. | ||||
| comp_op_eol -> comp_op eol : '$1'. | ||||
|  | ||||
| rel_op_eol -> rel_op : '$1'. | ||||
| rel_op_eol -> rel_op eol : '$1'. | ||||
|  | ||||
| arrow_op_eol -> arrow_op : '$1'. | ||||
| arrow_op_eol -> arrow_op eol : '$1'. | ||||
|  | ||||
| % Dot operator | ||||
|  | ||||
| dot_op -> '.' : '$1'. | ||||
| dot_op -> '.' eol : '$1'. | ||||
|  | ||||
| dot_identifier -> identifier : '$1'. | ||||
| dot_identifier -> matched_expr dot_op identifier : build_dot('$2', '$1', '$3'). | ||||
|  | ||||
| dot_alias -> aliases : {'__aliases__', meta_from_token('$1', 0), ?exprs('$1')}. | ||||
| dot_alias -> matched_expr dot_op aliases : build_dot_alias('$2', '$1', '$3'). | ||||
| dot_alias -> matched_expr dot_op dot_alias_container : build_dot_container('$2', '$1', '$3'). | ||||
|  | ||||
| dot_alias_container -> open_curly '}' : []. | ||||
| dot_alias_container -> open_curly container_args close_curly : '$2'. | ||||
|  | ||||
| dot_op_identifier -> op_identifier : '$1'. | ||||
| dot_op_identifier -> matched_expr dot_op op_identifier : build_dot('$2', '$1', '$3'). | ||||
|  | ||||
| dot_do_identifier -> do_identifier : '$1'. | ||||
| dot_do_identifier -> matched_expr dot_op do_identifier : build_dot('$2', '$1', '$3'). | ||||
|  | ||||
| dot_bracket_identifier -> bracket_identifier : '$1'. | ||||
| dot_bracket_identifier -> matched_expr dot_op bracket_identifier : build_dot('$2', '$1', '$3'). | ||||
|  | ||||
| dot_paren_identifier -> paren_identifier : '$1'. | ||||
| dot_paren_identifier -> matched_expr dot_op paren_identifier : build_dot('$2', '$1', '$3'). | ||||
|  | ||||
| parens_call -> dot_paren_identifier : '$1'. | ||||
| parens_call -> matched_expr dot_call_op : {'.', meta_from_token('$2'), ['$1']}. % Fun/local calls | ||||
|  | ||||
| % Function calls with no parentheses | ||||
|  | ||||
| call_args_no_parens_expr -> matched_expr : '$1'. | ||||
| call_args_no_parens_expr -> no_parens_expr : throw_no_parens_many_strict('$1'). | ||||
|  | ||||
| call_args_no_parens_comma_expr -> matched_expr ',' call_args_no_parens_expr : ['$3', '$1']. | ||||
| call_args_no_parens_comma_expr -> call_args_no_parens_comma_expr ',' call_args_no_parens_expr : ['$3'|'$1']. | ||||
|  | ||||
| call_args_no_parens_all -> call_args_no_parens_one : '$1'. | ||||
| call_args_no_parens_all -> call_args_no_parens_ambig : '$1'. | ||||
| call_args_no_parens_all -> call_args_no_parens_many : '$1'. | ||||
|  | ||||
| call_args_no_parens_one -> call_args_no_parens_kw : ['$1']. | ||||
| call_args_no_parens_one -> matched_expr : ['$1']. | ||||
|  | ||||
| call_args_no_parens_ambig -> no_parens_expr : ['$1']. | ||||
|  | ||||
| call_args_no_parens_many -> matched_expr ',' call_args_no_parens_kw : ['$1', '$3']. | ||||
| call_args_no_parens_many -> call_args_no_parens_comma_expr : reverse('$1'). | ||||
| call_args_no_parens_many -> call_args_no_parens_comma_expr ',' call_args_no_parens_kw : reverse(['$3'|'$1']). | ||||
|  | ||||
| call_args_no_parens_many_strict -> call_args_no_parens_many : '$1'. | ||||
| call_args_no_parens_many_strict -> open_paren call_args_no_parens_kw close_paren : throw_no_parens_strict('$1'). | ||||
| call_args_no_parens_many_strict -> open_paren call_args_no_parens_many close_paren : throw_no_parens_strict('$1'). | ||||
|  | ||||
| stab_parens_many -> open_paren call_args_no_parens_kw close_paren : ['$2']. | ||||
| stab_parens_many -> open_paren call_args_no_parens_many close_paren : '$2'. | ||||
|  | ||||
| % Containers | ||||
|  | ||||
| container_expr -> matched_expr : '$1'. | ||||
| container_expr -> unmatched_expr : '$1'. | ||||
| container_expr -> no_parens_expr : throw_no_parens_container_strict('$1'). | ||||
|  | ||||
| container_args_base -> container_expr : ['$1']. | ||||
| container_args_base -> container_args_base ',' container_expr : ['$3'|'$1']. | ||||
|  | ||||
| container_args -> container_args_base : lists:reverse('$1'). | ||||
| container_args -> container_args_base ',' : lists:reverse('$1'). | ||||
| container_args -> container_args_base ',' kw : lists:reverse(['$3'|'$1']). | ||||
|  | ||||
| % Function calls with parentheses | ||||
|  | ||||
| call_args_parens_expr -> matched_expr : '$1'. | ||||
| call_args_parens_expr -> unmatched_expr : '$1'. | ||||
| call_args_parens_expr -> no_parens_expr : throw_no_parens_many_strict('$1'). | ||||
|  | ||||
| call_args_parens_base -> call_args_parens_expr : ['$1']. | ||||
| call_args_parens_base -> call_args_parens_base ',' call_args_parens_expr : ['$3'|'$1']. | ||||
|  | ||||
| call_args_parens -> empty_paren : []. | ||||
| call_args_parens -> open_paren no_parens_expr close_paren : ['$2']. | ||||
| call_args_parens -> open_paren kw close_paren : ['$2']. | ||||
| call_args_parens -> open_paren call_args_parens_base close_paren : reverse('$2'). | ||||
| call_args_parens -> open_paren call_args_parens_base ',' kw close_paren : reverse(['$4'|'$2']). | ||||
|  | ||||
| % KV | ||||
|  | ||||
| kw_eol -> kw_identifier : ?exprs('$1'). | ||||
| kw_eol -> kw_identifier eol : ?exprs('$1'). | ||||
| kw_eol -> kw_identifier_safe : build_quoted_atom('$1', true). | ||||
| kw_eol -> kw_identifier_safe eol : build_quoted_atom('$1', true). | ||||
| kw_eol -> kw_identifier_unsafe : build_quoted_atom('$1', false). | ||||
| kw_eol -> kw_identifier_unsafe eol : build_quoted_atom('$1', false). | ||||
|  | ||||
| kw_base -> kw_eol container_expr : [{'$1', '$2'}]. | ||||
| kw_base -> kw_base ',' kw_eol container_expr : [{'$3', '$4'}|'$1']. | ||||
|  | ||||
| kw -> kw_base : reverse('$1'). | ||||
| kw -> kw_base ',' : reverse('$1'). | ||||
|  | ||||
| call_args_no_parens_kw_expr -> kw_eol matched_expr : {'$1', '$2'}. | ||||
| call_args_no_parens_kw_expr -> kw_eol no_parens_expr : {'$1', '$2'}. | ||||
|  | ||||
| call_args_no_parens_kw -> call_args_no_parens_kw_expr : ['$1']. | ||||
| call_args_no_parens_kw -> call_args_no_parens_kw_expr ',' call_args_no_parens_kw : ['$1'|'$3']. | ||||
|  | ||||
| % Lists | ||||
|  | ||||
| list_args -> kw : '$1'. | ||||
| list_args -> container_args_base : reverse('$1'). | ||||
| list_args -> container_args_base ',' : reverse('$1'). | ||||
| list_args -> container_args_base ',' kw : reverse('$1', '$3'). | ||||
|  | ||||
| list -> open_bracket ']' : build_list('$1', []). | ||||
| list -> open_bracket list_args close_bracket : build_list('$1', '$2'). | ||||
|  | ||||
| % Tuple | ||||
|  | ||||
| tuple -> open_curly '}' : build_tuple('$1', []). | ||||
| tuple -> open_curly container_args close_curly :  build_tuple('$1', '$2'). | ||||
|  | ||||
| % Bitstrings | ||||
|  | ||||
| bit_string -> open_bit '>>' : build_bit('$1', []). | ||||
| bit_string -> open_bit container_args close_bit : build_bit('$1', '$2'). | ||||
|  | ||||
| % Map and structs | ||||
|  | ||||
| %% Allow unquote/@something/aliases inside maps and structs. | ||||
| map_expr -> max_expr : '$1'. | ||||
| map_expr -> dot_identifier : build_identifier('$1', nil). | ||||
| map_expr -> at_op_eol map_expr : build_unary_op('$1', '$2'). | ||||
|  | ||||
| assoc_op_eol -> assoc_op : '$1'. | ||||
| assoc_op_eol -> assoc_op eol : '$1'. | ||||
|  | ||||
| assoc_expr -> matched_expr assoc_op_eol matched_expr : {'$1', '$3'}. | ||||
| assoc_expr -> unmatched_expr assoc_op_eol unmatched_expr : {'$1', '$3'}. | ||||
| assoc_expr -> matched_expr assoc_op_eol unmatched_expr : {'$1', '$3'}. | ||||
| assoc_expr -> unmatched_expr assoc_op_eol matched_expr : {'$1', '$3'}. | ||||
| assoc_expr -> map_expr : '$1'. | ||||
|  | ||||
| assoc_update -> matched_expr pipe_op_eol assoc_expr : {'$2', '$1', ['$3']}. | ||||
| assoc_update -> unmatched_expr pipe_op_eol assoc_expr : {'$2', '$1', ['$3']}. | ||||
|  | ||||
| assoc_update_kw -> matched_expr pipe_op_eol kw : {'$2', '$1', '$3'}. | ||||
| assoc_update_kw -> unmatched_expr pipe_op_eol kw : {'$2', '$1', '$3'}. | ||||
|  | ||||
| assoc_base -> assoc_expr : ['$1']. | ||||
| assoc_base -> assoc_base ',' assoc_expr : ['$3'|'$1']. | ||||
|  | ||||
| assoc -> assoc_base : reverse('$1'). | ||||
| assoc -> assoc_base ',' : reverse('$1'). | ||||
|  | ||||
| map_op -> '%{}' : '$1'. | ||||
| map_op -> '%{}' eol : '$1'. | ||||
|  | ||||
| map_close -> kw close_curly : '$1'. | ||||
| map_close -> assoc close_curly : '$1'. | ||||
| map_close -> assoc_base ',' kw close_curly : reverse('$1', '$3'). | ||||
|  | ||||
| map_args -> open_curly '}' : build_map('$1', []). | ||||
| map_args -> open_curly map_close : build_map('$1', '$2'). | ||||
| map_args -> open_curly assoc_update close_curly : build_map_update('$1', '$2', []). | ||||
| map_args -> open_curly assoc_update ',' close_curly : build_map_update('$1', '$2', []). | ||||
| map_args -> open_curly assoc_update ',' map_close : build_map_update('$1', '$2', '$4'). | ||||
| map_args -> open_curly assoc_update_kw close_curly : build_map_update('$1', '$2', []). | ||||
|  | ||||
| struct_op -> '%' : '$1'. | ||||
|  | ||||
| map -> map_op map_args : '$2'. | ||||
| map -> struct_op map_expr map_args : {'%', meta_from_token('$1'), ['$2', '$3']}. | ||||
| map -> struct_op map_expr eol map_args : {'%', meta_from_token('$1'), ['$2', '$4']}. | ||||
|  | ||||
| Erlang code. | ||||
|  | ||||
| -define(file(), get(elixir_parser_file)). | ||||
| -define(id(Token), element(1, Token)). | ||||
| -define(location(Token), element(2, Token)). | ||||
| -define(exprs(Token), element(3, Token)). | ||||
| -define(meta(Node), element(2, Node)). | ||||
| -define(rearrange_uop(Op), (Op == 'not' orelse Op == '!')). | ||||
|  | ||||
| %% The following directive is needed for (significantly) faster | ||||
| %% compilation of the generated .erl file by the HiPE compiler | ||||
| -compile([{hipe, [{regalloc, linear_scan}]}]). | ||||
| -import(lists, [reverse/1, reverse/2]). | ||||
|  | ||||
| meta_from_token(Token, Counter) -> [{counter, Counter}|meta_from_token(Token)]. | ||||
| meta_from_token(Token) -> meta_from_location(?location(Token)). | ||||
|  | ||||
| meta_from_location({Line, Column, EndColumn}) | ||||
|   when is_integer(Line), is_integer(Column), is_integer(EndColumn) -> [{line, Line}]. | ||||
|  | ||||
| %% Operators | ||||
|  | ||||
| build_op({_Kind, Location, 'in'}, {UOp, _, [Left]}, Right) when ?rearrange_uop(UOp) -> | ||||
|   {UOp, meta_from_location(Location), [{'in', meta_from_location(Location), [Left, Right]}]}; | ||||
|  | ||||
| build_op({_Kind, Location, Op}, Left, Right) -> | ||||
|   {Op, meta_from_location(Location), [Left, Right]}. | ||||
|  | ||||
| build_unary_op({_Kind, Location, Op}, Expr) -> | ||||
|   {Op, meta_from_location(Location), [Expr]}. | ||||
|  | ||||
| build_list(Marker, Args) -> | ||||
|   {Args, ?location(Marker)}. | ||||
|  | ||||
| build_tuple(_Marker, [Left, Right]) -> | ||||
|   {Left, Right}; | ||||
| build_tuple(Marker, Args) -> | ||||
|   {'{}', meta_from_token(Marker), Args}. | ||||
|  | ||||
| build_bit(Marker, Args) -> | ||||
|   {'<<>>', meta_from_token(Marker), Args}. | ||||
|  | ||||
| build_map(Marker, Args) -> | ||||
|   {'%{}', meta_from_token(Marker), Args}. | ||||
|  | ||||
| build_map_update(Marker, {Pipe, Left, Right}, Extra) -> | ||||
|   {'%{}', meta_from_token(Marker), [build_op(Pipe, Left, Right ++ Extra)]}. | ||||
|  | ||||
| %% Blocks | ||||
|  | ||||
| build_block([{Op, _, [_]}]=Exprs) when ?rearrange_uop(Op) -> {'__block__', [], Exprs}; | ||||
| build_block([{unquote_splicing, _, Args}]=Exprs) when | ||||
|                                       length(Args) =< 2 -> {'__block__', [], Exprs}; | ||||
| build_block([Expr])                                     -> Expr; | ||||
| build_block(Exprs)                                      -> {'__block__', [], Exprs}. | ||||
|  | ||||
| %% Dots | ||||
|  | ||||
| build_dot_alias(Dot, {'__aliases__', _, Left}, {'aliases', _, Right}) -> | ||||
|   {'__aliases__', meta_from_token(Dot), Left ++ Right}; | ||||
|  | ||||
| build_dot_alias(_Dot, Atom, {'aliases', _, _} = Token) when is_atom(Atom) -> | ||||
|   throw_bad_atom(Token); | ||||
|  | ||||
| build_dot_alias(Dot, Other, {'aliases', _, Right}) -> | ||||
|   {'__aliases__', meta_from_token(Dot), [Other|Right]}. | ||||
|  | ||||
| build_dot_container(Dot, Left, Right) -> | ||||
|   Meta = meta_from_token(Dot), | ||||
|   {{'.', Meta, [Left, '{}']}, Meta, Right}. | ||||
|  | ||||
| build_dot(Dot, Left, Right) -> | ||||
|   {'.', meta_from_token(Dot), [Left, extract_identifier(Right)]}. | ||||
|  | ||||
| extract_identifier({Kind, _, Identifier}) when | ||||
|     Kind == identifier; Kind == bracket_identifier; Kind == paren_identifier; | ||||
|     Kind == do_identifier; Kind == op_identifier -> | ||||
|   Identifier. | ||||
|  | ||||
| %% Identifiers | ||||
|  | ||||
| build_nested_parens(Dot, Args1, Args2) -> | ||||
|   Identifier = build_identifier(Dot, Args1), | ||||
|   Meta = ?meta(Identifier), | ||||
|   {Identifier, Meta, Args2}. | ||||
|  | ||||
| build_identifier({'.', Meta, _} = Dot, Args) -> | ||||
|   FArgs = case Args of | ||||
|     nil -> []; | ||||
|     _ -> Args | ||||
|   end, | ||||
|   {Dot, Meta, FArgs}; | ||||
|  | ||||
| build_identifier({op_identifier, Location, Identifier}, [Arg]) -> | ||||
|   {Identifier, [{ambiguous_op, nil}|meta_from_location(Location)], [Arg]}; | ||||
|  | ||||
| build_identifier({_, Location, Identifier}, Args) -> | ||||
|   {Identifier, meta_from_location(Location), Args}. | ||||
|  | ||||
| %% Fn | ||||
|  | ||||
| build_fn(Op, [{'->', _, [_, _]}|_] = Stab) -> | ||||
|   {fn, meta_from_token(Op), build_stab(Stab)}; | ||||
| build_fn(Op, _Stab) -> | ||||
|   throw(meta_from_token(Op), "expected clauses to be defined with -> inside: ", "'fn'"). | ||||
|  | ||||
| %% Access | ||||
|  | ||||
| build_access(Expr, {List, Location}) -> | ||||
|   Meta = meta_from_location(Location), | ||||
|   {{'.', Meta, ['Elixir.Access', get]}, Meta, [Expr, List]}. | ||||
|  | ||||
| %% Interpolation aware | ||||
|  | ||||
| build_sigil({sigil, Location, Sigil, Parts, Modifiers}) -> | ||||
|   Meta = meta_from_location(Location), | ||||
|   {list_to_atom("sigil_" ++ [Sigil]), Meta, [{'<<>>', Meta, string_parts(Parts)}, Modifiers]}. | ||||
|  | ||||
| build_bin_string({bin_string, _Location, [H]}) when is_binary(H) -> | ||||
|   H; | ||||
| build_bin_string({bin_string, Location, Args}) -> | ||||
|   {'<<>>', meta_from_location(Location), string_parts(Args)}. | ||||
|  | ||||
| build_list_string({list_string, _Location, [H]}) when is_binary(H) -> | ||||
|   elixir_utils:characters_to_list(H); | ||||
| build_list_string({list_string, Location, Args}) -> | ||||
|   Meta = meta_from_location(Location), | ||||
|   {{'.', Meta, ['Elixir.String', to_char_list]}, Meta, [{'<<>>', Meta, string_parts(Args)}]}. | ||||
|  | ||||
| build_quoted_atom({_, _Location, [H]}, Safe) when is_binary(H) -> | ||||
|   Op = binary_to_atom_op(Safe), erlang:Op(H, utf8); | ||||
| build_quoted_atom({_, Location, Args}, Safe) -> | ||||
|   Meta = meta_from_location(Location), | ||||
|   {{'.', Meta, [erlang, binary_to_atom_op(Safe)]}, Meta, [{'<<>>', Meta, string_parts(Args)}, utf8]}. | ||||
|  | ||||
| binary_to_atom_op(true)  -> binary_to_existing_atom; | ||||
| binary_to_atom_op(false) -> binary_to_atom. | ||||
|  | ||||
| string_parts(Parts) -> | ||||
|   [string_part(Part) || Part <- Parts]. | ||||
| string_part(Binary) when is_binary(Binary) -> | ||||
|   Binary; | ||||
| string_part({Location, Tokens}) -> | ||||
|   Form = string_tokens_parse(Tokens), | ||||
|   Meta = meta_from_location(Location), | ||||
|   {'::', Meta, [{{'.', Meta, ['Elixir.Kernel', to_string]}, Meta, [Form]}, {binary, Meta, nil}]}. | ||||
|  | ||||
| string_tokens_parse(Tokens) -> | ||||
|   case parse(Tokens) of | ||||
|     {ok, Forms} -> Forms; | ||||
|     {error, _} = Error -> throw(Error) | ||||
|   end. | ||||
|  | ||||
| %% Keywords | ||||
|  | ||||
| build_stab([{'->', Meta, [Left, Right]}|T]) -> | ||||
|   build_stab(Meta, T, Left, [Right], []); | ||||
|  | ||||
| build_stab(Else) -> | ||||
|   build_block(Else). | ||||
|  | ||||
| build_stab(Old, [{'->', New, [Left, Right]}|T], Marker, Temp, Acc) -> | ||||
|   H = {'->', Old, [Marker, build_block(reverse(Temp))]}, | ||||
|   build_stab(New, T, Left, [Right], [H|Acc]); | ||||
|  | ||||
| build_stab(Meta, [H|T], Marker, Temp, Acc) -> | ||||
|   build_stab(Meta, T, Marker, [H|Temp], Acc); | ||||
|  | ||||
| build_stab(Meta, [], Marker, Temp, Acc) -> | ||||
|   H = {'->', Meta, [Marker, build_block(reverse(Temp))]}, | ||||
|   reverse([H|Acc]). | ||||
|  | ||||
| %% Every time the parser sees a (unquote_splicing()) | ||||
| %% it assumes that a block is being spliced, wrapping | ||||
| %% the splicing in a __block__. But in the stab clause, | ||||
| %% we can have (unquote_splicing(1, 2, 3)) -> :ok, in such | ||||
| %% case, we don't actually want the block, since it is | ||||
| %% an arg style call. unwrap_splice unwraps the splice | ||||
| %% from such blocks. | ||||
| unwrap_splice([{'__block__', [], [{unquote_splicing, _, _}] = Splice}]) -> | ||||
|   Splice; | ||||
|  | ||||
| unwrap_splice(Other) -> Other. | ||||
|  | ||||
| unwrap_when(Args) -> | ||||
|   case elixir_utils:split_last(Args) of | ||||
|     {Start, {'when', Meta, [_, _] = End}} -> | ||||
|       [{'when', Meta, Start ++ End}]; | ||||
|     {_, _} -> | ||||
|       Args | ||||
|   end. | ||||
|  | ||||
| to_block([One]) -> One; | ||||
| to_block(Other) -> {'__block__', [], reverse(Other)}. | ||||
|  | ||||
| %% Warnings and errors | ||||
|  | ||||
| throw(Meta, Error, Token) -> | ||||
|   Line = | ||||
|     case lists:keyfind(line, 1, Meta) of | ||||
|       {line, L} -> L; | ||||
|       false -> 0 | ||||
|     end, | ||||
|   throw({error, {Line, ?MODULE, [Error, Token]}}). | ||||
|  | ||||
| throw_bad_atom(Token) -> | ||||
|   throw(meta_from_token(Token), "atom cannot be followed by an alias. If the '.' was meant to be " | ||||
|     "part of the atom's name, the atom name must be quoted. Syntax error before: ", "'.'"). | ||||
|  | ||||
| throw_no_parens_strict(Token) -> | ||||
|   throw(meta_from_token(Token), "unexpected parentheses. If you are making a " | ||||
|     "function call, do not insert spaces between the function name and the " | ||||
|     "opening parentheses. Syntax error before: ", "'('"). | ||||
|  | ||||
| throw_no_parens_many_strict(Node) -> | ||||
|   throw(?meta(Node), | ||||
|     "unexpected comma. Parentheses are required to solve ambiguity in nested calls.\n\n" | ||||
|     "This error happens when you have nested function calls without parentheses. " | ||||
|     "For example:\n\n" | ||||
|     "    one a, two b, c, d\n\n" | ||||
|     "In the example above, we don't know if the parameters \"c\" and \"d\" apply " | ||||
|     "to the function \"one\" or \"two\". You can solve this by explicitly adding " | ||||
|     "parentheses:\n\n" | ||||
|     "    one a, two(b, c, d)\n\n" | ||||
|     "Elixir cannot compile otherwise. Syntax error before: ", "','"). | ||||
|  | ||||
| throw_no_parens_container_strict(Node) -> | ||||
|   throw(?meta(Node), | ||||
|     "unexpected comma. Parentheses are required to solve ambiguity inside containers.\n\n" | ||||
|     "This error may happen when you forget a comma in a list or other container:\n\n" | ||||
|     "    [a, b c, d]\n\n" | ||||
|     "Or when you have ambiguous calls:\n\n" | ||||
|     "    [one, two three, four, five]\n\n" | ||||
|     "In the example above, we don't know if the parameters \"four\" and \"five\" " | ||||
|     "belongs to the list or the function \"two\". You can solve this by explicitly " | ||||
|     "adding parentheses:\n\n" | ||||
|     "    [one, two(three, four), five]\n\n" | ||||
|     "Elixir cannot compile otherwise. Syntax error before: ", "','"). | ||||
|  | ||||
| throw_invalid_kw_identifier({_, _, do} = Token) -> | ||||
|   throw(meta_from_token(Token), elixir_tokenizer:invalid_do_error("unexpected keyword \"do:\""), "'do:'"); | ||||
| throw_invalid_kw_identifier({_, _, KW} = Token) -> | ||||
|   throw(meta_from_token(Token), "syntax error before: ", "'" ++ atom_to_list(KW) ++ "':"). | ||||
|  | ||||
| %% TODO: Make those warnings errors. | ||||
| warn_empty_stab_clause({stab_op, {Line, _Begin, _End}, '->'}) -> | ||||
|   elixir_errors:warn(Line, ?file(), | ||||
|     "an expression is always required on the right side of ->. " | ||||
|     "Please provide a value after ->"). | ||||
|  | ||||
| warn_pipe({arrow_op, {Line, _Begin, _End}, Op}, {_, [_|_], [_|_]}) -> | ||||
|   elixir_errors:warn(Line, ?file(), | ||||
|     io_lib:format( | ||||
|       "you are piping into a function call without parentheses, which may be ambiguous. " | ||||
|       "Please wrap the function you are piping into in parentheses. For example:\n\n" | ||||
|       "    foo 1 ~ts bar 2 ~ts baz 3\n\n" | ||||
|       "Should be written as:\n\n" | ||||
|       "    foo(1) ~ts bar(2) ~ts baz(3)\n", | ||||
|       [Op, Op, Op, Op] | ||||
|     ) | ||||
|   ); | ||||
| warn_pipe(_Token, _) -> | ||||
|   ok. | ||||
							
								
								
									
										256
									
								
								samples/Erlang/lfe_scan.xrl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										256
									
								
								samples/Erlang/lfe_scan.xrl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,256 @@ | ||||
| %% Copyright (c) 2008-2013 Robert Virding | ||||
| %% | ||||
| %% 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. | ||||
|  | ||||
| %% File    : lfe_scan.xrl | ||||
| %% Author  : Robert Virding | ||||
| %% Purpose : Token definitions for Lisp Flavoured Erlang. | ||||
|  | ||||
| Definitions. | ||||
| B    = [01] | ||||
| O    = [0-7] | ||||
| D    = [0-9] | ||||
| H    = [0-9a-fA-F] | ||||
| B36  = [0-9a-zA-Z] | ||||
| U    = [A-Z] | ||||
| L    = [a-z] | ||||
| A    = ({U}|{L}) | ||||
| DEL  = [][()}{";\000-\s] | ||||
| SYM  = [^][()}{";\000-\s\177-\237] | ||||
| SSYM = [^][()}{"|;#`',\000-\s\177-\237] | ||||
| WS   = ([\000-\s]|;[^\n]*) | ||||
|  | ||||
| Rules. | ||||
| %% Bracketed Comments using #| foo |# | ||||
| #{D}*\|[^\|]*\|+([^#\|][^\|]*\|+)*# : | ||||
|         block_comment(string:substr(TokenChars, 3)). | ||||
|  | ||||
| %% Separators | ||||
| '               :    {token,{'\'',TokenLine}}. | ||||
| `               :    {token,{'`',TokenLine}}. | ||||
| ,               :    {token,{',',TokenLine}}. | ||||
| ,@              :    {token,{',@',TokenLine}}. | ||||
| \.              :    {token,{'.',TokenLine}}. | ||||
| [][()}{]        :    {token,{list_to_atom(TokenChars),TokenLine}}. | ||||
|  | ||||
| #{D}*[bB]\(     :    {token,{'#B(',TokenLine}}. | ||||
| #{D}*[mM]\(     :    {token,{'#M(',TokenLine}}. | ||||
| #{D}*\(         :    {token,{'#(',TokenLine}}. | ||||
| #{D}*\.         :    {token,{'#.',TokenLine}}. | ||||
|  | ||||
| #{D}*`          :    {token,{'#`',TokenLine}}. | ||||
| #{D}*;          :    {token,{'#;',TokenLine}}. | ||||
| #{D}*,          :    {token,{'#,',TokenLine}}. | ||||
| #{D}*,@         :    {token,{'#,@',TokenLine}}. | ||||
|  | ||||
| %% Characters | ||||
| #{D}*\\(x{H}+|.) :   char_token(skip_past(TokenChars, $\\, $\\), TokenLine). | ||||
|  | ||||
| %% Based numbers | ||||
| #{D}*\*{SYM}+   :    base_token(skip_past(TokenChars, $*, $*), 2, TokenLine). | ||||
| #{D}*[bB]{SYM}+ :    base_token(skip_past(TokenChars, $b, $B), 2, TokenLine). | ||||
| #{D}*[oO]{SYM}+ :    base_token(skip_past(TokenChars, $o, $O), 8, TokenLine). | ||||
| #{D}*[dD]{SYM}+ :    base_token(skip_past(TokenChars, $d, $D), 10, TokenLine). | ||||
| #{D}*[xX]{SYM}+ :    base_token(skip_past(TokenChars, $x, $X), 16, TokenLine). | ||||
| #{D}*[rR]{SYM}+ : | ||||
|         %% Scan over digit chars to get base. | ||||
|         {Base,[_|Ds]} = base1(tl(TokenChars), 10, 0), | ||||
|         base_token(Ds, Base, TokenLine). | ||||
|  | ||||
| %% String | ||||
| "(\\x{H}+;|\\.|[^"\\])*" : | ||||
|         %% Strip quotes. | ||||
|         S = string:substr(TokenChars, 2, TokenLen - 2), | ||||
|         {token,{string,TokenLine,chars(S)}}. | ||||
| %% Binary string | ||||
| #"(\\x{H}+;|\\.|[^"\\])*" : | ||||
|         %% Strip quotes. | ||||
|         S = string:substr(TokenChars, 3, TokenLen - 3), | ||||
|         Bin = unicode:characters_to_binary(chars(S), utf8, utf8), | ||||
|         {token,{binary,TokenLine,Bin}}. | ||||
| %% Symbols | ||||
| \|(\\x{H}+;|\\.|[^|\\])*\| : | ||||
|         %% Strip quotes. | ||||
|         S = string:substr(TokenChars, 2, TokenLen - 2), | ||||
|         symbol_token(chars(S), TokenLine). | ||||
| %% Funs | ||||
| #'{SSYM}{SYM}*/{D}+ : | ||||
|         %% Strip sharpsign single-quote. | ||||
|         FunStr = string:substr(TokenChars,3), | ||||
|         {token,{'#\'',TokenLine,FunStr}}. | ||||
| %% Atoms | ||||
| [+-]?{D}+       : | ||||
|         case catch {ok,list_to_integer(TokenChars)} of | ||||
|             {ok,I} -> {token,{number,TokenLine,I}}; | ||||
|             _ -> {error,"illegal integer"} | ||||
|         end. | ||||
| [+-]?{D}+\.{D}+([eE][+-]?{D}+)? : | ||||
|         case catch {ok,list_to_float(TokenChars)} of | ||||
|             {ok,F} -> {token,{number,TokenLine,F}}; | ||||
|             _ -> {error,"illegal float"} | ||||
|         end. | ||||
| {SSYM}{SYM}*    : | ||||
|         symbol_token(TokenChars, TokenLine). | ||||
| {WS}+           :    skip_token. | ||||
|  | ||||
| Erlang code. | ||||
| %% Copyright (c) 2008-2013 Robert Virding | ||||
| %% | ||||
| %% 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. | ||||
|  | ||||
| %% File    : lfe_scan.erl | ||||
| %% Author  : Robert Virding | ||||
| %% Purpose : Token definitions for Lisp Flavoured Erlang. | ||||
|  | ||||
| -export([start_symbol_char/1,symbol_char/1]). | ||||
|  | ||||
| -import(string, [substr/2,substr/3]). | ||||
|  | ||||
| %% start_symbol_char(Char) -> true | false. | ||||
| %% symbol_char(Char) -> true | false. | ||||
| %%  Define start symbol chars and symbol chars. | ||||
|  | ||||
| start_symbol_char($#) -> false; | ||||
| start_symbol_char($`) -> false; | ||||
| start_symbol_char($') -> false;                 %' | ||||
| start_symbol_char($,) -> false; | ||||
| start_symbol_char($|) -> false;                 %Symbol quote character | ||||
| start_symbol_char(C) -> symbol_char(C). | ||||
|  | ||||
| symbol_char($() -> false; | ||||
| symbol_char($)) -> false; | ||||
| symbol_char($[) -> false; | ||||
| symbol_char($]) -> false; | ||||
| symbol_char(${) -> false; | ||||
| symbol_char($}) -> false; | ||||
| symbol_char($") -> false; | ||||
| symbol_char($;) -> false; | ||||
| symbol_char(C) -> ((C > $\s) and (C =< $~)) orelse (C > $\240). | ||||
|  | ||||
| %% symbol_token(Chars, Line) -> {token,{symbol,Line,Symbol}} | {error,E}. | ||||
| %%  Build a symbol from list of legal characters, else error. | ||||
|  | ||||
| symbol_token(Cs, L) -> | ||||
|     case catch {ok,list_to_atom(Cs)} of | ||||
|         {ok,S} -> {token,{symbol,L,S}}; | ||||
|         _ -> {error,"illegal symbol"} | ||||
|     end. | ||||
|  | ||||
| %% base_token(Chars, Base, Line) -> Integer. | ||||
| %%  Convert a string of Base characters into a number. We only allow | ||||
| %%  base betqeen 2 and 36, and an optional sign character first. | ||||
|  | ||||
| base_token(_, B, _) when B < 2; B > 36 -> | ||||
|     {error,"illegal number base"}; | ||||
| base_token([$+|Cs], B, L) -> base_token(Cs, B, +1, L); | ||||
| base_token([$-|Cs], B, L) -> base_token(Cs, B, -1, L); | ||||
| base_token(Cs, B, L) -> base_token(Cs, B, +1, L). | ||||
|  | ||||
| base_token(Cs, B, S, L) -> | ||||
|     case base1(Cs, B, 0) of | ||||
|         {N,[]} -> {token,{number,L,S*N}}; | ||||
|         {_,_} -> {error,"illegal based number"} | ||||
|     end. | ||||
|  | ||||
| base1([C|Cs], Base, SoFar) when C >= $0, C =< $9, C < Base + $0 -> | ||||
|     Next = SoFar * Base + (C - $0), | ||||
|     base1(Cs, Base, Next); | ||||
| base1([C|Cs], Base, SoFar) when C >= $a, C =< $z, C < Base + $a - 10 -> | ||||
|     Next = SoFar * Base + (C - $a + 10), | ||||
|     base1(Cs, Base, Next); | ||||
| base1([C|Cs], Base, SoFar) when C >= $A, C =< $Z, C < Base + $A - 10 -> | ||||
|     Next = SoFar * Base + (C - $A + 10), | ||||
|     base1(Cs, Base, Next); | ||||
| base1([C|Cs], _Base, SoFar) -> {SoFar,[C|Cs]}; | ||||
| base1([], _Base, N) -> {N,[]}. | ||||
|  | ||||
| -define(IS_UNICODE(C), ((C >= 0) and (C =< 16#10FFFF))). | ||||
|  | ||||
| %% char_token(InputChars, Line) -> {token,{number,L,N}} | {error,E}. | ||||
| %%  Convert an input string into the corresponding character. For a | ||||
| %%  sequence of hex characters we check resultant is code is in the | ||||
| %%  unicode range. | ||||
|  | ||||
| char_token([$x,C|Cs], L) -> | ||||
|     case base1([C|Cs], 16, 0) of | ||||
|         {N,[]} when ?IS_UNICODE(N) -> {token,{number,L,N}}; | ||||
|         _ -> {error,"illegal character"} | ||||
|     end; | ||||
| char_token([C], L) -> {token,{number,L,C}}. | ||||
|  | ||||
| %% chars(InputChars) -> Chars. | ||||
| %%  Convert an input string into the corresponding string characters. | ||||
| %%  We know that the input string is correct. | ||||
|  | ||||
| chars([$\\,$x,C|Cs0]) -> | ||||
|     case hex_char(C) of | ||||
|         true -> | ||||
|             case base1([C|Cs0], 16, 0) of | ||||
|                 {N,[$;|Cs1]} -> [N|chars(Cs1)]; | ||||
|                 _Other -> [escape_char($x)|chars([C|Cs0])] | ||||
|             end; | ||||
|         false -> [escape_char($x)|chars([C|Cs0])] | ||||
|     end; | ||||
| chars([$\\,C|Cs]) -> [escape_char(C)|chars(Cs)]; | ||||
| chars([C|Cs]) -> [C|chars(Cs)]; | ||||
| chars([]) -> []. | ||||
|  | ||||
| hex_char(C) when C >= $0, C =< $9 -> true; | ||||
| hex_char(C) when C >= $a, C =< $f -> true; | ||||
| hex_char(C) when C >= $A, C =< $F -> true; | ||||
| hex_char(_) -> false. | ||||
|  | ||||
| escape_char($b) -> $\b;                %\b = BS | ||||
| escape_char($t) -> $\t;                %\t = TAB | ||||
| escape_char($n) -> $\n;                %\n = LF | ||||
| escape_char($v) -> $\v;                %\v = VT | ||||
| escape_char($f) -> $\f;                %\f = FF | ||||
| escape_char($r) -> $\r;                %\r = CR | ||||
| escape_char($e) -> $\e;                %\e = ESC | ||||
| escape_char($s) -> $\s;                %\s = SPC | ||||
| escape_char($d) -> $\d;                %\d = DEL | ||||
| escape_char(C) -> C. | ||||
|  | ||||
| %% Block Comment: | ||||
| %%  Provide a sensible error when people attempt to include nested | ||||
| %%  comments because currently the parser cannot process them without | ||||
| %%  a rebuild. But simply exploding on a '#|' is not going to be that | ||||
| %%  helpful. | ||||
|  | ||||
| block_comment(TokenChars) -> | ||||
|     %% Check we're not opening another comment block. | ||||
|     case string:str(TokenChars, "#|") of | ||||
|         0 -> skip_token; %% No nesting found | ||||
|         _ -> {error, "illegal nested block comment"} | ||||
|     end. | ||||
|  | ||||
| %% skip_until(String, Char1, Char2) -> String. | ||||
| %% skip_past(String, Char1, Char2) -> String. | ||||
|  | ||||
| %% skip_until([C|_]=Cs, C1, C2) when C =:= C1 ; C =:= C2 -> Cs; | ||||
| %% skip_until([_|Cs], C1, C2) -> skip_until(Cs, C1, C2); | ||||
| %% skip_until([], _, _) -> []. | ||||
|  | ||||
| skip_past([C|Cs], C1, C2) when C =:= C1 ; C =:= C2 -> Cs; | ||||
| skip_past([_|Cs], C1, C2) -> skip_past(Cs, C1, C2); | ||||
| skip_past([], _, _) -> []. | ||||
							
								
								
									
										1
									
								
								samples/Erlang/release
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										1
									
								
								samples/Erlang/release
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							| @@ -119,4 +119,3 @@ execute_overlay([{copy, In, Out} | Rest], Vars, BaseDir, TargetDir) -> | ||||
|  | ||||
| exit_code(ExitCode) -> | ||||
|     erlang:halt(ExitCode, [{flush, true}]). | ||||
|  | ||||
|   | ||||
							
								
								
									
										8
									
								
								samples/Erlang/sample.app.src
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								samples/Erlang/sample.app.src
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| {application, sample, | ||||
|  [{description, "sample app"}, | ||||
|   {vsn, "1.0.0"}, | ||||
|   {registered, []}, | ||||
|   {mod, {sample_app, []}}, | ||||
|   {applications, [kernel, stdlib]}, | ||||
|   {env, []}, | ||||
|   {modules, []}]}. | ||||
							
								
								
									
										104
									
								
								samples/Erlang/single-context.es
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										104
									
								
								samples/Erlang/single-context.es
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,104 @@ | ||||
| #! /usr/bin/env escript | ||||
| % This file is part of Emonk released under the MIT license.  | ||||
| % See the LICENSE file for more information. | ||||
|  | ||||
| main([]) -> | ||||
| 	start(64, 1000); | ||||
| main([N]) -> | ||||
| 	start(list_to_integer(N), 1000); | ||||
| main([N, M]) -> | ||||
| 	start(list_to_integer(N), list_to_integer(M)). | ||||
|  | ||||
|  | ||||
| start(N, M) -> | ||||
| 	code:add_pathz("test"), | ||||
| 	code:add_pathz("ebin"), | ||||
| 	{ok, Ctx} = emonk:create_ctx(), | ||||
| 	{ok, undefined} = emonk:eval(Ctx, js()), | ||||
| 	run(Ctx, N, M), | ||||
| 	wait(N). | ||||
|  | ||||
| run(_, 0, _) -> | ||||
| 	ok; | ||||
| run(Ctx, N, M) -> | ||||
| 	Self = self(), | ||||
| 	Pid = spawn(fun() -> do_js(Self, Ctx, M) end), | ||||
| 	io:format("Spawned: ~p~n", [Pid]), | ||||
| 	run(Ctx, N-1, M). | ||||
|  | ||||
| wait(0) -> | ||||
| 	ok; | ||||
| wait(N) -> | ||||
| 	receive | ||||
| 		{finished, Pid} -> ok | ||||
| 	end, | ||||
| 	io:format("Finished: ~p~n", [Pid]), | ||||
| 	wait(N-1). | ||||
|  | ||||
| do_js(Parent, _, 0) -> | ||||
| 	Parent ! {finished, self()}; | ||||
| do_js(Parent, Ctx, M) -> | ||||
| 	io:format("Running: ~p~n", [M]), | ||||
| 	Test = random_test(), | ||||
| 	{ok, [Resp]} = emonk:call(Ctx, <<"f">>, [Test]), | ||||
| 	Sorted = sort(Resp), | ||||
| 	true = Test == Sorted, | ||||
| 	do_js(Parent, Ctx, M-1). | ||||
|  | ||||
| js() ->  | ||||
| 	<<"var f = function(x) {return [x];};">>. | ||||
|  | ||||
| random_test() -> | ||||
| 	Tests = [ | ||||
| 		null, | ||||
| 		true, | ||||
| 		false, | ||||
| 		1, | ||||
| 		-1, | ||||
| 		3.1416, | ||||
| 		-3.1416, | ||||
| 		12.0e10, | ||||
| 		1.234E+10, | ||||
| 		-1.234E-10, | ||||
| 		10.0, | ||||
| 		123.456, | ||||
| 		10.0, | ||||
| 		<<"foo">>, | ||||
| 		<<"foo", 5, "bar">>, | ||||
| 		<<"">>, | ||||
| 		<<"\n\n\n">>, | ||||
| 		<<"\" \b\f\r\n\t\"">>, | ||||
| 		{[]}, | ||||
| 		{[{<<"foo">>, <<"bar">>}]}, | ||||
| 		{[{<<"foo">>, <<"bar">>}, {<<"baz">>, 123}]}, | ||||
| 		[], | ||||
| 		[[]], | ||||
| 		[1, <<"foo">>], | ||||
| 		{[{<<"foo">>, [123]}]}, | ||||
| 		{[{<<"foo">>, [1, 2, 3]}]}, | ||||
| 		{[{<<"foo">>, {[{<<"bar">>, true}]}}]}, | ||||
| 		{[ | ||||
| 			{<<"foo">>, []}, | ||||
| 			{<<"bar">>, {[{<<"baz">>, true}]}}, {<<"alice">>, <<"bob">>} | ||||
| 		]}, | ||||
| 		[-123, <<"foo">>, {[{<<"bar">>, []}]}, null] | ||||
| 	], | ||||
| 	{_, [Test | _]} = lists:split(random:uniform(length(Tests)) - 1, Tests), | ||||
| 	sort(Test). | ||||
|  | ||||
| sort({Props}) -> | ||||
| 	objsort(Props, []); | ||||
| sort(List) when is_list(List) -> | ||||
| 	lstsort(List, []); | ||||
| sort(Other) -> | ||||
| 	Other. | ||||
|  | ||||
| objsort([], Acc) -> | ||||
| 	{lists:sort(Acc)}; | ||||
| objsort([{K,V} | Rest], Acc) -> | ||||
| 	objsort(Rest, [{K, sort(V)} | Acc]). | ||||
|  | ||||
| lstsort([], Acc) -> | ||||
| 	lists:reverse(Acc); | ||||
| lstsort([Val | Rest], Acc) -> | ||||
| 	lstsort(Rest, [sort(Val) | Acc]). | ||||
							
								
								
									
										54
									
								
								samples/FLUX/gameserver.fx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								samples/FLUX/gameserver.fx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,54 @@ | ||||
| typedef engine isEngineMessage; | ||||
| typedef turn isTurnMessage; | ||||
| typedef connect isConnectMessage; | ||||
| typedef disconnect isDisconnectMessage; | ||||
|  | ||||
| ClientMessage(char* data) => (); | ||||
| ParseMessage(char* data) => (int type, int client, char* data); | ||||
| ReadMessage(int type, int client, char* data) => (); | ||||
|  | ||||
| ParseEngine(int type, int client, char* data) => (int client, int direction); | ||||
| DoEngine(int client, int direction) => (); | ||||
|  | ||||
| ParseTurn(int type, int client, char* data) => (int client, int direction); | ||||
| DoTurn(int client, int direction) => (); | ||||
|  | ||||
| ParseConnect(int type, int client, char* data)  | ||||
| 	=> (int client, char* host, int port); | ||||
| DoConnect(int client, char* host, int port) => (); | ||||
|  | ||||
| ParseDisconnect(int type, int client, char* data) => (int client); | ||||
| DoDisconnect(int client) => (); | ||||
|  | ||||
| UpdateBoard(ClientList clients) => (ClientList clients); | ||||
| SendData(ClientList clients) => (); | ||||
|  | ||||
| DoUpdate(ClientList clients) => (); | ||||
|  | ||||
| DataTimer() => (ClientList clients); | ||||
|  | ||||
| GetClients() => (ClientList clients); | ||||
|  | ||||
| Wait(ClientList clients) => (ClientList clients); | ||||
|  | ||||
| Listen () => (char* data); | ||||
|  | ||||
| source Listen => ClientMessage; | ||||
| source DataTimer => DoUpdate; | ||||
|  | ||||
| DataTimer = GetClients -> Wait; | ||||
|  | ||||
| DoUpdate = UpdateBoard -> SendData; | ||||
|  | ||||
| ClientMessage=ParseMessage -> ReadMessage; | ||||
|  | ||||
| ReadMessage:[engine, _, _] = ParseEngine -> DoEngine; | ||||
| ReadMessage:[turn, _, _] = ParseTurn -> DoTurn; | ||||
| ReadMessage:[connect, _, _] = ParseConnect -> DoConnect; | ||||
| ReadMessage:[disconnect, _, _] = ParseDisconnect -> DoDisconnect; | ||||
|  | ||||
| atomic GetClients:{client_lock}; | ||||
| atomic DoConnect:{client_lock}; | ||||
| atomic DoDisconnect:{client_lock}; | ||||
|  | ||||
|  | ||||
							
								
								
									
										44
									
								
								samples/FLUX/imageserver.fx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								samples/FLUX/imageserver.fx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,44 @@ | ||||
| typedef xml TestXML; | ||||
| typedef html TestHTML; | ||||
|  | ||||
| typedef inCache TestInCache; | ||||
|  | ||||
| Page (int socket) => (); | ||||
|  | ||||
| ReadRequest (int socket) => (int socket, bool close, image_tag *request); | ||||
|  | ||||
| CheckCache (int socket, bool close, image_tag *request)  | ||||
| 	=> (int socket, bool close, image_tag *request); | ||||
|  | ||||
| Handler (int socket, bool close, image_tag *request) | ||||
|      => (int socket, bool close, image_tag *request); | ||||
|  | ||||
| Complete (int socket, bool close, image_tag *request) => (); | ||||
|  | ||||
| ReadInFromDisk (int socket, bool close, image_tag *request) | ||||
|      => (int socket, bool close, image_tag *request, __u8 *rgb_data); | ||||
|  | ||||
| Write (int socket, bool close, image_tag *request) | ||||
|      => (int socket, bool close, image_tag *request); | ||||
|  | ||||
| Compress(int socket, bool close, image_tag *request, __u8 *rgb_data) | ||||
| 	=> (int socket, bool close, image_tag *request); | ||||
|  | ||||
| StoreInCache(int socket, bool close, image_tag *request) | ||||
| 	=> (int socket, bool close, image_tag *request); | ||||
|  | ||||
| Listen ()  | ||||
| 	=> (int socket); | ||||
|  | ||||
| source Listen => Page; | ||||
|  | ||||
| Handler:[_, _, inCache]=; | ||||
| Handler:[_, _, _]=ReadInFromDisk -> Compress -> StoreInCache; | ||||
|  | ||||
| Page = ReadRequest -> CheckCache-> Handler -> Write -> Complete; | ||||
|  | ||||
| atomic CheckCache:{cache}; | ||||
| atomic StoreInCache:{cache}; | ||||
| atomic Complete:{cache}; | ||||
|  | ||||
| handle error ReadInFromDisk => FourOhFor; | ||||
							
								
								
									
										151
									
								
								samples/FLUX/mbittorrent.fx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										151
									
								
								samples/FLUX/mbittorrent.fx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,151 @@ | ||||
| typedef choke TestChoke; | ||||
| typedef unchoke TestUnchoke; | ||||
| typedef interested TestInterested; | ||||
| typedef uninterested TestUninterested; | ||||
| typedef request TestRequest; | ||||
| typedef cancel TestCancel; | ||||
| typedef piece TestPiece; | ||||
| typedef bitfield TestBitfield; | ||||
| typedef have TestHave; | ||||
| typedef piececomplete TestPieceComplete; | ||||
|  | ||||
| CheckinWithTracker (torrent_data_t *tdata) | ||||
|     => (); | ||||
|  | ||||
| SendRequestToTracker (torrent_data_t *tdata) | ||||
|     => (torrent_data_t *tdata, int socket); | ||||
|      | ||||
| GetTrackerResponse (torrent_data_t *tdata, int socket) | ||||
|     => (); | ||||
|  | ||||
| UpdateChokeList (torrent_data_t *tdata) | ||||
|     => (); | ||||
|  | ||||
| PickChoked (torrent_data_t *tdata) | ||||
|     => (torrent_data_t *tdata, chokelist_t clist); | ||||
|      | ||||
| SendChokeUnchoke (torrent_data_t *tdata, chokelist_t clist) | ||||
|     => (); | ||||
|      | ||||
| SetupConnection (torrent_data_t *tdata, int socket) | ||||
|     => (); | ||||
|      | ||||
| Handshake (torrent_data_t *tdata, int socket) | ||||
|     => (torrent_data_t *tdata, client_data_t *client); | ||||
|      | ||||
| SendBitfield (torrent_data_t *tdata, client_data_t *client) | ||||
|     => (); | ||||
|  | ||||
| Message (torrent_data_t *tdata, client_data_t *client) | ||||
|     => (); | ||||
|      | ||||
| ReadMessage (torrent_data_t *tdata, client_data_t *client) | ||||
|     => (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload); | ||||
|      | ||||
| HandleMessage (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload) | ||||
|     => (client_data_t *client); | ||||
|      | ||||
| MessageDone (client_data_t *client) | ||||
|     => (); | ||||
|      | ||||
| CompletePiece (torrent_data_t *tdata, client_data_t *client, int piece) | ||||
|     => (torrent_data_t *tdata, client_data_t *client); | ||||
|  | ||||
| VerifyPiece (torrent_data_t *tdata, client_data_t *client, int piece) | ||||
|     => (torrent_data_t *tdata, client_data_t *client, int piece); | ||||
|  | ||||
| SendHave (torrent_data_t *tdata, client_data_t *client, int piece) | ||||
|     => (torrent_data_t *tdata, client_data_t *client); | ||||
|  | ||||
| SendUninterested (torrent_data_t *tdata, client_data_t *client) | ||||
|     => (torrent_data_t *tdata, client_data_t *client); | ||||
|      | ||||
| Choke (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload) | ||||
|     => (client_data_t *client); | ||||
|      | ||||
| Cancel (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload) | ||||
|     => (client_data_t *client); | ||||
|  | ||||
| Interested (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload) | ||||
|     => (client_data_t *client); | ||||
|  | ||||
| Uninterested (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload) | ||||
|     => (client_data_t *client); | ||||
|  | ||||
| Bitfield (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload) | ||||
|     => (client_data_t *client); | ||||
|  | ||||
| Unchoke (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload) | ||||
|     => (torrent_data_t *tdata, client_data_t *client); | ||||
|  | ||||
| SendRequest (torrent_data_t *tdata, client_data_t *client) | ||||
|     => (client_data_t *client); | ||||
|  | ||||
| Have (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload) | ||||
|     => (torrent_data_t *tdata, client_data_t *client); | ||||
|  | ||||
| Piece (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload) | ||||
|     => (torrent_data_t *tdata, client_data_t *client, int piece); | ||||
|  | ||||
| Request (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload) | ||||
|     => (client_data_t *client); | ||||
|      | ||||
| SendKeepAlives (torrent_data_t *tdata) | ||||
|     => (); | ||||
|  | ||||
| GetClients ()  | ||||
|     => (int maxfd, fd_set *fds); | ||||
|  | ||||
| SelectSockets (int maxfd, fd_set *fds) | ||||
|     => (fd_set *fds); | ||||
|  | ||||
| CheckSockets (fd_set *fds) | ||||
|     => (torrent_data_t *tdata, client_data_t *client); | ||||
|  | ||||
| TrackerTimer ()  | ||||
|     => (torrent_data_t *tdata); | ||||
|  | ||||
| ChokeTimer () | ||||
|     => (torrent_data_t *tdata); | ||||
|  | ||||
| Connect () | ||||
|     => (torrent_data_t *tdata, int socket); | ||||
|  | ||||
| KeepAliveTimer () | ||||
|     => (torrent_data_t *tdata); | ||||
|  | ||||
| Listen () | ||||
|     => (torrent_data_t *tdata, client_data_t *client); | ||||
|  | ||||
| source TrackerTimer => CheckinWithTracker; | ||||
| source ChokeTimer => UpdateChokeList; | ||||
| source Connect => SetupConnection; | ||||
| source Listen => Message; | ||||
| source KeepAliveTimer => SendKeepAlives; | ||||
|  | ||||
| Listen = GetClients -> SelectSockets -> CheckSockets; | ||||
| CheckinWithTracker = SendRequestToTracker -> GetTrackerResponse; | ||||
| UpdateChokeList = PickChoked -> SendChokeUnchoke; | ||||
| SetupConnection = Handshake -> SendBitfield; | ||||
| Message = ReadMessage -> HandleMessage -> MessageDone; | ||||
|  | ||||
| CompletePiece:[_, _, piececomplete] = VerifyPiece -> SendHave -> SendUninterested; | ||||
|  | ||||
| HandleMessage:[_, _, choke, _, _] = Choke; | ||||
| HandleMessage:[_, _, unchoke, _, _] = Unchoke -> SendRequest; | ||||
| HandleMessage:[_, _, interested, _, _] = Interested; | ||||
|  | ||||
| HandleMessage:[_, _, uninterested, _, _] = Uninterested; | ||||
| HandleMessage:[_, _, request, _, _] = Request; | ||||
| HandleMessage:[_, _, cancel, _, _] = Cancel; | ||||
| HandleMessage:[_, _, piece, _, _] = Piece -> CompletePiece -> SendRequest; | ||||
| HandleMessage:[_, _, bitfield, _, _] = Bitfield; | ||||
| HandleMessage:[_, _, have, _, _] = Have -> SendRequest; | ||||
|  | ||||
| atomic GetClients:{BigLock}; | ||||
| atomic CheckSockets:{BigLock}; | ||||
| atomic Message:{BigLock}; | ||||
| atomic CheckinWithTracker:{BigLock}; | ||||
| atomic UpdateChokeList:{BigLock}; | ||||
| atomic SetupConnection:{BigLock}; | ||||
| atomic SendKeepAlives:{BigLock}; | ||||
							
								
								
									
										38
									
								
								samples/FLUX/test.fx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								samples/FLUX/test.fx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | ||||
| // concrete node signatures | ||||
| Listen () | ||||
|   => (int socket); | ||||
|  | ||||
| ReadRequest (int socket) | ||||
|   => (int socket, bool close, image_tag *request); | ||||
|  | ||||
| CheckCache (int socket, bool close, image_tag *request) | ||||
|   => (int socket, bool close, image_tag *request); | ||||
|  | ||||
| // omitted for space: | ||||
| // ReadInFromDisk, StoreInCache | ||||
| Compress (int socket, bool close, image_tag *request, __u8 *rgb_data) | ||||
|   => (int socket, bool close, image_tag *request); | ||||
| Write (int socket, bool close, image_tag *request) | ||||
|   => (int socket, bool close, image_tag *request); | ||||
| Complete (int socket, bool close, image_tag *request) => (); | ||||
|  | ||||
| // source node | ||||
| source Listen => Image; | ||||
|  | ||||
| // abstract node | ||||
| Image = ReadRequest -> CheckCache -> Handler -> Write -> Complete; | ||||
|  | ||||
| // predicate type & dispatch | ||||
| typedef hit TestInCache; | ||||
| Handler:[_, _, hit] = ; | ||||
| Handler:[_, _, _] = | ||||
| ReadInFromDisk -> Compress -> StoreInCache; | ||||
|  | ||||
| // error handler | ||||
| handle error ReadInFromDisk => FourOhFor; | ||||
|  | ||||
| // atomicity constraints | ||||
| atomic CheckCache:{cache}; | ||||
| atomic StoreInCache:{cache}; | ||||
| atomic Complete:{cache}; | ||||
|  | ||||
							
								
								
									
										3608
									
								
								samples/Formatted/NiAlH_jea.eam.fs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3608
									
								
								samples/Formatted/NiAlH_jea.eam.fs
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										20
									
								
								samples/GLSL/gbuffers_textured_lit.fsh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								samples/GLSL/gbuffers_textured_lit.fsh
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,20 @@ | ||||
| #version 120 | ||||
|  | ||||
| uniform sampler2D texture; | ||||
|  | ||||
| varying vec3 color; | ||||
| varying vec2 texcoord; | ||||
|  | ||||
| vec4 GetDiffuse() { | ||||
| 	vec4 diffuse = vec4(color.rgb, 1.0); | ||||
| 	     diffuse *= texture2D(texture, texcoord); | ||||
| 	 | ||||
| 	return diffuse; | ||||
| } | ||||
|  | ||||
|  | ||||
| void main() { | ||||
| 	vec4 diffuse = GetDiffuse(); | ||||
| 	 | ||||
| 	gl_FragData[0] = diffuse; | ||||
| } | ||||
							
								
								
									
										11
									
								
								samples/GLSL/gbuffers_textured_lit.vsh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								samples/GLSL/gbuffers_textured_lit.vsh
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | ||||
| #version 120 | ||||
|  | ||||
| varying vec3 color; | ||||
| varying vec2 texcoord; | ||||
|  | ||||
| void main() { | ||||
| 	color    = gl_Color.rgb; | ||||
| 	texcoord = gl_MultiTexCoord0.st; | ||||
| 	 | ||||
| 	gl_Position = ftransform(); | ||||
| } | ||||
							
								
								
									
										57
									
								
								samples/GraphQL/kitchen-sink.graphql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								samples/GraphQL/kitchen-sink.graphql
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,57 @@ | ||||
| # Copyright (c) 2015, Facebook, Inc. | ||||
| # All rights reserved. | ||||
| # | ||||
| # This source code is licensed under the BSD-style license found in the | ||||
| # LICENSE file in the root directory of this source tree. An additional grant | ||||
| # of patent rights can be found in the PATENTS file in the same directory. | ||||
|  | ||||
| query queryName($foo: ComplexType, $site: Site = MOBILE) { | ||||
|   whoever123is: node(id: [123, 456]) { | ||||
|     id , | ||||
|     ... on User @defer { | ||||
|       field2 { | ||||
|         id , | ||||
|         alias: field1(first:10, after:$foo,) @include(if: $foo) { | ||||
|           id, | ||||
|           ...frag | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|     ... @skip(unless: $foo) { | ||||
|       id | ||||
|     } | ||||
|     ... { | ||||
|       id | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| mutation likeStory { | ||||
|   like(story: 123) @defer { | ||||
|     story { | ||||
|       id | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| subscription StoryLikeSubscription($input: StoryLikeSubscribeInput) { | ||||
|   storyLikeSubscribe(input: $input) { | ||||
|     story { | ||||
|       likers { | ||||
|         count | ||||
|       } | ||||
|       likeSentence { | ||||
|         text | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| fragment frag on Friend { | ||||
|   foo(size: $size, bar: $b, obj: {key: "value"}) | ||||
| } | ||||
|  | ||||
| { | ||||
|   unnamed(truthy: true, falsey: false), | ||||
|   query | ||||
| } | ||||
							
								
								
									
										50
									
								
								samples/GraphQL/schema-kitchen-sink.graphql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								samples/GraphQL/schema-kitchen-sink.graphql
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,50 @@ | ||||
| # Copyright (c) 2015, Facebook, Inc. | ||||
| # All rights reserved. | ||||
| # | ||||
| # This source code is licensed under the BSD-style license found in the | ||||
| # LICENSE file in the root directory of this source tree. An additional grant | ||||
| # of patent rights can be found in the PATENTS file in the same directory. | ||||
|  | ||||
| schema { | ||||
|   query: QueryType | ||||
|   mutation: MutationType | ||||
| } | ||||
|  | ||||
| type Foo implements Bar { | ||||
|   one: Type | ||||
|   two(argument: InputType!): Type | ||||
|   three(argument: InputType, other: String): Int | ||||
|   four(argument: String = "string"): String | ||||
|   five(argument: [String] = ["string", "string"]): String | ||||
|   six(argument: InputType = {key: "value"}): Type | ||||
| } | ||||
|  | ||||
| interface Bar { | ||||
|   one: Type | ||||
|   four(argument: String = "string"): String | ||||
| } | ||||
|  | ||||
| union Feed = Story | Article | Advert | ||||
|  | ||||
| scalar CustomScalar | ||||
|  | ||||
| enum Site { | ||||
|   DESKTOP | ||||
|   MOBILE | ||||
| } | ||||
|  | ||||
| input InputType { | ||||
|   key: String! | ||||
|   answer: Int = 42 | ||||
| } | ||||
|  | ||||
| extend type Foo { | ||||
|   seven(argument: [String]): Type | ||||
| } | ||||
|  | ||||
| directive @skip(if: Boolean!) on FIELD | FRAGMENT_SPREAD | INLINE_FRAGMENT | ||||
|  | ||||
| directive @include(if: Boolean!) | ||||
|   on FIELD | ||||
|    | FRAGMENT_SPREAD | ||||
|    | INLINE_FRAGMENT | ||||
							
								
								
									
										46
									
								
								samples/Groovy/filenames/Jenkinsfile
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								samples/Groovy/filenames/Jenkinsfile
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,46 @@ | ||||
| jettyUrl = 'http://localhost:8081/' | ||||
|  | ||||
| def servers | ||||
|  | ||||
| stage 'Dev' | ||||
| node { | ||||
|     checkout scm | ||||
|     servers = load 'servers.groovy' | ||||
|     mvn '-o clean package' | ||||
|     dir('target') {stash name: 'war', includes: 'x.war'} | ||||
| } | ||||
|  | ||||
| stage 'QA' | ||||
| parallel(longerTests: { | ||||
|     runTests(servers, 30) | ||||
| }, quickerTests: { | ||||
|     runTests(servers, 20) | ||||
| }) | ||||
|  | ||||
| stage name: 'Staging', concurrency: 1 | ||||
| node { | ||||
|     servers.deploy 'staging' | ||||
| } | ||||
|  | ||||
| input message: "Does ${jettyUrl}staging/ look good?" | ||||
|  | ||||
| stage name: 'Production', concurrency: 1 | ||||
| node { | ||||
|     sh "wget -O - -S ${jettyUrl}staging/" | ||||
|     echo 'Production server looks to be alive' | ||||
|     servers.deploy 'production' | ||||
|     echo "Deployed to ${jettyUrl}production/" | ||||
| } | ||||
|  | ||||
| def mvn(args) { | ||||
|     sh "${tool 'Maven 3.x'}/bin/mvn ${args}" | ||||
| } | ||||
|  | ||||
| def runTests(servers, duration) { | ||||
|     node { | ||||
|         checkout scm | ||||
|         servers.runWithServer {id -> | ||||
|             mvn "-o -f sometests test -Durl=${jettyUrl}${id}/ -Dduration=${duration}" | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										27
									
								
								samples/HLSL/accelerated_surface_win.hlsl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								samples/HLSL/accelerated_surface_win.hlsl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | ||||
| // Copyright (c) 2012 The Chromium Authors. All rights reserved. | ||||
| // Use of this source code is governed by a BSD-style license that can be | ||||
| // found in the LICENSE file. | ||||
|  | ||||
| // To compile these two shaders: | ||||
| // fxc /E pixelMain /T ps_2_0 accelerated_surface_win.hlsl | ||||
| // fxc /E vertexMain /T vs_2_0 accelerated_surface_win.hlsl | ||||
| // | ||||
| // fxc is in the DirectX SDK. | ||||
|  | ||||
| struct Vertex { | ||||
|   float4 position : POSITION; | ||||
|   float2 texCoord : TEXCOORD0; | ||||
| }; | ||||
|  | ||||
| texture t; | ||||
| sampler s; | ||||
|  | ||||
| // Passes a position and texture coordinate to the pixel shader. | ||||
| Vertex vertexMain(Vertex input) { | ||||
|   return input; | ||||
| }; | ||||
|  | ||||
| // Samples a texture at the given texture coordinate and returns the result. | ||||
| float4 pixelMain(float2 texCoord : TEXCOORD0) : COLOR0 { | ||||
|   return tex2D(s, texCoord); | ||||
| }; | ||||
							
								
								
									
										105
									
								
								samples/HLSL/corridor.fx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										105
									
								
								samples/HLSL/corridor.fx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,105 @@ | ||||
| float4x4 matWorldView : WORLDVIEW; | ||||
| float4x4 matWorldViewProjection : WORLDVIEWPROJECTION; | ||||
|  | ||||
| struct VS_INPUT { | ||||
| 	float4 Position : POSITION0; | ||||
| 	float3 Normal : NORMAL; | ||||
| 	float3 Tangent : TANGENT; | ||||
| 	float3 Binormal : BINORMAL; | ||||
| 	float2 TexCoord0 : TEXCOORD0; | ||||
| 	float2 TexCoord1 : TEXCOORD1; | ||||
| }; | ||||
|  | ||||
| struct VS_OUTPUT { | ||||
| 	float4 Position : POSITION0; | ||||
| 	float2 TexCoord0 : TEXCOORD0; | ||||
| 	float2 TexCoord1 : TEXCOORD1; | ||||
| 	float3x3 TangentToView : TEXCOORD2; | ||||
| }; | ||||
|  | ||||
| VS_OUTPUT vs_main(VS_INPUT input) | ||||
| { | ||||
| 	VS_OUTPUT output; | ||||
| 	output.Position = mul(input.Position, matWorldViewProjection); | ||||
| 	output.TexCoord0 = input.TexCoord0 * 5; | ||||
| 	output.TexCoord1 = input.TexCoord1; | ||||
| 	output.TangentToView[0] = mul(float4(input.Tangent, 0), matWorldView).xyz; | ||||
| 	output.TangentToView[1] = mul(float4(input.Binormal, 0), matWorldView).xyz; | ||||
| 	output.TangentToView[2] = mul(float4(input.Normal, 0), matWorldView).xyz; | ||||
| 	return output; | ||||
| } | ||||
|  | ||||
| struct PS_OUTPUT { | ||||
| 	float4 gbuffer0 : COLOR0; | ||||
| 	float4 gbuffer1 : COLOR1; | ||||
| }; | ||||
|  | ||||
| texture albedo_tex; | ||||
| sampler albedo_samp = sampler_state { | ||||
| 	Texture = (albedo_tex); | ||||
| 	MipFilter = Linear; | ||||
| 	MinFilter = Linear; | ||||
| 	MagFilter = Linear; | ||||
| 	AddressU = Wrap; | ||||
| 	AddressV = Wrap; | ||||
| 	sRGBTexture = True; | ||||
| }; | ||||
|  | ||||
| texture normal_tex; | ||||
| sampler normal_samp = sampler_state { | ||||
| 	Texture = (normal_tex); | ||||
| 	MipFilter = Linear; | ||||
| 	MinFilter = Linear; | ||||
| 	MagFilter = Linear; | ||||
| 	AddressU = Wrap; | ||||
| 	AddressV = Wrap; | ||||
| 	sRGBTexture = False; | ||||
| }; | ||||
|  | ||||
| texture specular_tex; | ||||
| sampler specular_samp = sampler_state { | ||||
| 	Texture = (specular_tex); | ||||
| 	MipFilter = Linear; | ||||
| 	MinFilter = Linear; | ||||
| 	MagFilter = Linear; | ||||
| 	AddressU = Wrap; | ||||
| 	AddressV = Wrap; | ||||
| 	sRGBTexture = True; | ||||
| }; | ||||
|  | ||||
| texture ao_tex; | ||||
| sampler ao_samp = sampler_state { | ||||
| 	Texture = (ao_tex); | ||||
| 	MipFilter = Linear; | ||||
| 	MinFilter = Linear; | ||||
| 	MagFilter = Linear; | ||||
| 	AddressU = Wrap; | ||||
| 	AddressV = Wrap; | ||||
| 	sRGBTexture = True; | ||||
| }; | ||||
|  | ||||
| PS_OUTPUT ps_main(VS_OUTPUT Input) | ||||
| { | ||||
| 	PS_OUTPUT o; | ||||
|  | ||||
| 	float3 tangentNormal = normalize(tex2D(normal_samp, Input.TexCoord0).xyz * 2 - 1); | ||||
| 	float3 eyeNormal = normalize(mul(tangentNormal, Input.TangentToView)); | ||||
|  | ||||
| 	float3 albedo = tex2D(albedo_samp, Input.TexCoord0).rgb; | ||||
| 	float ao = tex2D(ao_samp, Input.TexCoord1).r * 0.75; | ||||
| 	float spec = tex2D(specular_samp, Input.TexCoord0).r; | ||||
|  | ||||
| 	o.gbuffer0 = float4(eyeNormal, spec * ao); | ||||
| 	o.gbuffer1 = float4(albedo, 1 - ao); | ||||
| 	return o; | ||||
| } | ||||
|  | ||||
| technique mesh { | ||||
| 	pass Geometry { | ||||
| 		VertexShader = compile vs_3_0 vs_main(); | ||||
| 		PixelShader  = compile ps_3_0 ps_main(); | ||||
|  | ||||
| 		AlphaBlendEnable = False; | ||||
| 		ZWriteEnable = True; | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										119
									
								
								samples/HLSL/jellyfish.fx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										119
									
								
								samples/HLSL/jellyfish.fx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,119 @@ | ||||
| float4x4 matWorldViewProjection : WORLDVIEWPROJECTION; | ||||
| float4x4 matWorldView : WORLDVIEW; | ||||
| float4x4 matWorld : WORLD; | ||||
| float4x4 matView : VIEW; | ||||
|  | ||||
| uniform float4 vViewPosition; | ||||
|  | ||||
| struct VS_INPUT  | ||||
| { | ||||
| 	float3 Pos:      POSITION; | ||||
| 	float3 Normal:   NORMAL; | ||||
| 	float3 Tangent:  TANGENT; | ||||
| 	float3 Binormal: BINORMAL; | ||||
| }; | ||||
|  | ||||
| struct VS_OUTPUT  | ||||
| { | ||||
| 	float4 Pos        : POSITION; | ||||
| 	float3 reflection : TEXCOORD1;  | ||||
| 	float3 refraction : TEXCOORD2;  | ||||
| 	float  fresnel    : TEXCOORD3; | ||||
| }; | ||||
|  | ||||
| uniform float3 amt; | ||||
| uniform float3 scale; | ||||
| uniform float3 phase; | ||||
|  | ||||
| float3 deform(float3 p) | ||||
| { | ||||
| 	float s = 3; | ||||
| 	float3 p2 = p * scale + phase; | ||||
| 	s += sin(p2.x) * amt.x; | ||||
| 	s += sin(p2.y) * amt.y; | ||||
| 	s += sin(p2.z) * amt.z; | ||||
| 	return p * s / 3; | ||||
| } | ||||
|  | ||||
| VS_OUTPUT vs_main( VS_INPUT In ) | ||||
| { | ||||
| 	VS_OUTPUT Out; | ||||
|  | ||||
| 	float3 pos = In.Pos; | ||||
| 	float3 norm = In.Normal; | ||||
|  | ||||
| 	float3 p1 = pos + In.Tangent * 0.05; | ||||
| 	float3 p2 = pos + In.Binormal * 0.05; | ||||
| 	pos = deform(pos); | ||||
| 	p1  = deform(p1); | ||||
| 	p2  = deform(p2); | ||||
|  | ||||
| 	p1 -= pos; | ||||
| 	p2 -= pos; | ||||
| 	norm = normalize(cross(p1, p2)); | ||||
|  | ||||
| 	float3 view = normalize(pos - vViewPosition.xyz); | ||||
|  | ||||
| 	Out.Pos           = mul(float4(pos,  1.0), matWorldViewProjection); | ||||
| 	Out.reflection    = reflect(view, norm); | ||||
| 	Out.refraction    = reflect(view, norm * 0.4f); /* fake, but who cares? */ | ||||
| 	Out.fresnel       = dot(view, norm); | ||||
| 	norm = mul(float4(norm, 0.0), matWorldViewProjection); | ||||
|  | ||||
| 	return Out; | ||||
| } | ||||
|  | ||||
| #define PS_INPUT VS_OUTPUT | ||||
|  | ||||
| #if 0 | ||||
| textureCUBE reflectionMap; | ||||
| samplerCUBE reflectionMapSampler = sampler_state | ||||
| { | ||||
| 	Texture = (reflectionMap); | ||||
| 	MipFilter = LINEAR; | ||||
| 	MinFilter = LINEAR; | ||||
| 	MagFilter = LINEAR; | ||||
| }; | ||||
| #else | ||||
| // textures | ||||
| texture reflectionMap  | ||||
| <  | ||||
|     string type = "CUBE"; | ||||
|     string name = "test_cube.dds"; | ||||
| >; | ||||
|  | ||||
| samplerCUBE reflectionMapSampler = sampler_state | ||||
| { | ||||
| 	Texture = (reflectionMap); | ||||
| 	MipFilter = LINEAR; | ||||
| 	MinFilter = LINEAR; | ||||
| 	MagFilter = LINEAR; | ||||
| }; | ||||
| #endif | ||||
|  | ||||
| struct PS_OUTPUT  | ||||
| { | ||||
|    float4 color    : COLOR0; | ||||
| }; | ||||
|  | ||||
| PS_OUTPUT ps_main( PS_INPUT In ) | ||||
| { | ||||
| 	PS_OUTPUT Out; | ||||
| 	 | ||||
| 	float4 reflection = texCUBE(reflectionMapSampler, normalize(In.reflection)) * 1.5; | ||||
| 	float4 refraction = texCUBE(reflectionMapSampler, normalize(In.refraction)); | ||||
| 	float fresnel = In.fresnel; | ||||
| //	float fresnel = abs(normalize(In.normal).z); | ||||
| 	Out.color = lerp(reflection, refraction, fresnel) *  pow(1.0 - fresnel * 0.75, 1.0); | ||||
|  | ||||
| 	return Out; | ||||
| } | ||||
|  | ||||
| technique blur_ps_vs_2_0 | ||||
| { | ||||
| 	pass P0 | ||||
| 	{ | ||||
| 		VertexShader = compile vs_2_0 vs_main(); | ||||
| 		PixelShader  = compile ps_2_0 ps_main(); | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										41
									
								
								samples/HLSL/noise.fx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								samples/HLSL/noise.fx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,41 @@ | ||||
| float alpha = 1.f; | ||||
|  | ||||
| texture tex; | ||||
| sampler tex_sampler = sampler_state | ||||
| { | ||||
| 	Texture = (tex); | ||||
| 	MipFilter = LINEAR; | ||||
| 	MinFilter = LINEAR; | ||||
| 	MagFilter = LINEAR; | ||||
| 	 | ||||
| 	AddressU = WRAP; | ||||
| 	AddressV = WRAP; | ||||
| }; | ||||
|  | ||||
| struct VS_OUTPUT | ||||
| { | ||||
| 	float4 pos  : POSITION; | ||||
| 	float2 tex  : TEXCOORD1; | ||||
| }; | ||||
|  | ||||
| VS_OUTPUT vertex(float4 ipos : POSITION, float2 tex  : TEXCOORD0) | ||||
| { | ||||
| 	VS_OUTPUT Out; | ||||
| 	Out.pos = ipos; | ||||
| 	Out.tex = tex * 2; | ||||
| 	return Out; | ||||
| } | ||||
|  | ||||
| float4 pixel(VS_OUTPUT In) : COLOR | ||||
| { | ||||
| 	return tex2D(tex_sampler, In.tex) * alpha; | ||||
| } | ||||
|  | ||||
| technique blur_ps_vs_2_0 | ||||
| { | ||||
| 	pass P0 | ||||
| 	{ | ||||
| 		VertexShader = compile vs_2_0 vertex(); | ||||
| 		PixelShader  = compile ps_2_0 pixel(); | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										5
									
								
								samples/HTML+ECR/greeting.ecr
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								samples/HTML+ECR/greeting.ecr
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | ||||
| <% if @name %> | ||||
|   Greeting, <%= @name %>! | ||||
| <% else %> | ||||
|   Greeting! | ||||
| <% end %> | ||||
| @@ -1,6 +1,74 @@ | ||||
| Version 1 of Trivial Extension by Andrew Plotkin begins here. | ||||
| Version 2 of Trivial Extension by Andrew Plotkin begins here. | ||||
|  | ||||
| "This is the rubric of the extension." | ||||
|  | ||||
| "provided for the Linguist package by Andrew Plotkin" | ||||
|  | ||||
| [Note the two special quoted lines above.] | ||||
|  | ||||
| A cow is a kind of animal. A cow can be purple. | ||||
|  | ||||
| Understand "cow" as a cow. | ||||
| Understand "purple" as a purple cow. | ||||
|  | ||||
| Check pushing a cow: | ||||
| 	instead say "Cow-tipping, at your age?[paragraph break]Inconceivable." | ||||
|  | ||||
| [Here are the possible levels of heading:] | ||||
|  | ||||
| Volume One | ||||
|  | ||||
| Text-line is always "A line of text." | ||||
|  | ||||
| Book 2 | ||||
|  | ||||
| 	Part the third - indented headings still count | ||||
|  | ||||
| Chapter IV - not for release | ||||
|  | ||||
| [Heading labels are case-insensitive.] | ||||
|  | ||||
| section foobar | ||||
|  | ||||
| [A line beginning "Volume" that does not have blank lines before and after it is *not* a header line. So the following should all be part of section foobar. Sadly, the "Volume is..." line gets colored as a header, because Atom's regexp model can't recognize "thing with blank lines before and after"!] | ||||
|  | ||||
| Measure is a kind of value. | ||||
| Volume is a measure. Length is a measure. | ||||
| Area is a measure. | ||||
|  | ||||
| [And now some Inform 6 inclusions.] | ||||
|  | ||||
| To say em -- running on: | ||||
| 	(- style underline; -). | ||||
| To say /em -- running on: | ||||
| 	(- style roman; -). | ||||
|  | ||||
| Include (- | ||||
|  | ||||
| ! Inform 6 comments start with a ! mark and run to the end of the line. | ||||
| Global cowcount; | ||||
|  | ||||
| [ inform6func arg; | ||||
| 	print "Here is some text; ", (address) 'dictword', ".^"; | ||||
| 	cowcount++;  ! increment this variable | ||||
| ]; | ||||
|  | ||||
| Object i6cow | ||||
| 	with name 'cow' 'animal', | ||||
| 	with description "It looks like a cow.", | ||||
| 	has animate scenery; | ||||
|  | ||||
| -) after "Global Variables" in "Output.i6t". | ||||
|  | ||||
| Trivial Extension ends here. | ||||
|  | ||||
| ---- DOCUMENTATION ---- | ||||
|  | ||||
| Everything after the "---- DOCUMENTATION ----" line is documentation, so it should have the comment style. | ||||
|  | ||||
| However, tab-indented lines are sample Inform code within the documentation: | ||||
|  | ||||
| 	Horns are a kind of thing. Every cow has horns. | ||||
| 	say "Moo[if the noun is purple] indigo[end if]." | ||||
|  | ||||
| So we need to allow for that. | ||||
|   | ||||
| @@ -2,11 +2,61 @@ | ||||
|  | ||||
| Include Trivial Extension by Andrew Plotkin. | ||||
|  | ||||
| Volume 1 - overview | ||||
|  | ||||
| Chapter - setting the scene | ||||
|  | ||||
| The Kitchen is a room. | ||||
|  | ||||
| [This kitchen is modelled after the one in Zork, although it lacks the detail to establish this to the player.] | ||||
| [Comment: this kitchen is modelled after the one in Zork, although it lacks the detail to establish this to the player.] | ||||
|  | ||||
| Section - the kitchen table | ||||
|  | ||||
| The spicerack is a container in the Kitchen. | ||||
|  | ||||
| Table of Spices | ||||
| Name	Flavor | ||||
| "cinnamon"	5 | ||||
| "nutmeg"	4 | ||||
| "szechuan pepper"	8 | ||||
|  | ||||
| The description of the spicerack is "It's mostly empty." | ||||
|  | ||||
| Chapter - a character | ||||
|  | ||||
| A purple cow called Gelett is in the Kitchen. | ||||
|  | ||||
| [This comment spans multiple lines.. | ||||
|  | ||||
| ...and this line contains [nested square[] brackets]... | ||||
|  | ||||
| ...which is legal in Inform 7.] | ||||
|  | ||||
| Instead of examining Gelett: | ||||
| 	say "You'd rather see than be one." | ||||
|  | ||||
| Instead of examining Gelett: | ||||
| 	say "You'd rather see than be one." | ||||
|  | ||||
| Check smelling Gelett: | ||||
| 	say "This text contains several lines. | ||||
|  | ||||
| A blank line is displayed as a paragraph break, | ||||
| but a simple line break is not."; | ||||
| 	stop the action. | ||||
|  | ||||
| Section - cow catching | ||||
|  | ||||
| Gelett has a number called the mooness. | ||||
|  | ||||
| Instead of taking Gelett: | ||||
| 	increment the mooness of Gelett; | ||||
| 	if the mooness of Gelett is one: | ||||
| 		say "Gelett moos once."; | ||||
| 	else: | ||||
| 		say "Gelett moos [mooness of Gelett in words] times."; | ||||
|  | ||||
| Volume 2 - the turn cycle | ||||
|  | ||||
| Every turn: | ||||
| 	say "A turn passes[one of][or] placidly[or] idly[or] tediously[at random]." | ||||
|   | ||||
							
								
								
									
										3
									
								
								samples/J/hashbang
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										3
									
								
								samples/J/hashbang
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| #!/bin/jconsole | ||||
| echo 'Hello, GitHub!' | ||||
| exit '' | ||||
							
								
								
									
										123
									
								
								samples/JSON/Git Commit.JSON-tmLanguage
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										123
									
								
								samples/JSON/Git Commit.JSON-tmLanguage
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,123 @@ | ||||
| { | ||||
| 	"name": "Git Commit Message", | ||||
| 	"scopeName": "text.git-commit", | ||||
| 	"fileTypes": [ | ||||
| 		"COMMIT_EDITMSG" | ||||
| 	], | ||||
| 	"patterns": [ | ||||
| 		{ | ||||
| 			"name": "comment.line.number-sign.git-commit-message", | ||||
| 			"begin": "^#", | ||||
| 			"beginCaptures": { | ||||
| 				"0": { | ||||
| 					"name": "punctuation.definition.comment.git-commit-message" | ||||
| 				} | ||||
| 			}, | ||||
| 			"end": "$", | ||||
| 			"patterns": [ | ||||
| 				{ | ||||
| 					"name": "comment.line.on-branch.git-commit-message", | ||||
| 					"match": "(?:On branch )([^ ]+)", | ||||
| 					"captures": { | ||||
| 						"1": { | ||||
| 							"name": "support.function.branch.git-commit-message" | ||||
| 						} | ||||
| 					} | ||||
| 				}, | ||||
| 				{ | ||||
| 					"name": "comment.line.on-branch.git-commit-message", | ||||
| 					"match": "Your branch .* '([^ ']+)'", | ||||
| 					"captures": { | ||||
| 						"1": { | ||||
| 							"name": "support.function.branch.git-commit-message" | ||||
| 						} | ||||
| 					} | ||||
| 				}, | ||||
| 				{ | ||||
| 					"name": "comment.line.untracked.git-commit-message", | ||||
| 					"begin": " Untracked files:", | ||||
| 					"beginCaptures": { | ||||
| 						"0": { | ||||
| 							"name": "entity.definition.untracked.git-commit-message" | ||||
| 						} | ||||
| 					}, | ||||
| 					"end": "^#$", | ||||
| 					"patterns": [ | ||||
| 						{ | ||||
| 							"name": "comment.line.untracked-file.git-commit-message", | ||||
| 							"match": "\t(.*)$", | ||||
| 							"captures": { | ||||
| 								"1": { | ||||
| 									"name": "support.function.file-status.git-commit-message" | ||||
| 								}, | ||||
| 								"2": { | ||||
| 									"name": "constant.character.branch.git-commit-message" | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					] | ||||
| 				}, | ||||
| 				{ | ||||
| 					"name": "comment.line.discarded.git-commit-message", | ||||
| 					"begin": " Change(?:s not staged for commit|d but not updated):", | ||||
| 					"beginCaptures": { | ||||
| 						"0": { | ||||
| 							"name": "entity.definition.discarded.git-commit-message" | ||||
| 						} | ||||
| 					}, | ||||
| 					"end": "^#$", | ||||
| 					"patterns": [ | ||||
| 						{ | ||||
| 							"name": "comment.line.discarded.git-commit-message", | ||||
| 							"match": "\t([^:]+):(.*)$", | ||||
| 							"captures": { | ||||
| 								"1": { | ||||
| 									"name": "support.function.file-status.git-commit-message" | ||||
| 								}, | ||||
| 								"2": { | ||||
| 									"name": "constant.character.branch.git-commit-message" | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					] | ||||
| 				}, | ||||
| 				{ | ||||
| 					"name": "comment.line.selected.git-commit-message", | ||||
| 					"begin": " Changes to be committed:", | ||||
| 					"beginCaptures": { | ||||
| 						"0": { | ||||
| 							"name": "entity.definition.selected.git-commit-message" | ||||
| 						} | ||||
| 					}, | ||||
| 					"end": "^#$", | ||||
| 					"patterns": [ | ||||
| 						{ | ||||
| 							"name": "comment.line.selected.git-commit-message", | ||||
| 							"match": "\t([^:]+):(.*)$", | ||||
| 							"captures": { | ||||
| 								"1": { | ||||
| 									"name": "support.function.file-status.git-commit-message" | ||||
| 								}, | ||||
| 								"2": { | ||||
| 									"name": "constant.character.branch.git-commit-message" | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					] | ||||
| 				} | ||||
| 			] | ||||
| 		}, | ||||
| 		{ | ||||
| 			"name": "meta.diff.git-commit", | ||||
| 			"comment": "diff at the end of the commit message when using commit -v, or viewing a log. End pattern is just something to be never matched so that the meta continues untill the end of the file.", | ||||
| 			"begin": "diff\\ \\-\\-git", | ||||
| 			"end": "(?=xxxxxx)123457", | ||||
| 			"patterns": [ | ||||
| 				{ | ||||
| 					"include": "source.diff" | ||||
| 				} | ||||
| 			] | ||||
| 		} | ||||
| 	], | ||||
| 	"uuid": "de3fb2fc-e564-4a31-9813-5ee26967c5c8" | ||||
| } | ||||
							
								
								
									
										8
									
								
								samples/JSON/filenames/.arcconfig
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								samples/JSON/filenames/.arcconfig
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| { | ||||
| 	"project_id": "example", | ||||
| 	"conduit_uri": "https://ex.am.pl/", | ||||
| 	"copyright_holder": "Apache Software Foundation", | ||||
| 	"arcanist_configuration": "ArcJIRAConfiguration", | ||||
| 	"phabricator.uri": "https://phabricator.example.com/", | ||||
| 	"load": ["libs/src"] | ||||
| } | ||||
							
								
								
									
										16
									
								
								samples/JSON/filenames/mcmod.info
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								samples/JSON/filenames/mcmod.info
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,16 @@ | ||||
| [ | ||||
| { | ||||
|   "modid": "examplemod", | ||||
|   "name": "Example Mod", | ||||
|   "description": "Example placeholder mod.", | ||||
|   "version": "${version}", | ||||
|   "mcversion": "${mcversion}", | ||||
|   "url": "", | ||||
|   "updateUrl": "", | ||||
|   "authorList": ["ExampleDude"], | ||||
|   "credits": "The Forge and FML guys, for making this example", | ||||
|   "logoFile": "", | ||||
|   "screenshots": [], | ||||
|   "dependencies": [] | ||||
| } | ||||
| ] | ||||
							
								
								
									
										9
									
								
								samples/Jade/hello.pug
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								samples/Jade/hello.pug
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | ||||
| doctype html | ||||
| html | ||||
|   head | ||||
|     meta(charset='utf-8') | ||||
|     link(rel='stylesheet', type='text/css', href='main.css') | ||||
|     title Hello Pug | ||||
|   body | ||||
|     #text | ||||
|       include page | ||||
							
								
								
									
										625
									
								
								samples/Java/GrammarKit.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										625
									
								
								samples/Java/GrammarKit.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,625 @@ | ||||
| // This is a generated file. Not intended for manual editing. | ||||
| package org.intellij.grammar.parser; | ||||
|  | ||||
| import com.intellij.lang.PsiBuilder; | ||||
| import com.intellij.lang.PsiBuilder.Marker; | ||||
| import static org.intellij.grammar.psi.BnfTypes.*; | ||||
| import static org.intellij.grammar.parser.GeneratedParserUtilBase.*; | ||||
| import com.intellij.psi.tree.IElementType; | ||||
| import com.intellij.lang.ASTNode; | ||||
| import com.intellij.psi.tree.TokenSet; | ||||
| import com.intellij.lang.PsiParser; | ||||
| import com.intellij.lang.LightPsiParser; | ||||
|  | ||||
| @SuppressWarnings({"SimplifiableIfStatement", "UnusedAssignment"}) | ||||
| public class GrammarParser implements PsiParser, LightPsiParser { | ||||
|  | ||||
|   public ASTNode parse(IElementType t, PsiBuilder b) { | ||||
|     parseLight(t, b); | ||||
|     return b.getTreeBuilt(); | ||||
|   } | ||||
|  | ||||
|   public void parseLight(IElementType t, PsiBuilder b) { | ||||
|     boolean r; | ||||
|     b = adapt_builder_(t, b, this, EXTENDS_SETS_); | ||||
|     Marker m = enter_section_(b, 0, _COLLAPSE_, null); | ||||
|     if (t == BNF_ATTR) { | ||||
|       r = attr(b, 0); | ||||
|     } | ||||
|     else if (t == BNF_ATTR_PATTERN) { | ||||
|       r = attr_pattern(b, 0); | ||||
|     } | ||||
|     else if (t == BNF_ATTR_VALUE) { | ||||
|       r = attr_value(b, 0); | ||||
|     } | ||||
|     else if (t == BNF_ATTRS) { | ||||
|       r = attrs(b, 0); | ||||
|     } | ||||
|     else if (t == BNF_CHOICE) { | ||||
|       r = choice(b, 0); | ||||
|     } | ||||
|     else if (t == BNF_EXPRESSION) { | ||||
|       r = expression(b, 0); | ||||
|     } | ||||
|     else if (t == BNF_LITERAL_EXPRESSION) { | ||||
|       r = literal_expression(b, 0); | ||||
|     } | ||||
|     else if (t == BNF_MODIFIER) { | ||||
|       r = modifier(b, 0); | ||||
|     } | ||||
|     else if (t == BNF_PAREN_EXPRESSION) { | ||||
|       r = paren_expression(b, 0); | ||||
|     } | ||||
|     else if (t == BNF_PREDICATE) { | ||||
|       r = predicate(b, 0); | ||||
|     } | ||||
|     else if (t == BNF_PREDICATE_SIGN) { | ||||
|       r = predicate_sign(b, 0); | ||||
|     } | ||||
|     else if (t == BNF_QUANTIFIED) { | ||||
|       r = quantified(b, 0); | ||||
|     } | ||||
|     else if (t == BNF_QUANTIFIER) { | ||||
|       r = quantifier(b, 0); | ||||
|     } | ||||
|     else if (t == BNF_REFERENCE_OR_TOKEN) { | ||||
|       r = reference_or_token(b, 0); | ||||
|     } | ||||
|     else if (t == BNF_RULE) { | ||||
|       r = rule(b, 0); | ||||
|     } | ||||
|     else if (t == BNF_SEQUENCE) { | ||||
|       r = sequence(b, 0); | ||||
|     } | ||||
|     else if (t == BNF_STRING_LITERAL_EXPRESSION) { | ||||
|       r = string_literal_expression(b, 0); | ||||
|     } | ||||
|     else { | ||||
|       r = parse_root_(t, b, 0); | ||||
|     } | ||||
|     exit_section_(b, 0, m, t, r, true, TRUE_CONDITION); | ||||
|   } | ||||
|  | ||||
|   protected boolean parse_root_(IElementType t, PsiBuilder b, int l) { | ||||
|     return grammar(b, l + 1); | ||||
|   } | ||||
|  | ||||
|   public static final TokenSet[] EXTENDS_SETS_ = new TokenSet[] { | ||||
|     create_token_set_(BNF_LITERAL_EXPRESSION, BNF_STRING_LITERAL_EXPRESSION), | ||||
|     create_token_set_(BNF_CHOICE, BNF_EXPRESSION, BNF_LITERAL_EXPRESSION, BNF_PAREN_EXPRESSION, | ||||
|       BNF_PREDICATE, BNF_QUANTIFIED, BNF_REFERENCE_OR_TOKEN, BNF_SEQUENCE, | ||||
|       BNF_STRING_LITERAL_EXPRESSION), | ||||
|   }; | ||||
|  | ||||
|   /* ********************************************************** */ | ||||
|   // id attr_pattern? '=' attr_value ';'? | ||||
|   public static boolean attr(PsiBuilder b, int l) { | ||||
|     if (!recursion_guard_(b, l, "attr")) return false; | ||||
|     boolean r, p; | ||||
|     Marker m = enter_section_(b, l, _NONE_, "<attr>"); | ||||
|     r = consumeToken(b, BNF_ID); | ||||
|     p = r; // pin = 1 | ||||
|     r = r && report_error_(b, attr_1(b, l + 1)); | ||||
|     r = p && report_error_(b, consumeToken(b, BNF_OP_EQ)) && r; | ||||
|     r = p && report_error_(b, attr_value(b, l + 1)) && r; | ||||
|     r = p && attr_4(b, l + 1) && r; | ||||
|     exit_section_(b, l, m, BNF_ATTR, r, p, attr_recover_until_parser_); | ||||
|     return r || p; | ||||
|   } | ||||
|  | ||||
|   // attr_pattern? | ||||
|   private static boolean attr_1(PsiBuilder b, int l) { | ||||
|     if (!recursion_guard_(b, l, "attr_1")) return false; | ||||
|     attr_pattern(b, l + 1); | ||||
|     return true; | ||||
|   } | ||||
|  | ||||
|   // ';'? | ||||
|   private static boolean attr_4(PsiBuilder b, int l) { | ||||
|     if (!recursion_guard_(b, l, "attr_4")) return false; | ||||
|     consumeToken(b, BNF_SEMICOLON); | ||||
|     return true; | ||||
|   } | ||||
|  | ||||
|   /* ********************************************************** */ | ||||
|   // '(' string ')' | ||||
|   public static boolean attr_pattern(PsiBuilder b, int l) { | ||||
|     if (!recursion_guard_(b, l, "attr_pattern")) return false; | ||||
|     if (!nextTokenIs(b, BNF_LEFT_PAREN)) return false; | ||||
|     boolean r; | ||||
|     Marker m = enter_section_(b); | ||||
|     r = consumeToken(b, BNF_LEFT_PAREN); | ||||
|     r = r && consumeToken(b, BNF_STRING); | ||||
|     r = r && consumeToken(b, BNF_RIGHT_PAREN); | ||||
|     exit_section_(b, m, BNF_ATTR_PATTERN, r); | ||||
|     return r; | ||||
|   } | ||||
|  | ||||
|   /* ********************************************************** */ | ||||
|   // !'}' | ||||
|   static boolean attr_recover_until(PsiBuilder b, int l) { | ||||
|     if (!recursion_guard_(b, l, "attr_recover_until")) return false; | ||||
|     boolean r; | ||||
|     Marker m = enter_section_(b, l, _NOT_, null); | ||||
|     r = !consumeToken(b, BNF_RIGHT_BRACE); | ||||
|     exit_section_(b, l, m, null, r, false, null); | ||||
|     return r; | ||||
|   } | ||||
|  | ||||
|   /* ********************************************************** */ | ||||
|   // (reference_or_token | literal_expression) !'=' | ||||
|   public static boolean attr_value(PsiBuilder b, int l) { | ||||
|     if (!recursion_guard_(b, l, "attr_value")) return false; | ||||
|     boolean r; | ||||
|     Marker m = enter_section_(b, l, _NONE_, "<attr value>"); | ||||
|     r = attr_value_0(b, l + 1); | ||||
|     r = r && attr_value_1(b, l + 1); | ||||
|     exit_section_(b, l, m, BNF_ATTR_VALUE, r, false, null); | ||||
|     return r; | ||||
|   } | ||||
|  | ||||
|   // reference_or_token | literal_expression | ||||
|   private static boolean attr_value_0(PsiBuilder b, int l) { | ||||
|     if (!recursion_guard_(b, l, "attr_value_0")) return false; | ||||
|     boolean r; | ||||
|     Marker m = enter_section_(b); | ||||
|     r = reference_or_token(b, l + 1); | ||||
|     if (!r) r = literal_expression(b, l + 1); | ||||
|     exit_section_(b, m, null, r); | ||||
|     return r; | ||||
|   } | ||||
|  | ||||
|   // !'=' | ||||
|   private static boolean attr_value_1(PsiBuilder b, int l) { | ||||
|     if (!recursion_guard_(b, l, "attr_value_1")) return false; | ||||
|     boolean r; | ||||
|     Marker m = enter_section_(b, l, _NOT_, null); | ||||
|     r = !consumeToken(b, BNF_OP_EQ); | ||||
|     exit_section_(b, l, m, null, r, false, null); | ||||
|     return r; | ||||
|   } | ||||
|  | ||||
|   /* ********************************************************** */ | ||||
|   // '{' attr* '}' | ||||
|   public static boolean attrs(PsiBuilder b, int l) { | ||||
|     if (!recursion_guard_(b, l, "attrs")) return false; | ||||
|     if (!nextTokenIs(b, BNF_LEFT_BRACE)) return false; | ||||
|     boolean r, p; | ||||
|     Marker m = enter_section_(b, l, _NONE_, null); | ||||
|     r = consumeToken(b, BNF_LEFT_BRACE); | ||||
|     p = r; // pin = 1 | ||||
|     r = r && report_error_(b, attrs_1(b, l + 1)); | ||||
|     r = p && consumeToken(b, BNF_RIGHT_BRACE) && r; | ||||
|     exit_section_(b, l, m, BNF_ATTRS, r, p, null); | ||||
|     return r || p; | ||||
|   } | ||||
|  | ||||
|   // attr* | ||||
|   private static boolean attrs_1(PsiBuilder b, int l) { | ||||
|     if (!recursion_guard_(b, l, "attrs_1")) return false; | ||||
|     int c = current_position_(b); | ||||
|     while (true) { | ||||
|       if (!attr(b, l + 1)) break; | ||||
|       if (!empty_element_parsed_guard_(b, "attrs_1", c)) break; | ||||
|       c = current_position_(b); | ||||
|     } | ||||
|     return true; | ||||
|   } | ||||
|  | ||||
|   /* ********************************************************** */ | ||||
|   // '{' sequence ('|' sequence)* '}' | sequence choice_tail* | ||||
|   public static boolean choice(PsiBuilder b, int l) { | ||||
|     if (!recursion_guard_(b, l, "choice")) return false; | ||||
|     boolean r; | ||||
|     Marker m = enter_section_(b, l, _COLLAPSE_, "<choice>"); | ||||
|     r = choice_0(b, l + 1); | ||||
|     if (!r) r = choice_1(b, l + 1); | ||||
|     exit_section_(b, l, m, BNF_CHOICE, r, false, null); | ||||
|     return r; | ||||
|   } | ||||
|  | ||||
|   // '{' sequence ('|' sequence)* '}' | ||||
|   private static boolean choice_0(PsiBuilder b, int l) { | ||||
|     if (!recursion_guard_(b, l, "choice_0")) return false; | ||||
|     boolean r; | ||||
|     Marker m = enter_section_(b); | ||||
|     r = consumeToken(b, BNF_LEFT_BRACE); | ||||
|     r = r && sequence(b, l + 1); | ||||
|     r = r && choice_0_2(b, l + 1); | ||||
|     r = r && consumeToken(b, BNF_RIGHT_BRACE); | ||||
|     exit_section_(b, m, null, r); | ||||
|     return r; | ||||
|   } | ||||
|  | ||||
|   // ('|' sequence)* | ||||
|   private static boolean choice_0_2(PsiBuilder b, int l) { | ||||
|     if (!recursion_guard_(b, l, "choice_0_2")) return false; | ||||
|     int c = current_position_(b); | ||||
|     while (true) { | ||||
|       if (!choice_0_2_0(b, l + 1)) break; | ||||
|       if (!empty_element_parsed_guard_(b, "choice_0_2", c)) break; | ||||
|       c = current_position_(b); | ||||
|     } | ||||
|     return true; | ||||
|   } | ||||
|  | ||||
|   // '|' sequence | ||||
|   private static boolean choice_0_2_0(PsiBuilder b, int l) { | ||||
|     if (!recursion_guard_(b, l, "choice_0_2_0")) return false; | ||||
|     boolean r; | ||||
|     Marker m = enter_section_(b); | ||||
|     r = consumeToken(b, BNF_OP_OR); | ||||
|     r = r && sequence(b, l + 1); | ||||
|     exit_section_(b, m, null, r); | ||||
|     return r; | ||||
|   } | ||||
|  | ||||
|   // sequence choice_tail* | ||||
|   private static boolean choice_1(PsiBuilder b, int l) { | ||||
|     if (!recursion_guard_(b, l, "choice_1")) return false; | ||||
|     boolean r; | ||||
|     Marker m = enter_section_(b); | ||||
|     r = sequence(b, l + 1); | ||||
|     r = r && choice_1_1(b, l + 1); | ||||
|     exit_section_(b, m, null, r); | ||||
|     return r; | ||||
|   } | ||||
|  | ||||
|   // choice_tail* | ||||
|   private static boolean choice_1_1(PsiBuilder b, int l) { | ||||
|     if (!recursion_guard_(b, l, "choice_1_1")) return false; | ||||
|     int c = current_position_(b); | ||||
|     while (true) { | ||||
|       if (!choice_tail(b, l + 1)) break; | ||||
|       if (!empty_element_parsed_guard_(b, "choice_1_1", c)) break; | ||||
|       c = current_position_(b); | ||||
|     } | ||||
|     return true; | ||||
|   } | ||||
|  | ||||
|   /* ********************************************************** */ | ||||
|   // '|' sequence | ||||
|   static boolean choice_tail(PsiBuilder b, int l) { | ||||
|     if (!recursion_guard_(b, l, "choice_tail")) return false; | ||||
|     if (!nextTokenIs(b, BNF_OP_OR)) return false; | ||||
|     boolean r, p; | ||||
|     Marker m = enter_section_(b, l, _NONE_, null); | ||||
|     r = consumeToken(b, BNF_OP_OR); | ||||
|     p = r; // pin = 1 | ||||
|     r = r && sequence(b, l + 1); | ||||
|     exit_section_(b, l, m, null, r, p, null); | ||||
|     return r || p; | ||||
|   } | ||||
|  | ||||
|   /* ********************************************************** */ | ||||
|   // choice? | ||||
|   public static boolean expression(PsiBuilder b, int l) { | ||||
|     if (!recursion_guard_(b, l, "expression")) return false; | ||||
|     Marker m = enter_section_(b, l, _COLLAPSE_, "<expression>"); | ||||
|     choice(b, l + 1); | ||||
|     exit_section_(b, l, m, BNF_EXPRESSION, true, false, null); | ||||
|     return true; | ||||
|   } | ||||
|  | ||||
|   /* ********************************************************** */ | ||||
|   // (attrs | rule) * | ||||
|   static boolean grammar(PsiBuilder b, int l) { | ||||
|     if (!recursion_guard_(b, l, "grammar")) return false; | ||||
|     int c = current_position_(b); | ||||
|     while (true) { | ||||
|       if (!grammar_0(b, l + 1)) break; | ||||
|       if (!empty_element_parsed_guard_(b, "grammar", c)) break; | ||||
|       c = current_position_(b); | ||||
|     } | ||||
|     return true; | ||||
|   } | ||||
|  | ||||
|   // attrs | rule | ||||
|   private static boolean grammar_0(PsiBuilder b, int l) { | ||||
|     if (!recursion_guard_(b, l, "grammar_0")) return false; | ||||
|     boolean r; | ||||
|     Marker m = enter_section_(b); | ||||
|     r = attrs(b, l + 1); | ||||
|     if (!r) r = rule(b, l + 1); | ||||
|     exit_section_(b, m, null, r); | ||||
|     return r; | ||||
|   } | ||||
|  | ||||
|   /* ********************************************************** */ | ||||
|   // string_literal_expression | number | ||||
|   public static boolean literal_expression(PsiBuilder b, int l) { | ||||
|     if (!recursion_guard_(b, l, "literal_expression")) return false; | ||||
|     if (!nextTokenIs(b, "<literal expression>", BNF_NUMBER, BNF_STRING)) return false; | ||||
|     boolean r; | ||||
|     Marker m = enter_section_(b, l, _COLLAPSE_, "<literal expression>"); | ||||
|     r = string_literal_expression(b, l + 1); | ||||
|     if (!r) r = consumeToken(b, BNF_NUMBER); | ||||
|     exit_section_(b, l, m, BNF_LITERAL_EXPRESSION, r, false, null); | ||||
|     return r; | ||||
|   } | ||||
|  | ||||
|   /* ********************************************************** */ | ||||
|   // 'private' | 'external' | 'wrapped' | ||||
|   public static boolean modifier(PsiBuilder b, int l) { | ||||
|     if (!recursion_guard_(b, l, "modifier")) return false; | ||||
|     boolean r; | ||||
|     Marker m = enter_section_(b, l, _NONE_, "<modifier>"); | ||||
|     r = consumeToken(b, "private"); | ||||
|     if (!r) r = consumeToken(b, "external"); | ||||
|     if (!r) r = consumeToken(b, "wrapped"); | ||||
|     exit_section_(b, l, m, BNF_MODIFIER, r, false, null); | ||||
|     return r; | ||||
|   } | ||||
|  | ||||
|   /* ********************************************************** */ | ||||
|   // quantified | predicate | ||||
|   static boolean option(PsiBuilder b, int l) { | ||||
|     if (!recursion_guard_(b, l, "option")) return false; | ||||
|     boolean r; | ||||
|     Marker m = enter_section_(b); | ||||
|     r = quantified(b, l + 1); | ||||
|     if (!r) r = predicate(b, l + 1); | ||||
|     exit_section_(b, m, null, r); | ||||
|     return r; | ||||
|   } | ||||
|  | ||||
|   /* ********************************************************** */ | ||||
|   // '(' expression ')' | ||||
|   public static boolean paren_expression(PsiBuilder b, int l) { | ||||
|     if (!recursion_guard_(b, l, "paren_expression")) return false; | ||||
|     if (!nextTokenIs(b, BNF_LEFT_PAREN)) return false; | ||||
|     boolean r, p; | ||||
|     Marker m = enter_section_(b, l, _NONE_, null); | ||||
|     r = consumeToken(b, BNF_LEFT_PAREN); | ||||
|     p = r; // pin = 1 | ||||
|     r = r && report_error_(b, expression(b, l + 1)); | ||||
|     r = p && consumeToken(b, BNF_RIGHT_PAREN) && r; | ||||
|     exit_section_(b, l, m, BNF_PAREN_EXPRESSION, r, p, null); | ||||
|     return r || p; | ||||
|   } | ||||
|  | ||||
|   /* ********************************************************** */ | ||||
|   // predicate_sign  simple | ||||
|   public static boolean predicate(PsiBuilder b, int l) { | ||||
|     if (!recursion_guard_(b, l, "predicate")) return false; | ||||
|     if (!nextTokenIs(b, "<predicate>", BNF_OP_NOT, BNF_OP_AND)) return false; | ||||
|     boolean r; | ||||
|     Marker m = enter_section_(b, l, _NONE_, "<predicate>"); | ||||
|     r = predicate_sign(b, l + 1); | ||||
|     r = r && simple(b, l + 1); | ||||
|     exit_section_(b, l, m, BNF_PREDICATE, r, false, null); | ||||
|     return r; | ||||
|   } | ||||
|  | ||||
|   /* ********************************************************** */ | ||||
|   // '&' | '!' | ||||
|   public static boolean predicate_sign(PsiBuilder b, int l) { | ||||
|     if (!recursion_guard_(b, l, "predicate_sign")) return false; | ||||
|     if (!nextTokenIs(b, "<predicate sign>", BNF_OP_NOT, BNF_OP_AND)) return false; | ||||
|     boolean r; | ||||
|     Marker m = enter_section_(b, l, _NONE_, "<predicate sign>"); | ||||
|     r = consumeToken(b, BNF_OP_AND); | ||||
|     if (!r) r = consumeToken(b, BNF_OP_NOT); | ||||
|     exit_section_(b, l, m, BNF_PREDICATE_SIGN, r, false, null); | ||||
|     return r; | ||||
|   } | ||||
|  | ||||
|   /* ********************************************************** */ | ||||
|   // '[' expression ']' | simple quantifier? | ||||
|   public static boolean quantified(PsiBuilder b, int l) { | ||||
|     if (!recursion_guard_(b, l, "quantified")) return false; | ||||
|     boolean r; | ||||
|     Marker m = enter_section_(b, l, _COLLAPSE_, "<quantified>"); | ||||
|     r = quantified_0(b, l + 1); | ||||
|     if (!r) r = quantified_1(b, l + 1); | ||||
|     exit_section_(b, l, m, BNF_QUANTIFIED, r, false, null); | ||||
|     return r; | ||||
|   } | ||||
|  | ||||
|   // '[' expression ']' | ||||
|   private static boolean quantified_0(PsiBuilder b, int l) { | ||||
|     if (!recursion_guard_(b, l, "quantified_0")) return false; | ||||
|     boolean r; | ||||
|     Marker m = enter_section_(b); | ||||
|     r = consumeToken(b, BNF_LEFT_BRACKET); | ||||
|     r = r && expression(b, l + 1); | ||||
|     r = r && consumeToken(b, BNF_RIGHT_BRACKET); | ||||
|     exit_section_(b, m, null, r); | ||||
|     return r; | ||||
|   } | ||||
|  | ||||
|   // simple quantifier? | ||||
|   private static boolean quantified_1(PsiBuilder b, int l) { | ||||
|     if (!recursion_guard_(b, l, "quantified_1")) return false; | ||||
|     boolean r; | ||||
|     Marker m = enter_section_(b); | ||||
|     r = simple(b, l + 1); | ||||
|     r = r && quantified_1_1(b, l + 1); | ||||
|     exit_section_(b, m, null, r); | ||||
|     return r; | ||||
|   } | ||||
|  | ||||
|   // quantifier? | ||||
|   private static boolean quantified_1_1(PsiBuilder b, int l) { | ||||
|     if (!recursion_guard_(b, l, "quantified_1_1")) return false; | ||||
|     quantifier(b, l + 1); | ||||
|     return true; | ||||
|   } | ||||
|  | ||||
|   /* ********************************************************** */ | ||||
|   // '?' | '+' | '*' | ||||
|   public static boolean quantifier(PsiBuilder b, int l) { | ||||
|     if (!recursion_guard_(b, l, "quantifier")) return false; | ||||
|     boolean r; | ||||
|     Marker m = enter_section_(b, l, _NONE_, "<quantifier>"); | ||||
|     r = consumeToken(b, BNF_OP_OPT); | ||||
|     if (!r) r = consumeToken(b, BNF_OP_ONEMORE); | ||||
|     if (!r) r = consumeToken(b, BNF_OP_ZEROMORE); | ||||
|     exit_section_(b, l, m, BNF_QUANTIFIER, r, false, null); | ||||
|     return r; | ||||
|   } | ||||
|  | ||||
|   /* ********************************************************** */ | ||||
|   // id | ||||
|   public static boolean reference_or_token(PsiBuilder b, int l) { | ||||
|     if (!recursion_guard_(b, l, "reference_or_token")) return false; | ||||
|     if (!nextTokenIs(b, BNF_ID)) return false; | ||||
|     boolean r; | ||||
|     Marker m = enter_section_(b); | ||||
|     r = consumeToken(b, BNF_ID); | ||||
|     exit_section_(b, m, BNF_REFERENCE_OR_TOKEN, r); | ||||
|     return r; | ||||
|   } | ||||
|  | ||||
|   /* ********************************************************** */ | ||||
|   // modifier* id '::=' expression attrs? ';'? | ||||
|   public static boolean rule(PsiBuilder b, int l) { | ||||
|     if (!recursion_guard_(b, l, "rule")) return false; | ||||
|     boolean r, p; | ||||
|     Marker m = enter_section_(b, l, _NONE_, "<rule>"); | ||||
|     r = rule_0(b, l + 1); | ||||
|     r = r && consumeToken(b, BNF_ID); | ||||
|     r = r && consumeToken(b, BNF_OP_IS); | ||||
|     p = r; // pin = 3 | ||||
|     r = r && report_error_(b, expression(b, l + 1)); | ||||
|     r = p && report_error_(b, rule_4(b, l + 1)) && r; | ||||
|     r = p && rule_5(b, l + 1) && r; | ||||
|     exit_section_(b, l, m, BNF_RULE, r, p, rule_recover_until_parser_); | ||||
|     return r || p; | ||||
|   } | ||||
|  | ||||
|   // modifier* | ||||
|   private static boolean rule_0(PsiBuilder b, int l) { | ||||
|     if (!recursion_guard_(b, l, "rule_0")) return false; | ||||
|     int c = current_position_(b); | ||||
|     while (true) { | ||||
|       if (!modifier(b, l + 1)) break; | ||||
|       if (!empty_element_parsed_guard_(b, "rule_0", c)) break; | ||||
|       c = current_position_(b); | ||||
|     } | ||||
|     return true; | ||||
|   } | ||||
|  | ||||
|   // attrs? | ||||
|   private static boolean rule_4(PsiBuilder b, int l) { | ||||
|     if (!recursion_guard_(b, l, "rule_4")) return false; | ||||
|     attrs(b, l + 1); | ||||
|     return true; | ||||
|   } | ||||
|  | ||||
|   // ';'? | ||||
|   private static boolean rule_5(PsiBuilder b, int l) { | ||||
|     if (!recursion_guard_(b, l, "rule_5")) return false; | ||||
|     consumeToken(b, BNF_SEMICOLON); | ||||
|     return true; | ||||
|   } | ||||
|  | ||||
|   /* ********************************************************** */ | ||||
|   // !'{' | ||||
|   static boolean rule_recover_until(PsiBuilder b, int l) { | ||||
|     if (!recursion_guard_(b, l, "rule_recover_until")) return false; | ||||
|     boolean r; | ||||
|     Marker m = enter_section_(b, l, _NOT_, null); | ||||
|     r = !consumeToken(b, BNF_LEFT_BRACE); | ||||
|     exit_section_(b, l, m, null, r, false, null); | ||||
|     return r; | ||||
|   } | ||||
|  | ||||
|   /* ********************************************************** */ | ||||
|   // option + | ||||
|   public static boolean sequence(PsiBuilder b, int l) { | ||||
|     if (!recursion_guard_(b, l, "sequence")) return false; | ||||
|     boolean r; | ||||
|     Marker m = enter_section_(b, l, _COLLAPSE_, "<sequence>"); | ||||
|     r = option(b, l + 1); | ||||
|     int c = current_position_(b); | ||||
|     while (r) { | ||||
|       if (!option(b, l + 1)) break; | ||||
|       if (!empty_element_parsed_guard_(b, "sequence", c)) break; | ||||
|       c = current_position_(b); | ||||
|     } | ||||
|     exit_section_(b, l, m, BNF_SEQUENCE, r, false, null); | ||||
|     return r; | ||||
|   } | ||||
|  | ||||
|   /* ********************************************************** */ | ||||
|   // !(modifier* id '::=' ) reference_or_token | literal_expression | paren_expression | ||||
|   static boolean simple(PsiBuilder b, int l) { | ||||
|     if (!recursion_guard_(b, l, "simple")) return false; | ||||
|     boolean r; | ||||
|     Marker m = enter_section_(b); | ||||
|     r = simple_0(b, l + 1); | ||||
|     if (!r) r = literal_expression(b, l + 1); | ||||
|     if (!r) r = paren_expression(b, l + 1); | ||||
|     exit_section_(b, m, null, r); | ||||
|     return r; | ||||
|   } | ||||
|  | ||||
|   // !(modifier* id '::=' ) reference_or_token | ||||
|   private static boolean simple_0(PsiBuilder b, int l) { | ||||
|     if (!recursion_guard_(b, l, "simple_0")) return false; | ||||
|     boolean r; | ||||
|     Marker m = enter_section_(b); | ||||
|     r = simple_0_0(b, l + 1); | ||||
|     r = r && reference_or_token(b, l + 1); | ||||
|     exit_section_(b, m, null, r); | ||||
|     return r; | ||||
|   } | ||||
|  | ||||
|   // !(modifier* id '::=' ) | ||||
|   private static boolean simple_0_0(PsiBuilder b, int l) { | ||||
|     if (!recursion_guard_(b, l, "simple_0_0")) return false; | ||||
|     boolean r; | ||||
|     Marker m = enter_section_(b, l, _NOT_, null); | ||||
|     r = !simple_0_0_0(b, l + 1); | ||||
|     exit_section_(b, l, m, null, r, false, null); | ||||
|     return r; | ||||
|   } | ||||
|  | ||||
|   // modifier* id '::=' | ||||
|   private static boolean simple_0_0_0(PsiBuilder b, int l) { | ||||
|     if (!recursion_guard_(b, l, "simple_0_0_0")) return false; | ||||
|     boolean r; | ||||
|     Marker m = enter_section_(b); | ||||
|     r = simple_0_0_0_0(b, l + 1); | ||||
|     r = r && consumeToken(b, BNF_ID); | ||||
|     r = r && consumeToken(b, BNF_OP_IS); | ||||
|     exit_section_(b, m, null, r); | ||||
|     return r; | ||||
|   } | ||||
|  | ||||
|   // modifier* | ||||
|   private static boolean simple_0_0_0_0(PsiBuilder b, int l) { | ||||
|     if (!recursion_guard_(b, l, "simple_0_0_0_0")) return false; | ||||
|     int c = current_position_(b); | ||||
|     while (true) { | ||||
|       if (!modifier(b, l + 1)) break; | ||||
|       if (!empty_element_parsed_guard_(b, "simple_0_0_0_0", c)) break; | ||||
|       c = current_position_(b); | ||||
|     } | ||||
|     return true; | ||||
|   } | ||||
|  | ||||
|   /* ********************************************************** */ | ||||
|   // string | ||||
|   public static boolean string_literal_expression(PsiBuilder b, int l) { | ||||
|     if (!recursion_guard_(b, l, "string_literal_expression")) return false; | ||||
|     if (!nextTokenIs(b, BNF_STRING)) return false; | ||||
|     boolean r; | ||||
|     Marker m = enter_section_(b); | ||||
|     r = consumeToken(b, BNF_STRING); | ||||
|     exit_section_(b, m, BNF_STRING_LITERAL_EXPRESSION, r); | ||||
|     return r; | ||||
|   } | ||||
|  | ||||
|   final static Parser attr_recover_until_parser_ = new Parser() { | ||||
|     public boolean parse(PsiBuilder b, int l) { | ||||
|       return attr_recover_until(b, l + 1); | ||||
|     } | ||||
|   }; | ||||
|   final static Parser rule_recover_until_parser_ = new Parser() { | ||||
|     public boolean parse(PsiBuilder b, int l) { | ||||
|       return rule_recover_until(b, l + 1); | ||||
|     } | ||||
|   }; | ||||
| } | ||||
							
								
								
									
										482
									
								
								samples/Java/JFlexLexer.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										482
									
								
								samples/Java/JFlexLexer.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,482 @@ | ||||
| /* The following code was generated by JFlex 1.4.3 on 28/01/16 11:27 */ | ||||
|  | ||||
| package test; | ||||
| import com.intellij.lexer.*; | ||||
| import com.intellij.psi.tree.IElementType; | ||||
| import static org.intellij.grammar.psi.BnfTypes.*; | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * This class is a scanner generated by  | ||||
|  * <a href="http://www.jflex.de/">JFlex</a> 1.4.3 | ||||
|  * on 28/01/16 11:27 from the specification file | ||||
|  * <tt>/home/abigail/code/intellij-grammar-kit-test/src/test/_GrammarLexer.flex</tt> | ||||
|  */ | ||||
| public class _GrammarLexer implements FlexLexer { | ||||
|   /** initial size of the lookahead buffer */ | ||||
|   private static final int ZZ_BUFFERSIZE = 16384; | ||||
|  | ||||
|   /** lexical states */ | ||||
|   public static final int YYINITIAL = 0; | ||||
|  | ||||
|   /** | ||||
|    * ZZ_LEXSTATE[l] is the state in the DFA for the lexical state l | ||||
|    * ZZ_LEXSTATE[l+1] is the state in the DFA for the lexical state l | ||||
|    *                  at the beginning of a line | ||||
|    * l is of the form l = 2*k, k a non negative integer | ||||
|    */ | ||||
|   private static final int ZZ_LEXSTATE[] = {  | ||||
|      0, 0 | ||||
|   }; | ||||
|  | ||||
|   /**  | ||||
|    * Translates characters to character classes | ||||
|    */ | ||||
|   private static final String ZZ_CMAP_PACKED =  | ||||
|     "\11\0\1\1\1\1\1\0\1\1\1\1\22\0\1\1\101\0\1\13"+ | ||||
|     "\1\0\1\3\1\14\1\0\1\10\1\0\1\2\3\0\1\12\1\7"+ | ||||
|     "\3\0\1\6\1\4\1\5\1\11\uff8a\0"; | ||||
|  | ||||
|   /**  | ||||
|    * Translates characters to character classes | ||||
|    */ | ||||
|   private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED); | ||||
|  | ||||
|   /**  | ||||
|    * Translates DFA states to action switch labels. | ||||
|    */ | ||||
|   private static final int [] ZZ_ACTION = zzUnpackAction(); | ||||
|  | ||||
|   private static final String ZZ_ACTION_PACKED_0 = | ||||
|     "\1\0\1\1\1\2\3\1\1\3\10\0\1\4\1\5"; | ||||
|  | ||||
|   private static int [] zzUnpackAction() { | ||||
|     int [] result = new int[17]; | ||||
|     int offset = 0; | ||||
|     offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result); | ||||
|     return result; | ||||
|   } | ||||
|  | ||||
|   private static int zzUnpackAction(String packed, int offset, int [] result) { | ||||
|     int i = 0;       /* index in packed string  */ | ||||
|     int j = offset;  /* index in unpacked array */ | ||||
|     int l = packed.length(); | ||||
|     while (i < l) { | ||||
|       int count = packed.charAt(i++); | ||||
|       int value = packed.charAt(i++); | ||||
|       do result[j++] = value; while (--count > 0); | ||||
|     } | ||||
|     return j; | ||||
|   } | ||||
|  | ||||
|  | ||||
|   /**  | ||||
|    * Translates a state to a row index in the transition table | ||||
|    */ | ||||
|   private static final int [] ZZ_ROWMAP = zzUnpackRowMap(); | ||||
|  | ||||
|   private static final String ZZ_ROWMAP_PACKED_0 = | ||||
|     "\0\0\0\15\0\32\0\47\0\64\0\101\0\15\0\116"+ | ||||
|     "\0\133\0\150\0\165\0\202\0\217\0\234\0\251\0\15"+ | ||||
|     "\0\15"; | ||||
|  | ||||
|   private static int [] zzUnpackRowMap() { | ||||
|     int [] result = new int[17]; | ||||
|     int offset = 0; | ||||
|     offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result); | ||||
|     return result; | ||||
|   } | ||||
|  | ||||
|   private static int zzUnpackRowMap(String packed, int offset, int [] result) { | ||||
|     int i = 0;  /* index in packed string  */ | ||||
|     int j = offset;  /* index in unpacked array */ | ||||
|     int l = packed.length(); | ||||
|     while (i < l) { | ||||
|       int high = packed.charAt(i++) << 16; | ||||
|       result[j++] = high | packed.charAt(i++); | ||||
|     } | ||||
|     return j; | ||||
|   } | ||||
|  | ||||
|   /**  | ||||
|    * The transition table of the DFA | ||||
|    */ | ||||
|   private static final int [] ZZ_TRANS = zzUnpackTrans(); | ||||
|  | ||||
|   private static final String ZZ_TRANS_PACKED_0 = | ||||
|     "\1\2\1\3\1\4\1\2\1\5\2\2\1\6\5\2"+ | ||||
|     "\16\0\1\3\16\0\1\7\16\0\1\10\20\0\1\11"+ | ||||
|     "\11\0\1\12\20\0\1\13\4\0\1\14\25\0\1\15"+ | ||||
|     "\10\0\1\16\21\0\1\17\10\0\1\20\12\0\1\21"+ | ||||
|     "\6\0"; | ||||
|  | ||||
|   private static int [] zzUnpackTrans() { | ||||
|     int [] result = new int[182]; | ||||
|     int offset = 0; | ||||
|     offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result); | ||||
|     return result; | ||||
|   } | ||||
|  | ||||
|   private static int zzUnpackTrans(String packed, int offset, int [] result) { | ||||
|     int i = 0;       /* index in packed string  */ | ||||
|     int j = offset;  /* index in unpacked array */ | ||||
|     int l = packed.length(); | ||||
|     while (i < l) { | ||||
|       int count = packed.charAt(i++); | ||||
|       int value = packed.charAt(i++); | ||||
|       value--; | ||||
|       do result[j++] = value; while (--count > 0); | ||||
|     } | ||||
|     return j; | ||||
|   } | ||||
|  | ||||
|  | ||||
|   /* error codes */ | ||||
|   private static final int ZZ_UNKNOWN_ERROR = 0; | ||||
|   private static final int ZZ_NO_MATCH = 1; | ||||
|   private static final int ZZ_PUSHBACK_2BIG = 2; | ||||
|   private static final char[] EMPTY_BUFFER = new char[0]; | ||||
|   private static final int YYEOF = -1; | ||||
|   private static java.io.Reader zzReader = null; // Fake | ||||
|  | ||||
|   /* error messages for the codes above */ | ||||
|   private static final String ZZ_ERROR_MSG[] = { | ||||
|     "Unkown internal scanner error", | ||||
|     "Error: could not match input", | ||||
|     "Error: pushback value was too large" | ||||
|   }; | ||||
|  | ||||
|   /** | ||||
|    * ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code> | ||||
|    */ | ||||
|   private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute(); | ||||
|  | ||||
|   private static final String ZZ_ATTRIBUTE_PACKED_0 = | ||||
|     "\1\0\1\11\4\1\1\11\10\0\2\11"; | ||||
|  | ||||
|   private static int [] zzUnpackAttribute() { | ||||
|     int [] result = new int[17]; | ||||
|     int offset = 0; | ||||
|     offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result); | ||||
|     return result; | ||||
|   } | ||||
|  | ||||
|   private static int zzUnpackAttribute(String packed, int offset, int [] result) { | ||||
|     int i = 0;       /* index in packed string  */ | ||||
|     int j = offset;  /* index in unpacked array */ | ||||
|     int l = packed.length(); | ||||
|     while (i < l) { | ||||
|       int count = packed.charAt(i++); | ||||
|       int value = packed.charAt(i++); | ||||
|       do result[j++] = value; while (--count > 0); | ||||
|     } | ||||
|     return j; | ||||
|   } | ||||
|  | ||||
|   /** the current state of the DFA */ | ||||
|   private int zzState; | ||||
|  | ||||
|   /** the current lexical state */ | ||||
|   private int zzLexicalState = YYINITIAL; | ||||
|  | ||||
|   /** this buffer contains the current text to be matched and is | ||||
|       the source of the yytext() string */ | ||||
|   private CharSequence zzBuffer = ""; | ||||
|  | ||||
|   /** this buffer may contains the current text array to be matched when it is cheap to acquire it */ | ||||
|   private char[] zzBufferArray; | ||||
|  | ||||
|   /** the textposition at the last accepting state */ | ||||
|   private int zzMarkedPos; | ||||
|  | ||||
|   /** the textposition at the last state to be included in yytext */ | ||||
|   private int zzPushbackPos; | ||||
|  | ||||
|   /** the current text position in the buffer */ | ||||
|   private int zzCurrentPos; | ||||
|  | ||||
|   /** startRead marks the beginning of the yytext() string in the buffer */ | ||||
|   private int zzStartRead; | ||||
|  | ||||
|   /** endRead marks the last character in the buffer, that has been read | ||||
|       from input */ | ||||
|   private int zzEndRead; | ||||
|  | ||||
|   /** | ||||
|    * zzAtBOL == true <=> the scanner is currently at the beginning of a line | ||||
|    */ | ||||
|   private boolean zzAtBOL = true; | ||||
|  | ||||
|   /** zzAtEOF == true <=> the scanner is at the EOF */ | ||||
|   private boolean zzAtEOF; | ||||
|  | ||||
|   /* user code: */ | ||||
|   public _GrammarLexer() { | ||||
|     this((java.io.Reader)null); | ||||
|   } | ||||
|  | ||||
|  | ||||
|   /** | ||||
|    * Creates a new scanner | ||||
|    * | ||||
|    * @param   in  the java.io.Reader to read input from. | ||||
|    */ | ||||
|   public _GrammarLexer(java.io.Reader in) { | ||||
|     this.zzReader = in; | ||||
|   } | ||||
|  | ||||
|  | ||||
|   /**  | ||||
|    * Unpacks the compressed character translation table. | ||||
|    * | ||||
|    * @param packed   the packed character translation table | ||||
|    * @return         the unpacked character translation table | ||||
|    */ | ||||
|   private static char [] zzUnpackCMap(String packed) { | ||||
|     char [] map = new char[0x10000]; | ||||
|     int i = 0;  /* index in packed string  */ | ||||
|     int j = 0;  /* index in unpacked array */ | ||||
|     while (i < 52) { | ||||
|       int  count = packed.charAt(i++); | ||||
|       char value = packed.charAt(i++); | ||||
|       do map[j++] = value; while (--count > 0); | ||||
|     } | ||||
|     return map; | ||||
|   } | ||||
|  | ||||
|   public final int getTokenStart(){ | ||||
|     return zzStartRead; | ||||
|   } | ||||
|  | ||||
|   public final int getTokenEnd(){ | ||||
|     return getTokenStart() + yylength(); | ||||
|   } | ||||
|  | ||||
|   public void reset(CharSequence buffer, int start, int end,int initialState){ | ||||
|     zzBuffer = buffer; | ||||
|     zzBufferArray = com.intellij.util.text.CharArrayUtil.fromSequenceWithoutCopying(buffer); | ||||
|     zzCurrentPos = zzMarkedPos = zzStartRead = start; | ||||
|     zzPushbackPos = 0; | ||||
|     zzAtEOF  = false; | ||||
|     zzAtBOL = true; | ||||
|     zzEndRead = end; | ||||
|     yybegin(initialState); | ||||
|   } | ||||
|  | ||||
|   /** | ||||
|    * Refills the input buffer. | ||||
|    * | ||||
|    * @return      <code>false</code>, iff there was new input. | ||||
|    * | ||||
|    * @exception   java.io.IOException  if any I/O-Error occurs | ||||
|    */ | ||||
|   private boolean zzRefill() throws java.io.IOException { | ||||
|     return true; | ||||
|   } | ||||
|  | ||||
|  | ||||
|   /** | ||||
|    * Returns the current lexical state. | ||||
|    */ | ||||
|   public final int yystate() { | ||||
|     return zzLexicalState; | ||||
|   } | ||||
|  | ||||
|  | ||||
|   /** | ||||
|    * Enters a new lexical state | ||||
|    * | ||||
|    * @param newState the new lexical state | ||||
|    */ | ||||
|   public final void yybegin(int newState) { | ||||
|     zzLexicalState = newState; | ||||
|   } | ||||
|  | ||||
|  | ||||
|   /** | ||||
|    * Returns the text matched by the current regular expression. | ||||
|    */ | ||||
|   public final CharSequence yytext() { | ||||
|     return zzBuffer.subSequence(zzStartRead, zzMarkedPos); | ||||
|   } | ||||
|  | ||||
|  | ||||
|   /** | ||||
|    * Returns the character at position <tt>pos</tt> from the | ||||
|    * matched text. | ||||
|    * | ||||
|    * It is equivalent to yytext().charAt(pos), but faster | ||||
|    * | ||||
|    * @param pos the position of the character to fetch. | ||||
|    *            A value from 0 to yylength()-1. | ||||
|    * | ||||
|    * @return the character at position pos | ||||
|    */ | ||||
|   public final char yycharat(int pos) { | ||||
|     return zzBufferArray != null ? zzBufferArray[zzStartRead+pos]:zzBuffer.charAt(zzStartRead+pos); | ||||
|   } | ||||
|  | ||||
|  | ||||
|   /** | ||||
|    * Returns the length of the matched text region. | ||||
|    */ | ||||
|   public final int yylength() { | ||||
|     return zzMarkedPos-zzStartRead; | ||||
|   } | ||||
|  | ||||
|  | ||||
|   /** | ||||
|    * Reports an error that occured while scanning. | ||||
|    * | ||||
|    * In a wellformed scanner (no or only correct usage of | ||||
|    * yypushback(int) and a match-all fallback rule) this method | ||||
|    * will only be called with things that "Can't Possibly Happen". | ||||
|    * If this method is called, something is seriously wrong | ||||
|    * (e.g. a JFlex bug producing a faulty scanner etc.). | ||||
|    * | ||||
|    * Usual syntax/scanner level error handling should be done | ||||
|    * in error fallback rules. | ||||
|    * | ||||
|    * @param   errorCode  the code of the errormessage to display | ||||
|    */ | ||||
|   private void zzScanError(int errorCode) { | ||||
|     String message; | ||||
|     try { | ||||
|       message = ZZ_ERROR_MSG[errorCode]; | ||||
|     } | ||||
|     catch (ArrayIndexOutOfBoundsException e) { | ||||
|       message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR]; | ||||
|     } | ||||
|  | ||||
|     throw new Error(message); | ||||
|   } | ||||
|  | ||||
|  | ||||
|   /** | ||||
|    * Pushes the specified amount of characters back into the input stream. | ||||
|    * | ||||
|    * They will be read again by then next call of the scanning method | ||||
|    * | ||||
|    * @param number  the number of characters to be read again. | ||||
|    *                This number must not be greater than yylength()! | ||||
|    */ | ||||
|   public void yypushback(int number)  { | ||||
|     if ( number > yylength() ) | ||||
|       zzScanError(ZZ_PUSHBACK_2BIG); | ||||
|  | ||||
|     zzMarkedPos -= number; | ||||
|   } | ||||
|  | ||||
|  | ||||
|   /** | ||||
|    * Resumes scanning until the next regular expression is matched, | ||||
|    * the end of input is encountered or an I/O-Error occurs. | ||||
|    * | ||||
|    * @return      the next token | ||||
|    * @exception   java.io.IOException  if any I/O-Error occurs | ||||
|    */ | ||||
|   public IElementType advance() throws java.io.IOException { | ||||
|     int zzInput; | ||||
|     int zzAction; | ||||
|  | ||||
|     // cached fields: | ||||
|     int zzCurrentPosL; | ||||
|     int zzMarkedPosL; | ||||
|     int zzEndReadL = zzEndRead; | ||||
|     CharSequence zzBufferL = zzBuffer; | ||||
|     char[] zzBufferArrayL = zzBufferArray; | ||||
|     char [] zzCMapL = ZZ_CMAP; | ||||
|  | ||||
|     int [] zzTransL = ZZ_TRANS; | ||||
|     int [] zzRowMapL = ZZ_ROWMAP; | ||||
|     int [] zzAttrL = ZZ_ATTRIBUTE; | ||||
|  | ||||
|     while (true) { | ||||
|       zzMarkedPosL = zzMarkedPos; | ||||
|  | ||||
|       zzAction = -1; | ||||
|  | ||||
|       zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL; | ||||
|  | ||||
|       zzState = ZZ_LEXSTATE[zzLexicalState]; | ||||
|  | ||||
|  | ||||
|       zzForAction: { | ||||
|         while (true) { | ||||
|  | ||||
|           if (zzCurrentPosL < zzEndReadL) | ||||
|             zzInput = (zzBufferArrayL != null ? zzBufferArrayL[zzCurrentPosL++] : zzBufferL.charAt(zzCurrentPosL++)); | ||||
|           else if (zzAtEOF) { | ||||
|             zzInput = YYEOF; | ||||
|             break zzForAction; | ||||
|           } | ||||
|           else { | ||||
|             // store back cached positions | ||||
|             zzCurrentPos  = zzCurrentPosL; | ||||
|             zzMarkedPos   = zzMarkedPosL; | ||||
|             boolean eof = zzRefill(); | ||||
|             // get translated positions and possibly new buffer | ||||
|             zzCurrentPosL  = zzCurrentPos; | ||||
|             zzMarkedPosL   = zzMarkedPos; | ||||
|             zzBufferL      = zzBuffer; | ||||
|             zzEndReadL     = zzEndRead; | ||||
|             if (eof) { | ||||
|               zzInput = YYEOF; | ||||
|               break zzForAction; | ||||
|             } | ||||
|             else { | ||||
|               zzInput = (zzBufferArrayL != null ? zzBufferArrayL[zzCurrentPosL++] : zzBufferL.charAt(zzCurrentPosL++)); | ||||
|             } | ||||
|           } | ||||
|           int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ]; | ||||
|           if (zzNext == -1) break zzForAction; | ||||
|           zzState = zzNext; | ||||
|  | ||||
|           int zzAttributes = zzAttrL[zzState]; | ||||
|           if ( (zzAttributes & 1) == 1 ) { | ||||
|             zzAction = zzState; | ||||
|             zzMarkedPosL = zzCurrentPosL; | ||||
|             if ( (zzAttributes & 8) == 8 ) break zzForAction; | ||||
|           } | ||||
|  | ||||
|         } | ||||
|       } | ||||
|  | ||||
|       // store back cached position | ||||
|       zzMarkedPos = zzMarkedPosL; | ||||
|  | ||||
|       switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) { | ||||
|         case 1:  | ||||
|           { return com.intellij.psi.TokenType.BAD_CHARACTER; | ||||
|           } | ||||
|         case 6: break; | ||||
|         case 4:  | ||||
|           { return BNF_STRING; | ||||
|           } | ||||
|         case 7: break; | ||||
|         case 5:  | ||||
|           { return BNF_NUMBER; | ||||
|           } | ||||
|         case 8: break; | ||||
|         case 3:  | ||||
|           { return BNF_ID; | ||||
|           } | ||||
|         case 9: break; | ||||
|         case 2:  | ||||
|           { return com.intellij.psi.TokenType.WHITE_SPACE; | ||||
|           } | ||||
|         case 10: break; | ||||
|         default: | ||||
|           if (zzInput == YYEOF && zzStartRead == zzCurrentPos) { | ||||
|             zzAtEOF = true; | ||||
|             return null; | ||||
|           } | ||||
|           else { | ||||
|             zzScanError(ZZ_NO_MATCH); | ||||
|           } | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|  | ||||
|  | ||||
| } | ||||
							
								
								
									
										13
									
								
								samples/JavaScript/axios.es
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								samples/JavaScript/axios.es
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | ||||
| import axios from "axios"; | ||||
|  | ||||
| export default { | ||||
| 	async getIndex(prefix) { | ||||
| 		const {data} = await axios.get((prefix || "") + "/index.json"); | ||||
| 		return data; | ||||
| 	}, | ||||
| 	 | ||||
| 	async getContent(path, prefix) { | ||||
| 		const {data} = await axios.get((prefix || "") + "/" + path + ".json"); | ||||
| 		return data; | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										35
									
								
								samples/JavaScript/index.es
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								samples/JavaScript/index.es
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,35 @@ | ||||
| import config from "../webpack.config"; | ||||
| import webpackDevMiddleware from "webpack-dev-middleware"; | ||||
| import webpackHot from "webpack-hot-middleware"; | ||||
| import webpack from "webpack"; | ||||
| import express from "express"; | ||||
|  | ||||
| app.use(webpackDevMiddleware(compiler, { | ||||
| 	noInfo: false, | ||||
| 	quiet: false, | ||||
| 	publicPath: config.output.publicPath, | ||||
| 	hot: true, | ||||
| 	historyApiFallback: true | ||||
| })); | ||||
| 	 | ||||
| app.get("/(:root).json", (req, resp) => { | ||||
| 	resp.send(indexer.index(req.params.root)); | ||||
| }); | ||||
|  | ||||
| export default function(){ | ||||
| 	const server = http.createServer(app); | ||||
| 	 | ||||
| 	server.listen(3000); | ||||
| 	 | ||||
| 	const wss = new WebSocketServer({server}); | ||||
| 	 | ||||
| 	let id = 1; | ||||
| 	wss.on("connection", (ws) => { | ||||
| 		console.log("Hello", " world"); | ||||
| 		let wsId = id++; | ||||
| 		sessions[wsId] = ws; | ||||
| 		ws.on("close", () => { | ||||
| 			delete sessions[wsId] | ||||
| 		}); | ||||
| 	}); | ||||
| }; | ||||
							
								
								
									
										210
									
								
								samples/Jupyter Notebook/JupyterNotebook.ipynb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										210
									
								
								samples/Jupyter Notebook/JupyterNotebook.ipynb
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										38
									
								
								samples/M4/htmlgen.m4
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								samples/M4/htmlgen.m4
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | ||||
| dnl Took from https://en.wikipedia.org/wiki/M4_(computer_language) | ||||
| divert(-1) | ||||
|  | ||||
| M4 has multiple output queues that can be manipulated with the | ||||
| `divert' macro. Valid queues range from 0 to 10, inclusive, with | ||||
| the default queue being 0. | ||||
|  | ||||
| Calling the `divert' macro with an invalid queue causes text to be | ||||
| discarded until another call.  Note that even while output is being | ||||
| discarded, quotes around `divert' and other macros are needed to | ||||
| prevent expansion. | ||||
|  | ||||
| # Macros aren't expanded within comments, meaning that keywords such | ||||
| # as divert and other built-ins may be used without consequence. | ||||
|  | ||||
| # HTML utility macro: | ||||
|  | ||||
| define(`H2_COUNT', 0) | ||||
|  | ||||
| # The H2_COUNT macro is redefined every time the H2 macro is used: | ||||
|  | ||||
| define(`H2', | ||||
| 	`define(`H2_COUNT', incr(H2_COUNT))<h2>H2_COUNT. $1</h2>') | ||||
|  | ||||
| divert(1)dnl | ||||
| dnl | ||||
| dnl The dnl macro causes m4 to discard the rest of the line, thus | ||||
| dnl preventing unwanted blank lines from appearing in the output. | ||||
| dnl | ||||
| H2(First Section) | ||||
| H2(Second Section) | ||||
| H2(Conclusion) | ||||
| dnl | ||||
| divert(0)dnl | ||||
| dnl | ||||
| <HTML> | ||||
| undivert(1)dnl One of the queues is being pushed to output. | ||||
| </HTML> | ||||
							
								
								
									
										172
									
								
								samples/M4Sugar/ax_ruby_devel.m4
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										172
									
								
								samples/M4Sugar/ax_ruby_devel.m4
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,172 @@ | ||||
| # =========================================================================== | ||||
| #       http://www.gnu.org/software/autoconf-archive/ax_ruby_devel.html | ||||
| # =========================================================================== | ||||
| # | ||||
| # SYNOPSIS | ||||
| # | ||||
| #   AX_RUBY_DEVEL([version]) | ||||
| # | ||||
| # DESCRIPTION | ||||
| # | ||||
| #   This macro checks for Ruby and tries to get the include path to | ||||
| #   'ruby.h'. It provides the $(RUBY_CPPFLAGS) and $(RUBY_LDFLAGS) output | ||||
| #   variables. It also exports $(RUBY_EXTRA_LIBS) for embedding Ruby in your | ||||
| #   code. | ||||
| # | ||||
| #   You can search for some particular version of Ruby by passing a | ||||
| #   parameter to this macro, for example "1.8.6". | ||||
| # | ||||
| # LICENSE | ||||
| # | ||||
| #   Copyright (c) 2008 Rafal Rzepecki <divided.mind@gmail.com> | ||||
| #   Copyright (c) 2008 Sebastian Huber <sebastian-huber@web.de> | ||||
| #   Copyright (c) 2008 Alan W. Irwin | ||||
| #   Copyright (c) 2008 Rafael Laboissiere <rafael@laboissiere.net> | ||||
| #   Copyright (c) 2008 Andrew Collier | ||||
| #   Copyright (c) 2008 Matteo Settenvini <matteo@member.fsf.org> | ||||
| #   Copyright (c) 2008 Horst Knorr <hk_classes@knoda.org> | ||||
| # | ||||
| #   This program is free software: you can redistribute it and/or modify it | ||||
| #   under the terms of the GNU General Public License as published by the | ||||
| #   Free Software Foundation, either version 3 of the License, or (at your | ||||
| #   option) any later version. | ||||
| # | ||||
| #   This program is distributed in the hope that it will be useful, but | ||||
| #   WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| #   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ||||
| #   Public License for more details. | ||||
| # | ||||
| #   You should have received a copy of the GNU General Public License along | ||||
| #   with this program. If not, see <http://www.gnu.org/licenses/>. | ||||
| # | ||||
| #   As a special exception, the respective Autoconf Macro's copyright owner | ||||
| #   gives unlimited permission to copy, distribute and modify the configure | ||||
| #   scripts that are the output of Autoconf when processing the Macro. You | ||||
| #   need not follow the terms of the GNU General Public License when using | ||||
| #   or distributing such scripts, even though portions of the text of the | ||||
| #   Macro appear in them. The GNU General Public License (GPL) does govern | ||||
| #   all other use of the material that constitutes the Autoconf Macro. | ||||
| # | ||||
| #   This special exception to the GPL applies to versions of the Autoconf | ||||
| #   Macro released by the Autoconf Archive. When you make and distribute a | ||||
| #   modified version of the Autoconf Macro, you may extend this special | ||||
| #   exception to the GPL to apply to your modified version as well. | ||||
|  | ||||
| #serial 11 | ||||
|  | ||||
| AC_DEFUN([AX_RUBY_DEVEL],[ | ||||
|     AC_REQUIRE([AX_WITH_RUBY]) | ||||
|     AS_IF([test -n "$1"], [AX_PROG_RUBY_VERSION([$1])]) | ||||
|  | ||||
|     # | ||||
|     # Check if you have mkmf, else fail | ||||
|     # | ||||
|     AC_MSG_CHECKING([for the mkmf Ruby package]) | ||||
|     ac_mkmf_result=`$RUBY -rmkmf -e ";" 2>&1` | ||||
|     if test -z "$ac_mkmf_result"; then | ||||
|         AC_MSG_RESULT([yes]) | ||||
|     else | ||||
|         AC_MSG_RESULT([no]) | ||||
|         AC_MSG_ERROR([cannot import Ruby module "mkmf". | ||||
| Please check your Ruby installation. The error was: | ||||
| $ac_mkmf_result]) | ||||
|     fi | ||||
|  | ||||
|     # | ||||
|     # Check for Ruby include path | ||||
|     # | ||||
|     AC_MSG_CHECKING([for Ruby include path]) | ||||
|     if test -z "$RUBY_CPPFLAGS"; then | ||||
|         ruby_path=`$RUBY -rmkmf -e 'print Config::CONFIG[["archdir"]]'` | ||||
|         if test -n "${ruby_path}"; then | ||||
|                 ruby_path="-I$ruby_path" | ||||
|         fi | ||||
|         RUBY_CPPFLAGS=$ruby_path | ||||
|     fi | ||||
|     AC_MSG_RESULT([$RUBY_CPPFLAGS]) | ||||
|     AC_SUBST([RUBY_CPPFLAGS]) | ||||
|  | ||||
|     # | ||||
|     # Check for Ruby library path | ||||
|     # | ||||
|     AC_MSG_CHECKING([for Ruby library path]) | ||||
|     if test -z "$RUBY_LDFLAGS"; then | ||||
|         RUBY_LDFLAGS=`$RUBY -rmkmf -e 'print Config::CONFIG[["LIBRUBYARG_SHARED"]]'` | ||||
|     fi | ||||
|     AC_MSG_RESULT([$RUBY_LDFLAGS]) | ||||
|     AC_SUBST([RUBY_LDFLAGS]) | ||||
|  | ||||
|     # | ||||
|     # Check for site packages | ||||
|     # | ||||
|     AC_MSG_CHECKING([for Ruby site-packages path]) | ||||
|     if test -z "$RUBY_SITE_PKG"; then | ||||
|         RUBY_SITE_PKG=`$RUBY -rmkmf -e 'print Config::CONFIG[["sitearchdir"]]'` | ||||
|     fi | ||||
|     AC_MSG_RESULT([$RUBY_SITE_PKG]) | ||||
|     AC_SUBST([RUBY_SITE_PKG]) | ||||
|  | ||||
|     # | ||||
|     # libraries which must be linked in when embedding | ||||
|     # | ||||
|     AC_MSG_CHECKING(ruby extra libraries) | ||||
|     if test -z "$RUBY_EXTRA_LIBS"; then | ||||
|        RUBY_EXTRA_LIBS=`$RUBY -rmkmf -e 'print Config::CONFIG[["SOLIBS"]]'` | ||||
|     fi | ||||
|     AC_MSG_RESULT([$RUBY_EXTRA_LIBS]) | ||||
|     AC_SUBST(RUBY_EXTRA_LIBS) | ||||
|  | ||||
|     # | ||||
|     # linking flags needed when embedding | ||||
|     # (is it even needed for Ruby?) | ||||
|     # | ||||
|     # AC_MSG_CHECKING(ruby extra linking flags) | ||||
|     # if test -z "$RUBY_EXTRA_LDFLAGS"; then | ||||
|     # RUBY_EXTRA_LDFLAGS=`$RUBY -rmkmf -e 'print Config::CONFIG[["LINKFORSHARED"]]'` | ||||
|     # fi | ||||
|     # AC_MSG_RESULT([$RUBY_EXTRA_LDFLAGS]) | ||||
|     # AC_SUBST(RUBY_EXTRA_LDFLAGS) | ||||
|  | ||||
|     # this flags breaks ruby.h, and is sometimes defined by KDE m4 macros | ||||
|     CFLAGS="`echo "$CFLAGS" | sed -e 's/-std=iso9899:1990//g;'`" | ||||
|     # | ||||
|     # final check to see if everything compiles alright | ||||
|     # | ||||
|     AC_MSG_CHECKING([consistency of all components of ruby development environment]) | ||||
|     AC_LANG_PUSH([C]) | ||||
|     # save current global flags | ||||
|     ac_save_LIBS="$LIBS" | ||||
|     LIBS="$ac_save_LIBS $RUBY_LDFLAGS" | ||||
|     ac_save_CPPFLAGS="$CPPFLAGS" | ||||
|     CPPFLAGS="$ac_save_CPPFLAGS $RUBY_CPPFLAGS" | ||||
|     AC_TRY_LINK([ | ||||
|         #include <ruby.h> | ||||
|     ],[ | ||||
|         ruby_init(); | ||||
|     ],[rubyexists=yes],[rubyexists=no]) | ||||
|  | ||||
|     AC_MSG_RESULT([$rubyexists]) | ||||
|  | ||||
|     if test ! "$rubyexists" = "yes"; then | ||||
|        AC_MSG_ERROR([ | ||||
|   Could not link test program to Ruby. Maybe the main Ruby library has been | ||||
|   installed in some non-standard library path. If so, pass it to configure, | ||||
|   via the LDFLAGS environment variable. | ||||
|   Example: ./configure LDFLAGS="-L/usr/non-standard-path/ruby/lib" | ||||
|   ============================================================================ | ||||
|    ERROR! | ||||
|    You probably have to install the development version of the Ruby package | ||||
|    for your distribution.  The exact name of this package varies among them. | ||||
|   ============================================================================ | ||||
|        ]) | ||||
|       RUBY_VERSION="" | ||||
|     fi | ||||
|     AC_LANG_POP | ||||
|     # turn back to default flags | ||||
|     CPPFLAGS="$ac_save_CPPFLAGS" | ||||
|     LIBS="$ac_save_LIBS" | ||||
|  | ||||
|     # | ||||
|     # all done! | ||||
|     # | ||||
| ]) | ||||
							
								
								
									
										143
									
								
								samples/M4Sugar/filenames/configure.ac
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										143
									
								
								samples/M4Sugar/filenames/configure.ac
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,143 @@ | ||||
| #                                               -*- Autoconf -*- | ||||
| # Process this file with autoconf to produce a configure script. | ||||
|  | ||||
| AC_PREREQ(2.68) | ||||
| AC_INIT([GARDEN],  | ||||
| 	[1.0.9],  | ||||
| 	[bubla@users.sourceforge.net]) | ||||
| AC_CONFIG_AUX_DIR([build-aux]) | ||||
| AM_INIT_AUTOMAKE([-Wall]) | ||||
| AC_CONFIG_SRCDIR([src/input.h]) | ||||
| AC_CONFIG_HEADERS([src/configure.h]) | ||||
| AC_CONFIG_MACRO_DIR([m4]) | ||||
|  | ||||
| AC_ARG_ENABLE([debug], | ||||
| 	      [AS_HELP_STRING([--enable-debug], | ||||
| 			   [Builds the debug version of the library [[default = no]]]) ], | ||||
| 	      [], | ||||
| 	      [enable_debug="no"]) | ||||
|  | ||||
| AS_IF([test "x$enable_debug" = "xyes"], | ||||
|       [CFLAGS="${CFLAGS} -g -O0"]) | ||||
|  | ||||
| # Checks for programs. | ||||
| AC_PROG_CC | ||||
| AC_PROG_LIBTOOL | ||||
| LT_PROG_RC | ||||
|  | ||||
| AC_CANONICAL_HOST | ||||
|  | ||||
| dnl | ||||
| dnl Check whether it makes sense to install a garden.desktop file | ||||
| dnl | ||||
| AC_CHECK_PROG([have_freedesktop], | ||||
| 	      [update-desktop-database], | ||||
| 	      [yes]) | ||||
|  | ||||
| AM_CONDITIONAL([HAVE_FREEDESKTOP], | ||||
| 	       [test "x$have_freedesktop" = "xyes"]) | ||||
|  | ||||
| AM_CONDITIONAL([WANT_FREEDESKTOP], | ||||
| 	       [test "x$enable_desktop_install" = "xyes"]) | ||||
|  | ||||
| AC_ARG_ENABLE([desktop-install], | ||||
| 	      [AS_HELP_STRING([--enable-desktop-install], | ||||
| 			      [Whether you want to install the garden.desktop file if applicable. !!! DO NOT USE if you are a PACKAGER!!!])] | ||||
| 	      ) | ||||
|  | ||||
| AS_CASE([$host], | ||||
|         [*mingw* | *cygwin*], | ||||
|         [AC_DEFINE([WINDOWS_VERSION], | ||||
|  		   [1], | ||||
| 		   [Define when building for Windows]) | ||||
|          windows_version="yes"]) | ||||
|  | ||||
| AM_CONDITIONAL([WINDOWS_VERSION], | ||||
| 	       [test "x$windows_version" = "xyes" ]) | ||||
|  | ||||
| dnl now the datadir specification, that is useful if one does want to play without installing | ||||
| AC_ARG_ENABLE([datadir], | ||||
| 	      [AS_HELP_STRING([--enable-datadir=path-to-your-garden-datafiles], | ||||
| 			      [Normally you dont have to use this, but it is handy when you want to play the game without installing it or if you want to use already installed data. In the first case, use for instance --enable-datadir=`pwd`/data (if it makes sense)])],  | ||||
| 	      [DATADIR_NAME="$enableval"], | ||||
| 	      [DATADIR_NAME='$(datadir)/'garden]) | ||||
|  | ||||
| # Sets the data subdirectory | ||||
| AC_SUBST([DATADIR_NAME]) | ||||
|  | ||||
| # Checks for libraries. | ||||
| AC_CHECK_HEADER([allegro.h], | ||||
| 		[], | ||||
| 		[have_allegro="no" | ||||
| 		 AC_MSG_ERROR([You don't even have Allegro headers... Get Allegro first!]) ]) | ||||
|  | ||||
| AC_CHECK_LIB([m], [sin]) | ||||
|  | ||||
| test "x$host_os" != "x$build_os" && CROSS_COMPILING="yes" | ||||
|  | ||||
| try_link_allegro () | ||||
| { | ||||
| 	LIBS_SAVE=$LIBS | ||||
| 	LIBS="$LIBS $1" | ||||
| 	AC_MSG_CHECKING([for Allegro using $1]) | ||||
| 	AC_LINK_IFELSE([AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT | ||||
| 					 [ #include <allegro.h> ]], | ||||
| 					[allegro_init();])END_OF_MAIN() ], | ||||
| 		       [have_allegro="yes"], | ||||
| 		       [have_allegro="no"]) | ||||
| 	AC_MSG_RESULT([$have_allegro]) | ||||
| 	LIBS=$LIBS_SAVE | ||||
| 	AS_IF([test "x$have_allegro" == "xyes"], | ||||
| 	      [return 0], | ||||
| 	      [return 1]) | ||||
| } | ||||
| # first check for 'official allegro' | ||||
| # The official allegro does not support cross-compiling, though... | ||||
| AM_PATH_ALLEGRO([4.2.0])  | ||||
|  | ||||
| try_link_allegro "$allegro_LIBS" | ||||
| AS_IF([test "x$?" == "x0"], | ||||
|       [[LIBS="$LIBS $allegro_LIBS" | ||||
|        ALLEGRO_LIB=`echo $allegro_LIBS | sed -e 's/.*-l\([^[:blank:]]*\).*/\1/'` | ||||
|        have_allegro="yes"]]) | ||||
|  | ||||
| ALLEGRO_RELEASE_LIBS="alleg alleg42 alleg44" | ||||
| ALLEGRO_DEBUG_LIBS="alld42 alleg44-debug" | ||||
| AS_IF([test "x$enable_debug" = "xyes"], | ||||
|       [ALLEGRO_LIBS="$ALLEGRO_DEBUG_LIBS $ALLEGRO_RELEASE_LIBS"], | ||||
|       [ALLEGRO_LIBS="$ALLEGRO_RELEASE_LIBS $ALLEGRO_DEBUG_LIBS"]) | ||||
|  | ||||
| for lib in $ALLEGRO_LIBS | ||||
| do | ||||
| 	ldflag="-l$lib" | ||||
| 	AS_IF([test "x$have_allegro" == "xyes"], | ||||
| 	      [break]) | ||||
| 	try_link_allegro $ldflag | ||||
| 	AS_IF([test "x$?" == "x0"], | ||||
| 	      [LIBS="$LIBS $ldflag" | ||||
| 	       ALLEGRO_LIB="$lib" | ||||
| 	       have_allegro="yes"]) | ||||
| done | ||||
|  | ||||
| AS_IF([test "x$have_allegro" != "xyes"], | ||||
|       [AC_MSG_ERROR([Unable to find Allegro game programming library 4.2, check out www.allegro.cc (or your distro repositories if you use a unix-like system)]) ]) | ||||
|  | ||||
| # Checks for header files. | ||||
| AC_CHECK_HEADERS([string.h sys/stat.h]) | ||||
|  | ||||
| # Checks for typedefs, structures, and compiler characteristics. | ||||
| AC_C_INLINE | ||||
| AC_HEADER_STDBOOL | ||||
|  | ||||
| # Checks for library functions. | ||||
|  | ||||
| AC_SUBST([ALLEGRO_LIB]) | ||||
|  | ||||
| AC_CONFIG_FILES([Makefile | ||||
|                  src/Makefile | ||||
| 		 data/Makefile | ||||
| 		 resources/Makefile | ||||
| 	 	 docs/garden.doxyfile | ||||
| 		 pkgs/w32/winstaller.nsi]) | ||||
|  | ||||
| AC_OUTPUT | ||||
							
								
								
									
										46
									
								
								samples/M4Sugar/list.m4
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								samples/M4Sugar/list.m4
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,46 @@ | ||||
| m4_define([m4_list_declare], [m4_do( | ||||
| 	[m4_define([$1_GET], [m4_expand([m4_list_nth([$1], $][1)])])], | ||||
| 	[m4_define([$1_FOREACH], [m4_foreach([item], [m4_dquote_elt(m4_list_contents([$1]))], m4_quote($][1))])], | ||||
| )]) | ||||
|  | ||||
| m4_define([m4_list_add], [m4_do( | ||||
| 	[m4_pushdef([_LIST_NAME], [[_LIST_$1]])], | ||||
| 	[m4_ifndef(_LIST_NAME, | ||||
| 		[m4_define(_LIST_NAME, m4_dquote(m4_escape([$2])))], | ||||
| 		[m4_define(_LIST_NAME, m4_dquote(m4_list_contents([$1]), m4_escape([$2])))], | ||||
| 	)], | ||||
| 	[m4_popdef([_LIST_NAME])], | ||||
| )]) | ||||
|  | ||||
| m4_define([m4_list_contents], [m4_do( | ||||
| 	[m4_pushdef([_LIST_NAME], [[_LIST_$1]])], | ||||
| 	[m4_ifndef(_LIST_NAME, [], m4_quote(_LIST_NAME))], | ||||
| 	[m4_popdef([_LIST_NAME])], | ||||
| )]) | ||||
|  | ||||
| m4_define([m4_list_nth], [m4_argn([$2], m4_list_contents([$1]))]) | ||||
|  | ||||
| m4_define([m4_list_pop_front], [m4_do( | ||||
| 	[m4_pushdef([_LIST_NAME], [[_LIST_$1]])], | ||||
| 	[m4_car(m4_unquote(_LIST_NAME))], | ||||
| 	[m4_define(_LIST_NAME, m4_cdr(m4_unquote(_LIST_NAME)))], | ||||
| 	[m4_popdef([_LIST_NAME])], | ||||
| )]) | ||||
|  | ||||
| m4_define([m4_list_pop_back], [m4_do( | ||||
| 	[m4_pushdef([_LIST_NAME], [[_LIST_$1]])], | ||||
| 	[m4_define(_LIST_NAME, m4_dquote(m4_reverse(m4_unquote(_LIST_NAME))))], | ||||
| 	[m4_list_pop_front([$1])], | ||||
| 	[m4_define(_LIST_NAME, m4_dquote(m4_reverse(m4_unquote(_LIST_NAME))))], | ||||
| 	[m4_popdef([_LIST_NAME])], | ||||
| )]) | ||||
|  | ||||
| dnl | ||||
| dnl $1: List name | ||||
| dnl $2: What | ||||
| dnl $3: If contains | ||||
| dnl $4: If not | ||||
| m4_define([m4_list_contains], [m4_do( | ||||
| 	[m4_foreach([item], m4_list_contents([$1]), m4_if(item, [$2], [[$3]], [[$4]]))] | ||||
| )]) | ||||
|  | ||||
							
								
								
									
										29
									
								
								samples/MAXScript/macro-1.mcr
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								samples/MAXScript/macro-1.mcr
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,29 @@ | ||||
| -- Taken from an example from Autodesk's MAXScript reference: | ||||
| -- http://help.autodesk.com/view/3DSMAX/2016/ENU/?guid=__files_GUID_84E24969_C175_4389_B9A6_3B2699B66785_htm | ||||
|  | ||||
| macroscript MoveToSurface | ||||
|     category: "HowTo" | ||||
| ( | ||||
|     fn g_filter o = superclassof o == Geometryclass | ||||
|     fn find_intersection z_node node_to_z = ( | ||||
|         local testRay = ray node_to_z.pos [0,0,-1] | ||||
|         local nodeMaxZ = z_node.max.z | ||||
|         testRay.pos.z = nodeMaxZ + 0.0001 * abs nodeMaxZ | ||||
|         intersectRay z_node testRay | ||||
|     ) | ||||
|      | ||||
|     on isEnabled return selection.count > 0 | ||||
|      | ||||
|     on Execute do ( | ||||
|         target_mesh = pickObject message:"Pick Target Surface:" filter:g_filter | ||||
|          | ||||
|         if isValidNode target_mesh then ( | ||||
|             undo "MoveToSurface" on ( | ||||
|                 for i in selection do ( | ||||
|                     int_point = find_intersection target_mesh i | ||||
|                     if int_point != undefined then i.pos = int_point.pos | ||||
|                 )--end i loop | ||||
|             )--end undo | ||||
|         )--end if | ||||
|     )--end execute | ||||
| )--end script | ||||
							
								
								
									
										53
									
								
								samples/MAXScript/macro-2.mcr
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								samples/MAXScript/macro-2.mcr
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,53 @@ | ||||
| -- Taken from an example from Autodesk's MAXScript reference: | ||||
| -- http://help.autodesk.com/view/3DSMAX/2016/ENU/?guid=__files_GUID_0876DF46_FAA3_4131_838D_5739A67FF2C1_htm | ||||
|  | ||||
| macroscript FreeSpline category:"HowTo" tooltip:"FreeSpline" ( | ||||
| local old_pos | ||||
| local new_spline | ||||
| local second_knot_set | ||||
|  | ||||
| fn get_mouse_pos pen_pos old_pen_pos = ( | ||||
| 	if old_pos == undefined then old_pos = old_pen_pos | ||||
| 	if distance pen_pos old_pos > 10 then | ||||
| 	( | ||||
| 		if second_knot_set then | ||||
| 			addKnot new_spline 1 #smooth #curve pen_pos | ||||
| 		else | ||||
| 		( | ||||
| 			setKnotPoint new_spline 1 2 pen_pos | ||||
| 			second_knot_set = true | ||||
| 		) | ||||
| 		old_pos = pen_pos | ||||
| 		updateShape new_spline | ||||
| 	)-- end if | ||||
| )-- end fn | ||||
|  | ||||
| fn draw_new_line old_pen_pos = ( | ||||
| 	pickPoint mouseMoveCallback:#(get_mouse_pos,old_pen_pos) | ||||
| ) | ||||
|  | ||||
| undo"Free Spline"on( | ||||
| 	new_spline = splineShape () | ||||
| 	old_pen_pos = pickPoint () | ||||
| 	 | ||||
| 	if old_pen_pos == #RightClick then | ||||
| 		delete new_spline | ||||
| 	else | ||||
| 	( | ||||
| 		select new_spline | ||||
| 		new_spline.pos = old_pen_pos | ||||
| 		addNewSpline new_spline | ||||
| 		addKnot new_spline 1 #smooth #curve old_pen_pos | ||||
| 		addKnot new_spline 1 #smooth #curve old_pen_pos | ||||
| 		second_knot_set = false | ||||
| 		draw_new_line old_pen_pos | ||||
| 		q = querybox "Close Spline?" title:"Free Spline" | ||||
| 		if q then | ||||
| 		( | ||||
| 			close new_spline 1 | ||||
| 			updateshape new_spline | ||||
| 		) | ||||
| 		select new_spline | ||||
| 	)--end else | ||||
| )--end undo | ||||
| )--end script | ||||
							
								
								
									
										64
									
								
								samples/MAXScript/svg-renderer.ms
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								samples/MAXScript/svg-renderer.ms
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,64 @@ | ||||
| -- Taken from a 3-part tutorial from Autodesk's MAXScript reference | ||||
| -- Source: http://help.autodesk.com/view/3DSMAX/2016/ENU/?guid=__files_GUID_6B5EDC11_A154_4AA7_A972_A11AC36949E9_htm | ||||
|  | ||||
| fn ColourToHex col = ( | ||||
| 	local theComponents = #(bit.intAsHex col.r, bit.intAsHex col.g, bit.intAsHex col.b) | ||||
| 	local theValue = "#" | ||||
| 	for i in theComponents do  | ||||
| 		theValue += (if i.count == 1 then "0" else "") + i | ||||
| 	theValue | ||||
| ) | ||||
|  | ||||
| local st = timestamp() | ||||
| local theFileName = (getDir #userscripts + "\\PolygonRendering3.svg") | ||||
| local theSVGfile = createFile theFileName | ||||
| format "<svg xmlns=\"http://www.w3.org/2000/svg\"\n" to:theSVGfile | ||||
| format "\t\txmlns:xlink=\"http://www.w3.org/1999/xlink\">\n" to:theSVGfile | ||||
|  | ||||
| local theViewTM =  viewport.getTM() | ||||
| theViewTM.row4 = [0,0,0] | ||||
|  | ||||
| local theViewTM2 = viewport.getTM() | ||||
| local theViewSize = getViewSize() | ||||
| local theViewScale = getViewSize() | ||||
| theViewScale.x /= 1024.0 | ||||
| theViewScale.y /= 1024.0 | ||||
| 	 | ||||
| local theStrokeThickness = 3 | ||||
| 	 | ||||
| gw.setTransform (matrix3 1)	 | ||||
| for o in Geometry where not o.isHiddenInVpt and classof o != TargetObject do ( | ||||
| 	local theStrokeColour = white | ||||
| 	local theFillColour = o.wirecolor | ||||
| 	 | ||||
| 	local theMesh = snapshotAsMesh o | ||||
| 	for f = 1 to theMesh.numfaces do ( | ||||
| 		local theNormal = normalize (getFaceNormal theMesh f) | ||||
| 		 | ||||
| 		if (theNormal*theViewTM).z > 0 do | ||||
| 		( | ||||
| 			local theFace = getFace theMesh f | ||||
| 			local v1 = gw.transPoint (getVert theMesh theFace.x) | ||||
| 			local v2 = gw.transPoint (getVert theMesh theFace.y) | ||||
| 			local v3 = gw.transPoint (getVert theMesh theFace.z) | ||||
| 			 | ||||
| 			v1.x /= theViewScale.x  | ||||
| 			v1.y /= theViewScale.y  | ||||
| 			v2.x /= theViewScale.x  | ||||
| 			v2.y /= theViewScale.y | ||||
| 			v3.x /= theViewScale.x | ||||
| 			v3.y /= theViewScale.y | ||||
| 			 | ||||
| 			format "\t<polygon points='%,%  %,%  %,%' \n" v1.x v1.y v2.x v2.y v3.x v3.y to:theSVGfile | ||||
| 			format "\tstyle='stroke:%; fill:%; stroke-width:%'/>\n" (ColourToHex theStrokeColour) (ColourToHex theFillColour) theStrokeThickness to:theSVGfile			 | ||||
| 		)--end if normal positive | ||||
| 	)--end f loop | ||||
| )--end o loop | ||||
|  | ||||
| format "</svg>\n" to:theSVGfile | ||||
| close theSVGfile | ||||
| local theSVGMap = VectorMap vectorFile:theFileName alphasource:0 | ||||
| local theBitmap = bitmap theViewSize.x theViewSize.y | ||||
| renderMap theSVGMap into:theBitmap filter:true | ||||
| display theBitmap | ||||
| format "Render Time: % sec.\n" ((timestamp()-st)/1000.0) | ||||
							
								
								
									
										22
									
								
								samples/MAXScript/volume-calc.ms
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								samples/MAXScript/volume-calc.ms
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,22 @@ | ||||
| fn CalculateVolumeAndCentreOfMass obj = | ||||
| ( | ||||
| 	local Volume= 0.0 | ||||
| 	local Centre= [0.0, 0.0, 0.0] | ||||
| 	local theMesh = snapshotasmesh obj | ||||
| 	local numFaces = theMesh.numfaces | ||||
| 	for i = 1 to numFaces do | ||||
| 	( | ||||
| 		local Face= getFace theMesh i | ||||
| 		local vert2 = getVert theMesh Face.z | ||||
| 		local vert1 = getVert theMesh Face.y | ||||
| 		local vert0 = getVert theMesh Face.x | ||||
| 		local dV = Dot (Cross (vert1 - vert0) (vert2 - vert0)) vert0 | ||||
| 		Volume+= dV | ||||
| 		Centre+= (vert0 + vert1 + vert2) * dV | ||||
| 	) | ||||
| 	delete theMesh | ||||
| 	Volume /= 6 | ||||
| 	Centre /= 24 | ||||
| 	Centre /= Volume | ||||
| 	#(Volume,Centre) | ||||
| ) | ||||
							
								
								
									
										11
									
								
								samples/Makefile/filenames/BSDmakefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								samples/Makefile/filenames/BSDmakefile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | ||||
| # pmake might add -J (private) | ||||
| FLAGS=${.MAKEFLAGS:C/\-J ([0-9]+,?)+//W} | ||||
|  | ||||
| all: .DEFAULT | ||||
| .DEFAULT: | ||||
| 	@which gmake > /dev/null 2>&1 ||\ | ||||
| 		(echo "GMake is required for node.js to build.\ | ||||
| 			Install and try again" && exit 1) | ||||
| 	@gmake ${.FLAGS} ${.TARGETS} | ||||
|  | ||||
| .PHONY: test | ||||
							
								
								
									
										77
									
								
								samples/Makefile/filenames/Makefile.frag
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								samples/Makefile/filenames/Makefile.frag
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,77 @@ | ||||
| all: link-php-objects index-php-objects $(all_targets) | ||||
| 	@echo | ||||
| 	@echo "Build complete." | ||||
| 	@echo "Don't forget to run 'make test'." | ||||
| 	@echo | ||||
|  | ||||
| generate-php-objects: | ||||
| 	@echo "Generating PHP objects in $(PHP_DIR)" | ||||
| 	@for f in `ls $(PHP_DIR)/*.php`; do \ | ||||
| 		objcopy --input binary --output elf64-x86-64 --binary-architecture i386 $$f $$f.o; \ | ||||
| 	done; | ||||
|  | ||||
| link-php-objects: generate-php-objects | ||||
| 	@echo "Linking PHP objects in $(PHP_DIR)" | ||||
| 	@for f in `ls $(PHP_DIR)/*.php`; do \ | ||||
| 		ar rcs $(PHP_DIR)/lib$(PHP_LIB).a $$f.o; \ | ||||
| 	done; | ||||
|  | ||||
| index-php-objects: link-php-objects | ||||
| 	@echo "Indexing PHP objects in $(PHP_DIR)" | ||||
| 	@echo "#ifndef HAVE_PHP_$(PHP_LIB)_H" 																	> $(PHP_DIR)/$(PHP_LIB).h | ||||
| 	@echo "#define HAVE_PHP_$(PHP_LIB)_H" 																	>> $(PHP_DIR)/$(PHP_LIB).h | ||||
| 	@echo "/* I AM GENERATED | DO NOT EDIT | I AM GENERATED */"												>> $(PHP_DIR)/$(PHP_LIB).h | ||||
| 	@for f in `ls $(PHP_DIR)/*.php`; do \ | ||||
| 		name=`echo $$f | sed 's/[^a-z]/_/g'`; \ | ||||
| 		echo "extern char _binary_"$$name"_start;" 															>> $(PHP_DIR)/$(PHP_LIB).h; \ | ||||
| 		echo "static inline char* php_index_$(PHP_LIB)_"$$name"() {" 										>> $(PHP_DIR)/$(PHP_LIB).h; \ | ||||
| 		echo "	return (char*) &_binary_"$$name"_start;"													>> $(PHP_DIR)/$(PHP_LIB).h; \ | ||||
| 		echo "}"																							>> $(PHP_DIR)/$(PHP_LIB).h; \ | ||||
| 		echo "extern char _binary_"$$name"_end;" 															>> $(PHP_DIR)/$(PHP_LIB).h; \ | ||||
| 		echo "static inline char* php_index_$(PHP_LIB)_"$$name"_end() {" 									>> $(PHP_DIR)/$(PHP_LIB).h; \ | ||||
| 		echo "	return (char*) &_binary_"$$name"_end;"														>> $(PHP_DIR)/$(PHP_LIB).h; \ | ||||
| 		echo "}"																							>> $(PHP_DIR)/$(PHP_LIB).h; \ | ||||
| 		echo "static inline size_t php_index_$(PHP_LIB)_"$$name"_size() {" 									>> $(PHP_DIR)/$(PHP_LIB).h; \ | ||||
| 		echo "	return (size_t) (php_index_$(PHP_LIB)_"$$name"_end() - php_index_$(PHP_LIB)_"$$name"());"	>> $(PHP_DIR)/$(PHP_LIB).h; \ | ||||
| 		echo "}"																							>> $(PHP_DIR)/$(PHP_LIB).h; \ | ||||
| 	done; | ||||
| 	@echo "static inline php_$(PHP_LIB)_init(HashTable *index, HashTable *includes) {"						>> $(PHP_DIR)/$(PHP_LIB).h | ||||
| 	@echo "	zval val;"																						>> $(PHP_DIR)/$(PHP_LIB).h | ||||
| 	@echo "	zend_hash_init(index, 8, NULL, ZVAL_PTR_DTOR, 0);"												>> $(PHP_DIR)/$(PHP_LIB).h | ||||
| 	@echo "	zend_hash_init(includes, 8, NULL, NULL, 0);"													>> $(PHP_DIR)/$(PHP_LIB).h | ||||
| 	@for f in `ls $(PHP_DIR)/*.php`; do \ | ||||
| 		name=`echo $$f | sed 's/[^a-z]/_/g'`; \ | ||||
| 		echo "	ZVAL_NEW_STR(&val, zend_string_init(\ | ||||
| 					php_index_$(PHP_LIB)_"$$name"(), \ | ||||
| 						php_index_$(PHP_LIB)_"$$name"_size(), 0));"											>> $(PHP_DIR)/$(PHP_LIB).h; \ | ||||
| 		echo "	zend_hash_str_add(index, \""$$f"\", sizeof(\""$$f"\")-1, &val);"							>> $(PHP_DIR)/$(PHP_LIB).h; \ | ||||
| 	done; | ||||
| 	@echo "}"																								>> $(PHP_DIR)/$(PHP_LIB).h | ||||
| 	@echo "static inline void php_$(PHP_LIB)_include(HashTable *index, HashTable *includes, \ | ||||
| 					char *path, size_t len, zval *retval) {"												>> $(PHP_DIR)/$(PHP_LIB).h | ||||
| 	@echo "	zend_string *key = zend_string_init(path, len, 0);"												>> $(PHP_DIR)/$(PHP_LIB).h | ||||
| 	@echo "	zval *code = zend_hash_find(index, key);"														>> $(PHP_DIR)/$(PHP_LIB).h | ||||
| 	@echo "	if (code && !zend_hash_exists(includes, key)) {"												>> $(PHP_DIR)/$(PHP_LIB).h | ||||
| 	@echo "		zend_string *prepared = zend_string_alloc(Z_STRLEN_P(code) + (sizeof(\";\")-1), 0);"		>> $(PHP_DIR)/$(PHP_LIB).h | ||||
| 	@echo																									>> $(PHP_DIR)/$(PHP_LIB).h | ||||
| 	@echo "		memcpy(&ZSTR_VAL(prepared)[0], \";\", sizeof(\";\")-1);"									>> $(PHP_DIR)/$(PHP_LIB).h | ||||
| 	@echo "		if (Z_STRLEN_P(code) > (sizeof(\"<?php\") -1) && "											>> $(PHP_DIR)/$(PHP_LIB).h | ||||
| 	@echo "			memcmp(Z_STRVAL_P(code), \"<?php\", sizeof(\"<?php\")-1) == SUCCESS) {"					>> $(PHP_DIR)/$(PHP_LIB).h | ||||
| 	@echo "				memcpy(&ZSTR_VAL(prepared)[1], &Z_STRVAL_P(code)[5], \ | ||||
| 							Z_STRLEN_P(code) - (sizeof(\"<?php\") - 1));"									>> $(PHP_DIR)/$(PHP_LIB).h | ||||
| 	@echo "				ZSTR_LEN(prepared) -= (sizeof(\"<?php\") - 1);"										>> $(PHP_DIR)/$(PHP_LIB).h | ||||
| 	@echo "				ZSTR_VAL(prepared)[ZSTR_LEN(prepared)] = 0;"										>> $(PHP_DIR)/$(PHP_LIB).h | ||||
| 	@echo "		} else {"																					>> $(PHP_DIR)/$(PHP_LIB).h | ||||
| 	@echo "			memcpy(&ZSTR_VAL(prepared)[1], Z_STRVAL_P(code), Z_STRLEN_P(code));"					>> $(PHP_DIR)/$(PHP_LIB).h | ||||
| 	@echo "		}"																							>> $(PHP_DIR)/$(PHP_LIB).h | ||||
| 	@echo "		zend_eval_stringl(ZSTR_VAL(prepared), ZSTR_LEN(prepared), retval, path);"					>> $(PHP_DIR)/$(PHP_LIB).h | ||||
| 	@echo "		zend_hash_add_empty_element(includes, key);"												>> $(PHP_DIR)/$(PHP_LIB).h | ||||
| 	@echo "		zend_string_release(prepared);"																>> $(PHP_DIR)/$(PHP_LIB).h | ||||
| 	@echo "	}"																								>> $(PHP_DIR)/$(PHP_LIB).h | ||||
| 	@echo "	zend_string_release(key);"																		>> $(PHP_DIR)/$(PHP_LIB).h | ||||
| 	@echo "}"																								>> $(PHP_DIR)/$(PHP_LIB).h | ||||
| 	@echo "static inline void php_$(PHP_LIB)_shutdown(HashTable *index, HashTable *includes) {"				>> $(PHP_DIR)/$(PHP_LIB).h | ||||
| 	@echo "	zend_hash_destroy(index);"																		>> $(PHP_DIR)/$(PHP_LIB).h | ||||
| 	@echo "	zend_hash_destroy(includes);"																	>> $(PHP_DIR)/$(PHP_LIB).h | ||||
| 	@echo "}"																								>> $(PHP_DIR)/$(PHP_LIB).h | ||||
| 	@echo "#endif"																							>> $(PHP_DIR)/$(PHP_LIB).h | ||||
							
								
								
									
										226
									
								
								samples/Makefile/filenames/makefile.sco
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										226
									
								
								samples/Makefile/filenames/makefile.sco
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,226 @@ | ||||
| # makefile for SCO OSr5  ELF and Unixware 7 with Native cc | ||||
| # Contributed by Mike Hopkirk (hops@sco.com) modified from Makefile.lnx | ||||
| #   force ELF build dynamic linking, SONAME setting in lib and RPATH in app | ||||
| # Copyright (C) 2002, 2006, 2010-2014 Glenn Randers-Pehrson | ||||
| # Copyright (C) 1998 Greg Roelofs | ||||
| # Copyright (C) 1996, 1997 Andreas Dilger | ||||
| # | ||||
| # This code is released under the libpng license. | ||||
| # For conditions of distribution and use, see the disclaimer | ||||
| # and license in png.h | ||||
|  | ||||
| # Library name: | ||||
| LIBNAME = libpng16 | ||||
| PNGMAJ = 16 | ||||
|  | ||||
| # Shared library names: | ||||
| LIBSO=$(LIBNAME).so | ||||
| LIBSOMAJ=$(LIBNAME).so.$(PNGMAJ) | ||||
| LIBSOREL=$(LIBSOMAJ).$(RELEASE) | ||||
| OLDSO=libpng.so | ||||
|  | ||||
| # Utilities: | ||||
| CC=cc | ||||
| AR_RC=ar rc | ||||
| MKDIR_P=mkdir | ||||
| LN_SF=ln -f -s | ||||
| RANLIB=echo | ||||
| CP=cp | ||||
| RM_F=/bin/rm -f | ||||
|  | ||||
| # where make install puts libpng.a, $(OLDSO)*, and png.h | ||||
| prefix=/usr/local | ||||
| exec_prefix=$(prefix) | ||||
|  | ||||
| # Where the zlib library and include files are located | ||||
| #ZLIBLIB=/usr/local/lib | ||||
| #ZLIBINC=/usr/local/include | ||||
| ZLIBLIB=../zlib | ||||
| ZLIBINC=../zlib | ||||
|  | ||||
| CPPFLAGS=-I$(ZLIBINC) | ||||
| CFLAGS= -dy -belf -O3 | ||||
| LDFLAGS=-L. -L$(ZLIBLIB) -lpng16 -lz -lm | ||||
|  | ||||
| INCPATH=$(prefix)/include | ||||
| LIBPATH=$(exec_prefix)/lib | ||||
| MANPATH=$(prefix)/man | ||||
| BINPATH=$(exec_prefix)/bin | ||||
|  | ||||
| # override DESTDIR= on the make install command line to easily support | ||||
| # installing into a temporary location.  Example: | ||||
| # | ||||
| #    make install DESTDIR=/tmp/build/libpng | ||||
| # | ||||
| # If you're going to install into a temporary location | ||||
| # via DESTDIR, $(DESTDIR)$(prefix) must already exist before | ||||
| # you execute make install. | ||||
| DESTDIR= | ||||
|  | ||||
| DB=$(DESTDIR)$(BINPATH) | ||||
| DI=$(DESTDIR)$(INCPATH) | ||||
| DL=$(DESTDIR)$(LIBPATH) | ||||
| DM=$(DESTDIR)$(MANPATH) | ||||
|  | ||||
| # Pre-built configuration | ||||
| # See scripts/pnglibconf.mak for more options | ||||
| PNGLIBCONF_H_PREBUILT = scripts/pnglibconf.h.prebuilt | ||||
|  | ||||
| OBJS = png.o pngset.o pngget.o pngrutil.o pngtrans.o pngwutil.o \ | ||||
| 	pngread.o pngrio.o pngwio.o pngwrite.o pngrtran.o \ | ||||
| 	pngwtran.o pngmem.o pngerror.o pngpread.o | ||||
|  | ||||
| OBJSDLL = $(OBJS:.o=.pic.o) | ||||
|  | ||||
| .SUFFIXES:      .c .o .pic.o | ||||
|  | ||||
| .c.o: | ||||
| 	$(CC) -c $(CPPFLAGS) $(CFLAGS) -o $@ $< | ||||
|  | ||||
| .c.pic.o: | ||||
| 	$(CC) -c $(CPPFLAGS) $(CFLAGS) -KPIC -o $@ $*.c | ||||
|  | ||||
| all: libpng.a $(LIBSO) pngtest libpng.pc libpng-config | ||||
|  | ||||
| pnglibconf.h: $(PNGLIBCONF_H_PREBUILT) | ||||
| 	$(CP) $(PNGLIBCONF_H_PREBUILT) $@ | ||||
|  | ||||
| libpng.a: $(OBJS) | ||||
| 	$(AR_RC) $@ $(OBJS) | ||||
| 	$(RANLIB) $@ | ||||
|  | ||||
| libpng.pc: | ||||
| 	cat scripts/libpng.pc.in | sed -e s!@prefix@!$(prefix)! \ | ||||
| 	-e s!@exec_prefix@!$(exec_prefix)! \ | ||||
| 	-e s!@libdir@!$(LIBPATH)! \ | ||||
| 	-e s!@includedir@!$(INCPATH)! \ | ||||
| 	-e s!-lpng16!-lpng16\ -lz\ -lm! > libpng.pc | ||||
|  | ||||
| libpng-config: | ||||
| 	( cat scripts/libpng-config-head.in; \ | ||||
| 	echo prefix=\"$(prefix)\"; \ | ||||
| 	echo I_opts=\"-I$(INCPATH)/$(LIBNAME)\"; \ | ||||
| 	echo ccopts=\"-belf\"; \ | ||||
| 	echo L_opts=\"-L$(LIBPATH)\"; \ | ||||
| 	echo libs=\"-lpng16 -lz -lm\"; \ | ||||
| 	cat scripts/libpng-config-body.in ) > libpng-config | ||||
| 	chmod +x libpng-config | ||||
|  | ||||
| $(LIBSO): $(LIBSOMAJ) | ||||
| 	$(LN_SF) $(LIBSOMAJ) $(LIBSO) | ||||
|  | ||||
| $(LIBSOMAJ): $(OBJSDLL) | ||||
| 	$(CC) -G  -Wl,-h,$(LIBSOMAJ) -o $(LIBSOMAJ) \ | ||||
| 	 $(OBJSDLL) | ||||
|  | ||||
| pngtest: pngtest.o $(LIBSO) | ||||
| 	LD_RUN_PATH=.:$(ZLIBLIB) $(CC) -o pngtest $(CFLAGS) pngtest.o $(LDFLAGS) | ||||
|  | ||||
| test: pngtest | ||||
| 	./pngtest | ||||
|  | ||||
| install-headers: png.h pngconf.h pnglibconf.h | ||||
| 	-@if [ ! -d $(DI) ]; then $(MKDIR_P) $(DI); fi | ||||
| 	-@if [ ! -d $(DI)/$(LIBNAME) ]; then $(MKDIR_P) $(DI)/$(LIBNAME); fi | ||||
| 	-@$(RM_F) $(DI)/png.h | ||||
| 	-@$(RM_F) $(DI)/pngconf.h | ||||
| 	-@$(RM_F) $(DI)/pnglibconf.h | ||||
| 	cp png.h pngconf.h pnglibconf.h $(DI)/$(LIBNAME) | ||||
| 	chmod 644 $(DI)/$(LIBNAME)/png.h $(DI)/$(LIBNAME)/pngconf.h $(DI)/$(LIBNAME)/pnglibconf.h | ||||
| 	-@$(RM_F) $(DI)/png.h $(DI)/pngconf.h $(DI)/pnglibconf.h | ||||
| 	-@$(RM_F) $(DI)/libpng | ||||
| 	(cd $(DI); $(LN_SF) $(LIBNAME) libpng; $(LN_SF) $(LIBNAME)/* .) | ||||
|  | ||||
| install-static: install-headers libpng.a | ||||
| 	-@if [ ! -d $(DL) ]; then $(MKDIR_P) $(DL); fi | ||||
| 	cp libpng.a $(DL)/$(LIBNAME).a | ||||
| 	chmod 644 $(DL)/$(LIBNAME).a | ||||
| 	-@$(RM_F) $(DL)/libpng.a | ||||
| 	(cd $(DL); $(LN_SF) $(LIBNAME).a libpng.a) | ||||
|  | ||||
| install-shared: install-headers $(LIBSOMAJ) libpng.pc | ||||
| 	-@if [ ! -d $(DL) ]; then $(MKDIR_P) $(DL); fi | ||||
| 	-@$(RM_F) $(DL)/$(LIBSO) | ||||
| 	-@$(RM_F) $(DL)/$(LIBSOREL) | ||||
| 	-@$(RM_F) $(DL)/$(OLDSO) | ||||
| 	cp $(LIBSOMAJ) $(DL)/$(LIBSOREL) | ||||
| 	chmod 755 $(DL)/$(LIBSOREL) | ||||
| 	(cd $(DL); \ | ||||
| 	$(LN_SF) $(LIBSOREL) $(LIBSO); \ | ||||
| 	$(LN_SF) $(LIBSO) $(OLDSO)) | ||||
| 	-@if [ ! -d $(DL)/pkgconfig ]; then $(MKDIR_P) $(DL)/pkgconfig; fi | ||||
| 	-@$(RM_F) $(DL)/pkgconfig/$(LIBNAME).pc | ||||
| 	-@$(RM_F) $(DL)/pkgconfig/libpng.pc | ||||
| 	cp libpng.pc $(DL)/pkgconfig/$(LIBNAME).pc | ||||
| 	chmod 644 $(DL)/pkgconfig/$(LIBNAME).pc | ||||
| 	(cd $(DL)/pkgconfig; $(LN_SF) $(LIBNAME).pc libpng.pc) | ||||
|  | ||||
| install-man: libpng.3 libpngpf.3 png.5 | ||||
| 	-@if [ ! -d $(DM) ]; then $(MKDIR_P) $(DM); fi | ||||
| 	-@if [ ! -d $(DM)/man3 ]; then $(MKDIR_P) $(DM)/man3; fi | ||||
| 	-@$(RM_F) $(DM)/man3/libpng.3 | ||||
| 	-@$(RM_F) $(DM)/man3/libpngpf.3 | ||||
| 	cp libpng.3 $(DM)/man3 | ||||
| 	cp libpngpf.3 $(DM)/man3 | ||||
| 	-@if [ ! -d $(DM)/man5 ]; then $(MKDIR_P) $(DM)/man5; fi | ||||
| 	-@$(RM_F) $(DM)/man5/png.5 | ||||
| 	cp png.5 $(DM)/man5 | ||||
|  | ||||
| install-config: libpng-config | ||||
| 	-@if [ ! -d $(DB) ]; then $(MKDIR_P) $(DB); fi | ||||
| 	-@$(RM_F) $(DB)/libpng-config | ||||
| 	-@$(RM_F) $(DB)/$(LIBNAME)-config | ||||
| 	cp libpng-config $(DB)/$(LIBNAME)-config | ||||
| 	chmod 755 $(DB)/$(LIBNAME)-config | ||||
| 	(cd $(DB); $(LN_SF) $(LIBNAME)-config libpng-config) | ||||
|  | ||||
| install: install-static install-shared install-man install-config | ||||
|  | ||||
| # If you installed in $(DESTDIR), test-installed won't work until you | ||||
| # move the library to its final location.  Use test-dd to test it | ||||
| # before then. | ||||
|  | ||||
| test-dd: | ||||
| 	echo | ||||
| 	echo Testing installed dynamic shared library in $(DL). | ||||
| 	$(CC) -I$(DI) $(CPPFLAGS) \ | ||||
| 	   `$(BINPATH)/$(LIBNAME)-config --cflags` pngtest.c \ | ||||
| 	   -L$(DL) -L$(ZLIBLIB) \ | ||||
| 	   -o pngtestd `$(BINPATH)/$(LIBNAME)-config --ldflags` | ||||
| 	./pngtestd pngtest.png | ||||
|  | ||||
| test-installed: | ||||
| 	$(CC) $(CPPFLAGS) $(CFLAGS) \ | ||||
| 	   `$(BINPATH)/$(LIBNAME)-config --cflags` pngtest.c \ | ||||
| 	   -L$(ZLIBLIB) \ | ||||
| 	   -o pngtesti `$(BINPATH)/$(LIBNAME)-config --ldflags` | ||||
| 	./pngtesti pngtest.png | ||||
|  | ||||
| clean: | ||||
| 	$(RM_F) *.o libpng.a pngtest pngout.png libpng-config \ | ||||
| 	$(LIBSO) $(LIBSOMAJ)* pngtest-static pngtesti \ | ||||
| 	pnglibconf.h libpng.pc | ||||
|  | ||||
| DOCS = ANNOUNCE CHANGES INSTALL KNOWNBUG LICENSE README TODO Y2KINFO | ||||
| writelock: | ||||
| 	chmod a-w *.[ch35] $(DOCS) scripts/* | ||||
|  | ||||
| # DO NOT DELETE THIS LINE -- make depend depends on it. | ||||
|  | ||||
| png.o png.pic.o: png.h pngconf.h pnglibconf.h pngpriv.h pngstruct.h pnginfo.h pngdebug.h | ||||
| pngerror.o pngerror.pic.o: png.h pngconf.h pnglibconf.h pngpriv.h pngstruct.h pnginfo.h pngdebug.h | ||||
| pngrio.o pngrio.pic.o: png.h pngconf.h pnglibconf.h pngpriv.h pngstruct.h pnginfo.h pngdebug.h | ||||
| pngwio.o pngwio.pic.o: png.h pngconf.h pnglibconf.h pngpriv.h pngstruct.h pnginfo.h pngdebug.h | ||||
| pngmem.o pngmem.pic.o: png.h pngconf.h pnglibconf.h pngpriv.h pngstruct.h pnginfo.h pngdebug.h | ||||
| pngset.o pngset.pic.o: png.h pngconf.h pnglibconf.h pngpriv.h pngstruct.h pnginfo.h pngdebug.h | ||||
| pngget.o pngget.pic.o: png.h pngconf.h pnglibconf.h pngpriv.h pngstruct.h pnginfo.h pngdebug.h | ||||
| pngread.o pngread.pic.o: png.h pngconf.h pnglibconf.h pngpriv.h pngstruct.h pnginfo.h pngdebug.h | ||||
| pngrtran.o pngrtran.pic.o: png.h pngconf.h pnglibconf.h pngpriv.h pngstruct.h pnginfo.h pngdebug.h | ||||
| pngrutil.o pngrutil.pic.o: png.h pngconf.h pnglibconf.h pngpriv.h pngstruct.h pnginfo.h pngdebug.h | ||||
| pngtrans.o pngtrans.pic.o: png.h pngconf.h pnglibconf.h pngpriv.h pngstruct.h pnginfo.h pngdebug.h | ||||
| pngwrite.o pngwrite.pic.o: png.h pngconf.h pnglibconf.h pngpriv.h pngstruct.h pnginfo.h pngdebug.h | ||||
| pngwtran.o pngwtran.pic.o: png.h pngconf.h pnglibconf.h pngpriv.h pngstruct.h pnginfo.h pngdebug.h | ||||
| pngwutil.o pngwutil.pic.o: png.h pngconf.h pnglibconf.h pngpriv.h pngstruct.h pnginfo.h pngdebug.h | ||||
| pngpread.o pngpread.pic.o: png.h pngconf.h pnglibconf.h pngpriv.h pngstruct.h pnginfo.h pngdebug.h | ||||
|  | ||||
| pngtest.o: png.h pngconf.h pnglibconf.h | ||||
							
								
								
									
										9
									
								
								samples/Makefile/filenames/mkfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								samples/Makefile/filenames/mkfile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | ||||
| GREETINGS=hello gday bonjour hola ola kaixo tag hoi konnichiwa nihao dobredan namaste salaam | ||||
|  | ||||
| all:V: | ||||
| 	mk greet.^($GREETINGS) | ||||
| 	for(i in $GREETINGS) | ||||
| 		mk $i | ||||
|  | ||||
| greet.%: text-folder | ||||
| 	/n/$printer $stem >[2=1] | ||||
							
								
								
									
										1
									
								
								samples/Mathematica/TestArithmetic.mt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								samples/Mathematica/TestArithmetic.mt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| Test[1 + 2, 3, TestID -> "One plus two"] | ||||
							
								
								
									
										1
									
								
								samples/Mathematica/TestString.mt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								samples/Mathematica/TestString.mt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| Test["a" <> "b", "ab", TestID -> "Concat \"a\" and \"b\""] | ||||
							
								
								
									
										5
									
								
								samples/Mathematica/TestSuite.mt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								samples/Mathematica/TestSuite.mt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | ||||
| TestSuite[ | ||||
|     { "TestArithmetic.mt" | ||||
|     , "TestString.mt" | ||||
|     } | ||||
| ] | ||||
							
								
								
									
										694
									
								
								samples/MediaWiki/README.wiki
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										694
									
								
								samples/MediaWiki/README.wiki
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,694 @@ | ||||
| = Name = | ||||
|  | ||||
| '''nginx_tcp_proxy_module''' - support TCP proxy with Nginx | ||||
|  | ||||
| = Installation = | ||||
|  | ||||
| Download the latest stable version of the release tarball of this module from [http://github.com/yaoweibin/nginx_tcp_proxy_module github] | ||||
|  | ||||
| Grab the nginx source code from [http://nginx.org/ nginx.org], for example, the version 1.2.1 (see nginx compatibility), and then build the source with this module: | ||||
|  | ||||
| <geshi lang="bash"> | ||||
|     $ wget 'http://nginx.org/download/nginx-1.2.1.tar.gz' | ||||
|     $ tar -xzvf nginx-1.2.1.tar.gz | ||||
|     $ cd nginx-1.2.1/ | ||||
|     $ patch -p1 < /path/to/nginx_tcp_proxy_module/tcp.patch | ||||
|  | ||||
|     $ ./configure --add-module=/path/to/nginx_tcp_proxy_module | ||||
|  | ||||
|     $ make | ||||
|     $ make install | ||||
| </geshi> | ||||
|      | ||||
|  | ||||
| = Synopsis = | ||||
|  | ||||
| <geshi lang="nginx"> | ||||
| http { | ||||
|  | ||||
|     server { | ||||
|         listen 80; | ||||
|  | ||||
|         location /status { | ||||
|             tcp_check_status; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| </geshi> | ||||
|  | ||||
| <geshi lang="nginx"> | ||||
|  | ||||
| #You can also include tcp_proxy.conf file individually | ||||
|  | ||||
| #include /path/to/tcp_proxy.conf; | ||||
|  | ||||
| tcp { | ||||
|  | ||||
|     upstream cluster { | ||||
|         # simple round-robin | ||||
|         server 192.168.0.1:80; | ||||
|         server 192.168.0.2:80; | ||||
|  | ||||
|         check interval=3000 rise=2 fall=5 timeout=1000; | ||||
|  | ||||
|         #check interval=3000 rise=2 fall=5 timeout=1000 type=ssl_hello; | ||||
|  | ||||
|         #check interval=3000 rise=2 fall=5 timeout=1000 type=http; | ||||
|         #check_http_send "GET / HTTP/1.0\r\n\r\n"; | ||||
|         #check_http_expect_alive http_2xx http_3xx; | ||||
|     } | ||||
|  | ||||
|     server { | ||||
|         listen 8888; | ||||
|  | ||||
|         proxy_pass cluster; | ||||
|     } | ||||
| } | ||||
| </geshi> | ||||
|  | ||||
| = Description = | ||||
|  | ||||
| This module actually include many modules: ngx_tcp_module, ngx_tcp_core_module, ngx_tcp_upstream_module, ngx_tcp_proxy_module, ngx_tcp_websocket_module, ngx_tcp_ssl_module, ngx_tcp_upstream_ip_hash_module. All these modules work together to support TCP proxy with Nginx. I also added other features: ip_hash, upstream server health check, status monitor. | ||||
|  | ||||
| The motivation of writing these modules is Nginx's high performance and robustness. At first, I developed this module just for general TCP proxy. And now, this module is frequently used in websocket reverse proxying.  | ||||
|  | ||||
| Note, You can't use the same listening port with HTTP modules.  | ||||
|  | ||||
| = Directives = | ||||
|  | ||||
| == ngx_tcp_moodule == | ||||
|  | ||||
| === tcp === | ||||
|  | ||||
| '''syntax:''' ''tcp {...}'' | ||||
|  | ||||
| '''default:''' ''none'' | ||||
|  | ||||
| '''context:''' ''main'' | ||||
|  | ||||
| '''description:''' All the tcp related directives are contained in the tcp block. | ||||
|  | ||||
|  | ||||
| '''ngx_tcp_core_moodule''' | ||||
|  | ||||
| === server === | ||||
|  | ||||
| '''syntax:''' ''server {...}'' | ||||
|  | ||||
| '''default:''' ''none'' | ||||
|  | ||||
| '''context:''' ''tcp'' | ||||
|  | ||||
| '''description:''' All the specific server directives are contained in the server block. | ||||
|  | ||||
| === listen === | ||||
|  | ||||
| '''syntax:''' ''listen address:port [ bind | ssl | default]'' | ||||
|  | ||||
| '''default:''' ''none'' | ||||
|  | ||||
| '''context:''' ''server'' | ||||
|  | ||||
| '''description:''' The same as [http://wiki.nginx.org/NginxMailCoreModule#listen listen]. The parameter of default means the default server if you have several server blocks with the same port. | ||||
|  | ||||
| === access_log === | ||||
|  | ||||
| '''syntax:''' ''access_log path [buffer=size] | off''  | ||||
|  | ||||
| '''default:''' ''access_log logs/tcp_access.log'' | ||||
|  | ||||
| '''context:''' ''tcp, server'' | ||||
|  | ||||
| '''description:''' Set the access.log. Each record's format is like this: | ||||
|  | ||||
| <pre> | ||||
|  | ||||
| log_time worker_process_pid client_ip host_ip accept_time upstream_ip bytes_read bytes_write | ||||
|  | ||||
| 2011/08/02 06:19:07 [5972] 127.0.0.1 0.0.0.0:1982 2011/08/02 06:18:19 172.19.0.129:80 80 236305 | ||||
|  | ||||
| </pre> | ||||
|  | ||||
| * ''log_time'': The current time when writing this log. The log action is called when the proxy session is closed. | ||||
| * ''worker_process_pid'': the pid of worker process | ||||
| * ''client_ip'': the client ip | ||||
| * ''host_ip'': the server ip and port | ||||
| * ''accept_time'': the time when the server accepts client's connection | ||||
| * ''upstream_ip'': the upstream server's ip | ||||
| * ''bytes_read'': the bytes read from client | ||||
| * ''bytes_write'': the bytes written to client | ||||
|  | ||||
| === allow === | ||||
|  | ||||
| '''syntax:''' ''allow [ address | CIDR | all ]''  | ||||
|  | ||||
| '''default:''' ''none'' | ||||
|  | ||||
| '''context:''' ''server'' | ||||
|  | ||||
| '''description:''' Directive grants access for the network or addresses indicated. | ||||
|  | ||||
| === deny === | ||||
|  | ||||
| '''syntax:''' ''deny [ address | CIDR | all ]'' | ||||
|  | ||||
| '''default:''' ''none'' | ||||
|  | ||||
| '''context:''' ''server'' | ||||
|  | ||||
| '''description:''' Directive grants access for the network or addresses indicated. | ||||
|  | ||||
| === so_keepalive === | ||||
|  | ||||
| '''syntax:''' ''so_keepalive on|off'' | ||||
|  | ||||
| '''default:''' ''off'' | ||||
|  | ||||
| '''context:''' ''main, server'' | ||||
|  | ||||
| '''description:''' The same as [http://wiki.nginx.org/NginxMailCoreModule#so_keepalive so_keepalive]. | ||||
|  | ||||
| === tcp_nodelay === | ||||
|  | ||||
| '''syntax:''' ''tcp_nodelay on|off'' | ||||
|  | ||||
| '''default:''' ''on'' | ||||
|  | ||||
| '''context:''' ''main, server'' | ||||
|  | ||||
| '''description:''' The same as [http://wiki.nginx.org/NginxHttpCoreModule#tcp_nodelay tcp_nodelay]. | ||||
|  | ||||
| === timeout === | ||||
|  | ||||
| '''syntax:''' ''timeout milliseconds'' | ||||
|  | ||||
| '''default:''' ''60000'' | ||||
|  | ||||
| '''context:''' ''main, server'' | ||||
|  | ||||
| '''description:''' set the timeout value with clients. | ||||
|  | ||||
| === server_name === | ||||
|  | ||||
| '''syntax:''' ''server_name name'' | ||||
|  | ||||
| '''default:''' ''The name of the host, obtained through gethostname()'' | ||||
|  | ||||
| '''context:''' ''tcp, server'' | ||||
|  | ||||
| '''description:''' The same as [http://wiki.nginx.org/NginxMailCoreModule#server_name server_name]. You can specify several server name in different server block with the same port. They can be used in websocket module. | ||||
|  | ||||
| === resolver === | ||||
|  | ||||
| '''syntax:''' ''resolver address'' | ||||
|  | ||||
| '''default:''' ''none'' | ||||
|  | ||||
| '''context:''' ''tcp, server'' | ||||
|  | ||||
| '''description:''' DNS server | ||||
|  | ||||
| === resolver_timeout === | ||||
|  | ||||
| '''syntax:''' ''resolver_timeout time'' | ||||
|  | ||||
| '''default:''' ''30s'' | ||||
|  | ||||
| '''context:''' ''tcp, server'' | ||||
|  | ||||
| '''description:''' Resolver timeout in seconds. | ||||
|  | ||||
|  | ||||
| == ngx_tcp_upstream_module == | ||||
|  | ||||
| === upstream === | ||||
|  | ||||
| '''syntax:''' ''upstream {...}'' | ||||
|  | ||||
| '''default:''' ''none'' | ||||
|  | ||||
| '''context:''' ''tcp'' | ||||
|  | ||||
| '''description:''' All the upstream directives are contained in this  block. The upstream server will be dispatched with round robin by default.  | ||||
|  | ||||
| === server === | ||||
|  | ||||
| '''syntax:''' ''server name [parameters]'' | ||||
|  | ||||
| '''default:''' ''none'' | ||||
|  | ||||
| '''context:''' ''upstream'' | ||||
|  | ||||
| '''description:''' Most of the parameters are the same as [http://wiki.nginx.org/NginxHttpUpstreamModule#server server]. Default port is 80.   | ||||
|  | ||||
| === check === | ||||
|  | ||||
| '''syntax:''' ''check interval=milliseconds [fall=count] [rise=count] [timeout=milliseconds] [type=tcp|ssl_hello|smtp|mysql|pop3|imap]'' | ||||
|  | ||||
| '''default:''' ''none, if parameters omitted, default parameters are interval=30000 fall=5 rise=2 timeout=1000'' | ||||
|  | ||||
| '''context:''' ''upstream'' | ||||
|  | ||||
| '''description:''' Add the health check for the upstream servers. At present, the check method is a simple tcp connect. | ||||
|  | ||||
| The parameters' meanings are: | ||||
|  | ||||
| * ''interval'': the check request's interval time. | ||||
| * ''fall''(fall_count): After fall_count check failures, the server is marked down.  | ||||
| * ''rise''(rise_count): After rise_count check success, the server is marked up.  | ||||
| * ''timeout'': the check request's timeout. | ||||
| * ''type'': the check protocol type: | ||||
| # ''tcp'' is a simple tcp socket connect and peek one byte.  | ||||
| # ''ssl_hello'' sends a client ssl hello packet and receives the server ssl hello packet. | ||||
| # ''http'' sends a http request packet, receives and parses the http response to diagnose if the upstream server is alive.   | ||||
| # ''smtp'' sends a smtp request packet, receives and parses the smtp response to diagnose if the upstream server is alive. The response begins with '2' should be an OK response.  | ||||
| # ''mysql'' connects to the mysql server, receives the greeting response to diagnose if the upstream server is alive.   | ||||
| # ''pop3'' receives and parses the pop3 response to diagnose if the upstream server is alive. The response begins with '+' should be an OK response. | ||||
| # ''imap'' connects to the imap server, receives the greeting response to diagnose if the upstream server is alive.   | ||||
|  | ||||
| === check_http_send === | ||||
|  | ||||
| '''syntax:''' ''check_http_send http_packet'' | ||||
|  | ||||
| '''default:''' ''"GET / HTTP/1.0\r\n\r\n"'' | ||||
|  | ||||
| '''context:''' ''upstream'' | ||||
|  | ||||
| '''description:''' If you set the check type is http, then the check function will sends this http packet to check the upstream server. | ||||
|  | ||||
| === check_http_expect_alive === | ||||
|  | ||||
| '''syntax:''' ''check_http_expect_alive [ http_2xx | http_3xx | http_4xx | http_5xx ]'' | ||||
|  | ||||
| '''default:''' ''http_2xx | http_3xx'' | ||||
|  | ||||
| '''context:''' ''upstream'' | ||||
|  | ||||
| '''description:''' These status codes indicate the upstream server's http response is OK, the backend is alive. | ||||
|  | ||||
| === check_smtp_send === | ||||
|  | ||||
| '''syntax:''' ''check_smtp_send smtp_packet'' | ||||
|  | ||||
| '''default:''' ''"HELO smtp.localdomain\r\n"'' | ||||
|  | ||||
| '''context:''' ''upstream'' | ||||
|  | ||||
| '''description:''' If you set the check type is smtp, then the check function will sends this smtp packet to check the upstream server. | ||||
|  | ||||
| === check_smtp_expect_alive === | ||||
|  | ||||
| '''syntax:''' ''check_smtp_expect_alive [smtp_2xx | smtp_3xx | smtp_4xx | smtp_5xx]'' | ||||
|  | ||||
| '''default:''' ''smtp_2xx'' | ||||
|  | ||||
| '''context:''' ''upstream'' | ||||
|  | ||||
| '''description:''' These status codes indicate the upstream server's smtp response is OK, the backend is alive. | ||||
|  | ||||
| === check_shm_size === | ||||
|  | ||||
| '''syntax:''' ''check_shm_size size'' | ||||
|  | ||||
| '''default:''' ''(number_of_checked_upstream_blocks + 1) * pagesize'' | ||||
|  | ||||
| '''context:''' ''tcp'' | ||||
|  | ||||
| '''description:''' If you store hundreds of servers in one upstream block, the shared memory for health check may be not enough, you can enlarged it by this directive. | ||||
|  | ||||
| === tcp_check_status === | ||||
|  | ||||
| '''syntax:''' ''tcp_check_status'' | ||||
|  | ||||
| '''default:''' ''none'' | ||||
|  | ||||
| '''context:''' ''location'' | ||||
|  | ||||
| '''description:''' Display the health checking servers' status by HTTP. This directive is set in the http block. | ||||
|  | ||||
| The table field meanings are: | ||||
|  | ||||
| * ''Index'': The server index in the check table  | ||||
| * ''Name'' : The upstream server name | ||||
| * ''Status'': The marked status of the server. | ||||
| * ''Busyness'': The number of connections which are connecting to the server. | ||||
| * ''Rise counts'': Count the successful checking | ||||
| * ''Fall counts'': Count the unsuccessful checking | ||||
| * ''Access counts'': Count the times accessing to this server | ||||
| * ''Check type'': The type of the check packet | ||||
|  | ||||
|  | ||||
| '''ngx_tcp_upstream_busyness_module''' | ||||
|  | ||||
| === busyness === | ||||
|  | ||||
| '''syntax:''' ''busyness'' | ||||
|  | ||||
| '''default:''' ''none'' | ||||
|  | ||||
| '''context:''' ''upstream'' | ||||
|  | ||||
| '''description:''' the upstream server will be dispatched by backend servers' busyness. | ||||
|  | ||||
|  | ||||
| '''ngx_tcp_upstream_ip_hash_module''' | ||||
|  | ||||
| === ip_hash === | ||||
|  | ||||
| '''syntax:''' ''ip_hash'' | ||||
|  | ||||
| '''default:''' ''none'' | ||||
|  | ||||
| '''context:''' ''upstream'' | ||||
|  | ||||
| '''description:''' the upstream server will be dispatched by ip_hash. | ||||
|  | ||||
|  | ||||
| == ngx_tcp_proxy_module == | ||||
|  | ||||
| === proxy_pass === | ||||
|  | ||||
| '''syntax:''' ''proxy_pass host:port'' | ||||
|  | ||||
| '''default:''' ''none'' | ||||
|  | ||||
| '''context:''' ''server'' | ||||
|  | ||||
| '''description:''' proxy the request to the backend server. Default port is 80. | ||||
|  | ||||
| === proxy_buffer === | ||||
|  | ||||
| '''syntax:''' ''proxy_buffer size'' | ||||
|  | ||||
| '''default:''' ''4k'' | ||||
|  | ||||
| '''context:''' ''tcp, server'' | ||||
|  | ||||
| '''description:''' set the size of proxy buffer. | ||||
|  | ||||
| === proxy_connect_timeout === | ||||
|  | ||||
| '''syntax:''' ''proxy_connect_timeout miliseconds'' | ||||
|  | ||||
| '''default:''' ''60000'' | ||||
|  | ||||
| '''context:''' ''tcp, server'' | ||||
|  | ||||
| '''description:''' set the timeout value of connection to backends. | ||||
|  | ||||
| === proxy_read_timeout === | ||||
|  | ||||
| '''syntax:''' ''proxy_read_timeout miliseconds'' | ||||
|  | ||||
| '''default:''' ''60000'' | ||||
|  | ||||
| '''context:''' ''tcp, server'' | ||||
|  | ||||
| '''description:''' set the timeout value of reading from backends. | ||||
|  | ||||
| === proxy_send_timeout === | ||||
|  | ||||
| '''syntax:''' ''proxy_send_timeout miliseconds'' | ||||
|  | ||||
| '''default:''' ''60000'' | ||||
|  | ||||
| '''context:''' ''tcp, server'' | ||||
|  | ||||
| '''description:''' set the timeout value of sending to backends. | ||||
|  | ||||
|  | ||||
| == ngx_tcp_websocket_module == | ||||
|  | ||||
| === websocket_pass === | ||||
|  | ||||
| '''syntax:''' ''websocket_pass [path] host:port'' | ||||
|  | ||||
| '''default:''' ''none'' | ||||
|  | ||||
| '''context:''' ''server'' | ||||
|  | ||||
| '''description:''' proxy the websocket request to the backend server. Default port is 80. You can specify several different paths in the same server block. | ||||
|  | ||||
| === websocket_buffer === | ||||
|  | ||||
| '''syntax:''' ''websocket_buffer size'' | ||||
|  | ||||
| '''default:''' ''4k'' | ||||
|  | ||||
| '''context:''' ''tcp, server'' | ||||
|  | ||||
| '''description:''' set the size of proxy buffer. | ||||
|  | ||||
| === websocket_connect_timeout === | ||||
|  | ||||
| '''syntax:''' ''websocket_connect_timeout miliseconds'' | ||||
|  | ||||
| '''default:''' ''60000'' | ||||
|  | ||||
| '''context:''' ''tcp, server'' | ||||
|  | ||||
| '''description:''' set the timeout value of connection to backends. | ||||
|  | ||||
| === websocket_read_timeout === | ||||
|  | ||||
| '''syntax:''' ''websocket_read_timeout miliseconds'' | ||||
|  | ||||
| '''default:''' ''60000'' | ||||
|  | ||||
| '''context:''' ''tcp, server'' | ||||
|  | ||||
| '''description:''' set the timeout value of reading from backends. Your timeout will be the minimum of this and the *timeout* parameter, so if you want a long timeout for your websockets, make sure to set both paramaters. | ||||
|  | ||||
| === websocket_send_timeout === | ||||
|  | ||||
| '''syntax:''' ''websocket_send_timeout miliseconds'' | ||||
|  | ||||
| '''default:''' ''60000'' | ||||
|  | ||||
| '''context:''' ''tcp, server'' | ||||
|  | ||||
| '''description:''' set the timeout value of sending to backends. | ||||
|  | ||||
|  | ||||
| == ngx_tcp_ssl_module == | ||||
|  | ||||
| The default config file includes this ngx_tcp_ssl_module. If you want to just compile nginx without ngx_tcp_ssl_module, copy the ngx_tcp_proxy_module/config_without_ssl to ngx_tcp_proxy_module/config,  reconfigrure and compile nginx. | ||||
|  | ||||
| === ssl === | ||||
|  | ||||
| '''syntax:''' ''ssl [on|off] '' | ||||
|  | ||||
| '''default:''' ''ssl off'' | ||||
|  | ||||
| '''context:''' ''tcp, server'' | ||||
|  | ||||
| Enables SSL for a server. | ||||
|  | ||||
| === ssl_certificate === | ||||
|  | ||||
| '''syntax:''' ''ssl_certificate file'' | ||||
|  | ||||
| '''default:''' ''ssl_certificate cert.pem'' | ||||
|  | ||||
| '''context:''' ''tcp, server'' | ||||
|  | ||||
| This directive specifies the file containing the certificate, in PEM format. This file can contain also other certificates and the server private key. | ||||
|  | ||||
| === ssl_certificate_key === | ||||
|  | ||||
| '''syntax:''' ''ssl_certificate_key file'' | ||||
|  | ||||
| '''default:''' ''ssl_certificate_key cert.pem'' | ||||
|  | ||||
| '''context:''' ''tcp, server'' | ||||
|  | ||||
| This directive specifies the file containing the private key, in PEM format. | ||||
|  | ||||
| === ssl_client_certificate === | ||||
|  | ||||
| '''syntax:''' ''ssl_client_certificate file'' | ||||
|  | ||||
| '''default:''' ''none'' | ||||
|  | ||||
| '''context:''' ''tcp, server'' | ||||
|  | ||||
| This directive specifies the file containing the CA (root) certificate, in PEM format, that is used for validating client certificates. | ||||
|  | ||||
| === ssl_dhparam === | ||||
|  | ||||
| '''syntax:''' ''ssl_dhparam file'' | ||||
|  | ||||
| '''default:''' ''none'' | ||||
|  | ||||
| '''context:''' ''tcp, server'' | ||||
|  | ||||
| This directive specifies a file containing Diffie-Hellman key agreement protocol cryptographic parameters, in PEM format, utilized for exchanging session keys between server and client. | ||||
|  | ||||
| === ssl_ciphers === | ||||
|  | ||||
| '''syntax:''' ''ssl_ciphers openssl_cipherlist_spec'' | ||||
|  | ||||
| '''default:''' ''ssl_ciphers HIGH:!aNULL:!MD5'' | ||||
|  | ||||
| '''context:''' ''tcp, server'' | ||||
|  | ||||
| This directive describes the list of cipher suites the server supports for establishing a secure connection. Cipher suites are specified in the [http://openssl.org/docs/apps/ciphers.html OpenSSL] cipherlist format, for example: | ||||
|  | ||||
| <geshi lang="nginx"> | ||||
| ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; | ||||
| </geshi> | ||||
|  | ||||
| The complete cipherlist supported by the currently installed version of OpenSSL in your platform can be obtained by issuing the command: | ||||
| <pre> | ||||
| openssl ciphers | ||||
| </pre> | ||||
|  | ||||
| === ssl_crl === | ||||
|  | ||||
| '''syntax:''' ''ssl_crl file'' | ||||
|  | ||||
| '''default:''' ''none'' | ||||
|  | ||||
| '''context:''' ''tcp, server'' | ||||
|  | ||||
| This directive specifies the filename of a Certificate Revocation List, in PEM format, which is used to check the revocation status of certificates. | ||||
|  | ||||
| === ssl_prefer_server_ciphers === | ||||
|  | ||||
| '''syntax:''' ''ssl_prefer_server_ciphers [on|off] '' | ||||
|  | ||||
| '''default:''' ''ssl_prefer_server_ciphers off'' | ||||
|  | ||||
| '''context:''' ''tcp, server'' | ||||
|  | ||||
| The server requires that the cipher suite list for protocols SSLv3 and TLSv1 are to be preferred over the client supported cipher suite list. | ||||
|  | ||||
| === ssl_protocols === | ||||
|  | ||||
| '''syntax:''' ''ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2]'' | ||||
|  | ||||
| '''default:''' ''ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2'' | ||||
|  | ||||
| '''context:''' ''tcp, server'' | ||||
|  | ||||
| This directive enables the protocol versions specified. | ||||
|  | ||||
| === ssl_verify_client === | ||||
|  | ||||
| '''syntax:''' ''ssl_verify_client on|off|optional'' | ||||
|  | ||||
| '''default:''' ''ssl_verify_client off'' | ||||
|  | ||||
| '''context:''' ''tcp, server'' | ||||
|  | ||||
| This directive enables the verification of the client identity. Parameter 'optional' checks the client identity using its certificate in case it was made available to the server. | ||||
|  | ||||
| === ssl_verify_depth === | ||||
|  | ||||
| '''syntax:''' ''ssl_verify_depth number'' | ||||
|  | ||||
| '''default:''' ''ssl_verify_depth 1'' | ||||
|  | ||||
| '''context:''' ''tcp, server'' | ||||
|  | ||||
| This directive sets how deep the server should go in the client provided certificate chain in order to verify the client identity. | ||||
|  | ||||
| === ssl_session_cache === | ||||
|  | ||||
| '''syntax:''' ''ssl_session_cache off|none|builtin:size and/or shared:name:size'' | ||||
|  | ||||
| '''default:''' ''ssl_session_cache off'' | ||||
|  | ||||
| '''context:''' ''tcp, server'' | ||||
|  | ||||
| The directive sets the types and sizes of caches to store the SSL sessions. | ||||
|  | ||||
| The cache types are: | ||||
|  | ||||
| * off -- Hard off: nginx says explicitly to a client that sessions can not reused. | ||||
| * none -- Soft off: nginx says to a client that session can be resued, but nginx actually never reuses them. This is workaround for some mail clients as ssl_session_cache may be used in mail proxy as well as in HTTP server. | ||||
| * builtin -- the OpenSSL builtin cache, is used inside one worker process only. The cache size is assigned in the number of the sessions. Note: there appears to be a memory fragmentation issue using this method, please take that into consideration when using this. See "References" below. | ||||
| * shared -- the cache is shared between all worker processes. The size of the cache is assigned in bytes: 1 MB cache can contain roughly 4000 sessions. Each shared cache must be given an arbitrary name. A shared cache with a given name can be used in several virtual hosts. | ||||
| It's possible to use both types of cache — builtin and shared — simultaneously, for example: | ||||
|  | ||||
| <geshi lang="nginx"> | ||||
| ssl_session_cache  builtin:1000  shared:SSL:10m; | ||||
| </geshi> | ||||
|  | ||||
| Bear in mind however, that using only shared cache, i.e., without builtin, should be more effective. | ||||
|  | ||||
| === ssl_session_timeout === | ||||
|  | ||||
| '''syntax:''' ''ssl_session_timeout time'' | ||||
|  | ||||
| '''default:''' ''ssl_session_timeout 5m'' | ||||
|  | ||||
| '''context:''' ''tcp, server'' | ||||
|  | ||||
| This directive defines the maximum time during which the client can re-use the previously negotiated cryptographic parameters of the secure session that is stored in the SSL cache. | ||||
|  | ||||
| = Compatibility = | ||||
|  | ||||
| * My test bed is 0.7.65+ | ||||
|  | ||||
| = Notes = | ||||
|  | ||||
| The http_response_parse.rl and smtp_response_parse.rl are [http://www.complang.org/ragel/ ragel] scripts , you can edit the script and compile it like this: | ||||
|  | ||||
| <geshi lang="bash"> | ||||
|     $ ragel -G2 http_response_parse.rl | ||||
|     $ ragel -G2 smtp_response_parse.rl | ||||
| </geshi> | ||||
|  | ||||
| = TODO = | ||||
|  | ||||
| * refact this module, make it more extendable for adding third-party modules | ||||
| * manipulate header like http module's proxy_set_header | ||||
| * built-in variable support | ||||
| * custom log format | ||||
| * syslog support | ||||
| * FTP/IRC proxying | ||||
|  | ||||
| = Known Issues = | ||||
|  | ||||
| * This module can't use the same listening port with the HTTP module. | ||||
|  | ||||
| = Changelogs = | ||||
|  | ||||
| == v0.2.0 == | ||||
|  | ||||
| * add ssl proxy module | ||||
| * add websocket proxy module | ||||
| * add upstream busyness module | ||||
| * add tcp access log module | ||||
|  | ||||
| == v0.19 == | ||||
|  | ||||
| * add many check methods | ||||
|  | ||||
| == v0.1 == | ||||
|  | ||||
| * first release | ||||
|  | ||||
| = Authors = | ||||
|  | ||||
| Weibin Yao(姚伟斌) ''yaoweibin at gmail dot com'' | ||||
|  | ||||
| = Copyright & License = | ||||
|  | ||||
| This README template copy from [http://github.com/agentzh agentzh]. | ||||
|  | ||||
| I borrowed a lot of code from upstream and mail module from the nginx 0.7.* core. This part of code is copyrighted by Igor Sysoev. And the health check part is borrowed the design of Jack Lindamood's healthcheck module [http://github.com/cep21/healthcheck_nginx_upstreams healthcheck_nginx_upstreams]; | ||||
|  | ||||
| This module is licensed under the BSD license. | ||||
|  | ||||
| Copyright (C) 2013 by Weibin Yao <yaoweibin@gmail.com>. | ||||
|  | ||||
| All rights reserved. | ||||
|  | ||||
| Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: | ||||
|  | ||||
| * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. | ||||
| * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. | ||||
|  | ||||
| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
							
								
								
									
										19
									
								
								samples/OpenRC runscript/acpid
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								samples/OpenRC runscript/acpid
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,19 @@ | ||||
| #!/sbin/openrc-run | ||||
|  | ||||
| description="Daemon for Advanced Configuration and Power Interface" | ||||
|  | ||||
| extra_started_commands="reload" | ||||
| command="/usr/sbin/acpid" | ||||
| command_args="$ACPID_ARGS" | ||||
| start_stop_daemon_args="--quiet" | ||||
|  | ||||
| depend() { | ||||
| 	need localmount | ||||
| 	use logger | ||||
| } | ||||
|  | ||||
| reload() { | ||||
| 	ebegin "Reloading acpid configuration" | ||||
| 	start-stop-daemon --exec $command --signal HUP | ||||
| 	eend $? | ||||
| } | ||||
							
								
								
									
										8399
									
								
								samples/PAWN/fixes.inc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8399
									
								
								samples/PAWN/fixes.inc
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,520 +0,0 @@ | ||||
| //---------------------------------------------------------- | ||||
| // | ||||
| // GRAND LARCENY 1.0 | ||||
| // A freeroam gamemode for SA-MP 0.3 | ||||
| // | ||||
| //---------------------------------------------------------- | ||||
|  | ||||
| #include <a_samp> | ||||
| #include <core> | ||||
| #include <float> | ||||
| #include "../include/gl_common.inc" | ||||
| #include "../include/gl_spawns.inc" | ||||
|  | ||||
| #pragma tabsize 0 | ||||
|  | ||||
| //---------------------------------------------------------- | ||||
|  | ||||
| #define COLOR_WHITE                 0xFFFFFFFF | ||||
| #define COLOR_NORMAL_PLAYER 0xFFBB7777 | ||||
|  | ||||
| #define CITY_LOS_SANTOS         0 | ||||
| #define CITY_SAN_FIERRO         1 | ||||
| #define CITY_LAS_VENTURAS         2 | ||||
|  | ||||
| new total_vehicles_from_files=0; | ||||
|  | ||||
| // Class selection globals | ||||
| new gPlayerCitySelection[MAX_PLAYERS]; | ||||
| new gPlayerHasCitySelected[MAX_PLAYERS]; | ||||
| new gPlayerLastCitySelectionTick[MAX_PLAYERS]; | ||||
|  | ||||
| new Text:txtClassSelHelper; | ||||
| new Text:txtLosSantos; | ||||
| new Text:txtSanFierro; | ||||
| new Text:txtLasVenturas; | ||||
|  | ||||
| new thisanimid=0; | ||||
| new lastanimid=0; | ||||
|  | ||||
| //---------------------------------------------------------- | ||||
|  | ||||
| main() | ||||
| { | ||||
|         print("\n---------------------------------------"); | ||||
|         print("Running Grand Larceny - by the SA-MP team\n"); | ||||
|         print("---------------------------------------\n"); | ||||
| } | ||||
|  | ||||
| //---------------------------------------------------------- | ||||
|  | ||||
| public OnPlayerConnect(playerid) | ||||
| { | ||||
|         GameTextForPlayer(playerid,"~w~Grand Larceny",3000,4); | ||||
|           SendClientMessage(playerid,COLOR_WHITE,"Welcome to {88AA88}G{FFFFFF}rand {88AA88}L{FFFFFF}arceny"); | ||||
|            | ||||
|           // class selection init vars | ||||
|           gPlayerCitySelection[playerid] = -1; | ||||
|         gPlayerHasCitySelected[playerid] = 0; | ||||
|         gPlayerLastCitySelectionTick[playerid] = GetTickCount(); | ||||
|  | ||||
|         //SetPlayerColor(playerid,COLOR_NORMAL_PLAYER); | ||||
|  | ||||
|         //Kick(playerid); | ||||
|          | ||||
|         /* | ||||
|         Removes vending machines | ||||
|         RemoveBuildingForPlayer(playerid, 1302, 0.0, 0.0, 0.0, 6000.0); | ||||
|         RemoveBuildingForPlayer(playerid, 1209, 0.0, 0.0, 0.0, 6000.0); | ||||
|         RemoveBuildingForPlayer(playerid, 955, 0.0, 0.0, 0.0, 6000.0); | ||||
|         RemoveBuildingForPlayer(playerid, 1775, 0.0, 0.0, 0.0, 6000.0); | ||||
|         RemoveBuildingForPlayer(playerid, 1776, 0.0, 0.0, 0.0, 6000.0); | ||||
|         */ | ||||
|          | ||||
|         /* | ||||
|         new ClientVersion[32]; | ||||
|         GetPlayerVersion(playerid, ClientVersion, 32); | ||||
|         printf("Player %d reports client version: %s", playerid, ClientVersion);*/ | ||||
|  | ||||
|          return 1; | ||||
| } | ||||
|  | ||||
| //---------------------------------------------------------- | ||||
|  | ||||
| public OnPlayerSpawn(playerid) | ||||
| { | ||||
|         if(IsPlayerNPC(playerid)) return 1; | ||||
|          | ||||
|         new randSpawn = 0; | ||||
|          | ||||
|         SetPlayerInterior(playerid,0); | ||||
|         TogglePlayerClock(playerid,0); | ||||
|          ResetPlayerMoney(playerid); | ||||
|         GivePlayerMoney(playerid, 30000); | ||||
|  | ||||
|         if(CITY_LOS_SANTOS == gPlayerCitySelection[playerid]) { | ||||
|           randSpawn = random(sizeof(gRandomSpawns_LosSantos)); | ||||
|           SetPlayerPos(playerid, | ||||
|                  gRandomSpawns_LosSantos[randSpawn][0], | ||||
|                  gRandomSpawns_LosSantos[randSpawn][1], | ||||
|                  gRandomSpawns_LosSantos[randSpawn][2]); | ||||
|                 SetPlayerFacingAngle(playerid,gRandomSpawns_LosSantos[randSpawn][3]); | ||||
|         } | ||||
|         else if(CITY_SAN_FIERRO == gPlayerCitySelection[playerid]) { | ||||
|           randSpawn = random(sizeof(gRandomSpawns_SanFierro)); | ||||
|           SetPlayerPos(playerid, | ||||
|                  gRandomSpawns_SanFierro[randSpawn][0], | ||||
|                  gRandomSpawns_SanFierro[randSpawn][1], | ||||
|                  gRandomSpawns_SanFierro[randSpawn][2]); | ||||
|                 SetPlayerFacingAngle(playerid,gRandomSpawns_SanFierro[randSpawn][3]); | ||||
|         } | ||||
|         else if(CITY_LAS_VENTURAS == gPlayerCitySelection[playerid]) { | ||||
|           randSpawn = random(sizeof(gRandomSpawns_LasVenturas)); | ||||
|           SetPlayerPos(playerid, | ||||
|                  gRandomSpawns_LasVenturas[randSpawn][0], | ||||
|                  gRandomSpawns_LasVenturas[randSpawn][1], | ||||
|                  gRandomSpawns_LasVenturas[randSpawn][2]); | ||||
|                 SetPlayerFacingAngle(playerid,gRandomSpawns_LasVenturas[randSpawn][3]); | ||||
|         } | ||||
|  | ||||
|         //SetPlayerColor(playerid,COLOR_NORMAL_PLAYER); | ||||
|          | ||||
|         SetPlayerSkillLevel(playerid,WEAPONSKILL_PISTOL,200); | ||||
|     SetPlayerSkillLevel(playerid,WEAPONSKILL_PISTOL_SILENCED,200); | ||||
|     SetPlayerSkillLevel(playerid,WEAPONSKILL_DESERT_EAGLE,200); | ||||
|     SetPlayerSkillLevel(playerid,WEAPONSKILL_SHOTGUN,200); | ||||
|     SetPlayerSkillLevel(playerid,WEAPONSKILL_SAWNOFF_SHOTGUN,200); | ||||
|     SetPlayerSkillLevel(playerid,WEAPONSKILL_SPAS12_SHOTGUN,200); | ||||
|     SetPlayerSkillLevel(playerid,WEAPONSKILL_MICRO_UZI,200); | ||||
|     SetPlayerSkillLevel(playerid,WEAPONSKILL_MP5,200); | ||||
|     SetPlayerSkillLevel(playerid,WEAPONSKILL_AK47,200); | ||||
|     SetPlayerSkillLevel(playerid,WEAPONSKILL_M4,200); | ||||
|     SetPlayerSkillLevel(playerid,WEAPONSKILL_SNIPERRIFLE,200); | ||||
|      | ||||
|     GivePlayerWeapon(playerid,WEAPON_COLT45,100); | ||||
|         //GivePlayerWeapon(playerid,WEAPON_MP5,100); | ||||
|         TogglePlayerClock(playerid, 0); | ||||
|  | ||||
|         return 1; | ||||
| } | ||||
|  | ||||
| //---------------------------------------------------------- | ||||
|  | ||||
| public OnPlayerDeath(playerid, killerid, reason) | ||||
| { | ||||
|     new playercash; | ||||
|      | ||||
|     // if they ever return to class selection make them city | ||||
|         // select again first | ||||
|         gPlayerHasCitySelected[playerid] = 0; | ||||
|      | ||||
|         if(killerid == INVALID_PLAYER_ID) { | ||||
|         ResetPlayerMoney(playerid); | ||||
|         } else { | ||||
|                 playercash = GetPlayerMoney(playerid); | ||||
|                 if(playercash > 0) { | ||||
|                         GivePlayerMoney(killerid, playercash); | ||||
|                         ResetPlayerMoney(playerid); | ||||
|                 } | ||||
|         } | ||||
|            return 1; | ||||
| } | ||||
|  | ||||
| //---------------------------------------------------------- | ||||
|  | ||||
| ClassSel_SetupCharSelection(playerid) | ||||
| { | ||||
|            if(gPlayerCitySelection[playerid] == CITY_LOS_SANTOS) { | ||||
|                 SetPlayerInterior(playerid,11); | ||||
|                 SetPlayerPos(playerid,508.7362,-87.4335,998.9609); | ||||
|                 SetPlayerFacingAngle(playerid,0.0); | ||||
|             SetPlayerCameraPos(playerid,508.7362,-83.4335,998.9609); | ||||
|                 SetPlayerCameraLookAt(playerid,508.7362,-87.4335,998.9609); | ||||
|         } | ||||
|         else if(gPlayerCitySelection[playerid] == CITY_SAN_FIERRO) { | ||||
|                 SetPlayerInterior(playerid,3); | ||||
|                 SetPlayerPos(playerid,-2673.8381,1399.7424,918.3516); | ||||
|                 SetPlayerFacingAngle(playerid,181.0); | ||||
|             SetPlayerCameraPos(playerid,-2673.2776,1394.3859,918.3516); | ||||
|                 SetPlayerCameraLookAt(playerid,-2673.8381,1399.7424,918.3516); | ||||
|         } | ||||
|         else if(gPlayerCitySelection[playerid] == CITY_LAS_VENTURAS) { | ||||
|                 SetPlayerInterior(playerid,3); | ||||
|                 SetPlayerPos(playerid,349.0453,193.2271,1014.1797); | ||||
|                 SetPlayerFacingAngle(playerid,286.25); | ||||
|             SetPlayerCameraPos(playerid,352.9164,194.5702,1014.1875); | ||||
|                 SetPlayerCameraLookAt(playerid,349.0453,193.2271,1014.1797); | ||||
|         } | ||||
|          | ||||
| } | ||||
|  | ||||
| //---------------------------------------------------------- | ||||
| // Used to init textdraws of city names | ||||
|  | ||||
| ClassSel_InitCityNameText(Text:txtInit) | ||||
| { | ||||
|           TextDrawUseBox(txtInit, 0); | ||||
|         TextDrawLetterSize(txtInit,1.25,3.0); | ||||
|         TextDrawFont(txtInit, 0); | ||||
|         TextDrawSetShadow(txtInit,0); | ||||
|     TextDrawSetOutline(txtInit,1); | ||||
|     TextDrawColor(txtInit,0xEEEEEEFF); | ||||
|     TextDrawBackgroundColor(txtClassSelHelper,0x000000FF); | ||||
| } | ||||
|  | ||||
| //---------------------------------------------------------- | ||||
|  | ||||
| ClassSel_InitTextDraws() | ||||
| { | ||||
|     // Init our observer helper text display | ||||
|         txtLosSantos = TextDrawCreate(10.0, 380.0, "Los Santos"); | ||||
|         ClassSel_InitCityNameText(txtLosSantos); | ||||
|         txtSanFierro = TextDrawCreate(10.0, 380.0, "San Fierro"); | ||||
|         ClassSel_InitCityNameText(txtSanFierro); | ||||
|         txtLasVenturas = TextDrawCreate(10.0, 380.0, "Las Venturas"); | ||||
|         ClassSel_InitCityNameText(txtLasVenturas); | ||||
|  | ||||
|     // Init our observer helper text display | ||||
|         txtClassSelHelper = TextDrawCreate(10.0, 415.0, | ||||
|          " Press ~b~~k~~GO_LEFT~ ~w~or ~b~~k~~GO_RIGHT~ ~w~to switch cities.~n~ Press ~r~~k~~PED_FIREWEAPON~ ~w~to select."); | ||||
|         TextDrawUseBox(txtClassSelHelper, 1); | ||||
|         TextDrawBoxColor(txtClassSelHelper,0x222222BB); | ||||
|         TextDrawLetterSize(txtClassSelHelper,0.3,1.0); | ||||
|         TextDrawTextSize(txtClassSelHelper,400.0,40.0); | ||||
|         TextDrawFont(txtClassSelHelper, 2); | ||||
|         TextDrawSetShadow(txtClassSelHelper,0); | ||||
|     TextDrawSetOutline(txtClassSelHelper,1); | ||||
|     TextDrawBackgroundColor(txtClassSelHelper,0x000000FF); | ||||
|     TextDrawColor(txtClassSelHelper,0xFFFFFFFF); | ||||
| } | ||||
|  | ||||
| //---------------------------------------------------------- | ||||
|  | ||||
| ClassSel_SetupSelectedCity(playerid) | ||||
| { | ||||
|         if(gPlayerCitySelection[playerid] == -1) { | ||||
|                 gPlayerCitySelection[playerid] = CITY_LOS_SANTOS; | ||||
|         } | ||||
|          | ||||
|         if(gPlayerCitySelection[playerid] == CITY_LOS_SANTOS) { | ||||
|                 SetPlayerInterior(playerid,0); | ||||
|                    SetPlayerCameraPos(playerid,1630.6136,-2286.0298,110.0); | ||||
|                 SetPlayerCameraLookAt(playerid,1887.6034,-1682.1442,47.6167); | ||||
|                  | ||||
|                 TextDrawShowForPlayer(playerid,txtLosSantos); | ||||
|                 TextDrawHideForPlayer(playerid,txtSanFierro); | ||||
|                 TextDrawHideForPlayer(playerid,txtLasVenturas); | ||||
|         } | ||||
|         else if(gPlayerCitySelection[playerid] == CITY_SAN_FIERRO) { | ||||
|                 SetPlayerInterior(playerid,0); | ||||
|                    SetPlayerCameraPos(playerid,-1300.8754,68.0546,129.4823); | ||||
|                 SetPlayerCameraLookAt(playerid,-1817.9412,769.3878,132.6589); | ||||
|                  | ||||
|                 TextDrawHideForPlayer(playerid,txtLosSantos); | ||||
|                 TextDrawShowForPlayer(playerid,txtSanFierro); | ||||
|                 TextDrawHideForPlayer(playerid,txtLasVenturas); | ||||
|         } | ||||
|         else if(gPlayerCitySelection[playerid] == CITY_LAS_VENTURAS) { | ||||
|                 SetPlayerInterior(playerid,0); | ||||
|                    SetPlayerCameraPos(playerid,1310.6155,1675.9182,110.7390); | ||||
|                 SetPlayerCameraLookAt(playerid,2285.2944,1919.3756,68.2275); | ||||
|                  | ||||
|                 TextDrawHideForPlayer(playerid,txtLosSantos); | ||||
|                 TextDrawHideForPlayer(playerid,txtSanFierro); | ||||
|                 TextDrawShowForPlayer(playerid,txtLasVenturas); | ||||
|         } | ||||
| } | ||||
|  | ||||
| //---------------------------------------------------------- | ||||
|  | ||||
| ClassSel_SwitchToNextCity(playerid) | ||||
| { | ||||
|     gPlayerCitySelection[playerid]++; | ||||
|         if(gPlayerCitySelection[playerid] > CITY_LAS_VENTURAS) { | ||||
|          gPlayerCitySelection[playerid] = CITY_LOS_SANTOS; | ||||
|         } | ||||
|         PlayerPlaySound(playerid,1052,0.0,0.0,0.0); | ||||
|         gPlayerLastCitySelectionTick[playerid] = GetTickCount(); | ||||
|         ClassSel_SetupSelectedCity(playerid); | ||||
| } | ||||
|  | ||||
| //---------------------------------------------------------- | ||||
|  | ||||
| ClassSel_SwitchToPreviousCity(playerid) | ||||
| { | ||||
|     gPlayerCitySelection[playerid]--; | ||||
|         if(gPlayerCitySelection[playerid] < CITY_LOS_SANTOS) { | ||||
|          gPlayerCitySelection[playerid] = CITY_LAS_VENTURAS; | ||||
|         } | ||||
|         PlayerPlaySound(playerid,1053,0.0,0.0,0.0); | ||||
|         gPlayerLastCitySelectionTick[playerid] = GetTickCount(); | ||||
|         ClassSel_SetupSelectedCity(playerid); | ||||
| } | ||||
|  | ||||
| //---------------------------------------------------------- | ||||
|  | ||||
| ClassSel_HandleCitySelection(playerid) | ||||
| { | ||||
|         new Keys,ud,lr; | ||||
|     GetPlayerKeys(playerid,Keys,ud,lr); | ||||
|      | ||||
|     if(gPlayerCitySelection[playerid] == -1) { | ||||
|                 ClassSel_SwitchToNextCity(playerid); | ||||
|                 return; | ||||
|         } | ||||
|  | ||||
|         // only allow new selection every ~500 ms | ||||
|         if( (GetTickCount() - gPlayerLastCitySelectionTick[playerid]) < 500 ) return; | ||||
|          | ||||
|         if(Keys & KEY_FIRE) { | ||||
|          gPlayerHasCitySelected[playerid] = 1; | ||||
|          TextDrawHideForPlayer(playerid,txtClassSelHelper); | ||||
|                 TextDrawHideForPlayer(playerid,txtLosSantos); | ||||
|                 TextDrawHideForPlayer(playerid,txtSanFierro); | ||||
|                 TextDrawHideForPlayer(playerid,txtLasVenturas); | ||||
|          TogglePlayerSpectating(playerid,0); | ||||
|          return; | ||||
|         } | ||||
|          | ||||
|         if(lr > 0) { | ||||
|          ClassSel_SwitchToNextCity(playerid); | ||||
|         } | ||||
|         else if(lr < 0) { | ||||
|          ClassSel_SwitchToPreviousCity(playerid); | ||||
|         } | ||||
| } | ||||
|  | ||||
| //---------------------------------------------------------- | ||||
|  | ||||
| public OnPlayerRequestClass(playerid, classid) | ||||
| { | ||||
|         if(IsPlayerNPC(playerid)) return 1; | ||||
|  | ||||
|         if(gPlayerHasCitySelected[playerid]) { | ||||
|                 ClassSel_SetupCharSelection(playerid); | ||||
|                 return 1; | ||||
|         } else { | ||||
|                 if(GetPlayerState(playerid) != PLAYER_STATE_SPECTATING) { | ||||
|                         TogglePlayerSpectating(playerid,1); | ||||
|                     TextDrawShowForPlayer(playerid, txtClassSelHelper); | ||||
|                     gPlayerCitySelection[playerid] = -1; | ||||
|                 } | ||||
|           } | ||||
|      | ||||
|         return 0; | ||||
| } | ||||
|  | ||||
| //---------------------------------------------------------- | ||||
|  | ||||
| public OnGameModeInit() | ||||
| { | ||||
|         SetGameModeText("Grand Larceny"); | ||||
|         ShowPlayerMarkers(PLAYER_MARKERS_MODE_GLOBAL); | ||||
|         ShowNameTags(1); | ||||
|         SetNameTagDrawDistance(40.0); | ||||
|         EnableStuntBonusForAll(0); | ||||
|         DisableInteriorEnterExits(); | ||||
|         SetWeather(2); | ||||
|         SetWorldTime(11); | ||||
|  | ||||
|         //UsePlayerPedAnims(); | ||||
|         //ManualVehicleEngineAndLights(); | ||||
|         //LimitGlobalChatRadius(300.0); | ||||
|          | ||||
|         ClassSel_InitTextDraws(); | ||||
|  | ||||
|         // Player Class | ||||
|         AddPlayerClass(281,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         AddPlayerClass(282,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         AddPlayerClass(283,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         AddPlayerClass(284,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         AddPlayerClass(285,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         AddPlayerClass(286,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         AddPlayerClass(287,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         AddPlayerClass(288,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         AddPlayerClass(289,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         AddPlayerClass(265,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         AddPlayerClass(266,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         AddPlayerClass(267,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         AddPlayerClass(268,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         AddPlayerClass(269,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         AddPlayerClass(270,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         AddPlayerClass(1,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         AddPlayerClass(2,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         AddPlayerClass(3,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         AddPlayerClass(4,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         AddPlayerClass(5,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         AddPlayerClass(6,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         AddPlayerClass(8,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         AddPlayerClass(42,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         AddPlayerClass(65,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         //AddPlayerClass(74,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         AddPlayerClass(86,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         AddPlayerClass(119,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|          AddPlayerClass(149,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         AddPlayerClass(208,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         AddPlayerClass(273,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         AddPlayerClass(289,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|          | ||||
|         AddPlayerClass(47,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         AddPlayerClass(48,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         AddPlayerClass(49,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         AddPlayerClass(50,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         AddPlayerClass(51,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         AddPlayerClass(52,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         AddPlayerClass(53,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         AddPlayerClass(54,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         AddPlayerClass(55,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         AddPlayerClass(56,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         AddPlayerClass(57,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         AddPlayerClass(58,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|            AddPlayerClass(68,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         AddPlayerClass(69,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         AddPlayerClass(70,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         AddPlayerClass(71,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         AddPlayerClass(72,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         AddPlayerClass(73,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         AddPlayerClass(75,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         AddPlayerClass(76,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         AddPlayerClass(78,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         AddPlayerClass(79,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         AddPlayerClass(80,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         AddPlayerClass(81,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         AddPlayerClass(82,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         AddPlayerClass(83,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         AddPlayerClass(84,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         AddPlayerClass(85,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         AddPlayerClass(87,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         AddPlayerClass(88,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         AddPlayerClass(89,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         AddPlayerClass(91,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         AddPlayerClass(92,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         AddPlayerClass(93,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         AddPlayerClass(95,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         AddPlayerClass(96,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         AddPlayerClass(97,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         AddPlayerClass(98,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|         AddPlayerClass(99,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | ||||
|  | ||||
|         // SPECIAL | ||||
|         total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/trains.txt"); | ||||
|         total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/pilots.txt"); | ||||
|  | ||||
|            // LAS VENTURAS | ||||
|      total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/lv_law.txt"); | ||||
|     total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/lv_airport.txt"); | ||||
|     total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/lv_gen.txt"); | ||||
|      | ||||
|     // SAN FIERRO | ||||
|     total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/sf_law.txt"); | ||||
|     total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/sf_airport.txt"); | ||||
|     total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/sf_gen.txt"); | ||||
|      | ||||
|     // LOS SANTOS | ||||
|     total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/ls_law.txt"); | ||||
|     total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/ls_airport.txt"); | ||||
|     total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/ls_gen_inner.txt"); | ||||
|     total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/ls_gen_outer.txt"); | ||||
|      | ||||
|     // OTHER AREAS | ||||
|     total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/whetstone.txt"); | ||||
|     total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/bone.txt"); | ||||
|     total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/flint.txt"); | ||||
|     total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/tierra.txt"); | ||||
|     total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/red_county.txt"); | ||||
|  | ||||
|     printf("Total vehicles from files: %d",total_vehicles_from_files); | ||||
|  | ||||
|         return 1; | ||||
| } | ||||
|  | ||||
| //---------------------------------------------------------- | ||||
|  | ||||
| public OnPlayerUpdate(playerid) | ||||
| { | ||||
|         if(!IsPlayerConnected(playerid)) return 0; | ||||
|         if(IsPlayerNPC(playerid)) return 1; | ||||
|  | ||||
|         // changing cities by inputs | ||||
|         if( !gPlayerHasCitySelected[playerid] && | ||||
|          GetPlayerState(playerid) == PLAYER_STATE_SPECTATING ) { | ||||
|          ClassSel_HandleCitySelection(playerid); | ||||
|          return 1; | ||||
|         } | ||||
|          | ||||
|         // No weapons in interiors | ||||
|         if(GetPlayerInterior(playerid) != 0 && GetPlayerWeapon(playerid) != 0) { | ||||
|          SetPlayerArmedWeapon(playerid,0); // fists | ||||
|          return 0; // no syncing until they change their weapon | ||||
|         } | ||||
|          | ||||
|         // Don't allow minigun | ||||
|         if(GetPlayerWeapon(playerid) == WEAPON_MINIGUN) { | ||||
|          Kick(playerid); | ||||
|          return 0; | ||||
|         } | ||||
|          | ||||
|         /* No jetpacks allowed | ||||
|         if(GetPlayerSpecialAction(playerid) == SPECIAL_ACTION_USEJETPACK) { | ||||
|          Kick(playerid); | ||||
|          return 0; | ||||
|         }*/ | ||||
|  | ||||
|         /* For testing animations | ||||
|     new msg[128+1]; | ||||
|         new animlib[32+1]; | ||||
|         new animname[32+1]; | ||||
|  | ||||
|         thisanimid = GetPlayerAnimationIndex(playerid); | ||||
|         if(lastanimid != thisanimid) | ||||
|         { | ||||
|                 GetAnimationName(thisanimid,animlib,32,animname,32); | ||||
|                 format(msg, 128, "anim(%d,%d): %s %s", lastanimid, thisanimid, animlib, animname); | ||||
|                 lastanimid = thisanimid; | ||||
|                 SendClientMessage(playerid, 0xFFFFFFFF, msg); | ||||
|         }*/ | ||||
|  | ||||
|         return 1; | ||||
| } | ||||
|  | ||||
| //---------------------------------------------------------- | ||||
							
								
								
									
										36
									
								
								samples/PAWN/timertest.pwn
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								samples/PAWN/timertest.pwn
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,36 @@ | ||||
| #include <a_samp> | ||||
|  | ||||
| forward OneSecTimer(); | ||||
|  | ||||
| new lasttick = 0; | ||||
|  | ||||
| main() | ||||
| { | ||||
| 	print("\n----------------------------------"); | ||||
| 	print("  This is a blank GameModeScript"); | ||||
| 	print("----------------------------------\n"); | ||||
| } | ||||
|  | ||||
| public OnGameModeInit() | ||||
| { | ||||
| 	// Set timer of 1 second. | ||||
| 	SetTimer("OneSecTimer", 1000, 1); | ||||
| 	print("GameModeInit()"); | ||||
| 	SetGameModeText("Timer Test"); | ||||
| 	AddPlayerClass(0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0); | ||||
| 	return 1; | ||||
| } | ||||
|  | ||||
| public OneSecTimer() { | ||||
|  | ||||
| 	if(lasttick == 0) { | ||||
|      	lasttick = GetTickCount(); | ||||
| 		return; | ||||
| 	} | ||||
| 	new sText[256]; | ||||
| 	format(sText,sizeof(sText),"GetTickCountOffset = %d",GetTickCount() - lasttick); | ||||
| 	print(sText); | ||||
| 	SendClientMessageToAll(0xFF0000, sText); | ||||
| 	lasttick = GetTickCount(); | ||||
| } | ||||
|  | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user