mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	Compare commits
	
		
			1962 Commits
		
	
	
		
			v1.0.0
			...
			test/attri
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 8f86998866 | ||
|  | d4c8fb8a28 | ||
|  | 351c1cc8fd | ||
|  | 7ee006cbcb | ||
|  | 525304738e | ||
|  | 4a017d9033 | ||
|  | 6f896d988f | ||
|  | 35a9d241fc | ||
|  | 9ba0a7db64 | ||
|  | 9968503872 | ||
|  | 34218c5f58 | ||
|  | ebd41f1f20 | ||
|  | 62b1816297 | ||
|  | 2dfb864e4e | ||
|  | 2d1e1d4747 | ||
|  | f785aa0ae2 | ||
|  | cc476e212e | ||
|  | bca9716fc6 | ||
|  | fae6dbfebd | ||
|  | a7a0800b46 | ||
|  | 305293d3e5 | ||
|  | 17d4eb7a5e | ||
|  | f97e103b6d | ||
|  | dafca264b2 | ||
|  | be970e9e3d | ||
|  | e76837fa20 | ||
|  | e1b3403dc8 | ||
|  | 79da17c5c8 | ||
|  | e9623d542d | ||
|  | bc999f4067 | ||
|  | 474e536ae8 | ||
|  | 79647c5bb4 | ||
|  | 5409c39e35 | ||
|  | 5d4a24dd4f | ||
|  | c97abe7ef5 | ||
|  | edaea7bede | ||
|  | 909bce8ed9 | ||
|  | 4090c492e8 | ||
|  | a24afb0e12 | ||
|  | bc01f8b25f | ||
|  | 077c4141d6 | ||
|  | e5f20314e9 | ||
|  | 8a61bcb6b5 | ||
|  | 61b301b380 | ||
|  | be86f28be1 | ||
|  | a443380869 | ||
|  | 3d1d431cda | ||
|  | 9559ece8af | ||
|  | 8f56a1096d | ||
|  | 0ec85f902a | ||
|  | a47dde2166 | ||
|  | abdd6bfbd2 | ||
|  | d64104f472 | ||
|  | 1cd5ae2d57 | ||
|  | e27bf1627d | ||
|  | 0689d64efd | ||
|  | 3ba47aec38 | ||
|  | b90253981b | ||
|  | 513f678b6c | ||
|  | 478b9cf189 | ||
|  | 6675baff13 | ||
|  | a6efeebd21 | ||
|  | 6e2bb25b6e | ||
|  | a54edf71d1 | ||
|  | 8ff7eaf893 | ||
|  | a8d3872002 | ||
|  | dea03b7a46 | ||
|  | f5723dcccf | ||
|  | d772d1f162 | ||
|  | 46cfd16ae7 | ||
|  | 315243350b | ||
|  | 886d8a7293 | ||
|  | 54318f4001 | ||
|  | b3aee8abab | ||
|  | 1bdbadc1b3 | ||
|  | e0997b311b | ||
|  | 3c2ca312b9 | ||
|  | 315df1339a | ||
|  | e03b3e5ec4 | ||
|  | 43923976c2 | ||
|  | 6b8ee2f3f7 | ||
|  | b8e570bb3d | ||
|  | 69ff3c79b4 | ||
|  | eff4da20f8 | ||
|  | 473688b109 | ||
|  | 7bfb6ed5d7 | ||
|  | 276080aeec | ||
|  | 41c880afc7 | ||
|  | 3d242c3a3a | ||
|  | 9325b07d68 | ||
|  | ddeeb5d416 | ||
|  | c8bc0a5c79 | ||
|  | f58522d5a9 | ||
|  | 27a621531b | ||
|  | 0235433b7e | ||
|  | 6b5d1fe25b | ||
|  | f811ab1b28 | ||
|  | fc73f51855 | ||
|  | dd181421a7 | ||
|  | f6e2189739 | ||
|  | d61f31d3ed | ||
|  | 4e83a6ad23 | ||
|  | 7fc39dc8d1 | ||
|  | f10154a782 | ||
|  | 8761dc4e17 | ||
|  | 5a044b1c07 | ||
|  | 0100b76412 | ||
|  | c8754292f4 | ||
|  | 61faea0298 | ||
|  | b9ecf61dcb | ||
|  | 437f81c4a0 | ||
|  | 26dad7dada | ||
|  | b1e5d6f8f8 | ||
|  | 8c7b54d6e3 | ||
|  | fea0d8963c | ||
|  | 7aca52c68c | ||
|  | 529d3faaf8 | ||
|  | 9f0f4657a2 | ||
|  | 90ff1b5896 | ||
|  | feb82e34d6 | ||
|  | 4d7a34c177 | ||
|  | 5c3385ecd8 | ||
|  | a1af3a509c | ||
|  | 2913a87cc4 | ||
|  | 69cc86c572 | ||
|  | 60144c907e | ||
|  | 1828cf6fc7 | ||
|  | ad4d273241 | ||
|  | 0d03a94cde | ||
|  | 6af5adaac1 | ||
|  | 17a28f2e91 | ||
|  | baaa7a5c13 | ||
|  | cfeb2a833c | ||
|  | e6fd58b3aa | ||
|  | 2ef905ef1e | ||
|  | db80aa84dc | ||
|  | f404cc16a1 | ||
|  | 8b4acf7023 | ||
|  | 7393c2ef91 | ||
|  | 4948ec2999 | ||
|  | 408a325732 | ||
|  | 5ca211b9f7 | ||
|  | bc7596a8b5 | ||
|  | 6762ca8aa7 | ||
|  | bb7d6ab429 | ||
|  | 986611ac36 | ||
|  | 94b4ad1de6 | ||
|  | 3e2f18bf3f | ||
|  | 48c06cc299 | ||
|  | f10821ac49 | ||
|  | cd5298dee6 | ||
|  | a8c955609a | ||
|  | c5acce0604 | ||
|  | a6ccce7b76 | ||
|  | aa72012d41 | ||
|  | 458831b885 | ||
|  | f5e4789ccb | ||
|  | 1b712d2800 | ||
|  | e274196441 | ||
|  | c4c3c27cfe | ||
|  | a2dd9d2c8c | ||
|  | 06e095e5fc | ||
|  | b26d5bc1b1 | ||
|  | 607792e1b2 | ||
|  | fb38135a61 | ||
|  | a5d5b6e6c7 | ||
|  | 2fd2cdf68a | ||
|  | 11049ca3ca | ||
|  | c29bea19ef | ||
|  | 8c8434ed64 | ||
|  | 9281bd043a | ||
|  | 6771f7c272 | ||
|  | 76b896a66d | ||
|  | a12520763c | ||
|  | 819bb7caab | ||
|  | 152205a146 | ||
|  | 85dbcb5444 | ||
|  | df09a746a0 | ||
|  | 5199fcf0a2 | ||
|  | dd557ed00a | ||
|  | addf4e2485 | ||
|  | d9be472ccb | ||
|  | 32828a9af5 | ||
|  | d206131df0 | ||
|  | 65eaf98d0b | ||
|  | 12429b90fe | ||
|  | 621042e639 | ||
|  | 526244be11 | ||
|  | bc53d0b55e | ||
|  | 907d3c5a36 | ||
|  | 898f1e215e | ||
|  | 324ac83489 | ||
|  | 00a873dcc7 | ||
|  | bc34345a56 | ||
|  | 659d27cae5 | ||
|  | 29072d6eae | ||
|  | 1fd59361b5 | ||
|  | 5896bb8fa3 | ||
|  | ea1fc90cf5 | ||
|  | 463f48f04f | ||
|  | cd58a30c7c | ||
|  | c4260ae681 | ||
|  | d40b4a33de | ||
|  | 87498679bd | ||
|  | f4e254202b | ||
|  | e91d225e7d | ||
|  | b90d940aef | ||
|  | b83a364b0e | ||
|  | dbff196b08 | ||
|  | 5b7316fb2a | ||
|  | 2f4ea20fdd | ||
|  | fa4dfe39ba | ||
|  | 89999e60bf | ||
|  | 4819fb12a3 | ||
|  | 27a4eeb206 | ||
|  | bacf4d5780 | ||
|  | f92fed60f8 | ||
|  | 5e797b548c | ||
|  | 700e2f1b2b | ||
|  | 861656978b | ||
|  | 9c05bdac85 | ||
|  | bd34c16c8f | ||
|  | 81fcb4452e | ||
|  | 4f1a5cd456 | ||
|  | 13109bb9b8 | ||
|  | 84f3b3720b | ||
|  | 858a66ccc8 | ||
|  | abb05eace6 | ||
|  | 62bd96a778 | ||
|  | 8cb736adfa | ||
|  | 0758c05186 | ||
|  | 62bc6f0457 | ||
|  | ea7e894139 | ||
|  | 21f0ac99e6 | ||
|  | b251866a29 | ||
|  | bf3db20a9d | ||
|  | bd55147847 | ||
|  | f4d64af39b | ||
|  | b7bda34645 | ||
|  | b13dea6df0 | ||
|  | 28a64c9318 | ||
|  | 74be618fff | ||
|  | 8bbe10bf50 | ||
|  | d275911624 | ||
|  | c26382301c | ||
|  | ae2d3d7e61 | ||
|  | 58ae0908e3 | ||
|  | e12bc07041 | ||
|  | 20416369ac | ||
|  | 2be91e9b2e | ||
|  | e91caeaade | ||
|  | dc1b8d9e80 | ||
|  | bf0a814514 | ||
|  | b14267d40f | ||
|  | 195a4115d8 | ||
|  | e1da8eb841 | ||
|  | bd694c60e1 | ||
|  | 14738f037f | ||
|  | a437943516 | ||
|  | 900ee57de8 | ||
|  | 947f4e1c57 | ||
|  | d9f17a65dd | ||
|  | f71def19ae | ||
|  | e452e85cae | ||
|  | 5059fe90b0 | ||
|  | b90da731d6 | ||
|  | d2012519ba | ||
|  | 1b7f26091c | ||
|  | 548e4f1845 | ||
|  | 625bed8fca | ||
|  | db15367775 | ||
|  | 309d14a955 | ||
|  | 5ff16e1195 | ||
|  | cf43aa9111 | ||
|  | 138c1e6024 | ||
|  | 382870a881 | ||
|  | 31921838cd | ||
|  | a707587182 | ||
|  | bc482af999 | ||
|  | 6818744dae | ||
|  | 607185ac61 | ||
|  | 81b7a412c3 | ||
|  | 09b9a8b441 | ||
|  | 85479cc2de | ||
|  | 3ad4eb2b59 | ||
|  | 878fe95ec3 | ||
|  | 3d23d1be69 | ||
|  | 701e720ab8 | ||
|  | e709ce7d56 | ||
|  | 32c89a5405 | ||
|  | 1735982a73 | ||
|  | 625e0aa1af | ||
|  | 00e1a3f8fd | ||
|  | 539256b08e | ||
|  | ff791f5a39 | ||
|  | de4d48b0fe | ||
|  | b5c49f6d1c | ||
|  | 03cb7d6ffb | ||
|  | 304fc344a1 | ||
|  | 33c42638e9 | ||
|  | 9d940755e7 | ||
|  | bc04232f87 | ||
|  | e17ebec098 | ||
|  | a7cba23526 | ||
|  | 7cd23036a7 | ||
|  | 44c5413abf | ||
|  | 50ab58e91f | ||
|  | 1fd0732390 | ||
|  | ed1b9ee899 | ||
|  | d3c04d6310 | ||
|  | f66ffe305f | ||
|  | 2a9ff0083c | ||
|  | c1cf7ea825 | ||
|  | 67f7268a55 | ||
|  | a55ee7eb09 | ||
|  | 203f6d1944 | ||
|  | 42c68f21d1 | ||
|  | 7e8be1293e | ||
|  | 09c234ec26 | ||
|  | 65a26c3e73 | ||
|  | 98f35aefdc | ||
|  | 38a3714514 | ||
|  | 491700f925 | ||
|  | 4d033e7e83 | ||
|  | efc3638065 | ||
|  | b7685ab317 | ||
|  | 83c5f6a004 | ||
|  | aa5a94cc3e | ||
|  | a5b6331ab5 | ||
|  | 2164b28c64 | ||
|  | 0fb824b345 | ||
|  | 29ee094d66 | ||
|  | 4a7ae50ec8 | ||
|  | 398439a937 | ||
|  | a3bc3a7615 | ||
|  | 7989fbd613 | ||
|  | c389c79be9 | ||
|  | 1fd2f921fd | ||
|  | ed851849db | ||
|  | cfb9f6f0a4 | ||
|  | 3d5a0da62e | ||
|  | 4e15369f9a | ||
|  | 5b3152d99d | ||
|  | a6955f4edb | ||
|  | 280ef7d1bd | ||
|  | 8d2ea90a5b | ||
|  | 4bf7abd73d | ||
|  | 8f251e6756 | ||
|  | 4cd35c1f33 | ||
|  | 78fda33707 | ||
|  | 5c6a98f479 | ||
|  | efbcb942c3 | ||
|  | f3da1bc3b1 | ||
|  | 72a6186f08 | ||
|  | 8cde6d2e8f | ||
|  | 4f2c7fdc3c | ||
|  | 5a830504a4 | ||
|  | 086fb09038 | ||
|  | 5544a041ce | ||
|  | 6447333368 | ||
|  | 1d6a42f0eb | ||
|  | de14b75517 | ||
|  | 0f302713da | ||
|  | a66d064d4a | ||
|  | 4fefe2020f | ||
|  | 72fab07a14 | ||
|  | adbf4f6b17 | ||
|  | cfcf4ca915 | ||
|  | c427fba87f | ||
|  | ab14bcab03 | ||
|  | 78de3fb959 | ||
|  | b9eda90ddd | ||
|  | 66b346c8fb | ||
|  | 8215b225d9 | ||
|  | 41da8c6352 | ||
|  | 04f4b05412 | ||
|  | b7dad4df5e | ||
|  | 1a98ccbf5f | ||
|  | 8d16a3365e | ||
|  | 67bf48fafc | ||
|  | 9a3c9a8c19 | ||
|  | 6a192dae63 | ||
|  | f5895216a8 | ||
|  | 09a33f8daa | ||
|  | 185db0e8d5 | ||
|  | 85efbde3f7 | ||
|  | 93d7aa3d07 | ||
|  | e96096f786 | ||
|  | 0a850eeddd | ||
|  | 42658ffd61 | ||
|  | 24fc2842d2 | ||
|  | ac2723abe3 | ||
|  | 0d0e219532 | ||
|  | cf35807709 | ||
|  | c2b53db96d | ||
|  | 8e6efc3a7d | ||
|  | 4b6f05b4d1 | ||
|  | 7aad5f93e4 | ||
|  | 9b6a7622d2 | ||
|  | 6c666075b5 | ||
|  | 6d26bf5c82 | ||
|  | 6d5da4c9ec | ||
|  | 51dde1f6a4 | ||
|  | 13c9259d23 | ||
|  | a22c2d678b | ||
|  | 5c36f8df85 | ||
|  | 37781cb58e | ||
|  | dcc598442b | ||
|  | 91877056fb | ||
|  | 868e9df434 | ||
|  | c3642ba7ed | ||
|  | 56f128af66 | ||
|  | c1e560b901 | ||
|  | 92bc1cdcdf | ||
|  | 9fde0ec447 | ||
|  | 297ef6195d | ||
|  | 9873157076 | ||
|  | 675c1f3c0b | ||
|  | fee7a34ddc | ||
|  | a148d52aed | ||
|  | 5da8831aff | ||
|  | e9ff0f4998 | ||
|  | 658bf98b4c | ||
|  | 452cfd32d7 | ||
|  | 3f1dc71cc2 | ||
|  | 256157cd42 | ||
|  | 843279ff1d | ||
|  | 8118546ac7 | ||
|  | 15c05c723e | ||
|  | d0d40c0d2e | ||
|  | f494972d04 | ||
|  | 1c4def7320 | ||
|  | 6e22b946bd | ||
|  | 0a54df3a12 | ||
|  | 20af70cd90 | ||
|  | a2f721d4ef | ||
|  | 03a1a733f6 | ||
|  | 4a76088b43 | ||
|  | 5a1dab8073 | ||
|  | 86a97610bd | ||
|  | 87bfe3657a | ||
|  | 3802e31b90 | ||
|  | 4eff60e4b1 | ||
|  | f103306e91 | ||
|  | 8b878784a4 | ||
|  | 44a0d19ac0 | ||
|  | 3023516796 | ||
|  | 6038a06c43 | ||
|  | 20735a4cdd | ||
|  | df3b1a983e | ||
|  | 84e43d7d3f | ||
|  | 7e81a9e50b | ||
|  | 28acee8e33 | ||
|  | 80184f1e1d | ||
|  | d893259e75 | ||
|  | d3f37f5013 | ||
|  | 0e6a46abfc | ||
|  | 49e27387b7 | ||
|  | c2495c27d3 | ||
|  | f0a3acd735 | ||
|  | 29d2930de8 | ||
|  | 2d82071103 | ||
|  | f4a3636371 | ||
|  | d8f96441da | ||
|  | cf5646d45a | ||
|  | 5c3d32cafd | ||
|  | ea45db38e9 | ||
|  | a978c4eb34 | ||
|  | 65302dbec7 | ||
|  | 3c82131863 | ||
|  | 00873da7a6 | ||
|  | a17f7d1cb2 | ||
|  | 9f850db126 | ||
|  | e513ac628a | ||
|  | 3dc11186a1 | ||
|  | 2fbca98e7f | ||
|  | 7ad411fbaa | ||
|  | 4e4e77bc9a | ||
|  | a7afdaa677 | ||
|  | dd24b54a31 | ||
|  | 833e409bd8 | ||
|  | c2a376fbc9 | ||
|  | c21707b8b1 | ||
|  | c04f4519a7 | ||
|  | fd7db27b48 | ||
|  | cab85f3de3 | ||
|  | 34893650eb | ||
|  | bb58840c1c | ||
|  | cbcbb969d5 | ||
|  | 3c21f8db51 | ||
|  | 6c3f8a7787 | ||
|  | 915a11f2b6 | ||
|  | 55ce1e8b93 | ||
|  | ccce5475bf | ||
|  | cb844a1913 | ||
|  | 6c4c2fa0e0 | ||
|  | ba26e1f5d5 | ||
|  | bbddd3f946 | ||
|  | 2634866b91 | ||
|  | d13825daff | ||
|  | e7233db9fa | ||
|  | cec5942d6b | ||
|  | aaef516c22 | ||
|  | 09ae07d003 | ||
|  | a144c9f394 | ||
|  | 0e10a8c857 | ||
|  | 33387b7227 | ||
|  | 3b5a237f1e | ||
|  | 152e3ace99 | ||
|  | 64b6f18e66 | ||
|  | be1003648a | ||
|  | 536800f9f5 | ||
|  | 20f858c305 | ||
|  | 07fdea7496 | ||
|  | 449d675e3d | ||
|  | bdcb9ecffe | ||
|  | 850756cf7d | ||
|  | b3f55c72f8 | ||
|  | 021848eb8e | ||
|  | 06ceed0e66 | ||
|  | d599f000c1 | ||
|  | cd9760d69b | ||
|  | ada4cad25c | ||
|  | 4ba6f9567b | ||
|  | d84867d6f3 | ||
|  | 05aaba4d89 | ||
|  | 33e5d3a444 | ||
|  | 7b6a0e9cad | ||
|  | 8e681359ba | ||
|  | 39e5f5bab3 | ||
|  | 4ff37a783f | ||
|  | 1c5916d3f2 | ||
|  | d8425af684 | ||
|  | 8db3638ce4 | ||
|  | d8cc60a026 | ||
|  | 9f49efef0a | ||
|  | 9d569c8bd5 | ||
|  | 58d65c2d27 | ||
|  | 9c921b331c | ||
|  | b065d8c0d7 | ||
|  | 5148422e39 | ||
|  | 88131e0844 | ||
|  | 6c8c815ad8 | ||
|  | 06cee71e07 | ||
|  | 6106441e58 | ||
|  | a949338a91 | ||
|  | ad93511c98 | ||
|  | 014f026eb2 | ||
|  | ca8ad800ca | ||
|  | 54335c74f6 | ||
|  | fb2f19e666 | ||
|  | 7e9612fe9f | ||
|  | acbe0e4a51 | ||
|  | 22e09a587c | ||
|  | 1b5d35a536 | ||
|  | 5d480fc6d6 | ||
|  | f5b361c31b | ||
|  | 918a69e6f0 | ||
|  | 6d346fdc8d | ||
|  | 09506dbbd9 | ||
|  | e11a671a1d | ||
|  | c72ad3f402 | ||
|  | 48b240630e | ||
|  | 715732bb93 | ||
|  | 2f01a4bd78 | ||
|  | 62e34caa4c | ||
|  | 142dcd27e5 | ||
|  | 2f94e46f1f | ||
|  | 5c5999fbf3 | ||
|  | 26fbc45baf | ||
|  | a2537fa108 | ||
|  | 8e76ba2020 | ||
|  | 0f5e2a1ea4 | ||
|  | 00ff4a1d8a | ||
|  | 98dacd07c2 | ||
|  | 701f5220fc | ||
|  | 2aa27c99b3 | ||
|  | 236f521e13 | ||
|  | d0d6dfa5c0 | ||
|  | 5af528184d | ||
|  | 01c4fba092 | ||
|  | 20c9ed9f36 | ||
|  | 40f4c49ba9 | ||
|  | a265237b2e | ||
|  | a4eea6b8cd | ||
|  | e7f5cadfcb | ||
|  | 21d3a3a141 | ||
|  | 96a162225d | ||
|  | 09c2f763f1 | ||
|  | ce096e277d | ||
|  | c0bb883aaa | ||
|  | 23eea82139 | ||
|  | edd9881642 | ||
|  | e46c6968ba | ||
|  | 1528847249 | ||
|  | 182aaf8fce | ||
|  | d6dfa1dcbc | ||
|  | 6450d5861a | ||
|  | 9562b8ad3d | ||
|  | 507248dd95 | ||
|  | 19a67c07fe | ||
|  | 2ef130530d | ||
|  | 0c6f4383a7 | ||
|  | 97908204a3 | ||
|  | 5606916d99 | ||
|  | 3d4b682d63 | ||
|  | 96561c24be | ||
|  | 0cd1566145 | ||
|  | b6aa9f9b12 | ||
|  | b6d0a41718 | ||
|  | 0240b76cc3 | ||
|  | 3f96bcc32b | ||
|  | 9b8823ab3c | ||
|  | 8ba9446fcd | ||
|  | 04a6af4272 | ||
|  | a1641f2ffa | ||
|  | fe183c07f5 | ||
|  | a620d45635 | ||
|  | fa9660d5a1 | ||
|  | 8b39d30a6e | ||
|  | 090ffa4191 | ||
|  | 42194094a2 | ||
|  | 08058f9f2e | ||
|  | 3d76ba001f | ||
|  | 078a2877c7 | ||
|  | 9ae0bdbb43 | ||
|  | a22ba56596 | ||
|  | b6cadc93f2 | ||
|  | a5fa26461c | ||
|  | a3aaa1ec4d | ||
|  | 5ddcdede74 | ||
|  | c4cdcc8db7 | ||
|  | 7219ebdf3c | ||
|  | cd548c6ed6 | ||
|  | 75140f5d52 | ||
|  | 774303a846 | ||
|  | 6b18b25039 | ||
|  | bb2afbb03d | ||
|  | 50ddb0ba16 | ||
|  | 556a98b525 | ||
|  | 1f022a84ea | ||
|  | 110fa6d384 | ||
|  | c971c14a83 | ||
|  | 4bec82a19e | ||
|  | 0c23050eaf | ||
|  | e1c81a8884 | ||
|  | 19e4dabf01 | ||
|  | a98ad13af4 | ||
|  | 24eb965adb | ||
|  | 852957c769 | ||
|  | e1eff56d6a | ||
|  | 220ecabd8c | ||
|  | 27ea8d0bf5 | ||
|  | 8f02926d68 | ||
|  | 1769083a85 | ||
|  | 05c714af76 | ||
|  | ee3c9bcdbd | ||
|  | f39456ee47 | ||
|  | 911a532051 | ||
|  | 44910dbcd8 | ||
|  | 42cb8ec3cf | ||
|  | 957dd15d5b | ||
|  | 1e9435c999 | ||
|  | dc1b0e3c48 | ||
|  | 2e731a1084 | ||
|  | 869cf8ba11 | ||
|  | d394e8db21 | ||
|  | a8b6267471 | ||
|  | 637682e452 | ||
|  | 38bd07a113 | ||
|  | 68b6152b42 | ||
|  | a349f81e2d | ||
|  | 8c2e41cc99 | ||
|  | 6c0618f75a | ||
|  | b1eed16422 | ||
|  | 432f27480e | ||
|  | 23addec9a9 | ||
|  | e50cc9b210 | ||
|  | 58d865f293 | ||
|  | b69fef2c39 | ||
|  | f8fee56446 | ||
|  | 10903e7e38 | ||
|  | 645411e256 | ||
|  | 29510b26e0 | ||
|  | e4c1cc572b | ||
|  | 7c85c11944 | ||
|  | 5318402be5 | ||
|  | 8323450958 | ||
|  | 68793b1f0f | ||
|  | c6e3c8fab8 | ||
|  | 54c1d7c9d9 | ||
|  | 3a19ba4523 | ||
|  | 210ca9a86f | ||
|  | ff9e0aedd6 | ||
|  | cb9bef43a5 | ||
|  | 115ac6b999 | ||
|  | 4c500e1fb2 | ||
|  | 5715802999 | ||
|  | a2690b7dac | ||
|  | 8b00872d36 | ||
|  | c67c8a7482 | ||
|  | ee370cbf43 | ||
|  | 78217e1cee | ||
|  | 86364da07e | ||
|  | 4ec878ba0d | ||
|  | 28a2b39a55 | ||
|  | 92e1b1eb40 | ||
|  | 3bea39eb10 | ||
|  | a34398eb92 | ||
|  | 2f6035cd1e | ||
|  | e437cf749d | ||
|  | 5218b60681 | ||
|  | 8afe123084 | ||
|  | c60328383d | ||
|  | 69bfe73165 | ||
|  | 3429ddeaa1 | ||
|  | 9242a2f83b | ||
|  | e2b1fe3641 | ||
|  | 0eebd42d72 | ||
|  | b0894e20ef | ||
|  | 0cc47dd47d | ||
|  | fdbfd8b806 | ||
|  | 9f3ee8dff6 | ||
|  | 166012dcf0 | ||
|  | bb754d8849 | ||
|  | 0eaaa2bacc | ||
|  | a1eab2a439 | ||
|  | 487cad7041 | ||
|  | 43f393a02d | ||
|  | 3c1f4c8ee1 | ||
|  | 81db880a7b | ||
|  | 277a71f6f6 | ||
|  | 0cfcb6917b | ||
|  | 681561229e | ||
|  | 43825c3426 | ||
|  | f4fd6ed94e | ||
|  | ef42680646 | ||
|  | 03ce24221e | ||
|  | e9f9a9ef12 | ||
|  | 476b39c353 | ||
|  | 0eea2bd7bb | ||
|  | f78ce5389e | ||
|  | dd32b8f441 | ||
|  | 39a9c768c8 | ||
|  | ff257175ac | ||
|  | 877ee775a3 | ||
|  | 19e151390e | ||
|  | 7da9038e79 | ||
|  | 1f8ef83657 | ||
|  | 2770e4e111 | ||
|  | 96dfbc71eb | ||
|  | 9076086d9b | ||
|  | dc76ca7e37 | ||
|  | 7ee2b60762 | ||
|  | e3a9395b4c | ||
|  | 83513977a4 | ||
|  | 42912141c5 | ||
|  | 8561ece4d7 | ||
|  | 028f2ab92c | ||
|  | 34c83d9495 | ||
|  | e37f5b8df5 | ||
|  | df342798b0 | ||
|  | b91738721b | ||
|  | 123f4c26c3 | ||
|  | 1bbf75b5ab | ||
|  | 70e56303ab | ||
|  | ec2e3428ec | ||
|  | f8601dd663 | ||
|  | df5faa0f21 | ||
|  | 8341992a38 | ||
|  | 293ed8aa8d | ||
|  | 6a8d54e983 | ||
|  | a18155da49 | ||
|  | 2a1e850924 | ||
|  | 528adc1a04 | ||
|  | 9e7b1bf3cb | ||
|  | a517de8168 | ||
|  | a4ab7555e2 | ||
|  | b666123f8e | ||
|  | 8e36ddbafe | ||
|  | abd0c47838 | ||
|  | 8625f91b1b | ||
|  | 6c6b07fc68 | ||
|  | f5a6f20af0 | ||
|  | 76ee294c29 | ||
|  | 77bff8fd6a | ||
|  | 40b2e19310 | ||
|  | aaf281ec0e | ||
|  | 82bc320843 | ||
|  | 1f38db61df | ||
|  | db20462481 | ||
|  | 79be60bf8f | ||
|  | d57ff3abd6 | ||
|  | 49fd25236e | ||
|  | cd6c315fc8 | ||
|  | 60bc772d48 | ||
|  | 7ad99baf32 | ||
|  | 252ae63854 | ||
|  | 7e3a9434ef | ||
|  | f388daab39 | ||
|  | 83a742621f | ||
|  | 89f4885b62 | ||
|  | 23a1ae5085 | ||
|  | 9cd6d6f001 | ||
|  | a15ed48377 | ||
|  | f5e8671481 | ||
|  | 614f4f31ed | ||
|  | 95c8405e0c | ||
|  | e6baa1d690 | ||
|  | 928409a355 | ||
|  | 86c9c9f6f3 | ||
|  | 49f29a53c0 | ||
|  | 40c04c8f6f | ||
|  | 800d26cdad | ||
|  | 016f9852d6 | ||
|  | fbcad41813 | ||
|  | cdf6fb4a22 | ||
|  | 9dc7329601 | ||
|  | bd4204b89e | ||
|  | bbf0e65c74 | ||
|  | b7e2f7cff9 | ||
|  | f9e50f4826 | ||
|  | 184095cc02 | ||
|  | 6a78ac61a7 | ||
|  | b498d51889 | ||
|  | 7fb16b7abe | ||
|  | 7bfdd4086e | ||
|  | dd27ddda17 | ||
|  | b5181488a0 | ||
|  | 001068ec75 | ||
|  | e660442e2e | ||
|  | f7b7a89709 | ||
|  | f46a895ae3 | ||
|  | da396d4c28 | ||
|  | 93556449c9 | ||
|  | 813c150918 | ||
|  | 3ced5ec784 | ||
|  | cdde9096da | ||
|  | 2cb2194686 | ||
|  | 6ae12cd0be | ||
|  | a3e1420476 | ||
|  | 66a2d5fa2e | ||
|  | 582daf273a | ||
|  | 310a804507 | ||
|  | 5e4b860fb7 | ||
|  | 86f78792c4 | ||
|  | 064c62b587 | ||
|  | 7f34de90c6 | ||
|  | 7fb389fda3 | ||
|  | 85e4c58aeb | ||
|  | de47a28ca0 | ||
|  | 0f42d35f29 | ||
|  | d51df2aef3 | ||
|  | 0c02bd18db | ||
|  | 75276c8380 | ||
|  | 442aa4ed33 | ||
|  | 1ab8c8da53 | ||
|  | f03201209f | ||
|  | d79d535182 | ||
|  | 01dc7e2294 | ||
|  | b2d1917fa0 | ||
|  | ca9ca29cc9 | ||
|  | 1ea21fbb8d | ||
|  | 46274496d6 | ||
|  | 16f1f87a8e | ||
|  | 7847e17735 | ||
|  | 8cacd10210 | ||
|  | 9a6446bae3 | ||
|  | f6034b85fb | ||
|  | 55c24a30df | ||
|  | 88afdac5d2 | ||
|  | c5e9023762 | ||
|  | b7d23efc1b | ||
|  | 300d47b36b | ||
|  | e4d381d81c | ||
|  | 3ece15b398 | ||
|  | c8761d39d7 | ||
|  | 51195290b8 | ||
|  | 63cb5aac20 | ||
|  | 11be3f3f08 | ||
|  | 91dd8d4950 | ||
|  | 9c26488f29 | ||
|  | b2a5c30a44 | ||
|  | e3d520dba8 | ||
|  | 715680bc36 | ||
|  | b5df71950d | ||
|  | ed6bcfddef | ||
|  | a633dd8c79 | ||
|  | 0974586d5c | ||
|  | 774f658f67 | ||
|  | 37ef402a1f | ||
|  | 99ad32511e | ||
|  | a282b56f46 | ||
|  | 9845eba9df | ||
|  | a49303c93f | ||
|  | 4adbbc3fcc | ||
|  | 03cadf22fa | ||
|  | 89c8d1e64c | ||
|  | 56ebfae598 | ||
|  | b1bb1a7345 | ||
|  | 4510bf1007 | ||
|  | dd8b368f76 | ||
|  | 17d0b1e02f | ||
|  | 0626def699 | ||
|  | b3c6c85387 | ||
|  | 455266f27d | ||
|  | 567408bc5e | ||
|  | 0c668ee179 | ||
|  | 8c9ba2214a | ||
|  | 8ba773127c | ||
|  | c598c9717d | ||
|  | ef41a1ac67 | ||
|  | 3bc17e822d | ||
|  | 6bd97c7fc7 | ||
|  | f6c4e39dbc | ||
|  | 7c636c4f65 | ||
|  | 6a8de63d2d | ||
|  | 107fee8859 | ||
|  | 00de2b011d | ||
|  | 1cb1705f8e | ||
|  | e0c1a84821 | ||
|  | b7249b671f | ||
|  | f5e86bc691 | ||
|  | 109841ceb1 | ||
|  | 1b96f87888 | ||
|  | 4d40cab954 | ||
|  | 4533b9baaa | ||
|  | 5b35f92bfe | ||
|  | 17d54d61b4 | ||
|  | bc923bb6b1 | ||
|  | 2a867c9c7f | ||
|  | 5a4bbf42c1 | ||
|  | 087ce10f12 | ||
|  | 27092191a8 | ||
|  | bc93a99864 | ||
|  | 2e4fbe3430 | ||
|  | aa78060e41 | ||
|  | 64f77293e8 | ||
|  | 9a42628577 | ||
|  | fc9bc8b9e1 | ||
|  | 2180c11dc6 | ||
|  | 11207283c8 | ||
|  | 8552ec35b3 | ||
|  | 5fdc2e12bf | ||
|  | 37c8a94369 | ||
|  | 7d17d69c1b | ||
|  | ee519aeb4b | ||
|  | a825a013d6 | ||
|  | b4906fc3b8 | ||
|  | fafeead5dc | ||
|  | 5c602d0a4e | ||
|  | 96084fa59a | ||
|  | c8eeda6c8a | ||
|  | 2315cdb993 | ||
|  | 2245174d28 | ||
|  | c089b3f28f | ||
|  | 7e178cc416 | ||
|  | 8603760ebe | ||
|  | 9cae54bb55 | ||
|  | 5bbffb00f5 | ||
|  | 89795ebd1f | ||
|  | 4476a23f5a | ||
|  | 5fb6f34d8a | ||
|  | 834f37810b | ||
|  | 7e9bc26796 | ||
|  | f83f226edc | ||
|  | a04b9dd7cd | ||
|  | f1ffc9e581 | ||
|  | de636f1c0b | ||
|  | ec6ef033a1 | ||
|  | a375a063d5 | ||
|  | d66147a277 | ||
|  | 283cc3a975 | ||
|  | 23af754194 | ||
|  | 50f4050444 | ||
|  | bf11900bc9 | ||
|  | 61b8a8969f | ||
|  | 0fb7017add | ||
|  | 3ecc1f883c | ||
|  | 86329a0758 | ||
|  | 4a5165ad7f | ||
|  | 017c6fd3f2 | ||
|  | 3887acd915 | ||
|  | a80bf9e024 | ||
|  | 27c9774d1b | ||
|  | 10cadb8725 | ||
|  | 9a5d52e460 | ||
|  | a8ae3d3ae5 | ||
|  | 9bf1b5867a | ||
|  | f64a589e98 | ||
|  | 72026d3a3d | ||
|  | 53f29344f8 | ||
|  | 0436973fb7 | ||
|  | 3a8651e31f | ||
|  | 953768641c | ||
|  | b59d80b00c | ||
|  | 56dec42c70 | ||
|  | c88585cffb | ||
|  | 46779da3b5 | ||
|  | 654050a459 | ||
|  | c2ca9f40ac | ||
|  | fe9f186b13 | ||
|  | 01616ef54e | ||
|  | 9fd802a208 | ||
|  | 86e0b94700 | ||
|  | 6e4e5e78ad | ||
|  | 183c280263 | ||
|  | cb0b3a688f | ||
|  | 4f656c200b | ||
|  | 791d9eed41 | ||
|  | edf19a0941 | ||
|  | dfeaaaa17e | ||
|  | bcefa61fe0 | ||
|  | 74775b2e0a | ||
|  | 04c78c8c33 | ||
|  | 762b389721 | ||
|  | 32e10d2c37 | ||
|  | d7baf4ed7b | ||
|  | 5bef198e6d | ||
|  | c03e310422 | ||
|  | 43723ba5ef | ||
|  | 25954c8992 | ||
|  | 12f01e9e94 | ||
|  | 41f7589d4e | ||
|  | d93edf0897 | ||
|  | 7a6202a8c3 | ||
|  | 240f6a63f4 | ||
|  | f0558769f2 | ||
|  | 12086b69ac | ||
|  | e47b312866 | ||
|  | eb5f1468d2 | ||
|  | 77c7ee6d2e | ||
|  | 4f547d79a9 | ||
|  | 8a5b26536e | ||
|  | 355ac3d81a | ||
|  | 8b8123a3c1 | ||
|  | fc44af9343 | ||
|  | 4654553d07 | ||
|  | 940df300e8 | ||
|  | 72b8e1c76f | ||
|  | 92282e3677 | ||
|  | 9e9cbb144e | ||
|  | 8c5f1e201e | ||
|  | ab20c033fe | ||
|  | fd9c657ed4 | ||
|  | fea07d025d | ||
|  | 41a570818d | ||
|  | c1e38425d0 | ||
|  | 6fb4e6836c | ||
|  | a2f9150f50 | ||
|  | 2dcee1e43c | ||
|  | 867a4d96fe | ||
|  | b8c7b71ca5 | ||
|  | 70396ab636 | ||
|  | 67b5b51c47 | ||
|  | 7b443fcdde | ||
|  | d86f8ba12f | ||
|  | 856ee4724c | ||
|  | e635af4ef9 | ||
|  | b30163444f | ||
|  | 051bedefab | ||
|  | 1d7f63e38b | ||
|  | d96657a48b | ||
|  | 8bdd6ea510 | ||
|  | 9f65e702fc | ||
|  | a500dee94e | ||
|  | 1a11a6ab48 | ||
|  | c5f1317b47 | ||
|  | 5e03ff961b | ||
|  | a0c06eb6b9 | ||
|  | 7f9142a41d | ||
|  | 94b3ea3df5 | ||
|  | 6d7eae5011 | ||
|  | 3bbeea3682 | ||
|  | 562ec13696 | ||
|  | a5c3bd7c13 | ||
|  | 6ae6882e1a | ||
|  | c4ad830931 | ||
|  | 5d417b4669 | ||
|  | 02a264fad8 | ||
|  | 31c3c43f64 | ||
|  | 5197ea2488 | ||
|  | 66167de1f9 | ||
|  | 9482c2b822 | ||
|  | 012a9c0e05 | ||
|  | 881201a2c6 | ||
|  | d656988258 | ||
|  | 89f7f8a00b | ||
|  | e4ec48fe8d | ||
|  | 1a4f890d04 | ||
|  | 71633871f3 | ||
|  | f523561e66 | ||
|  | f3007215b1 | ||
|  | 1847b237c9 | ||
|  | 07169db217 | ||
|  | 4b4b368356 | ||
|  | 09ef0cd3e1 | ||
|  | 0f6bca7a3d | ||
|  | 5e3d811902 | ||
|  | 12c655a48a | ||
|  | fdddffe041 | ||
|  | c3aab69b11 | ||
|  | 3f1161d713 | ||
|  | cf14c5fa4f | ||
|  | 8aac009b00 | ||
|  | 05bb8b10fd | ||
|  | ecacbc937b | ||
|  | 86d0f0a84a | ||
|  | 34218d9a5c | ||
|  | de7ca0d954 | ||
|  | 81176f8dfa | ||
|  | 6ee999617e | ||
|  | 88442094f9 | ||
|  | 5037dd5add | ||
|  | aa41c87158 | ||
|  | 569eac2222 | ||
|  | 2de23046cc | ||
|  | ca8b27ff15 | ||
|  | 0f17ba0fcf | ||
|  | d5002ef06a | ||
|  | ce443e73f1 | ||
|  | 89b5e9f5e6 | ||
|  | c6c5e79ccf | ||
|  | 2bac3af299 | ||
|  | 5411c5457d | ||
|  | 92595cffa3 | ||
|  | ad77279bbf | ||
|  | e7d8b99ca2 | ||
|  | f0ad498b93 | ||
|  | 971d848eec | ||
|  | f353fa3890 | ||
|  | 64ce62a804 | ||
|  | bb9537c5b4 | ||
|  | 9f00b5478d | ||
|  | 086b565488 | ||
|  | 27566d93e2 | ||
|  | 7b1c78b848 | ||
|  | 4ec9145700 | ||
|  | 922fe46f56 | ||
|  | d4628cf5db | ||
|  | cb9c3732f2 | ||
|  | ce6a8aa671 | ||
|  | bda61ec3d2 | ||
|  | 3ea0d479fc | ||
|  | 9ff1a9a54c | ||
|  | 024005d912 | ||
|  | 4d7cd834be | ||
|  | 281e7456d5 | ||
|  | f41c79066b | ||
|  | 063ba50952 | ||
|  | 70bc0b3b77 | ||
|  | 057ea80582 | ||
|  | a046e1c380 | ||
|  | e3c2a5e510 | ||
|  | a00967ddc4 | ||
|  | 599e1e2a51 | ||
|  | 44638e1c6b | ||
|  | cabd4fb4c5 | ||
|  | 086845f189 | ||
|  | 413c881af8 | ||
|  | 74eb60a354 | ||
|  | 85e54e9af2 | ||
|  | 245521db22 | ||
|  | 5b8ad31d75 | ||
|  | a0aae8cdc1 | ||
|  | 80321272b1 | ||
|  | 02500d3830 | ||
|  | 921ceaa221 | ||
|  | 5232a45d1f | ||
|  | fdf000ec62 | ||
|  | c7933537b1 | ||
|  | e194d7238e | ||
|  | 33d777a6ff | ||
|  | 1b90dfedf9 | ||
|  | b0b7d75bcd | ||
|  | 74ba0f9c39 | ||
|  | a2d6b374da | ||
|  | 8465961e72 | ||
|  | f5cb6e035d | ||
|  | 7946de7116 | ||
|  | 9e65eb35e7 | ||
|  | 76a1369932 | ||
|  | 12e92f127b | ||
|  | 50f3b2e398 | ||
|  | a716151c83 | ||
|  | 3c70fffb67 | ||
|  | a0a879a3a3 | ||
|  | 5d35d18634 | ||
|  | a3a6c2f8b3 | ||
|  | 8eef1c33b8 | ||
|  | 6182b0fbc2 | ||
|  | 4e4f3c6e17 | ||
|  | 800f445b22 | ||
|  | a9db25cc5b | ||
|  | b5e1bda3e4 | ||
|  | f06167eaca | ||
|  | 687e82307e | ||
|  | d9358d8af3 | ||
|  | fb3e59c6f5 | ||
|  | b3fbd42786 | ||
|  | 590ed26f7b | ||
|  | 12093ee1f0 | ||
|  | c0c0252bab | ||
|  | 02953ac3ef | ||
|  | ee840321d1 | ||
|  | 0cbc44677c | ||
|  | a9b944ac36 | ||
|  | 759860d866 | ||
|  | c4b21f51e4 | ||
|  | fdccffddfc | ||
|  | e610789d38 | ||
|  | 3bd8ed45e4 | ||
|  | 42311e1bf3 | ||
|  | 7c1716aa1e | ||
|  | 9e9aae1d83 | ||
|  | 229ab3a268 | ||
|  | 85840aadc2 | ||
|  | 32b7b3e1b1 | ||
|  | 5e7eeae98e | ||
|  | de8c4daa45 | ||
|  | 64990a00b8 | ||
|  | 6df8bd62d3 | ||
|  | d6e3bcc875 | ||
|  | 200473ba27 | ||
|  | 05fb0c35fa | ||
|  | 33434f08f4 | ||
|  | d5730f6fd1 | ||
|  | 2305496f94 | ||
|  | d031392507 | ||
|  | 7e251d7345 | ||
|  | e33e76a1a7 | ||
|  | 9064369517 | ||
|  | a9c86d5453 | ||
|  | 4b0c975426 | ||
|  | 6ec22a1674 | ||
|  | 71b48eaf55 | ||
|  | 694f51d09e | ||
|  | 79040d00c7 | ||
|  | 7dfc1644ce | ||
|  | 777f1d27d1 | ||
|  | c4a90bbbcd | ||
|  | ac0920a11b | ||
|  | a4bdca6d6b | ||
|  | f9bfcceba9 | ||
|  | e0ceccc0c6 | ||
|  | cd3e88fe8b | ||
|  | 254b6de1d3 | ||
|  | a93e9493e2 | ||
|  | 53b356deee | ||
|  | 9dca6fa9cc | ||
|  | 7226aa18de | ||
|  | ce97865bd2 | ||
|  | 424fa0f56b | ||
|  | 007fc9ebd0 | ||
|  | e0104c8d12 | ||
|  | 1a98a1f938 | ||
|  | e005893d4c | ||
|  | 6c74d854ec | ||
|  | 06b185f725 | ||
|  | 64ec42cf4a | ||
|  | c4b24d9ae1 | ||
|  | e6f38cbf45 | ||
|  | 1764674a13 | ||
|  | 4741a47d21 | ||
|  | 432bffe3ec | ||
|  | 090216df2a | ||
|  | 7b2fec88d1 | ||
|  | 76128ccb37 | ||
|  | f5ede0d0f9 | ||
|  | 70d1649b45 | ||
|  | de706a2eb9 | ||
|  | 33ebee0f6a | ||
|  | 51a989d5f1 | ||
|  | 3fc208b4ce | ||
|  | 0fa54a85d8 | ||
|  | 96e8a5d2cc | ||
|  | 838fbc5626 | ||
|  | 486af800b5 | ||
|  | f0b9b3a35a | ||
|  | 80780ab042 | ||
|  | bd19f6ed17 | ||
|  | 2ae76842a0 | ||
|  | 750804876e | ||
|  | 1d8da964e2 | ||
|  | d21d0f281a | ||
|  | a8e337e0eb | ||
|  | 37429d91a0 | ||
|  | 4b9c6fdf62 | ||
|  | 4130825a43 | ||
|  | 8c42e61271 | ||
|  | 6d95590861 | ||
|  | dbc36a5e63 | ||
|  | 32a106cedd | ||
|  | 78ed103f90 | ||
|  | 3e26b2a0a7 | ||
|  | 4fb910533f | ||
|  | b71cab6add | ||
|  | 394fb528cc | ||
|  | d2f4eec397 | ||
|  | 5f29bf3bb4 | ||
|  | 5a9d35917f | ||
|  | 0029183078 | ||
|  | 0978258f57 | ||
|  | 772a9a582c | ||
|  | e633d565a9 | ||
|  | 7d6ee108c4 | ||
|  | dd64c3b545 | ||
|  | b462e29e1d | ||
|  | 43f4f5bd32 | ||
|  | 904e86d901 | ||
|  | 374164a299 | ||
|  | f73f309595 | ||
|  | f23110a98d | ||
|  | 3193fc90f9 | ||
|  | cc04519520 | ||
|  | f51c5e3159 | ||
|  | a75d918b93 | ||
|  | c439ca5f97 | ||
|  | 4d45f13783 | ||
|  | 2a56719378 | ||
|  | 23289d8901 | ||
|  | 7d594b55e4 | ||
|  | 5268a93fa4 | ||
|  | ae44530a66 | ||
|  | 285216a258 | ||
|  | 4d3720745e | ||
|  | a681a252d4 | ||
|  | 22de40f5f6 | ||
|  | 7fbfe0a4b4 | ||
|  | 29f5ea591f | ||
|  | 438c0a4ec1 | ||
|  | 887933c86a | ||
|  | 53340ddd4c | ||
|  | 72b70a11bc | ||
|  | d853864edb | ||
|  | 62ad763933 | ||
|  | 6a15ae47ee | ||
|  | 1bebb50482 | ||
|  | d351d6091d | ||
|  | fae8f83f64 | ||
|  | d3d62726ae | ||
|  | cf15832504 | ||
|  | fdc81d8818 | ||
|  | 764df07450 | ||
|  | 68dfff60b5 | ||
|  | 479871f019 | ||
|  | 10ec56e667 | ||
|  | 1e958a18f8 | ||
|  | 9fa0f6cd6f | ||
|  | 4e339db911 | ||
|  | c1469b25a1 | ||
|  | ef6abed81a | ||
|  | 96473849e0 | ||
|  | b14e09af6b | ||
|  | 42050c4d12 | ||
|  | 84dc918729 | ||
|  | 032125b114 | ||
|  | b1a137135e | ||
|  | 1a53d1973a | ||
|  | 490afdddd1 | ||
|  | 9822b153eb | ||
|  | 1af71c8945 | ||
|  | acc1a56da4 | ||
|  | bf4596c26d | ||
|  | 3e3fb0cdfe | ||
|  | d907ab9940 | ||
|  | 9c1d6e154c | ||
|  | b5681ca559 | ||
|  | 4b8f362eb7 | ||
|  | 2e39d1d582 | ||
|  | fa797df0c7 | ||
|  | c7100be139 | ||
|  | 91284e5530 | ||
|  | e5cf7ac764 | ||
|  | 3ae785605e | ||
|  | e7ac4e0a29 | ||
|  | b275e53b08 | ||
|  | f363b198e1 | ||
|  | 37c5570cec | ||
|  | 2db2f5a46d | ||
|  | e33f4ca96e | ||
|  | 246580fb43 | ||
|  | fab34da3e7 | ||
|  | a9a28ce58d | ||
|  | f2b80a239f | ||
|  | c6d38ab647 | ||
|  | 420594874a | ||
|  | 912f635d2a | ||
|  | 4ae5dd360f | ||
|  | 407c40f7d3 | ||
|  | 329f9a0fc8 | ||
|  | d62257b149 | ||
|  | 19539404a4 | ||
|  | 9ee0523cad | ||
|  | 89bc82d9df | ||
|  | 30aa3fd5d6 | ||
|  | 846e84fc8c | ||
|  | cd006487b3 | ||
|  | 597ce9adc3 | ||
|  | 61040402df | ||
|  | 8013cd081a | ||
|  | 22cdb9ee90 | ||
|  | df448c0761 | ||
|  | 99c296264a | ||
|  | ba51461604 | ||
|  | 6610d0dd46 | ||
|  | 3adc0e1b16 | ||
|  | 0a47b4865a | ||
|  | 13f1a1fc74 | ||
|  | 3ad129e6e6 | ||
|  | 475e865809 | ||
|  | 1e93e98d30 | ||
|  | d0034b4fb9 | ||
|  | 0c3dcb0a9b | ||
|  | 3138fa79a0 | ||
|  | c88170b6f6 | ||
|  | 3b79cf3cf2 | ||
|  | f3ee7072a6 | ||
|  | 5b5d9da33c | ||
|  | dc1d17a051 | ||
|  | 0bc28d9424 | ||
|  | 5b06a46451 | ||
|  | 8b5b8a9760 | ||
|  | 6c98bbf02c | ||
|  | 9f0964cd7d | ||
|  | b68732f0c7 | ||
|  | 15a746650c | ||
|  | b99abba27f | ||
|  | 9c12823d38 | ||
|  | 28bee50e6a | ||
|  | 4148ff1c29 | ||
|  | e408b5fbaa | ||
|  | e26bf5a0d2 | ||
|  | 465d60ba86 | ||
|  | d5c3978a6e | ||
|  | d4312c05bf | ||
|  | 7efad57176 | ||
|  | 009bff6cc2 | ||
|  | c918c5b742 | ||
|  | 4a33b7ae8e | ||
|  | 777952adcb | ||
|  | ef4c47347d | ||
|  | 5e34315bb3 | ||
|  | 4f5624cd5f | ||
|  | f76d64f9aa | ||
|  | 4444b6daa1 | ||
|  | ec786b73bc | ||
|  | 7ca58f8dd9 | ||
|  | 58420f62d9 | ||
|  | a20631af04 | ||
|  | 44995d6f62 | ||
|  | 2d7dea2d97 | ||
|  | 2cdbe64b66 | ||
|  | 030ad89a14 | ||
|  | a34ee513c0 | ||
|  | 96d29b7662 | ||
|  | 3f077ea71e | ||
|  | de94b85c0d | ||
|  | 1c771cc27d | ||
|  | a41ec3a801 | ||
|  | d9d9e01242 | ||
|  | 04abb5310a | ||
|  | c7ed9bd7b3 | ||
|  | 8aadb5eeaa | ||
|  | e4b5593728 | ||
|  | 14d363b942 | ||
|  | f8c6277946 | ||
|  | 8254bcc3ac | ||
|  | f8389f0d93 | ||
|  | af12db9276 | ||
|  | 688a6bb581 | ||
|  | a8b2b0a86b | ||
|  | 5d5935965a | ||
|  | f795b20582 | ||
|  | c2023d33b9 | ||
|  | d9c375b74a | ||
|  | 7179ec56ef | ||
|  | 26c850c37f | ||
|  | 2023f35af7 | ||
|  | c0a57dbd1b | ||
|  | 78f072b46a | ||
|  | da51510597 | ||
|  | 47389cc827 | ||
|  | f035203e1c | ||
|  | 083f6fc3b4 | ||
|  | d5bfe40f37 | ||
|  | 0b350defb5 | ||
|  | 88d0408875 | ||
|  | c7a155efef | ||
|  | 9187fffc48 | ||
|  | 7d2603ceb7 | ||
|  | c5bb287c74 | ||
|  | 6b6f5eaaff | ||
|  | f3fa2317a6 | ||
|  | d096187196 | ||
|  | c5a3b34546 | ||
|  | 70eafb2ffc | ||
|  | 983a3e6073 | ||
|  | fc8d2f641c | ||
|  | 9a5f9a5e9b | ||
|  | 806369ce7f | ||
|  | 4398cda9a5 | ||
|  | cf6eeec22a | ||
|  | 583e6fe2e8 | ||
|  | 500f8cd869 | ||
|  | 2e5866e6d8 | ||
|  | 600648c8af | ||
|  | 395f4375da | ||
|  | bb348c4038 | ||
|  | 1a4be4dfa0 | ||
|  | 1ac51d2261 | ||
|  | 1766123448 | ||
|  | 5ea039a74e | ||
|  | 0af1a49cbd | ||
|  | 151b7d53b0 | ||
|  | 6e82d2a689 | ||
|  | b02c6c1e54 | ||
|  | cd406cc6b9 | ||
|  | 52d46ddc8c | ||
|  | 188fad1814 | ||
|  | a86ff11084 | ||
|  | 6630f3bc4a | ||
|  | 2164f285f5 | ||
|  | 086855fcce | ||
|  | 33b421ff0b | ||
|  | 36e8fe1b25 | ||
|  | 9696ee589e | ||
|  | f66da93e64 | ||
|  | d766c14305 | ||
|  | 5b749060a4 | ||
|  | 9c76078b4f | ||
|  | c54ffa78f4 | ||
|  | dde1addced | ||
|  | 6108d53eb2 | ||
|  | 7ae475a811 | ||
|  | c3c2c9c7fe | ||
|  | f8955e919b | ||
|  | dc9ad22ec4 | ||
|  | e33cf5f933 | ||
|  | 4c7b432090 | ||
|  | 8afd6a1bd8 | ||
|  | 7725bbb36b | ||
|  | 333d9cfffb | ||
|  | 495b50cbda | ||
|  | fe8dbd662b | ||
|  | cdde73f5ee | ||
|  | 05c49245b0 | ||
|  | 0955dd2ef0 | ||
|  | 6c5a9e97fe | ||
|  | e5d2795ec0 | ||
|  | 61aa378c45 | ||
|  | db296bee80 | ||
|  | 3e091eacc2 | ||
|  | b2303eac1e | ||
|  | c01e347bc0 | ||
|  | 6d8583a0b4 | ||
|  | c85255c5af | ||
|  | 5fac67cea5 | ||
|  | 7b9e0afef9 | ||
|  | b45c4f5379 | ||
|  | 1fa4ed6bc2 | ||
|  | 2d16f863f7 | ||
|  | f5ebbd42d3 | ||
|  | b998a5c282 | ||
|  | 58a9b56f4d | ||
|  | 3ceae6b5c1 | ||
|  | 2612ea35bc | ||
|  | 5bf2299461 | ||
|  | b26e4a7556 | ||
|  | c9bd6096b9 | ||
|  | 7d50697701 | ||
|  | e2314b57fe | ||
|  | 055743f886 | ||
|  | 152151bd44 | ||
|  | 2431f2120c | ||
|  | 6a8e14dcf3 | ||
|  | a07d6f82ee | ||
|  | 116d158336 | ||
|  | 4863d16657 | ||
|  | da97f1af28 | ||
|  | 6a03ea048b | ||
|  | 7924d0d8f8 | ||
|  | 781cd4069c | ||
|  | 505a361d98 | ||
|  | c493c436da | ||
|  | fb7c97c83f | ||
|  | b13001c5cc | ||
|  | 4e916ce94b | ||
|  | 1fad3be12a | ||
|  | 6b688ba696 | ||
|  | 48d8919043 | ||
|  | 0479f72a93 | ||
|  | 1877c8c383 | ||
|  | 5f6d74d849 | ||
|  | 72ae6cd8ca | ||
|  | 8457f6397d | ||
|  | 24820ed935 | ||
|  | ad6947eeb4 | ||
|  | 9c27ec0313 | ||
|  | 7a21d66877 | ||
|  | 7c1265cd2d | ||
|  | 6d73ae58b6 | ||
|  | 2d9d6f5669 | ||
|  | 0a49062a02 | ||
|  | 04bab94c89 | ||
|  | 9bb230d7c8 | ||
|  | 121f096173 | ||
|  | c06f3fbc57 | ||
|  | 831f8a1f1f | ||
|  | 5e4623a44a | ||
|  | 1a60a00d3e | ||
|  | 08eef5f110 | ||
|  | 0e2d3a2ac1 | ||
|  | f852df397b | ||
|  | 041ab041ae | ||
|  | ad9a57f8f9 | ||
|  | b2bf4b0bd9 | ||
|  | c625642845 | ||
|  | 35e077ce86 | ||
|  | 7839459607 | ||
|  | 212be40710 | ||
|  | dc8685f918 | ||
|  | 75072ae5cc | ||
|  | 3edd765076 | ||
|  | 1d66e593e2 | ||
|  | b8bafd246e | ||
|  | 95c822457a | ||
|  | 26df1034ec | ||
|  | c495d19540 | ||
|  | b405847573 | ||
|  | 1abcb2edb7 | ||
|  | e3669d2bb6 | ||
|  | 1b9a49e226 | ||
|  | 0ee716b1e9 | ||
|  | 9469f481f3 | ||
|  | acc190bb04 | ||
|  | 5953e22efb | ||
|  | 2c26486588 | ||
|  | e9d2c0cf28 | ||
|  | a35c3ca739 | ||
|  | 0ee2f17a61 | ||
|  | 83ce189a82 | ||
|  | c97e112c72 | ||
|  | eee124f6c6 | ||
|  | adc9246f66 | ||
|  | 560555bcd8 | ||
|  | 900a6bc2b8 | ||
|  | 3613d09c38 | ||
|  | 02749dd5cf | ||
|  | abda879d5a | ||
|  | d2e909677b | ||
|  | baa42daae8 | ||
|  | 0b2465482a | ||
|  | 453a097c22 | ||
|  | 4b26a56e64 | ||
|  | c1d54db2cc | ||
|  | bcaeb5d464 | ||
|  | d65bbfbe8d | ||
|  | 4c9b16aa08 | ||
|  | 8355f5031a | ||
|  | c794c6e24b | ||
|  | 611b790a2c | ||
|  | 78708df79d | ||
|  | 54a4af75b5 | ||
|  | 72d698ebaa | ||
|  | 209f9f0072 | ||
|  | 93457746ac | ||
|  | 2696a9c5e7 | ||
|  | 7c170972a0 | ||
|  | d00dfd82c1 | ||
|  | 9003139119 | ||
|  | 36e867ec76 | ||
|  | cf4813979c | ||
|  | 7e12c3eff1 | ||
|  | 281cc985bf | ||
|  | dcc2be0781 | ||
|  | 161d076bfd | ||
|  | 09fbcc9a72 | ||
|  | ee2b92cf82 | ||
|  | 3511380c72 | ||
|  | 38736a2db9 | ||
|  | 720914b290 | ||
|  | 16f8e54ed7 | ||
|  | 50ecb63058 | ||
|  | 586650f01c | ||
|  | ae753e6e88 | ||
|  | 04a2845e91 | ||
|  | acb20d95ca | ||
|  | 5a9ef5eac2 | ||
|  | 287e1b855d | ||
|  | d3ebe1844d | ||
|  | fc8492e8f7 | ||
|  | ff5ffd0482 | ||
|  | 50db6d0150 | ||
|  | 2e0b854428 | ||
|  | 1dfb44cff7 | ||
|  | 0a8fad2040 | ||
|  | 9b97d3ac8a | ||
|  | 26e78c0c1b | ||
|  | b036e8d3c2 | ||
|  | f84a904ad8 | ||
|  | b1684037d6 | ||
|  | 7c9e973082 | ||
|  | 1c85d0b38a | ||
|  | 97c998946b | ||
|  | 8529c90a4d | ||
|  | ec3434cf1d | ||
|  | 0e20f6d454 | ||
|  | 696573b14c | ||
|  | fbb31f018c | ||
|  | d92d208a45 | ||
|  | b798e28bfb | ||
|  | ebd6077cd7 | ||
|  | 9e9500dfa9 | ||
|  | 04cc100fba | ||
|  | 31e33f99f2 | ||
|  | 7c51b90586 | ||
|  | 2b36f73da6 | ||
|  | d96dd473b8 | ||
|  | f9066ffb7b | ||
|  | 945941d529 | ||
|  | 10e875e899 | ||
|  | 7f87d22d78 | ||
|  | d890b73c2f | ||
|  | d24e5c938e | ||
|  | aa069a336f | ||
|  | 662fc2ee9d | ||
|  | eca1f61dab | ||
|  | 4126d0e445 | ||
|  | 1d3cffc6dd | ||
|  | 675d0865da | ||
|  | b954d22eba | ||
|  | 567cd6ef68 | ||
|  | 01981c310d | ||
|  | 887a050db9 | ||
|  | bda895eaae | ||
|  | 2e49c06f47 | ||
|  | ae137847b4 | ||
|  | 5443dc50a3 | ||
|  | fc435a2541 | ||
|  | 04394750e7 | ||
|  | e415a1351b | ||
|  | 0ff50a6b02 | ||
|  | 6ec907a915 | ||
|  | 1f55f01fa9 | ||
|  | 5d79b88875 | ||
|  | 458890b4b9 | ||
|  | 89267f792d | ||
|  | b183fcca05 | ||
|  | 684a57dbc0 | ||
|  | e857b23429 | ||
|  | 09c76246f6 | ||
|  | 400086a5c8 | ||
|  | 38b966a554 | ||
|  | 31b0df67b7 | ||
|  | cfe496e9fc | ||
|  | b85aeaad3e | ||
|  | 64f3509222 | ||
|  | f8df871d85 | ||
|  | 620150d188 | ||
|  | 630dca515a | ||
|  | d2de997fcc | ||
|  | b8711f8ccf | ||
|  | 34aaab19b2 | ||
|  | 220108857c | ||
|  | 31d6b110d2 | ||
|  | 29a0db402c | ||
|  | 21a7fe9f12 | ||
|  | 3b558db518 | ||
|  | 44066fbb0b | ||
|  | 0c2794e9de | ||
|  | 69a9ac9366 | ||
|  | 59e199d0c3 | ||
|  | 657adaabec | ||
|  | a41f40a30e | ||
|  | a572b467b4 | ||
|  | 90f1ba95a4 | ||
|  | 286c8a1b4a | ||
|  | 080cd097ba | ||
|  | 866e446dbe | ||
|  | 897f39083d | ||
|  | f8a7d11808 | ||
|  | 0f006af583 | ||
|  | 2bbf92d5f8 | ||
|  | ed70d29943 | ||
|  | dbb089f610 | ||
|  | 23357736b1 | ||
|  | a35fa88f50 | ||
|  | a13f246e4f | ||
|  | f55e53c650 | ||
|  | b6a7b41783 | ||
|  | 704a3e03d6 | ||
|  | 566eaefda9 | ||
|  | 047d23862e | ||
|  | 804e23e995 | ||
|  | 41b7d13aa7 | ||
|  | 4531103033 | ||
|  | 96267e8696 | ||
|  | 16a67cb852 | ||
|  | fbbaff09cd | ||
|  | 6014bd015e | ||
|  | 4a06d2ea7e | ||
|  | 22efcf7aff | ||
|  | e5d302459f | ||
|  | 7aac87681b | ||
|  | 53300ca581 | ||
|  | 52833b58d5 | ||
|  | f5705eaf38 | ||
|  | e2a91bba3e | ||
|  | be1340bafc | ||
|  | 9777798cf7 | ||
|  | b7c4d96e5f | ||
|  | e816a0a1b1 | ||
|  | 1bc9f555e6 | ||
|  | 059f661eb6 | ||
|  | efbcd51ff6 | ||
|  | 9f782fc261 | ||
|  | 5c2bdfd733 | ||
|  | ade20e4b46 | ||
|  | aedbe1d5b7 | ||
|  | 65d05e02c9 | ||
|  | b4378ca89f | ||
|  | 12b27deb78 | ||
|  | 9250d46b5b | ||
|  | 6ac9138aed | ||
|  | bacfd4e832 | ||
|  | 840f6e44d9 | ||
|  | 8a933105fb | ||
|  | 8535c17d98 | ||
|  | fca6a9a9e1 | ||
|  | a81105d987 | ||
|  | 12d2e2ec74 | ||
|  | f44b31148a | ||
|  | 7b6caa0f6c | ||
|  | 314f0e4852 | ||
|  | afedf2557d | ||
|  | 5497bbbd2b | ||
|  | 5cda67530d | ||
|  | 447aef2183 | ||
|  | 6842044b52 | ||
|  | bf944f6d1a | ||
|  | b9779e805e | ||
|  | 80e8ee7ce6 | ||
|  | 0c9a947f39 | ||
|  | 97ae7c1a11 | ||
|  | 3172bf5b46 | ||
|  | 5b28336d56 | ||
|  | b7f58d96cb | ||
|  | d6fb95b06f | ||
|  | db88e143ba | ||
|  | 817e3cb946 | ||
|  | 95c0985952 | ||
|  | 13dbd76e94 | ||
|  | 8ecf2ad322 | ||
|  | d23ab8dcda | ||
|  | 1027047bc7 | ||
|  | 0b98354638 | ||
|  | 36da52e383 | ||
|  | 5a5d334999 | ||
|  | 144655f2c5 | ||
|  | a775b00d9d | ||
|  | eb2c07e511 | ||
|  | ee0ffa0516 | ||
|  | f461150eea | ||
|  | 7292bdc180 | ||
|  | bc84a98b54 | ||
|  | e58f268258 | ||
|  | bbc5225086 | ||
|  | 0867e7b69b | ||
|  | 2637d8dc55 | ||
|  | 79be8b8c67 | ||
|  | 3f391c8694 | ||
|  | 175d4244c2 | ||
|  | d063089430 | ||
|  | 0dcca7228d | ||
|  | cb01be8a4d | ||
|  | 6a62ba7b28 | ||
|  | c1181b1f93 | ||
|  | 7363241531 | ||
|  | 1ac6e87b75 | ||
|  | 138589e88c | ||
|  | 41548405b1 | ||
|  | da6cf8dbb4 | ||
|  | 97399acb73 | ||
|  | 80e9639688 | ||
|  | 6d20232027 | ||
|  | a1525460a3 | ||
|  | 01ef10116e | ||
|  | 41f7f8414c | ||
|  | 189a123760 | ||
|  | a7108e4086 | ||
|  | 5521dd08a0 | ||
|  | b571c47a1c | ||
|  | cf624e44ff | ||
|  | 2b712dc790 | ||
|  | 3d7364877d | ||
|  | 2a324c6289 | ||
|  | 77a6a41fc3 | ||
|  | 076bf7d0c8 | ||
|  | 540f2a0941 | ||
|  | 497da86262 | ||
|  | 4b9b8a5058 | ||
|  | 5568489123 | ||
|  | 5cdd5e206c | ||
|  | c353d3a050 | ||
|  | 6252f12175 | ||
|  | 0067f28246 | ||
|  | ac23d64d26 | ||
|  | 9c9607e42c | ||
|  | 516a220d9f | ||
|  | 7bcf90c527 | ||
|  | 8c83cbe244 | ||
|  | 26f95507ef | ||
|  | 4324971cea | ||
|  | 2672089154 | ||
|  | 48ecae0c95 | ||
|  | 5daaee88b4 | ||
|  | db9475f240 | ||
|  | f68e94f181 | ||
|  | cb70572163 | ||
|  | e9eae4e008 | ||
|  | e33d8f3685 | ||
|  | 645a87d02b | ||
|  | 4484011f08 | ||
|  | c114d710f8 | ||
|  | 9810c693c3 | ||
|  | c804d04072 | ||
|  | fdd81ce0be | ||
|  | 176f6483d0 | ||
|  | ee6650f83f | ||
|  | 3fee3ac549 | ||
|  | 9d555862c3 | ||
|  | ddf3ec4a5b | ||
|  | e2b0f6bb50 | ||
|  | 4d5c9b951b | ||
|  | d566b35020 | ||
|  | 8f85a447de | ||
|  | d0691988a9 | ||
|  | d9ecbf0c24 | ||
|  | d5fa8cbcb7 | ||
|  | 555573071e | ||
|  | ecb2397e59 | ||
|  | 12cfab6d50 | ||
|  | 8a75d4d208 | ||
|  | fd8b70ffa4 | ||
|  | 62498cf0e9 | ||
|  | 543922c68a | ||
|  | 6f6dd8bc38 | ||
|  | 8351d55c56 | ||
|  | 9ecab364d1 | ||
|  | 0172623061 | ||
|  | e5ae9c328b | ||
|  | e0c777d995 | ||
|  | f747b49347 | ||
|  | e0cbe815a3 | ||
|  | a41631d9fa | ||
|  | 645f4d6194 | ||
|  | 46cde87c09 | ||
|  | 91364a9769 | ||
|  | 23b6b4c499 | ||
|  | 1e34faa920 | ||
|  | e0190a5a6e | 
							
								
								
									
										9
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | ||||
| Gemfile linguist-vendored=true | ||||
| lib/linguist.rb linguist-language=Java | ||||
| test/*.rb linguist-language=Java | ||||
| Rakefile linguist-generated | ||||
| test/fixtures/* linguist-vendored=false | ||||
| README.md linguist-documentation=false | ||||
| samples/Arduino/* linguist-documentation | ||||
| samples/Markdown/*.md linguist-detectable=true | ||||
| samples/HTML/*.html linguist-detectable=false | ||||
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -1 +1,3 @@ | ||||
| Gemfile.lock | ||||
| .bundle/ | ||||
| vendor/ | ||||
|   | ||||
							
								
								
									
										11
									
								
								.travis.yml
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								.travis.yml
									
									
									
									
									
								
							| @@ -1,8 +1,11 @@ | ||||
| before_install: sudo apt-get install libicu-dev -y | ||||
| before_install:  | ||||
|   - git fetch origin master:master | ||||
|   - git fetch origin v2.0.0:v2.0.0 | ||||
|   - sudo apt-get install libicu-dev -y | ||||
|   - gem update --system 2.1.11 | ||||
| rvm: | ||||
|   - 1.8.7 | ||||
|   - 1.9.2 | ||||
|   - 1.9.3 | ||||
|   - ree | ||||
|   - 2.0.0 | ||||
|   - 2.1.1 | ||||
| notifications: | ||||
|   disabled: true | ||||
|   | ||||
							
								
								
									
										2
									
								
								LICENSE
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								LICENSE
									
									
									
									
									
								
							| @@ -1,4 +1,4 @@ | ||||
| Copyright (c) 2011 GitHub, Inc. | ||||
| Copyright (c) 2011-2014 GitHub, Inc. | ||||
|  | ||||
| Permission is hereby granted, free of charge, to any person | ||||
| obtaining a copy of this software and associated documentation | ||||
|   | ||||
							
								
								
									
										151
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										151
									
								
								README.md
									
									
									
									
									
								
							| @@ -1,20 +1,24 @@ | ||||
| # 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, highlight code, ignore binary files, suppress generated files in diffs, and generate language breakdown graphs. | ||||
|  | ||||
| ## Features | ||||
|  | ||||
| ### Language detection | ||||
|  | ||||
| Linguist defines the 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 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). In order for a file to be highlighted, a language and a lexer must be defined there. | ||||
|  | ||||
| Most languages are detected by their file extension. This is the fastest and most common situation. For script files, which are usually extensionless, we do "deep content inspection"™ and check the shebang of the file. Checking the file's contents may also be used for disambiguating languages. C, C++ and Obj-C all use `.h` files. Looking for common keywords, we are usually able to guess the correct language. | ||||
| 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 | ||||
| classifier](https://github.com/github/linguist/blob/master/lib/linguist/classifier.rb). | ||||
| This process can help us tell the difference between, for example, `.h` files which could be either C, C++, or Obj-C. | ||||
|  | ||||
| In the actual GitHub app we deal with `Grit::Blob` objects. For testing, there is a simple `FileBlob` API. | ||||
| ```ruby | ||||
|  | ||||
|     Linguist::FileBlob.new("lib/linguist.rb").language.name #=> "Ruby" | ||||
| Linguist::FileBlob.new("lib/linguist.rb").language.name #=> "Ruby" | ||||
|  | ||||
|     Linguist::FileBlob.new("bin/linguist").language.name #=> "Ruby" | ||||
| Linguist::FileBlob.new("bin/linguist").language.name #=> "Ruby" | ||||
| ``` | ||||
|  | ||||
| See [lib/linguist/language.rb](https://github.com/github/linguist/blob/master/lib/linguist/language.rb) and [lib/linguist/languages.yml](https://github.com/github/linguist/blob/master/lib/linguist/languages.yml). | ||||
|  | ||||
| @@ -22,55 +26,65 @@ See [lib/linguist/language.rb](https://github.com/github/linguist/blob/master/li | ||||
|  | ||||
| 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. | ||||
|  | ||||
| We typically run on a prerelease version of Pygments to get early access to new lexers. The [lexers.yml](https://github.com/github/linguist/blob/master/lib/linguist/lexers.yml) file is a dump of the lexers we have available on our server. If there is a new lexer in pygments-main not on the list, [open an issue](https://github.com/github/linguist/issues) and we'll try to upgrade it soon. | ||||
|  | ||||
| ### MIME type detection | ||||
|  | ||||
| Most of the MIME types handling is done by the Ruby [mime-types gem](https://github.com/halostatue/mime-types). But we have our own list of additions and overrides. To add or modify this list, see [lib/linguist/mimes.yml](https://github.com/github/linguist/blob/master/lib/linguist/mimes.yml). | ||||
|  | ||||
| MIME types are used to set the Content-Type of raw binary blobs which are served from a special `raw.github.com` domain. However, all text blobs are served as `text/plain` regardless of their type to ensure they open in the browser rather than downloading. | ||||
|  | ||||
| The MIME type also determines whether a blob is binary or plain text. So if you're seeing a blob that says "View Raw" and it is actually plain text, the mime type and encoding probably needs to be explicitly stated. | ||||
|  | ||||
|     Linguist::FileBlob.new("linguist.zip").binary? #=> true | ||||
|  | ||||
| See [lib/linguist/mimes.yml](https://github.com/github/linguist/blob/master/lib/linguist/mimes.yml). | ||||
|  | ||||
| ### Stats | ||||
|  | ||||
| The [Language Graph](https://github.com/github/linguist/graphs/languages) is built by aggregating the languages of all repo's blobs. The top language in the graph determines the project's primary language. Collectively, these stats make up the [Top Languages](https://github.com/languages) page. | ||||
| The Language stats bar that you see on every repository is built by aggregating the languages of each file in that repository. The top language in the graph determines the project's primary language. | ||||
|  | ||||
| The repository stats API can be used on a directory: | ||||
| The repository stats API, accessed through `#languages`, can be used on a directory: | ||||
|  | ||||
|     project = Linguist::Repository.from_directory(".") | ||||
|     project.language.name  #=> "Ruby" | ||||
|     project.languages      #=> { "Ruby" => 0.98, | ||||
|                                  "Shell" => 0.02 } | ||||
| ```ruby | ||||
| project = Linguist::Repository.from_directory(".") | ||||
| project.language.name  #=> "Ruby" | ||||
| project.languages      #=> { "Ruby" => 0.98, "Shell" => 0.02 } | ||||
| ``` | ||||
|  | ||||
| These stats are also printed out by the binary. Try running `linguist` on itself: | ||||
| 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. | ||||
|  | ||||
|     $ bundle exec linguist lib/ | ||||
|     100%  Ruby | ||||
| You can try running `linguist` on the `lib/` directory in this repository itself: | ||||
|  | ||||
|     $ bundle exec linguist lib/ --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 | ||||
|  | ||||
| #### Ignore vendored files | ||||
|  | ||||
| Checking other code into your git repo is a common practice. But this often inflates your project's language stats and may even cause your project to be labeled as another language. We are able to identify some of these files and directories and exclude them. | ||||
|  | ||||
|     Linguist::FileBlob.new("vendor/plugins/foo.rb").vendored? # => true | ||||
| ```ruby | ||||
| Linguist::FileBlob.new("vendor/plugins/foo.rb").vendored? # => true | ||||
| ``` | ||||
|  | ||||
| See [Linguist::BlobHelper#vendored?](https://github.com/github/linguist/blob/master/lib/linguist/blob_helper.rb) and [lib/linguist/vendor.yml](https://github.com/github/linguist/blob/master/lib/linguist/vendor.yml). | ||||
|  | ||||
| #### Generated file detection | ||||
|  | ||||
| Not all plain text files are true source files. Generated files like minified js and compiled CoffeeScript can be detected and excluded from language stats. As an extra bonus, these files are suppressed in Diffs. | ||||
| Not all plain text files are true source files. Generated files like minified js and compiled CoffeeScript can be detected and excluded from language stats. As an extra bonus, these files are suppressed in diffs. | ||||
|  | ||||
|     Linguist::FileBlob.new("underscore.min.js").generated? # => true | ||||
| ```ruby | ||||
| Linguist::FileBlob.new("underscore.min.js").generated? # => true | ||||
| ``` | ||||
|  | ||||
| See [Linguist::BlobHelper#generated?](https://github.com/github/linguist/blob/master/lib/linguist/blob_helper.rb). | ||||
| See [Linguist::Generated#generated?](https://github.com/github/linguist/blob/master/lib/linguist/generated.rb). | ||||
|  | ||||
| ## Installation | ||||
|  | ||||
| To get it, clone the repo and run [Bundler](http://gembundler.com/) to install its dependencies. | ||||
| 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. | ||||
|  | ||||
|     git clone https://github.com/github/linguist.git | ||||
|     cd linguist/ | ||||
| @@ -80,17 +94,62 @@ To run the tests: | ||||
|  | ||||
|     bundle exec rake test | ||||
|  | ||||
| *Since this code is specific to GitHub, is not published as a official rubygem.* | ||||
|  | ||||
| If you are seeing errors like `StandardError: could not find any magic files!`, it means the CharlockHolmes gem didn’t install correctly. See the [installing section](https://github.com/brianmario/charlock_holmes/blob/master/README.md) of the CharlockHolmes README for more information. | ||||
|  | ||||
| ## Contributing | ||||
|  | ||||
| 1. Fork it. | ||||
| 2. Create a branch (`git checkout -b detect-foo-language`) | ||||
| 3. Make your changes | ||||
| 4. Run the tests (`bundle install` then `bundle exec rake`) | ||||
| 5. Commit your changes (`git commit -am "Added detection for the new Foo language"`) | ||||
| 6. Push to the branch (`git push origin detect-foo-language`) | ||||
| 7. Create a [Pull Request](http://help.github.com/pull-requests/) from your branch. | ||||
| 8. Promote it. Get others to drop in and +1 it. | ||||
| 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`: | ||||
|  | ||||
| ``` | ||||
| Perl: | ||||
|   type: programming | ||||
|   ace_mode: perl | ||||
|   color: "#0298c3" | ||||
|   extensions: | ||||
|   - .pl | ||||
|   - .PL | ||||
|   - .perl | ||||
|   - .ph | ||||
|   - .plx | ||||
|   - .pm | ||||
|   - .pod | ||||
|   - .psgi | ||||
|   interpreters: | ||||
|   - perl | ||||
| ``` | ||||
| Any of the extensions defined are valid but the first in this array should be the most popular. | ||||
|  | ||||
| ### Testing | ||||
|  | ||||
| Sometimes getting the tests running can be too much work, especially if you don't have much Ruby experience. It's okay: be lazy and let our build bot [Travis](http://travis-ci.org/#!/github/linguist) run the tests for you. Just open a pull request and the bot will start cranking away. | ||||
|  | ||||
| Here's our current build status, which is hopefully green: [](http://travis-ci.org/github/linguist) | ||||
|  | ||||
| ### Releasing | ||||
|  | ||||
| If you are the current maintainer of this gem: | ||||
|  | ||||
|  0. Create a branch for the release: `git checkout -b cut-release-vxx.xx.xx` | ||||
|  0. Make sure your local dependencies are up to date: `bundle install` | ||||
|  0. Ensure that samples are updated: `bundle exec rake samples` | ||||
|  0. Ensure that tests are green: `bundle exec rake test` | ||||
|  0. Bump gem version in `lib/linguist/version.rb`.  For example, [like this](https://github.com/github/linguist/commit/8d2ea90a5ba3b2fe6e1508b7155aa4632eea2985). | ||||
|  0. Make a PR to github/linguist.  For example, [#1238](https://github.com/github/linguist/pull/1238). | ||||
|  0. Build a local gem: `gem build github-linguist.gemspec` | ||||
|  0. Testing: | ||||
|    0. Bump the Gemfile and Gemfile.lock versions for an app which relies on this gem | ||||
|    0. Install the new gem locally | ||||
|    0. Test behavior locally, branch deploy, whatever needs to happen | ||||
|  0. Merge github/linguist PR | ||||
|  0. Tag and push: `git tag vx.xx.xx; git push --tags` | ||||
|  0. Push to rubygems.org -- `gem push github-linguist-3.0.0.gem` | ||||
|   | ||||
							
								
								
									
										70
									
								
								Rakefile
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										70
									
								
								Rakefile
									
									
									
										generated
									
									
									
								
							| @@ -1,7 +1,73 @@ | ||||
| require 'json' | ||||
| require 'rake/clean' | ||||
| require 'rake/testtask' | ||||
| require 'yaml' | ||||
|  | ||||
| task :default => :test | ||||
|  | ||||
| Rake::TestTask.new do |t| | ||||
|   t.warning = true | ||||
| 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 } | ||||
| end | ||||
|  | ||||
| task :build_gem do | ||||
|   languages = YAML.load_file("lib/linguist/languages.yml") | ||||
|   File.write("lib/linguist/languages.json", JSON.dump(languages)) | ||||
|   `gem build github-linguist.gemspec` | ||||
|   File.delete("lib/linguist/languages.json") | ||||
| end | ||||
|  | ||||
| namespace :classifier do | ||||
|   LIMIT = 1_000 | ||||
|  | ||||
|   desc "Run classifier against #{LIMIT} public gists" | ||||
|   task :test do | ||||
|     require 'linguist/classifier' | ||||
|     require 'linguist/samples' | ||||
|  | ||||
|     total, correct, incorrect = 0, 0, 0 | ||||
|     $stdout.sync = true | ||||
|  | ||||
|     each_public_gist do |gist_url, file_url, file_language| | ||||
|       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 | ||||
|  | ||||
|         total += 1 | ||||
|         guessed_language == file_language ? correct += 1 : incorrect += 1 | ||||
|  | ||||
|         print "\r\e[0K%d:%d  %g%%" % [correct, incorrect, (correct.to_f/total.to_f)*100] | ||||
|         $stdout.flush | ||||
|       rescue URI::InvalidURIError | ||||
|       else | ||||
|         break if total >= LIMIT | ||||
|       end | ||||
|     end | ||||
|     puts "" | ||||
|   end | ||||
|  | ||||
|   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) | ||||
|  | ||||
|       for gist in gists | ||||
|         for filename, attrs in gist['files'] | ||||
|           yield gist['url'], attrs['raw_url'], attrs['language'] | ||||
|         end | ||||
|       end | ||||
|     end | ||||
|   end | ||||
| end | ||||
|   | ||||
							
								
								
									
										36
									
								
								bin/linguist
									
									
									
									
									
								
							
							
						
						
									
										36
									
								
								bin/linguist
									
									
									
									
									
								
							| @@ -1,15 +1,42 @@ | ||||
| #!/usr/bin/env ruby | ||||
|  | ||||
| # linguist — detect language type for a file, or, given a directory, determine language breakdown | ||||
| #     usage: linguist <path> [<--breakdown>] | ||||
|  | ||||
| require 'linguist/file_blob' | ||||
| require 'linguist/language' | ||||
| require 'linguist/repository' | ||||
| require 'rugged' | ||||
|  | ||||
| path = ARGV[0] || Dir.pwd | ||||
|  | ||||
| # special case if not given a directory but still given the --breakdown option | ||||
| if path == "--breakdown" | ||||
|   path = Dir.pwd | ||||
|   breakdown = true | ||||
| end | ||||
|  | ||||
| ARGV.shift | ||||
| breakdown = true if ARGV[0] == "--breakdown" | ||||
|  | ||||
| if File.directory?(path) | ||||
|   repo = Linguist::Repository.from_directory(path) | ||||
|   rugged = Rugged::Repository.new(path) | ||||
|   repo = Linguist::Repository.new(rugged, rugged.head.target_id) | ||||
|   repo.languages.sort_by { |_, size| size }.reverse.each do |language, size| | ||||
|     percentage = ((size / repo.size.to_f) * 100).round | ||||
|     puts "%-4s %s" % ["#{percentage}%", language] | ||||
|     percentage = ((size / repo.size.to_f) * 100) | ||||
|     percentage = sprintf '%.2f' % percentage | ||||
|     puts "%-7s %s" % ["#{percentage}%", language] | ||||
|   end | ||||
|   if breakdown | ||||
|     puts | ||||
|     file_breakdown = repo.breakdown_by_file | ||||
|     file_breakdown.each do |lang, files| | ||||
|       puts "#{lang}:" | ||||
|       files.each do |file| | ||||
|         puts file | ||||
|       end | ||||
|       puts | ||||
|     end | ||||
|   end | ||||
| elsif File.file?(path) | ||||
|   blob = Linguist::FileBlob.new(path, Dir.pwd) | ||||
| @@ -23,12 +50,11 @@ elsif File.file?(path) | ||||
|  | ||||
|   puts "#{blob.name}: #{blob.loc} lines (#{blob.sloc} sloc)" | ||||
|   puts "  type:      #{type}" | ||||
|   puts "  extension: #{blob.pathname.extname}" | ||||
|   puts "  mime type: #{blob.mime_type}" | ||||
|   puts "  language:  #{blob.language}" | ||||
|  | ||||
|   if blob.large? | ||||
|     puts "  blob is to large to be shown" | ||||
|     puts "  blob is too large to be shown" | ||||
|   end | ||||
|  | ||||
|   if blob.generated? | ||||
|   | ||||
| @@ -1,16 +1,26 @@ | ||||
| require File.expand_path('../lib/linguist/version', __FILE__) | ||||
|  | ||||
| Gem::Specification.new do |s| | ||||
|   s.name    = 'github-linguist' | ||||
|   s.version = '1.0.0' | ||||
|   s.version = Linguist::VERSION | ||||
|   s.summary = "GitHub Language detection" | ||||
|   s.description = '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.' | ||||
|  | ||||
|   s.authors = "GitHub" | ||||
|   s.authors  = "GitHub" | ||||
|   s.homepage = "https://github.com/github/linguist" | ||||
|   s.license  = "MIT" | ||||
|  | ||||
|   s.files = Dir['lib/**/*'] | ||||
|   s.executables << 'linguist' | ||||
|  | ||||
|   s.add_dependency 'charlock_holmes', '~> 0.6.6' | ||||
|   s.add_dependency 'escape_utils',    '~> 0.2.3' | ||||
|   s.add_dependency 'mime-types',      '~> 1.18' | ||||
|   s.add_dependency 'pygments.rb',     '~> 0.2.13' | ||||
|   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_development_dependency 'json' | ||||
|   s.add_development_dependency 'mocha' | ||||
|   s.add_development_dependency 'rake' | ||||
|   s.add_development_dependency 'yajl-ruby' | ||||
| end | ||||
|   | ||||
| @@ -1,5 +1,7 @@ | ||||
| require 'linguist/blob_helper' | ||||
| require 'linguist/generated' | ||||
| require 'linguist/heuristics' | ||||
| require 'linguist/language' | ||||
| require 'linguist/mime' | ||||
| require 'linguist/pathname' | ||||
| require 'linguist/repository' | ||||
| require 'linguist/samples' | ||||
| require 'linguist/version' | ||||
|   | ||||
| @@ -1,23 +1,20 @@ | ||||
| require 'linguist/language' | ||||
| require 'linguist/mime' | ||||
| require 'linguist/pathname' | ||||
|  | ||||
| require 'linguist/generated' | ||||
| require 'charlock_holmes' | ||||
| require 'escape_utils' | ||||
| require 'mime/types' | ||||
| require 'pygments' | ||||
| require 'yaml' | ||||
|  | ||||
| module Linguist | ||||
|   # DEPRECATED Avoid mixing into Blob classes. Prefer functional interfaces | ||||
|   # like `Language.detect` over `Blob#language`. Functions are much easier to | ||||
|   # cache and compose. | ||||
|   # | ||||
|   # Avoid adding additional bloat to this module. | ||||
|   # | ||||
|   # BlobHelper is a mixin for Blobish classes that respond to "name", | ||||
|   # "data" and "size" such as Grit::Blob. | ||||
|   module BlobHelper | ||||
|     # Internal: Get a Pathname wrapper for Blob#name | ||||
|     # | ||||
|     # Returns a Pathname. | ||||
|     def pathname | ||||
|       Pathname.new(name || "") | ||||
|     end | ||||
|  | ||||
|     # Public: Get the extname of the path | ||||
|     # | ||||
|     # Examples | ||||
| @@ -27,7 +24,23 @@ module Linguist | ||||
|     # | ||||
|     # Returns a String | ||||
|     def extname | ||||
|       pathname.extname | ||||
|       File.extname(name.to_s) | ||||
|     end | ||||
|  | ||||
|     # Internal: Lookup mime type for extension. | ||||
|     # | ||||
|     # Returns a MIME::Type | ||||
|     def _mime_type | ||||
|       if defined? @_mime_type | ||||
|         @_mime_type | ||||
|       else | ||||
|         guesses = ::MIME::Types.type_for(extname.to_s) | ||||
|  | ||||
|         # Prefer text mime types over binary | ||||
|         @_mime_type = guesses.detect { |type| type.ascii? } || | ||||
|           # Otherwise use the first guess | ||||
|           guesses.first | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     # Public: Get the actual blob mime type | ||||
| @@ -39,7 +52,23 @@ module Linguist | ||||
|     # | ||||
|     # Returns a mime type String. | ||||
|     def mime_type | ||||
|       @mime_type ||= pathname.mime_type | ||||
|       _mime_type ? _mime_type.to_s : 'text/plain' | ||||
|     end | ||||
|  | ||||
|     # Internal: Is the blob binary according to its mime type | ||||
|     # | ||||
|     # Return true or false | ||||
|     def binary_mime_type? | ||||
|       _mime_type ? _mime_type.binary? : false | ||||
|     end | ||||
|  | ||||
|     # Internal: Is the blob binary according to its mime type, | ||||
|     # overriding it if we have better data from the languages.yml | ||||
|     # database. | ||||
|     # | ||||
|     # Return true or false | ||||
|     def likely_binary? | ||||
|       binary_mime_type? && !Language.find_by_filename(name) | ||||
|     end | ||||
|  | ||||
|     # Public: Get the Content-Type header value | ||||
| @@ -71,7 +100,7 @@ module Linguist | ||||
|       elsif name.nil? | ||||
|         "attachment" | ||||
|       else | ||||
|         "attachment; filename=#{EscapeUtils.escape_url(pathname.basename)}" | ||||
|         "attachment; filename=#{EscapeUtils.escape_url(File.basename(name))}" | ||||
|       end | ||||
|     end | ||||
|  | ||||
| @@ -81,6 +110,12 @@ module Linguist | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     def ruby_encoding | ||||
|       if hash = detect_encoding | ||||
|         hash[:ruby_encoding] | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     # Try to guess the encoding | ||||
|     # | ||||
|     # Returns: a Hash, with :encoding, :confidence, :type | ||||
| @@ -90,15 +125,6 @@ module Linguist | ||||
|       @detect_encoding ||= CharlockHolmes::EncodingDetector.new.detect(data) if data | ||||
|     end | ||||
|  | ||||
|     # Public: Is the blob binary according to its mime type | ||||
|     # | ||||
|     # Return true or false | ||||
|     def binary_mime_type? | ||||
|       if mime_type = Mime.lookup_mime_type_for(pathname.extname) | ||||
|         mime_type.binary? | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     # Public: Is the blob binary? | ||||
|     # | ||||
|     # Return true or false | ||||
| @@ -132,23 +158,28 @@ module Linguist | ||||
|     # | ||||
|     # Return true or false | ||||
|     def image? | ||||
|       ['.png', '.jpg', '.jpeg', '.gif'].include?(extname) | ||||
|       ['.png', '.jpg', '.jpeg', '.gif'].include?(extname.downcase) | ||||
|     end | ||||
|  | ||||
|     # Public: Is the blob a possible drupal php file? | ||||
|     # Public: Is the blob a supported 3D model format? | ||||
|     # | ||||
|     # Return true or false | ||||
|     def drupal_extname? | ||||
|       ['.module', '.install', '.test', '.inc'].include?(extname) | ||||
|     def solid? | ||||
|       extname.downcase == '.stl' | ||||
|     end | ||||
|  | ||||
|     # Public: Is the blob likely to have a shebang? | ||||
|     # Public: Is this blob a CSV file? | ||||
|     # | ||||
|     # Return true or false | ||||
|     def shebang_extname? | ||||
|       extname.empty? && | ||||
|         mode && | ||||
|         (mode.to_i(8) & 05) == 05 | ||||
|     def csv? | ||||
|       text? && extname.downcase == '.csv' | ||||
|     end | ||||
|  | ||||
|     # Public: Is the blob a PDF? | ||||
|     # | ||||
|     # Return true or false | ||||
|     def pdf? | ||||
|       extname.downcase == '.pdf' | ||||
|     end | ||||
|  | ||||
|     MEGABYTE = 1024 * 1024 | ||||
| @@ -162,14 +193,13 @@ module Linguist | ||||
|  | ||||
|     # Public: Is the blob safe to colorize? | ||||
|     # | ||||
|     # We use Pygments.rb for syntax highlighting blobs, which | ||||
|     # has some quirks and also is essentially 'un-killable' via | ||||
|     # normal timeout.  To workaround this we try to | ||||
|     # carefully handling Pygments.rb anything it can't handle. | ||||
|     # 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? | ||||
|       text? && !large? && !high_ratio_of_long_lines? | ||||
|       !large? && text? && !high_ratio_of_long_lines? | ||||
|     end | ||||
|  | ||||
|     # Internal: Does the blob have a ratio of long lines? | ||||
| @@ -213,7 +243,36 @@ module Linguist | ||||
|     # | ||||
|     # Returns an Array of lines | ||||
|     def lines | ||||
|       @lines ||= (viewable? && data) ? data.split("\n", -1) : [] | ||||
|       @lines ||= | ||||
|         if viewable? && data | ||||
|           # `data` is usually encoded as ASCII-8BIT even when the content has | ||||
|           # been detected as a different encoding. However, we are not allowed | ||||
|           # to change the encoding of `data` because we've made the implicit | ||||
|           # guarantee that each entry in `lines` is encoded the same way as | ||||
|           # `data`. | ||||
|           # | ||||
|           # Instead, we re-encode each possible newline sequence as the | ||||
|           # detected encoding, then force them back to the encoding of `data` | ||||
|           # (usually a binary encoding like ASCII-8BIT). This means that the | ||||
|           # byte sequence will match how newlines are likely encoded in the | ||||
|           # file, but we don't have to change the encoding of `data` as far as | ||||
|           # Ruby is concerned. This allows us to correctly parse out each line | ||||
|           # without changing the encoding of `data`, and | ||||
|           # also--importantly--without having to duplicate many (potentially | ||||
|           # large) strings. | ||||
|           begin | ||||
|             encoded_newlines = ["\r\n", "\r", "\n"]. | ||||
|               map { |nl| nl.encode(ruby_encoding, "ASCII-8BIT").force_encoding(data.encoding) } | ||||
|  | ||||
|             data.split(Regexp.union(encoded_newlines), -1) | ||||
|           rescue Encoding::ConverterNotFoundError | ||||
|             # The data is not splittable in the detected encoding.  Assume it's | ||||
|             # one big line. | ||||
|             [data] | ||||
|           end | ||||
|         else | ||||
|           [] | ||||
|         end | ||||
|     end | ||||
|  | ||||
|     # Public: Get number of lines of code | ||||
| @@ -234,171 +293,16 @@ module Linguist | ||||
|       lines.grep(/\S/).size | ||||
|     end | ||||
|  | ||||
|     # Internal: Compute average line length. | ||||
|     # | ||||
|     # Returns Integer. | ||||
|     def average_line_length | ||||
|       if lines.any? | ||||
|         lines.inject(0) { |n, l| n += l.length } / lines.length | ||||
|       else | ||||
|         0 | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     # Public: Is the blob a generated file? | ||||
|     # | ||||
|     # Generated source code is supressed in diffs and is ignored by | ||||
|     # Generated source code is suppressed in diffs and is ignored by | ||||
|     # language statistics. | ||||
|     # | ||||
|     # Requires Blob#data | ||||
|     # | ||||
|     # Includes: | ||||
|     # - XCode project XML files | ||||
|     # - Minified JavaScript | ||||
|     # - Compiled CoffeeScript | ||||
|     # - PEG.js-generated parsers | ||||
|     # | ||||
|     # Please add additional test coverage to | ||||
|     # `test/test_blob.rb#test_generated` if you make any changes. | ||||
|     # May load Blob#data | ||||
|     # | ||||
|     # Return true or false | ||||
|     def generated? | ||||
|       if name == 'Gemfile.lock' || minified_javascript? || compiled_coffeescript? || | ||||
|       xcode_project_file? || generated_net_docfile? || generated_parser? | ||||
|         true | ||||
|       else | ||||
|         false | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     # Internal: Is the blob an XCode project file? | ||||
|     # | ||||
|     # Generated if the file extension is an XCode project | ||||
|     # file extension. | ||||
|     # | ||||
|     # Returns true of false. | ||||
|     def xcode_project_file? | ||||
|       ['.xib', '.nib', '.storyboard', '.pbxproj', '.xcworkspacedata', '.xcuserstate'].include?(extname) | ||||
|     end | ||||
|  | ||||
|     # Internal: Is the blob minified JS? | ||||
|     # | ||||
|     # Consider JS minified if the average line length is | ||||
|     # greater then 100c. | ||||
|     # | ||||
|     # Returns true or false. | ||||
|     def minified_javascript? | ||||
|       return unless extname == '.js' | ||||
|       average_line_length > 100 | ||||
|     end | ||||
|  | ||||
|     # Internal: Is the blob of JS a parser generated by PEG.js? | ||||
|     # | ||||
|     # Requires Blob#data | ||||
|     # | ||||
|     # PEG.js-generated parsers are not meant to be consumed by humans. | ||||
|     # | ||||
|     # Return true or false | ||||
|     def generated_parser? | ||||
|       return false unless extname == '.js' | ||||
|  | ||||
|       # PEG.js-generated parsers include a comment near the top  of the file | ||||
|       # that marks them as such. | ||||
|       if lines[0..4].join('') =~ /^(?:[^\/]|\/[^\*])*\/\*(?:[^\*]|\*[^\/])*Generated by PEG.js/ | ||||
|         return true | ||||
|       end | ||||
|  | ||||
|       false | ||||
|     end | ||||
|  | ||||
|     # Internal: Is the blob of JS generated by CoffeeScript? | ||||
|     # | ||||
|     # Requires Blob#data | ||||
|     # | ||||
|     # CoffeScript is meant to output JS that would be difficult to | ||||
|     # tell if it was generated or not. Look for a number of patterns | ||||
|     # output by the CS compiler. | ||||
|     # | ||||
|     # Return true or false | ||||
|     def compiled_coffeescript? | ||||
|       return false unless extname == '.js' | ||||
|  | ||||
|       # CoffeeScript generated by > 1.2 include a comment on the first line | ||||
|       if lines[0] =~ /^\/\/ Generated by / | ||||
|         return true | ||||
|       end | ||||
|  | ||||
|       if lines[0] == '(function() {' &&     # First line is module closure opening | ||||
|           lines[-2] == '}).call(this);' &&  # Second to last line closes module closure | ||||
|           lines[-1] == ''                   # Last line is blank | ||||
|  | ||||
|         score = 0 | ||||
|  | ||||
|         lines.each do |line| | ||||
|           if line =~ /var / | ||||
|             # Underscored temp vars are likely to be Coffee | ||||
|             score += 1 * line.gsub(/(_fn|_i|_len|_ref|_results)/).count | ||||
|  | ||||
|             # bind and extend functions are very Coffee specific | ||||
|             score += 3 * line.gsub(/(__bind|__extends|__hasProp|__indexOf|__slice)/).count | ||||
|           end | ||||
|         end | ||||
|  | ||||
|         # Require a score of 3. This is fairly arbitrary. Consider | ||||
|         # tweaking later. | ||||
|         score >= 3 | ||||
|       else | ||||
|         false | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     # Internal: Is this a generated documentation file for a .NET assembly? | ||||
|     # | ||||
|     # Requires Blob#data | ||||
|     # | ||||
|     # .NET developers often check in the XML Intellisense file along with an | ||||
|     # assembly - however, these don't have a special extension, so we have to | ||||
|     # dig into the contents to determine if it's a docfile. Luckily, these files | ||||
|     # are extremely structured, so recognizing them is easy. | ||||
|     # | ||||
|     # Returns true or false | ||||
|     def generated_net_docfile? | ||||
|       return false unless extname.downcase == ".xml" | ||||
|       return false unless lines.count > 3 | ||||
|  | ||||
|       # .NET Docfiles always open with <doc> and their first tag is an | ||||
|       # <assembly> tag | ||||
|       return lines[1].include?("<doc>") && | ||||
|         lines[2].include?("<assembly>") && | ||||
|         lines[-2].include?("</doc>") | ||||
|     end | ||||
|  | ||||
|     # Public: Should the blob be indexed for searching? | ||||
|     # | ||||
|     # Excluded: | ||||
|     # - Files over 0.1MB | ||||
|     # - Non-text files | ||||
|     # - Langauges marked as not searchable | ||||
|     # - Generated source files | ||||
|     # | ||||
|     # Please add additional test coverage to | ||||
|     # `test/test_blob.rb#test_indexable` if you make any changes. | ||||
|     # | ||||
|     # Return true or false | ||||
|     def indexable? | ||||
|       if binary? | ||||
|         false | ||||
|       elsif language.nil? | ||||
|         false | ||||
|       elsif !language.searchable? | ||||
|         false | ||||
|       elsif generated? | ||||
|         false | ||||
|       elsif size > 100 * 1024 | ||||
|         false | ||||
|       else | ||||
|         true | ||||
|       end | ||||
|       @_generated ||= Generated.generated?(name, lambda { data }) | ||||
|     end | ||||
|  | ||||
|     # Public: Detects the Language of the blob. | ||||
| @@ -407,33 +311,7 @@ module Linguist | ||||
|     # | ||||
|     # Returns a Language or nil if none is detected | ||||
|     def language | ||||
|       if defined? @language | ||||
|         @language | ||||
|       else | ||||
|         @language = guess_language | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     # Internal: Guess language | ||||
|     # | ||||
|     # Please add additional test coverage to | ||||
|     # `test/test_blob.rb#test_language` if you make any changes. | ||||
|     # | ||||
|     # Returns a Language or nil | ||||
|     def guess_language | ||||
|       return if binary_mime_type? | ||||
|  | ||||
|       # Disambiguate between multiple language extensions | ||||
|       disambiguate_extension_language || | ||||
|  | ||||
|         # See if there is a Language for the extension | ||||
|         pathname.language || | ||||
|  | ||||
|         # Look for idioms in first line | ||||
|         first_line_language || | ||||
|  | ||||
|         # Try to detect Language from shebang line | ||||
|         shebang_language | ||||
|       @language ||= Language.detect(self) | ||||
|     end | ||||
|  | ||||
|     # Internal: Get the lexer of the blob. | ||||
| @@ -443,240 +321,6 @@ module Linguist | ||||
|       language ? language.lexer : Pygments::Lexer.find_by_name('Text only') | ||||
|     end | ||||
|  | ||||
|     # Internal: Disambiguates between multiple language extensions. | ||||
|     # | ||||
|     # Delegates to "guess_EXTENSION_language". | ||||
|     # | ||||
|     # Please add additional test coverage to | ||||
|     # `test/test_blob.rb#test_language` if you add another method. | ||||
|     # | ||||
|     # Returns a Language or nil. | ||||
|     def disambiguate_extension_language | ||||
|       if Language.ambiguous?(extname) | ||||
|         name = "guess_#{extname.sub(/^\./, '')}_language" | ||||
|         send(name) if respond_to?(name) | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     # Internal: Guess language of .cls files | ||||
|     # | ||||
|     # Returns a Language. | ||||
|     def guess_cls_language | ||||
|       if lines.grep(/^(%|\\)/).any? | ||||
|         Language['TeX'] | ||||
|       elsif lines.grep(/^\s*(CLASS|METHOD|INTERFACE).*:\s*/i).any? || lines.grep(/^\s*(USING|DEFINE)/i).any? | ||||
|         Language['OpenEdge ABL'] | ||||
|       elsif lines.grep(/\{$/).any? || lines.grep(/\}$/).any? | ||||
|         Language['Apex'] | ||||
|       elsif lines.grep(/^(\'\*|Attribute|Option|Sub|Private|Protected|Public|Friend)/i).any? | ||||
|         Language['Visual Basic'] | ||||
|       else | ||||
|         # The most common language should be the fallback | ||||
|         Language['TeX'] | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     # Internal: Guess language of header files (.h). | ||||
|     # | ||||
|     # Returns a Language. | ||||
|     def guess_h_language | ||||
|       if lines.grep(/^@(interface|property|private|public|end)/).any? | ||||
|         Language['Objective-C'] | ||||
|       elsif lines.grep(/^class |^\s+(public|protected|private):/).any? | ||||
|         Language['C++'] | ||||
|       else | ||||
|         Language['C'] | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     # Internal: Guess language of .m files. | ||||
|     # | ||||
|     # Objective-C heuristics: | ||||
|     # * Keywords  ("#import", "#include", "#ifdef", #define, "@end") or "//" and opening "\*" comments | ||||
|     # | ||||
|     # Matlab heuristics: | ||||
|     # * Leading "function " of "classdef " keyword | ||||
|     # * "%" comments | ||||
|     # | ||||
|     # Note: All "#" keywords, e.g., "#import", are guaranteed to be Objective-C. Because the ampersand | ||||
|     # is used to created function handles and anonymous functions in Matlab, most "@" keywords are not | ||||
|     # safe heuristics. However, "end" is a reserved term in Matlab and can't be used to create a valid | ||||
|     # function handle. Because @end is required to close any @implementation, @property, @interface, | ||||
|     # @synthesize, etc. directive in Objective-C, only @end needs to be checked for. | ||||
|     # | ||||
|     # Returns a Language. | ||||
|     def guess_m_language | ||||
|       # Objective-C keywords or comments | ||||
|       if lines.grep(/^#(import|include|ifdef|define)|@end/).any? || lines.grep(/^\s*\/\//).any? || lines.grep(/^\s*\/\*/).any? | ||||
|         Language['Objective-C'] | ||||
|  | ||||
|       # Matlab file function or class or comments | ||||
|       elsif lines.any? && lines.first.match(/^\s*(function |classdef )/) || lines.grep(/^\s*%/).any? | ||||
|         Language['Matlab'] | ||||
|  | ||||
|       # Fallback to Objective-C, don't want any Matlab false positives | ||||
|       else | ||||
|         Language['Objective-C'] | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     # Internal: Guess language of .pl files | ||||
|     # | ||||
|     # The rules for disambiguation are: | ||||
|     # | ||||
|     # 1. Many perl files begin with a shebang | ||||
|     # 2. Most Prolog source files have a rule somewhere (marked by the :- operator) | ||||
|     # 3. Default to Perl, because it is more popular | ||||
|     # | ||||
|     # Returns a Language. | ||||
|     def guess_pl_language | ||||
|       if shebang_script == 'perl' | ||||
|         Language['Perl'] | ||||
|       elsif lines.grep(/:-/).any? | ||||
|         Language['Prolog'] | ||||
|       else | ||||
|         Language['Perl'] | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     # Internal: Guess language of .r files. | ||||
|     # | ||||
|     # Returns a Language. | ||||
|     def guess_r_language | ||||
|       if lines.grep(/(rebol|(:\s+func|make\s+object!|^\s*context)\s*\[)/i).any? | ||||
|         Language['Rebol'] | ||||
|       else | ||||
|         Language['R'] | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     # Internal: Guess language of .t files. | ||||
|     # | ||||
|     # Returns a Language. | ||||
|     def guess_t_language | ||||
|       score = 0 | ||||
|       score += 1 if lines.grep(/^% /).any? | ||||
|       score += data.gsub(/ := /).count | ||||
|       score += data.gsub(/proc |procedure |fcn |function /).count | ||||
|       score += data.gsub(/var \w+: \w+/).count | ||||
|  | ||||
|       # Tell-tale signs its gotta be Perl | ||||
|       if lines.grep(/^(my )?(sub |\$|@|%)\w+/).any? | ||||
|         score = 0 | ||||
|       end | ||||
|  | ||||
|       if score >= 3 | ||||
|         Language['Turing'] | ||||
|       else | ||||
|         Language['Perl'] | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     # Internal: Guess language of .v files. | ||||
|     # | ||||
|     # Returns a Language | ||||
|     def guess_v_language | ||||
|       if lines.grep(/^(\/\*|\/\/|module|parameter|input|output|wire|reg|always|initial|begin|\`)/).any? | ||||
|         Language['Verilog'] | ||||
|       else | ||||
|         Language['Coq'] | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     # Internal: Guess language of .gsp files. | ||||
|     # | ||||
|     # Returns a Language. | ||||
|     def guess_gsp_language | ||||
|       if lines.grep(/<%|<%@|\$\{|<%|<g:|<meta name="layout"|<r:/).any? | ||||
|         Language['Groovy Server Pages'] | ||||
|       else | ||||
|         Language['Gosu'] | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     # Internal: Guess language from the first line. | ||||
|     # | ||||
|     # Look for leading "<?php" in Drupal files | ||||
|     # | ||||
|     # Returns a Language. | ||||
|     def first_line_language | ||||
|       # Only check files with drupal php extensions | ||||
|       return unless drupal_extname? | ||||
|  | ||||
|       # Fail fast if blob isn't viewable? | ||||
|       return unless viewable? | ||||
|  | ||||
|       if lines.first.to_s =~ /^<\?php/ | ||||
|         Language['PHP'] | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     # Internal: Extract the script name from the shebang line | ||||
|     # | ||||
|     # Requires Blob#data | ||||
|     # | ||||
|     # Examples | ||||
|     # | ||||
|     #   '#!/usr/bin/ruby' | ||||
|     #   # => 'ruby' | ||||
|     # | ||||
|     #   '#!/usr/bin/env ruby' | ||||
|     #   # => 'ruby' | ||||
|     # | ||||
|     #   '#!/usr/bash/python2.4' | ||||
|     #   # => 'python' | ||||
|     # | ||||
|     # Please add additional test coverage to | ||||
|     # `test/test_blob.rb#test_shebang_script` if you make any changes. | ||||
|     # | ||||
|     # Returns a script name String or nil | ||||
|     def shebang_script | ||||
|       # Fail fast if blob isn't viewable? | ||||
|       return unless viewable? | ||||
|  | ||||
|       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.4 => python | ||||
|         if script =~ /((?:\d+\.?)+)/ | ||||
|           script.sub! $1, '' | ||||
|         end | ||||
|  | ||||
|         # Check for multiline shebang hacks that exec themselves | ||||
|         # | ||||
|         #   #!/bin/sh | ||||
|         #   exec foo "$0" "$@" | ||||
|         # | ||||
|         if script == 'sh' && | ||||
|             lines[0...5].any? { |l| l.match(/exec (\w+).+\$0.+\$@/) } | ||||
|           script = $1 | ||||
|         end | ||||
|  | ||||
|         script | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     # Internal: Get Language for shebang script | ||||
|     # | ||||
|     # Returns the Language or nil | ||||
|     def shebang_language | ||||
|       # Skip file extensions unlikely to have shebangs | ||||
|       return unless shebang_extname? | ||||
|  | ||||
|       if script = shebang_script | ||||
|         Language[script] | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     # Public: Highlight syntax of blob | ||||
|     # | ||||
|     # options - A Hash of options (defaults to {}) | ||||
| @@ -688,26 +332,5 @@ module Linguist | ||||
|       options[:options][:encoding] ||= encoding | ||||
|       lexer.highlight(data, options) | ||||
|     end | ||||
|  | ||||
|     # Public: Highlight syntax of blob without the outer highlight div | ||||
|     # wrapper. | ||||
|     # | ||||
|     # options - A Hash of options (defaults to {}) | ||||
|     # | ||||
|     # Returns html String | ||||
|     def colorize_without_wrapper(options = {}) | ||||
|       if text = colorize(options) | ||||
|         text[%r{<div class="highlight"><pre>(.*?)</pre>\s*</div>}m, 1] | ||||
|       else | ||||
|         '' | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     Language.overridden_extensions.each do |extension| | ||||
|       name = "guess_#{extension.sub(/^\./, '')}_language".to_sym | ||||
|       unless instance_methods.map(&:to_sym).include?(name) | ||||
|         raise NotImplementedError, "Language##{name} was not defined" | ||||
|       end | ||||
|     end | ||||
|   end | ||||
| end | ||||
|   | ||||
							
								
								
									
										171
									
								
								lib/linguist/classifier.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										171
									
								
								lib/linguist/classifier.rb
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,171 @@ | ||||
| require 'linguist/tokenizer' | ||||
|  | ||||
| module Linguist | ||||
|   # Language bayesian classifier. | ||||
|   class Classifier | ||||
|     # Public: Train classifier that data is a certain language. | ||||
|     # | ||||
|     # db       - Hash classifier database object | ||||
|     # language - String language of data | ||||
|     # data     - String contents of file | ||||
|     # | ||||
|     # Examples | ||||
|     # | ||||
|     #   Classifier.train(db, 'Ruby', "def hello; end") | ||||
|     # | ||||
|     # Returns nothing. | ||||
|     # | ||||
|     # Set LINGUIST_DEBUG=1 or =2 to see probabilities per-token or | ||||
|     # per-language.  See also #dump_all_tokens, below. | ||||
|     def self.train!(db, language, data) | ||||
|       tokens = Tokenizer.tokenize(data) | ||||
|  | ||||
|       db['tokens_total'] ||= 0 | ||||
|       db['languages_total'] ||= 0 | ||||
|       db['tokens'] ||= {} | ||||
|       db['language_tokens'] ||= {} | ||||
|       db['languages'] ||= {} | ||||
|  | ||||
|       tokens.each do |token| | ||||
|         db['tokens'][language] ||= {} | ||||
|         db['tokens'][language][token] ||= 0 | ||||
|         db['tokens'][language][token] += 1 | ||||
|         db['language_tokens'][language] ||= 0 | ||||
|         db['language_tokens'][language] += 1 | ||||
|         db['tokens_total'] += 1 | ||||
|       end | ||||
|       db['languages'][language] ||= 0 | ||||
|       db['languages'][language] += 1 | ||||
|       db['languages_total'] += 1 | ||||
|  | ||||
|       nil | ||||
|     end | ||||
|  | ||||
|     # Public: Guess language of data. | ||||
|     # | ||||
|     # db        - Hash of classifier tokens database. | ||||
|     # data      - Array of tokens or String data to analyze. | ||||
|     # languages - Array of language name Strings to restrict to. | ||||
|     # | ||||
|     # Examples | ||||
|     # | ||||
|     #   Classifier.classify(db, "def hello; end") | ||||
|     #   # => [ 'Ruby', 0.90], ['Python', 0.2], ... ] | ||||
|     # | ||||
|     # Returns sorted Array of result pairs. Each pair contains the | ||||
|     # String language name and a Float score. | ||||
|     def self.classify(db, tokens, languages = nil) | ||||
|       languages ||= db['languages'].keys | ||||
|       new(db).classify(tokens, languages) | ||||
|     end | ||||
|  | ||||
|     # Internal: Initialize a Classifier. | ||||
|     def initialize(db = {}) | ||||
|       @tokens_total    = db['tokens_total'] | ||||
|       @languages_total = db['languages_total'] | ||||
|       @tokens          = db['tokens'] | ||||
|       @language_tokens = db['language_tokens'] | ||||
|       @languages       = db['languages'] | ||||
|     end | ||||
|  | ||||
|     # Internal: Guess language of data | ||||
|     # | ||||
|     # data      - Array of tokens or String data to analyze. | ||||
|     # languages - Array of language name Strings to restrict to. | ||||
|     # | ||||
|     # Returns sorted Array of result pairs. Each pair contains the | ||||
|     # String language name and a Float score. | ||||
|     def classify(tokens, languages) | ||||
|       return [] if tokens.nil? | ||||
|       tokens = Tokenizer.tokenize(tokens) if tokens.is_a?(String) | ||||
|       scores = {} | ||||
|  | ||||
|       debug_dump_all_tokens(tokens, languages) if verbosity >= 2 | ||||
|  | ||||
|       languages.each do |language| | ||||
|         scores[language] = tokens_probability(tokens, language) + language_probability(language) | ||||
|         debug_dump_probabilities(tokens, language, scores[language]) if verbosity >= 1 | ||||
|       end | ||||
|  | ||||
|       scores.sort { |a, b| b[1] <=> a[1] }.map { |score| [score[0], score[1]] } | ||||
|     end | ||||
|  | ||||
|     # Internal: Probably of set of tokens in a language occurring - P(D | C) | ||||
|     # | ||||
|     # tokens   - Array of String tokens. | ||||
|     # language - Language to check. | ||||
|     # | ||||
|     # Returns Float between 0.0 and 1.0. | ||||
|     def tokens_probability(tokens, language) | ||||
|       tokens.inject(0.0) do |sum, token| | ||||
|         sum += Math.log(token_probability(token, language)) | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     # Internal: Probably of token in language occurring - P(F | C) | ||||
|     # | ||||
|     # token    - String token. | ||||
|     # language - Language to check. | ||||
|     # | ||||
|     # Returns Float between 0.0 and 1.0. | ||||
|     def token_probability(token, language) | ||||
|       if @tokens[language][token].to_f == 0.0 | ||||
|         1 / @tokens_total.to_f | ||||
|       else | ||||
|         @tokens[language][token].to_f / @language_tokens[language].to_f | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     # Internal: Probably of a language occurring - P(C) | ||||
|     # | ||||
|     # language - Language to check. | ||||
|     # | ||||
|     # Returns Float between 0.0 and 1.0. | ||||
|     def language_probability(language) | ||||
|       Math.log(@languages[language].to_f / @languages_total.to_f) | ||||
|     end | ||||
|  | ||||
|     private | ||||
|       def verbosity | ||||
|         @verbosity ||= (ENV['LINGUIST_DEBUG'] || 0).to_i | ||||
|       end | ||||
|  | ||||
|       def debug_dump_probabilities(tokens, language, score) | ||||
|         printf("%10s = %10.3f + %7.3f = %10.3f\n", | ||||
|             language, tokens_probability(tokens, language), language_probability(language), score) | ||||
|       end | ||||
|  | ||||
|       # Internal: show a table of probabilities for each <token,language> pair. | ||||
|       # | ||||
|       # The number in each table entry is the number of "points" that each | ||||
|       # token contributes toward the belief that the file under test is a | ||||
|       # particular language.  Points are additive. | ||||
|       # | ||||
|       # Points are the number of times a token appears in the file, times | ||||
|       # how much more likely (log of probability ratio) that token is to | ||||
|       # appear in one language vs. the least-likely language.  Dashes | ||||
|       # indicate the least-likely language (and zero points) for each token. | ||||
|       def debug_dump_all_tokens(tokens, languages) | ||||
|         maxlen = tokens.map { |tok| tok.size }.max | ||||
|  | ||||
|         printf "%#{maxlen}s", "" | ||||
|         puts "    #" + languages.map { |lang| sprintf("%10s", lang) }.join | ||||
|  | ||||
|         token_map = Hash.new(0) | ||||
|         tokens.each { |tok| token_map[tok] += 1 } | ||||
|  | ||||
|         token_map.sort.each { |tok, count| | ||||
|           arr = languages.map { |lang| [lang, token_probability(tok, lang)] } | ||||
|           min = arr.map { |a,b| b }.min | ||||
|           minlog = Math.log(min) | ||||
|           if !arr.inject(true) { |result, n| result && n[1] == arr[0][1] } | ||||
|             printf "%#{maxlen}s%5d", tok, count | ||||
|  | ||||
|             puts arr.map { |ent| | ||||
|               ent[1] == min ? "         -" : sprintf("%10.3f", count * (Math.log(ent[1]) - minlog)) | ||||
|             }.join | ||||
|           end | ||||
|         } | ||||
|       end | ||||
|   end | ||||
| end | ||||
| @@ -52,5 +52,20 @@ module Linguist | ||||
|     def size | ||||
|       File.size(@path) | ||||
|     end | ||||
|  | ||||
|     # Public: Get file extension. | ||||
|     # | ||||
|     # Returns a String. | ||||
|     def extension | ||||
|       # File.extname returns nil if the filename is an extension. | ||||
|       extension = File.extname(name) | ||||
|       basename = File.basename(name) | ||||
|       # Checks if the filename is an extension. | ||||
|       if extension.empty? && basename[0] == "." | ||||
|         basename | ||||
|       else | ||||
|         extension | ||||
|       end | ||||
|     end | ||||
|   end | ||||
| end | ||||
|   | ||||
							
								
								
									
										259
									
								
								lib/linguist/generated.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										259
									
								
								lib/linguist/generated.rb
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,259 @@ | ||||
| module Linguist | ||||
|   class Generated | ||||
|     # Public: Is the blob a generated file? | ||||
|     # | ||||
|     # name - String filename | ||||
|     # data - String blob data. A block also maybe passed in for lazy | ||||
|     #        loading. This behavior is deprecated and you should always | ||||
|     #        pass in a String. | ||||
|     # | ||||
|     # Return true or false | ||||
|     def self.generated?(name, data) | ||||
|       new(name, data).generated? | ||||
|     end | ||||
|  | ||||
|     # Internal: Initialize Generated instance | ||||
|     # | ||||
|     # name - String filename | ||||
|     # data - String blob data | ||||
|     def initialize(name, data) | ||||
|       @name = name | ||||
|       @extname = File.extname(name) | ||||
|       @_data = data | ||||
|     end | ||||
|  | ||||
|     attr_reader :name, :extname | ||||
|  | ||||
|     # Lazy load blob data if block was passed in. | ||||
|     # | ||||
|     # Awful, awful stuff happening here. | ||||
|     # | ||||
|     # Returns String data. | ||||
|     def data | ||||
|       @data ||= @_data.respond_to?(:call) ? @_data.call() : @_data | ||||
|     end | ||||
|  | ||||
|     # Public: Get each line of data | ||||
|     # | ||||
|     # Returns an Array of lines | ||||
|     def lines | ||||
|       # TODO: data should be required to be a String, no nils | ||||
|       @lines ||= data ? data.split("\n", -1) : [] | ||||
|     end | ||||
|  | ||||
|     # Internal: Is the blob a generated file? | ||||
|     # | ||||
|     # Generated source code is suppressed in diffs and is ignored by | ||||
|     # language statistics. | ||||
|     # | ||||
|     # Please add additional test coverage to | ||||
|     # `test/test_blob.rb#test_generated` if you make any changes. | ||||
|     # | ||||
|     # 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? | ||||
|     end | ||||
|  | ||||
|     # Internal: Is the blob an Xcode file? | ||||
|     # | ||||
|     # Generated if the file extension is an Xcode  | ||||
|     # file extension. | ||||
|     # | ||||
|     # Returns true of false. | ||||
|     def xcode_file? | ||||
|       ['.nib', '.xcworkspacedata', '.xcuserstate'].include?(extname) | ||||
|     end | ||||
|  | ||||
|     # Internal: Is the blob minified files? | ||||
|     # | ||||
|     # Consider a file minified if the average line length is | ||||
|     # greater then 110c. | ||||
|     # | ||||
|     # Currently, only JS and CSS files are detected by this method. | ||||
|     # | ||||
|     # Returns true or false. | ||||
|     def minified_files? | ||||
|       return unless ['.js', '.css'].include? extname | ||||
|       if lines.any? | ||||
|         (lines.inject(0) { |n, l| n += l.length } / lines.length) > 110 | ||||
|       else | ||||
|         false | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     # Internal: Is the blob of JS generated by CoffeeScript? | ||||
|     # | ||||
|     # CoffeeScript is meant to output JS that would be difficult to | ||||
|     # tell if it was generated or not. Look for a number of patterns | ||||
|     # output by the CS compiler. | ||||
|     # | ||||
|     # Return true or false | ||||
|     def compiled_coffeescript? | ||||
|       return false unless extname == '.js' | ||||
|  | ||||
|       # CoffeeScript generated by > 1.2 include a comment on the first line | ||||
|       if lines[0] =~ /^\/\/ Generated by / | ||||
|         return true | ||||
|       end | ||||
|  | ||||
|       if lines[0] == '(function() {' &&     # First line is module closure opening | ||||
|           lines[-2] == '}).call(this);' &&  # Second to last line closes module closure | ||||
|           lines[-1] == ''                   # Last line is blank | ||||
|  | ||||
|         score = 0 | ||||
|  | ||||
|         lines.each do |line| | ||||
|           if line =~ /var / | ||||
|             # Underscored temp vars are likely to be Coffee | ||||
|             score += 1 * line.gsub(/(_fn|_i|_len|_ref|_results)/).count | ||||
|  | ||||
|             # bind and extend functions are very Coffee specific | ||||
|             score += 3 * line.gsub(/(__bind|__extends|__hasProp|__indexOf|__slice)/).count | ||||
|           end | ||||
|         end | ||||
|  | ||||
|         # Require a score of 3. This is fairly arbitrary. Consider | ||||
|         # tweaking later. | ||||
|         score >= 3 | ||||
|       else | ||||
|         false | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     # Internal: Is this a generated documentation file for a .NET assembly? | ||||
|     # | ||||
|     # .NET developers often check in the XML Intellisense file along with an | ||||
|     # assembly - however, these don't have a special extension, so we have to | ||||
|     # dig into the contents to determine if it's a docfile. Luckily, these files | ||||
|     # are extremely structured, so recognizing them is easy. | ||||
|     # | ||||
|     # Returns true or false | ||||
|     def generated_net_docfile? | ||||
|       return false unless extname.downcase == ".xml" | ||||
|       return false unless lines.count > 3 | ||||
|  | ||||
|       # .NET Docfiles always open with <doc> and their first tag is an | ||||
|       # <assembly> tag | ||||
|       return lines[1].include?("<doc>") && | ||||
|         lines[2].include?("<assembly>") && | ||||
|         lines[-2].include?("</doc>") | ||||
|     end | ||||
|  | ||||
|     # Internal: Is this a codegen file for a .NET project? | ||||
|     # | ||||
|     # Visual Studio often uses code generation to generate partial classes, and | ||||
|     # these files can be quite unwieldy. Let's hide them. | ||||
|     # | ||||
|     # Returns true or false | ||||
|     def generated_net_designer_file? | ||||
|       name.downcase =~ /\.designer\.cs$/ | ||||
|     end | ||||
|  | ||||
|     # Internal: Is the blob of JS a parser generated by PEG.js? | ||||
|     # | ||||
|     # PEG.js-generated parsers are not meant to be consumed by humans. | ||||
|     # | ||||
|     # Return true or false | ||||
|     def generated_parser? | ||||
|       return false unless extname == '.js' | ||||
|  | ||||
|       # PEG.js-generated parsers include a comment near the top  of the file | ||||
|       # that marks them as such. | ||||
|       if lines[0..4].join('') =~ /^(?:[^\/]|\/[^\*])*\/\*(?:[^\*]|\*[^\/])*Generated by PEG.js/ | ||||
|         return true | ||||
|       end | ||||
|  | ||||
|       false | ||||
|     end | ||||
|  | ||||
|     # Internal: Is the blob of PostScript generated? | ||||
|     # | ||||
|     # PostScript files are often generated by other programs. If they tell us so, | ||||
|     # we can detect them. | ||||
|     # | ||||
|     # Returns true or false. | ||||
|     def generated_postscript? | ||||
|       return false unless ['.ps', '.eps'].include? extname | ||||
|  | ||||
|       # We analyze the "%%Creator:" comment, which contains the author/generator | ||||
|       # of the file. If there is one, it should be in one of the first few lines. | ||||
|       creator = lines[0..9].find {|line| line =~ /^%%Creator: /} | ||||
|       return false if creator.nil? | ||||
|  | ||||
|       # Most generators write their version number, while human authors' or companies' | ||||
|       # names don't contain numbers. So look if the line contains digits. Also | ||||
|       # look for some special cases without version numbers. | ||||
|       return creator =~ /[0-9]/ || | ||||
|         creator.include?("mpage") || | ||||
|         creator.include?("draw") || | ||||
|         creator.include?("ImageMagick") | ||||
|     end | ||||
|  | ||||
|     # Internal: Is the blob a C++, Java or Python source file generated by the | ||||
|     # Protocol Buffer compiler? | ||||
|     # | ||||
|     # Returns true of false. | ||||
|     def generated_protocol_buffer? | ||||
|       return false unless ['.py', '.java', '.h', '.cc', '.cpp'].include?(extname) | ||||
|       return false unless lines.count > 1 | ||||
|  | ||||
|       return lines[0].include?("Generated by the protocol buffer compiler.  DO NOT EDIT!") | ||||
|     end | ||||
|  | ||||
|     # Internal: Is the blob a C/C++ header generated by the Java JNI tool javah? | ||||
|     # | ||||
|     # Returns true of false. | ||||
|     def generated_jni_header? | ||||
|       return false unless extname == '.h' | ||||
|       return false unless lines.count > 2 | ||||
|  | ||||
|       return lines[0].include?("/* DO NOT EDIT THIS FILE - it is machine generated */") && | ||||
|                lines[1].include?("#include <jni.h>") | ||||
|     end | ||||
|  | ||||
|     # Internal: Is the blob part of node_modules/, which are not meant for humans in pull requests. | ||||
|     # | ||||
|     # Returns true or false. | ||||
|     def node_modules? | ||||
|       !!name.match(/node_modules\//) | ||||
|     end | ||||
|  | ||||
|     # Internal: Is the blob a generated php composer lock file? | ||||
|     # | ||||
|     # Returns true or false. | ||||
|     def composer_lock? | ||||
|       !!name.match(/composer\.lock/) | ||||
|     end | ||||
|  | ||||
|     # Internal: Is the blob a generated by Zephir | ||||
|     # | ||||
|     # Returns true or false. | ||||
|     def generated_by_zephir? | ||||
|       !!name.match(/.\.zep\.(?:c|h|php)$/) | ||||
|     end | ||||
|  | ||||
|     # Is the blob a VCR Cassette file? | ||||
|     # | ||||
|     # Returns true or false | ||||
|     def vcr_cassette? | ||||
|       return false unless extname == '.yml' | ||||
|       return false unless lines.count > 2 | ||||
|       # VCR Cassettes have "recorded_with: VCR" in the second last line. | ||||
|       return lines[-2].include?("recorded_with: VCR") | ||||
|     end | ||||
|   end | ||||
| end | ||||
|  | ||||
							
								
								
									
										79
									
								
								lib/linguist/heuristics.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								lib/linguist/heuristics.rb
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,79 @@ | ||||
| module Linguist | ||||
|   # A collection of simple heuristics that can be used to better analyze languages. | ||||
|   class Heuristics | ||||
|     ACTIVE = true | ||||
|  | ||||
|     # Public: Given an array of String language names, | ||||
|     # apply heuristics against the given data and return an array | ||||
|     # of matching languages, or nil. | ||||
|     # | ||||
|     # data      - Array of tokens or String data to analyze. | ||||
|     # languages - Array of language name Strings to restrict to. | ||||
|     # | ||||
|     # 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 | ||||
|       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 | ||||
|     end | ||||
|  | ||||
|     def self.disambiguate_pl(data, languages) | ||||
|       matches = [] | ||||
|       matches << Language["Prolog"] if data.include?(":-") | ||||
|       matches << Language["Perl"] if data.include?("use strict") | ||||
|       matches | ||||
|     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"] | ||||
|       else | ||||
|         matches << Language["TypeScript"] | ||||
|       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 | ||||
|     end | ||||
|  | ||||
|     def self.disambiguate_r(data, languages) | ||||
|       matches = [] | ||||
|       matches << Language["Rebol"] if /\bRebol\b/i.match(data) | ||||
|       matches << Language["R"] if data.include?("<-") | ||||
|       matches | ||||
|     end | ||||
|  | ||||
|     def self.active? | ||||
|       !!ACTIVE | ||||
|     end | ||||
|   end | ||||
| end | ||||
| @@ -1,6 +1,16 @@ | ||||
| require 'escape_utils' | ||||
| require 'pygments' | ||||
| require 'yaml' | ||||
| begin | ||||
|   require 'json' | ||||
| rescue LoadError | ||||
| end | ||||
|  | ||||
| require 'linguist/classifier' | ||||
| require 'linguist/heuristics' | ||||
| require 'linguist/samples' | ||||
| require 'linguist/file_blob' | ||||
| require 'linguist/blob_helper' | ||||
|  | ||||
| module Linguist | ||||
|   # Language names that are recognizable by GitHub. Defined languages | ||||
| @@ -9,28 +19,31 @@ module Linguist | ||||
|   # Languages are defined in `lib/linguist/languages.yml`. | ||||
|   class Language | ||||
|     @languages       = [] | ||||
|     @overrides       = {} | ||||
|     @index           = {} | ||||
|     @name_index      = {} | ||||
|     @alias_index     = {} | ||||
|     @extension_index = {} | ||||
|     @filename_index  = {} | ||||
|  | ||||
|     @extension_index          = Hash.new { |h,k| h[k] = [] } | ||||
|     @interpreter_index        = Hash.new { |h,k| h[k] = [] } | ||||
|     @filename_index           = Hash.new { |h,k| h[k] = [] } | ||||
|  | ||||
|     # Valid Languages types | ||||
|     TYPES = [:data, :markup, :programming] | ||||
|     TYPES = [:data, :markup, :programming, :prose] | ||||
|  | ||||
|     # Internal: Test if extension maps to multiple Languages. | ||||
|     # Names of non-programming languages that we will still detect | ||||
|     # | ||||
|     # Returns true or false. | ||||
|     def self.ambiguous?(extension) | ||||
|       @overrides.include?(extension) | ||||
|     # Returns an array | ||||
|     def self.detectable_markup | ||||
|       ["CSS", "Less", "Sass", "SCSS", "Stylus", "TeX"] | ||||
|     end | ||||
|  | ||||
|     # Include?: Return overridden extensions. | ||||
|     # Detect languages by a specific type | ||||
|     # | ||||
|     # Returns extensions Array. | ||||
|     def self.overridden_extensions | ||||
|       @overrides.keys | ||||
|     # type - A symbol that exists within TYPES | ||||
|     # | ||||
|     # Returns an array | ||||
|     def self.by_type(type) | ||||
|       all.select { |h| h.type == type } | ||||
|     end | ||||
|  | ||||
|     # Internal: Create a new Language object | ||||
| @@ -65,34 +78,74 @@ module Linguist | ||||
|           raise ArgumentError, "Extension is missing a '.': #{extension.inspect}" | ||||
|         end | ||||
|  | ||||
|         unless ambiguous?(extension) | ||||
|           # Index the extension with a leading ".": ".rb" | ||||
|           @extension_index[extension] = language | ||||
|  | ||||
|           # Index the extension without a leading ".": "rb" | ||||
|           @extension_index[extension.sub(/^\./, '')] = language | ||||
|         end | ||||
|         @extension_index[extension] << language | ||||
|       end | ||||
|  | ||||
|       language.overrides.each do |extension| | ||||
|         if extension !~ /^\./ | ||||
|           raise ArgumentError, "Extension is missing a '.': #{extension.inspect}" | ||||
|         end | ||||
|  | ||||
|         if l = @overrides[extension] | ||||
|           raise ArgumentError, "#{extension} is already overridden by #{l.name}" | ||||
|         end | ||||
|  | ||||
|         @overrides[extension] = language | ||||
|       language.interpreters.each do |interpreter| | ||||
|         @interpreter_index[interpreter] << language | ||||
|       end | ||||
|  | ||||
|       language.filenames.each do |filename| | ||||
|         @filename_index[filename] = language | ||||
|         @filename_index[filename] << language | ||||
|       end | ||||
|  | ||||
|       language | ||||
|     end | ||||
|  | ||||
|     # Public: Detects the Language of the blob. | ||||
|     # | ||||
|     # blob - an object that includes the Linguist `BlobHelper` interface; | ||||
|     #       see Linguist::LazyBlob and Linguist::FileBlob for examples | ||||
|     # | ||||
|     # Returns Language or nil. | ||||
|     def self.detect(blob) | ||||
|       name = blob.name.to_s | ||||
|  | ||||
|       # Check if the blob is possibly binary and bail early; this is a cheap | ||||
|       # test that uses the extension name to guess a binary binary mime type. | ||||
|       # | ||||
|       # We'll perform a more comprehensive test later which actually involves | ||||
|       # looking for binary characters in the blob | ||||
|       return nil if blob.likely_binary? || blob.binary? | ||||
|  | ||||
|       # A bit of an elegant hack. If the file is executable but extensionless, | ||||
|       # append a "magic" extension so it can be classified with other | ||||
|       # languages that have shebang scripts. | ||||
|       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]] | ||||
|         end | ||||
|       else | ||||
|         # Simplest and most common case, we can just return the one match based on extension | ||||
|         possible_languages.first | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     # Public: Get all Languages | ||||
|     # | ||||
|     # Returns an Array of Languages | ||||
| @@ -128,33 +181,36 @@ module Linguist | ||||
|       @alias_index[name] | ||||
|     end | ||||
|  | ||||
|     # Public: Look up Language by extension. | ||||
|     # | ||||
|     # extension - The extension String. May include leading "." | ||||
|     # | ||||
|     # Examples | ||||
|     # | ||||
|     #   Language.find_by_extension('.rb') | ||||
|     #   # => #<Language name="Ruby"> | ||||
|     # | ||||
|     # Returns the Language or nil if none was found. | ||||
|     def self.find_by_extension(extension) | ||||
|       @extension_index[extension] | ||||
|     end | ||||
|  | ||||
|     # Public: Look up Language by filename. | ||||
|     # Public: Look up Languages by filename. | ||||
|     # | ||||
|     # filename - The path String. | ||||
|     # | ||||
|     # Examples | ||||
|     # | ||||
|     #   Language.find_by_filename('foo.rb') | ||||
|     #   # => #<Language name="Ruby"> | ||||
|     #   # => [#<Language name="Ruby">] | ||||
|     # | ||||
|     # Returns the Language or nil if none was found. | ||||
|     # Returns all matching Languages or [] if none were found. | ||||
|     def self.find_by_filename(filename) | ||||
|       basename, extname = File.basename(filename), File.extname(filename) | ||||
|       @filename_index[basename] || @extension_index[extname] | ||||
|       basename = File.basename(filename) | ||||
|       extname = FileBlob.new(filename).extension | ||||
|       langs = @filename_index[basename] + | ||||
|               @extension_index[extname] | ||||
|       langs.compact.uniq | ||||
|     end | ||||
|  | ||||
|     # Public: Look up Languages by shebang line. | ||||
|     # | ||||
|     # data - Array of tokens or String data to analyze. | ||||
|     # | ||||
|     # Examples | ||||
|     # | ||||
|     #   Language.find_by_shebang("#!/bin/bash\ndate;") | ||||
|     #   # => [#<Language name="Bash">] | ||||
|     # | ||||
|     # Returns the matching Language | ||||
|     def self.find_by_shebang(data) | ||||
|       @interpreter_index[Linguist.interpreter_from_shebang(data)] | ||||
|     end | ||||
|  | ||||
|     # Public: Look up Language by its name or lexer. | ||||
| @@ -235,22 +291,16 @@ module Linguist | ||||
|         raise(ArgumentError, "#{@name} is missing lexer") | ||||
|  | ||||
|       @ace_mode = attributes[:ace_mode] | ||||
|       @wrap = attributes[:wrap] || false | ||||
|  | ||||
|       # Set legacy search term | ||||
|       @search_term = attributes[:search_term] || default_alias_name | ||||
|  | ||||
|       # Set extensions or default to []. | ||||
|       @extensions = attributes[:extensions] || [] | ||||
|       @overrides  = attributes[:overrides]  || [] | ||||
|       @interpreters = attributes[:interpreters]   || [] | ||||
|       @filenames  = attributes[:filenames]  || [] | ||||
|  | ||||
|       @primary_extension = attributes[:primary_extension] || default_primary_extension || extensions.first | ||||
|  | ||||
|       # Prepend primary extension unless its already included | ||||
|       if primary_extension && !extensions.include?(primary_extension) | ||||
|         @extensions = [primary_extension] + extensions | ||||
|       end | ||||
|  | ||||
|       # Set popular, and searchable flags | ||||
|       @popular    = attributes.key?(:popular)    ? attributes[:popular]    : false | ||||
|       @searchable = attributes.key?(:searchable) ? attributes[:searchable] : true | ||||
| @@ -324,6 +374,11 @@ module Linguist | ||||
|     # Returns a String name or nil | ||||
|     attr_reader :ace_mode | ||||
|  | ||||
|     # Public: Should language lines be wrapped | ||||
|     # | ||||
|     # Returns true or false | ||||
|     attr_reader :wrap | ||||
|  | ||||
|     # Public: Get extensions | ||||
|     # | ||||
|     # Examples | ||||
| @@ -333,24 +388,14 @@ module Linguist | ||||
|     # Returns the extensions Array | ||||
|     attr_reader :extensions | ||||
|  | ||||
|     # Deprecated: Get primary extension | ||||
|     # Public: Get interpreters | ||||
|     # | ||||
|     # Defaults to the first extension but can be overriden | ||||
|     # in the languages.yml. | ||||
|     # Examples | ||||
|     # | ||||
|     # The primary extension can not be nil. Tests should verify this. | ||||
|     #   # => ['awk', 'gawk', 'mawk' ...] | ||||
|     # | ||||
|     # This attribute is only used by app/helpers/gists_helper.rb for | ||||
|     # creating the language dropdown. It really should be using `name` | ||||
|     # instead. Would like to drop primary extension. | ||||
|     # | ||||
|     # Returns the extension String. | ||||
|     attr_reader :primary_extension | ||||
|  | ||||
|     # Internal: Get overridden extensions. | ||||
|     # | ||||
|     # Returns the extensions Array. | ||||
|     attr_reader :overrides | ||||
|     # Returns the interpreters Array | ||||
|     attr_reader :interpreters | ||||
|  | ||||
|     # Public: Get filenames | ||||
|     # | ||||
| @@ -361,6 +406,27 @@ 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 | ||||
|     # in the languages.yml. | ||||
|     # | ||||
|     # The primary extension can not be nil. Tests should verify this. | ||||
|     # | ||||
|     # This method is only used by app/helpers/gists_helper.rb for creating | ||||
|     # the language dropdown. It really should be using `name` instead. | ||||
|     # Would like to drop primary extension. | ||||
|     # | ||||
|     # Returns the extension String. | ||||
|     def primary_extension | ||||
|       extensions.first | ||||
|     end | ||||
|  | ||||
|     # Public: Get URL escaped name. | ||||
|     # | ||||
|     # Examples | ||||
| @@ -381,13 +447,6 @@ module Linguist | ||||
|       name.downcase.gsub(/\s/, '-') | ||||
|     end | ||||
|  | ||||
|     # Internal: Get default primary extension. | ||||
|     # | ||||
|     # Returns the extension String. | ||||
|     def default_primary_extension | ||||
|       extensions.first | ||||
|     end | ||||
|  | ||||
|     # Public: Get Language group | ||||
|     # | ||||
|     # Returns a Language | ||||
| @@ -426,7 +485,7 @@ module Linguist | ||||
|     # | ||||
|     # Returns html String | ||||
|     def colorize(text, options = {}) | ||||
|       lexer.highlight(text, options = {}) | ||||
|       lexer.highlight(text, options) | ||||
|     end | ||||
|  | ||||
|     # Public: Return name as String representation | ||||
| @@ -451,9 +510,54 @@ module Linguist | ||||
|     end | ||||
|   end | ||||
|  | ||||
|   extensions = Samples::DATA['extnames'] | ||||
|   interpreters = Samples::DATA['interpreters'] | ||||
|   filenames = Samples::DATA['filenames'] | ||||
|   popular = YAML.load_file(File.expand_path("../popular.yml", __FILE__)) | ||||
|  | ||||
|   YAML.load_file(File.expand_path("../languages.yml", __FILE__)).each do |name, options| | ||||
|   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)) | ||||
|   else | ||||
|     languages = YAML.load_file(languages_yml) | ||||
|   end | ||||
|  | ||||
|   languages.each do |name, options| | ||||
|     options['extensions'] ||= [] | ||||
|     options['interpreters'] ||= [] | ||||
|     options['filenames'] ||= [] | ||||
|  | ||||
|     if extnames = extensions[name] | ||||
|       extnames.each do |extname| | ||||
|         if !options['extensions'].include?(extname) | ||||
|           warn "#{name} has a sample with extension (#{extname}) that isn't explicitly defined in languages.yml" unless extname == '.script!' | ||||
|           options['extensions'] << extname | ||||
|         end | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     if interpreters == nil | ||||
|       interpreters = {} | ||||
|     end | ||||
|  | ||||
|     if interpreter_names = interpreters[name] | ||||
|       interpreter_names.each do |interpreter| | ||||
|         if !options['interpreters'].include?(interpreter) | ||||
|           options['interpreters'] << interpreter | ||||
|         end | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     if fns = filenames[name] | ||||
|       fns.each do |filename| | ||||
|         if !options['filenames'].include?(filename) | ||||
|           options['filenames'] << filename | ||||
|         end | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     Language.create( | ||||
|       :name              => name, | ||||
|       :color             => options['color'], | ||||
| @@ -461,12 +565,12 @@ module Linguist | ||||
|       :aliases           => options['aliases'], | ||||
|       :lexer             => options['lexer'], | ||||
|       :ace_mode          => options['ace_mode'], | ||||
|       :wrap              => options['wrap'], | ||||
|       :group_name        => options['group'], | ||||
|       :searchable        => options.key?('searchable') ? options['searchable'] : true, | ||||
|       :search_term       => options['search_term'], | ||||
|       :extensions        => options['extensions'], | ||||
|       :primary_extension => options['primary_extension'], | ||||
|       :overrides         => options['overrides'], | ||||
|       :extensions        => [options['extensions'].first] + options['extensions'][1..-1].sort, | ||||
|       :interpreters      => options['interpreters'].sort, | ||||
|       :filenames         => options['filenames'], | ||||
|       :popular           => popular.include?(name) | ||||
|     ) | ||||
|   | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										37
									
								
								lib/linguist/lazy_blob.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								lib/linguist/lazy_blob.rb
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,37 @@ | ||||
| require 'linguist/blob_helper' | ||||
| require 'rugged' | ||||
|  | ||||
| module Linguist | ||||
|   class LazyBlob | ||||
|     include BlobHelper | ||||
|  | ||||
|     MAX_SIZE = 128 * 1024 | ||||
|  | ||||
|     attr_reader :repository | ||||
|     attr_reader :oid | ||||
|     attr_reader :name | ||||
|     attr_reader :mode | ||||
|  | ||||
|     def initialize(repo, oid, name, mode = nil) | ||||
|       @repository = repo | ||||
|       @oid = oid | ||||
|       @name = name | ||||
|       @mode = mode | ||||
|     end | ||||
|  | ||||
|     def data | ||||
|       load_blob! | ||||
|       @data | ||||
|     end | ||||
|  | ||||
|     def size | ||||
|       load_blob! | ||||
|       @size | ||||
|     end | ||||
|  | ||||
|     protected | ||||
|     def load_blob! | ||||
|       @data, @size = Rugged::Blob.to_buffer(repository, oid, MAX_SIZE) if @data.nil? | ||||
|     end | ||||
|   end | ||||
| end | ||||
							
								
								
									
										38
									
								
								lib/linguist/md5.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								lib/linguist/md5.rb
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | ||||
| require 'digest/md5' | ||||
|  | ||||
| module Linguist | ||||
|   module MD5 | ||||
|     # Public: Create deep nested digest of value object. | ||||
|     # | ||||
|     # Useful for object comparison. | ||||
|     # | ||||
|     # obj - Object to digest. | ||||
|     # | ||||
|     # Returns String hex digest | ||||
|     def self.hexdigest(obj) | ||||
|       digest = Digest::MD5.new | ||||
|  | ||||
|       case obj | ||||
|       when String, Symbol, Integer | ||||
|         digest.update "#{obj.class}" | ||||
|         digest.update "#{obj}" | ||||
|       when TrueClass, FalseClass, NilClass | ||||
|         digest.update "#{obj.class}" | ||||
|       when Array | ||||
|         digest.update "#{obj.class}" | ||||
|         for e in obj | ||||
|           digest.update(hexdigest(e)) | ||||
|         end | ||||
|       when Hash | ||||
|         digest.update "#{obj.class}" | ||||
|         for e in obj.map { |(k, v)| hexdigest([k, v]) }.sort | ||||
|           digest.update(e) | ||||
|         end | ||||
|       else | ||||
|         raise TypeError, "can't convert #{obj.inspect} into String" | ||||
|       end | ||||
|  | ||||
|       digest.hexdigest | ||||
|     end | ||||
|   end | ||||
| end | ||||
| @@ -1,91 +0,0 @@ | ||||
| require 'mime/types' | ||||
| require 'yaml' | ||||
|  | ||||
| class MIME::Type | ||||
|   attr_accessor :override | ||||
| end | ||||
|  | ||||
| # Register additional mime type extensions | ||||
| # | ||||
| # Follows same format as mime-types data file | ||||
| #   https://github.com/halostatue/mime-types/blob/master/lib/mime/types.rb.data | ||||
| File.read(File.expand_path("../mimes.yml", __FILE__)).lines.each do |line| | ||||
|   # Regexp was cargo culted from mime-types lib | ||||
|   next unless line =~ %r{^ | ||||
|     #{MIME::Type::MEDIA_TYPE_RE} | ||||
|     (?:\s@([^\s]+))? | ||||
|     (?:\s:(#{MIME::Type::ENCODING_RE}))? | ||||
|   }x | ||||
|  | ||||
|   mediatype  = $1 | ||||
|   subtype    = $2 | ||||
|   extensions = $3 | ||||
|   encoding   = $4 | ||||
|  | ||||
|   # Lookup existing mime type | ||||
|   mime_type = MIME::Types["#{mediatype}/#{subtype}"].first || | ||||
|     # Or create a new instance | ||||
|     MIME::Type.new("#{mediatype}/#{subtype}") | ||||
|  | ||||
|   if extensions | ||||
|     extensions.split(/,/).each do |extension| | ||||
|       mime_type.extensions << extension | ||||
|     end | ||||
|   end | ||||
|  | ||||
|   if encoding | ||||
|     mime_type.encoding = encoding | ||||
|   end | ||||
|  | ||||
|   mime_type.override = true | ||||
|  | ||||
|   # Kind of hacky, but we need to reindex the mime type after making changes | ||||
|   MIME::Types.add_type_variant(mime_type) | ||||
|   MIME::Types.index_extensions(mime_type) | ||||
| end | ||||
|  | ||||
| module Linguist | ||||
|   module Mime | ||||
|     # Internal: Look up mime type for extension. | ||||
|     # | ||||
|     # ext - The extension String. May include leading "." | ||||
|     # | ||||
|     # Examples | ||||
|     # | ||||
|     #   Mime.mime_for('.html') | ||||
|     #   # => 'text/html' | ||||
|     # | ||||
|     #   Mime.mime_for('txt') | ||||
|     #   # => 'text/plain' | ||||
|     # | ||||
|     # Return mime type String otherwise falls back to 'text/plain'. | ||||
|     def self.mime_for(ext) | ||||
|       mime_type = lookup_mime_type_for(ext) | ||||
|       mime_type ? mime_type.to_s : 'text/plain' | ||||
|     end | ||||
|  | ||||
|     # Internal: Lookup mime type for extension or mime type | ||||
|     # | ||||
|     # ext_or_mime_type - A file extension ".txt" or mime type "text/plain". | ||||
|     # | ||||
|     # Returns a MIME::Type | ||||
|     def self.lookup_mime_type_for(ext_or_mime_type) | ||||
|       ext_or_mime_type ||= '' | ||||
|  | ||||
|       if ext_or_mime_type =~ /\w+\/\w+/ | ||||
|         guesses = ::MIME::Types[ext_or_mime_type] | ||||
|       else | ||||
|         guesses = ::MIME::Types.type_for(ext_or_mime_type) | ||||
|       end | ||||
|  | ||||
|       # Use custom override first | ||||
|       guesses.detect { |type| type.override } || | ||||
|  | ||||
|         # Prefer text mime types over binary | ||||
|         guesses.detect { |type| type.ascii? } || | ||||
|  | ||||
|         # Otherwise use the first guess | ||||
|         guesses.first | ||||
|     end | ||||
|   end | ||||
| end | ||||
| @@ -1,62 +0,0 @@ | ||||
| # Additional types to add to MIME::Types | ||||
| # | ||||
| # MIME types are used to set the Content-Type of raw binary blobs. All text | ||||
| # blobs are served as text/plain regardless of their type to ensure they | ||||
| # open in the browser rather than downloading. | ||||
| # | ||||
| # The encoding helps determine whether a file should be treated as plain | ||||
| # text or binary. By default, a mime type's encoding is base64 (binary). | ||||
| # These types will show a "View Raw" link. To force a type to render as | ||||
| # plain text, set it to 8bit for UTF-8. text/* types will be treated as | ||||
| # text by default. | ||||
| # | ||||
| #   <type> @<extensions> :<encoding> | ||||
| # | ||||
| # type       - mediatype/subtype | ||||
| # extensions - comma seperated extension list | ||||
| # encoding   - base64 (binary), 7bit (ASCII), 8bit (UTF-8), or | ||||
| #              quoted-printable (Printable ASCII). | ||||
| # | ||||
| # Follows same format as mime-types data file | ||||
| #   https://github.com/halostatue/mime-types/blob/master/lib/mime/types.rb.data | ||||
| # | ||||
| # Any additions or modifications (even trivial) should have corresponding | ||||
| # test change in `test/test_mime.rb`. | ||||
|  | ||||
| # TODO: Lookup actual types | ||||
| application/octet-stream @a,blend,gem,graffle,ipa,lib,mcz,nib,o,ogv,otf,pfx,pigx,plgx,psd,sib,spl,sqlite3,swc,ucode,xpi | ||||
|  | ||||
| # Please keep this list alphabetized | ||||
| application/java-archive @ear,war | ||||
| application/netcdf :8bit | ||||
| application/ogg @ogg | ||||
| application/postscript :base64 | ||||
| application/vnd.adobe.air-application-installer-package+zip @air | ||||
| application/vnd.mozilla.xul+xml :8bit | ||||
| application/vnd.oasis.opendocument.presentation @odp | ||||
| application/vnd.oasis.opendocument.spreadsheet @ods | ||||
| application/vnd.oasis.opendocument.text @odt | ||||
| application/vnd.openofficeorg.extension @oxt | ||||
| application/vnd.openxmlformats-officedocument.presentationml.presentation @pptx | ||||
| application/x-chrome-extension @crx | ||||
| application/x-iwork-keynote-sffkey @key | ||||
| application/x-iwork-numbers-sffnumbers @numbers | ||||
| application/x-iwork-pages-sffpages @pages | ||||
| application/x-ms-xbap @xbap :8bit | ||||
| application/x-parrot-bytecode @pbc | ||||
| application/x-shockwave-flash @swf | ||||
| application/x-silverlight-app @xap | ||||
| application/x-supercollider @sc :8bit | ||||
| application/x-troff-ms :8bit | ||||
| application/x-wais-source :8bit | ||||
| application/xaml+xml @xaml :8bit | ||||
| application/xslt+xml @xslt :8bit | ||||
| image/x-icns @icns | ||||
| text/cache-manifest @manifest | ||||
| text/plain @cu,cxx | ||||
| text/x-logtalk @lgt | ||||
| text/x-nemerle @n | ||||
| text/x-nimrod @nim | ||||
| text/x-ocaml @ml,mli,mll,mly,sig,sml | ||||
| text/x-rust @rs,rc | ||||
| text/x-scheme @rkt,scm,sls,sps,ss | ||||
| @@ -1,92 +0,0 @@ | ||||
| require 'linguist/language' | ||||
| require 'linguist/mime' | ||||
| require 'pygments' | ||||
|  | ||||
| module Linguist | ||||
|   # Similar to ::Pathname, Linguist::Pathname wraps a path string and | ||||
|   # provides helpful query methods. Its useful when you only have a | ||||
|   # filename but not a blob and need to figure out the language of the file. | ||||
|   class Pathname | ||||
|     # Public: Initialize a Pathname | ||||
|     # | ||||
|     # path - A filename String. The file may or maybe actually exist. | ||||
|     # | ||||
|     # Returns a Pathname. | ||||
|     def initialize(path) | ||||
|       @path = path | ||||
|     end | ||||
|  | ||||
|     # Public: Get the basename of the path | ||||
|     # | ||||
|     # Examples | ||||
|     # | ||||
|     #   Pathname.new('sub/dir/file.rb').basename | ||||
|     #   # => 'file.rb' | ||||
|     # | ||||
|     # Returns a String. | ||||
|     def basename | ||||
|       File.basename(@path) | ||||
|     end | ||||
|  | ||||
|     # Public: Get the extname of the path | ||||
|     # | ||||
|     # Examples | ||||
|     # | ||||
|     #   Pathname.new('.rb').extname | ||||
|     #   # => '.rb' | ||||
|     # | ||||
|     #   Pathname.new('file.rb').extname | ||||
|     #   # => '.rb' | ||||
|     # | ||||
|     # Returns a String. | ||||
|     def extname | ||||
|       File.extname(@path) | ||||
|     end | ||||
|  | ||||
|     # Public: Get the language of the path | ||||
|     # | ||||
|     # The path extension name is the only heuristic used to detect the | ||||
|     # language name. | ||||
|     # | ||||
|     # Examples | ||||
|     # | ||||
|     #   Pathname.new('file.rb').language | ||||
|     #   # => Language['Ruby'] | ||||
|     # | ||||
|     # Returns a Language or nil if none was found. | ||||
|     def language | ||||
|       @language ||= Language.find_by_filename(@path) | ||||
|     end | ||||
|  | ||||
|     # Internal: Get the lexer of the path | ||||
|     # | ||||
|     # Returns a Lexer. | ||||
|     def lexer | ||||
|       language ? language.lexer : Pygments::Lexer.find_by_name('Text only') | ||||
|     end | ||||
|  | ||||
|     # Public: Get the mime type | ||||
|     # | ||||
|     # Examples | ||||
|     # | ||||
|     #   Pathname.new('index.html').mime_type | ||||
|     #   # => 'text/html' | ||||
|     # | ||||
|     # Returns a mime type String. | ||||
|     def mime_type | ||||
|       @mime_type ||= Mime.mime_for(extname) | ||||
|     end | ||||
|  | ||||
|     # Public: Return self as String | ||||
|     # | ||||
|     # Returns a String | ||||
|     def to_s | ||||
|       @path.dup | ||||
|     end | ||||
|  | ||||
|     def eql?(other) | ||||
|       other.is_a?(self.class) && @path == other.to_s | ||||
|     end | ||||
|     alias_method :==, :eql? | ||||
|   end | ||||
| end | ||||
| @@ -8,6 +8,8 @@ | ||||
| - C# | ||||
| - C++ | ||||
| - CSS | ||||
| - Clojure | ||||
| - CoffeeScript | ||||
| - Common Lisp | ||||
| - Diff | ||||
| - Emacs Lisp | ||||
| @@ -25,5 +27,3 @@ | ||||
| - SQL | ||||
| - Scala | ||||
| - Scheme | ||||
| - TeX | ||||
| - XML | ||||
|   | ||||
| @@ -1,4 +1,5 @@ | ||||
| require 'linguist/file_blob' | ||||
| require 'linguist/lazy_blob' | ||||
| require 'rugged' | ||||
|  | ||||
| module Linguist | ||||
|   # A Repository is an abstraction of a Grit::Repo or a basic file | ||||
| @@ -7,89 +8,146 @@ module Linguist | ||||
|   # Its primary purpose is for gathering language statistics across | ||||
|   # the entire project. | ||||
|   class Repository | ||||
|     # Public: Initialize a new Repository from a File directory | ||||
|     # | ||||
|     # base_path - A path String | ||||
|     # | ||||
|     # Returns a Repository | ||||
|     def self.from_directory(base_path) | ||||
|       new Dir["#{base_path}/**/*"]. | ||||
|         select { |f| File.file?(f) }. | ||||
|         map { |path| FileBlob.new(path, base_path) } | ||||
|     attr_reader :repository | ||||
|  | ||||
|     # Public: Create a new Repository based on the stats of | ||||
|     # an existing one | ||||
|     def self.incremental(repo, commit_oid, old_commit_oid, old_stats) | ||||
|       repo = self.new(repo, commit_oid) | ||||
|       repo.load_existing_stats(old_commit_oid, old_stats) | ||||
|       repo | ||||
|     end | ||||
|  | ||||
|     # Public: Initialize a new Repository | ||||
|     # Public: Initialize a new Repository to be analyzed for language | ||||
|     # data | ||||
|     # | ||||
|     # enum - Enumerator that responds to `each` and | ||||
|     #        yields Blob objects | ||||
|     # repo - a Rugged::Repository object | ||||
|     # commit_oid - the sha1 of the commit that will be analyzed; | ||||
|     #              this is usually the master branch | ||||
|     # | ||||
|     # Returns a Repository | ||||
|     def initialize(enum) | ||||
|       @enum = enum | ||||
|       @computed_stats = false | ||||
|       @language = @size = nil | ||||
|       @sizes = Hash.new { 0 } | ||||
|     def initialize(repo, commit_oid) | ||||
|       @repository = repo | ||||
|       @commit_oid = commit_oid | ||||
|  | ||||
|       raise TypeError, 'commit_oid must be a commit SHA1' unless commit_oid.is_a?(String) | ||||
|     end | ||||
|  | ||||
|     # Public: Load the results of a previous analysis on this repository | ||||
|     # to speed up the new scan. | ||||
|     # | ||||
|     # The new analysis will be performed incrementally as to only take | ||||
|     # into account the file changes since the last time the repository | ||||
|     # was scanned | ||||
|     # | ||||
|     # old_commit_oid - the sha1 of the commit that was previously analyzed | ||||
|     # old_stats - the result of the previous analysis, obtained by calling | ||||
|     #             Repository#cache on the old repository | ||||
|     # | ||||
|     # Returns nothing | ||||
|     def load_existing_stats(old_commit_oid, old_stats) | ||||
|       @old_commit_oid = old_commit_oid | ||||
|       @old_stats = old_stats | ||||
|       nil | ||||
|     end | ||||
|  | ||||
|     # Public: Returns a breakdown of language stats. | ||||
|     # | ||||
|     # Examples | ||||
|     # | ||||
|     #   # => { Language['Ruby'] => 46319, | ||||
|     #          Language['JavaScript'] => 258 } | ||||
|     #   # => { 'Ruby' => 46319, | ||||
|     #          'JavaScript' => 258 } | ||||
|     # | ||||
|     # Returns a Hash of Language keys and Integer size values. | ||||
|     # Returns a Hash of language names and Integer size values. | ||||
|     def languages | ||||
|       compute_stats | ||||
|       @sizes | ||||
|       @sizes ||= begin | ||||
|         sizes = Hash.new { 0 } | ||||
|         cache.each do |_, (language, size)| | ||||
|           sizes[language] += size | ||||
|         end | ||||
|         sizes | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     # Public: Get primary Language of repository. | ||||
|     # | ||||
|     # Returns a Language | ||||
|     # Returns a language name | ||||
|     def language | ||||
|       compute_stats | ||||
|       @language | ||||
|       @language ||= begin | ||||
|         primary = languages.max_by { |(_, size)| size } | ||||
|         primary && primary[0] | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     # Public: Get the total size of the repository. | ||||
|     # | ||||
|     # Returns a byte size Integer | ||||
|     def size | ||||
|       compute_stats | ||||
|       @size | ||||
|       @size ||= languages.inject(0) { |s,(_,v)| s + v } | ||||
|     end | ||||
|  | ||||
|     # Internal: Compute language breakdown for each blob in the Repository. | ||||
|     # Public: Return the language breakdown of this repository by file | ||||
|     # | ||||
|     # Returns nothing | ||||
|     def compute_stats | ||||
|       return if @computed_stats | ||||
|     # Returns a map of language names => [filenames...] | ||||
|     def breakdown_by_file | ||||
|       @file_breakdown ||= begin | ||||
|         breakdown = Hash.new { |h,k| h[k] = Array.new } | ||||
|         cache.each do |filename, (language, _)| | ||||
|           breakdown[language] << filename | ||||
|         end | ||||
|         breakdown | ||||
|       end | ||||
|     end | ||||
|  | ||||
|       @enum.each do |blob| | ||||
|         # Skip binary file extensions | ||||
|         next if blob.binary_mime_type? | ||||
|     # Public: Return the cached results of the analysis | ||||
|     # | ||||
|     # This is a per-file breakdown that can be passed to other instances | ||||
|     # of Linguist::Repository to perform incremental scans | ||||
|     # | ||||
|     # Returns a map of filename => [language, size] | ||||
|     def cache | ||||
|       @cache ||= begin | ||||
|         if @old_commit_oid == @commit_oid | ||||
|           @old_stats | ||||
|         else | ||||
|           compute_stats(@old_commit_oid, @commit_oid, @old_stats) | ||||
|         end | ||||
|       end | ||||
|     end | ||||
|  | ||||
|         # Skip vendored or generated blobs | ||||
|         next if blob.vendored? || blob.generated? || blob.language.nil? | ||||
|     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 | ||||
|  | ||||
|         # Only include programming languages | ||||
|         if blob.language.type == :programming | ||||
|           @sizes[blob.language.group] += blob.size | ||||
|       diff = Rugged::Tree.diff(repository, old_tree, new_tree) | ||||
|  | ||||
|       diff.each_delta do |delta| | ||||
|         old = delta.old_file[:path] | ||||
|         new = delta.new_file[:path] | ||||
|  | ||||
|         file_map.delete(old) | ||||
|         next if delta.binary | ||||
|  | ||||
|         if [:added, :modified].include? delta.status | ||||
|           # Skip submodules | ||||
|           mode = delta.new_file[:mode] | ||||
|           next if (mode & 040000) != 0 | ||||
|  | ||||
|           blob = Linguist::LazyBlob.new(repository, delta.new_file[:oid], new, mode.to_s(8)) | ||||
|  | ||||
|           # Skip vendored or generated blobs | ||||
|           next if blob.vendored? || blob.generated? || blob.language.nil? | ||||
|  | ||||
|           # Only include programming languages and acceptable markup languages | ||||
|           if blob.language.type == :programming || Language.detectable_markup.include?(blob.language.name) | ||||
|             file_map[new] = [blob.language.group.name, blob.size] | ||||
|           end | ||||
|         end | ||||
|       end | ||||
|  | ||||
|       # Compute total size | ||||
|       @size = @sizes.inject(0) { |s,(k,v)| s + v } | ||||
|  | ||||
|       # Get primary language | ||||
|       if primary = @sizes.max_by { |(_, size)| size } | ||||
|         @language = primary[0] | ||||
|       end | ||||
|  | ||||
|       @computed_stats = true | ||||
|  | ||||
|       nil | ||||
|       file_map | ||||
|     end | ||||
|   end | ||||
| end | ||||
|   | ||||
							
								
								
									
										73542
									
								
								lib/linguist/samples.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										73542
									
								
								lib/linguist/samples.json
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										149
									
								
								lib/linguist/samples.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										149
									
								
								lib/linguist/samples.rb
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,149 @@ | ||||
| begin | ||||
|   require 'json' | ||||
| rescue LoadError | ||||
|   require 'yaml' | ||||
| end | ||||
|  | ||||
| require 'linguist/md5' | ||||
| require 'linguist/classifier' | ||||
|  | ||||
| module Linguist | ||||
|   # Model for accessing classifier training data. | ||||
|   module Samples | ||||
|     # Path to samples root directory | ||||
|     ROOT = File.expand_path("../../../samples", __FILE__) | ||||
|  | ||||
|     # Path for serialized samples db | ||||
|     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)) | ||||
|     end | ||||
|  | ||||
|     # Public: Iterate over each sample. | ||||
|     # | ||||
|     # &block - Yields Sample to block | ||||
|     # | ||||
|     # Returns nothing. | ||||
|     def self.each(&block) | ||||
|       Dir.entries(ROOT).sort!.each do |category| | ||||
|         next if category == '.' || category == '..' | ||||
|  | ||||
|         # Skip text and binary for now | ||||
|         # Possibly reconsider this later | ||||
|         next if category == 'Text' || category == 'Binary' | ||||
|  | ||||
|         dirname = File.join(ROOT, category) | ||||
|         Dir.entries(dirname).each do |filename| | ||||
|           next if filename == '.' || filename == '..' | ||||
|  | ||||
|           if filename == 'filenames' | ||||
|             Dir.entries(File.join(dirname, filename)).each do |subfilename| | ||||
|               next if subfilename == '.' || subfilename == '..' | ||||
|  | ||||
|               yield({ | ||||
|                 :path    => File.join(dirname, filename, subfilename), | ||||
|                 :language => category, | ||||
|                 :filename => subfilename | ||||
|               }) | ||||
|             end | ||||
|           else | ||||
|             if File.extname(filename) == "" | ||||
|               raise "#{File.join(dirname, filename)} is missing an extension, maybe it belongs in filenames/ subdir" | ||||
|             end | ||||
|  | ||||
|             yield({ | ||||
|               :path     => File.join(dirname, filename), | ||||
|               :language => category, | ||||
|               :interpreter => File.exist?(filename) ? Linguist.interpreter_from_shebang(File.read(filename)) : nil, | ||||
|               :extname  => File.extname(filename) | ||||
|             }) | ||||
|           end | ||||
|         end | ||||
|       end | ||||
|  | ||||
|       nil | ||||
|     end | ||||
|  | ||||
|     # Public: Build Classifier from all samples. | ||||
|     # | ||||
|     # Returns trained Classifier. | ||||
|     def self.data | ||||
|       db = {} | ||||
|       db['extnames'] = {} | ||||
|       db['interpreters'] = {} | ||||
|       db['filenames'] = {} | ||||
|  | ||||
|       each do |sample| | ||||
|         language_name = sample[:language] | ||||
|  | ||||
|         if sample[:extname] | ||||
|           db['extnames'][language_name] ||= [] | ||||
|           if !db['extnames'][language_name].include?(sample[:extname]) | ||||
|             db['extnames'][language_name] << sample[:extname] | ||||
|             db['extnames'][language_name].sort! | ||||
|           end | ||||
|         end | ||||
|  | ||||
|         if sample[:interpreter] | ||||
|           db['interpreters'][language_name] ||= [] | ||||
|           if !db['interpreters'][language_name].include?(sample[:interpreter]) | ||||
|             db['interpreters'][language_name] << sample[:interpreter] | ||||
|             db['interpreters'][language_name].sort! | ||||
|           end | ||||
|         end | ||||
|  | ||||
|         if sample[:filename] | ||||
|           db['filenames'][language_name] ||= [] | ||||
|           db['filenames'][language_name] << sample[:filename] | ||||
|           db['filenames'][language_name].sort! | ||||
|         end | ||||
|  | ||||
|         data = File.read(sample[:path]) | ||||
|         Classifier.train!(db, language_name, data) | ||||
|       end | ||||
|  | ||||
|       db['md5'] = Linguist::MD5.hexdigest(db) | ||||
|  | ||||
|       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 | ||||
							
								
								
									
										198
									
								
								lib/linguist/tokenizer.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										198
									
								
								lib/linguist/tokenizer.rb
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,198 @@ | ||||
| require 'strscan' | ||||
|  | ||||
| module Linguist | ||||
|   # Generic programming language tokenizer. | ||||
|   # | ||||
|   # Tokens are designed for use in the language bayes classifier. | ||||
|   # It strips any data strings or comments and preserves significant | ||||
|   # language symbols. | ||||
|   class Tokenizer | ||||
|     # Public: Extract tokens from data | ||||
|     # | ||||
|     # data - String to tokenize | ||||
|     # | ||||
|     # Returns Array of token Strings. | ||||
|     def self.tokenize(data) | ||||
|       new.extract_tokens(data) | ||||
|     end | ||||
|  | ||||
|     # Read up to 100KB | ||||
|     BYTE_LIMIT = 100_000 | ||||
|  | ||||
|     # Start state on token, ignore anything till the next newline | ||||
|     SINGLE_LINE_COMMENTS = [ | ||||
|       '//', # C | ||||
|       '#',  # Ruby | ||||
|       '%',  # Tex | ||||
|     ] | ||||
|  | ||||
|     # Start state on opening token, ignore anything until the closing | ||||
|     # token is reached. | ||||
|     MULTI_LINE_COMMENTS = [ | ||||
|       ['/*', '*/'],    # C | ||||
|       ['<!--', '-->'], # XML | ||||
|       ['{-', '-}'],    # Haskell | ||||
|       ['(*', '*)'],    # Coq | ||||
|       ['"""', '"""']   # Python | ||||
|     ] | ||||
|  | ||||
|     START_SINGLE_LINE_COMMENT =  Regexp.compile(SINGLE_LINE_COMMENTS.map { |c| | ||||
|       "\s*#{Regexp.escape(c)} " | ||||
|     }.join("|")) | ||||
|  | ||||
|     START_MULTI_LINE_COMMENT =  Regexp.compile(MULTI_LINE_COMMENTS.map { |c| | ||||
|       Regexp.escape(c[0]) | ||||
|     }.join("|")) | ||||
|  | ||||
|     # Internal: Extract generic tokens from data. | ||||
|     # | ||||
|     # data - String to scan. | ||||
|     # | ||||
|     # Examples | ||||
|     # | ||||
|     #   extract_tokens("printf('Hello')") | ||||
|     #   # => ['printf', '(', ')'] | ||||
|     # | ||||
|     # Returns Array of token Strings. | ||||
|     def extract_tokens(data) | ||||
|       s = StringScanner.new(data) | ||||
|  | ||||
|       tokens = [] | ||||
|       until s.eos? | ||||
|         break if s.pos >= BYTE_LIMIT | ||||
|  | ||||
|         if token = s.scan(/^#!.+$/) | ||||
|           if name = extract_shebang(token) | ||||
|             tokens << "SHEBANG#!#{name}" | ||||
|           end | ||||
|  | ||||
|         # Single line comment | ||||
|         elsif s.beginning_of_line? && token = s.scan(START_SINGLE_LINE_COMMENT) | ||||
|           # tokens << token.strip | ||||
|           s.skip_until(/\n|\Z/) | ||||
|  | ||||
|         # Multiline comments | ||||
|         elsif token = s.scan(START_MULTI_LINE_COMMENT) | ||||
|           # tokens << token | ||||
|           close_token = MULTI_LINE_COMMENTS.assoc(token)[1] | ||||
|           s.skip_until(Regexp.compile(Regexp.escape(close_token))) | ||||
|           # tokens << close_token | ||||
|  | ||||
|         # Skip single or double quoted strings | ||||
|         elsif s.scan(/"/) | ||||
|           if s.peek(1) == "\"" | ||||
|             s.getch | ||||
|           else | ||||
|             s.skip_until(/[^\\]"/) | ||||
|           end | ||||
|         elsif s.scan(/'/) | ||||
|           if s.peek(1) == "'" | ||||
|             s.getch | ||||
|           else | ||||
|             s.skip_until(/[^\\]'/) | ||||
|           end | ||||
|  | ||||
|         # Skip number literals | ||||
|         elsif s.scan(/(0x)?\d(\d|\.)*/) | ||||
|  | ||||
|         # SGML style brackets | ||||
|         elsif token = s.scan(/<[^\s<>][^<>]*>/) | ||||
|           extract_sgml_tokens(token).each { |t| tokens << t } | ||||
|  | ||||
|         # Common programming punctuation | ||||
|         elsif token = s.scan(/;|\{|\}|\(|\)|\[|\]/) | ||||
|           tokens << token | ||||
|  | ||||
|         # Regular token | ||||
|         elsif token = s.scan(/[\w\.@#\/\*]+/) | ||||
|           tokens << token | ||||
|  | ||||
|         # Common operators | ||||
|         elsif token = s.scan(/<<?|\+|\-|\*|\/|%|&&?|\|\|?/) | ||||
|           tokens << token | ||||
|  | ||||
|         else | ||||
|           s.getch | ||||
|         end | ||||
|       end | ||||
|  | ||||
|       tokens | ||||
|     end | ||||
|  | ||||
|     # Internal: Extract normalized shebang command token. | ||||
|     # | ||||
|     # Examples | ||||
|     # | ||||
|     #   extract_shebang("#!/usr/bin/ruby") | ||||
|     #   # => "ruby" | ||||
|     # | ||||
|     #   extract_shebang("#!/usr/bin/env node") | ||||
|     #   # => "node" | ||||
|     # | ||||
|     # Returns String token or nil it couldn't be parsed. | ||||
|     def extract_shebang(data) | ||||
|       s = StringScanner.new(data) | ||||
|  | ||||
|       if path = s.scan(/^#!\s*\S+/) | ||||
|         script = path.split('/').last | ||||
|         if script == 'env' | ||||
|           s.scan(/\s+/) | ||||
|           script = s.scan(/\S+/) | ||||
|         end | ||||
|         script = script[/[^\d]+/, 0] if script | ||||
|         return script | ||||
|       end | ||||
|  | ||||
|       nil | ||||
|     end | ||||
|  | ||||
|     # Internal: Extract tokens from inside SGML tag. | ||||
|     # | ||||
|     # data - SGML tag String. | ||||
|     # | ||||
|     # Examples | ||||
|     # | ||||
|     #   extract_sgml_tokens("<a href='' class=foo>") | ||||
|     #   # => ["<a>", "href="] | ||||
|     # | ||||
|     # Returns Array of token Strings. | ||||
|     def extract_sgml_tokens(data) | ||||
|       s = StringScanner.new(data) | ||||
|  | ||||
|       tokens = [] | ||||
|  | ||||
|       until s.eos? | ||||
|         # Emit start token | ||||
|         if token = s.scan(/<\/?[^\s>]+/) | ||||
|           tokens << "#{token}>" | ||||
|  | ||||
|         # Emit attributes with trailing = | ||||
|         elsif token = s.scan(/\w+=/) | ||||
|           tokens << token | ||||
|  | ||||
|           # Then skip over attribute value | ||||
|           if s.scan(/"/) | ||||
|             s.skip_until(/[^\\]"/) | ||||
|           elsif s.scan(/'/) | ||||
|             s.skip_until(/[^\\]'/) | ||||
|           else | ||||
|             s.skip_until(/\w+/) | ||||
|           end | ||||
|  | ||||
|         # Emit lone attributes | ||||
|         elsif token = s.scan(/\w+/) | ||||
|           tokens << token | ||||
|  | ||||
|         # Stop at the end of the tag | ||||
|         elsif s.scan(/>/) | ||||
|           s.terminate | ||||
|  | ||||
|         else | ||||
|           s.getch | ||||
|         end | ||||
|       end | ||||
|  | ||||
|       tokens | ||||
|     end | ||||
|   end | ||||
| end | ||||
| @@ -10,25 +10,72 @@ | ||||
| ## Vendor Conventions ## | ||||
|  | ||||
| # Caches | ||||
| - cache/ | ||||
| - (^|/)cache/ | ||||
|  | ||||
| # Dependencies | ||||
| - ^[Dd]ependencies/ | ||||
|  | ||||
| # C deps | ||||
| #  https://github.com/joyent/node | ||||
| - ^deps/ | ||||
| - ^tools/ | ||||
| - (^|/)configure$ | ||||
| - (^|/)configure.ac$ | ||||
| - (^|/)config.guess$ | ||||
| - (^|/)config.sub$ | ||||
|  | ||||
| # Node depedencies | ||||
| # Node dependencies | ||||
| - node_modules/ | ||||
|  | ||||
| # Vendored depedencies | ||||
| - vendor/ | ||||
| # Bower Components | ||||
| - bower_components/ | ||||
|  | ||||
| # Erlang bundles | ||||
| - ^rebar$ | ||||
|  | ||||
| # Bootstrap minified css and js | ||||
| - (^|/)bootstrap([^.]*)(\.min)?\.(js|css)$ | ||||
|  | ||||
| # Font Awesome | ||||
| - font-awesome.min.css | ||||
| - font-awesome.css | ||||
|  | ||||
| # Foundation css | ||||
| - foundation.min.css | ||||
| - foundation.css | ||||
|  | ||||
| # Normalize.css | ||||
| - normalize.css | ||||
|  | ||||
| # Bourbon SCSS | ||||
| - (^|/)[Bb]ourbon/.*\.css$ | ||||
| - (^|/)[Bb]ourbon/.*\.scss$ | ||||
|  | ||||
| # Animate.css | ||||
| - animate.css | ||||
| - animate.min.css | ||||
|  | ||||
| # Vendored dependencies | ||||
| - third[-_]?party/ | ||||
| - 3rd[-_]?party/ | ||||
| - vendors?/ | ||||
| - extern(al)?/ | ||||
|  | ||||
| # Debian packaging | ||||
| - ^debian/ | ||||
|  | ||||
| # Haxelib projects often contain a neko bytecode file named run.n | ||||
| - run.n$ | ||||
|  | ||||
| ## Commonly Bundled JavaScript frameworks ## | ||||
|  | ||||
| # jQuery | ||||
| - (^|/)jquery([^.]*)(\.min)?\.js$ | ||||
| - (^|/)jquery\-\d\.\d(\.\d)?(\.min)?\.js$ | ||||
| - (^|/)jquery\-\d\.\d+(\.\d+)?(\.min)?\.js$ | ||||
|  | ||||
| # jQuery UI | ||||
| - (^|/)jquery\-ui(\-\d\.\d+(\.\d+)?)?(\.\w+)?(\.min)?\.(js|css)$ | ||||
| - (^|/)jquery\.(ui|effects)\.([^.]*)(\.min)?\.(js|css)$ | ||||
|  | ||||
| # Prototype | ||||
| - (^|/)prototype(.*)\.js$ | ||||
| @@ -36,6 +83,9 @@ | ||||
| - (^|/)controls\.js$ | ||||
| - (^|/)dragdrop\.js$ | ||||
|  | ||||
| # Typescript definition files | ||||
| - (.*?)\.d\.ts$ | ||||
|  | ||||
| # MooTools | ||||
| - (^|/)mootools([^.]*)\d+\.\d+.\d+([^.]*)\.js$ | ||||
|  | ||||
| @@ -49,10 +99,6 @@ | ||||
| - (^|/)yahoo-([^.]*)\.js$ | ||||
| - (^|/)yui([^.]*)\.js$ | ||||
|  | ||||
| # LESS css | ||||
| - (^|/)less([^.]*)(\.min)?\.js$ | ||||
| - (^|/)less\-\d+\.\d+\.\d+(\.min)?\.js$ | ||||
|  | ||||
| # WYS editors | ||||
| - (^|/)ckeditor\.js$ | ||||
| - (^|/)tiny_mce([^.]*)\.js$ | ||||
| @@ -61,36 +107,131 @@ | ||||
| # MathJax | ||||
| - (^|/)MathJax/ | ||||
|  | ||||
| # SyntaxHighlighter - http://alexgorbatchev.com/ | ||||
| - (^|/)shBrush([^.]*)\.js$ | ||||
| - (^|/)shCore\.js$ | ||||
| - (^|/)shLegacy\.js$ | ||||
|  | ||||
| # AngularJS | ||||
| - (^|/)angular([^.]*)(\.min)?\.js$ | ||||
|  | ||||
| # D3.js | ||||
| - (^|\/)d3(\.v\d+)?([^.]*)(\.min)?\.js$ | ||||
|  | ||||
| # React | ||||
| - (^|/)react(-[^.]*)?(\.min)?\.js$ | ||||
|  | ||||
| # Modernizr | ||||
| - (^|/)modernizr\-\d\.\d+(\.\d+)?(\.min)?\.js$ | ||||
| - (^|/)modernizr\.custom\.\d+\.js$ | ||||
|  | ||||
| # Knockout | ||||
| - (^|/)knockout-(\d+\.){3}(debug\.)?js$ | ||||
| - knockout-min.js | ||||
|  | ||||
| ## Python ## | ||||
|  | ||||
| # django | ||||
| - (^|/)admin_media/ | ||||
|  | ||||
| # Fabric | ||||
| - ^fabfile\.py$ | ||||
|  | ||||
| # WAF | ||||
| - ^waf$ | ||||
|  | ||||
| # .osx | ||||
| - ^.osx$ | ||||
|  | ||||
| ## Obj-C ## | ||||
|  | ||||
| # Cocoapods | ||||
| - ^Pods/ | ||||
|  | ||||
| # Sparkle | ||||
| - (^|/)Sparkle/ | ||||
|  | ||||
| ## Groovy ## | ||||
|  | ||||
| # Gradle | ||||
| - (^|/)gradlew$ | ||||
| - (^|/)gradlew\.bat$ | ||||
| - (^|/)gradle/wrapper/ | ||||
|  | ||||
| ## .NET ## | ||||
|  | ||||
| # Visual Studio IntelliSense | ||||
| - -vsdoc\.js$ | ||||
| - \.intellisense\.js$ | ||||
|  | ||||
| # jQuery validation plugin (MS bundles this with asp.net mvc) | ||||
| - (^|/)jquery([^.]*)\.validate(\.min)?\.js$ | ||||
| - (^|/)jquery([^.]*)\.validate(\.unobtrusive)?(\.min)?\.js$ | ||||
| - (^|/)jquery([^.]*)\.unobtrusive\-ajax(\.min)?\.js$ | ||||
|  | ||||
| # Microsoft Ajax | ||||
| - (^|/)[Mm]icrosoft([Mm]vc)?([Aa]jax|[Vv]alidation)(\.debug)?\.js$ | ||||
|  | ||||
| # NuGet | ||||
| - ^[Pp]ackages/ | ||||
| - ^[Pp]ackages\/.+\.\d+\/ | ||||
|  | ||||
| # ExtJS | ||||
| - (^|/)extjs/ | ||||
| - (^|/)extjs/.*?\.js$ | ||||
| - (^|/)extjs/.*?\.xml$ | ||||
| - (^|/)extjs/.*?\.txt$ | ||||
| - (^|/)extjs/.*?\.html$ | ||||
| - (^|/)extjs/.*?\.properties$ | ||||
| - (^|/)extjs/.sencha/ | ||||
| - (^|/)extjs/docs/ | ||||
| - (^|/)extjs/builds/ | ||||
| - (^|/)extjs/cmd/ | ||||
| - (^|/)extjs/examples/ | ||||
| - (^|/)extjs/locale/ | ||||
| - (^|/)extjs/packages/ | ||||
| - (^|/)extjs/plugins/ | ||||
| - (^|/)extjs/resources/ | ||||
| - (^|/)extjs/src/ | ||||
| - (^|/)extjs/welcome/ | ||||
|  | ||||
| # Html5shiv | ||||
| - (^|/)html5shiv(\.min)?\.js$ | ||||
|  | ||||
| # Samples folders | ||||
| - ^[Ss]amples/ | ||||
|  | ||||
| # LICENSE, README, git config files | ||||
| - ^COPYING$ | ||||
| - LICENSE$ | ||||
| - License$ | ||||
| - gitattributes$ | ||||
| - gitignore$ | ||||
| - gitmodules$ | ||||
| - ^README$ | ||||
| - ^readme$ | ||||
|  | ||||
| # Test fixtures | ||||
| - ^[Tt]est/fixtures/ | ||||
|  | ||||
| # PhoneGap/Cordova | ||||
| - (^|/)cordova([^.]*)(\.min)?\.js$ | ||||
| - (^|/)cordova\-\d\.\d(\.\d)?(\.min)?\.js$ | ||||
|  | ||||
| # Foundation js | ||||
| - foundation(\..*)?\.js$ | ||||
|  | ||||
| # Vagrant | ||||
| - ^Vagrantfile$ | ||||
|  | ||||
| # .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 | ||||
|   | ||||
							
								
								
									
										3
									
								
								lib/linguist/version.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								lib/linguist/version.rb
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| module Linguist | ||||
|   VERSION = "3.1.5" | ||||
| end | ||||
							
								
								
									
										219
									
								
								samples/ABAP/cl_csv_parser.abap
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										219
									
								
								samples/ABAP/cl_csv_parser.abap
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,219 @@ | ||||
| */** | ||||
| * The MIT License (MIT) | ||||
| * Copyright (c) 2012 René van Mil | ||||
| *  | ||||
| * Permission is hereby granted, free of charge, to any person obtaining | ||||
| * a copy of this software and associated documentation files (the | ||||
| * "Software"), to deal in the Software without restriction, including | ||||
| * without limitation the rights to use, copy, modify, merge, publish, | ||||
| * distribute, sublicense, and/or sell copies of the Software, and to | ||||
| * permit persons to whom the Software is furnished to do so, subject to | ||||
| * the following conditions: | ||||
| *  | ||||
| * The above copyright notice and this permission notice shall be | ||||
| * included in all copies or substantial portions of the Software. | ||||
| *  | ||||
| * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||||
| * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | ||||
| * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. | ||||
| * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY | ||||
| * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, | ||||
| * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE | ||||
| * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||||
| */ | ||||
|  | ||||
| *----------------------------------------------------------------------* | ||||
| *       CLASS CL_CSV_PARSER DEFINITION | ||||
| *----------------------------------------------------------------------* | ||||
| * | ||||
| *----------------------------------------------------------------------* | ||||
| class cl_csv_parser definition | ||||
|   public | ||||
|   inheriting from cl_object | ||||
|   final | ||||
|   create public . | ||||
|  | ||||
|   public section. | ||||
| *"* public components of class CL_CSV_PARSER | ||||
| *"* do not include other source files here!!! | ||||
|  | ||||
|     type-pools abap . | ||||
|     methods constructor | ||||
|       importing | ||||
|         !delegate type ref to if_csv_parser_delegate | ||||
|         !csvstring type string | ||||
|         !separator type c | ||||
|         !skip_first_line type abap_bool . | ||||
|     methods parse | ||||
|       raising | ||||
|         cx_csv_parse_error . | ||||
|   protected section. | ||||
| *"* protected components of class CL_CSV_PARSER | ||||
| *"* do not include other source files here!!! | ||||
|   private section. | ||||
| *"* private components of class CL_CSV_PARSER | ||||
| *"* do not include other source files here!!! | ||||
|  | ||||
|     constants _textindicator type c value '"'.              "#EC NOTEXT | ||||
|     data _delegate type ref to if_csv_parser_delegate . | ||||
|     data _csvstring type string . | ||||
|     data _separator type c . | ||||
|     type-pools abap . | ||||
|     data _skip_first_line type abap_bool . | ||||
|  | ||||
|     methods _lines | ||||
|       returning | ||||
|         value(returning) type stringtab . | ||||
|     methods _parse_line | ||||
|       importing | ||||
|         !line type string | ||||
|       returning | ||||
|         value(returning) type stringtab | ||||
|       raising | ||||
|         cx_csv_parse_error . | ||||
| endclass.                    "CL_CSV_PARSER DEFINITION | ||||
|  | ||||
|  | ||||
|  | ||||
| *----------------------------------------------------------------------* | ||||
| *       CLASS CL_CSV_PARSER IMPLEMENTATION | ||||
| *----------------------------------------------------------------------* | ||||
| * | ||||
| *----------------------------------------------------------------------* | ||||
| class cl_csv_parser implementation. | ||||
|  | ||||
|  | ||||
| * <SIGNATURE>---------------------------------------------------------------------------------------+ | ||||
| * | Instance Public Method CL_CSV_PARSER->CONSTRUCTOR | ||||
| * +-------------------------------------------------------------------------------------------------+ | ||||
| * | [--->] DELEGATE                       TYPE REF TO IF_CSV_PARSER_DELEGATE | ||||
| * | [--->] CSVSTRING                      TYPE        STRING | ||||
| * | [--->] SEPARATOR                      TYPE        C | ||||
| * | [--->] SKIP_FIRST_LINE                TYPE        ABAP_BOOL | ||||
| * +--------------------------------------------------------------------------------------</SIGNATURE> | ||||
|   method constructor. | ||||
|     super->constructor( ). | ||||
|     _delegate = delegate. | ||||
|     _csvstring = csvstring. | ||||
|     _separator = separator. | ||||
|     _skip_first_line = skip_first_line. | ||||
|   endmethod.                    "constructor | ||||
|  | ||||
|  | ||||
| * <SIGNATURE>---------------------------------------------------------------------------------------+ | ||||
| * | Instance Public Method CL_CSV_PARSER->PARSE | ||||
| * +-------------------------------------------------------------------------------------------------+ | ||||
| * | [!CX!] CX_CSV_PARSE_ERROR | ||||
| * +--------------------------------------------------------------------------------------</SIGNATURE> | ||||
|   method parse. | ||||
|     data msg type string. | ||||
|     if _csvstring is initial. | ||||
|       message e002(csv) into msg. | ||||
|       raise exception type cx_csv_parse_error | ||||
|         exporting | ||||
|           message = msg. | ||||
|     endif. | ||||
|  | ||||
|     " Get the lines | ||||
|     data is_first_line type abap_bool value abap_true. | ||||
|     data lines type standard table of string. | ||||
|     lines = _lines( ). | ||||
|     field-symbols <line> type string. | ||||
|     loop at lines assigning <line>. | ||||
|       " Should we skip the first line? | ||||
|       if _skip_first_line = abap_true and is_first_line = abap_true. | ||||
|         is_first_line = abap_false. | ||||
|         continue. | ||||
|       endif. | ||||
|       " Parse the line | ||||
|       data values type standard table of string. | ||||
|       values = _parse_line( <line> ). | ||||
|       " Send values to delegate | ||||
|       _delegate->values_found( values ). | ||||
|     endloop. | ||||
|   endmethod.                    "parse | ||||
|  | ||||
|  | ||||
| * <SIGNATURE>---------------------------------------------------------------------------------------+ | ||||
| * | Instance Private Method CL_CSV_PARSER->_LINES | ||||
| * +-------------------------------------------------------------------------------------------------+ | ||||
| * | [<-()] RETURNING                      TYPE        STRINGTAB | ||||
| * +--------------------------------------------------------------------------------------</SIGNATURE> | ||||
|   method _lines. | ||||
|     split _csvstring at cl_abap_char_utilities=>cr_lf into table returning. | ||||
|   endmethod.                    "_lines | ||||
|  | ||||
|  | ||||
| * <SIGNATURE>---------------------------------------------------------------------------------------+ | ||||
| * | Instance Private Method CL_CSV_PARSER->_PARSE_LINE | ||||
| * +-------------------------------------------------------------------------------------------------+ | ||||
| * | [--->] LINE                           TYPE        STRING | ||||
| * | [<-()] RETURNING                      TYPE        STRINGTAB | ||||
| * | [!CX!] CX_CSV_PARSE_ERROR | ||||
| * +--------------------------------------------------------------------------------------</SIGNATURE> | ||||
|   method _parse_line. | ||||
|     data msg type string. | ||||
|  | ||||
|     data csvvalue type string. | ||||
|     data csvvalues type standard table of string. | ||||
|  | ||||
|     data char type c. | ||||
|     data pos type i value 0. | ||||
|     data len type i. | ||||
|     len = strlen( line ). | ||||
|     while pos < len. | ||||
|       char = line+pos(1). | ||||
|       if char <> _separator. | ||||
|         if char = _textindicator. | ||||
|           data text_ended type abap_bool. | ||||
|           text_ended = abap_false. | ||||
|           while text_ended = abap_false. | ||||
|             pos = pos + 1. | ||||
|             if pos < len. | ||||
|               char = line+pos(1). | ||||
|               if char = _textindicator. | ||||
|                 text_ended = abap_true. | ||||
|               else. | ||||
|                 if char is initial. " Space | ||||
|                   concatenate csvvalue ` ` into csvvalue. | ||||
|                 else. | ||||
|                   concatenate csvvalue char into csvvalue. | ||||
|                 endif. | ||||
|               endif. | ||||
|             else. | ||||
|               " Reached the end of the line while inside a text value | ||||
|               " This indicates an error in the CSV formatting | ||||
|               text_ended = abap_true. | ||||
|               message e003(csv) into msg. | ||||
|               raise exception type cx_csv_parse_error | ||||
|                 exporting | ||||
|                   message = msg. | ||||
|             endif. | ||||
|           endwhile. | ||||
|           " Check if next character is a separator, otherwise the CSV formatting is incorrect | ||||
|           data nextpos type i. | ||||
|           nextpos = pos + 1. | ||||
|           if nextpos < len and line+nextpos(1) <> _separator. | ||||
|             message e003(csv) into msg. | ||||
|             raise exception type cx_csv_parse_error | ||||
|               exporting | ||||
|                 message = msg. | ||||
|           endif. | ||||
|         else. | ||||
|           if char is initial. " Space | ||||
|             concatenate csvvalue ` ` into csvvalue. | ||||
|           else. | ||||
|             concatenate csvvalue char into csvvalue. | ||||
|           endif. | ||||
|         endif. | ||||
|       else. | ||||
|         append csvvalue to csvvalues. | ||||
|         clear csvvalue. | ||||
|       endif. | ||||
|       pos = pos + 1. | ||||
|     endwhile. | ||||
|     append csvvalue to csvvalues. " Don't forget the last value | ||||
|  | ||||
|     returning = csvvalues. | ||||
|   endmethod.                    "_parse_line | ||||
| endclass.                    "CL_CSV_PARSER IMPLEMENTATION | ||||
							
								
								
									
										521
									
								
								samples/AGS Script/GlobalScript.asc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										521
									
								
								samples/AGS Script/GlobalScript.asc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,521 @@ | ||||
| // main global script file | ||||
|  | ||||
| // A function that initializes a bunch of stuff. | ||||
| function initialize_control_panel() {  | ||||
|   // Centre the control panel | ||||
|   gPanel.Centre();  | ||||
|   // Centre the Restart dialog as well | ||||
|   gRestartYN.Centre();  | ||||
|   if (!IsSpeechVoxAvailable()) {  | ||||
|     // If there is no speech-vox file, and therefore no speech, | ||||
|     // disable all the controls related with speech. | ||||
|     lblVoice.Visible = false;   | ||||
|     btnVoice.Visible = false;   | ||||
|     sldVoice.Visible = false; | ||||
|   } | ||||
|   else { | ||||
|     // If there *is*, then set it to voice and text. It's best to use | ||||
|     // both whenever possible, for the player's sake. | ||||
|     SetVoiceMode(eSpeechVoiceAndText);  | ||||
|     // And reflect this in the control panel. | ||||
|     btnVoice.Text = "Voice and Text";  | ||||
|   } | ||||
|   if (!System.SupportsGammaControl) { | ||||
|     // If we can't change the gamma settings, disable the relevant options. | ||||
|     sldGamma.Visible = false;  | ||||
|     lblGamma.Visible = false; | ||||
|   }  | ||||
|    | ||||
|   //And now, set all the defaults | ||||
|   System.Volume = 100; | ||||
|   sldAudio.Value = System.Volume; | ||||
|   SetGameSpeed(40); | ||||
|   sldSpeed.Value = 40; | ||||
|   if (IsSpeechVoxAvailable()) { | ||||
|      SetVoiceMode(eSpeechVoiceAndText); | ||||
|      btnVoice.Text = "Voice and Text"; | ||||
|      sldVoice.Value = 255; | ||||
|      SetSpeechVolume(255); | ||||
|   } | ||||
|   if (System.SupportsGammaControl) { | ||||
|     System.Gamma = 100; | ||||
|     sldGamma.Value = 100; | ||||
|   } | ||||
| } | ||||
|  | ||||
| // Called when the game starts, before the first room is loaded | ||||
| function game_start() {    | ||||
|   // Put the code all in a function and then just call the function.  | ||||
|   // It saves cluttering up places like game_start. | ||||
|   initialize_control_panel();  | ||||
|   // Use the KeyboardMovement module to, per default, replicate the standard | ||||
|   // keyboard movement of most Sierra games. See KeyboardMovement.txt for more info | ||||
|   KeyboardMovement.SetMode(eKeyboardMovement_Tapping);  | ||||
| } | ||||
|  | ||||
| function repeatedly_execute() { | ||||
|    | ||||
|   // Put here anything you want to happen every game cycle, even when | ||||
|   // the game is paused. This will not run when the game is blocked | ||||
|   // inside a command like a blocking Walk() | ||||
|    | ||||
|   if (IsGamePaused() == 1) return; | ||||
|  | ||||
|   // Put here anything you want to happen every game cycle, but not | ||||
|   // when the game is paused. | ||||
| } | ||||
|  | ||||
| function repeatedly_execute_always() { | ||||
|    | ||||
|   // Put anything you want to happen every game cycle, even | ||||
|   // when the game is blocked inside a command like a | ||||
|   // blocking Walk(). | ||||
|   // You cannot run blocking commands from this function. | ||||
|    | ||||
| } | ||||
|  | ||||
| function show_inventory_window ()  | ||||
| { | ||||
|   gInventory.Visible = true; | ||||
|   // switch to the Use cursor (to select items with) | ||||
|   mouse.Mode = eModeInteract; | ||||
|   // But, override the appearance to look like the arrow | ||||
|   mouse.UseModeGraphic(eModePointer); | ||||
| } | ||||
|  | ||||
| function show_save_game_dialog() | ||||
| { | ||||
|   gSaveGame.Visible = true; | ||||
|   // Get the list of save games | ||||
|   lstSaveGamesList.FillSaveGameList(); | ||||
|   if (lstSaveGamesList.ItemCount > 0) | ||||
|   { | ||||
|     // If there is at least one, set the default text | ||||
|     // to be the first game's name | ||||
|     txtNewSaveName.Text = lstSaveGamesList.Items[0]; | ||||
|   } | ||||
|   else | ||||
|   { | ||||
|     // No save games yet, default empty text. | ||||
|     txtNewSaveName.Text = ""; | ||||
|   } | ||||
|   mouse.UseModeGraphic(eModePointer); | ||||
|   gIconbar.Visible = false; | ||||
| } | ||||
|  | ||||
| function show_restore_game_dialog() | ||||
| { | ||||
|   gRestoreGame.Visible = true; | ||||
|   lstRestoreGamesList.FillSaveGameList(); | ||||
|   mouse.UseModeGraphic(eModePointer); | ||||
|   gIconbar.Visible = false; | ||||
| } | ||||
|  | ||||
| function close_save_game_dialog() | ||||
| { | ||||
|   gSaveGame.Visible = false; | ||||
|   mouse.UseDefaultGraphic(); | ||||
|   gIconbar.Visible = true; | ||||
| } | ||||
|  | ||||
| function close_restore_game_dialog() | ||||
| { | ||||
|   gRestoreGame.Visible = false; | ||||
|   mouse.UseDefaultGraphic(); | ||||
|   gIconbar.Visible = true; | ||||
| } | ||||
|  | ||||
| // Called when a key is pressed. keycode holds the key's ASCII code | ||||
| function on_key_press(eKeyCode keycode) { | ||||
|   // The following is called before "if game is paused keycode=0", so | ||||
|   // it'll happen even when the game is paused. | ||||
|    | ||||
|   if ((keycode == eKeyEscape) && gRestartYN.Visible) { | ||||
|     //Use ESC to cancel restart. | ||||
|     gRestartYN.Visible = false;  | ||||
|     gIconbar.Visible = true; | ||||
|     // If the panel's not ON, then the player must have gotten here by tapping F9, | ||||
|     // therefore his cursor needs restoring. If the panel IS on, then it doesn't, | ||||
|     // because it's already a pointer. Get used to thinking like this!! | ||||
|     if (!gPanel.Visible) mouse.UseDefaultGraphic();  | ||||
|     return; | ||||
|   } | ||||
|   if ((keycode == eKeyEscape) && gPanel.Visible) { | ||||
|     // Use ESC to turn the panel off. | ||||
|     gPanel.Visible = false;  | ||||
|     mouse.UseDefaultGraphic(); | ||||
|     gIconbar.Visible = true; | ||||
|     return; | ||||
|   } | ||||
|   if ((keycode == eKeyEscape) && (gSaveGame.Visible)) | ||||
|   { | ||||
|     // Use ESC to close the save game dialog | ||||
|     close_save_game_dialog(); | ||||
|     return; | ||||
|   } | ||||
|   if ((keycode == eKeyEscape) && (gRestoreGame.Visible)) | ||||
|   { | ||||
|     // Use ESC to close the restore game dialog | ||||
|     close_restore_game_dialog(); | ||||
|     return; | ||||
|   } | ||||
|    | ||||
|   if (keycode == eKeyReturn) {  | ||||
|     // ENTER, in this case merely confirms restart | ||||
|     if (gRestartYN.Visible) RestartGame(); | ||||
|   } | ||||
|  | ||||
|   if (IsGamePaused() || (IsInterfaceEnabled() == 0)) | ||||
|   { | ||||
|     // If the game is paused with a modal GUI on the | ||||
|     // screen, or the player interface is disabled in | ||||
|     // a cut scene, ignore any keypresses. | ||||
|     return; | ||||
|   } | ||||
|  | ||||
|   // FUNCTION KEYS AND SYSTEM SHORTCUTS | ||||
|   if (keycode == eKeyEscape) { | ||||
|     // ESC | ||||
|     gPanel.Visible = true;  | ||||
|     gIconbar.Visible = false; | ||||
|     mouse.UseModeGraphic(eModePointer); | ||||
|   } | ||||
|   if (keycode == eKeyCtrlQ)  QuitGame(1);   // Ctrl-Q | ||||
|   if (keycode == eKeyF5) show_save_game_dialog();   // F5 | ||||
|   if (keycode == eKeyF7) show_restore_game_dialog();  // F7 | ||||
|   if (keycode == eKeyF9) { | ||||
|     // F9, asks the player to confirm restarting (so much better to always confirm first) | ||||
|     gRestartYN.Visible = true;   | ||||
|     gIconbar.Visible = false; | ||||
|     mouse.UseModeGraphic(eModePointer); | ||||
|   } | ||||
|   if (keycode == eKeyF12) SaveScreenShot("scrnshot.bmp");  // F12 | ||||
|   if (keycode == eKeyTab)   show_inventory_window();  // Tab, show inventory | ||||
|  | ||||
|   // GAME COMMAND SHORTCUTS | ||||
|   if (keycode == 'W') mouse.Mode=eModeWalkto; //Notice this alternate way to indicate keycodes. | ||||
|   if (keycode == 'L') mouse.Mode=eModeLookat; //Note that all we do here is set modes. | ||||
|   if (keycode == 'U') mouse.Mode=eModeInteract; //If you want something else to happen, such as GUI buttons highlighting, | ||||
|   if (keycode == 'T') mouse.Mode=eModeTalkto; //you'll need some more scripting done. | ||||
|   if (keycode == 'I') mouse.Mode=eModeUseinv; //But this will, as-is, give you some standard keyboard shortcuts your players will very much appreciate. | ||||
|  | ||||
|   // For extra cursor modes, such as pick up, feel free to add as you will. | ||||
|   // Uncomment the line below if you use the "Pick Up" mode. | ||||
|   //if (keycode == 'P' || keycode == 'G') mouse.Mode=eModePickup;  | ||||
|  | ||||
|   // DEBUG FUNCTIONS | ||||
|   if (keycode == eKeyCtrlS)  Debug(0,0);  // Ctrl-S, give all inventory | ||||
|   if (keycode == eKeyCtrlV)  Debug(1,0);  // Ctrl-V, version | ||||
|   if (keycode == eKeyCtrlA)  Debug(2,0);  // Ctrl-A, show walkable areas | ||||
|   if (keycode == eKeyCtrlX)  Debug(3,0);  // Ctrl-X, teleport to room | ||||
|   if (keycode == eKeyCtrlW && game.debug_mode)  | ||||
|     player.PlaceOnWalkableArea(); //Ctrl-W, move to walkable area  | ||||
| } | ||||
|  | ||||
|  | ||||
| function on_mouse_click(MouseButton button) { | ||||
|   // called when a mouse button is clicked. button is either LEFT or RIGHT | ||||
|   if (IsGamePaused() == 1) { | ||||
|     // Game is paused, so do nothing (ie. don't allow mouse click) | ||||
|   } | ||||
|   else if (button == eMouseLeft) { | ||||
|     ProcessClick(mouse.x, mouse.y, mouse.Mode ); | ||||
|   } | ||||
|   else if (button == eMouseRight || button == eMouseWheelSouth){ | ||||
|     // right-click our mouse-wheel down, so cycle cursor | ||||
|     mouse.SelectNextMode(); | ||||
|   } | ||||
|   else if (button == eMouseMiddle) {  | ||||
|     // Middle-button-click, default make character walk to clicked area (a little shortcut) | ||||
|     // Could have been just "player.Walk(mouse.x,mouse.y)", but it's best to | ||||
|     // leave our options open - what if you have a special script triggered | ||||
|     // on "walking" mode? | ||||
|     ProcessClick(mouse.x, mouse.y, eModeWalkto);  | ||||
|   } | ||||
|   else if (button == eMouseWheelNorth) {  | ||||
|     // Mouse-wheel up, cycle cursors  | ||||
|     // If mode isn't WALK, set the previous mode (notice usage of numbers instead | ||||
|     // of eNums, when it suits us)... | ||||
|     if (mouse.Mode>0) mouse.Mode=mouse.Mode-1;  | ||||
|     else  | ||||
|     {  | ||||
|       // ...but if it is WALK mode... | ||||
|       if (player.ActiveInventory!=null)  | ||||
|       { | ||||
|         //...and the player has a selected inventory item, set mouse mode to UseInv.  | ||||
|         mouse.Mode=eModeUseinv;  | ||||
|       } | ||||
|       else  | ||||
|       { | ||||
|         // If they don't, however, just set it to mode TALK (change this line if you add more cursor modes) | ||||
|         mouse.Mode=eModeTalkto;  | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| function interface_click(int interface, int button) { | ||||
|   // This function is obsolete, from 2.62 and earlier versions. | ||||
| } | ||||
|  | ||||
| function btnInvUp_Click(GUIControl *control, MouseButton button) { | ||||
|   invCustomInv.ScrollUp(); | ||||
| } | ||||
|  | ||||
| function btnInvDown_Click(GUIControl *control, MouseButton button) { | ||||
|   invCustomInv.ScrollDown(); | ||||
| } | ||||
|  | ||||
| function btnInvOK_Click(GUIControl *control, MouseButton button) { | ||||
| 	// They pressed the OK button, close the GUI | ||||
| 	gInventory.Visible = false; | ||||
| 	mouse.UseDefaultGraphic(); | ||||
| } | ||||
|  | ||||
| function btnInvSelect_Click(GUIControl *control, MouseButton button) { | ||||
|    | ||||
| 	// They pressed SELECT, so switch to the Get cursor | ||||
| 	mouse.Mode = eModeInteract; | ||||
| 	// But, override the appearance to look like the arrow | ||||
| 	mouse.UseModeGraphic(eModePointer); | ||||
| } | ||||
|  | ||||
| function btnIconInv_Click(GUIControl *control, MouseButton button) { | ||||
|    | ||||
|   show_inventory_window(); | ||||
| } | ||||
|  | ||||
| function btnIconCurInv_Click(GUIControl *control, MouseButton button) { | ||||
|    | ||||
|   if (player.ActiveInventory != null) | ||||
|     mouse.Mode = eModeUseinv; | ||||
| } | ||||
|  | ||||
| function btnIconSave_Click(GUIControl *control, MouseButton button)  | ||||
| { | ||||
|   show_save_game_dialog(); | ||||
| } | ||||
|  | ||||
| function btnIconLoad_Click(GUIControl *control, MouseButton button)  | ||||
| { | ||||
|   show_restore_game_dialog(); | ||||
| } | ||||
|  | ||||
| function btnIconExit_Click(GUIControl *control, MouseButton button) { | ||||
|    | ||||
|   QuitGame(1); | ||||
| } | ||||
|  | ||||
| function btnIconAbout_Click(GUIControl *control, MouseButton button) { | ||||
|    | ||||
|   gPanel.Visible=true; | ||||
|   gIconbar.Visible=false; | ||||
|   mouse.UseModeGraphic(eModePointer); | ||||
| } | ||||
|  | ||||
| function cEgo_Look() | ||||
| { | ||||
|   Display("Damn, I'm looking good!"); | ||||
| } | ||||
|  | ||||
| function cEgo_Interact() | ||||
| { | ||||
|   Display("You rub your hands up and down your clothes."); | ||||
| } | ||||
|  | ||||
| function cEgo_Talk() | ||||
| { | ||||
|   Display("Talking to yourself is a sign of madness!"); | ||||
| } | ||||
|  | ||||
| //START OF CONTROL PANEL FUNCTIONS | ||||
| function btnSave_OnClick(GUIControl *control, MouseButton button) | ||||
| { | ||||
|   gPanel.Visible = false; | ||||
|   mouse.UseDefaultGraphic(); | ||||
|   gIconbar.Visible = true; | ||||
|   Wait(1); | ||||
|   btnIconSave_Click(btnIconSave, eMouseLeft); | ||||
| } | ||||
|  | ||||
| function gControl_OnClick(GUI *theGui, MouseButton button) | ||||
| { | ||||
|  | ||||
| } | ||||
|  | ||||
| function btnAbout_OnClick(GUIControl *control, MouseButton button) | ||||
| { | ||||
| Display("Adventure Game Studio run-time engine default game."); | ||||
| } | ||||
|  | ||||
| function btnQuit_OnClick(GUIControl *control, MouseButton button) | ||||
| { | ||||
|   gPanel.Visible = false; | ||||
|   Wait(1); | ||||
|   QuitGame(1); | ||||
|   gPanel.Visible = true; | ||||
|   gIconbar.Visible = false; | ||||
|   mouse.UseModeGraphic(eModePointer); | ||||
| } | ||||
|  | ||||
| function btnLoad_OnClick(GUIControl *control, MouseButton button) | ||||
| { | ||||
|   gPanel.Visible = false; | ||||
|   mouse.UseDefaultGraphic(); | ||||
|   gIconbar.Visible = true; | ||||
|   Wait(1); | ||||
|   btnIconLoad_Click(btnIconLoad, eMouseLeft); | ||||
| } | ||||
|  | ||||
| function btnResume_OnClick(GUIControl *control, MouseButton button) | ||||
| { | ||||
|   gPanel.Visible = false; | ||||
|   mouse.UseDefaultGraphic(); | ||||
|   gIconbar.Visible = true; | ||||
| } | ||||
|  | ||||
| function sldAudio_OnChange(GUIControl *control) | ||||
| { | ||||
|   System.Volume = sldAudio.Value; | ||||
| } | ||||
|  | ||||
| function sldVoice_OnChange(GUIControl *control) | ||||
| { | ||||
|   // Sets voice volume. Note that we don't check for the existence of speech.vox -  | ||||
|   // we did that in game_start, so if it's not there the slider won't even be available. | ||||
|   SetSpeechVolume(sldVoice.Value);  | ||||
| } | ||||
|  | ||||
| function btnVoice_OnClick(GUIControl *control, MouseButton button) | ||||
| { | ||||
|   // Note that we don't check for the existence of speech.vox - we did that in game_start, | ||||
|   // so if it's not there the button won't even be available. | ||||
|   if (btnVoice.Text == "Voice and Text") {  | ||||
|     SetVoiceMode(eSpeechVoiceOnly);  | ||||
|     btnVoice.Text = "Voice only"; | ||||
|   } | ||||
|   else if (btnVoice.Text == "Voice only") { | ||||
|     SetVoiceMode(eSpeechTextOnly); | ||||
|     btnVoice.Text = "Text only"; | ||||
|   } | ||||
|   else if (btnVoice.Text == "Text only") { | ||||
|     SetVoiceMode(eSpeechVoiceAndText); | ||||
|     btnVoice.Text = "Voice and Text"; | ||||
|   } | ||||
| } | ||||
|  | ||||
| function sldGamma_OnChange(GUIControl *control) | ||||
| { | ||||
|   // Set the gamma. Note there's no need to check for anything else, as we ensured, | ||||
|   // in game_start, that the slider won't even appear if it's not possible to do this. | ||||
|   System.Gamma = sldGamma.Value;  | ||||
| } | ||||
|  | ||||
| function btnDefault_OnClick(GUIControl *control, MouseButton button) | ||||
| { | ||||
|   // Reset everything to default. You'll have to edit these as well as the sliders | ||||
|   // if you'd rather have different default parameters. | ||||
|   System.Volume = 100; | ||||
|   sldAudio.Value = System.Volume; | ||||
|   sldSpeed.Value = 40; | ||||
|   SetGameSpeed(40); | ||||
|   if (IsSpeechVoxAvailable()) { | ||||
|      SetVoiceMode(eSpeechVoiceAndText); | ||||
|      btnVoice.Text = "Voice and Text"; | ||||
|      sldVoice.Value = 255; | ||||
|      SetSpeechVolume(255); | ||||
|   } | ||||
|   if (System.SupportsGammaControl) { | ||||
|     System.Gamma = 100; | ||||
|     sldGamma.Value = 100; | ||||
|   } | ||||
| } | ||||
| //END OF CONTROL PANEL FUNCTIONS | ||||
|  | ||||
| function dialog_request(int param)  | ||||
| { | ||||
|   // This is used by the dialog text parser if you need to process | ||||
|   // text that the player types in to the parser. | ||||
|   // It is not used by default. | ||||
| } | ||||
|  | ||||
| function sldSpeed_OnChange(GUIControl *control) | ||||
| { | ||||
|   SetGameSpeed(sldSpeed.Value); | ||||
| } | ||||
|  | ||||
| function btnRestart_OnClick(GUIControl *control, MouseButton button) | ||||
| { | ||||
|   gRestartYN.Visible=true; | ||||
|   gIconbar.Visible=false; | ||||
| } | ||||
|  | ||||
| function btnRestartYes_OnClick(GUIControl *control, MouseButton button) | ||||
| { | ||||
|   RestartGame(); | ||||
| } | ||||
|  | ||||
| function btnRestartNo_OnClick(GUIControl *control, MouseButton button) | ||||
| { | ||||
|   gRestartYN.Visible = false; | ||||
|   gIconbar.Visible = true; | ||||
|   // If the panel's not ON, then the player must have gotten here by tapping F9, | ||||
|   // therefore his cursor needs restoring. If the panel IS on, then it doesn't, | ||||
|   // because it's already a pointer. Get used to thinking like this!! | ||||
|   if (!gPanel.Visible) mouse.UseDefaultGraphic();  | ||||
| } | ||||
|  | ||||
| function btnCancelSave_OnClick(GUIControl *control, MouseButton button) | ||||
| { | ||||
|   close_save_game_dialog(); | ||||
| } | ||||
|  | ||||
| function btnSaveGame_OnClick(GUIControl *control, MouseButton button) | ||||
| { | ||||
|   int gameSlotToSaveInto = lstSaveGamesList.ItemCount + 1; | ||||
|   int i = 0; | ||||
|   while (i < lstSaveGamesList.ItemCount) | ||||
|   { | ||||
|     if (lstSaveGamesList.Items[i] == txtNewSaveName.Text) | ||||
|     { | ||||
|       gameSlotToSaveInto = lstSaveGamesList.SaveGameSlots[i]; | ||||
|     } | ||||
|     i++; | ||||
|   } | ||||
|   SaveGameSlot(gameSlotToSaveInto, txtNewSaveName.Text); | ||||
|   close_save_game_dialog(); | ||||
| } | ||||
|  | ||||
| function btnCancelRestore_OnClick(GUIControl *control, MouseButton button) | ||||
| { | ||||
|   close_restore_game_dialog(); | ||||
| } | ||||
|  | ||||
| function btnRestoreGame_OnClick(GUIControl *control, MouseButton button) | ||||
| { | ||||
|   if (lstRestoreGamesList.SelectedIndex >= 0) | ||||
|   { | ||||
|     RestoreGameSlot(lstRestoreGamesList.SaveGameSlots[lstRestoreGamesList.SelectedIndex]); | ||||
|   } | ||||
|   close_restore_game_dialog(); | ||||
| } | ||||
|  | ||||
| function lstSaveGamesList_OnSelectionCh(GUIControl *control) | ||||
| { | ||||
|   txtNewSaveName.Text = lstSaveGamesList.Items[lstSaveGamesList.SelectedIndex]; | ||||
| } | ||||
|  | ||||
| function txtNewSaveName_OnActivate(GUIControl *control) | ||||
| { | ||||
|   // Pressing return in the text box simulates clicking the Save button | ||||
|   btnSaveGame_OnClick(control, eMouseLeft); | ||||
| } | ||||
|  | ||||
| function btnDeleteSave_OnClick(GUIControl *control, MouseButton button) | ||||
| { | ||||
|   if (lstSaveGamesList.SelectedIndex >= 0) | ||||
|   { | ||||
|     DeleteSaveSlot(lstSaveGamesList.SaveGameSlots[lstSaveGamesList.SelectedIndex]); | ||||
|     lstSaveGamesList.FillSaveGameList(); | ||||
|   } | ||||
| } | ||||
							
								
								
									
										4
									
								
								samples/AGS Script/GlobalScript.ash
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								samples/AGS Script/GlobalScript.ash
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,4 @@ | ||||
| // Main header script - this will be included into every script in | ||||
| // the game (local and global). Do not place functions here; rather, | ||||
| // place import definitions and #define names here to be used by all | ||||
| // scripts. | ||||
							
								
								
									
										216
									
								
								samples/AGS Script/KeyboardMovement_102.asc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										216
									
								
								samples/AGS Script/KeyboardMovement_102.asc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,216 @@ | ||||
| // Main script for module 'KeyboardMovement' | ||||
|  | ||||
| //**************************************************************************************************** | ||||
| // DEFINITIONS | ||||
| //**************************************************************************************************** | ||||
|  | ||||
| #define DISTANCE 10000// distance player walks in Tapping mode before he stops | ||||
|  | ||||
| enum KeyboardMovement_Directions { | ||||
| 	eKeyboardMovement_Stop,  | ||||
| 	eKeyboardMovement_DownLeft,  | ||||
| 	eKeyboardMovement_Down,  | ||||
| 	eKeyboardMovement_DownRight,  | ||||
| 	eKeyboardMovement_Left,  | ||||
| 	eKeyboardMovement_Right,  | ||||
| 	eKeyboardMovement_UpLeft,  | ||||
| 	eKeyboardMovement_Up,  | ||||
| 	eKeyboardMovement_UpRight | ||||
| }; | ||||
|  | ||||
| //**************************************************************************************************** | ||||
| // VARIABLES | ||||
| //**************************************************************************************************** | ||||
|  | ||||
| // keycodes as variables for future key customization functions (static variables?): | ||||
| int KeyboardMovement_KeyDown = 380; // down arrow | ||||
| int KeyboardMovement_KeyLeft = 375; // left arrow | ||||
| int KeyboardMovement_KeyRight = 377; // right arrow | ||||
| int KeyboardMovement_KeyUp = 372; // up arrow | ||||
| int KeyboardMovement_KeyDownRight = 381; // PgDn (numpad) | ||||
| int KeyboardMovement_KeyUpRight = 373; // PgUp (numpad) | ||||
| int KeyboardMovement_KeyDownLeft = 379; // End (numpad) | ||||
| int KeyboardMovement_KeyUpLeft = 371; // Home (numpad) | ||||
| int KeyboardMovement_KeyStop = 376; // 5 (numpad) | ||||
|  | ||||
| KeyboardMovement_Modes KeyboardMovement_Mode = eKeyboardMovement_None; // stores current keyboard control mode (disabled by default) | ||||
|  | ||||
| KeyboardMovement_Directions KeyboardMovement_CurrentDirection = eKeyboardMovement_Stop; // stores current walking direction of player character | ||||
|  | ||||
| //**************************************************************************************************** | ||||
| // USER FUNCTIONS | ||||
| //**************************************************************************************************** | ||||
|  | ||||
| //==================================================================================================== | ||||
|  | ||||
| static function KeyboardMovement::SetMode(KeyboardMovement_Modes mode) { | ||||
| 	KeyboardMovement_Mode = mode; | ||||
| } | ||||
|  | ||||
| //==================================================================================================== | ||||
|  | ||||
| // key customization functions here | ||||
|  | ||||
| //==================================================================================================== | ||||
|  | ||||
| //**************************************************************************************************** | ||||
| // EVENT HANDLER FUNCTIONS | ||||
| //**************************************************************************************************** | ||||
|  | ||||
| //==================================================================================================== | ||||
|  | ||||
| function repeatedly_execute() { | ||||
|  | ||||
| 	//-------------------------------------------------- | ||||
| 	// Pressing mode | ||||
| 	//-------------------------------------------------- | ||||
|  | ||||
| 	if ((IsGamePaused() == true) || (KeyboardMovement_Mode != eKeyboardMovement_Pressing) || (IsInterfaceEnabled() == false) || (player.on == false)) return 0; | ||||
| 	  // if game is paused, module or mode disabled, interface disabled or player character hidden, quit function | ||||
|  | ||||
| 	KeyboardMovement_Directions newdirection; // declare variable storing new direction | ||||
|  | ||||
| 	// get new direction: | ||||
| 	if ( ((IsKeyPressed(KeyboardMovement_KeyDown)) && (IsKeyPressed(KeyboardMovement_KeyRight))) || (IsKeyPressed(KeyboardMovement_KeyDownRight)) ) newdirection = eKeyboardMovement_DownRight; // if down&right arrows or PgDn (numeric pad) held down, set new direction to Down-Right | ||||
| 	else if ( ((IsKeyPressed(KeyboardMovement_KeyUp)) && (IsKeyPressed(KeyboardMovement_KeyRight))) || (IsKeyPressed(KeyboardMovement_KeyUpRight)) ) newdirection = eKeyboardMovement_UpRight; // up&right arrows or PgUp (numpad) | ||||
| 	else if ( ((IsKeyPressed(KeyboardMovement_KeyDown)) && (IsKeyPressed(KeyboardMovement_KeyLeft))) || (IsKeyPressed(KeyboardMovement_KeyDownLeft)) ) newdirection = eKeyboardMovement_DownLeft; // down&left arrows or End (numpad) | ||||
| 	else if ( ((IsKeyPressed(KeyboardMovement_KeyUp)) && (IsKeyPressed(KeyboardMovement_KeyLeft))) || (IsKeyPressed(KeyboardMovement_KeyUpLeft)) ) newdirection = eKeyboardMovement_UpLeft; // up&left arrows or Home (numpad) | ||||
| 	else if (IsKeyPressed(KeyboardMovement_KeyDown)) newdirection = eKeyboardMovement_Down; // down arrow | ||||
| 	else if (IsKeyPressed(KeyboardMovement_KeyLeft)) newdirection = eKeyboardMovement_Left; // left arrow | ||||
| 	else if (IsKeyPressed(KeyboardMovement_KeyRight)) newdirection = eKeyboardMovement_Right; // right arrow | ||||
| 	else if (IsKeyPressed(KeyboardMovement_KeyUp)) newdirection = eKeyboardMovement_Up; // up arrow | ||||
| 	else newdirection = eKeyboardMovement_Stop; // if none of the above held down, set it to stop player character | ||||
|  | ||||
| 	if (IsKeyPressed(KeyboardMovement_KeyStop)) newdirection = eKeyboardMovement_Stop; // if 5 (numeric pad) held down, stop player character, regardless of whether some of the above are held down | ||||
|  | ||||
| 	if (newdirection != KeyboardMovement_CurrentDirection) { // if new direction is different from current direction | ||||
|  | ||||
| 		if (newdirection == eKeyboardMovement_Stop) player.StopMoving(); // if new direction is the Stop command, stop movement of player character | ||||
| 		else { // if new direction is NOT the Stop command | ||||
|  | ||||
| 			int dx, dy; // declare variables storing new walk coordinates | ||||
| 			if (newdirection == eKeyboardMovement_DownRight) { | ||||
| 				dx = DISTANCE; | ||||
| 				dy = DISTANCE; | ||||
| 			} | ||||
| 			else if (newdirection == eKeyboardMovement_UpRight) { | ||||
| 				dx = DISTANCE; | ||||
| 				dy = -DISTANCE; | ||||
| 			} | ||||
| 			else if (newdirection == eKeyboardMovement_DownLeft) { | ||||
| 				dx = -DISTANCE; | ||||
| 				dy = DISTANCE; | ||||
| 			} | ||||
| 			else if (newdirection == eKeyboardMovement_UpLeft) { | ||||
| 				dx = -DISTANCE; | ||||
| 				dy = -DISTANCE; | ||||
| 			} | ||||
| 			else if (newdirection == eKeyboardMovement_Down) { | ||||
| 				dx = 0; | ||||
| 				dy = DISTANCE; | ||||
| 			} | ||||
| 			else if (newdirection == eKeyboardMovement_Left) { | ||||
| 				dx = -DISTANCE; | ||||
| 				dy = 0; | ||||
| 			} | ||||
| 			else if (newdirection == eKeyboardMovement_Right) { | ||||
| 				dx = DISTANCE; | ||||
| 				dy = 0; | ||||
| 			} | ||||
| 			else if (newdirection == eKeyboardMovement_Up) { | ||||
| 				dx = 0; | ||||
| 				dy = -DISTANCE; | ||||
| 			} | ||||
|  | ||||
| 			player.WalkStraight(player.x + dx, player.y + dy, eNoBlock); // walk player character to the new coordinates | ||||
| 		} | ||||
| 		KeyboardMovement_CurrentDirection = newdirection; // update current direction to new direction | ||||
|  | ||||
| 	} | ||||
|  | ||||
| } | ||||
|  | ||||
| //==================================================================================================== | ||||
|  | ||||
| function on_key_press(int keycode) { | ||||
|  | ||||
| 	//-------------------------------------------------- | ||||
| 	// Tapping mode | ||||
| 	//-------------------------------------------------- | ||||
|  | ||||
| 	if ((IsGamePaused() == true) || (KeyboardMovement_Mode != eKeyboardMovement_Tapping) || (IsInterfaceEnabled() == false) || (player.on == false)) return 0; | ||||
| 	  // if game is paused, module or mode disabled, interface disabled or player character hidden, quit function | ||||
|  | ||||
| 	KeyboardMovement_Directions newdirection; // declare variable storing new direction | ||||
|  | ||||
| 	// get new direction: | ||||
| 	if (keycode == KeyboardMovement_KeyDownRight) newdirection = eKeyboardMovement_DownRight; // if down-right key pressed, set new direction to Down-Right | ||||
| 	else if (keycode == KeyboardMovement_KeyUpRight) newdirection = eKeyboardMovement_UpRight; | ||||
| 	else if (keycode == KeyboardMovement_KeyDownLeft) newdirection = eKeyboardMovement_DownLeft; | ||||
| 	else if (keycode == KeyboardMovement_KeyUpLeft) newdirection = eKeyboardMovement_UpLeft; | ||||
| 	else if (keycode == KeyboardMovement_KeyDown) newdirection = eKeyboardMovement_Down; | ||||
| 	else if (keycode == KeyboardMovement_KeyLeft) newdirection = eKeyboardMovement_Left; | ||||
| 	else if (keycode == KeyboardMovement_KeyRight) newdirection = eKeyboardMovement_Right; | ||||
| 	else if (keycode == KeyboardMovement_KeyUp) newdirection = eKeyboardMovement_Up; | ||||
| 	else if (keycode == KeyboardMovement_KeyStop) newdirection = eKeyboardMovement_Stop; // if stop key pressed, set to stop player character | ||||
|  | ||||
| 	if (newdirection != KeyboardMovement_CurrentDirection) { // if new direction is different from current direction | ||||
|  | ||||
| 		if (newdirection == eKeyboardMovement_Stop) player.StopMoving(); // if new direction is the Stop command, stop movement of player character | ||||
| 		else { // if new direction is NOT the Stop command | ||||
|  | ||||
| 			int dx, dy; // declare variables storing new walk coordinates | ||||
| 			if (newdirection == eKeyboardMovement_DownRight) { | ||||
| 				dx = DISTANCE; | ||||
| 				dy = DISTANCE; | ||||
| 			} | ||||
| 			else if (newdirection == eKeyboardMovement_UpRight) { | ||||
| 				dx = DISTANCE; | ||||
| 				dy = -DISTANCE; | ||||
| 			} | ||||
| 			else if (newdirection == eKeyboardMovement_DownLeft) { | ||||
| 				dx = -DISTANCE; | ||||
| 				dy = DISTANCE; | ||||
| 			} | ||||
| 			else if (newdirection == eKeyboardMovement_UpLeft) { | ||||
| 				dx = -DISTANCE; | ||||
| 				dy = -DISTANCE; | ||||
| 			} | ||||
| 			else if (newdirection == eKeyboardMovement_Down) { | ||||
| 				dx = 0; | ||||
| 				dy = DISTANCE; | ||||
| 			} | ||||
| 			else if (newdirection == eKeyboardMovement_Left) { | ||||
| 				dx = -DISTANCE; | ||||
| 				dy = 0; | ||||
| 			} | ||||
| 			else if (newdirection == eKeyboardMovement_Right) { | ||||
| 				dx = DISTANCE; | ||||
| 				dy = 0; | ||||
| 			} | ||||
| 			else if (newdirection == eKeyboardMovement_Up) { | ||||
| 				dx = 0; | ||||
| 				dy = -DISTANCE; | ||||
| 			} | ||||
|  | ||||
| 			player.WalkStraight(player.x + dx, player.y + dy, eNoBlock); // walk player character to the new coordinates | ||||
| 		} | ||||
| 		KeyboardMovement_CurrentDirection = newdirection; // update current direction to new direction | ||||
|  | ||||
| 	} | ||||
| 	else { // if new direction is same as current direction | ||||
| 		player.StopMoving(); // stop player character | ||||
| 		KeyboardMovement_CurrentDirection = eKeyboardMovement_Stop; // update current direction | ||||
| 	} | ||||
|  | ||||
| } | ||||
|  | ||||
| //==================================================================================================== | ||||
|  | ||||
| function on_event(EventType event, int data) { | ||||
|  | ||||
| 	if (event == eEventLeaveRoom) KeyboardMovement_CurrentDirection = eKeyboardMovement_Stop; | ||||
|  | ||||
| } | ||||
|  | ||||
| //==================================================================================================== | ||||
							
								
								
									
										13
									
								
								samples/AGS Script/KeyboardMovement_102.ash
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								samples/AGS Script/KeyboardMovement_102.ash
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | ||||
| // Script header for module 'KeyboardMovement' | ||||
|  | ||||
| #define KeyboardMovement_VERSION 101 | ||||
|  | ||||
| enum KeyboardMovement_Modes { | ||||
| 	eKeyboardMovement_None,  | ||||
| 	eKeyboardMovement_Tapping,  | ||||
| 	eKeyboardMovement_Pressing | ||||
| }; | ||||
|  | ||||
| struct KeyboardMovement { | ||||
| 	import static function SetMode(KeyboardMovement_Modes mode); | ||||
| }; | ||||
							
								
								
									
										18
									
								
								samples/APL/DeepakChopra.apl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								samples/APL/DeepakChopra.apl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,18 @@ | ||||
| ⍝   You can try this at http://tryapl.org/ | ||||
| ⍝   I can not explain how much I suddenly love this crypto-language | ||||
|  | ||||
|  | ||||
|  | ||||
| Starts     ← 'Experiential truth ' 'The physical world ' 'Non-judgment '       'Quantum physics ' | ||||
| Middles    ← 'nurtures an '        'projects onto '      'imparts reality to ' 'constructs with ' | ||||
| Qualifiers ← 'abundance of '       'the barrier of '     'self-righteous '     'potential ' | ||||
| Finishes   ← 'marvel.'             'choices.'            'creativity.'         'actions.' | ||||
|  | ||||
| rf     ← {(?⍴⍵)⊃⍵} | ||||
| erf    ← {rf ¨ ⍵} | ||||
|  | ||||
| deepak ← {erf Starts Middles Qualifiers Finishes} | ||||
|  | ||||
|  | ||||
|  | ||||
| deepak ⍬ | ||||
							
								
								
									
										110
									
								
								samples/ATS/CoYonedaLemma.dats
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										110
									
								
								samples/ATS/CoYonedaLemma.dats
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,110 @@ | ||||
| (* ****** ****** *) | ||||
| // | ||||
| // HX-2014-01 | ||||
| // CoYoneda Lemma: | ||||
| // | ||||
| (* ****** ****** *) | ||||
| // | ||||
| #include | ||||
| "share/atspre_staload.hats" | ||||
| // | ||||
| (* ****** ****** *) | ||||
|  | ||||
| staload | ||||
| "libats/ML/SATS/basis.sats" | ||||
| staload | ||||
| "libats/ML/SATS/list0.sats" | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| staload _ = "libats/ML/DATS/list0.dats" | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| sortdef ftype = type -> type | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| infixr (->) ->> | ||||
| typedef ->> (a:type, b:type) = a -<cloref1> b | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| typedef | ||||
| functor(F:ftype) = | ||||
|   {a,b:type} (a ->> b) ->> F(a) ->> F(b) | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| typedef | ||||
| list0 (a:type) = list0 (a) | ||||
| extern | ||||
| val functor_list0 : functor (list0) | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| implement | ||||
| functor_list0{a,b} | ||||
|   (f) = lam xs => list0_map<a><b> (xs, f) | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| datatype | ||||
| CoYoneda | ||||
|  (F:ftype, r:type) = {a:type} CoYoneda of (a ->> r, F(a)) | ||||
| // end of [CoYoneda] | ||||
|  | ||||
| (* ****** ****** *) | ||||
| // | ||||
| extern | ||||
| fun CoYoneda_phi | ||||
|   : {F:ftype}functor(F) -> {r:type} (F (r) ->> CoYoneda (F, r)) | ||||
| extern | ||||
| fun CoYoneda_psi | ||||
|   : {F:ftype}functor(F) -> {r:type} (CoYoneda (F, r) ->> F (r)) | ||||
| // | ||||
| (* ****** ****** *) | ||||
|  | ||||
| implement | ||||
| CoYoneda_phi(ftor) = lam (fx) => CoYoneda (lam x => x, fx) | ||||
| implement | ||||
| CoYoneda_psi(ftor) = lam (CoYoneda(f, fx)) => ftor (f) (fx) | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| datatype int0 = I of (int) | ||||
| datatype bool = True | False // boxed boolean | ||||
|  | ||||
| (* ****** ****** *) | ||||
| // | ||||
| fun bool2string | ||||
|   (x:bool): string = | ||||
| ( | ||||
|   case+ x of True() => "True" | False() => "False" | ||||
| ) | ||||
| // | ||||
| implement | ||||
| fprint_val<bool> (out, x) = fprint (out, bool2string(x)) | ||||
| // | ||||
| (* ****** ****** *) | ||||
|  | ||||
| fun int2bool (i: int0): bool = | ||||
|   let val+I(i) = i in if i > 0 then True else False end | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| val myintlist0 = g0ofg1($list{int0}((I)1, (I)0, (I)1, (I)0, (I)0)) | ||||
| val myboolist0 = CoYoneda{list0,bool}{int0}(lam (i) => int2bool(i), myintlist0) | ||||
| val myboolist0 = CoYoneda_psi{list0}(functor_list0){bool}(myboolist0) | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| val ((*void*)) = fprintln! (stdout_ref, "myboolist0 = ", myboolist0) | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| implement main0 () = () | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| (* end of [CoYonedaLemma.dats] *) | ||||
							
								
								
									
										178
									
								
								samples/ATS/DiningPhil2.dats
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										178
									
								
								samples/ATS/DiningPhil2.dats
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,178 @@ | ||||
| (* ****** ****** *) | ||||
| // | ||||
| // HX-2013-11 | ||||
| // | ||||
| // Implementing a variant of | ||||
| // the problem of Dining Philosophers | ||||
| // | ||||
| (* ****** ****** *) | ||||
| // | ||||
| #include | ||||
| "share/atspre_define.hats" | ||||
| #include | ||||
| "share/atspre_staload.hats" | ||||
| // | ||||
| (* ****** ****** *) | ||||
|  | ||||
| staload | ||||
| UN = "prelude/SATS/unsafe.sats" | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| staload "libc/SATS/stdlib.sats" | ||||
| staload "libc/SATS/unistd.sats" | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| staload "{$LIBATSHWXI}/teaching/mythread/SATS/channel.sats" | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| staload _ = "libats/DATS/deqarray.dats" | ||||
| staload _ = "{$LIBATSHWXI}/teaching/mythread/DATS/channel.dats" | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| staload "./DiningPhil2.sats" | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| implement phil_left (n) = n | ||||
| implement phil_right (n) = (n+1) \nmod NPHIL | ||||
|  | ||||
| (* ****** ****** *) | ||||
| // | ||||
| extern | ||||
| fun randsleep (n: intGte(1)): void | ||||
| // | ||||
| implement | ||||
| randsleep (n) = | ||||
|   ignoret (sleep($UN.cast{uInt}(rand() mod n + 1))) | ||||
| // end of [randsleep] | ||||
| // | ||||
| (* ****** ****** *) | ||||
|  | ||||
| implement | ||||
| phil_think (n) = | ||||
| { | ||||
| val () = println! ("phil_think(", n, ") starts") | ||||
| val () = randsleep (6) | ||||
| val () = println! ("phil_think(", n, ") finishes") | ||||
| } | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| implement | ||||
| phil_dine (n, lf, rf) = | ||||
| { | ||||
| val () = println! ("phil_dine(", n, ") starts") | ||||
| val () = randsleep (3) | ||||
| val () = println! ("phil_dine(", n, ") finishes") | ||||
| } | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| implement | ||||
| phil_loop (n) = let | ||||
| // | ||||
| val () = phil_think (n) | ||||
| // | ||||
| val nl = phil_left (n) | ||||
| val nr = phil_right (n) | ||||
| // | ||||
| val ch_lfork = fork_changet (nl) | ||||
| val ch_rfork = fork_changet (nr) | ||||
| // | ||||
| val lf = channel_takeout (ch_lfork) | ||||
| val () = println! ("phil_loop(", n, ") picks left fork") | ||||
| // | ||||
| val () = randsleep (2) // HX: try to actively induce deadlock | ||||
| // | ||||
| val rf = channel_takeout (ch_rfork) | ||||
| val () = println! ("phil_loop(", n, ") picks right fork") | ||||
| // | ||||
| val () = phil_dine (n, lf, rf) | ||||
| // | ||||
| val ch_forktray = forktray_changet () | ||||
| val () = channel_insert (ch_forktray, lf) | ||||
| val () = channel_insert (ch_forktray, rf) | ||||
| // | ||||
| in | ||||
|   phil_loop (n) | ||||
| end // end of [phil_loop] | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| implement | ||||
| cleaner_wash (f) = | ||||
| { | ||||
| val f = fork_get_num (f) | ||||
| val () = println! ("cleaner_wash(", f, ") starts") | ||||
| val () = randsleep (1) | ||||
| val () = println! ("cleaner_wash(", f, ") finishes") | ||||
| } | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| implement | ||||
| cleaner_return (f) = | ||||
| { | ||||
|   val n = fork_get_num (f) | ||||
|   val ch = fork_changet (n) | ||||
|   val () = channel_insert (ch, f) | ||||
| } | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| implement | ||||
| cleaner_loop () = let | ||||
| // | ||||
| val ch = forktray_changet () | ||||
| val f0 = channel_takeout (ch) | ||||
| // | ||||
| val () = cleaner_wash (f0) | ||||
| val () = cleaner_return (f0) | ||||
| // | ||||
| in | ||||
|   cleaner_loop () | ||||
| end // end of [cleaner_loop] | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| dynload "DiningPhil2.sats" | ||||
| dynload "DiningPhil2_fork.dats" | ||||
| dynload "DiningPhil2_thread.dats" | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| local | ||||
| // | ||||
| staload | ||||
| "{$LIBATSHWXI}/teaching/mythread/SATS/mythread.sats" | ||||
| // | ||||
| in (* in of [local] *) | ||||
| // | ||||
| val () = mythread_create_cloptr (llam () => phil_loop (0)) | ||||
| val () = mythread_create_cloptr (llam () => phil_loop (1)) | ||||
| val () = mythread_create_cloptr (llam () => phil_loop (2)) | ||||
| val () = mythread_create_cloptr (llam () => phil_loop (3)) | ||||
| val () = mythread_create_cloptr (llam () => phil_loop (4)) | ||||
| // | ||||
| val () = mythread_create_cloptr (llam () => cleaner_loop ()) | ||||
| // | ||||
| end // end of [local] | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| implement | ||||
| main0 () = | ||||
| { | ||||
| // | ||||
| val () = println! ("DiningPhil2: starting") | ||||
| val ((*void*)) = while (true) ignoret (sleep(1)) | ||||
| // | ||||
| } (* end of [main0] *) | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| (* end of [DiningPhil2.dats] *) | ||||
							
								
								
									
										71
									
								
								samples/ATS/DiningPhil2.sats
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										71
									
								
								samples/ATS/DiningPhil2.sats
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,71 @@ | ||||
| (* ****** ****** *) | ||||
| // | ||||
| // HX-2013-11 | ||||
| // | ||||
| // Implementing a variant of | ||||
| // the problem of Dining Philosophers | ||||
| // | ||||
| (* ****** ****** *) | ||||
|  | ||||
| #include | ||||
| "share/atspre_define.hats" | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| staload "{$LIBATSHWXI}/teaching/mythread/SATS/channel.sats" | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| %{# | ||||
| #define NPHIL 5 | ||||
| %} // end of [%{#] | ||||
| #define NPHIL 5 | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| typedef nphil = natLt(NPHIL) | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| fun phil_left (n: nphil): nphil | ||||
| fun phil_right (n: nphil): nphil | ||||
|  | ||||
| (* ****** ****** *) | ||||
| // | ||||
| fun phil_loop (n: nphil): void | ||||
| // | ||||
| (* ****** ****** *) | ||||
|  | ||||
| fun cleaner_loop ((*void*)): void | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| absvtype fork_vtype = ptr | ||||
| vtypedef fork = fork_vtype | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| fun fork_get_num (!fork): nphil | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| fun phil_dine | ||||
|   (n: nphil, lf: !fork, rf: !fork): void | ||||
| // end of [phil_dine] | ||||
|  | ||||
| fun phil_think (n: nphil): void | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| fun cleaner_wash (f: !fork): void | ||||
| fun cleaner_return (f: fork): void | ||||
|  | ||||
| (* ****** ****** *) | ||||
| // | ||||
| fun fork_changet (n: nphil): channel(fork) | ||||
| // | ||||
| fun forktray_changet ((*void*)): channel(fork) | ||||
| // | ||||
| (* ****** ****** *) | ||||
|  | ||||
| (* end of [DiningPhil2.sats] *) | ||||
							
								
								
									
										89
									
								
								samples/ATS/DiningPhil2_fork.dats
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										89
									
								
								samples/ATS/DiningPhil2_fork.dats
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,89 @@ | ||||
| (* ****** ****** *) | ||||
| // | ||||
| // HX-2013-11 | ||||
| // | ||||
| // Implementing a variant of | ||||
| // the problem of Dining Philosophers | ||||
| // | ||||
| (* ****** ****** *) | ||||
| // | ||||
| #include | ||||
| "share/atspre_define.hats" | ||||
| #include | ||||
| "share/atspre_staload.hats" | ||||
| // | ||||
| (* ****** ****** *) | ||||
|  | ||||
| staload | ||||
| UN = "prelude/SATS/unsafe.sats" | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| staload "{$LIBATSHWXI}/teaching/mythread/SATS/channel.sats" | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| staload _ = "libats/DATS/deqarray.dats" | ||||
| staload _ = "{$LIBATSHWXI}/teaching/mythread/DATS/channel.dats" | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| staload "./DiningPhil2.sats" | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| datavtype fork = FORK of (nphil) | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| assume fork_vtype = fork | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| implement | ||||
| fork_get_num (f) = let val FORK(n) = f in n end | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| local | ||||
|  | ||||
| val | ||||
| the_forkarray = let | ||||
| // | ||||
| typedef t = channel(fork) | ||||
| // | ||||
| implement | ||||
| array_tabulate$fopr<t> | ||||
|   (n) = ch where | ||||
| { | ||||
|   val n = $UN.cast{nphil}(n) | ||||
|   val ch = channel_create_exn<fork> (i2sz(2)) | ||||
|   val () = channel_insert (ch, FORK (n)) | ||||
| } | ||||
| // | ||||
| in | ||||
|   arrayref_tabulate<t> (i2sz(NPHIL)) | ||||
| end // end of [val] | ||||
|  | ||||
| in (* in of [local] *) | ||||
|  | ||||
| implement fork_changet (n) = the_forkarray[n] | ||||
|  | ||||
| end // end of [local] | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| local | ||||
|  | ||||
| val the_forktray = | ||||
|   channel_create_exn<fork> (i2sz(NPHIL+1)) | ||||
|  | ||||
| in (* in of [local] *) | ||||
|  | ||||
| implement forktray_changet () = the_forktray | ||||
|  | ||||
| end // end of [local] | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| (* end of [DiningPhil2_fork.dats] *) | ||||
							
								
								
									
										43
									
								
								samples/ATS/DiningPhil2_thread.dats
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								samples/ATS/DiningPhil2_thread.dats
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,43 @@ | ||||
| (* ****** ****** *) | ||||
| // | ||||
| // HX-2013-11 | ||||
| // | ||||
| // Implementing a variant of | ||||
| // the problem of Dining Philosophers | ||||
| // | ||||
| (* ****** ****** *) | ||||
| // | ||||
| #include "share/atspre_define.hats" | ||||
| #include "share/atspre_staload.hats" | ||||
| // | ||||
| (* ****** ****** *) | ||||
|  | ||||
| staload "{$LIBATSHWXI}/teaching/mythread/SATS/mythread.sats" | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| local | ||||
| // | ||||
| #include "{$LIBATSHWXI}/teaching/mythread/DATS/mythread.dats" | ||||
| // | ||||
| in (* in of [local] *) | ||||
| // | ||||
| // HX: it is intentionally left to be empty | ||||
| // | ||||
| end // end of [local] | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| local | ||||
| // | ||||
| #include "{$LIBATSHWXI}/teaching/mythread/DATS/mythread_posix.dats" | ||||
| // | ||||
| in (* in of [local] *) | ||||
| // | ||||
| // HX: it is intentionally left to be empty | ||||
| // | ||||
| end // end of [local] | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| (* end of [DiningPhil2_thread.dats] *) | ||||
							
								
								
									
										178
									
								
								samples/ATS/YonedaLemma.dats
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										178
									
								
								samples/ATS/YonedaLemma.dats
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,178 @@ | ||||
| (* ****** ****** *) | ||||
| // | ||||
| // HX-2014-01 | ||||
| // Yoneda Lemma: | ||||
| // The hardest "trivial" theorem :) | ||||
| // | ||||
| (* ****** ****** *) | ||||
| // | ||||
| #include | ||||
| "share/atspre_staload.hats" | ||||
| // | ||||
| (* ****** ****** *) | ||||
|  | ||||
| staload | ||||
| "libats/ML/SATS/basis.sats" | ||||
| staload | ||||
| "libats/ML/SATS/list0.sats" | ||||
| staload | ||||
| "libats/ML/SATS/option0.sats" | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| staload _ = "libats/ML/DATS/list0.dats" | ||||
| staload _ = "libats/ML/DATS/option0.dats" | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| sortdef ftype = type -> type | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| infixr (->) ->> | ||||
| typedef ->> (a:type, b:type) = a -<cloref1> b | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| typedef | ||||
| functor(F:ftype) = | ||||
|   {a,b:type} (a ->> b) ->> F(a) ->> F(b) | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| typedef | ||||
| list0 (a:type) = list0 (a) | ||||
| extern | ||||
| val functor_list0 : functor (list0) | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| implement | ||||
| functor_list0{a,b} | ||||
|   (f) = lam xs => list0_map<a><b> (xs, f) | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| typedef | ||||
| option0 (a:type) = option0 (a)   | ||||
| extern | ||||
| val functor_option0 : functor (option0) | ||||
|    | ||||
| (* ****** ****** *) | ||||
|  | ||||
| implement | ||||
| functor_option0{a,b} | ||||
|   (f) = lam opt => option0_map<a><b> (opt, f) | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| extern | ||||
| val functor_homres | ||||
|   : {c:type} functor (lam(r:type) => c ->> r) | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| implement | ||||
| functor_homres{c}{a,b} (f) = lam (r) => lam (x) => f (r(x)) | ||||
|  | ||||
| (* ****** ****** *) | ||||
| // | ||||
| extern | ||||
| fun Yoneda_phi : {F:ftype}functor(F) -> | ||||
|   {a:type}F(a) ->> ({r:type}(a ->> r) ->> F(r)) | ||||
| extern | ||||
| fun Yoneda_psi : {F:ftype}functor(F) -> | ||||
|   {a:type}({r:type}(a ->> r) ->> F(r)) ->> F(a) | ||||
| // | ||||
| (* ****** ****** *) | ||||
| // | ||||
| implement | ||||
| Yoneda_phi | ||||
|   (ftor) = lam(fx) => lam (m) => ftor(m)(fx) | ||||
| // | ||||
| implement | ||||
| Yoneda_psi (ftor) = lam(mf) => mf(lam x => x) | ||||
| // | ||||
| (* ****** ****** *) | ||||
|  | ||||
| (* | ||||
|  | ||||
| (* ****** ****** *) | ||||
| // | ||||
| // HX-2014-01-05: | ||||
| // Another version based on Natural Transformation | ||||
| // | ||||
| (* ****** ****** *) | ||||
|  | ||||
| typedef | ||||
| natrans(F:ftype, G:ftype) = {x:type} (F(x) ->> G(x)) | ||||
|  | ||||
| (* ****** ****** *) | ||||
| // | ||||
| extern | ||||
| fun Yoneda_phi_nat : {F:ftype}functor(F) -> | ||||
|   {a:type} F(a) ->> natrans(lam (r:type) => (a ->> r), F) | ||||
| extern | ||||
| fun Yoneda_psi_nat : {F:ftype}functor(F) -> | ||||
|   {a:type} natrans(lam (r:type) => (a ->> r), F) ->> F(a) | ||||
| // | ||||
| (* ****** ****** *) | ||||
| // | ||||
| implement | ||||
| Yoneda_phi_nat | ||||
|   (ftor) = lam(fx) => lam (m) => ftor(m)(fx) | ||||
| // | ||||
| implement | ||||
| Yoneda_psi_nat (ftor) = lam(mf) => mf(lam x => x) | ||||
| // | ||||
| (* ****** ****** *) | ||||
|  | ||||
| *) | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| datatype bool = True | False // boxed boolean | ||||
|  | ||||
| (* ****** ****** *) | ||||
| // | ||||
| fun bool2string | ||||
|   (x:bool): string = | ||||
| ( | ||||
|   case+ x of True() => "True" | False() => "False" | ||||
| ) | ||||
| // | ||||
| implement | ||||
| fprint_val<bool> (out, x) = fprint (out, bool2string(x)) | ||||
| // | ||||
| (* ****** ****** *) | ||||
| // | ||||
| val myboolist0 = | ||||
|   $list_t{bool}(True, False, True, False, False) | ||||
| val myboolist0 = g0ofg1_list (myboolist0) | ||||
| // | ||||
| (* ****** ****** *) | ||||
| // | ||||
| extern | ||||
| val Yoneda_bool_list0 : {r:type} (bool ->> r) ->> list0(r) | ||||
| // | ||||
| implement | ||||
| Yoneda_bool_list0 = | ||||
|   Yoneda_phi(functor_list0){bool}(myboolist0) | ||||
| // | ||||
| (* ****** ****** *) | ||||
| // | ||||
| val myboolist1 = | ||||
|   Yoneda_psi(functor_list0){bool}(Yoneda_bool_list0) | ||||
| // | ||||
| (* ****** ****** *) | ||||
|  | ||||
| val () = fprintln! (stdout_ref, "myboolist0 = ", myboolist0) | ||||
| val () = fprintln! (stdout_ref, "myboolist1 = ", myboolist1) | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| implement main0 () = () | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| (* end of [YonedaLemma.dats] *) | ||||
							
								
								
									
										187
									
								
								samples/ATS/linset.hats
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										187
									
								
								samples/ATS/linset.hats
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,187 @@ | ||||
| (***********************************************************************) | ||||
| (*                                                                     *) | ||||
| (*                         Applied Type System                         *) | ||||
| (*                                                                     *) | ||||
| (***********************************************************************) | ||||
|  | ||||
| (* | ||||
| ** ATS/Postiats - Unleashing the Potential of Types! | ||||
| ** Copyright (C) 2011-2013 Hongwei Xi, ATS Trustful Software, Inc. | ||||
| ** All rights reserved | ||||
| ** | ||||
| ** ATS is free software;  you can  redistribute it and/or modify it under | ||||
| ** the terms of  the GNU GENERAL PUBLIC LICENSE (GPL) as published by the | ||||
| ** Free Software Foundation; either version 3, or (at  your  option)  any | ||||
| ** later version. | ||||
| **  | ||||
| ** ATS 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  ATS;  see the  file COPYING.  If not, please write to the | ||||
| ** Free Software Foundation,  51 Franklin Street, Fifth Floor, Boston, MA | ||||
| ** 02110-1301, USA. | ||||
| *) | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| (* Author: Hongwei Xi *) | ||||
| (* Authoremail: hwxi AT cs DOT bu DOT edu *) | ||||
| (* Start time: December, 2012 *) | ||||
|  | ||||
| (* ****** ****** *) | ||||
| // | ||||
| // HX: shared by linset_listord (* ordered list *) | ||||
| // HX: shared by linset_avltree (* AVL-tree-based *) | ||||
| // | ||||
| (* ****** ****** *) | ||||
| // | ||||
| // HX-2013-02: | ||||
| // for sets of nonlinear elements | ||||
| // | ||||
| absvtype set_vtype (a:t@ype+) = ptr | ||||
| // | ||||
| (* ****** ****** *) | ||||
|  | ||||
| vtypedef set (a:t0p) = set_vtype (a) | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| fun{a:t0p} | ||||
| compare_elt_elt (x1: a, x2: a):<> int | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| fun{} linset_nil{a:t0p} ():<> set(a) | ||||
| fun{} linset_make_nil{a:t0p} ():<> set(a) | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| fun{a:t0p} linset_sing (x: a):<!wrt> set(a) | ||||
| fun{a:t0p} linset_make_sing (x: a):<!wrt> set(a) | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| fun{a:t0p} | ||||
| linset_make_list (xs: List(INV(a))):<!wrt> set(a) | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| fun{} | ||||
| linset_is_nil {a:t0p} (xs: !set(INV(a))):<> bool | ||||
| fun{} | ||||
| linset_isnot_nil {a:t0p} (xs: !set(INV(a))):<> bool | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| fun{a:t0p} linset_size (!set(INV(a))): size_t | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| fun{a:t0p} | ||||
| linset_is_member (xs: !set(INV(a)), x0: a):<> bool | ||||
| fun{a:t0p} | ||||
| linset_isnot_member (xs: !set(INV(a)), x0: a):<> bool | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| fun{a:t0p} | ||||
| linset_copy (!set(INV(a))):<!wrt> set(a) | ||||
| fun{a:t0p} | ||||
| linset_free (xs: set(INV(a))):<!wrt> void | ||||
|  | ||||
| (* ****** ****** *) | ||||
| // | ||||
| fun{a:t0p} | ||||
| linset_insert | ||||
|   (xs: &set(INV(a)) >> _, x0: a):<!wrt> bool | ||||
| // | ||||
| (* ****** ****** *) | ||||
| // | ||||
| fun{a:t0p} | ||||
| linset_takeout | ||||
| ( | ||||
|   &set(INV(a)) >> _, a, res: &(a?) >> opt(a, b) | ||||
| ) :<!wrt> #[b:bool] bool(b) // endfun | ||||
| fun{a:t0p} | ||||
| linset_takeout_opt (&set(INV(a)) >> _, a):<!wrt> Option_vt(a) | ||||
| // | ||||
| (* ****** ****** *) | ||||
| // | ||||
| fun{a:t0p} | ||||
| linset_remove | ||||
|   (xs: &set(INV(a)) >> _, x0: a):<!wrt> bool | ||||
| // | ||||
| (* ****** ****** *) | ||||
| // | ||||
| // HX: choosing an element in an unspecified manner | ||||
| // | ||||
| fun{a:t0p} | ||||
| linset_choose | ||||
| ( | ||||
|   xs: !set(INV(a)), x: &a? >> opt (a, b) | ||||
| ) :<!wrt> #[b:bool] bool(b) | ||||
| // | ||||
| fun{a:t0p} | ||||
| linset_choose_opt (xs: !set(INV(a))):<!wrt> Option_vt(a) | ||||
| // | ||||
| (* ****** ****** *) | ||||
|  | ||||
| fun{a:t0p} | ||||
| linset_takeoutmax | ||||
| ( | ||||
|   xs: &set(INV(a)) >> _, res: &a? >> opt(a, b) | ||||
| ) :<!wrt> #[b:bool] bool (b) | ||||
| fun{a:t0p} | ||||
| linset_takeoutmax_opt (xs: &set(INV(a)) >> _):<!wrt> Option_vt(a) | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| fun{a:t0p} | ||||
| linset_takeoutmin | ||||
| ( | ||||
|   xs: &set(INV(a)) >> _, res: &a? >> opt(a, b) | ||||
| ) :<!wrt> #[b:bool] bool (b) | ||||
| fun{a:t0p} | ||||
| linset_takeoutmin_opt (xs: &set(INV(a)) >> _):<!wrt> Option_vt(a) | ||||
|  | ||||
| (* ****** ****** *) | ||||
| // | ||||
| fun{} | ||||
| fprint_linset$sep (FILEref): void // ", " | ||||
| // | ||||
| fun{a:t0p} | ||||
| fprint_linset (out: FILEref, xs: !set(INV(a))): void | ||||
| // | ||||
| overload fprint with fprint_linset | ||||
| // | ||||
| (* ****** ****** *) | ||||
| // | ||||
| fun{ | ||||
| a:t0p}{env:vt0p | ||||
| } linset_foreach$fwork | ||||
|   (x: a, env: &(env) >> _): void | ||||
| // | ||||
| fun{a:t0p} | ||||
| linset_foreach (set: !set(INV(a))): void | ||||
| fun{ | ||||
| a:t0p}{env:vt0p | ||||
| } linset_foreach_env | ||||
|   (set: !set(INV(a)), env: &(env) >> _): void | ||||
| // end of [linset_foreach_env] | ||||
| // | ||||
| (* ****** ****** *) | ||||
|  | ||||
| fun{a:t0p} | ||||
| linset_listize (xs: set(INV(a))): List0_vt (a) | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| fun{a:t0p} | ||||
| linset_listize1 (xs: !set(INV(a))): List0_vt (a) | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| (* end of [linset.hats] *) | ||||
							
								
								
									
										504
									
								
								samples/ATS/linset_listord.dats
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										504
									
								
								samples/ATS/linset_listord.dats
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,504 @@ | ||||
| (***********************************************************************) | ||||
| (*                                                                     *) | ||||
| (*                         Applied Type System                         *) | ||||
| (*                                                                     *) | ||||
| (***********************************************************************) | ||||
|  | ||||
| (* | ||||
| ** ATS/Postiats - Unleashing the Potential of Types! | ||||
| ** Copyright (C) 2011-2013 Hongwei Xi, ATS Trustful Software, Inc. | ||||
| ** All rights reserved | ||||
| ** | ||||
| ** ATS is free software;  you can  redistribute it and/or modify it under | ||||
| ** the terms of  the GNU GENERAL PUBLIC LICENSE (GPL) as published by the | ||||
| ** Free Software Foundation; either version 3, or (at  your  option)  any | ||||
| ** later version. | ||||
| **  | ||||
| ** ATS 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  ATS;  see the  file COPYING.  If not, please write to the | ||||
| ** Free Software Foundation,  51 Franklin Street, Fifth Floor, Boston, MA | ||||
| ** 02110-1301, USA. | ||||
| *) | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| (* Author: Hongwei Xi *) | ||||
| (* Authoremail: hwxi AT cs DOT bu DOT edu *) | ||||
| (* Start time: February, 2013 *) | ||||
|  | ||||
| (* ****** ****** *) | ||||
| // | ||||
| // HX-2013-08: | ||||
| // a set is represented as a sorted list in descending order; | ||||
| // note that descending order is chosen to faciliate set comparison | ||||
| // | ||||
| (* ****** ****** *) | ||||
|  | ||||
| staload | ||||
| UN = "prelude/SATS/unsafe.sats" | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| staload "libats/SATS/linset_listord.sats" | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| #include "./SHARE/linset.hats" // code reuse | ||||
| #include "./SHARE/linset_node.hats" // code reuse | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| assume | ||||
| set_vtype (elt:t@ype) = List0_vt (elt) | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| implement{} | ||||
| linset_nil () = list_vt_nil () | ||||
| implement{} | ||||
| linset_make_nil () = list_vt_nil () | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| implement | ||||
| {a}(*tmp*) | ||||
| linset_sing | ||||
|   (x) = list_vt_cons{a}(x, list_vt_nil) | ||||
| // end of [linset_sing] | ||||
| implement{a} | ||||
| linset_make_sing | ||||
|   (x) = list_vt_cons{a}(x, list_vt_nil) | ||||
| // end of [linset_make_sing] | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| implement{} | ||||
| linset_is_nil (xs) = list_vt_is_nil (xs) | ||||
| implement{} | ||||
| linset_isnot_nil (xs) = list_vt_is_cons (xs) | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| implement{a} | ||||
| linset_size (xs) = | ||||
|   let val n = list_vt_length(xs) in i2sz(n) end | ||||
| // end of [linset_size] | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| implement{a} | ||||
| linset_is_member | ||||
|   (xs, x0) = let | ||||
| // | ||||
| fun aux | ||||
|   {n:nat} .<n>. | ||||
| ( | ||||
|   xs: !list_vt (a, n) | ||||
| ) :<> bool = let | ||||
| in | ||||
| // | ||||
| case+ xs of | ||||
| | list_vt_cons (x, xs) => let | ||||
|     val sgn = compare_elt_elt<a> (x0, x) in | ||||
|     if sgn > 0 then false else (if sgn < 0 then aux (xs) else true) | ||||
|   end // end of [list_vt_cons] | ||||
| | list_vt_nil ((*void*)) => false | ||||
| // | ||||
| end // end of [aux] | ||||
| // | ||||
| in | ||||
|   aux (xs) | ||||
| end // end of [linset_is_member] | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| implement{a} | ||||
| linset_copy (xs) = list_vt_copy<a> (xs) | ||||
| implement{a} | ||||
| linset_free (xs) = list_vt_free<a> (xs) | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| implement{a} | ||||
| linset_insert | ||||
|   (xs, x0) = let | ||||
| // | ||||
| fun | ||||
| mynode_cons | ||||
|   {n:nat} .<>. | ||||
| ( | ||||
|   nx: mynode1 (a), xs: list_vt (a, n) | ||||
| ) : list_vt (a, n+1) = let | ||||
| // | ||||
| val xs1 = | ||||
| $UN.castvwtp0{List1_vt(a)}(nx) | ||||
| val+@list_vt_cons (_, xs2) = xs1 | ||||
| prval () = $UN.cast2void (xs2); val () = (xs2 := xs) | ||||
| // | ||||
| in | ||||
|   fold@ (xs1); xs1 | ||||
| end // end of [mynode_cons] | ||||
| // | ||||
| fun ins | ||||
|   {n:nat} .<n>. // tail-recursive | ||||
| ( | ||||
|   xs: &list_vt (a, n) >> list_vt (a, n1) | ||||
| ) : #[n1:nat | n <= n1; n1 <= n+1] bool = | ||||
| ( | ||||
| case+ xs of | ||||
| | @list_vt_cons | ||||
|     (x, xs1) => let | ||||
|     val sgn = | ||||
|       compare_elt_elt<a> (x0, x) | ||||
|     // end of [val] | ||||
|   in | ||||
|     if sgn > 0 then let | ||||
|       prval () = fold@ (xs) | ||||
|       val nx = mynode_make_elt<a> (x0) | ||||
|       val ((*void*)) = xs := mynode_cons (nx, xs) | ||||
|     in | ||||
|       false | ||||
|     end else if sgn < 0 then let | ||||
|       val ans = ins (xs1) | ||||
|       prval () = fold@ (xs) | ||||
|     in | ||||
|       ans | ||||
|     end else let // [x0] is found | ||||
|       prval () = fold@ (xs) | ||||
|     in | ||||
|       true (* [x0] in [xs] *) | ||||
|     end (* end of [if] *) | ||||
|   end // end of [list_vt_cons] | ||||
| | list_vt_nil () => let | ||||
|     val nx = mynode_make_elt<a> (x0) | ||||
|     val ((*void*)) = xs := mynode_cons (nx, xs) | ||||
|   in | ||||
|     false | ||||
|   end // end of [list_vt_nil] | ||||
| ) (* end of [ins] *) | ||||
| // | ||||
| in | ||||
|   $effmask_all (ins (xs)) | ||||
| end // end of [linset_insert] | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| (* | ||||
| // | ||||
| HX-2013-08: | ||||
| [linset_remove] moved up | ||||
| // | ||||
| implement{a} | ||||
| linset_remove | ||||
|   (xs, x0) = let | ||||
| // | ||||
| fun rem | ||||
|   {n:nat} .<n>. // tail-recursive | ||||
| ( | ||||
|   xs: &list_vt (a, n) >> list_vt (a, n1) | ||||
| ) : #[n1:nat | n1 <= n; n <= n1+1] bool = | ||||
| ( | ||||
| case+ xs of | ||||
| | @list_vt_cons | ||||
|     (x, xs1) => let | ||||
|     val sgn = | ||||
|       compare_elt_elt<a> (x0, x) | ||||
|     // end of [val] | ||||
|   in | ||||
|     if sgn > 0 then let | ||||
|       prval () = fold@ (xs) | ||||
|     in | ||||
|       false | ||||
|     end else if sgn < 0 then let | ||||
|       val ans = rem (xs1) | ||||
|       prval () = fold@ (xs) | ||||
|     in | ||||
|       ans | ||||
|     end else let // x0 = x | ||||
|       val xs1_ = xs1 | ||||
|       val ((*void*)) = free@{a}{0}(xs) | ||||
|       val () = xs := xs1_ | ||||
|     in | ||||
|       true // [x0] in [xs] | ||||
|     end (* end of [if] *) | ||||
|   end // end of [list_vt_cons] | ||||
| | list_vt_nil () => false | ||||
| ) (* end of [rem] *) | ||||
| // | ||||
| in | ||||
|   $effmask_all (rem (xs)) | ||||
| end // end of [linset_remove] | ||||
| *) | ||||
|  | ||||
| (* ****** ****** *) | ||||
| (* | ||||
| ** By Brandon Barker | ||||
| *) | ||||
| implement | ||||
| {a}(*tmp*) | ||||
| linset_choose | ||||
|   (xs, x0) = let | ||||
| in | ||||
| // | ||||
| case+ xs of | ||||
| | list_vt_cons | ||||
|     (x, xs1) => let | ||||
|     val () = x0 := x | ||||
|     prval () = opt_some{a}(x0) | ||||
|   in | ||||
|     true | ||||
|   end // end of [list_vt_cons] | ||||
| | list_vt_nil () => let | ||||
|     prval () = opt_none{a}(x0) | ||||
|   in | ||||
|     false | ||||
|   end // end of [list_vt_nil] | ||||
| // | ||||
| end // end of [linset_choose] | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| implement | ||||
| {a}{env} | ||||
| linset_foreach_env (xs, env) = let | ||||
| // | ||||
| implement | ||||
| list_vt_foreach$fwork<a><env> | ||||
|   (x, env) = linset_foreach$fwork<a><env> (x, env) | ||||
| // | ||||
| in | ||||
|   list_vt_foreach_env<a><env> (xs, env) | ||||
| end // end of [linset_foreach_env] | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| implement{a} | ||||
| linset_listize (xs) = xs | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| implement{a} | ||||
| linset_listize1 (xs) = list_vt_copy (xs) | ||||
|  | ||||
| (* ****** ****** *) | ||||
| // | ||||
| // HX: functions for processing mynodes | ||||
| // | ||||
| (* ****** ****** *) | ||||
|  | ||||
| implement{ | ||||
| } mynode_null{a} () = | ||||
|   $UN.castvwtp0{mynode(a,null)}(the_null_ptr) | ||||
| // end of [mynode_null] | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| implement | ||||
| {a}(*tmp*) | ||||
| mynode_make_elt | ||||
|   (x) = let | ||||
| // | ||||
| val nx = list_vt_cons{a}{0}(x, _ ) | ||||
| // | ||||
| in | ||||
|   $UN.castvwtp0{mynode1(a)}(nx) | ||||
| end // end of [mynode_make_elt] | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| implement{ | ||||
| } mynode_free | ||||
|   {a}(nx) = () where { | ||||
| val nx = | ||||
|   $UN.castvwtp0{List1_vt(a)}(nx) | ||||
| // | ||||
| val+~list_vt_cons (_, nx2) = nx | ||||
| // | ||||
| prval ((*void*)) = $UN.cast2void (nx2) | ||||
| // | ||||
| } (* end of [mynode_free] *) | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| implement | ||||
| {a}(*tmp*) | ||||
| mynode_get_elt | ||||
|   (nx) = (x) where { | ||||
| // | ||||
| val nx1 = | ||||
|   $UN.castvwtp1{List1_vt(a)}(nx) | ||||
| // | ||||
| val+list_vt_cons (x, _) = nx1 | ||||
| // | ||||
| prval ((*void*)) = $UN.cast2void (nx1) | ||||
| // | ||||
| } (* end of [mynode_get_elt] *) | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| implement | ||||
| {a}(*tmp*) | ||||
| mynode_set_elt | ||||
|   {l} (nx, x0) = | ||||
| { | ||||
| // | ||||
| val nx1 = | ||||
|   $UN.castvwtp1{List1_vt(a)}(nx) | ||||
| // | ||||
| val+@list_vt_cons (x, _) = nx1 | ||||
| // | ||||
| val () = x := x0 | ||||
| // | ||||
| prval () = fold@ (nx1) | ||||
| prval () = $UN.cast2void (nx1) | ||||
| // | ||||
| prval () = __assert (nx) where | ||||
| { | ||||
|   extern praxi __assert (nx: !mynode(a?, l) >> mynode (a, l)): void | ||||
| } (* end of [prval] *) | ||||
| // | ||||
| } (* end of [mynode_set_elt] *) | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| implement | ||||
| {a}(*tmp*) | ||||
| mynode_getfree_elt | ||||
|   (nx) = (x) where { | ||||
| // | ||||
| val nx = | ||||
|   $UN.castvwtp0{List1_vt(a)}(nx) | ||||
| // | ||||
| val+~list_vt_cons (x, nx2) = nx | ||||
| // | ||||
| prval ((*void*)) = $UN.cast2void (nx2) | ||||
| // | ||||
| } (* end of [mynode_getfree_elt] *) | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| (* | ||||
| fun{a:t0p} | ||||
| linset_takeout_ngc | ||||
|   (set: &set(INV(a)) >> _, x0: a):<!wrt> mynode0 (a) | ||||
| // end of [linset_takeout_ngc] | ||||
| *) | ||||
| implement | ||||
| {a}(*tmp*) | ||||
| linset_takeout_ngc | ||||
|   (set, x0) = let | ||||
| // | ||||
| fun takeout | ||||
| ( | ||||
|   xs: &List0_vt (a) >> _ | ||||
| ) : mynode0(a) = let | ||||
| in | ||||
| // | ||||
| case+ xs of | ||||
| | @list_vt_cons | ||||
|     (x, xs1) => let | ||||
|     prval pf_x = view@x | ||||
|     prval pf_xs1 = view@xs1 | ||||
|     val sgn = | ||||
|       compare_elt_elt<a> (x0, x) | ||||
|     // end of [val] | ||||
|   in | ||||
|     if sgn > 0 then let | ||||
|       prval () = fold@ (xs) | ||||
|     in | ||||
|       mynode_null{a}((*void*)) | ||||
|     end else if sgn < 0 then let | ||||
|       val res = takeout (xs1) | ||||
|       prval ((*void*)) = fold@ (xs) | ||||
|     in | ||||
|       res | ||||
|     end else let // x0 = x | ||||
|       val xs1_ = xs1 | ||||
|       val res = $UN.castvwtp0{mynode1(a)}((pf_x, pf_xs1 | xs)) | ||||
|       val () = xs := xs1_ | ||||
|     in | ||||
|       res // [x0] in [xs] | ||||
|     end (* end of [if] *) | ||||
|   end // end of [list_vt_cons] | ||||
| | list_vt_nil () => mynode_null{a}((*void*)) | ||||
| // | ||||
| end (* end of [takeout] *) | ||||
| // | ||||
| in | ||||
|   $effmask_all (takeout (set)) | ||||
| end // end of [linset_takeout_ngc] | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| implement | ||||
| {a}(*tmp*) | ||||
| linset_takeoutmax_ngc | ||||
|   (xs) = let | ||||
| in | ||||
| // | ||||
| case+ xs of | ||||
| | @list_vt_cons | ||||
|     (x, xs1) => let | ||||
|     prval pf_x = view@x | ||||
|     prval pf_xs1 = view@xs1 | ||||
|     val xs_ = xs | ||||
|     val () = xs := xs1 | ||||
|   in | ||||
|     $UN.castvwtp0{mynode1(a)}((pf_x, pf_xs1 | xs_)) | ||||
|   end // end of [list_vt_cons] | ||||
| | @list_vt_nil () => let | ||||
|     prval () = fold@ (xs) | ||||
|   in | ||||
|     mynode_null{a}((*void*)) | ||||
|   end // end of [list_vt_nil] | ||||
| // | ||||
| end // end of [linset_takeoutmax_ngc] | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| implement | ||||
| {a}(*tmp*) | ||||
| linset_takeoutmin_ngc | ||||
|   (xs) = let | ||||
| // | ||||
| fun unsnoc | ||||
|   {n:pos} .<n>. | ||||
| ( | ||||
|   xs: &list_vt (a, n) >> list_vt (a, n-1) | ||||
| ) :<!wrt> mynode1 (a) = let | ||||
| // | ||||
| val+@list_vt_cons (x, xs1) = xs | ||||
| // | ||||
| prval pf_x = view@x and pf_xs1 = view@xs1 | ||||
| // | ||||
| in | ||||
| // | ||||
| case+ xs1 of | ||||
| | list_vt_cons _ => | ||||
|     let val res = unsnoc(xs1) in fold@xs; res end | ||||
|   // end of [list_vt_cons] | ||||
| | list_vt_nil () => let | ||||
|     val xs_ = xs | ||||
|     val () = xs := list_vt_nil{a}() | ||||
|   in | ||||
|     $UN.castvwtp0{mynode1(a)}((pf_x, pf_xs1 | xs_)) | ||||
|   end // end of [list_vt_nil] | ||||
| // | ||||
| end // end of [unsnoc] | ||||
| // | ||||
| in | ||||
| // | ||||
| case+ xs of | ||||
| | list_vt_cons _ => unsnoc (xs) | ||||
| | list_vt_nil () => mynode_null{a}((*void*)) | ||||
| // | ||||
| end // end of [linset_takeoutmin_ngc] | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| (* end of [linset_listord.dats] *) | ||||
							
								
								
									
										51
									
								
								samples/ATS/linset_listord.sats
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								samples/ATS/linset_listord.sats
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,51 @@ | ||||
| (***********************************************************************) | ||||
| (*                                                                     *) | ||||
| (*                         Applied Type System                         *) | ||||
| (*                                                                     *) | ||||
| (***********************************************************************) | ||||
|  | ||||
| (* | ||||
| ** ATS/Postiats - Unleashing the Potential of Types! | ||||
| ** Copyright (C) 2011-2013 Hongwei Xi, ATS Trustful Software, Inc. | ||||
| ** All rights reserved | ||||
| ** | ||||
| ** ATS is free software;  you can  redistribute it and/or modify it under | ||||
| ** the terms of  the GNU GENERAL PUBLIC LICENSE (GPL) as published by the | ||||
| ** Free Software Foundation; either version 3, or (at  your  option)  any | ||||
| ** later version. | ||||
| **  | ||||
| ** ATS 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  ATS;  see the  file COPYING.  If not, please write to the | ||||
| ** Free Software Foundation,  51 Franklin Street, Fifth Floor, Boston, MA | ||||
| ** 02110-1301, USA. | ||||
| *) | ||||
|  | ||||
| (* ****** ****** *) | ||||
| // | ||||
| // Author: Hongwei Xi | ||||
| // Authoremail: hwxiATcsDOTbuDOTedu | ||||
| // Time: October, 2010 | ||||
| // | ||||
| (* ****** ****** *) | ||||
|  | ||||
| #define ATS_PACKNAME "ATSLIB.libats.linset_listord" | ||||
| #define ATS_STALOADFLAG 0 // no static loading at run-time | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| #include "./SHARE/linset.hats" | ||||
| #include "./SHARE/linset_node.hats" | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| castfn | ||||
| linset2list {a:t0p} (xs: set (INV(a))):<> List0_vt (a) | ||||
|  | ||||
| (* ****** ****** *) | ||||
|  | ||||
| (* end of [linset_listord.sats] *) | ||||
							
								
								
									
										215
									
								
								samples/ATS/main.atxt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										215
									
								
								samples/ATS/main.atxt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,215 @@ | ||||
| %{ | ||||
| #include "./../ATEXT/atextfun.hats" | ||||
| %} | ||||
|  | ||||
| <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" | ||||
|    "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> | ||||
| <html xmlns="http://www.w3.org/1999/xhtml"> | ||||
|  | ||||
| <head> | ||||
| <meta http-equiv="content-type" content="text/html; charset=UTF-8" /> | ||||
| <title>EFFECTIVATS-DiningPhil2</title> | ||||
| #patscode_style() | ||||
| </head> | ||||
|  | ||||
| <body> | ||||
|  | ||||
| <h1> | ||||
| Effective ATS: Dining Philosophers | ||||
| </h1> | ||||
|  | ||||
| In this article, I present an implementation of a slight variant of the | ||||
| famous problem of 5-Dining-Philosophers by Dijkstra that makes simple but | ||||
| convincing use of linear types. | ||||
|  | ||||
| <h2> | ||||
| The Original Problem  | ||||
| </h2> | ||||
|  | ||||
| There are five philosophers sitting around a table and there are also 5 | ||||
| forks placed on the table such that each fork is located between the left | ||||
| hand of a philosopher and the right hand of another philosopher. Each | ||||
| philosopher does the following routine repeatedly: thinking and dining.  In | ||||
| order to dine, a philosopher needs to first acquire two forks: one located | ||||
| on his left-hand side and the other on his right-hand side. After | ||||
| finishing dining, a philosopher puts the two acquired forks onto the table: | ||||
| one on his left-hand side and the other on his right-hand side. | ||||
|  | ||||
| <h2> | ||||
| A Variant of the Original Problem  | ||||
| </h2> | ||||
|  | ||||
| The following twist is added to the original version: | ||||
|  | ||||
| <p> | ||||
|  | ||||
| After a fork is used, it becomes a "dirty" fork and needs to be put in a | ||||
| tray for dirty forks. There is a cleaner who cleans dirty forks and then | ||||
| puts them back on the table. | ||||
|  | ||||
| <h2> | ||||
| Channels for Communication | ||||
| </h2> | ||||
|  | ||||
| A channel is just a shared queue of fixed capacity. The following two | ||||
| functions are for inserting an element into and taking an element out of a | ||||
| given channel: | ||||
|  | ||||
| <pre | ||||
| class="patsyntax"> | ||||
| #pats2xhtml_sats("\ | ||||
| fun{a:vt0p} channel_insert (channel (a), a): void | ||||
| fun{a:vt0p} channel_takeout (chan: channel (a)): (a)  | ||||
| ")</pre> | ||||
|  | ||||
| If [channel_insert] is called on a channel that is full, then the caller is | ||||
| blocked until an element is taken out of the channel.  If [channel_takeout] | ||||
| is called on a channel that is empty, then the caller is blocked until an | ||||
| element is inserted into the channel. | ||||
|  | ||||
| <h2> | ||||
| A Channel for Each Fork | ||||
| </h2> | ||||
|  | ||||
| Forks are resources given a linear type. Each fork is initially stored in a | ||||
| channel, which can be obtained by calling the following function: | ||||
|  | ||||
| <pre | ||||
| class="patsyntax"> | ||||
| #pats2xhtml_sats("\ | ||||
| fun fork_changet (n: nphil): channel(fork) | ||||
| ")</pre> | ||||
|  | ||||
| where the type [nphil] is defined to be [natLt(5)] (for natural numbers | ||||
| less than 5). The channels for storing forks are chosen to be of capacity | ||||
| 2. The reason that channels of capacity 2 are chosen to store at most one | ||||
| element (in each of them) is to guarantee that these channels can never be | ||||
| full (so that there is no attempt made to send signals to awake callers | ||||
| supposedly being blocked due to channels being full). | ||||
|  | ||||
|  | ||||
| <h2> | ||||
| A Channel for the Fork Tray | ||||
| </h2> | ||||
|  | ||||
| A tray for storing "dirty" forks is also a channel, which can be obtained | ||||
| by calling the following function: | ||||
|  | ||||
| <pre | ||||
| class="patsyntax"> | ||||
| #pats2xhtml_sats("\ | ||||
| fun forktray_changet ((*void*)): channel(fork) | ||||
| ")</pre> | ||||
|  | ||||
| The capacity chosen for the channel is 6 (instead of 5) so that it can | ||||
| never become full (as there are only 5 forks in total). | ||||
|  | ||||
| <h2> | ||||
| Philosopher Loop | ||||
| </h2> | ||||
|  | ||||
| Each philosopher is implemented as a loop: | ||||
|  | ||||
| <pre | ||||
| class="patsyntax"> | ||||
| #pats2xhtml_dats('\ | ||||
| implement | ||||
| phil_loop (n) = let | ||||
| // | ||||
| val () = phil_think (n) | ||||
| // | ||||
| val nl = phil_left (n) // = n | ||||
| val nr = phil_right (n) // = (n+1) % 5 | ||||
| // | ||||
| val ch_lfork = fork_changet (nl) | ||||
| val ch_rfork = fork_changet (nr) | ||||
| // | ||||
| val lf = channel_takeout (ch_lfork) | ||||
| val () = println! ("phil_loop(", n, ") picks left fork") | ||||
| // | ||||
| val () = randsleep (2) // sleep up to 2 seconds | ||||
| // | ||||
| val rf = channel_takeout (ch_rfork) | ||||
| val () = println! ("phil_loop(", n, ") picks right fork") | ||||
| // | ||||
| val () = phil_dine (n, lf, rf) | ||||
| // | ||||
| val ch_forktray = forktray_changet () | ||||
| val () = channel_insert (ch_forktray, lf) // left fork to dirty tray | ||||
| val () = channel_insert (ch_forktray, rf) // right fork to dirty tray | ||||
| // | ||||
| in | ||||
|   phil_loop (n) | ||||
| end // end of [phil_loop] | ||||
| ')</pre> | ||||
|  | ||||
| It should be straighforward to follow the code for [phil_loop]. | ||||
|  | ||||
| <h2> | ||||
| Fork Cleaner Loop | ||||
| </h2> | ||||
|  | ||||
| A cleaner is implemented as a loop: | ||||
|  | ||||
| <pre | ||||
| class="patsyntax"> | ||||
| #pats2xhtml_dats('\ | ||||
| implement | ||||
| cleaner_loop () = let | ||||
| // | ||||
| val ch = forktray_changet () | ||||
| val f0 = channel_takeout (ch) // [f0] is dirty | ||||
| // | ||||
| val () = cleaner_wash (f0) // washes dirty [f0] | ||||
| val () = cleaner_return (f0) // puts back cleaned [f0] | ||||
| // | ||||
| in | ||||
|   cleaner_loop () | ||||
| end // end of [cleaner_loop] | ||||
| ')</pre> | ||||
|  | ||||
| The function [cleaner_return] first finds out the number of a given fork | ||||
| and then uses the number to locate the channel for storing the fork. Its | ||||
| actual implementation is given as follows: | ||||
|  | ||||
| <pre | ||||
| class="patsyntax"> | ||||
| #pats2xhtml_dats('\ | ||||
| implement | ||||
| cleaner_return (f) = | ||||
| { | ||||
|   val n = fork_get_num (f) | ||||
|   val ch = fork_changet (n) | ||||
|   val () = channel_insert (ch, f) | ||||
| } | ||||
| ')</pre> | ||||
|  | ||||
| It should now be straighforward to follow the code for [cleaner_loop]. | ||||
|  | ||||
| <h2> | ||||
| Testing | ||||
| </h2> | ||||
|  | ||||
| The entire code of this implementation is stored in the following files: | ||||
|  | ||||
| <pre> | ||||
| DiningPhil2.sats | ||||
| DiningPhil2.dats | ||||
| DiningPhil2_fork.dats | ||||
| DiningPhil2_thread.dats | ||||
| </pre> | ||||
|  | ||||
| There is also a Makefile available for compiling the ATS source code into | ||||
| an excutable for testing. One should be able to encounter a deadlock after | ||||
| running the simulation for a while. | ||||
|  | ||||
| <hr size="2"> | ||||
|  | ||||
| This article is written by <a href="http://www.cs.bu.edu/~hwxi/">Hongwei Xi</a>. | ||||
|  | ||||
| </body> | ||||
| </html> | ||||
|  | ||||
| %{ | ||||
| implement main () = fprint_filsub (stdout_ref, "main_atxt.txt") | ||||
| %} | ||||
							
								
								
									
										39
									
								
								samples/Agda/NatCat.agda
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								samples/Agda/NatCat.agda
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,39 @@ | ||||
| module NatCat where | ||||
|  | ||||
| open import Relation.Binary.PropositionalEquality | ||||
|  | ||||
| -- If you can show that a relation only ever has one inhabitant | ||||
| -- you get the category laws for free | ||||
| module | ||||
|   EasyCategory | ||||
|   (obj : Set) | ||||
|   (_⟶_ : obj → obj → Set) | ||||
|   (_∘_ : ∀ {x y z} → x ⟶ y → y ⟶ z → x ⟶ z) | ||||
|   (id : ∀ x → x ⟶ x) | ||||
|   (single-inhabitant : (x y : obj) (r s : x ⟶ y) → r ≡ s) | ||||
|   where | ||||
|  | ||||
|   idʳ : ∀ x y (r : x ⟶ y) → r ∘ id y ≡ r | ||||
|   idʳ x y r = single-inhabitant x y (r ∘ id y) r  | ||||
|  | ||||
|   idˡ : ∀ x y (r : x ⟶ y) → id x ∘ r ≡ r | ||||
|   idˡ x y r = single-inhabitant x y (id x ∘ r) r | ||||
|  | ||||
|   ∘-assoc : ∀ w x y z (r : w ⟶ x) (s : x ⟶ y) (t : y ⟶ z) → (r ∘ s) ∘ t ≡ r ∘ (s ∘ t) | ||||
|   ∘-assoc w x y z r s t = single-inhabitant w z ((r ∘ s) ∘ t) (r ∘ (s ∘ t)) | ||||
|  | ||||
| open import Data.Nat | ||||
|  | ||||
| same : (x y : ℕ) (r s : x ≤ y) → r ≡ s | ||||
| same .0 y z≤n z≤n = refl | ||||
| same .(suc m) .(suc n) (s≤s {m} {n} r) (s≤s s) = cong s≤s (same m n r s) | ||||
|  | ||||
| ≤-trans : ∀ x y z → x ≤ y → y ≤ z → x ≤ z | ||||
| ≤-trans .0 y z z≤n s = z≤n | ||||
| ≤-trans .(suc m) .(suc n) .(suc n₁) (s≤s {m} {n} r) (s≤s {.n} {n₁} s) = s≤s (≤-trans m n n₁ r s) | ||||
|  | ||||
| ≤-refl : ∀ x → x ≤ x | ||||
| ≤-refl zero = z≤n | ||||
| ≤-refl (suc x) = s≤s (≤-refl x) | ||||
|  | ||||
| module Nat-EasyCategory = EasyCategory ℕ _≤_ (λ {x}{y}{z} → ≤-trans x y z) ≤-refl same | ||||
							
								
								
									
										59
									
								
								samples/Alloy/file_system.als
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								samples/Alloy/file_system.als
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,59 @@ | ||||
| module examples/systems/file_system | ||||
|  | ||||
| /* | ||||
|  * Model of a generic file system. | ||||
|  */ | ||||
|  | ||||
| abstract sig Object {} | ||||
|  | ||||
| sig Name {} | ||||
|  | ||||
| sig File extends Object {} { some d: Dir | this in d.entries.contents } | ||||
|  | ||||
| sig Dir extends Object { | ||||
|   entries: set DirEntry, | ||||
|   parent: lone Dir | ||||
| } { | ||||
|   parent = this.~@contents.~@entries | ||||
|   all e1, e2 : entries | e1.name = e2.name => e1 = e2 | ||||
|   this !in this.^@parent | ||||
|   this != Root => Root in this.^@parent | ||||
| } | ||||
|  | ||||
| one sig Root extends Dir {} { no parent } | ||||
|  | ||||
| lone sig Cur extends Dir {} | ||||
|  | ||||
| sig DirEntry { | ||||
|   name: Name, | ||||
|   contents: Object | ||||
| } { | ||||
|   one this.~entries | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * all directories besides root have one parent | ||||
|  */ | ||||
| pred OneParent_buggyVersion { | ||||
|     all d: Dir - Root | one d.parent | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * all directories besides root have one parent | ||||
|  */ | ||||
| pred OneParent_correctVersion { | ||||
|     all d: Dir - Root | (one d.parent && one contents.d) | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Only files may be linked (that is, have more than one entry) | ||||
|  * That is, all directories are the contents of at most one directory entry | ||||
|  */ | ||||
| pred NoDirAliases { | ||||
|     all o: Dir | lone o.~contents | ||||
| } | ||||
|  | ||||
| check { OneParent_buggyVersion => NoDirAliases } for 5 expect 1 | ||||
|  | ||||
| check { OneParent_correctVersion => NoDirAliases } for 5 expect 0 | ||||
							
								
								
									
										83
									
								
								samples/Alloy/marksweepgc.als
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										83
									
								
								samples/Alloy/marksweepgc.als
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,83 @@ | ||||
| module examples/systems/marksweepgc | ||||
|  | ||||
| /* | ||||
|  * Model of mark and sweep garbage collection. | ||||
|  */ | ||||
|  | ||||
| // a node in the heap | ||||
| sig Node {} | ||||
|  | ||||
| sig HeapState { | ||||
|   left, right : Node -> lone Node, | ||||
|   marked : set Node, | ||||
|   freeList : lone Node | ||||
| } | ||||
|  | ||||
| pred clearMarks[hs, hs' : HeapState] { | ||||
|   // clear marked set | ||||
|   no hs'.marked | ||||
|   // left and right fields are unchanged | ||||
|   hs'.left = hs.left | ||||
|   hs'.right = hs.right | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * simulate the recursion of the mark() function using transitive closure | ||||
|  */ | ||||
| fun reachable[hs: HeapState, n: Node] : set Node { | ||||
|   n + n.^(hs.left + hs.right) | ||||
| } | ||||
|  | ||||
| pred mark[hs: HeapState, from : Node, hs': HeapState] { | ||||
|   hs'.marked = hs.reachable[from] | ||||
|   hs'.left = hs.left | ||||
|   hs'.right = hs.right | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * complete hack to simulate behavior of code to set freeList | ||||
|  */ | ||||
| pred setFreeList[hs, hs': HeapState] { | ||||
|   // especially hackish | ||||
|   hs'.freeList.*(hs'.left) in (Node - hs.marked) | ||||
|   all n: Node | | ||||
|     (n !in hs.marked) => { | ||||
|       no hs'.right[n] | ||||
|       hs'.left[n] in (hs'.freeList.*(hs'.left)) | ||||
|       n in hs'.freeList.*(hs'.left) | ||||
|     } else { | ||||
|       hs'.left[n] = hs.left[n] | ||||
|       hs'.right[n] = hs.right[n] | ||||
|     } | ||||
|   hs'.marked = hs.marked | ||||
| } | ||||
|  | ||||
| pred GC[hs: HeapState, root : Node, hs': HeapState] { | ||||
|   some hs1, hs2: HeapState | | ||||
|     hs.clearMarks[hs1] && hs1.mark[root, hs2] && hs2.setFreeList[hs'] | ||||
| } | ||||
|  | ||||
| assert Soundness1 { | ||||
|   all h, h' : HeapState, root : Node | | ||||
|     h.GC[root, h'] => | ||||
|       (all live : h.reachable[root] | { | ||||
|         h'.left[live] = h.left[live] | ||||
|         h'.right[live] = h.right[live] | ||||
|       }) | ||||
| } | ||||
|  | ||||
| assert Soundness2 { | ||||
|   all h, h' : HeapState, root : Node | | ||||
|     h.GC[root, h'] => | ||||
|       no h'.reachable[root] & h'.reachable[h'.freeList] | ||||
| } | ||||
|  | ||||
| assert Completeness { | ||||
|   all h, h' : HeapState, root : Node | | ||||
|     h.GC[root, h'] => | ||||
|       (Node - h'.reachable[root]) in h'.reachable[h'.freeList] | ||||
| } | ||||
|  | ||||
| check Soundness1 for 3 expect 0 | ||||
| check Soundness2 for 3 expect 0 | ||||
| check Completeness for 3 expect 0 | ||||
							
								
								
									
										217
									
								
								samples/Alloy/views.als
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										217
									
								
								samples/Alloy/views.als
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,217 @@ | ||||
| module examples/systems/views | ||||
|  | ||||
| /* | ||||
|  * Model of views in object-oriented programming. | ||||
|  * | ||||
|  * Two object references, called the view and the backing, | ||||
|  * are related by a view mechanism when changes to the | ||||
|  * backing are automatically propagated to the view. Note | ||||
|  * that the state of a view need not be a projection of the | ||||
|  * state of the backing; the keySet method of Map, for | ||||
|  * example, produces two view relationships, and for the | ||||
|  * one in which the map is modified by changes to the key | ||||
|  * set, the value of the new map cannot be determined from | ||||
|  * the key set. Note that in the iterator view mechanism, | ||||
|  * the iterator is by this definition the backing object, | ||||
|  * since changes are propagated from iterator to collection | ||||
|  * and not vice versa. Oddly, a reference may be a view of | ||||
|  * more than one backing: there can be two iterators on the | ||||
|  * same collection, eg. A reference cannot be a view under | ||||
|  * more than one view type. | ||||
|  * | ||||
|  * A reference is made dirty when it is a backing for a view | ||||
|  * with which it is no longer related by the view invariant. | ||||
|  * This usually happens when a view is modified, either | ||||
|  * directly or via another backing. For example, changing a | ||||
|  * collection directly when it has an iterator invalidates | ||||
|  * it, as does changing the collection through one iterator | ||||
|  * when there are others. | ||||
|  * | ||||
|  * More work is needed if we want to model more closely the | ||||
|  * failure of an iterator when its collection is invalidated. | ||||
|  * | ||||
|  * As a terminological convention, when there are two | ||||
|  * complementary view relationships, we will give them types | ||||
|  * t and t'. For example, KeySetView propagates from map to | ||||
|  * set, and KeySetView' propagates from set to map. | ||||
|  * | ||||
|  * author: Daniel Jackson | ||||
|  */ | ||||
|  | ||||
| open util/ordering[State] as so | ||||
| open util/relation as rel | ||||
|  | ||||
| sig Ref {} | ||||
| sig Object {} | ||||
|  | ||||
| -- t->b->v in views when v is view of type t of backing b | ||||
| -- dirty contains refs that have been invalidated | ||||
| sig State { | ||||
|   refs: set Ref, | ||||
|   obj: refs -> one Object, | ||||
|   views: ViewType -> refs -> refs, | ||||
|   dirty: set refs | ||||
| --  , anyviews: Ref -> Ref -- for visualization | ||||
|   } | ||||
| -- {anyviews = ViewType.views} | ||||
|  | ||||
| sig Map extends Object { | ||||
|   keys: set Ref, | ||||
|   map: keys -> one Ref | ||||
|   }{all s: State |  keys + Ref.map in s.refs} | ||||
| sig MapRef extends Ref {} | ||||
| fact {State.obj[MapRef] in Map} | ||||
|  | ||||
| sig Iterator extends Object { | ||||
|   left, done: set Ref, | ||||
|   lastRef: lone done | ||||
|   }{all s: State | done + left + lastRef in s.refs} | ||||
| sig IteratorRef extends Ref {} | ||||
| fact {State.obj[IteratorRef] in Iterator} | ||||
|  | ||||
| sig Set extends Object { | ||||
|   elts: set Ref | ||||
|   }{all s: State | elts in s.refs} | ||||
| sig SetRef extends Ref {} | ||||
| fact {State.obj[SetRef] in Set} | ||||
|  | ||||
| abstract sig ViewType {} | ||||
| one sig KeySetView, KeySetView', IteratorView extends ViewType {} | ||||
| fact ViewTypes { | ||||
|   State.views[KeySetView] in MapRef -> SetRef | ||||
|   State.views[KeySetView'] in SetRef -> MapRef | ||||
|   State.views[IteratorView] in IteratorRef -> SetRef | ||||
|   all s: State | s.views[KeySetView] = ~(s.views[KeySetView']) | ||||
|   } | ||||
|  | ||||
| /** | ||||
|  * mods is refs modified directly or by view mechanism | ||||
|  * doesn't handle possibility of modifying an object and its view at once? | ||||
|  * should we limit frame conds to non-dirty refs? | ||||
|  */ | ||||
| pred modifies [pre, post: State, rs: set Ref] { | ||||
|   let vr = pre.views[ViewType], mods = rs.*vr { | ||||
|     all r: pre.refs - mods | pre.obj[r] = post.obj[r] | ||||
|     all b: mods, v: pre.refs, t: ViewType | | ||||
|       b->v in pre.views[t] => viewFrame [t, pre.obj[v], post.obj[v], post.obj[b]] | ||||
|     post.dirty = pre.dirty + | ||||
|       {b: pre.refs | some v: Ref, t: ViewType | | ||||
|           b->v in pre.views[t] && !viewFrame [t, pre.obj[v], post.obj[v], post.obj[b]] | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|  | ||||
| pred allocates [pre, post: State, rs: set Ref] { | ||||
|   no rs & pre.refs | ||||
|   post.refs = pre.refs + rs | ||||
|   } | ||||
|  | ||||
| /**  | ||||
|  * models frame condition that limits change to view object from v to v' when backing object changes to b' | ||||
|  */ | ||||
| pred viewFrame [t: ViewType, v, v', b': Object] { | ||||
|   t in KeySetView => v'.elts = dom [b'.map] | ||||
|   t in KeySetView' => b'.elts = dom [v'.map] | ||||
|   t in KeySetView' => (b'.elts) <: (v.map) = (b'.elts) <: (v'.map) | ||||
|   t in IteratorView => v'.elts = b'.left + b'.done | ||||
|   } | ||||
|  | ||||
| pred MapRef.keySet [pre, post: State, setRefs: SetRef] { | ||||
|   post.obj[setRefs].elts = dom [pre.obj[this].map] | ||||
|   modifies [pre, post, none] | ||||
|   allocates [pre, post, setRefs] | ||||
|   post.views = pre.views + KeySetView->this->setRefs + KeySetView'->setRefs->this | ||||
|   } | ||||
|  | ||||
| pred MapRef.put [pre, post: State, k, v: Ref] { | ||||
|   post.obj[this].map = pre.obj[this].map ++ k->v | ||||
|   modifies [pre, post, this] | ||||
|   allocates [pre, post, none] | ||||
|   post.views = pre.views | ||||
|   } | ||||
|  | ||||
| pred SetRef.iterator [pre, post: State, iterRef: IteratorRef] { | ||||
|   let i = post.obj[iterRef] { | ||||
|     i.left = pre.obj[this].elts | ||||
|     no i.done + i.lastRef | ||||
|     } | ||||
|   modifies [pre,post,none] | ||||
|   allocates [pre, post, iterRef] | ||||
|   post.views = pre.views + IteratorView->iterRef->this | ||||
|   } | ||||
|  | ||||
| pred IteratorRef.remove [pre, post: State] { | ||||
|   let i = pre.obj[this], i' = post.obj[this] { | ||||
|     i'.left = i.left | ||||
|     i'.done = i.done - i.lastRef | ||||
|     no i'.lastRef | ||||
|     } | ||||
|   modifies [pre,post,this] | ||||
|   allocates [pre, post, none] | ||||
|   pre.views = post.views | ||||
|   } | ||||
|  | ||||
| pred IteratorRef.next [pre, post: State, ref: Ref] { | ||||
|   let i = pre.obj[this], i' = post.obj[this] { | ||||
|     ref in i.left | ||||
|     i'.left = i.left - ref | ||||
|     i'.done = i.done + ref | ||||
|     i'.lastRef = ref | ||||
|     } | ||||
|   modifies [pre, post, this] | ||||
|   allocates [pre, post, none] | ||||
|   pre.views = post.views | ||||
|   } | ||||
|  | ||||
| pred IteratorRef.hasNext [s: State] { | ||||
|   some s.obj[this].left | ||||
|   } | ||||
|  | ||||
| assert zippishOK { | ||||
|   all | ||||
|     ks, vs: SetRef, | ||||
|     m: MapRef, | ||||
|     ki, vi: IteratorRef, | ||||
|     k, v: Ref | | ||||
|     let s0=so/first, | ||||
|     s1=so/next[s0], | ||||
|     s2=so/next[s1], | ||||
|     s3=so/next[s2], | ||||
|     s4=so/next[s3], | ||||
|     s5=so/next[s4], | ||||
|     s6=so/next[s5], | ||||
|     s7=so/next[s6] | | ||||
|   ({ | ||||
|     precondition [s0, ks, vs, m] | ||||
|     no s0.dirty | ||||
|     ks.iterator [s0, s1, ki] | ||||
|     vs.iterator [s1, s2, vi] | ||||
|     ki.hasNext [s2] | ||||
|     vi.hasNext [s2] | ||||
|     ki.this/next [s2, s3, k] | ||||
|     vi.this/next [s3, s4, v] | ||||
|     m.put [s4, s5, k, v] | ||||
|     ki.remove [s5, s6] | ||||
|     vi.remove [s6, s7] | ||||
|   } => no State.dirty) | ||||
|   } | ||||
|  | ||||
| pred precondition [pre: State, ks, vs, m: Ref] { | ||||
|   // all these conditions and other errors discovered in scope of 6 but 8,3 | ||||
|   // in initial state, must have view invariants hold | ||||
|   (all t: ViewType, b, v: pre.refs | | ||||
|     b->v in pre.views[t] => viewFrame [t, pre.obj[v], pre.obj[v], pre.obj[b]]) | ||||
|   // sets are not aliases | ||||
| --  ks != vs | ||||
|   // sets are not views of map | ||||
| --  no (ks+vs)->m & ViewType.pre.views | ||||
|   // no iterator currently on either set | ||||
| --  no Ref->(ks+vs) & ViewType.pre.views | ||||
|   } | ||||
|  | ||||
| check zippishOK for 6 but 8 State, 3 ViewType expect 1 | ||||
|  | ||||
| /**  | ||||
|  * experiment with controlling heap size | ||||
|  */ | ||||
| fact {all s: State | #s.obj < 5} | ||||
							
								
								
									
										26
									
								
								samples/ApacheConf/filenames/.htaccess
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								samples/ApacheConf/filenames/.htaccess
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | ||||
| ServerSignature Off | ||||
| RewriteCond %{REQUEST_METHOD} ^(HEAD|TRACE|DELETE|TRACK) [NC,OR] | ||||
| RewriteCond %{THE_REQUEST} (\\r|\\n|%0A|%0D) [NC,OR] | ||||
|  | ||||
| RewriteCond %{HTTP_REFERER} (<|>|’|%0A|%0D|%27|%3C|%3E|%00) [NC,OR] | ||||
| RewriteCond %{HTTP_COOKIE} (<|>|’|%0A|%0D|%27|%3C|%3E|%00) [NC,OR] | ||||
| RewriteCond %{REQUEST_URI} ^/(,|;|:|<|>|”>|”<|/|\\\.\.\\).{0,9999} [NC,OR] | ||||
|  | ||||
| RewriteCond %{HTTP_USER_AGENT} ^$ [OR] | ||||
| RewriteCond %{HTTP_USER_AGENT} ^(java|curl|wget) [NC,OR] | ||||
| RewriteCond %{HTTP_USER_AGENT} (winhttp|HTTrack|clshttp|archiver|loader|email|harvest|extract|grab|miner) [NC,OR] | ||||
| RewriteCond %{HTTP_USER_AGENT} (libwww-perl|curl|wget|python|nikto|scan) [NC,OR] | ||||
| RewriteCond %{HTTP_USER_AGENT} (<|>|’|%0A|%0D|%27|%3C|%3E|%00) [NC,OR] | ||||
|  | ||||
| #Block mySQL injects | ||||
| RewriteCond %{QUERY_STRING} (;|<|>|’|”|\)|%0A|%0D|%22|%27|%3C|%3E|%00).*(/\*|union|select|insert|cast|set|declare|drop|update|md5|benchmark) [NC,OR] | ||||
|  | ||||
| RewriteCond %{QUERY_STRING} \.\./\.\. [OR] | ||||
|  | ||||
| RewriteCond %{QUERY_STRING} (localhost|loopback|127\.0\.0\.1) [NC,OR] | ||||
| RewriteCond %{QUERY_STRING} \.[a-z0-9] [NC,OR] | ||||
| RewriteCond %{QUERY_STRING} (<|>|’|%0A|%0D|%27|%3C|%3E|%00) [NC] | ||||
| # Note: The final RewriteCond must NOT use the [OR] flag. | ||||
|  | ||||
| # Return 403 Forbidden error. | ||||
| RewriteRule .* index.php [F] | ||||
							
								
								
									
										470
									
								
								samples/ApacheConf/filenames/apache2.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										470
									
								
								samples/ApacheConf/filenames/apache2.conf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,470 @@ | ||||
| # This is the main Apache HTTP server configuration file.  It contains the | ||||
| # configuration directives that give the server its instructions. | ||||
| # See <URL:http://httpd.apache.org/docs/2.2> for detailed information. | ||||
| # In particular, see | ||||
| # <URL:http://httpd.apache.org/docs/2.2/mod/directives.html> | ||||
| # for a discussion of each configuration directive. | ||||
| # | ||||
| # Do NOT simply read the instructions in here without understanding | ||||
| # what they do.  They're here only as hints or reminders.  If you are unsure | ||||
| # consult the online docs. You have been warned. | ||||
| # | ||||
| # Configuration and logfile names: If the filenames you specify for many | ||||
| # of the server's control files begin with "/" (or "drive:/" for Win32), the | ||||
| # server will use that explicit path.  If the filenames do *not* begin | ||||
| # with "/", the value of ServerRoot is prepended -- so "/var/log/apache2/foo.log" | ||||
| # with ServerRoot set to "" will be interpreted by the | ||||
| # server as "//var/log/apache2/foo.log". | ||||
|  | ||||
| # | ||||
| # ServerRoot: The top of the directory tree under which the server's | ||||
| # configuration, error, and log files are kept. | ||||
| # | ||||
| # Do not add a slash at the end of the directory path.  If you point | ||||
| # ServerRoot at a non-local disk, be sure to point the LockFile directive | ||||
| # at a local disk.  If you wish to share the same ServerRoot for multiple | ||||
| # httpd daemons, you will need to change at least LockFile and PidFile. | ||||
| # | ||||
| ServerRoot "" | ||||
|  | ||||
| # | ||||
| # Listen: Allows you to bind Apache to specific IP addresses and/or | ||||
| # ports, instead of the default. See also the <VirtualHost> | ||||
| # directive. | ||||
| # | ||||
| # Change this to Listen on specific IP addresses as shown below to | ||||
| # prevent Apache from glomming onto all bound IP addresses. | ||||
| # | ||||
| #Listen 12.34.56.78:80 | ||||
| Listen 80 | ||||
|  | ||||
| # | ||||
| # Dynamic Shared Object (DSO) Support | ||||
| # | ||||
| # To be able to use the functionality of a module which was built as a DSO you | ||||
| # have to place corresponding `LoadModule' lines at this location so the | ||||
| # directives contained in it are actually available _before_ they are used. | ||||
| # Statically compiled modules (those listed by `httpd -l') do not need | ||||
| # to be loaded here. | ||||
| # | ||||
| # Example: | ||||
| # LoadModule foo_module modules/mod_foo.so | ||||
| # | ||||
| LoadModule authn_file_module /usr/lib/apache2/modules/mod_authn_file.so | ||||
| LoadModule authn_dbm_module /usr/lib/apache2/modules/mod_authn_dbm.so | ||||
| LoadModule authn_anon_module /usr/lib/apache2/modules/mod_authn_anon.so | ||||
| LoadModule authn_dbd_module /usr/lib/apache2/modules/mod_authn_dbd.so | ||||
| LoadModule authn_default_module /usr/lib/apache2/modules/mod_authn_default.so | ||||
| LoadModule authn_alias_module /usr/lib/apache2/modules/mod_authn_alias.so | ||||
| LoadModule authz_host_module /usr/lib/apache2/modules/mod_authz_host.so | ||||
| LoadModule authz_groupfile_module /usr/lib/apache2/modules/mod_authz_groupfile.so | ||||
| LoadModule authz_user_module /usr/lib/apache2/modules/mod_authz_user.so | ||||
| LoadModule authz_dbm_module /usr/lib/apache2/modules/mod_authz_dbm.so | ||||
| LoadModule authz_owner_module /usr/lib/apache2/modules/mod_authz_owner.so | ||||
| LoadModule authnz_ldap_module /usr/lib/apache2/modules/mod_authnz_ldap.so | ||||
| LoadModule authz_default_module /usr/lib/apache2/modules/mod_authz_default.so | ||||
| LoadModule auth_basic_module /usr/lib/apache2/modules/mod_auth_basic.so | ||||
| LoadModule auth_digest_module /usr/lib/apache2/modules/mod_auth_digest.so | ||||
| LoadModule file_cache_module /usr/lib/apache2/modules/mod_file_cache.so | ||||
| LoadModule cache_module /usr/lib/apache2/modules/mod_cache.so | ||||
| LoadModule disk_cache_module /usr/lib/apache2/modules/mod_disk_cache.so | ||||
| LoadModule mem_cache_module /usr/lib/apache2/modules/mod_mem_cache.so | ||||
| LoadModule dbd_module /usr/lib/apache2/modules/mod_dbd.so | ||||
| LoadModule dumpio_module /usr/lib/apache2/modules/mod_dumpio.so | ||||
| LoadModule ext_filter_module /usr/lib/apache2/modules/mod_ext_filter.so | ||||
| LoadModule include_module /usr/lib/apache2/modules/mod_include.so | ||||
| LoadModule filter_module /usr/lib/apache2/modules/mod_filter.so | ||||
| LoadModule charset_lite_module /usr/lib/apache2/modules/mod_charset_lite.so | ||||
| LoadModule deflate_module /usr/lib/apache2/modules/mod_deflate.so | ||||
| LoadModule ldap_module /usr/lib/apache2/modules/mod_ldap.so | ||||
| LoadModule log_forensic_module /usr/lib/apache2/modules/mod_log_forensic.so | ||||
| LoadModule env_module /usr/lib/apache2/modules/mod_env.so | ||||
| LoadModule mime_magic_module /usr/lib/apache2/modules/mod_mime_magic.so | ||||
| LoadModule cern_meta_module /usr/lib/apache2/modules/mod_cern_meta.so | ||||
| LoadModule expires_module /usr/lib/apache2/modules/mod_expires.so | ||||
| LoadModule headers_module /usr/lib/apache2/modules/mod_headers.so | ||||
| LoadModule ident_module /usr/lib/apache2/modules/mod_ident.so | ||||
| LoadModule usertrack_module /usr/lib/apache2/modules/mod_usertrack.so | ||||
| LoadModule unique_id_module /usr/lib/apache2/modules/mod_unique_id.so | ||||
| LoadModule setenvif_module /usr/lib/apache2/modules/mod_setenvif.so | ||||
| LoadModule version_module /usr/lib/apache2/modules/mod_version.so | ||||
| LoadModule proxy_module /usr/lib/apache2/modules/mod_proxy.so | ||||
| LoadModule proxy_connect_module /usr/lib/apache2/modules/mod_proxy_connect.so | ||||
| LoadModule proxy_ftp_module /usr/lib/apache2/modules/mod_proxy_ftp.so | ||||
| LoadModule proxy_http_module /usr/lib/apache2/modules/mod_proxy_http.so | ||||
| LoadModule proxy_ajp_module /usr/lib/apache2/modules/mod_proxy_ajp.so | ||||
| LoadModule proxy_balancer_module /usr/lib/apache2/modules/mod_proxy_balancer.so | ||||
| LoadModule ssl_module /usr/lib/apache2/modules/mod_ssl.so | ||||
| LoadModule mime_module /usr/lib/apache2/modules/mod_mime.so | ||||
| LoadModule dav_module /usr/lib/apache2/modules/mod_dav.so | ||||
| LoadModule status_module /usr/lib/apache2/modules/mod_status.so | ||||
| LoadModule autoindex_module /usr/lib/apache2/modules/mod_autoindex.so | ||||
| LoadModule asis_module /usr/lib/apache2/modules/mod_asis.so | ||||
| LoadModule info_module /usr/lib/apache2/modules/mod_info.so | ||||
| LoadModule suexec_module /usr/lib/apache2/modules/mod_suexec.so | ||||
| LoadModule cgid_module /usr/lib/apache2/modules/mod_cgid.so | ||||
| LoadModule cgi_module /usr/lib/apache2/modules/mod_cgi.so | ||||
| LoadModule dav_fs_module /usr/lib/apache2/modules/mod_dav_fs.so | ||||
| LoadModule dav_lock_module /usr/lib/apache2/modules/mod_dav_lock.so | ||||
| LoadModule vhost_alias_module /usr/lib/apache2/modules/mod_vhost_alias.so | ||||
| LoadModule negotiation_module /usr/lib/apache2/modules/mod_negotiation.so | ||||
| LoadModule dir_module /usr/lib/apache2/modules/mod_dir.so | ||||
| LoadModule imagemap_module /usr/lib/apache2/modules/mod_imagemap.so | ||||
| LoadModule actions_module /usr/lib/apache2/modules/mod_actions.so | ||||
| LoadModule speling_module /usr/lib/apache2/modules/mod_speling.so | ||||
| LoadModule userdir_module /usr/lib/apache2/modules/mod_userdir.so | ||||
| LoadModule alias_module /usr/lib/apache2/modules/mod_alias.so | ||||
| LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so | ||||
|  | ||||
| <IfModule !mpm_netware_module> | ||||
| # | ||||
| # If you wish httpd to run as a different user or group, you must run | ||||
| # httpd as root initially and it will switch. | ||||
| # | ||||
| # User/Group: The name (or #number) of the user/group to run httpd as. | ||||
| # It is usually good practice to create a dedicated user and group for | ||||
| # running httpd, as with most system services. | ||||
| # | ||||
| User daemon | ||||
| Group daemon | ||||
| </IfModule> | ||||
|  | ||||
| # 'Main' server configuration | ||||
| # | ||||
| # The directives in this section set up the values used by the 'main' | ||||
| # server, which responds to any requests that aren't handled by a | ||||
| # <VirtualHost> definition.  These values also provide defaults for | ||||
| # any <VirtualHost> containers you may define later in the file. | ||||
| # | ||||
| # All of these directives may appear inside <VirtualHost> containers, | ||||
| # in which case these default settings will be overridden for the | ||||
| # virtual host being defined. | ||||
| # | ||||
|  | ||||
| # | ||||
| # ServerAdmin: Your address, where problems with the server should be | ||||
| # e-mailed.  This address appears on some server-generated pages, such | ||||
| # as error documents.  e.g. admin@your-domain.com | ||||
| # | ||||
| ServerAdmin you@example.com | ||||
|  | ||||
| # | ||||
| # ServerName gives the name and port that the server uses to identify itself. | ||||
| # This can often be determined automatically, but we recommend you specify | ||||
| # it explicitly to prevent problems during startup. | ||||
| # | ||||
| # If your host doesn't have a registered DNS name, enter its IP address here. | ||||
| # | ||||
| #ServerName www.example.com:80 | ||||
|  | ||||
| # | ||||
| # DocumentRoot: The directory out of which you will serve your | ||||
| # documents. By default, all requests are taken from this directory, but | ||||
| # symbolic links and aliases may be used to point to other locations. | ||||
| # | ||||
| DocumentRoot "/usr/share/apache2/default-site/htdocs" | ||||
|  | ||||
| # | ||||
| # Each directory to which Apache has access can be configured with respect | ||||
| # to which services and features are allowed and/or disabled in that | ||||
| # directory (and its subdirectories). | ||||
| # | ||||
| # First, we configure the "default" to be a very restrictive set of | ||||
| # features. | ||||
| # | ||||
| <Directory /> | ||||
|     Options FollowSymLinks | ||||
|     AllowOverride None | ||||
|     Order deny,allow | ||||
|     Deny from all | ||||
| </Directory> | ||||
|  | ||||
| # | ||||
| # Note that from this point forward you must specifically allow | ||||
| # particular features to be enabled - so if something's not working as | ||||
| # you might expect, make sure that you have specifically enabled it | ||||
| # below. | ||||
| # | ||||
|  | ||||
| # | ||||
| # This should be changed to whatever you set DocumentRoot to. | ||||
| # | ||||
| <Directory "/usr/share/apache2/default-site/htdocs"> | ||||
|     # | ||||
|     # Possible values for the Options directive are "None", "All", | ||||
|     # or any combination of: | ||||
|     #   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews | ||||
|     # | ||||
|     # Note that "MultiViews" must be named *explicitly* --- "Options All" | ||||
|     # doesn't give it to you. | ||||
|     # | ||||
|     # The Options directive is both complicated and important.  Please see | ||||
|     # http://httpd.apache.org/docs/2.2/mod/core.html#options | ||||
|     # for more information. | ||||
|     # | ||||
|     Options Indexes FollowSymLinks | ||||
|  | ||||
|     # | ||||
|     # AllowOverride controls what directives may be placed in .htaccess files. | ||||
|     # It can be "All", "None", or any combination of the keywords: | ||||
|     #   Options FileInfo AuthConfig Limit | ||||
|     # | ||||
|     AllowOverride None | ||||
|  | ||||
|     # | ||||
|     # Controls who can get stuff from this server. | ||||
|     # | ||||
|     Order allow,deny | ||||
|     Allow from all | ||||
|  | ||||
| </Directory> | ||||
|  | ||||
| # | ||||
| # DirectoryIndex: sets the file that Apache will serve if a directory | ||||
| # is requested. | ||||
| # | ||||
| <IfModule dir_module> | ||||
|     DirectoryIndex index.html | ||||
| </IfModule> | ||||
|  | ||||
| # | ||||
| # The following lines prevent .htaccess and .htpasswd files from being | ||||
| # viewed by Web clients. | ||||
| # | ||||
| <FilesMatch "^\.ht"> | ||||
|     Order allow,deny | ||||
|     Deny from all | ||||
|     Satisfy All | ||||
| </FilesMatch> | ||||
|  | ||||
| # | ||||
| # ErrorLog: The location of the error log file. | ||||
| # If you do not specify an ErrorLog directive within a <VirtualHost> | ||||
| # container, error messages relating to that virtual host will be | ||||
| # logged here.  If you *do* define an error logfile for a <VirtualHost> | ||||
| # container, that host's errors will be logged there and not here. | ||||
| # | ||||
| ErrorLog /var/log/apache2/error_log | ||||
|  | ||||
| # | ||||
| # LogLevel: Control the number of messages logged to the error_log. | ||||
| # Possible values include: debug, info, notice, warn, error, crit, | ||||
| # alert, emerg. | ||||
| # | ||||
| LogLevel warn | ||||
|  | ||||
| <IfModule log_config_module> | ||||
|     # | ||||
|     # The following directives define some format nicknames for use with | ||||
|     # a CustomLog directive (see below). | ||||
|     # | ||||
|     LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined | ||||
|     LogFormat "%h %l %u %t \"%r\" %>s %b" common | ||||
|  | ||||
|     <IfModule logio_module> | ||||
|       # You need to enable mod_logio.c to use %I and %O | ||||
|       LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio | ||||
|     </IfModule> | ||||
|  | ||||
|     # | ||||
|     # The location and format of the access logfile (Common Logfile Format). | ||||
|     # If you do not define any access logfiles within a <VirtualHost> | ||||
|     # container, they will be logged here.  Contrariwise, if you *do* | ||||
|     # define per-<VirtualHost> access logfiles, transactions will be | ||||
|     # logged therein and *not* in this file. | ||||
|     # | ||||
|     CustomLog /var/log/apache2/access_log common | ||||
|  | ||||
|     # | ||||
|     # If you prefer a logfile with access, agent, and referer information | ||||
|     # (Combined Logfile Format) you can use the following directive. | ||||
|     # | ||||
|     #CustomLog /var/log/apache2/access_log combined | ||||
| </IfModule> | ||||
|  | ||||
| <IfModule alias_module> | ||||
|     # | ||||
|     # Redirect: Allows you to tell clients about documents that used to | ||||
|     # exist in your server's namespace, but do not anymore. The client | ||||
|     # will make a new request for the document at its new location. | ||||
|     # Example: | ||||
|     # Redirect permanent /foo http://www.example.com/bar | ||||
|  | ||||
|     # | ||||
|     # Alias: Maps web paths into filesystem paths and is used to | ||||
|     # access content that does not live under the DocumentRoot. | ||||
|     # Example: | ||||
|     # Alias /webpath /full/filesystem/path | ||||
|     # | ||||
|     # If you include a trailing / on /webpath then the server will | ||||
|     # require it to be present in the URL.  You will also likely | ||||
|     # need to provide a <Directory> section to allow access to | ||||
|     # the filesystem path. | ||||
|  | ||||
|     # | ||||
|     # ScriptAlias: This controls which directories contain server scripts. | ||||
|     # ScriptAliases are essentially the same as Aliases, except that | ||||
|     # documents in the target directory are treated as applications and | ||||
|     # run by the server when requested rather than as documents sent to the | ||||
|     # client.  The same rules about trailing "/" apply to ScriptAlias | ||||
|     # directives as to Alias. | ||||
|     # | ||||
|     ScriptAlias /cgi-bin/ "/usr/lib/cgi-bin/" | ||||
|  | ||||
| </IfModule> | ||||
|  | ||||
| <IfModule cgid_module> | ||||
|     # | ||||
|     # ScriptSock: On threaded servers, designate the path to the UNIX | ||||
|     # socket used to communicate with the CGI daemon of mod_cgid. | ||||
|     # | ||||
|     #Scriptsock /var/run/apache2/cgisock | ||||
| </IfModule> | ||||
|  | ||||
| # | ||||
| # "/usr/lib/cgi-bin" should be changed to whatever your ScriptAliased | ||||
| # CGI directory exists, if you have that configured. | ||||
| # | ||||
| <Directory "/usr/lib/cgi-bin"> | ||||
|     AllowOverride None | ||||
|     Options None | ||||
|     Order allow,deny | ||||
|     Allow from all | ||||
| </Directory> | ||||
|  | ||||
| # | ||||
| # DefaultType: the default MIME type the server will use for a document | ||||
| # if it cannot otherwise determine one, such as from filename extensions. | ||||
| # If your server contains mostly text or HTML documents, "text/plain" is | ||||
| # a good value.  If most of your content is binary, such as applications | ||||
| # or images, you may want to use "application/octet-stream" instead to | ||||
| # keep browsers from trying to display binary files as though they are | ||||
| # text. | ||||
| # | ||||
| DefaultType text/plain | ||||
|  | ||||
| <IfModule mime_module> | ||||
|     # | ||||
|     # TypesConfig points to the file containing the list of mappings from | ||||
|     # filename extension to MIME-type. | ||||
|     # | ||||
|     TypesConfig /etc/apache2/mime.types | ||||
|  | ||||
|     # | ||||
|     # AddType allows you to add to or override the MIME configuration | ||||
|     # file specified in TypesConfig for specific file types. | ||||
|     # | ||||
|     #AddType application/x-gzip .tgz | ||||
|     # | ||||
|     # AddEncoding allows you to have certain browsers uncompress | ||||
|     # information on the fly. Note: Not all browsers support this. | ||||
|     # | ||||
|     #AddEncoding x-compress .Z | ||||
|     #AddEncoding x-gzip .gz .tgz | ||||
|     # | ||||
|     # If the AddEncoding directives above are commented-out, then you | ||||
|     # probably should define those extensions to indicate media types: | ||||
|     # | ||||
|     AddType application/x-compress .Z | ||||
|     AddType application/x-gzip .gz .tgz | ||||
|  | ||||
|     # | ||||
|     # AddHandler allows you to map certain file extensions to "handlers": | ||||
|     # actions unrelated to filetype. These can be either built into the server | ||||
|     # or added with the Action directive (see below) | ||||
|     # | ||||
|     # To use CGI scripts outside of ScriptAliased directories: | ||||
|     # (You will also need to add "ExecCGI" to the "Options" directive.) | ||||
|     # | ||||
|     #AddHandler cgi-script .cgi | ||||
|  | ||||
|     # For type maps (negotiated resources): | ||||
|     #AddHandler type-map var | ||||
|  | ||||
|     # | ||||
|     # Filters allow you to process content before it is sent to the client. | ||||
|     # | ||||
|     # To parse .shtml files for server-side includes (SSI): | ||||
|     # (You will also need to add "Includes" to the "Options" directive.) | ||||
|     # | ||||
|     #AddType text/html .shtml | ||||
|     #AddOutputFilter INCLUDES .shtml | ||||
| </IfModule> | ||||
|  | ||||
| # | ||||
| # The mod_mime_magic module allows the server to use various hints from the | ||||
| # contents of the file itself to determine its type.  The MIMEMagicFile | ||||
| # directive tells the module where the hint definitions are located. | ||||
| # | ||||
| #MIMEMagicFile /etc/apache2/magic | ||||
|  | ||||
| # | ||||
| # Customizable error responses come in three flavors: | ||||
| # 1) plain text 2) local redirects 3) external redirects | ||||
| # | ||||
| # Some examples: | ||||
| #ErrorDocument 500 "The server made a boo boo." | ||||
| #ErrorDocument 404 /missing.html | ||||
| #ErrorDocument 404 "/cgi-bin/missing_handler.pl" | ||||
| #ErrorDocument 402 http://www.example.com/subscription_info.html | ||||
| # | ||||
|  | ||||
| # | ||||
| # EnableMMAP and EnableSendfile: On systems that support it, | ||||
| # memory-mapping or the sendfile syscall is used to deliver | ||||
| # files.  This usually improves server performance, but must | ||||
| # be turned off when serving from networked-mounted | ||||
| # filesystems or if support for these functions is otherwise | ||||
| # broken on your system. | ||||
| # | ||||
| #EnableMMAP off | ||||
| #EnableSendfile off | ||||
|  | ||||
| # Supplemental configuration | ||||
| # | ||||
| # The configuration files in the /etc/apache2/extra/ directory can be | ||||
| # included to add extra features or to modify the default configuration of | ||||
| # the server, or you may simply copy their contents here and change as | ||||
| # necessary. | ||||
|  | ||||
| # Server-pool management (MPM specific) | ||||
| #Include /etc/apache2/extra/httpd-mpm.conf | ||||
|  | ||||
| # Multi-language error messages | ||||
| #Include /etc/apache2/extra/httpd-multilang-errordoc.conf | ||||
|  | ||||
| # Fancy directory listings | ||||
| #Include /etc/apache2/extra/httpd-autoindex.conf | ||||
|  | ||||
| # Language settings | ||||
| #Include /etc/apache2/extra/httpd-languages.conf | ||||
|  | ||||
| # User home directories | ||||
| #Include /etc/apache2/extra/httpd-userdir.conf | ||||
|  | ||||
| # Real-time info on requests and configuration | ||||
| #Include /etc/apache2/extra/httpd-info.conf | ||||
|  | ||||
| # Virtual hosts | ||||
| #Include /etc/apache2/extra/httpd-vhosts.conf | ||||
|  | ||||
| # Local access to the Apache HTTP Server Manual | ||||
| #Include /etc/apache2/extra/httpd-manual.conf | ||||
|  | ||||
| # Distributed authoring and versioning (WebDAV) | ||||
| #Include /etc/apache2/extra/httpd-dav.conf | ||||
|  | ||||
| # Various default settings | ||||
| #Include /etc/apache2/extra/httpd-default.conf | ||||
|  | ||||
| # Secure (SSL/TLS) connections | ||||
| #Include /etc/apache2/extra/httpd-ssl.conf | ||||
| # | ||||
| # Note: The following must must be present to support | ||||
| #       starting without SSL on platforms with no /dev/random equivalent | ||||
| #       but a statically compiled-in mod_ssl. | ||||
| # | ||||
| <IfModule ssl_module> | ||||
| SSLRandomSeed startup builtin | ||||
| SSLRandomSeed connect builtin | ||||
| </IfModule> | ||||
							
								
								
									
										500
									
								
								samples/ApacheConf/filenames/httpd.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										500
									
								
								samples/ApacheConf/filenames/httpd.conf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,500 @@ | ||||
| # | ||||
| # This is the main Apache HTTP server configuration file.  It contains the | ||||
| # configuration directives that give the server its instructions. | ||||
| # See <URL:http://httpd.apache.org/docs/2.2> for detailed information. | ||||
| # In particular, see  | ||||
| # <URL:http://httpd.apache.org/docs/2.2/mod/directives.html> | ||||
| # for a discussion of each configuration directive. | ||||
| # | ||||
| # Do NOT simply read the instructions in here without understanding | ||||
| # what they do.  They're here only as hints or reminders.  If you are unsure | ||||
| # consult the online docs. You have been warned.   | ||||
| # | ||||
| # Configuration and logfile names: If the filenames you specify for many | ||||
| # of the server's control files begin with "/" (or "drive:/" for Win32), the | ||||
| # server will use that explicit path.  If the filenames do *not* begin | ||||
| # with "/", the value of ServerRoot is prepended -- so "log/foo_log" | ||||
| # with ServerRoot set to "/usr" will be interpreted by the | ||||
| # server as "/usr/log/foo_log". | ||||
|  | ||||
| # | ||||
| # ServerRoot: The top of the directory tree under which the server's | ||||
| # configuration, error, and log files are kept. | ||||
| # | ||||
| # Do not add a slash at the end of the directory path.  If you point | ||||
| # ServerRoot at a non-local disk, be sure to point the LockFile directive | ||||
| # at a local disk.  If you wish to share the same ServerRoot for multiple | ||||
| # httpd daemons, you will need to change at least LockFile and PidFile. | ||||
| # | ||||
| ServerRoot "/usr" | ||||
|  | ||||
| # | ||||
| # Listen: Allows you to bind Apache to specific IP addresses and/or | ||||
| # ports, instead of the default. See also the <VirtualHost> | ||||
| # directive. | ||||
| # | ||||
| # Change this to Listen on specific IP addresses as shown below to  | ||||
| # prevent Apache from glomming onto all bound IP addresses. | ||||
| # | ||||
| #Listen 12.34.56.78:80 | ||||
| Listen 80 | ||||
|  | ||||
| # | ||||
| # Dynamic Shared Object (DSO) Support | ||||
| # | ||||
| # To be able to use the functionality of a module which was built as a DSO you | ||||
| # have to place corresponding `LoadModule' lines at this location so the | ||||
| # directives contained in it are actually available _before_ they are used. | ||||
| # Statically compiled modules (those listed by `httpd -l') do not need | ||||
| # to be loaded here. | ||||
| # | ||||
| # Example: | ||||
| # LoadModule foo_module modules/mod_foo.so | ||||
| # | ||||
| LoadModule authn_file_module libexec/apache2/mod_authn_file.so | ||||
| LoadModule authn_dbm_module libexec/apache2/mod_authn_dbm.so | ||||
| LoadModule authn_anon_module libexec/apache2/mod_authn_anon.so | ||||
| LoadModule authn_dbd_module libexec/apache2/mod_authn_dbd.so | ||||
| LoadModule authn_default_module libexec/apache2/mod_authn_default.so | ||||
| LoadModule authz_host_module libexec/apache2/mod_authz_host.so | ||||
| LoadModule authz_groupfile_module libexec/apache2/mod_authz_groupfile.so | ||||
| LoadModule authz_user_module libexec/apache2/mod_authz_user.so | ||||
| LoadModule authz_dbm_module libexec/apache2/mod_authz_dbm.so | ||||
| LoadModule authz_owner_module libexec/apache2/mod_authz_owner.so | ||||
| LoadModule authz_default_module libexec/apache2/mod_authz_default.so | ||||
| LoadModule auth_basic_module libexec/apache2/mod_auth_basic.so | ||||
| LoadModule auth_digest_module libexec/apache2/mod_auth_digest.so | ||||
| LoadModule cache_module libexec/apache2/mod_cache.so | ||||
| LoadModule disk_cache_module libexec/apache2/mod_disk_cache.so | ||||
| LoadModule mem_cache_module libexec/apache2/mod_mem_cache.so | ||||
| LoadModule dbd_module libexec/apache2/mod_dbd.so | ||||
| LoadModule dumpio_module libexec/apache2/mod_dumpio.so | ||||
| LoadModule reqtimeout_module libexec/apache2/mod_reqtimeout.so | ||||
| LoadModule ext_filter_module libexec/apache2/mod_ext_filter.so | ||||
| LoadModule include_module libexec/apache2/mod_include.so | ||||
| LoadModule filter_module libexec/apache2/mod_filter.so | ||||
| LoadModule substitute_module libexec/apache2/mod_substitute.so | ||||
| LoadModule deflate_module libexec/apache2/mod_deflate.so | ||||
| LoadModule log_config_module libexec/apache2/mod_log_config.so | ||||
| LoadModule log_forensic_module libexec/apache2/mod_log_forensic.so | ||||
| LoadModule logio_module libexec/apache2/mod_logio.so | ||||
| LoadModule env_module libexec/apache2/mod_env.so | ||||
| LoadModule mime_magic_module libexec/apache2/mod_mime_magic.so | ||||
| LoadModule cern_meta_module libexec/apache2/mod_cern_meta.so | ||||
| LoadModule expires_module libexec/apache2/mod_expires.so | ||||
| LoadModule headers_module libexec/apache2/mod_headers.so | ||||
| LoadModule ident_module libexec/apache2/mod_ident.so | ||||
| LoadModule usertrack_module libexec/apache2/mod_usertrack.so | ||||
| #LoadModule unique_id_module libexec/apache2/mod_unique_id.so | ||||
| LoadModule setenvif_module libexec/apache2/mod_setenvif.so | ||||
| LoadModule version_module libexec/apache2/mod_version.so | ||||
| LoadModule proxy_module libexec/apache2/mod_proxy.so | ||||
| LoadModule proxy_connect_module libexec/apache2/mod_proxy_connect.so | ||||
| LoadModule proxy_ftp_module libexec/apache2/mod_proxy_ftp.so | ||||
| LoadModule proxy_http_module libexec/apache2/mod_proxy_http.so | ||||
| LoadModule proxy_scgi_module libexec/apache2/mod_proxy_scgi.so | ||||
| LoadModule proxy_ajp_module libexec/apache2/mod_proxy_ajp.so | ||||
| LoadModule proxy_balancer_module libexec/apache2/mod_proxy_balancer.so | ||||
| LoadModule ssl_module libexec/apache2/mod_ssl.so | ||||
| LoadModule mime_module libexec/apache2/mod_mime.so | ||||
| LoadModule dav_module libexec/apache2/mod_dav.so | ||||
| LoadModule status_module libexec/apache2/mod_status.so | ||||
| LoadModule autoindex_module libexec/apache2/mod_autoindex.so | ||||
| LoadModule asis_module libexec/apache2/mod_asis.so | ||||
| LoadModule info_module libexec/apache2/mod_info.so | ||||
| LoadModule cgi_module libexec/apache2/mod_cgi.so | ||||
| LoadModule dav_fs_module libexec/apache2/mod_dav_fs.so | ||||
| LoadModule vhost_alias_module libexec/apache2/mod_vhost_alias.so | ||||
| LoadModule negotiation_module libexec/apache2/mod_negotiation.so | ||||
| LoadModule dir_module libexec/apache2/mod_dir.so | ||||
| LoadModule imagemap_module libexec/apache2/mod_imagemap.so | ||||
| LoadModule actions_module libexec/apache2/mod_actions.so | ||||
| LoadModule speling_module libexec/apache2/mod_speling.so | ||||
| LoadModule userdir_module libexec/apache2/mod_userdir.so | ||||
| LoadModule alias_module libexec/apache2/mod_alias.so | ||||
| LoadModule rewrite_module libexec/apache2/mod_rewrite.so | ||||
| #LoadModule perl_module libexec/apache2/mod_perl.so | ||||
| #LoadModule php5_module libexec/apache2/libphp5.so | ||||
| #LoadModule hfs_apple_module libexec/apache2/mod_hfs_apple.so | ||||
|  | ||||
| <IfModule !mpm_netware_module> | ||||
| <IfModule !mpm_winnt_module> | ||||
| # | ||||
| # If you wish httpd to run as a different user or group, you must run | ||||
| # httpd as root initially and it will switch.   | ||||
| # | ||||
| # User/Group: The name (or #number) of the user/group to run httpd as. | ||||
| # It is usually good practice to create a dedicated user and group for | ||||
| # running httpd, as with most system services. | ||||
| # | ||||
| User _www | ||||
| Group _www | ||||
|  | ||||
| </IfModule> | ||||
| </IfModule> | ||||
|  | ||||
| # 'Main' server configuration | ||||
| # | ||||
| # The directives in this section set up the values used by the 'main' | ||||
| # server, which responds to any requests that aren't handled by a | ||||
| # <VirtualHost> definition.  These values also provide defaults for | ||||
| # any <VirtualHost> containers you may define later in the file. | ||||
| # | ||||
| # All of these directives may appear inside <VirtualHost> containers, | ||||
| # in which case these default settings will be overridden for the | ||||
| # virtual host being defined. | ||||
| # | ||||
|  | ||||
| # | ||||
| # ServerAdmin: Your address, where problems with the server should be | ||||
| # e-mailed.  This address appears on some server-generated pages, such | ||||
| # as error documents.  e.g. admin@your-domain.com | ||||
| # | ||||
| ServerAdmin you@example.com | ||||
|  | ||||
| # | ||||
| # ServerName gives the name and port that the server uses to identify itself. | ||||
| # This can often be determined automatically, but we recommend you specify | ||||
| # it explicitly to prevent problems during startup. | ||||
| # | ||||
| # If your host doesn't have a registered DNS name, enter its IP address here. | ||||
| # | ||||
| #ServerName www.example.com:80 | ||||
|  | ||||
| # | ||||
| # DocumentRoot: The directory out of which you will serve your | ||||
| # documents. By default, all requests are taken from this directory, but | ||||
| # symbolic links and aliases may be used to point to other locations. | ||||
| # | ||||
| DocumentRoot "/Library/WebServer/Documents" | ||||
|  | ||||
| # | ||||
| # Each directory to which Apache has access can be configured with respect | ||||
| # to which services and features are allowed and/or disabled in that | ||||
| # directory (and its subdirectories).  | ||||
| # | ||||
| # First, we configure the "default" to be a very restrictive set of  | ||||
| # features.   | ||||
| # | ||||
| <Directory /> | ||||
|     Options FollowSymLinks | ||||
|     AllowOverride None | ||||
|     Order deny,allow | ||||
|     Deny from all | ||||
| </Directory> | ||||
|  | ||||
| # | ||||
| # Note that from this point forward you must specifically allow | ||||
| # particular features to be enabled - so if something's not working as | ||||
| # you might expect, make sure that you have specifically enabled it | ||||
| # below. | ||||
| # | ||||
|  | ||||
| # | ||||
| # This should be changed to whatever you set DocumentRoot to. | ||||
| # | ||||
| <Directory "/Library/WebServer/Documents"> | ||||
|     # | ||||
|     # Possible values for the Options directive are "None", "All", | ||||
|     # or any combination of: | ||||
|     #   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews | ||||
|     # | ||||
|     # Note that "MultiViews" must be named *explicitly* --- "Options All" | ||||
|     # doesn't give it to you. | ||||
|     # | ||||
|     # The Options directive is both complicated and important.  Please see | ||||
|     # http://httpd.apache.org/docs/2.2/mod/core.html#options | ||||
|     # for more information. | ||||
|     # | ||||
|     Options Indexes FollowSymLinks MultiViews | ||||
|  | ||||
|     # | ||||
|     # AllowOverride controls what directives may be placed in .htaccess files. | ||||
|     # It can be "All", "None", or any combination of the keywords: | ||||
|     #   Options FileInfo AuthConfig Limit | ||||
|     # | ||||
|     AllowOverride None | ||||
|  | ||||
|     # | ||||
|     # Controls who can get stuff from this server. | ||||
|     # | ||||
|     Order allow,deny | ||||
|     Allow from all | ||||
|  | ||||
| </Directory> | ||||
|  | ||||
| # | ||||
| # DirectoryIndex: sets the file that Apache will serve if a directory | ||||
| # is requested. | ||||
| # | ||||
| <IfModule dir_module> | ||||
|     DirectoryIndex index.html | ||||
| </IfModule> | ||||
|  | ||||
| # | ||||
| # The following lines prevent .htaccess and .htpasswd files from being  | ||||
| # viewed by Web clients.  | ||||
| # | ||||
| <FilesMatch "^\.([Hh][Tt]|[Dd][Ss]_[Ss])"> | ||||
|     Order allow,deny | ||||
|     Deny from all | ||||
|     Satisfy All | ||||
| </FilesMatch> | ||||
|  | ||||
| # | ||||
| # Apple specific filesystem protection. | ||||
| # | ||||
| <Files "rsrc"> | ||||
|     Order allow,deny | ||||
|     Deny from all | ||||
|     Satisfy All | ||||
| </Files> | ||||
| <DirectoryMatch ".*\.\.namedfork"> | ||||
|     Order allow,deny | ||||
|     Deny from all | ||||
|     Satisfy All | ||||
| </DirectoryMatch> | ||||
|  | ||||
| # | ||||
| # ErrorLog: The location of the error log file. | ||||
| # If you do not specify an ErrorLog directive within a <VirtualHost> | ||||
| # container, error messages relating to that virtual host will be | ||||
| # logged here.  If you *do* define an error logfile for a <VirtualHost> | ||||
| # container, that host's errors will be logged there and not here. | ||||
| # | ||||
| ErrorLog "/private/var/log/apache2/error_log" | ||||
|  | ||||
| # | ||||
| # LogLevel: Control the number of messages logged to the error_log. | ||||
| # Possible values include: debug, info, notice, warn, error, crit, | ||||
| # alert, emerg. | ||||
| # | ||||
| LogLevel warn | ||||
|  | ||||
| <IfModule log_config_module> | ||||
|     # | ||||
|     # The following directives define some format nicknames for use with | ||||
|     # a CustomLog directive (see below). | ||||
|     # | ||||
|     LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined | ||||
|     LogFormat "%h %l %u %t \"%r\" %>s %b" common | ||||
|  | ||||
|     <IfModule logio_module> | ||||
|       # You need to enable mod_logio.c to use %I and %O | ||||
|       LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio | ||||
|     </IfModule> | ||||
|  | ||||
|     # | ||||
|     # The location and format of the access logfile (Common Logfile Format). | ||||
|     # If you do not define any access logfiles within a <VirtualHost> | ||||
|     # container, they will be logged here.  Contrariwise, if you *do* | ||||
|     # define per-<VirtualHost> access logfiles, transactions will be | ||||
|     # logged therein and *not* in this file. | ||||
|     # | ||||
|     CustomLog "/private/var/log/apache2/access_log" common | ||||
|  | ||||
|     # | ||||
|     # If you prefer a logfile with access, agent, and referer information | ||||
|     # (Combined Logfile Format) you can use the following directive. | ||||
|     # | ||||
|     #CustomLog "/private/var/log/apache2/access_log" combined | ||||
| </IfModule> | ||||
|  | ||||
| <IfModule alias_module> | ||||
|     # | ||||
|     # Redirect: Allows you to tell clients about documents that used to  | ||||
|     # exist in your server's namespace, but do not anymore. The client  | ||||
|     # will make a new request for the document at its new location. | ||||
|     # Example: | ||||
|     # Redirect permanent /foo http://www.example.com/bar | ||||
|  | ||||
|     # | ||||
|     # Alias: Maps web paths into filesystem paths and is used to | ||||
|     # access content that does not live under the DocumentRoot. | ||||
|     # Example: | ||||
|     # Alias /webpath /full/filesystem/path | ||||
|     # | ||||
|     # If you include a trailing / on /webpath then the server will | ||||
|     # require it to be present in the URL.  You will also likely | ||||
|     # need to provide a <Directory> section to allow access to | ||||
|     # the filesystem path. | ||||
|  | ||||
|     # | ||||
|     # ScriptAlias: This controls which directories contain server scripts.  | ||||
|     # ScriptAliases are essentially the same as Aliases, except that | ||||
|     # documents in the target directory are treated as applications and | ||||
|     # run by the server when requested rather than as documents sent to the | ||||
|     # client.  The same rules about trailing "/" apply to ScriptAlias | ||||
|     # directives as to Alias. | ||||
|     # | ||||
|     ScriptAliasMatch ^/cgi-bin/((?!(?i:webobjects)).*$) "/Library/WebServer/CGI-Executables/$1" | ||||
|  | ||||
| </IfModule> | ||||
|  | ||||
| <IfModule cgid_module> | ||||
|     # | ||||
|     # ScriptSock: On threaded servers, designate the path to the UNIX | ||||
|     # socket used to communicate with the CGI daemon of mod_cgid. | ||||
|     # | ||||
|     #Scriptsock /private/var/run/cgisock | ||||
| </IfModule> | ||||
|  | ||||
| # | ||||
| # "/Library/WebServer/CGI-Executables" should be changed to whatever your ScriptAliased | ||||
| # CGI directory exists, if you have that configured. | ||||
| # | ||||
| <Directory "/Library/WebServer/CGI-Executables"> | ||||
|     AllowOverride None | ||||
|     Options None | ||||
|     Order allow,deny | ||||
|     Allow from all | ||||
| </Directory> | ||||
|  | ||||
| # | ||||
| # DefaultType: the default MIME type the server will use for a document | ||||
| # if it cannot otherwise determine one, such as from filename extensions. | ||||
| # If your server contains mostly text or HTML documents, "text/plain" is | ||||
| # a good value.  If most of your content is binary, such as applications | ||||
| # or images, you may want to use "application/octet-stream" instead to | ||||
| # keep browsers from trying to display binary files as though they are | ||||
| # text. | ||||
| # | ||||
| DefaultType text/plain | ||||
|  | ||||
| <IfModule mime_module> | ||||
|     # | ||||
|     # TypesConfig points to the file containing the list of mappings from | ||||
|     # filename extension to MIME-type. | ||||
|     # | ||||
|     TypesConfig /private/etc/apache2/mime.types | ||||
|  | ||||
|     # | ||||
|     # AddType allows you to add to or override the MIME configuration | ||||
|     # file specified in TypesConfig for specific file types. | ||||
|     # | ||||
|     #AddType application/x-gzip .tgz | ||||
|     # | ||||
|     # AddEncoding allows you to have certain browsers uncompress | ||||
|     # information on the fly. Note: Not all browsers support this. | ||||
|     # | ||||
|     #AddEncoding x-compress .Z | ||||
|     #AddEncoding x-gzip .gz .tgz | ||||
|     # | ||||
|     # If the AddEncoding directives above are commented-out, then you | ||||
|     # probably should define those extensions to indicate media types: | ||||
|     # | ||||
|     AddType application/x-compress .Z | ||||
|     AddType application/x-gzip .gz .tgz | ||||
|  | ||||
|     # | ||||
|     # AddHandler allows you to map certain file extensions to "handlers": | ||||
|     # actions unrelated to filetype. These can be either built into the server | ||||
|     # or added with the Action directive (see below) | ||||
|     # | ||||
|     # To use CGI scripts outside of ScriptAliased directories: | ||||
|     # (You will also need to add "ExecCGI" to the "Options" directive.) | ||||
|     # | ||||
|     #AddHandler cgi-script .cgi | ||||
|  | ||||
|     # For type maps (negotiated resources): | ||||
|     #AddHandler type-map var | ||||
|  | ||||
|     # | ||||
|     # Filters allow you to process content before it is sent to the client. | ||||
|     # | ||||
|     # To parse .shtml files for server-side includes (SSI): | ||||
|     # (You will also need to add "Includes" to the "Options" directive.) | ||||
|     # | ||||
|     #AddType text/html .shtml | ||||
|     #AddOutputFilter INCLUDES .shtml | ||||
| </IfModule> | ||||
|  | ||||
| # | ||||
| # The mod_mime_magic module allows the server to use various hints from the | ||||
| # contents of the file itself to determine its type.  The MIMEMagicFile | ||||
| # directive tells the module where the hint definitions are located. | ||||
| # | ||||
| #MIMEMagicFile /private/etc/apache2/magic | ||||
|  | ||||
| # | ||||
| # Customizable error responses come in three flavors: | ||||
| # 1) plain text 2) local redirects 3) external redirects | ||||
| # | ||||
| # Some examples: | ||||
| #ErrorDocument 500 "The server made a boo boo." | ||||
| #ErrorDocument 404 /missing.html | ||||
| #ErrorDocument 404 "/cgi-bin/missing_handler.pl" | ||||
| #ErrorDocument 402 http://www.example.com/subscription_info.html | ||||
| # | ||||
|  | ||||
| # | ||||
| # MaxRanges: Maximum number of Ranges in a request before | ||||
| # returning the entire resource, or one of the special | ||||
| # values 'default', 'none' or 'unlimited'. | ||||
| # Default setting is to accept 200 Ranges. | ||||
| #MaxRanges unlimited | ||||
|  | ||||
| # | ||||
| # EnableMMAP and EnableSendfile: On systems that support it,  | ||||
| # memory-mapping or the sendfile syscall is used to deliver | ||||
| # files.  This usually improves server performance, but must | ||||
| # be turned off when serving from networked-mounted  | ||||
| # filesystems or if support for these functions is otherwise | ||||
| # broken on your system. | ||||
| # | ||||
| #EnableMMAP off | ||||
| #EnableSendfile off | ||||
|  | ||||
| # 6894961 | ||||
| TraceEnable off | ||||
|  | ||||
| # Supplemental configuration | ||||
| # | ||||
| # The configuration files in the /private/etc/apache2/extra/ directory can be  | ||||
| # included to add extra features or to modify the default configuration of  | ||||
| # the server, or you may simply copy their contents here and change as  | ||||
| # necessary. | ||||
|  | ||||
| # Server-pool management (MPM specific) | ||||
| Include /private/etc/apache2/extra/httpd-mpm.conf | ||||
|  | ||||
| # Multi-language error messages | ||||
| #Include /private/etc/apache2/extra/httpd-multilang-errordoc.conf | ||||
|  | ||||
| # Fancy directory listings | ||||
| Include /private/etc/apache2/extra/httpd-autoindex.conf | ||||
|  | ||||
| # Language settings | ||||
| Include /private/etc/apache2/extra/httpd-languages.conf | ||||
|  | ||||
| # User home directories | ||||
| Include /private/etc/apache2/extra/httpd-userdir.conf | ||||
|  | ||||
| # Real-time info on requests and configuration | ||||
| #Include /private/etc/apache2/extra/httpd-info.conf | ||||
|  | ||||
| # Virtual hosts | ||||
| #Include /private/etc/apache2/extra/httpd-vhosts.conf | ||||
|  | ||||
| # Local access to the Apache HTTP Server Manual | ||||
| Include /private/etc/apache2/extra/httpd-manual.conf | ||||
|  | ||||
| # Distributed authoring and versioning (WebDAV) | ||||
| #Include /private/etc/apache2/extra/httpd-dav.conf | ||||
|  | ||||
| # Various default settings | ||||
| #Include /private/etc/apache2/extra/httpd-default.conf | ||||
|  | ||||
| # Secure (SSL/TLS) connections | ||||
| #Include /private/etc/apache2/extra/httpd-ssl.conf | ||||
| # | ||||
| # Note: The following must must be present to support | ||||
| #       starting without SSL on platforms with no /dev/random equivalent | ||||
| #       but a statically compiled-in mod_ssl. | ||||
| # | ||||
| <IfModule ssl_module> | ||||
| SSLRandomSeed startup builtin | ||||
| SSLRandomSeed connect builtin | ||||
| </IfModule> | ||||
|  | ||||
| Include /private/etc/apache2/other/*.conf | ||||
							
								
								
									
										87
									
								
								samples/AppleScript/Convert To PDF.applescript
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										87
									
								
								samples/AppleScript/Convert To PDF.applescript
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,87 @@ | ||||
| (* | ||||
| Copyright 2003 Apple Computer, Inc. | ||||
|  | ||||
| You may incorporate this Apple sample code into your program(s) without | ||||
| restriction.  This Apple sample code has been provided "AS IS" and the | ||||
| responsibility for its operation is yours.  You are not permitted to | ||||
| redistribute this Apple sample code as "Apple sample code" after having | ||||
| made changes.  If you're going to redistribute the code, we require | ||||
| that you make it clear that the code was descended from Apple sample | ||||
| code, but that you've made changes. | ||||
| *) | ||||
|  | ||||
| property type_list : {"JPEG", "GIFf", "PICT", "TIFF", "PDF", "TEXT"} | ||||
| property extension_list : {"jpg", "gif", "pct", "tif", "pdf", "rtf"} | ||||
| --html is not currently handled | ||||
|  | ||||
| on run {} | ||||
| 	tell application "Finder" to set FinderSelection to the selection as alias list | ||||
| 	 | ||||
| 	set FS to FinderSelection | ||||
| 	--Ideally, this list could be passed to the open handler | ||||
| 	 | ||||
| 	set SelectionCount to number of FS -- count	 | ||||
| 	if SelectionCount is 0 then | ||||
| 		set FS to userPicksFolder() | ||||
| 	else if the SelectionCount is 1 then | ||||
| 		set MyPath to path to me | ||||
| 		if MyPath is item 1 of FS then | ||||
| 			--If I'm a droplet then I was double-clicked | ||||
| 			set FS to userPicksFolder() | ||||
| 		end if | ||||
| 	else | ||||
| 		--I'm not a double-clicked droplet | ||||
| 	end if | ||||
| 	open FS | ||||
| end run | ||||
|  | ||||
| on userPicksFolder() | ||||
| 	set these_items to {} | ||||
| 	set these_items to (choose file with prompt "Select a file to convert to PDF:" of type {"JPEG", "GIFf", "PICT", "TIFF", "TEXT", "RTF"}) as list | ||||
| end userPicksFolder | ||||
|  | ||||
| on open these_items | ||||
| 	set thesefiles to {} | ||||
| 	set the item_info to {} | ||||
| 	repeat with i from 1 to the count of these_items | ||||
| 		set this_item to (item i of these_items) | ||||
| 		set the item_info to info for this_item | ||||
| 		 | ||||
| 		if folder of the item_info is true then --if the item is a folder | ||||
| 			processFolder(this_item) | ||||
| 		else if ((folder of the item_info is false) and (alias of the item_info is false)) and (the file type of the item_info is in the type_list) or ((the name extension of the item_info) is in the extension_list) then | ||||
| 			 | ||||
| 			set theFilePath to (item i of these_items as string) | ||||
| 			set thePOSIXFilePath to POSIX path of theFilePath as string | ||||
| 			processFile(thePOSIXFilePath) | ||||
| 		end if | ||||
| 	end repeat | ||||
| end open | ||||
|  | ||||
| --process folders  | ||||
| on processFolder(theFolder) | ||||
| 	set these_items to list folder theFolder without invisibles | ||||
| 	repeat with i from 1 to the count of these_items | ||||
| 		set this_item to alias ((theFolder as text) & (item i of these_items)) | ||||
| 		set the item_info to info for this_item | ||||
| 		if folder of the item_info is true then | ||||
| 			processFolder(this_item) | ||||
| 		else if (alias of the item_info is false) and ((the file type of the item_info is in the type_list) or the name extension of the item_info is in the extension_list) then | ||||
| 			set theFilePath to (this_item as string) | ||||
| 			set thePOSIXFilePath to POSIX path of theFilePath as string | ||||
| 			processFile(thePOSIXFilePath) | ||||
| 		end if | ||||
| 	end repeat | ||||
| end processFolder | ||||
|  | ||||
| on processFile(thePOSIXFileName) | ||||
| 	try | ||||
| 		set terminalCommand to "" | ||||
| 		set convertCommand to "/System/Library/Printers/Libraries/./convert " | ||||
| 		set newFileName to thePOSIXFileName & ".pdf" | ||||
| 		set terminalCommand to convertCommand & "-f " & "\"" & thePOSIXFileName & "\"" & " -o " & "\"" & newFileName & "\"" & " -j \"application/pdf\"" | ||||
| 		 | ||||
| 		do shell script terminalCommand | ||||
| 	end try | ||||
| end processFile | ||||
|  | ||||
							
								
								
									
										91
									
								
								samples/AppleScript/Convert To PostScript.applescript
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										91
									
								
								samples/AppleScript/Convert To PostScript.applescript
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,91 @@ | ||||
| (* | ||||
|  | ||||
| Copyright 2003 Apple Computer, Inc. | ||||
|  | ||||
| You may incorporate this Apple sample code into your program(s) without | ||||
| restriction.  This Apple sample code has been provided "AS IS" and the | ||||
| responsibility for its operation is yours.  You are not permitted to | ||||
| redistribute this Apple sample code as "Apple sample code" after having | ||||
| made changes.  If you're going to redistribute the code, we require | ||||
| that you make it clear that the code was descended from Apple sample | ||||
| code, but that you've made changes. | ||||
| *) | ||||
|  | ||||
| property type_list : {"JPEG", "GIFf", "PICT", "TIFF", "PDF", "TEXT"} | ||||
| property extension_list : {"jpg", "gif", "pct", "tif", "pdf", "rtf"} | ||||
| --html is not currently handled | ||||
|  | ||||
| on run {} | ||||
| 	tell application "Finder" to set FinderSelection to the selection as alias list | ||||
| 	 | ||||
| 	set FS to FinderSelection | ||||
| 	--Ideally, this list could be passed to the open handler | ||||
| 	 | ||||
| 	set SelectionCount to number of FS -- count	 | ||||
| 	if SelectionCount is 0 then | ||||
| 		set FS to userPicksFolder() | ||||
| 	else if the SelectionCount is 1 then | ||||
| 		set MyPath to path to me | ||||
| 		if MyPath is item 1 of FS then | ||||
| 			--If I'm a droplet then I was double-clicked | ||||
| 			set FS to userPicksFolder() | ||||
| 		end if | ||||
| 	else | ||||
| 		--I'm not a double-clicked droplet | ||||
| 	end if | ||||
| 	open FS | ||||
| end run | ||||
|  | ||||
| on userPicksFolder() | ||||
| 	set these_items to {} | ||||
| 	set these_items to (choose file with prompt "Select a file to convert to PostScript:" of type {"JPEG", "GIFf", "PICT", "TIFF", "TEXT", "RTF"}) as list | ||||
| end userPicksFolder | ||||
|  | ||||
|  | ||||
| on open these_items | ||||
| 	set thesefiles to {} | ||||
| 	set the item_info to {} | ||||
| 	repeat with i from 1 to the count of these_items | ||||
| 		set this_item to (item i of these_items) | ||||
| 		set the item_info to info for this_item | ||||
| 		 | ||||
| 		if folder of the item_info is true then --if the item is a folder | ||||
| 			processFolder(this_item) | ||||
| 		else if ((folder of the item_info is false) and (alias of the item_info is false)) and (the file type of the item_info is in the type_list) or ((the name extension of the item_info) is in the extension_list) then | ||||
| 			 | ||||
| 			set theFilePath to (item i of these_items as string) | ||||
| 			set thePOSIXFilePath to POSIX path of theFilePath as string | ||||
| 			processFile(thePOSIXFilePath) | ||||
| 		end if | ||||
| 	end repeat | ||||
| end open | ||||
|  | ||||
| --process folders  | ||||
| on processFolder(theFolder) | ||||
| 	set these_items to list folder theFolder without invisibles | ||||
| 	repeat with i from 1 to the count of these_items | ||||
| 		set this_item to alias ((theFolder as text) & (item i of these_items)) | ||||
| 		set the item_info to info for this_item | ||||
| 		if folder of the item_info is true then | ||||
| 			processFolder(this_item) | ||||
| 		else if (alias of the item_info is false) and ((the file type of the item_info is in the type_list) or the name extension of the item_info is in the extension_list) then | ||||
| 			set theFilePath to (this_item as string) | ||||
| 			set thePOSIXFilePath to POSIX path of theFilePath as string | ||||
| 			processFile(thePOSIXFilePath) | ||||
| 		end if | ||||
| 	end repeat | ||||
| end processFolder | ||||
|  | ||||
| --need to pass the URL to Terminal | ||||
| on processFile(thePOSIXFileName) | ||||
| 	try | ||||
| 		set terminalCommand to "" | ||||
| 		set convertCommand to "/System/Library/Printers/Libraries/./convert " | ||||
| 		set newFileName to thePOSIXFileName & ".ps" | ||||
| 		set terminalCommand to convertCommand & "-f " & "\"" & thePOSIXFileName & "\"" & " -o " & "\"" & newFileName & "\"" & " -j \"application/postscript\"" | ||||
| 		 | ||||
| 		do shell script terminalCommand | ||||
| 	end try | ||||
| end processFile | ||||
|  | ||||
|  | ||||
| @@ -0,0 +1,80 @@ | ||||
| (* | ||||
| Count Messages in All Mailboxes | ||||
|  | ||||
| Copyright 2002-2012 Apple Inc. All rights reserved. | ||||
|  | ||||
| You may incorporate this Apple sample code into your program(s) without | ||||
| restriction.  This Apple sample code has been provided "AS IS" and the | ||||
| responsibility for its operation is yours.  You are not permitted to | ||||
| redistribute this Apple sample code as "Apple sample code" after having | ||||
| made changes.  If you're going to redistribute the code, we require | ||||
| that you make it clear that the code was descended from Apple sample | ||||
| code, but that you've made changes. | ||||
| *) | ||||
|  | ||||
| (* | ||||
| This script goes through each mailbox, gets the total message count and | ||||
| the unread count, then displays the final output in a new email message. | ||||
| *) | ||||
|  | ||||
| tell application "Mail" | ||||
| 	set localMailboxes to every mailbox | ||||
| 	if (count of localMailboxes) is greater than 0 then | ||||
| 		set messageCountDisplay to "Local mailboxes (On My Mac)" & return & my getMessageCountsForMailboxes(localMailboxes) | ||||
| 	else | ||||
| 		set messageCountDisplay to "" | ||||
| 	end if | ||||
| 	 | ||||
| 	set everyAccount to every account | ||||
| 	repeat with eachAccount in everyAccount | ||||
| 		set accountMailboxes to every mailbox of eachAccount | ||||
| 		if (count of accountMailboxes) is greater than 0 then | ||||
| 			set messageCountDisplay to messageCountDisplay & return & "Mailboxes for Account: " & name of eachAccount & return & my getMessageCountsForMailboxes(accountMailboxes) | ||||
| 		end if | ||||
| 	end repeat | ||||
| 	 | ||||
| 	set outputMessage to make new outgoing message with properties {content:messageCountDisplay, subject:"Message counts for all my mailboxes", visible:true} | ||||
| 	tell outputMessage | ||||
| 		set font to "Courier" | ||||
| 		set size to 12 | ||||
| 	end tell | ||||
| end tell | ||||
|  | ||||
| on getMessageCountsForMailboxes(theMailboxes) | ||||
| 	-- (list of mailboxes) | ||||
| 	-- returns string | ||||
| 	 | ||||
| 	set displayString to "" | ||||
| 	 | ||||
| 	tell application "Mail" | ||||
| 		repeat with eachMailbox in theMailboxes | ||||
| 			set mailboxName to name of eachMailbox | ||||
| 			set messageCount to (count of (messages of eachMailbox)) as string | ||||
| 			set unreadCount to unread count of eachMailbox as string | ||||
| 			 | ||||
| 			set displayString to displayString & "    " & my padString(mailboxName, 40) & "  " & messageCount & " (" & unreadCount & " unread)" & return | ||||
| 		end repeat | ||||
| 	end tell | ||||
| 	 | ||||
| 	return displayString | ||||
| end getMessageCountsForMailboxes | ||||
|  | ||||
| on padString(theString, fieldLength) | ||||
| 	-- (string, integer) | ||||
| 	-- returns string | ||||
| 	 | ||||
| 	set stringLength to length of theString | ||||
| 	 | ||||
| 	if stringLength is greater than fieldLength then | ||||
| 		set paddedString to (text from character 1 to character (fieldLength - 3) of theString) & "..." | ||||
| 	else -- stringLength is less than or equal to fieldLength | ||||
| 		set paddedString to theString | ||||
| 		 | ||||
| 		set paddingLength to fieldLength - stringLength | ||||
| 		repeat paddingLength times | ||||
| 			set paddedString to paddedString & space | ||||
| 		end repeat | ||||
| 	end if | ||||
| 	 | ||||
| 	return paddedString | ||||
| end padString | ||||
							
								
								
									
										68
									
								
								samples/AppleScript/Crazy Message Text.applescript
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								samples/AppleScript/Crazy Message Text.applescript
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,68 @@ | ||||
| (* | ||||
| Crazy Message Text | ||||
|  | ||||
| Copyright 2002-2012 Apple Inc. All rights reserved. | ||||
|  | ||||
| You may incorporate this Apple sample code into your program(s) without | ||||
| restriction.  This Apple sample code has been provided "AS IS" and the | ||||
| responsibility for its operation is yours.  You are not permitted to | ||||
| redistribute this Apple sample code as "Apple sample code" after having | ||||
| made changes.  If you're going to redistribute the code, we require | ||||
| that you make it clear that the code was descended from Apple sample | ||||
| code, but that you've made changes. | ||||
| *) | ||||
|  | ||||
| (* | ||||
| This script takes a string from the user and then makes a new message | ||||
| where each letter has a different font, size, and color. | ||||
| *) | ||||
|  | ||||
| property lowFontSize : 36 | ||||
| property highFontSize : 72 | ||||
| property messageText : "Happy Birthday!" | ||||
|  | ||||
| repeat | ||||
| 	set userInput to display dialog "Enter some message text:" & return & return & "Minimum Character Size: " & (lowFontSize as string) & return & "Maximum Character Size: " & (highFontSize as string) default answer messageText buttons {"Cancel", "Set Prefs", "Continue"} default button 3 | ||||
| 	 | ||||
| 	if the button returned of userInput is "Set Prefs" then | ||||
| 		set minimumFontSize to 9 | ||||
| 		 | ||||
| 		display dialog "Enter the minimum font size to use:" & return & return & "(Must be at least " & (minimumFontSize as string) & ")" default answer lowFontSize buttons {"OK"} | ||||
| 		set newFontSize to text returned of the result as integer | ||||
| 		if newFontSize is greater than or equal to minimumFontSize then | ||||
| 			set lowFontSize to newFontSize | ||||
| 		else | ||||
| 			set lowFontSize to minimumFontSize | ||||
| 		end if | ||||
| 		 | ||||
| 		display dialog "Enter the maximum font size to use:" & return & return & "(Must be greater than " & (lowFontSize as string) & ")" default answer highFontSize buttons {"OK"} | ||||
| 		set newFontSize to text returned of the result as integer | ||||
| 		if newFontSize is greater than lowFontSize then | ||||
| 			set highFontSize to newFontSize | ||||
| 		else | ||||
| 			set highFontSize to lowFontSize | ||||
| 		end if | ||||
| 		 | ||||
| 	else -- button returned of userInput is "Continue" | ||||
| 		set theText to text returned of userInput | ||||
| 		if theText is not "" then | ||||
| 			set messageText to theText | ||||
| 		end if | ||||
| 		exit repeat | ||||
| 	end if | ||||
| end repeat | ||||
|  | ||||
| set fontList to {"American Typewriter", "American Typewriter Light", "American Typewriter Bold", "American Typewriter Condensed", "American Typewriter Condensed Light", "American Typewriter Condensed Bold", "Arial", "Arial Italic", "Arial Bold", "Arial Bold Italic", "Arial Black", "Baskerville", "Baskerville Italic", "Baskerville SemiBold", "Baskerville Bold", "Baskerville SemiBold Italic", "Baskerville Bold Italic", "Big Caslon Medium", "Comic Sans MS", "Comic Sans MS Bold", "Copperplate", "Copperplate Light", "Copperplate Bold", "Didot", "Didot Italic", "Didot Bold", "Futura Medium", "Futura Medium Italic", "Futura Condensed Medium", "Futura Condensed ExtraBold", "Geneva", "Gill Sans", "Gill Sans Italic", "Gill Sans Light", "Gill Sans Light Italic", "Gill Sans Bold", "Gill Sans Bold Italic", "Herculanum", "Lucida Grande", "Lucida Grande Bold", "Marker Felt Thin", "Marker Felt Wide", "Optima Regular", "Optima Italic", "Optima Bold", "Optima Bold Italic", "Optima ExtraBlack", "Papyrus", "Verdana", "Verdana Italic", "Verdana Bold", "Verdana Bold Italic", "Zapfino"} | ||||
|  | ||||
| tell application "Mail" | ||||
| 	activate | ||||
| 	set crazyTextMessage to make new outgoing message with properties {content:messageText, visible:true} | ||||
| 	 | ||||
| 	tell crazyTextMessage | ||||
| 		repeat with eachCharacter in characters | ||||
| 			set font of eachCharacter to (some item of fontList) | ||||
| 			set size of eachCharacter to (random number from lowFontSize to highFontSize) | ||||
| 			set color of eachCharacter to {random number from 0 to 65535, random number from 0 to 65535, random number from 0 to 65535} | ||||
| 		end repeat | ||||
| 	end tell | ||||
| end tell | ||||
							
								
								
									
										41
									
								
								samples/AppleScript/Get User Name.applescript
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								samples/AppleScript/Get User Name.applescript
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,41 @@ | ||||
| (* | ||||
| Get User Name | ||||
|  | ||||
| This script uses UI element scripting to get the name for the | ||||
| current user. | ||||
|  | ||||
| If "Enable access for assistive devices" is not checked, | ||||
| this script will open the Universal Access System Preference and ask | ||||
| the user to check the checkbox. | ||||
|  | ||||
| Copyright 2007 Apple Inc. | ||||
|  | ||||
| You may incorporate this Apple sample code into your program(s) without | ||||
| restriction.  This Apple sample code has been provided "AS IS" and the | ||||
| responsibility for its operation is yours.  You are not permitted to | ||||
| redistribute this Apple sample code as "Apple sample code" after having | ||||
| made changes.  If you're going to redistribute the code, we require | ||||
| that you make it clear that the code was descended from Apple sample | ||||
| code, but that you've made changes. | ||||
| *) | ||||
|  | ||||
| tell application "System Preferences" | ||||
| 	activate | ||||
| 	set current pane to pane "com.apple.preferences.users" | ||||
| end tell | ||||
|  | ||||
| tell application "System Events" | ||||
| 	if UI elements enabled then | ||||
| 		tell tab group 1 of window "Accounts" of process "System Preferences" | ||||
| 			click radio button 1 | ||||
| 			delay 2 | ||||
| 			get value of text field 1 | ||||
| 		end tell | ||||
| 	else | ||||
| 		tell application "System Preferences" | ||||
| 			activate | ||||
| 			set current pane to pane "com.apple.preference.universalaccess" | ||||
| 			display dialog "UI element scripting is not enabled. Check \"Enable access for assistive devices\"" | ||||
| 		end tell | ||||
| 	end if | ||||
| end tell | ||||
							
								
								
									
										75
									
								
								samples/AppleScript/Time Of Day.applescript
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								samples/AppleScript/Time Of Day.applescript
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,75 @@ | ||||
| (*  | ||||
|  Speaks the  date and time of day | ||||
|   | ||||
|  Copyright 2008 Apple Inc. All rights reserved. | ||||
|   | ||||
|  You may incorporate this Apple sample code into your program(s) without | ||||
|  restriction.  This Apple sample code has been provided "AS IS" and the | ||||
|  responsibility for its operation is yours.  You are not permitted to | ||||
|  redistribute this Apple sample code as "Apple sample code" after having | ||||
|  made changes.  If you're going to redistribute the code, we require | ||||
|  that you make it clear that the code was descended from Apple sample | ||||
|  code, but that you've made changes. | ||||
|  *) | ||||
|  | ||||
| on isVoiceOverRunning() | ||||
| 	set isRunning to false | ||||
| 	tell application "System Events" | ||||
| 		set isRunning to (name of processes) contains "VoiceOver" | ||||
| 	end tell | ||||
| 	return isRunning | ||||
| end isVoiceOverRunning | ||||
|  | ||||
| on isVoiceOverRunningWithAppleScript() | ||||
| 	if isVoiceOverRunning() then | ||||
| 		set isRunningWithAppleScript to true | ||||
| 		 | ||||
| 		-- is AppleScript enabled on VoiceOver -- | ||||
| 		tell application "VoiceOver" | ||||
| 			try | ||||
| 				set x to bounds of vo cursor | ||||
| 			on error | ||||
| 				set isRunningWithAppleScript to false | ||||
| 			end try | ||||
| 		end tell | ||||
| 		return isRunningWithAppleScript | ||||
| 	end if | ||||
| 	return false | ||||
| end isVoiceOverRunningWithAppleScript | ||||
|  | ||||
| set currentDate to current date | ||||
| set amPM to "AM" | ||||
| set currentHour to (currentDate's hours) | ||||
| set currentMinutes to currentDate's minutes | ||||
|  | ||||
| if (currentHour > 12 and currentHour < 24) then | ||||
| 	set amPM to "PM" | ||||
| else | ||||
| 	set amPM to "AM" | ||||
| end if | ||||
|  | ||||
| --  make minutes below 10 sound nice | ||||
| if currentMinutes < 10 then | ||||
| 	set currentMinutes to ("0" & currentMinutes) as text | ||||
| end if | ||||
|  | ||||
| --  ensure 0:nn gets set to 12:nn AM | ||||
| if currentHour is equal to 0 then | ||||
| 	set currentHour to 12 | ||||
| end if | ||||
|  | ||||
| --  readjust for 12 hour time | ||||
| if (currentHour > 12) then | ||||
| 	set currentHour to (currentHour - 12) | ||||
| end if | ||||
|  | ||||
| set currentTime to ((currentDate's month) as text) & " " & ((currentDate's day) as text) & ", " & (currentHour as text) & ":" & ((currentMinutes) as text) & " " & amPM as text | ||||
|  | ||||
| if isVoiceOverRunningWithAppleScript() then | ||||
| 	tell application "VoiceOver" | ||||
| 		output currentTime | ||||
| 	end tell | ||||
| else | ||||
| 	say currentTime | ||||
| 	delay 2 | ||||
| end if | ||||
							
								
								
									
										13
									
								
								samples/AsciiDoc/encoding.asciidoc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								samples/AsciiDoc/encoding.asciidoc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | ||||
| Gregory Romé has written an AsciiDoc plugin for the Redmine project management application. | ||||
|  | ||||
| https://github.com/foo-users/foo | ||||
| へと `vicmd` キーマップを足してみている試み、 | ||||
| アニメーションgifです。 | ||||
|  | ||||
| tag::romé[] | ||||
| Gregory Romé has written an AsciiDoc plugin for the Redmine project management application. | ||||
| end::romé[] | ||||
|  | ||||
| == Überschrift | ||||
|  | ||||
| * Codierungen sind verrückt auf älteren Versionen von Ruby | ||||
							
								
								
									
										10
									
								
								samples/AsciiDoc/list.asc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								samples/AsciiDoc/list.asc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | ||||
| AsciiDoc Home Page | ||||
| ================== | ||||
|  | ||||
| Example Articles | ||||
| ~~~~~~~~~~~~~~~~ | ||||
| - Item 1 | ||||
|  | ||||
| - Item 2 | ||||
|  | ||||
| - Item 3 | ||||
							
								
								
									
										25
									
								
								samples/AsciiDoc/sample.adoc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								samples/AsciiDoc/sample.adoc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | ||||
| Document Title | ||||
| ============== | ||||
| Doc Writer <thedoc@asciidoctor.org> | ||||
| :idprefix: id_ | ||||
|  | ||||
| Preamble paragraph. | ||||
|  | ||||
| NOTE: This is test, only a test. | ||||
|  | ||||
| == Section A | ||||
|  | ||||
| *Section A* paragraph. | ||||
|  | ||||
| === Section A Subsection | ||||
|  | ||||
| *Section A* 'subsection' paragraph. | ||||
|  | ||||
| == Section B | ||||
|  | ||||
| *Section B* paragraph. | ||||
|  | ||||
| .Section B list | ||||
| * Item 1 | ||||
| * Item 2 | ||||
| * Item 3 | ||||
							
								
								
									
										41
									
								
								samples/AspectJ/CacheAspect.aj
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								samples/AspectJ/CacheAspect.aj
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,41 @@ | ||||
| package com.blogspot.miguelinlas3.aspectj.cache; | ||||
|  | ||||
| import java.util.Map; | ||||
| import java.util.WeakHashMap; | ||||
|  | ||||
| import org.aspectj.lang.JoinPoint; | ||||
|  | ||||
| import com.blogspot.miguelinlas3.aspectj.cache.marker.Cachable; | ||||
|  | ||||
| /** | ||||
|  * This simple aspect simulates the behaviour of a very simple cache | ||||
|  *   | ||||
|  * @author migue | ||||
|  * | ||||
|  */ | ||||
| public aspect CacheAspect { | ||||
|  | ||||
| 	public pointcut cache(Cachable cachable): execution(@Cachable * * (..)) && @annotation(cachable); | ||||
| 	 | ||||
| 	Object around(Cachable cachable): cache(cachable){ | ||||
| 	 | ||||
| 		String evaluatedKey = this.evaluateKey(cachable.scriptKey(), thisJoinPoint); | ||||
| 		 | ||||
| 		if(cache.containsKey(evaluatedKey)){ | ||||
| 			System.out.println("Cache hit for key " + evaluatedKey); | ||||
| 			return this.cache.get(evaluatedKey); | ||||
| 		} | ||||
| 		 | ||||
| 		System.out.println("Cache miss for key " + evaluatedKey); | ||||
| 		Object value = proceed(cachable); | ||||
| 		cache.put(evaluatedKey, value); | ||||
| 		return value; | ||||
| 	} | ||||
| 	 | ||||
| 	protected String evaluateKey(String key, JoinPoint joinPoint) { | ||||
| 		// TODO add some smart staff to allow simple scripting in @Cachable annotation | ||||
| 		return key; | ||||
| 	} | ||||
| 	 | ||||
| 	protected Map<String, Object> cache = new WeakHashMap<String, Object>(); | ||||
| } | ||||
							
								
								
									
										50
									
								
								samples/AspectJ/OptimizeRecursionCache.aj
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								samples/AspectJ/OptimizeRecursionCache.aj
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,50 @@ | ||||
| package aspects.caching; | ||||
|  | ||||
| import java.util.Map; | ||||
|  | ||||
| /** | ||||
|  * Cache aspect for optimize recursive functions. | ||||
|  *  | ||||
|  * @author Migueli | ||||
|  * @date 05/11/2013 | ||||
|  * @version 1.0 | ||||
|  * | ||||
|  */ | ||||
| public abstract aspect OptimizeRecursionCache { | ||||
| 		 | ||||
| 	@SuppressWarnings("rawtypes") | ||||
| 	private Map _cache; | ||||
| 	 | ||||
| 	public OptimizeRecursionCache() { | ||||
| 		_cache = getCache(); | ||||
| 	} | ||||
| 	 | ||||
| 	@SuppressWarnings("rawtypes") | ||||
| 	abstract public Map getCache(); | ||||
| 	 | ||||
| 	abstract public pointcut operation(Object o); | ||||
|  | ||||
| 	pointcut topLevelOperation(Object o): operation(o) && !cflowbelow(operation(Object)); | ||||
|  | ||||
| 	before(Object o) : topLevelOperation(o) { | ||||
| 		System.out.println("Seeking value for " + o); | ||||
| 	} | ||||
|  | ||||
| 	Object around(Object o) : operation(o) { | ||||
| 		Object cachedValue = _cache.get(o); | ||||
| 		if (cachedValue != null) { | ||||
| 			System.out.println("Found cached value for " + o + ": " + cachedValue); | ||||
| 			return cachedValue; | ||||
| 		} | ||||
| 		return proceed(o); | ||||
| 	} | ||||
|  | ||||
| 	@SuppressWarnings("unchecked") | ||||
| 	after(Object o) returning(Object result) : topLevelOperation(o) { | ||||
| 		_cache.put(o, result); | ||||
| 	} | ||||
| 	 | ||||
| 	after(Object o) returning(Object result) : topLevelOperation(o) { | ||||
| 		System.out.println("cache size: " + _cache.size()); | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										350
									
								
								samples/Assembly/FASM.asm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										350
									
								
								samples/Assembly/FASM.asm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,350 @@ | ||||
|  | ||||
| ; flat assembler interface for Win32 | ||||
| ; Copyright (c) 1999-2014, Tomasz Grysztar. | ||||
| ; All rights reserved. | ||||
|  | ||||
| 	format	PE console | ||||
|  | ||||
| section '.text' code readable executable | ||||
|  | ||||
| start: | ||||
|  | ||||
| 	mov	[con_handle],STD_OUTPUT_HANDLE | ||||
| 	mov	esi,_logo | ||||
| 	call	display_string | ||||
|  | ||||
| 	call	get_params | ||||
| 	jc	information | ||||
|  | ||||
| 	call	init_memory | ||||
|  | ||||
| 	mov	esi,_memory_prefix | ||||
| 	call	display_string | ||||
| 	mov	eax,[memory_end] | ||||
| 	sub	eax,[memory_start] | ||||
| 	add	eax,[additional_memory_end] | ||||
| 	sub	eax,[additional_memory] | ||||
| 	shr	eax,10 | ||||
| 	call	display_number | ||||
| 	mov	esi,_memory_suffix | ||||
| 	call	display_string | ||||
|  | ||||
| 	call	[GetTickCount] | ||||
| 	mov	[start_time],eax | ||||
|  | ||||
| 	call	preprocessor | ||||
| 	call	parser | ||||
| 	call	assembler | ||||
| 	call	formatter | ||||
|  | ||||
| 	call	display_user_messages | ||||
| 	movzx	eax,[current_pass] | ||||
| 	inc	eax | ||||
| 	call	display_number | ||||
| 	mov	esi,_passes_suffix | ||||
| 	call	display_string | ||||
| 	call	[GetTickCount] | ||||
| 	sub	eax,[start_time] | ||||
| 	xor	edx,edx | ||||
| 	mov	ebx,100 | ||||
| 	div	ebx | ||||
| 	or	eax,eax | ||||
| 	jz	display_bytes_count | ||||
| 	xor	edx,edx | ||||
| 	mov	ebx,10 | ||||
| 	div	ebx | ||||
| 	push	edx | ||||
| 	call	display_number | ||||
| 	mov	dl,'.' | ||||
| 	call	display_character | ||||
| 	pop	eax | ||||
| 	call	display_number | ||||
| 	mov	esi,_seconds_suffix | ||||
| 	call	display_string | ||||
|       display_bytes_count: | ||||
| 	mov	eax,[written_size] | ||||
| 	call	display_number | ||||
| 	mov	esi,_bytes_suffix | ||||
| 	call	display_string | ||||
| 	xor	al,al | ||||
| 	jmp	exit_program | ||||
|  | ||||
| information: | ||||
| 	mov	esi,_usage | ||||
| 	call	display_string | ||||
| 	mov	al,1 | ||||
| 	jmp	exit_program | ||||
|  | ||||
| get_params: | ||||
| 	mov	[input_file],0 | ||||
| 	mov	[output_file],0 | ||||
| 	mov	[symbols_file],0 | ||||
| 	mov	[memory_setting],0 | ||||
| 	mov	[passes_limit],100 | ||||
| 	call	[GetCommandLine] | ||||
| 	mov	esi,eax | ||||
| 	mov	edi,params | ||||
|     find_command_start: | ||||
| 	lodsb | ||||
| 	cmp	al,20h | ||||
| 	je	find_command_start | ||||
| 	cmp	al,22h | ||||
| 	je	skip_quoted_name | ||||
|     skip_name: | ||||
| 	lodsb | ||||
| 	cmp	al,20h | ||||
| 	je	find_param | ||||
| 	or	al,al | ||||
| 	jz	all_params | ||||
| 	jmp	skip_name | ||||
|     skip_quoted_name: | ||||
| 	lodsb | ||||
| 	cmp	al,22h | ||||
| 	je	find_param | ||||
| 	or	al,al | ||||
| 	jz	all_params | ||||
| 	jmp	skip_quoted_name | ||||
|     find_param: | ||||
| 	lodsb | ||||
| 	cmp	al,20h | ||||
| 	je	find_param | ||||
| 	cmp	al,'-' | ||||
| 	je	option_param | ||||
| 	cmp	al,0Dh | ||||
| 	je	all_params | ||||
| 	or	al,al | ||||
| 	jz	all_params | ||||
| 	cmp	[input_file],0 | ||||
| 	jne	get_output_file | ||||
| 	mov	[input_file],edi | ||||
| 	jmp	process_param | ||||
|       get_output_file: | ||||
| 	cmp	[output_file],0 | ||||
| 	jne	bad_params | ||||
| 	mov	[output_file],edi | ||||
|     process_param: | ||||
| 	cmp	al,22h | ||||
| 	je	string_param | ||||
|     copy_param: | ||||
| 	stosb | ||||
| 	lodsb | ||||
| 	cmp	al,20h | ||||
| 	je	param_end | ||||
| 	cmp	al,0Dh | ||||
| 	je	param_end | ||||
| 	or	al,al | ||||
| 	jz	param_end | ||||
| 	jmp	copy_param | ||||
|     string_param: | ||||
| 	lodsb | ||||
| 	cmp	al,22h | ||||
| 	je	string_param_end | ||||
| 	cmp	al,0Dh | ||||
| 	je	param_end | ||||
| 	or	al,al | ||||
| 	jz	param_end | ||||
| 	stosb | ||||
| 	jmp	string_param | ||||
|     option_param: | ||||
| 	lodsb | ||||
| 	cmp	al,'m' | ||||
| 	je	memory_option | ||||
| 	cmp	al,'M' | ||||
| 	je	memory_option | ||||
| 	cmp	al,'p' | ||||
| 	je	passes_option | ||||
| 	cmp	al,'P' | ||||
| 	je	passes_option | ||||
| 	cmp	al,'s' | ||||
| 	je	symbols_option | ||||
| 	cmp	al,'S' | ||||
| 	je	symbols_option | ||||
|     bad_params: | ||||
| 	stc | ||||
| 	ret | ||||
|     get_option_value: | ||||
| 	xor	eax,eax | ||||
| 	mov	edx,eax | ||||
|     get_option_digit: | ||||
| 	lodsb | ||||
| 	cmp	al,20h | ||||
| 	je	option_value_ok | ||||
| 	cmp	al,0Dh | ||||
| 	je	option_value_ok | ||||
| 	or	al,al | ||||
| 	jz	option_value_ok | ||||
| 	sub	al,30h | ||||
| 	jc	invalid_option_value | ||||
| 	cmp	al,9 | ||||
| 	ja	invalid_option_value | ||||
| 	imul	edx,10 | ||||
| 	jo	invalid_option_value | ||||
| 	add	edx,eax | ||||
| 	jc	invalid_option_value | ||||
| 	jmp	get_option_digit | ||||
|     option_value_ok: | ||||
| 	dec	esi | ||||
| 	clc | ||||
| 	ret | ||||
|     invalid_option_value: | ||||
| 	stc | ||||
| 	ret | ||||
|     memory_option: | ||||
| 	lodsb | ||||
| 	cmp	al,20h | ||||
| 	je	memory_option | ||||
| 	cmp	al,0Dh | ||||
| 	je	bad_params | ||||
| 	or	al,al | ||||
| 	jz	bad_params | ||||
| 	dec	esi | ||||
| 	call	get_option_value | ||||
| 	or	edx,edx | ||||
| 	jz	bad_params | ||||
| 	cmp	edx,1 shl (32-10) | ||||
| 	jae	bad_params | ||||
| 	mov	[memory_setting],edx | ||||
| 	jmp	find_param | ||||
|     passes_option: | ||||
| 	lodsb | ||||
| 	cmp	al,20h | ||||
| 	je	passes_option | ||||
| 	cmp	al,0Dh | ||||
| 	je	bad_params | ||||
| 	or	al,al | ||||
| 	jz	bad_params | ||||
| 	dec	esi | ||||
| 	call	get_option_value | ||||
| 	or	edx,edx | ||||
| 	jz	bad_params | ||||
| 	cmp	edx,10000h | ||||
| 	ja	bad_params | ||||
| 	mov	[passes_limit],dx | ||||
| 	jmp	find_param | ||||
|     symbols_option: | ||||
| 	mov	[symbols_file],edi | ||||
|       find_symbols_file_name: | ||||
| 	lodsb | ||||
| 	cmp	al,20h | ||||
| 	jne	process_param | ||||
| 	jmp	find_symbols_file_name | ||||
|     param_end: | ||||
| 	dec	esi | ||||
|     string_param_end: | ||||
| 	xor	al,al | ||||
| 	stosb | ||||
| 	jmp	find_param | ||||
|     all_params: | ||||
| 	cmp	[input_file],0 | ||||
| 	je	bad_params | ||||
| 	clc | ||||
| 	ret | ||||
|  | ||||
| include 'system.inc' | ||||
|  | ||||
| include '..\errors.inc' | ||||
| include '..\symbdump.inc' | ||||
| include '..\preproce.inc' | ||||
| include '..\parser.inc' | ||||
| include '..\exprpars.inc' | ||||
| include '..\assemble.inc' | ||||
| include '..\exprcalc.inc' | ||||
| include '..\formats.inc' | ||||
| include '..\x86_64.inc' | ||||
| include '..\avx.inc' | ||||
|  | ||||
| include '..\tables.inc' | ||||
| include '..\messages.inc' | ||||
|  | ||||
| section '.data' data readable writeable | ||||
|  | ||||
| include '..\version.inc' | ||||
|  | ||||
| _copyright db 'Copyright (c) 1999-2014, Tomasz Grysztar',0Dh,0Ah,0 | ||||
|  | ||||
| _logo db 'flat assembler  version ',VERSION_STRING,0 | ||||
| _usage db 0Dh,0Ah | ||||
|        db 'usage: fasm <source> [output]',0Dh,0Ah | ||||
|        db 'optional settings:',0Dh,0Ah | ||||
|        db ' -m <limit>    set the limit in kilobytes for the available memory',0Dh,0Ah | ||||
|        db ' -p <limit>    set the maximum allowed number of passes',0Dh,0Ah | ||||
|        db ' -s <file>     dump symbolic information for debugging',0Dh,0Ah | ||||
|        db 0 | ||||
| _memory_prefix db '  (',0 | ||||
| _memory_suffix db ' kilobytes memory)',0Dh,0Ah,0 | ||||
| _passes_suffix db ' passes, ',0 | ||||
| _seconds_suffix db ' seconds, ',0 | ||||
| _bytes_suffix db ' bytes.',0Dh,0Ah,0 | ||||
|  | ||||
| align 4 | ||||
|  | ||||
| include '..\variable.inc' | ||||
|  | ||||
| con_handle dd ? | ||||
| memory_setting dd ? | ||||
| start_time dd ? | ||||
| bytes_count dd ? | ||||
| displayed_count dd ? | ||||
| character db ? | ||||
| last_displayed rb 2 | ||||
|  | ||||
| params rb 1000h | ||||
| options rb 1000h | ||||
| buffer rb 4000h | ||||
|  | ||||
| stack 10000h | ||||
|  | ||||
| section '.idata' import data readable writeable | ||||
|  | ||||
|   dd 0,0,0,rva kernel_name,rva kernel_table | ||||
|   dd 0,0,0,0,0 | ||||
|  | ||||
|   kernel_table: | ||||
|     ExitProcess dd rva _ExitProcess | ||||
|     CreateFile dd rva _CreateFileA | ||||
|     ReadFile dd rva _ReadFile | ||||
|     WriteFile dd rva _WriteFile | ||||
|     CloseHandle dd rva _CloseHandle | ||||
|     SetFilePointer dd rva _SetFilePointer | ||||
|     GetCommandLine dd rva _GetCommandLineA | ||||
|     GetEnvironmentVariable dd rva _GetEnvironmentVariable | ||||
|     GetStdHandle dd rva _GetStdHandle | ||||
|     VirtualAlloc dd rva _VirtualAlloc | ||||
|     VirtualFree dd rva _VirtualFree | ||||
|     GetTickCount dd rva _GetTickCount | ||||
|     GetSystemTime dd rva _GetSystemTime | ||||
|     GlobalMemoryStatus dd rva _GlobalMemoryStatus | ||||
|     dd 0 | ||||
|  | ||||
|   kernel_name db 'KERNEL32.DLL',0 | ||||
|  | ||||
|   _ExitProcess dw 0 | ||||
|     db 'ExitProcess',0 | ||||
|   _CreateFileA dw 0 | ||||
|     db 'CreateFileA',0 | ||||
|   _ReadFile dw 0 | ||||
|     db 'ReadFile',0 | ||||
|   _WriteFile dw 0 | ||||
|     db 'WriteFile',0 | ||||
|   _CloseHandle dw 0 | ||||
|     db 'CloseHandle',0 | ||||
|   _SetFilePointer dw 0 | ||||
|     db 'SetFilePointer',0 | ||||
|   _GetCommandLineA dw 0 | ||||
|     db 'GetCommandLineA',0 | ||||
|   _GetEnvironmentVariable dw 0 | ||||
|     db 'GetEnvironmentVariableA',0 | ||||
|   _GetStdHandle dw 0 | ||||
|     db 'GetStdHandle',0 | ||||
|   _VirtualAlloc dw 0 | ||||
|     db 'VirtualAlloc',0 | ||||
|   _VirtualFree dw 0 | ||||
|     db 'VirtualFree',0 | ||||
|   _GetTickCount dw 0 | ||||
|     db 'GetTickCount',0 | ||||
|   _GetSystemTime dw 0 | ||||
|     db 'GetSystemTime',0 | ||||
|   _GlobalMemoryStatus dw 0 | ||||
|     db 'GlobalMemoryStatus',0 | ||||
|  | ||||
| section '.reloc' fixups data readable discardable | ||||
							
								
								
									
										121
									
								
								samples/Awk/test.awk
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										121
									
								
								samples/Awk/test.awk
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,121 @@ | ||||
| #!/bin/awk -f | ||||
|  | ||||
| BEGIN { | ||||
|   # It is not possible to define output file names here because | ||||
|   # FILENAME is not define in the BEGIN section | ||||
|   n = ""; | ||||
|   printf "Generating data files ..."; | ||||
|   network_max_bandwidth_in_byte = 10000000; | ||||
|   network_max_packet_per_second = 1000000; | ||||
|   last3 = 0; | ||||
|   last4 = 0; | ||||
|   last5 = 0; | ||||
|   last6 = 0; | ||||
| } | ||||
| { | ||||
|   if ($1 ~ /Average/) | ||||
|     { # Skip the Average values | ||||
|       n = ""; | ||||
|       next; | ||||
|     } | ||||
|  | ||||
|   if ($2 ~ /all/) | ||||
|     { # This is the cpu info | ||||
|       print $3 > FILENAME".cpu.user.dat"; | ||||
| #	  print $4 > FILENAME".cpu.nice.dat"; | ||||
|       print $5 > FILENAME".cpu.system.dat"; | ||||
| #     print $6 > FILENAME".cpu.iowait.dat"; | ||||
|       print $7 > FILENAME".cpu.idle.dat"; | ||||
|       print 100-$7 > FILENAME".cpu.busy.dat"; | ||||
|     } | ||||
|   if ($2 ~ /eth0/) | ||||
|     { # This is the eth0 network info | ||||
|       if ($3 > network_max_packet_per_second) | ||||
| 	print last3 > FILENAME".net.rxpck.dat"; # Total number of packets received per second. | ||||
|       else | ||||
| 	{ | ||||
| 	  last3 = $3; | ||||
| 	  print $3 > FILENAME".net.rxpck.dat"; # Total number of packets received per second. | ||||
| 	} | ||||
|       if ($4 > network_max_packet_per_second) | ||||
| 	print last4 > FILENAME".net.txpck.dat"; # Total number of packets transmitted per second. | ||||
|       else | ||||
| 	{ | ||||
| 	  last4 = $4; | ||||
| 	  print $4 > FILENAME".net.txpck.dat"; # Total number of packets transmitted per second. | ||||
| 	} | ||||
|       if ($5 > network_max_bandwidth_in_byte) | ||||
| 	print last5 > FILENAME".net.rxbyt.dat"; # Total number of bytes received per second. | ||||
|       else | ||||
| 	{ | ||||
| 	  last5 = $5; | ||||
| 	  print $5 > FILENAME".net.rxbyt.dat"; # Total number of bytes received per second. | ||||
| 	} | ||||
|       if ($6 > network_max_bandwidth_in_byte) | ||||
| 	print last6 > FILENAME".net.txbyt.dat"; # Total number of bytes transmitted per second. | ||||
|       else | ||||
| 	{ | ||||
| 	  last6 = $6; | ||||
| 	  print $6 > FILENAME".net.txbyt.dat"; # Total number of bytes transmitted per second. | ||||
| 	} | ||||
| #     print $7 > FILENAME".net.rxcmp.dat"; # Number of compressed packets received per second (for cslip etc.). | ||||
| #     print $8 > FILENAME".net.txcmp.dat"; # Number of compressed packets transmitted per second. | ||||
| #     print $9 > FILENAME".net.rxmcst.dat"; # Number of multicast packets received per second. | ||||
|     } | ||||
|  | ||||
|   # Detect which is the next info to be parsed | ||||
|   if ($2 ~ /proc|cswch|tps|kbmemfree|totsck/) | ||||
|     { | ||||
|       n = $2; | ||||
|     } | ||||
|  | ||||
|   # Only get lines with numbers (real data !) | ||||
|   if ($2 ~ /[0-9]/) | ||||
|     { | ||||
|       if (n == "proc/s") | ||||
| 	{ # This is the proc/s info | ||||
| 	  print $2 > FILENAME".proc.dat"; | ||||
| #	  n = ""; | ||||
| 	} | ||||
|       if (n == "cswch/s") | ||||
| 	{ # This is the context switches per second info | ||||
| 	  print $2 > FILENAME".ctxsw.dat"; | ||||
| #	  n = ""; | ||||
| 	} | ||||
|       if (n == "tps") | ||||
| 	{ # This is the disk info | ||||
| 	  print $2 > FILENAME".disk.tps.dat"; # total transfers per second | ||||
| 	  print $3 > FILENAME".disk.rtps.dat"; # read requests per second | ||||
| 	  print $4 > FILENAME".disk.wtps.dat"; # write requests per second | ||||
| 	  print $5 > FILENAME".disk.brdps.dat"; # block reads per second | ||||
| 	  print $6 > FILENAME".disk.bwrps.dat"; # block writes per second | ||||
| #	  n = ""; | ||||
| 	} | ||||
|       if (n == "kbmemfree") | ||||
| 	{ # This is the mem info | ||||
| 	  print $2 > FILENAME".mem.kbmemfree.dat"; # Amount of free memory available in kilobytes. | ||||
| 	  print $3 > FILENAME".mem.kbmemused.dat"; # Amount of used memory in kilobytes. This does not take into account memory used by the kernel itself. | ||||
| 	  print $4 > FILENAME".mem.memused.dat"; # Percentage of used memory. | ||||
| #         It appears the kbmemshrd has been removed from the sysstat output - ntolia | ||||
| #	  print $X > FILENAME".mem.kbmemshrd.dat"; # Amount of memory shared by the system in kilobytes.  Always zero with 2.4 kernels. | ||||
| #	  print $5 > FILENAME".mem.kbbuffers.dat"; # Amount of memory used as buffers by the kernel in kilobytes. | ||||
| 	  print $6 > FILENAME".mem.kbcached.dat"; # Amount of memory used to cache data by the kernel in kilobytes. | ||||
| #	  print $7 > FILENAME".mem.kbswpfree.dat"; # Amount of free swap space in kilobytes. | ||||
| #	  print $8 > FILENAME".mem.kbswpused.dat"; # Amount of used swap space in kilobytes. | ||||
| 	  print $9 > FILENAME".mem.swpused.dat"; # Percentage of used swap space. | ||||
| #	  n = ""; | ||||
|  	} | ||||
|       if (n == "totsck") | ||||
| 	{ # This is the socket info | ||||
| 	  print $2 > FILENAME".sock.totsck.dat"; # Total number of used sockets. | ||||
| 	  print $3 > FILENAME".sock.tcpsck.dat"; # Number of TCP sockets currently in use. | ||||
| #	  print $4 > FILENAME".sock.udpsck.dat"; # Number of UDP sockets currently in use. | ||||
| #	  print $5 > FILENAME".sock.rawsck.dat"; # Number of RAW sockets currently in use. | ||||
| #	  print $6 > FILENAME".sock.ip-frag.dat"; # Number of IP fragments currently in use. | ||||
| #	  n = ""; | ||||
|  	} | ||||
|     } | ||||
| } | ||||
| END { | ||||
|   print " '" FILENAME "' done."; | ||||
| } | ||||
							
								
								
									
										
											BIN
										
									
								
								samples/Binary/cube.stl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								samples/Binary/cube.stl
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 5.4 KiB After Width: | Height: | Size: 5.4 KiB | 
| Before Width: | Height: | Size: 5.4 KiB After Width: | Height: | Size: 5.4 KiB | 
							
								
								
									
										147
									
								
								samples/BlitzBasic/HalfAndDouble.bb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										147
									
								
								samples/BlitzBasic/HalfAndDouble.bb
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,147 @@ | ||||
|  | ||||
| Local bk = CreateBank(8) | ||||
| PokeFloat bk, 0, -1 | ||||
| Print Bin(PeekInt(bk, 0)) | ||||
| Print %1000000000000000 | ||||
| Print Bin(1 Shl 31) | ||||
| Print $1f | ||||
| Print $ff | ||||
| Print $1f + (127 - 15) | ||||
| Print Hex(%01111111100000000000000000000000) | ||||
| Print Hex(~%11111111100000000000000000000000) | ||||
|  | ||||
| Print Bin(FloatToHalf(-2.5)) | ||||
| Print HalfToFloat(FloatToHalf(-200000000000.0)) | ||||
|  | ||||
| Print Bin(FToI(-2.5)) | ||||
|  | ||||
| WaitKey | ||||
| End | ||||
|  | ||||
|  | ||||
| ; Half-precision (16-bit) arithmetic library | ||||
| ;============================================ | ||||
|  | ||||
| Global Half_CBank_ | ||||
|  | ||||
| Function FToI(f#) | ||||
| 	If Half_CBank_ = 0 Then Half_CBank_ = CreateBank(4) | ||||
| 	PokeFloat Half_CBank_, 0, f | ||||
| 	Return PeekInt(Half_CBank_, 0) | ||||
| End Function | ||||
|  | ||||
| Function HalfToFloat#(h) | ||||
| 	Local signBit, exponent, fraction, fBits | ||||
| 	 | ||||
| 	signBit = (h And 32768) <> 0 | ||||
| 	exponent = (h And %0111110000000000) Shr 10 | ||||
| 	fraction = (h And %0000001111111111) | ||||
| 	 | ||||
| 	If exponent = $1F Then exponent = $FF : ElseIf exponent Then exponent = (exponent - 15) + 127 | ||||
| 	fBits = (signBit Shl 31) Or (exponent Shl 23) Or (fraction Shl 13) | ||||
| 	 | ||||
| 	If Half_CBank_ = 0 Then Half_CBank_ = CreateBank(4) | ||||
| 	PokeInt Half_CBank_, 0, fBits | ||||
| 	Return PeekFloat(Half_CBank_, 0) | ||||
| End Function | ||||
|  | ||||
| Function FloatToHalf(f#) | ||||
| 	Local signBit, exponent, fraction, fBits | ||||
| 	 | ||||
| 	If Half_CBank_ = 0 Then Half_CBank_ = CreateBank(4) | ||||
| 	PokeFloat Half_CBank_, 0, f | ||||
| 	fBits = PeekInt(Half_CBank_, 0) | ||||
| 	 | ||||
| 	signBit = (fBits And (1 Shl 31)) <> 0 | ||||
| 	exponent = (fBits And $7F800000) Shr 23 | ||||
| 	fraction = fBits And $007FFFFF | ||||
| 	 | ||||
| 	If exponent | ||||
| 		exponent = exponent - 127 | ||||
| 		If Abs(exponent) > $1F | ||||
| 			If exponent <> ($FF - 127) Then fraction = 0 | ||||
| 			exponent = $1F * Sgn(exponent) | ||||
| 		Else | ||||
| 			exponent = exponent + 15 | ||||
| 		EndIf | ||||
| 		exponent = exponent And %11111 | ||||
| 	EndIf | ||||
| 	fraction = fraction Shr 13 | ||||
| 	 | ||||
| 	Return (signBit Shl 15) Or (exponent Shl 10) Or fraction | ||||
| End Function | ||||
|  | ||||
| Function HalfAdd(l, r) | ||||
| 	 | ||||
| End Function | ||||
|  | ||||
| Function HalfSub(l, r) | ||||
| 	 | ||||
| End Function | ||||
|  | ||||
| Function HalfMul(l, r) | ||||
| 	 | ||||
| End Function | ||||
|  | ||||
| Function HalfDiv(l, r) | ||||
| 	 | ||||
| End Function | ||||
|  | ||||
| Function HalfLT(l, r) | ||||
| 	 | ||||
| End Function | ||||
|  | ||||
| Function HalfGT(l, r) | ||||
| 	 | ||||
| End Function | ||||
|  | ||||
|  | ||||
| ; Double-precision (64-bit) arithmetic library) | ||||
| ;=============================================== | ||||
|  | ||||
| Global DoubleOut[1], Double_CBank_ | ||||
|  | ||||
| Function DoubleToFloat#(d[1]) | ||||
| 	 | ||||
| End Function | ||||
|  | ||||
| Function FloatToDouble(f#) | ||||
| 	 | ||||
| End Function | ||||
|  | ||||
| Function IntToDouble(i) | ||||
| 	 | ||||
| End Function | ||||
|  | ||||
| Function SefToDouble(s, e, f) | ||||
| 	 | ||||
| End Function | ||||
|  | ||||
| Function DoubleAdd(l, r) | ||||
| 	 | ||||
| End Function | ||||
|  | ||||
| Function DoubleSub(l, r) | ||||
| 	 | ||||
| End Function | ||||
|  | ||||
| Function DoubleMul(l, r) | ||||
| 	 | ||||
| End Function | ||||
|  | ||||
| Function DoubleDiv(l, r) | ||||
| 	 | ||||
| End Function | ||||
|  | ||||
| Function DoubleLT(l, r) | ||||
| 	 | ||||
| End Function | ||||
|  | ||||
| Function DoubleGT(l, r) | ||||
| 	 | ||||
| End Function | ||||
|  | ||||
|  | ||||
| ;~IDEal Editor Parameters: | ||||
| ;~F#1A#20#2F | ||||
| ;~C#Blitz3D | ||||
							
								
								
									
										369
									
								
								samples/BlitzBasic/LList.bb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										369
									
								
								samples/BlitzBasic/LList.bb
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,369 @@ | ||||
|  | ||||
| ; Double-linked list container class | ||||
| ;==================================== | ||||
|  | ||||
| ; with thanks to MusicianKool, for concept and issue fixes | ||||
|  | ||||
|  | ||||
| Type LList | ||||
| 	Field head_.ListNode | ||||
| 	Field tail_.ListNode | ||||
| End Type | ||||
|  | ||||
| Type ListNode | ||||
| 	Field pv_.ListNode | ||||
| 	Field nx_.ListNode | ||||
| 	Field Value | ||||
| End Type | ||||
|  | ||||
| Type Iterator | ||||
| 	Field Value | ||||
| 	Field l_.LList | ||||
| 	Field cn_.ListNode, cni_ | ||||
| End Type | ||||
|  | ||||
|  | ||||
| ;Create a new LList object | ||||
| Function CreateList.LList() | ||||
| 	Local l.LList = New LList | ||||
| 	 | ||||
| 	l\head_ = New ListNode | ||||
| 	l\tail_ = New ListNode | ||||
| 	 | ||||
| 	l\head_\nx_ = l\tail_		;End caps | ||||
| 	l\head_\pv_ = l\head_		;These make it more or less safe to iterate freely | ||||
| 	l\head_\Value = 0 | ||||
| 	 | ||||
| 	l\tail_\nx_ = l\tail_ | ||||
| 	l\tail_\pv_ = l\head_ | ||||
| 	l\tail_\Value = 0 | ||||
| 	 | ||||
| 	Return l | ||||
| End Function | ||||
|  | ||||
| ;Free a list and all elements (not any values) | ||||
| Function FreeList(l.LList) | ||||
| 	ClearList l | ||||
| 	Delete l\head_ | ||||
| 	Delete l\tail_ | ||||
| 	Delete l | ||||
| End Function | ||||
|  | ||||
| ;Remove all the elements from a list (does not free values) | ||||
| Function ClearList(l.LList) | ||||
| 	Local n.ListNode = l\head_\nx_ | ||||
| 	While n <> l\tail_ | ||||
| 		Local nx.ListNode = n\nx_ | ||||
| 		Delete n | ||||
| 		n = nx | ||||
| 	Wend | ||||
| 	l\head_\nx_ = l\tail_ | ||||
| 	l\tail_\pv_ = l\head_ | ||||
| End Function | ||||
|  | ||||
| ;Count the number of elements in a list (slow) | ||||
| Function ListLength(l.LList) | ||||
| 	Local i.Iterator = GetIterator(l), elems | ||||
| 	While EachIn(i) | ||||
| 		elems = elems + 1 | ||||
| 	Wend | ||||
| 	Return elems | ||||
| End Function | ||||
|  | ||||
| ;Return True if a list contains a given value | ||||
| Function ListContains(l.LList, Value) | ||||
| 	Return (ListFindNode(l, Value) <> Null) | ||||
| End Function | ||||
|  | ||||
| ;Create a linked list from the intvalues in a bank (slow) | ||||
| Function ListFromBank.LList(bank) | ||||
| 	Local l.LList = CreateList() | ||||
| 	Local size = BankSize(bank), p | ||||
| 	 | ||||
| 	For p = 0 To size - 4 Step 4 | ||||
| 		ListAddLast l, PeekInt(bank, p) | ||||
| 	Next | ||||
| 	 | ||||
| 	Return l | ||||
| End Function | ||||
|  | ||||
| ;Create a bank containing all the values in a list (slow) | ||||
| Function ListToBank(l.LList) | ||||
| 	Local size = ListLength(l) * 4 | ||||
| 	Local bank = CreateBank(size) | ||||
| 	 | ||||
| 	Local i.Iterator = GetIterator(l), p = 0 | ||||
| 	While EachIn(i) | ||||
| 		PokeInt bank, p, i\Value | ||||
| 		p = p + 4 | ||||
| 	Wend | ||||
| 	 | ||||
| 	Return bank | ||||
| End Function | ||||
|  | ||||
| ;Swap the contents of two list objects | ||||
| Function SwapLists(l1.LList, l2.LList) | ||||
| 	Local tempH.ListNode = l1\head_, tempT.ListNode = l1\tail_ | ||||
| 	l1\head_ = l2\head_ | ||||
| 	l1\tail_ = l2\tail_ | ||||
| 	l2\head_ = tempH | ||||
| 	l2\tail_ = tempT | ||||
| End Function | ||||
|  | ||||
| ;Create a new list containing the same values as the first | ||||
| Function CopyList.LList(lo.LList) | ||||
| 	Local ln.LList = CreateList() | ||||
| 	Local i.Iterator = GetIterator(lo) : While EachIn(i) | ||||
| 		ListAddLast ln, i\Value | ||||
| 	Wend | ||||
| 	Return ln | ||||
| End Function | ||||
|  | ||||
| ;Reverse the order of elements of a list | ||||
| Function ReverseList(l.LList) | ||||
| 	Local n1.ListNode, n2.ListNode, tmp.ListNode | ||||
| 	 | ||||
| 	n1 = l\head_ | ||||
| 	n2 = l\head_\nx_ | ||||
| 	 | ||||
| 	While n1 <> l\tail_ | ||||
| 		n1\pv_ = n2 | ||||
| 		tmp = n2\nx_ | ||||
| 		n2\nx_ = n1 | ||||
| 		n1 = n2 | ||||
| 		n2 = tmp | ||||
| 	Wend | ||||
| 	 | ||||
| 	tmp = l\head_ | ||||
| 	l\head_ = l\tail_ | ||||
| 	l\tail_ = tmp | ||||
| 	 | ||||
| 	l\head_\pv_ = l\head_ | ||||
| 	l\tail_\nx_ = l\tail_ | ||||
| End Function | ||||
|  | ||||
| ;Search a list to retrieve the first node with the given value | ||||
| Function ListFindNode.ListNode(l.LList, Value) | ||||
| 	Local n.ListNode = l\head_\nx_ | ||||
| 	 | ||||
| 	While n <> l\tail_ | ||||
| 		If n\Value = Value Then Return n | ||||
| 		n = n\nx_ | ||||
| 	Wend | ||||
| 	 | ||||
| 	Return Null | ||||
| End Function | ||||
|  | ||||
| ;Append a value to the end of a list (fast) and return the node | ||||
| Function ListAddLast.ListNode(l.LList, Value) | ||||
| 	Local n.ListNode = New ListNode | ||||
| 	 | ||||
| 	n\pv_ = l\tail_\pv_ | ||||
| 	n\nx_ = l\tail_ | ||||
| 	n\Value = Value | ||||
| 	 | ||||
| 	l\tail_\pv_ = n | ||||
| 	n\pv_\nx_ = n | ||||
| 	 | ||||
| 	Return n | ||||
| End Function | ||||
|  | ||||
| ;Attach a value to the start of a list (fast) and return the node | ||||
| Function ListAddFirst.ListNode(l.LList, Value) | ||||
| 	Local n.ListNode = New ListNode | ||||
| 	 | ||||
| 	n\pv_ = l\head_ | ||||
| 	n\nx_ = l\head_\nx_ | ||||
| 	n\Value = Value | ||||
| 	 | ||||
| 	l\head_\nx_ = n | ||||
| 	n\nx_\pv_ = n | ||||
| 	 | ||||
| 	Return n | ||||
| End Function | ||||
|  | ||||
| ;Remove the first occurence of the given value from a list | ||||
| Function ListRemove(l.LList, Value) | ||||
| 	Local n.ListNode = ListFindNode(l, Value) | ||||
| 	If n <> Null Then RemoveListNode n | ||||
| End Function | ||||
|  | ||||
| ;Remove a node from a list | ||||
| Function RemoveListNode(n.ListNode) | ||||
| 	n\pv_\nx_ = n\nx_ | ||||
| 	n\nx_\pv_ = n\pv_ | ||||
| 	Delete n | ||||
| End Function | ||||
|  | ||||
| ;Return the value of the element at the given position from the start of the list, | ||||
| ;or backwards from the end of the list for a negative index | ||||
| Function ValueAtIndex(l.LList, index) | ||||
| 	Local n.ListNode = ListNodeAtIndex(l, index) | ||||
| 	If n <> Null Then Return n\Value : Else Return 0 | ||||
| End Function | ||||
|  | ||||
| ;Return the ListNode at the given position from the start of the list, or backwards | ||||
| ;from the end of the list for a negative index, or Null if invalid | ||||
| Function ListNodeAtIndex.ListNode(l.LList, index) | ||||
| 	Local e, n.ListNode | ||||
| 	 | ||||
| 	If index >= 0 | ||||
| 		n = l\head_ | ||||
| 		For e = 0 To index | ||||
| 			n = n\nx_ | ||||
| 		Next | ||||
| 		If n = l\tail_ Then n = Null	;Beyond the end of the list - not valid | ||||
| 		 | ||||
| 	Else	;Negative index - count backward | ||||
| 		n = l\tail_ | ||||
| 		For e = 0 To index Step -1 | ||||
| 			n = n\pv_ | ||||
| 		Next | ||||
| 		If n = l\head_ Then n = Null	;Before the start of the list - not valid | ||||
| 		 | ||||
| 	EndIf | ||||
| 	 | ||||
| 	Return n | ||||
| End Function | ||||
|  | ||||
| ;Replace a value at the given position (added by MusicianKool) | ||||
| Function ReplaceValueAtIndex(l.LList,index,value) | ||||
| 	Local n.ListNode = ListNodeAtIndex(l,index) | ||||
| 	If n <> Null Then n\Value = value:Else Return 0 | ||||
| End Function | ||||
|  | ||||
| ;Remove and return a value at the given position (added by MusicianKool) | ||||
| Function RemoveNodeAtIndex(l.LList,index) | ||||
| 	Local n.ListNode = ListNodeAtIndex(l,index),tval | ||||
| 	If n <> Null Then tval = n\Value:RemoveListNode(n):Return tval:Else Return 0 | ||||
| End Function | ||||
|  | ||||
| ;Retrieve the first value from a list | ||||
| Function ListFirst(l.LList) | ||||
| 	If l\head_\nx_ <> l\tail_ Then Return l\head_\nx_\Value | ||||
| End Function | ||||
|  | ||||
| ;Retrieve the last value from a list | ||||
| Function ListLast(l.LList) | ||||
| 	If l\tail_\pv_ <> l\head_ Then Return l\tail_\pv_\Value | ||||
| End Function | ||||
|  | ||||
| ;Remove the first element from a list, and return its value | ||||
| Function ListRemoveFirst(l.LList) | ||||
| 	Local val | ||||
| 	If l\head_\nx_ <> l\tail_ | ||||
| 		val = l\head_\nx_\Value | ||||
| 		RemoveListNode l\head_\nx_ | ||||
| 	EndIf | ||||
| 	Return val | ||||
| End Function | ||||
|  | ||||
| ;Remove the last element from a list, and return its value | ||||
| Function ListRemoveLast(l.LList) | ||||
| 	Local val | ||||
| 	If l\tail_\pv_ <> l\head_ | ||||
| 		val = l\tail_\pv_\Value | ||||
| 		RemoveListNode l\tail_\pv_ | ||||
| 	EndIf | ||||
| 	Return val | ||||
| End Function | ||||
|  | ||||
| ;Insert a value into a list before the specified node, and return the new node | ||||
| Function InsertBeforeNode.ListNode(Value, n.ListNode) | ||||
| 	Local bef.ListNode = New ListNode | ||||
| 	 | ||||
| 	bef\pv_ = n\pv_ | ||||
| 	bef\nx_ = n | ||||
| 	bef\Value = Value | ||||
| 	 | ||||
| 	n\pv_ = bef | ||||
| 	bef\pv_\nx_ = bef | ||||
| 	 | ||||
| 	Return bef | ||||
| End Function | ||||
|  | ||||
| ;Insert a value into a list after the specified node, and return then new node | ||||
| Function InsertAfterNode.ListNode(Value, n.ListNode) | ||||
| 	Local aft.ListNode = New ListNode | ||||
| 	 | ||||
| 	aft\nx_ = n\nx_ | ||||
| 	aft\pv_ = n | ||||
| 	aft\Value = Value | ||||
| 	 | ||||
| 	n\nx_ = aft | ||||
| 	aft\nx_\pv_ = aft | ||||
| 	 | ||||
| 	Return aft | ||||
| End Function | ||||
|  | ||||
| ;Get an iterator object to use with a loop | ||||
| ;This function means that most programs won't have to think about deleting iterators manually | ||||
| ;(in general only a small, constant number will be created) | ||||
| Function GetIterator.Iterator(l.LList) | ||||
| 	Local i.Iterator | ||||
| 	 | ||||
| 	If l = Null Then RuntimeError "Cannot create Iterator for Null" | ||||
| 	 | ||||
| 	For i = Each Iterator		;See if there's an available iterator at the moment | ||||
| 		If i\l_ = Null Then Exit | ||||
| 	Next | ||||
| 	 | ||||
| 	If i = Null Then i = New Iterator	;If there wasn't, create one | ||||
| 	 | ||||
| 	i\l_ = l | ||||
| 	i\cn_ = l\head_ | ||||
| 	i\cni_ = -1 | ||||
| 	i\Value = 0		;No especial reason why this has to be anything, but meh | ||||
| 	 | ||||
| 	Return i | ||||
| End Function | ||||
|  | ||||
| ;Use as the argument to While to iterate over the members of a list | ||||
| Function EachIn(i.Iterator) | ||||
| 	 | ||||
| 	i\cn_ = i\cn_\nx_ | ||||
| 	 | ||||
| 	If i\cn_ <> i\l_\tail_		;Still items in the list | ||||
| 		i\Value = i\cn_\Value | ||||
| 		i\cni_ = i\cni_ + 1 | ||||
| 		Return True | ||||
| 		 | ||||
| 	Else | ||||
| 		i\l_ = Null		;Disconnect from the list, having reached the end | ||||
| 		i\cn_ = Null | ||||
| 		i\cni_ = -1 | ||||
| 		Return False | ||||
| 		 | ||||
| 	EndIf | ||||
| End Function | ||||
|  | ||||
| ;Remove from the containing list the element currently pointed to by an iterator | ||||
| Function IteratorRemove(i.Iterator) | ||||
| 	If (i\cn_ <> i\l_\head_) And (i\cn_ <> i\l_\tail_) | ||||
| 		Local temp.ListNode = i\cn_ | ||||
| 		 | ||||
| 		i\cn_ = i\cn_\pv_ | ||||
| 		i\cni_ = i\cni_ - 1 | ||||
| 		i\Value = 0 | ||||
| 		 | ||||
| 		RemoveListNode temp | ||||
| 		 | ||||
| 		Return True | ||||
| 	Else | ||||
| 		Return False | ||||
| 	EndIf | ||||
| End Function | ||||
|  | ||||
| ;Call this before breaking out of an EachIn loop, to disconnect the iterator from the list | ||||
| Function IteratorBreak(i.Iterator) | ||||
| 	i\l_ = Null | ||||
| 	i\cn_ = Null | ||||
| 	i\cni_ = -1 | ||||
| 	i\Value = 0 | ||||
| End Function | ||||
|  | ||||
|  | ||||
| ;~IDEal Editor Parameters: | ||||
| ;~F#5#A#10#18#2A#32#3E#47#4C#58#66#6F#78#8F#9B#A9#B7#BD#C5#CC | ||||
| ;~F#E3#E9#EF#F4#F9#103#10D#11B#12B#13F#152#163 | ||||
| ;~C#Blitz3D | ||||
							
								
								
									
										66
									
								
								samples/BlitzBasic/PObj.bb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								samples/BlitzBasic/PObj.bb
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,66 @@ | ||||
|  | ||||
| Local i, start, result | ||||
|  | ||||
| Local s.Sum3Obj = New Sum3Obj | ||||
|  | ||||
| For i = 1 To 100000 | ||||
| 	s = New Sum3Obj | ||||
| 	result = Handle Before s | ||||
| 	Delete s | ||||
| Next | ||||
|  | ||||
| start = MilliSecs() | ||||
| For i = 1 To 1000000 | ||||
| 	result = Sum3_(MakeSum3Obj(i, i, i)) | ||||
| Next | ||||
| start = MilliSecs() - start | ||||
| Print start | ||||
|  | ||||
| start = MilliSecs() | ||||
| For i = 1 To 1000000 | ||||
| 	result = Sum3(i, i, i) | ||||
| Next | ||||
| start = MilliSecs() - start | ||||
| Print start | ||||
|  | ||||
| WaitKey | ||||
| End | ||||
|  | ||||
|  | ||||
| Function Sum3(a, b, c) | ||||
| 	Return a + b + c | ||||
| End Function | ||||
|  | ||||
|  | ||||
| Type Sum3Obj | ||||
| 	Field isActive | ||||
| 	Field a, b, c | ||||
| End Type | ||||
|  | ||||
| Function MakeSum3Obj(a, b, c) | ||||
| 	Local s.Sum3Obj = Last Sum3Obj | ||||
| 	If s\isActive Then s = New Sum3Obj | ||||
| 	s\isActive = True | ||||
| 	s\a = a | ||||
| 	s\b = b | ||||
| 	s\c = c | ||||
| 	 | ||||
| 	Restore label | ||||
| 	Read foo | ||||
| 	 | ||||
| 	Return Handle(s) | ||||
| End Function | ||||
|  | ||||
| .label | ||||
| Data (10 + 2), 12, 14 | ||||
| : | ||||
| Function Sum3_(a_) | ||||
| 	Local a.Sum3Obj = Object.Sum3Obj a_ | ||||
| 	Local return_ =  a\a + a\b + a\c | ||||
| 	Insert a Before First Sum3Obj :: a\isActive = False | ||||
| 	Return return_ | ||||
| End Function | ||||
|  | ||||
|  | ||||
| ;~IDEal Editor Parameters: | ||||
| ;~C#Blitz3D | ||||
							
								
								
									
										25
									
								
								samples/BlitzMax/sample.bmx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								samples/BlitzMax/sample.bmx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | ||||
| SuperStrict | ||||
|  | ||||
| Framework Brl.StandardIO | ||||
|  | ||||
| Type TMyType | ||||
| 	Field property:int | ||||
|  | ||||
| 	Function A:int(param:int) | ||||
| 		'do nothing | ||||
| 	End Function | ||||
|  | ||||
| 	Method B:int(param:int) | ||||
| 		'do nothing | ||||
| 	End Method | ||||
| End Type | ||||
|  | ||||
|  | ||||
| Global my:TMyType = new TMyType | ||||
| ?Win32 | ||||
| 	my.A() | ||||
| 	my.B() | ||||
| ?Linux | ||||
| 	my.B() | ||||
| 	my.A() | ||||
| ? | ||||
							
								
								
									
										167
									
								
								samples/Bluespec/TL.bsv
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										167
									
								
								samples/Bluespec/TL.bsv
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,167 @@ | ||||
| package TL; | ||||
|  | ||||
| interface TL; | ||||
|    method Action ped_button_push(); | ||||
|  | ||||
|          (* always_enabled *) | ||||
|          method Action set_car_state_N(Bool x); | ||||
|          (* always_enabled *) | ||||
|          method Action set_car_state_S(Bool x); | ||||
|          (* always_enabled *) | ||||
|          method Action set_car_state_E(Bool x); | ||||
|          (* always_enabled *) | ||||
|          method Action set_car_state_W(Bool x); | ||||
|  | ||||
|    method Bool lampRedNS(); | ||||
|    method Bool lampAmberNS(); | ||||
|    method Bool lampGreenNS(); | ||||
|  | ||||
|    method Bool lampRedE(); | ||||
|    method Bool lampAmberE(); | ||||
|    method Bool lampGreenE(); | ||||
|  | ||||
|    method Bool lampRedW(); | ||||
|    method Bool lampAmberW(); | ||||
|    method Bool lampGreenW(); | ||||
|  | ||||
|    method Bool lampRedPed(); | ||||
|    method Bool lampAmberPed(); | ||||
|    method Bool lampGreenPed(); | ||||
| endinterface: TL | ||||
|  | ||||
| typedef enum { | ||||
|          AllRed, | ||||
|          GreenNS, AmberNS, | ||||
|          GreenE, AmberE, | ||||
|          GreenW, AmberW, | ||||
|          GreenPed, AmberPed} TLstates deriving (Eq, Bits); | ||||
|  | ||||
| typedef UInt#(5) Time32; | ||||
| typedef UInt#(20) CtrSize; | ||||
|  | ||||
| (* synthesize *) | ||||
| module sysTL(TL); | ||||
|    Time32 allRedDelay = 2; | ||||
|    Time32 amberDelay = 4; | ||||
|    Time32 nsGreenDelay = 20; | ||||
|    Time32 ewGreenDelay = 10; | ||||
|    Time32 pedGreenDelay = 10; | ||||
|    Time32 pedAmberDelay = 6; | ||||
|  | ||||
|    CtrSize clocks_per_sec = 100; | ||||
|  | ||||
|    Reg#(TLstates) state <- mkReg(AllRed); | ||||
|    Reg#(TLstates) next_green <- mkReg(GreenNS); | ||||
|    Reg#(Time32) secs <- mkReg(0); | ||||
|    Reg#(Bool) ped_button_pushed <- mkReg(False); | ||||
|          Reg#(Bool) car_present_N <- mkReg(True); | ||||
|    Reg#(Bool) car_present_S <- mkReg(True); | ||||
|    Reg#(Bool) car_present_E <- mkReg(True); | ||||
|    Reg#(Bool) car_present_W <- mkReg(True); | ||||
|          Bool car_present_NS = car_present_N || car_present_S; | ||||
|    Reg#(CtrSize) cycle_ctr <- mkReg(0); | ||||
|  | ||||
|    rule dec_cycle_ctr (cycle_ctr != 0); | ||||
|       cycle_ctr <= cycle_ctr - 1; | ||||
|    endrule | ||||
|  | ||||
|    Rules low_priority_rule = (rules | ||||
|                         rule inc_sec (cycle_ctr == 0); | ||||
|                                  secs <= secs + 1; | ||||
|                                  cycle_ctr <= clocks_per_sec; | ||||
|                         endrule endrules); | ||||
|  | ||||
|    function Action next_state(TLstates ns); | ||||
|          action | ||||
|                                  state <= ns; | ||||
|                                  secs <= 0; | ||||
|       endaction | ||||
|    endfunction: next_state | ||||
|  | ||||
|    function TLstates green_seq(TLstates x); | ||||
|       case (x) | ||||
|                                  GreenNS: return (GreenE); | ||||
|                                  GreenE:  return (GreenW); | ||||
|                                  GreenW:  return (GreenNS); | ||||
|       endcase | ||||
|    endfunction | ||||
|  | ||||
|    function Bool car_present(TLstates x); | ||||
|       case (x) | ||||
|                                  GreenNS: return (car_present_NS); | ||||
|                                  GreenE:  return (car_present_E); | ||||
|                                  GreenW:  return (car_present_W); | ||||
|       endcase | ||||
|    endfunction | ||||
|  | ||||
|    function Rules make_from_green_rule(TLstates green_state, Time32 delay, Bool car_is_present, TLstates ns); | ||||
|                         return (rules | ||||
|                                  rule from_green (state == green_state && (secs >= delay || !car_is_present)); | ||||
|                                                 next_state(ns); | ||||
|                                  endrule endrules); | ||||
|    endfunction: make_from_green_rule | ||||
|  | ||||
|    function Rules make_from_amber_rule(TLstates amber_state, TLstates ng); | ||||
|       return (rules | ||||
|                                  rule from_amber (state == amber_state && secs >= amberDelay); | ||||
|                                                 next_state(AllRed); | ||||
|                                                 next_green <= ng; | ||||
|                                  endrule endrules); | ||||
|    endfunction: make_from_amber_rule | ||||
|  | ||||
|    Rules hprs[7]; | ||||
|  | ||||
|    hprs[1] = make_from_green_rule(GreenNS, nsGreenDelay, car_present_NS, AmberNS); | ||||
|    hprs[2] = make_from_amber_rule(AmberNS, GreenE); | ||||
|    hprs[3] = make_from_green_rule(GreenE, ewGreenDelay, car_present_E, AmberE); | ||||
|    hprs[4] = make_from_amber_rule(AmberE, GreenW); | ||||
|    hprs[5] = make_from_green_rule(GreenW, ewGreenDelay, car_present_W, AmberW); | ||||
|    hprs[6] = make_from_amber_rule(AmberW, GreenNS); | ||||
|  | ||||
|          hprs[0] = (rules | ||||
|                         rule fromAllRed (state == AllRed && secs >= allRedDelay); | ||||
|                                  if (ped_button_pushed) action | ||||
|                                                 ped_button_pushed <= False; | ||||
|                                                 next_state(GreenPed); | ||||
|                                  endaction else if (car_present(next_green)) | ||||
|                               next_state(next_green); | ||||
|                            else if (car_present(green_seq(next_green))) | ||||
|                                     next_state(green_seq(next_green)); | ||||
|          else if (car_present(green_seq(green_seq(next_green)))) | ||||
|                                     next_state(green_seq(green_seq(next_green))); | ||||
|          else | ||||
|                                     noAction; | ||||
|                         endrule: fromAllRed endrules); | ||||
|  | ||||
|          Rules high_priority_rules = hprs[0]; | ||||
|    for (Integer i = 1; i<7; i=i+1) | ||||
|       high_priority_rules = rJoin(hprs[i], high_priority_rules); | ||||
|  | ||||
|          addRules(preempts(high_priority_rules, low_priority_rule)); | ||||
|  | ||||
|    method Action ped_button_push(); | ||||
|       ped_button_pushed <= True; | ||||
|    endmethod: ped_button_push | ||||
|  | ||||
|    method Action set_car_state_N(b) ; car_present_N <= b; endmethod | ||||
|    method Action set_car_state_S(b) ; car_present_S <= b; endmethod | ||||
|    method Action set_car_state_E(b) ; car_present_E <= b; endmethod | ||||
|    method Action set_car_state_W(b) ; car_present_W <= b; endmethod | ||||
|  | ||||
|    method lampRedNS() = (!(state == GreenNS || state == AmberNS)); | ||||
|    method lampAmberNS() = (state == AmberNS); | ||||
|    method lampGreenNS() = (state == GreenNS); | ||||
|    method lampRedE() = (!(state == GreenE || state == AmberE)); | ||||
|    method lampAmberE() = (state == AmberE); | ||||
|    method lampGreenE() = (state == GreenE); | ||||
|    method lampRedW() = (!(state == GreenW || state == AmberW)); | ||||
|    method lampAmberW() = (state == AmberW); | ||||
|    method lampGreenW() = (state == GreenW); | ||||
|  | ||||
|    method lampRedPed() = (!(state == GreenPed || state == AmberPed)); | ||||
|    method lampAmberPed() = (state == AmberPed); | ||||
|    method lampGreenPed() = (state == GreenPed); | ||||
|  | ||||
| endmodule: sysTL | ||||
|  | ||||
| endpackage: TL | ||||
							
								
								
									
										109
									
								
								samples/Bluespec/TbTL.bsv
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										109
									
								
								samples/Bluespec/TbTL.bsv
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,109 @@ | ||||
| package TbTL; | ||||
|  | ||||
| import TL::*; | ||||
|  | ||||
| interface Lamp; | ||||
|    method Bool changed; | ||||
|    method Action show_offs; | ||||
|    method Action show_ons; | ||||
|    method Action reset; | ||||
| endinterface | ||||
|  | ||||
| module mkLamp#(String name, Bool lamp)(Lamp); | ||||
|    Reg#(Bool) prev <- mkReg(False); | ||||
|  | ||||
|    method changed = (prev != lamp); | ||||
|  | ||||
|    method Action show_offs; | ||||
|       if (prev && !lamp) | ||||
|       $write (name + " off, "); | ||||
|    endmethod | ||||
|  | ||||
|    method Action show_ons; | ||||
|       if (!prev && lamp) | ||||
|       $write (name + " on, "); | ||||
|    endmethod | ||||
|  | ||||
|    method Action reset; | ||||
|       prev <= lamp; | ||||
|    endmethod | ||||
| endmodule | ||||
|  | ||||
|  | ||||
| (* synthesize *) | ||||
| module mkTest(); | ||||
|    let dut <- sysTL; | ||||
|  | ||||
|    Reg#(Bit#(16)) ctr <- mkReg(0); | ||||
|  | ||||
|    Reg#(Bool) carN <- mkReg(False); | ||||
|    Reg#(Bool) carS <- mkReg(False); | ||||
|    Reg#(Bool) carE <- mkReg(False); | ||||
|    Reg#(Bool) carW <- mkReg(False); | ||||
|  | ||||
|    Lamp lamps[12]; | ||||
|  | ||||
|    lamps[0] <- mkLamp("0:  NS  red  ", dut.lampRedNS); | ||||
|    lamps[1] <- mkLamp("1:  NS  amber", dut.lampAmberNS); | ||||
|    lamps[2] <- mkLamp("2:  NS  green", dut.lampGreenNS); | ||||
|    lamps[3] <- mkLamp("3:  E   red  ", dut.lampRedE); | ||||
|    lamps[4] <- mkLamp("4:  E   amber", dut.lampAmberE); | ||||
|    lamps[5] <- mkLamp("5:  E   green", dut.lampGreenE); | ||||
|    lamps[6] <- mkLamp("6:  W   red  ", dut.lampRedW); | ||||
|    lamps[7] <- mkLamp("7:  W   amber", dut.lampAmberW); | ||||
|    lamps[8] <- mkLamp("8:  W   green", dut.lampGreenW); | ||||
|  | ||||
|    lamps[9]  <- mkLamp("9:  Ped red  ", dut.lampRedPed); | ||||
|    lamps[10] <- mkLamp("10: Ped amber", dut.lampAmberPed); | ||||
|    lamps[11] <- mkLamp("11: Ped green", dut.lampGreenPed); | ||||
|  | ||||
|    rule start (ctr == 0); | ||||
|       $dumpvars; | ||||
|    endrule | ||||
|  | ||||
|    rule detect_cars; | ||||
|       dut.set_car_state_N(carN); | ||||
|       dut.set_car_state_S(carS); | ||||
|       dut.set_car_state_E(carE); | ||||
|       dut.set_car_state_W(carW); | ||||
|    endrule | ||||
|  | ||||
|    rule go; | ||||
|       ctr <= ctr + 1; | ||||
|       if (ctr == 5000) carN <= True; | ||||
|       if (ctr == 6500) carN <= False; | ||||
|       if (ctr == 12_000) dut.ped_button_push; | ||||
|    endrule | ||||
|  | ||||
|    rule stop (ctr > 32768); | ||||
|       $display("TESTS FINISHED"); | ||||
|       $finish(0); | ||||
|    endrule | ||||
|  | ||||
|    function do_offs(l) = l.show_offs; | ||||
|       function do_ons(l) = l.show_ons; | ||||
|       function do_reset(l) = l.reset; | ||||
|  | ||||
|       function do_it(f); | ||||
|          action | ||||
|          for (Integer i=0; i<12; i=i+1) | ||||
|             f(lamps[i]); | ||||
|          endaction | ||||
|       endfunction | ||||
|  | ||||
|       function any_changes(); | ||||
|          Bool b = False; | ||||
|          for (Integer i=0; i<12; i=i+1) | ||||
|              b = b || lamps[i].changed; | ||||
|          return b; | ||||
|       endfunction | ||||
|  | ||||
|       rule show (any_changes()); | ||||
|       do_it(do_offs); | ||||
|       do_it(do_ons); | ||||
|       do_it(do_reset); | ||||
|       $display("(at time %d)", $time); | ||||
|    endrule | ||||
| endmodule | ||||
|  | ||||
| endpackage | ||||
							
								
								
									
										305
									
								
								samples/Brightscript/SimpleGrid.brs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										305
									
								
								samples/Brightscript/SimpleGrid.brs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,305 @@ | ||||
| ' ********************************************************* | ||||
| ' **  Simple Grid Screen Demonstration App | ||||
| ' **  Jun 2010 | ||||
| ' **  Copyright (c) 2010 Roku Inc. All Rights Reserved. | ||||
| ' ********************************************************* | ||||
|  | ||||
| '************************************************************ | ||||
| '** Application startup | ||||
| '************************************************************ | ||||
| Sub Main() | ||||
|  | ||||
|     'initialize theme attributes like titles, logos and overhang color | ||||
|     initTheme() | ||||
|    | ||||
|     gridstyle = "Flat-Movie" | ||||
|  | ||||
|     'set to go, time to get started | ||||
|     while gridstyle <> "" | ||||
|         print "starting grid style= ";gridstyle | ||||
|         screen=preShowGridScreen(gridstyle) | ||||
|         gridstyle = showGridScreen(screen, gridstyle) | ||||
|     end while | ||||
|  | ||||
| End Sub | ||||
|  | ||||
|  | ||||
| '************************************************************* | ||||
| '** Set the configurable theme attributes for the application | ||||
| '**  | ||||
| '** Configure the custom overhang and Logo attributes | ||||
| '** These attributes affect the branding of the application | ||||
| '** and are artwork, colors and offsets specific to the app | ||||
| '************************************************************* | ||||
|  | ||||
| Sub initTheme() | ||||
|     app = CreateObject("roAppManager") | ||||
|     app.SetTheme(CreateDefaultTheme()) | ||||
| End Sub | ||||
|  | ||||
| '****************************************************** | ||||
| '** @return The default application theme. | ||||
| '** Screens can make slight adjustments to the default | ||||
| '** theme by getting it from here and then overriding | ||||
| '** individual theme attributes. | ||||
| '****************************************************** | ||||
| Function CreateDefaultTheme() as Object | ||||
|     theme = CreateObject("roAssociativeArray") | ||||
|  | ||||
|     theme.ThemeType = "generic-dark" | ||||
|  | ||||
|     ' All these are greyscales | ||||
|     theme.GridScreenBackgroundColor = "#363636" | ||||
|     theme.GridScreenMessageColor    = "#808080" | ||||
|     theme.GridScreenRetrievingColor = "#CCCCCC" | ||||
|     theme.GridScreenListNameColor   = "#FFFFFF" | ||||
|  | ||||
|     ' Color values work here | ||||
|     theme.GridScreenDescriptionTitleColor    = "#001090" | ||||
|     theme.GridScreenDescriptionDateColor     = "#FF005B" | ||||
|     theme.GridScreenDescriptionRuntimeColor  = "#5B005B" | ||||
|     theme.GridScreenDescriptionSynopsisColor = "#606000" | ||||
|      | ||||
|     'used in the Grid Screen | ||||
|     theme.CounterTextLeft           = "#FF0000" | ||||
|     theme.CounterSeparator          = "#00FF00" | ||||
|     theme.CounterTextRight          = "#0000FF" | ||||
|      | ||||
|     theme.GridScreenLogoHD          = "pkg:/images/Overhang_Test_HD.png" | ||||
|  | ||||
|     theme.GridScreenLogoOffsetHD_X  = "0" | ||||
|     theme.GridScreenLogoOffsetHD_Y  = "0" | ||||
|     theme.GridScreenOverhangHeightHD = "99" | ||||
|  | ||||
|     theme.GridScreenLogoSD          = "pkg:/images/Overhang_Test_SD43.png" | ||||
|     theme.GridScreenOverhangHeightSD = "66" | ||||
|     theme.GridScreenLogoOffsetSD_X  = "0" | ||||
|     theme.GridScreenLogoOffsetSD_Y  = "0" | ||||
|      | ||||
|     ' to use your own focus ring artwork  | ||||
|     'theme.GridScreenFocusBorderSD        = "pkg:/images/GridCenter_Border_Movies_SD43.png" | ||||
|     'theme.GridScreenBorderOffsetSD  = "(-26,-25)" | ||||
|     'theme.GridScreenFocusBorderHD        = "pkg:/images/GridCenter_Border_Movies_HD.png" | ||||
|     'theme.GridScreenBorderOffsetHD  = "(-28,-20)" | ||||
|      | ||||
|     ' to use your own description background artwork | ||||
|     'theme.GridScreenDescriptionImageSD  = "pkg:/images/Grid_Description_Background_SD43.png" | ||||
|     'theme.GridScreenDescriptionOffsetSD = "(125,170)" | ||||
|     'theme.GridScreenDescriptionImageHD  = "pkg:/images/Grid_Description_Background_HD.png" | ||||
|     'theme.GridScreenDescriptionOffsetHD = "(190,255)" | ||||
|      | ||||
|  | ||||
|     return theme | ||||
| End Function | ||||
|  | ||||
| '****************************************************** | ||||
| '** Perform any startup/initialization stuff prior to  | ||||
| '** initially showing the screen.   | ||||
| '****************************************************** | ||||
| Function preShowGridScreen(style as string) As Object | ||||
|  | ||||
|     m.port=CreateObject("roMessagePort") | ||||
|     screen = CreateObject("roGridScreen") | ||||
|     screen.SetMessagePort(m.port) | ||||
| '    screen.SetDisplayMode("best-fit") | ||||
|     screen.SetDisplayMode("scale-to-fill") | ||||
|  | ||||
|     screen.SetGridStyle(style) | ||||
|     return screen | ||||
|  | ||||
| End Function | ||||
|  | ||||
|  | ||||
| '****************************************************** | ||||
| '** Display the gird screen and wait for events from  | ||||
| '** the screen. The screen will show retreiving while | ||||
| '** we fetch and parse the feeds for the show posters | ||||
| '****************************************************** | ||||
| Function showGridScreen(screen As Object, gridstyle as string) As string | ||||
|  | ||||
|     print "enter showGridScreen" | ||||
|  | ||||
|     categoryList = getCategoryList() | ||||
|     categoryList[0] = "GridStyle: " + gridstyle | ||||
|     screen.setupLists(categoryList.count()) | ||||
|     screen.SetListNames(categoryList) | ||||
|     StyleButtons = getGridControlButtons() | ||||
|     screen.SetContentList(0, StyleButtons) | ||||
|     for i = 1 to categoryList.count()-1 | ||||
|         screen.SetContentList(i, getShowsForCategoryItem(categoryList[i])) | ||||
|     end for | ||||
|     screen.Show() | ||||
|  | ||||
|     while true | ||||
|         print "Waiting for message" | ||||
|         msg = wait(0, m.port) | ||||
|         'msg = wait(0, screen.GetMessagePort())     ' getmessageport does not work on gridscreen | ||||
|         print "Got Message:";type(msg) | ||||
|         if type(msg) = "roGridScreenEvent" then | ||||
|             print "msg= "; msg.GetMessage() " , index= "; msg.GetIndex(); " data= "; msg.getData() | ||||
|             if msg.isListItemFocused() then | ||||
|                 print"list item focused | current show = "; msg.GetIndex() | ||||
|             else if msg.isListItemSelected() then | ||||
|                 row = msg.GetIndex() | ||||
|                 selection = msg.getData() | ||||
|                 print "list item selected row= "; row; " selection= "; selection | ||||
|  | ||||
|                 ' Did we get a selection from the gridstyle selection row? | ||||
|                 if (row = 0) | ||||
|                     ' yes, return so we can come back with new style | ||||
|                     return StyleButtons[selection].Title | ||||
|                 endif | ||||
|  | ||||
|                 'm.curShow = displayShowDetailScreen(showList[msg.GetIndex()]) | ||||
|             else if msg.isScreenClosed() then | ||||
|                 return "" | ||||
|             end if | ||||
|         end If | ||||
|     end while | ||||
|  | ||||
|  | ||||
| End Function | ||||
|  | ||||
| '********************************************************** | ||||
| '** When a poster on the home screen is selected, we call | ||||
| '** this function passing an roAssociativeArray with the  | ||||
| '** ContentMetaData for the selected show.  This data should  | ||||
| '** be sufficient for the springboard to display | ||||
| '********************************************************** | ||||
| Function displayShowDetailScreen(category as Object, showIndex as Integer) As Integer | ||||
|  | ||||
|     'add code to create springboard, for now we do nothing | ||||
|     return 1 | ||||
|  | ||||
| End Function | ||||
|  | ||||
|  | ||||
| '************************************************************** | ||||
| '** Return the list of categories to display in the filter | ||||
| '** banner. The result is an roArray containing the names of  | ||||
| '** all of the categories. All just static data for the example. | ||||
| '*************************************************************** | ||||
| Function getCategoryList() As Object | ||||
|  | ||||
|     categoryList = [ "GridStyle", "Reality", "History", "News", "Comedy", "Drama"] | ||||
|     return categoryList | ||||
|  | ||||
| End Function | ||||
|  | ||||
|  | ||||
| '******************************************************************** | ||||
| '** Given the category from the filter banner, return an array  | ||||
| '** of ContentMetaData objects (roAssociativeArray's) representing  | ||||
| '** the shows for the category. For this example, we just cheat and | ||||
| '** create and return a static array with just the minimal items | ||||
| '** set, but ideally, you'd go to a feed service, fetch and parse | ||||
| '** this data dynamically, so content for each category is dynamic | ||||
| '******************************************************************** | ||||
| Function getShowsForCategoryItem(category As Object) As Object | ||||
|  | ||||
|     print "getting shows for category "; category | ||||
|  | ||||
|     showList = [ | ||||
|         { | ||||
|             Title: category + ": Header", | ||||
|             releaseDate: "1976", | ||||
|             length: 3600-600, | ||||
|             Description:"This row is category " + category, | ||||
|             hdBranded: true, | ||||
|             HDPosterUrl:"http://upload.wikimedia.org/wikipedia/commons/4/43/Gold_star_on_blue.gif", | ||||
|             SDPosterUrl:"http://upload.wikimedia.org/wikipedia/commons/4/43/Gold_star_on_blue.gif", | ||||
|             Description:"Short Synopsis #1", | ||||
|             Synopsis:"Length", | ||||
|             StarRating:10, | ||||
|         } | ||||
|         { | ||||
|             Title: category + ": Beverly Hillbillies", | ||||
|             releaseDate: "1969", | ||||
|             rating: "PG", | ||||
|             Description:"Come and listen to a story about a man named Jed: Poor mountaineer, barely kept his family fed. Then one day he was shootin at some food, and up through the ground came a bubblin crude. Oil that is, black gold, Texas tea.", | ||||
|             numEpisodes:42, | ||||
|             contentType:"season", | ||||
|             HDPosterUrl:"http://upload.wikimedia.org/wikipedia/en/4/4e/The_Beverly_Hillbillies.jpg", | ||||
|             SDPosterUrl:"http://upload.wikimedia.org/wikipedia/en/4/4e/The_Beverly_Hillbillies.jpg", | ||||
|             StarRating:80, | ||||
|             UserStarRating:40 | ||||
|         } | ||||
|         { | ||||
|             Title: category + ": Babylon 5", | ||||
|             releaseDate: "1996", | ||||
|             rating: "PG", | ||||
|             Description:"The show centers on the Babylon 5 space station: a focal point for politics, diplomacy, and conflict during the years 2257-2262.", | ||||
|             numEpisodes:102, | ||||
|             contentType:"season", | ||||
|             HDPosterUrl:"http://upload.wikimedia.org/wikipedia/en/9/9d/Smb5-s4.jpg", | ||||
|             SDPosterUrl:"http://upload.wikimedia.org/wikipedia/en/9/9d/Smb5-s4.jpg", | ||||
|             StarRating:80, | ||||
|             UserStarRating:40 | ||||
|         } | ||||
|         { | ||||
|             Title: category + ": John F. Kennedy", | ||||
|             releaseDate: "1961", | ||||
|             rating: "PG", | ||||
|             Description:"My fellow citizens of the world: ask not what America will do for you, but what together we can do for the freedom of man.", | ||||
|             HDPosterUrl:"http://upload.wikimedia.org/wikipedia/en/5/52/Jfk_happy_birthday_1.jpg", | ||||
|             SDPosterUrl:"http://upload.wikimedia.org/wikipedia/en/5/52/Jfk_happy_birthday_1.jpg", | ||||
|             StarRating:100 | ||||
|         } | ||||
|         { | ||||
|             Title: category + ": Man on the Moon", | ||||
|             releaseDate: "1969", | ||||
|             rating: "PG", | ||||
|             Description:"That's one small step for a man, one giant leap for mankind.", | ||||
|             HDPosterUrl:"http://upload.wikimedia.org/wikipedia/commons/1/1e/Apollo_11_first_step.jpg", | ||||
|             SDPosterUrl:"http://upload.wikimedia.org/wikipedia/commons/1/1e/Apollo_11_first_step.jpg", | ||||
|             StarRating:100 | ||||
|         } | ||||
|         { | ||||
|             Title: category + ": I have a Dream", | ||||
|             releaseDate: "1963", | ||||
|             rating: "PG", | ||||
|             Description:"I have a dream that my four little children will one day live in a nation where they will not be judged by the color of their skin, but by the content of their character.", | ||||
|             HDPosterUrl:"http://upload.wikimedia.org/wikipedia/commons/8/81/Martin_Luther_King_-_March_on_Washington.jpg", | ||||
|             SDPosterUrl:"http://upload.wikimedia.org/wikipedia/commons/8/81/Martin_Luther_King_-_March_on_Washington.jpg", | ||||
|             StarRating:100 | ||||
|         } | ||||
|     ] | ||||
|  | ||||
|     return showList | ||||
| End Function | ||||
|      | ||||
| function getGridControlButtons() as object | ||||
|         buttons = [ | ||||
|             { Title: "Flat-Movie" | ||||
|               ReleaseDate: "HD:5x2 SD:5x2" | ||||
|               Description: "Flat-Movie (Netflix) style" | ||||
|               HDPosterUrl:"http://upload.wikimedia.org/wikipedia/commons/4/43/Gold_star_on_blue.gif" | ||||
|               SDPosterUrl:"http://upload.wikimedia.org/wikipedia/commons/4/43/Gold_star_on_blue.gif" | ||||
|             } | ||||
|             { Title: "Flat-Landscape" | ||||
|               ReleaseDate: "HD:5x3 SD:4x3" | ||||
|               Description: "Channel Store" | ||||
|               HDPosterUrl:"http://upload.wikimedia.org/wikipedia/commons/thumb/9/96/Dunkery_Hill.jpg/800px-Dunkery_Hill.jpg", | ||||
|               SDPosterUrl:"http://upload.wikimedia.org/wikipedia/commons/thumb/9/96/Dunkery_Hill.jpg/800px-Dunkery_Hill.jpg", | ||||
|             } | ||||
|             { Title: "Flat-Portrait" | ||||
|               ReleaseDate: "HD:5x2 SD:5x2" | ||||
|               Description: "3x4 style posters" | ||||
|               HDPosterUrl:"http://upload.wikimedia.org/wikipedia/commons/9/9f/Kane_George_Gurnett.jpg", | ||||
|               SDPosterUrl:"http://upload.wikimedia.org/wikipedia/commons/9/9f/Kane_George_Gurnett.jpg", | ||||
|             } | ||||
|             { Title: "Flat-Square" | ||||
|               ReleaseDate: "HD:7x3 SD:6x3" | ||||
|               Description: "1x1 style posters" | ||||
|               HDPosterUrl:"http://upload.wikimedia.org/wikipedia/commons/thumb/d/de/SQUARE_SHAPE.svg/536px-SQUARE_SHAPE.svg.png", | ||||
|               SDPosterUrl:"http://upload.wikimedia.org/wikipedia/commons/thumb/d/de/SQUARE_SHAPE.svg/536px-SQUARE_SHAPE.svg.png", | ||||
|             } | ||||
|             { Title: "Flat-16x9" | ||||
|               ReleaseDate: "HD:5x3 SD:4x3" | ||||
|               Description: "HD style posters" | ||||
|               HDPosterUrl:"http://upload.wikimedia.org/wikipedia/commons/thumb/2/22/%C3%89cran_TV_plat.svg/200px-%C3%89cran_TV_plat.svg.png", | ||||
|               SDPosterUrl:"http://upload.wikimedia.org/wikipedia/commons/thumb/2/22/%C3%89cran_TV_plat.svg/200px-%C3%89cran_TV_plat.svg.png", | ||||
|             } | ||||
|        ] | ||||
|        return buttons | ||||
| End Function | ||||
							
								
								
									
										45
									
								
								samples/C#/Index.cshtml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								samples/C#/Index.cshtml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,45 @@ | ||||
| @{ | ||||
|     ViewBag.Title = "Home Page"; | ||||
| } | ||||
| @section featured { | ||||
|     <section class="featured"> | ||||
|         <div class="content-wrapper"> | ||||
|             <hgroup class="title"> | ||||
|                 <h1>@ViewBag.Title.</h1> | ||||
|                 <h2>@ViewBag.Message</h2> | ||||
|             </hgroup> | ||||
|             <p> | ||||
|                 To learn more about ASP.NET MVC visit | ||||
|                 <a href="http://asp.net/mvc" title="ASP.NET MVC Website">http://asp.net/mvc</a>. | ||||
|                 The page features <mark>videos, tutorials, and samples</mark> to help you get the most from ASP.NET MVC. | ||||
|                 If you have any questions about ASP.NET MVC visit | ||||
|                 <a href="http://forums.asp.net/1146.aspx/1?MVC" title="ASP.NET MVC Forum">our forums</a>. | ||||
|             </p> | ||||
|         </div> | ||||
|     </section> | ||||
| } | ||||
| <h3>We suggest the following:</h3> | ||||
| <ol class="round"> | ||||
|     <li class="one"> | ||||
|         <h5>Getting Started</h5> | ||||
|         ASP.NET MVC gives you a powerful, patterns-based way to build dynamic websites that | ||||
|         enables a clean separation of concerns and that gives you full control over markup | ||||
|         for enjoyable, agile development. ASP.NET MVC includes many features that enable | ||||
|         fast, TDD-friendly development for creating sophisticated applications that use | ||||
|         the latest web standards. | ||||
|         <a href="http://go.microsoft.com/fwlink/?LinkId=245151">Learn more…</a> | ||||
|     </li> | ||||
|  | ||||
|     <li class="two"> | ||||
|         <h5>Add NuGet packages and jump-start your coding</h5> | ||||
|         NuGet makes it easy to install and update free libraries and tools. | ||||
|         <a href="http://go.microsoft.com/fwlink/?LinkId=245153">Learn more…</a> | ||||
|     </li> | ||||
|  | ||||
|     <li class="three"> | ||||
|         <h5>Find Web Hosting</h5> | ||||
|         You can easily find a web hosting company that offers the right mix of features | ||||
|         and price for your applications. | ||||
|         <a href="http://go.microsoft.com/fwlink/?LinkId=245157">Learn more…</a> | ||||
|     </li> | ||||
| </ol> | ||||
							
								
								
									
										21
									
								
								samples/C#/Program.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								samples/C#/Program.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
|  | ||||
| namespace LittleSampleApp | ||||
| { | ||||
|   /// <summary> | ||||
|   /// Just what it says on the tin. A little sample application for Linguist to try out. | ||||
|   ///  | ||||
|   /// </summary> | ||||
|   class Program | ||||
|   { | ||||
|     static void Main(string[] args) | ||||
|     { | ||||
|       Console.WriteLine("Hello, I am a little sample application to test GitHub's Linguist module."); | ||||
|       Console.WriteLine("I also include a Razor MVC file just to prove it handles cshtml files now."); | ||||
|     } | ||||
|   } | ||||
| } | ||||
							
								
								
									
										42
									
								
								samples/C++/CsvStreamer.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								samples/C++/CsvStreamer.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,42 @@ | ||||
| #pragma once | ||||
| #include <string> | ||||
| #include <vector> | ||||
| #include <fstream> | ||||
| #include "util.h" | ||||
|  | ||||
| using namespace std; | ||||
|  | ||||
|  | ||||
| #define DEFAULT_DELIMITER	',' | ||||
|  | ||||
|  | ||||
| class CsvStreamer | ||||
| { | ||||
| 	private: | ||||
| 		ofstream file;				// File output stream | ||||
| 		vector<string> row_buffer;	// Buffer which stores a row's data before being flushed/written | ||||
| 		int fields;					// Number of fields (columns) | ||||
| 		long rows;					// Number of rows (records) including header row | ||||
| 		char delimiter;				// Delimiter character; comma by default | ||||
| 		string sanitize(string);	// Returns a string ready for output into the file | ||||
| 		 | ||||
| 	public: | ||||
| 		CsvStreamer();				// Empty CSV streamer... be sure to open the file before writing! | ||||
| 		CsvStreamer(string, char);	// Same as open(string, char)... | ||||
| 		CsvStreamer(string);		// Opens an output CSV file given a file path/name | ||||
| 		~CsvStreamer();				// Ensures the output file is closed and saved | ||||
| 		void open(string);			// Opens an output CSV file given a file path/name (default delimiter) | ||||
| 		void open(string, char);	// Opens an output CSV file given a file path/name and a delimiting character (default comma) | ||||
| 		void add_field(string);		// If still on first line, adds a new field to the header row | ||||
| 		void save_fields();			// Call this to save the header row; all new writes should be through append() | ||||
| 		void append(string);		// Appends the current row with this data for the next field; quoted only if needed (leading/trailing spaces are trimmed) | ||||
| 		void append(string, bool);	// Like append(string) but can specify whether to trim spaces at either end of the data (false to keep spaces) | ||||
| 		void append(float);			// Appends the current row with this number | ||||
| 		void append(double);		// Appends the current row with this number | ||||
| 		void append(long);			// Appends the current row with this number | ||||
| 		void append(int);			// Appends the current row with this number | ||||
| 		void writeln();				// Flushes what was in the row buffer into the file (writes the row) | ||||
| 		void close();				// Saves and closes the file | ||||
| 		int field_count();			// Gets the number of fields (columns) | ||||
| 		long row_count();			// Gets the number of records (rows) -- NOT including the header row | ||||
| }; | ||||
							
								
								
									
										32
									
								
								samples/C++/Field.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								samples/C++/Field.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,32 @@ | ||||
| /***************************************************************************** | ||||
| * Dwarf Mine - The 13-11 Benchmark | ||||
| * | ||||
| * Copyright (c) 2013 Bünger, Thomas; Kieschnick, Christian; Kusber, | ||||
| * Michael; Lohse, Henning; Wuttke, Nikolai; Xylander, Oliver; Yao, Gary; | ||||
| * Zimmermann, Florian | ||||
| * | ||||
| * Permission is hereby granted, free of charge, to any person obtaining | ||||
| * a copy of this software and associated documentation files (the | ||||
| * "Software"), to deal in the Software without restriction, including | ||||
| * without limitation the rights to use, copy, modify, merge, publish, | ||||
| * distribute, sublicense, and/or sell copies of the Software, and to | ||||
| * permit persons to whom the Software is furnished to do so, subject to | ||||
| * the following conditions: | ||||
| * | ||||
| * The above copyright notice and this permission notice shall be | ||||
| * included in all copies or substantial portions of the Software. | ||||
| * | ||||
| * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||||
| * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | ||||
| * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. | ||||
| * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY | ||||
| * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, | ||||
| * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE | ||||
| * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||||
| *****************************************************************************/ | ||||
|  | ||||
| #pragma once | ||||
|  | ||||
| enum Field { Free, Black, White, Illegal }; | ||||
|  | ||||
| typedef Field Player; | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user