mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	Compare commits
	
		
			786 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 39037d5bfb | ||
|  | 31d882b07e | ||
|  | fd9275b213 | ||
|  | cfa63cff35 | ||
|  | 5e6fd11cc2 | ||
|  | 62a8b52df4 | ||
|  | 783670095c | ||
|  | 23cfa86f93 | ||
|  | 211cb9567a | ||
|  | 1e68a45515 | ||
|  | 72c00f869c | ||
|  | c76137efc0 | ||
|  | 88f196e4d4 | ||
|  | 4fe5980065 | ||
|  | 7c7b1fb9c4 | ||
|  | ed3d38cf05 | ||
|  | 837e9a6325 | ||
|  | 1364e9be51 | ||
|  | 2fbfaf448d | ||
|  | bf82caccfc | ||
|  | 325dbc8e16 | ||
|  | bd2fb0af51 | ||
|  | 3c904dff61 | ||
|  | 9b22b2973f | ||
|  | 025bb35ac7 | ||
|  | 7fb5d0cadd | ||
|  | 8157c6f56b | ||
|  | 0154c21c3d | ||
|  | 648596dbb2 | ||
|  | 212c74d8a3 | ||
|  | 4495e15fa7 | ||
|  | da96e11b37 | ||
|  | b7a9843770 | ||
|  | 55432774c7 | ||
|  | ca76802ee4 | ||
|  | cec54837bc | ||
|  | e0c35b0665 | ||
|  | 865980b8f7 | ||
|  | 9367a4797f | ||
|  | 4ed58c743d | ||
|  | cfd95360cb | ||
|  | 22144e79d3 | ||
|  | 3acbf06beb | ||
|  | 7b41346db8 | ||
|  | 878b321b89 | ||
|  | a903123cb8 | ||
|  | 577fb95384 | ||
|  | 770a1d4553 | ||
|  | c038b51941 | ||
|  | 4bebcef6ef | ||
|  | b8685103d0 | ||
|  | 26d789612b | ||
|  | 10de952ed6 | ||
|  | 2517650ecb | ||
|  | 47b739527a | ||
|  | 88f08803ee | ||
|  | c05717d15c | ||
|  | bc66f558b9 | ||
|  | 71e1bd9af2 | ||
|  | 57b0739219 | ||
|  | d60241cc86 | ||
|  | d725e8e385 | ||
|  | 034cb25099 | ||
|  | fbc0947420 | ||
|  | 9020d7c044 | ||
|  | ffe2ccf1f6 | ||
|  | 434ab9f2c0 | ||
|  | cd3defda42 | ||
|  | fd85f7f112 | ||
|  | e42ccf0d82 | ||
|  | bf4baff363 | ||
|  | c1a9737313 | ||
|  | a4081498f8 | ||
|  | 9efd923382 | ||
|  | b16149d641 | ||
|  | 2d940e72c2 | ||
|  | 9f103abfb5 | ||
|  | 689a209ed9 | ||
|  | d91a451fc7 | ||
|  | 1ae4672230 | ||
|  | 3edf5fd770 | ||
|  | 412af86cb8 | ||
|  | 5b41ab4774 | ||
|  | 06c0cb916b | ||
|  | b3a49ce627 | ||
|  | 0651568bfb | ||
|  | ce31e23006 | ||
|  | 7ccd8caf71 | ||
|  | 598a7028ea | ||
|  | 4ed1efe9ce | ||
|  | 6a4bf3fa65 | ||
|  | 5b2b3a2b53 | ||
|  | 596cd9368f | ||
|  | f8d50faedb | ||
|  | ccc9c197ae | ||
|  | ed2dcc35e8 | ||
|  | 208a3ff480 | ||
|  | 8de2cd15ed | ||
|  | 7cbc4bc144 | ||
|  | d239e71826 | ||
|  | ecaa2a41c9 | ||
|  | fc71805489 | ||
|  | 74d94781cb | ||
|  | b556425037 | ||
|  | 6131d17c02 | ||
|  | 875b3157bf | ||
|  | 4ce9048f8d | ||
|  | 04f1b1df48 | ||
|  | f9c36345c3 | ||
|  | ec3967d080 | ||
|  | 05a88b5b7e | ||
|  | b6b2cf04a7 | ||
|  | 49247e9ec2 | ||
|  | 6629b75aa6 | ||
|  | e702b453ec | ||
|  | 38190d92fc | ||
|  | 109ca5735b | ||
|  | 4dde499f51 | ||
|  | 5fd18a215e | ||
|  | b283548c0f | ||
|  | 2352ce77c9 | ||
|  | 2054afc741 | ||
|  | 9d3b9964b5 | ||
|  | 79c1d21a0f | ||
|  | 1d69228872 | ||
|  | f5953a09da | ||
|  | a17f6c8ae1 | ||
|  | 9823af0cb4 | ||
|  | 45384bd498 | ||
|  | 56bfde998b | ||
|  | 870feb8592 | ||
|  | 2670e2b035 | ||
|  | eccea65641 | ||
|  | 231ad86176 | ||
|  | 9658b02502 | ||
|  | 30c6b6e5a1 | ||
|  | b44e58dd7f | ||
|  | bce31e8b51 | ||
|  | 011c654c2a | ||
|  | 2457b52658 | ||
|  | a3adaa6a7b | ||
|  | a6f168d1ac | ||
|  | f792029a20 | ||
|  | 2a5dd5b224 | ||
|  | fb7dcfd62d | ||
|  | 245a1a92cf | ||
|  | aa7ab2065b | ||
|  | 719f6e876b | ||
|  | 8724dc8ccc | ||
|  | 63f9d0bdeb | ||
|  | d7fd12cb32 | ||
|  | 850ab6dedb | ||
|  | b20fa497b9 | ||
|  | 1abc7ee2ef | ||
|  | d7a032afcd | ||
|  | 587c764950 | ||
|  | 1abbcb6435 | ||
|  | 17f3d7005a | ||
|  | ac59620728 | ||
|  | ba8b55391d | ||
|  | 03c1e725ce | ||
|  | 4cefaf2808 | ||
|  | 757801e32f | ||
|  | 749ea2a580 | ||
|  | dc373fb51f | ||
|  | 0443c4db2d | ||
|  | d699ba3a98 | ||
|  | 92d2782ceb | ||
|  | e76ebb1a74 | ||
|  | cacde403c0 | ||
|  | 906b0ee30e | ||
|  | cd7549390e | ||
|  | f30cab30f4 | ||
|  | 1356d4e579 | ||
|  | 63c83d014b | ||
|  | b8e426d3a3 | ||
|  | c5344da2ba | ||
|  | 7606a70bb8 | ||
|  | 7d850d7c09 | ||
|  | c1b704075e | ||
|  | 07a6411a75 | ||
|  | b32bc5ef47 | ||
|  | 6c106b88c0 | ||
|  | f2c9581bac | ||
|  | c46667581d | ||
|  | 59e5ba351c | ||
|  | a8a710f863 | ||
|  | f603b731a9 | ||
|  | 3ca872cea8 | ||
|  | 970953ca12 | ||
|  | 7cf6372519 | ||
|  | 1d381233e0 | ||
|  | 6f0c24b90b | ||
|  | f29c172267 | ||
|  | e9c5598254 | ||
|  | dd5728a441 | ||
|  | ec1d77c32e | ||
|  | 40887930f9 | ||
|  | 6bf8243014 | ||
|  | 419805ce9f | ||
|  | 81089416a2 | ||
|  | efc7799960 | ||
|  | fcbef97e39 | ||
|  | 8beef260da | ||
|  | 618a5b62ee | ||
|  | c579924485 | ||
|  | 9b9fadfa19 | ||
|  | daf64010f9 | ||
|  | f0bd24f810 | ||
|  | 5969a8b679 | ||
|  | 6b3ba29558 | ||
|  | f217047ac0 | ||
|  | 935c852364 | ||
|  | 9e28965259 | ||
|  | a829f3143a | ||
|  | 3fc01d09ce | ||
|  | a4ae90e2e9 | ||
|  | 4928828874 | ||
|  | af90ac3758 | ||
|  | d4e6798ba8 | ||
|  | 03b250990d | ||
|  | 5bc0ce0888 | ||
|  | a0bbf7df6f | ||
|  | 6b90f22cef | ||
|  | d290576543 | ||
|  | 75871e52ea | ||
|  | b40459335b | ||
|  | 51b16ca965 | ||
|  | 5dafa937de | ||
|  | 2307c2e9fc | ||
|  | d12aff9776 | ||
|  | fcd26da282 | ||
|  | 4a10b27611 | ||
|  | 201fe54b0c | ||
|  | 1618a3b02a | ||
|  | 3be97ccaa3 | ||
|  | 879e4977e4 | ||
|  | 613b71719f | ||
|  | 2870f6d038 | ||
|  | 046fb18980 | ||
|  | d133d9eccb | ||
|  | 296473507f | ||
|  | ff8821080a | ||
|  | 9acf41b0fe | ||
|  | 9c64f72f35 | ||
|  | 9385e70d2d | ||
|  | 9469e188c8 | ||
|  | 6e57ca6fbc | ||
|  | d5e3ebaef3 | ||
|  | a9eac8a832 | ||
|  | 1c7f5368cf | ||
|  | 960ff73c7f | ||
|  | 95777055d1 | ||
|  | e1ce30c3ce | ||
|  | 89b442c751 | ||
|  | 6b41059cdf | ||
|  | 62cb42eee5 | ||
|  | 6bbb56db00 | ||
|  | 160598b9ef | ||
|  | 32b07a4e10 | ||
|  | 8890c57681 | ||
|  | de188126fb | ||
|  | 97a1adcef1 | ||
|  | ffbe95d6e5 | ||
|  | d54f86ae58 | ||
|  | 92ace440b9 | ||
|  | d5ee477d3b | ||
|  | 6e8152c423 | ||
|  | 8149356668 | ||
|  | 806e30d70f | ||
|  | 299ec8f8ea | ||
|  | f6fbd18bd5 | ||
|  | ecd30d3ccf | ||
|  | 228d89649a | ||
|  | 751360ecf1 | ||
|  | d9ed216092 | ||
|  | 18a3ef9e5e | ||
|  | 33d75d9623 | ||
|  | a0cc2c4c86 | ||
|  | 754bc4ef6d | ||
|  | df55043500 | ||
|  | f22524a615 | ||
|  | 1831390429 | ||
|  | f4c7661cc6 | ||
|  | 0ab88919c9 | ||
|  | 9107d3c243 | ||
|  | 42e9131b4f | ||
|  | e7b670c5de | ||
|  | 114fabd29a | ||
|  | 0946791434 | ||
|  | 06bcdba9c4 | ||
|  | 729a174eb6 | ||
|  | 1dbbcb73e7 | ||
|  | 74fa4b9b75 | ||
|  | 87df17309c | ||
|  | 815337299a | ||
|  | fd32938cd8 | ||
|  | 8d7b4f81b4 | ||
|  | f2cd75332c | ||
|  | 2cd7579e21 | ||
|  | d9daae176e | ||
|  | 20814ec533 | ||
|  | 9d8ab16a38 | ||
|  | 49c2793bf5 | ||
|  | b5cacbba9f | ||
|  | 20aee11cea | ||
|  | 2bc546eadf | ||
|  | 9e50e188a8 | ||
|  | e8cf750e18 | ||
|  | 21f56744d4 | ||
|  | 02aeb4f895 | ||
|  | f9de16fbd2 | ||
|  | abe002f30c | ||
|  | e5ae6fb00d | ||
|  | a0a8dd8897 | ||
|  | e00f073726 | ||
|  | 1a9ee8e187 | ||
|  | 0c05a6c3ac | ||
|  | 213fce00e0 | ||
|  | 380739b209 | ||
|  | 36322f8ac0 | ||
|  | 57d1ec7733 | ||
|  | 648c6d4547 | ||
|  | 6ab5870b59 | ||
|  | 7dbe2bb774 | ||
|  | 163a039e0d | ||
|  | 9595e2ba7e | ||
|  | d4d6ef314d | ||
|  | 322b21e0d0 | ||
|  | a696e3a7a2 | ||
|  | ebabcfc84f | ||
|  | 8336dc33e4 | ||
|  | 5f22bf225c | ||
|  | 8eee8ad9cf | ||
|  | 24743985e4 | ||
|  | 94fba197d1 | ||
|  | 3504a36c3e | ||
|  | c8038d1c80 | ||
|  | 8ba8b48caf | ||
|  | 92d0c1f3b7 | ||
|  | d4186bd34a | ||
|  | 008ba9e23f | ||
|  | fd707ddf7e | ||
|  | 32de8a4d19 | ||
|  | cf9998f3e4 | ||
|  | f258e4940d | ||
|  | a7b8e38bf3 | ||
|  | 89320b1ca4 | ||
|  | b65129a8e1 | ||
|  | b6a9993c97 | ||
|  | 9c044c5bd0 | ||
|  | 6b0783936f | ||
|  | 2a66b754c2 | ||
|  | 460443b3c8 | ||
|  | cd99ab2d6e | ||
|  | b2cb74cabf | ||
|  | 6d07302963 | ||
|  | d831205f6a | ||
|  | a9b9e6216b | ||
|  | 3ba090de7e | ||
|  | c105208481 | ||
|  | 0c9e14eeff | ||
|  | 2a8a5cdca9 | ||
|  | 1f91acbd9d | ||
|  | 6f8278aa79 | ||
|  | 3e48a84cf1 | ||
|  | 31728a3a78 | ||
|  | e56a2ed6ad | ||
|  | 35aa57657b | ||
|  | 423c8865bd | ||
|  | 55ecc5f7eb | ||
|  | 6aae7882df | ||
|  | 240fcec3ce | ||
|  | 170c1d4ee8 | ||
|  | 38f0a71ea3 | ||
|  | 62936dc6b5 | ||
|  | fb9c784f4f | ||
|  | 89477ed2fa | ||
|  | 844679dcbe | ||
|  | cd743332f4 | ||
|  | 47843e7e78 | ||
|  | 85957ecf56 | ||
|  | 4232b04571 | ||
|  | 34f717526a | ||
|  | b0b94182a2 | ||
|  | 843e196f00 | ||
|  | 63661dfc6e | ||
|  | f100dc91c2 | ||
|  | fd9d63d605 | ||
|  | 5c21c35875 | ||
|  | 370d55fd74 | ||
|  | 0fcc26f778 | ||
|  | 8dd2ddcbf7 | ||
|  | 037857623d | ||
|  | d7b19d577b | ||
|  | c70048a3e2 | ||
|  | a1884ca261 | ||
|  | e452291314 | ||
|  | 6d51117a91 | ||
|  | 848a1cc1e5 | ||
|  | 9092dfdc7f | ||
|  | d7fe0cc5c7 | ||
|  | 15ec37d4bc | ||
|  | 43cc701ac3 | ||
|  | 7cb8357f73 | ||
|  | 4b46bcf649 | ||
|  | a954a6465e | ||
|  | afb6041104 | ||
|  | 4b28fdbc4d | ||
|  | b8a5e8505a | ||
|  | 3087d640a3 | ||
|  | e87b89ab5b | ||
|  | 7aabc6a5ad | ||
|  | 5cc053694a | ||
|  | 653314448c | ||
|  | 4f14db10ea | ||
|  | 98e348ba5f | ||
|  | a69b20c1a4 | ||
|  | 9275e5240f | ||
|  | 7dcc3b3edf | ||
|  | 6e872c11b6 | ||
|  | e5b6001759 | ||
|  | 769f1b8658 | ||
|  | 5814b61356 | ||
|  | 8a6d7f67ed | ||
|  | bcb016a938 | ||
|  | 065c6c02a8 | ||
|  | f7386fcd72 | ||
|  | df703ef997 | ||
|  | 9f6c421d91 | ||
|  | 91370ae955 | ||
|  | ffc0be191e | ||
|  | 6e9f6da2a2 | ||
|  | 48f2949d69 | ||
|  | baa3cba0fc | ||
|  | eb54a92328 | ||
|  | ce1e2441f4 | ||
|  | c8cb7b7cab | ||
|  | 7baa130d8d | ||
|  | 332d97b57f | ||
|  | 9c0dbdd48e | ||
|  | bec0052065 | ||
|  | 5010f32421 | ||
|  | ded4672ccc | ||
|  | 03bb48cf28 | ||
|  | e71eefe8fc | ||
|  | c203781e1b | ||
|  | 7a2be16d77 | ||
|  | 77126e9e17 | ||
|  | d1d5c61df5 | ||
|  | 09323c8bbc | ||
|  | ac9f82544a | ||
|  | 2e4e602787 | ||
|  | 9d0ba5801b | ||
|  | 0cd7d85ec4 | ||
|  | b0f674e511 | ||
|  | 2b411aad90 | ||
|  | 1c6483a499 | ||
|  | 6edf4498ce | ||
|  | b160a39678 | ||
|  | 86b4de89bd | ||
|  | a35d9a8d29 | ||
|  | 8012876d5e | ||
|  | 2e3e8c5b89 | ||
|  | 5284608942 | ||
|  | ea2c7d8b27 | ||
|  | b0db064d09 | ||
|  | 3ff1e38f6c | ||
|  | b533b682d5 | ||
|  | f59cf24a82 | ||
|  | f87436d499 | ||
|  | 178d4756ef | ||
|  | 5152bd7124 | ||
|  | b5015b6cc7 | ||
|  | 097900a327 | ||
|  | 1d2a6c38c7 | ||
|  | cc87ceb0d5 | ||
|  | a38f77683b | ||
|  | d8da05cde2 | ||
|  | 554b5bfe7f | ||
|  | 86aa4c3f3d | ||
|  | 19b8721225 | ||
|  | 0cb1ebc41e | ||
|  | c7c4883f49 | ||
|  | d8b4d4639c | ||
|  | ebe45e6f37 | ||
|  | cb016f8439 | ||
|  | 92212d2652 | ||
|  | 950882be78 | ||
|  | 036855072e | ||
|  | 29bbf50900 | ||
|  | ca59303dba | ||
|  | e21f35039b | ||
|  | f2b377fae8 | ||
|  | 24a36bf4bb | ||
|  | 3284450dc4 | ||
|  | ea9d326819 | ||
|  | 12b78c5357 | ||
|  | 4cc679c1e5 | ||
|  | c49ce55714 | ||
|  | 9d4b5416a5 | ||
|  | e70cd33323 | ||
|  | 5a59ecbc2a | ||
|  | 82285df54b | ||
|  | 302af86363 | ||
|  | e67c1789b8 | ||
|  | 015af19eaf | ||
|  | 156985ed52 | ||
|  | 71d1bd75c0 | ||
|  | 8e7c9c4bc4 | ||
|  | 7b7236fe30 | ||
|  | 55d997f43a | ||
|  | 1829b38339 | ||
|  | e4c28e12cf | ||
|  | 066cf45f4a | ||
|  | ac32b09a6b | ||
|  | 92296f4b4b | ||
|  | 3b4d2499eb | ||
|  | f38e15790e | ||
|  | b67c2bc2b2 | ||
|  | 393c9b759e | ||
|  | 54a7cf6785 | ||
|  | 1cf7a6389c | ||
|  | c204d7c297 | ||
|  | 5932f5f273 | ||
|  | 98977c87db | ||
|  | ff457af2d4 | ||
|  | 0e86ab9044 | ||
|  | 3d39e842ec | ||
|  | 16c1aa2845 | ||
|  | d0cf883558 | ||
|  | 64e4830aad | ||
|  | 0c47f2af75 | ||
|  | 14c5d8c95a | ||
|  | 6850499056 | ||
|  | 9288f784a1 | ||
|  | dab75f6f97 | ||
|  | 4a017d9033 | ||
|  | 6f896d988f | ||
|  | 35a9d241fc | ||
|  | 9ba0a7db64 | ||
|  | 9968503872 | ||
|  | 34218c5f58 | ||
|  | ebd41f1f20 | ||
|  | 62b1816297 | ||
|  | 2dfb864e4e | ||
|  | 2d1e1d4747 | ||
|  | f785aa0ae2 | ||
|  | cc476e212e | ||
|  | bca9716fc6 | ||
|  | fae6dbfebd | ||
|  | a7a0800b46 | ||
|  | 305293d3e5 | ||
|  | 17d4eb7a5e | ||
|  | f97e103b6d | ||
|  | 44eebde394 | ||
|  | 498c102414 | ||
|  | 79cd77454b | ||
|  | dafca264b2 | ||
|  | be970e9e3d | ||
|  | e76837fa20 | ||
|  | e1b3403dc8 | ||
|  | 79da17c5c8 | ||
|  | e9623d542d | ||
|  | bc999f4067 | ||
|  | 474e536ae8 | ||
|  | 79647c5bb4 | ||
|  | 410aace222 | ||
|  | 5409c39e35 | ||
|  | 5d4a24dd4f | ||
|  | c97abe7ef5 | ||
|  | edaea7bede | ||
|  | 909bce8ed9 | ||
|  | 4090c492e8 | ||
|  | a24afb0e12 | ||
|  | bc01f8b25f | ||
|  | 077c4141d6 | ||
|  | e5f20314e9 | ||
|  | 8a61bcb6b5 | ||
|  | 61b301b380 | ||
|  | be86f28be1 | ||
|  | a443380869 | ||
|  | 3d1d431cda | ||
|  | 9559ece8af | ||
|  | 8f56a1096d | ||
|  | 0ec85f902a | ||
|  | a47dde2166 | ||
|  | abdd6bfbd2 | ||
|  | d64104f472 | ||
|  | 1cd5ae2d57 | ||
|  | e27bf1627d | ||
|  | 0689d64efd | ||
|  | 3ba47aec38 | ||
|  | b90253981b | ||
|  | 513f678b6c | ||
|  | 478b9cf189 | ||
|  | 6675baff13 | ||
|  | a6efeebd21 | ||
|  | 6e2bb25b6e | ||
|  | a54edf71d1 | ||
|  | 8ff7eaf893 | ||
|  | a8d3872002 | ||
|  | dea03b7a46 | ||
|  | f5723dcccf | ||
|  | d772d1f162 | ||
|  | 46cfd16ae7 | ||
|  | 315243350b | ||
|  | 886d8a7293 | ||
|  | 54318f4001 | ||
|  | b3aee8abab | ||
|  | 1bdbadc1b3 | ||
|  | e0997b311b | ||
|  | 3c2ca312b9 | ||
|  | 315df1339a | ||
|  | e03b3e5ec4 | ||
|  | 43923976c2 | ||
|  | 6b8ee2f3f7 | ||
|  | 8cdb8ed48d | ||
|  | 417bf7e1c9 | ||
|  | b8e570bb3d | ||
|  | 69ff3c79b4 | ||
|  | eff4da20f8 | ||
|  | 473688b109 | ||
|  | 7bfb6ed5d7 | ||
|  | 276080aeec | ||
|  | 41c880afc7 | ||
|  | 3d242c3a3a | ||
|  | 9325b07d68 | ||
|  | ddeeb5d416 | ||
|  | c8bc0a5c79 | ||
|  | f58522d5a9 | ||
|  | 27a621531b | ||
|  | 0235433b7e | ||
|  | 6b5d1fe25b | ||
|  | f811ab1b28 | ||
|  | fc73f51855 | ||
|  | dd181421a7 | ||
|  | f6e2189739 | ||
|  | d61f31d3ed | ||
|  | 4e83a6ad23 | ||
|  | 7fc39dc8d1 | ||
|  | f10154a782 | ||
|  | 8761dc4e17 | ||
|  | 5a044b1c07 | ||
|  | 0100b76412 | ||
|  | 149f8967ad | ||
|  | c8754292f4 | ||
|  | e376fe921b | ||
|  | 61faea0298 | ||
|  | 8d8020ddb5 | ||
|  | 7d13b9eb99 | ||
|  | 6ed0a05b44 | ||
|  | c4c479578a | ||
|  | 441caa91dd | ||
|  | 20154eb049 | ||
|  | 84ea710d42 | ||
|  | 8d524d618e | ||
|  | 9fa34ab1fe | ||
|  | 47db1cf1ac | ||
|  | f2f9b70659 | ||
|  | 61c93ab08c | ||
|  | d72f3fae33 | ||
|  | 3f14d15722 | ||
|  | 963c0b46a0 | ||
|  | 66b4977a67 | ||
|  | 126c2147e9 | ||
|  | f7c42a4e6a | ||
|  | b1ea1fd96f | ||
|  | a5475bf839 | ||
|  | be9e187cc6 | ||
|  | d5098c6f66 | ||
|  | 41fc785330 | ||
|  | 4d83bf34f3 | ||
|  | 3a797e2583 | ||
|  | 7802030a53 | ||
|  | e8e1e0ca23 | ||
|  | 973431be40 | ||
|  | 24fb5a8e29 | ||
|  | 37d161c290 | ||
|  | ddefa5f9e6 | ||
|  | 955dd3d4d5 | ||
|  | d125205564 | ||
|  | 7fa1b52497 | ||
|  | a90d21899a | ||
|  | 569058f481 | ||
|  | 4ecda08f1f | ||
|  | 3b23059c09 | ||
|  | a474ffc101 | ||
|  | f7672b837a | ||
|  | 5235871fd8 | ||
|  | cac9873e20 | ||
|  | 9094923de9 | ||
|  | 6454c96e6a | ||
|  | 7fbb9edc0f | ||
|  | 0a717f5c81 | ||
|  | dab9777621 | ||
|  | c8d1e9def1 | ||
|  | 272dd45a43 | ||
|  | 5abec96df7 | ||
|  | e860f961a9 | ||
|  | b9ecf61dcb | ||
|  | 437f81c4a0 | ||
|  | 26dad7dada | ||
|  | b1e5d6f8f8 | ||
|  | 8c7b54d6e3 | ||
|  | fea0d8963c | ||
|  | 7aca52c68c | ||
|  | 529d3faaf8 | ||
|  | 9f0f4657a2 | ||
|  | 90ff1b5896 | ||
|  | feb82e34d6 | ||
|  | 4d7a34c177 | ||
|  | 5c3385ecd8 | ||
|  | a1af3a509c | ||
|  | 2913a87cc4 | ||
|  | 69cc86c572 | ||
|  | 60144c907e | ||
|  | dad4b974b7 | ||
|  | 1828cf6fc7 | ||
|  | ad4d273241 | ||
|  | 0d03a94cde | ||
|  | c4b876472f | ||
|  | 6af5adaac1 | ||
|  | 17a28f2e91 | ||
|  | baaa7a5c13 | ||
|  | cfeb2a833c | ||
|  | e6fd58b3aa | ||
|  | 2ef905ef1e | ||
|  | db80aa84dc | ||
|  | f404cc16a1 | ||
|  | 8b4acf7023 | ||
|  | 7393c2ef91 | ||
|  | 4948ec2999 | ||
|  | 408a325732 | ||
|  | 5ca211b9f7 | ||
|  | bc7596a8b5 | ||
|  | 6762ca8aa7 | ||
|  | bb7d6ab429 | ||
|  | 986611ac36 | ||
|  | 94b4ad1de6 | ||
|  | 3e2f18bf3f | ||
|  | 48c06cc299 | ||
|  | f10821ac49 | ||
|  | cd5298dee6 | ||
|  | a8c955609a | ||
|  | c5acce0604 | ||
|  | a6ccce7b76 | ||
|  | aa72012d41 | ||
|  | 06e095e5fc | ||
|  | f1cb16648f | ||
|  | 1276f10b67 | ||
|  | c3da262bd0 | ||
|  | 2f4ea20fdd | ||
|  | 81fcb4452e | ||
|  | 4f1a5cd456 | ||
|  | ae2d3d7e61 | ||
|  | 58ae0908e3 | ||
|  | e91caeaade | ||
|  | bd694c60e1 | ||
|  | 2143699aab | ||
|  | b1c2820299 | ||
|  | 624fd74f83 | ||
|  | cd878522d9 | ||
|  | 5580f39df2 | ||
|  | 10fed43c27 | ||
|  | 1d50adf87a | ||
|  | 614a61b0b0 | ||
|  | bd380f44cc | ||
|  | 8a546d2a7a | ||
|  | 1148a9746a | ||
|  | 04f4b05412 | ||
|  | 913cd6c309 | ||
|  | 492aa12cad | ||
|  | e79e45a74e | ||
|  | e661470bbb | ||
|  | af30a80702 | ||
|  | bab7ee4fcb | ||
|  | 6524ac3588 | ||
|  | c432cd67fc | ||
|  | 5c071a2e07 | ||
|  | cb10c53dee | ||
|  | dfba2a31a5 | ||
|  | 667f3de26b | ||
|  | fd585beb07 | ||
|  | d94bffb198 | ||
|  | 2beb450df6 | 
							
								
								
									
										7
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										7
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -1,3 +1,6 @@ | |||||||
| Gemfile.lock | /Gemfile.lock | ||||||
| .bundle/ | .bundle/ | ||||||
| vendor/ | benchmark/ | ||||||
|  | lib/linguist/samples.json | ||||||
|  | /grammars | ||||||
|  | /node_modules | ||||||
|   | |||||||
| @@ -1,11 +1,13 @@ | |||||||
| before_install:  | before_install: | ||||||
|   - git fetch origin master:master |   - git fetch origin master:master | ||||||
|   - git fetch origin v2.0.0:v2.0.0 |   - git fetch origin v2.0.0:v2.0.0 | ||||||
|  |   - git fetch origin test/attributes:test/attributes | ||||||
|  |   - git fetch origin test/master:test/master | ||||||
|   - sudo apt-get install libicu-dev -y |   - sudo apt-get install libicu-dev -y | ||||||
|   - gem update --system 2.1.11 |  | ||||||
| rvm: | rvm: | ||||||
|   - 1.9.3 |   - 1.9.3 | ||||||
|   - 2.0.0 |   - 2.0.0 | ||||||
|   - 2.1.1 |   - 2.1 | ||||||
|  |   - 2.2 | ||||||
| notifications: | notifications: | ||||||
|   disabled: true |   disabled: true | ||||||
|   | |||||||
							
								
								
									
										31
									
								
								CONTRIBUTING.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								CONTRIBUTING.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,31 @@ | |||||||
|  | ## Contributing | ||||||
|  |  | ||||||
|  | The majority of contributions won't need to touch any Ruby code at all. The [master language list][languages] is just a YAML configuration file. | ||||||
|  |  | ||||||
|  | Almost all bug fixes or new language additions should come with some additional code samples. Just drop them under [`samples/`][samples] in the correct subdirectory and our test suite will automatically test them. In most cases you shouldn't need to add any new assertions. | ||||||
|  |  | ||||||
|  | ### My code is detected as the wrong language | ||||||
|  |  | ||||||
|  | This can usually be solved either by adding a new filename or file name extension to the language's entry in [`languages.yml`][languages] or adding more [samples][samples] for your language to the repository to make Linguist's classifier smarter. | ||||||
|  |  | ||||||
|  | ### Syntax highlighting looks wrong | ||||||
|  |  | ||||||
|  | Assuming your code is being detected as the right language (see above), in most cases this is due to a bug in the language grammar rather than a bug in Linguist. [`grammars.yml`][grammars] lists all the grammars we use for syntax highlighting on github.com. Find the one corresponding to your code's programming language and submit a bug report upstream. | ||||||
|  |  | ||||||
|  | You can also try to fix the bug yourself and submit a Pull Request. [This piece from TextMate's documentation](http://manual.macromates.com/en/language_grammars) offers a good introduction on how to work with TextMate-compatible grammars. You can test grammars using [Lightshow](https://lightshow.githubapp.com). | ||||||
|  |  | ||||||
|  | Once the bug has been fixed upstream, please let us know and we'll pick it up for GitHub. | ||||||
|  |  | ||||||
|  | ### I want to add support for the `X` programming language | ||||||
|  |  | ||||||
|  | Great! You'll need to: | ||||||
|  |  | ||||||
|  | 0. Add an entry for your language to [`languages.yml`][languages]. | ||||||
|  | 0. Add a grammar for your language to [`grammars.yml`][grammars] by running `script/download-grammars --add URL`. Please only add grammars that have a license that permits redistribution. | ||||||
|  | 0. Add samples for your language to the [samples directory][samples]. | ||||||
|  |  | ||||||
|  | We try only to add languages once they have some usage on GitHub, so please note in-the-wild usage examples in your pull request. In most cases we prefer that languages already be in use in hundreds of repositories before supporting them in Linguist. | ||||||
|  |  | ||||||
|  | [grammars]: /grammars.yml | ||||||
|  | [languages]: /lib/linguist/languages.yml | ||||||
|  | [samples]: /samples | ||||||
							
								
								
									
										5
									
								
								Gemfile
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								Gemfile
									
									
									
									
									
								
							| @@ -1,2 +1,5 @@ | |||||||
| source 'https://rubygems.org' | source 'https://rubygems.org' | ||||||
| gemspec | gemspec :name => "github-linguist" | ||||||
|  | gemspec :name => "github-linguist-grammars" | ||||||
|  | gem 'test-unit', require: false if RUBY_VERSION >= '2.2' | ||||||
|  | gem 'byebug' if RUBY_VERSION >= '2.0' | ||||||
|   | |||||||
							
								
								
									
										107
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										107
									
								
								README.md
									
									
									
									
									
								
							| @@ -1,12 +1,14 @@ | |||||||
| # Linguist | # Linguist | ||||||
|  |  | ||||||
| We use this library at GitHub to detect blob languages, highlight code, ignore binary files, suppress generated files in diffs, and generate language breakdown graphs. | We use this library at GitHub to detect blob languages, ignore binary files, suppress generated files in diffs, and generate language breakdown graphs. | ||||||
|  |  | ||||||
|  | Tips for filing issues and creating pull requests can be found in [`CONTRIBUTING.md`](/CONTRIBUTING.md). | ||||||
|  |  | ||||||
| ## Features | ## Features | ||||||
|  |  | ||||||
| ### Language detection | ### Language detection | ||||||
|  |  | ||||||
| Linguist defines a list of all languages known to GitHub in a [yaml file](https://github.com/github/linguist/blob/master/lib/linguist/languages.yml). In order for a file to be highlighted, a language and a lexer must be defined there. | Linguist defines a list of all languages known to GitHub in a [yaml file](https://github.com/github/linguist/blob/master/lib/linguist/languages.yml). | ||||||
|  |  | ||||||
| Most languages are detected by their file extension. For disambiguating between files with common extensions, we first apply some common-sense heuristics to pick out obvious languages. After that, we use a | Most languages are detected by their file extension. For disambiguating between files with common extensions, we first apply some common-sense heuristics to pick out obvious languages. After that, we use a | ||||||
| [statistical | [statistical | ||||||
| @@ -24,7 +26,9 @@ See [lib/linguist/language.rb](https://github.com/github/linguist/blob/master/li | |||||||
|  |  | ||||||
| ### Syntax Highlighting | ### Syntax Highlighting | ||||||
|  |  | ||||||
| The actual syntax highlighting is handled by our Pygments wrapper, [pygments.rb](https://github.com/tmm1/pygments.rb). It also provides a [Lexer abstraction](https://github.com/tmm1/pygments.rb/blob/master/lib/pygments/lexer.rb) that determines which highlighter should be used on a file. | Syntax highlighting in GitHub is performed using TextMate-compatible grammars. These are the same grammars that TextMate, Sublime Text and Atom use. | ||||||
|  |  | ||||||
|  | Every language in `languages.yml` is mapped to its corresponding TM `scope`. This scope will be used when picking up a grammar for highlighting. **When adding a new language to Linguist, please add its corresponding scope too (assuming there's an existing TextMate bundle, Sublime Text package, or Atom package) so syntax highlighting works for it**. | ||||||
|  |  | ||||||
| ### Stats | ### Stats | ||||||
|  |  | ||||||
| @@ -32,33 +36,57 @@ The Language stats bar that you see on every repository is built by aggregating | |||||||
|  |  | ||||||
| The repository stats API, accessed through `#languages`, can be used on a directory: | The repository stats API, accessed through `#languages`, can be used on a directory: | ||||||
|  |  | ||||||
|  | ***API UPDATE*** | ||||||
|  |  | ||||||
|  | Since [Version 3.0.0](https://github.com/github/linguist/releases/tag/v3.0.0) Linguist expects a git repository (in the form of a [Rugged::Repository](https://github.com/libgit2/rugged#repositories)) to be passed when initializing `Linguist::Repository`. | ||||||
|  |  | ||||||
|  |  | ||||||
| ```ruby | ```ruby | ||||||
| project = Linguist::Repository.from_directory(".") | require 'rugged' | ||||||
| project.language.name  #=> "Ruby" | require 'linguist' | ||||||
| project.languages      #=> { "Ruby" => 0.98, "Shell" => 0.02 } |  | ||||||
|  | repo = Rugged::Repository.new('.') | ||||||
|  | project = Linguist::Repository.new(repo, repo.head.target_id) | ||||||
|  | project.language       #=> "Ruby" | ||||||
|  | project.languages      #=> { "Ruby" => 119387 } | ||||||
| ``` | ``` | ||||||
|  |  | ||||||
| These stats are also printed out by the `linguist` binary. You can use the | These stats are also printed out by the `linguist` binary. You can use the | ||||||
| `--breakdown` flag, and the binary will also output the breakdown of files by language. | `--breakdown` flag, and the binary will also output the breakdown of files by language. | ||||||
|  |  | ||||||
| You can try running `linguist` on the `lib/` directory in this repository itself: | You can try running `linguist` on the root directory in this repository itself: | ||||||
|  |  | ||||||
|     $ bundle exec linguist lib/ --breakdown |     $ bundle exec linguist --breakdown | ||||||
|  |  | ||||||
|     100.00% Ruby |     100.00% Ruby | ||||||
|  |  | ||||||
|     Ruby: |     Ruby: | ||||||
|     linguist/blob_helper.rb |     Gemfile | ||||||
|     linguist/classifier.rb |     Rakefile | ||||||
|     linguist/file_blob.rb |     bin/linguist | ||||||
|     linguist/generated.rb |     github-linguist.gemspec | ||||||
|     linguist/heuristics.rb |     lib/linguist.rb | ||||||
|     linguist/language.rb |     lib/linguist/blob_helper.rb | ||||||
|     linguist/md5.rb |     lib/linguist/classifier.rb | ||||||
|     linguist/repository.rb |     lib/linguist/file_blob.rb | ||||||
|     linguist/samples.rb |     lib/linguist/generated.rb | ||||||
|     linguist/tokenizer.rb |     lib/linguist/heuristics.rb | ||||||
|     linguist.rb |     lib/linguist/language.rb | ||||||
|  |     lib/linguist/lazy_blob.rb | ||||||
|  |     lib/linguist/md5.rb | ||||||
|  |     lib/linguist/repository.rb | ||||||
|  |     lib/linguist/samples.rb | ||||||
|  |     lib/linguist/tokenizer.rb | ||||||
|  |     lib/linguist/version.rb | ||||||
|  |     test/test_blob.rb | ||||||
|  |     test/test_classifier.rb | ||||||
|  |     test/test_heuristics.rb | ||||||
|  |     test/test_language.rb | ||||||
|  |     test/test_md5.rb | ||||||
|  |     test/test_pedantic.rb | ||||||
|  |     test/test_repository.rb | ||||||
|  |     test/test_samples.rb | ||||||
|  |     test/test_tokenizer.rb | ||||||
|  |  | ||||||
| #### Ignore vendored files | #### Ignore vendored files | ||||||
|  |  | ||||||
| @@ -80,9 +108,34 @@ Linguist::FileBlob.new("underscore.min.js").generated? # => true | |||||||
|  |  | ||||||
| See [Linguist::Generated#generated?](https://github.com/github/linguist/blob/master/lib/linguist/generated.rb). | See [Linguist::Generated#generated?](https://github.com/github/linguist/blob/master/lib/linguist/generated.rb). | ||||||
|  |  | ||||||
|  | ## Overrides | ||||||
|  |  | ||||||
|  | Linguist supports custom overrides for language definitions and vendored paths. Add a `.gitattributes` file to your project using the keys `linguist-language` and `linguist-vendored` with the standard git-style path matchers for the files you want to override. | ||||||
|  |  | ||||||
|  | Please note that the overrides currently only affect the language statistics for a repository and not the syntax-highlighting of files. | ||||||
|  |  | ||||||
|  | ``` | ||||||
|  | $ cat .gitattributes | ||||||
|  | *.rb linguist-language=Java | ||||||
|  |  | ||||||
|  | $ linguist --breakdown | ||||||
|  | 100.00% Java | ||||||
|  |  | ||||||
|  | Java: | ||||||
|  | ruby_file.rb | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | By default, Linguist treats all of the paths defined in [lib/linguist/vendor.yml](https://github.com/github/linguist/blob/master/lib/linguist/vendor.yml) as vendored and therefore doesn't include them in the language statistics for a repository. Use the `linguist-vendored` attribute to vendor or un-vendor paths. | ||||||
|  |  | ||||||
|  | ``` | ||||||
|  | $ cat .gitattributes | ||||||
|  | special-vendored-path/* linguist-vendored | ||||||
|  | jquery.js linguist-vendored=false | ||||||
|  | ``` | ||||||
|  |  | ||||||
| ## Installation | ## Installation | ||||||
|  |  | ||||||
| github.com is usually running the latest version of the `github-linguist` gem that is released on [RubyGems.org](http://rubygems.org/gems/github-linguist). | Github.com is usually running the latest version of the `github-linguist` gem that is released on [RubyGems.org](http://rubygems.org/gems/github-linguist). | ||||||
|  |  | ||||||
| But for development you are going to want to checkout out the source. To get it, clone the repo and run [Bundler](http://gembundler.com/) to install its dependencies. | But for development you are going to want to checkout out the source. To get it, clone the repo and run [Bundler](http://gembundler.com/) to install its dependencies. | ||||||
|  |  | ||||||
| @@ -94,18 +147,6 @@ To run the tests: | |||||||
|  |  | ||||||
|     bundle exec rake test |     bundle exec rake test | ||||||
|  |  | ||||||
| ## Contributing |  | ||||||
|  |  | ||||||
| The majority of contributions won't need to touch any Ruby code at all. The [master language list](https://github.com/github/linguist/blob/master/lib/linguist/languages.yml) is just a YAML configuration file. |  | ||||||
|  |  | ||||||
| We try to only add languages once they have some usage on GitHub, so please note in-the-wild usage examples in your pull request. |  | ||||||
|  |  | ||||||
| Almost all bug fixes or new language additions should come with some additional code samples. Just drop them under [`samples/`](https://github.com/github/linguist/tree/master/samples) in the correct subdirectory and our test suite will automatically test them. In most cases you shouldn't need to add any new assertions. |  | ||||||
|  |  | ||||||
| To update the `samples.json` after adding new files to [`samples/`](https://github.com/github/linguist/tree/master/samples): |  | ||||||
|  |  | ||||||
|     bundle exec rake samples |  | ||||||
|  |  | ||||||
| ### A note on language extensions | ### A note on language extensions | ||||||
|  |  | ||||||
| Linguist has a number of methods available to it for identifying the language of a particular file. The initial lookup is based upon the extension of the file, possible file extensions are defined in an array called `extensions`. Take a look at this example for example for `Perl`: | Linguist has a number of methods available to it for identifying the language of a particular file. The initial lookup is based upon the extension of the file, possible file extensions are defined in an array called `extensions`. Take a look at this example for example for `Perl`: | ||||||
| @@ -145,7 +186,7 @@ If you are the current maintainer of this gem: | |||||||
|  0. Ensure that tests are green: `bundle exec rake test` |  0. Ensure that tests are green: `bundle exec rake test` | ||||||
|  0. Bump gem version in `lib/linguist/version.rb`.  For example, [like this](https://github.com/github/linguist/commit/8d2ea90a5ba3b2fe6e1508b7155aa4632eea2985). |  0. Bump gem version in `lib/linguist/version.rb`.  For example, [like this](https://github.com/github/linguist/commit/8d2ea90a5ba3b2fe6e1508b7155aa4632eea2985). | ||||||
|  0. Make a PR to github/linguist.  For example, [#1238](https://github.com/github/linguist/pull/1238). |  0. Make a PR to github/linguist.  For example, [#1238](https://github.com/github/linguist/pull/1238). | ||||||
|  0. Build a local gem: `gem build github-linguist.gemspec` |  0. Build a local gem: `bundle exec rake build_gem` | ||||||
|  0. Testing: |  0. Testing: | ||||||
|    0. Bump the Gemfile and Gemfile.lock versions for an app which relies on this gem |    0. Bump the Gemfile and Gemfile.lock versions for an app which relies on this gem | ||||||
|    0. Install the new gem locally |    0. Install the new gem locally | ||||||
|   | |||||||
							
								
								
									
										107
									
								
								Rakefile
									
									
									
									
									
								
							
							
						
						
									
										107
									
								
								Rakefile
									
									
									
									
									
								
							| @@ -1,27 +1,103 @@ | |||||||
| require 'json' | require 'bundler/setup' | ||||||
| require 'rake/clean' | require 'rake/clean' | ||||||
| require 'rake/testtask' | require 'rake/testtask' | ||||||
| require 'yaml' | require 'yaml' | ||||||
|  | require 'yajl' | ||||||
|  |  | ||||||
| task :default => :test | task :default => :test | ||||||
|  |  | ||||||
| Rake::TestTask.new | Rake::TestTask.new | ||||||
|  |  | ||||||
| task :samples do | # Extend test task to check for samples | ||||||
|   require 'linguist/samples' | task :test => :check_samples | ||||||
|   require 'yajl' |  | ||||||
|   data = Linguist::Samples.data | desc "Check that we have samples.json generated" | ||||||
|   json = Yajl::Encoder.encode(data, :pretty => true) | task :check_samples do | ||||||
|   File.open('lib/linguist/samples.json', 'w') { |io| io.write json } |   unless File.exist?('lib/linguist/samples.json') | ||||||
|  |     Rake::Task[:samples].invoke | ||||||
|  |   end | ||||||
| end | end | ||||||
|  |  | ||||||
| task :build_gem do | task :samples do | ||||||
|  |   require 'linguist/samples' | ||||||
|  |   json = Yajl.dump(Linguist::Samples.data, :pretty => true) | ||||||
|  |   File.write 'lib/linguist/samples.json', json | ||||||
|  | end | ||||||
|  |  | ||||||
|  | task :build_gem => :samples do | ||||||
|   languages = YAML.load_file("lib/linguist/languages.yml") |   languages = YAML.load_file("lib/linguist/languages.yml") | ||||||
|   File.write("lib/linguist/languages.json", JSON.dump(languages)) |   File.write("lib/linguist/languages.json", Yajl.dump(languages)) | ||||||
|   `gem build github-linguist.gemspec` |   `gem build github-linguist.gemspec` | ||||||
|   File.delete("lib/linguist/languages.json") |   File.delete("lib/linguist/languages.json") | ||||||
| end | end | ||||||
|  |  | ||||||
|  | task :build_grammars_gem do | ||||||
|  |   rm_rf "grammars" | ||||||
|  |   sh "script/download-grammars" | ||||||
|  |   sh "gem", "build", "github-linguist-grammars.gemspec" | ||||||
|  | end | ||||||
|  |  | ||||||
|  | namespace :benchmark do | ||||||
|  |   benchmark_path = "benchmark/results" | ||||||
|  |  | ||||||
|  |   # $ bundle exec rake benchmark:generate CORPUS=path/to/samples | ||||||
|  |   desc "Generate results for" | ||||||
|  |   task :generate do | ||||||
|  |     ref = `git rev-parse HEAD`.strip[0,8] | ||||||
|  |  | ||||||
|  |     corpus = File.expand_path(ENV["CORPUS"] || "samples") | ||||||
|  |  | ||||||
|  |     require 'linguist/language' | ||||||
|  |  | ||||||
|  |     results = Hash.new | ||||||
|  |     Dir.glob("#{corpus}/**/*").each do |file| | ||||||
|  |       next unless File.file?(file) | ||||||
|  |       filename = file.gsub("#{corpus}/", "") | ||||||
|  |       results[filename] = Linguist::FileBlob.new(file).language | ||||||
|  |     end | ||||||
|  |  | ||||||
|  |     # Ensure results directory exists | ||||||
|  |     FileUtils.mkdir_p("benchmark/results") | ||||||
|  |  | ||||||
|  |     # Write results | ||||||
|  |     if `git status`.include?('working directory clean') | ||||||
|  |       result_filename = "benchmark/results/#{File.basename(corpus)}-#{ref}.json" | ||||||
|  |     else | ||||||
|  |       result_filename = "benchmark/results/#{File.basename(corpus)}-#{ref}-unstaged.json" | ||||||
|  |     end | ||||||
|  |  | ||||||
|  |     File.write(result_filename, results.to_json) | ||||||
|  |     puts "wrote #{result_filename}" | ||||||
|  |   end | ||||||
|  |  | ||||||
|  |   # $ bundle exec rake benchmark:compare REFERENCE=path/to/reference.json CANDIDATE=path/to/candidate.json | ||||||
|  |   desc "Compare results" | ||||||
|  |   task :compare do | ||||||
|  |     reference_file = ENV["REFERENCE"] | ||||||
|  |     candidate_file = ENV["CANDIDATE"] | ||||||
|  |  | ||||||
|  |     reference = Yajl.load(File.read(reference_file)) | ||||||
|  |     reference_counts = Hash.new(0) | ||||||
|  |     reference.each { |filename, language| reference_counts[language] += 1 } | ||||||
|  |  | ||||||
|  |     candidate = Yajl.load(File.read(candidate_file)) | ||||||
|  |     candidate_counts = Hash.new(0) | ||||||
|  |     candidate.each { |filename, language| candidate_counts[language] += 1 } | ||||||
|  |  | ||||||
|  |     changes = diff(reference_counts, candidate_counts) | ||||||
|  |  | ||||||
|  |     if changes.any? | ||||||
|  |       changes.each do |language, (before, after)| | ||||||
|  |         before_percent = 100 * before / reference.size.to_f | ||||||
|  |         after_percent = 100 * after / candidate.size.to_f | ||||||
|  |         puts "%s changed from %.1f%% to %.1f%%" % [language || 'unknown', before_percent, after_percent] | ||||||
|  |       end | ||||||
|  |     else | ||||||
|  |       puts "No changes" | ||||||
|  |     end | ||||||
|  |   end | ||||||
|  | end | ||||||
|  |  | ||||||
| namespace :classifier do | namespace :classifier do | ||||||
|   LIMIT = 1_000 |   LIMIT = 1_000 | ||||||
|  |  | ||||||
| @@ -37,7 +113,7 @@ namespace :classifier do | |||||||
|       next if file_language.nil? || file_language == 'Text' |       next if file_language.nil? || file_language == 'Text' | ||||||
|       begin |       begin | ||||||
|         data = open(file_url).read |         data = open(file_url).read | ||||||
|         guessed_language, score = Linguist::Classifier.classify(Linguist::Samples::DATA, data).first |         guessed_language, score = Linguist::Classifier.classify(Linguist::Samples.cache, data).first | ||||||
|  |  | ||||||
|         total += 1 |         total += 1 | ||||||
|         guessed_language == file_language ? correct += 1 : incorrect += 1 |         guessed_language == file_language ? correct += 1 : incorrect += 1 | ||||||
| @@ -54,14 +130,12 @@ namespace :classifier do | |||||||
|  |  | ||||||
|   def each_public_gist |   def each_public_gist | ||||||
|     require 'open-uri' |     require 'open-uri' | ||||||
|     require 'json' |  | ||||||
|  |  | ||||||
|     url = "https://api.github.com/gists/public" |     url = "https://api.github.com/gists/public" | ||||||
|  |  | ||||||
|     loop do |     loop do | ||||||
|       resp = open(url) |       resp = open(url) | ||||||
|       url = resp.meta['link'][/<([^>]+)>; rel="next"/, 1] |       url = resp.meta['link'][/<([^>]+)>; rel="next"/, 1] | ||||||
|       gists = JSON.parse(resp.read) |       gists = Yajl.load(resp.read) | ||||||
|  |  | ||||||
|       for gist in gists |       for gist in gists | ||||||
|         for filename, attrs in gist['files'] |         for filename, attrs in gist['files'] | ||||||
| @@ -71,3 +145,10 @@ namespace :classifier do | |||||||
|     end |     end | ||||||
|   end |   end | ||||||
| end | end | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def diff(a, b) | ||||||
|  |   (a.keys | b.keys).each_with_object({}) do |key, diff| | ||||||
|  |     diff[key] = [a[key], b[key]] unless a[key] == b[key] | ||||||
|  |   end | ||||||
|  | end | ||||||
|   | |||||||
| @@ -4,6 +4,7 @@ | |||||||
| #     usage: linguist <path> [<--breakdown>] | #     usage: linguist <path> [<--breakdown>] | ||||||
|  |  | ||||||
| require 'linguist/file_blob' | require 'linguist/file_blob' | ||||||
|  | require 'linguist/language' | ||||||
| require 'linguist/repository' | require 'linguist/repository' | ||||||
| require 'rugged' | require 'rugged' | ||||||
|  |  | ||||||
| @@ -30,7 +31,7 @@ if File.directory?(path) | |||||||
|     puts |     puts | ||||||
|     file_breakdown = repo.breakdown_by_file |     file_breakdown = repo.breakdown_by_file | ||||||
|     file_breakdown.each do |lang, files| |     file_breakdown.each do |lang, files| | ||||||
|       puts "#{lang}:"  |       puts "#{lang}:" | ||||||
|       files.each do |file| |       files.each do |file| | ||||||
|         puts file |         puts file | ||||||
|       end |       end | ||||||
|   | |||||||
							
								
								
									
										14
									
								
								github-linguist-grammars.gemspec
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								github-linguist-grammars.gemspec
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | |||||||
|  | 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,17 +10,16 @@ Gem::Specification.new do |s| | |||||||
|   s.homepage = "https://github.com/github/linguist" |   s.homepage = "https://github.com/github/linguist" | ||||||
|   s.license  = "MIT" |   s.license  = "MIT" | ||||||
|  |  | ||||||
|   s.files = Dir['lib/**/*'] |   s.files = Dir['lib/**/*'] - ['lib/linguist/grammars.rb'] | ||||||
|   s.executables << 'linguist' |   s.executables << 'linguist' | ||||||
|  |  | ||||||
|   s.add_dependency 'charlock_holmes', '~> 0.7.3' |   s.add_dependency 'charlock_holmes', '~> 0.7.3' | ||||||
|   s.add_dependency 'escape_utils',    '~> 1.0.1' |   s.add_dependency 'escape_utils',    '~> 1.0.1' | ||||||
|   s.add_dependency 'mime-types',      '~> 1.19' |   s.add_dependency 'mime-types',      '>= 1.19' | ||||||
|   s.add_dependency 'pygments.rb',     '~> 0.6.0' |   s.add_dependency 'rugged',          '~> 0.22.0b4' | ||||||
|   s.add_dependency 'rugged',          '~> 0.21.0' |  | ||||||
|  |  | ||||||
|   s.add_development_dependency 'json' |  | ||||||
|   s.add_development_dependency 'mocha' |   s.add_development_dependency 'mocha' | ||||||
|  |   s.add_development_dependency 'pry' | ||||||
|   s.add_development_dependency 'rake' |   s.add_development_dependency 'rake' | ||||||
|   s.add_development_dependency 'yajl-ruby' |   s.add_development_dependency 'yajl-ruby' | ||||||
| end | end | ||||||
|   | |||||||
							
								
								
									
										422
									
								
								grammars.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										422
									
								
								grammars.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,422 @@ | |||||||
|  | --- | ||||||
|  | http://svn.edgewall.org/repos/genshi/contrib/textmate/Genshi.tmbundle/Syntaxes/Markup%20Template%20%28XML%29.tmLanguage: | ||||||
|  | - text.xml.genshi | ||||||
|  | http://svn.textmate.org/trunk/Review/Bundles/BlitzMax.tmbundle: | ||||||
|  | - source.blitzmax | ||||||
|  | http://svn.textmate.org/trunk/Review/Bundles/Cython.tmbundle: | ||||||
|  | - source.cython | ||||||
|  | http://svn.textmate.org/trunk/Review/Bundles/Forth.tmbundle: | ||||||
|  | - source.forth | ||||||
|  | http://svn.textmate.org/trunk/Review/Bundles/Parrot.tmbundle: | ||||||
|  | - source.parrot.pir | ||||||
|  | http://svn.textmate.org/trunk/Review/Bundles/Ruby%20Sass.tmbundle: | ||||||
|  | - source.sass | ||||||
|  | http://svn.textmate.org/trunk/Review/Bundles/SecondLife%20LSL.tmbundle: | ||||||
|  | - source.lsl | ||||||
|  | http://svn.textmate.org/trunk/Review/Bundles/VHDL.tmbundle: | ||||||
|  | - source.vhdl | ||||||
|  | http://svn.textmate.org/trunk/Review/Bundles/XQuery.tmbundle: | ||||||
|  | - source.xquery | ||||||
|  | https://bitbucket.org/Clams/sublimesystemverilog/get/default.tar.gz: | ||||||
|  | - source.systemverilog | ||||||
|  | - source.ucfconstraints | ||||||
|  | https://bitbucket.org/bitlang/sublime_cobol/raw/b0e9c44ac5f7a2fb553421aa986b35854cbfda4a/COBOL.tmLanguage: | ||||||
|  | - source.cobol | ||||||
|  | https://fan.googlecode.com/hg-history/Build%201.0.55/adm/tools/textmate/Fan.tmbundle/Syntaxes/Fan.tmLanguage: | ||||||
|  | - source.fan | ||||||
|  | https://github.com/AlanQuatermain/go-tmbundle: | ||||||
|  | - source.go | ||||||
|  | https://github.com/Anomareh/PHP-Twig.tmbundle: | ||||||
|  | - text.html.twig | ||||||
|  | https://github.com/Cirru/sublime-cirru/raw/master/Cirru.tmLanguage: | ||||||
|  | - source.cirru | ||||||
|  | https://github.com/Cykey/Sublime-Logos: | ||||||
|  | - source.logos | ||||||
|  | https://github.com/Drako/SublimeBrainfuck/raw/master/Brainfuck.tmLanguage: | ||||||
|  | - source.bf | ||||||
|  | https://github.com/JohnNilsson/awk-sublime/raw/master/AWK.tmLanguage: | ||||||
|  | - source.awk | ||||||
|  | https://github.com/JonBons/Sublime-SQF-Language: | ||||||
|  | - source.sqf | ||||||
|  | https://github.com/MarioRicalde/SCSS.tmbundle: | ||||||
|  | - source.scss | ||||||
|  | https://github.com/Oldes/Sublime-REBOL: | ||||||
|  | - source.rebol | ||||||
|  | https://github.com/PogiNate/Sublime-Inform: | ||||||
|  | - source.Inform7 | ||||||
|  | https://github.com/Red-Nova-Technologies/autoitv3-tmbundle: | ||||||
|  | - source.autoit.3 | ||||||
|  | https://github.com/SalGnt/Sublime-VimL: | ||||||
|  | - source.viml | ||||||
|  | https://github.com/Shammah/boo-sublime/raw/master/Boo.tmLanguage: | ||||||
|  | - source.boo | ||||||
|  | https://github.com/SublimeText/ColdFusion: | ||||||
|  | - source.cfscript | ||||||
|  | - source.cfscript.cfc | ||||||
|  | - text.cfml.basic | ||||||
|  | - text.html.cfm | ||||||
|  | https://github.com/SublimeText/NSIS: | ||||||
|  | - source.nsis | ||||||
|  | https://github.com/Varriount/NimLime: | ||||||
|  | - source.nimrod | ||||||
|  | - source.nimrod_filter | ||||||
|  | - source.nimrodcfg | ||||||
|  | https://github.com/alkemist/gradle.tmbundle: | ||||||
|  | - source.groovy.gradle | ||||||
|  | https://github.com/ambethia/Sublime-Loom: | ||||||
|  | - source.loomscript | ||||||
|  | https://github.com/angryant0007/VBDotNetSyntax: | ||||||
|  | - source.vbnet | ||||||
|  | https://github.com/anunayk/cool-tmbundle: | ||||||
|  | - source.cool | ||||||
|  | https://github.com/aroben/ada.tmbundle/raw/c45eed4d5f98fe3bcbbffbb9e436601ab5bbde4b/Syntaxes/Ada.plist: | ||||||
|  | - source.ada | ||||||
|  | https://github.com/aroben/ruby.tmbundle@4636a3023153c3034eb6ffc613899ba9cf33b41f: | ||||||
|  | - source.ruby | ||||||
|  | - text.html.erb | ||||||
|  | https://github.com/asbjornenge/Docker.tmbundle: | ||||||
|  | - source.dockerfile | ||||||
|  | https://github.com/atom/language-clojure: | ||||||
|  | - source.clojure | ||||||
|  | https://github.com/atom/language-coffee-script: | ||||||
|  | - source.coffee | ||||||
|  | - source.litcoffee | ||||||
|  | https://github.com/atom/language-csharp: | ||||||
|  | - source.cs | ||||||
|  | - source.csx | ||||||
|  | - source.nant-build | ||||||
|  | https://github.com/atom/language-javascript: | ||||||
|  | - source.js | ||||||
|  | - source.js.regexp | ||||||
|  | https://github.com/atom/language-python: | ||||||
|  | - source.python | ||||||
|  | - source.regexp.python | ||||||
|  | - text.python.traceback | ||||||
|  | https://github.com/atom/language-shellscript: | ||||||
|  | - source.shell | ||||||
|  | - text.shell-session | ||||||
|  | https://github.com/austinwagner/sublime-sourcepawn: | ||||||
|  | - source.sp | ||||||
|  | https://github.com/bfad/Sublime-Lasso: | ||||||
|  | - file.lasso | ||||||
|  | https://github.com/bholt/chapel-tmbundle: | ||||||
|  | - source.chapel | ||||||
|  | https://github.com/brandonwamboldt/sublime-nginx: | ||||||
|  | - source.nginx | ||||||
|  | https://github.com/bro/bro-sublime: | ||||||
|  | - source.bro | ||||||
|  | https://github.com/carsonoid/sublime_man_page_support/raw/master/man-groff.tmLanguage: | ||||||
|  | - text.groff | ||||||
|  | https://github.com/ccreutzig/sublime-MuPAD: | ||||||
|  | - source.mupad | ||||||
|  | https://github.com/cdwilson/nesC.tmbundle: | ||||||
|  | - source.nesc | ||||||
|  | https://github.com/christophevg/racket-tmbundle: | ||||||
|  | - source.racket | ||||||
|  | https://github.com/clemos/haxe-sublime-bundle: | ||||||
|  | - source.erazor | ||||||
|  | - source.haxe.2 | ||||||
|  | - source.hss.1 | ||||||
|  | - source.hxml | ||||||
|  | - source.nmml | ||||||
|  | https://github.com/cucumber/cucumber-tmbundle: | ||||||
|  | - source.ruby.rspec.cucumber.steps | ||||||
|  | - text.gherkin.feature | ||||||
|  | https://github.com/daaain/Handlebars/raw/master/Handlebars.tmLanguage: | ||||||
|  | - text.html.handlebars | ||||||
|  | https://github.com/davidpeckham/powershell.tmbundle: | ||||||
|  | - source.powershell | ||||||
|  | https://github.com/davidrios/jade-tmbundle: | ||||||
|  | - source.jade | ||||||
|  | - source.pyjade | ||||||
|  | https://github.com/elixir-lang/elixir-tmbundle: | ||||||
|  | - source.elixir | ||||||
|  | - text.elixir | ||||||
|  | - text.html.elixir | ||||||
|  | https://github.com/ericzou/ebundles/raw/master/Bundles/MSDOS%20batch%20file.tmbundle/Syntaxes/MSDOS%20batch%20file.tmLanguage: | ||||||
|  | - source.dosbatch | ||||||
|  | https://github.com/euler0/sublime-glsl/raw/master/GLSL.tmLanguage: | ||||||
|  | - source.glsl | ||||||
|  | https://github.com/fancy-lang/fancy-tmbundle: | ||||||
|  | - source.fancy | ||||||
|  | https://github.com/fsharp/fsharpbinding: | ||||||
|  | - source.fsharp | ||||||
|  | https://github.com/gingerbeardman/monkey.tmbundle: | ||||||
|  | - source.monkey | ||||||
|  | https://github.com/guillermooo/dart-sublime-bundle/raw/master/Dart.tmLanguage: | ||||||
|  | - source.dart | ||||||
|  | https://github.com/harrism/sublimetext-cuda-cpp/raw/master/cuda-c%2B%2B.tmLanguage: | ||||||
|  | - source.cuda-c++ | ||||||
|  | https://github.com/hww3/pike-textmate: | ||||||
|  | - source.pike | ||||||
|  | https://github.com/jeancharles-roger/ceylon-sublimetext/raw/master/Ceylon.tmLanguage: | ||||||
|  | - source.ceylon | ||||||
|  | https://github.com/jfairbank/Sublime-Text-2-OpenEdge-ABL: | ||||||
|  | - source.abl | ||||||
|  | https://github.com/jhasse/sublime-rust: | ||||||
|  | - source.rust | ||||||
|  | https://github.com/johanasplund/sublime-befunge/raw/master/Befunge-93.tmLanguage: | ||||||
|  | - source.befunge | ||||||
|  | https://github.com/joshaven/RDoc.tmbundle: | ||||||
|  | - text.rdoc | ||||||
|  | https://github.com/jpcamara/Textmate-Gosu-Bundle/raw/master/Gosu.tmbundle/Syntaxes/Gosu.tmLanguage: | ||||||
|  | - source.gosu.2 | ||||||
|  | https://github.com/kswedberg/jquery-tmbundle: | ||||||
|  | - source.js.jquery | ||||||
|  | https://github.com/laughedelic/sublime-idris/raw/master/Idris.tmLanguage: | ||||||
|  | - source.idris | ||||||
|  | https://github.com/lavrton/sublime-better-typescript: | ||||||
|  | - source.ts | ||||||
|  | https://github.com/leafo/moonscript-tmbundle: | ||||||
|  | - source.moonscript | ||||||
|  | https://github.com/lsf37/Isabelle.tmbundle: | ||||||
|  | - source.isabelle.theory | ||||||
|  | https://github.com/lunixbochs/x86-assembly-textmate-bundle: | ||||||
|  | - source.asm.x86 | ||||||
|  | https://github.com/macekond/Alloy.tmbundle: | ||||||
|  | - source.alloy | ||||||
|  | https://github.com/mads379/opa.tmbundle: | ||||||
|  | - source.opa | ||||||
|  | https://github.com/mads379/scala.tmbundle: | ||||||
|  | - source.sbt | ||||||
|  | - source.scala | ||||||
|  | https://github.com/marconi/mako-tmbundle: | ||||||
|  | - text.html.mako | ||||||
|  | https://github.com/mattfoster/gnuplot-tmbundle: | ||||||
|  | - source.gnuplot | ||||||
|  | https://github.com/mgalloy/idl.tmbundle: | ||||||
|  | - source.idl | ||||||
|  | - source.idl-dlm | ||||||
|  | - text.idl-idldoc | ||||||
|  | https://github.com/michaeledgar/protobuf-tmbundle: | ||||||
|  | - source.protobuf | ||||||
|  | https://github.com/mkolosick/Sublime-Coq/raw/master/Coq.tmLanguage: | ||||||
|  | - source.coq | ||||||
|  | https://github.com/mokus0/Agda.tmbundle: | ||||||
|  | - source.agda | ||||||
|  | https://github.com/nanoant/Julia.tmbundle: | ||||||
|  | - source.julia | ||||||
|  | https://github.com/nanoant/assembly.tmbundle/raw/master/Syntaxes/objdump%20C%2B%2B.tmLanguage: | ||||||
|  | - objdump.x86asm | ||||||
|  | https://github.com/nilium/ooc.tmbundle: | ||||||
|  | - source.ooc | ||||||
|  | https://github.com/paulmillr/LiveScript.tmbundle: | ||||||
|  | - source.livescript | ||||||
|  | https://github.com/pferruggiaro/sublime-tea: | ||||||
|  | - source.tea | ||||||
|  | https://github.com/puppet-textmate-bundle/puppet-textmate-bundle: | ||||||
|  | - source.puppet | ||||||
|  | https://github.com/pvl/abap.tmbundle: | ||||||
|  | - source.abap | ||||||
|  | https://github.com/scalate/Scalate.tmbundle: | ||||||
|  | - source.scaml | ||||||
|  | - text.html.ssp | ||||||
|  | https://github.com/shadanan/mathematica-tmbundle: | ||||||
|  | - source.mathematica | ||||||
|  | https://github.com/shellderp/sublime-robot-plugin: | ||||||
|  | - text.robot | ||||||
|  | https://github.com/simongregory/actionscript3-tmbundle: | ||||||
|  | - source.actionscript.3 | ||||||
|  | - text.html.asdoc | ||||||
|  | - text.xml.flex-config | ||||||
|  | https://github.com/skozlovf/Sublime-QML: | ||||||
|  | - source.qml | ||||||
|  | https://github.com/slash-lang/Slash.tmbundle: | ||||||
|  | - text.html.slash | ||||||
|  | https://github.com/slavapestov/factor/raw/master/misc/Factor.tmbundle/Syntaxes/Factor.tmLanguage: | ||||||
|  | - source.factor | ||||||
|  | https://github.com/slim-template/ruby-slim.tmbundle: | ||||||
|  | - text.slim | ||||||
|  | https://github.com/staltz/SublimeXtend: | ||||||
|  | - source.xtend | ||||||
|  | https://github.com/statatmbundle/Stata.tmbundle: | ||||||
|  | - source.mata | ||||||
|  | - source.stata | ||||||
|  | https://github.com/technosophos/Vala-TMBundle: | ||||||
|  | - source.vala | ||||||
|  | https://github.com/textmate/ant.tmbundle: | ||||||
|  | - text.xml.ant | ||||||
|  | https://github.com/textmate/antlr.tmbundle: | ||||||
|  | - source.antlr | ||||||
|  | https://github.com/textmate/apache.tmbundle: | ||||||
|  | - source.apache-config | ||||||
|  | - source.apache-config.mod_perl | ||||||
|  | https://github.com/textmate/applescript.tmbundle: | ||||||
|  | - source.applescript | ||||||
|  | https://github.com/textmate/asp.tmbundle: | ||||||
|  | - source.asp | ||||||
|  | - text.html.asp | ||||||
|  | https://github.com/textmate/bison.tmbundle: | ||||||
|  | - source.bison | ||||||
|  | https://github.com/textmate/c.tmbundle: | ||||||
|  | - source.c | ||||||
|  | - source.c++ | ||||||
|  | - source.c.platform | ||||||
|  | https://github.com/textmate/capnproto.tmbundle: | ||||||
|  | - source.capnp | ||||||
|  | https://github.com/textmate/cmake.tmbundle: | ||||||
|  | - source.cache.cmake | ||||||
|  | - source.cmake | ||||||
|  | https://github.com/textmate/cpp-qt.tmbundle: | ||||||
|  | - source.c++.qt | ||||||
|  | - source.qmake | ||||||
|  | https://github.com/textmate/css.tmbundle: | ||||||
|  | - source.css | ||||||
|  | https://github.com/textmate/d.tmbundle: | ||||||
|  | - source.d | ||||||
|  | https://github.com/textmate/diff.tmbundle: | ||||||
|  | - source.diff | ||||||
|  | https://github.com/textmate/dylan.tmbundle: | ||||||
|  | - source.dylan | ||||||
|  | - source.lid | ||||||
|  | - source.makegen | ||||||
|  | https://github.com/textmate/eiffel.tmbundle: | ||||||
|  | - source.eiffel | ||||||
|  | https://github.com/textmate/erlang.tmbundle: | ||||||
|  | - source.erlang | ||||||
|  | - text.html.erlang.yaws | ||||||
|  | https://github.com/textmate/fortran.tmbundle: | ||||||
|  | - source.fortran | ||||||
|  | - source.fortran.modern | ||||||
|  | https://github.com/textmate/gettext.tmbundle: | ||||||
|  | - source.po | ||||||
|  | https://github.com/textmate/graphviz.tmbundle: | ||||||
|  | - source.dot | ||||||
|  | https://github.com/textmate/groovy.tmbundle: | ||||||
|  | - source.groovy | ||||||
|  | https://github.com/textmate/haskell.tmbundle: | ||||||
|  | - source.haskell | ||||||
|  | - text.tex.latex.haskell | ||||||
|  | https://github.com/textmate/html.tmbundle: | ||||||
|  | - text.html.basic | ||||||
|  | https://github.com/textmate/ini.tmbundle: | ||||||
|  | - source.ini | ||||||
|  | https://github.com/textmate/io.tmbundle: | ||||||
|  | - source.io | ||||||
|  | https://github.com/textmate/java.tmbundle: | ||||||
|  | - source.java | ||||||
|  | - source.java-properties | ||||||
|  | - text.html.jsp | ||||||
|  | - text.junit-test-report | ||||||
|  | https://github.com/textmate/javadoc.tmbundle: | ||||||
|  | - text.html.javadoc | ||||||
|  | https://github.com/textmate/javascript-objective-j.tmbundle: | ||||||
|  | - source.js.objj | ||||||
|  | https://github.com/textmate/json.tmbundle: | ||||||
|  | - source.json | ||||||
|  | https://github.com/textmate/latex.tmbundle: | ||||||
|  | - text.bibtex | ||||||
|  | - text.log.latex | ||||||
|  | - text.tex | ||||||
|  | - text.tex.latex | ||||||
|  | - text.tex.latex.beamer | ||||||
|  | - text.tex.latex.memoir | ||||||
|  | https://github.com/textmate/less.tmbundle: | ||||||
|  | - source.css.less | ||||||
|  | https://github.com/textmate/lilypond.tmbundle: | ||||||
|  | - source.lilypond | ||||||
|  | https://github.com/textmate/lisp.tmbundle: | ||||||
|  | - source.lisp | ||||||
|  | https://github.com/textmate/logtalk.tmbundle: | ||||||
|  | - source.logtalk | ||||||
|  | https://github.com/textmate/lua.tmbundle: | ||||||
|  | - source.lua | ||||||
|  | https://github.com/textmate/make.tmbundle: | ||||||
|  | - source.makefile | ||||||
|  | https://github.com/textmate/markdown.tmbundle: | ||||||
|  | - text.html.markdown | ||||||
|  | https://github.com/textmate/matlab.tmbundle: | ||||||
|  | - source.matlab | ||||||
|  | - source.octave | ||||||
|  | https://github.com/textmate/maven.tmbundle: | ||||||
|  | - text.xml.pom | ||||||
|  | https://github.com/textmate/nemerle.tmbundle: | ||||||
|  | - source.nemerle | ||||||
|  | https://github.com/textmate/ninja.tmbundle: | ||||||
|  | - source.ninja | ||||||
|  | https://github.com/textmate/objective-c.tmbundle: | ||||||
|  | - source.objc | ||||||
|  | - source.objc++ | ||||||
|  | - source.objc.platform | ||||||
|  | - source.strings | ||||||
|  | https://github.com/textmate/ocaml.tmbundle: | ||||||
|  | - source.camlp4.ocaml | ||||||
|  | - source.ocaml | ||||||
|  | - source.ocamllex | ||||||
|  | - source.ocamlyacc | ||||||
|  | https://github.com/textmate/pascal.tmbundle: | ||||||
|  | - source.pascal | ||||||
|  | https://github.com/textmate/perl.tmbundle: | ||||||
|  | - source.perl | ||||||
|  | https://github.com/textmate/php-smarty.tmbundle: | ||||||
|  | - source.smarty | ||||||
|  | https://github.com/textmate/php.tmbundle: | ||||||
|  | - text.html.php | ||||||
|  | https://github.com/textmate/postscript.tmbundle: | ||||||
|  | - source.postscript | ||||||
|  | https://github.com/textmate/processing.tmbundle: | ||||||
|  | - source.processing | ||||||
|  | https://github.com/textmate/prolog.tmbundle: | ||||||
|  | - source.prolog | ||||||
|  | https://github.com/textmate/python-django.tmbundle: | ||||||
|  | - source.python.django | ||||||
|  | - text.html.django | ||||||
|  | https://github.com/textmate/r.tmbundle: | ||||||
|  | - source.r | ||||||
|  | - text.tex.latex.rd | ||||||
|  | https://github.com/textmate/restructuredtext.tmbundle: | ||||||
|  | - text.restructuredtext | ||||||
|  | https://github.com/textmate/ruby-haml.tmbundle: | ||||||
|  | - text.haml | ||||||
|  | https://github.com/textmate/ruby-on-rails-tmbundle: | ||||||
|  | - source.js.erb.rails | ||||||
|  | - source.ruby.rails | ||||||
|  | - source.ruby.rails.rjs | ||||||
|  | - source.sql.ruby | ||||||
|  | - text.html.erb.rails | ||||||
|  | https://github.com/textmate/scheme.tmbundle: | ||||||
|  | - source.scheme | ||||||
|  | https://github.com/textmate/scilab.tmbundle: | ||||||
|  | - source.scilab | ||||||
|  | https://github.com/textmate/sql.tmbundle: | ||||||
|  | - source.sql | ||||||
|  | https://github.com/textmate/standard-ml.tmbundle: | ||||||
|  | - source.cm | ||||||
|  | - source.ml | ||||||
|  | https://github.com/textmate/swift.tmbundle: | ||||||
|  | - source.swift | ||||||
|  | https://github.com/textmate/tcl.tmbundle: | ||||||
|  | - source.tcl | ||||||
|  | - text.html.tcl | ||||||
|  | https://github.com/textmate/text.tmbundle: | ||||||
|  | - text.plain | ||||||
|  | https://github.com/textmate/textile.tmbundle: | ||||||
|  | - text.html.textile | ||||||
|  | https://github.com/textmate/textmate.tmbundle: | ||||||
|  | - source.regexp.oniguruma | ||||||
|  | - source.tm-properties | ||||||
|  | https://github.com/textmate/thrift.tmbundle: | ||||||
|  | - source.thrift | ||||||
|  | https://github.com/textmate/toml.tmbundle: | ||||||
|  | - source.toml | ||||||
|  | https://github.com/textmate/verilog.tmbundle: | ||||||
|  | - source.verilog | ||||||
|  | https://github.com/textmate/xml.tmbundle: | ||||||
|  | - text.xml | ||||||
|  | - text.xml.xsl | ||||||
|  | https://github.com/textmate/yaml.tmbundle: | ||||||
|  | - source.yaml | ||||||
|  | https://github.com/tomas-stefano/smalltalk-tmbundle: | ||||||
|  | - source.smalltalk | ||||||
|  | https://github.com/vic/ioke-outdated/raw/master/share/TextMate/Ioke.tmbundle/Syntaxes/Ioke.tmLanguage: | ||||||
|  | - source.ioke | ||||||
|  | https://github.com/vkostyukov/kotlin-sublime-package: | ||||||
|  | - source.Kotlin | ||||||
|  | https://github.com/vmg/zephir-sublime: | ||||||
|  | - source.php.zephir | ||||||
|  | https://github.com/whitequark/llvm.tmbundle: | ||||||
|  | - source.llvm | ||||||
|  | https://github.com/wmertens/sublime-nix: | ||||||
|  | - source.nix | ||||||
|  | https://raw.githubusercontent.com/eregon/oz-tmbundle/master/Syntaxes/Oz.tmLanguage: | ||||||
|  | - source.oz | ||||||
| @@ -4,4 +4,5 @@ require 'linguist/heuristics' | |||||||
| require 'linguist/language' | require 'linguist/language' | ||||||
| require 'linguist/repository' | require 'linguist/repository' | ||||||
| require 'linguist/samples' | require 'linguist/samples' | ||||||
|  | require 'linguist/shebang' | ||||||
| require 'linguist/version' | require 'linguist/version' | ||||||
|   | |||||||
| @@ -1,10 +1,7 @@ | |||||||
| require 'linguist/generated' | require 'linguist/generated' | ||||||
| require 'linguist/language' |  | ||||||
|  |  | ||||||
| require 'charlock_holmes' | require 'charlock_holmes' | ||||||
| require 'escape_utils' | require 'escape_utils' | ||||||
| require 'mime/types' | require 'mime/types' | ||||||
| require 'pygments' |  | ||||||
| require 'yaml' | require 'yaml' | ||||||
|  |  | ||||||
| module Linguist | module Linguist | ||||||
| @@ -149,6 +146,13 @@ module Linguist | |||||||
|       end |       end | ||||||
|     end |     end | ||||||
|  |  | ||||||
|  |     # Public: Is the blob empty? | ||||||
|  |     # | ||||||
|  |     # Return true or false | ||||||
|  |     def empty? | ||||||
|  |       data.nil? || data == "" | ||||||
|  |     end | ||||||
|  |  | ||||||
|     # Public: Is the blob text? |     # Public: Is the blob text? | ||||||
|     # |     # | ||||||
|     # Return true or false |     # Return true or false | ||||||
| @@ -195,10 +199,6 @@ module Linguist | |||||||
|  |  | ||||||
|     # Public: Is the blob safe to colorize? |     # Public: Is the blob safe to colorize? | ||||||
|     # |     # | ||||||
|     # We use Pygments for syntax highlighting blobs. Pygments |  | ||||||
|     # can be too slow for very large blobs or for certain |  | ||||||
|     # corner-case blobs. |  | ||||||
|     # |  | ||||||
|     # Return true or false |     # Return true or false | ||||||
|     def safe_to_colorize? |     def safe_to_colorize? | ||||||
|       !large? && text? && !high_ratio_of_long_lines? |       !large? && text? && !high_ratio_of_long_lines? | ||||||
| @@ -206,9 +206,6 @@ module Linguist | |||||||
|  |  | ||||||
|     # Internal: Does the blob have a ratio of long lines? |     # Internal: Does the blob have a ratio of long lines? | ||||||
|     # |     # | ||||||
|     # These types of files are usually going to make Pygments.rb |  | ||||||
|     # angry if we try to colorize them. |  | ||||||
|     # |  | ||||||
|     # Return true or false |     # Return true or false | ||||||
|     def high_ratio_of_long_lines? |     def high_ratio_of_long_lines? | ||||||
|       return false if loc == 0 |       return false if loc == 0 | ||||||
| @@ -316,23 +313,9 @@ module Linguist | |||||||
|       @language ||= Language.detect(self) |       @language ||= Language.detect(self) | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     # Internal: Get the lexer of the blob. |     # Internal: Get the TextMate compatible scope for the blob | ||||||
|     # |     def tm_scope | ||||||
|     # Returns a Lexer. |       language && language.tm_scope | ||||||
|     def lexer |  | ||||||
|       language ? language.lexer : Pygments::Lexer.find_by_name('Text only') |  | ||||||
|     end |  | ||||||
|  |  | ||||||
|     # Public: Highlight syntax of blob |  | ||||||
|     # |  | ||||||
|     # options - A Hash of options (defaults to {}) |  | ||||||
|     # |  | ||||||
|     # Returns html String |  | ||||||
|     def colorize(options = {}) |  | ||||||
|       return unless safe_to_colorize? |  | ||||||
|       options[:options] ||= {} |  | ||||||
|       options[:options][:encoding] ||= encoding |  | ||||||
|       lexer.highlight(data, options) |  | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
| end | end | ||||||
|   | |||||||
| @@ -3,6 +3,25 @@ require 'linguist/tokenizer' | |||||||
| module Linguist | module Linguist | ||||||
|   # Language bayesian classifier. |   # Language bayesian classifier. | ||||||
|   class Classifier |   class Classifier | ||||||
|  |     # Public: Use the classifier to detect language of the blob. | ||||||
|  |     # | ||||||
|  |     # blob               - An object that quacks like a blob. | ||||||
|  |     # possible_languages - Array of Language objects | ||||||
|  |     # | ||||||
|  |     # Examples | ||||||
|  |     # | ||||||
|  |     #   Classifier.call(FileBlob.new("path/to/file"), [ | ||||||
|  |     #     Language["Ruby"], Language["Python"] | ||||||
|  |     #   ]) | ||||||
|  |     # | ||||||
|  |     # Returns an Array of Language objects, most probable first. | ||||||
|  |     def self.call(blob, possible_languages) | ||||||
|  |       language_names = possible_languages.map(&:name) | ||||||
|  |       classify(Samples.cache, blob.data, language_names).map do |name, _| | ||||||
|  |         Language[name] # Return the actual Language objects | ||||||
|  |       end | ||||||
|  |     end | ||||||
|  |  | ||||||
|     # Public: Train classifier that data is a certain language. |     # Public: Train classifier that data is a certain language. | ||||||
|     # |     # | ||||||
|     # db       - Hash classifier database object |     # db       - Hash classifier database object | ||||||
|   | |||||||
| @@ -52,5 +52,26 @@ module Linguist | |||||||
|     def size |     def size | ||||||
|       File.size(@path) |       File.size(@path) | ||||||
|     end |     end | ||||||
|  |  | ||||||
|  |     # Public: Get file extension. | ||||||
|  |     # | ||||||
|  |     # Returns a String. | ||||||
|  |     def extension | ||||||
|  |       extensions.last || "" | ||||||
|  |     end | ||||||
|  |  | ||||||
|  |     # Public: Return an array of the file extensions | ||||||
|  |     # | ||||||
|  |     #     >> Linguist::FileBlob.new("app/views/things/index.html.erb").extensions | ||||||
|  |     #     => [".html.erb", ".erb"] | ||||||
|  |     # | ||||||
|  |     # Returns an Array | ||||||
|  |     def extensions | ||||||
|  |       basename, *segments = File.basename(name).split(".") | ||||||
|  |  | ||||||
|  |       segments.map.with_index do |segment, index| | ||||||
|  |         "." + segments[index..-1].join(".") | ||||||
|  |       end | ||||||
|  |     end | ||||||
|   end |   end | ||||||
| end | end | ||||||
|   | |||||||
| @@ -51,30 +51,30 @@ module Linguist | |||||||
|     # |     # | ||||||
|     # Return true or false |     # Return true or false | ||||||
|     def generated? |     def generated? | ||||||
|       name == 'Gemfile.lock' || |       minified_files? || | ||||||
|         minified_files? || |       compiled_coffeescript? || | ||||||
|         compiled_coffeescript? || |       xcode_file? || | ||||||
|         xcode_project_file? || |       generated_parser? || | ||||||
|         generated_parser? || |       generated_net_docfile? || | ||||||
|         generated_net_docfile? || |       generated_net_designer_file? || | ||||||
|         generated_net_designer_file? || |       generated_postscript? || | ||||||
|         generated_postscript? || |       generated_protocol_buffer? || | ||||||
|         generated_protocol_buffer? || |       generated_jni_header? || | ||||||
|         generated_jni_header? || |       composer_lock? || | ||||||
|         composer_lock? || |       node_modules? || | ||||||
|         node_modules? || |       godeps? || | ||||||
|         vcr_cassette? || |       vcr_cassette? || | ||||||
|         generated_by_zephir? |       generated_by_zephir? | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     # Internal: Is the blob an XCode project file? |     # Internal: Is the blob an Xcode file? | ||||||
|     # |     # | ||||||
|     # Generated if the file extension is an XCode project |     # Generated if the file extension is an Xcode | ||||||
|     # file extension. |     # file extension. | ||||||
|     # |     # | ||||||
|     # Returns true of false. |     # Returns true of false. | ||||||
|     def xcode_project_file? |     def xcode_file? | ||||||
|       ['.xib', '.nib', '.storyboard', '.pbxproj', '.xcworkspacedata', '.xcuserstate'].include?(extname) |       ['.nib', '.xcworkspacedata', '.xcuserstate'].include?(extname) | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     # Internal: Is the blob minified files? |     # Internal: Is the blob minified files? | ||||||
| @@ -231,11 +231,19 @@ module Linguist | |||||||
|       !!name.match(/node_modules\//) |       !!name.match(/node_modules\//) | ||||||
|     end |     end | ||||||
|  |  | ||||||
|  |     # Internal: Is the blob part of Godeps/, | ||||||
|  |     # which are not meant for humans in pull requests. | ||||||
|  |     # | ||||||
|  |     # Returns true or false. | ||||||
|  |     def godeps? | ||||||
|  |       !!name.match(/Godeps\//) | ||||||
|  |     end | ||||||
|  |  | ||||||
|     # Internal: Is the blob a generated php composer lock file? |     # Internal: Is the blob a generated php composer lock file? | ||||||
|     # |     # | ||||||
|     # Returns true or false. |     # Returns true or false. | ||||||
|     def composer_lock? |     def composer_lock? | ||||||
|       !!name.match(/composer.lock/) |       !!name.match(/composer\.lock/) | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     # Internal: Is the blob a generated by Zephir |     # Internal: Is the blob a generated by Zephir | ||||||
|   | |||||||
							
								
								
									
										13
									
								
								lib/linguist/grammars.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								lib/linguist/grammars.rb
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | |||||||
|  | # 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. | ||||||
|  |     # | ||||||
|  |     # Returns a String. | ||||||
|  |     def self.path | ||||||
|  |       File.expand_path("../../../grammars", __FILE__) | ||||||
|  |     end | ||||||
|  |   end | ||||||
|  | end | ||||||
| @@ -1,90 +1,160 @@ | |||||||
| module Linguist | module Linguist | ||||||
|   # A collection of simple heuristics that can be used to better analyze languages. |   # A collection of simple heuristics that can be used to better analyze languages. | ||||||
|   class Heuristics |   class Heuristics | ||||||
|     ACTIVE = false |     # Public: Use heuristics to detect language of the blob. | ||||||
|  |     # | ||||||
|  |     # blob               - An object that quacks like a blob. | ||||||
|  |     # possible_languages - Array of Language objects | ||||||
|  |     # | ||||||
|  |     # Examples | ||||||
|  |     # | ||||||
|  |     #   Heuristics.call(FileBlob.new("path/to/file"), [ | ||||||
|  |     #     Language["Ruby"], Language["Python"] | ||||||
|  |     #   ]) | ||||||
|  |     # | ||||||
|  |     # Returns an Array of languages, or empty if none matched or were inconclusive. | ||||||
|  |     def self.call(blob, languages) | ||||||
|  |       data = blob.data | ||||||
|  |  | ||||||
|     # Public: Given an array of String language names, |       @heuristics.each do |heuristic| | ||||||
|     # apply heuristics against the given data and return an array |         return Array(heuristic.call(data)) if heuristic.matches?(languages) | ||||||
|     # of matching languages, or nil. |       end | ||||||
|  |  | ||||||
|  |       [] # No heuristics matched | ||||||
|  |     end | ||||||
|  |  | ||||||
|  |     # Internal: Define a new heuristic. | ||||||
|     # |     # | ||||||
|     # data      - Array of tokens or String data to analyze. |     # languages - String names of languages to disambiguate. | ||||||
|     # languages - Array of language name Strings to restrict to. |     # heuristic - Block which takes data as an argument and returns a Language or nil. | ||||||
|     # |     # | ||||||
|     # Returns an array of Languages or [] |     # Examples | ||||||
|     def self.find_by_heuristics(data, languages) |     # | ||||||
|       if active? |     #     disambiguate "Perl", "Prolog" do |data| | ||||||
|         if languages.all? { |l| ["Objective-C", "C++"].include?(l) } |     #       if data.include?("use strict") | ||||||
|           disambiguate_c(data, languages) |     #         Language["Perl"] | ||||||
|         end |     #       elsif data.include?(":-") | ||||||
|         if languages.all? { |l| ["Perl", "Prolog"].include?(l) } |     #         Language["Prolog"] | ||||||
|           disambiguate_pl(data, languages) |     #       end | ||||||
|         end |     #     end | ||||||
|         if languages.all? { |l| ["ECL", "Prolog"].include?(l) } |     # | ||||||
|           disambiguate_ecl(data, languages) |     def self.disambiguate(*languages, &heuristic) | ||||||
|         end |       @heuristics << new(languages, &heuristic) | ||||||
|         if languages.all? { |l| ["TypeScript", "XML"].include?(l) } |     end | ||||||
|           disambiguate_ts(data, languages) |  | ||||||
|         end |     # Internal: Array of defined heuristics | ||||||
|         if languages.all? { |l| ["Common Lisp", "OpenCL"].include?(l) } |     @heuristics = [] | ||||||
|           disambiguate_cl(data, languages) |  | ||||||
|         end |     # Internal | ||||||
|         if languages.all? { |l| ["Rebol", "R"].include?(l) } |     def initialize(languages, &heuristic) | ||||||
|           disambiguate_r(data, languages) |       @languages = languages | ||||||
|         end |       @heuristic = heuristic | ||||||
|  |     end | ||||||
|  |  | ||||||
|  |     # Internal: Check if this heuristic matches the candidate languages. | ||||||
|  |     def matches?(candidates) | ||||||
|  |       candidates.all? { |l| @languages.include?(l.name) } | ||||||
|  |     end | ||||||
|  |  | ||||||
|  |     # Internal: Perform the heuristic | ||||||
|  |     def call(data) | ||||||
|  |       @heuristic.call(data) | ||||||
|  |     end | ||||||
|  |  | ||||||
|  |     disambiguate "Objective-C", "C++", "C" do |data| | ||||||
|  |       if (/@(interface|class|protocol|property|end|synchronised|selector|implementation)\b/.match(data)) | ||||||
|  |         Language["Objective-C"] | ||||||
|  |       elsif (/^\s*#\s*include <(cstdint|string|vector|map|list|array|bitset|queue|stack|forward_list|unordered_map|unordered_set|(i|o|io)stream)>/.match(data) || | ||||||
|  |         /^\s*template\s*</.match(data) || /^[^@]class\s+\w+/.match(data) || /^[^@](private|public|protected):$/.match(data) || /std::.+$/.match(data)) | ||||||
|  |         Language["C++"] | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     # .h extensions are ambigious between C, C++, and Objective-C. |     disambiguate "Perl", "Perl6", "Prolog" do |data| | ||||||
|     # We want to shortcut look for Objective-C _and_ now C++ too! |       if data.include?("use v6") | ||||||
|     # |         Language["Perl6"] | ||||||
|     # Returns an array of Languages or [] |       elsif data.include?("use strict") | ||||||
|     def self.disambiguate_c(data, languages) |         Language["Perl"] | ||||||
|       matches = [] |       elsif data.include?(":-") | ||||||
|       matches << Language["Objective-C"] if data.include?("@interface") |         Language["Prolog"] | ||||||
|       matches << Language["C++"] if data.include?("#include <cstdint>") |       end | ||||||
|       matches |  | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     def self.disambiguate_pl(data, languages) |     disambiguate "ECL", "Prolog" do |data| | ||||||
|       matches = [] |       if data.include?(":-") | ||||||
|       matches << Language["Prolog"] if data.include?(":-") |         Language["Prolog"] | ||||||
|       matches << Language["Perl"] if data.include?("use strict") |       elsif data.include?(":=") | ||||||
|       matches |         Language["ECL"] | ||||||
|  |       end | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     def self.disambiguate_ecl(data, languages) |     disambiguate "IDL", "Prolog" do |data| | ||||||
|       matches = [] |       if data.include?(":-") | ||||||
|       matches << Language["Prolog"] if data.include?(":-") |         Language["Prolog"] | ||||||
|       matches << Language["ECL"] if data.include?(":=") |  | ||||||
|       matches |  | ||||||
|     end |  | ||||||
|  |  | ||||||
|     def self.disambiguate_ts(data, languages) |  | ||||||
|       matches = [] |  | ||||||
|       if (data.include?("</translation>")) |  | ||||||
|         matches << Language["XML"] |  | ||||||
|       else |       else | ||||||
|         matches << Language["TypeScript"] |         Language["IDL"] | ||||||
|       end |       end | ||||||
|       matches |  | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     def self.disambiguate_cl(data, languages) |     disambiguate "Common Lisp", "OpenCL", "Cool" do |data| | ||||||
|       matches = [] |       if data.include?("(defun ") | ||||||
|       matches << Language["Common Lisp"] if data.include?("(defun ") |         Language["Common Lisp"] | ||||||
|       matches << Language["OpenCL"] if /\/\* |\/\/ |^\}/.match(data) |       elsif /^class/x.match(data) | ||||||
|       matches |         Language["Cool"] | ||||||
|  |       elsif /\/\* |\/\/ |^\}/.match(data) | ||||||
|  |         Language["OpenCL"] | ||||||
|  |       end | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     def self.disambiguate_r(data, languages) |     disambiguate "Hack", "PHP" do |data| | ||||||
|       matches = [] |       if data.include?("<?hh") | ||||||
|       matches << Language["Rebol"] if /\bRebol\b/i.match(data) |         Language["Hack"] | ||||||
|       matches << Language["R"] if data.include?("<-") |       elsif /<?[^h]/.match(data) | ||||||
|       matches |         Language["PHP"] | ||||||
|  |       end | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     def self.active? |     disambiguate "Scala", "SuperCollider" do |data| | ||||||
|       !!ACTIVE |       if /\^(this|super)\./.match(data) || /^\s*(\+|\*)\s*\w+\s*{/.match(data) || /^\s*~\w+\s*=\./.match(data) | ||||||
|  |         Language["SuperCollider"] | ||||||
|  |       elsif /^\s*import (scala|java)\./.match(data) || /^\s*val\s+\w+\s*=/.match(data) || /^\s*class\b/.match(data) | ||||||
|  |         Language["Scala"] | ||||||
|  |       end | ||||||
|     end |     end | ||||||
|  |  | ||||||
|  |     disambiguate "AsciiDoc", "AGS Script" do |data| | ||||||
|  |       Language["AsciiDoc"] if /^=+(\s|\n)/.match(data) | ||||||
|  |     end | ||||||
|  |  | ||||||
|  |     disambiguate "FORTRAN", "Forth" do |data| | ||||||
|  |       if /^: /.match(data) | ||||||
|  |         Language["Forth"] | ||||||
|  |       elsif /^([c*][^a-z]|      subroutine\s)/i.match(data) | ||||||
|  |         Language["FORTRAN"] | ||||||
|  |       end | ||||||
|  |     end | ||||||
|  |  | ||||||
|  |     disambiguate "F#", "Forth", "GLSL" do |data| | ||||||
|  |       if /^(: |new-device)/.match(data) | ||||||
|  |         Language["Forth"] | ||||||
|  |       elsif /^(#light|import|let|module|namespace|open|type)/.match(data) | ||||||
|  |         Language["F#"] | ||||||
|  |       elsif /^(#include|#pragma|precision|uniform|varying|void)/.match(data) | ||||||
|  |         Language["GLSL"] | ||||||
|  |       end | ||||||
|  |     end | ||||||
|  |  | ||||||
|  |     disambiguate "Gosu", "JavaScript" do |data| | ||||||
|  |       Language["Gosu"] if /^uses java\./.match(data) | ||||||
|  |     end | ||||||
|  |  | ||||||
|  |     disambiguate "LoomScript", "LiveScript" do |data| | ||||||
|  |       if /^\s*package\s*[\w\.\/\*\s]*\s*{/.match(data) | ||||||
|  |         Language["LoomScript"] | ||||||
|  |       else | ||||||
|  |         Language["LiveScript"] | ||||||
|  |       end | ||||||
|  |     end | ||||||
|  |  | ||||||
|   end |   end | ||||||
| end | end | ||||||
|   | |||||||
| @@ -1,14 +1,17 @@ | |||||||
| require 'escape_utils' | require 'escape_utils' | ||||||
| require 'pygments' |  | ||||||
| require 'yaml' | require 'yaml' | ||||||
| begin | begin | ||||||
|   require 'json' |   require 'yajl' | ||||||
| rescue LoadError | rescue LoadError | ||||||
| end | end | ||||||
|  |  | ||||||
| require 'linguist/classifier' | require 'linguist/classifier' | ||||||
| require 'linguist/heuristics' | require 'linguist/heuristics' | ||||||
| require 'linguist/samples' | require 'linguist/samples' | ||||||
|  | require 'linguist/file_blob' | ||||||
|  | require 'linguist/blob_helper' | ||||||
|  | require 'linguist/strategy/filename' | ||||||
|  | require 'linguist/shebang' | ||||||
|  |  | ||||||
| module Linguist | module Linguist | ||||||
|   # Language names that are recognizable by GitHub. Defined languages |   # Language names that are recognizable by GitHub. Defined languages | ||||||
| @@ -60,7 +63,7 @@ module Linguist | |||||||
|       end |       end | ||||||
|  |  | ||||||
|       # Language name index |       # Language name index | ||||||
|       @index[language.name] = @name_index[language.name] = language |       @index[language.name.downcase] = @name_index[language.name.downcase] = language | ||||||
|  |  | ||||||
|       language.aliases.each do |name| |       language.aliases.each do |name| | ||||||
|         # All Language aliases should be unique. Raise if there is a duplicate. |         # All Language aliases should be unique. Raise if there is a duplicate. | ||||||
| @@ -68,7 +71,7 @@ module Linguist | |||||||
|           raise ArgumentError, "Duplicate alias: #{name}" |           raise ArgumentError, "Duplicate alias: #{name}" | ||||||
|         end |         end | ||||||
|  |  | ||||||
|         @index[name] = @alias_index[name] = language |         @index[name.downcase] = @alias_index[name.downcase] = language | ||||||
|       end |       end | ||||||
|  |  | ||||||
|       language.extensions.each do |extension| |       language.extensions.each do |extension| | ||||||
| @@ -90,6 +93,13 @@ module Linguist | |||||||
|       language |       language | ||||||
|     end |     end | ||||||
|  |  | ||||||
|  |     STRATEGIES = [ | ||||||
|  |       Linguist::Strategy::Filename, | ||||||
|  |       Linguist::Shebang, | ||||||
|  |       Linguist::Heuristics, | ||||||
|  |       Linguist::Classifier | ||||||
|  |     ] | ||||||
|  |  | ||||||
|     # Public: Detects the Language of the blob. |     # Public: Detects the Language of the blob. | ||||||
|     # |     # | ||||||
|     # blob - an object that includes the Linguist `BlobHelper` interface; |     # blob - an object that includes the Linguist `BlobHelper` interface; | ||||||
| @@ -97,50 +107,22 @@ module Linguist | |||||||
|     # |     # | ||||||
|     # Returns Language or nil. |     # Returns Language or nil. | ||||||
|     def self.detect(blob) |     def self.detect(blob) | ||||||
|       name = blob.name.to_s |       # Bail early if the blob is binary or empty. | ||||||
|  |       return nil if blob.likely_binary? || blob.binary? || blob.empty? | ||||||
|  |  | ||||||
|       # Check if the blob is possibly binary and bail early; this is a cheap |       # Call each strategy until one candidate is returned. | ||||||
|       # test that uses the extension name to guess a binary binary mime type. |       STRATEGIES.reduce([]) do |languages, strategy| | ||||||
|       # |         candidates = strategy.call(blob, languages) | ||||||
|       # We'll perform a more comprehensive test later which actually involves |         if candidates.size == 1 | ||||||
|       # looking for binary characters in the blob |           return candidates.first | ||||||
|       return nil if blob.likely_binary? |         elsif candidates.size > 1 | ||||||
|  |           # More than one candidate was found, pass them to the next strategy. | ||||||
|       # A bit of an elegant hack. If the file is executable but extensionless, |           candidates | ||||||
|       # append a "magic" extension so it can be classified with other |         else | ||||||
|       # languages that have shebang scripts. |           # No candiates were found, pass on languages from the previous strategy. | ||||||
|       if File.extname(name).empty? && blob.mode && (blob.mode.to_i(8) & 05) == 05 |           languages | ||||||
|         name += ".script!" |  | ||||||
|       end |  | ||||||
|  |  | ||||||
|       # First try to find languages that match based on filename. |  | ||||||
|       possible_languages = find_by_filename(name) |  | ||||||
|  |  | ||||||
|       # If there is more than one possible language with that extension (or no |  | ||||||
|       # extension at all, in the case of extensionless scripts), we need to continue |  | ||||||
|       # our detection work |  | ||||||
|       if possible_languages.length > 1 |  | ||||||
|         data = blob.data |  | ||||||
|         possible_language_names = possible_languages.map(&:name) |  | ||||||
|  |  | ||||||
|         # Don't bother with binary contents or an empty file |  | ||||||
|         if blob.binary? || data.nil? || data == "" |  | ||||||
|           nil |  | ||||||
|         # Check if there's a shebang line and use that as authoritative |  | ||||||
|         elsif (result = find_by_shebang(data)) && !result.empty? |  | ||||||
|           result.first |  | ||||||
|         # No shebang. Still more work to do. Try to find it with our heuristics. |  | ||||||
|         elsif (determined = Heuristics.find_by_heuristics(data, possible_language_names)) && !determined.empty? |  | ||||||
|           determined.first |  | ||||||
|         # Lastly, fall back to the probablistic classifier. |  | ||||||
|         elsif classified = Classifier.classify(Samples::DATA, data, possible_language_names ).first |  | ||||||
|           # Return the actual Language object based of the string language name (i.e., first element of `#classify`) |  | ||||||
|           Language[classified[0]] |  | ||||||
|         end |         end | ||||||
|       else |       end.first | ||||||
|         # Simplest and most common case, we can just return the one match based on extension |  | ||||||
|         possible_languages.first |  | ||||||
|       end |  | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     # Public: Get all Languages |     # Public: Get all Languages | ||||||
| @@ -161,7 +143,7 @@ module Linguist | |||||||
|     # |     # | ||||||
|     # Returns the Language or nil if none was found. |     # Returns the Language or nil if none was found. | ||||||
|     def self.find_by_name(name) |     def self.find_by_name(name) | ||||||
|       @name_index[name] |       name && @name_index[name.downcase] | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     # Public: Look up Language by one of its aliases. |     # Public: Look up Language by one of its aliases. | ||||||
| @@ -175,7 +157,7 @@ module Linguist | |||||||
|     # |     # | ||||||
|     # Returns the Lexer or nil if none was found. |     # Returns the Lexer or nil if none was found. | ||||||
|     def self.find_by_alias(name) |     def self.find_by_alias(name) | ||||||
|       @alias_index[name] |       name && @alias_index[name.downcase] | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     # Public: Look up Languages by filename. |     # Public: Look up Languages by filename. | ||||||
| @@ -189,26 +171,54 @@ module Linguist | |||||||
|     # |     # | ||||||
|     # Returns all matching Languages or [] if none were found. |     # Returns all matching Languages or [] if none were found. | ||||||
|     def self.find_by_filename(filename) |     def self.find_by_filename(filename) | ||||||
|       basename, extname = File.basename(filename), File.extname(filename) |       basename = File.basename(filename) | ||||||
|       langs = @filename_index[basename] + |  | ||||||
|               @extension_index[extname] |       # find the first extension with language definitions | ||||||
|       langs.compact.uniq |       extname = FileBlob.new(filename).extensions.detect do |e| | ||||||
|  |         !@extension_index[e].empty? | ||||||
|  |       end | ||||||
|  |  | ||||||
|  |       (@filename_index[basename] + @extension_index[extname]).compact.uniq | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     # Public: Look up Languages by shebang line. |     # Public: Look up Languages by file extension. | ||||||
|     # |     # | ||||||
|     # data - Array of tokens or String data to analyze. |     # extname - The extension String. | ||||||
|     # |     # | ||||||
|     # Examples |     # Examples | ||||||
|     # |     # | ||||||
|     #   Language.find_by_shebang("#!/bin/bash\ndate;") |     #   Language.find_by_extension('.rb') | ||||||
|  |     #   # => [#<Language name="Ruby">] | ||||||
|  |     # | ||||||
|  |     #   Language.find_by_extension('rb') | ||||||
|  |     #   # => [#<Language name="Ruby">] | ||||||
|  |     # | ||||||
|  |     # Returns all matching Languages or [] if none were found. | ||||||
|  |     def self.find_by_extension(extname) | ||||||
|  |       extname = ".#{extname}" unless extname.start_with?(".") | ||||||
|  |       @extension_index[extname] | ||||||
|  |     end | ||||||
|  |  | ||||||
|  |     # DEPRECATED | ||||||
|  |     def self.find_by_shebang(data) | ||||||
|  |       @interpreter_index[Shebang.interpreter(data)] | ||||||
|  |     end | ||||||
|  |  | ||||||
|  |     # Public: Look up Languages by interpreter. | ||||||
|  |     # | ||||||
|  |     # interpreter - String of interpreter name | ||||||
|  |     # | ||||||
|  |     # Examples | ||||||
|  |     # | ||||||
|  |     #   Language.find_by_interpreter("bash") | ||||||
|     #   # => [#<Language name="Bash">] |     #   # => [#<Language name="Bash">] | ||||||
|     # |     # | ||||||
|     # Returns the matching Language |     # Returns the matching Language | ||||||
|     def self.find_by_shebang(data) |     def self.find_by_interpreter(interpreter) | ||||||
|       @interpreter_index[Linguist.interpreter_from_shebang(data)] |       @interpreter_index[interpreter] | ||||||
|     end |     end | ||||||
|  |  | ||||||
|  |  | ||||||
|     # Public: Look up Language by its name or lexer. |     # Public: Look up Language by its name or lexer. | ||||||
|     # |     # | ||||||
|     # name - The String name of the Language |     # name - The String name of the Language | ||||||
| @@ -223,7 +233,7 @@ module Linguist | |||||||
|     # |     # | ||||||
|     # Returns the Language or nil if none was found. |     # Returns the Language or nil if none was found. | ||||||
|     def self.[](name) |     def self.[](name) | ||||||
|       @index[name] |       name && @index[name.downcase] | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     # Public: A List of popular languages |     # Public: A List of popular languages | ||||||
| @@ -282,9 +292,16 @@ module Linguist | |||||||
|       # Set aliases |       # Set aliases | ||||||
|       @aliases = [default_alias_name] + (attributes[:aliases] || []) |       @aliases = [default_alias_name] + (attributes[:aliases] || []) | ||||||
|  |  | ||||||
|       # Lookup Lexer object |       # Load the TextMate scope name or try to guess one | ||||||
|       @lexer = Pygments::Lexer.find_by_name(attributes[:lexer] || name) || |       @tm_scope = attributes[:tm_scope] || begin | ||||||
|         raise(ArgumentError, "#{@name} is missing lexer") |         context = case @type | ||||||
|  |                   when :data, :markup, :prose | ||||||
|  |                     'text' | ||||||
|  |                   when :programming, nil | ||||||
|  |                     'source' | ||||||
|  |                   end | ||||||
|  |         "#{context}.#{@name.downcase}" | ||||||
|  |       end | ||||||
|  |  | ||||||
|       @ace_mode = attributes[:ace_mode] |       @ace_mode = attributes[:ace_mode] | ||||||
|       @wrap = attributes[:wrap] || false |       @wrap = attributes[:wrap] || false | ||||||
| @@ -359,6 +376,11 @@ module Linguist | |||||||
|     # Returns the Lexer |     # Returns the Lexer | ||||||
|     attr_reader :lexer |     attr_reader :lexer | ||||||
|  |  | ||||||
|  |     # Public: Get the name of a TextMate-compatible scope | ||||||
|  |     # | ||||||
|  |     # Returns the scope | ||||||
|  |     attr_reader :tm_scope | ||||||
|  |  | ||||||
|     # Public: Get Ace mode |     # Public: Get Ace mode | ||||||
|     # |     # | ||||||
|     # Examples |     # Examples | ||||||
| @@ -401,11 +423,6 @@ module Linguist | |||||||
|     # |     # | ||||||
|     # Returns the extensions Array |     # Returns the extensions Array | ||||||
|     attr_reader :filenames |     attr_reader :filenames | ||||||
|      |  | ||||||
|     # Public: Return all possible extensions for language |  | ||||||
|     def all_extensions |  | ||||||
|       (extensions + [primary_extension]).uniq |  | ||||||
|     end |  | ||||||
|  |  | ||||||
|     # Deprecated: Get primary extension |     # Deprecated: Get primary extension | ||||||
|     # |     # | ||||||
| @@ -506,16 +523,16 @@ module Linguist | |||||||
|     end |     end | ||||||
|   end |   end | ||||||
|  |  | ||||||
|   extensions = Samples::DATA['extnames'] |   extensions = Samples.cache['extnames'] | ||||||
|   interpreters = Samples::DATA['interpreters'] |   interpreters = Samples.cache['interpreters'] | ||||||
|   filenames = Samples::DATA['filenames'] |   filenames = Samples.cache['filenames'] | ||||||
|   popular = YAML.load_file(File.expand_path("../popular.yml", __FILE__)) |   popular = YAML.load_file(File.expand_path("../popular.yml", __FILE__)) | ||||||
|  |  | ||||||
|   languages_yml = File.expand_path("../languages.yml", __FILE__) |   languages_yml = File.expand_path("../languages.yml", __FILE__) | ||||||
|   languages_json = File.expand_path("../languages.json", __FILE__) |   languages_json = File.expand_path("../languages.json", __FILE__) | ||||||
|  |  | ||||||
|   if File.exist?(languages_json) && defined?(JSON) |   if File.exist?(languages_json) && defined?(Yajl) | ||||||
|     languages = JSON.load(File.read(languages_json)) |     languages = Yajl.load(File.read(languages_json)) | ||||||
|   else |   else | ||||||
|     languages = YAML.load_file(languages_yml) |     languages = YAML.load_file(languages_yml) | ||||||
|   end |   end | ||||||
| @@ -528,6 +545,7 @@ module Linguist | |||||||
|     if extnames = extensions[name] |     if extnames = extensions[name] | ||||||
|       extnames.each do |extname| |       extnames.each do |extname| | ||||||
|         if !options['extensions'].include?(extname) |         if !options['extensions'].include?(extname) | ||||||
|  |           warn "#{name} has a sample with extension (#{extname}) that isn't explicitly defined in languages.yml" unless extname == '.script!' | ||||||
|           options['extensions'] << extname |           options['extensions'] << extname | ||||||
|         end |         end | ||||||
|       end |       end | ||||||
| @@ -559,12 +577,13 @@ module Linguist | |||||||
|       :type              => options['type'], |       :type              => options['type'], | ||||||
|       :aliases           => options['aliases'], |       :aliases           => options['aliases'], | ||||||
|       :lexer             => options['lexer'], |       :lexer             => options['lexer'], | ||||||
|  |       :tm_scope          => options['tm_scope'], | ||||||
|       :ace_mode          => options['ace_mode'], |       :ace_mode          => options['ace_mode'], | ||||||
|       :wrap              => options['wrap'], |       :wrap              => options['wrap'], | ||||||
|       :group_name        => options['group'], |       :group_name        => options['group'], | ||||||
|       :searchable        => options.key?('searchable') ? options['searchable'] : true, |       :searchable        => options.fetch('searchable', true), | ||||||
|       :search_term       => options['search_term'], |       :search_term       => options['search_term'], | ||||||
|       :extensions        => [options['extensions'].first] + options['extensions'][1..-1].sort, |       :extensions        => Array(options['extensions']), | ||||||
|       :interpreters      => options['interpreters'].sort, |       :interpreters      => options['interpreters'].sort, | ||||||
|       :filenames         => options['filenames'], |       :filenames         => options['filenames'], | ||||||
|       :popular           => popular.include?(name) |       :popular           => popular.include?(name) | ||||||
|   | |||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,8 +1,13 @@ | |||||||
| require 'linguist/blob_helper' | require 'linguist/blob_helper' | ||||||
|  | require 'linguist/language' | ||||||
| require 'rugged' | require 'rugged' | ||||||
|  |  | ||||||
| module Linguist | module Linguist | ||||||
|   class LazyBlob |   class LazyBlob | ||||||
|  |     GIT_ATTR = ['linguist-language', 'linguist-vendored'] | ||||||
|  |     GIT_ATTR_OPTS = { :priority => [:index], :skip_system => true } | ||||||
|  |     GIT_ATTR_FLAGS = Rugged::Repository::Attributes.parse_opts(GIT_ATTR_OPTS) | ||||||
|  |  | ||||||
|     include BlobHelper |     include BlobHelper | ||||||
|  |  | ||||||
|     MAX_SIZE = 128 * 1024 |     MAX_SIZE = 128 * 1024 | ||||||
| @@ -19,6 +24,29 @@ module Linguist | |||||||
|       @mode = mode |       @mode = mode | ||||||
|     end |     end | ||||||
|  |  | ||||||
|  |     def git_attributes | ||||||
|  |       @git_attributes ||= repository.fetch_attributes( | ||||||
|  |         name, GIT_ATTR, GIT_ATTR_FLAGS) | ||||||
|  |     end | ||||||
|  |  | ||||||
|  |     def vendored? | ||||||
|  |       if attr = git_attributes['linguist-vendored'] | ||||||
|  |         return boolean_attribute(attr) | ||||||
|  |       else | ||||||
|  |         return super | ||||||
|  |       end | ||||||
|  |     end | ||||||
|  |  | ||||||
|  |     def language | ||||||
|  |       return @language if defined?(@language) | ||||||
|  |  | ||||||
|  |       @language = if lang = git_attributes['linguist-language'] | ||||||
|  |         Language.find_by_name(lang) | ||||||
|  |       else | ||||||
|  |         super | ||||||
|  |       end | ||||||
|  |     end | ||||||
|  |  | ||||||
|     def data |     def data | ||||||
|       load_blob! |       load_blob! | ||||||
|       @data |       @data | ||||||
| @@ -30,6 +58,12 @@ module Linguist | |||||||
|     end |     end | ||||||
|  |  | ||||||
|     protected |     protected | ||||||
|  |  | ||||||
|  |     # Returns true if the attribute is present and not the string "false". | ||||||
|  |     def boolean_attribute(attr) | ||||||
|  |       attr != "false" | ||||||
|  |     end | ||||||
|  |  | ||||||
|     def load_blob! |     def load_blob! | ||||||
|       @data, @size = Rugged::Blob.to_buffer(repository, oid, MAX_SIZE) if @data.nil? |       @data, @size = Rugged::Blob.to_buffer(repository, oid, MAX_SIZE) if @data.nil? | ||||||
|     end |     end | ||||||
|   | |||||||
| @@ -110,18 +110,37 @@ module Linguist | |||||||
|         if @old_commit_oid == @commit_oid |         if @old_commit_oid == @commit_oid | ||||||
|           @old_stats |           @old_stats | ||||||
|         else |         else | ||||||
|           compute_stats(@old_commit_oid, @commit_oid, @old_stats) |           compute_stats(@old_commit_oid, @old_stats) | ||||||
|         end |         end | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     protected |     def read_index | ||||||
|     def compute_stats(old_commit_oid, commit_oid, cache = nil) |       attr_index = Rugged::Index.new | ||||||
|       file_map = cache ? cache.dup : {} |       attr_index.read_tree(current_tree) | ||||||
|       old_tree = old_commit_oid && Rugged::Commit.lookup(repository, old_commit_oid).tree |       repository.index = attr_index | ||||||
|       new_tree = Rugged::Commit.lookup(repository, commit_oid).tree |     end | ||||||
|  |  | ||||||
|       diff = Rugged::Tree.diff(repository, old_tree, new_tree) |     def current_tree | ||||||
|  |       @tree ||= Rugged::Commit.lookup(repository, @commit_oid).tree | ||||||
|  |     end | ||||||
|  |  | ||||||
|  |     protected | ||||||
|  |  | ||||||
|  |     def compute_stats(old_commit_oid, cache = nil) | ||||||
|  |       old_tree = old_commit_oid && Rugged::Commit.lookup(repository, old_commit_oid).tree | ||||||
|  |  | ||||||
|  |       read_index | ||||||
|  |  | ||||||
|  |       diff = Rugged::Tree.diff(repository, old_tree, current_tree) | ||||||
|  |  | ||||||
|  |       # Clear file map and fetch full diff if any .gitattributes files are changed | ||||||
|  |       if cache && diff.each_delta.any? { |delta| File.basename(delta.new_file[:path]) == ".gitattributes" } | ||||||
|  |         diff = Rugged::Tree.diff(repository, old_tree = nil, current_tree) | ||||||
|  |         file_map = {} | ||||||
|  |       else | ||||||
|  |         file_map = cache ? cache.dup : {} | ||||||
|  |       end | ||||||
|  |  | ||||||
|       diff.each_delta do |delta| |       diff.each_delta do |delta| | ||||||
|         old = delta.old_file[:path] |         old = delta.old_file[:path] | ||||||
|   | |||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,11 +1,12 @@ | |||||||
| begin | begin | ||||||
|   require 'json' |   require 'yajl' | ||||||
| rescue LoadError | rescue LoadError | ||||||
|   require 'yaml' |   require 'yaml' | ||||||
| end | end | ||||||
|  |  | ||||||
| require 'linguist/md5' | require 'linguist/md5' | ||||||
| require 'linguist/classifier' | require 'linguist/classifier' | ||||||
|  | require 'linguist/shebang' | ||||||
|  |  | ||||||
| module Linguist | module Linguist | ||||||
|   # Model for accessing classifier training data. |   # Model for accessing classifier training data. | ||||||
| @@ -17,9 +18,11 @@ module Linguist | |||||||
|     PATH = File.expand_path('../samples.json', __FILE__) |     PATH = File.expand_path('../samples.json', __FILE__) | ||||||
|  |  | ||||||
|     # Hash of serialized samples object |     # Hash of serialized samples object | ||||||
|     if File.exist?(PATH) |     def self.cache | ||||||
|       serializer = defined?(JSON) ? JSON : YAML |       @cache ||= begin | ||||||
|       DATA = serializer.load(File.read(PATH)) |         serializer = defined?(Yajl) ? Yajl : YAML | ||||||
|  |         serializer.load(File.read(PATH)) | ||||||
|  |       end | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     # Public: Iterate over each sample. |     # Public: Iterate over each sample. | ||||||
| @@ -50,14 +53,16 @@ module Linguist | |||||||
|               }) |               }) | ||||||
|             end |             end | ||||||
|           else |           else | ||||||
|  |             path = File.join(dirname, filename) | ||||||
|  |  | ||||||
|             if File.extname(filename) == "" |             if File.extname(filename) == "" | ||||||
|               raise "#{File.join(dirname, filename)} is missing an extension, maybe it belongs in filenames/ subdir" |               raise "#{path} is missing an extension, maybe it belongs in filenames/ subdir" | ||||||
|             end |             end | ||||||
|  |  | ||||||
|             yield({ |             yield({ | ||||||
|               :path     => File.join(dirname, filename), |               :path     => path, | ||||||
|               :language => category, |               :language => category, | ||||||
|               :interpreter => File.exist?(filename) ? Linguist.interpreter_from_shebang(File.read(filename)) : nil, |               :interpreter => Shebang.interpreter(File.read(path)), | ||||||
|               :extname  => File.extname(filename) |               :extname  => File.extname(filename) | ||||||
|             }) |             }) | ||||||
|           end |           end | ||||||
| @@ -110,40 +115,4 @@ module Linguist | |||||||
|       db |       db | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
|  |  | ||||||
|   # Used to retrieve the interpreter from the shebang line of a file's |  | ||||||
|   # data. |  | ||||||
|   def self.interpreter_from_shebang(data) |  | ||||||
|     lines = data.lines.to_a |  | ||||||
|  |  | ||||||
|     if lines.any? && (match = lines[0].match(/(.+)\n?/)) && (bang = match[0]) =~ /^#!/ |  | ||||||
|       bang.sub!(/^#! /, '#!') |  | ||||||
|       tokens = bang.split(' ') |  | ||||||
|       pieces = tokens.first.split('/') |  | ||||||
|  |  | ||||||
|       if pieces.size > 1 |  | ||||||
|         script = pieces.last |  | ||||||
|       else |  | ||||||
|         script = pieces.first.sub('#!', '') |  | ||||||
|       end |  | ||||||
|  |  | ||||||
|       script = script == 'env' ? tokens[1] : script |  | ||||||
|  |  | ||||||
|       # "python2.6" -> "python" |  | ||||||
|       if script =~ /((?:\d+\.?)+)/ |  | ||||||
|         script.sub! $1, '' |  | ||||||
|       end |  | ||||||
|  |  | ||||||
|       # Check for multiline shebang hacks that call `exec` |  | ||||||
|       if script == 'sh' && |  | ||||||
|         lines[0...5].any? { |l| l.match(/exec (\w+).+\$0.+\$@/) } |  | ||||||
|         script = $1 |  | ||||||
|       end |  | ||||||
|  |  | ||||||
|       script |  | ||||||
|     else |  | ||||||
|       nil |  | ||||||
|     end |  | ||||||
|   end |  | ||||||
|  |  | ||||||
| end | end | ||||||
|   | |||||||
							
								
								
									
										44
									
								
								lib/linguist/shebang.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								lib/linguist/shebang.rb
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,44 @@ | |||||||
|  | module Linguist | ||||||
|  |   class Shebang | ||||||
|  |     # Public: Use shebang to detect language of the blob. | ||||||
|  |     # | ||||||
|  |     # blob               - An object that quacks like a blob. | ||||||
|  |     # | ||||||
|  |     # Examples | ||||||
|  |     # | ||||||
|  |     #   Shebang.call(FileBlob.new("path/to/file")) | ||||||
|  |     # | ||||||
|  |     # Returns an Array with one Language if the blob has a shebang with a valid | ||||||
|  |     # interpreter, or empty if there is no shebang. | ||||||
|  |     def self.call(blob, _ = nil) | ||||||
|  |       Language.find_by_interpreter interpreter(blob.data) | ||||||
|  |     end | ||||||
|  |  | ||||||
|  |     # Public: Get the interpreter from the shebang | ||||||
|  |     # | ||||||
|  |     # Returns a String or nil | ||||||
|  |     def self.interpreter(data) | ||||||
|  |       lines = data.lines | ||||||
|  |       return unless match = /^#! ?(.*)$/.match(lines.first) | ||||||
|  |  | ||||||
|  |       tokens = match[1].split(' ') | ||||||
|  |       script = tokens.first.split('/').last | ||||||
|  |  | ||||||
|  |       script = tokens[1] if script == 'env' | ||||||
|  |  | ||||||
|  |       # If script has an invalid shebang, we might get here | ||||||
|  |       return unless script | ||||||
|  |  | ||||||
|  |       # "python2.6" -> "python2" | ||||||
|  |       script.sub! $1, '' if script =~ /(\.\d+)$/ | ||||||
|  |  | ||||||
|  |       # Check for multiline shebang hacks that call `exec` | ||||||
|  |       if script == 'sh' && | ||||||
|  |         lines.first(5).any? { |l| l.match(/exec (\w+).+\$0.+\$@/) } | ||||||
|  |         script = $1 | ||||||
|  |       end | ||||||
|  |  | ||||||
|  |       File.basename(script) | ||||||
|  |     end | ||||||
|  |   end | ||||||
|  | end | ||||||
							
								
								
									
										20
									
								
								lib/linguist/strategy/filename.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								lib/linguist/strategy/filename.rb
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,20 @@ | |||||||
|  | module Linguist | ||||||
|  |   module Strategy | ||||||
|  |     # Detects language based on filename and/or extension | ||||||
|  |     class Filename | ||||||
|  |       def self.call(blob, _) | ||||||
|  |         name = blob.name.to_s | ||||||
|  |  | ||||||
|  |         # A bit of an elegant hack. If the file is executable but extensionless, | ||||||
|  |         # append a "magic" extension so it can be classified with other | ||||||
|  |         # languages that have shebang scripts. | ||||||
|  |         extensions = FileBlob.new(name).extensions | ||||||
|  |         if extensions.empty? && blob.mode && (blob.mode.to_i(8) & 05) == 05 | ||||||
|  |           name += ".script!" | ||||||
|  |         end | ||||||
|  |  | ||||||
|  |         Language.find_by_filename(name) | ||||||
|  |       end | ||||||
|  |     end | ||||||
|  |   end | ||||||
|  | end | ||||||
| @@ -33,15 +33,34 @@ | |||||||
| # Erlang bundles | # Erlang bundles | ||||||
| - ^rebar$ | - ^rebar$ | ||||||
|  |  | ||||||
| # Bootstrap minified css and js | # Go dependencies | ||||||
| - (^|/)bootstrap([^.]*)(\.min)?\.(js|css)$ | - Godeps/_workspace/ | ||||||
|  |  | ||||||
|  | # Minified JavaScript and CSS | ||||||
|  | - (\.|-)min\.(js|css)$ | ||||||
|  |  | ||||||
|  | # Bootstrap css and js | ||||||
|  | - (^|/)bootstrap([^.]*)\.(js|css)$ | ||||||
|  |  | ||||||
|  | # Font Awesome | ||||||
|  | - font-awesome.css | ||||||
|  |  | ||||||
| # Foundation css | # Foundation css | ||||||
| - foundation.min.css |  | ||||||
| - foundation.css | - foundation.css | ||||||
|  |  | ||||||
|  | # Normalize.css | ||||||
|  | - normalize.css | ||||||
|  |  | ||||||
|  | # Bourbon SCSS | ||||||
|  | - (^|/)[Bb]ourbon/.*\.css$ | ||||||
|  | - (^|/)[Bb]ourbon/.*\.scss$ | ||||||
|  |  | ||||||
|  | # Animate.css | ||||||
|  | - animate.css | ||||||
|  |  | ||||||
| # Vendored dependencies | # Vendored dependencies | ||||||
| - thirdparty/ | - third[-_]?party/ | ||||||
|  | - 3rd[-_]?party/ | ||||||
| - vendors?/ | - vendors?/ | ||||||
| - extern(al)?/ | - extern(al)?/ | ||||||
|  |  | ||||||
| @@ -54,12 +73,12 @@ | |||||||
| ## Commonly Bundled JavaScript frameworks ## | ## Commonly Bundled JavaScript frameworks ## | ||||||
|  |  | ||||||
| # jQuery | # jQuery | ||||||
| - (^|/)jquery([^.]*)(\.min)?\.js$ | - (^|/)jquery([^.]*)\.js$ | ||||||
| - (^|/)jquery\-\d\.\d+(\.\d+)?(\.min)?\.js$ | - (^|/)jquery\-\d\.\d+(\.\d+)?\.js$ | ||||||
|  |  | ||||||
| # jQuery UI | # jQuery UI | ||||||
| - (^|/)jquery\-ui(\-\d\.\d+(\.\d+)?)?(\.\w+)?(\.min)?\.(js|css)$ | - (^|/)jquery\-ui(\-\d\.\d+(\.\d+)?)?(\.\w+)?\.(js|css)$ | ||||||
| - (^|/)jquery\.(ui|effects)\.([^.]*)(\.min)?\.(js|css)$ | - (^|/)jquery\.(ui|effects)\.([^.]*)\.(js|css)$ | ||||||
|  |  | ||||||
| # Prototype | # Prototype | ||||||
| - (^|/)prototype(.*)\.js$ | - (^|/)prototype(.*)\.js$ | ||||||
| @@ -91,24 +110,33 @@ | |||||||
| # MathJax | # MathJax | ||||||
| - (^|/)MathJax/ | - (^|/)MathJax/ | ||||||
|  |  | ||||||
|  | # Chart.js | ||||||
|  | - (^|/)Chart\.js$ | ||||||
|  |  | ||||||
|  | # Codemirror | ||||||
|  | - (^|/)[Cc]ode[Mm]irror/(lib|mode|theme|addon|keymap) | ||||||
|  |  | ||||||
| # SyntaxHighlighter - http://alexgorbatchev.com/ | # SyntaxHighlighter - http://alexgorbatchev.com/ | ||||||
| - (^|/)shBrush([^.]*)\.js$ | - (^|/)shBrush([^.]*)\.js$ | ||||||
| - (^|/)shCore\.js$ | - (^|/)shCore\.js$ | ||||||
| - (^|/)shLegacy\.js$ | - (^|/)shLegacy\.js$ | ||||||
|  |  | ||||||
| # AngularJS | # AngularJS | ||||||
| - (^|/)angular([^.]*)(\.min)?\.js$ | - (^|/)angular([^.]*)\.js$ | ||||||
|  |  | ||||||
| # D3.js | # D3.js | ||||||
| - (^|\/)d3(\.v\d+)?([^.]*)(\.min)?\.js$ | - (^|\/)d3(\.v\d+)?([^.]*)\.js$ | ||||||
|  |  | ||||||
| # React | # React | ||||||
| - (^|/)react(-[^.]*)?(\.min)?\.js$ | - (^|/)react(-[^.]*)?\.js$ | ||||||
|  |  | ||||||
| # Modernizr | # Modernizr | ||||||
| - (^|/)modernizr\-\d\.\d+(\.\d+)?(\.min)?\.js$ | - (^|/)modernizr\-\d\.\d+(\.\d+)?\.js$ | ||||||
| - (^|/)modernizr\.custom\.\d+\.js$ | - (^|/)modernizr\.custom\.\d+\.js$ | ||||||
|  |  | ||||||
|  | # Knockout | ||||||
|  | - (^|/)knockout-(\d+\.){3}(debug\.)?js$ | ||||||
|  |  | ||||||
| ## Python ## | ## Python ## | ||||||
|  |  | ||||||
| # django | # django | ||||||
| @@ -125,6 +153,9 @@ | |||||||
|  |  | ||||||
| ## Obj-C ## | ## Obj-C ## | ||||||
|  |  | ||||||
|  | # Cocoapods | ||||||
|  | - ^Pods/ | ||||||
|  |  | ||||||
| # Sparkle | # Sparkle | ||||||
| - (^|/)Sparkle/ | - (^|/)Sparkle/ | ||||||
|  |  | ||||||
| @@ -142,8 +173,8 @@ | |||||||
| - \.intellisense\.js$ | - \.intellisense\.js$ | ||||||
|  |  | ||||||
| # jQuery validation plugin (MS bundles this with asp.net mvc) | # jQuery validation plugin (MS bundles this with asp.net mvc) | ||||||
| - (^|/)jquery([^.]*)\.validate(\.unobtrusive)?(\.min)?\.js$ | - (^|/)jquery([^.]*)\.validate(\.unobtrusive)?\.js$ | ||||||
| - (^|/)jquery([^.]*)\.unobtrusive\-ajax(\.min)?\.js$ | - (^|/)jquery([^.]*)\.unobtrusive\-ajax\.js$ | ||||||
|  |  | ||||||
| # Microsoft Ajax | # Microsoft Ajax | ||||||
| - (^|/)[Mm]icrosoft([Mm]vc)?([Aa]jax|[Vv]alidation)(\.debug)?\.js$ | - (^|/)[Mm]icrosoft([Mm]vc)?([Aa]jax|[Vv]alidation)(\.debug)?\.js$ | ||||||
| @@ -170,7 +201,7 @@ | |||||||
| - (^|/)extjs/welcome/ | - (^|/)extjs/welcome/ | ||||||
|  |  | ||||||
| # Html5shiv | # Html5shiv | ||||||
| - (^|/)html5shiv(\.min)?\.js$ | - (^|/)html5shiv\.js$ | ||||||
|  |  | ||||||
| # Samples folders | # Samples folders | ||||||
| - ^[Ss]amples/ | - ^[Ss]amples/ | ||||||
| @@ -189,8 +220,11 @@ | |||||||
| - ^[Tt]est/fixtures/ | - ^[Tt]est/fixtures/ | ||||||
|  |  | ||||||
| # PhoneGap/Cordova | # PhoneGap/Cordova | ||||||
| - (^|/)cordova([^.]*)(\.min)?\.js$ | - (^|/)cordova([^.]*)\.js$ | ||||||
| - (^|/)cordova\-\d\.\d(\.\d)?(\.min)?\.js$ | - (^|/)cordova\-\d\.\d(\.\d)?\.js$ | ||||||
|  |  | ||||||
|  | # Foundation js | ||||||
|  | - foundation(\..*)?\.js$ | ||||||
|  |  | ||||||
| # Vagrant | # Vagrant | ||||||
| - ^Vagrantfile$ | - ^Vagrantfile$ | ||||||
| @@ -198,14 +232,18 @@ | |||||||
| # .DS_Store's | # .DS_Store's | ||||||
| - .[Dd][Ss]_[Ss]tore$ | - .[Dd][Ss]_[Ss]tore$ | ||||||
|  |  | ||||||
| # Mercury --use-subdirs |  | ||||||
| - Mercury/ |  | ||||||
|  |  | ||||||
| # R packages | # R packages | ||||||
| - ^vignettes/ | - ^vignettes/ | ||||||
| - ^inst/extdata/ | - ^inst/extdata/ | ||||||
|  |  | ||||||
| # Octicons | # Octicons | ||||||
| - octicons.css | - octicons.css | ||||||
| - octicons.min.css |  | ||||||
| - sprockets-octicons.scss | - sprockets-octicons.scss | ||||||
|  |  | ||||||
|  | # Typesafe Activator | ||||||
|  | - (^|/)activator$ | ||||||
|  | - (^|/)activator\.bat$ | ||||||
|  |  | ||||||
|  | # ProGuard | ||||||
|  | - proguard.pro | ||||||
|  | - proguard-rules.pro | ||||||
|   | |||||||
| @@ -1,3 +1,3 @@ | |||||||
| module Linguist | module Linguist | ||||||
|   VERSION = "3.0.2" |   VERSION = "4.2.0" | ||||||
| end | end | ||||||
|   | |||||||
							
								
								
									
										6
									
								
								package.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								package.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | |||||||
|  | { | ||||||
|  |   "repository": "https://github.com/github/linguist", | ||||||
|  |   "dependencies": { | ||||||
|  |     "season": "~>3.0" | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										521
									
								
								samples/AGS Script/GlobalScript.asc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										521
									
								
								samples/AGS Script/GlobalScript.asc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,521 @@ | |||||||
|  | // main global script file | ||||||
|  |  | ||||||
|  | // A function that initializes a bunch of stuff. | ||||||
|  | function initialize_control_panel() {  | ||||||
|  |   // Centre the control panel | ||||||
|  |   gPanel.Centre();  | ||||||
|  |   // Centre the Restart dialog as well | ||||||
|  |   gRestartYN.Centre();  | ||||||
|  |   if (!IsSpeechVoxAvailable()) {  | ||||||
|  |     // If there is no speech-vox file, and therefore no speech, | ||||||
|  |     // disable all the controls related with speech. | ||||||
|  |     lblVoice.Visible = false;   | ||||||
|  |     btnVoice.Visible = false;   | ||||||
|  |     sldVoice.Visible = false; | ||||||
|  |   } | ||||||
|  |   else { | ||||||
|  |     // If there *is*, then set it to voice and text. It's best to use | ||||||
|  |     // both whenever possible, for the player's sake. | ||||||
|  |     SetVoiceMode(eSpeechVoiceAndText);  | ||||||
|  |     // And reflect this in the control panel. | ||||||
|  |     btnVoice.Text = "Voice and Text";  | ||||||
|  |   } | ||||||
|  |   if (!System.SupportsGammaControl) { | ||||||
|  |     // If we can't change the gamma settings, disable the relevant options. | ||||||
|  |     sldGamma.Visible = false;  | ||||||
|  |     lblGamma.Visible = false; | ||||||
|  |   }  | ||||||
|  |    | ||||||
|  |   //And now, set all the defaults | ||||||
|  |   System.Volume = 100; | ||||||
|  |   sldAudio.Value = System.Volume; | ||||||
|  |   SetGameSpeed(40); | ||||||
|  |   sldSpeed.Value = 40; | ||||||
|  |   if (IsSpeechVoxAvailable()) { | ||||||
|  |      SetVoiceMode(eSpeechVoiceAndText); | ||||||
|  |      btnVoice.Text = "Voice and Text"; | ||||||
|  |      sldVoice.Value = 255; | ||||||
|  |      SetSpeechVolume(255); | ||||||
|  |   } | ||||||
|  |   if (System.SupportsGammaControl) { | ||||||
|  |     System.Gamma = 100; | ||||||
|  |     sldGamma.Value = 100; | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Called when the game starts, before the first room is loaded | ||||||
|  | function game_start() {    | ||||||
|  |   // Put the code all in a function and then just call the function.  | ||||||
|  |   // It saves cluttering up places like game_start. | ||||||
|  |   initialize_control_panel();  | ||||||
|  |   // Use the KeyboardMovement module to, per default, replicate the standard | ||||||
|  |   // keyboard movement of most Sierra games. See KeyboardMovement.txt for more info | ||||||
|  |   KeyboardMovement.SetMode(eKeyboardMovement_Tapping);  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function repeatedly_execute() { | ||||||
|  |    | ||||||
|  |   // Put here anything you want to happen every game cycle, even when | ||||||
|  |   // the game is paused. This will not run when the game is blocked | ||||||
|  |   // inside a command like a blocking Walk() | ||||||
|  |    | ||||||
|  |   if (IsGamePaused() == 1) return; | ||||||
|  |  | ||||||
|  |   // Put here anything you want to happen every game cycle, but not | ||||||
|  |   // when the game is paused. | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function repeatedly_execute_always() { | ||||||
|  |    | ||||||
|  |   // Put anything you want to happen every game cycle, even | ||||||
|  |   // when the game is blocked inside a command like a | ||||||
|  |   // blocking Walk(). | ||||||
|  |   // You cannot run blocking commands from this function. | ||||||
|  |    | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function show_inventory_window ()  | ||||||
|  | { | ||||||
|  |   gInventory.Visible = true; | ||||||
|  |   // switch to the Use cursor (to select items with) | ||||||
|  |   mouse.Mode = eModeInteract; | ||||||
|  |   // But, override the appearance to look like the arrow | ||||||
|  |   mouse.UseModeGraphic(eModePointer); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function show_save_game_dialog() | ||||||
|  | { | ||||||
|  |   gSaveGame.Visible = true; | ||||||
|  |   // Get the list of save games | ||||||
|  |   lstSaveGamesList.FillSaveGameList(); | ||||||
|  |   if (lstSaveGamesList.ItemCount > 0) | ||||||
|  |   { | ||||||
|  |     // If there is at least one, set the default text | ||||||
|  |     // to be the first game's name | ||||||
|  |     txtNewSaveName.Text = lstSaveGamesList.Items[0]; | ||||||
|  |   } | ||||||
|  |   else | ||||||
|  |   { | ||||||
|  |     // No save games yet, default empty text. | ||||||
|  |     txtNewSaveName.Text = ""; | ||||||
|  |   } | ||||||
|  |   mouse.UseModeGraphic(eModePointer); | ||||||
|  |   gIconbar.Visible = false; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function show_restore_game_dialog() | ||||||
|  | { | ||||||
|  |   gRestoreGame.Visible = true; | ||||||
|  |   lstRestoreGamesList.FillSaveGameList(); | ||||||
|  |   mouse.UseModeGraphic(eModePointer); | ||||||
|  |   gIconbar.Visible = false; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function close_save_game_dialog() | ||||||
|  | { | ||||||
|  |   gSaveGame.Visible = false; | ||||||
|  |   mouse.UseDefaultGraphic(); | ||||||
|  |   gIconbar.Visible = true; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function close_restore_game_dialog() | ||||||
|  | { | ||||||
|  |   gRestoreGame.Visible = false; | ||||||
|  |   mouse.UseDefaultGraphic(); | ||||||
|  |   gIconbar.Visible = true; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Called when a key is pressed. keycode holds the key's ASCII code | ||||||
|  | function on_key_press(eKeyCode keycode) { | ||||||
|  |   // The following is called before "if game is paused keycode=0", so | ||||||
|  |   // it'll happen even when the game is paused. | ||||||
|  |    | ||||||
|  |   if ((keycode == eKeyEscape) && gRestartYN.Visible) { | ||||||
|  |     //Use ESC to cancel restart. | ||||||
|  |     gRestartYN.Visible = false;  | ||||||
|  |     gIconbar.Visible = true; | ||||||
|  |     // If the panel's not ON, then the player must have gotten here by tapping F9, | ||||||
|  |     // therefore his cursor needs restoring. If the panel IS on, then it doesn't, | ||||||
|  |     // because it's already a pointer. Get used to thinking like this!! | ||||||
|  |     if (!gPanel.Visible) mouse.UseDefaultGraphic();  | ||||||
|  |     return; | ||||||
|  |   } | ||||||
|  |   if ((keycode == eKeyEscape) && gPanel.Visible) { | ||||||
|  |     // Use ESC to turn the panel off. | ||||||
|  |     gPanel.Visible = false;  | ||||||
|  |     mouse.UseDefaultGraphic(); | ||||||
|  |     gIconbar.Visible = true; | ||||||
|  |     return; | ||||||
|  |   } | ||||||
|  |   if ((keycode == eKeyEscape) && (gSaveGame.Visible)) | ||||||
|  |   { | ||||||
|  |     // Use ESC to close the save game dialog | ||||||
|  |     close_save_game_dialog(); | ||||||
|  |     return; | ||||||
|  |   } | ||||||
|  |   if ((keycode == eKeyEscape) && (gRestoreGame.Visible)) | ||||||
|  |   { | ||||||
|  |     // Use ESC to close the restore game dialog | ||||||
|  |     close_restore_game_dialog(); | ||||||
|  |     return; | ||||||
|  |   } | ||||||
|  |    | ||||||
|  |   if (keycode == eKeyReturn) {  | ||||||
|  |     // ENTER, in this case merely confirms restart | ||||||
|  |     if (gRestartYN.Visible) RestartGame(); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   if (IsGamePaused() || (IsInterfaceEnabled() == 0)) | ||||||
|  |   { | ||||||
|  |     // If the game is paused with a modal GUI on the | ||||||
|  |     // screen, or the player interface is disabled in | ||||||
|  |     // a cut scene, ignore any keypresses. | ||||||
|  |     return; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   // FUNCTION KEYS AND SYSTEM SHORTCUTS | ||||||
|  |   if (keycode == eKeyEscape) { | ||||||
|  |     // ESC | ||||||
|  |     gPanel.Visible = true;  | ||||||
|  |     gIconbar.Visible = false; | ||||||
|  |     mouse.UseModeGraphic(eModePointer); | ||||||
|  |   } | ||||||
|  |   if (keycode == eKeyCtrlQ)  QuitGame(1);   // Ctrl-Q | ||||||
|  |   if (keycode == eKeyF5) show_save_game_dialog();   // F5 | ||||||
|  |   if (keycode == eKeyF7) show_restore_game_dialog();  // F7 | ||||||
|  |   if (keycode == eKeyF9) { | ||||||
|  |     // F9, asks the player to confirm restarting (so much better to always confirm first) | ||||||
|  |     gRestartYN.Visible = true;   | ||||||
|  |     gIconbar.Visible = false; | ||||||
|  |     mouse.UseModeGraphic(eModePointer); | ||||||
|  |   } | ||||||
|  |   if (keycode == eKeyF12) SaveScreenShot("scrnshot.bmp");  // F12 | ||||||
|  |   if (keycode == eKeyTab)   show_inventory_window();  // Tab, show inventory | ||||||
|  |  | ||||||
|  |   // GAME COMMAND SHORTCUTS | ||||||
|  |   if (keycode == 'W') mouse.Mode=eModeWalkto; //Notice this alternate way to indicate keycodes. | ||||||
|  |   if (keycode == 'L') mouse.Mode=eModeLookat; //Note that all we do here is set modes. | ||||||
|  |   if (keycode == 'U') mouse.Mode=eModeInteract; //If you want something else to happen, such as GUI buttons highlighting, | ||||||
|  |   if (keycode == 'T') mouse.Mode=eModeTalkto; //you'll need some more scripting done. | ||||||
|  |   if (keycode == 'I') mouse.Mode=eModeUseinv; //But this will, as-is, give you some standard keyboard shortcuts your players will very much appreciate. | ||||||
|  |  | ||||||
|  |   // For extra cursor modes, such as pick up, feel free to add as you will. | ||||||
|  |   // Uncomment the line below if you use the "Pick Up" mode. | ||||||
|  |   //if (keycode == 'P' || keycode == 'G') mouse.Mode=eModePickup;  | ||||||
|  |  | ||||||
|  |   // DEBUG FUNCTIONS | ||||||
|  |   if (keycode == eKeyCtrlS)  Debug(0,0);  // Ctrl-S, give all inventory | ||||||
|  |   if (keycode == eKeyCtrlV)  Debug(1,0);  // Ctrl-V, version | ||||||
|  |   if (keycode == eKeyCtrlA)  Debug(2,0);  // Ctrl-A, show walkable areas | ||||||
|  |   if (keycode == eKeyCtrlX)  Debug(3,0);  // Ctrl-X, teleport to room | ||||||
|  |   if (keycode == eKeyCtrlW && game.debug_mode)  | ||||||
|  |     player.PlaceOnWalkableArea(); //Ctrl-W, move to walkable area  | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | function on_mouse_click(MouseButton button) { | ||||||
|  |   // called when a mouse button is clicked. button is either LEFT or RIGHT | ||||||
|  |   if (IsGamePaused() == 1) { | ||||||
|  |     // Game is paused, so do nothing (ie. don't allow mouse click) | ||||||
|  |   } | ||||||
|  |   else if (button == eMouseLeft) { | ||||||
|  |     ProcessClick(mouse.x, mouse.y, mouse.Mode ); | ||||||
|  |   } | ||||||
|  |   else if (button == eMouseRight || button == eMouseWheelSouth){ | ||||||
|  |     // right-click our mouse-wheel down, so cycle cursor | ||||||
|  |     mouse.SelectNextMode(); | ||||||
|  |   } | ||||||
|  |   else if (button == eMouseMiddle) {  | ||||||
|  |     // Middle-button-click, default make character walk to clicked area (a little shortcut) | ||||||
|  |     // Could have been just "player.Walk(mouse.x,mouse.y)", but it's best to | ||||||
|  |     // leave our options open - what if you have a special script triggered | ||||||
|  |     // on "walking" mode? | ||||||
|  |     ProcessClick(mouse.x, mouse.y, eModeWalkto);  | ||||||
|  |   } | ||||||
|  |   else if (button == eMouseWheelNorth) {  | ||||||
|  |     // Mouse-wheel up, cycle cursors  | ||||||
|  |     // If mode isn't WALK, set the previous mode (notice usage of numbers instead | ||||||
|  |     // of eNums, when it suits us)... | ||||||
|  |     if (mouse.Mode>0) mouse.Mode=mouse.Mode-1;  | ||||||
|  |     else  | ||||||
|  |     {  | ||||||
|  |       // ...but if it is WALK mode... | ||||||
|  |       if (player.ActiveInventory!=null)  | ||||||
|  |       { | ||||||
|  |         //...and the player has a selected inventory item, set mouse mode to UseInv.  | ||||||
|  |         mouse.Mode=eModeUseinv;  | ||||||
|  |       } | ||||||
|  |       else  | ||||||
|  |       { | ||||||
|  |         // If they don't, however, just set it to mode TALK (change this line if you add more cursor modes) | ||||||
|  |         mouse.Mode=eModeTalkto;  | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function interface_click(int interface, int button) { | ||||||
|  |   // This function is obsolete, from 2.62 and earlier versions. | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function btnInvUp_Click(GUIControl *control, MouseButton button) { | ||||||
|  |   invCustomInv.ScrollUp(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function btnInvDown_Click(GUIControl *control, MouseButton button) { | ||||||
|  |   invCustomInv.ScrollDown(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function btnInvOK_Click(GUIControl *control, MouseButton button) { | ||||||
|  | 	// They pressed the OK button, close the GUI | ||||||
|  | 	gInventory.Visible = false; | ||||||
|  | 	mouse.UseDefaultGraphic(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function btnInvSelect_Click(GUIControl *control, MouseButton button) { | ||||||
|  |    | ||||||
|  | 	// They pressed SELECT, so switch to the Get cursor | ||||||
|  | 	mouse.Mode = eModeInteract; | ||||||
|  | 	// But, override the appearance to look like the arrow | ||||||
|  | 	mouse.UseModeGraphic(eModePointer); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function btnIconInv_Click(GUIControl *control, MouseButton button) { | ||||||
|  |    | ||||||
|  |   show_inventory_window(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function btnIconCurInv_Click(GUIControl *control, MouseButton button) { | ||||||
|  |    | ||||||
|  |   if (player.ActiveInventory != null) | ||||||
|  |     mouse.Mode = eModeUseinv; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function btnIconSave_Click(GUIControl *control, MouseButton button)  | ||||||
|  | { | ||||||
|  |   show_save_game_dialog(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function btnIconLoad_Click(GUIControl *control, MouseButton button)  | ||||||
|  | { | ||||||
|  |   show_restore_game_dialog(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function btnIconExit_Click(GUIControl *control, MouseButton button) { | ||||||
|  |    | ||||||
|  |   QuitGame(1); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function btnIconAbout_Click(GUIControl *control, MouseButton button) { | ||||||
|  |    | ||||||
|  |   gPanel.Visible=true; | ||||||
|  |   gIconbar.Visible=false; | ||||||
|  |   mouse.UseModeGraphic(eModePointer); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function cEgo_Look() | ||||||
|  | { | ||||||
|  |   Display("Damn, I'm looking good!"); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function cEgo_Interact() | ||||||
|  | { | ||||||
|  |   Display("You rub your hands up and down your clothes."); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function cEgo_Talk() | ||||||
|  | { | ||||||
|  |   Display("Talking to yourself is a sign of madness!"); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | //START OF CONTROL PANEL FUNCTIONS | ||||||
|  | function btnSave_OnClick(GUIControl *control, MouseButton button) | ||||||
|  | { | ||||||
|  |   gPanel.Visible = false; | ||||||
|  |   mouse.UseDefaultGraphic(); | ||||||
|  |   gIconbar.Visible = true; | ||||||
|  |   Wait(1); | ||||||
|  |   btnIconSave_Click(btnIconSave, eMouseLeft); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function gControl_OnClick(GUI *theGui, MouseButton button) | ||||||
|  | { | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function btnAbout_OnClick(GUIControl *control, MouseButton button) | ||||||
|  | { | ||||||
|  | Display("Adventure Game Studio run-time engine default game."); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function btnQuit_OnClick(GUIControl *control, MouseButton button) | ||||||
|  | { | ||||||
|  |   gPanel.Visible = false; | ||||||
|  |   Wait(1); | ||||||
|  |   QuitGame(1); | ||||||
|  |   gPanel.Visible = true; | ||||||
|  |   gIconbar.Visible = false; | ||||||
|  |   mouse.UseModeGraphic(eModePointer); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function btnLoad_OnClick(GUIControl *control, MouseButton button) | ||||||
|  | { | ||||||
|  |   gPanel.Visible = false; | ||||||
|  |   mouse.UseDefaultGraphic(); | ||||||
|  |   gIconbar.Visible = true; | ||||||
|  |   Wait(1); | ||||||
|  |   btnIconLoad_Click(btnIconLoad, eMouseLeft); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function btnResume_OnClick(GUIControl *control, MouseButton button) | ||||||
|  | { | ||||||
|  |   gPanel.Visible = false; | ||||||
|  |   mouse.UseDefaultGraphic(); | ||||||
|  |   gIconbar.Visible = true; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function sldAudio_OnChange(GUIControl *control) | ||||||
|  | { | ||||||
|  |   System.Volume = sldAudio.Value; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function sldVoice_OnChange(GUIControl *control) | ||||||
|  | { | ||||||
|  |   // Sets voice volume. Note that we don't check for the existence of speech.vox -  | ||||||
|  |   // we did that in game_start, so if it's not there the slider won't even be available. | ||||||
|  |   SetSpeechVolume(sldVoice.Value);  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function btnVoice_OnClick(GUIControl *control, MouseButton button) | ||||||
|  | { | ||||||
|  |   // Note that we don't check for the existence of speech.vox - we did that in game_start, | ||||||
|  |   // so if it's not there the button won't even be available. | ||||||
|  |   if (btnVoice.Text == "Voice and Text") {  | ||||||
|  |     SetVoiceMode(eSpeechVoiceOnly);  | ||||||
|  |     btnVoice.Text = "Voice only"; | ||||||
|  |   } | ||||||
|  |   else if (btnVoice.Text == "Voice only") { | ||||||
|  |     SetVoiceMode(eSpeechTextOnly); | ||||||
|  |     btnVoice.Text = "Text only"; | ||||||
|  |   } | ||||||
|  |   else if (btnVoice.Text == "Text only") { | ||||||
|  |     SetVoiceMode(eSpeechVoiceAndText); | ||||||
|  |     btnVoice.Text = "Voice and Text"; | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function sldGamma_OnChange(GUIControl *control) | ||||||
|  | { | ||||||
|  |   // Set the gamma. Note there's no need to check for anything else, as we ensured, | ||||||
|  |   // in game_start, that the slider won't even appear if it's not possible to do this. | ||||||
|  |   System.Gamma = sldGamma.Value;  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function btnDefault_OnClick(GUIControl *control, MouseButton button) | ||||||
|  | { | ||||||
|  |   // Reset everything to default. You'll have to edit these as well as the sliders | ||||||
|  |   // if you'd rather have different default parameters. | ||||||
|  |   System.Volume = 100; | ||||||
|  |   sldAudio.Value = System.Volume; | ||||||
|  |   sldSpeed.Value = 40; | ||||||
|  |   SetGameSpeed(40); | ||||||
|  |   if (IsSpeechVoxAvailable()) { | ||||||
|  |      SetVoiceMode(eSpeechVoiceAndText); | ||||||
|  |      btnVoice.Text = "Voice and Text"; | ||||||
|  |      sldVoice.Value = 255; | ||||||
|  |      SetSpeechVolume(255); | ||||||
|  |   } | ||||||
|  |   if (System.SupportsGammaControl) { | ||||||
|  |     System.Gamma = 100; | ||||||
|  |     sldGamma.Value = 100; | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | //END OF CONTROL PANEL FUNCTIONS | ||||||
|  |  | ||||||
|  | function dialog_request(int param)  | ||||||
|  | { | ||||||
|  |   // This is used by the dialog text parser if you need to process | ||||||
|  |   // text that the player types in to the parser. | ||||||
|  |   // It is not used by default. | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function sldSpeed_OnChange(GUIControl *control) | ||||||
|  | { | ||||||
|  |   SetGameSpeed(sldSpeed.Value); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function btnRestart_OnClick(GUIControl *control, MouseButton button) | ||||||
|  | { | ||||||
|  |   gRestartYN.Visible=true; | ||||||
|  |   gIconbar.Visible=false; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function btnRestartYes_OnClick(GUIControl *control, MouseButton button) | ||||||
|  | { | ||||||
|  |   RestartGame(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function btnRestartNo_OnClick(GUIControl *control, MouseButton button) | ||||||
|  | { | ||||||
|  |   gRestartYN.Visible = false; | ||||||
|  |   gIconbar.Visible = true; | ||||||
|  |   // If the panel's not ON, then the player must have gotten here by tapping F9, | ||||||
|  |   // therefore his cursor needs restoring. If the panel IS on, then it doesn't, | ||||||
|  |   // because it's already a pointer. Get used to thinking like this!! | ||||||
|  |   if (!gPanel.Visible) mouse.UseDefaultGraphic();  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function btnCancelSave_OnClick(GUIControl *control, MouseButton button) | ||||||
|  | { | ||||||
|  |   close_save_game_dialog(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function btnSaveGame_OnClick(GUIControl *control, MouseButton button) | ||||||
|  | { | ||||||
|  |   int gameSlotToSaveInto = lstSaveGamesList.ItemCount + 1; | ||||||
|  |   int i = 0; | ||||||
|  |   while (i < lstSaveGamesList.ItemCount) | ||||||
|  |   { | ||||||
|  |     if (lstSaveGamesList.Items[i] == txtNewSaveName.Text) | ||||||
|  |     { | ||||||
|  |       gameSlotToSaveInto = lstSaveGamesList.SaveGameSlots[i]; | ||||||
|  |     } | ||||||
|  |     i++; | ||||||
|  |   } | ||||||
|  |   SaveGameSlot(gameSlotToSaveInto, txtNewSaveName.Text); | ||||||
|  |   close_save_game_dialog(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function btnCancelRestore_OnClick(GUIControl *control, MouseButton button) | ||||||
|  | { | ||||||
|  |   close_restore_game_dialog(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function btnRestoreGame_OnClick(GUIControl *control, MouseButton button) | ||||||
|  | { | ||||||
|  |   if (lstRestoreGamesList.SelectedIndex >= 0) | ||||||
|  |   { | ||||||
|  |     RestoreGameSlot(lstRestoreGamesList.SaveGameSlots[lstRestoreGamesList.SelectedIndex]); | ||||||
|  |   } | ||||||
|  |   close_restore_game_dialog(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function lstSaveGamesList_OnSelectionCh(GUIControl *control) | ||||||
|  | { | ||||||
|  |   txtNewSaveName.Text = lstSaveGamesList.Items[lstSaveGamesList.SelectedIndex]; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function txtNewSaveName_OnActivate(GUIControl *control) | ||||||
|  | { | ||||||
|  |   // Pressing return in the text box simulates clicking the Save button | ||||||
|  |   btnSaveGame_OnClick(control, eMouseLeft); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function btnDeleteSave_OnClick(GUIControl *control, MouseButton button) | ||||||
|  | { | ||||||
|  |   if (lstSaveGamesList.SelectedIndex >= 0) | ||||||
|  |   { | ||||||
|  |     DeleteSaveSlot(lstSaveGamesList.SaveGameSlots[lstSaveGamesList.SelectedIndex]); | ||||||
|  |     lstSaveGamesList.FillSaveGameList(); | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										4
									
								
								samples/AGS Script/GlobalScript.ash
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								samples/AGS Script/GlobalScript.ash
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,4 @@ | |||||||
|  | // Main header script - this will be included into every script in | ||||||
|  | // the game (local and global). Do not place functions here; rather, | ||||||
|  | // place import definitions and #define names here to be used by all | ||||||
|  | // scripts. | ||||||
							
								
								
									
										216
									
								
								samples/AGS Script/KeyboardMovement_102.asc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										216
									
								
								samples/AGS Script/KeyboardMovement_102.asc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,216 @@ | |||||||
|  | // Main script for module 'KeyboardMovement' | ||||||
|  |  | ||||||
|  | //**************************************************************************************************** | ||||||
|  | // DEFINITIONS | ||||||
|  | //**************************************************************************************************** | ||||||
|  |  | ||||||
|  | #define DISTANCE 10000// distance player walks in Tapping mode before he stops | ||||||
|  |  | ||||||
|  | enum KeyboardMovement_Directions { | ||||||
|  | 	eKeyboardMovement_Stop,  | ||||||
|  | 	eKeyboardMovement_DownLeft,  | ||||||
|  | 	eKeyboardMovement_Down,  | ||||||
|  | 	eKeyboardMovement_DownRight,  | ||||||
|  | 	eKeyboardMovement_Left,  | ||||||
|  | 	eKeyboardMovement_Right,  | ||||||
|  | 	eKeyboardMovement_UpLeft,  | ||||||
|  | 	eKeyboardMovement_Up,  | ||||||
|  | 	eKeyboardMovement_UpRight | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | //**************************************************************************************************** | ||||||
|  | // VARIABLES | ||||||
|  | //**************************************************************************************************** | ||||||
|  |  | ||||||
|  | // keycodes as variables for future key customization functions (static variables?): | ||||||
|  | int KeyboardMovement_KeyDown = 380; // down arrow | ||||||
|  | int KeyboardMovement_KeyLeft = 375; // left arrow | ||||||
|  | int KeyboardMovement_KeyRight = 377; // right arrow | ||||||
|  | int KeyboardMovement_KeyUp = 372; // up arrow | ||||||
|  | int KeyboardMovement_KeyDownRight = 381; // PgDn (numpad) | ||||||
|  | int KeyboardMovement_KeyUpRight = 373; // PgUp (numpad) | ||||||
|  | int KeyboardMovement_KeyDownLeft = 379; // End (numpad) | ||||||
|  | int KeyboardMovement_KeyUpLeft = 371; // Home (numpad) | ||||||
|  | int KeyboardMovement_KeyStop = 376; // 5 (numpad) | ||||||
|  |  | ||||||
|  | KeyboardMovement_Modes KeyboardMovement_Mode = eKeyboardMovement_None; // stores current keyboard control mode (disabled by default) | ||||||
|  |  | ||||||
|  | KeyboardMovement_Directions KeyboardMovement_CurrentDirection = eKeyboardMovement_Stop; // stores current walking direction of player character | ||||||
|  |  | ||||||
|  | //**************************************************************************************************** | ||||||
|  | // USER FUNCTIONS | ||||||
|  | //**************************************************************************************************** | ||||||
|  |  | ||||||
|  | //==================================================================================================== | ||||||
|  |  | ||||||
|  | static function KeyboardMovement::SetMode(KeyboardMovement_Modes mode) { | ||||||
|  | 	KeyboardMovement_Mode = mode; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | //==================================================================================================== | ||||||
|  |  | ||||||
|  | // key customization functions here | ||||||
|  |  | ||||||
|  | //==================================================================================================== | ||||||
|  |  | ||||||
|  | //**************************************************************************************************** | ||||||
|  | // EVENT HANDLER FUNCTIONS | ||||||
|  | //**************************************************************************************************** | ||||||
|  |  | ||||||
|  | //==================================================================================================== | ||||||
|  |  | ||||||
|  | function repeatedly_execute() { | ||||||
|  |  | ||||||
|  | 	//-------------------------------------------------- | ||||||
|  | 	// Pressing mode | ||||||
|  | 	//-------------------------------------------------- | ||||||
|  |  | ||||||
|  | 	if ((IsGamePaused() == true) || (KeyboardMovement_Mode != eKeyboardMovement_Pressing) || (IsInterfaceEnabled() == false) || (player.on == false)) return 0; | ||||||
|  | 	  // if game is paused, module or mode disabled, interface disabled or player character hidden, quit function | ||||||
|  |  | ||||||
|  | 	KeyboardMovement_Directions newdirection; // declare variable storing new direction | ||||||
|  |  | ||||||
|  | 	// get new direction: | ||||||
|  | 	if ( ((IsKeyPressed(KeyboardMovement_KeyDown)) && (IsKeyPressed(KeyboardMovement_KeyRight))) || (IsKeyPressed(KeyboardMovement_KeyDownRight)) ) newdirection = eKeyboardMovement_DownRight; // if down&right arrows or PgDn (numeric pad) held down, set new direction to Down-Right | ||||||
|  | 	else if ( ((IsKeyPressed(KeyboardMovement_KeyUp)) && (IsKeyPressed(KeyboardMovement_KeyRight))) || (IsKeyPressed(KeyboardMovement_KeyUpRight)) ) newdirection = eKeyboardMovement_UpRight; // up&right arrows or PgUp (numpad) | ||||||
|  | 	else if ( ((IsKeyPressed(KeyboardMovement_KeyDown)) && (IsKeyPressed(KeyboardMovement_KeyLeft))) || (IsKeyPressed(KeyboardMovement_KeyDownLeft)) ) newdirection = eKeyboardMovement_DownLeft; // down&left arrows or End (numpad) | ||||||
|  | 	else if ( ((IsKeyPressed(KeyboardMovement_KeyUp)) && (IsKeyPressed(KeyboardMovement_KeyLeft))) || (IsKeyPressed(KeyboardMovement_KeyUpLeft)) ) newdirection = eKeyboardMovement_UpLeft; // up&left arrows or Home (numpad) | ||||||
|  | 	else if (IsKeyPressed(KeyboardMovement_KeyDown)) newdirection = eKeyboardMovement_Down; // down arrow | ||||||
|  | 	else if (IsKeyPressed(KeyboardMovement_KeyLeft)) newdirection = eKeyboardMovement_Left; // left arrow | ||||||
|  | 	else if (IsKeyPressed(KeyboardMovement_KeyRight)) newdirection = eKeyboardMovement_Right; // right arrow | ||||||
|  | 	else if (IsKeyPressed(KeyboardMovement_KeyUp)) newdirection = eKeyboardMovement_Up; // up arrow | ||||||
|  | 	else newdirection = eKeyboardMovement_Stop; // if none of the above held down, set it to stop player character | ||||||
|  |  | ||||||
|  | 	if (IsKeyPressed(KeyboardMovement_KeyStop)) newdirection = eKeyboardMovement_Stop; // if 5 (numeric pad) held down, stop player character, regardless of whether some of the above are held down | ||||||
|  |  | ||||||
|  | 	if (newdirection != KeyboardMovement_CurrentDirection) { // if new direction is different from current direction | ||||||
|  |  | ||||||
|  | 		if (newdirection == eKeyboardMovement_Stop) player.StopMoving(); // if new direction is the Stop command, stop movement of player character | ||||||
|  | 		else { // if new direction is NOT the Stop command | ||||||
|  |  | ||||||
|  | 			int dx, dy; // declare variables storing new walk coordinates | ||||||
|  | 			if (newdirection == eKeyboardMovement_DownRight) { | ||||||
|  | 				dx = DISTANCE; | ||||||
|  | 				dy = DISTANCE; | ||||||
|  | 			} | ||||||
|  | 			else if (newdirection == eKeyboardMovement_UpRight) { | ||||||
|  | 				dx = DISTANCE; | ||||||
|  | 				dy = -DISTANCE; | ||||||
|  | 			} | ||||||
|  | 			else if (newdirection == eKeyboardMovement_DownLeft) { | ||||||
|  | 				dx = -DISTANCE; | ||||||
|  | 				dy = DISTANCE; | ||||||
|  | 			} | ||||||
|  | 			else if (newdirection == eKeyboardMovement_UpLeft) { | ||||||
|  | 				dx = -DISTANCE; | ||||||
|  | 				dy = -DISTANCE; | ||||||
|  | 			} | ||||||
|  | 			else if (newdirection == eKeyboardMovement_Down) { | ||||||
|  | 				dx = 0; | ||||||
|  | 				dy = DISTANCE; | ||||||
|  | 			} | ||||||
|  | 			else if (newdirection == eKeyboardMovement_Left) { | ||||||
|  | 				dx = -DISTANCE; | ||||||
|  | 				dy = 0; | ||||||
|  | 			} | ||||||
|  | 			else if (newdirection == eKeyboardMovement_Right) { | ||||||
|  | 				dx = DISTANCE; | ||||||
|  | 				dy = 0; | ||||||
|  | 			} | ||||||
|  | 			else if (newdirection == eKeyboardMovement_Up) { | ||||||
|  | 				dx = 0; | ||||||
|  | 				dy = -DISTANCE; | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			player.WalkStraight(player.x + dx, player.y + dy, eNoBlock); // walk player character to the new coordinates | ||||||
|  | 		} | ||||||
|  | 		KeyboardMovement_CurrentDirection = newdirection; // update current direction to new direction | ||||||
|  |  | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | //==================================================================================================== | ||||||
|  |  | ||||||
|  | function on_key_press(int keycode) { | ||||||
|  |  | ||||||
|  | 	//-------------------------------------------------- | ||||||
|  | 	// Tapping mode | ||||||
|  | 	//-------------------------------------------------- | ||||||
|  |  | ||||||
|  | 	if ((IsGamePaused() == true) || (KeyboardMovement_Mode != eKeyboardMovement_Tapping) || (IsInterfaceEnabled() == false) || (player.on == false)) return 0; | ||||||
|  | 	  // if game is paused, module or mode disabled, interface disabled or player character hidden, quit function | ||||||
|  |  | ||||||
|  | 	KeyboardMovement_Directions newdirection; // declare variable storing new direction | ||||||
|  |  | ||||||
|  | 	// get new direction: | ||||||
|  | 	if (keycode == KeyboardMovement_KeyDownRight) newdirection = eKeyboardMovement_DownRight; // if down-right key pressed, set new direction to Down-Right | ||||||
|  | 	else if (keycode == KeyboardMovement_KeyUpRight) newdirection = eKeyboardMovement_UpRight; | ||||||
|  | 	else if (keycode == KeyboardMovement_KeyDownLeft) newdirection = eKeyboardMovement_DownLeft; | ||||||
|  | 	else if (keycode == KeyboardMovement_KeyUpLeft) newdirection = eKeyboardMovement_UpLeft; | ||||||
|  | 	else if (keycode == KeyboardMovement_KeyDown) newdirection = eKeyboardMovement_Down; | ||||||
|  | 	else if (keycode == KeyboardMovement_KeyLeft) newdirection = eKeyboardMovement_Left; | ||||||
|  | 	else if (keycode == KeyboardMovement_KeyRight) newdirection = eKeyboardMovement_Right; | ||||||
|  | 	else if (keycode == KeyboardMovement_KeyUp) newdirection = eKeyboardMovement_Up; | ||||||
|  | 	else if (keycode == KeyboardMovement_KeyStop) newdirection = eKeyboardMovement_Stop; // if stop key pressed, set to stop player character | ||||||
|  |  | ||||||
|  | 	if (newdirection != KeyboardMovement_CurrentDirection) { // if new direction is different from current direction | ||||||
|  |  | ||||||
|  | 		if (newdirection == eKeyboardMovement_Stop) player.StopMoving(); // if new direction is the Stop command, stop movement of player character | ||||||
|  | 		else { // if new direction is NOT the Stop command | ||||||
|  |  | ||||||
|  | 			int dx, dy; // declare variables storing new walk coordinates | ||||||
|  | 			if (newdirection == eKeyboardMovement_DownRight) { | ||||||
|  | 				dx = DISTANCE; | ||||||
|  | 				dy = DISTANCE; | ||||||
|  | 			} | ||||||
|  | 			else if (newdirection == eKeyboardMovement_UpRight) { | ||||||
|  | 				dx = DISTANCE; | ||||||
|  | 				dy = -DISTANCE; | ||||||
|  | 			} | ||||||
|  | 			else if (newdirection == eKeyboardMovement_DownLeft) { | ||||||
|  | 				dx = -DISTANCE; | ||||||
|  | 				dy = DISTANCE; | ||||||
|  | 			} | ||||||
|  | 			else if (newdirection == eKeyboardMovement_UpLeft) { | ||||||
|  | 				dx = -DISTANCE; | ||||||
|  | 				dy = -DISTANCE; | ||||||
|  | 			} | ||||||
|  | 			else if (newdirection == eKeyboardMovement_Down) { | ||||||
|  | 				dx = 0; | ||||||
|  | 				dy = DISTANCE; | ||||||
|  | 			} | ||||||
|  | 			else if (newdirection == eKeyboardMovement_Left) { | ||||||
|  | 				dx = -DISTANCE; | ||||||
|  | 				dy = 0; | ||||||
|  | 			} | ||||||
|  | 			else if (newdirection == eKeyboardMovement_Right) { | ||||||
|  | 				dx = DISTANCE; | ||||||
|  | 				dy = 0; | ||||||
|  | 			} | ||||||
|  | 			else if (newdirection == eKeyboardMovement_Up) { | ||||||
|  | 				dx = 0; | ||||||
|  | 				dy = -DISTANCE; | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			player.WalkStraight(player.x + dx, player.y + dy, eNoBlock); // walk player character to the new coordinates | ||||||
|  | 		} | ||||||
|  | 		KeyboardMovement_CurrentDirection = newdirection; // update current direction to new direction | ||||||
|  |  | ||||||
|  | 	} | ||||||
|  | 	else { // if new direction is same as current direction | ||||||
|  | 		player.StopMoving(); // stop player character | ||||||
|  | 		KeyboardMovement_CurrentDirection = eKeyboardMovement_Stop; // update current direction | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | //==================================================================================================== | ||||||
|  |  | ||||||
|  | function on_event(EventType event, int data) { | ||||||
|  |  | ||||||
|  | 	if (event == eEventLeaveRoom) KeyboardMovement_CurrentDirection = eKeyboardMovement_Stop; | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | //==================================================================================================== | ||||||
							
								
								
									
										13
									
								
								samples/AGS Script/KeyboardMovement_102.ash
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								samples/AGS Script/KeyboardMovement_102.ash
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | |||||||
|  | // Script header for module 'KeyboardMovement' | ||||||
|  |  | ||||||
|  | #define KeyboardMovement_VERSION 101 | ||||||
|  |  | ||||||
|  | enum KeyboardMovement_Modes { | ||||||
|  | 	eKeyboardMovement_None,  | ||||||
|  | 	eKeyboardMovement_Tapping,  | ||||||
|  | 	eKeyboardMovement_Pressing | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | struct KeyboardMovement { | ||||||
|  | 	import static function SetMode(KeyboardMovement_Modes mode); | ||||||
|  | }; | ||||||
							
								
								
									
										18
									
								
								samples/APL/DeepakChopra.apl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								samples/APL/DeepakChopra.apl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,18 @@ | |||||||
|  | ⍝   You can try this at http://tryapl.org/ | ||||||
|  | ⍝   I can not explain how much I suddenly love this crypto-language | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Starts     ← 'Experiential truth ' 'The physical world ' 'Non-judgment '       'Quantum physics ' | ||||||
|  | Middles    ← 'nurtures an '        'projects onto '      'imparts reality to ' 'constructs with ' | ||||||
|  | Qualifiers ← 'abundance of '       'the barrier of '     'self-righteous '     'potential ' | ||||||
|  | Finishes   ← 'marvel.'             'choices.'            'creativity.'         'actions.' | ||||||
|  |  | ||||||
|  | rf     ← {(?⍴⍵)⊃⍵} | ||||||
|  | erf    ← {rf ¨ ⍵} | ||||||
|  |  | ||||||
|  | deepak ← {erf Starts Middles Qualifiers Finishes} | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | deepak ⍬ | ||||||
							
								
								
									
										367
									
								
								samples/APL/UT.dyalog
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										367
									
								
								samples/APL/UT.dyalog
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,367 @@ | |||||||
|  | :NameSpace UT | ||||||
|  |  | ||||||
|  |     sac ← 0 | ||||||
|  |     expect_orig ← expect ← ⎕NS⍬ | ||||||
|  |     exception ← ⍬ | ||||||
|  |     nexpect_orig ← nexpect ← ⎕NS⍬ | ||||||
|  |  | ||||||
|  |     ∇ {Z}←{Conf}run Argument;PRE_test;POST_test;TEST_step;COVER_step;FromSpace | ||||||
|  |       | ||||||
|  |       load_display_if_not_already_loaded | ||||||
|  |       load_salt_scripts_into_current_namespace_if_configured | ||||||
|  |       | ||||||
|  |       FromSpace←1⊃⎕RSI | ||||||
|  |       | ||||||
|  |       PRE_test←{} | ||||||
|  |       POST_test←{} | ||||||
|  |       COVER_step←{} | ||||||
|  |       :If 0≠⎕NC'Conf' | ||||||
|  |           :If Conf has'cover_target' | ||||||
|  |               PRE_test←{{}⎕PROFILE'start'} | ||||||
|  |               POST_test←{{}⎕PROFILE'stop'} | ||||||
|  |           :EndIf | ||||||
|  |       :EndIf | ||||||
|  |       | ||||||
|  |       :If is_function Argument | ||||||
|  |           TEST_step←single_function_test_function | ||||||
|  |           COVER_file←Argument,'_coverage.html' | ||||||
|  |       | ||||||
|  |       :ElseIf is_list_of_functions Argument | ||||||
|  |           TEST_step←list_of_functions_test_function | ||||||
|  |           COVER_file←'list_coverage.html' | ||||||
|  |       | ||||||
|  |       :ElseIf is_file Argument | ||||||
|  |           TEST_step←file_test_function | ||||||
|  |           COVER_file←(get_file_name Argument),'_coverage.html' | ||||||
|  |       | ||||||
|  |       :ElseIf is_dir Argument | ||||||
|  |           test_files←test_files_in_dir Argument | ||||||
|  |           TEST_step←test_dir_function | ||||||
|  |           Argument←test_files | ||||||
|  |       :EndIf | ||||||
|  |       | ||||||
|  |       :If 0≠⎕NC'Conf' | ||||||
|  |           :If Conf has'cover_target' | ||||||
|  |               COVER_step←{Conf,←⊂('cover_file'COVER_file) | ||||||
|  |                   generate_coverage_page Conf} | ||||||
|  |           :EndIf | ||||||
|  |       :EndIf | ||||||
|  |       | ||||||
|  |       PRE_test ⍬ | ||||||
|  |       Z←FromSpace TEST_step Argument | ||||||
|  |       POST_test ⍬ | ||||||
|  |       COVER_step ⍬ | ||||||
|  |     ∇ | ||||||
|  |  | ||||||
|  |     ∇ load_display_if_not_already_loaded | ||||||
|  |       :If 0=⎕NC'#.DISPLAY' | ||||||
|  |           'DISPLAY'#.⎕CY'display' | ||||||
|  |       :EndIf | ||||||
|  |     ∇ | ||||||
|  |  | ||||||
|  |     ∇ load_salt_scripts_into_current_namespace_if_configured | ||||||
|  |       :If 0≠⎕NC'#.UT.appdir' | ||||||
|  |           :If ⍬≢#.UT.appdir | ||||||
|  |               ⎕SE.SALT.Load #.UT.appdir,'src/*.dyalog -target=#' | ||||||
|  |               ⎕SE.SALT.Load #.UT.appdir,'test/*.dyalog -target=#' | ||||||
|  |           :EndIf | ||||||
|  |       :EndIf | ||||||
|  |     ∇ | ||||||
|  |  | ||||||
|  |     ∇ Z←FromSpace single_function_test_function TestName | ||||||
|  |       Z←run_ut FromSpace TestName | ||||||
|  |     ∇ | ||||||
|  |  | ||||||
|  |     ∇ Z←FromSpace list_of_functions_test_function ListOfNames;t | ||||||
|  |       t←⎕TS | ||||||
|  |       Z←run_ut¨{FromSpace ⍵}¨ListOfNames | ||||||
|  |       t←⎕TS-t | ||||||
|  |       ('Test execution report')print_passed_crashed_failed Z t | ||||||
|  |     ∇ | ||||||
|  |  | ||||||
|  |     ∇ Z←FromSpace file_test_function FilePath;FileNS;Functions;TestFunctions;t | ||||||
|  |       FileNS←⎕SE.SALT.Load FilePath,' -target=#' | ||||||
|  |       Functions←↓FileNS.⎕NL 3 | ||||||
|  |       TestFunctions←(is_test¨Functions)/Functions | ||||||
|  |       :If (0/⍬,⊂0/'')≡TestFunctions | ||||||
|  |           ⎕←'No test functions found' | ||||||
|  |           Z←⍬ | ||||||
|  |       :Else | ||||||
|  |           t←⎕TS | ||||||
|  |           Z←run_ut¨{FileNS ⍵}¨TestFunctions | ||||||
|  |           t←⎕TS-t | ||||||
|  |           (FilePath,' tests')print_passed_crashed_failed Z t | ||||||
|  |       :EndIf | ||||||
|  |     ∇ | ||||||
|  |  | ||||||
|  |     ∇ Z←FromSpace test_dir_function Test_files | ||||||
|  |       :If Test_files≡⍬/⍬,⊂'' | ||||||
|  |           ⎕←'No test files found' | ||||||
|  |           Z←⍬ | ||||||
|  |       :Else | ||||||
|  |           Z←#.UT.run¨Test_files | ||||||
|  |       :EndIf | ||||||
|  |     ∇ | ||||||
|  |  | ||||||
|  |     ∇ Z←get_file_name Argument;separator | ||||||
|  |       separator←⊃⌽(Argument∊'/\')/⍳⍴Argument | ||||||
|  |       Z←¯7↓separator↓Argument | ||||||
|  |     ∇ | ||||||
|  |  | ||||||
|  |     ∇ generate_coverage_page Conf;ProfileData;CoverResults;HTML | ||||||
|  |       ProfileData←⎕PROFILE'data' | ||||||
|  |       ToCover←retrieve_coverables¨(⊃'cover_target'in Conf) | ||||||
|  |       :If (⍴ToCover)≡(⍴⊂1) | ||||||
|  |           ToCover←⊃ToCover | ||||||
|  |       :EndIf | ||||||
|  |       Representations←get_representation¨ToCover | ||||||
|  |       CoverResults←ProfileData∘generate_cover_result¨↓ToCover,[1.5]Representations | ||||||
|  |       HTML←generate_html CoverResults | ||||||
|  |       Conf write_html_to_page HTML | ||||||
|  |       ⎕PROFILE'clear' | ||||||
|  |     ∇ | ||||||
|  |  | ||||||
|  |     ∇ Z←retrieve_coverables Something;nc;functions | ||||||
|  |       nc←⎕NC Something | ||||||
|  |       :If nc=3 | ||||||
|  |           Z←Something | ||||||
|  |       :ElseIf nc=9 | ||||||
|  |           functions←strip¨↓⍎Something,'.⎕NL 3' | ||||||
|  |           Z←{(Something,'.',⍵)}¨functions | ||||||
|  |       :EndIf | ||||||
|  |     ∇ | ||||||
|  |  | ||||||
|  |     ∇ Z←strip input | ||||||
|  |       Z←(input≠' ')/input | ||||||
|  |     ∇ | ||||||
|  |  | ||||||
|  |     ∇ Z←get_representation Function;nc;rep | ||||||
|  |       nc←⎕NC⊂Function | ||||||
|  |       :If nc=3.1 | ||||||
|  |           rep←↓⎕CR Function | ||||||
|  |           rep[1]←⊂'∇',⊃rep[1] | ||||||
|  |           rep,←⊂'∇' | ||||||
|  |           rep←↑rep | ||||||
|  |       :Else | ||||||
|  |           rep←⎕CR Function | ||||||
|  |       :EndIf | ||||||
|  |       Z←rep | ||||||
|  |     ∇ | ||||||
|  |  | ||||||
|  |     ∇ Z←ProfileData generate_cover_result(name representation);Indices;lines;functionlines;covered_lines | ||||||
|  |       Indices←({name≡⍵}¨ProfileData[;1])/⍳⍴ProfileData[;1] | ||||||
|  |       lines←ProfileData[Indices;2] | ||||||
|  |       nc←⎕NC⊂name | ||||||
|  |       :If 3.1=nc | ||||||
|  |           functionlines←¯2+⍴↓representation | ||||||
|  |       :Else | ||||||
|  |           functionlines←⊃⍴↓representation | ||||||
|  |       :EndIf | ||||||
|  |       covered_lines←(⍬∘≢¨lines)/lines | ||||||
|  |       Z←(nc lines functionlines covered_lines representation) | ||||||
|  |     ∇ | ||||||
|  |  | ||||||
|  |     ∇ Z←generate_html CoverResults;Covered;Total;Percentage;CoverageText;ColorizedCode;Timestamp;Page | ||||||
|  |       Covered←⊃⊃+/{⍴4⊃⍵}¨CoverResults | ||||||
|  |       Total←⊃⊃+/{3⊃⍵}¨CoverResults | ||||||
|  |       Percentage←100×Covered÷Total | ||||||
|  |       CoverageText←'Coverage: ',Percentage,'% (',Covered,'/',Total,')' | ||||||
|  |       ColorizedCode←⊃,/{colorize_code_by_coverage ⍵}¨CoverResults | ||||||
|  |       Timestamp←generate_timestamp_text | ||||||
|  |       Page←⍬ | ||||||
|  |       Page,←⊂⍬,'<html>' | ||||||
|  |       Page,←⊂⍬,'<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>' | ||||||
|  |       Page,←⊂⍬,'<style>pre cov {line-height:80%;}' | ||||||
|  |       Page,←⊂⍬,'pre cov {color: green;}' | ||||||
|  |       Page,←⊂⍬,'pre uncov {line-height:80%;}' | ||||||
|  |       Page,←⊂⍬,'pre uncov {color:red;}</style>' | ||||||
|  |       Page,←⊂⍬,CoverageText | ||||||
|  |       Page,←⊂⍬,'<pre>' | ||||||
|  |       Page,←ColorizedCode | ||||||
|  |       Page,←⊂⍬,'</pre>' | ||||||
|  |       Page,←Timestamp | ||||||
|  |       Page,←⊂⍬,'</html>' | ||||||
|  |       Z←Page | ||||||
|  |     ∇ | ||||||
|  |  | ||||||
|  |     ∇ Z←colorize_code_by_coverage CoverResult;Colors;Ends;Code | ||||||
|  |       :If 3.1=⊃CoverResult | ||||||
|  |           Colors←(2+3⊃CoverResult)⍴⊂'<uncov>' | ||||||
|  |           Colors[1]←⊂'' | ||||||
|  |           Colors[⍴Colors]←⊂'' | ||||||
|  |           Ends←(2+3⊃CoverResult)⍴⊂'</uncov>' | ||||||
|  |           Ends[1]←⊂'' | ||||||
|  |           Ends[⍴Ends]←⊂'' | ||||||
|  |       :Else | ||||||
|  |           Colors←(3⊃CoverResult)⍴⊂'<uncov>' | ||||||
|  |           Ends←(3⊃CoverResult)⍴⊂'</uncov>' | ||||||
|  |       :EndIf | ||||||
|  |       Colors[1+4⊃CoverResult]←⊂'<cov>' | ||||||
|  |       Ends[1+4⊃CoverResult]←⊂'</cov>' | ||||||
|  |       Code←↓5⊃CoverResult | ||||||
|  |       Z←Colors,[1.5]Code | ||||||
|  |       Z←{⍺,(⎕UCS 13),⍵}/Z,Ends | ||||||
|  |     ∇ | ||||||
|  |  | ||||||
|  |     ∇ Z←generate_timestamp_text;TS;YYMMDD;HHMMSS | ||||||
|  |       TS←⎕TS | ||||||
|  |       YYMMDD←⊃{⍺,'-',⍵}/3↑TS | ||||||
|  |       HHMMSS←⊃{⍺,':',⍵}/3↑3↓TS | ||||||
|  |       Z←'Page generated: ',YYMMDD,'|',HHMMSS | ||||||
|  |     ∇ | ||||||
|  |  | ||||||
|  |     ∇ Conf write_html_to_page Page;tie;filename | ||||||
|  |       filename←(⊃'cover_out'in Conf),(⊃'cover_file'in Conf) | ||||||
|  |       :Trap 22 | ||||||
|  |           tie←filename ⎕NTIE 0 | ||||||
|  |           filename ⎕NERASE tie | ||||||
|  |           filename ⎕NCREATE tie | ||||||
|  |       :Else | ||||||
|  |           tie←filename ⎕NCREATE 0 | ||||||
|  |       :EndTrap | ||||||
|  |       Simple_array←⍕⊃,/Page | ||||||
|  |       (⎕UCS'UTF-8'⎕UCS Simple_array)⎕NAPPEND tie | ||||||
|  |     ∇ | ||||||
|  |  | ||||||
|  |     ∇ Z←is_function Argument | ||||||
|  |       Z←'_TEST'≡¯5↑Argument | ||||||
|  |     ∇ | ||||||
|  |  | ||||||
|  |     ∇ Z←is_list_of_functions Argument | ||||||
|  |       Z←2=≡Argument | ||||||
|  |     ∇ | ||||||
|  |  | ||||||
|  |     ∇ Z←is_file Argument | ||||||
|  |       Z←'.dyalog'≡¯7↑Argument | ||||||
|  |     ∇ | ||||||
|  |  | ||||||
|  |     ∇ Z←is_dir Argument;attr | ||||||
|  |       :If 'Linux'≡5↑⊃'.'⎕WG'APLVersion' | ||||||
|  |           Z←'yes'≡⊃⎕CMD'test -d ',Argument,' && echo yes || echo no' | ||||||
|  |       :Else | ||||||
|  |           'gfa'⎕NA'I kernel32|GetFileAttributes* <0t' | ||||||
|  |           :If Z←¯1≠attr←gfa⊂Argument ⍝ If file exists | ||||||
|  |               Z←⊃2 16⊤attr           ⍝ Return bit 4 | ||||||
|  |           :EndIf | ||||||
|  |       :EndIf | ||||||
|  |     ∇ | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     ∇ Z←test_files_in_dir Argument | ||||||
|  |       :If 'Linux'≡5↑⊃'.'⎕WG'APLVersion' | ||||||
|  |           Z←⎕SH'find ',Argument,' -name \*_tests.dyalog' | ||||||
|  |       :Else | ||||||
|  |           #.⎕CY'files' | ||||||
|  |           Z←#.Files.Dir Argument,'\*_tests.dyalog' | ||||||
|  |           Z←(Argument,'\')∘,¨Z | ||||||
|  |       :EndIf | ||||||
|  |     ∇ | ||||||
|  |  | ||||||
|  |     ∇ Z←run_ut ut_data;returned;crashed;pass;crash;fail;message | ||||||
|  |       (returned crashed time)←execute_function ut_data | ||||||
|  |       (pass crash fail)←determine_pass_crash_or_fail returned crashed | ||||||
|  |       message←determine_message pass fail crashed(2⊃ut_data)returned time | ||||||
|  |       print_message_to_screen message | ||||||
|  |       Z←(pass crash fail) | ||||||
|  |     ∇ | ||||||
|  |  | ||||||
|  |     ∇ Z←execute_function ut_data;function;t | ||||||
|  |       reset_UT_globals | ||||||
|  |       function←(⍕(⊃ut_data[1])),'.',⊃ut_data[2] | ||||||
|  |       :Trap sac | ||||||
|  |           :If 3.2≡⎕NC⊂function | ||||||
|  |               t←⎕TS | ||||||
|  |               Z←(⍎function,' ⍬')0 | ||||||
|  |               t←⎕TS-t | ||||||
|  |           :Else | ||||||
|  |               t←⎕TS | ||||||
|  |               Z←(⍎function)0 | ||||||
|  |               t←⎕TS-t | ||||||
|  |           :EndIf | ||||||
|  |       | ||||||
|  |       :Else | ||||||
|  |           Z←(↑⎕DM)1 | ||||||
|  |           :If exception≢⍬ | ||||||
|  |               expect←exception | ||||||
|  |               Z[2]←0 | ||||||
|  |               t←⎕TS-t | ||||||
|  |           :EndIf | ||||||
|  |       :EndTrap | ||||||
|  |       Z,←⊂t | ||||||
|  |     ∇ | ||||||
|  |  | ||||||
|  |     ∇ reset_UT_globals | ||||||
|  |       expect_orig ← expect← ⎕NS⍬ | ||||||
|  |       exception←⍬ | ||||||
|  |       nexpect_orig ← nexpect← ⎕NS⍬ | ||||||
|  |     ∇ | ||||||
|  |  | ||||||
|  |     ∇ Z←is_test FunctionName;wsIndex | ||||||
|  |       wsIndex←FunctionName⍳' ' | ||||||
|  |       FunctionName←(wsIndex-1)↑FunctionName | ||||||
|  |       Z←'_TEST'≡¯5↑FunctionName | ||||||
|  |     ∇ | ||||||
|  |  | ||||||
|  |     ∇ Heading print_passed_crashed_failed(ArrayRes time) | ||||||
|  |       ⎕←'-----------------------------------------' | ||||||
|  |       ⎕←Heading | ||||||
|  |       ⎕←'    ⍋  Passed: ',+/{1⊃⍵}¨ArrayRes | ||||||
|  |       ⎕←'    ⍟ Crashed: ',+/{2⊃⍵}¨ArrayRes | ||||||
|  |       ⎕←'    ⍒  Failed: ',+/{3⊃⍵}¨ArrayRes | ||||||
|  |       ⎕←'    ○ Runtime: ',time[5],'m',time[6],'s',time[7],'ms' | ||||||
|  |     ∇ | ||||||
|  |      | ||||||
|  |     determine_pass_crash_or_fail←{ | ||||||
|  |       r c←⍵ ⋄ 0≠c:0 1 0 ⋄ z←(0 0 1)(1 0 0) | ||||||
|  |       expect_orig≢expect:(⎕IO+expect≡r)⊃z ⋄ (⎕IO+nexpect≢r)⊃z | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     ∇ Z←determine_message(pass fail crashed name returned time) | ||||||
|  |       :If crashed | ||||||
|  |           Z←'CRASHED: 'failure_message name returned | ||||||
|  |       :ElseIf pass | ||||||
|  |           Z←'Passed ',time[5],'m',time[6],'s',time[7],'ms' | ||||||
|  |       :Else | ||||||
|  |           Z←'FAILED: 'failure_message name returned | ||||||
|  |       :EndIf | ||||||
|  |     ∇ | ||||||
|  |  | ||||||
|  |     ∇ print_message_to_screen message | ||||||
|  |       ⎕←message | ||||||
|  |     ∇ | ||||||
|  |  | ||||||
|  |     ∇ Z←term_to_text Term;Text;Rows | ||||||
|  |       Text←#.DISPLAY Term | ||||||
|  |       Rows←1⊃⍴Text | ||||||
|  |       Z←(Rows 4⍴''),Text | ||||||
|  |     ∇ | ||||||
|  |  | ||||||
|  |     ∇ Z←Cause failure_message(name returned);hdr;exp;expterm;got;gotterm | ||||||
|  |       hdr←Cause,name | ||||||
|  |       exp←'Expected' | ||||||
|  |       expterm←term_to_text #.UT.expect | ||||||
|  |       got←'Got' | ||||||
|  |       gotterm←term_to_text returned | ||||||
|  |       Z←align_and_join_message_parts hdr exp expterm got gotterm | ||||||
|  |     ∇ | ||||||
|  |  | ||||||
|  |     ∇ Z←align_and_join_message_parts Parts;hdr;exp;expterm;got;gotterm;R1;C1;R2;C2;W | ||||||
|  |       (hdr exp expterm got gotterm)←Parts | ||||||
|  |       (R1 C1)←⍴expterm | ||||||
|  |       (R2 C2)←⍴gotterm | ||||||
|  |       W←⊃⊃⌈/C1 C2(⍴hdr)(⍴exp)(⍴got) | ||||||
|  |       Z←(W↑hdr),[0.5](W↑exp) | ||||||
|  |       Z←Z⍪(R1 W↑expterm) | ||||||
|  |       Z←Z⍪(W↑got) | ||||||
|  |       Z←Z⍪(R2 W↑gotterm) | ||||||
|  |     ∇ | ||||||
|  |  | ||||||
|  |     ∇ Z←confparam in config | ||||||
|  |       Z←1↓⊃({confparam≡⊃⍵}¨config)/config | ||||||
|  |     ∇ | ||||||
|  |  | ||||||
|  |     ∇ Z←config has confparam | ||||||
|  |       Z←∨/{confparam≡⊃⍵}¨config | ||||||
|  |     ∇ | ||||||
|  |  | ||||||
|  | :EndNameSpace | ||||||
							
								
								
									
										110
									
								
								samples/Ant Build System/filenames/ant.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										110
									
								
								samples/Ant Build System/filenames/ant.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,110 @@ | |||||||
|  | <?xml version="1.0" encoding="iso-8859-1"?> | ||||||
|  | <project name="WebBuild"> | ||||||
|  |  | ||||||
|  |     <!-- generate timestamps --> | ||||||
|  |     <tstamp /> | ||||||
|  |  | ||||||
|  |     <!-- Debugging Macro --> | ||||||
|  |     <import file="echopath.xml" /> | ||||||
|  |  | ||||||
|  |     <!-- JS build files macro --> | ||||||
|  |     <import file="rhinoscript.xml" /> | ||||||
|  |  | ||||||
|  |     <!-- Component Build Files --> | ||||||
|  |     <import file="setup.xml" /> | ||||||
|  |     <import file="clean.xml" /> | ||||||
|  |     <import file="copy.xml" /> | ||||||
|  |     <import file="file.transform.xml" /> | ||||||
|  |     <import file="external.tools.xml" /> | ||||||
|  |     <import file="rename.xml" /> | ||||||
|  |     <import file="js.xml" /> | ||||||
|  |     <import file="css.xml" /> | ||||||
|  |     <import file="img.xml" /> | ||||||
|  |     <import file="png8.xml" /> | ||||||
|  |     <import file="yui.xml" /> | ||||||
|  |     <import file="cdn.xml" /> | ||||||
|  |     <import file="datauri.xml" /> | ||||||
|  |     <import file="devlive.xml" /> | ||||||
|  |  | ||||||
|  |     <!-- This dirname is the only complete path we know for sure, everything builds off of it --> | ||||||
|  |     <dirname property="dir.build" file="${ant.file.WebBuild}" /> | ||||||
|  |  | ||||||
|  |     <!-- get name for newly built folder --> | ||||||
|  |     <basename property="app.name"       file="${basedir}" /> | ||||||
|  |  | ||||||
|  |     <!-- read global properties file --> | ||||||
|  |     <property file="${dir.build}\build.properties" /> | ||||||
|  |  | ||||||
|  |     <!-- Build Directories --> | ||||||
|  |     <property name="dir.build.js"   location="${dir.build}/js" /> | ||||||
|  |  | ||||||
|  |     <!-- App Directories --> | ||||||
|  |     <property name="dir.app"        location="${dir.result}/${app.name}" /> | ||||||
|  |     <property name="dir.app.temp"   location="${dir.temp}/${app.name}" /> | ||||||
|  |     <property name="dir.app.files"  location="${dir.app.temp}/${dir.files}" /> | ||||||
|  |  | ||||||
|  |     <!-- Files --> | ||||||
|  |     <property name="mapping.js"     location="${dir.app.temp}/${mapping.file.js}" /> | ||||||
|  |     <property name="mapping.css"    location="${dir.app.temp}/${mapping.file.css}" /> | ||||||
|  |     <property name="mapping.img"    location="${dir.app.temp}/${mapping.file.img}" /> | ||||||
|  |     <property name="mapping.swf"    location="${dir.app.temp}/${mapping.file.swf}" /> | ||||||
|  |     <property name="mapping.fonts"  location="${dir.app.temp}/${mapping.file.fonts}" /> | ||||||
|  |  | ||||||
|  |     <!-- Tool Directories --> | ||||||
|  |     <property name="dir.bin"    location="${dir.build}/Bin" /> | ||||||
|  |     <property name="dir.jar"    location="${dir.bin}/jar" /> | ||||||
|  |  | ||||||
|  |     <!-- Tool Files --> | ||||||
|  | 	<property name="tools.compressor"     location="${dir.jar}/${tools.file.compressor}" /> | ||||||
|  | 	<property name="tools.cssembed"       location="${dir.jar}/${tools.file.cssembed}" /> | ||||||
|  |     <property name="tools.filetransform"  location="${dir.jar}/${tools.file.filetransform}" /> | ||||||
|  |     <property name="tools.optipng"        location="${dir.bin}/${tools.file.optipng}" /> | ||||||
|  |     <property name="tools.jpegtran"       location="${dir.bin}/${tools.file.jpegtran}" /> | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     <!-- BUILD TARGETS --> | ||||||
|  |  | ||||||
|  |     <!-- low level utility build targets --> | ||||||
|  |  | ||||||
|  |     <!-- Build the tools --> | ||||||
|  |     <target name="-setup.build.tools" | ||||||
|  |             depends="-define.filetransform, -define.cssembed, -define.yuicompressor, -define.jsclasspath" | ||||||
|  |     /> | ||||||
|  |  | ||||||
|  |     <!-- set up filesystem properties --> | ||||||
|  |     <target | ||||||
|  |         name="-setup" | ||||||
|  |         depends="-setup.mode, -setup.conditions, -setup.js, -setup.css, -setup.swf, -setup.img, -setup.fonts, -setup.yui" | ||||||
|  |     /> | ||||||
|  |  | ||||||
|  |     <!-- utility-ish targets --> | ||||||
|  |     <target name="copy"         depends="clean, tools, -copy" /> | ||||||
|  |     <target name="tools"        depends="-setup.build.tools" /> | ||||||
|  |     <target name="finalize"     depends="copy, -finalize" /> | ||||||
|  |     <target name="-prepare"     depends="copy, -setup" /> | ||||||
|  |  | ||||||
|  |     <!-- individual component build targets (empty descriptions are to make sure they show in "ant -p") --> | ||||||
|  |     <target name="devlive"      depends="-prepare, -devlive"            description="" /> | ||||||
|  |     <target name="js"           depends="-prepare, -js"                 description="" /> | ||||||
|  |     <target name="css"          depends="-prepare, -css"                description="" /> | ||||||
|  |     <target name="rename"       depends="-prepare, -rename"             description="" /> | ||||||
|  |     <target name="yui"          depends="-prepare, rename, -yui"        description="" /> | ||||||
|  |     <target name="cdn"          depends="-prepare, -cdn"                description="" /> | ||||||
|  |  | ||||||
|  |     <!-- high level build targets (Excluding of images is on purpose here, it's slow) --> | ||||||
|  |     <target name="core" | ||||||
|  |             depends="devlive, js, css, cdn, rename, yui, -js.inline" | ||||||
|  |             description="Core build work" | ||||||
|  |     /> | ||||||
|  |  | ||||||
|  |     <target name="prod" | ||||||
|  |             depends="core, finalize" | ||||||
|  |             description="Full Production Build" | ||||||
|  |     /> | ||||||
|  |  | ||||||
|  |     <!-- debug target --> | ||||||
|  |     <target name="debug" depends="-setup"> | ||||||
|  |         <echoproperties/> | ||||||
|  |     </target> | ||||||
|  |  | ||||||
|  | </project> | ||||||
							
								
								
									
										1
									
								
								samples/Ant Build System/filenames/build.xml
									
									
									
									
									
										Symbolic link
									
								
							
							
						
						
									
										1
									
								
								samples/Ant Build System/filenames/build.xml
									
									
									
									
									
										Symbolic link
									
								
							| @@ -0,0 +1 @@ | |||||||
|  | ant.xml | ||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										66
									
								
								samples/Assembly/External Interrupt.a51
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								samples/Assembly/External Interrupt.a51
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,66 @@ | |||||||
|  | 	ORG	0000h | ||||||
|  | 	SJMP	START | ||||||
|  | 	ORG	0003h | ||||||
|  | 	LCALL	INT0_ISR | ||||||
|  | 	RETI | ||||||
|  | 	ORG	000Bh | ||||||
|  | 	LCALL	T0_ISR | ||||||
|  | 	RETI | ||||||
|  | 	ORG	0013h | ||||||
|  | 	LCALL	INT1_ISR | ||||||
|  | 	RETI | ||||||
|  | 	ORG	001Bh | ||||||
|  | 	LCALL	T1_ISR | ||||||
|  | 	RETI | ||||||
|  | 	ORG	0023h | ||||||
|  | 	LCALL	UART_ISR | ||||||
|  | 	RETI | ||||||
|  | 	ORG	0030h | ||||||
|  | START: | ||||||
|  | 	MOV	A,#11111110b | ||||||
|  | 	SETB	IT0	; Set External Interrupt 0 to be falling edge triggered | ||||||
|  | 	SETB	EX0	; Enable External Interrut 0 | ||||||
|  | 	SETB	EA	; Enable Interrupt | ||||||
|  | LEFT:			 | ||||||
|  | 	CJNE	A,#01111111b,LOOP1 | ||||||
|  | 	JMP	RIGHT | ||||||
|  | LOOP1: | ||||||
|  | 	MOV	P1,A | ||||||
|  | 	RL	A	 | ||||||
|  | 	LCALL	DELAY | ||||||
|  | 	SJMP	LEFT	 | ||||||
|  | RIGHT: | ||||||
|  | 	CJNE	A,#11111110b,LOOP2 | ||||||
|  | 	JMP	LEFT | ||||||
|  | LOOP2: | ||||||
|  | 	MOV	P1,A | ||||||
|  | 	RR	A	 | ||||||
|  | 	LCALL	DELAY | ||||||
|  | 	SJMP	RIGHT | ||||||
|  | 	 | ||||||
|  | INT0_ISR: | ||||||
|  | 	MOV	R1,#3 | ||||||
|  | FLASH: | ||||||
|  | 	MOV	P1,#00h | ||||||
|  | 	LCALL	DELAY | ||||||
|  | 	MOV	P1,#0FFh | ||||||
|  | 	LCALL	DELAY | ||||||
|  | 	DJNZ	R1,FLASH | ||||||
|  | 	RET | ||||||
|  | T0_ISR: | ||||||
|  | 	RET | ||||||
|  | INT1_ISR: | ||||||
|  | 	RET | ||||||
|  | T1_ISR: | ||||||
|  | 	RET | ||||||
|  | UART_ISR: | ||||||
|  | 	RET | ||||||
|  |  | ||||||
|  | DELAY:	MOV	R5,#20	;R5*20 mS | ||||||
|  | D1:     MOV	R6,#40 | ||||||
|  | D2:     MOV	R7,#249 | ||||||
|  | 	DJNZ	R7,$ | ||||||
|  |  	DJNZ	R6,D2 | ||||||
|  |   	DJNZ	R5,D1 | ||||||
|  |    	RET | ||||||
|  | 	END | ||||||
| @@ -1,503 +0,0 @@ | |||||||
|  |  | ||||||
| ; flat assembler interface for Win32 |  | ||||||
| ; Copyright (c) 1999-2014, Tomasz Grysztar. |  | ||||||
| ; All rights reserved. |  | ||||||
|  |  | ||||||
| CREATE_NEW	       = 1 |  | ||||||
| CREATE_ALWAYS	       = 2 |  | ||||||
| OPEN_EXISTING	       = 3 |  | ||||||
| OPEN_ALWAYS	       = 4 |  | ||||||
| TRUNCATE_EXISTING      = 5 |  | ||||||
|  |  | ||||||
| FILE_SHARE_READ        = 1 |  | ||||||
| FILE_SHARE_WRITE       = 2 |  | ||||||
| FILE_SHARE_DELETE      = 4 |  | ||||||
|  |  | ||||||
| GENERIC_READ	       = 80000000h |  | ||||||
| GENERIC_WRITE	       = 40000000h |  | ||||||
|  |  | ||||||
| STD_INPUT_HANDLE       = 0FFFFFFF6h |  | ||||||
| STD_OUTPUT_HANDLE      = 0FFFFFFF5h |  | ||||||
| STD_ERROR_HANDLE       = 0FFFFFFF4h |  | ||||||
|  |  | ||||||
| MEM_COMMIT	       = 1000h |  | ||||||
| MEM_RESERVE	       = 2000h |  | ||||||
| MEM_DECOMMIT	       = 4000h |  | ||||||
| MEM_RELEASE	       = 8000h |  | ||||||
| MEM_FREE	       = 10000h |  | ||||||
| MEM_PRIVATE	       = 20000h |  | ||||||
| MEM_MAPPED	       = 40000h |  | ||||||
| MEM_RESET	       = 80000h |  | ||||||
| MEM_TOP_DOWN	       = 100000h |  | ||||||
|  |  | ||||||
| PAGE_NOACCESS	       = 1 |  | ||||||
| PAGE_READONLY	       = 2 |  | ||||||
| PAGE_READWRITE	       = 4 |  | ||||||
| PAGE_WRITECOPY	       = 8 |  | ||||||
| PAGE_EXECUTE	       = 10h |  | ||||||
| PAGE_EXECUTE_READ      = 20h |  | ||||||
| PAGE_EXECUTE_READWRITE = 40h |  | ||||||
| PAGE_EXECUTE_WRITECOPY = 80h |  | ||||||
| PAGE_GUARD	       = 100h |  | ||||||
| PAGE_NOCACHE	       = 200h |  | ||||||
|  |  | ||||||
| init_memory: |  | ||||||
| 	xor	eax,eax |  | ||||||
| 	mov	[memory_start],eax |  | ||||||
| 	mov	eax,esp |  | ||||||
| 	and	eax,not 0FFFh |  | ||||||
| 	add	eax,1000h-10000h |  | ||||||
| 	mov	[stack_limit],eax |  | ||||||
| 	mov	eax,[memory_setting] |  | ||||||
| 	shl	eax,10 |  | ||||||
| 	jnz	allocate_memory |  | ||||||
| 	push	buffer |  | ||||||
| 	call	[GlobalMemoryStatus] |  | ||||||
| 	mov	eax,dword [buffer+20] |  | ||||||
| 	mov	edx,dword [buffer+12] |  | ||||||
| 	cmp	eax,0 |  | ||||||
| 	jl	large_memory |  | ||||||
| 	cmp	edx,0 |  | ||||||
| 	jl	large_memory |  | ||||||
| 	shr	eax,2 |  | ||||||
| 	add	eax,edx |  | ||||||
| 	jmp	allocate_memory |  | ||||||
|     large_memory: |  | ||||||
| 	mov	eax,80000000h |  | ||||||
|     allocate_memory: |  | ||||||
| 	mov	edx,eax |  | ||||||
| 	shr	edx,2 |  | ||||||
| 	mov	ecx,eax |  | ||||||
| 	sub	ecx,edx |  | ||||||
| 	mov	[memory_end],ecx |  | ||||||
| 	mov	[additional_memory_end],edx |  | ||||||
| 	push	PAGE_READWRITE |  | ||||||
| 	push	MEM_COMMIT |  | ||||||
| 	push	eax |  | ||||||
| 	push	0 |  | ||||||
| 	call	[VirtualAlloc] |  | ||||||
| 	or	eax,eax |  | ||||||
| 	jz	not_enough_memory |  | ||||||
| 	mov	[memory_start],eax |  | ||||||
| 	add	eax,[memory_end] |  | ||||||
| 	mov	[memory_end],eax |  | ||||||
| 	mov	[additional_memory],eax |  | ||||||
| 	add	[additional_memory_end],eax |  | ||||||
| 	ret |  | ||||||
|     not_enough_memory: |  | ||||||
| 	mov	eax,[additional_memory_end] |  | ||||||
| 	shl	eax,1 |  | ||||||
| 	cmp	eax,4000h |  | ||||||
| 	jb	out_of_memory |  | ||||||
| 	jmp	allocate_memory |  | ||||||
|  |  | ||||||
| exit_program: |  | ||||||
| 	movzx	eax,al |  | ||||||
| 	push	eax |  | ||||||
| 	mov	eax,[memory_start] |  | ||||||
| 	test	eax,eax |  | ||||||
| 	jz	do_exit |  | ||||||
| 	push	MEM_RELEASE |  | ||||||
| 	push	0 |  | ||||||
| 	push	eax |  | ||||||
| 	call	[VirtualFree] |  | ||||||
|     do_exit: |  | ||||||
| 	call	[ExitProcess] |  | ||||||
|  |  | ||||||
| get_environment_variable: |  | ||||||
| 	mov	ecx,[memory_end] |  | ||||||
| 	sub	ecx,edi |  | ||||||
| 	cmp	ecx,4000h |  | ||||||
| 	jbe	buffer_for_variable_ok |  | ||||||
| 	mov	ecx,4000h |  | ||||||
|     buffer_for_variable_ok: |  | ||||||
| 	push	ecx |  | ||||||
| 	push	edi |  | ||||||
| 	push	esi |  | ||||||
| 	call	[GetEnvironmentVariable] |  | ||||||
| 	add	edi,eax |  | ||||||
| 	cmp	edi,[memory_end] |  | ||||||
| 	jae	out_of_memory |  | ||||||
| 	ret |  | ||||||
|  |  | ||||||
| open: |  | ||||||
| 	push	0 |  | ||||||
| 	push	0 |  | ||||||
| 	push	OPEN_EXISTING |  | ||||||
| 	push	0 |  | ||||||
| 	push	FILE_SHARE_READ |  | ||||||
| 	push	GENERIC_READ |  | ||||||
| 	push	edx |  | ||||||
| 	call	[CreateFile] |  | ||||||
| 	cmp	eax,-1 |  | ||||||
| 	je	file_error |  | ||||||
| 	mov	ebx,eax |  | ||||||
| 	clc |  | ||||||
| 	ret |  | ||||||
|     file_error: |  | ||||||
| 	stc |  | ||||||
| 	ret |  | ||||||
| create: |  | ||||||
| 	push	0 |  | ||||||
| 	push	0 |  | ||||||
| 	push	CREATE_ALWAYS |  | ||||||
| 	push	0 |  | ||||||
| 	push	FILE_SHARE_READ |  | ||||||
| 	push	GENERIC_WRITE |  | ||||||
| 	push	edx |  | ||||||
| 	call	[CreateFile] |  | ||||||
| 	cmp	eax,-1 |  | ||||||
| 	je	file_error |  | ||||||
| 	mov	ebx,eax |  | ||||||
| 	clc |  | ||||||
| 	ret |  | ||||||
| write: |  | ||||||
| 	push	0 |  | ||||||
| 	push	bytes_count |  | ||||||
| 	push	ecx |  | ||||||
| 	push	edx |  | ||||||
| 	push	ebx |  | ||||||
| 	call	[WriteFile] |  | ||||||
| 	or	eax,eax |  | ||||||
| 	jz	file_error |  | ||||||
| 	clc |  | ||||||
| 	ret |  | ||||||
| read: |  | ||||||
| 	mov	ebp,ecx |  | ||||||
| 	push	0 |  | ||||||
| 	push	bytes_count |  | ||||||
| 	push	ecx |  | ||||||
| 	push	edx |  | ||||||
| 	push	ebx |  | ||||||
| 	call	[ReadFile] |  | ||||||
| 	or	eax,eax |  | ||||||
| 	jz	file_error |  | ||||||
| 	cmp	ebp,[bytes_count] |  | ||||||
| 	jne	file_error |  | ||||||
| 	clc |  | ||||||
| 	ret |  | ||||||
| close: |  | ||||||
| 	push	ebx |  | ||||||
| 	call	[CloseHandle] |  | ||||||
| 	ret |  | ||||||
| lseek: |  | ||||||
| 	movzx	eax,al |  | ||||||
| 	push	eax |  | ||||||
| 	push	0 |  | ||||||
| 	push	edx |  | ||||||
| 	push	ebx |  | ||||||
| 	call	[SetFilePointer] |  | ||||||
| 	ret |  | ||||||
|  |  | ||||||
| display_string: |  | ||||||
| 	push	[con_handle] |  | ||||||
| 	call	[GetStdHandle] |  | ||||||
| 	mov	ebp,eax |  | ||||||
| 	mov	edi,esi |  | ||||||
| 	or	ecx,-1 |  | ||||||
| 	xor	al,al |  | ||||||
| 	repne	scasb |  | ||||||
| 	neg	ecx |  | ||||||
| 	sub	ecx,2 |  | ||||||
| 	push	0 |  | ||||||
| 	push	bytes_count |  | ||||||
| 	push	ecx |  | ||||||
| 	push	esi |  | ||||||
| 	push	ebp |  | ||||||
| 	call	[WriteFile] |  | ||||||
| 	ret |  | ||||||
| display_character: |  | ||||||
| 	push	ebx |  | ||||||
| 	mov	[character],dl |  | ||||||
| 	push	[con_handle] |  | ||||||
| 	call	[GetStdHandle] |  | ||||||
| 	mov	ebx,eax |  | ||||||
| 	push	0 |  | ||||||
| 	push	bytes_count |  | ||||||
| 	push	1 |  | ||||||
| 	push	character |  | ||||||
| 	push	ebx |  | ||||||
| 	call	[WriteFile] |  | ||||||
| 	pop	ebx |  | ||||||
| 	ret |  | ||||||
| display_number: |  | ||||||
| 	push	ebx |  | ||||||
| 	mov	ecx,1000000000 |  | ||||||
| 	xor	edx,edx |  | ||||||
| 	xor	bl,bl |  | ||||||
|       display_loop: |  | ||||||
| 	div	ecx |  | ||||||
| 	push	edx |  | ||||||
| 	cmp	ecx,1 |  | ||||||
| 	je	display_digit |  | ||||||
| 	or	bl,bl |  | ||||||
| 	jnz	display_digit |  | ||||||
| 	or	al,al |  | ||||||
| 	jz	digit_ok |  | ||||||
| 	not	bl |  | ||||||
|       display_digit: |  | ||||||
| 	mov	dl,al |  | ||||||
| 	add	dl,30h |  | ||||||
| 	push	ecx |  | ||||||
| 	call	display_character |  | ||||||
| 	pop	ecx |  | ||||||
|       digit_ok: |  | ||||||
| 	mov	eax,ecx |  | ||||||
| 	xor	edx,edx |  | ||||||
| 	mov	ecx,10 |  | ||||||
| 	div	ecx |  | ||||||
| 	mov	ecx,eax |  | ||||||
| 	pop	eax |  | ||||||
| 	or	ecx,ecx |  | ||||||
| 	jnz	display_loop |  | ||||||
| 	pop	ebx |  | ||||||
| 	ret |  | ||||||
|  |  | ||||||
| display_user_messages: |  | ||||||
| 	mov	[displayed_count],0 |  | ||||||
| 	call	show_display_buffer |  | ||||||
| 	cmp	[displayed_count],1 |  | ||||||
| 	jb	line_break_ok |  | ||||||
| 	je	make_line_break |  | ||||||
| 	mov	ax,word [last_displayed] |  | ||||||
| 	cmp	ax,0A0Dh |  | ||||||
| 	je	line_break_ok |  | ||||||
| 	cmp	ax,0D0Ah |  | ||||||
| 	je	line_break_ok |  | ||||||
|       make_line_break: |  | ||||||
| 	mov	word [buffer],0A0Dh |  | ||||||
| 	push	[con_handle] |  | ||||||
| 	call	[GetStdHandle] |  | ||||||
| 	push	0 |  | ||||||
| 	push	bytes_count |  | ||||||
| 	push	2 |  | ||||||
| 	push	buffer |  | ||||||
| 	push	eax |  | ||||||
| 	call	[WriteFile] |  | ||||||
|       line_break_ok: |  | ||||||
| 	ret |  | ||||||
| display_block: |  | ||||||
| 	add	[displayed_count],ecx |  | ||||||
| 	cmp	ecx,1 |  | ||||||
| 	ja	take_last_two_characters |  | ||||||
| 	jb	block_displayed |  | ||||||
| 	mov	al,[last_displayed+1] |  | ||||||
| 	mov	ah,[esi] |  | ||||||
| 	mov	word [last_displayed],ax |  | ||||||
| 	jmp	block_ok |  | ||||||
|       take_last_two_characters: |  | ||||||
| 	mov	ax,[esi+ecx-2] |  | ||||||
| 	mov	word [last_displayed],ax |  | ||||||
|       block_ok: |  | ||||||
| 	push	ecx |  | ||||||
| 	push	[con_handle] |  | ||||||
| 	call	[GetStdHandle] |  | ||||||
| 	pop	ecx |  | ||||||
| 	push	0 |  | ||||||
| 	push	bytes_count |  | ||||||
| 	push	ecx |  | ||||||
| 	push	esi |  | ||||||
| 	push	eax |  | ||||||
| 	call	[WriteFile] |  | ||||||
|       block_displayed: |  | ||||||
| 	ret |  | ||||||
|  |  | ||||||
| fatal_error: |  | ||||||
| 	mov	[con_handle],STD_ERROR_HANDLE |  | ||||||
| 	mov	esi,error_prefix |  | ||||||
| 	call	display_string |  | ||||||
| 	pop	esi |  | ||||||
| 	call	display_string |  | ||||||
| 	mov	esi,error_suffix |  | ||||||
| 	call	display_string |  | ||||||
| 	mov	al,0FFh |  | ||||||
| 	jmp	exit_program |  | ||||||
| assembler_error: |  | ||||||
| 	mov	[con_handle],STD_ERROR_HANDLE |  | ||||||
| 	call	display_user_messages |  | ||||||
| 	push	dword 0 |  | ||||||
| 	mov	ebx,[current_line] |  | ||||||
|       get_error_lines: |  | ||||||
| 	mov	eax,[ebx] |  | ||||||
| 	cmp	byte [eax],0 |  | ||||||
| 	je	get_next_error_line |  | ||||||
| 	push	ebx |  | ||||||
| 	test	byte [ebx+7],80h |  | ||||||
| 	jz	display_error_line |  | ||||||
| 	mov	edx,ebx |  | ||||||
|       find_definition_origin: |  | ||||||
| 	mov	edx,[edx+12] |  | ||||||
| 	test	byte [edx+7],80h |  | ||||||
| 	jnz	find_definition_origin |  | ||||||
| 	push	edx |  | ||||||
|       get_next_error_line: |  | ||||||
| 	mov	ebx,[ebx+8] |  | ||||||
| 	jmp	get_error_lines |  | ||||||
|       display_error_line: |  | ||||||
| 	mov	esi,[ebx] |  | ||||||
| 	call	display_string |  | ||||||
| 	mov	esi,line_number_start |  | ||||||
| 	call	display_string |  | ||||||
| 	mov	eax,[ebx+4] |  | ||||||
| 	and	eax,7FFFFFFFh |  | ||||||
| 	call	display_number |  | ||||||
| 	mov	dl,']' |  | ||||||
| 	call	display_character |  | ||||||
| 	pop	esi |  | ||||||
| 	cmp	ebx,esi |  | ||||||
| 	je	line_number_ok |  | ||||||
| 	mov	dl,20h |  | ||||||
| 	call	display_character |  | ||||||
| 	push	esi |  | ||||||
| 	mov	esi,[esi] |  | ||||||
| 	movzx	ecx,byte [esi] |  | ||||||
| 	inc	esi |  | ||||||
| 	call	display_block |  | ||||||
| 	mov	esi,line_number_start |  | ||||||
| 	call	display_string |  | ||||||
| 	pop	esi |  | ||||||
| 	mov	eax,[esi+4] |  | ||||||
| 	and	eax,7FFFFFFFh |  | ||||||
| 	call	display_number |  | ||||||
| 	mov	dl,']' |  | ||||||
| 	call	display_character |  | ||||||
|       line_number_ok: |  | ||||||
| 	mov	esi,line_data_start |  | ||||||
| 	call	display_string |  | ||||||
| 	mov	esi,ebx |  | ||||||
| 	mov	edx,[esi] |  | ||||||
| 	call	open |  | ||||||
| 	mov	al,2 |  | ||||||
| 	xor	edx,edx |  | ||||||
| 	call	lseek |  | ||||||
| 	mov	edx,[esi+8] |  | ||||||
| 	sub	eax,edx |  | ||||||
| 	jz	line_data_displayed |  | ||||||
| 	push	eax |  | ||||||
| 	xor	al,al |  | ||||||
| 	call	lseek |  | ||||||
| 	mov	ecx,[esp] |  | ||||||
| 	mov	edx,[additional_memory] |  | ||||||
| 	lea	eax,[edx+ecx] |  | ||||||
| 	cmp	eax,[additional_memory_end] |  | ||||||
| 	ja	out_of_memory |  | ||||||
| 	call	read |  | ||||||
| 	call	close |  | ||||||
| 	pop	ecx |  | ||||||
| 	mov	esi,[additional_memory] |  | ||||||
|       get_line_data: |  | ||||||
| 	mov	al,[esi] |  | ||||||
| 	cmp	al,0Ah |  | ||||||
| 	je	display_line_data |  | ||||||
| 	cmp	al,0Dh |  | ||||||
| 	je	display_line_data |  | ||||||
| 	cmp	al,1Ah |  | ||||||
| 	je	display_line_data |  | ||||||
| 	or	al,al |  | ||||||
| 	jz	display_line_data |  | ||||||
| 	inc	esi |  | ||||||
| 	loop	get_line_data |  | ||||||
|       display_line_data: |  | ||||||
| 	mov	ecx,esi |  | ||||||
| 	mov	esi,[additional_memory] |  | ||||||
| 	sub	ecx,esi |  | ||||||
| 	call	display_block |  | ||||||
|       line_data_displayed: |  | ||||||
| 	mov	esi,cr_lf |  | ||||||
| 	call	display_string |  | ||||||
| 	pop	ebx |  | ||||||
| 	or	ebx,ebx |  | ||||||
| 	jnz	display_error_line |  | ||||||
| 	mov	esi,error_prefix |  | ||||||
| 	call	display_string |  | ||||||
| 	pop	esi |  | ||||||
| 	call	display_string |  | ||||||
| 	mov	esi,error_suffix |  | ||||||
| 	call	display_string |  | ||||||
| 	mov	al,2 |  | ||||||
| 	jmp	exit_program |  | ||||||
|  |  | ||||||
| make_timestamp: |  | ||||||
| 	push	buffer |  | ||||||
| 	call	[GetSystemTime] |  | ||||||
| 	movzx	ecx,word [buffer] |  | ||||||
| 	mov	eax,ecx |  | ||||||
| 	sub	eax,1970 |  | ||||||
| 	mov	ebx,365 |  | ||||||
| 	mul	ebx |  | ||||||
| 	mov	ebp,eax |  | ||||||
| 	mov	eax,ecx |  | ||||||
| 	sub	eax,1969 |  | ||||||
| 	shr	eax,2 |  | ||||||
| 	add	ebp,eax |  | ||||||
| 	mov	eax,ecx |  | ||||||
| 	sub	eax,1901 |  | ||||||
| 	mov	ebx,100 |  | ||||||
| 	div	ebx |  | ||||||
| 	sub	ebp,eax |  | ||||||
| 	mov	eax,ecx |  | ||||||
| 	xor	edx,edx |  | ||||||
| 	sub	eax,1601 |  | ||||||
| 	mov	ebx,400 |  | ||||||
| 	div	ebx |  | ||||||
| 	add	ebp,eax |  | ||||||
| 	movzx	ecx,word [buffer+2] |  | ||||||
| 	mov	eax,ecx |  | ||||||
| 	dec	eax |  | ||||||
| 	mov	ebx,30 |  | ||||||
| 	mul	ebx |  | ||||||
| 	add	ebp,eax |  | ||||||
| 	cmp	ecx,8 |  | ||||||
| 	jbe	months_correction |  | ||||||
| 	mov	eax,ecx |  | ||||||
| 	sub	eax,7 |  | ||||||
| 	shr	eax,1 |  | ||||||
| 	add	ebp,eax |  | ||||||
| 	mov	ecx,8 |  | ||||||
|       months_correction: |  | ||||||
| 	mov	eax,ecx |  | ||||||
| 	shr	eax,1 |  | ||||||
| 	add	ebp,eax |  | ||||||
| 	cmp	ecx,2 |  | ||||||
| 	jbe	day_correction_ok |  | ||||||
| 	sub	ebp,2 |  | ||||||
| 	movzx	ecx,word [buffer] |  | ||||||
| 	test	ecx,11b |  | ||||||
| 	jnz	day_correction_ok |  | ||||||
| 	xor	edx,edx |  | ||||||
| 	mov	eax,ecx |  | ||||||
| 	mov	ebx,100 |  | ||||||
| 	div	ebx |  | ||||||
| 	or	edx,edx |  | ||||||
| 	jnz	day_correction |  | ||||||
| 	mov	eax,ecx |  | ||||||
| 	mov	ebx,400 |  | ||||||
| 	div	ebx |  | ||||||
| 	or	edx,edx |  | ||||||
| 	jnz	day_correction_ok |  | ||||||
|       day_correction: |  | ||||||
| 	inc	ebp |  | ||||||
|       day_correction_ok: |  | ||||||
| 	movzx	eax,word [buffer+6] |  | ||||||
| 	dec	eax |  | ||||||
| 	add	eax,ebp |  | ||||||
| 	mov	ebx,24 |  | ||||||
| 	mul	ebx |  | ||||||
| 	movzx	ecx,word [buffer+8] |  | ||||||
| 	add	eax,ecx |  | ||||||
| 	mov	ebx,60 |  | ||||||
| 	mul	ebx |  | ||||||
| 	movzx	ecx,word [buffer+10] |  | ||||||
| 	add	eax,ecx |  | ||||||
| 	mov	ebx,60 |  | ||||||
| 	mul	ebx |  | ||||||
| 	movzx	ecx,word [buffer+12] |  | ||||||
| 	add	eax,ecx |  | ||||||
| 	adc	edx,0 |  | ||||||
| 	ret |  | ||||||
|  |  | ||||||
| error_prefix db 'error: ',0 |  | ||||||
| error_suffix db '.' |  | ||||||
| cr_lf db 0Dh,0Ah,0 |  | ||||||
| line_number_start db ' [',0 |  | ||||||
| line_data_start db ':',0Dh,0Ah,0 |  | ||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										86
									
								
								samples/C++/16F88.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										86
									
								
								samples/C++/16F88.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,86 @@ | |||||||
|  | /* | ||||||
|  |  * This file is part of PIC | ||||||
|  |  * Copyright © 2012 Rachel Mant (dx-mon@users.sourceforge.net) | ||||||
|  |  * | ||||||
|  |  * PIC is free software: you can redistribute it and/or modify | ||||||
|  |  * it under the terms of the GNU Lesser General Public License as published by | ||||||
|  |  * the Free Software Foundation, either version 3 of the License, or | ||||||
|  |  * (at your option) any later version. | ||||||
|  |  * | ||||||
|  |  * PIC 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 Lesser General Public License for more details. | ||||||
|  |  * | ||||||
|  |  * You should have received a copy of the GNU Lesser General Public License | ||||||
|  |  * along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | enum PIC16F88Instruction | ||||||
|  | { | ||||||
|  | 	ADDWF, | ||||||
|  | 	ANDWF, | ||||||
|  | 	CLRF, | ||||||
|  | 	CLRW, | ||||||
|  | 	COMF, | ||||||
|  | 	DECF, | ||||||
|  | 	DECFSZ, | ||||||
|  | 	INCF, | ||||||
|  | 	INCFSZ, | ||||||
|  | 	IORWF, | ||||||
|  | 	MOVF, | ||||||
|  | 	MOVWF, | ||||||
|  | 	NOP, | ||||||
|  | 	RLF, | ||||||
|  | 	RRF, | ||||||
|  | 	SUBWF, | ||||||
|  | 	SWAPF, | ||||||
|  | 	XORWF, | ||||||
|  | 	BCF, | ||||||
|  | 	BSF, | ||||||
|  | 	BTFSC, | ||||||
|  | 	BTFSS, | ||||||
|  | 	ADDLW, | ||||||
|  | 	ANDLW, | ||||||
|  | 	CALL, | ||||||
|  | 	CLRWDT, | ||||||
|  | 	GOTO, | ||||||
|  | 	IORLW, | ||||||
|  | 	MOVLW, | ||||||
|  | 	RETFIE, | ||||||
|  | 	RETLW, | ||||||
|  | 	RETURN, | ||||||
|  | 	SLEEP, | ||||||
|  | 	SUBLW, | ||||||
|  | 	XORLW | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | class PIC16F88 | ||||||
|  | { | ||||||
|  | public: | ||||||
|  | 	PIC16F88(ROM *ProgramMemory); | ||||||
|  | 	void Step(); | ||||||
|  |  | ||||||
|  | private: | ||||||
|  | 	uint8_t q; | ||||||
|  | 	bool nextIsNop, trapped; | ||||||
|  | 	Memory *memory; | ||||||
|  | 	ROM *program; | ||||||
|  | 	Stack<uint16_t, 8> *CallStack; | ||||||
|  | 	Register<uint16_t> *PC; | ||||||
|  | 	Register<> *WREG, *PCL, *STATUS, *PCLATCH; | ||||||
|  | 	PIC16F88Instruction inst; | ||||||
|  | 	uint16_t instrWord; | ||||||
|  |  | ||||||
|  | private: | ||||||
|  | 	void DecodeInstruction(); | ||||||
|  | 	void ProcessInstruction(); | ||||||
|  |  | ||||||
|  | 	uint8_t GetBank(); | ||||||
|  | 	uint8_t GetMemoryContents(uint8_t partialAddress); | ||||||
|  | 	void SetMemoryContents(uint8_t partialAddress, uint8_t newVal); | ||||||
|  | 	void CheckZero(uint8_t value); | ||||||
|  | 	void StoreValue(uint8_t value, bool updateZero); | ||||||
|  | 	uint8_t SetCarry(bool val); | ||||||
|  | 	uint16_t GetPCHFinalBits(); | ||||||
|  | }; | ||||||
							
								
								
									
										32
									
								
								samples/C++/Memory16F88.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								samples/C++/Memory16F88.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,32 @@ | |||||||
|  | /* | ||||||
|  |  * This file is part of PIC | ||||||
|  |  * Copyright © 2012 Rachel Mant (dx-mon@users.sourceforge.net) | ||||||
|  |  * | ||||||
|  |  * PIC is free software: you can redistribute it and/or modify | ||||||
|  |  * it under the terms of the GNU Lesser General Public License as published by | ||||||
|  |  * the Free Software Foundation, either version 3 of the License, or | ||||||
|  |  * (at your option) any later version. | ||||||
|  |  * | ||||||
|  |  * PIC 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 Lesser General Public License for more details. | ||||||
|  |  * | ||||||
|  |  * You should have received a copy of the GNU Lesser General Public License | ||||||
|  |  * along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #include "Memory.h" | ||||||
|  |  | ||||||
|  | class Memory16F88 : public Memory | ||||||
|  | { | ||||||
|  | private: | ||||||
|  | 	uint8_t memory[512]; | ||||||
|  | 	std::map<uint32_t, MemoryLocation *> memoryMap; | ||||||
|  |  | ||||||
|  | public: | ||||||
|  | 	Memory16F88(); | ||||||
|  | 	uint8_t Dereference(uint8_t bank, uint8_t partialAddress); | ||||||
|  | 	uint8_t *Reference(uint8_t bank, uint8_t partialAddress); | ||||||
|  | 	uint8_t *operator [](uint32_t ref); | ||||||
|  | }; | ||||||
							
								
								
									
										76
									
								
								samples/C++/ThreadedQueue.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								samples/C++/ThreadedQueue.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,76 @@ | |||||||
|  | /* | ||||||
|  |  * This file is part of IRCBot | ||||||
|  |  * Copyright © 2014 Rachel Mant (dx-mon@users.sourceforge.net) | ||||||
|  |  * | ||||||
|  |  * IRCBot 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. | ||||||
|  |  * | ||||||
|  |  * IRCBot 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/>. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #ifndef __THREADED_QUEUE_H__ | ||||||
|  | #define __THREADED_QUEUE_H__ | ||||||
|  |  | ||||||
|  | #include <pthread.h> | ||||||
|  | #include <queue> | ||||||
|  |  | ||||||
|  | template<class T> | ||||||
|  | class ThreadedQueue : public std::queue<T> | ||||||
|  | { | ||||||
|  | private: | ||||||
|  | 	pthread_mutex_t queueMutex; | ||||||
|  | 	pthread_cond_t queueCond; | ||||||
|  |  | ||||||
|  | public: | ||||||
|  | 	ThreadedQueue() | ||||||
|  | 	{ | ||||||
|  | 		pthread_mutexattr_t mutexAttrs; | ||||||
|  | 		pthread_condattr_t condAttrs; | ||||||
|  |  | ||||||
|  | 		pthread_mutexattr_init(&mutexAttrs); | ||||||
|  | 		pthread_mutexattr_settype(&mutexAttrs, PTHREAD_MUTEX_ERRORCHECK); | ||||||
|  | 		pthread_mutex_init(&queueMutex, &mutexAttrs); | ||||||
|  | 		pthread_mutexattr_destroy(&mutexAttrs); | ||||||
|  |  | ||||||
|  | 		pthread_condattr_init(&condAttrs); | ||||||
|  | 		pthread_condattr_setpshared(&condAttrs, PTHREAD_PROCESS_PRIVATE); | ||||||
|  | 		pthread_cond_init(&queueCond, &condAttrs); | ||||||
|  | 		pthread_condattr_destroy(&condAttrs); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	~ThreadedQueue() | ||||||
|  | 	{ | ||||||
|  | 		pthread_cond_destroy(&queueCond); | ||||||
|  | 		pthread_mutex_destroy(&queueMutex); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	void waitItems() | ||||||
|  | 	{ | ||||||
|  | 		pthread_mutex_lock(&queueMutex); | ||||||
|  | 		pthread_cond_wait(&queueCond, &queueMutex); | ||||||
|  | 		pthread_mutex_unlock(&queueMutex); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	void signalItems() | ||||||
|  | 	{ | ||||||
|  | 		pthread_mutex_lock(&queueMutex); | ||||||
|  | 		pthread_cond_broadcast(&queueCond); | ||||||
|  | 		pthread_mutex_unlock(&queueMutex); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	void push(T item) | ||||||
|  | 	{ | ||||||
|  | 		std::queue<T>::push(item); | ||||||
|  | 		signalItems(); | ||||||
|  | 	} | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | #endif /*__THREADED_QUEUE_H__*/ | ||||||
							
								
								
									
										10
									
								
								samples/C++/bar.hh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								samples/C++/bar.hh
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | |||||||
|  | class Bar | ||||||
|  | { | ||||||
|  |   protected: | ||||||
|  |  | ||||||
|  |     char *name; | ||||||
|  |  | ||||||
|  |   public: | ||||||
|  |  | ||||||
|  |     void hello(); | ||||||
|  | } | ||||||
							
								
								
									
										145
									
								
								samples/C/2D.C
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										145
									
								
								samples/C/2D.C
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,145 @@ | |||||||
|  | #include "2D.h" | ||||||
|  | #include <math.h> | ||||||
|  |  | ||||||
|  | void set_vgabasemem(void) | ||||||
|  | { | ||||||
|  |     ULONG vgabase; | ||||||
|  |     SELECTOR tmp; | ||||||
|  |     asm mov [tmp], ds | ||||||
|  |     dpmi_get_sel_base(&vgabase, tmp); | ||||||
|  |     vgabasemem = (char *)(-vgabase + 0xa0000); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void drw_chdis(int mode) // change the display! | ||||||
|  | { | ||||||
|  |     regs.b.ah = 0x00;   // seet theh display moode | ||||||
|  |     regs.b.al = mode;  // change it to the mode like innit | ||||||
|  |     regs.h.flags = 0x72;// Set the dingoes kidneys out of FLAGS eh? | ||||||
|  |     regs.h.ss = 0;     // Like, totally set the stack segment | ||||||
|  |     regs.h.sp = 0;     // Set tha stack pointaaaaahhhhh!!! | ||||||
|  |     dpmi_simulate_real_interrupt(0x10, ®s); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void drw_pix(int x, int y, enum COLORS col) | ||||||
|  | { | ||||||
|  |     *VGAPIX(x, y) = col; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void drw_line(int x0, int y0, int x1, int y1, enum COLORS col) | ||||||
|  | { | ||||||
|  |     // Going for the optimized version of bresenham's line algo.         | ||||||
|  |     int stp = (abs(y0 - y1) > abs(x0 - x1)); | ||||||
|  |     int tmp, dx, dy, err, yi, i, j; // yi = y excrement | ||||||
|  |     if (stp) { | ||||||
|  |         // swappity swap | ||||||
|  |         tmp = y0; | ||||||
|  |         y0 = x0; | ||||||
|  |         x0 = tmp; | ||||||
|  |          | ||||||
|  |         tmp = y1; | ||||||
|  |         y1 = x1; | ||||||
|  |         x1 = tmp; | ||||||
|  |     } | ||||||
|  |     // AAAAND NOW WE MUST DO ZEES AGAIN :( | ||||||
|  |     // I'm sure there was a func somewhere that does this? :P | ||||||
|  |     if (x0 > x1) { | ||||||
|  |         tmp = x0; | ||||||
|  |         x0 = x1; | ||||||
|  |         x1 = tmp; | ||||||
|  |          | ||||||
|  |         tmp = y0; | ||||||
|  |         y0 = y1; | ||||||
|  |         y1 = tmp; | ||||||
|  |     } | ||||||
|  |     dx = (x1 - x0); | ||||||
|  |     dy = (abs(y1 - y0)); | ||||||
|  |     err = (dx / 2); | ||||||
|  |  | ||||||
|  |     if (y0 < y1) | ||||||
|  |         yi = 1; | ||||||
|  |     else | ||||||
|  |         yi = -1; | ||||||
|  |     j = y0; | ||||||
|  |     for (i = x0; i < x1; i++) | ||||||
|  |     { | ||||||
|  |         if (stp) | ||||||
|  |             *VGAPIX(j, i) = col; | ||||||
|  |         else | ||||||
|  |             *VGAPIX(i, j) = col; | ||||||
|  |  | ||||||
|  |         err -= dy; | ||||||
|  |         if (err < 0) { | ||||||
|  |             j += yi; | ||||||
|  |             err += dx; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void drw_rectl(int x, int y, int w, int h, enum COLORS col) | ||||||
|  | { | ||||||
|  |     drw_line(x, y, x+w, y, col); | ||||||
|  |     drw_line(x+w, y, x+w, y+h, col); | ||||||
|  |  | ||||||
|  |     drw_line(x, y, x, y+h, col); | ||||||
|  |     drw_line(x, y+h, x+w+1, y+h, col); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void drw_rectf(int x, int y, int w, int h, enum COLORS col) | ||||||
|  | { | ||||||
|  |     int i, j; | ||||||
|  |     for (j = y; j < x+h; j++) { | ||||||
|  |         for (i = x; i < y+w; i++) { | ||||||
|  |             *VGAPIX(i, j) = col; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void drw_circl(int x, int y, int rad, enum COLORS col) | ||||||
|  | { | ||||||
|  |     int mang, i; // max angle, haha | ||||||
|  |     int px, py; | ||||||
|  |     mang = 360; // Yeah yeah I'll switch to rad later | ||||||
|  |     for (i = 0; i <= mang; i++) | ||||||
|  |     {    | ||||||
|  |         px = cos(i)*rad + x; // + px; // causes some really cools effects! :D | ||||||
|  |         py = sin(i)*rad + y; // + py; | ||||||
|  |         *VGAPIX(px, py) = col; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void drw_tex(int x, int y, int w, int h, enum COLORS tex[]) | ||||||
|  | {   // i*w+j | ||||||
|  |     int i, j; | ||||||
|  |     for (i = 0; i < w; i++) | ||||||
|  |     { | ||||||
|  |         for (j = 0; j < h; j++) | ||||||
|  |         { | ||||||
|  |             *VGAPIX(x+i, y+j) = tex[j*w+i]; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void 2D_init(void) | ||||||
|  | { | ||||||
|  |     set_vgabasemem(); | ||||||
|  |     drw_chdis(0x13); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void 2D_exit(void) | ||||||
|  | { | ||||||
|  |     drw_chdis(3); | ||||||
|  | } | ||||||
|  | /* | ||||||
|  | int main() | ||||||
|  | { | ||||||
|  |     set_vgabasemem(); | ||||||
|  |     drw_chdis(0x13); | ||||||
|  |  | ||||||
|  |     while(!kbhit()) { | ||||||
|  |         if ((getch()) == 0x1b) // escape | ||||||
|  |             break; | ||||||
|  |     } | ||||||
|  |     drw_chdis(3); | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  | */ | ||||||
							
								
								
									
										29
									
								
								samples/C/2D.H
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								samples/C/2D.H
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,29 @@ | |||||||
|  | #ifndef __2DGFX | ||||||
|  | #define __2DGFX | ||||||
|  | // Includes | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <math.h> | ||||||
|  | #include <conio.h> | ||||||
|  | #include <dpmi.h> | ||||||
|  |  | ||||||
|  | // Defines | ||||||
|  | #define VGAPIX(x,y) (vgabasemem + (x) + (y) * 320) | ||||||
|  |  | ||||||
|  | // Variables | ||||||
|  | char * vgabasemem; | ||||||
|  | DPMI_REGS regs; | ||||||
|  |  | ||||||
|  | // Drawing functions: | ||||||
|  | //void setvgabasemem(void); | ||||||
|  | void drw_chdis(int mode); // draw_func_change_display | ||||||
|  | void drw_pix(int x, int y, enum COLORS col); | ||||||
|  | void drw_line(int x0, int y0, int x1, int y1, enum COLORS col); | ||||||
|  | void drw_rectl(int x, int y, int w, int h, enum COLORS col); | ||||||
|  | void drw_rectf(int x, int y, int w, int h, enum COLORS col); | ||||||
|  | void drw_cirl(int x, int y, int rad, enum COLORS col); | ||||||
|  | void drw_tex(int x, int y, int w, int h, enum COLORS tex[]); | ||||||
|  | void 2D_init(void); | ||||||
|  | void 2D_exit(void); | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #endif | ||||||
							
								
								
									
										93
									
								
								samples/C/ArrowLeft.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										93
									
								
								samples/C/ArrowLeft.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,93 @@ | |||||||
|  | /* | ||||||
|  |  * This file is part of GTK++ (libGTK++) | ||||||
|  |  * Copyright © 2012 Rachel Mant (dx-mon@users.sourceforge.net) | ||||||
|  |  * | ||||||
|  |  * GTK++ is free software: you can redistribute it and/or modify | ||||||
|  |  * it under the terms of the GNU Lesser General Public License as published by | ||||||
|  |  * the Free Software Foundation, either version 3 of the License, or | ||||||
|  |  * (at your option) any later version. | ||||||
|  |  * | ||||||
|  |  * GTK++ 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 Lesser General Public License for more details. | ||||||
|  |  * | ||||||
|  |  * You should have received a copy of the GNU Lesser General Public License | ||||||
|  |  * along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | /* GdkPixbuf RGBA C-Source image dump */ | ||||||
|  |  | ||||||
|  | #ifdef __SUNPRO_C | ||||||
|  | #pragma align 4 (ArrowLeft) | ||||||
|  | #endif | ||||||
|  | #ifdef __GNUC__ | ||||||
|  | static const uint8_t ArrowLeft[] __attribute__ ((__aligned__ (4))) =  | ||||||
|  | #else | ||||||
|  | static const uint8_t ArrowLeft[] =  | ||||||
|  | #endif | ||||||
|  | { "" | ||||||
|  |   /* Pixbuf magic (0x47646b50) */ | ||||||
|  |   "GdkP" | ||||||
|  |   /* length: header (24) + pixel_data (1600) */ | ||||||
|  |   "\0\0\6X" | ||||||
|  |   /* pixdata_type (0x1010002) */ | ||||||
|  |   "\1\1\0\2" | ||||||
|  |   /* rowstride (80) */ | ||||||
|  |   "\0\0\0P" | ||||||
|  |   /* width (20) */ | ||||||
|  |   "\0\0\0\24" | ||||||
|  |   /* height (20) */ | ||||||
|  |   "\0\0\0\24" | ||||||
|  |   /* pixel_data: */ | ||||||
|  |   "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" | ||||||
|  |   "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" | ||||||
|  |   "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" | ||||||
|  |   "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" | ||||||
|  |   "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" | ||||||
|  |   "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" | ||||||
|  |   "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" | ||||||
|  |   "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" | ||||||
|  |   "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" | ||||||
|  |   "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" | ||||||
|  |   "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\0\0" | ||||||
|  |   "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" | ||||||
|  |   "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" | ||||||
|  |   "\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" | ||||||
|  |   "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" | ||||||
|  |   "\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0" | ||||||
|  |   "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" | ||||||
|  |   "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377" | ||||||
|  |   "\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" | ||||||
|  |   "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" | ||||||
|  |   "\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0" | ||||||
|  |   "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" | ||||||
|  |   "\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377" | ||||||
|  |   "\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" | ||||||
|  |   "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" | ||||||
|  |   "\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0" | ||||||
|  |   "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" | ||||||
|  |   "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0" | ||||||
|  |   "\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" | ||||||
|  |   "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" | ||||||
|  |   "\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" | ||||||
|  |   "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" | ||||||
|  |   "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0" | ||||||
|  |   "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" | ||||||
|  |   "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" | ||||||
|  |   "\0\0\0\0\0\0\0\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" | ||||||
|  |   "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" | ||||||
|  |   "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" | ||||||
|  |   "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" | ||||||
|  |   "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" | ||||||
|  |   "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" | ||||||
|  |   "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" | ||||||
|  |   "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" | ||||||
|  |   "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" | ||||||
|  |   "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" | ||||||
|  |   "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" | ||||||
|  |   "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" | ||||||
|  |   "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" | ||||||
|  |   "\0\0"}; | ||||||
|  |  | ||||||
|  |  | ||||||
							
								
								
									
										903
									
								
								samples/C/GLKMatrix4.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										903
									
								
								samples/C/GLKMatrix4.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,903 @@ | |||||||
|  | // | ||||||
|  | //  GLKMatrix4.h | ||||||
|  | //  GLKit | ||||||
|  | // | ||||||
|  | //  Copyright (c) 2011, Apple Inc. All rights reserved. | ||||||
|  | // | ||||||
|  |  | ||||||
|  | #ifndef __GLK_MATRIX_4_H | ||||||
|  | #define __GLK_MATRIX_4_H | ||||||
|  |  | ||||||
|  | #include <stddef.h> | ||||||
|  | #include <stdbool.h> | ||||||
|  | #include <math.h> | ||||||
|  |  | ||||||
|  | #if defined(__ARM_NEON__) | ||||||
|  | #include <arm_neon.h> | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #include <GLKit/GLKMathTypes.h> | ||||||
|  | #include <GLKit/GLKVector3.h> | ||||||
|  | #include <GLKit/GLKVector4.h> | ||||||
|  | #include <GLKit/GLKQuaternion.h> | ||||||
|  |  | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #pragma mark - | ||||||
|  | #pragma mark Prototypes | ||||||
|  | #pragma mark - | ||||||
|  |  | ||||||
|  | extern const GLKMatrix4 GLKMatrix4Identity; | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  m30, m31, and m32 correspond to the translation values tx, ty, tz, respectively. | ||||||
|  |  */ | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4Make(float m00, float m01, float m02, float m03, | ||||||
|  |                                             float m10, float m11, float m12, float m13, | ||||||
|  |                                             float m20, float m21, float m22, float m23, | ||||||
|  |                                             float m30, float m31, float m32, float m33); | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  m03, m13, and m23 correspond to the translation values tx, ty, tz, respectively. | ||||||
|  |  */ | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4MakeAndTranspose(float m00, float m01, float m02, float m03, | ||||||
|  |                                                         float m10, float m11, float m12, float m13, | ||||||
|  |                                                         float m20, float m21, float m22, float m23, | ||||||
|  |                                                         float m30, float m31, float m32, float m33); | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  m[12], m[13], and m[14] correspond to the translation values tx, ty, and tz, respectively. | ||||||
|  |  */ | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4MakeWithArray(float values[16]); | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  m[3], m[7], and m[11] correspond to the translation values tx, ty, and tz, respectively. | ||||||
|  |  */ | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4MakeWithArrayAndTranspose(float values[16]); | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  row0, row1, and row2's last component should correspond to the translation values tx, ty, and tz, respectively. | ||||||
|  |  */ | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4MakeWithRows(GLKVector4 row0, | ||||||
|  |                                                     GLKVector4 row1, | ||||||
|  |                                                     GLKVector4 row2, | ||||||
|  |                                                     GLKVector4 row3); | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  column3's first three components should correspond to the translation values tx, ty, and tz. | ||||||
|  |  */ | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4MakeWithColumns(GLKVector4 column0, | ||||||
|  |                                                        GLKVector4 column1, | ||||||
|  |                                                        GLKVector4 column2, | ||||||
|  |                                                        GLKVector4 column3); | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  The quaternion will be normalized before conversion. | ||||||
|  |  */ | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4MakeWithQuaternion(GLKQuaternion quaternion); | ||||||
|  |  | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4MakeTranslation(float tx, float ty, float tz); | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4MakeScale(float sx, float sy, float sz); | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4MakeRotation(float radians, float x, float y, float z); | ||||||
|  |  | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4MakeXRotation(float radians); | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4MakeYRotation(float radians); | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4MakeZRotation(float radians); | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  Equivalent to gluPerspective. | ||||||
|  |  */ | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4MakePerspective(float fovyRadians, float aspect, float nearZ, float farZ); | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  Equivalent to glFrustum. | ||||||
|  |  */ | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4MakeFrustum(float left, float right, | ||||||
|  |                                                    float bottom, float top, | ||||||
|  |                                                    float nearZ, float farZ); | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  Equivalent to glOrtho. | ||||||
|  |  */ | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4MakeOrtho(float left, float right, | ||||||
|  |                                                  float bottom, float top, | ||||||
|  |                                                  float nearZ, float farZ); | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  Equivalent to gluLookAt. | ||||||
|  |  */ | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4MakeLookAt(float eyeX, float eyeY, float eyeZ, | ||||||
|  |                                                   float centerX, float centerY, float centerZ, | ||||||
|  |                                                   float upX, float upY, float upZ); | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  Returns the upper left 3x3 portion of the 4x4 matrix. | ||||||
|  |  */ | ||||||
|  | static __inline__ GLKMatrix3 GLKMatrix4GetMatrix3(GLKMatrix4 matrix); | ||||||
|  | /* | ||||||
|  |  Returns the upper left 2x2 portion of the 4x4 matrix. | ||||||
|  |  */ | ||||||
|  | static __inline__ GLKMatrix2 GLKMatrix4GetMatrix2(GLKMatrix4 matrix); | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  GLKMatrix4GetRow returns vectors for rows 0, 1, and 2 whose last component will be the translation value tx, ty, and tz, respectively. | ||||||
|  |  Valid row values range from 0 to 3, inclusive. | ||||||
|  |  */ | ||||||
|  | static __inline__ GLKVector4 GLKMatrix4GetRow(GLKMatrix4 matrix, int row); | ||||||
|  | /* | ||||||
|  |  GLKMatrix4GetColumn returns a vector for column 3 whose first three components will be the translation values tx, ty, and tz. | ||||||
|  |  Valid column values range from 0 to 3, inclusive. | ||||||
|  |  */ | ||||||
|  | static __inline__ GLKVector4 GLKMatrix4GetColumn(GLKMatrix4 matrix, int column); | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  GLKMatrix4SetRow expects that the vector for row 0, 1, and 2 will have a translation value as its last component. | ||||||
|  |  Valid row values range from 0 to 3, inclusive. | ||||||
|  |  */ | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4SetRow(GLKMatrix4 matrix, int row, GLKVector4 vector); | ||||||
|  | /* | ||||||
|  |  GLKMatrix4SetColumn expects that the vector for column 3 will contain the translation values tx, ty, and tz as its first three components, respectively. | ||||||
|  |  Valid column values range from 0 to 3, inclusive. | ||||||
|  |  */ | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4SetColumn(GLKMatrix4 matrix, int column, GLKVector4 vector); | ||||||
|  |  | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4Transpose(GLKMatrix4 matrix); | ||||||
|  |  | ||||||
|  | GLKMatrix4 GLKMatrix4Invert(GLKMatrix4 matrix, bool *isInvertible); | ||||||
|  | GLKMatrix4 GLKMatrix4InvertAndTranspose(GLKMatrix4 matrix, bool *isInvertible); | ||||||
|  |  | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4Multiply(GLKMatrix4 matrixLeft, GLKMatrix4 matrixRight); | ||||||
|  |  | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4Add(GLKMatrix4 matrixLeft, GLKMatrix4 matrixRight); | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4Subtract(GLKMatrix4 matrixLeft, GLKMatrix4 matrixRight); | ||||||
|  |  | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4Translate(GLKMatrix4 matrix, float tx, float ty, float tz); | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4TranslateWithVector3(GLKMatrix4 matrix, GLKVector3 translationVector); | ||||||
|  | /* | ||||||
|  |  The last component of the GLKVector4, translationVector, is ignored. | ||||||
|  |  */ | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4TranslateWithVector4(GLKMatrix4 matrix, GLKVector4 translationVector); | ||||||
|  |  | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4Scale(GLKMatrix4 matrix, float sx, float sy, float sz); | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4ScaleWithVector3(GLKMatrix4 matrix, GLKVector3 scaleVector); | ||||||
|  | /* | ||||||
|  |  The last component of the GLKVector4, scaleVector, is ignored. | ||||||
|  |  */ | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4ScaleWithVector4(GLKMatrix4 matrix, GLKVector4 scaleVector); | ||||||
|  |  | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4Rotate(GLKMatrix4 matrix, float radians, float x, float y, float z); | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4RotateWithVector3(GLKMatrix4 matrix, float radians, GLKVector3 axisVector); | ||||||
|  | /* | ||||||
|  |  The last component of the GLKVector4, axisVector, is ignored. | ||||||
|  |  */ | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4RotateWithVector4(GLKMatrix4 matrix, float radians, GLKVector4 axisVector); | ||||||
|  |  | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4RotateX(GLKMatrix4 matrix, float radians); | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4RotateY(GLKMatrix4 matrix, float radians); | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4RotateZ(GLKMatrix4 matrix, float radians); | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  Assumes 0 in the w component. | ||||||
|  |  */ | ||||||
|  | static __inline__ GLKVector3 GLKMatrix4MultiplyVector3(GLKMatrix4 matrixLeft, GLKVector3 vectorRight); | ||||||
|  | /* | ||||||
|  |  Assumes 1 in the w component. | ||||||
|  |  */ | ||||||
|  | static __inline__ GLKVector3 GLKMatrix4MultiplyVector3WithTranslation(GLKMatrix4 matrixLeft, GLKVector3 vectorRight); | ||||||
|  | /* | ||||||
|  |  Assumes 1 in the w component and divides the resulting vector by w before returning. | ||||||
|  |  */ | ||||||
|  | static __inline__ GLKVector3 GLKMatrix4MultiplyAndProjectVector3(GLKMatrix4 matrixLeft, GLKVector3 vectorRight); | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  Assumes 0 in the w component. | ||||||
|  |  */ | ||||||
|  | static __inline__ void GLKMatrix4MultiplyVector3Array(GLKMatrix4 matrix, GLKVector3 *vectors, size_t vectorCount); | ||||||
|  | /* | ||||||
|  |  Assumes 1 in the w component. | ||||||
|  |  */ | ||||||
|  | static __inline__ void GLKMatrix4MultiplyVector3ArrayWithTranslation(GLKMatrix4 matrix, GLKVector3 *vectors, size_t vectorCount); | ||||||
|  | /* | ||||||
|  |  Assumes 1 in the w component and divides the resulting vector by w before returning. | ||||||
|  |  */ | ||||||
|  | static __inline__ void GLKMatrix4MultiplyAndProjectVector3Array(GLKMatrix4 matrix, GLKVector3 *vectors, size_t vectorCount); | ||||||
|  |  | ||||||
|  | static __inline__ GLKVector4 GLKMatrix4MultiplyVector4(GLKMatrix4 matrixLeft, GLKVector4 vectorRight); | ||||||
|  |  | ||||||
|  | static __inline__ void GLKMatrix4MultiplyVector4Array(GLKMatrix4 matrix, GLKVector4 *vectors, size_t vectorCount); | ||||||
|  |  | ||||||
|  | #pragma mark - | ||||||
|  | #pragma mark Implementations | ||||||
|  | #pragma mark - | ||||||
|  |  | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4Make(float m00, float m01, float m02, float m03, | ||||||
|  |                                             float m10, float m11, float m12, float m13, | ||||||
|  |                                             float m20, float m21, float m22, float m23, | ||||||
|  |                                             float m30, float m31, float m32, float m33) | ||||||
|  | { | ||||||
|  |     GLKMatrix4 m = { m00, m01, m02, m03, | ||||||
|  |                      m10, m11, m12, m13, | ||||||
|  |                      m20, m21, m22, m23, | ||||||
|  |                      m30, m31, m32, m33 }; | ||||||
|  |     return m; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4MakeAndTranspose(float m00, float m01, float m02, float m03, | ||||||
|  |                                                         float m10, float m11, float m12, float m13, | ||||||
|  |                                                         float m20, float m21, float m22, float m23, | ||||||
|  |                                                         float m30, float m31, float m32, float m33) | ||||||
|  | { | ||||||
|  |     GLKMatrix4 m = { m00, m10, m20, m30, | ||||||
|  |                      m01, m11, m21, m31, | ||||||
|  |                      m02, m12, m22, m32, | ||||||
|  |                      m03, m13, m23, m33 }; | ||||||
|  |     return m; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4MakeWithArray(float values[16]) | ||||||
|  | { | ||||||
|  |     GLKMatrix4 m = { values[0], values[1], values[2], values[3], | ||||||
|  |                      values[4], values[5], values[6], values[7], | ||||||
|  |                      values[8], values[9], values[10], values[11], | ||||||
|  |                      values[12], values[13], values[14], values[15] }; | ||||||
|  |     return m; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4MakeWithArrayAndTranspose(float values[16]) | ||||||
|  | { | ||||||
|  | #if defined(__ARM_NEON__) | ||||||
|  |     float32x4x4_t m = vld4q_f32(values); | ||||||
|  |     return *(GLKMatrix4 *)&m; | ||||||
|  | #else | ||||||
|  |     GLKMatrix4 m = { values[0], values[4], values[8], values[12], | ||||||
|  |                      values[1], values[5], values[9], values[13], | ||||||
|  |                      values[2], values[6], values[10], values[14], | ||||||
|  |                      values[3], values[7], values[11], values[15] }; | ||||||
|  |     return m; | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4MakeWithRows(GLKVector4 row0, | ||||||
|  |                                                     GLKVector4 row1, | ||||||
|  |                                                     GLKVector4 row2, | ||||||
|  |                                                     GLKVector4 row3) | ||||||
|  | { | ||||||
|  |     GLKMatrix4 m = { row0.v[0], row1.v[0], row2.v[0], row3.v[0], | ||||||
|  |                      row0.v[1], row1.v[1], row2.v[1], row3.v[1], | ||||||
|  |                      row0.v[2], row1.v[2], row2.v[2], row3.v[2], | ||||||
|  |                      row0.v[3], row1.v[3], row2.v[3], row3.v[3] }; | ||||||
|  |     return m; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4MakeWithColumns(GLKVector4 column0, | ||||||
|  |                                                        GLKVector4 column1, | ||||||
|  |                                                        GLKVector4 column2, | ||||||
|  |                                                        GLKVector4 column3) | ||||||
|  | { | ||||||
|  | #if defined(__ARM_NEON__) | ||||||
|  |     float32x4x4_t m; | ||||||
|  |     m.val[0] = vld1q_f32(column0.v); | ||||||
|  |     m.val[1] = vld1q_f32(column1.v); | ||||||
|  |     m.val[2] = vld1q_f32(column2.v); | ||||||
|  |     m.val[3] = vld1q_f32(column3.v); | ||||||
|  |     return *(GLKMatrix4 *)&m; | ||||||
|  | #else | ||||||
|  |     GLKMatrix4 m = { column0.v[0], column0.v[1], column0.v[2], column0.v[3], | ||||||
|  |                      column1.v[0], column1.v[1], column1.v[2], column1.v[3], | ||||||
|  |                      column2.v[0], column2.v[1], column2.v[2], column2.v[3], | ||||||
|  |                      column3.v[0], column3.v[1], column3.v[2], column3.v[3] }; | ||||||
|  |     return m; | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4MakeWithQuaternion(GLKQuaternion quaternion) | ||||||
|  | { | ||||||
|  |     quaternion = GLKQuaternionNormalize(quaternion); | ||||||
|  |  | ||||||
|  |     float x = quaternion.q[0]; | ||||||
|  |     float y = quaternion.q[1]; | ||||||
|  |     float z = quaternion.q[2]; | ||||||
|  |     float w = quaternion.q[3]; | ||||||
|  |  | ||||||
|  |     float _2x = x + x; | ||||||
|  |     float _2y = y + y; | ||||||
|  |     float _2z = z + z; | ||||||
|  |     float _2w = w + w; | ||||||
|  |  | ||||||
|  |     GLKMatrix4 m = { 1.0f - _2y * y - _2z * z, | ||||||
|  |                      _2x * y + _2w * z, | ||||||
|  |                      _2x * z - _2w * y, | ||||||
|  |                      0.0f, | ||||||
|  |                      _2x * y - _2w * z, | ||||||
|  |                      1.0f - _2x * x - _2z * z, | ||||||
|  |                      _2y * z + _2w * x, | ||||||
|  |                      0.0f, | ||||||
|  |                      _2x * z + _2w * y, | ||||||
|  |                      _2y * z - _2w * x, | ||||||
|  |                      1.0f - _2x * x - _2y * y, | ||||||
|  |                      0.0f, | ||||||
|  |                      0.0f, | ||||||
|  |                      0.0f, | ||||||
|  |                      0.0f, | ||||||
|  |                      1.0f }; | ||||||
|  |  | ||||||
|  |     return m; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4MakeTranslation(float tx, float ty, float tz) | ||||||
|  | { | ||||||
|  |     GLKMatrix4 m = GLKMatrix4Identity; | ||||||
|  |     m.m[12] = tx; | ||||||
|  |     m.m[13] = ty; | ||||||
|  |     m.m[14] = tz; | ||||||
|  |     return m; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4MakeScale(float sx, float sy, float sz) | ||||||
|  | { | ||||||
|  |     GLKMatrix4 m = GLKMatrix4Identity; | ||||||
|  |     m.m[0] = sx; | ||||||
|  |     m.m[5] = sy; | ||||||
|  |     m.m[10] = sz; | ||||||
|  |     return m; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4MakeRotation(float radians, float x, float y, float z) | ||||||
|  | { | ||||||
|  |     GLKVector3 v = GLKVector3Normalize(GLKVector3Make(x, y, z)); | ||||||
|  |     float cos = cosf(radians); | ||||||
|  |     float cosp = 1.0f - cos; | ||||||
|  |     float sin = sinf(radians); | ||||||
|  |  | ||||||
|  |     GLKMatrix4 m = { cos + cosp * v.v[0] * v.v[0], | ||||||
|  |                      cosp * v.v[0] * v.v[1] + v.v[2] * sin, | ||||||
|  |                      cosp * v.v[0] * v.v[2] - v.v[1] * sin, | ||||||
|  |                      0.0f, | ||||||
|  |                      cosp * v.v[0] * v.v[1] - v.v[2] * sin, | ||||||
|  |                      cos + cosp * v.v[1] * v.v[1], | ||||||
|  |                      cosp * v.v[1] * v.v[2] + v.v[0] * sin, | ||||||
|  |                      0.0f, | ||||||
|  |                      cosp * v.v[0] * v.v[2] + v.v[1] * sin, | ||||||
|  |                      cosp * v.v[1] * v.v[2] - v.v[0] * sin, | ||||||
|  |                      cos + cosp * v.v[2] * v.v[2], | ||||||
|  |                      0.0f, | ||||||
|  |                      0.0f, | ||||||
|  |                      0.0f, | ||||||
|  |                      0.0f, | ||||||
|  |                      1.0f }; | ||||||
|  |  | ||||||
|  |     return m; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4MakeXRotation(float radians) | ||||||
|  | { | ||||||
|  |     float cos = cosf(radians); | ||||||
|  |     float sin = sinf(radians); | ||||||
|  |  | ||||||
|  |     GLKMatrix4 m = { 1.0f, 0.0f, 0.0f, 0.0f, | ||||||
|  |                      0.0f, cos, sin, 0.0f, | ||||||
|  |                      0.0f, -sin, cos, 0.0f, | ||||||
|  |                      0.0f, 0.0f, 0.0f, 1.0f }; | ||||||
|  |  | ||||||
|  |     return m; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4MakeYRotation(float radians) | ||||||
|  | { | ||||||
|  |     float cos = cosf(radians); | ||||||
|  |     float sin = sinf(radians); | ||||||
|  |  | ||||||
|  |     GLKMatrix4 m = { cos, 0.0f, -sin, 0.0f, | ||||||
|  |                      0.0f, 1.0f, 0.0f, 0.0f, | ||||||
|  |                      sin, 0.0f, cos, 0.0f, | ||||||
|  |                      0.0f, 0.0f, 0.0f, 1.0f }; | ||||||
|  |  | ||||||
|  |     return m; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4MakeZRotation(float radians) | ||||||
|  | { | ||||||
|  |     float cos = cosf(radians); | ||||||
|  |     float sin = sinf(radians); | ||||||
|  |  | ||||||
|  |     GLKMatrix4 m = { cos, sin, 0.0f, 0.0f, | ||||||
|  |                      -sin, cos, 0.0f, 0.0f, | ||||||
|  |                      0.0f, 0.0f, 1.0f, 0.0f, | ||||||
|  |                      0.0f, 0.0f, 0.0f, 1.0f }; | ||||||
|  |  | ||||||
|  |     return m; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4MakePerspective(float fovyRadians, float aspect, float nearZ, float farZ) | ||||||
|  | { | ||||||
|  |     float cotan = 1.0f / tanf(fovyRadians / 2.0f); | ||||||
|  |  | ||||||
|  |     GLKMatrix4 m = { cotan / aspect, 0.0f, 0.0f, 0.0f, | ||||||
|  |                      0.0f, cotan, 0.0f, 0.0f, | ||||||
|  |                      0.0f, 0.0f, (farZ + nearZ) / (nearZ - farZ), -1.0f, | ||||||
|  |                      0.0f, 0.0f, (2.0f * farZ * nearZ) / (nearZ - farZ), 0.0f }; | ||||||
|  |  | ||||||
|  |     return m; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4MakeFrustum(float left, float right, | ||||||
|  |                                                    float bottom, float top, | ||||||
|  |                                                    float nearZ, float farZ) | ||||||
|  | { | ||||||
|  |     float ral = right + left; | ||||||
|  |     float rsl = right - left; | ||||||
|  |     float tsb = top - bottom; | ||||||
|  |     float tab = top + bottom; | ||||||
|  |     float fan = farZ + nearZ; | ||||||
|  |     float fsn = farZ - nearZ; | ||||||
|  |  | ||||||
|  |     GLKMatrix4 m = { 2.0f * nearZ / rsl, 0.0f, 0.0f, 0.0f, | ||||||
|  |                      0.0f, 2.0f * nearZ / tsb, 0.0f, 0.0f, | ||||||
|  |                      ral / rsl, tab / tsb, -fan / fsn, -1.0f, | ||||||
|  |                      0.0f, 0.0f, (-2.0f * farZ * nearZ) / fsn, 0.0f }; | ||||||
|  |  | ||||||
|  |     return m; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4MakeOrtho(float left, float right, | ||||||
|  |                                                  float bottom, float top, | ||||||
|  |                                                  float nearZ, float farZ) | ||||||
|  | { | ||||||
|  |     float ral = right + left; | ||||||
|  |     float rsl = right - left; | ||||||
|  |     float tab = top + bottom; | ||||||
|  |     float tsb = top - bottom; | ||||||
|  |     float fan = farZ + nearZ; | ||||||
|  |     float fsn = farZ - nearZ; | ||||||
|  |  | ||||||
|  |     GLKMatrix4 m = { 2.0f / rsl, 0.0f, 0.0f, 0.0f, | ||||||
|  |                      0.0f, 2.0f / tsb, 0.0f, 0.0f, | ||||||
|  |                      0.0f, 0.0f, -2.0f / fsn, 0.0f, | ||||||
|  |                      -ral / rsl, -tab / tsb, -fan / fsn, 1.0f }; | ||||||
|  |  | ||||||
|  |     return m; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4MakeLookAt(float eyeX, float eyeY, float eyeZ, | ||||||
|  |                                                   float centerX, float centerY, float centerZ, | ||||||
|  |                                                   float upX, float upY, float upZ) | ||||||
|  | { | ||||||
|  |     GLKVector3 ev = { eyeX, eyeY, eyeZ }; | ||||||
|  |     GLKVector3 cv = { centerX, centerY, centerZ }; | ||||||
|  |     GLKVector3 uv = { upX, upY, upZ }; | ||||||
|  |     GLKVector3 n = GLKVector3Normalize(GLKVector3Add(ev, GLKVector3Negate(cv))); | ||||||
|  |     GLKVector3 u = GLKVector3Normalize(GLKVector3CrossProduct(uv, n)); | ||||||
|  |     GLKVector3 v = GLKVector3CrossProduct(n, u); | ||||||
|  |  | ||||||
|  |     GLKMatrix4 m = { u.v[0], v.v[0], n.v[0], 0.0f, | ||||||
|  |                      u.v[1], v.v[1], n.v[1], 0.0f, | ||||||
|  |                      u.v[2], v.v[2], n.v[2], 0.0f, | ||||||
|  |                      GLKVector3DotProduct(GLKVector3Negate(u), ev), | ||||||
|  |                      GLKVector3DotProduct(GLKVector3Negate(v), ev), | ||||||
|  |                      GLKVector3DotProduct(GLKVector3Negate(n), ev), | ||||||
|  |                      1.0f }; | ||||||
|  |  | ||||||
|  |     return m; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static __inline__ GLKMatrix3 GLKMatrix4GetMatrix3(GLKMatrix4 matrix) | ||||||
|  | { | ||||||
|  |     GLKMatrix3 m = { matrix.m[0], matrix.m[1], matrix.m[2], | ||||||
|  |                      matrix.m[4], matrix.m[5], matrix.m[6], | ||||||
|  |                      matrix.m[8], matrix.m[9], matrix.m[10] }; | ||||||
|  |     return m; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static __inline__ GLKMatrix2 GLKMatrix4GetMatrix2(GLKMatrix4 matrix) | ||||||
|  | { | ||||||
|  |     GLKMatrix2 m = { matrix.m[0], matrix.m[1], | ||||||
|  |                      matrix.m[4], matrix.m[5] }; | ||||||
|  |     return m; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static __inline__ GLKVector4 GLKMatrix4GetRow(GLKMatrix4 matrix, int row) | ||||||
|  | { | ||||||
|  |     GLKVector4 v = { matrix.m[row], matrix.m[4 + row], matrix.m[8 + row], matrix.m[12 + row] }; | ||||||
|  |     return v; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static __inline__ GLKVector4 GLKMatrix4GetColumn(GLKMatrix4 matrix, int column) | ||||||
|  | { | ||||||
|  | #if defined(__ARM_NEON__) | ||||||
|  |     float32x4_t v = vld1q_f32(&(matrix.m[column * 4])); | ||||||
|  |     return *(GLKVector4 *)&v; | ||||||
|  | #else | ||||||
|  |     GLKVector4 v = { matrix.m[column * 4 + 0], matrix.m[column * 4 + 1], matrix.m[column * 4 + 2], matrix.m[column * 4 + 3] }; | ||||||
|  |     return v; | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4SetRow(GLKMatrix4 matrix, int row, GLKVector4 vector) | ||||||
|  | { | ||||||
|  |     matrix.m[row] = vector.v[0]; | ||||||
|  |     matrix.m[row + 4] = vector.v[1]; | ||||||
|  |     matrix.m[row + 8] = vector.v[2]; | ||||||
|  |     matrix.m[row + 12] = vector.v[3]; | ||||||
|  |  | ||||||
|  |     return matrix; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4SetColumn(GLKMatrix4 matrix, int column, GLKVector4 vector) | ||||||
|  | { | ||||||
|  | #if defined(__ARM_NEON__) | ||||||
|  |     float *dst = &(matrix.m[column * 4]); | ||||||
|  |     vst1q_f32(dst, vld1q_f32(vector.v)); | ||||||
|  |     return matrix; | ||||||
|  | #else | ||||||
|  |     matrix.m[column * 4 + 0] = vector.v[0]; | ||||||
|  |     matrix.m[column * 4 + 1] = vector.v[1]; | ||||||
|  |     matrix.m[column * 4 + 2] = vector.v[2]; | ||||||
|  |     matrix.m[column * 4 + 3] = vector.v[3]; | ||||||
|  |  | ||||||
|  |     return matrix; | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4Transpose(GLKMatrix4 matrix) | ||||||
|  | { | ||||||
|  | #if defined(__ARM_NEON__) | ||||||
|  |     float32x4x4_t m = vld4q_f32(matrix.m); | ||||||
|  |     return *(GLKMatrix4 *)&m; | ||||||
|  | #else | ||||||
|  |     GLKMatrix4 m = { matrix.m[0], matrix.m[4], matrix.m[8], matrix.m[12], | ||||||
|  |                      matrix.m[1], matrix.m[5], matrix.m[9], matrix.m[13], | ||||||
|  |                      matrix.m[2], matrix.m[6], matrix.m[10], matrix.m[14], | ||||||
|  |                      matrix.m[3], matrix.m[7], matrix.m[11], matrix.m[15] }; | ||||||
|  |     return m; | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4Multiply(GLKMatrix4 matrixLeft, GLKMatrix4 matrixRight) | ||||||
|  | { | ||||||
|  | #if defined(__ARM_NEON__) | ||||||
|  |     float32x4x4_t iMatrixLeft = *(float32x4x4_t *)&matrixLeft; | ||||||
|  |     float32x4x4_t iMatrixRight = *(float32x4x4_t *)&matrixRight; | ||||||
|  |     float32x4x4_t m; | ||||||
|  |  | ||||||
|  |     m.val[0] = vmulq_n_f32(iMatrixLeft.val[0], vgetq_lane_f32(iMatrixRight.val[0], 0)); | ||||||
|  |     m.val[1] = vmulq_n_f32(iMatrixLeft.val[0], vgetq_lane_f32(iMatrixRight.val[1], 0)); | ||||||
|  |     m.val[2] = vmulq_n_f32(iMatrixLeft.val[0], vgetq_lane_f32(iMatrixRight.val[2], 0)); | ||||||
|  |     m.val[3] = vmulq_n_f32(iMatrixLeft.val[0], vgetq_lane_f32(iMatrixRight.val[3], 0)); | ||||||
|  |  | ||||||
|  |     m.val[0] = vmlaq_n_f32(m.val[0], iMatrixLeft.val[1], vgetq_lane_f32(iMatrixRight.val[0], 1)); | ||||||
|  |     m.val[1] = vmlaq_n_f32(m.val[1], iMatrixLeft.val[1], vgetq_lane_f32(iMatrixRight.val[1], 1)); | ||||||
|  |     m.val[2] = vmlaq_n_f32(m.val[2], iMatrixLeft.val[1], vgetq_lane_f32(iMatrixRight.val[2], 1)); | ||||||
|  |     m.val[3] = vmlaq_n_f32(m.val[3], iMatrixLeft.val[1], vgetq_lane_f32(iMatrixRight.val[3], 1)); | ||||||
|  |  | ||||||
|  |     m.val[0] = vmlaq_n_f32(m.val[0], iMatrixLeft.val[2], vgetq_lane_f32(iMatrixRight.val[0], 2)); | ||||||
|  |     m.val[1] = vmlaq_n_f32(m.val[1], iMatrixLeft.val[2], vgetq_lane_f32(iMatrixRight.val[1], 2)); | ||||||
|  |     m.val[2] = vmlaq_n_f32(m.val[2], iMatrixLeft.val[2], vgetq_lane_f32(iMatrixRight.val[2], 2)); | ||||||
|  |     m.val[3] = vmlaq_n_f32(m.val[3], iMatrixLeft.val[2], vgetq_lane_f32(iMatrixRight.val[3], 2)); | ||||||
|  |  | ||||||
|  |     m.val[0] = vmlaq_n_f32(m.val[0], iMatrixLeft.val[3], vgetq_lane_f32(iMatrixRight.val[0], 3)); | ||||||
|  |     m.val[1] = vmlaq_n_f32(m.val[1], iMatrixLeft.val[3], vgetq_lane_f32(iMatrixRight.val[1], 3)); | ||||||
|  |     m.val[2] = vmlaq_n_f32(m.val[2], iMatrixLeft.val[3], vgetq_lane_f32(iMatrixRight.val[2], 3)); | ||||||
|  |     m.val[3] = vmlaq_n_f32(m.val[3], iMatrixLeft.val[3], vgetq_lane_f32(iMatrixRight.val[3], 3)); | ||||||
|  |  | ||||||
|  |     return *(GLKMatrix4 *)&m; | ||||||
|  | #else | ||||||
|  |     GLKMatrix4 m; | ||||||
|  |  | ||||||
|  |     m.m[0]  = matrixLeft.m[0] * matrixRight.m[0]  + matrixLeft.m[4] * matrixRight.m[1]  + matrixLeft.m[8] * matrixRight.m[2]   + matrixLeft.m[12] * matrixRight.m[3]; | ||||||
|  | 	m.m[4]  = matrixLeft.m[0] * matrixRight.m[4]  + matrixLeft.m[4] * matrixRight.m[5]  + matrixLeft.m[8] * matrixRight.m[6]   + matrixLeft.m[12] * matrixRight.m[7]; | ||||||
|  | 	m.m[8]  = matrixLeft.m[0] * matrixRight.m[8]  + matrixLeft.m[4] * matrixRight.m[9]  + matrixLeft.m[8] * matrixRight.m[10]  + matrixLeft.m[12] * matrixRight.m[11]; | ||||||
|  | 	m.m[12] = matrixLeft.m[0] * matrixRight.m[12] + matrixLeft.m[4] * matrixRight.m[13] + matrixLeft.m[8] * matrixRight.m[14]  + matrixLeft.m[12] * matrixRight.m[15]; | ||||||
|  |  | ||||||
|  | 	m.m[1]  = matrixLeft.m[1] * matrixRight.m[0]  + matrixLeft.m[5] * matrixRight.m[1]  + matrixLeft.m[9] * matrixRight.m[2]   + matrixLeft.m[13] * matrixRight.m[3]; | ||||||
|  | 	m.m[5]  = matrixLeft.m[1] * matrixRight.m[4]  + matrixLeft.m[5] * matrixRight.m[5]  + matrixLeft.m[9] * matrixRight.m[6]   + matrixLeft.m[13] * matrixRight.m[7]; | ||||||
|  | 	m.m[9]  = matrixLeft.m[1] * matrixRight.m[8]  + matrixLeft.m[5] * matrixRight.m[9]  + matrixLeft.m[9] * matrixRight.m[10]  + matrixLeft.m[13] * matrixRight.m[11]; | ||||||
|  | 	m.m[13] = matrixLeft.m[1] * matrixRight.m[12] + matrixLeft.m[5] * matrixRight.m[13] + matrixLeft.m[9] * matrixRight.m[14]  + matrixLeft.m[13] * matrixRight.m[15]; | ||||||
|  |  | ||||||
|  | 	m.m[2]  = matrixLeft.m[2] * matrixRight.m[0]  + matrixLeft.m[6] * matrixRight.m[1]  + matrixLeft.m[10] * matrixRight.m[2]  + matrixLeft.m[14] * matrixRight.m[3]; | ||||||
|  | 	m.m[6]  = matrixLeft.m[2] * matrixRight.m[4]  + matrixLeft.m[6] * matrixRight.m[5]  + matrixLeft.m[10] * matrixRight.m[6]  + matrixLeft.m[14] * matrixRight.m[7]; | ||||||
|  | 	m.m[10] = matrixLeft.m[2] * matrixRight.m[8]  + matrixLeft.m[6] * matrixRight.m[9]  + matrixLeft.m[10] * matrixRight.m[10] + matrixLeft.m[14] * matrixRight.m[11]; | ||||||
|  | 	m.m[14] = matrixLeft.m[2] * matrixRight.m[12] + matrixLeft.m[6] * matrixRight.m[13] + matrixLeft.m[10] * matrixRight.m[14] + matrixLeft.m[14] * matrixRight.m[15]; | ||||||
|  |  | ||||||
|  | 	m.m[3]  = matrixLeft.m[3] * matrixRight.m[0]  + matrixLeft.m[7] * matrixRight.m[1]  + matrixLeft.m[11] * matrixRight.m[2]  + matrixLeft.m[15] * matrixRight.m[3]; | ||||||
|  | 	m.m[7]  = matrixLeft.m[3] * matrixRight.m[4]  + matrixLeft.m[7] * matrixRight.m[5]  + matrixLeft.m[11] * matrixRight.m[6]  + matrixLeft.m[15] * matrixRight.m[7]; | ||||||
|  | 	m.m[11] = matrixLeft.m[3] * matrixRight.m[8]  + matrixLeft.m[7] * matrixRight.m[9]  + matrixLeft.m[11] * matrixRight.m[10] + matrixLeft.m[15] * matrixRight.m[11]; | ||||||
|  | 	m.m[15] = matrixLeft.m[3] * matrixRight.m[12] + matrixLeft.m[7] * matrixRight.m[13] + matrixLeft.m[11] * matrixRight.m[14] + matrixLeft.m[15] * matrixRight.m[15]; | ||||||
|  |  | ||||||
|  |     return m; | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4Add(GLKMatrix4 matrixLeft, GLKMatrix4 matrixRight) | ||||||
|  | { | ||||||
|  | #if defined(__ARM_NEON__) | ||||||
|  |     float32x4x4_t iMatrixLeft = *(float32x4x4_t *)&matrixLeft; | ||||||
|  |     float32x4x4_t iMatrixRight = *(float32x4x4_t *)&matrixRight; | ||||||
|  |     float32x4x4_t m; | ||||||
|  |  | ||||||
|  |     m.val[0] = vaddq_f32(iMatrixLeft.val[0], iMatrixRight.val[0]); | ||||||
|  |     m.val[1] = vaddq_f32(iMatrixLeft.val[1], iMatrixRight.val[1]); | ||||||
|  |     m.val[2] = vaddq_f32(iMatrixLeft.val[2], iMatrixRight.val[2]); | ||||||
|  |     m.val[3] = vaddq_f32(iMatrixLeft.val[3], iMatrixRight.val[3]); | ||||||
|  |  | ||||||
|  |     return *(GLKMatrix4 *)&m; | ||||||
|  | #else | ||||||
|  |     GLKMatrix4 m; | ||||||
|  |  | ||||||
|  |     m.m[0] = matrixLeft.m[0] + matrixRight.m[0]; | ||||||
|  |     m.m[1] = matrixLeft.m[1] + matrixRight.m[1]; | ||||||
|  |     m.m[2] = matrixLeft.m[2] + matrixRight.m[2]; | ||||||
|  |     m.m[3] = matrixLeft.m[3] + matrixRight.m[3]; | ||||||
|  |  | ||||||
|  |     m.m[4] = matrixLeft.m[4] + matrixRight.m[4]; | ||||||
|  |     m.m[5] = matrixLeft.m[5] + matrixRight.m[5]; | ||||||
|  |     m.m[6] = matrixLeft.m[6] + matrixRight.m[6]; | ||||||
|  |     m.m[7] = matrixLeft.m[7] + matrixRight.m[7]; | ||||||
|  |  | ||||||
|  |     m.m[8] = matrixLeft.m[8] + matrixRight.m[8]; | ||||||
|  |     m.m[9] = matrixLeft.m[9] + matrixRight.m[9]; | ||||||
|  |     m.m[10] = matrixLeft.m[10] + matrixRight.m[10]; | ||||||
|  |     m.m[11] = matrixLeft.m[11] + matrixRight.m[11]; | ||||||
|  |  | ||||||
|  |     m.m[12] = matrixLeft.m[12] + matrixRight.m[12]; | ||||||
|  |     m.m[13] = matrixLeft.m[13] + matrixRight.m[13]; | ||||||
|  |     m.m[14] = matrixLeft.m[14] + matrixRight.m[14]; | ||||||
|  |     m.m[15] = matrixLeft.m[15] + matrixRight.m[15]; | ||||||
|  |  | ||||||
|  |     return m; | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4Subtract(GLKMatrix4 matrixLeft, GLKMatrix4 matrixRight) | ||||||
|  | { | ||||||
|  | #if defined(__ARM_NEON__) | ||||||
|  |     float32x4x4_t iMatrixLeft = *(float32x4x4_t *)&matrixLeft; | ||||||
|  |     float32x4x4_t iMatrixRight = *(float32x4x4_t *)&matrixRight; | ||||||
|  |     float32x4x4_t m; | ||||||
|  |  | ||||||
|  |     m.val[0] = vsubq_f32(iMatrixLeft.val[0], iMatrixRight.val[0]); | ||||||
|  |     m.val[1] = vsubq_f32(iMatrixLeft.val[1], iMatrixRight.val[1]); | ||||||
|  |     m.val[2] = vsubq_f32(iMatrixLeft.val[2], iMatrixRight.val[2]); | ||||||
|  |     m.val[3] = vsubq_f32(iMatrixLeft.val[3], iMatrixRight.val[3]); | ||||||
|  |  | ||||||
|  |     return *(GLKMatrix4 *)&m; | ||||||
|  | #else | ||||||
|  |     GLKMatrix4 m; | ||||||
|  |  | ||||||
|  |     m.m[0] = matrixLeft.m[0] - matrixRight.m[0]; | ||||||
|  |     m.m[1] = matrixLeft.m[1] - matrixRight.m[1]; | ||||||
|  |     m.m[2] = matrixLeft.m[2] - matrixRight.m[2]; | ||||||
|  |     m.m[3] = matrixLeft.m[3] - matrixRight.m[3]; | ||||||
|  |  | ||||||
|  |     m.m[4] = matrixLeft.m[4] - matrixRight.m[4]; | ||||||
|  |     m.m[5] = matrixLeft.m[5] - matrixRight.m[5]; | ||||||
|  |     m.m[6] = matrixLeft.m[6] - matrixRight.m[6]; | ||||||
|  |     m.m[7] = matrixLeft.m[7] - matrixRight.m[7]; | ||||||
|  |  | ||||||
|  |     m.m[8] = matrixLeft.m[8] - matrixRight.m[8]; | ||||||
|  |     m.m[9] = matrixLeft.m[9] - matrixRight.m[9]; | ||||||
|  |     m.m[10] = matrixLeft.m[10] - matrixRight.m[10]; | ||||||
|  |     m.m[11] = matrixLeft.m[11] - matrixRight.m[11]; | ||||||
|  |  | ||||||
|  |     m.m[12] = matrixLeft.m[12] - matrixRight.m[12]; | ||||||
|  |     m.m[13] = matrixLeft.m[13] - matrixRight.m[13]; | ||||||
|  |     m.m[14] = matrixLeft.m[14] - matrixRight.m[14]; | ||||||
|  |     m.m[15] = matrixLeft.m[15] - matrixRight.m[15]; | ||||||
|  |  | ||||||
|  |     return m; | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4Translate(GLKMatrix4 matrix, float tx, float ty, float tz) | ||||||
|  | { | ||||||
|  |     GLKMatrix4 m = { matrix.m[0], matrix.m[1], matrix.m[2], matrix.m[3], | ||||||
|  |                      matrix.m[4], matrix.m[5], matrix.m[6], matrix.m[7], | ||||||
|  |                      matrix.m[8], matrix.m[9], matrix.m[10], matrix.m[11], | ||||||
|  |                      matrix.m[0] * tx + matrix.m[4] * ty + matrix.m[8] * tz + matrix.m[12], | ||||||
|  |                      matrix.m[1] * tx + matrix.m[5] * ty + matrix.m[9] * tz + matrix.m[13], | ||||||
|  |                      matrix.m[2] * tx + matrix.m[6] * ty + matrix.m[10] * tz + matrix.m[14], | ||||||
|  |                      matrix.m[15] }; | ||||||
|  |     return m; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4TranslateWithVector3(GLKMatrix4 matrix, GLKVector3 translationVector) | ||||||
|  | { | ||||||
|  |     GLKMatrix4 m = { matrix.m[0], matrix.m[1], matrix.m[2], matrix.m[3], | ||||||
|  |                      matrix.m[4], matrix.m[5], matrix.m[6], matrix.m[7], | ||||||
|  |                      matrix.m[8], matrix.m[9], matrix.m[10], matrix.m[11], | ||||||
|  |                      matrix.m[0] * translationVector.v[0] + matrix.m[4] * translationVector.v[1] + matrix.m[8] * translationVector.v[2] + matrix.m[12], | ||||||
|  |                      matrix.m[1] * translationVector.v[0] + matrix.m[5] * translationVector.v[1] + matrix.m[9] * translationVector.v[2] + matrix.m[13], | ||||||
|  |                      matrix.m[2] * translationVector.v[0] + matrix.m[6] * translationVector.v[1] + matrix.m[10] * translationVector.v[2] + matrix.m[14], | ||||||
|  |                      matrix.m[15] }; | ||||||
|  |     return m; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4TranslateWithVector4(GLKMatrix4 matrix, GLKVector4 translationVector) | ||||||
|  | { | ||||||
|  |     GLKMatrix4 m = { matrix.m[0], matrix.m[1], matrix.m[2], matrix.m[3], | ||||||
|  |                      matrix.m[4], matrix.m[5], matrix.m[6], matrix.m[7], | ||||||
|  |                      matrix.m[8], matrix.m[9], matrix.m[10], matrix.m[11], | ||||||
|  |                      matrix.m[0] * translationVector.v[0] + matrix.m[4] * translationVector.v[1] + matrix.m[8] * translationVector.v[2] + matrix.m[12], | ||||||
|  |                      matrix.m[1] * translationVector.v[0] + matrix.m[5] * translationVector.v[1] + matrix.m[9] * translationVector.v[2] + matrix.m[13], | ||||||
|  |                      matrix.m[2] * translationVector.v[0] + matrix.m[6] * translationVector.v[1] + matrix.m[10] * translationVector.v[2] + matrix.m[14], | ||||||
|  |                      matrix.m[15] }; | ||||||
|  |     return m; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4Scale(GLKMatrix4 matrix, float sx, float sy, float sz) | ||||||
|  | { | ||||||
|  | #if defined(__ARM_NEON__) | ||||||
|  |     float32x4x4_t iMatrix = *(float32x4x4_t *)&matrix; | ||||||
|  |     float32x4x4_t m; | ||||||
|  |  | ||||||
|  |     m.val[0] = vmulq_n_f32(iMatrix.val[0], (float32_t)sx); | ||||||
|  |     m.val[1] = vmulq_n_f32(iMatrix.val[1], (float32_t)sy); | ||||||
|  |     m.val[2] = vmulq_n_f32(iMatrix.val[2], (float32_t)sz); | ||||||
|  |     m.val[3] = iMatrix.val[3]; | ||||||
|  |  | ||||||
|  |     return *(GLKMatrix4 *)&m; | ||||||
|  | #else | ||||||
|  |     GLKMatrix4 m = { matrix.m[0] * sx, matrix.m[1] * sx, matrix.m[2] * sx, matrix.m[3] * sx, | ||||||
|  |                      matrix.m[4] * sy, matrix.m[5] * sy, matrix.m[6] * sy, matrix.m[7] * sy, | ||||||
|  |                      matrix.m[8] * sz, matrix.m[9] * sz, matrix.m[10] * sz, matrix.m[11] * sz, | ||||||
|  |                      matrix.m[12], matrix.m[13], matrix.m[14], matrix.m[15] }; | ||||||
|  |     return m; | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4ScaleWithVector3(GLKMatrix4 matrix, GLKVector3 scaleVector) | ||||||
|  | { | ||||||
|  | #if defined(__ARM_NEON__) | ||||||
|  |     float32x4x4_t iMatrix = *(float32x4x4_t *)&matrix; | ||||||
|  |     float32x4x4_t m; | ||||||
|  |  | ||||||
|  |     m.val[0] = vmulq_n_f32(iMatrix.val[0], (float32_t)scaleVector.v[0]); | ||||||
|  |     m.val[1] = vmulq_n_f32(iMatrix.val[1], (float32_t)scaleVector.v[1]); | ||||||
|  |     m.val[2] = vmulq_n_f32(iMatrix.val[2], (float32_t)scaleVector.v[2]); | ||||||
|  |     m.val[3] = iMatrix.val[3]; | ||||||
|  |  | ||||||
|  |     return *(GLKMatrix4 *)&m; | ||||||
|  | #else | ||||||
|  |     GLKMatrix4 m = { matrix.m[0] * scaleVector.v[0], matrix.m[1] * scaleVector.v[0], matrix.m[2] * scaleVector.v[0], matrix.m[3] * scaleVector.v[0], | ||||||
|  |                      matrix.m[4] * scaleVector.v[1], matrix.m[5] * scaleVector.v[1], matrix.m[6] * scaleVector.v[1], matrix.m[7] * scaleVector.v[1], | ||||||
|  |                      matrix.m[8] * scaleVector.v[2], matrix.m[9] * scaleVector.v[2], matrix.m[10] * scaleVector.v[2], matrix.m[11] * scaleVector.v[2], | ||||||
|  |                      matrix.m[12], matrix.m[13], matrix.m[14], matrix.m[15] }; | ||||||
|  |     return m; | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4ScaleWithVector4(GLKMatrix4 matrix, GLKVector4 scaleVector) | ||||||
|  | { | ||||||
|  | #if defined(__ARM_NEON__) | ||||||
|  |     float32x4x4_t iMatrix = *(float32x4x4_t *)&matrix; | ||||||
|  |     float32x4x4_t m; | ||||||
|  |  | ||||||
|  |     m.val[0] = vmulq_n_f32(iMatrix.val[0], (float32_t)scaleVector.v[0]); | ||||||
|  |     m.val[1] = vmulq_n_f32(iMatrix.val[1], (float32_t)scaleVector.v[1]); | ||||||
|  |     m.val[2] = vmulq_n_f32(iMatrix.val[2], (float32_t)scaleVector.v[2]); | ||||||
|  |     m.val[3] = iMatrix.val[3]; | ||||||
|  |  | ||||||
|  |     return *(GLKMatrix4 *)&m; | ||||||
|  | #else | ||||||
|  |     GLKMatrix4 m = { matrix.m[0] * scaleVector.v[0], matrix.m[1] * scaleVector.v[0], matrix.m[2] * scaleVector.v[0], matrix.m[3] * scaleVector.v[0], | ||||||
|  |                      matrix.m[4] * scaleVector.v[1], matrix.m[5] * scaleVector.v[1], matrix.m[6] * scaleVector.v[1], matrix.m[7] * scaleVector.v[1], | ||||||
|  |                      matrix.m[8] * scaleVector.v[2], matrix.m[9] * scaleVector.v[2], matrix.m[10] * scaleVector.v[2], matrix.m[11] * scaleVector.v[2], | ||||||
|  |                      matrix.m[12], matrix.m[13], matrix.m[14], matrix.m[15] }; | ||||||
|  |     return m; | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4Rotate(GLKMatrix4 matrix, float radians, float x, float y, float z) | ||||||
|  | { | ||||||
|  |     GLKMatrix4 rm = GLKMatrix4MakeRotation(radians, x, y, z); | ||||||
|  |     return GLKMatrix4Multiply(matrix, rm); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4RotateWithVector3(GLKMatrix4 matrix, float radians, GLKVector3 axisVector) | ||||||
|  | { | ||||||
|  |     GLKMatrix4 rm = GLKMatrix4MakeRotation(radians, axisVector.v[0], axisVector.v[1], axisVector.v[2]); | ||||||
|  |     return GLKMatrix4Multiply(matrix, rm); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4RotateWithVector4(GLKMatrix4 matrix, float radians, GLKVector4 axisVector) | ||||||
|  | { | ||||||
|  |     GLKMatrix4 rm = GLKMatrix4MakeRotation(radians, axisVector.v[0], axisVector.v[1], axisVector.v[2]); | ||||||
|  |     return GLKMatrix4Multiply(matrix, rm); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4RotateX(GLKMatrix4 matrix, float radians) | ||||||
|  | { | ||||||
|  |     GLKMatrix4 rm = GLKMatrix4MakeXRotation(radians); | ||||||
|  |     return GLKMatrix4Multiply(matrix, rm); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4RotateY(GLKMatrix4 matrix, float radians) | ||||||
|  | { | ||||||
|  |     GLKMatrix4 rm = GLKMatrix4MakeYRotation(radians); | ||||||
|  |     return GLKMatrix4Multiply(matrix, rm); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static __inline__ GLKMatrix4 GLKMatrix4RotateZ(GLKMatrix4 matrix, float radians) | ||||||
|  | { | ||||||
|  |     GLKMatrix4 rm = GLKMatrix4MakeZRotation(radians); | ||||||
|  |     return GLKMatrix4Multiply(matrix, rm); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static __inline__ GLKVector3 GLKMatrix4MultiplyVector3(GLKMatrix4 matrixLeft, GLKVector3 vectorRight) | ||||||
|  | { | ||||||
|  |     GLKVector4 v4 = GLKMatrix4MultiplyVector4(matrixLeft, GLKVector4Make(vectorRight.v[0], vectorRight.v[1], vectorRight.v[2], 0.0f)); | ||||||
|  |     return GLKVector3Make(v4.v[0], v4.v[1], v4.v[2]); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static __inline__ GLKVector3 GLKMatrix4MultiplyVector3WithTranslation(GLKMatrix4 matrixLeft, GLKVector3 vectorRight) | ||||||
|  | { | ||||||
|  |     GLKVector4 v4 = GLKMatrix4MultiplyVector4(matrixLeft, GLKVector4Make(vectorRight.v[0], vectorRight.v[1], vectorRight.v[2], 1.0f)); | ||||||
|  |     return GLKVector3Make(v4.v[0], v4.v[1], v4.v[2]); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static __inline__ GLKVector3 GLKMatrix4MultiplyAndProjectVector3(GLKMatrix4 matrixLeft, GLKVector3 vectorRight) | ||||||
|  | { | ||||||
|  |     GLKVector4 v4 = GLKMatrix4MultiplyVector4(matrixLeft, GLKVector4Make(vectorRight.v[0], vectorRight.v[1], vectorRight.v[2], 1.0f)); | ||||||
|  |     return GLKVector3MultiplyScalar(GLKVector3Make(v4.v[0], v4.v[1], v4.v[2]), 1.0f / v4.v[3]); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static __inline__ void GLKMatrix4MultiplyVector3Array(GLKMatrix4 matrix, GLKVector3 *vectors, size_t vectorCount) | ||||||
|  | { | ||||||
|  |     size_t i; | ||||||
|  |     for (i=0; i < vectorCount; i++) | ||||||
|  |         vectors[i] = GLKMatrix4MultiplyVector3(matrix, vectors[i]); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static __inline__ void GLKMatrix4MultiplyVector3ArrayWithTranslation(GLKMatrix4 matrix, GLKVector3 *vectors, size_t vectorCount) | ||||||
|  | { | ||||||
|  |     size_t i; | ||||||
|  |     for (i=0; i < vectorCount; i++) | ||||||
|  |         vectors[i] = GLKMatrix4MultiplyVector3WithTranslation(matrix, vectors[i]); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static __inline__ void GLKMatrix4MultiplyAndProjectVector3Array(GLKMatrix4 matrix, GLKVector3 *vectors, size_t vectorCount) | ||||||
|  | { | ||||||
|  |     size_t i; | ||||||
|  |     for (i=0; i < vectorCount; i++) | ||||||
|  |         vectors[i] = GLKMatrix4MultiplyAndProjectVector3(matrix, vectors[i]); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static __inline__ GLKVector4 GLKMatrix4MultiplyVector4(GLKMatrix4 matrixLeft, GLKVector4 vectorRight) | ||||||
|  | { | ||||||
|  | #if defined(__ARM_NEON__) | ||||||
|  |     float32x4x4_t iMatrix = *(float32x4x4_t *)&matrixLeft; | ||||||
|  |     float32x4_t v; | ||||||
|  |  | ||||||
|  |     iMatrix.val[0] = vmulq_n_f32(iMatrix.val[0], (float32_t)vectorRight.v[0]); | ||||||
|  |     iMatrix.val[1] = vmulq_n_f32(iMatrix.val[1], (float32_t)vectorRight.v[1]); | ||||||
|  |     iMatrix.val[2] = vmulq_n_f32(iMatrix.val[2], (float32_t)vectorRight.v[2]); | ||||||
|  |     iMatrix.val[3] = vmulq_n_f32(iMatrix.val[3], (float32_t)vectorRight.v[3]); | ||||||
|  |  | ||||||
|  |     iMatrix.val[0] = vaddq_f32(iMatrix.val[0], iMatrix.val[1]); | ||||||
|  |     iMatrix.val[2] = vaddq_f32(iMatrix.val[2], iMatrix.val[3]); | ||||||
|  |  | ||||||
|  |     v = vaddq_f32(iMatrix.val[0], iMatrix.val[2]); | ||||||
|  |  | ||||||
|  |     return *(GLKVector4 *)&v; | ||||||
|  | #else | ||||||
|  |     GLKVector4 v = { matrixLeft.m[0] * vectorRight.v[0] + matrixLeft.m[4] * vectorRight.v[1] + matrixLeft.m[8] * vectorRight.v[2] + matrixLeft.m[12] * vectorRight.v[3], | ||||||
|  |                      matrixLeft.m[1] * vectorRight.v[0] + matrixLeft.m[5] * vectorRight.v[1] + matrixLeft.m[9] * vectorRight.v[2] + matrixLeft.m[13] * vectorRight.v[3], | ||||||
|  |                      matrixLeft.m[2] * vectorRight.v[0] + matrixLeft.m[6] * vectorRight.v[1] + matrixLeft.m[10] * vectorRight.v[2] + matrixLeft.m[14] * vectorRight.v[3], | ||||||
|  |                      matrixLeft.m[3] * vectorRight.v[0] + matrixLeft.m[7] * vectorRight.v[1] + matrixLeft.m[11] * vectorRight.v[2] + matrixLeft.m[15] * vectorRight.v[3] }; | ||||||
|  |     return v; | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static __inline__ void GLKMatrix4MultiplyVector4Array(GLKMatrix4 matrix, GLKVector4 *vectors, size_t vectorCount) | ||||||
|  | { | ||||||
|  |     size_t i; | ||||||
|  |     for (i=0; i < vectorCount; i++) | ||||||
|  |         vectors[i] = GLKMatrix4MultiplyVector4(matrix, vectors[i]); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #endif /* __GLK_MATRIX_4_H */ | ||||||
							
								
								
									
										99
									
								
								samples/C/NWMan.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										99
									
								
								samples/C/NWMan.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,99 @@ | |||||||
|  | #ifndef _NME_WMAN_H | ||||||
|  | #define _NME_WMAN_H | ||||||
|  |  | ||||||
|  | // Internal window manager API | ||||||
|  |  | ||||||
|  | #include "NCompat.h" | ||||||
|  |  | ||||||
|  | START_HEAD | ||||||
|  |  | ||||||
|  | #include "NPos.h" | ||||||
|  | #include "NUtil.h" | ||||||
|  | #include "NTypes.h" | ||||||
|  |  | ||||||
|  | NTS(NWMan_event); | ||||||
|  |  | ||||||
|  | NSTRUCT(NWMan, { | ||||||
|  |     // Init stuff | ||||||
|  |     bool (*init)(); | ||||||
|  |     bool (*destroy)(); | ||||||
|  |  | ||||||
|  |     // Window stuff | ||||||
|  |     bool (*create_window)(); | ||||||
|  |     bool (*destroy_window)(); | ||||||
|  |  | ||||||
|  |     void (*swap_buffers)(); | ||||||
|  |  | ||||||
|  |     // Event stuff | ||||||
|  |     bool (*next_event)(NWMan_event* event); | ||||||
|  |  | ||||||
|  |     // Time stuff | ||||||
|  |     uint (*get_millis)(); | ||||||
|  |     void (*sleep)(uint millis); | ||||||
|  |  | ||||||
|  |     // Info | ||||||
|  |     int rshift_key; | ||||||
|  |     int lshift_key; | ||||||
|  |     int left_key; | ||||||
|  |     int right_key; | ||||||
|  | }); | ||||||
|  |  | ||||||
|  | NENUM(NWMan_event_type, { | ||||||
|  |     N_WMAN_MOUSE_MOVE = 0, | ||||||
|  |     N_WMAN_MOUSE_BUTTON = 1, | ||||||
|  |     N_WMAN_MOUSE_WHEEL = 2, | ||||||
|  |  | ||||||
|  |     N_WMAN_KEYBOARD = 10, | ||||||
|  |  | ||||||
|  |     N_WMAN_QUIT = 20, | ||||||
|  |     N_WMAN_RESIZE = 21, | ||||||
|  |     N_WMAN_FOCUS = 22 | ||||||
|  | }); | ||||||
|  |  | ||||||
|  | #define N_WMAN_MOUSE_LEFT 0 | ||||||
|  | #define N_WMAN_MOUSE_RIGHT 1 | ||||||
|  | #define N_WMAN_MOUSE_MIDDLE 2 | ||||||
|  |  | ||||||
|  | NSTRUCT(NWMan_event, { | ||||||
|  |     NWMan_event_type type; | ||||||
|  |  | ||||||
|  |     union { | ||||||
|  |         // Mouse | ||||||
|  |  | ||||||
|  |         NPos2i mouse_pos; | ||||||
|  |  | ||||||
|  |         struct { | ||||||
|  |             short id; | ||||||
|  |             bool state; | ||||||
|  |         } mouse_button; | ||||||
|  |  | ||||||
|  |         signed char mouse_wheel; // 1 if up, -1 if down | ||||||
|  |  | ||||||
|  |         // Keyboard | ||||||
|  |  | ||||||
|  |         struct { | ||||||
|  |             int key; | ||||||
|  |             bool state; | ||||||
|  |         } keyboard; | ||||||
|  |  | ||||||
|  |         // Window | ||||||
|  |  | ||||||
|  |         bool window_quit; // Will always be true if WM_QUIT | ||||||
|  |  | ||||||
|  |         NPos2i window_size; | ||||||
|  |  | ||||||
|  |         bool window_focus; | ||||||
|  |     }; | ||||||
|  | }); | ||||||
|  |  | ||||||
|  | NWMan_event NWMan_event_new(NWMan_event_type type); | ||||||
|  |  | ||||||
|  |  | ||||||
|  | bool NWMan_init(); | ||||||
|  | bool NWMan_destroy(); | ||||||
|  |  | ||||||
|  | extern NWMan N_WMan; | ||||||
|  |  | ||||||
|  | END_HEAD | ||||||
|  |  | ||||||
|  | #endif | ||||||
							
								
								
									
										27
									
								
								samples/C/Nightmare.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								samples/C/Nightmare.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | |||||||
|  | #ifndef _NMEX_NIGHTMARE_H | ||||||
|  | #define _NMEX_NIGHTMARE_H | ||||||
|  |  | ||||||
|  | //#define NMEX | ||||||
|  |  | ||||||
|  | #include "../src/NCompat.h" | ||||||
|  |  | ||||||
|  | START_HEAD | ||||||
|  |  | ||||||
|  | #include "../src/NTypes.h" | ||||||
|  | #include "../src/NUtil.h" | ||||||
|  | #include "../src/NPorting.h" | ||||||
|  | #include "../src/NGlobals.h" | ||||||
|  | #include "../src/NLog.h" | ||||||
|  | #include "../src/NWMan.h" | ||||||
|  | #include "../src/NRsc.h" | ||||||
|  | #include "../src/NShader.h" | ||||||
|  | #include "../src/NSquare.h" | ||||||
|  | #include "../src/NImage.h" | ||||||
|  | #include "../src/NSprite.h" | ||||||
|  | #include "../src/NSpritesheet.h" | ||||||
|  | #include "../src/NEntity.h" | ||||||
|  | #include "../src/Game.h" | ||||||
|  |  | ||||||
|  | END_HEAD | ||||||
|  |  | ||||||
|  | #endif | ||||||
							
								
								
									
										89
									
								
								samples/C/ntru_encrypt.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										89
									
								
								samples/C/ntru_encrypt.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,89 @@ | |||||||
|  | /* | ||||||
|  |  * Copyright (C) 2014 FH Bielefeld | ||||||
|  |  * | ||||||
|  |  * This file is part of a FH Bielefeld project. | ||||||
|  |  * | ||||||
|  |  * This library is free software; you can redistribute it and/or | ||||||
|  |  * modify it under the terms of the GNU Lesser General Public | ||||||
|  |  * License as published by the Free Software Foundation; either | ||||||
|  |  * version 2.1 of the License, or (at your option) any later version. | ||||||
|  |  * | ||||||
|  |  * This library 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 | ||||||
|  |  * Lesser General Public License for more details. | ||||||
|  |  * | ||||||
|  |  * You should have received a copy of the GNU Lesser General Public | ||||||
|  |  * License along with this library; if not, write to the Free Software | ||||||
|  |  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, | ||||||
|  |  * MA  02110-1301  USA | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * @file ntru_encrypt.h | ||||||
|  |  * Header for the internal API of ntru_encrypt.c. | ||||||
|  |  * @brief header for encrypt.c | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #ifndef PQC_ENCRYPT_H | ||||||
|  | #define PQC_ENCRYPT_H | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #include "ntru_params.h" | ||||||
|  | #include "ntru_poly.h" | ||||||
|  | #include "ntru_string.h" | ||||||
|  |  | ||||||
|  | #include <fmpz_poly.h> | ||||||
|  | #include <fmpz.h> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * encrypt the msg, using the math: | ||||||
|  |  * e = (h ∗ r) + m (mod q) | ||||||
|  |  * | ||||||
|  |  * e = the encrypted poly | ||||||
|  |  * | ||||||
|  |  * h = the public key | ||||||
|  |  * | ||||||
|  |  * r = the random poly | ||||||
|  |  * | ||||||
|  |  * m = the message poly | ||||||
|  |  * | ||||||
|  |  * q = large mod | ||||||
|  |  * | ||||||
|  |  * @param msg_tern the message to encrypt, in ternary format | ||||||
|  |  * @param pub_key the public key | ||||||
|  |  * @param rnd the random poly (should have relatively small | ||||||
|  |  * coefficients, but not restricted to {-1, 0, 1}) | ||||||
|  |  * @param out the output poly which is in the range {0, q-1} | ||||||
|  |  * (not ternary!) [out] | ||||||
|  |  * @param params ntru_params the ntru context | ||||||
|  |  */ | ||||||
|  | void | ||||||
|  | ntru_encrypt_poly( | ||||||
|  | 		const fmpz_poly_t msg_tern, | ||||||
|  | 		const fmpz_poly_t pub_key, | ||||||
|  | 		const fmpz_poly_t rnd, | ||||||
|  | 		fmpz_poly_t out, | ||||||
|  | 		const ntru_params *params); | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * Encrypt a message in the form of a null-terminated char array and | ||||||
|  |  * return a string. | ||||||
|  |  * | ||||||
|  |  * @param msg the message | ||||||
|  |  * @param pub_key the public key | ||||||
|  |  * @param rnd the random poly (should have relatively small | ||||||
|  |  * coefficients, but not restricted to {-1, 0, 1}) | ||||||
|  |  * @param params ntru_params the ntru context | ||||||
|  |  * @return the newly allocated encrypted string | ||||||
|  |  */ | ||||||
|  | string * | ||||||
|  | ntru_encrypt_string( | ||||||
|  | 		const string *msg, | ||||||
|  | 		const fmpz_poly_t pub_key, | ||||||
|  | 		const fmpz_poly_t rnd, | ||||||
|  | 		const ntru_params *params); | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #endif /* PQC_ENCRYPT_H */ | ||||||
| @@ -1,13 +1,13 @@ | |||||||
| doc "Test function for Ceylon" | "Test function for Ceylon" | ||||||
| by  "Enrique" | by ("Enrique") | ||||||
| shared void test() { | shared void test() { | ||||||
|   print("test"); |     print("test"); | ||||||
| } | } | ||||||
|  |  | ||||||
| doc "Test class for Ceylon" | "Test class for Ceylon" | ||||||
| shared class Test(name) satisfies Comparable<Test> { | shared class Test(name) satisfies Comparable<Test> { | ||||||
|     shared String name; |     shared String name; | ||||||
|     shared actual String string = "Test " name "."; |     shared actual String string = "Test ``name``."; | ||||||
|  |  | ||||||
|     shared actual Comparison compare(Test other) { |     shared actual Comparison compare(Test other) { | ||||||
|         return name<=>other.name; |         return name<=>other.name; | ||||||
|   | |||||||
							
								
								
									
										304
									
								
								samples/Chapel/distributions.chpl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										304
									
								
								samples/Chapel/distributions.chpl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,304 @@ | |||||||
|  | // | ||||||
|  | // Distributions Primer | ||||||
|  | // | ||||||
|  | // This primer demonstrates uses of some of Chapel's standard | ||||||
|  | // distributions.  To use these distributions in a Chapel program, | ||||||
|  | // the respective module must be used: | ||||||
|  | // | ||||||
|  | use BlockDist, CyclicDist, BlockCycDist, ReplicatedDist; | ||||||
|  | use DimensionalDist2D, ReplicatedDim, BlockCycDim; | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // For each distribution, we'll create a distributed domain and array | ||||||
|  | // and then initialize it just to give a brief flavor of how the | ||||||
|  | // distribution maps across locales.  Running this example on 6 | ||||||
|  | // locales does a nice job of illustrating the distribution | ||||||
|  | // characteristics. | ||||||
|  | // | ||||||
|  | // All of these distributions support options to map to a different | ||||||
|  | // virtual locale grid than the one used by default (a | ||||||
|  | // multidimensional factoring of the built-in Locales array), as well | ||||||
|  | // as to control the amount of parallelism used in data parallel | ||||||
|  | // loops.  See the Standard Distributions chapter of the language spec | ||||||
|  | // for more details. | ||||||
|  | // | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // Make the program size configurable from the command line. | ||||||
|  | // | ||||||
|  | config const n = 8; | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // Declare a 2-dimensional domain Space that we will later use to | ||||||
|  | // initialize the distributed domains. | ||||||
|  | // | ||||||
|  | const Space = {1..n, 1..n}; | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // The Block distribution distributes a bounding box from | ||||||
|  | // n-dimensional space across the target locale array viewed as an | ||||||
|  | // n-dimensional virtual locale grid.  The bounding box is blocked | ||||||
|  | // into roughly equal portions across the locales.  Note that domains | ||||||
|  | // declared over a Block distribution can also store indices outside | ||||||
|  | // of the bounding box; the bounding box is merely used to compute | ||||||
|  | // the blocking of space. | ||||||
|  | // | ||||||
|  | // In this example, we declare a 2-dimensional Block-distributed | ||||||
|  | // domain BlockSpace and a Block-distributed array BA declared over | ||||||
|  | // the domain. | ||||||
|  | // | ||||||
|  | const BlockSpace = Space dmapped Block(boundingBox=Space); | ||||||
|  | var BA: [BlockSpace] int; | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // To illustrate how the index set is distributed across locales, | ||||||
|  | // we'll use a forall loop to initialize each array element to the | ||||||
|  | // locale ID that stores that index/element/iteration. | ||||||
|  | // | ||||||
|  | forall ba in BA do | ||||||
|  |   ba = here.id; | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // Output the Block-distributed array to visually see how the elements | ||||||
|  | // are partitioned across the locales. | ||||||
|  | // | ||||||
|  | writeln("Block Array Index Map"); | ||||||
|  | writeln(BA); | ||||||
|  | writeln(); | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // Most of Chapel's standard distributions support an optional | ||||||
|  | // targetLocales argument that permits you to pass in your own | ||||||
|  | // array of locales to be targeted.  In general, the targetLocales | ||||||
|  | // argument should match the rank of the distribution.  So for | ||||||
|  | // example, to map a Block to a [numLocales x 1] view of the | ||||||
|  | // locale set, one could do something like this: | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // We start by creating our own array of the locale values.  Here | ||||||
|  | // we use the standard array reshape function for convenience, | ||||||
|  | // but more generally, this array could be accessed/assigned like any | ||||||
|  | // other. | ||||||
|  | // | ||||||
|  |  | ||||||
|  | var MyLocaleView = {0..#numLocales, 1..1}; | ||||||
|  | var MyLocales: [MyLocaleView] locale = reshape(Locales, MyLocaleView); | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // Then we'll declare a distributed domain/array that targets | ||||||
|  | // this view of the locales: | ||||||
|  | //  | ||||||
|  |  | ||||||
|  | const BlockSpace2 = Space dmapped Block(boundingBox=Space, | ||||||
|  |                                         targetLocales=MyLocales); | ||||||
|  | var BA2: [BlockSpace2] int; | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // Then we'll do a similar computation as before to verify where | ||||||
|  | // everything ended up: | ||||||
|  | // | ||||||
|  | forall ba in BA2 do | ||||||
|  |   ba = here.id; | ||||||
|  |  | ||||||
|  | writeln("Block Array Index Map"); | ||||||
|  | writeln(BA2); | ||||||
|  | writeln(); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // Next, we'll perform a similar computation for the Cyclic distribution. | ||||||
|  | // Cyclic distributions start at a designated n-dimensional index and | ||||||
|  | // distribute the n-dimensional space across an n-dimensional array | ||||||
|  | // of locales in a round-robin fashion (in each dimension).  As with | ||||||
|  | // the Block distribution, domains may be declared using the | ||||||
|  | // distribution who have lower indices that the starting index; that | ||||||
|  | // value should just be considered a parameterization of how the | ||||||
|  | // distribution is defined. | ||||||
|  | // | ||||||
|  | const CyclicSpace = Space dmapped Cyclic(startIdx=Space.low); | ||||||
|  | var CA: [CyclicSpace] int; | ||||||
|  |  | ||||||
|  | forall ca in CA do | ||||||
|  |   ca = here.id; | ||||||
|  |  | ||||||
|  | writeln("Cyclic Array Index Map"); | ||||||
|  | writeln(CA); | ||||||
|  | writeln(); | ||||||
|  |  | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // Next, we'll declare a Block-Cyclic distribution.  These | ||||||
|  | // distributions also deal out indices in a round-robin fashion, | ||||||
|  | // but rather than dealing out singleton indices, they deal out blocks | ||||||
|  | // of indices.  Thus, the BlockCyclic distribution is parameterized | ||||||
|  | // by a starting index (as with Cyclic) and a block size (per | ||||||
|  | // dimension) specifying how large the chunks to be dealt out are. | ||||||
|  | //  | ||||||
|  | const BlkCycSpace = Space dmapped BlockCyclic(startIdx=Space.low,  | ||||||
|  |                                               blocksize=(2, 3)); | ||||||
|  | var BCA: [BlkCycSpace] int; | ||||||
|  |  | ||||||
|  | forall bca in BCA do | ||||||
|  |   bca = here.id; | ||||||
|  |  | ||||||
|  | writeln("Block-Cyclic Array Index Map"); | ||||||
|  | writeln(BCA); | ||||||
|  | writeln(); | ||||||
|  |  | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // The ReplicatedDist distribution is different: each of the | ||||||
|  | // original domain's indices - and the corresponding array elements - | ||||||
|  | // is replicated onto each locale. (Note: consistency among these | ||||||
|  | // array replicands is NOT maintained automatically.) | ||||||
|  | // | ||||||
|  | // This replication is observable in some cases but not others, | ||||||
|  | // as shown below. Note: this behavior may change in the future. | ||||||
|  | // | ||||||
|  | const ReplicatedSpace = Space dmapped ReplicatedDist(); | ||||||
|  | var RA: [ReplicatedSpace] int; | ||||||
|  |  | ||||||
|  | // The replication is observable - this visits each replicand. | ||||||
|  | forall ra in RA do | ||||||
|  |   ra = here.id; | ||||||
|  |  | ||||||
|  | writeln("Replicated Array Index Map, ", RA.numElements, " elements total"); | ||||||
|  | writeln(RA); | ||||||
|  | writeln(); | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // The replication is observable when the replicated array is | ||||||
|  | // on the left-hand side. If the right-hand side is not replicated, | ||||||
|  | // it is copied into each replicand. | ||||||
|  | // We illustrate this using a non-distributed array. | ||||||
|  | // | ||||||
|  | var A: [Space] int = [(i,j) in Space] i*100 + j; | ||||||
|  | RA = A; | ||||||
|  | writeln("Replicated Array after being array-assigned into"); | ||||||
|  | writeln(RA); | ||||||
|  | writeln(); | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // Analogously, each replicand will be visited and | ||||||
|  | // other participated expressions will be computed on each locale | ||||||
|  | // (a) when the replicated array is assigned a scalar: | ||||||
|  | //       RA = 5; | ||||||
|  | // (b) when it appears first in a zippered forall loop: | ||||||
|  | //       forall (ra, a) in zip(RA, A) do ...; | ||||||
|  | // (c) when it appears in a for loop: | ||||||
|  | //       for ra in RA do ...; | ||||||
|  | // | ||||||
|  | // Zippering (RA,A) or (A,RA) in a 'for' loop will generate | ||||||
|  | // an error due to their different number of elements. | ||||||
|  |  | ||||||
|  | // Let RA store the Index Map again, for the examples below. | ||||||
|  | forall ra in RA do | ||||||
|  |   ra = here.id; | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // Only the local replicand is accessed - replication is NOT observable | ||||||
|  | // and consistency is NOT maintained - when: | ||||||
|  | // (a) the replicated array is indexed - an individual element is read... | ||||||
|  | // | ||||||
|  | on Locales(0) do | ||||||
|  |   writeln("on ", here, ": ", RA(Space.low)); | ||||||
|  | on Locales(LocaleSpace.high) do | ||||||
|  |   writeln("on ", here, ": ", RA(Space.low)); | ||||||
|  | writeln(); | ||||||
|  |  | ||||||
|  | // ...or an individual element is written; | ||||||
|  | on Locales(LocaleSpace.high) do | ||||||
|  |   RA(Space.low) = 7777; | ||||||
|  |  | ||||||
|  | writeln("Replicated Array after being indexed into"); | ||||||
|  | writeln(RA); | ||||||
|  | writeln(); | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // (b) the replicated array is on the right-hand side of an assignment... | ||||||
|  | // | ||||||
|  | on Locales(LocaleSpace.high) do | ||||||
|  |   A = RA + 4; | ||||||
|  | writeln("Non-Replicated Array after assignment from Replicated Array + 4"); | ||||||
|  | writeln(A); | ||||||
|  | writeln(); | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // (c) ...or, generally, the replicated array or domain participates | ||||||
|  | //     in a zippered forall loop, but not in the first position. | ||||||
|  | //     The loop could look like: | ||||||
|  | // | ||||||
|  | //       forall (a, (i,j), ra) in (A, ReplicatedSpace, RA) do ...; | ||||||
|  | // | ||||||
|  |  | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // The DimensionalDist2D distribution lets us build a 2D distribution | ||||||
|  | // as a composition of specifiers for individual dimensions. | ||||||
|  | // Under such a "dimensional" distribution each dimension is handled | ||||||
|  | // independently of the other. | ||||||
|  | // | ||||||
|  | // The dimension specifiers are similar to the corresponding multi-dimensional | ||||||
|  | // distributions in constructor arguments and index-to-locale mapping rules. | ||||||
|  | // However, instead of an array of locales, a specifier constructor | ||||||
|  | // accepts just the number of locales that the indices in the corresponding | ||||||
|  | // dimension will be distributed across. | ||||||
|  | // | ||||||
|  | // The DimensionalDist2D constructor requires: | ||||||
|  | // * an [0..nl1-1, 0..nl2-1] array of locales, where | ||||||
|  | //   nl1 and nl2 are the number of locales in each dimension, and | ||||||
|  | // * two dimension specifiers, created for nl1 and nl2 locale counts, resp. | ||||||
|  | // | ||||||
|  | // Presently, the following dimension specifiers are available | ||||||
|  | // (shown here with their constructor arguments): | ||||||
|  | // | ||||||
|  | // * ReplicatedDim(numLocales) | ||||||
|  | // * BlockDim(numLocales, boundingBoxLow, boundingBoxHigh) | ||||||
|  | // * BlockCyclicDim(lowIdx, blockSize, numLocales) | ||||||
|  | // | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // The following example creates a dimensional distribution that | ||||||
|  | // replicates over 2 locales (when available) in the first dimemsion | ||||||
|  | // and distributes using block-cyclic distribution in the second dimension. | ||||||
|  | // The example computes nl1 and nl2 and reshapes MyLocales correspondingly. | ||||||
|  | // | ||||||
|  |  | ||||||
|  | var (nl1, nl2) = if numLocales == 1 then (1, 1) else (2, numLocales/2); | ||||||
|  | MyLocaleView = {0..#nl1, 0..#nl2}; | ||||||
|  | MyLocales = reshape(Locales[0..#nl1*nl2], MyLocaleView); | ||||||
|  |  | ||||||
|  | const DimReplicatedBlockcyclicSpace = Space | ||||||
|  |   dmapped DimensionalDist2D(MyLocales, | ||||||
|  |                             new ReplicatedDim(numLocales = nl1), | ||||||
|  |                             new BlockCyclicDim(numLocales = nl2, | ||||||
|  |                                                lowIdx = 1, blockSize = 2)); | ||||||
|  |  | ||||||
|  | var DRBA: [DimReplicatedBlockcyclicSpace] int; | ||||||
|  |  | ||||||
|  | // The ReplicatedDim specifier always accesses the local replicand. | ||||||
|  | // (This differs from how the ReplicatedDist distribution works.) | ||||||
|  | // | ||||||
|  | // This example visits each replicand. The behavior is the same | ||||||
|  | // regardless of the second index into MyLocales below. | ||||||
|  |  | ||||||
|  | for locId1 in 0..#nl1 do on MyLocales[locId1, 0] { | ||||||
|  |  | ||||||
|  |   forall drba in DRBA do | ||||||
|  |     drba = here.id; | ||||||
|  |  | ||||||
|  |   writeln("Dimensional2D(Replicated,BlockCyclic) Array Index Map", | ||||||
|  |           " from ", here); | ||||||
|  |  | ||||||
|  |   // Technicality: 'writeln(DRBA)' would read DRBA always on Locale 0. | ||||||
|  |   // Since we want to see what DRBA contains on the current locale, | ||||||
|  |   // we use 'Helper' that is mapped using the default distribution. | ||||||
|  |   // 'Helper = DRBA' captures the view of DRBA on the current locale, | ||||||
|  |   // which we then print out. | ||||||
|  |  | ||||||
|  |   const Helper: [Space] int = DRBA; | ||||||
|  |   writeln(Helper); | ||||||
|  |   writeln(); | ||||||
|  |  | ||||||
|  | } | ||||||
							
								
								
									
										1
									
								
								samples/Chapel/hello.chpl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								samples/Chapel/hello.chpl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | |||||||
|  | writeln("Hello, world!");    // print 'Hello, world!' to the console | ||||||
							
								
								
									
										1692
									
								
								samples/Chapel/lulesh.chpl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1692
									
								
								samples/Chapel/lulesh.chpl
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										147
									
								
								samples/Chapel/nbody.chpl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										147
									
								
								samples/Chapel/nbody.chpl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,147 @@ | |||||||
|  | /* The Computer Language Benchmarks Game | ||||||
|  |    http://benchmarksgame.alioth.debian.org/ | ||||||
|  |  | ||||||
|  |    contributed by Albert Sidelnik | ||||||
|  |    modified by Brad Chamberlain | ||||||
|  | */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // The number of timesteps to simulate; may be set via the command-line | ||||||
|  | // | ||||||
|  | config const n = 10000; | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // Constants representing pi, the solar mass, and the number of days per year | ||||||
|  | // | ||||||
|  | const pi = 3.141592653589793, | ||||||
|  |       solarMass = 4 * pi**2, | ||||||
|  |       daysPerYear = 365.24; | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // a record representing one of the bodies in the solar system | ||||||
|  | // | ||||||
|  | record body { | ||||||
|  |   var pos: 3*real; | ||||||
|  |   var v: 3*real; | ||||||
|  |   var mass: real;  // does not change after it is set up | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // the array of bodies that we'll be simulating | ||||||
|  | // | ||||||
|  | var bodies = [/* sun */ | ||||||
|  |               new body(mass = solarMass), | ||||||
|  |  | ||||||
|  |               /* jupiter */ | ||||||
|  |               new body(pos = ( 4.84143144246472090e+00, | ||||||
|  |                               -1.16032004402742839e+00, | ||||||
|  |                               -1.03622044471123109e-01), | ||||||
|  |                          v = ( 1.66007664274403694e-03 * daysPerYear, | ||||||
|  |                                7.69901118419740425e-03 * daysPerYear, | ||||||
|  |                               -6.90460016972063023e-05 * daysPerYear), | ||||||
|  |                       mass =   9.54791938424326609e-04 * solarMass), | ||||||
|  |    | ||||||
|  |               /* saturn */ | ||||||
|  |               new body(pos = ( 8.34336671824457987e+00, | ||||||
|  |                                4.12479856412430479e+00, | ||||||
|  |                               -4.03523417114321381e-01), | ||||||
|  |                          v = (-2.76742510726862411e-03 * daysPerYear, | ||||||
|  |                                4.99852801234917238e-03 * daysPerYear, | ||||||
|  |                                2.30417297573763929e-05 * daysPerYear), | ||||||
|  |                       mass =   2.85885980666130812e-04 * solarMass), | ||||||
|  |  | ||||||
|  |               /* uranus */ | ||||||
|  |               new body(pos = ( 1.28943695621391310e+01, | ||||||
|  |                               -1.51111514016986312e+01, | ||||||
|  |                               -2.23307578892655734e-01), | ||||||
|  |                          v = ( 2.96460137564761618e-03 * daysPerYear, | ||||||
|  |                                2.37847173959480950e-03 * daysPerYear, | ||||||
|  |                               -2.96589568540237556e-05 * daysPerYear), | ||||||
|  |                       mass =   4.36624404335156298e-05 * solarMass), | ||||||
|  |  | ||||||
|  |               /* neptune */ | ||||||
|  |               new body(pos = ( 1.53796971148509165e+01, | ||||||
|  |                               -2.59193146099879641e+01, | ||||||
|  |                                1.79258772950371181e-01), | ||||||
|  |                          v = ( 2.68067772490389322e-03 * daysPerYear, | ||||||
|  |                                1.62824170038242295e-03 * daysPerYear, | ||||||
|  |                               -9.51592254519715870e-05 * daysPerYear), | ||||||
|  |                       mass =   5.15138902046611451e-05 * solarMass) | ||||||
|  |               ]; | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // the number of bodies to be simulated | ||||||
|  | // | ||||||
|  | const numbodies = bodies.numElements; | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // The computation involves initializing the sun's velocity, | ||||||
|  | // writing the initial energy, advancing the system through 'n' | ||||||
|  | // timesteps, and writing the final energy. | ||||||
|  | // | ||||||
|  | proc main() { | ||||||
|  |   initSun(); | ||||||
|  |  | ||||||
|  |   writef("%.9r\n", energy()); | ||||||
|  |   for 1..n do | ||||||
|  |     advance(0.01); | ||||||
|  |   writef("%.9r\n", energy()); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // compute the sun's initial velocity | ||||||
|  | // | ||||||
|  | proc initSun() { | ||||||
|  |   const p = + reduce (for b in bodies do (b.v * b.mass)); | ||||||
|  |   bodies[1].v = -p / solarMass; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // advance the positions and velocities of all the bodies | ||||||
|  | // | ||||||
|  | proc advance(dt) { | ||||||
|  |   for i in 1..numbodies { | ||||||
|  |     for j in i+1..numbodies { | ||||||
|  |       updateVelocities(bodies[i], bodies[j]); | ||||||
|  |        | ||||||
|  |       inline proc updateVelocities(ref b1, ref b2) { | ||||||
|  |         const dpos = b1.pos - b2.pos, | ||||||
|  |                mag = dt / sqrt(sumOfSquares(dpos))**3; | ||||||
|  |          | ||||||
|  |         b1.v -= dpos * b2.mass * mag; | ||||||
|  |         b2.v += dpos * b1.mass * mag; | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |    | ||||||
|  |   for b in bodies do | ||||||
|  |     b.pos += dt * b.v; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // compute the energy of the bodies | ||||||
|  | // | ||||||
|  | proc energy() { | ||||||
|  |   var e = 0.0; | ||||||
|  |    | ||||||
|  |   for i in 1..numbodies { | ||||||
|  |     const b1 = bodies[i]; | ||||||
|  |      | ||||||
|  |     e += 0.5 * b1.mass * sumOfSquares(b1.v); | ||||||
|  |      | ||||||
|  |     for j in i+1..numbodies { | ||||||
|  |       const b2 = bodies[j]; | ||||||
|  |        | ||||||
|  |       e -= (b1.mass * b2.mass) / sqrt(sumOfSquares(b1.pos - b2.pos)); | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |    | ||||||
|  |   return e; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // a helper routine to compute the sum of squares of a 3-tuple's components | ||||||
|  | // | ||||||
|  | inline proc sumOfSquares(x) | ||||||
|  |   return x(1)**2 + x(2)**2 + x(3)**2; | ||||||
							
								
								
									
										145
									
								
								samples/Chapel/quicksort.chpl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										145
									
								
								samples/Chapel/quicksort.chpl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,145 @@ | |||||||
|  | // | ||||||
|  | // An example of a parallel quick sort implementation that uses | ||||||
|  | // "cobegin" to make each recursive call in parallel and "serial" to | ||||||
|  | // limit the number of threads. | ||||||
|  | // | ||||||
|  |  | ||||||
|  | use Random, Time; // for random number generation and the Timer class | ||||||
|  |  | ||||||
|  | var timer: Timer; // to time the sort | ||||||
|  |  | ||||||
|  | config var n: int = 2**15;      // the size of the array to be sorted | ||||||
|  | config var thresh: int = 1;     // the recursive depth to serialize | ||||||
|  | config var verbose: int = 0;    // print out this many elements in array | ||||||
|  | config var timing: bool = true; // set timing to false to disable timer | ||||||
|  |  | ||||||
|  | var A: [1..n] real; // array of real numbers | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // initialize array with random numbers | ||||||
|  | // | ||||||
|  | fillRandom(A); | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // print out front of array if verbose flag is set | ||||||
|  | // | ||||||
|  | if verbose > 0 then | ||||||
|  |   writeln("A[1..", verbose, "] = ", A[1..verbose]); | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // start timer, call parallel quick sort routine, stop timer | ||||||
|  | // | ||||||
|  | if timing then timer.start(); | ||||||
|  | pqsort(A, thresh); | ||||||
|  | if timing then timer.stop(); | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // report sort time | ||||||
|  | // | ||||||
|  | if timing then writeln("sorted in ", timer.elapsed(), " seconds"); | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // print out front of array if verbose flag is set | ||||||
|  | //   values should now be in sorted order | ||||||
|  | // | ||||||
|  | if verbose > 0 then | ||||||
|  |   writeln("A[1..", verbose, "] = ", A[1..verbose]); | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // verify that array is sorted or halt | ||||||
|  | // | ||||||
|  | for i in 2..n do | ||||||
|  |   if A(i) < A(i-1) then | ||||||
|  |     halt("A(", i-1, ") == ", A(i-1), " > A(", i, ") == ", A(i)); | ||||||
|  |  | ||||||
|  | writeln("verification success"); | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // pqsort -- parallel quick sort | ||||||
|  | // | ||||||
|  | //   arr: generic 1D array of values (real, int, ...) | ||||||
|  | //   thresh: number of recursive calls to make before serializing | ||||||
|  | //   low: lower bound of array to start sort at, defaults to whole array | ||||||
|  | //   high: upper bound of array to stop sort at, defaults to whole array | ||||||
|  | // | ||||||
|  | proc pqsort(arr: [], | ||||||
|  |            thresh: int, | ||||||
|  |            low: int = arr.domain.low, | ||||||
|  |            high: int = arr.domain.high) where arr.rank == 1 { | ||||||
|  |  | ||||||
|  |   // | ||||||
|  |   // base case: arr[low..high] is small enough to bubble sort | ||||||
|  |   // | ||||||
|  |   if high - low < 8 { | ||||||
|  |     bubbleSort(arr, low, high); | ||||||
|  |     return; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   // | ||||||
|  |   // determine pivot and partition arr[low..high] | ||||||
|  |   // | ||||||
|  |   const pivotVal = findPivot(); | ||||||
|  |   const pivotLoc = partition(pivotVal); | ||||||
|  |  | ||||||
|  |   // | ||||||
|  |   // make recursive calls to parallel quick sort each unsorted half of | ||||||
|  |   // the array; if thresh is 0 or less, start executing conquer tasks | ||||||
|  |   // serially | ||||||
|  |   // | ||||||
|  |   serial thresh <= 0 do cobegin { | ||||||
|  |     pqsort(arr, thresh-1, low, pivotLoc-1); | ||||||
|  |     pqsort(arr, thresh-1, pivotLoc+1, high); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   // | ||||||
|  |   // findPivot -- helper routine to find pivot value using simple | ||||||
|  |   //              median-of-3 method, returns pivot value | ||||||
|  |   // | ||||||
|  |   proc findPivot() { | ||||||
|  |     const mid = low + (high-low+1) / 2; | ||||||
|  |  | ||||||
|  |     if arr(mid) < arr(low) then arr(mid) <=> arr(low); | ||||||
|  |     if arr(high) < arr(low) then arr(high) <=> arr(low); | ||||||
|  |     if arr(high) < arr(mid) then arr(high) <=> arr(mid); | ||||||
|  |  | ||||||
|  |     const pivotVal = arr(mid); | ||||||
|  |     arr(mid) = arr(high-1); | ||||||
|  |     arr(high-1) = pivotVal; | ||||||
|  |  | ||||||
|  |     return pivotVal; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   // | ||||||
|  |   // partition -- helper routine to partition array such that all | ||||||
|  |   //              values less than pivot are to its left and all | ||||||
|  |   //              values greater than pivot are to its right, returns | ||||||
|  |   //              pivot location | ||||||
|  |   // | ||||||
|  |   proc partition(pivotVal) { | ||||||
|  |     var ilo = low, ihi = high-1; | ||||||
|  |     while (ilo < ihi) { | ||||||
|  |       do { ilo += 1; } while arr(ilo) < pivotVal; | ||||||
|  |       do { ihi -= 1; } while pivotVal < arr(ihi); | ||||||
|  |       if (ilo < ihi) { | ||||||
|  |         arr(ilo) <=> arr(ihi); | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |     arr(high-1) = arr(ilo); | ||||||
|  |     arr(ilo) = pivotVal; | ||||||
|  |     return ilo; | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // bubbleSort -- bubble sort for base case of quick sort | ||||||
|  | // | ||||||
|  | //   arr: generic 1D array of values (real, int, ...) | ||||||
|  | //   low: lower bound of array to start sort at | ||||||
|  | //   high: upper bound of array to stop sort at | ||||||
|  | // | ||||||
|  | proc bubbleSort(arr: [], low: int, high: int) where arr.rank == 1 { | ||||||
|  |   for i in low..high do | ||||||
|  |     for j in low..high-1 do | ||||||
|  |       if arr(j) > arr(j+1) then | ||||||
|  |         arr(j) <=> arr(j+1); | ||||||
|  | } | ||||||
							
								
								
									
										11
									
								
								samples/Clean/GenHylo.dcl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								samples/Clean/GenHylo.dcl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | |||||||
|  | definition module GenHylo | ||||||
|  |  | ||||||
|  | import StdGeneric, GenMap | ||||||
|  |  | ||||||
|  | :: Fix f = In (f .(Fix f)) | ||||||
|  | Out :: !u:(Fix v:a) -> v:(a w:(Fix v:a)), [u <= w] | ||||||
|  |  | ||||||
|  | hylo :: ((.f .b) -> .b) (.a -> (.f .a)) -> (.a -> .b) | gMap{|*->*|} f | ||||||
|  | cata :: (u:(f .a) -> .a) -> (Fix u:f) -> .a | gMap{|*->*|} f | ||||||
|  | ana :: (.a -> u:(f .a)) -> .a -> (Fix u:f) | gMap{|*->*|} f | ||||||
|  |  | ||||||
							
								
								
									
										9
									
								
								samples/Clean/GenMap.dcl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								samples/Clean/GenMap.dcl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | |||||||
|  | definition module GenMap | ||||||
|  |  | ||||||
|  | import StdGeneric | ||||||
|  |  | ||||||
|  | generic gMap a b :: .a -> .b | ||||||
|  | derive gMap c, UNIT, PAIR, EITHER, CONS, FIELD, OBJECT, {}, {!}  | ||||||
|  |  | ||||||
|  | derive gMap [], (,), (,,),  (,,,), (,,,,), (,,,,,), (,,,,,,), (,,,,,,,) | ||||||
|  |  | ||||||
							
								
								
									
										19
									
								
								samples/Clean/GenMap.icl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								samples/Clean/GenMap.icl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,19 @@ | |||||||
|  | implementation module GenMap | ||||||
|  |  | ||||||
|  | import StdClass, StdArray, StdInt, StdFunc | ||||||
|  | import StdGeneric, _Array | ||||||
|  |  | ||||||
|  | generic gMap a b :: .a -> .b | ||||||
|  | gMap{|c|} x 					= x | ||||||
|  | gMap{|UNIT|} x 					= x | ||||||
|  | gMap{|PAIR|} fx fy (PAIR x y) 	= PAIR (fx x) (fy y)  | ||||||
|  | gMap{|EITHER|} fl fr (LEFT x) 	= LEFT (fl x) | ||||||
|  | gMap{|EITHER|} fl fr (RIGHT x) 	= RIGHT (fr x) | ||||||
|  | gMap{|CONS|} f (CONS x) 		= CONS (f x) | ||||||
|  | gMap{|FIELD|} f (FIELD x) 		= FIELD (f x) | ||||||
|  | gMap{|OBJECT|} f (OBJECT x) 	= OBJECT (f x) | ||||||
|  | gMap{|{}|} f xs 				= mapArray f xs | ||||||
|  | gMap{|{!}|} f xs				= mapArray f xs | ||||||
|  |  | ||||||
|  | derive gMap [], (,), (,,),  (,,,), (,,,,), (,,,,,), (,,,,,,), (,,,,,,,) | ||||||
|  |  | ||||||
							
								
								
									
										54
									
								
								samples/Clean/fsieve.icl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								samples/Clean/fsieve.icl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,54 @@ | |||||||
|  | module fsieve | ||||||
|  |  | ||||||
|  | /* | ||||||
|  | The Fast Sieve of Eratosthenes. | ||||||
|  |  | ||||||
|  | A sequential and optimized version of the sieve of Eratosthenes. | ||||||
|  | The program calculates a list of the first NrOfPrime primes. | ||||||
|  | The result of the program is the NrOfPrimes'th prime. | ||||||
|  |  | ||||||
|  | Strictness annotations have been added because the strictness analyser | ||||||
|  | is not able to deduce all strictness information. Removal of these !'s | ||||||
|  | will make the program about 20% slower. | ||||||
|  |  | ||||||
|  | On a machine without a math coprocessor the execution of this | ||||||
|  | program might take a (very) long time. Set NrOfPrimes to a smaller value. | ||||||
|  | */ | ||||||
|  |  | ||||||
|  | import StdClass; // RWS | ||||||
|  | import StdInt, StdReal | ||||||
|  |       | ||||||
|  | NrOfPrimes :== 3000  | ||||||
|  | 	 | ||||||
|  | //	The sieve algorithm: generate an infinite list of all primes. | ||||||
|  |  | ||||||
|  | Primes::[Int] | ||||||
|  | Primes = pr where pr = [5 : Sieve 7 4 pr] | ||||||
|  |  | ||||||
|  | Sieve::Int !Int [Int] -> [Int] | ||||||
|  | Sieve g i prs | ||||||
|  | 	| IsPrime prs g (toInt (sqrt (toReal g)))	=  [g : Sieve` g i prs] | ||||||
|  | 												=  Sieve (g + i) (6 - i) prs | ||||||
|  |  | ||||||
|  | Sieve`::Int Int [Int] -> [Int] | ||||||
|  | Sieve` g i prs =  Sieve (g + i) (6 - i) prs | ||||||
|  |  | ||||||
|  | IsPrime::[Int] !Int Int -> Bool | ||||||
|  | IsPrime [f:r] pr bd | f>bd 			=  True | ||||||
|  | 					| pr rem f==0	=  False | ||||||
|  | 									=  IsPrime r pr bd | ||||||
|  | 								   | ||||||
|  | //	Select is used to get the NrOfPrimes'th prime from the infinite list. | ||||||
|  |  | ||||||
|  | Select::[x] Int -> x | ||||||
|  | Select [f:r] 1 =  f | ||||||
|  | Select [f:r] n =  Select r (n - 1) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /*	The Start rule: Select the NrOfPrimes'th prime from the list of primes | ||||||
|  | 	generated by Primes. | ||||||
|  | */ | ||||||
|  |  | ||||||
|  | Start::Int | ||||||
|  | Start = Select [2, 3 : Primes] NrOfPrimes | ||||||
|  |  | ||||||
							
								
								
									
										99
									
								
								samples/Clean/sem.icl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										99
									
								
								samples/Clean/sem.icl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,99 @@ | |||||||
|  | module monadicSemantics | ||||||
|  |  | ||||||
|  | import StdEnv, StdGeneric, GenMap, GenHylo | ||||||
|  |  | ||||||
|  | /* For fun I implemented the recursive datastructre Exp and Stm as fixpoints | ||||||
|  |    This helps us define recursive functions on them (only a little bit though) | ||||||
|  |    However deriving gMap for Fix did not works out of the box | ||||||
|  |    I had to remove some uniqueness typing in GenMap and GenHylo */ | ||||||
|  | :: Op      = Plus | Minus | Times | Rem | Equal | LessThan | ||||||
|  | :: Var     :== String | ||||||
|  |  | ||||||
|  | :: ExpP a  = Int Int | Var Var | Op Op a a | ||||||
|  | :: Exp     :== Fix ExpP | ||||||
|  |  | ||||||
|  | :: StmP a  = Assign Var Exp | If Exp a a | While Exp a | Seq a a | Cont | ||||||
|  | :: Stm     :== Fix StmP | ||||||
|  |  | ||||||
|  | derive gMap ExpP, StmP, Fix | ||||||
|  |  | ||||||
|  | // Environment. Semantics is basically Env -> Env | ||||||
|  | :: Env :== Var -> Int | ||||||
|  | :: Sem :== Env -> (Int, Env) | ||||||
|  | empty = \v . 0 | ||||||
|  |  | ||||||
|  | // return | ||||||
|  | rtn :: Int -> Sem | ||||||
|  | rtn i = \e. (i, e) | ||||||
|  |  | ||||||
|  | // the usual bind | ||||||
|  | (>>=) infixl 1 :: Sem (Int->Sem) -> Sem | ||||||
|  | (>>=) x y = \e. (\(i,e2).y i e2) (x e) | ||||||
|  | (>>|) infixl 1 :: Sem Sem -> Sem | ||||||
|  | (>>|) x y = x >>= \_. y | ||||||
|  |  | ||||||
|  | // read variable from environment | ||||||
|  | read :: Var -> Sem | ||||||
|  | read v = \e. (e v, e) | ||||||
|  |  | ||||||
|  | // assign value to give variable in environment | ||||||
|  | write :: Var Int -> Sem | ||||||
|  | write v i = \e. (i, \w. if (w==v) i (e w)) | ||||||
|  |  | ||||||
|  | // semantics | ||||||
|  | class sem a :: a -> Sem | ||||||
|  |  | ||||||
|  | operator :: Op -> Int -> Int -> Int | ||||||
|  | operator Plus     = (+) | ||||||
|  | operator Minus    = (-) | ||||||
|  | operator Times    = (*) | ||||||
|  | operator Rem      = rem | ||||||
|  | operator Equal    = \x y . if (x==y) 1 0 | ||||||
|  | operator LessThan = \x y . if (x< y)  1 0 | ||||||
|  |  | ||||||
|  | // semantics of expressions | ||||||
|  | instance sem Exp where | ||||||
|  | 	sem x = cata phi x where | ||||||
|  | 		phi (Int n)     = rtn n | ||||||
|  | 		phi (Var v)     = read v | ||||||
|  | 		phi (Op op x y) = x >>= \v1. y >>= return o (operator op v1) | ||||||
|  |  | ||||||
|  | // semantics of statments | ||||||
|  | // NOTE: while will always return 0, as it might not even be executed | ||||||
|  | instance sem Stm where | ||||||
|  | 	sem x = cata phi x where | ||||||
|  | 		phi (Assign v e)     = sem e >>= write v | ||||||
|  | 		phi (If e s1 s2)     = sem e >>= \b . if (b<>0) s1 s2 | ||||||
|  | 		phi stm=:(While e s) = sem e >>= \b . if (b<>0) (s >>| phi stm) (phi Cont) | ||||||
|  | 		phi (Seq s1 s2)      = s1 >>| s2    // Here the cata *finally* pays off :D | ||||||
|  | 		phi Cont             = rtn 0 | ||||||
|  |  | ||||||
|  | // convenience functions | ||||||
|  | int    = In o Int | ||||||
|  | var    = In o Var | ||||||
|  | op o   = In o2 (Op o) | ||||||
|  | assign = In o2 Assign | ||||||
|  | ifte e = In o2 (If e) | ||||||
|  | while  = In o2 While | ||||||
|  | seq    = In o2 Seq | ||||||
|  | cont   = In Cont | ||||||
|  |  | ||||||
|  | // test case, also testing the new operator < | ||||||
|  | pEuclides = | ||||||
|  | 	while (op LessThan (int 0) (var "b"))( | ||||||
|  | 		seq (assign "r" (op Rem (var "a") (var "b"))) | ||||||
|  | 		(seq (assign "a" (var "b")) | ||||||
|  | 		( (assign "b" (var "r"))) | ||||||
|  | 		) | ||||||
|  | 	) | ||||||
|  |  | ||||||
|  | Start = fst (program start) where | ||||||
|  | 	program = sem pEuclides >>| read "a" | ||||||
|  | 	start "a" = 9 | ||||||
|  | 	start "b" = 12 | ||||||
|  | 	start _ = 0 | ||||||
|  |  | ||||||
|  | // Helper | ||||||
|  | (o2) infixr 9 | ||||||
|  | (o2) f g x :== f o (g x) | ||||||
|  |  | ||||||
							
								
								
									
										14
									
								
								samples/Clean/stack.dcl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								samples/Clean/stack.dcl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | |||||||
|  | definition module stack | ||||||
|  |  | ||||||
|  | :: Stack a | ||||||
|  |  | ||||||
|  | newStack :: (Stack a) | ||||||
|  | push :: a (Stack a) -> Stack a | ||||||
|  | pushes :: [a] (Stack a) -> Stack a | ||||||
|  | pop :: (Stack a) -> Stack a | ||||||
|  | popn :: Int (Stack a) -> Stack a | ||||||
|  | top :: (Stack a) -> a | ||||||
|  | topn :: Int (Stack a) -> [a] | ||||||
|  | elements :: (Stack a) -> [a] | ||||||
|  | count :: (Stack a) -> Int | ||||||
|  |  | ||||||
							
								
								
									
										33
									
								
								samples/Clean/stack.icl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								samples/Clean/stack.icl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,33 @@ | |||||||
|  | implementation module stack | ||||||
|  | import StdEnv | ||||||
|  |  | ||||||
|  | :: Stack a :== [a] | ||||||
|  |  | ||||||
|  | newStack :: (Stack a) | ||||||
|  | newStack = [] | ||||||
|  |  | ||||||
|  | push :: a (Stack a) -> Stack a | ||||||
|  | push x s = [x:s] | ||||||
|  |  | ||||||
|  | pushes :: [a] (Stack a) -> Stack a | ||||||
|  | pushes x s = x ++ s | ||||||
|  |  | ||||||
|  | pop :: (Stack a) -> Stack a | ||||||
|  | pop [] = abort "Cannot use pop on an empty stack" | ||||||
|  | pop [e:s] = s | ||||||
|  |  | ||||||
|  | popn :: Int (Stack a) -> Stack a | ||||||
|  | popn n s  = drop n s | ||||||
|  |  | ||||||
|  | top :: (Stack a) -> a | ||||||
|  | top [] = abort "Cannot use top on an empty stack" | ||||||
|  | top [e:s] = e | ||||||
|  |  | ||||||
|  | topn :: Int (Stack a) -> [a] | ||||||
|  | topn n s = take n s | ||||||
|  | elements :: (Stack a) -> [a] | ||||||
|  | elements s = s | ||||||
|  |  | ||||||
|  | count :: (Stack a) -> Int | ||||||
|  | count s = length s | ||||||
|  |  | ||||||
							
								
								
									
										16
									
								
								samples/Clean/streams.dcl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								samples/Clean/streams.dcl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,16 @@ | |||||||
|  | definition module streams | ||||||
|  |  | ||||||
|  | import StdEnv | ||||||
|  |  | ||||||
|  | instance zero [Real] | ||||||
|  | instance one [Real] | ||||||
|  | instance + [Real]         | ||||||
|  | instance - [Real] | ||||||
|  | instance * [Real] | ||||||
|  | instance / [Real] | ||||||
|  |  | ||||||
|  | X :: [Real] | ||||||
|  | invert :: [Real] -> [Real] | ||||||
|  | pow :: [Real] Int -> [Real] | ||||||
|  | (shuffle) infixl 7 :: [Real] [Real] -> [Real] | ||||||
|  |  | ||||||
							
								
								
									
										49
									
								
								samples/Clean/streams.icl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								samples/Clean/streams.icl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,49 @@ | |||||||
|  | implementation module streams | ||||||
|  |  | ||||||
|  | import StdEnv | ||||||
|  |  | ||||||
|  | instance zero [Real] | ||||||
|  | where | ||||||
|  |         zero = [] //Infinite row of zeroes represented as empty list to ease computation | ||||||
|  |  | ||||||
|  | instance one [Real] | ||||||
|  | where | ||||||
|  |         one = [1.0:zero] | ||||||
|  |  | ||||||
|  | instance + [Real] | ||||||
|  | where | ||||||
|  |         (+) [s:s`] [t:t`] = [s+t:s`+t`] | ||||||
|  |         (+) [s:s`] [] = [s:s`] | ||||||
|  |         (+) [] [t:t`] = [t:t`] | ||||||
|  |         (+) [] [] = [] | ||||||
|  |          | ||||||
|  | instance - [Real] | ||||||
|  | where | ||||||
|  |         (-) [s:s`] [t:t`] = [s-t:s`-t`] | ||||||
|  |         (-) [s:s`] [] = [s:s`] | ||||||
|  |         (-) [] [t:t`] = [-1.0] * [t:t`] | ||||||
|  |         (-) [] [] = [] | ||||||
|  |  | ||||||
|  | instance * [Real] | ||||||
|  | where | ||||||
|  |         (*) [s:s`] [t:t`] = [s*t:s`*[t:t`]+[s]*t`] | ||||||
|  |         (*) _ _ = [] | ||||||
|  |  | ||||||
|  | instance / [Real] | ||||||
|  | where | ||||||
|  |         (/) s t = s * (invert t) | ||||||
|  |  | ||||||
|  | X :: [Real] | ||||||
|  | X = [0.0:one] | ||||||
|  |  | ||||||
|  | invert :: [Real] -> [Real] | ||||||
|  | invert [s:s`] = [1.0/s:(invert [s:s`]) * s` * [-1.0/s]] | ||||||
|  |  | ||||||
|  | pow :: [Real] Int -> [Real] | ||||||
|  | pow s 0 = one | ||||||
|  | pow s n = s * pow s (n-1) | ||||||
|  |  | ||||||
|  | (shuffle) infixl 7 :: [Real] [Real] -> [Real] | ||||||
|  | (shuffle) [s:s`] [t:t`] = [s*t:s` shuffle [t:t`] + [s:s`] shuffle t`] | ||||||
|  | (shuffle) _ _ = [] | ||||||
|  |  | ||||||
							
								
								
									
										146
									
								
								samples/Clojure/index.cljs.hl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										146
									
								
								samples/Clojure/index.cljs.hl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,146 @@ | |||||||
|  | ;; Copyright (c) Alan Dipert and Micha Niskin. All rights reserved. | ||||||
|  | ;; The use and distribution terms for this software are covered by the | ||||||
|  | ;; Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php) | ||||||
|  | ;; which can be found in the file epl-v10.html at the root of this distribution. | ||||||
|  | ;; By using this software in any fashion, you are agreeing to be bound by | ||||||
|  | ;; the terms of this license. | ||||||
|  | ;; You must not remove this notice, or any other, from this software. | ||||||
|  |  | ||||||
|  | (page "index.html" | ||||||
|  |   (:refer-clojure :exclude [nth]) | ||||||
|  |   (:require | ||||||
|  |    [tailrecursion.hoplon.reload        :refer [reload-all]] | ||||||
|  |    [tailrecursion.hoplon.util          :refer [nth name pluralize]] | ||||||
|  |    [tailrecursion.hoplon.storage-atom  :refer [local-storage]])) | ||||||
|  |  | ||||||
|  | ;; utility functions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||||||
|  |  | ||||||
|  | (declare route state editing) | ||||||
|  |  | ||||||
|  | (reload-all) | ||||||
|  |  | ||||||
|  | (def mapvi  (comp vec map-indexed)) | ||||||
|  |  | ||||||
|  | (defn dissocv [v i] | ||||||
|  |   (let [z (- (dec (count v)) i)] | ||||||
|  |     (cond (neg?  z) v | ||||||
|  |           (zero? z) (pop v) | ||||||
|  |           (pos?  z) (into (subvec v 0 i) (subvec v (inc i)))))) | ||||||
|  |  | ||||||
|  | (defn decorate [todo route editing i] | ||||||
|  |   (let [{done? :completed text :text} todo] | ||||||
|  |     (-> todo (assoc :editing (= editing i) | ||||||
|  |                     :visible (and (not (empty? text)) | ||||||
|  |                                   (or (= "#/" route) | ||||||
|  |                                       (and (= "#/active" route) (not done?)) | ||||||
|  |                                       (and (= "#/completed" route) done?))))))) | ||||||
|  |  | ||||||
|  | ;; persisted state cell (AKA: stem cell) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||||||
|  |  | ||||||
|  | (def   state        (-> (cell []) (local-storage ::store))) | ||||||
|  |  | ||||||
|  | ;; local state cells ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||||||
|  |  | ||||||
|  | (defc  loaded?      false) | ||||||
|  | (defc  editing      nil) | ||||||
|  | (def   route        (route-cell "#/")) | ||||||
|  |  | ||||||
|  | ;; formula cells (computed state) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||||||
|  |  | ||||||
|  | (defc= completed    (filter :completed state)) | ||||||
|  | (defc= active       (remove :completed state)) | ||||||
|  | (defc= plural-item  (pluralize "item" (count active))) | ||||||
|  | (defc= todos        (mapvi #(list %1 (decorate %2 route editing %1)) state)) | ||||||
|  |  | ||||||
|  | ;; state transition functions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||||||
|  |  | ||||||
|  | (defn  todo        [t]   {:completed false :text t}) | ||||||
|  | (defn  destroy!    [i]   (swap! state dissocv i)) | ||||||
|  | (defn  done!       [i v] (swap! state assoc-in [i :completed] v)) | ||||||
|  | (defn  clear-done! [& _] (swap! state #(vec (remove :completed %)))) | ||||||
|  | (defn  new!        [t]   (when (not (empty? t)) (swap! state conj (todo t)))) | ||||||
|  | (defn  all-done!   [v]   (swap! state #(mapv (fn [x] (assoc x :completed v)) %))) | ||||||
|  | (defn  editing!    [i v] (reset! editing (if v i nil))) | ||||||
|  | (defn  text!       [i v] (if (empty? v) (destroy! i) (swap! state assoc-in [i :text] v))) | ||||||
|  |  | ||||||
|  | ;; page ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||||||
|  |  | ||||||
|  | (html :lang "en" | ||||||
|  |   (head | ||||||
|  |     (meta :charset "utf-8") | ||||||
|  |     (meta :http-equiv "X-UA-Compatible" :content "IE=edge,chrome=1") | ||||||
|  |     (link :rel "stylesheet" :href "base.css") | ||||||
|  |     (title "Hoplon • TodoMVC")) | ||||||
|  |   (body | ||||||
|  |     (noscript | ||||||
|  |       (div :id "noscript" | ||||||
|  |         (p "JavaScript is required to view this page."))) | ||||||
|  |     (div | ||||||
|  |       (section :id "todoapp" | ||||||
|  |         (header :id "header" | ||||||
|  |           (h1 "todos") | ||||||
|  |           (form :on-submit #(do (new! (val-id :new-todo)) | ||||||
|  |                                 (do! (by-id :new-todo) :value "")) | ||||||
|  |             (input | ||||||
|  |               :id "new-todo" | ||||||
|  |               :type "text" | ||||||
|  |               :autofocus true | ||||||
|  |               :placeholder "What needs to be done?" | ||||||
|  |               :on-blur #(do! (by-id :new-todo) :value "")))) | ||||||
|  |         (section | ||||||
|  |           :id "main" | ||||||
|  |           :do-toggle (cell= (not (and (empty? active) (empty? completed)))) | ||||||
|  |           (input | ||||||
|  |             :id "toggle-all" | ||||||
|  |             :type "checkbox" | ||||||
|  |             :do-attr (cell= {:checked (empty? active)})  | ||||||
|  |             :on-click #(all-done! (val-id :toggle-all))) | ||||||
|  |           (label :for "toggle-all" | ||||||
|  |             "Mark all as complete") | ||||||
|  |           (ul :id "todo-list" | ||||||
|  |             (loop-tpl | ||||||
|  |               :reverse true | ||||||
|  |               :bind-ids [done# edit#] | ||||||
|  |               :bindings [[i {edit? :editing done? :completed todo-text :text show? :visible}] todos]  | ||||||
|  |               (li | ||||||
|  |                 :do-class (cell= {:completed done? :editing edit?})  | ||||||
|  |                 :do-toggle show? | ||||||
|  |                 (div :class "view" :on-dblclick #(editing! @i true) | ||||||
|  |                   (input | ||||||
|  |                     :id done#  | ||||||
|  |                     :type "checkbox" | ||||||
|  |                     :class "toggle" | ||||||
|  |                     :do-attr (cell= {:checked done?})  | ||||||
|  |                     :on-click #(done! @i (val-id done#))) | ||||||
|  |                   (label (text "~{todo-text}")) | ||||||
|  |                   (button | ||||||
|  |                     :type "submit" | ||||||
|  |                     :class "destroy" | ||||||
|  |                     :on-click  #(destroy! @i))) | ||||||
|  |                 (form :on-submit #(editing! @i false) | ||||||
|  |                   (input | ||||||
|  |                     :id edit# | ||||||
|  |                     :type "text" | ||||||
|  |                     :class "edit" | ||||||
|  |                     :do-value todo-text | ||||||
|  |                     :do-focus edit? | ||||||
|  |                     :on-blur #(when @edit? (editing! @i false)) | ||||||
|  |                     :on-change #(when @edit? (text! @i (val-id edit#))))))))) | ||||||
|  |         (footer  | ||||||
|  |           :id "footer" | ||||||
|  |           :do-toggle (cell= (not (and (empty? active) (empty? completed)))) | ||||||
|  |           (span :id "todo-count" | ||||||
|  |             (strong (text "~(count active) ")) | ||||||
|  |             (span (text "~{plural-item} left"))) | ||||||
|  |           (ul :id "filters" | ||||||
|  |             (li (a :href "#/"          :do-class (cell= {:selected (= "#/" route)})          "All")) | ||||||
|  |             (li (a :href "#/active"    :do-class (cell= {:selected (= "#/active" route)})    "Active")) | ||||||
|  |             (li (a :href "#/completed" :do-class (cell= {:selected (= "#/completed" route)}) "Completed"))) | ||||||
|  |           (button | ||||||
|  |             :type      "submit" | ||||||
|  |             :id        "clear-completed" | ||||||
|  |             :on-click  #(clear-done!) | ||||||
|  |             (text "Clear completed (~(count completed))")))) | ||||||
|  |       (footer :id "info"  | ||||||
|  |         (p "Double-click to edit a todo") | ||||||
|  |         (p "Part of " (a :href "http://github.com/tailrecursion/hoplon-demos/" "hoplon-demos"))))))  | ||||||
							
								
								
									
										40
									
								
								samples/CoffeeScript/example.cjsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								samples/CoffeeScript/example.cjsx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,40 @@ | |||||||
|  | ###* @cjsx React.DOM ### | ||||||
|  | define 'myProject.ReactExampleComponent', [ | ||||||
|  |   'React' | ||||||
|  |   'myProject.ExampleStore' | ||||||
|  |   'myProject.ExampleActions' | ||||||
|  |   'myProject.ReactExampleTable' | ||||||
|  | ], (React, ExampleStore, ExampleActions, ReactExampleTable ) -> | ||||||
|  |  | ||||||
|  |   ReactExampleComponent = React.createClass | ||||||
|  |     mixins: [ListenMixin] | ||||||
|  |  | ||||||
|  |     getInitialState: -> | ||||||
|  |       rows: ExampleStore.getRows() | ||||||
|  |       meta: ExampleStore.getMeta() | ||||||
|  |  | ||||||
|  |     componentWillMount: -> | ||||||
|  |       @listenTo ExampleStore | ||||||
|  |  | ||||||
|  |     componentDidMount: -> | ||||||
|  |       ExampleActions.getExampleData() | ||||||
|  |  | ||||||
|  |     onStoreChange: -> | ||||||
|  |       if this.isMounted() | ||||||
|  |         @setState | ||||||
|  |           rows: ExampleStore.getRows() | ||||||
|  |           meta: ExampleStore.getMeta() | ||||||
|  |  | ||||||
|  |     componentWillUnmount: -> | ||||||
|  |       @stopListening ExampleStore | ||||||
|  |  | ||||||
|  |     render: -> | ||||||
|  |       <div className="page-wrap"> | ||||||
|  |           <header> | ||||||
|  |             <strong> {@state.title} </strong> | ||||||
|  |           <header> | ||||||
|  |             <ReactExampleTable | ||||||
|  |               rows={@state.rows}, | ||||||
|  |               meta={@state.meta} | ||||||
|  |             /> | ||||||
|  |       </div> | ||||||
							
								
								
									
										239
									
								
								samples/ColdFusion CFC/exampleScript.cfc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										239
									
								
								samples/ColdFusion CFC/exampleScript.cfc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,239 @@ | |||||||
|  | /** | ||||||
|  | ******************************************************************************** | ||||||
|  | ContentBox - A Modular Content Platform | ||||||
|  | Copyright 2012 by Luis Majano and Ortus Solutions, Corp | ||||||
|  | www.gocontentbox.org | www.luismajano.com | www.ortussolutions.com | ||||||
|  | ******************************************************************************** | ||||||
|  | Apache License, Version 2.0 | ||||||
|  |  | ||||||
|  | Copyright Since [2012] [Luis Majano and Ortus Solutions,Corp] | ||||||
|  |  | ||||||
|  | Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | you may not use this file except in compliance with the License. | ||||||
|  | You may obtain a copy of the License at | ||||||
|  |  | ||||||
|  | http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  |  | ||||||
|  | Unless required by applicable law or agreed to in writing, software | ||||||
|  | distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | See the License for the specific language governing permissions and | ||||||
|  | limitations under the License. | ||||||
|  | ******************************************************************************** | ||||||
|  | * A generic content service for content objects | ||||||
|  | */ | ||||||
|  | component extends="coldbox.system.orm.hibernate.VirtualEntityService" singleton{ | ||||||
|  |  | ||||||
|  | 	// DI | ||||||
|  | 	property name="settingService"			inject="id:settingService@cb"; | ||||||
|  | 	property name="cacheBox"				inject="cachebox"; | ||||||
|  | 	property name="log"						inject="logbox:logger:{this}"; | ||||||
|  | 	property name="customFieldService" 	 	inject="customFieldService@cb"; | ||||||
|  | 	property name="categoryService" 	 	inject="categoryService@cb"; | ||||||
|  | 	property name="commentService" 	 		inject="commentService@cb"; | ||||||
|  | 	property name="contentVersionService"	inject="contentVersionService@cb"; | ||||||
|  | 	property name="authorService"			inject="authorService@cb"; | ||||||
|  | 	property name="populator"				inject="wirebox:populator"; | ||||||
|  | 	property name="systemUtil"				inject="SystemUtil@cb"; | ||||||
|  | 	 | ||||||
|  | 	/* | ||||||
|  | 	* Constructor | ||||||
|  | 	* @entityName.hint The content entity name to bind this service to. | ||||||
|  | 	*/ | ||||||
|  | 	ContentService function init(entityName="cbContent"){ | ||||||
|  | 		// init it | ||||||
|  | 		super.init(entityName=arguments.entityName, useQueryCaching=true); | ||||||
|  |  | ||||||
|  | 		// Test scope coloring in pygments | ||||||
|  | 		this.colorTestVar = "Just for testing pygments!"; | ||||||
|  | 		cookie.colorTestVar = ""; | ||||||
|  | 		client.colorTestVar = "" | ||||||
|  | 		session.colorTestVar = ""; | ||||||
|  | 		application.colorTestVar = ""; | ||||||
|  |  | ||||||
|  | 		return this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	/** | ||||||
|  | 	* Clear all content caches | ||||||
|  | 	* @async.hint Run it asynchronously or not, defaults to false | ||||||
|  | 	*/ | ||||||
|  | 	function clearAllCaches(boolean async=false){ | ||||||
|  | 		var settings = settingService.getAllSettings(asStruct=true); | ||||||
|  | 		// Get appropriate cache provider | ||||||
|  | 		var cache = cacheBox.getCache( settings.cb_content_cacheName ); | ||||||
|  | 		cache.clearByKeySnippet(keySnippet="cb-content",async=arguments.async); | ||||||
|  | 		return this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	/** | ||||||
|  | 	* Clear all page wrapper caches | ||||||
|  | 	* @async.hint Run it asynchronously or not, defaults to false | ||||||
|  | 	*/ | ||||||
|  | 	function clearAllPageWrapperCaches(boolean async=false){ | ||||||
|  | 		var settings = settingService.getAllSettings(asStruct=true); | ||||||
|  | 		// Get appropriate cache provider | ||||||
|  | 		var cache = cacheBox.getCache( settings.cb_content_cacheName ); | ||||||
|  | 		cache.clearByKeySnippet(keySnippet="cb-content-pagewrapper",async=arguments.async); | ||||||
|  | 		return this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	/** | ||||||
|  | 	* Clear all page wrapper caches | ||||||
|  | 	* @slug.hint The slug partial to clean on | ||||||
|  | 	* @async.hint Run it asynchronously or not, defaults to false | ||||||
|  | 	*/ | ||||||
|  | 	function clearPageWrapperCaches(required any slug, boolean async=false){ | ||||||
|  | 		var settings = settingService.getAllSettings(asStruct=true); | ||||||
|  | 		// Get appropriate cache provider | ||||||
|  | 		var cache = cacheBox.getCache( settings.cb_content_cacheName ); | ||||||
|  | 		cache.clearByKeySnippet(keySnippet="cb-content-pagewrapper-#arguments.slug#",async=arguments.async); | ||||||
|  | 		return this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	/** | ||||||
|  | 	* Clear a page wrapper cache | ||||||
|  | 	* @slug.hint The slug to clean | ||||||
|  | 	* @async.hint Run it asynchronously or not, defaults to false | ||||||
|  | 	*/ | ||||||
|  | 	function clearPageWrapper(required any slug, boolean async=false){ | ||||||
|  | 		var settings = settingService.getAllSettings(asStruct=true); | ||||||
|  | 		// Get appropriate cache provider | ||||||
|  | 		var cache = cacheBox.getCache( settings.cb_content_cacheName ); | ||||||
|  | 		cache.clear("cb-content-pagewrapper-#arguments.slug#/"); | ||||||
|  | 		return this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	/** | ||||||
|  | 	* Searches published content with cool paramters, remember published content only | ||||||
|  | 	* @searchTerm.hint The search term to search | ||||||
|  | 	* @max.hint The maximum number of records to paginate | ||||||
|  | 	* @offset.hint The offset in the pagination | ||||||
|  | 	* @asQuery.hint Return as query or array of objects, defaults to array of objects | ||||||
|  | 	* @sortOrder.hint The sorting of the search results, defaults to publishedDate DESC | ||||||
|  | 	* @isPublished.hint Search for published, non-published or both content objects [true, false, 'all'] | ||||||
|  | 	* @searchActiveContent.hint Search only content titles or both title and active content. Defaults to both. | ||||||
|  | 	*/ | ||||||
|  | 	function searchContent( | ||||||
|  | 		any searchTerm="",  | ||||||
|  | 		numeric max=0,  | ||||||
|  | 		numeric offset=0,  | ||||||
|  | 		boolean asQuery=false,  | ||||||
|  | 		any sortOrder="publishedDate DESC",  | ||||||
|  | 		any isPublished=true,  | ||||||
|  | 		boolean searchActiveContent=true){ | ||||||
|  |  | ||||||
|  | 		var results = {}; | ||||||
|  | 		var c = newCriteria(); | ||||||
|  |  | ||||||
|  | 		// only published content | ||||||
|  | 		if( isBoolean( arguments.isPublished ) ){ | ||||||
|  | 			// Published bit | ||||||
|  | 			c.isEq( "isPublished", javaCast( "Boolean", arguments.isPublished ) ); | ||||||
|  | 			// Published eq true evaluate other params | ||||||
|  | 			if( arguments.isPublished ){ | ||||||
|  | 				c.isLt("publishedDate", now() ) | ||||||
|  | 				.$or( c.restrictions.isNull("expireDate"), c.restrictions.isGT("expireDate", now() ) ) | ||||||
|  | 				.isEq("passwordProtection",""); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		// Search Criteria | ||||||
|  | 		if( len( arguments.searchTerm ) ){ | ||||||
|  | 			// like disjunctions | ||||||
|  | 			c.createAlias("activeContent","ac"); | ||||||
|  | 			// Do we search title and active content or just title? | ||||||
|  | 			if( arguments.searchActiveContent ){ | ||||||
|  | 				c.$or( c.restrictions.like("title","%#arguments.searchTerm#%"), | ||||||
|  | 				  	  c.restrictions.like("ac.content", "%#arguments.searchTerm#%") ); | ||||||
|  | 			} | ||||||
|  | 			else{ | ||||||
|  | 				c.like( "title", "%#arguments.searchTerm#%" );  | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		// run criteria query and projections count | ||||||
|  | 		results.count = c.count( "contentID" ); | ||||||
|  | 		results.content = c.resultTransformer( c.DISTINCT_ROOT_ENTITY ) | ||||||
|  | 							.list(offset=arguments.offset, max=arguments.max, sortOrder=arguments.sortOrder, asQuery=arguments.asQuery); | ||||||
|  | 	 | ||||||
|  | 		return results; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | /********************************************* PRIVATE *********************************************/ | ||||||
|  | 	 | ||||||
|  |  | ||||||
|  | 	/** | ||||||
|  | 	* Update the content hits | ||||||
|  | 	* @contentID.hint The content id to update | ||||||
|  | 	*/ | ||||||
|  | 	private function syncUpdateHits(required contentID){ | ||||||
|  | 		var q = new Query(sql="UPDATE cb_content SET hits = hits + 1 WHERE contentID = #arguments.contentID#").execute(); | ||||||
|  | 		return this; | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	 | ||||||
|  | 	private function closureTest(){ | ||||||
|  | 		methodCall( | ||||||
|  | 			param1, | ||||||
|  | 			function( arg1, required arg2 ){ | ||||||
|  | 				var settings = settingService.getAllSettings(asStruct=true); | ||||||
|  | 				// Get appropriate cache provider | ||||||
|  | 				var cache = cacheBox.getCache( settings.cb_content_cacheName ); | ||||||
|  | 				cache.clear("cb-content-pagewrapper-#arguments.slug#/"); | ||||||
|  | 				return this; | ||||||
|  | 			}, | ||||||
|  | 			param1 | ||||||
|  | 		); | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	private function StructliteralTest(){ | ||||||
|  | 		return { | ||||||
|  | 			foo = bar, | ||||||
|  | 			brad = 'Wood', | ||||||
|  | 			func = function( arg1, required arg2 ){ | ||||||
|  | 				var settings = settingService.getAllSettings(asStruct=true); | ||||||
|  | 				// Get appropriate cache provider | ||||||
|  | 				var cache = cacheBox.getCache( settings.cb_content_cacheName ); | ||||||
|  | 				cache.clear("cb-content-pagewrapper-#arguments.slug#/"); | ||||||
|  | 				return this; | ||||||
|  | 			}, | ||||||
|  | 			array = [ | ||||||
|  | 				1, | ||||||
|  | 				2, | ||||||
|  | 				3, | ||||||
|  | 				4, | ||||||
|  | 				5, | ||||||
|  | 				'test', | ||||||
|  | 				'testing', | ||||||
|  | 				'testerton', | ||||||
|  | 				{ | ||||||
|  | 					foo = true, | ||||||
|  | 					brad = false, | ||||||
|  | 					wood = null | ||||||
|  | 				} | ||||||
|  | 			], | ||||||
|  | 			last = "final" | ||||||
|  | 		}; | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	private function arrayliteralTest(){ | ||||||
|  | 		return [ | ||||||
|  | 			1, | ||||||
|  | 			2, | ||||||
|  | 			3, | ||||||
|  | 			4, | ||||||
|  | 			5, | ||||||
|  | 			'test', | ||||||
|  | 			'testing', | ||||||
|  | 			'testerton', | ||||||
|  | 			{ | ||||||
|  | 				foo = true, | ||||||
|  | 				brad = false, | ||||||
|  | 				wood = null | ||||||
|  | 			}, | ||||||
|  | 			'testy-von-testavich' | ||||||
|  | 		]; | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | } | ||||||
							
								
								
									
										18
									
								
								samples/ColdFusion CFC/exampleTag.cfc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								samples/ColdFusion CFC/exampleTag.cfc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,18 @@ | |||||||
|  | <cfcomponent> | ||||||
|  | 	 | ||||||
|  | 	<cffunction name="init" access="public" returntype="any"> | ||||||
|  | 		<cfargument name="arg1" type="any" required="true"> | ||||||
|  | 		<cfset this.myVariable = arguments.arg1> | ||||||
|  |  | ||||||
|  | 		<cfreturn this> | ||||||
|  | 	</cffunction> | ||||||
|  |  | ||||||
|  | 	<cffunction name="testFunc" access="private" returntype="void"> | ||||||
|  | 		<cfargument name="arg1" type="any" required="false"> | ||||||
|  | 		 | ||||||
|  | 		<cfif structKeyExists(arguments, "arg1")> | ||||||
|  | 			<cfset writeoutput("Argument exists")> | ||||||
|  | 		</cfif> | ||||||
|  | 	</cffunction> | ||||||
|  | 	 | ||||||
|  | </cfcomponent> | ||||||
							
								
								
									
										50
									
								
								samples/ColdFusion/example.cfm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								samples/ColdFusion/example.cfm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,50 @@ | |||||||
|  | <!--- cfcomment ---> | ||||||
|  | <!--- nested <!--- cfcomment ---> ---> | ||||||
|  | <!--- multi-line | ||||||
|  | nested | ||||||
|  | <!--- | ||||||
|  | cfcomment | ||||||
|  | ---> | ||||||
|  | ---> | ||||||
|  | <!-- html comment --> | ||||||
|  | <html> | ||||||
|  | <head> | ||||||
|  | <title>Date Functions</title> | ||||||
|  | </head> | ||||||
|  | <body> | ||||||
|  | <cfset RightNow = Now()> | ||||||
|  | <cfoutput> | ||||||
|  |  #RightNow#<br /> | ||||||
|  |  #DateFormat(RightNow)#<br /> | ||||||
|  |  #DateFormat(RightNow,"mm/dd/yy")#<br /> | ||||||
|  |  #TimeFormat(RightNow)#<br /> | ||||||
|  |  #TimeFormat(RightNow,"hh:mm tt")#<br /> | ||||||
|  |  #IsDate(RightNow)#<br /> | ||||||
|  |  #IsDate("January 31, 2007")#<br /> | ||||||
|  |  #IsDate("foo")#<br /> | ||||||
|  |  #DaysInMonth(RightNow)# | ||||||
|  | </cfoutput> | ||||||
|  | <cfset x="x"> | ||||||
|  | <cfset y="y"> | ||||||
|  | <cfset z="z"> | ||||||
|  | <cfoutput group="x"> | ||||||
|  |     #x# | ||||||
|  |     <cfoutput>#y#</cfoutput> | ||||||
|  |     #z# | ||||||
|  | </cfoutput> | ||||||
|  | </body> | ||||||
|  | </html> | ||||||
|  |  | ||||||
|  | <cfset person = "Paul"> | ||||||
|  | <cfset greeting = "Hello #person#"> | ||||||
|  |  | ||||||
|  | <cfset greeting = "Hello" & " world!"> | ||||||
|  | <cfset a = 5> | ||||||
|  | <cfset b = 10> | ||||||
|  | <cfset c = a^b> | ||||||
|  | <cfset c = a MOD b> | ||||||
|  | <cfset c = a / b> | ||||||
|  | <cfset c = a * b> | ||||||
|  | <cfset c = a + b> | ||||||
|  | <cfset c = a - b> | ||||||
|  | <!--- <!-- another <!--- nested --> ---> comment ---> | ||||||
							
								
								
									
										26
									
								
								samples/Cool/list.cl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								samples/Cool/list.cl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | |||||||
|  | (* This simple example of a list class is adapted from an example in the | ||||||
|  |    Cool distribution. *) | ||||||
|  |  | ||||||
|  | class List { | ||||||
|  |    isNil() : Bool { true }; | ||||||
|  |    head()  : Int { { abort(); 0; } }; | ||||||
|  |    tail()  : List { { abort(); self; } }; | ||||||
|  |    cons(i : Int) : List { | ||||||
|  |       (new Cons).init(i, self) | ||||||
|  |    }; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | class Cons inherits List { | ||||||
|  |    car : Int;	-- The element in this list cell | ||||||
|  |    cdr : List;	-- The rest of the list | ||||||
|  |    isNil() : Bool { false }; | ||||||
|  |    head()  : Int { car }; | ||||||
|  |    tail()  : List { cdr }; | ||||||
|  |    init(i : Int, rest : List) : List { | ||||||
|  |       { | ||||||
|  | 	 car <- i; | ||||||
|  | 	 cdr <- rest; | ||||||
|  | 	 self; | ||||||
|  |       } | ||||||
|  |    }; | ||||||
|  | }; | ||||||
							
								
								
									
										71
									
								
								samples/Cool/sample.cl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										71
									
								
								samples/Cool/sample.cl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,71 @@ | |||||||
|  | (* Refer to Alex Aiken, "The Cool Reference Manual": | ||||||
|  |     http://theory.stanford.edu/~aiken/software/cool/cool-manual.pdf | ||||||
|  |    for language specification. | ||||||
|  | *) | ||||||
|  |  | ||||||
|  | -- Exhibit various language constructs | ||||||
|  | class Sample { | ||||||
|  |     testCondition(x: Int): Bool { | ||||||
|  |         if x = 0 | ||||||
|  |         then false | ||||||
|  |         else | ||||||
|  |             if x < (1 + 2) * 3 | ||||||
|  |             then true | ||||||
|  |             else false | ||||||
|  |             fi | ||||||
|  |         fi | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     testLoop(y: Int): Bool { | ||||||
|  |         while y > 0 loop | ||||||
|  |         { | ||||||
|  |             if not condition(y) | ||||||
|  |             then y <- y / 2 | ||||||
|  |             else y <- y - 1; | ||||||
|  |         } | ||||||
|  |         pool | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     testAssign(z: Int): Bool { | ||||||
|  |         i : Int; | ||||||
|  |         i <- ~z; | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     testCase(var: Sample): SELF_TYPE { | ||||||
|  |         io : IO <- new IO; | ||||||
|  |         case var of | ||||||
|  |             a : A => io.out_string("Class type is A\n"); | ||||||
|  |             b : B => io.out_string("Class type is B\n"); | ||||||
|  |             s : Sample => io.out_string("Class type is Sample\n"); | ||||||
|  |             o : Object => io.out_string("Class type is object\n"); | ||||||
|  |         esac | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     testLet(i: Int): Int { | ||||||
|  |         let (a: Int in | ||||||
|  |             let(b: Int <- 3, c: Int <- 4 in | ||||||
|  |                 { | ||||||
|  |                     a <- 2; | ||||||
|  |                     a * b * 2 / c; | ||||||
|  |                 } | ||||||
|  |             ) | ||||||
|  |         ) | ||||||
|  |     }; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | -- Used to test subclasses | ||||||
|  | class A inherits Sample {}; | ||||||
|  | class B inherits A {}; | ||||||
|  |  | ||||||
|  | class C { | ||||||
|  |     main() : Int { | ||||||
|  |         (new Sample).testLet(1) | ||||||
|  |     }; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | -- "Hello, world" example | ||||||
|  | class Main inherits IO { | ||||||
|  |     main(): SELF_TYPE { | ||||||
|  |         out_string("Hello, World.\n") | ||||||
|  |     }; | ||||||
|  | }; | ||||||
							
								
								
									
										580
									
								
								samples/Cycript/utils.cy
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										580
									
								
								samples/Cycript/utils.cy
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,580 @@ | |||||||
|  | (function(utils) { | ||||||
|  | 	// Load C functions declared in utils.loadFuncs | ||||||
|  | 	var shouldLoadCFuncs = true; | ||||||
|  | 	// Expose the C functions to cycript's global scope | ||||||
|  | 	var shouldExposeCFuncs = true; | ||||||
|  | 	// Expose C constants to cycript's global scope | ||||||
|  | 	var shouldExposeConsts = true; | ||||||
|  | 	// Expose functions defined here to cycript's global scope | ||||||
|  | 	var shouldExposeFuncs = true; | ||||||
|  | 	// Which functions to expose | ||||||
|  | 	var funcsToExpose = ["exec", "include", "sizeof", "logify", "apply", "str2voidPtr", "voidPtr2str", "double2voidPtr", "voidPtr2double", "isMemoryReadable", "isObject", "makeStruct"]; | ||||||
|  | 	 | ||||||
|  | 	// C functions that utils.loadFuncs loads | ||||||
|  | 	var CFuncsDeclarations = [ | ||||||
|  | 		// <stdlib.h> | ||||||
|  | 		"void *calloc(size_t num, size_t size)", | ||||||
|  | 		// <string.h> | ||||||
|  | 		"char *strcpy(char *restrict dst, const char *restrict src)", | ||||||
|  | 		"char *strdup(const char *s1)", | ||||||
|  | 		"void* memset(void* dest, int ch, size_t count)", | ||||||
|  | 		// <stdio.h> | ||||||
|  | 		"FILE *fopen(const char *, const char *)", | ||||||
|  | 		"int fclose(FILE *)", | ||||||
|  | 		"size_t fread(void *restrict, size_t, size_t, FILE *restrict)", | ||||||
|  | 		"size_t fwrite(const void *restrict, size_t, size_t, FILE *restrict)", | ||||||
|  | 		// <mach.h> | ||||||
|  | 		"mach_port_t mach_task_self()", | ||||||
|  | 		"kern_return_t task_for_pid(mach_port_name_t target_tport, int pid, mach_port_name_t *tn)", | ||||||
|  | 		"kern_return_t mach_vm_protect(vm_map_t target_task, mach_vm_address_t address, mach_vm_size_t size, boolean_t set_maximum, vm_prot_t new_protection)", | ||||||
|  | 		"kern_return_t mach_vm_write(vm_map_t target_task, mach_vm_address_t address, vm_offset_t data, mach_msg_type_number_t dataCnt)", | ||||||
|  | 		"kern_return_t mach_vm_read(vm_map_t target_task, mach_vm_address_t address, mach_vm_size_t size, vm_offset_t *data, mach_msg_type_number_t *dataCnt)", | ||||||
|  | 	]; | ||||||
|  | 	 | ||||||
|  | 	/* | ||||||
|  | 		Replacement for eval that can handle @encode etc. | ||||||
|  | 		 | ||||||
|  | 		Usage: | ||||||
|  | 			cy# utils.exec("@encode(void *(int, char))") | ||||||
|  | 			@encode(void*(int,char)) | ||||||
|  | 	*/ | ||||||
|  | 	utils.exec = function(str) { | ||||||
|  | 		var mkdir = @encode(int (const char *, int))(dlsym(RTLD_DEFAULT, "mkdir")); | ||||||
|  | 		var tempnam = @encode(char *(const char *, const char *))(dlsym(RTLD_DEFAULT, "tempnam")); | ||||||
|  | 		var fopen = @encode(void *(const char *, const char *))(dlsym(RTLD_DEFAULT, "fopen")); | ||||||
|  | 		var fclose = @encode(int (void *))(dlsym(RTLD_DEFAULT, "fclose")); | ||||||
|  | 		var fwrite = @encode(int (const char *, int, int, void *))(dlsym(RTLD_DEFAULT, "fwrite")); | ||||||
|  | 		var symlink = @encode(int (const char *, const char *))(dlsym(RTLD_DEFAULT, "symlink")); | ||||||
|  | 		var unlink = @encode(int (const char *))(dlsym(RTLD_DEFAULT, "unlink")); | ||||||
|  | 		var getenv = @encode(const char *(const char *))(dlsym(RTLD_DEFAULT, "getenv")); | ||||||
|  | 		var setenv = @encode(int (const char *, const char *, int))(dlsym(RTLD_DEFAULT, "setenv")); | ||||||
|  | 		 | ||||||
|  | 		var libdir = "/usr/lib/cycript0.9"; | ||||||
|  | 		var dir = libdir + "/tmp"; | ||||||
|  |  | ||||||
|  | 		mkdir(dir, 0777); | ||||||
|  | 		 | ||||||
|  | 		// This is needed because tempnam seems to ignore the first argument on i386 | ||||||
|  | 		var old_tmpdir = getenv("TMPDIR"); | ||||||
|  | 		setenv("TMPDIR", dir, 1); | ||||||
|  |  | ||||||
|  | 		// No freeing :( | ||||||
|  | 		var f = tempnam(dir, "exec-"); | ||||||
|  | 		setenv("TMPDIR", old_tmpdir, 1); | ||||||
|  | 		if(!f) { | ||||||
|  | 			return false; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		symlink(f, f + ".cy"); | ||||||
|  | 		 | ||||||
|  | 		str = "exports.result = " + str; | ||||||
|  |  | ||||||
|  | 		var handle = fopen(f, "w"); | ||||||
|  | 		fwrite(str, str.length, 1, handle); | ||||||
|  | 		fclose(handle); | ||||||
|  | 		 | ||||||
|  | 		var r; | ||||||
|  | 		var except = null; | ||||||
|  | 		try { | ||||||
|  | 			r = require(f.replace(libdir + "/", "")); | ||||||
|  | 		} catch(e) { | ||||||
|  | 			except = e; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		unlink(f + ".cy"); | ||||||
|  | 		unlink(f); | ||||||
|  | 		 | ||||||
|  | 		if(except !== null) { | ||||||
|  | 			throw except; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		return r.result; | ||||||
|  | 	}; | ||||||
|  | 	 | ||||||
|  | 	/* | ||||||
|  | 		Applies known typedefs | ||||||
|  | 		Used in utils.include and utils.makeStruct | ||||||
|  | 		 | ||||||
|  | 		Usage: | ||||||
|  | 			cy# utils.applyTypedefs("mach_vm_address_t") | ||||||
|  | 			"uint64_t" | ||||||
|  | 	*/ | ||||||
|  | 	utils.applyTypedefs = function(str) { | ||||||
|  | 		var typedefs = { | ||||||
|  | 			"struct": "", | ||||||
|  | 			"restrict": "", | ||||||
|  | 			"FILE": "void", | ||||||
|  | 			"size_t": "uint64_t", | ||||||
|  | 			"uintptr_t": "unsigned long", | ||||||
|  | 			"kern_return_t": "int", | ||||||
|  | 			"mach_port_t": "unsigned int", | ||||||
|  | 			"mach_port_name_t": "unsigned int", | ||||||
|  | 			"vm_offset_t": "unsigned long", | ||||||
|  | 			"vm_size_t": "unsigned long", | ||||||
|  | 			"mach_vm_address_t": "uint64_t", | ||||||
|  | 			"mach_vm_offset_t": "uint64_t", | ||||||
|  | 			"mach_vm_size_t": "uint64_t", | ||||||
|  | 			"vm_map_offset_t": "uint64_t", | ||||||
|  | 			"vm_map_address_t": "uint64_t", | ||||||
|  | 			"vm_map_size_t": "uint64_t", | ||||||
|  | 			"mach_port_context_t": "uint64_t", | ||||||
|  | 			"vm_map_t": "unsigned int", | ||||||
|  | 			"boolean_t": "unsigned int", | ||||||
|  | 			"vm_prot_t": "int", | ||||||
|  | 			"mach_msg_type_number_t": "unsigned int", | ||||||
|  | 			"cpu_type_t": "int", | ||||||
|  | 			"cpu_subtype_t": "int", | ||||||
|  | 			"cpu_threadtype_t": "int", | ||||||
|  | 		}; | ||||||
|  | 		 | ||||||
|  | 		for(var k in typedefs) { | ||||||
|  | 			str = str.replace(new RegExp("(\\s|\\*|,|\\(|^)" + k + "(\\s|\\*|,|\\)|$)", "g"), "$1" + typedefs[k] + "$2"); | ||||||
|  | 		} | ||||||
|  | 		 | ||||||
|  | 		return str; | ||||||
|  | 	}; | ||||||
|  | 	 | ||||||
|  | 	/* | ||||||
|  | 		Parses a C function declaration and returns the function name and cycript type | ||||||
|  | 		If load is true, tries to load it into cycript using utils.exec | ||||||
|  | 		 | ||||||
|  | 		Usage: | ||||||
|  | 			cy# var str = "void *calloc(size_t num, size_t size)"; | ||||||
|  | 			"void *calloc(size_t num, size_t size)" | ||||||
|  | 			cy# utils.include(str) | ||||||
|  | 			["calloc","@encode(void *(uint64_t num,  uint64_t size))(140735674376857)"] | ||||||
|  | 			cy# var ret = utils.include(str, true) | ||||||
|  | 			["calloc",0x7fff93e0e299] | ||||||
|  | 			cy# ret[1].type | ||||||
|  | 			@encode(void*(unsigned long long int,unsigned long long int)) | ||||||
|  | 			cy# ret[1](100, 1) | ||||||
|  | 			0x100444100 | ||||||
|  | 	*/ | ||||||
|  | 	utils.include = function(str, load) { | ||||||
|  | 		var re = /^\s*([^(]*(?:\s+|\*))(\w*)\s*\(([^)]*)\)\s*;?\s*$/; | ||||||
|  | 		var match = re.exec(str); | ||||||
|  | 		if(!match) { | ||||||
|  | 			return -1; | ||||||
|  | 		} | ||||||
|  | 		var rType = utils.applyTypedefs(match[1]); | ||||||
|  | 		var name = match[2]; | ||||||
|  | 		var args = match[3]; | ||||||
|  |  | ||||||
|  | 		var argsRe = /([^,]+)(?:,|$)/g; | ||||||
|  | 		var argsTypes = []; | ||||||
|  | 		while((match = argsRe.exec(args)) !== null) { | ||||||
|  | 			var type = utils.applyTypedefs(match[1]); | ||||||
|  | 			argsTypes.push(type); | ||||||
|  | 		} | ||||||
|  | 		 | ||||||
|  | 		var encodeString = "@encode("; | ||||||
|  | 		encodeString += rType + "("; | ||||||
|  | 		encodeString += argsTypes.join(", ") + "))"; | ||||||
|  |  | ||||||
|  | 		var fun = dlsym(RTLD_DEFAULT, name); | ||||||
|  | 		if(fun !== null) { | ||||||
|  | 			encodeString += "(" + fun + ")"; | ||||||
|  | 			if(load) { | ||||||
|  | 				return [name, utils.exec(encodeString)]; | ||||||
|  | 			} | ||||||
|  | 		} else if(load) { | ||||||
|  | 			throw "Function couldn't be found with dlsym!"; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		return [name, encodeString]; | ||||||
|  | 	}; | ||||||
|  | 	 | ||||||
|  | 	/* | ||||||
|  | 		Loads the function declaration in the defs array using utils.exec and exposes to cycript's global scope | ||||||
|  | 		Is automatically called if shouldLoadCFuncs is true | ||||||
|  | 	*/ | ||||||
|  | 	utils.funcs = {}; | ||||||
|  | 	utils.loadfuncs = function(expose) { | ||||||
|  | 		for(var i = 0; i < CFuncsDeclarations.length; i++) { | ||||||
|  | 			try { | ||||||
|  | 				var o = utils.include(CFuncsDeclarations[i], true); | ||||||
|  | 				utils.funcs[o[0]] = o[1]; | ||||||
|  | 				if(expose) { | ||||||
|  | 					Cycript.all[o[0]] = o[1]; | ||||||
|  | 				} | ||||||
|  | 			} catch(e) { | ||||||
|  | 				system.print("Failed to load function: " + i); | ||||||
|  | 				try { | ||||||
|  | 					system.print(utils.include(CFuncsDeclarations[i])); | ||||||
|  | 				} catch(e2) { | ||||||
|  | 					 | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  | 	 | ||||||
|  | 	/* | ||||||
|  | 		Calculates the size of a type like the C operator sizeof | ||||||
|  | 		 | ||||||
|  | 		Usage: | ||||||
|  | 			cy# utils.sizeof(int) | ||||||
|  | 			4 | ||||||
|  | 			cy# utils.sizeof(@encode(void *)) | ||||||
|  | 			8 | ||||||
|  | 			cy# utils.sizeof("mach_vm_address_t") | ||||||
|  | 			8 | ||||||
|  | 	*/ | ||||||
|  | 	utils.sizeof = function(type) { | ||||||
|  | 		if(typeof type === "string") { | ||||||
|  | 			type = utils.applyTypedefs(type); | ||||||
|  | 			type = utils.exec("@encode(" + type + ")"); | ||||||
|  | 		} | ||||||
|  | 		 | ||||||
|  | 		// (const) char * has "infinite" preceision | ||||||
|  | 		if(type.toString().slice(-1) === "*") { | ||||||
|  | 			return utils.sizeof(@encode(void *)); | ||||||
|  | 		} | ||||||
|  | 		 | ||||||
|  | 		// float and double | ||||||
|  | 		if(type.toString() === @encode(float).toString()) { | ||||||
|  | 			return 4; | ||||||
|  | 		} else if (type.toString() === @encode(double).toString()) { | ||||||
|  | 			return 8; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		var typeInstance = type(0); | ||||||
|  | 		 | ||||||
|  | 		if(typeInstance instanceof Object) { | ||||||
|  | 			// Arrays | ||||||
|  | 			if("length" in typeInstance) { | ||||||
|  | 				return typeInstance.length * utils.sizeof(typeInstance.type); | ||||||
|  | 			} | ||||||
|  | 			 | ||||||
|  | 			// Structs | ||||||
|  | 			if(typeInstance.toString() === "[object Struct]") { | ||||||
|  | 				var typeStr = type.toString(); | ||||||
|  | 				var arrayTypeStr = "[2" + typeStr + "]"; | ||||||
|  | 				var arrayType = new Type(arrayTypeStr); | ||||||
|  | 				 | ||||||
|  | 				var arrayInstance = new arrayType; | ||||||
|  | 				 | ||||||
|  | 				return @encode(void *)(&(arrayInstance[1])) - @encode(void *)(&(arrayInstance[0])); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		 | ||||||
|  | 		for(var i = 0; i < 5; i++) { | ||||||
|  | 			var maxSigned = Math.pow(2, 8 * Math.pow(2, i) - 1) - 1; | ||||||
|  | 			if(i === 3) { | ||||||
|  | 				// Floating point fix ;^) | ||||||
|  | 				maxSigned /= 1000; | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			// can't use !== or sizeof(void *) === 0.5 | ||||||
|  | 			if(type(maxSigned) != maxSigned) { | ||||||
|  | 				return Math.pow(2, i - 1); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  | 	 | ||||||
|  | 	/* | ||||||
|  | 		Logs a specific message sent to an instance of a class like logify.pl in theos | ||||||
|  | 		Requires Cydia Substrate (com.saurik.substrate.MS) and NSLog (org.cycript.NSLog) modules | ||||||
|  | 		Returns the old message returned by MS.hookMessage (Note: this is not just the old message!) | ||||||
|  | 		 | ||||||
|  | 		Usage: | ||||||
|  | 			cy# var oldm = utils.logify(objc_getMetaClass(NSNumber), @selector(numberWithDouble:)) | ||||||
|  | 			... | ||||||
|  | 			cy# var n = [NSNumber numberWithDouble:1.5] | ||||||
|  | 			2014-07-28 02:26:39.805 cycript[71213:507] +[<NSNumber: 0x10032d0c4> numberWithDouble:1.5] | ||||||
|  | 			2014-07-28 02:26:39.806 cycript[71213:507]  = 1.5 | ||||||
|  | 			@1.5 | ||||||
|  | 	*/ | ||||||
|  | 	utils.logify = function(cls, sel) { | ||||||
|  | 		@import com.saurik.substrate.MS; | ||||||
|  | 		@import org.cycript.NSLog; | ||||||
|  | 		 | ||||||
|  | 		var oldm = {}; | ||||||
|  | 		 | ||||||
|  | 		MS.hookMessage(cls, sel, function() { | ||||||
|  | 			var args = [].slice.call(arguments); | ||||||
|  | 			 | ||||||
|  | 			var selFormat = sel.toString().replace(/:/g, ":%@ ").trim(); | ||||||
|  | 			var logFormat = "%@[<%@: 0x%@> " + selFormat + "]"; | ||||||
|  | 			 | ||||||
|  | 			var standardArgs = [logFormat, class_isMetaClass(cls)? "+": "-", cls.toString(), (&this).valueOf().toString(16)]; | ||||||
|  | 			var logArgs = standardArgs.concat(args); | ||||||
|  | 			 | ||||||
|  | 			NSLog.apply(null, logArgs); | ||||||
|  | 			 | ||||||
|  | 			var r = oldm->apply(this, arguments); | ||||||
|  | 			 | ||||||
|  | 			if(r !== undefined) { | ||||||
|  | 				NSLog(" = %@", r); | ||||||
|  | 			} | ||||||
|  | 			 | ||||||
|  | 			return r; | ||||||
|  | 		}, oldm); | ||||||
|  | 		 | ||||||
|  | 		return oldm; | ||||||
|  | 	}; | ||||||
|  | 	 | ||||||
|  | 	/* | ||||||
|  | 		Calls a C function by providing its name and arguments | ||||||
|  | 		Doesn't support structs | ||||||
|  | 		Return value is always a void pointer | ||||||
|  | 		 | ||||||
|  | 		Usage: | ||||||
|  | 			cy# utils.apply("printf", ["%s %.3s, %d -> %c, float: %f\n", "foo", "barrrr", 97, 97, 1.5]) | ||||||
|  | 			foo bar, 97 -> a, float: 1.500000 | ||||||
|  | 			0x22 | ||||||
|  | 	*/ | ||||||
|  | 	utils.apply = function(fun, args) { | ||||||
|  | 		if(!(args instanceof Array)) { | ||||||
|  | 			throw "Args needs to be an array!"; | ||||||
|  | 		} | ||||||
|  | 		 | ||||||
|  | 		var argc = args.length; | ||||||
|  | 		var voidPtr = @encode(void *); | ||||||
|  | 		var argTypes = []; | ||||||
|  | 		for(var i = 0; i < argc; i++) { | ||||||
|  | 			var argType = voidPtr; | ||||||
|  | 			 | ||||||
|  | 			var arg = args[i]; | ||||||
|  | 			if(typeof arg === "string") { | ||||||
|  | 				argType = @encode(char *); | ||||||
|  | 			} | ||||||
|  | 			if(typeof arg === "number" && arg % 1 !== 0) { | ||||||
|  | 				argType = @encode(double); | ||||||
|  | 			} | ||||||
|  | 			 | ||||||
|  | 			argTypes.push(argType); | ||||||
|  | 		} | ||||||
|  | 		 | ||||||
|  | 		var type = voidPtr.functionWith.apply(voidPtr, argTypes); | ||||||
|  | 		 | ||||||
|  | 		if(typeof fun === "string") { | ||||||
|  | 			fun = dlsym(RTLD_DEFAULT, fun); | ||||||
|  | 		} | ||||||
|  | 		 | ||||||
|  | 		if(!fun) { | ||||||
|  | 			throw "Function not found!"; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		return type(fun).apply(null, args); | ||||||
|  | 	}; | ||||||
|  | 	 | ||||||
|  | 	/* | ||||||
|  | 		Converts a string (char *) to a void pointer (void *) | ||||||
|  | 		You can't cast to strings to void pointers and vice versa in cycript. Blame saurik. | ||||||
|  | 		 | ||||||
|  | 		Usage: | ||||||
|  | 			cy# var voidPtr = utils.str2voidPtr("foobar") | ||||||
|  | 			0x100331590 | ||||||
|  | 			cy# utils.voidPtr2str(voidPtr) | ||||||
|  | 			"foobar" | ||||||
|  | 	*/ | ||||||
|  | 	utils.str2voidPtr = function(str) { | ||||||
|  | 		var strdup = @encode(void *(char *))(dlsym(RTLD_DEFAULT, "strdup")); | ||||||
|  | 		return strdup(str); | ||||||
|  | 	}; | ||||||
|  | 	 | ||||||
|  | 	/* | ||||||
|  | 		The inverse function of str2voidPtr | ||||||
|  | 	*/ | ||||||
|  | 	utils.voidPtr2str = function(voidPtr) { | ||||||
|  | 		var strdup = @encode(char *(void *))(dlsym(RTLD_DEFAULT, "strdup")); | ||||||
|  | 		return strdup(voidPtr); | ||||||
|  | 	}; | ||||||
|  | 	 | ||||||
|  | 	/* | ||||||
|  | 		Converts a double into a void pointer | ||||||
|  | 		This can be used to view the binary representation of a floating point number | ||||||
|  | 		 | ||||||
|  | 		Usage: | ||||||
|  | 			cy# var n = utils.double2voidPtr(-1.5) | ||||||
|  | 			0xbff8000000000000 | ||||||
|  | 			cy# utils.voidPtr2double(n) | ||||||
|  | 			-1.5 | ||||||
|  | 	*/ | ||||||
|  | 	utils.double2voidPtr = function(n) { | ||||||
|  | 		var doublePtr = new double; | ||||||
|  | 		*doublePtr = n; | ||||||
|  | 		 | ||||||
|  | 		var voidPtrPtr = @encode(void **)(doublePtr); | ||||||
|  | 		 | ||||||
|  | 		return *voidPtrPtr; | ||||||
|  | 	}; | ||||||
|  | 	 | ||||||
|  | 	/* | ||||||
|  | 		The inverse function of double2voidPtr | ||||||
|  | 	*/ | ||||||
|  | 	utils.voidPtr2double = function(voidPtr) { | ||||||
|  | 		var voidPtrPtr = new @encode(void **); | ||||||
|  | 		*voidPtrPtr = voidPtr; | ||||||
|  | 		 | ||||||
|  | 		var doublePtr = @encode(double *)(voidPtrPtr); | ||||||
|  | 		 | ||||||
|  | 		return *doublePtr; | ||||||
|  | 	}; | ||||||
|  | 	 | ||||||
|  | 	/* | ||||||
|  | 		Determines in a safe way if a memory location is readable | ||||||
|  | 		 | ||||||
|  | 		Usage: | ||||||
|  | 			cy# utils.isMemoryReadable(0) | ||||||
|  | 			false | ||||||
|  | 			cy# utils.isMemoryReadable(0x1337) | ||||||
|  | 			false | ||||||
|  | 			cy# utils.isMemoryReadable(NSObject) | ||||||
|  | 			true | ||||||
|  | 			cy# var a = malloc(100); utils.isMemoryReadable(a) | ||||||
|  | 			true | ||||||
|  | 	*/ | ||||||
|  | 	utils.isMemoryReadable = function(ptr) { | ||||||
|  | 		if(typeof ptr === "string") { | ||||||
|  | 			return true; | ||||||
|  | 		} | ||||||
|  | 		 | ||||||
|  | 		var fds = new @encode(int [2]); | ||||||
|  | 		utils.apply("pipe", [fds]); | ||||||
|  | 		var result = utils.apply("write", [fds[1], ptr, 1]) == 1; | ||||||
|  | 		 | ||||||
|  | 		utils.apply("close", [fds[0]]); | ||||||
|  | 		utils.apply("close", [fds[1]]); | ||||||
|  | 		 | ||||||
|  | 		return result; | ||||||
|  | 	}; | ||||||
|  | 	 | ||||||
|  | 	/* | ||||||
|  | 		Determines in a safe way if the memory location contains an Objective-C object | ||||||
|  |  | ||||||
|  | 		Usage: | ||||||
|  | 			cy# utils.isObject(0) | ||||||
|  | 			false | ||||||
|  | 			cy# utils.isObject(0x1337) | ||||||
|  | 			false | ||||||
|  | 			cy# utils.isObject(NSObject) | ||||||
|  | 			true | ||||||
|  | 			cy# utils.isObject(objc_getMetaClass(NSObject)) | ||||||
|  | 			true | ||||||
|  | 			cy# utils.isObject([new NSObject init]) | ||||||
|  | 			true | ||||||
|  | 			cy# var a = malloc(100); utils.isObject(a) | ||||||
|  | 			false | ||||||
|  | 			cy# *@encode(void **)(a) = NSObject; utils.isObject(a) | ||||||
|  | 			true | ||||||
|  | 	*/ | ||||||
|  | 	utils.isObject = function(obj) { | ||||||
|  | 		obj = @encode(void *)(obj); | ||||||
|  | 		var lastObj = -1; | ||||||
|  | 		 | ||||||
|  | 		function objc_isa_ptr(obj) { | ||||||
|  | 			// See http://www.sealiesoftware.com/blog/archive/2013/09/24/objc_explain_Non-pointer_isa.html | ||||||
|  | 			var objc_debug_isa_class_mask = 0x00000001fffffffa; | ||||||
|  | 			obj = (obj & 1)? (obj & objc_debug_isa_class_mask): obj; | ||||||
|  | 			 | ||||||
|  | 			if((obj & (utils.sizeof(@encode(void *)) - 1)) != 0) { | ||||||
|  | 				return null; | ||||||
|  | 			} else { | ||||||
|  | 				return obj; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		 | ||||||
|  | 		function ptrValue(obj) { | ||||||
|  | 			return obj? obj.valueOf(): null; | ||||||
|  | 		} | ||||||
|  | 		 | ||||||
|  | 		var foundMetaClass = false; | ||||||
|  | 		 | ||||||
|  | 		for(obj = objc_isa_ptr(obj); utils.isMemoryReadable(obj); ) { | ||||||
|  | 			obj = *@encode(void **)(obj); | ||||||
|  | 			 | ||||||
|  | 			if(ptrValue(obj) == ptrValue(lastObj)) { | ||||||
|  | 				foundMetaClass = true; | ||||||
|  | 				break; | ||||||
|  | 			} | ||||||
|  | 			 | ||||||
|  | 			lastObj = obj; | ||||||
|  | 		} | ||||||
|  | 		 | ||||||
|  | 		if(!foundMetaClass) { | ||||||
|  | 			return false; | ||||||
|  | 		} | ||||||
|  | 		 | ||||||
|  | 		if(lastObj === -1 || lastObj === null) { | ||||||
|  | 			return false; | ||||||
|  | 		} | ||||||
|  | 		 | ||||||
|  | 		var obj_class = objc_isa_ptr(@encode(void **)(obj)[1]); | ||||||
|  | 		 | ||||||
|  | 		if(!utils.isMemoryReadable(obj_class)) { | ||||||
|  | 			return false; | ||||||
|  | 		} | ||||||
|  | 		 | ||||||
|  | 		var metaclass = objc_isa_ptr(@encode(void **)(obj_class)[0]); | ||||||
|  | 		var superclass = objc_isa_ptr(@encode(void **)(obj_class)[1]); | ||||||
|  | 		 | ||||||
|  | 		return ptrValue(obj) == ptrValue(metaclass) && superclass == null; | ||||||
|  | 	}; | ||||||
|  | 	 | ||||||
|  | 	/* | ||||||
|  | 		Creates a cycript struct type from a C struct definition | ||||||
|  | 		 | ||||||
|  | 		Usage: | ||||||
|  | 			cy# var foo = makeStruct("int a; short b; char c; uint64_t d; double e;", "foo"); | ||||||
|  | 			@encode(foo) | ||||||
|  | 			cy# var f = new foo | ||||||
|  | 			&{a:0,b:0,c:0,d:0,e:0} | ||||||
|  | 			cy# f->a = 100; f | ||||||
|  | 			&{a:100,b:0,c:0,d:0,e:0} | ||||||
|  | 			cy# *@encode(int *)(f) | ||||||
|  | 			100 | ||||||
|  | 	*/ | ||||||
|  | 	utils.makeStruct = function(str, name) {		 | ||||||
|  | 		var fieldRe = /(?:\s|\n)*([^;]+\s*(?:\s|\*))([^;]+)\s*;/g; | ||||||
|  | 		 | ||||||
|  | 		if(!name) { | ||||||
|  | 			name = "struct" + Math.floor(Math.random() * 100000); | ||||||
|  | 		} | ||||||
|  | 		var typeStr = "{" + name + "="; | ||||||
|  | 		 | ||||||
|  | 		while((match = fieldRe.exec(str)) !== null) { | ||||||
|  | 			var fieldType = utils.applyTypedefs(match[1]); | ||||||
|  | 			var fieldName = match[2]; | ||||||
|  | 			var encodedType = utils.exec("@encode(" + fieldType + ")").toString(); | ||||||
|  | 			 | ||||||
|  | 			typeStr += '"' + fieldName + '"' + encodedType; | ||||||
|  | 		} | ||||||
|  | 		 | ||||||
|  | 		typeStr += "}"; | ||||||
|  | 		 | ||||||
|  | 		return new Type(typeStr); | ||||||
|  | 	}; | ||||||
|  | 	 | ||||||
|  | 	// Various constants | ||||||
|  | 	utils.constants = { | ||||||
|  | 		VM_PROT_NONE:       0x0, | ||||||
|  | 		VM_PROT_READ:       0x1, | ||||||
|  | 		VM_PROT_WRITE:      0x2, | ||||||
|  | 		VM_PROT_EXECUTE:    0x4, | ||||||
|  | 		VM_PROT_NO_CHANGE:  0x8, | ||||||
|  | 		VM_PROT_COPY:       0x10, | ||||||
|  | 		VM_PROT_WANTS_COPY: 0x10, | ||||||
|  | 		VM_PROT_IS_MASK:    0x40, | ||||||
|  | 	}; | ||||||
|  | 	var c = utils.constants; | ||||||
|  | 	c.VM_PROT_DEFAULT = c.VM_PROT_READ | c.VM_PROT_WRITE; | ||||||
|  | 	c.VM_PROT_ALL =     c.VM_PROT_READ | c.VM_PROT_WRITE | c.VM_PROT_EXECUTE; | ||||||
|  | 	 | ||||||
|  | 	if(shouldExposeConsts) { | ||||||
|  | 		for(var k in c) { | ||||||
|  | 			Cycript.all[k] = c[k]; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	if(shouldExposeFuncs) { | ||||||
|  | 		for(var i = 0; i < funcsToExpose.length; i++) { | ||||||
|  | 			var name = funcsToExpose[i]; | ||||||
|  | 			Cycript.all[name] = utils[name]; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	if(shouldLoadCFuncs) { | ||||||
|  | 		utils.loadfuncs(shouldExposeCFuncs); | ||||||
|  | 	} | ||||||
|  | })(exports); | ||||||
							
								
								
									
										23
									
								
								samples/EmberScript/momentComponent.em
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								samples/EmberScript/momentComponent.em
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | |||||||
|  | class App.FromNowView extends Ember.View | ||||||
|  |     tagName: 'time' | ||||||
|  |     template: Ember.Handlebars.compile '{{view.output}}' | ||||||
|  |     output: ~> | ||||||
|  |         return moment(@value).fromNow() | ||||||
|  |  | ||||||
|  |     didInsertElement: -> | ||||||
|  |         @tick() | ||||||
|  |  | ||||||
|  |     tick: -> | ||||||
|  |         f = -> | ||||||
|  |             @notifyPropertyChange 'output' | ||||||
|  |             @tick() | ||||||
|  |  | ||||||
|  |         nextTick = Ember.run.later(this, f, 1000) | ||||||
|  |         @set 'nextTick', nextTick | ||||||
|  |  | ||||||
|  |     willDestroyElement: -> | ||||||
|  |         nextTick = @nextTick | ||||||
|  |         Ember.run.cancel nextTick | ||||||
|  |  | ||||||
|  | Ember.Handlebars.helper 'fromNow', App.FromNowView | ||||||
|  |  | ||||||
							
								
								
									
										15
									
								
								samples/F#/sample.fs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								samples/F#/sample.fs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,15 @@ | |||||||
|  | module Sample | ||||||
|  |  | ||||||
|  | open System | ||||||
|  |  | ||||||
|  | type Foo = | ||||||
|  |     { | ||||||
|  |         Bar : string | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | type Baz = interface end | ||||||
|  |  | ||||||
|  | let Sample1(xs : int list) : string = | ||||||
|  |     xs | ||||||
|  |     |> List.map (fun x -> string x) | ||||||
|  |     |> String.concat "," | ||||||
							
								
								
									
										25
									
								
								samples/FORTRAN/sample1.f
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								samples/FORTRAN/sample1.f
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | |||||||
|  | c comment | ||||||
|  | * comment | ||||||
|  |  | ||||||
|  |       program main | ||||||
|  |  | ||||||
|  |       end | ||||||
|  |  | ||||||
|  |       subroutine foo( i, x, b ) | ||||||
|  |       INTEGER            i | ||||||
|  |       REAL               x | ||||||
|  |       LOGICAL            b | ||||||
|  |  | ||||||
|  |       if( i.ne.0 ) then | ||||||
|  |          call bar( -i ) | ||||||
|  |       end if | ||||||
|  |  | ||||||
|  |       return | ||||||
|  |       end | ||||||
|  |  | ||||||
|  |       double complex function baz() | ||||||
|  |  | ||||||
|  |       baz = (0.0d0,0.0d0) | ||||||
|  |  | ||||||
|  |       return  | ||||||
|  |       end | ||||||
							
								
								
									
										25
									
								
								samples/FORTRAN/sample1.for
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								samples/FORTRAN/sample1.for
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | |||||||
|  | c comment | ||||||
|  | * comment | ||||||
|  |  | ||||||
|  |       program main | ||||||
|  |  | ||||||
|  |       end | ||||||
|  |  | ||||||
|  |       subroutine foo( i, x, b ) | ||||||
|  |       INTEGER            i | ||||||
|  |       REAL               x | ||||||
|  |       LOGICAL            b | ||||||
|  |  | ||||||
|  |       if( i.ne.0 ) then | ||||||
|  |          call bar( -i ) | ||||||
|  |       end if | ||||||
|  |  | ||||||
|  |       return | ||||||
|  |       end | ||||||
|  |  | ||||||
|  |       double complex function baz() | ||||||
|  |  | ||||||
|  |       baz = (0.0d0,0.0d0) | ||||||
|  |  | ||||||
|  |       return  | ||||||
|  |       end | ||||||
							
								
								
									
										25
									
								
								samples/FORTRAN/sample2.f
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								samples/FORTRAN/sample2.f
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | |||||||
|  |       PROGRAM MAIN | ||||||
|  |  | ||||||
|  |       END | ||||||
|  |  | ||||||
|  | C comment | ||||||
|  | * comment | ||||||
|  |  | ||||||
|  |       SUBROUTINE foo( i, x, b ) | ||||||
|  |       INTEGER            i | ||||||
|  |       REAL               x | ||||||
|  |       LOGICAL            b | ||||||
|  |  | ||||||
|  |       IF( i.NE.0 ) THEN | ||||||
|  |          CALL bar( -i ) | ||||||
|  |       END IF | ||||||
|  |  | ||||||
|  |       RETURN | ||||||
|  |       END | ||||||
|  |  | ||||||
|  |       DOUBLE COMPLEX FUNCTION baz() | ||||||
|  |  | ||||||
|  |       baz = (0.0d0,0.0d0) | ||||||
|  |  | ||||||
|  |       RETURN  | ||||||
|  |       END | ||||||
							
								
								
									
										25
									
								
								samples/FORTRAN/sample3.F
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								samples/FORTRAN/sample3.F
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | |||||||
|  | c comment | ||||||
|  | * comment | ||||||
|  |  | ||||||
|  |       program main | ||||||
|  |  | ||||||
|  |       end | ||||||
|  |  | ||||||
|  |       subroutine foo( i, x, b ) | ||||||
|  |       INTEGER            i | ||||||
|  |       REAL               x | ||||||
|  |       LOGICAL            b | ||||||
|  |  | ||||||
|  |       if( i.ne.0 ) then | ||||||
|  |          call bar( -i ) | ||||||
|  |       end if | ||||||
|  |  | ||||||
|  |       return | ||||||
|  |       end | ||||||
|  |  | ||||||
|  |       double complex function baz() | ||||||
|  |  | ||||||
|  |       baz = (0.0d0,0.0d0) | ||||||
|  |  | ||||||
|  |       return  | ||||||
|  |       end | ||||||
							
								
								
									
										8
									
								
								samples/Forth/bitmap.frt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								samples/Forth/bitmap.frt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | |||||||
|  | \ Bit arrays. | ||||||
|  | : bits ( u1 -- u2 ) 7 + 3 rshift ; | ||||||
|  | : bitmap ( u "name" -- ) create bits here over erase allot | ||||||
|  |    does> ( u -- a x ) over 3 rshift +  1 rot 7 and lshift ; | ||||||
|  | : bit@ ( a x -- f ) swap c@ and ; | ||||||
|  | : 1bit ( a x -- ) over c@ or swap c! ; | ||||||
|  | : 0bit ( a x -- ) invert over c@ and swap c! ; | ||||||
|  | : bit! ( f a x -- ) rot if 1bit else 0bit then ; | ||||||
							
								
								
									
										252
									
								
								samples/Forth/core.f
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										252
									
								
								samples/Forth/core.f
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,252 @@ | |||||||
|  | : immediate   lastxt @ dup c@ negate swap c! ; | ||||||
|  |  | ||||||
|  | : \   source nip >in ! ; immediate \ Copyright 2004, 2012 Lars Brinkhoff | ||||||
|  |  | ||||||
|  | : char \ ( "word" -- char ) | ||||||
|  |     bl-word here 1+ c@ ; | ||||||
|  |  | ||||||
|  | : ahead  here 0 , ; | ||||||
|  |  | ||||||
|  | : resolve   here swap ! ; | ||||||
|  |  | ||||||
|  | : '   bl-word here find 0branch [ ahead ] exit [ resolve ] 0 ; | ||||||
|  |  | ||||||
|  | : postpone-nonimmediate   [ ' literal , ' compile, ] literal , ; | ||||||
|  |  | ||||||
|  | : create   dovariable_code header, reveal ; | ||||||
|  |  | ||||||
|  | create postponers | ||||||
|  |     ' postpone-nonimmediate , | ||||||
|  |     ' abort , | ||||||
|  |     ' , , | ||||||
|  |  | ||||||
|  | : word \ ( char "<chars>string<char>" -- caddr ) | ||||||
|  |     drop bl-word here ; | ||||||
|  |  | ||||||
|  | : postpone \ ( C: "word" -- ) | ||||||
|  |     bl word find 1+ cells  postponers + @ execute ; immediate | ||||||
|  |  | ||||||
|  | : unresolved \ ( C: "word" -- orig ) | ||||||
|  |     postpone postpone  postpone ahead ; immediate | ||||||
|  |  | ||||||
|  | : chars \ ( n1 -- n2 ) | ||||||
|  |     ; | ||||||
|  |  | ||||||
|  | : else \ ( -- ) ( C: orig1 -- orig2 ) | ||||||
|  |     unresolved branch swap resolve ; immediate | ||||||
|  |  | ||||||
|  | : if \ ( flag -- ) ( C: -- orig ) | ||||||
|  |     unresolved 0branch ; immediate | ||||||
|  |  | ||||||
|  | : then \ ( -- ) ( C: orig -- ) | ||||||
|  |     resolve ; immediate | ||||||
|  |  | ||||||
|  | : [char] \ ( "word" -- ) | ||||||
|  |     char  postpone literal ; immediate | ||||||
|  |  | ||||||
|  | : (does>)   lastxt @ dodoes_code over >code ! r> swap >does ! ; | ||||||
|  |  | ||||||
|  | : does>   postpone (does>) ; immediate | ||||||
|  |  | ||||||
|  | : begin \ ( -- ) ( C: -- dest ) | ||||||
|  |     here ; immediate | ||||||
|  |  | ||||||
|  | : while \ ( x -- ) ( C: dest -- orig dest ) | ||||||
|  |     unresolved 0branch swap ; immediate | ||||||
|  |  | ||||||
|  | : repeat \ ( -- ) ( C: orig dest -- ) | ||||||
|  |     postpone branch ,  resolve ; immediate | ||||||
|  |  | ||||||
|  | : until \ ( x -- ) ( C: dest -- ) | ||||||
|  |     postpone 0branch , ; immediate | ||||||
|  |  | ||||||
|  | : recurse   lastxt @ compile, ; immediate | ||||||
|  |  | ||||||
|  | : pad \ ( -- addr ) | ||||||
|  |     here 1024 + ; | ||||||
|  |  | ||||||
|  | : parse \ ( char "string<char>" -- addr n ) | ||||||
|  |     pad >r  begin | ||||||
|  | 	source? if <source 2dup <> else 0 0 then | ||||||
|  |     while | ||||||
|  | 	r@ c!  r> 1+ >r | ||||||
|  |     repeat  2drop  pad r> over - ; | ||||||
|  |  | ||||||
|  | : ( \ ( "string<paren>" -- ) | ||||||
|  |     [ char ) ] literal parse 2drop ; immediate | ||||||
|  |     \ TODO: If necessary, refill and keep parsing. | ||||||
|  |  | ||||||
|  | : string, ( addr n -- ) | ||||||
|  |     here over allot align  swap cmove ; | ||||||
|  |  | ||||||
|  | : (s") ( -- addr n ) ( R: ret1 -- ret2 ) | ||||||
|  |     r> dup @ swap cell+ 2dup + aligned >r swap ; | ||||||
|  |  | ||||||
|  | create squote   128 allot | ||||||
|  |  | ||||||
|  | : s" ( "string<quote>" -- addr n ) | ||||||
|  |     state @ if | ||||||
|  | 	postpone (s")  [char] " parse  dup ,  string, | ||||||
|  |     else | ||||||
|  | 	[char] " parse  >r squote r@ cmove  squote r> | ||||||
|  |     then ; immediate | ||||||
|  |  | ||||||
|  | : (abort") ( ... addr n -- ) ( R: ... -- ) | ||||||
|  |     cr type cr abort ; | ||||||
|  |  | ||||||
|  | : abort" ( ... x "string<quote>" -- ) ( R: ... -- ) | ||||||
|  |     postpone if  postpone s"  postpone (abort")  postpone then ; immediate | ||||||
|  |  | ||||||
|  | \ ---------------------------------------------------------------------- | ||||||
|  |  | ||||||
|  | ( Core words. ) | ||||||
|  |  | ||||||
|  | \ TODO: # | ||||||
|  | \ TODO: #> | ||||||
|  | \ TODO: #s | ||||||
|  |  | ||||||
|  | : and  ( x y -- x&y )   nand invert ; | ||||||
|  |  | ||||||
|  | : *   1 2>r 0 swap begin r@ while | ||||||
|  |          r> r> swap 2dup dup + 2>r and if swap over + swap then dup + | ||||||
|  |       repeat r> r> 2drop drop ; | ||||||
|  |  | ||||||
|  | \ TODO: */mod | ||||||
|  |  | ||||||
|  | : +loop ( -- ) ( C: nest-sys -- ) | ||||||
|  |     postpone (+loop)  postpone 0branch  ,  postpone unloop ; immediate | ||||||
|  |  | ||||||
|  | : space   bl emit ; | ||||||
|  |  | ||||||
|  | : ?.-  dup 0 < if [char] - emit negate then ; | ||||||
|  |  | ||||||
|  | : digit   [char] 0 + emit ; | ||||||
|  |  | ||||||
|  | : (.)   base @ /mod  ?dup if recurse then  digit ; | ||||||
|  |  | ||||||
|  | : ." ( "string<quote>" -- )   postpone s"  postpone type ; immediate | ||||||
|  |  | ||||||
|  | : . ( x -- )   ?.- (.) space ; | ||||||
|  |  | ||||||
|  | : postpone-number ( caddr -- ) | ||||||
|  |     0 0 rot count >number dup 0= if | ||||||
|  | 	2drop nip | ||||||
|  | 	postpone (literal)  postpone (literal)  postpone , | ||||||
|  | 	postpone literal  postpone , | ||||||
|  |     else | ||||||
|  | 	." Undefined: " type cr abort | ||||||
|  |     then ; | ||||||
|  |  | ||||||
|  | ' postpone-number  postponers cell+  ! | ||||||
|  |  | ||||||
|  | : / ( x y -- x/y )   /mod nip ; | ||||||
|  |  | ||||||
|  | : 0< ( n -- flag )   0 < ; | ||||||
|  |  | ||||||
|  | : 1- ( n -- n-1 )   -1 + ; | ||||||
|  |  | ||||||
|  | : 2! ( x1 x2 addr -- )   swap over ! cell+ ! ; | ||||||
|  |  | ||||||
|  | : 2* ( n -- 2n )   dup + ; | ||||||
|  |  | ||||||
|  | \ Kernel: 2/ | ||||||
|  |  | ||||||
|  | : 2@ ( addr -- x1 x2 )   dup cell+ @ swap @ ; | ||||||
|  |  | ||||||
|  | \ Kernel: 2drop | ||||||
|  | \ Kernel: 2dup | ||||||
|  |  | ||||||
|  | \ TODO: 2over ( x1 x2 x3 x4 -- x1 x2 x3 x4 x1 x2 ) | ||||||
|  | \           3 pick 3 pick ; | ||||||
|  |  | ||||||
|  | \ TODO: 2swap | ||||||
|  |  | ||||||
|  | \ TODO: <# | ||||||
|  |  | ||||||
|  | : abs ( n -- |n| ) | ||||||
|  |     dup 0< if negate then ; | ||||||
|  |  | ||||||
|  | \ TODO: accept | ||||||
|  |  | ||||||
|  | : c, ( n -- ) | ||||||
|  |     here c!  1 chars allot ; | ||||||
|  |  | ||||||
|  | : char+ ( n1 -- n2 ) | ||||||
|  |     1+ ; | ||||||
|  |  | ||||||
|  | : constant   create , does> @ ; | ||||||
|  |  | ||||||
|  | : decimal ( -- ) | ||||||
|  |     10 base ! ; | ||||||
|  |  | ||||||
|  | : depth ( -- n ) | ||||||
|  |     data_stack 100 cells +  'SP @  - /cell /  2 - ; | ||||||
|  |  | ||||||
|  | : do ( n1 n2 -- ) ( R: -- loop-sys ) ( C: -- do-sys ) | ||||||
|  |     postpone 2>r  here ; immediate | ||||||
|  |  | ||||||
|  | \ TODO: environment? | ||||||
|  | \ TODO: evaluate | ||||||
|  | \ TODO: fill | ||||||
|  | \ TODO: fm/mod ) | ||||||
|  | \ TODO: hold | ||||||
|  |  | ||||||
|  | : j ( -- x1 ) ( R: x1 x2 x3 -- x1 x2 x3 ) | ||||||
|  |     'RP @ 3 cells + @ ; | ||||||
|  |  | ||||||
|  | \ TODO: leave | ||||||
|  |  | ||||||
|  | : loop ( -- ) ( C: nest-sys -- ) | ||||||
|  |     postpone 1  postpone (+loop) | ||||||
|  |     postpone 0branch  , | ||||||
|  |     postpone unloop ; immediate | ||||||
|  |  | ||||||
|  | : lshift   begin ?dup while 1- swap dup + swap repeat ; | ||||||
|  |  | ||||||
|  | : rshift   1 begin over while dup + swap 1- swap repeat nip | ||||||
|  |            2>r 0 1 begin r@ while | ||||||
|  |               r> r> 2dup swap dup + 2>r and if swap over + swap then dup + | ||||||
|  |            repeat r> r> 2drop drop ; | ||||||
|  |  | ||||||
|  | : max ( x y -- max[x,y] ) | ||||||
|  |     2dup > if drop else nip then ; | ||||||
|  |  | ||||||
|  | \ Kernel: min | ||||||
|  | \ TODO:   mod | ||||||
|  | \ TODO:   move | ||||||
|  |  | ||||||
|  | : (quit) ( R: ... -- ) | ||||||
|  |     return_stack 100 cells + 'RP ! | ||||||
|  |     0 'source-id !  tib ''source !  #tib ''#source ! | ||||||
|  |     postpone [ | ||||||
|  |     begin | ||||||
|  | 	refill | ||||||
|  |     while | ||||||
|  | 	interpret  state @ 0= if ." ok" cr then | ||||||
|  |     repeat | ||||||
|  |     bye ; | ||||||
|  |  | ||||||
|  | ' (quit)  ' quit >body cell+  ! | ||||||
|  |  | ||||||
|  | \ TODO: s>d | ||||||
|  | \ TODO: sign | ||||||
|  | \ TODO: sm/rem | ||||||
|  |  | ||||||
|  | : spaces ( n -- ) | ||||||
|  |     0 do space loop ; | ||||||
|  |  | ||||||
|  | \ TODO: u. | ||||||
|  |  | ||||||
|  | : signbit ( -- n )   -1 1 rshift invert ; | ||||||
|  |  | ||||||
|  | : xor ( x y -- x^y )    2dup nand >r r@ nand swap r> nand nand ; | ||||||
|  |  | ||||||
|  | : u<  ( x y -- flag )  signbit xor swap signbit xor > ; | ||||||
|  |  | ||||||
|  | \ TODO: um/mod | ||||||
|  |  | ||||||
|  | : variable ( "word" -- ) | ||||||
|  |     create /cell allot ; | ||||||
|  |  | ||||||
|  | : ['] \ ( C: "word" -- ) | ||||||
|  |     ' postpone literal ; immediate | ||||||
							
								
								
									
										252
									
								
								samples/Forth/core.for
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										252
									
								
								samples/Forth/core.for
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,252 @@ | |||||||
|  | : immediate   lastxt @ dup c@ negate swap c! ; | ||||||
|  |  | ||||||
|  | : \   source nip >in ! ; immediate \ Copyright 2004, 2012 Lars Brinkhoff | ||||||
|  |  | ||||||
|  | : char \ ( "word" -- char ) | ||||||
|  |     bl-word here 1+ c@ ; | ||||||
|  |  | ||||||
|  | : ahead  here 0 , ; | ||||||
|  |  | ||||||
|  | : resolve   here swap ! ; | ||||||
|  |  | ||||||
|  | : '   bl-word here find 0branch [ ahead ] exit [ resolve ] 0 ; | ||||||
|  |  | ||||||
|  | : postpone-nonimmediate   [ ' literal , ' compile, ] literal , ; | ||||||
|  |  | ||||||
|  | : create   dovariable_code header, reveal ; | ||||||
|  |  | ||||||
|  | create postponers | ||||||
|  |     ' postpone-nonimmediate , | ||||||
|  |     ' abort , | ||||||
|  |     ' , , | ||||||
|  |  | ||||||
|  | : word \ ( char "<chars>string<char>" -- caddr ) | ||||||
|  |     drop bl-word here ; | ||||||
|  |  | ||||||
|  | : postpone \ ( C: "word" -- ) | ||||||
|  |     bl word find 1+ cells  postponers + @ execute ; immediate | ||||||
|  |  | ||||||
|  | : unresolved \ ( C: "word" -- orig ) | ||||||
|  |     postpone postpone  postpone ahead ; immediate | ||||||
|  |  | ||||||
|  | : chars \ ( n1 -- n2 ) | ||||||
|  |     ; | ||||||
|  |  | ||||||
|  | : else \ ( -- ) ( C: orig1 -- orig2 ) | ||||||
|  |     unresolved branch swap resolve ; immediate | ||||||
|  |  | ||||||
|  | : if \ ( flag -- ) ( C: -- orig ) | ||||||
|  |     unresolved 0branch ; immediate | ||||||
|  |  | ||||||
|  | : then \ ( -- ) ( C: orig -- ) | ||||||
|  |     resolve ; immediate | ||||||
|  |  | ||||||
|  | : [char] \ ( "word" -- ) | ||||||
|  |     char  postpone literal ; immediate | ||||||
|  |  | ||||||
|  | : (does>)   lastxt @ dodoes_code over >code ! r> swap >does ! ; | ||||||
|  |  | ||||||
|  | : does>   postpone (does>) ; immediate | ||||||
|  |  | ||||||
|  | : begin \ ( -- ) ( C: -- dest ) | ||||||
|  |     here ; immediate | ||||||
|  |  | ||||||
|  | : while \ ( x -- ) ( C: dest -- orig dest ) | ||||||
|  |     unresolved 0branch swap ; immediate | ||||||
|  |  | ||||||
|  | : repeat \ ( -- ) ( C: orig dest -- ) | ||||||
|  |     postpone branch ,  resolve ; immediate | ||||||
|  |  | ||||||
|  | : until \ ( x -- ) ( C: dest -- ) | ||||||
|  |     postpone 0branch , ; immediate | ||||||
|  |  | ||||||
|  | : recurse   lastxt @ compile, ; immediate | ||||||
|  |  | ||||||
|  | : pad \ ( -- addr ) | ||||||
|  |     here 1024 + ; | ||||||
|  |  | ||||||
|  | : parse \ ( char "string<char>" -- addr n ) | ||||||
|  |     pad >r  begin | ||||||
|  | 	source? if <source 2dup <> else 0 0 then | ||||||
|  |     while | ||||||
|  | 	r@ c!  r> 1+ >r | ||||||
|  |     repeat  2drop  pad r> over - ; | ||||||
|  |  | ||||||
|  | : ( \ ( "string<paren>" -- ) | ||||||
|  |     [ char ) ] literal parse 2drop ; immediate | ||||||
|  |     \ TODO: If necessary, refill and keep parsing. | ||||||
|  |  | ||||||
|  | : string, ( addr n -- ) | ||||||
|  |     here over allot align  swap cmove ; | ||||||
|  |  | ||||||
|  | : (s") ( -- addr n ) ( R: ret1 -- ret2 ) | ||||||
|  |     r> dup @ swap cell+ 2dup + aligned >r swap ; | ||||||
|  |  | ||||||
|  | create squote   128 allot | ||||||
|  |  | ||||||
|  | : s" ( "string<quote>" -- addr n ) | ||||||
|  |     state @ if | ||||||
|  | 	postpone (s")  [char] " parse  dup ,  string, | ||||||
|  |     else | ||||||
|  | 	[char] " parse  >r squote r@ cmove  squote r> | ||||||
|  |     then ; immediate | ||||||
|  |  | ||||||
|  | : (abort") ( ... addr n -- ) ( R: ... -- ) | ||||||
|  |     cr type cr abort ; | ||||||
|  |  | ||||||
|  | : abort" ( ... x "string<quote>" -- ) ( R: ... -- ) | ||||||
|  |     postpone if  postpone s"  postpone (abort")  postpone then ; immediate | ||||||
|  |  | ||||||
|  | \ ---------------------------------------------------------------------- | ||||||
|  |  | ||||||
|  | ( Core words. ) | ||||||
|  |  | ||||||
|  | \ TODO: # | ||||||
|  | \ TODO: #> | ||||||
|  | \ TODO: #s | ||||||
|  |  | ||||||
|  | : and  ( x y -- x&y )   nand invert ; | ||||||
|  |  | ||||||
|  | : *   1 2>r 0 swap begin r@ while | ||||||
|  |          r> r> swap 2dup dup + 2>r and if swap over + swap then dup + | ||||||
|  |       repeat r> r> 2drop drop ; | ||||||
|  |  | ||||||
|  | \ TODO: */mod | ||||||
|  |  | ||||||
|  | : +loop ( -- ) ( C: nest-sys -- ) | ||||||
|  |     postpone (+loop)  postpone 0branch  ,  postpone unloop ; immediate | ||||||
|  |  | ||||||
|  | : space   bl emit ; | ||||||
|  |  | ||||||
|  | : ?.-  dup 0 < if [char] - emit negate then ; | ||||||
|  |  | ||||||
|  | : digit   [char] 0 + emit ; | ||||||
|  |  | ||||||
|  | : (.)   base @ /mod  ?dup if recurse then  digit ; | ||||||
|  |  | ||||||
|  | : ." ( "string<quote>" -- )   postpone s"  postpone type ; immediate | ||||||
|  |  | ||||||
|  | : . ( x -- )   ?.- (.) space ; | ||||||
|  |  | ||||||
|  | : postpone-number ( caddr -- ) | ||||||
|  |     0 0 rot count >number dup 0= if | ||||||
|  | 	2drop nip | ||||||
|  | 	postpone (literal)  postpone (literal)  postpone , | ||||||
|  | 	postpone literal  postpone , | ||||||
|  |     else | ||||||
|  | 	." Undefined: " type cr abort | ||||||
|  |     then ; | ||||||
|  |  | ||||||
|  | ' postpone-number  postponers cell+  ! | ||||||
|  |  | ||||||
|  | : / ( x y -- x/y )   /mod nip ; | ||||||
|  |  | ||||||
|  | : 0< ( n -- flag )   0 < ; | ||||||
|  |  | ||||||
|  | : 1- ( n -- n-1 )   -1 + ; | ||||||
|  |  | ||||||
|  | : 2! ( x1 x2 addr -- )   swap over ! cell+ ! ; | ||||||
|  |  | ||||||
|  | : 2* ( n -- 2n )   dup + ; | ||||||
|  |  | ||||||
|  | \ Kernel: 2/ | ||||||
|  |  | ||||||
|  | : 2@ ( addr -- x1 x2 )   dup cell+ @ swap @ ; | ||||||
|  |  | ||||||
|  | \ Kernel: 2drop | ||||||
|  | \ Kernel: 2dup | ||||||
|  |  | ||||||
|  | \ TODO: 2over ( x1 x2 x3 x4 -- x1 x2 x3 x4 x1 x2 ) | ||||||
|  | \           3 pick 3 pick ; | ||||||
|  |  | ||||||
|  | \ TODO: 2swap | ||||||
|  |  | ||||||
|  | \ TODO: <# | ||||||
|  |  | ||||||
|  | : abs ( n -- |n| ) | ||||||
|  |     dup 0< if negate then ; | ||||||
|  |  | ||||||
|  | \ TODO: accept | ||||||
|  |  | ||||||
|  | : c, ( n -- ) | ||||||
|  |     here c!  1 chars allot ; | ||||||
|  |  | ||||||
|  | : char+ ( n1 -- n2 ) | ||||||
|  |     1+ ; | ||||||
|  |  | ||||||
|  | : constant   create , does> @ ; | ||||||
|  |  | ||||||
|  | : decimal ( -- ) | ||||||
|  |     10 base ! ; | ||||||
|  |  | ||||||
|  | : depth ( -- n ) | ||||||
|  |     data_stack 100 cells +  'SP @  - /cell /  2 - ; | ||||||
|  |  | ||||||
|  | : do ( n1 n2 -- ) ( R: -- loop-sys ) ( C: -- do-sys ) | ||||||
|  |     postpone 2>r  here ; immediate | ||||||
|  |  | ||||||
|  | \ TODO: environment? | ||||||
|  | \ TODO: evaluate | ||||||
|  | \ TODO: fill | ||||||
|  | \ TODO: fm/mod ) | ||||||
|  | \ TODO: hold | ||||||
|  |  | ||||||
|  | : j ( -- x1 ) ( R: x1 x2 x3 -- x1 x2 x3 ) | ||||||
|  |     'RP @ 3 cells + @ ; | ||||||
|  |  | ||||||
|  | \ TODO: leave | ||||||
|  |  | ||||||
|  | : loop ( -- ) ( C: nest-sys -- ) | ||||||
|  |     postpone 1  postpone (+loop) | ||||||
|  |     postpone 0branch  , | ||||||
|  |     postpone unloop ; immediate | ||||||
|  |  | ||||||
|  | : lshift   begin ?dup while 1- swap dup + swap repeat ; | ||||||
|  |  | ||||||
|  | : rshift   1 begin over while dup + swap 1- swap repeat nip | ||||||
|  |            2>r 0 1 begin r@ while | ||||||
|  |               r> r> 2dup swap dup + 2>r and if swap over + swap then dup + | ||||||
|  |            repeat r> r> 2drop drop ; | ||||||
|  |  | ||||||
|  | : max ( x y -- max[x,y] ) | ||||||
|  |     2dup > if drop else nip then ; | ||||||
|  |  | ||||||
|  | \ Kernel: min | ||||||
|  | \ TODO:   mod | ||||||
|  | \ TODO:   move | ||||||
|  |  | ||||||
|  | : (quit) ( R: ... -- ) | ||||||
|  |     return_stack 100 cells + 'RP ! | ||||||
|  |     0 'source-id !  tib ''source !  #tib ''#source ! | ||||||
|  |     postpone [ | ||||||
|  |     begin | ||||||
|  | 	refill | ||||||
|  |     while | ||||||
|  | 	interpret  state @ 0= if ." ok" cr then | ||||||
|  |     repeat | ||||||
|  |     bye ; | ||||||
|  |  | ||||||
|  | ' (quit)  ' quit >body cell+  ! | ||||||
|  |  | ||||||
|  | \ TODO: s>d | ||||||
|  | \ TODO: sign | ||||||
|  | \ TODO: sm/rem | ||||||
|  |  | ||||||
|  | : spaces ( n -- ) | ||||||
|  |     0 do space loop ; | ||||||
|  |  | ||||||
|  | \ TODO: u. | ||||||
|  |  | ||||||
|  | : signbit ( -- n )   -1 1 rshift invert ; | ||||||
|  |  | ||||||
|  | : xor ( x y -- x^y )    2dup nand >r r@ nand swap r> nand nand ; | ||||||
|  |  | ||||||
|  | : u<  ( x y -- flag )  signbit xor swap signbit xor > ; | ||||||
|  |  | ||||||
|  | \ TODO: um/mod | ||||||
|  |  | ||||||
|  | : variable ( "word" -- ) | ||||||
|  |     create /cell allot ; | ||||||
|  |  | ||||||
|  | : ['] \ ( C: "word" -- ) | ||||||
|  |     ' postpone literal ; immediate | ||||||
							
								
								
									
										252
									
								
								samples/Forth/core.fs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										252
									
								
								samples/Forth/core.fs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,252 @@ | |||||||
|  | : immediate   lastxt @ dup c@ negate swap c! ; | ||||||
|  |  | ||||||
|  | : \   source nip >in ! ; immediate \ Copyright 2004, 2012 Lars Brinkhoff | ||||||
|  |  | ||||||
|  | : char \ ( "word" -- char ) | ||||||
|  |     bl-word here 1+ c@ ; | ||||||
|  |  | ||||||
|  | : ahead  here 0 , ; | ||||||
|  |  | ||||||
|  | : resolve   here swap ! ; | ||||||
|  |  | ||||||
|  | : '   bl-word here find 0branch [ ahead ] exit [ resolve ] 0 ; | ||||||
|  |  | ||||||
|  | : postpone-nonimmediate   [ ' literal , ' compile, ] literal , ; | ||||||
|  |  | ||||||
|  | : create   dovariable_code header, reveal ; | ||||||
|  |  | ||||||
|  | create postponers | ||||||
|  |     ' postpone-nonimmediate , | ||||||
|  |     ' abort , | ||||||
|  |     ' , , | ||||||
|  |  | ||||||
|  | : word \ ( char "<chars>string<char>" -- caddr ) | ||||||
|  |     drop bl-word here ; | ||||||
|  |  | ||||||
|  | : postpone \ ( C: "word" -- ) | ||||||
|  |     bl word find 1+ cells  postponers + @ execute ; immediate | ||||||
|  |  | ||||||
|  | : unresolved \ ( C: "word" -- orig ) | ||||||
|  |     postpone postpone  postpone ahead ; immediate | ||||||
|  |  | ||||||
|  | : chars \ ( n1 -- n2 ) | ||||||
|  |     ; | ||||||
|  |  | ||||||
|  | : else \ ( -- ) ( C: orig1 -- orig2 ) | ||||||
|  |     unresolved branch swap resolve ; immediate | ||||||
|  |  | ||||||
|  | : if \ ( flag -- ) ( C: -- orig ) | ||||||
|  |     unresolved 0branch ; immediate | ||||||
|  |  | ||||||
|  | : then \ ( -- ) ( C: orig -- ) | ||||||
|  |     resolve ; immediate | ||||||
|  |  | ||||||
|  | : [char] \ ( "word" -- ) | ||||||
|  |     char  postpone literal ; immediate | ||||||
|  |  | ||||||
|  | : (does>)   lastxt @ dodoes_code over >code ! r> swap >does ! ; | ||||||
|  |  | ||||||
|  | : does>   postpone (does>) ; immediate | ||||||
|  |  | ||||||
|  | : begin \ ( -- ) ( C: -- dest ) | ||||||
|  |     here ; immediate | ||||||
|  |  | ||||||
|  | : while \ ( x -- ) ( C: dest -- orig dest ) | ||||||
|  |     unresolved 0branch swap ; immediate | ||||||
|  |  | ||||||
|  | : repeat \ ( -- ) ( C: orig dest -- ) | ||||||
|  |     postpone branch ,  resolve ; immediate | ||||||
|  |  | ||||||
|  | : until \ ( x -- ) ( C: dest -- ) | ||||||
|  |     postpone 0branch , ; immediate | ||||||
|  |  | ||||||
|  | : recurse   lastxt @ compile, ; immediate | ||||||
|  |  | ||||||
|  | : pad \ ( -- addr ) | ||||||
|  |     here 1024 + ; | ||||||
|  |  | ||||||
|  | : parse \ ( char "string<char>" -- addr n ) | ||||||
|  |     pad >r  begin | ||||||
|  | 	source? if <source 2dup <> else 0 0 then | ||||||
|  |     while | ||||||
|  | 	r@ c!  r> 1+ >r | ||||||
|  |     repeat  2drop  pad r> over - ; | ||||||
|  |  | ||||||
|  | : ( \ ( "string<paren>" -- ) | ||||||
|  |     [ char ) ] literal parse 2drop ; immediate | ||||||
|  |     \ TODO: If necessary, refill and keep parsing. | ||||||
|  |  | ||||||
|  | : string, ( addr n -- ) | ||||||
|  |     here over allot align  swap cmove ; | ||||||
|  |  | ||||||
|  | : (s") ( -- addr n ) ( R: ret1 -- ret2 ) | ||||||
|  |     r> dup @ swap cell+ 2dup + aligned >r swap ; | ||||||
|  |  | ||||||
|  | create squote   128 allot | ||||||
|  |  | ||||||
|  | : s" ( "string<quote>" -- addr n ) | ||||||
|  |     state @ if | ||||||
|  | 	postpone (s")  [char] " parse  dup ,  string, | ||||||
|  |     else | ||||||
|  | 	[char] " parse  >r squote r@ cmove  squote r> | ||||||
|  |     then ; immediate | ||||||
|  |  | ||||||
|  | : (abort") ( ... addr n -- ) ( R: ... -- ) | ||||||
|  |     cr type cr abort ; | ||||||
|  |  | ||||||
|  | : abort" ( ... x "string<quote>" -- ) ( R: ... -- ) | ||||||
|  |     postpone if  postpone s"  postpone (abort")  postpone then ; immediate | ||||||
|  |  | ||||||
|  | \ ---------------------------------------------------------------------- | ||||||
|  |  | ||||||
|  | ( Core words. ) | ||||||
|  |  | ||||||
|  | \ TODO: # | ||||||
|  | \ TODO: #> | ||||||
|  | \ TODO: #s | ||||||
|  |  | ||||||
|  | : and  ( x y -- x&y )   nand invert ; | ||||||
|  |  | ||||||
|  | : *   1 2>r 0 swap begin r@ while | ||||||
|  |          r> r> swap 2dup dup + 2>r and if swap over + swap then dup + | ||||||
|  |       repeat r> r> 2drop drop ; | ||||||
|  |  | ||||||
|  | \ TODO: */mod | ||||||
|  |  | ||||||
|  | : +loop ( -- ) ( C: nest-sys -- ) | ||||||
|  |     postpone (+loop)  postpone 0branch  ,  postpone unloop ; immediate | ||||||
|  |  | ||||||
|  | : space   bl emit ; | ||||||
|  |  | ||||||
|  | : ?.-  dup 0 < if [char] - emit negate then ; | ||||||
|  |  | ||||||
|  | : digit   [char] 0 + emit ; | ||||||
|  |  | ||||||
|  | : (.)   base @ /mod  ?dup if recurse then  digit ; | ||||||
|  |  | ||||||
|  | : ." ( "string<quote>" -- )   postpone s"  postpone type ; immediate | ||||||
|  |  | ||||||
|  | : . ( x -- )   ?.- (.) space ; | ||||||
|  |  | ||||||
|  | : postpone-number ( caddr -- ) | ||||||
|  |     0 0 rot count >number dup 0= if | ||||||
|  | 	2drop nip | ||||||
|  | 	postpone (literal)  postpone (literal)  postpone , | ||||||
|  | 	postpone literal  postpone , | ||||||
|  |     else | ||||||
|  | 	." Undefined: " type cr abort | ||||||
|  |     then ; | ||||||
|  |  | ||||||
|  | ' postpone-number  postponers cell+  ! | ||||||
|  |  | ||||||
|  | : / ( x y -- x/y )   /mod nip ; | ||||||
|  |  | ||||||
|  | : 0< ( n -- flag )   0 < ; | ||||||
|  |  | ||||||
|  | : 1- ( n -- n-1 )   -1 + ; | ||||||
|  |  | ||||||
|  | : 2! ( x1 x2 addr -- )   swap over ! cell+ ! ; | ||||||
|  |  | ||||||
|  | : 2* ( n -- 2n )   dup + ; | ||||||
|  |  | ||||||
|  | \ Kernel: 2/ | ||||||
|  |  | ||||||
|  | : 2@ ( addr -- x1 x2 )   dup cell+ @ swap @ ; | ||||||
|  |  | ||||||
|  | \ Kernel: 2drop | ||||||
|  | \ Kernel: 2dup | ||||||
|  |  | ||||||
|  | \ TODO: 2over ( x1 x2 x3 x4 -- x1 x2 x3 x4 x1 x2 ) | ||||||
|  | \           3 pick 3 pick ; | ||||||
|  |  | ||||||
|  | \ TODO: 2swap | ||||||
|  |  | ||||||
|  | \ TODO: <# | ||||||
|  |  | ||||||
|  | : abs ( n -- |n| ) | ||||||
|  |     dup 0< if negate then ; | ||||||
|  |  | ||||||
|  | \ TODO: accept | ||||||
|  |  | ||||||
|  | : c, ( n -- ) | ||||||
|  |     here c!  1 chars allot ; | ||||||
|  |  | ||||||
|  | : char+ ( n1 -- n2 ) | ||||||
|  |     1+ ; | ||||||
|  |  | ||||||
|  | : constant   create , does> @ ; | ||||||
|  |  | ||||||
|  | : decimal ( -- ) | ||||||
|  |     10 base ! ; | ||||||
|  |  | ||||||
|  | : depth ( -- n ) | ||||||
|  |     data_stack 100 cells +  'SP @  - /cell /  2 - ; | ||||||
|  |  | ||||||
|  | : do ( n1 n2 -- ) ( R: -- loop-sys ) ( C: -- do-sys ) | ||||||
|  |     postpone 2>r  here ; immediate | ||||||
|  |  | ||||||
|  | \ TODO: environment? | ||||||
|  | \ TODO: evaluate | ||||||
|  | \ TODO: fill | ||||||
|  | \ TODO: fm/mod ) | ||||||
|  | \ TODO: hold | ||||||
|  |  | ||||||
|  | : j ( -- x1 ) ( R: x1 x2 x3 -- x1 x2 x3 ) | ||||||
|  |     'RP @ 3 cells + @ ; | ||||||
|  |  | ||||||
|  | \ TODO: leave | ||||||
|  |  | ||||||
|  | : loop ( -- ) ( C: nest-sys -- ) | ||||||
|  |     postpone 1  postpone (+loop) | ||||||
|  |     postpone 0branch  , | ||||||
|  |     postpone unloop ; immediate | ||||||
|  |  | ||||||
|  | : lshift   begin ?dup while 1- swap dup + swap repeat ; | ||||||
|  |  | ||||||
|  | : rshift   1 begin over while dup + swap 1- swap repeat nip | ||||||
|  |            2>r 0 1 begin r@ while | ||||||
|  |               r> r> 2dup swap dup + 2>r and if swap over + swap then dup + | ||||||
|  |            repeat r> r> 2drop drop ; | ||||||
|  |  | ||||||
|  | : max ( x y -- max[x,y] ) | ||||||
|  |     2dup > if drop else nip then ; | ||||||
|  |  | ||||||
|  | \ Kernel: min | ||||||
|  | \ TODO:   mod | ||||||
|  | \ TODO:   move | ||||||
|  |  | ||||||
|  | : (quit) ( R: ... -- ) | ||||||
|  |     return_stack 100 cells + 'RP ! | ||||||
|  |     0 'source-id !  tib ''source !  #tib ''#source ! | ||||||
|  |     postpone [ | ||||||
|  |     begin | ||||||
|  | 	refill | ||||||
|  |     while | ||||||
|  | 	interpret  state @ 0= if ." ok" cr then | ||||||
|  |     repeat | ||||||
|  |     bye ; | ||||||
|  |  | ||||||
|  | ' (quit)  ' quit >body cell+  ! | ||||||
|  |  | ||||||
|  | \ TODO: s>d | ||||||
|  | \ TODO: sign | ||||||
|  | \ TODO: sm/rem | ||||||
|  |  | ||||||
|  | : spaces ( n -- ) | ||||||
|  |     0 do space loop ; | ||||||
|  |  | ||||||
|  | \ TODO: u. | ||||||
|  |  | ||||||
|  | : signbit ( -- n )   -1 1 rshift invert ; | ||||||
|  |  | ||||||
|  | : xor ( x y -- x^y )    2dup nand >r r@ nand swap r> nand nand ; | ||||||
|  |  | ||||||
|  | : u<  ( x y -- flag )  signbit xor swap signbit xor > ; | ||||||
|  |  | ||||||
|  | \ TODO: um/mod | ||||||
|  |  | ||||||
|  | : variable ( "word" -- ) | ||||||
|  |     create /cell allot ; | ||||||
|  |  | ||||||
|  | : ['] \ ( C: "word" -- ) | ||||||
|  |     ' postpone literal ; immediate | ||||||
							
								
								
									
										252
									
								
								samples/Forth/core1.F
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										252
									
								
								samples/Forth/core1.F
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,252 @@ | |||||||
|  | : immediate   lastxt @ dup c@ negate swap c! ; | ||||||
|  |  | ||||||
|  | : \   source nip >in ! ; immediate \ Copyright 2004, 2012 Lars Brinkhoff | ||||||
|  |  | ||||||
|  | : char \ ( "word" -- char ) | ||||||
|  |     bl-word here 1+ c@ ; | ||||||
|  |  | ||||||
|  | : ahead  here 0 , ; | ||||||
|  |  | ||||||
|  | : resolve   here swap ! ; | ||||||
|  |  | ||||||
|  | : '   bl-word here find 0branch [ ahead ] exit [ resolve ] 0 ; | ||||||
|  |  | ||||||
|  | : postpone-nonimmediate   [ ' literal , ' compile, ] literal , ; | ||||||
|  |  | ||||||
|  | : create   dovariable_code header, reveal ; | ||||||
|  |  | ||||||
|  | create postponers | ||||||
|  |     ' postpone-nonimmediate , | ||||||
|  |     ' abort , | ||||||
|  |     ' , , | ||||||
|  |  | ||||||
|  | : word \ ( char "<chars>string<char>" -- caddr ) | ||||||
|  |     drop bl-word here ; | ||||||
|  |  | ||||||
|  | : postpone \ ( C: "word" -- ) | ||||||
|  |     bl word find 1+ cells  postponers + @ execute ; immediate | ||||||
|  |  | ||||||
|  | : unresolved \ ( C: "word" -- orig ) | ||||||
|  |     postpone postpone  postpone ahead ; immediate | ||||||
|  |  | ||||||
|  | : chars \ ( n1 -- n2 ) | ||||||
|  |     ; | ||||||
|  |  | ||||||
|  | : else \ ( -- ) ( C: orig1 -- orig2 ) | ||||||
|  |     unresolved branch swap resolve ; immediate | ||||||
|  |  | ||||||
|  | : if \ ( flag -- ) ( C: -- orig ) | ||||||
|  |     unresolved 0branch ; immediate | ||||||
|  |  | ||||||
|  | : then \ ( -- ) ( C: orig -- ) | ||||||
|  |     resolve ; immediate | ||||||
|  |  | ||||||
|  | : [char] \ ( "word" -- ) | ||||||
|  |     char  postpone literal ; immediate | ||||||
|  |  | ||||||
|  | : (does>)   lastxt @ dodoes_code over >code ! r> swap >does ! ; | ||||||
|  |  | ||||||
|  | : does>   postpone (does>) ; immediate | ||||||
|  |  | ||||||
|  | : begin \ ( -- ) ( C: -- dest ) | ||||||
|  |     here ; immediate | ||||||
|  |  | ||||||
|  | : while \ ( x -- ) ( C: dest -- orig dest ) | ||||||
|  |     unresolved 0branch swap ; immediate | ||||||
|  |  | ||||||
|  | : repeat \ ( -- ) ( C: orig dest -- ) | ||||||
|  |     postpone branch ,  resolve ; immediate | ||||||
|  |  | ||||||
|  | : until \ ( x -- ) ( C: dest -- ) | ||||||
|  |     postpone 0branch , ; immediate | ||||||
|  |  | ||||||
|  | : recurse   lastxt @ compile, ; immediate | ||||||
|  |  | ||||||
|  | : pad \ ( -- addr ) | ||||||
|  |     here 1024 + ; | ||||||
|  |  | ||||||
|  | : parse \ ( char "string<char>" -- addr n ) | ||||||
|  |     pad >r  begin | ||||||
|  | 	source? if <source 2dup <> else 0 0 then | ||||||
|  |     while | ||||||
|  | 	r@ c!  r> 1+ >r | ||||||
|  |     repeat  2drop  pad r> over - ; | ||||||
|  |  | ||||||
|  | : ( \ ( "string<paren>" -- ) | ||||||
|  |     [ char ) ] literal parse 2drop ; immediate | ||||||
|  |     \ TODO: If necessary, refill and keep parsing. | ||||||
|  |  | ||||||
|  | : string, ( addr n -- ) | ||||||
|  |     here over allot align  swap cmove ; | ||||||
|  |  | ||||||
|  | : (s") ( -- addr n ) ( R: ret1 -- ret2 ) | ||||||
|  |     r> dup @ swap cell+ 2dup + aligned >r swap ; | ||||||
|  |  | ||||||
|  | create squote   128 allot | ||||||
|  |  | ||||||
|  | : s" ( "string<quote>" -- addr n ) | ||||||
|  |     state @ if | ||||||
|  | 	postpone (s")  [char] " parse  dup ,  string, | ||||||
|  |     else | ||||||
|  | 	[char] " parse  >r squote r@ cmove  squote r> | ||||||
|  |     then ; immediate | ||||||
|  |  | ||||||
|  | : (abort") ( ... addr n -- ) ( R: ... -- ) | ||||||
|  |     cr type cr abort ; | ||||||
|  |  | ||||||
|  | : abort" ( ... x "string<quote>" -- ) ( R: ... -- ) | ||||||
|  |     postpone if  postpone s"  postpone (abort")  postpone then ; immediate | ||||||
|  |  | ||||||
|  | \ ---------------------------------------------------------------------- | ||||||
|  |  | ||||||
|  | ( Core words. ) | ||||||
|  |  | ||||||
|  | \ TODO: # | ||||||
|  | \ TODO: #> | ||||||
|  | \ TODO: #s | ||||||
|  |  | ||||||
|  | : and  ( x y -- x&y )   nand invert ; | ||||||
|  |  | ||||||
|  | : *   1 2>r 0 swap begin r@ while | ||||||
|  |          r> r> swap 2dup dup + 2>r and if swap over + swap then dup + | ||||||
|  |       repeat r> r> 2drop drop ; | ||||||
|  |  | ||||||
|  | \ TODO: */mod | ||||||
|  |  | ||||||
|  | : +loop ( -- ) ( C: nest-sys -- ) | ||||||
|  |     postpone (+loop)  postpone 0branch  ,  postpone unloop ; immediate | ||||||
|  |  | ||||||
|  | : space   bl emit ; | ||||||
|  |  | ||||||
|  | : ?.-  dup 0 < if [char] - emit negate then ; | ||||||
|  |  | ||||||
|  | : digit   [char] 0 + emit ; | ||||||
|  |  | ||||||
|  | : (.)   base @ /mod  ?dup if recurse then  digit ; | ||||||
|  |  | ||||||
|  | : ." ( "string<quote>" -- )   postpone s"  postpone type ; immediate | ||||||
|  |  | ||||||
|  | : . ( x -- )   ?.- (.) space ; | ||||||
|  |  | ||||||
|  | : postpone-number ( caddr -- ) | ||||||
|  |     0 0 rot count >number dup 0= if | ||||||
|  | 	2drop nip | ||||||
|  | 	postpone (literal)  postpone (literal)  postpone , | ||||||
|  | 	postpone literal  postpone , | ||||||
|  |     else | ||||||
|  | 	." Undefined: " type cr abort | ||||||
|  |     then ; | ||||||
|  |  | ||||||
|  | ' postpone-number  postponers cell+  ! | ||||||
|  |  | ||||||
|  | : / ( x y -- x/y )   /mod nip ; | ||||||
|  |  | ||||||
|  | : 0< ( n -- flag )   0 < ; | ||||||
|  |  | ||||||
|  | : 1- ( n -- n-1 )   -1 + ; | ||||||
|  |  | ||||||
|  | : 2! ( x1 x2 addr -- )   swap over ! cell+ ! ; | ||||||
|  |  | ||||||
|  | : 2* ( n -- 2n )   dup + ; | ||||||
|  |  | ||||||
|  | \ Kernel: 2/ | ||||||
|  |  | ||||||
|  | : 2@ ( addr -- x1 x2 )   dup cell+ @ swap @ ; | ||||||
|  |  | ||||||
|  | \ Kernel: 2drop | ||||||
|  | \ Kernel: 2dup | ||||||
|  |  | ||||||
|  | \ TODO: 2over ( x1 x2 x3 x4 -- x1 x2 x3 x4 x1 x2 ) | ||||||
|  | \           3 pick 3 pick ; | ||||||
|  |  | ||||||
|  | \ TODO: 2swap | ||||||
|  |  | ||||||
|  | \ TODO: <# | ||||||
|  |  | ||||||
|  | : abs ( n -- |n| ) | ||||||
|  |     dup 0< if negate then ; | ||||||
|  |  | ||||||
|  | \ TODO: accept | ||||||
|  |  | ||||||
|  | : c, ( n -- ) | ||||||
|  |     here c!  1 chars allot ; | ||||||
|  |  | ||||||
|  | : char+ ( n1 -- n2 ) | ||||||
|  |     1+ ; | ||||||
|  |  | ||||||
|  | : constant   create , does> @ ; | ||||||
|  |  | ||||||
|  | : decimal ( -- ) | ||||||
|  |     10 base ! ; | ||||||
|  |  | ||||||
|  | : depth ( -- n ) | ||||||
|  |     data_stack 100 cells +  'SP @  - /cell /  2 - ; | ||||||
|  |  | ||||||
|  | : do ( n1 n2 -- ) ( R: -- loop-sys ) ( C: -- do-sys ) | ||||||
|  |     postpone 2>r  here ; immediate | ||||||
|  |  | ||||||
|  | \ TODO: environment? | ||||||
|  | \ TODO: evaluate | ||||||
|  | \ TODO: fill | ||||||
|  | \ TODO: fm/mod ) | ||||||
|  | \ TODO: hold | ||||||
|  |  | ||||||
|  | : j ( -- x1 ) ( R: x1 x2 x3 -- x1 x2 x3 ) | ||||||
|  |     'RP @ 3 cells + @ ; | ||||||
|  |  | ||||||
|  | \ TODO: leave | ||||||
|  |  | ||||||
|  | : loop ( -- ) ( C: nest-sys -- ) | ||||||
|  |     postpone 1  postpone (+loop) | ||||||
|  |     postpone 0branch  , | ||||||
|  |     postpone unloop ; immediate | ||||||
|  |  | ||||||
|  | : lshift   begin ?dup while 1- swap dup + swap repeat ; | ||||||
|  |  | ||||||
|  | : rshift   1 begin over while dup + swap 1- swap repeat nip | ||||||
|  |            2>r 0 1 begin r@ while | ||||||
|  |               r> r> 2dup swap dup + 2>r and if swap over + swap then dup + | ||||||
|  |            repeat r> r> 2drop drop ; | ||||||
|  |  | ||||||
|  | : max ( x y -- max[x,y] ) | ||||||
|  |     2dup > if drop else nip then ; | ||||||
|  |  | ||||||
|  | \ Kernel: min | ||||||
|  | \ TODO:   mod | ||||||
|  | \ TODO:   move | ||||||
|  |  | ||||||
|  | : (quit) ( R: ... -- ) | ||||||
|  |     return_stack 100 cells + 'RP ! | ||||||
|  |     0 'source-id !  tib ''source !  #tib ''#source ! | ||||||
|  |     postpone [ | ||||||
|  |     begin | ||||||
|  | 	refill | ||||||
|  |     while | ||||||
|  | 	interpret  state @ 0= if ." ok" cr then | ||||||
|  |     repeat | ||||||
|  |     bye ; | ||||||
|  |  | ||||||
|  | ' (quit)  ' quit >body cell+  ! | ||||||
|  |  | ||||||
|  | \ TODO: s>d | ||||||
|  | \ TODO: sign | ||||||
|  | \ TODO: sm/rem | ||||||
|  |  | ||||||
|  | : spaces ( n -- ) | ||||||
|  |     0 do space loop ; | ||||||
|  |  | ||||||
|  | \ TODO: u. | ||||||
|  |  | ||||||
|  | : signbit ( -- n )   -1 1 rshift invert ; | ||||||
|  |  | ||||||
|  | : xor ( x y -- x^y )    2dup nand >r r@ nand swap r> nand nand ; | ||||||
|  |  | ||||||
|  | : u<  ( x y -- flag )  signbit xor swap signbit xor > ; | ||||||
|  |  | ||||||
|  | \ TODO: um/mod | ||||||
|  |  | ||||||
|  | : variable ( "word" -- ) | ||||||
|  |     create /cell allot ; | ||||||
|  |  | ||||||
|  | : ['] \ ( C: "word" -- ) | ||||||
|  |     ' postpone literal ; immediate | ||||||
							
								
								
									
										7
									
								
								samples/Forth/enum.frt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								samples/Forth/enum.frt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | |||||||
|  | \ Implements ENUM. | ||||||
|  |  | ||||||
|  | \ Double DOES>! | ||||||
|  | : enum   create 0 ,  does> create dup @ 1 rot +! ,  does> @ ; | ||||||
|  |  | ||||||
|  | \ But this is simpler. | ||||||
|  | : enum   create 0 ,  does> dup @ constant 1 swap +! ; | ||||||
							
								
								
									
										8
									
								
								samples/Forth/macros.frt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								samples/Forth/macros.frt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | |||||||
|  | \ Simplifies compiling words. | ||||||
|  |  | ||||||
|  | : [[     ; immediate | ||||||
|  | : '<>    >in @ ' swap >in ! <> ; | ||||||
|  | : (]])   begin dup '<> while postpone postpone repeat drop ; | ||||||
|  | : ]]     ['] [[ (]]) ; immediate | ||||||
|  |  | ||||||
|  | ( Usage:   : foo ]] dup * [[ ; immediate   : bar 42 foo . ; ) | ||||||
							
								
								
									
										57
									
								
								samples/G-code/duettest.g
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								samples/G-code/duettest.g
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,57 @@ | |||||||
|  | ; RepRapPro Ormerod | ||||||
|  | ; Board test GCodes | ||||||
|  | M111 S1; Debug on | ||||||
|  | G21 ; mm | ||||||
|  | G90 ; Absolute positioning | ||||||
|  | M83 ; Extrusion relative | ||||||
|  | M906 X800 Y800 Z800 E800 ; Motor currents (mA) | ||||||
|  | T0 ; Extruder 0 | ||||||
|  | G1 X50 F500 | ||||||
|  | G1 X0 | ||||||
|  | G4 P500 | ||||||
|  | G1 Y50 F500 | ||||||
|  | G1 Y0 | ||||||
|  | G4 P500 | ||||||
|  | G1 Z20 F200 | ||||||
|  | G1 Z0 | ||||||
|  | G4 P500 | ||||||
|  | G1 E20 F200 | ||||||
|  | G1 E-20 | ||||||
|  | G4 P500 | ||||||
|  | M106 S255 | ||||||
|  | G4 P500 | ||||||
|  | M106 S0 | ||||||
|  | G4 P500 | ||||||
|  | M105 | ||||||
|  | G10 P0 S100 | ||||||
|  | T0 | ||||||
|  | M140 S100 | ||||||
|  | G4 P5000 | ||||||
|  | M105 | ||||||
|  | G4 P5000 | ||||||
|  | M105 | ||||||
|  | G4 P5000 | ||||||
|  | M105 | ||||||
|  | G4 P5000 | ||||||
|  | M105 | ||||||
|  | G4 P5000 | ||||||
|  | M105 | ||||||
|  | G4 P5000 | ||||||
|  | M105 | ||||||
|  | G4 P5000 | ||||||
|  | M105 | ||||||
|  | G4 P5000 | ||||||
|  | M105 | ||||||
|  | G4 P5000 | ||||||
|  | M105 | ||||||
|  | G4 P5000 | ||||||
|  | M105 | ||||||
|  | G4 P5000 | ||||||
|  | M105 | ||||||
|  | G4 P5000 | ||||||
|  | M105 | ||||||
|  | M0 | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
							
								
								
									
										25912
									
								
								samples/G-code/lm.g
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25912
									
								
								samples/G-code/lm.g
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										29735
									
								
								samples/G-code/rm.g
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29735
									
								
								samples/G-code/rm.g
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										13
									
								
								samples/G-code/square.g
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								samples/G-code/square.g
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | |||||||
|  | G28 X0 Y0 | ||||||
|  | G1 X55 Y5 F2000 | ||||||
|  | G1 Y180 | ||||||
|  | G1 X180 | ||||||
|  | G1 Y5 | ||||||
|  | G1 X55 | ||||||
|  | G1 Y180 | ||||||
|  | G1 X180 | ||||||
|  | G1 Y5 | ||||||
|  | G1 X55 | ||||||
|  | M0 | ||||||
|  |  | ||||||
|  |  | ||||||
							
								
								
									
										57
									
								
								samples/GDScript/example.gd
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								samples/GDScript/example.gd
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,57 @@ | |||||||
|  | # Taken from https://github.com/okamstudio/godot/wiki/gdscript | ||||||
|  | # a file is a class! | ||||||
|  |  | ||||||
|  | # inheritance | ||||||
|  |  | ||||||
|  | extends BaseClass | ||||||
|  |  | ||||||
|  | # member variables | ||||||
|  |  | ||||||
|  | var a = 5  | ||||||
|  | var s = "Hello" | ||||||
|  | var arr = [1, 2, 3] | ||||||
|  | var dict = {"key":"value", 2:3} | ||||||
|  |  | ||||||
|  | # constants | ||||||
|  |  | ||||||
|  | const answer = 42 | ||||||
|  | const thename = "Charly" | ||||||
|  |  | ||||||
|  | # built-in vector types | ||||||
|  |  | ||||||
|  | var v2 = Vector2(1, 2) | ||||||
|  | var v3 = Vector3(1, 2, 3) | ||||||
|  |  | ||||||
|  | # function | ||||||
|  |  | ||||||
|  | func some_function(param1, param2): | ||||||
|  |     var local_var = 5 | ||||||
|  |  | ||||||
|  |     if param1 < local_var: | ||||||
|  |         print(param1) | ||||||
|  |     elif param2 > 5: | ||||||
|  |         print(param2) | ||||||
|  |     else: | ||||||
|  |         print("fail!") | ||||||
|  |  | ||||||
|  |     for i in range(20): | ||||||
|  |         print(i) | ||||||
|  |  | ||||||
|  |     while(param2 != 0): | ||||||
|  |         param2 -= 1 | ||||||
|  |  | ||||||
|  |     var local_var2 = param1+3 | ||||||
|  |     return local_var2 | ||||||
|  |  | ||||||
|  |  | ||||||
|  | # subclass | ||||||
|  |  | ||||||
|  | class Something: | ||||||
|  |     var a = 10 | ||||||
|  |  | ||||||
|  | # constructor | ||||||
|  |  | ||||||
|  | func _init(): | ||||||
|  |     print("constructed!") | ||||||
|  |     var lv = Something.new() | ||||||
|  |     print(lv.a) | ||||||
							
								
								
									
										216
									
								
								samples/GDScript/grid.gd
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										216
									
								
								samples/GDScript/grid.gd
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,216 @@ | |||||||
|  |  | ||||||
|  |  | ||||||
|  | extends Control | ||||||
|  |  | ||||||
|  | # Simple Tetris-like demo, (c) 2012 Juan Linietsky | ||||||
|  | # Implemented by using a regular Control and drawing on it during the _draw() callback. | ||||||
|  | # The drawing surface is updated only when changes happen (by calling update()) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | var score = 0 | ||||||
|  | var score_label=null | ||||||
|  |  | ||||||
|  | const MAX_SHAPES = 7 | ||||||
|  |  | ||||||
|  | var block = preload("block.png") | ||||||
|  |  | ||||||
|  | var block_colors=[ | ||||||
|  | 	Color(1,0.5,0.5), | ||||||
|  | 	Color(0.5,1,0.5), | ||||||
|  | 	Color(0.5,0.5,1), | ||||||
|  | 	Color(0.8,0.4,0.8), | ||||||
|  | 	Color(0.8,0.8,0.4), | ||||||
|  | 	Color(0.4,0.8,0.8), | ||||||
|  | 	Color(0.7,0.7,0.7)] | ||||||
|  |  | ||||||
|  | var	block_shapes=[ | ||||||
|  | 	[ Vector2(0,-1),Vector2(0,0),Vector2(0,1),Vector2(0,2) ], # I | ||||||
|  | 	[ Vector2(0,0),Vector2(1,0),Vector2(1,1),Vector2(0,1) ], # O | ||||||
|  | 	[ Vector2(-1,1),Vector2(0,1),Vector2(0,0),Vector2(1,0) ], # S | ||||||
|  | 	[ Vector2(1,1),Vector2(0,1),Vector2(0,0),Vector2(-1,0) ], # Z | ||||||
|  | 	[ Vector2(-1,1),Vector2(-1,0),Vector2(0,0),Vector2(1,0) ], # L | ||||||
|  | 	[ Vector2(1,1),Vector2(1,0),Vector2(0,0),Vector2(-1,0) ], # J | ||||||
|  | 	[ Vector2(0,1),Vector2(1,0),Vector2(0,0),Vector2(-1,0) ]] # T | ||||||
|  | 	 | ||||||
|  |  | ||||||
|  | var block_rotations=[ | ||||||
|  | 	Matrix32( Vector2(1,0),Vector2(0,1), Vector2() ), | ||||||
|  | 	Matrix32( Vector2(0,1),Vector2(-1,0), Vector2() ), | ||||||
|  | 	Matrix32( Vector2(-1,0),Vector2(0,-1), Vector2() ), | ||||||
|  | 	Matrix32( Vector2(0,-1),Vector2(1,0), Vector2() ) | ||||||
|  | ] | ||||||
|  | 	 | ||||||
|  |  | ||||||
|  | var width=0 | ||||||
|  | var height=0 | ||||||
|  |  | ||||||
|  | var cells={} | ||||||
|  |  | ||||||
|  | var piece_active=false | ||||||
|  | var piece_shape=0 | ||||||
|  | var piece_pos=Vector2() | ||||||
|  | var piece_rot=0 | ||||||
|  |  | ||||||
|  |  | ||||||
|  | func piece_cell_xform(p,er=0): | ||||||
|  | 	var r = (4+er+piece_rot)%4 | ||||||
|  | 	return piece_pos+block_rotations[r].xform(p) | ||||||
|  |  | ||||||
|  | func _draw(): | ||||||
|  |  | ||||||
|  | 	var sb = get_stylebox("bg","Tree") # use line edit bg | ||||||
|  | 	draw_style_box(sb,Rect2(Vector2(),get_size()).grow(3)) | ||||||
|  | 	 | ||||||
|  | 	var bs = block.get_size() | ||||||
|  | 	for y in range(height): | ||||||
|  | 		for x in range(width): | ||||||
|  | 			if (Vector2(x,y) in cells): | ||||||
|  | 				draw_texture_rect(block,Rect2(Vector2(x,y)*bs,bs),false,block_colors[cells[Vector2(x,y)]]) | ||||||
|  | 				 | ||||||
|  | 	if (piece_active): | ||||||
|  | 		 | ||||||
|  | 		for c in block_shapes[piece_shape]: | ||||||
|  | 			draw_texture_rect(block,Rect2(piece_cell_xform(c)*bs,bs),false,block_colors[piece_shape]) | ||||||
|  | 			 | ||||||
|  |  | ||||||
|  | func piece_check_fit(ofs,er=0): | ||||||
|  |  | ||||||
|  | 	for c in block_shapes[piece_shape]: | ||||||
|  | 		var pos = piece_cell_xform(c,er)+ofs | ||||||
|  | 		if (pos.x < 0): | ||||||
|  | 			return false | ||||||
|  | 		if (pos.y < 0): | ||||||
|  | 			return false | ||||||
|  | 		if (pos.x >= width): | ||||||
|  | 			return false | ||||||
|  | 		if (pos.y >= height): | ||||||
|  | 			return false | ||||||
|  | 		if (pos in cells): | ||||||
|  | 			return false | ||||||
|  | 	 | ||||||
|  | 	return true	 | ||||||
|  |  | ||||||
|  | func new_piece(): | ||||||
|  |  | ||||||
|  | 	piece_shape = randi() % MAX_SHAPES	 | ||||||
|  | 	piece_pos = Vector2(width/2,0) | ||||||
|  | 	piece_active=true | ||||||
|  | 	piece_rot=0 | ||||||
|  | 	if (piece_shape==0): | ||||||
|  | 		piece_pos.y+=1 | ||||||
|  | 		 | ||||||
|  | 	if (not piece_check_fit(Vector2())): | ||||||
|  | 		#game over | ||||||
|  | 		#print("GAME OVER!") | ||||||
|  | 		game_over() | ||||||
|  | 		 | ||||||
|  | 	update() | ||||||
|  | 		 | ||||||
|  | 	 | ||||||
|  | func test_collapse_rows(): | ||||||
|  | 	var accum_down=0 | ||||||
|  | 	for i in range(height): | ||||||
|  | 		var y = height - i - 1 | ||||||
|  | 		var collapse = true | ||||||
|  | 		for x in range(width): | ||||||
|  | 			if (Vector2(x,y) in cells): | ||||||
|  | 				if (accum_down): | ||||||
|  | 					cells[ Vector2(x,y+accum_down) ] = cells[Vector2(x,y)] | ||||||
|  | 			else: | ||||||
|  | 				collapse=false | ||||||
|  | 				if (accum_down): | ||||||
|  | 					cells.erase( Vector2(x,y+accum_down) ) | ||||||
|  | 						 | ||||||
|  | 		if (collapse): | ||||||
|  | 			accum_down+=1 | ||||||
|  | 		 | ||||||
|  | 			 | ||||||
|  | 	score+=accum_down*100 | ||||||
|  | 	score_label.set_text(str(score)) | ||||||
|  | 			 | ||||||
|  | 		 | ||||||
|  | func game_over(): | ||||||
|  |  | ||||||
|  | 		piece_active=false | ||||||
|  | 		get_node("gameover").set_text("Game Over")		 | ||||||
|  | 		update() | ||||||
|  | 				 | ||||||
|  | 		 | ||||||
|  | func restart_pressed(): | ||||||
|  |  | ||||||
|  | 		score=0 | ||||||
|  | 		score_label.set_text("0") | ||||||
|  | 		cells.clear() | ||||||
|  | 		get_node("gameover").set_text("")		 | ||||||
|  | 		piece_active=true | ||||||
|  | 		update() | ||||||
|  | 		 | ||||||
|  | 		 | ||||||
|  |  | ||||||
|  | func piece_move_down(): | ||||||
|  |  | ||||||
|  | 	if (!piece_active): | ||||||
|  | 		return | ||||||
|  | 	if (piece_check_fit(Vector2(0,1))): | ||||||
|  | 		piece_pos.y+=1 | ||||||
|  | 		update()		 | ||||||
|  | 	else: | ||||||
|  |  | ||||||
|  | 		for c in block_shapes[piece_shape]: | ||||||
|  | 			var pos = piece_cell_xform(c) | ||||||
|  | 			cells[pos]=piece_shape | ||||||
|  | 		test_collapse_rows() | ||||||
|  | 		new_piece() | ||||||
|  | 		 | ||||||
|  |  | ||||||
|  | func piece_rotate(): | ||||||
|  |  | ||||||
|  | 	var adv = 1 | ||||||
|  | 	if (not piece_check_fit(Vector2(),1)): | ||||||
|  | 		return | ||||||
|  | 	piece_rot = (piece_rot + adv) % 4 | ||||||
|  | 	update() | ||||||
|  | 	 | ||||||
|  | 	 | ||||||
|  |  | ||||||
|  | func _input(ie): | ||||||
|  |  | ||||||
|  |  | ||||||
|  | 	if (not piece_active): | ||||||
|  | 		return | ||||||
|  | 	if (!ie.is_pressed()): | ||||||
|  | 		return | ||||||
|  |  | ||||||
|  | 	if (ie.is_action("move_left")): | ||||||
|  | 		if (piece_check_fit(Vector2(-1,0))): | ||||||
|  | 			piece_pos.x-=1 | ||||||
|  | 			update() | ||||||
|  | 	elif (ie.is_action("move_right")): | ||||||
|  | 		if (piece_check_fit(Vector2(1,0))): | ||||||
|  | 			piece_pos.x+=1 | ||||||
|  | 			update() | ||||||
|  | 	elif (ie.is_action("move_down")): | ||||||
|  | 		piece_move_down() | ||||||
|  | 	elif (ie.is_action("rotate")): | ||||||
|  | 		piece_rotate() | ||||||
|  | 		 | ||||||
|  | 		 | ||||||
|  | func setup(w,h): | ||||||
|  | 	width=w | ||||||
|  | 	height=h | ||||||
|  | 	set_size( Vector2(w,h)*block.get_size() ) | ||||||
|  | 	new_piece() | ||||||
|  | 	get_node("timer").start() | ||||||
|  | 	 | ||||||
|  |  | ||||||
|  | func _ready(): | ||||||
|  | 	# Initalization here | ||||||
|  |  | ||||||
|  | 	setup(10,20) | ||||||
|  | 	score_label = get_node("../score") | ||||||
|  |  | ||||||
|  | 	set_process_input(true) | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
							
								
								
									
										243
									
								
								samples/GDScript/player.gd
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										243
									
								
								samples/GDScript/player.gd
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,243 @@ | |||||||
|  |  | ||||||
|  | extends RigidBody | ||||||
|  |  | ||||||
|  | # member variables here, example: | ||||||
|  | # var a=2 | ||||||
|  | # var b="textvar" | ||||||
|  |  | ||||||
|  | #var dir=Vector3() | ||||||
|  |  | ||||||
|  | const ANIM_FLOOR = 0 | ||||||
|  | const ANIM_AIR_UP = 1 | ||||||
|  | const ANIM_AIR_DOWN = 2 | ||||||
|  |  | ||||||
|  | const SHOOT_TIME = 1.5 | ||||||
|  | const SHOOT_SCALE = 2 | ||||||
|  |  | ||||||
|  | const CHAR_SCALE = Vector3(0.3,0.3,0.3) | ||||||
|  |  | ||||||
|  | var facing_dir = Vector3(1, 0, 0) | ||||||
|  | var movement_dir = Vector3() | ||||||
|  |  | ||||||
|  | var jumping=false | ||||||
|  |  | ||||||
|  | var turn_speed=40 | ||||||
|  | var keep_jump_inertia = true | ||||||
|  | var air_idle_deaccel = false | ||||||
|  | var accel=19.0 | ||||||
|  | var deaccel=14.0 | ||||||
|  | var sharp_turn_threshhold = 140 | ||||||
|  |  | ||||||
|  | var max_speed=3.1 | ||||||
|  | var on_floor = false | ||||||
|  |  | ||||||
|  | var prev_shoot = false | ||||||
|  |  | ||||||
|  | var last_floor_velocity = Vector3() | ||||||
|  |  | ||||||
|  | var shoot_blend = 0 | ||||||
|  |  | ||||||
|  | func adjust_facing(p_facing, p_target,p_step, p_adjust_rate,current_gn): | ||||||
|  |  | ||||||
|  | 	var n = p_target # normal | ||||||
|  | 	var t = n.cross(current_gn).normalized() | ||||||
|  | 	 | ||||||
|  | 	var x = n.dot(p_facing) | ||||||
|  | 	var y = t.dot(p_facing) | ||||||
|  | 	 | ||||||
|  | 	var ang = atan2(y,x) | ||||||
|  | 	 | ||||||
|  | 	if (abs(ang)<0.001): # too small | ||||||
|  | 		return p_facing | ||||||
|  | 	 | ||||||
|  | 	var s = sign(ang) | ||||||
|  | 	ang = ang * s | ||||||
|  | 	var turn = ang * p_adjust_rate * p_step | ||||||
|  | 	var a | ||||||
|  | 	if (ang<turn): | ||||||
|  | 		a=ang | ||||||
|  | 	else: | ||||||
|  | 		a=turn | ||||||
|  | 	ang = (ang - a) * s | ||||||
|  | 	 | ||||||
|  | 	return ((n * cos(ang)) + (t * sin(ang))) * p_facing.length() | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | func _integrate_forces( state ): | ||||||
|  |  | ||||||
|  | 	var lv = state.get_linear_velocity() # linear velocity | ||||||
|  | 	var g = state.get_total_gravity() | ||||||
|  | 	var delta = state.get_step() | ||||||
|  | 	var d = 1.0 - delta*state.get_total_density() | ||||||
|  | 	if (d<0): | ||||||
|  | 		d=0 | ||||||
|  | 	lv += g * delta #apply gravity | ||||||
|  |  | ||||||
|  | 	var anim = ANIM_FLOOR | ||||||
|  |  | ||||||
|  | 	var up = -g.normalized() # (up is against gravity) | ||||||
|  | 	var vv = up.dot(lv) # vertical velocity | ||||||
|  | 	var hv = lv - (up*vv) # horizontal velocity | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | 	var hdir = hv.normalized() # horizontal direction | ||||||
|  | 	var hspeed = hv.length()	#horizontal speed | ||||||
|  |  | ||||||
|  | 	var floor_velocity | ||||||
|  | 	var onfloor = false | ||||||
|  |  | ||||||
|  | 	if (state.get_contact_count() == 0): | ||||||
|  | 		floor_velocity = last_floor_velocity | ||||||
|  | 	else: | ||||||
|  | 		for i in range(state.get_contact_count()): | ||||||
|  | 			if (state.get_contact_local_shape(i) != 1): | ||||||
|  | 				continue | ||||||
|  | 			 | ||||||
|  | 			onfloor = true | ||||||
|  | 			floor_velocity = state.get_contact_collider_velocity_at_pos(i) | ||||||
|  | 			break | ||||||
|  | 		 | ||||||
|  |  | ||||||
|  | 	var dir = Vector3() #where does the player intend to walk to | ||||||
|  | 	var cam_xform = get_node("target/camera").get_global_transform() | ||||||
|  | 	 | ||||||
|  | 	if (Input.is_action_pressed("move_forward")): | ||||||
|  | 		dir+=-cam_xform.basis[2]  | ||||||
|  | 	if (Input.is_action_pressed("move_backwards")): | ||||||
|  | 		dir+=cam_xform.basis[2]  | ||||||
|  | 	if (Input.is_action_pressed("move_left")): | ||||||
|  | 		dir+=-cam_xform.basis[0]  | ||||||
|  | 	if (Input.is_action_pressed("move_right")): | ||||||
|  | 		dir+=cam_xform.basis[0]  | ||||||
|  | 		 | ||||||
|  | 	var jump_attempt = Input.is_action_pressed("jump") | ||||||
|  | 	var shoot_attempt = Input.is_action_pressed("shoot") | ||||||
|  | 		 | ||||||
|  | 	var target_dir = (dir - up*dir.dot(up)).normalized() | ||||||
|  | 	 | ||||||
|  | 	if (onfloor): | ||||||
|  |  | ||||||
|  | 		var sharp_turn = hspeed > 0.1 and rad2deg(acos(target_dir.dot(hdir))) > sharp_turn_threshhold | ||||||
|  |  | ||||||
|  | 		if (dir.length()>0.1 and !sharp_turn) : | ||||||
|  | 			if (hspeed > 0.001) : | ||||||
|  |  | ||||||
|  | 				#linear_dir = linear_h_velocity/linear_vel | ||||||
|  | 				#if (linear_vel > brake_velocity_limit and linear_dir.dot(ctarget_dir)<-cos(Math::deg2rad(brake_angular_limit))) | ||||||
|  | 				#	brake=true | ||||||
|  | 				#else | ||||||
|  | 				hdir = adjust_facing(hdir,target_dir,delta,1.0/hspeed*turn_speed,up) | ||||||
|  | 				facing_dir = hdir | ||||||
|  | 			else: | ||||||
|  |  | ||||||
|  | 				hdir = target_dir | ||||||
|  | 			 | ||||||
|  | 			if (hspeed<max_speed): | ||||||
|  | 				hspeed+=accel*delta | ||||||
|  |  | ||||||
|  | 		else: | ||||||
|  | 			hspeed-=deaccel*delta | ||||||
|  | 			if (hspeed<0): | ||||||
|  | 				hspeed=0 | ||||||
|  | 		 | ||||||
|  | 		hv = hdir*hspeed | ||||||
|  | 		 | ||||||
|  | 		var mesh_xform = get_node("Armature").get_transform()  | ||||||
|  | 		var facing_mesh=-mesh_xform.basis[0].normalized() | ||||||
|  | 		facing_mesh = (facing_mesh - up*facing_mesh.dot(up)).normalized() | ||||||
|  | 		facing_mesh = adjust_facing(facing_mesh,target_dir,delta,1.0/hspeed*turn_speed,up) | ||||||
|  | 		var m3 = Matrix3(-facing_mesh,up,-facing_mesh.cross(up).normalized()).scaled( CHAR_SCALE ) | ||||||
|  | 		 | ||||||
|  | 		get_node("Armature").set_transform(Transform(m3,mesh_xform.origin)) | ||||||
|  | 				 | ||||||
|  | 		if (not jumping and jump_attempt): | ||||||
|  | 			vv = 7.0 | ||||||
|  | 			jumping = true		 | ||||||
|  | 			get_node("sfx").play("jump") | ||||||
|  | 	else: | ||||||
|  |  | ||||||
|  | 		if (vv>0): | ||||||
|  | 			anim=ANIM_AIR_UP | ||||||
|  | 		else: | ||||||
|  | 			anim=ANIM_AIR_DOWN | ||||||
|  | 			 | ||||||
|  | 		var hs | ||||||
|  | 		if (dir.length()>0.1): | ||||||
|  |  | ||||||
|  | 			hv += target_dir * (accel * 0.2) * delta | ||||||
|  | 			if (hv.length() > max_speed): | ||||||
|  | 				hv = hv.normalized() * max_speed | ||||||
|  |  | ||||||
|  | 		else: | ||||||
|  |  | ||||||
|  | 			if (air_idle_deaccel): | ||||||
|  | 				hspeed = hspeed - (deaccel * 0.2) * delta | ||||||
|  | 				if (hspeed<0): | ||||||
|  | 					hspeed=0 | ||||||
|  |  | ||||||
|  | 				hv = hdir*hspeed | ||||||
|  | 			 | ||||||
|  | 		 | ||||||
|  | 	if (jumping and vv < 0): | ||||||
|  | 		jumping=false | ||||||
|  |  | ||||||
|  | 	lv = hv+up*vv | ||||||
|  | 	 | ||||||
|  | 	 | ||||||
|  |  | ||||||
|  | 	if (onfloor): | ||||||
|  |  | ||||||
|  | 		movement_dir = lv | ||||||
|  | 		#lv += floor_velocity | ||||||
|  | 		last_floor_velocity = floor_velocity | ||||||
|  | 	else: | ||||||
|  |  | ||||||
|  | 		if (on_floor) : | ||||||
|  |  | ||||||
|  | 			#if (keep_jump_inertia): | ||||||
|  | 			#	lv += last_floor_velocity | ||||||
|  | 			pass | ||||||
|  | 		 | ||||||
|  | 		last_floor_velocity = Vector3() | ||||||
|  | 		movement_dir = lv | ||||||
|  | 	 | ||||||
|  | 	on_floor = onfloor | ||||||
|  |  | ||||||
|  | 	state.set_linear_velocity(lv) | ||||||
|  | 	 | ||||||
|  | 	if (shoot_blend>0): | ||||||
|  | 		shoot_blend -= delta * SHOOT_SCALE | ||||||
|  | 		if (shoot_blend<0): | ||||||
|  | 			shoot_blend=0 | ||||||
|  | 	 | ||||||
|  | 	if (shoot_attempt and not prev_shoot): | ||||||
|  | 		shoot_blend = SHOOT_TIME		 | ||||||
|  | 		var bullet = preload("res://bullet.scn").instance() | ||||||
|  | 		bullet.set_transform( get_node("Armature/bullet").get_global_transform().orthonormalized() ) | ||||||
|  | 		get_parent().add_child( bullet ) | ||||||
|  | 		bullet.set_linear_velocity( get_node("Armature/bullet").get_global_transform().basis[2].normalized() * 20 ) | ||||||
|  | 		PS.body_add_collision_exception( bullet.get_rid(), get_rid() ) #add it to bullet | ||||||
|  | 		get_node("sfx").play("shoot") | ||||||
|  | 		 | ||||||
|  | 	prev_shoot = shoot_attempt | ||||||
|  | 	 | ||||||
|  | 	if (onfloor): | ||||||
|  | 		get_node("AnimationTreePlayer").blend2_node_set_amount("walk",hspeed / max_speed) | ||||||
|  | 		 | ||||||
|  | 	get_node("AnimationTreePlayer").transition_node_set_current("state",anim) | ||||||
|  | 	get_node("AnimationTreePlayer").blend2_node_set_amount("gun",min(shoot_blend,1.0)) | ||||||
|  | #	state.set_angular_velocity(Vector3())	 | ||||||
|  | 	 | ||||||
|  | 	 | ||||||
|  |  | ||||||
|  |  | ||||||
|  | func _ready(): | ||||||
|  |  | ||||||
|  |  | ||||||
|  | 	# Initalization here | ||||||
|  | 	get_node("AnimationTreePlayer").set_active(true) | ||||||
|  | 	pass | ||||||
|  |  | ||||||
|  |  | ||||||
							
								
								
									
										73
									
								
								samples/GDScript/pong.gd
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								samples/GDScript/pong.gd
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,73 @@ | |||||||
|  |  | ||||||
|  | extends Node2D | ||||||
|  |  | ||||||
|  | # member variables here, example: | ||||||
|  | # var a=2 | ||||||
|  | # var b="textvar" | ||||||
|  | const INITIAL_BALL_SPEED = 80 | ||||||
|  | var ball_speed = INITIAL_BALL_SPEED | ||||||
|  | var screen_size = Vector2(640,400) | ||||||
|  | #default ball direction | ||||||
|  | var direction = Vector2(-1,0) | ||||||
|  | var pad_size = Vector2(8,32) | ||||||
|  | const PAD_SPEED = 150 | ||||||
|  |  | ||||||
|  |  | ||||||
|  | func _process(delta): | ||||||
|  |  | ||||||
|  |  | ||||||
|  | 	# get ball positio and pad rectangles | ||||||
|  | 	var ball_pos = get_node("ball").get_pos() | ||||||
|  | 	var left_rect = Rect2( get_node("left").get_pos() - pad_size*0.5, pad_size ) | ||||||
|  | 	var right_rect = Rect2( get_node("right").get_pos() - pad_size*0.5, pad_size ) | ||||||
|  | 	 | ||||||
|  | 	#integrate new ball postion | ||||||
|  | 	ball_pos+=direction*ball_speed*delta | ||||||
|  | 	 | ||||||
|  | 	#flip when touching roof or floor | ||||||
|  | 	if ( (ball_pos.y<0 and direction.y <0) or (ball_pos.y>screen_size.y and direction.y>0)): | ||||||
|  | 		direction.y = -direction.y | ||||||
|  | 		 | ||||||
|  | 	#flip, change direction and increase speed when touching pads	 | ||||||
|  | 	if ( (left_rect.has_point(ball_pos) and direction.x < 0) or (right_rect.has_point(ball_pos) and direction.x > 0)): | ||||||
|  | 		direction.x=-direction.x | ||||||
|  | 		ball_speed*=1.1 | ||||||
|  | 		direction.y=randf()*2.0-1 | ||||||
|  | 		direction = direction.normalized() | ||||||
|  |  | ||||||
|  | 	#check gameover | ||||||
|  | 	if (ball_pos.x<0 or ball_pos.x>screen_size.x): | ||||||
|  | 		ball_pos=screen_size*0.5 | ||||||
|  | 		ball_speed=INITIAL_BALL_SPEED | ||||||
|  | 		direction=Vector2(-1,0) | ||||||
|  | 			 | ||||||
|  | 						 | ||||||
|  | 	get_node("ball").set_pos(ball_pos) | ||||||
|  |  | ||||||
|  | 	#move left pad	 | ||||||
|  | 	var left_pos = get_node("left").get_pos() | ||||||
|  | 	 | ||||||
|  | 	if (left_pos.y > 0 and Input.is_action_pressed("left_move_up")): | ||||||
|  | 		left_pos.y+=-PAD_SPEED*delta | ||||||
|  | 	if (left_pos.y < screen_size.y and Input.is_action_pressed("left_move_down")): | ||||||
|  | 		left_pos.y+=PAD_SPEED*delta | ||||||
|  | 		 | ||||||
|  | 	get_node("left").set_pos(left_pos) | ||||||
|  | 		 | ||||||
|  | 	#move right pad	 | ||||||
|  | 	var right_pos = get_node("right").get_pos() | ||||||
|  | 	 | ||||||
|  | 	if (right_pos.y > 0 and Input.is_action_pressed("right_move_up")): | ||||||
|  | 		right_pos.y+=-PAD_SPEED*delta | ||||||
|  | 	if (right_pos.y < screen_size.y and Input.is_action_pressed("right_move_down")): | ||||||
|  | 		right_pos.y+=PAD_SPEED*delta | ||||||
|  | 		 | ||||||
|  | 	get_node("right").set_pos(right_pos) | ||||||
|  | 	 | ||||||
|  | 	  | ||||||
|  |  | ||||||
|  | func _ready(): | ||||||
|  | 	screen_size = get_viewport_rect().size # get actual size | ||||||
|  | 	pad_size = get_node("left").get_texture().get_size() | ||||||
|  | 	set_process(true) | ||||||
|  |  | ||||||
							
								
								
									
										48
									
								
								samples/GLSL/recurse1.fs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								samples/GLSL/recurse1.fs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,48 @@ | |||||||
|  | #version 330 core | ||||||
|  |  | ||||||
|  | // cross-unit recursion | ||||||
|  |  | ||||||
|  | void main() {} | ||||||
|  |  | ||||||
|  | // two-level recursion | ||||||
|  |  | ||||||
|  | float cbar(int); | ||||||
|  |  | ||||||
|  | void cfoo(float) | ||||||
|  | { | ||||||
|  | 	cbar(2); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // four-level, out of order | ||||||
|  |  | ||||||
|  | void CB(); | ||||||
|  | void CD(); | ||||||
|  | void CA() { CB(); } | ||||||
|  | void CC() { CD(); } | ||||||
|  |  | ||||||
|  | // high degree | ||||||
|  |  | ||||||
|  | void CBT(); | ||||||
|  | void CDT(); | ||||||
|  | void CAT() { CBT(); CBT(); CBT(); } | ||||||
|  | void CCT() { CDT(); CDT(); CBT(); } | ||||||
|  |  | ||||||
|  | // not recursive | ||||||
|  |  | ||||||
|  | void norA() {} | ||||||
|  | void norB() { norA(); } | ||||||
|  | void norC() { norA(); } | ||||||
|  | void norD() { norA(); } | ||||||
|  | void norE() { norB(); } | ||||||
|  | void norF() { norB(); } | ||||||
|  | void norG() { norE(); } | ||||||
|  | void norH() { norE(); } | ||||||
|  | void norI() { norE(); } | ||||||
|  |  | ||||||
|  | // not recursive, but with a call leading into a cycle if ignoring direction | ||||||
|  |  | ||||||
|  | void norcA() { } | ||||||
|  | void norcB() { norcA(); } | ||||||
|  | void norcC() { norcB(); } | ||||||
|  | void norcD() { norcC(); norcB(); } // head of cycle | ||||||
|  | void norcE() { norcD(); } // lead into cycle | ||||||
							
								
								
									
										67
									
								
								samples/Golo/adapters.golo
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										67
									
								
								samples/Golo/adapters.golo
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,67 @@ | |||||||
|  | # Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon) | ||||||
|  | #  | ||||||
|  | # 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. | ||||||
|  |  | ||||||
|  | module samples.Adapters | ||||||
|  |  | ||||||
|  | local function list_sample = |fabric| { | ||||||
|  |   println(">>> list_sample()") | ||||||
|  |   let carbonCopy = list[] | ||||||
|  |   let conf = map[ | ||||||
|  |     ["extends", "java.util.ArrayList"], | ||||||
|  |     ["overrides", map[ | ||||||
|  |       ["*", |super, name, args| { | ||||||
|  |         if name == "add" { | ||||||
|  |           if args: length() == 2 { | ||||||
|  |             carbonCopy: add(args: get(1)) | ||||||
|  |           } else { | ||||||
|  |             carbonCopy: add(args: get(1), args: get(2)) | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |         return super: invokeWithArguments(args) | ||||||
|  |       } | ||||||
|  |     ]] | ||||||
|  |   ]] | ||||||
|  |   let list = fabric: maker(conf): newInstance() | ||||||
|  |   list: add("bar") | ||||||
|  |   list: add(0, "foo") | ||||||
|  |   list: add("baz") | ||||||
|  |   println("      list: " + list + " " + list: getClass()) | ||||||
|  |   println("carbonCopy: " + carbonCopy + " " + carbonCopy: getClass()) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | local function runnable_sample = |fabric| { | ||||||
|  |   println(">>> runnable_sample") | ||||||
|  |   let result = array[1, 2, 3] | ||||||
|  |   let conf = map[ | ||||||
|  |     ["interfaces", ["java.io.Serializable", "java.lang.Runnable"]], | ||||||
|  |     ["implements", map[ | ||||||
|  |       ["run", |this| { | ||||||
|  |         for (var i = 0, i < result: length(), i = i + 1) { | ||||||
|  |           result: set(i, result: get(i) + 10) | ||||||
|  |         } | ||||||
|  |       }] | ||||||
|  |     ]] | ||||||
|  |   ] | ||||||
|  |   let runner = fabric: maker(conf): newInstance() | ||||||
|  |   runner: run() | ||||||
|  |   println("      result: " + result: toString()) | ||||||
|  |   println("serializable? " + (runner oftype java.io.Serializable.class)) | ||||||
|  |   println("    runnable? " + (runner oftype java.lang.Runnable.class)) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function main = |args| { | ||||||
|  |   let fabric = AdapterFabric() | ||||||
|  |   list_sample(fabric) | ||||||
|  |   runnable_sample(fabric) | ||||||
|  | } | ||||||
							
								
								
									
										84
									
								
								samples/Golo/async.golo
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										84
									
								
								samples/Golo/async.golo
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,84 @@ | |||||||
|  | # Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon) | ||||||
|  | #  | ||||||
|  | # 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. | ||||||
|  |  | ||||||
|  | module samples.AsyncHelpers | ||||||
|  |  | ||||||
|  | import gololang.Async | ||||||
|  | import java.util.concurrent.TimeUnit | ||||||
|  | import java.util.concurrent.Executors | ||||||
|  |  | ||||||
|  | local function fib = |n| { | ||||||
|  |   if n <= 1 { | ||||||
|  |     return n | ||||||
|  |   } else { | ||||||
|  |     return fib(n - 1) + fib(n - 2) | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function main = |args| { | ||||||
|  |  | ||||||
|  |   let executor = newCachedThreadPool() | ||||||
|  |   println("Let's do some useless asynchronous operations...") | ||||||
|  |  | ||||||
|  |   var f = executor: enqueue({ | ||||||
|  |     Thread.sleep(1000_L) | ||||||
|  |     return 666 | ||||||
|  |   }) | ||||||
|  |   f: | ||||||
|  |     onSet(|v| -> println(">>> #slow -> " + v)):  | ||||||
|  |     onFail(|e| -> println(">>> #fail -> " + e)) | ||||||
|  |   f: | ||||||
|  |     cancel(true) | ||||||
|  |  | ||||||
|  |   f = executor: enqueue({ | ||||||
|  |     Thread.sleep(1000_L) | ||||||
|  |     return 666 | ||||||
|  |   }) | ||||||
|  |   f: | ||||||
|  |     onSet(|v| -> println(">>> #ok -> " + v)):  | ||||||
|  |     onFail(|e| -> println(">>> #wtf? -> " + e)) | ||||||
|  |  | ||||||
|  |   let fib_10 = promise() | ||||||
|  |   let fib_20 = promise() | ||||||
|  |   let fib_30 = promise() | ||||||
|  |   let fib_40 = promise() | ||||||
|  |  | ||||||
|  |   let futures = [ | ||||||
|  |     fib_10: future(), fib_20: future(),  | ||||||
|  |     fib_30: future(), fib_40: future() | ||||||
|  |   ] | ||||||
|  |  | ||||||
|  |   executor: submit(-> fib_10: set(fib(10))) | ||||||
|  |   executor: submit(-> fib_20: set(fib(20))) | ||||||
|  |   executor: submit(-> fib_30: set(fib(30))) | ||||||
|  |   executor: submit(-> fib_40: set(fib(40))) | ||||||
|  |  | ||||||
|  |   all(futures): onSet(|results| -> println(">>> Fibs: " + results)) | ||||||
|  |  | ||||||
|  |   let truth = promise() | ||||||
|  |   truth:  | ||||||
|  |     future():  | ||||||
|  |     map(|v| -> "truth=" + v):  | ||||||
|  |     onSet(|v| -> executor: submit(-> println(">>> (another thread) " + v))): | ||||||
|  |     onSet(|v| -> println(">>> (same thread) " + v)) | ||||||
|  |   executor: submit({ | ||||||
|  |     Thread.sleep(500_L) | ||||||
|  |     truth: set(42) | ||||||
|  |   }) | ||||||
|  |    | ||||||
|  |   Thread.sleep(1000_L) | ||||||
|  |   executor: shutdown() | ||||||
|  |   executor: awaitTermination(2_L, SECONDS()) | ||||||
|  |   println("Bye!") | ||||||
|  | } | ||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user