mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	Compare commits
	
		
			652 Commits
		
	
	
		
			test/attri
			...
			v4.2.3
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 1d626f7378 | ||
|  | ff3438b810 | ||
|  | 1762c2cefd | ||
|  | 7aaf99c9b1 | ||
|  | 07cd9aa994 | ||
|  | 6ae4aa50e2 | ||
|  | 22fbcc244b | ||
|  | 70b1ec97db | ||
|  | a97e328484 | ||
|  | e446b86b90 | ||
|  | 901e8da911 | ||
|  | e9036d675e | ||
|  | 351e348ac0 | ||
|  | feea9bfd30 | ||
|  | f1282b857d | ||
|  | 70e0ce1d73 | ||
|  | a5673e7fb6 | ||
|  | d06529fd14 | ||
|  | a02f19f5a3 | ||
|  | a9a62fff15 | ||
|  | 7625c92307 | ||
|  | 7dd318ca76 | ||
|  | e5bc2845cd | ||
|  | 4ddd8d9d2b | ||
|  | 37ffdb9020 | ||
|  | 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 | ||
|  | 44eebde394 | ||
|  | 498c102414 | ||
|  | 79cd77454b | ||
|  | 410aace222 | ||
|  | 8cdb8ed48d | ||
|  | 417bf7e1c9 | ||
|  | 149f8967ad | ||
|  | e376fe921b | ||
|  | 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 | ||
|  | dad4b974b7 | ||
|  | c4b876472f | ||
|  | f1cb16648f | ||
|  | 1276f10b67 | ||
|  | c3da262bd0 | ||
|  | 2143699aab | ||
|  | b1c2820299 | ||
|  | 624fd74f83 | ||
|  | cd878522d9 | ||
|  | 5580f39df2 | ||
|  | 10fed43c27 | ||
|  | 1d50adf87a | ||
|  | 614a61b0b0 | ||
|  | bd380f44cc | ||
|  | 8a546d2a7a | ||
|  | 1148a9746a | ||
|  | 913cd6c309 | ||
|  | 492aa12cad | ||
|  | e79e45a74e | ||
|  | e661470bbb | ||
|  | af30a80702 | ||
|  | bab7ee4fcb | ||
|  | 6524ac3588 | ||
|  | c432cd67fc | ||
|  | 5c071a2e07 | ||
|  | cb10c53dee | ||
|  | dfba2a31a5 | ||
|  | 667f3de26b | ||
|  | fd585beb07 | ||
|  | d94bffb198 | ||
|  | 2beb450df6 | 
							
								
								
									
										9
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										9
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
								
							| @@ -1,9 +0,0 @@ | ||||
| Gemfile linguist-vendored=true | ||||
| lib/linguist.rb linguist-language=Java | ||||
| test/*.rb linguist-language=Java | ||||
| Rakefile linguist-generated | ||||
| test/fixtures/* linguist-vendored=false | ||||
| README.md linguist-documentation=false | ||||
| samples/Arduino/* linguist-documentation | ||||
| samples/Markdown/*.md linguist-detectable=true | ||||
| samples/HTML/*.html linguist-detectable=false | ||||
|   | ||||
							
								
								
									
										7
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										7
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -1,3 +1,6 @@ | ||||
| Gemfile.lock | ||||
| /Gemfile.lock | ||||
| .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 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 | ||||
|   - gem update --system 2.1.11 | ||||
| rvm: | ||||
|   - 1.9.3 | ||||
|   - 2.0.0 | ||||
|   - 2.1.1 | ||||
|   - 2.1 | ||||
|   - 2.2 | ||||
| notifications: | ||||
|   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' | ||||
| 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 | ||||
|  | ||||
| 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 | ||||
|  | ||||
| ### 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 | ||||
| [statistical | ||||
| @@ -24,7 +26,9 @@ See [lib/linguist/language.rb](https://github.com/github/linguist/blob/master/li | ||||
|  | ||||
| ### 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 | ||||
|  | ||||
| @@ -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: | ||||
|  | ||||
| ***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 | ||||
| project = Linguist::Repository.from_directory(".") | ||||
| project.language.name  #=> "Ruby" | ||||
| project.languages      #=> { "Ruby" => 0.98, "Shell" => 0.02 } | ||||
| require 'rugged' | ||||
| require 'linguist' | ||||
|  | ||||
| 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 | ||||
| `--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 | ||||
|  | ||||
|     Ruby: | ||||
|     linguist/blob_helper.rb | ||||
|     linguist/classifier.rb | ||||
|     linguist/file_blob.rb | ||||
|     linguist/generated.rb | ||||
|     linguist/heuristics.rb | ||||
|     linguist/language.rb | ||||
|     linguist/md5.rb | ||||
|     linguist/repository.rb | ||||
|     linguist/samples.rb | ||||
|     linguist/tokenizer.rb | ||||
|     linguist.rb | ||||
|     Gemfile | ||||
|     Rakefile | ||||
|     bin/linguist | ||||
|     github-linguist.gemspec | ||||
|     lib/linguist.rb | ||||
|     lib/linguist/blob_helper.rb | ||||
|     lib/linguist/classifier.rb | ||||
|     lib/linguist/file_blob.rb | ||||
|     lib/linguist/generated.rb | ||||
|     lib/linguist/heuristics.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 | ||||
|  | ||||
| @@ -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). | ||||
|  | ||||
| ## 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 | ||||
|  | ||||
| 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. | ||||
|  | ||||
| @@ -94,18 +147,6 @@ To run the tests: | ||||
|  | ||||
|     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 | ||||
|  | ||||
| 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. Bump gem version in `lib/linguist/version.rb`.  For example, [like this](https://github.com/github/linguist/commit/8d2ea90a5ba3b2fe6e1508b7155aa4632eea2985). | ||||
|  0. Make a PR to github/linguist.  For example, [#1238](https://github.com/github/linguist/pull/1238). | ||||
|  0. Build a local gem: `gem build github-linguist.gemspec` | ||||
|  0. Build a local gem: `bundle exec rake build_gem` | ||||
|  0. Testing: | ||||
|    0. Bump the Gemfile and Gemfile.lock versions for an app which relies on this gem | ||||
|    0. Install the new gem locally | ||||
|   | ||||
							
								
								
									
										107
									
								
								Rakefile
									
									
									
									
									
								
							
							
						
						
									
										107
									
								
								Rakefile
									
									
									
									
									
								
							| @@ -1,27 +1,103 @@ | ||||
| require 'json' | ||||
| require 'bundler/setup' | ||||
| require 'rake/clean' | ||||
| require 'rake/testtask' | ||||
| require 'yaml' | ||||
| require 'yajl' | ||||
|  | ||||
| task :default => :test | ||||
|  | ||||
| Rake::TestTask.new | ||||
|  | ||||
| task :samples do | ||||
|   require 'linguist/samples' | ||||
|   require 'yajl' | ||||
|   data = Linguist::Samples.data | ||||
|   json = Yajl::Encoder.encode(data, :pretty => true) | ||||
|   File.open('lib/linguist/samples.json', 'w') { |io| io.write json } | ||||
| # Extend test task to check for samples | ||||
| task :test => :check_samples | ||||
|  | ||||
| desc "Check that we have samples.json generated" | ||||
| task :check_samples do | ||||
|   unless File.exist?('lib/linguist/samples.json') | ||||
|     Rake::Task[:samples].invoke | ||||
|   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") | ||||
|   File.write("lib/linguist/languages.json", JSON.dump(languages)) | ||||
|   File.write("lib/linguist/languages.json", Yajl.dump(languages)) | ||||
|   `gem build github-linguist.gemspec` | ||||
|   File.delete("lib/linguist/languages.json") | ||||
| end | ||||
|  | ||||
| task :build_grammars_gem do | ||||
|   rm_rf "grammars" | ||||
|   sh "script/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 | ||||
|   LIMIT = 1_000 | ||||
|  | ||||
| @@ -37,7 +113,7 @@ namespace :classifier do | ||||
|       next if file_language.nil? || file_language == 'Text' | ||||
|       begin | ||||
|         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 | ||||
|         guessed_language == file_language ? correct += 1 : incorrect += 1 | ||||
| @@ -54,14 +130,12 @@ namespace :classifier do | ||||
|  | ||||
|   def each_public_gist | ||||
|     require 'open-uri' | ||||
|     require 'json' | ||||
|  | ||||
|     url = "https://api.github.com/gists/public" | ||||
|  | ||||
|     loop do | ||||
|       resp = open(url) | ||||
|       url = resp.meta['link'][/<([^>]+)>; rel="next"/, 1] | ||||
|       gists = JSON.parse(resp.read) | ||||
|       gists = Yajl.load(resp.read) | ||||
|  | ||||
|       for gist in gists | ||||
|         for filename, attrs in gist['files'] | ||||
| @@ -71,3 +145,10 @@ namespace :classifier do | ||||
|     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 | ||||
|   | ||||
							
								
								
									
										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.license  = "MIT" | ||||
|  | ||||
|   s.files = Dir['lib/**/*'] | ||||
|   s.files = Dir['lib/**/*'] - ['lib/linguist/grammars.rb'] | ||||
|   s.executables << 'linguist' | ||||
|  | ||||
|   s.add_dependency 'charlock_holmes', '~> 0.7.3' | ||||
|   s.add_dependency 'escape_utils',    '~> 1.0.1' | ||||
|   s.add_dependency 'mime-types',      '~> 1.19' | ||||
|   s.add_dependency 'pygments.rb',     '~> 0.6.0' | ||||
|   s.add_dependency 'rugged',          '~> 0.21.0' | ||||
|   s.add_dependency 'mime-types',      '>= 1.19' | ||||
|   s.add_dependency 'rugged',          '~> 0.22.0b4' | ||||
|  | ||||
|   s.add_development_dependency 'json' | ||||
|   s.add_development_dependency 'mocha' | ||||
|   s.add_development_dependency 'pry' | ||||
|   s.add_development_dependency 'rake' | ||||
|   s.add_development_dependency 'yajl-ruby' | ||||
| 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/repository' | ||||
| require 'linguist/samples' | ||||
| require 'linguist/shebang' | ||||
| require 'linguist/version' | ||||
|   | ||||
| @@ -2,7 +2,6 @@ require 'linguist/generated' | ||||
| require 'charlock_holmes' | ||||
| require 'escape_utils' | ||||
| require 'mime/types' | ||||
| require 'pygments' | ||||
| require 'yaml' | ||||
|  | ||||
| module Linguist | ||||
| @@ -147,6 +146,13 @@ module Linguist | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     # Public: Is the blob empty? | ||||
|     # | ||||
|     # Return true or false | ||||
|     def empty? | ||||
|       data.nil? || data == "" | ||||
|     end | ||||
|  | ||||
|     # Public: Is the blob text? | ||||
|     # | ||||
|     # Return true or false | ||||
| @@ -193,10 +199,6 @@ module Linguist | ||||
|  | ||||
|     # 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 | ||||
|     def safe_to_colorize? | ||||
|       !large? && text? && !high_ratio_of_long_lines? | ||||
| @@ -204,9 +206,6 @@ module Linguist | ||||
|  | ||||
|     # 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 | ||||
|     def high_ratio_of_long_lines? | ||||
|       return false if loc == 0 | ||||
| @@ -314,23 +313,9 @@ module Linguist | ||||
|       @language ||= Language.detect(self) | ||||
|     end | ||||
|  | ||||
|     # Internal: Get the lexer of the blob. | ||||
|     # | ||||
|     # Returns a Lexer. | ||||
|     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) | ||||
|     # Internal: Get the TextMate compatible scope for the blob | ||||
|     def tm_scope | ||||
|       language && language.tm_scope | ||||
|     end | ||||
|   end | ||||
| end | ||||
|   | ||||
| @@ -3,6 +3,25 @@ require 'linguist/tokenizer' | ||||
| module Linguist | ||||
|   # Language bayesian 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. | ||||
|     # | ||||
|     # db       - Hash classifier database object | ||||
|   | ||||
| @@ -57,14 +57,20 @@ module Linguist | ||||
|     # | ||||
|     # Returns a String. | ||||
|     def extension | ||||
|       # File.extname returns nil if the filename is an extension. | ||||
|       extension = File.extname(name) | ||||
|       basename = File.basename(name) | ||||
|       # Checks if the filename is an extension. | ||||
|       if extension.empty? && basename[0] == "." | ||||
|         basename | ||||
|       else | ||||
|         extension | ||||
|       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 | ||||
|   | ||||
| @@ -51,25 +51,25 @@ module Linguist | ||||
|     # | ||||
|     # Return true or false | ||||
|     def generated? | ||||
|       name == 'Gemfile.lock' || | ||||
|         minified_files? || | ||||
|         compiled_coffeescript? || | ||||
|         xcode_file? || | ||||
|         generated_parser? || | ||||
|         generated_net_docfile? || | ||||
|         generated_net_designer_file? || | ||||
|         generated_postscript? || | ||||
|         generated_protocol_buffer? || | ||||
|         generated_jni_header? || | ||||
|         composer_lock? || | ||||
|         node_modules? || | ||||
|         vcr_cassette? || | ||||
|         generated_by_zephir? | ||||
|       minified_files? || | ||||
|       compiled_coffeescript? || | ||||
|       xcode_file? || | ||||
|       generated_parser? || | ||||
|       generated_net_docfile? || | ||||
|       generated_net_designer_file? || | ||||
|       generated_postscript? || | ||||
|       generated_protocol_buffer? || | ||||
|       generated_jni_header? || | ||||
|       composer_lock? || | ||||
|       node_modules? || | ||||
|       godeps? || | ||||
|       vcr_cassette? || | ||||
|       generated_by_zephir? | ||||
|     end | ||||
|  | ||||
|     # Internal: Is the blob an Xcode file? | ||||
|     # | ||||
|     # Generated if the file extension is an Xcode  | ||||
|     # Generated if the file extension is an Xcode | ||||
|     # file extension. | ||||
|     # | ||||
|     # Returns true of false. | ||||
| @@ -231,6 +231,14 @@ module Linguist | ||||
|       !!name.match(/node_modules\//) | ||||
|     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? | ||||
|     # | ||||
|     # Returns true or false. | ||||
| @@ -256,4 +264,3 @@ module Linguist | ||||
|     end | ||||
|   end | ||||
| end | ||||
|  | ||||
|   | ||||
							
								
								
									
										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,79 +1,160 @@ | ||||
| module Linguist | ||||
|   # A collection of simple heuristics that can be used to better analyze languages. | ||||
|   class Heuristics | ||||
|     ACTIVE = true | ||||
|     # 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, | ||||
|     # apply heuristics against the given data and return an array | ||||
|     # of matching languages, or nil. | ||||
|       @heuristics.each do |heuristic| | ||||
|         return Array(heuristic.call(data)) if heuristic.matches?(languages) | ||||
|       end | ||||
|  | ||||
|       [] # No heuristics matched | ||||
|     end | ||||
|  | ||||
|     # Internal: Define a new heuristic. | ||||
|     # | ||||
|     # data      - Array of tokens or String data to analyze. | ||||
|     # languages - Array of language name Strings to restrict to. | ||||
|     # languages - String names of languages to disambiguate. | ||||
|     # heuristic - Block which takes data as an argument and returns a Language or nil. | ||||
|     # | ||||
|     # Returns an array of Languages or [] | ||||
|     def self.find_by_heuristics(data, languages) | ||||
|       if active? | ||||
|         if languages.all? { |l| ["Perl", "Prolog"].include?(l) } | ||||
|           result = disambiguate_pl(data, languages) | ||||
|         end | ||||
|         if languages.all? { |l| ["ECL", "Prolog"].include?(l) } | ||||
|           result = disambiguate_ecl(data, languages) | ||||
|         end | ||||
|         return result | ||||
|     # Examples | ||||
|     # | ||||
|     #     disambiguate "Perl", "Prolog" do |data| | ||||
|     #       if data.include?("use strict") | ||||
|     #         Language["Perl"] | ||||
|     #       elsif data.include?(":-") | ||||
|     #         Language["Prolog"] | ||||
|     #       end | ||||
|     #     end | ||||
|     # | ||||
|     def self.disambiguate(*languages, &heuristic) | ||||
|       @heuristics << new(languages, &heuristic) | ||||
|     end | ||||
|  | ||||
|     # Internal: Array of defined heuristics | ||||
|     @heuristics = [] | ||||
|  | ||||
|     # Internal | ||||
|     def initialize(languages, &heuristic) | ||||
|       @languages = languages | ||||
|       @heuristic = heuristic | ||||
|     end | ||||
|  | ||||
|     # Internal: Check if this heuristic matches the candidate languages. | ||||
|     def matches?(candidates) | ||||
|       candidates.any? && 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 | ||||
|  | ||||
|     # .h extensions are ambigious between C, C++, and Objective-C. | ||||
|     # We want to shortcut look for Objective-C _and_ now C++ too! | ||||
|     # | ||||
|     # Returns an array of Languages or [] | ||||
|     def self.disambiguate_c(data, languages) | ||||
|       matches = [] | ||||
|       matches << Language["Objective-C"] if data.include?("@interface") | ||||
|       matches << Language["C++"] if data.include?("#include <cstdint>") | ||||
|       matches | ||||
|     disambiguate "Perl", "Perl6", "Prolog" do |data| | ||||
|       if data.include?("use v6") | ||||
|         Language["Perl6"] | ||||
|       elsif data.include?("use strict") | ||||
|         Language["Perl"] | ||||
|       elsif data.include?(":-") | ||||
|         Language["Prolog"] | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     def self.disambiguate_pl(data, languages) | ||||
|       matches = [] | ||||
|       matches << Language["Prolog"] if data.include?(":-") | ||||
|       matches << Language["Perl"] if data.include?("use strict") | ||||
|       matches | ||||
|     disambiguate "ECL", "Prolog" do |data| | ||||
|       if data.include?(":-") | ||||
|         Language["Prolog"] | ||||
|       elsif data.include?(":=") | ||||
|         Language["ECL"] | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     def self.disambiguate_ecl(data, languages) | ||||
|       matches = [] | ||||
|       matches << Language["Prolog"] if data.include?(":-") | ||||
|       matches << Language["ECL"] if data.include?(":=") | ||||
|       matches | ||||
|     end | ||||
|  | ||||
|     def self.disambiguate_ts(data, languages) | ||||
|       matches = [] | ||||
|       if (data.include?("</translation>")) | ||||
|         matches << Language["XML"] | ||||
|     disambiguate "IDL", "Prolog" do |data| | ||||
|       if data.include?(":-") | ||||
|         Language["Prolog"] | ||||
|       else | ||||
|         matches << Language["TypeScript"] | ||||
|         Language["IDL"] | ||||
|       end | ||||
|       matches | ||||
|     end | ||||
|  | ||||
|     def self.disambiguate_cl(data, languages) | ||||
|       matches = [] | ||||
|       matches << Language["Common Lisp"] if data.include?("(defun ") | ||||
|       matches << Language["OpenCL"] if /\/\* |\/\/ |^\}/.match(data) | ||||
|       matches | ||||
|     disambiguate "Common Lisp", "OpenCL", "Cool" do |data| | ||||
|       if data.include?("(defun ") | ||||
|         Language["Common Lisp"] | ||||
|       elsif /^class/x.match(data) | ||||
|         Language["Cool"] | ||||
|       elsif /\/\* |\/\/ |^\}/.match(data) | ||||
|         Language["OpenCL"] | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     def self.disambiguate_r(data, languages) | ||||
|       matches = [] | ||||
|       matches << Language["Rebol"] if /\bRebol\b/i.match(data) | ||||
|       matches << Language["R"] if data.include?("<-") | ||||
|       matches | ||||
|     disambiguate "Hack", "PHP" do |data| | ||||
|       if data.include?("<?hh") | ||||
|         Language["Hack"] | ||||
|       elsif /<?[^h]/.match(data) | ||||
|         Language["PHP"] | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     def self.active? | ||||
|       !!ACTIVE | ||||
|     disambiguate "Scala", "SuperCollider" do |data| | ||||
|       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 | ||||
|  | ||||
|     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 /^\s*(#light|import|let|module|namespace|open|type)/.match(data) | ||||
|         Language["F#"] | ||||
|       elsif /^\s*(#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 | ||||
|   | ||||
| @@ -1,8 +1,7 @@ | ||||
| require 'escape_utils' | ||||
| require 'pygments' | ||||
| require 'yaml' | ||||
| begin | ||||
|   require 'json' | ||||
|   require 'yajl' | ||||
| rescue LoadError | ||||
| end | ||||
|  | ||||
| @@ -11,6 +10,8 @@ require 'linguist/heuristics' | ||||
| require 'linguist/samples' | ||||
| require 'linguist/file_blob' | ||||
| require 'linguist/blob_helper' | ||||
| require 'linguist/strategy/filename' | ||||
| require 'linguist/shebang' | ||||
|  | ||||
| module Linguist | ||||
|   # Language names that are recognizable by GitHub. Defined languages | ||||
| @@ -62,7 +63,7 @@ module Linguist | ||||
|       end | ||||
|  | ||||
|       # 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| | ||||
|         # All Language aliases should be unique. Raise if there is a duplicate. | ||||
| @@ -70,7 +71,7 @@ module Linguist | ||||
|           raise ArgumentError, "Duplicate alias: #{name}" | ||||
|         end | ||||
|  | ||||
|         @index[name] = @alias_index[name] = language | ||||
|         @index[name.downcase] = @alias_index[name.downcase] = language | ||||
|       end | ||||
|  | ||||
|       language.extensions.each do |extension| | ||||
| @@ -92,6 +93,13 @@ module Linguist | ||||
|       language | ||||
|     end | ||||
|  | ||||
|     STRATEGIES = [ | ||||
|       Linguist::Strategy::Filename, | ||||
|       Linguist::Shebang, | ||||
|       Linguist::Heuristics, | ||||
|       Linguist::Classifier | ||||
|     ] | ||||
|  | ||||
|     # Public: Detects the Language of the blob. | ||||
|     # | ||||
|     # blob - an object that includes the Linguist `BlobHelper` interface; | ||||
| @@ -99,51 +107,22 @@ module Linguist | ||||
|     # | ||||
|     # Returns Language or nil. | ||||
|     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 | ||||
|       # test that uses the extension name to guess a binary binary mime type. | ||||
|       # | ||||
|       # We'll perform a more comprehensive test later which actually involves | ||||
|       # looking for binary characters in the blob | ||||
|       return nil if blob.likely_binary? || blob.binary? | ||||
|  | ||||
|       # A bit of an elegant hack. If the file is executable but extensionless, | ||||
|       # append a "magic" extension so it can be classified with other | ||||
|       # languages that have shebang scripts. | ||||
|       extension = FileBlob.new(name).extension | ||||
|       if extension.empty? && blob.mode && (blob.mode.to_i(8) & 05) == 05 | ||||
|         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 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]] | ||||
|       # Call each strategy until one candidate is returned. | ||||
|       STRATEGIES.reduce([]) do |languages, strategy| | ||||
|         candidates = strategy.call(blob, languages) | ||||
|         if candidates.size == 1 | ||||
|           return candidates.first | ||||
|         elsif candidates.size > 1 | ||||
|           # More than one candidate was found, pass them to the next strategy. | ||||
|           candidates | ||||
|         else | ||||
|           # No candiates were found, pass on languages from the previous strategy. | ||||
|           languages | ||||
|         end | ||||
|       else | ||||
|         # Simplest and most common case, we can just return the one match based on extension | ||||
|         possible_languages.first | ||||
|       end | ||||
|       end.first | ||||
|     end | ||||
|  | ||||
|     # Public: Get all Languages | ||||
| @@ -164,7 +143,7 @@ module Linguist | ||||
|     # | ||||
|     # Returns the Language or nil if none was found. | ||||
|     def self.find_by_name(name) | ||||
|       @name_index[name] | ||||
|       name && @name_index[name.downcase] | ||||
|     end | ||||
|  | ||||
|     # Public: Look up Language by one of its aliases. | ||||
| @@ -178,7 +157,7 @@ module Linguist | ||||
|     # | ||||
|     # Returns the Lexer or nil if none was found. | ||||
|     def self.find_by_alias(name) | ||||
|       @alias_index[name] | ||||
|       name && @alias_index[name.downcase] | ||||
|     end | ||||
|  | ||||
|     # Public: Look up Languages by filename. | ||||
| @@ -193,26 +172,53 @@ module Linguist | ||||
|     # Returns all matching Languages or [] if none were found. | ||||
|     def self.find_by_filename(filename) | ||||
|       basename = File.basename(filename) | ||||
|       extname = FileBlob.new(filename).extension | ||||
|       langs = @filename_index[basename] + | ||||
|               @extension_index[extname] | ||||
|       langs.compact.uniq | ||||
|  | ||||
|       # find the first extension with language definitions | ||||
|       extname = FileBlob.new(filename).extensions.detect do |e| | ||||
|         !@extension_index[e].empty? | ||||
|       end | ||||
|  | ||||
|       (@filename_index[basename] + @extension_index[extname]).compact.uniq | ||||
|     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 | ||||
|     # | ||||
|     #   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">] | ||||
|     # | ||||
|     # Returns the matching Language | ||||
|     def self.find_by_shebang(data) | ||||
|       @interpreter_index[Linguist.interpreter_from_shebang(data)] | ||||
|     def self.find_by_interpreter(interpreter) | ||||
|       @interpreter_index[interpreter] | ||||
|     end | ||||
|  | ||||
|  | ||||
|     # Public: Look up Language by its name or lexer. | ||||
|     # | ||||
|     # name - The String name of the Language | ||||
| @@ -227,7 +233,7 @@ module Linguist | ||||
|     # | ||||
|     # Returns the Language or nil if none was found. | ||||
|     def self.[](name) | ||||
|       @index[name] | ||||
|       name && @index[name.downcase] | ||||
|     end | ||||
|  | ||||
|     # Public: A List of popular languages | ||||
| @@ -286,9 +292,16 @@ module Linguist | ||||
|       # Set aliases | ||||
|       @aliases = [default_alias_name] + (attributes[:aliases] || []) | ||||
|  | ||||
|       # Lookup Lexer object | ||||
|       @lexer = Pygments::Lexer.find_by_name(attributes[:lexer] || name) || | ||||
|         raise(ArgumentError, "#{@name} is missing lexer") | ||||
|       # Load the TextMate scope name or try to guess one | ||||
|       @tm_scope = attributes[:tm_scope] || begin | ||||
|         context = case @type | ||||
|                   when :data, :markup, :prose | ||||
|                     'text' | ||||
|                   when :programming, nil | ||||
|                     'source' | ||||
|                   end | ||||
|         "#{context}.#{@name.downcase}" | ||||
|       end | ||||
|  | ||||
|       @ace_mode = attributes[:ace_mode] | ||||
|       @wrap = attributes[:wrap] || false | ||||
| @@ -363,6 +376,11 @@ module Linguist | ||||
|     # Returns the Lexer | ||||
|     attr_reader :lexer | ||||
|  | ||||
|     # Public: Get the name of a TextMate-compatible scope | ||||
|     # | ||||
|     # Returns the scope | ||||
|     attr_reader :tm_scope | ||||
|  | ||||
|     # Public: Get Ace mode | ||||
|     # | ||||
|     # Examples | ||||
| @@ -406,11 +424,6 @@ module Linguist | ||||
|     # Returns the extensions Array | ||||
|     attr_reader :filenames | ||||
|  | ||||
|     # Public: Return all possible extensions for language | ||||
|     def all_extensions | ||||
|       (extensions + [primary_extension]).uniq | ||||
|     end | ||||
|  | ||||
|     # Deprecated: Get primary extension | ||||
|     # | ||||
|     # Defaults to the first extension but can be overridden | ||||
| @@ -510,16 +523,16 @@ module Linguist | ||||
|     end | ||||
|   end | ||||
|  | ||||
|   extensions = Samples::DATA['extnames'] | ||||
|   interpreters = Samples::DATA['interpreters'] | ||||
|   filenames = Samples::DATA['filenames'] | ||||
|   extensions = Samples.cache['extnames'] | ||||
|   interpreters = Samples.cache['interpreters'] | ||||
|   filenames = Samples.cache['filenames'] | ||||
|   popular = YAML.load_file(File.expand_path("../popular.yml", __FILE__)) | ||||
|  | ||||
|   languages_yml = File.expand_path("../languages.yml", __FILE__) | ||||
|   languages_json = File.expand_path("../languages.json", __FILE__) | ||||
|  | ||||
|   if File.exist?(languages_json) && defined?(JSON) | ||||
|     languages = JSON.load(File.read(languages_json)) | ||||
|   if File.exist?(languages_json) && defined?(Yajl) | ||||
|     languages = Yajl.load(File.read(languages_json)) | ||||
|   else | ||||
|     languages = YAML.load_file(languages_yml) | ||||
|   end | ||||
| @@ -564,12 +577,13 @@ module Linguist | ||||
|       :type              => options['type'], | ||||
|       :aliases           => options['aliases'], | ||||
|       :lexer             => options['lexer'], | ||||
|       :tm_scope          => options['tm_scope'], | ||||
|       :ace_mode          => options['ace_mode'], | ||||
|       :wrap              => options['wrap'], | ||||
|       :group_name        => options['group'], | ||||
|       :searchable        => options.key?('searchable') ? options['searchable'] : true, | ||||
|       :searchable        => options.fetch('searchable', true), | ||||
|       :search_term       => options['search_term'], | ||||
|       :extensions        => [options['extensions'].first] + options['extensions'][1..-1].sort, | ||||
|       :extensions        => Array(options['extensions']), | ||||
|       :interpreters      => options['interpreters'].sort, | ||||
|       :filenames         => options['filenames'], | ||||
|       :popular           => popular.include?(name) | ||||
|   | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,8 +1,13 @@ | ||||
| require 'linguist/blob_helper' | ||||
| require 'linguist/language' | ||||
| require 'rugged' | ||||
|  | ||||
| module Linguist | ||||
|   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 | ||||
|  | ||||
|     MAX_SIZE = 128 * 1024 | ||||
| @@ -19,6 +24,29 @@ module Linguist | ||||
|       @mode = mode | ||||
|     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 | ||||
|       load_blob! | ||||
|       @data | ||||
| @@ -30,6 +58,12 @@ module Linguist | ||||
|     end | ||||
|  | ||||
|     protected | ||||
|  | ||||
|     # Returns true if the attribute is present and not the string "false". | ||||
|     def boolean_attribute(attr) | ||||
|       attr != "false" | ||||
|     end | ||||
|  | ||||
|     def load_blob! | ||||
|       @data, @size = Rugged::Blob.to_buffer(repository, oid, MAX_SIZE) if @data.nil? | ||||
|     end | ||||
|   | ||||
| @@ -110,18 +110,37 @@ module Linguist | ||||
|         if @old_commit_oid == @commit_oid | ||||
|           @old_stats | ||||
|         else | ||||
|           compute_stats(@old_commit_oid, @commit_oid, @old_stats) | ||||
|           compute_stats(@old_commit_oid, @old_stats) | ||||
|         end | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     protected | ||||
|     def compute_stats(old_commit_oid, commit_oid, cache = nil) | ||||
|       file_map = cache ? cache.dup : {} | ||||
|       old_tree = old_commit_oid && Rugged::Commit.lookup(repository, old_commit_oid).tree | ||||
|       new_tree = Rugged::Commit.lookup(repository, commit_oid).tree | ||||
|     def read_index | ||||
|       attr_index = Rugged::Index.new | ||||
|       attr_index.read_tree(current_tree) | ||||
|       repository.index = attr_index | ||||
|     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| | ||||
|         old = delta.old_file[:path] | ||||
|   | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,11 +1,12 @@ | ||||
| begin | ||||
|   require 'json' | ||||
|   require 'yajl' | ||||
| rescue LoadError | ||||
|   require 'yaml' | ||||
| end | ||||
|  | ||||
| require 'linguist/md5' | ||||
| require 'linguist/classifier' | ||||
| require 'linguist/shebang' | ||||
|  | ||||
| module Linguist | ||||
|   # Model for accessing classifier training data. | ||||
| @@ -17,9 +18,11 @@ module Linguist | ||||
|     PATH = File.expand_path('../samples.json', __FILE__) | ||||
|  | ||||
|     # Hash of serialized samples object | ||||
|     if File.exist?(PATH) | ||||
|       serializer = defined?(JSON) ? JSON : YAML | ||||
|       DATA = serializer.load(File.read(PATH)) | ||||
|     def self.cache | ||||
|       @cache ||= begin | ||||
|         serializer = defined?(Yajl) ? Yajl : YAML | ||||
|         serializer.load(File.read(PATH)) | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     # Public: Iterate over each sample. | ||||
| @@ -50,14 +53,16 @@ module Linguist | ||||
|               }) | ||||
|             end | ||||
|           else | ||||
|             path = File.join(dirname, 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 | ||||
|  | ||||
|             yield({ | ||||
|               :path     => File.join(dirname, filename), | ||||
|               :path     => path, | ||||
|               :language => category, | ||||
|               :interpreter => File.exist?(filename) ? Linguist.interpreter_from_shebang(File.read(filename)) : nil, | ||||
|               :interpreter => Shebang.interpreter(File.read(path)), | ||||
|               :extname  => File.extname(filename) | ||||
|             }) | ||||
|           end | ||||
| @@ -110,40 +115,4 @@ module Linguist | ||||
|       db | ||||
|     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 | ||||
|   | ||||
							
								
								
									
										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,19 @@ | ||||
| # Erlang bundles | ||||
| - ^rebar$ | ||||
|  | ||||
| # Bootstrap minified css and js | ||||
| - (^|/)bootstrap([^.]*)(\.min)?\.(js|css)$ | ||||
| # Go dependencies | ||||
| - Godeps/_workspace/ | ||||
|  | ||||
| # Minified JavaScript and CSS | ||||
| - (\.|-)min\.(js|css)$ | ||||
|  | ||||
| # Bootstrap css and js | ||||
| - (^|/)bootstrap([^.]*)\.(js|css)$ | ||||
|  | ||||
| # Font Awesome | ||||
| - font-awesome.min.css | ||||
| - font-awesome.css | ||||
|  | ||||
| # Foundation css | ||||
| - foundation.min.css | ||||
| - foundation.css | ||||
|  | ||||
| # Normalize.css | ||||
| @@ -53,7 +57,6 @@ | ||||
|  | ||||
| # Animate.css | ||||
| - animate.css | ||||
| - animate.min.css | ||||
|  | ||||
| # Vendored dependencies | ||||
| - third[-_]?party/ | ||||
| @@ -70,12 +73,12 @@ | ||||
| ## Commonly Bundled JavaScript frameworks ## | ||||
|  | ||||
| # jQuery | ||||
| - (^|/)jquery([^.]*)(\.min)?\.js$ | ||||
| - (^|/)jquery\-\d\.\d+(\.\d+)?(\.min)?\.js$ | ||||
| - (^|/)jquery([^.]*)\.js$ | ||||
| - (^|/)jquery\-\d\.\d+(\.\d+)?\.js$ | ||||
|  | ||||
| # jQuery UI | ||||
| - (^|/)jquery\-ui(\-\d\.\d+(\.\d+)?)?(\.\w+)?(\.min)?\.(js|css)$ | ||||
| - (^|/)jquery\.(ui|effects)\.([^.]*)(\.min)?\.(js|css)$ | ||||
| - (^|/)jquery\-ui(\-\d\.\d+(\.\d+)?)?(\.\w+)?\.(js|css)$ | ||||
| - (^|/)jquery\.(ui|effects)\.([^.]*)\.(js|css)$ | ||||
|  | ||||
| # Prototype | ||||
| - (^|/)prototype(.*)\.js$ | ||||
| @@ -107,27 +110,32 @@ | ||||
| # MathJax | ||||
| - (^|/)MathJax/ | ||||
|  | ||||
| # Chart.js | ||||
| - (^|/)Chart\.js$ | ||||
|  | ||||
| # Codemirror | ||||
| - (^|/)[Cc]ode[Mm]irror/(lib|mode|theme|addon|keymap) | ||||
|  | ||||
| # SyntaxHighlighter - http://alexgorbatchev.com/ | ||||
| - (^|/)shBrush([^.]*)\.js$ | ||||
| - (^|/)shCore\.js$ | ||||
| - (^|/)shLegacy\.js$ | ||||
|  | ||||
| # AngularJS | ||||
| - (^|/)angular([^.]*)(\.min)?\.js$ | ||||
| - (^|/)angular([^.]*)\.js$ | ||||
|  | ||||
| # D3.js | ||||
| - (^|\/)d3(\.v\d+)?([^.]*)(\.min)?\.js$ | ||||
| - (^|\/)d3(\.v\d+)?([^.]*)\.js$ | ||||
|  | ||||
| # React | ||||
| - (^|/)react(-[^.]*)?(\.min)?\.js$ | ||||
| - (^|/)react(-[^.]*)?\.js$ | ||||
|  | ||||
| # Modernizr | ||||
| - (^|/)modernizr\-\d\.\d+(\.\d+)?(\.min)?\.js$ | ||||
| - (^|/)modernizr\-\d\.\d+(\.\d+)?\.js$ | ||||
| - (^|/)modernizr\.custom\.\d+\.js$ | ||||
|  | ||||
| # Knockout | ||||
| - (^|/)knockout-(\d+\.){3}(debug\.)?js$ | ||||
| - knockout-min.js | ||||
|  | ||||
| ## Python ## | ||||
|  | ||||
| @@ -165,8 +173,8 @@ | ||||
| - \.intellisense\.js$ | ||||
|  | ||||
| # jQuery validation plugin (MS bundles this with asp.net mvc) | ||||
| - (^|/)jquery([^.]*)\.validate(\.unobtrusive)?(\.min)?\.js$ | ||||
| - (^|/)jquery([^.]*)\.unobtrusive\-ajax(\.min)?\.js$ | ||||
| - (^|/)jquery([^.]*)\.validate(\.unobtrusive)?\.js$ | ||||
| - (^|/)jquery([^.]*)\.unobtrusive\-ajax\.js$ | ||||
|  | ||||
| # Microsoft Ajax | ||||
| - (^|/)[Mm]icrosoft([Mm]vc)?([Aa]jax|[Vv]alidation)(\.debug)?\.js$ | ||||
| @@ -193,7 +201,7 @@ | ||||
| - (^|/)extjs/welcome/ | ||||
|  | ||||
| # Html5shiv | ||||
| - (^|/)html5shiv(\.min)?\.js$ | ||||
| - (^|/)html5shiv\.js$ | ||||
|  | ||||
| # Samples folders | ||||
| - ^[Ss]amples/ | ||||
| @@ -212,8 +220,8 @@ | ||||
| - ^[Tt]est/fixtures/ | ||||
|  | ||||
| # PhoneGap/Cordova | ||||
| - (^|/)cordova([^.]*)(\.min)?\.js$ | ||||
| - (^|/)cordova\-\d\.\d(\.\d)?(\.min)?\.js$ | ||||
| - (^|/)cordova([^.]*)\.js$ | ||||
| - (^|/)cordova\-\d\.\d(\.\d)?\.js$ | ||||
|  | ||||
| # Foundation js | ||||
| - foundation(\..*)?\.js$ | ||||
| @@ -224,14 +232,18 @@ | ||||
| # .DS_Store's | ||||
| - .[Dd][Ss]_[Ss]tore$ | ||||
|  | ||||
| # Mercury --use-subdirs | ||||
| - Mercury/ | ||||
|  | ||||
| # R packages | ||||
| - ^vignettes/ | ||||
| - ^inst/extdata/ | ||||
|  | ||||
| # Octicons | ||||
| - octicons.css | ||||
| - octicons.min.css | ||||
| - sprockets-octicons.scss | ||||
|  | ||||
| # Typesafe Activator | ||||
| - (^|/)activator$ | ||||
| - (^|/)activator\.bat$ | ||||
|  | ||||
| # ProGuard | ||||
| - proguard.pro | ||||
| - proguard-rules.pro | ||||
|   | ||||
| @@ -1,3 +1,3 @@ | ||||
| module Linguist | ||||
|   VERSION = "3.1.5" | ||||
|   VERSION = "4.2.3" | ||||
| 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" | ||||
|   } | ||||
| } | ||||
							
								
								
									
										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 | ||||
							
								
								
									
										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 | ||||
							
								
								
									
										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" | ||||
| by  "Enrique" | ||||
| "Test function for Ceylon" | ||||
| by ("Enrique") | ||||
| shared void test() { | ||||
|   print("test"); | ||||
|     print("test"); | ||||
| } | ||||
|  | ||||
| doc "Test class for Ceylon" | ||||
| "Test class for Ceylon" | ||||
| shared class Test(name) satisfies Comparable<Test> { | ||||
|     shared String name; | ||||
|     shared actual String string = "Test " name "."; | ||||
|     shared actual String string = "Test ``name``."; | ||||
|  | ||||
|     shared actual Comparison compare(Test other) { | ||||
|         return name<=>other.name; | ||||
|   | ||||
							
								
								
									
										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) _ _ = [] | ||||
|  | ||||
							
								
								
									
										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> | ||||
							
								
								
									
										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") | ||||
|     }; | ||||
| }; | ||||
							
								
								
									
										49
									
								
								samples/F#/Combinators.fs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								samples/F#/Combinators.fs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,49 @@ | ||||
| namespace Nessos.FsPickler.Combinators | ||||
|  | ||||
|     open Nessos.FsPickler | ||||
|     open Nessos.FsPickler.Json | ||||
|  | ||||
|     /// Json pickling methods | ||||
|     [<RequireQualifiedAccess>] | ||||
|     module Json = | ||||
|  | ||||
|         let private jsonSerializer = lazy(FsPickler.CreateJson(omitHeader = true)) | ||||
|  | ||||
|         /// <summary> | ||||
|         ///     Pickles a value to Json. | ||||
|         /// </summary> | ||||
|         /// <param name="pickler">utilized pickler.</param> | ||||
|         /// <param name="value">input value.</param> | ||||
|         let pickle (pickler : Pickler<'T>) (value : 'T) : string = | ||||
|             jsonSerializer.Value.PickleToString (pickler, value) | ||||
|  | ||||
|         /// <summary> | ||||
|         ///     Unpickles a value from Json. | ||||
|         /// </summary> | ||||
|         /// <param name="pickler">utilized pickler.</param> | ||||
|         /// <param name="pickle">input pickle.</param> | ||||
|         let unpickle (pickler : Pickler<'T>) (pickle : string) : 'T = | ||||
|             jsonSerializer.Value.UnPickleOfString (pickler, pickle) | ||||
|  | ||||
|  | ||||
|     /// Bson pickling methods | ||||
|     [<RequireQualifiedAccess>] | ||||
|     module Bson = | ||||
|  | ||||
|         let private bsonPickler = lazy(FsPickler.CreateBson()) | ||||
|  | ||||
|         /// <summary> | ||||
|         ///     Pickles a value to Bson. | ||||
|         /// </summary> | ||||
|         /// <param name="pickler">utilized pickler.</param> | ||||
|         /// <param name="value">input value.</param> | ||||
|         let pickle (pickler : Pickler<'T>) (value : 'T) : byte [] = | ||||
|             bsonPickler.Value.Pickle (pickler, value) | ||||
|  | ||||
|         /// <summary> | ||||
|         ///     Unpickles a value from bson. | ||||
|         /// </summary> | ||||
|         /// <param name="pickler">utilized pickler.</param> | ||||
|         /// <param name="pickle">input pickle.</param> | ||||
|         let unpickle (pickler : Pickler<'T>) (pickle : byte []) : 'T = | ||||
|             bsonPickler.Value.UnPickle (pickler, pickle) | ||||
							
								
								
									
										65
									
								
								samples/F#/JsonFormat.fs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								samples/F#/JsonFormat.fs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,65 @@ | ||||
| namespace Nessos.FsPickler.Json | ||||
|  | ||||
|     open System | ||||
|     open System.IO | ||||
|     open System.Text | ||||
|  | ||||
|     open Newtonsoft.Json | ||||
|  | ||||
|     open Nessos.FsPickler | ||||
|  | ||||
|     /// <summary> | ||||
|     ///     Factory methods for the Json serialization format. | ||||
|     /// </summary> | ||||
|     type JsonPickleFormatProvider internal (indent, omitHeader) as self = | ||||
|  | ||||
|         let isCustomSeq isTopLevelSequence =  | ||||
|             isTopLevelSequence && self.OmitHeader && self.UseCustomTopLevelSequenceSeparator | ||||
|  | ||||
|         let mutable sequenceSeparator = " " | ||||
|  | ||||
|         member val Indent = indent with get,set | ||||
|         member val OmitHeader = omitHeader with get,set | ||||
|         member val UseCustomTopLevelSequenceSeparator = false with get,set | ||||
|  | ||||
|         member __.SequenceSeparator | ||||
|             with get () = sequenceSeparator | ||||
|             and set sep = | ||||
|                 if sep <> null && String.IsNullOrWhiteSpace sep then | ||||
|                     sequenceSeparator <- sep | ||||
|                 else | ||||
|                     invalidArg "SequenceSeparator" "should be non-null whitespace." | ||||
|  | ||||
|         interface ITextPickleFormatProvider with | ||||
|             member __.Name = "Json" | ||||
|  | ||||
|             // see discussion : https://github.com/nessos/FsPickler/issues/17 | ||||
|             member __.DefaultEncoding = new UTF8Encoding(false) :> Encoding | ||||
|  | ||||
|             member __.CreateWriter (stream, encoding, isTopLevelSequence, leaveOpen) = | ||||
| #if NET40 | ||||
|                 if leaveOpen then raise <| new NotSupportedException("'leaveOpen' not supported in .NET 40.") | ||||
|                 let sw = new StreamWriter(stream, encoding) | ||||
| #else | ||||
|                 let sw = new StreamWriter(stream, encoding, 1024, leaveOpen) | ||||
| #endif | ||||
|                 let jw = new JsonTextWriter(sw) | ||||
|                 new JsonPickleWriter(jw, __.OmitHeader, __.Indent, isCustomSeq isTopLevelSequence, sequenceSeparator, leaveOpen) :> _ | ||||
|  | ||||
|             member __.CreateReader (stream, encoding, isTopLevelSequence, leaveOpen) = | ||||
| #if NET40 | ||||
|                 if leaveOpen then raise <| new NotSupportedException("'leaveOpen' not supported in .NET 40.") | ||||
|                 let sr = new StreamReader(stream, encoding) | ||||
| #else | ||||
|                 let sr = new StreamReader(stream, encoding, true, 1024, leaveOpen) | ||||
| #endif | ||||
|                 let jr = new JsonTextReader(sr) | ||||
|                 new JsonPickleReader(jr, __.OmitHeader, isCustomSeq isTopLevelSequence, leaveOpen) :> _ | ||||
|  | ||||
|             member __.CreateWriter (textWriter, isTopLevelSequence, leaveOpen) = | ||||
|                 let jw = new JsonTextWriter(textWriter) | ||||
|                 new JsonPickleWriter(jw, __.OmitHeader, __.Indent, isCustomSeq isTopLevelSequence, sequenceSeparator, leaveOpen) :> _ | ||||
|  | ||||
|             member __.CreateReader (textReader, isTopLevelSequence, leaveOpen) = | ||||
|                 let jr = new JsonTextReader(textReader) | ||||
|                 new JsonPickleReader(jr, __.OmitHeader, isCustomSeq isTopLevelSequence, leaveOpen) :> _ | ||||
							
								
								
									
										202
									
								
								samples/F#/JsonReader.fs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										202
									
								
								samples/F#/JsonReader.fs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,202 @@ | ||||
| namespace Nessos.FsPickler.Json | ||||
|  | ||||
|     open System | ||||
|     open System.Collections.Generic | ||||
|     open System.Globalization | ||||
|     open System.IO | ||||
|     open System.Numerics | ||||
|     open System.Text | ||||
|  | ||||
|     open Newtonsoft.Json | ||||
|  | ||||
|     open Nessos.FsPickler | ||||
|  | ||||
|     /// <summary> | ||||
|     ///     Json format deserializer | ||||
|     /// </summary> | ||||
|     type internal JsonPickleReader (jsonReader : JsonReader, omitHeader, isTopLevelSequence, leaveOpen) = | ||||
|  | ||||
|         do | ||||
|             jsonReader.CloseInput <- not leaveOpen | ||||
|             jsonReader.SupportMultipleContent <- isTopLevelSequence | ||||
|  | ||||
|         let isBsonReader = match jsonReader with :? Bson.BsonReader -> true | _ -> false | ||||
|  | ||||
|         let mutable depth = 0 | ||||
|         let arrayStack = new Stack<int> () | ||||
|         do arrayStack.Push Int32.MinValue | ||||
|  | ||||
|         // do not write tag if omitting header or array element | ||||
|         let omitTag () = (omitHeader && depth = 0) || arrayStack.Peek() = depth - 1 | ||||
|  | ||||
|         interface IPickleFormatReader with | ||||
|              | ||||
|             member __.BeginReadRoot (tag : string) = | ||||
|                 do jsonReader.Read() |> ignore | ||||
|                      | ||||
|                 if omitHeader then () else | ||||
|  | ||||
|                 if jsonReader.TokenType <> JsonToken.StartObject then raise <| new FormatException("invalid json root object.") | ||||
|                 else | ||||
|                     do jsonReader.MoveNext() | ||||
|                     let version = jsonReader.ReadPrimitiveAs<string> false "FsPickler" | ||||
|                     if version <> jsonFormatVersion then | ||||
|                         let v = Version(version) | ||||
|                         raise <| new FormatException(sprintf "Invalid FsPickler format version %O." version) | ||||
|  | ||||
|                     let sTag = jsonReader.ReadPrimitiveAs<string> false "type" | ||||
|                     if tag <> sTag then | ||||
|                         raise <| new InvalidPickleTypeException(tag, sTag) | ||||
|  | ||||
|             member __.EndReadRoot () =  | ||||
|                 if not omitHeader then jsonReader.Read() |> ignore | ||||
|  | ||||
|             member __.BeginReadObject (tag : string) = | ||||
|                  | ||||
|                 if not <| omitTag () then | ||||
|                     jsonReader.ReadProperty tag | ||||
|                     jsonReader.MoveNext () | ||||
|  | ||||
|                 if isTopLevelSequence && depth = 0 then | ||||
|                     arrayStack.Push depth | ||||
|                     depth <- depth + 1 | ||||
|                     ObjectFlags.IsSequenceHeader | ||||
|  | ||||
|                 else | ||||
|                     match jsonReader.TokenType with | ||||
|                     | JsonToken.Null -> ObjectFlags.IsNull | ||||
|                     | JsonToken.StartArray -> | ||||
|                         jsonReader.MoveNext() | ||||
|                         arrayStack.Push depth | ||||
|                         depth <- depth + 1 | ||||
|                         ObjectFlags.IsSequenceHeader | ||||
|  | ||||
|                     | JsonToken.StartObject -> | ||||
|                         do jsonReader.MoveNext() | ||||
|                         depth <- depth + 1 | ||||
|  | ||||
|                         if jsonReader.ValueAs<string> () = "_flags" then | ||||
|                             jsonReader.MoveNext() | ||||
|                             let csvFlags = jsonReader.ValueAs<string>() | ||||
|                             jsonReader.MoveNext() | ||||
|                             parseFlagCsv csvFlags | ||||
|                         else | ||||
|                             ObjectFlags.None | ||||
|  | ||||
|                     | token -> raise <| new FormatException(sprintf "expected start of Json object but was '%O'." token) | ||||
|  | ||||
|  | ||||
|             member __.EndReadObject () = | ||||
|                 if isTopLevelSequence && depth = 1 then | ||||
|                     arrayStack.Pop () |> ignore | ||||
|                     depth <- depth - 1 | ||||
|                     jsonReader.Read() |> ignore | ||||
|                 else | ||||
|                     match jsonReader.TokenType with | ||||
|                     | JsonToken.Null -> () | ||||
|                     | JsonToken.EndObject -> depth <- depth - 1 | ||||
|                     | JsonToken.EndArray -> | ||||
|                         arrayStack.Pop() |> ignore | ||||
|                         depth <- depth - 1 | ||||
|  | ||||
|                     | token -> raise <| new FormatException(sprintf "expected end of Json object but was '%O'." token) | ||||
|  | ||||
|                     if omitHeader && depth = 0 then () | ||||
|                     else jsonReader.Read() |> ignore | ||||
|  | ||||
|             member __.SerializeUnionCaseNames = true | ||||
|  | ||||
|             member __.PreferLengthPrefixInSequences = false | ||||
|             member __.ReadNextSequenceElement () =  | ||||
|                 if isTopLevelSequence && depth = 1 then | ||||
|                     jsonReader.TokenType <> JsonToken.None | ||||
|                 else | ||||
|                     jsonReader.TokenType <> JsonToken.EndArray | ||||
|  | ||||
|             member __.ReadCachedObjectId () = jsonReader.ReadPrimitiveAs<int64> false "id" | ||||
|  | ||||
|             member __.ReadBoolean tag = jsonReader.ReadPrimitiveAs<bool> (omitTag ()) tag | ||||
|             member __.ReadByte tag = jsonReader.ReadPrimitiveAs<int64> (omitTag ()) tag |> byte | ||||
|             member __.ReadSByte tag = jsonReader.ReadPrimitiveAs<int64> (omitTag ()) tag |> sbyte | ||||
|  | ||||
|             member __.ReadInt16 tag = jsonReader.ReadPrimitiveAs<int64> (omitTag ()) tag |> int16 | ||||
|             member __.ReadInt32 tag = jsonReader.ReadPrimitiveAs<int64> (omitTag ()) tag |> int | ||||
|             member __.ReadInt64 tag = jsonReader.ReadPrimitiveAs<int64> (omitTag ()) tag | ||||
|  | ||||
|             member __.ReadUInt16 tag = jsonReader.ReadPrimitiveAs<int64> (omitTag ()) tag |> uint16 | ||||
|             member __.ReadUInt32 tag = jsonReader.ReadPrimitiveAs<int64> (omitTag ()) tag |> uint32 | ||||
|             member __.ReadUInt64 tag = jsonReader.ReadPrimitiveAs<int64> (omitTag ()) tag |> uint64 | ||||
|  | ||||
|             member __.ReadSingle tag = | ||||
|                 if not <| omitTag () then | ||||
|                     jsonReader.ReadProperty tag | ||||
|                     jsonReader.MoveNext() | ||||
|  | ||||
|                 let value = | ||||
|                     match jsonReader.TokenType with | ||||
|                     | JsonToken.Float -> jsonReader.ValueAs<double> () |> single | ||||
|                     | JsonToken.String -> Single.Parse(jsonReader.ValueAs<string>(), CultureInfo.InvariantCulture) | ||||
|                     | _ -> raise <| new FormatException("not a float.") | ||||
|  | ||||
|                 jsonReader.Read() |> ignore | ||||
|                 value | ||||
|                  | ||||
|             member __.ReadDouble tag = | ||||
|                 if not <| omitTag () then | ||||
|                     jsonReader.ReadProperty tag | ||||
|                     jsonReader.MoveNext() | ||||
|  | ||||
|                 let value = | ||||
|                     match jsonReader.TokenType with | ||||
|                     | JsonToken.Float -> jsonReader.ValueAs<double> () | ||||
|                     | JsonToken.String -> Double.Parse(jsonReader.ValueAs<string>(), CultureInfo.InvariantCulture) | ||||
|                     | _ -> raise <| new FormatException("not a float.") | ||||
|  | ||||
|                 jsonReader.Read() |> ignore | ||||
|                 value | ||||
|  | ||||
|             member __.ReadChar tag = let value = jsonReader.ReadPrimitiveAs<string> (omitTag ()) tag in value.[0] | ||||
|             member __.ReadString tag = jsonReader.ReadPrimitiveAs<string> (omitTag ()) tag | ||||
|             member __.ReadBigInteger tag = jsonReader.ReadPrimitiveAs<string> (omitTag ()) tag |> BigInteger.Parse | ||||
|  | ||||
|             member __.ReadGuid tag =  | ||||
|                 if isBsonReader then  | ||||
|                     jsonReader.ReadPrimitiveAs<Guid> (omitTag ()) tag | ||||
|                 else | ||||
|                     jsonReader.ReadPrimitiveAs<string> (omitTag ()) tag |> Guid.Parse | ||||
|  | ||||
|             member __.ReadTimeSpan tag = jsonReader.ReadPrimitiveAs<string> (omitTag ()) tag |> TimeSpan.Parse | ||||
|             member __.ReadDecimal tag = jsonReader.ReadPrimitiveAs<string> (omitTag ()) tag |> decimal | ||||
|  | ||||
|             // BSON spec mandates the use of Unix time;  | ||||
|             // this has millisecond precision which results in loss of accuracy w.r.t. ticks | ||||
|             // since the goal of FsPickler is to offer faithful representations of .NET objects | ||||
|             // we choose to override the spec and serialize ticks outright. | ||||
|             // see also https://json.codeplex.com/discussions/212067  | ||||
|             member __.ReadDate tag =  | ||||
|                 if isBsonReader then | ||||
|                     let ticks = jsonReader.ReadPrimitiveAs<int64> (omitTag ()) tag | ||||
|                     DateTime(ticks) | ||||
|                 else | ||||
|                     jsonReader.ReadPrimitiveAs<DateTime> (omitTag ()) tag | ||||
|  | ||||
|             member __.ReadBytes tag = | ||||
|                 if not <| omitTag () then | ||||
|                     jsonReader.ReadProperty tag | ||||
|                     jsonReader.Read() |> ignore | ||||
|  | ||||
|                 let bytes = | ||||
|                     if jsonReader.TokenType = JsonToken.Null then null | ||||
|                     elif isBsonReader then jsonReader.ValueAs<byte []> () | ||||
|                     else | ||||
|                         let base64 = jsonReader.ValueAs<string> () | ||||
|                         Convert.FromBase64String base64 | ||||
|  | ||||
|                 jsonReader.Read() |> ignore | ||||
|  | ||||
|                 bytes | ||||
|  | ||||
|             member __.IsPrimitiveArraySerializationSupported = false | ||||
|             member __.ReadPrimitiveArray _ _ = raise <| new NotImplementedException() | ||||
|  | ||||
|             member __.Dispose () = (jsonReader :> IDisposable).Dispose() | ||||
							
								
								
									
										85
									
								
								samples/F#/JsonSerializer.fs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										85
									
								
								samples/F#/JsonSerializer.fs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,85 @@ | ||||
| namespace Nessos.FsPickler.Json | ||||
|  | ||||
|     open System | ||||
|  | ||||
|     open Nessos.FsPickler | ||||
|  | ||||
|     type internal OAttribute = System.Runtime.InteropServices.OptionalAttribute | ||||
|     type internal DAttribute = System.Runtime.InteropServices.DefaultParameterValueAttribute | ||||
|  | ||||
|     /// <summary> | ||||
|     ///     Json pickler instance. | ||||
|     /// </summary> | ||||
|     type JsonSerializer = | ||||
|         inherit FsPicklerTextSerializer | ||||
|          | ||||
|         val private format : JsonPickleFormatProvider | ||||
|  | ||||
|         /// <summary> | ||||
|         ///     Initializes a new Json pickler instance. | ||||
|         /// </summary> | ||||
|         /// <param name="indent">indent out Json pickles.</param> | ||||
|         /// <param name="omitHeader">omit FsPickler header in Json pickles.</param> | ||||
|         /// <param name="typeConverter">specify a custom type name converter.</param> | ||||
|         new ([<O;D(null)>] ?indent, [<O;D(null)>] ?omitHeader, [<O;D(null)>] ?typeConverter) = | ||||
|             let indent = defaultArg indent false | ||||
|             let omitHeader = defaultArg omitHeader false | ||||
|             let json = new JsonPickleFormatProvider(indent, omitHeader) | ||||
|             {  | ||||
|                 inherit FsPicklerTextSerializer(json, ?typeConverter = typeConverter) | ||||
|                 format = json     | ||||
|             } | ||||
|  | ||||
|         /// <summary> | ||||
|         ///     Gets or sets whether Json output should be indented. | ||||
|         /// </summary> | ||||
|         member x.Indent | ||||
|             with get () = x.format.Indent | ||||
|             and set b = x.format.Indent <- b | ||||
|  | ||||
|         /// <summary> | ||||
|         ///     Gets or sets whether FsPickler headers should be ignored in pickle format. | ||||
|         /// </summary> | ||||
|         member x.OmitHeader | ||||
|             with get () = x.format.OmitHeader | ||||
|             and set b = x.format.OmitHeader <- b | ||||
|  | ||||
|         /// <summary> | ||||
|         ///     Gets or sets a non-null whitespace string that serves as a custom, top-level sequence separator. | ||||
|         /// </summary> | ||||
|         member x.SequenceSeparator | ||||
|             with get () = x.format.SequenceSeparator | ||||
|             and set sep = x.format.SequenceSeparator <- sep | ||||
|  | ||||
|         /// <summary> | ||||
|         ///     Gets or sets whether top-level sequences should be serialized using the custom separator. | ||||
|         /// </summary> | ||||
|         member x.UseCustomTopLevelSequenceSeparator | ||||
|             with get () = x.format.UseCustomTopLevelSequenceSeparator | ||||
|             and set e = x.format.UseCustomTopLevelSequenceSeparator <- e | ||||
|  | ||||
|     /// <summary> | ||||
|     ///     BSON pickler instance. | ||||
|     /// </summary> | ||||
|     type BsonSerializer([<O;D(null)>] ?typeConverter) = | ||||
|         inherit FsPicklerSerializer(new BsonPickleFormatProvider(), ?typeConverter = typeConverter) | ||||
|  | ||||
|  | ||||
|     /// FsPickler static methods. | ||||
|     type FsPickler = | ||||
|  | ||||
|         /// <summary> | ||||
|         ///     Initializes a new Json pickler instance. | ||||
|         /// </summary> | ||||
|         /// <param name="indent">indent out Json pickles.</param> | ||||
|         /// <param name="omitHeader">omit FsPickler header in Json pickles.</param> | ||||
|         /// <param name="typeConverter">specify a custom type name converter.</param> | ||||
|         static member CreateJson([<O;D(null)>] ?indent, [<O;D(null)>] ?omitHeader, [<O;D(null)>] ?typeConverter) =  | ||||
|             new JsonSerializer(?indent = indent, ?omitHeader = omitHeader, ?typeConverter = typeConverter) | ||||
|  | ||||
|         /// <summary> | ||||
|         ///     Initializes a new Bson pickler instance. | ||||
|         /// </summary> | ||||
|         /// <param name="typeConverter">specify a custom type name converter.</param> | ||||
|         static member CreateBson([<O;D(null)>] ?typeConverter) =  | ||||
|             new BsonSerializer(?typeConverter = typeConverter) | ||||
							
								
								
									
										142
									
								
								samples/F#/JsonWriter.fs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										142
									
								
								samples/F#/JsonWriter.fs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,142 @@ | ||||
| namespace Nessos.FsPickler.Json | ||||
|  | ||||
|     open System | ||||
|     open System.IO | ||||
|     open System.Collections.Generic | ||||
|  | ||||
|     open Newtonsoft.Json | ||||
|  | ||||
|     open Nessos.FsPickler | ||||
|  | ||||
|     /// <summary> | ||||
|     ///     Json format serializer. | ||||
|     /// </summary> | ||||
|     type internal JsonPickleWriter (jsonWriter : JsonWriter, omitHeader, indented, isTopLevelSequence, separator, leaveOpen) = | ||||
|  | ||||
|         do  | ||||
|             jsonWriter.Formatting <- if indented then Formatting.Indented else Formatting.None | ||||
|             jsonWriter.CloseOutput <- not leaveOpen | ||||
|  | ||||
|         let isBsonWriter = match jsonWriter with :? Bson.BsonWriter -> true | _ -> false | ||||
|  | ||||
|         let mutable depth = 0 | ||||
|         let mutable isTopLevelSequenceHead = false | ||||
|         let mutable currentValueIsNull = false | ||||
|  | ||||
|         let arrayStack = new Stack<int> () | ||||
|         do arrayStack.Push Int32.MinValue | ||||
|  | ||||
|         // do not write tag if omitting header or array element | ||||
|         let omitTag () = (omitHeader && depth = 0) || arrayStack.Peek() = depth - 1 | ||||
|  | ||||
|         interface IPickleFormatWriter with | ||||
|              | ||||
|             member __.BeginWriteRoot (tag : string) = | ||||
|                 if omitHeader then () else | ||||
|  | ||||
|                 jsonWriter.WriteStartObject() | ||||
|                 writePrimitive jsonWriter false "FsPickler" jsonFormatVersion | ||||
|                 writePrimitive jsonWriter false "type" tag | ||||
|  | ||||
|             member __.EndWriteRoot () =  | ||||
|                 if not omitHeader then jsonWriter.WriteEnd() | ||||
|  | ||||
|             member __.BeginWriteObject (tag : string) (flags : ObjectFlags) = | ||||
|  | ||||
|                 if not <| omitTag () then | ||||
|                     jsonWriter.WritePropertyName tag | ||||
|  | ||||
|                 if flags.HasFlag ObjectFlags.IsNull then | ||||
|                     currentValueIsNull <- true | ||||
|                     jsonWriter.WriteNull() | ||||
|  | ||||
|                 elif flags.HasFlag ObjectFlags.IsSequenceHeader then | ||||
|                     if isTopLevelSequence && depth = 0 then | ||||
|                         isTopLevelSequenceHead <- true | ||||
|                     else | ||||
|                         jsonWriter.WriteStartArray() | ||||
|  | ||||
|                     arrayStack.Push depth | ||||
|                     depth <- depth + 1 | ||||
|                 else | ||||
|                     jsonWriter.WriteStartObject() | ||||
|                     depth <- depth + 1 | ||||
|  | ||||
|                     if flags = ObjectFlags.None then () | ||||
|                     else | ||||
|                         let flagCsv = mkFlagCsv flags | ||||
|                         writePrimitive jsonWriter false "_flags" flagCsv | ||||
|  | ||||
|             member __.EndWriteObject () =  | ||||
|                 if currentValueIsNull then  | ||||
|                     currentValueIsNull <- false | ||||
|                 else | ||||
|                     depth <- depth - 1 | ||||
|                     if arrayStack.Peek () = depth then | ||||
|                         if isTopLevelSequence && depth = 0 then () | ||||
|                         else | ||||
|                             jsonWriter.WriteEndArray() | ||||
|  | ||||
|                         arrayStack.Pop () |> ignore | ||||
|                     else | ||||
|                         jsonWriter.WriteEndObject() | ||||
|  | ||||
|             member __.SerializeUnionCaseNames = true | ||||
|  | ||||
|             member __.PreferLengthPrefixInSequences = false | ||||
|             member __.WriteNextSequenceElement hasNext = | ||||
|                 if isTopLevelSequence && depth = 1 then | ||||
|                     if isTopLevelSequenceHead then | ||||
|                         isTopLevelSequenceHead <- false | ||||
|                     else | ||||
|                         jsonWriter.WriteWhitespace separator | ||||
|  | ||||
|             member __.WriteCachedObjectId id = writePrimitive jsonWriter false "id" id | ||||
|  | ||||
|             member __.WriteBoolean (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value | ||||
|             member __.WriteByte (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value | ||||
|             member __.WriteSByte (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value | ||||
|  | ||||
|             member __.WriteInt16 (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value | ||||
|             member __.WriteInt32 (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value | ||||
|             member __.WriteInt64 (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value | ||||
|  | ||||
|             member __.WriteUInt16 (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value | ||||
|             member __.WriteUInt32 (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value | ||||
|             member __.WriteUInt64 (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value | ||||
|  | ||||
|             member __.WriteSingle (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value | ||||
|             member __.WriteDouble (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value | ||||
|             member __.WriteDecimal (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag (string value) | ||||
|  | ||||
|             member __.WriteChar (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value | ||||
|             member __.WriteString (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value | ||||
|             member __.WriteBigInteger (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag (string value) | ||||
|  | ||||
|             member __.WriteGuid (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value | ||||
|             member __.WriteTimeSpan (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag (string value) | ||||
|  | ||||
|             // BSON spec mandates the use of Unix time;  | ||||
|             // this has millisecond precision which results in loss of accuracy w.r.t. ticks | ||||
|             // since the goal of FsPickler is to offer faithful representations of .NET objects | ||||
|             // we choose to override the spec and serialize ticks outright. | ||||
|             // see also https://json.codeplex.com/discussions/212067  | ||||
|             member __.WriteDate (tag : string) value =  | ||||
|                 if isBsonWriter then | ||||
|                     writePrimitive jsonWriter (omitTag ()) tag value.Ticks | ||||
|                 else | ||||
|                     writePrimitive jsonWriter (omitTag ()) tag value | ||||
|  | ||||
|             member __.WriteBytes (tag : string) (value : byte []) = | ||||
|                 if not <| omitTag () then  | ||||
|                     jsonWriter.WritePropertyName tag | ||||
|  | ||||
|                 if obj.ReferenceEquals(value, null) then | ||||
|                     jsonWriter.WriteNull() | ||||
|                 else | ||||
|                     jsonWriter.WriteValue value | ||||
|  | ||||
|             member __.IsPrimitiveArraySerializationSupported = false | ||||
|             member __.WritePrimitiveArray _ _ = raise <| NotSupportedException() | ||||
|  | ||||
|             member __.Dispose () = jsonWriter.Flush() | ||||
							
								
								
									
										68
									
								
								samples/F#/PerformanceTesters.fs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								samples/F#/PerformanceTesters.fs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,68 @@ | ||||
| namespace Nessos.FsPickler.Tests | ||||
|  | ||||
|     open PerfUtil | ||||
|     open PerfUtil.NUnit | ||||
|  | ||||
|     open NUnit.Framework | ||||
|  | ||||
|     open Nessos.FsPickler | ||||
|     open Nessos.FsPickler.Json | ||||
|  | ||||
|     [<AbstractClass>] | ||||
|     type PerfTester () = | ||||
|         inherit NUnitPerf<Serializer> () | ||||
|  | ||||
|         let tests = PerfTest.OfModuleMarker<PerformanceTests.Marker> () | ||||
|  | ||||
|         override __.PerfTests = tests | ||||
|  | ||||
|  | ||||
|     type ``Serializer Comparison`` () = | ||||
|         inherit PerfTester() | ||||
|  | ||||
|         let fsp = FsPickler.initBinary() | ||||
|         let bfs = new BinaryFormatterSerializer() :> Serializer | ||||
|         let ndc = new NetDataContractSerializer() :> Serializer | ||||
|         let jdn = new JsonDotNetSerializer() :> Serializer | ||||
|         let bdn = new JsonDotNetBsonSerializer () :> Serializer | ||||
|         let pbn = new ProtoBufSerializer() :> Serializer | ||||
|         let ssj = new ServiceStackJsonSerializer() :> Serializer | ||||
|         let sst = new ServiceStackTypeSerializer() :> Serializer | ||||
|  | ||||
|         let comparer = new WeightedComparer(spaceFactor = 0.2, leastAcceptableImprovementFactor = 1.) | ||||
|         let tester = new ImplementationComparer<_>(fsp, [bfs;ndc;jdn;bdn;pbn;ssj;sst], throwOnError = true, warmup = true, comparer = comparer) | ||||
|  | ||||
|         override __.PerfTester = tester :> _ | ||||
|          | ||||
|  | ||||
|     type ``FsPickler Formats Comparison`` () = | ||||
|         inherit PerfTester () | ||||
|  | ||||
|         let binary = FsPickler.initBinary() | ||||
|         let json = FsPickler.initJson() | ||||
|         let bson = FsPickler.initBson() | ||||
|         let xml = FsPickler.initXml() | ||||
|  | ||||
|         let tester = new ImplementationComparer<_>(binary, [json ; bson; xml], warmup = true, throwOnError = false) | ||||
|  | ||||
|         override __.PerfTester = tester :> _ | ||||
|  | ||||
|  | ||||
|     type ``Past FsPickler Versions Comparison`` () = | ||||
|         inherit PerfTester () | ||||
|  | ||||
|         let persistResults = true | ||||
|         let persistenceFile = "fspPerf.xml" | ||||
|  | ||||
|         let fsp = FsPickler.initBinary() | ||||
|         let version = typeof<FsPickler>.Assembly.GetName().Version | ||||
|         let comparer = new WeightedComparer(spaceFactor = 0.2, leastAcceptableImprovementFactor = 0.8) | ||||
|         let tester =  | ||||
|             new PastImplementationComparer<Serializer>( | ||||
|                 fsp, version, historyFile = persistenceFile, throwOnError = true, warmup = true, comparer = comparer) | ||||
|  | ||||
|         override __.PerfTester = tester :> _ | ||||
|  | ||||
|         [<TestFixtureTearDown>] | ||||
|         member __.Persist() = | ||||
|             if persistResults then tester.PersistCurrentResults () | ||||
							
								
								
									
										207
									
								
								samples/F#/PerformanceTests.fs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										207
									
								
								samples/F#/PerformanceTests.fs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,207 @@ | ||||
| namespace Nessos.FsPickler.Tests | ||||
|  | ||||
|     open System | ||||
|     open System.Collections.Generic | ||||
|  | ||||
|     open PerfUtil | ||||
|  | ||||
|     open Nessos.FsPickler | ||||
|     open Nessos.FsPickler.Tests.Serializer | ||||
|     open Nessos.FsPickler.Tests.TestTypes | ||||
|  | ||||
|     module PerformanceTests = | ||||
|  | ||||
|         type Marker = class end | ||||
|  | ||||
|         let guid = Guid.NewGuid() | ||||
|  | ||||
|         [<PerfTest(1000)>] | ||||
|         let ``Value: Guid`` s = roundtrip guid s | ||||
|  | ||||
|         let date = DateTime.Now | ||||
|  | ||||
|         [<PerfTest(1000)>] | ||||
|         let ``Value: DateTime`` s = roundtrip date s | ||||
|  | ||||
|         [<PerfTest(10000)>] | ||||
|         let ``Value: String`` s = roundtrip stringValue s | ||||
|  | ||||
|  | ||||
|         let boxed = box ([| 1 .. 1000 |], "lorem ipsum") | ||||
|  | ||||
|         [<PerfTest(1000)>] | ||||
|         let ``Boxed Object`` s = roundtrip boxed s | ||||
|  | ||||
|         let fsClass = new Class(42, stringValue) | ||||
|  | ||||
|         [<PerfTest(10000)>] | ||||
|         let ``Class: Simple F# Class`` s = roundtrip fsClass s | ||||
|  | ||||
|         let serializableClass = new SerializableClass<_>(42, stringValue, [|1..1000|]) | ||||
|  | ||||
|         [<PerfTest(10000)>] | ||||
|         let ``Class: ISerializable`` s = roundtrip serializableClass s | ||||
|  | ||||
|         let boxedClass = box(Some 42) | ||||
|  | ||||
|         [<PerfTest(10000)>] | ||||
|         let ``Subtype Resolution`` s = roundtrip boxedClass s | ||||
|  | ||||
|         let floatArray = Array.init 100000 (fun i -> float i) | ||||
|  | ||||
|         [<PerfTest(10)>] | ||||
|         let ``Array: Float`` s = roundtrip floatArray s | ||||
|  | ||||
|         let intArray = Array.init 100000 id | ||||
|  | ||||
|         [<PerfTest(10)>] | ||||
|         let ``Array: Int`` s = roundtrip intArray s | ||||
|  | ||||
|         let stringArray = Array.init 10000 (fun i -> stringValue + string i) | ||||
|          | ||||
|         [<PerfTest(100)>] | ||||
|         let ``Array: String`` s = roundtrip stringArray s | ||||
|  | ||||
|         let kvarr = [|1..10000|] |> Array.map (fun i -> i, string i) | ||||
|  | ||||
|         [<PerfTest(100)>] | ||||
|         let ``Array: Key-Value Pairs`` s = roundtrip kvarr s | ||||
|  | ||||
|         let duArray = [| for i in 1 .. 10000 -> (Something ("asdasdasdas", i)) |] | ||||
|  | ||||
|         [<PerfTest(100)>] | ||||
|         let ``Array: Discriminated Unions`` s = roundtrip duArray s | ||||
|  | ||||
|         let objArray =  | ||||
|             [|  | ||||
|                 box 2; box 3; box "hello" ; box <| Some 3; box(2,3) ;  | ||||
|                 box <| new Class(2, stringValue) ; box <| new SerializableClass<int option>(2, stringValue, Some 12);  | ||||
|                 box stringValue  | ||||
|             |] | ||||
|  | ||||
|         [<PerfTest(1000)>] | ||||
|         let ``Array: Objects`` s = roundtrip objArray s | ||||
|  | ||||
|  | ||||
|         let array3D = Array3D.init 100 100 100 (fun i j k -> float (i * j + k)) | ||||
|  | ||||
|         [<PerfTest(10)>] | ||||
|         let ``Array: Rank-3 Float`` s = roundtrip array3D s | ||||
|  | ||||
|         let bclDict = dict [ for i in 1 .. 1000 -> (string i, i)] | ||||
|  | ||||
|         [<PerfTest(100)>] | ||||
|         let ``.NET Dictionary`` s = roundtrip bclDict s | ||||
|  | ||||
|         let bclStack = new Stack<string>([for i in 1 .. 1000 -> string i]) | ||||
|  | ||||
|         [<PerfTest(100)>] | ||||
|         let ``.NET Stack`` s = roundtrip bclStack s | ||||
|  | ||||
|         let bclList = new List<string * int>([for i in 1 .. 1000 -> string i, i]) | ||||
|  | ||||
|         [<PerfTest(100)>] | ||||
|         let ``.NET List`` s = roundtrip bclList s | ||||
|  | ||||
|         let bclSet = new SortedSet<_>([for i in 1 .. 1000 -> string i]) | ||||
|  | ||||
|         [<PerfTest(100)>] | ||||
|         let ``.NET Set`` s = roundtrip bclSet s | ||||
|  | ||||
|         let smallTuple = (1, DateTime.Now,"hello") | ||||
|  | ||||
|         [<PerfTest(10000)>] | ||||
|         let ``FSharp: Tuple Small`` s = roundtrip smallTuple s | ||||
|  | ||||
|         let largeTuple = (stringValue, 1, 2, 3, true, "", Some(3.14, [2]), 3, 2, 1, stringValue) | ||||
|  | ||||
|         [<PerfTest(10000)>] | ||||
|         let ``FSharp: Tuple Large`` s = | ||||
|             roundtrip largeTuple s | ||||
|  | ||||
|         let intList = [1..1000] | ||||
|  | ||||
|         [<PerfTest(1000)>] | ||||
|         let ``FSharp: List Int`` s = roundtrip intList s | ||||
|  | ||||
|         let stringList = [ for i in 1 .. 1000 -> stringValue + string i ] | ||||
|  | ||||
|         [<PerfTest(1000)>] | ||||
|         let ``FSharp: List String`` s = roundtrip stringList s | ||||
|  | ||||
|         let pairList = [ for i in 1 .. 1000 -> (string i, i) ] | ||||
|  | ||||
|         [<PerfTest(1000)>] | ||||
|         let ``FSharp: List Key-Value`` s = roundtrip pairList s | ||||
|  | ||||
|         let nestedLst = let n = [1..1000] in [for _ in 1 .. 100 -> n] | ||||
|  | ||||
|         [<PerfTest(1000)>] | ||||
|         let ``FSharp: List Nested`` s = roundtrip nestedLst s | ||||
|  | ||||
|         let union = SomethingElse(stringValue, 42, box (Some 42)) | ||||
|  | ||||
|         [<PerfTest(10000)>] | ||||
|         let ``FSharp: Union`` s = roundtrip union s | ||||
|  | ||||
|         let record = { Int = 42 ; String = stringValue ; Tuple = (13, "") } | ||||
|  | ||||
|         [<PerfTest(10000)>] | ||||
|         let ``FSharp: Record`` s = roundtrip record s | ||||
|  | ||||
|         let peano = int2Peano 100 | ||||
|  | ||||
|         [<PerfTest(100)>] | ||||
|         let ``FSharp: Peano Rectype`` s = roundtrip peano s | ||||
|  | ||||
|         let closure = (@) [ Some([1..100], Set.ofList [1..100]) ] | ||||
|  | ||||
|         [<PerfTest(1000)>] | ||||
|         let ``FSharp: Curried Function`` s = roundtrip closure s | ||||
|  | ||||
|         let binTree = mkTree 10 | ||||
|  | ||||
|         [<PerfTest(100)>] | ||||
|         let ``FSharp: Binary Tree`` s = roundtrip binTree s | ||||
|  | ||||
|         let intSet = [1..1000] |> List.map string |> set | ||||
|  | ||||
|         [<PerfTest(1000)>] | ||||
|         let ``FSharp: Set`` s = roundtrip intSet s | ||||
|  | ||||
|         let fsMap = [1..1000] |> Seq.map (fun i -> (string i,i)) |> Map.ofSeq | ||||
|  | ||||
|         [<PerfTest(1000)>] | ||||
|         let ``FSharp: Map`` s = roundtrip fsMap s | ||||
|  | ||||
|         let testType = typeof<int * string option * Map<int * string [], string ref option>> | ||||
|  | ||||
|         [<PerfTest(1000)>] | ||||
|         let ``Reflection: Type`` s = roundtrip testType s | ||||
|  | ||||
|         let quotationSmall = <@ fun x -> pown 2 x @> | ||||
|  | ||||
|         let quotationLarge = | ||||
|             <@ | ||||
|                 async { | ||||
|                     let rec fibAsync n = | ||||
|                         async { | ||||
|                             match n with | ||||
|                             | _ when n < 0 -> return invalidArg "negative" "n" | ||||
|                             | _ when n < 2 -> return n | ||||
|                             | n -> | ||||
|                                 let! fn = fibAsync (n-1) | ||||
|                                 let! fnn = fibAsync (n-2) | ||||
|                                 return fn + fnn | ||||
|                         } | ||||
|  | ||||
|                     let! values = [1..100] |> Seq.map fibAsync |> Async.Parallel | ||||
|                     return Seq.sum values | ||||
|                 } | ||||
|             @> | ||||
|  | ||||
|         [<PerfTest(10000)>] | ||||
|         let ``FSharp: Quotation Small`` s = roundtrip quotationSmall s | ||||
|  | ||||
|         [<PerfTest(1000)>] | ||||
|         let ``FSharp: Quotation Large`` s = roundtrip quotationLarge s | ||||
							
								
								
									
										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!") | ||||
| } | ||||
							
								
								
									
										37
									
								
								samples/Golo/augmentations.golo
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										37
									
								
								samples/Golo/augmentations.golo
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,37 @@ | ||||
| # 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.Augmentations | ||||
|  | ||||
| import java.util.LinkedList | ||||
|  | ||||
| augment java.util.List { | ||||
|   function with = |this, value| { | ||||
|     this: add(value) | ||||
|     return this | ||||
|   } | ||||
| } | ||||
|  | ||||
| augment java.util.Collection { | ||||
|   function doToEach = |this, func| { | ||||
|     foreach (element in this) { | ||||
|       func(element) | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| function main = |args| { | ||||
|   let list = LinkedList(): with("foo"): with("bar"): with("baz") | ||||
|   list: doToEach(|value| -> println(">>> " + value)) | ||||
| } | ||||
							
								
								
									
										43
									
								
								samples/Golo/closures.golo
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										43
									
								
								samples/Golo/closures.golo
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,43 @@ | ||||
| # 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 Closures | ||||
|  | ||||
| local function sayHello = |who| -> "Hello " + who + "!" | ||||
|  | ||||
| function main = |args| { | ||||
|   let adder = |a, b| -> a + b | ||||
|   println(adder: invokeWithArguments(1, 2)) | ||||
|   println(adder(1, 2)) | ||||
|  | ||||
|   let addToTen = adder: bindTo(10) | ||||
|   println(addToTen: invokeWithArguments(2)) | ||||
|   println(addToTen(2)) | ||||
|  | ||||
|   let adding = |x| -> |y| -> adder(x, y) | ||||
|   let addingTen = adding(10) | ||||
|   println(addingTen(4)) | ||||
|   println(adding(2)(4)) | ||||
|  | ||||
|   println(sayHello("Julien")) | ||||
|  | ||||
|   let list = java.util.LinkedList() | ||||
|   let pump_it = { | ||||
|     list: add("I heard you say") | ||||
|     list: add("Hey!") | ||||
|     list: add("Hey!") | ||||
|   } | ||||
|   pump_it() | ||||
|   println(list) | ||||
| } | ||||
							
								
								
									
										34
									
								
								samples/Golo/coin-change.golo
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										34
									
								
								samples/Golo/coin-change.golo
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,34 @@ | ||||
| # 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 CoinChange | ||||
|  | ||||
| import java.util.LinkedList | ||||
|  | ||||
| function change = |money, coins| -> match { | ||||
|   when money == 0 then 1 | ||||
|   when (money < 0) or (coins: isEmpty()) then 0 | ||||
|   otherwise change(money - coins: head(), coins) + change(money, coins: tail()) | ||||
| } | ||||
|  | ||||
| function main = |args| { | ||||
|   let coins = LinkedList(): append(1, 2, 5, 10, 20) | ||||
|   println("Coins: " + coins) | ||||
|   println("0: " + change(0, coins)) | ||||
|   println("1: " + change(1, coins)) | ||||
|   println("2: " + change(2, coins)) | ||||
|   println("10: " + change(10, coins)) | ||||
|   println("12: " + change(12, coins)) | ||||
|   println("6: " + change(6, coins)) | ||||
| } | ||||
							
								
								
									
										55
									
								
								samples/Golo/collection-literals.golo
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										55
									
								
								samples/Golo/collection-literals.golo
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,55 @@ | ||||
| # 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.CollectionLiterals | ||||
|  | ||||
| local function play_with_tuples = { | ||||
|   let hello = ["Hello", "world", "!"] | ||||
|   foreach str in hello { | ||||
|     print(str + " ") | ||||
|   } | ||||
|   println("") | ||||
|  | ||||
|   println(hello: get(0) + "-" + hello: get(1) + "-" + hello: get(2)) | ||||
|  | ||||
|   println(hello: join("/")) | ||||
| } | ||||
|  | ||||
| local function play_with_literals = { | ||||
|   let data = [ | ||||
|     [1, 2, 3], | ||||
|     tuple[1, 2, 3], | ||||
|     array[1, 2, 3], | ||||
|     set[1, 2, 3, 3, 1], | ||||
|     map[ | ||||
|       ["a", 10], | ||||
|       ["b", 20] | ||||
|     ], | ||||
|     vector[1, 2, 3], | ||||
|     list[1, 2, 3] | ||||
|   ] | ||||
|  | ||||
|   data: each(|element| { | ||||
|     println(element: toString()) | ||||
|     println("  type: " + element: getClass()) | ||||
|   }) | ||||
| } | ||||
|  | ||||
| function main = |args| { | ||||
|   println(">>> Literals") | ||||
|   play_with_literals() | ||||
|   println("\n>>> Tuples") | ||||
|   play_with_tuples() | ||||
| } | ||||
|  | ||||
							
								
								
									
										53
									
								
								samples/Golo/context-decorator.golo
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										53
									
								
								samples/Golo/context-decorator.golo
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,53 @@ | ||||
| # 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.ContextDecorator | ||||
|  | ||||
| import gololang.Decorators | ||||
|  | ||||
| let myContext = defaultContext(): | ||||
|   count(0): | ||||
|   define("entry", |this, args| { | ||||
|     this: count(this: count() + 1) | ||||
|     println("hello:" + this: count()) | ||||
|     return args | ||||
|   }): | ||||
|   define("exit", |this, result| { | ||||
|     require(result >= 3, "wrong value") | ||||
|     println("goobye") | ||||
|     return result | ||||
|   }): | ||||
|   define("catcher", |this, e| { | ||||
|     println("Caught " + e) | ||||
|     throw e | ||||
|   }): | ||||
|   define("finallizer", |this| {println("do some cleanup")}) | ||||
|  | ||||
|  | ||||
| @withContext(myContext) | ||||
| function foo = |a, b| { | ||||
|   println("Hard computation") | ||||
|   return a + b | ||||
| } | ||||
|  | ||||
| function main = |args| { | ||||
|   println(foo(1,2)) | ||||
|   println("====") | ||||
|   println(withContext(myContext)(|a| -> 2*a)(3)) | ||||
|   println("====") | ||||
|   try { | ||||
|     println(foo(1, 1)) | ||||
|   } catch (e) { } | ||||
| } | ||||
|  | ||||
							
								
								
									
										83
									
								
								samples/Golo/decorators.golo
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										83
									
								
								samples/Golo/decorators.golo
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,83 @@ | ||||
| # 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.Decorators | ||||
|  | ||||
| import java.util.LinkedList | ||||
|  | ||||
| function simple_decorator = |func| { | ||||
|   return |a,b| -> func(a+1,b+1) | ||||
| } | ||||
|  | ||||
| @simple_decorator | ||||
| function simple_adder = |x,y| -> x + y | ||||
|  | ||||
| function decorator_with_params = |param1, param2|{ | ||||
|   return |func| { | ||||
|     return |a,b| -> func(a+param1,b+param2) | ||||
|   } | ||||
| } | ||||
|  | ||||
| @decorator_with_params(10,2) | ||||
| function parametrized_adder = |x,y| -> x + y | ||||
|  | ||||
| function generic_decorator = |func| { | ||||
|   return |args...| { | ||||
|     println("number of params : "+args: length()) | ||||
|     return func: invokeWithArguments(args) | ||||
|   } | ||||
| } | ||||
|  | ||||
| @generic_decorator | ||||
| function generic_adder0 = -> 42 | ||||
|  | ||||
| @generic_decorator | ||||
| function generic_adder1 = |x| -> x | ||||
|  | ||||
| @generic_decorator | ||||
| function generic_adder2 = |x,y| -> x + y | ||||
|  | ||||
| @generic_decorator | ||||
| function generic_adder3 = |x,y,z| -> x + y + z | ||||
|  | ||||
| function list_sum_decorator = |func| { | ||||
|     return |this| -> func(this) - 8 | ||||
| } | ||||
|  | ||||
| augment java.util.List { | ||||
|  | ||||
|   @list_sum_decorator | ||||
|   function sum = |this| { | ||||
|     var acc = 0 | ||||
|     foreach elem in this { | ||||
|         acc = acc + elem | ||||
|     } | ||||
|     return acc | ||||
|   } | ||||
| } | ||||
|  | ||||
| function main = |args| { | ||||
|   println(simple_adder(10,30)) | ||||
|   println(parametrized_adder(10,20)) | ||||
|   println(generic_adder0()) | ||||
|   println(generic_adder1(42)) | ||||
|   println(generic_adder2(20,22)) | ||||
|   println(generic_adder3(10,12,20)) | ||||
|   let list = LinkedList() | ||||
|   list: add(5) | ||||
|   list: add(10) | ||||
|   list: add(15) | ||||
|   list: add(20) | ||||
|   println(list: sum()) | ||||
| } | ||||
							
								
								
									
										88
									
								
								samples/Golo/dynamic-evaluation.golo
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										88
									
								
								samples/Golo/dynamic-evaluation.golo
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,88 @@ | ||||
| # 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.DynamicEvaluation | ||||
|  | ||||
| import gololang.EvaluationEnvironment | ||||
|  | ||||
| local function test_asModule = |env| { | ||||
|   let code = | ||||
| """ | ||||
| module foo | ||||
|  | ||||
| function a = -> "a!" | ||||
| function b = -> "b!" | ||||
| """ | ||||
|   let mod = env: asModule(code) | ||||
|   let a = fun("a", mod) | ||||
|   let b = fun("b", mod) | ||||
|   println(">>> asModule()") | ||||
|   println(a()) | ||||
|   println(b()) | ||||
| } | ||||
|  | ||||
| local function test_anonymousModule = |env| { | ||||
|   let code = | ||||
| """ | ||||
| function a = -> "a." | ||||
| function b = -> "b." | ||||
| """ | ||||
|   let mod = env: anonymousModule(code) | ||||
|   let a = fun("a", mod) | ||||
|   let b = fun("b", mod) | ||||
|   println(">>> anonymousModule()") | ||||
|   println(a()) | ||||
|   println(b()) | ||||
| } | ||||
|  | ||||
| local function test_asFunction = |env| { | ||||
|   let code = "return (a + b) * 2" | ||||
|   let f = env: asFunction(code, "a", "b") | ||||
|   println(">>> asFunction") | ||||
|   println(f(10, 20)) | ||||
| } | ||||
|  | ||||
| local function test_def = |env| { | ||||
|   let code = "|a, b| -> (a + b) * 2" | ||||
|   let f = env: def(code) | ||||
|   println(">>> def") | ||||
|   println(f(10, 20)) | ||||
| } | ||||
|  | ||||
| local function test_run = |env| { | ||||
|   let code = """println(">>> run") | ||||
|   foreach (i in range(0, 3)) { | ||||
|     println("w00t") | ||||
|   }""" | ||||
|   env: run(code) | ||||
| } | ||||
|  | ||||
| local function test_run_map = |env| { | ||||
|   let code = """println(">>> run_map") | ||||
|   println(a) | ||||
|   println(b) | ||||
|   """ | ||||
|   let values = java.util.TreeMap(): add("a", 1): add("b", 2) | ||||
|   env: run(code, values) | ||||
| } | ||||
|  | ||||
| function main = |args| { | ||||
|   let env = EvaluationEnvironment() | ||||
|   test_asModule(env) | ||||
|   test_anonymousModule(env) | ||||
|   test_asFunction(env) | ||||
|   test_def(env) | ||||
|   test_run(env) | ||||
|   test_run_map(env) | ||||
| } | ||||
							
								
								
									
										29
									
								
								samples/Golo/dynamic-object-person.golo
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										29
									
								
								samples/Golo/dynamic-object-person.golo
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,29 @@ | ||||
| # 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.DynamicObjectPerson | ||||
|  | ||||
| local function mrbean = -> DynamicObject(): | ||||
|   name("Mr Bean"): | ||||
|   email("mrbean@gmail.com"): | ||||
|   define("toString", |this| -> this: name() + " <" + this: email() + ">") | ||||
|  | ||||
| function main = |args| { | ||||
|  | ||||
|   let bean = mrbean() | ||||
|   println(bean: toString()) | ||||
|  | ||||
|   bean: email("mrbean@outlook.com") | ||||
|   println(bean: toString()) | ||||
| } | ||||
							
								
								
									
										34
									
								
								samples/Golo/echo-args.golo
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										34
									
								
								samples/Golo/echo-args.golo
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,34 @@ | ||||
| # 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 EchoArgs | ||||
|  | ||||
| function main = |args| { | ||||
|    | ||||
|   println("With a for loop and an index:") | ||||
|   for (var i = 0, i < args: length(), i = i + 1) { | ||||
|     println("  #" + i + " -> " + args: get(i)) | ||||
|   } | ||||
|  | ||||
|   println("With a foreach loop:") | ||||
|   foreach arg in args { | ||||
|     println("  " + arg) | ||||
|   } | ||||
|  | ||||
|   println("With a foreach over a range:") | ||||
|   foreach i in range(0, args: length()) { | ||||
|     println("  #" + i + " -> " + args: get(i)) | ||||
|   } | ||||
| } | ||||
|  | ||||
							
								
								
									
										31
									
								
								samples/Golo/enums-thread-state.golo
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										31
									
								
								samples/Golo/enums-thread-state.golo
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,31 @@ | ||||
| # 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 sample.EnumsThreadState | ||||
|  | ||||
| import java.lang.Thread$State | ||||
|  | ||||
| function main = |args| { | ||||
|  | ||||
|   # Call the enum entry like a function | ||||
|   let new = Thread$State.NEW() | ||||
|   println("name=" + new: name() + ", ordinal=" + new: ordinal()) | ||||
|   println("-----------") | ||||
|  | ||||
|   # Walk through all enum entries | ||||
|   foreach element in Thread$State.values() { | ||||
|     println("name=" + element: name() + ", ordinal=" + element: ordinal()) | ||||
|   } | ||||
| } | ||||
|  | ||||
							
								
								
									
										39
									
								
								samples/Golo/fibonacci.golo
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										39
									
								
								samples/Golo/fibonacci.golo
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,39 @@ | ||||
| # 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.Fibonacci | ||||
|  | ||||
| import java.lang.System | ||||
|  | ||||
| function fib = |n| { | ||||
|   if n <= 1 { | ||||
|     return n | ||||
|   } else { | ||||
|     return fib(n - 1) + fib(n - 2) | ||||
|   } | ||||
| } | ||||
|  | ||||
| local function run = { | ||||
|   let start = System.currentTimeMillis() | ||||
|   let result = fib(40) | ||||
|   let duration = System.currentTimeMillis() - start | ||||
|   println(">>> " + result + " (took " + duration + "ms)") | ||||
| } | ||||
|  | ||||
| function main = |args| { | ||||
|   while true { | ||||
|     run() | ||||
|   } | ||||
| } | ||||
|  | ||||
							
								
								
									
										20
									
								
								samples/Golo/helloworld.golo
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										20
									
								
								samples/Golo/helloworld.golo
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,20 @@ | ||||
| # 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 hello.World | ||||
|  | ||||
| function main = |args| { | ||||
|   println("Hello world!") | ||||
| } | ||||
|  | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user