mirror of
https://github.com/KevinMidboe/linguist.git
synced 2025-10-29 17:50:22 +00:00
Compare commits
2273 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
44ed47cea1 | ||
|
|
de51cb08d2 | ||
|
|
3dd2d08190 | ||
|
|
3b625e1954 | ||
|
|
5c6f690b97 | ||
|
|
3bbfc907f3 | ||
|
|
053b8bca97 | ||
|
|
7fb3db6203 | ||
|
|
ba09394f85 | ||
|
|
c59c88f16e | ||
|
|
8a6e74799a | ||
|
|
4268769d2e | ||
|
|
6601864084 | ||
|
|
d57aa37fb7 | ||
|
|
e72347fd98 | ||
|
|
1b429ea46b | ||
|
|
9468ad4947 | ||
|
|
733ef63193 | ||
|
|
9ca6a5841e | ||
|
|
41ace5fba0 | ||
|
|
cc4295b3b3 | ||
|
|
1e4ce80fd9 | ||
|
|
74a71fd90d | ||
|
|
9b08318456 | ||
|
|
fa5b6b03dc | ||
|
|
cb59296fe0 | ||
|
|
f1be771611 | ||
|
|
b66fcb2529 | ||
|
|
f7fe1fee66 | ||
|
|
94367cc460 | ||
|
|
72bec1fddc | ||
|
|
4e2eba4ef8 | ||
|
|
10457b6639 | ||
|
|
d58cbc68a6 | ||
|
|
01de40faaa | ||
|
|
62d285fce6 | ||
|
|
0056095e8c | ||
|
|
d6dc3a3991 | ||
|
|
b524461b7c | ||
|
|
76d41697aa | ||
|
|
32147b629e | ||
|
|
e7b5e25bf8 | ||
|
|
d761658f8b | ||
|
|
3719214aba | ||
|
|
47b109be36 | ||
|
|
1ec4db97c2 | ||
|
|
9fe5fe0de2 | ||
|
|
b36ea7ac9d | ||
|
|
625b06c30d | ||
|
|
28bce533b2 | ||
|
|
93ec1922cb | ||
|
|
5d09fb67dd | ||
|
|
93dcb61742 | ||
|
|
3a03594685 | ||
|
|
5ce2c254f9 | ||
|
|
d7814c4899 | ||
|
|
50c08bf29e | ||
|
|
34928baee6 | ||
|
|
27bb41aa4d | ||
|
|
1415f4b52d | ||
|
|
ae8ffcad22 | ||
|
|
f43633bf10 | ||
|
|
a604de9846 | ||
|
|
3e224e0039 | ||
|
|
15b04f86c3 | ||
|
|
42af436c20 | ||
|
|
2b08c66f0b | ||
|
|
f98ab593fb | ||
|
|
f951ec07de | ||
|
|
e9ac71590f | ||
|
|
210cd19876 | ||
|
|
f473c555ac | ||
|
|
48e4394d87 | ||
|
|
e1ce88920d | ||
|
|
675cee1d72 | ||
|
|
1c4baf6dc2 | ||
|
|
8f2820e9cc | ||
|
|
04c268e535 | ||
|
|
ec749b3f8d | ||
|
|
08b63e7033 | ||
|
|
7867b946b9 | ||
|
|
a4d12cc8e4 | ||
|
|
a1165b74b1 | ||
|
|
0fa1fa5581 | ||
|
|
d8b91bd5c4 | ||
|
|
9b941a34f0 | ||
|
|
9d8392dab8 | ||
|
|
2c78dd2c66 | ||
|
|
3988f3e7a7 | ||
|
|
d9a4e831b4 | ||
|
|
45c27f26a2 | ||
|
|
0fbc29bf68 | ||
|
|
5569d2056d | ||
|
|
be262d0b4f | ||
|
|
33ce2d7264 | ||
|
|
c486f56204 | ||
|
|
9f3b7d0ba5 | ||
|
|
79f20e8057 | ||
|
|
cd30c7613c | ||
|
|
5aa53c0711 | ||
|
|
c17cdca896 | ||
|
|
ecdae83364 | ||
|
|
31aafa2c78 | ||
|
|
8a911b8ff3 | ||
|
|
9233f1d17f | ||
|
|
77eb36a982 | ||
|
|
4e6e58a099 | ||
|
|
c87976330f | ||
|
|
0e9109c3fc | ||
|
|
12f9295dd7 | ||
|
|
581723748b | ||
|
|
0980e304b1 | ||
|
|
d46a529b6a | ||
|
|
1d2ec4dbc3 | ||
|
|
829eea0139 | ||
|
|
78b2853d70 | ||
|
|
202f3c08cd | ||
|
|
b958779e3d | ||
|
|
00dc775daf | ||
|
|
009a4e67b6 | ||
|
|
faaa4470af | ||
|
|
2a320cb988 | ||
|
|
74931d1bd5 | ||
|
|
3ca93a84b9 | ||
|
|
aa27f18ea6 | ||
|
|
d3e2ea3f71 | ||
|
|
53aa1209ab | ||
|
|
b2a486fed2 | ||
|
|
4f1e5c34b1 | ||
|
|
85c9833081 | ||
|
|
33899b9d6b | ||
|
|
417239004a | ||
|
|
6a1423d28f | ||
|
|
96a23ce388 | ||
|
|
e8d7eed3aa | ||
|
|
9d419c4ab9 | ||
|
|
4eefc1f58e | ||
|
|
0b94b9cda7 | ||
|
|
c736038d94 | ||
|
|
ec562138f8 | ||
|
|
50013e8dd7 | ||
|
|
416c5d1185 | ||
|
|
8869912d31 | ||
|
|
43fa563b77 | ||
|
|
41c6aee8c3 | ||
|
|
8cf575c37d | ||
|
|
4e20928e04 | ||
|
|
3e37bd2680 | ||
|
|
a29f5b2d46 | ||
|
|
4efc6f8c95 | ||
|
|
359699c454 | ||
|
|
346aa99fcf | ||
|
|
d147778677 | ||
|
|
e520209e49 | ||
|
|
338cc16239 | ||
|
|
67ea35094b | ||
|
|
6f0393fcbd | ||
|
|
2923d50d7e | ||
|
|
4e26f609ef | ||
|
|
e86d6e8dd2 | ||
|
|
5fa02ad1fb | ||
|
|
5a06240f69 | ||
|
|
d6e0f74c80 | ||
|
|
a5c08bb203 | ||
|
|
c6dc29abb1 | ||
|
|
ffd984bb7e | ||
|
|
dc5473559b | ||
|
|
8e9c224952 | ||
|
|
d43f111723 | ||
|
|
de9ff713a4 | ||
|
|
98783560ec | ||
|
|
8f31fbbd55 | ||
|
|
e4cdbd2b2b | ||
|
|
ba52e48ceb | ||
|
|
a44ebe493b | ||
|
|
eb0e75e11e | ||
|
|
22c2cf4967 | ||
|
|
39e3688fb8 | ||
|
|
6b83e5fb7b | ||
|
|
dd2e5ffe07 | ||
|
|
f6b6c4e165 | ||
|
|
608ed60b5c | ||
|
|
2ce2945058 | ||
|
|
c8d376754e | ||
|
|
ecaef91fa1 | ||
|
|
d265b78e7e | ||
|
|
5a5bf7d5e5 | ||
|
|
e46781b903 | ||
|
|
9543a8c8e9 | ||
|
|
6ac1ac9232 | ||
|
|
1bbb919fef | ||
|
|
71dfed0e45 | ||
|
|
a2db058ce4 | ||
|
|
12695fee2f | ||
|
|
4a775dca37 | ||
|
|
d7c689fd6b | ||
|
|
20b8188384 | ||
|
|
26310d9515 | ||
|
|
e38cc75da5 | ||
|
|
8d55fc1bd5 | ||
|
|
7e63399196 | ||
|
|
520e5a5cfe | ||
|
|
5d85692c24 | ||
|
|
676861fff3 | ||
|
|
6589bd9dc7 | ||
|
|
e32a4f13ef | ||
|
|
4e4d851f71 | ||
|
|
a3628f86da | ||
|
|
fe70965906 | ||
|
|
c863435c84 | ||
|
|
eeec48198a | ||
|
|
82167063da | ||
|
|
3ae89b48ba | ||
|
|
cd9401c424 | ||
|
|
e7e8a7d835 | ||
|
|
7654032d2e | ||
|
|
05b536fc61 | ||
|
|
ebe85788ab | ||
|
|
524337d07b | ||
|
|
f8ce42e169 | ||
|
|
71032cd252 | ||
|
|
41593b3ea7 | ||
|
|
bed8add2f5 | ||
|
|
e424e8e88c | ||
|
|
07d4f218a3 | ||
|
|
67ed060d37 | ||
|
|
3abe081560 | ||
|
|
d3f3c0345c | ||
|
|
855f1a1f86 | ||
|
|
0406a5b326 | ||
|
|
0108ef4386 | ||
|
|
daefff86ff | ||
|
|
fdb962518f | ||
|
|
6564078061 | ||
|
|
39ea9be5f8 | ||
|
|
152b5ade5e | ||
|
|
c525e3fbef | ||
|
|
88c74fa9c2 | ||
|
|
6a54ee767f | ||
|
|
2ea1ff2736 | ||
|
|
a1901fceff | ||
|
|
b4035a3804 | ||
|
|
fc67fc525c | ||
|
|
f0659d3aa5 | ||
|
|
a7a123a8db | ||
|
|
0e5327a77a | ||
|
|
ecd4ae3bda | ||
|
|
7a8bd628e1 | ||
|
|
8e19aea39e | ||
|
|
6fcba83f3e | ||
|
|
d6d7d38eb8 | ||
|
|
c8094d3775 | ||
|
|
de478d2f2d | ||
|
|
991dcef18b | ||
|
|
f30e9270f1 | ||
|
|
1d7ba18b15 | ||
|
|
35a06d6cb8 | ||
|
|
4cf7feb275 | ||
|
|
30298a9ef8 | ||
|
|
cc5f1c57ca | ||
|
|
82af10e3fd | ||
|
|
63c8d2284c | ||
|
|
697380336c | ||
|
|
5fd8d71858 | ||
|
|
5bc88814e2 | ||
|
|
00efd6a463 | ||
|
|
81ca6e7766 | ||
|
|
cd288a8ee4 | ||
|
|
a8d84f3d55 | ||
|
|
600115afed | ||
|
|
e57273c839 | ||
|
|
65491d460e | ||
|
|
8dc4a1308f | ||
|
|
6841b4d259 | ||
|
|
a53423b6e0 | ||
|
|
02f3ba1840 | ||
|
|
e1216ea4ee | ||
|
|
a3227c2c27 | ||
|
|
9f1c950a1f | ||
|
|
c7a0d7b83d | ||
|
|
53c9b2b435 | ||
|
|
b4a77abd82 | ||
|
|
8a622823b0 | ||
|
|
3310d925b6 | ||
|
|
65201b322a | ||
|
|
b71bf19e37 | ||
|
|
1f43664a51 | ||
|
|
7cda13afcb | ||
|
|
e0d890240b | ||
|
|
abf7bee464 | ||
|
|
e73a4ecd0e | ||
|
|
70779c9986 | ||
|
|
1fc4c9fdc6 | ||
|
|
fdec52c89a | ||
|
|
6e40de47da | ||
|
|
28be72892e | ||
|
|
6df0e4591d | ||
|
|
879c63a25e | ||
|
|
ab2e640759 | ||
|
|
b61fe90d12 | ||
|
|
e6c849d92c | ||
|
|
5e4e38b39a | ||
|
|
22d4865c52 | ||
|
|
3247d46e81 | ||
|
|
dad3191238 | ||
|
|
35a13b3633 | ||
|
|
56fb48ea96 | ||
|
|
983ff20d3c | ||
|
|
2d51a5dba4 | ||
|
|
df98c86acd | ||
|
|
98118eb70b | ||
|
|
1ec84da277 | ||
|
|
3112e6deda | ||
|
|
be316c2943 | ||
|
|
68c45be47d | ||
|
|
4584963dd2 | ||
|
|
f382abc2f3 | ||
|
|
9d57e1e1b5 | ||
|
|
2a4150b104 | ||
|
|
09612ae42e | ||
|
|
49e9ee48d0 | ||
|
|
a8719f3e82 | ||
|
|
04e1cc6d0a | ||
|
|
dd7b125869 | ||
|
|
426818120c | ||
|
|
50bd2cc3c8 | ||
|
|
00647be113 | ||
|
|
e930ee1a8e | ||
|
|
48b64c2d31 | ||
|
|
f95365946c | ||
|
|
5ddccaac83 | ||
|
|
51d7c8f905 | ||
|
|
ed71855612 | ||
|
|
742faebd8b | ||
|
|
6763b73d9c | ||
|
|
5c3744dfd6 | ||
|
|
cb5bc91fe3 | ||
|
|
9171ee602b | ||
|
|
4da0463768 | ||
|
|
8d0a2d9dc1 | ||
|
|
6a2cebea7d | ||
|
|
ae10395b3a | ||
|
|
510abc7cee | ||
|
|
e8a700e4e3 | ||
|
|
c13e384e18 | ||
|
|
4204078b19 | ||
|
|
17fc3d0640 | ||
|
|
7715254212 | ||
|
|
2f50aa460a | ||
|
|
6adec161fa | ||
|
|
c802ba3a1d | ||
|
|
06e80f3889 | ||
|
|
216d63f575 | ||
|
|
ff042a87a4 | ||
|
|
56f0f93bbb | ||
|
|
99a3a5b85b | ||
|
|
1868d1d190 | ||
|
|
705e234044 | ||
|
|
0dd78704f7 | ||
|
|
257425141d | ||
|
|
6482a60c6e | ||
|
|
1466b70f10 | ||
|
|
b87146056b | ||
|
|
b29696d684 | ||
|
|
514a8d54db | ||
|
|
abfe89d8ff | ||
|
|
22609dc297 | ||
|
|
93341be396 | ||
|
|
f2ae3b6223 | ||
|
|
e84204a274 | ||
|
|
7024c7cb37 | ||
|
|
91e0823b04 | ||
|
|
b056df06f4 | ||
|
|
3f4b8368e8 | ||
|
|
d9edfb7088 | ||
|
|
2d62a475d1 | ||
|
|
6bf223e641 | ||
|
|
311a687740 | ||
|
|
44e532c9a2 | ||
|
|
1d48ff51d5 | ||
|
|
5076539df5 | ||
|
|
36ba378344 | ||
|
|
c1203b7dad | ||
|
|
fad13d901c | ||
|
|
1e022f53e3 | ||
|
|
da2f4ed711 | ||
|
|
6a7439141a | ||
|
|
9fcf546ae6 | ||
|
|
1f1ca3e689 | ||
|
|
01b14de046 | ||
|
|
284486a2ed | ||
|
|
9fae24099c | ||
|
|
2fab4045e4 | ||
|
|
05205ddbf1 | ||
|
|
329c9a7144 | ||
|
|
80a3ea0cd9 | ||
|
|
6c20525375 | ||
|
|
f56c31bacb | ||
|
|
fa817b6a1d | ||
|
|
17168d5fdc | ||
|
|
6493b48434 | ||
|
|
c148ecfd9b | ||
|
|
abbc132977 | ||
|
|
b96ed4b56a | ||
|
|
0019f60ba7 | ||
|
|
a1b236ddfa | ||
|
|
badcb87845 | ||
|
|
10be4be18f | ||
|
|
59b3e48bd1 | ||
|
|
7624eb459f | ||
|
|
1c7f516534 | ||
|
|
cba9b95416 | ||
|
|
228c26948b | ||
|
|
6333f39743 | ||
|
|
68728bcc94 | ||
|
|
16bd70d84f | ||
|
|
4361ccda32 | ||
|
|
018922349c | ||
|
|
03c674a648 | ||
|
|
5066f66dcd | ||
|
|
77a4883763 | ||
|
|
482aa15585 | ||
|
|
b8892250d5 | ||
|
|
94928bc78f | ||
|
|
ead63163b4 | ||
|
|
265d576510 | ||
|
|
a5eb6e9e15 | ||
|
|
776a6a0619 | ||
|
|
4514363c84 | ||
|
|
39cd635086 | ||
|
|
7165611679 | ||
|
|
ead0593976 | ||
|
|
adaf4011bc | ||
|
|
4a031107ac | ||
|
|
85516563f7 | ||
|
|
aa32a5f58b | ||
|
|
49cdc4a930 | ||
|
|
144a85b775 | ||
|
|
a027904278 | ||
|
|
5ac2cdde50 | ||
|
|
5c705b3367 | ||
|
|
e78e9e4747 | ||
|
|
81f9079f43 | ||
|
|
16eaa533b6 | ||
|
|
2e521a6c74 | ||
|
|
62192e17e8 | ||
|
|
0b6f17c676 | ||
|
|
6d9b5390c4 | ||
|
|
56a65d0975 | ||
|
|
e4c6c1d245 | ||
|
|
a9f366aed2 | ||
|
|
96bd08e391 | ||
|
|
02fe28eb25 | ||
|
|
e77530b390 | ||
|
|
d0370a3b4c | ||
|
|
ebce4890b2 | ||
|
|
1bc87aadb3 | ||
|
|
53a532dc76 | ||
|
|
0669a83e40 | ||
|
|
c4ab3b276f | ||
|
|
920f825496 | ||
|
|
f28573420e | ||
|
|
c471990aa3 | ||
|
|
baf56666d4 | ||
|
|
cbbc05f7b8 | ||
|
|
051906727b | ||
|
|
cfd5cbaba0 | ||
|
|
caaad886c3 | ||
|
|
2305f9051c | ||
|
|
392ab2960f | ||
|
|
1e134b5754 | ||
|
|
d356ea28af | ||
|
|
a015138dcd | ||
|
|
ff99d1bac8 | ||
|
|
f4af4727a1 | ||
|
|
2c3069db77 | ||
|
|
8845cd9c58 | ||
|
|
090f765c7e | ||
|
|
b58c0e8f3e | ||
|
|
b4ff170603 | ||
|
|
3bc540a283 | ||
|
|
25b761b506 | ||
|
|
1e502808c9 | ||
|
|
27e0c8f78a | ||
|
|
897218678e | ||
|
|
4eb33fe3be | ||
|
|
0614055efd | ||
|
|
e70f3f595a | ||
|
|
28af996bf9 | ||
|
|
8bd8f0960c | ||
|
|
255db77f1f | ||
|
|
8b0b14c9a6 | ||
|
|
95e83311b6 | ||
|
|
6c07476c45 | ||
|
|
1968f8193c | ||
|
|
5155ad89e8 | ||
|
|
c2505e8b7b | ||
|
|
b38f4b786b | ||
|
|
1a04c79738 | ||
|
|
a464c234b8 | ||
|
|
aa2319a052 | ||
|
|
f22181f47d | ||
|
|
3191ff498d | ||
|
|
91ea482ea6 | ||
|
|
905d87a112 | ||
|
|
8eae4e56ef | ||
|
|
5466fcfd2f | ||
|
|
176a0e9926 | ||
|
|
aa049b4677 | ||
|
|
5c19f1f546 | ||
|
|
9ae19a1f94 | ||
|
|
8cf3b7ad51 | ||
|
|
03d16835aa | ||
|
|
7174130e46 | ||
|
|
59f64c47b1 | ||
|
|
f3655e8a1e | ||
|
|
f97d796f90 | ||
|
|
d342aa4841 | ||
|
|
5c655e3b20 | ||
|
|
9a0ac4a477 | ||
|
|
8ea9632ccf | ||
|
|
03ef4f30e8 | ||
|
|
12228fb525 | ||
|
|
92897046ed | ||
|
|
91aa843a4e | ||
|
|
c3145d3c08 | ||
|
|
1ad2123896 | ||
|
|
9b9a256c60 | ||
|
|
0f3644d23a | ||
|
|
04d3023f76 | ||
|
|
5c7aa5406a | ||
|
|
bce676e902 | ||
|
|
7c9fd59a99 | ||
|
|
b89d1a2e77 | ||
|
|
f8c5015b20 | ||
|
|
f28cdc8a15 | ||
|
|
0e147f1f66 | ||
|
|
a91705724d | ||
|
|
5e3e8133fb | ||
|
|
5a3758f1c7 | ||
|
|
57237106f3 | ||
|
|
99ad2368b0 | ||
|
|
21d7f99a4e | ||
|
|
24b368a30c | ||
|
|
7c8bc8561d | ||
|
|
ce37cd665d | ||
|
|
bd0f4f6f78 | ||
|
|
4867db8831 | ||
|
|
e6ab516fb7 | ||
|
|
7501b82df1 | ||
|
|
aa6b881971 | ||
|
|
3928734d0f | ||
|
|
c7868a95bc | ||
|
|
2012647f78 | ||
|
|
84471a5463 | ||
|
|
57a3c14f2b | ||
|
|
d9914307eb | ||
|
|
71cdf46197 | ||
|
|
8a27884c70 | ||
|
|
b881e3e6cb | ||
|
|
ca718d8f2a | ||
|
|
c6625b1b8a | ||
|
|
16a6d680c4 | ||
|
|
270fa8f5d3 | ||
|
|
b1f5e93b4a | ||
|
|
79a61c72e1 | ||
|
|
3f04c11537 | ||
|
|
b2270613d7 | ||
|
|
0fe854421b | ||
|
|
de074f421e | ||
|
|
27590c39bd | ||
|
|
67191d4d5e | ||
|
|
00764f3d59 | ||
|
|
4a2cb32149 | ||
|
|
1a11664239 | ||
|
|
9520cbb44c | ||
|
|
1aea6b2cdb | ||
|
|
6ff950341a | ||
|
|
b9501e42b2 | ||
|
|
065c809dd5 | ||
|
|
5b9ea4a78f | ||
|
|
b72c4d4400 | ||
|
|
d46e214985 | ||
|
|
799c47ce7a | ||
|
|
b5121e59dd | ||
|
|
f6a7b4929f | ||
|
|
162b77ab5a | ||
|
|
92904efd45 | ||
|
|
93fabe487f | ||
|
|
74d704bea2 | ||
|
|
ee1bd50dd1 | ||
|
|
07096f84f5 | ||
|
|
a9b3bd632b | ||
|
|
eec324890e | ||
|
|
ca6ac8f0db | ||
|
|
60ab4a5fe7 | ||
|
|
10eb5830f0 | ||
|
|
835ceae6f6 | ||
|
|
abe3aa47f6 | ||
|
|
53e34072ed | ||
|
|
f83f761d0a | ||
|
|
9c18bf3a89 | ||
|
|
f6e1ab444e | ||
|
|
0ae8b2959d | ||
|
|
46b0b1e5e2 | ||
|
|
b44dfb4ab8 | ||
|
|
868e528810 | ||
|
|
0a4c850ef1 | ||
|
|
b3c4232251 | ||
|
|
0c38df47b9 | ||
|
|
bfd4005760 | ||
|
|
fc9fad15a3 | ||
|
|
b5091e88ad | ||
|
|
2610808b6d | ||
|
|
3cfee4f214 | ||
|
|
70fd116eaf | ||
|
|
62aac9c2f7 | ||
|
|
afcf1c6c22 | ||
|
|
f3f0365b13 | ||
|
|
9bc12843fe | ||
|
|
5e3ceddf69 | ||
|
|
d377e23193 | ||
|
|
e6dabd59ad | ||
|
|
f0c7380132 | ||
|
|
697ad4c568 | ||
|
|
1efd9b384d | ||
|
|
c1e71dc215 | ||
|
|
d2c7d27d13 | ||
|
|
1efd4c83f9 | ||
|
|
0f7677423f | ||
|
|
2a0b0e9f93 | ||
|
|
faec60188f | ||
|
|
709a688858 | ||
|
|
2448ff8314 | ||
|
|
311202102d | ||
|
|
6812a22706 | ||
|
|
fb727ce731 | ||
|
|
6af499e352 | ||
|
|
66ec33cf8e | ||
|
|
f2694f3a74 | ||
|
|
d069d0e444 | ||
|
|
56ee61b17c | ||
|
|
b945726017 | ||
|
|
6f8a7d1070 | ||
|
|
b032886c21 | ||
|
|
988739d566 | ||
|
|
8cd80801e8 | ||
|
|
c3b7a1a6fb | ||
|
|
9d0eff75ad | ||
|
|
3ccb548b6d | ||
|
|
eeedd53f32 | ||
|
|
11a3b5b73c | ||
|
|
eacc48e8c7 | ||
|
|
5b72b4d353 | ||
|
|
3f940ce8b8 | ||
|
|
b2e3ea2334 | ||
|
|
4637da8c32 | ||
|
|
6b88c5ba86 | ||
|
|
5fdb596214 | ||
|
|
c989b02285 | ||
|
|
c8301dc20b | ||
|
|
ca4ea03828 | ||
|
|
ae27c71d5a | ||
|
|
3d1555e278 | ||
|
|
54fab9eb4e | ||
|
|
8fea8a0b47 | ||
|
|
f14ae8e51b | ||
|
|
6b60e5e786 | ||
|
|
40413dfcc7 | ||
|
|
07f5ad1daa | ||
|
|
57f5a3e780 | ||
|
|
3be007526c | ||
|
|
9bfbd0550c | ||
|
|
0301a5dcdf | ||
|
|
db994a1197 | ||
|
|
855c13ea2a | ||
|
|
bfa7eced44 | ||
|
|
b1d103b1f3 | ||
|
|
fc816d3429 | ||
|
|
04a4e8c8e6 | ||
|
|
ab69fd01ac | ||
|
|
cc6106f31b | ||
|
|
ead85379ed | ||
|
|
f8d6be55ee | ||
|
|
a241d75043 | ||
|
|
864a6c0a20 | ||
|
|
1c20c54191 | ||
|
|
4d722d1fd1 | ||
|
|
b67254e986 | ||
|
|
041cf9c94e | ||
|
|
b08c5a8421 | ||
|
|
125eaa4cc3 | ||
|
|
6b001cf861 | ||
|
|
5c4129f85b | ||
|
|
789607d9bc | ||
|
|
d46530989c | ||
|
|
fa56879790 | ||
|
|
41713d7719 | ||
|
|
17a9463588 | ||
|
|
fb9f271720 | ||
|
|
8de50edb41 | ||
|
|
ab33fccddd | ||
|
|
bd95ac0beb | ||
|
|
7b3efb185f | ||
|
|
a0065febe2 | ||
|
|
9374784651 | ||
|
|
aa6af3deed | ||
|
|
a19e501b44 | ||
|
|
889a395340 | ||
|
|
eb8eb28ca7 | ||
|
|
697b3351e6 | ||
|
|
9fd80bfd67 | ||
|
|
7b58b1ea59 | ||
|
|
c454396c26 | ||
|
|
2e9d8f5520 | ||
|
|
c8ea3fba5a | ||
|
|
56af13047c | ||
|
|
c46900396a | ||
|
|
b235ed1223 | ||
|
|
16d9612603 | ||
|
|
721e5b4656 | ||
|
|
9b8b39f444 | ||
|
|
e32a837fb2 | ||
|
|
9961f8bc1c | ||
|
|
c066867d59 | ||
|
|
21093165e1 | ||
|
|
df88de14e3 | ||
|
|
94de431aa5 | ||
|
|
502557a97f | ||
|
|
52938f6dbf | ||
|
|
d87fad649c | ||
|
|
d8666e5309 | ||
|
|
0c071990cb | ||
|
|
77dfb19a50 | ||
|
|
49254f1f74 | ||
|
|
9dd952c175 | ||
|
|
0b9897db1f | ||
|
|
9d11128362 | ||
|
|
ee17ab3e26 | ||
|
|
06af36dac2 | ||
|
|
51d6d741e5 | ||
|
|
b593a8ae67 | ||
|
|
7b30240a7f | ||
|
|
71f124faa5 | ||
|
|
470bd34349 | ||
|
|
65087dd7b8 | ||
|
|
89c5361f25 | ||
|
|
f82cc26e4f | ||
|
|
15232fc072 | ||
|
|
0a7aab947c | ||
|
|
5906fa81bb | ||
|
|
1b2f574af2 | ||
|
|
ca4bc6110f | ||
|
|
a944769d61 | ||
|
|
98a31515ef | ||
|
|
3e665099ac | ||
|
|
5400b534e4 | ||
|
|
6f2d4dc195 | ||
|
|
4f7fac3ba1 | ||
|
|
fd6569830a | ||
|
|
5d4cad6394 | ||
|
|
b790a49282 | ||
|
|
537b83c759 | ||
|
|
c0b9e2c3f4 | ||
|
|
f488b9b9f7 | ||
|
|
7060b116f4 | ||
|
|
0f4cf11294 | ||
|
|
048496723b | ||
|
|
70068f74f1 | ||
|
|
6f197bacc7 | ||
|
|
24a89d2d75 | ||
|
|
1ac16cbec7 | ||
|
|
8144438f39 | ||
|
|
f141abbc73 | ||
|
|
5329b96793 | ||
|
|
7a70931066 | ||
|
|
9a070d7bb3 | ||
|
|
189b2d684b | ||
|
|
71dfac26fe | ||
|
|
efdc790374 | ||
|
|
a3613dc438 | ||
|
|
97afedd861 | ||
|
|
00a436f175 | ||
|
|
aa2e3000cd | ||
|
|
10e0fa4360 | ||
|
|
0473af368f | ||
|
|
b82f563c38 | ||
|
|
344297895b | ||
|
|
d3c525645b | ||
|
|
59d02e5138 | ||
|
|
8522dc1d33 | ||
|
|
53d238f310 | ||
|
|
92ed2d189e | ||
|
|
7133c3b11a | ||
|
|
d72114083b | ||
|
|
683925fcd5 | ||
|
|
1c8bf32d35 | ||
|
|
28913833f4 | ||
|
|
c6752be546 | ||
|
|
395e474cad | ||
|
|
16ea189aa6 | ||
|
|
ac81fc5da9 | ||
|
|
58191c10b3 | ||
|
|
c2ca23d580 | ||
|
|
b5dfb40c7d | ||
|
|
7e647fd915 | ||
|
|
5b9f9bc0e6 | ||
|
|
b1c057fa30 | ||
|
|
ca348dd373 | ||
|
|
b802045c5c | ||
|
|
3c244a9501 | ||
|
|
832a7b9b06 | ||
|
|
e7d856345f | ||
|
|
ac559effaa | ||
|
|
95d0daba80 | ||
|
|
a0ad1523a1 | ||
|
|
06c049b8c0 | ||
|
|
24c7380765 | ||
|
|
73ef1bf156 | ||
|
|
c8b30a62f9 | ||
|
|
48dfdd2dfe | ||
|
|
68727f724a | ||
|
|
f46e053633 | ||
|
|
d2e739ba8c | ||
|
|
37174e1d2c | ||
|
|
cdb5206def | ||
|
|
d636eaf1e3 | ||
|
|
49f3eb1286 | ||
|
|
8ab94a8643 | ||
|
|
f72c337c5b | ||
|
|
d22321de07 | ||
|
|
473e5db51f | ||
|
|
8b9fc4683a | ||
|
|
3b4415cc3c | ||
|
|
2afce1754a | ||
|
|
f232b93214 | ||
|
|
db64f192fa | ||
|
|
ca96ecdc55 | ||
|
|
2a06d1aa19 | ||
|
|
b2fa2a1f46 | ||
|
|
6839516b5c | ||
|
|
7247c80fac | ||
|
|
01d05d1d4e | ||
|
|
8db4cc482e | ||
|
|
074f17ed98 | ||
|
|
68b553ea55 | ||
|
|
fd5da9cb15 | ||
|
|
d081f687b0 | ||
|
|
34abe5b983 | ||
|
|
5765f1faf1 | ||
|
|
550b67215c | ||
|
|
d7b2826113 | ||
|
|
b4f94c7c25 | ||
|
|
d24677adbb | ||
|
|
04f981eeac | ||
|
|
b53d84d8ff | ||
|
|
fea8bb21a0 | ||
|
|
996ed8a8b1 | ||
|
|
daef164163 | ||
|
|
61a5cab1f2 | ||
|
|
2fddaaf3d7 | ||
|
|
741d246581 | ||
|
|
1b23e81541 | ||
|
|
362d300cb0 | ||
|
|
7b185cc2f3 | ||
|
|
932726863f | ||
|
|
a35a3e98ce | ||
|
|
7c404e72d2 | ||
|
|
8736e2305d | ||
|
|
a13664698f | ||
|
|
6e934067a8 | ||
|
|
3040642f97 | ||
|
|
dd7e44f957 | ||
|
|
6b56a243e7 | ||
|
|
5d08605aef | ||
|
|
bf705cbaf2 | ||
|
|
fe827896e0 | ||
|
|
317219e479 | ||
|
|
64e7df7596 | ||
|
|
33dc865c30 | ||
|
|
0d469e2966 | ||
|
|
b3ff84872b | ||
|
|
5d176a781c | ||
|
|
e0c97f97ba | ||
|
|
83f358976e | ||
|
|
9ee6153891 | ||
|
|
825e640061 | ||
|
|
e5ae213839 | ||
|
|
74e034c689 | ||
|
|
a55a60a161 | ||
|
|
9d865ec018 | ||
|
|
8b01e3dead | ||
|
|
9e3cc01715 | ||
|
|
0f204767a9 | ||
|
|
11e3251efd | ||
|
|
1f1416a5f7 | ||
|
|
b3786f3825 | ||
|
|
09c2eee91e | ||
|
|
dc78b14902 | ||
|
|
500ce0959a | ||
|
|
aa0c9e3572 | ||
|
|
e6de75d48a | ||
|
|
a5ad0a34f8 | ||
|
|
6e609cc4e3 | ||
|
|
27727a927f | ||
|
|
5ff580df0a | ||
|
|
b34acac722 | ||
|
|
37840856ed | ||
|
|
acfad4371f | ||
|
|
ae42cc0307 | ||
|
|
d06860df37 | ||
|
|
7d5d162f6b | ||
|
|
d39a75b68b | ||
|
|
d72f7311f6 | ||
|
|
3f81b7c179 | ||
|
|
33d1255a5a | ||
|
|
0ebea6a0ff | ||
|
|
c28da3a4a9 | ||
|
|
538f479b60 | ||
|
|
88cc73fa49 | ||
|
|
d6d368a65d | ||
|
|
c5be9cc3e9 | ||
|
|
c462c2bd31 | ||
|
|
3426165621 | ||
|
|
98b99e38bb | ||
|
|
d8e3bec499 | ||
|
|
7c759d4d29 | ||
|
|
41d438b47e | ||
|
|
41911d6921 | ||
|
|
dca18d77cb | ||
|
|
040af5dad2 | ||
|
|
01bb6c37ab | ||
|
|
c624d68628 | ||
|
|
4867c49bd9 | ||
|
|
a354eddf4b | ||
|
|
9b78c533a5 | ||
|
|
090ea576b9 | ||
|
|
6a2d33a4b3 | ||
|
|
b54a9c7412 | ||
|
|
2c62da7834 | ||
|
|
0145a0adb2 | ||
|
|
473282d64c | ||
|
|
c2c068e9db | ||
|
|
13d1f662d1 | ||
|
|
bdd57f58a0 | ||
|
|
b1bcabd6e6 | ||
|
|
e128c3fa82 | ||
|
|
efac9fe750 | ||
|
|
2b8545a8fa | ||
|
|
b275b5d728 | ||
|
|
1f46cfafa7 | ||
|
|
b1dcdf3418 | ||
|
|
4bfd65deb8 | ||
|
|
213cf322f5 | ||
|
|
3c5bcb434c | ||
|
|
61102812a0 | ||
|
|
580cfce7fb | ||
|
|
f1383d7a45 | ||
|
|
e4ce5bfe39 | ||
|
|
4d2b38497d | ||
|
|
fc5ae1cfbc | ||
|
|
7e76d1cc6b | ||
|
|
cf834e8a21 | ||
|
|
ee61466042 | ||
|
|
35884d482c | ||
|
|
802de8112c | ||
|
|
9a76cfc85f | ||
|
|
dc41dd888d | ||
|
|
6ed64f25a2 | ||
|
|
827ad80311 | ||
|
|
9e3d8ac4e9 | ||
|
|
114a331106 | ||
|
|
9aa24a216a | ||
|
|
1b327e29ba | ||
|
|
13702451ab | ||
|
|
f0242f6f97 | ||
|
|
9775820398 | ||
|
|
26a35ea43d | ||
|
|
81ebef2e29 | ||
|
|
7daf26bcd0 | ||
|
|
231f705098 | ||
|
|
893ab8fd8d | ||
|
|
5afdd2c533 | ||
|
|
e4f5c0066a | ||
|
|
a167f852dd | ||
|
|
b428bce126 | ||
|
|
e62d0e19a5 | ||
|
|
9b8bf9068f | ||
|
|
6e05edc350 | ||
|
|
dd8eaf2893 | ||
|
|
1068cfb4b5 | ||
|
|
73b1737dc7 | ||
|
|
1d86f40fcd | ||
|
|
ecc750f445 | ||
|
|
cf5268a7d4 | ||
|
|
59fb481138 | ||
|
|
16e22b3b77 | ||
|
|
e24efad5ff | ||
|
|
58a34cdb7d | ||
|
|
b1c6b330e9 | ||
|
|
7c3e265033 | ||
|
|
13695a716c | ||
|
|
c9e43804d6 | ||
|
|
1535e3553e | ||
|
|
0ac05bbbeb | ||
|
|
d3f979d640 | ||
|
|
0e9ded45dc | ||
|
|
a2ca886510 | ||
|
|
aa701c6766 | ||
|
|
25a1af3775 | ||
|
|
0d8e0a2970 | ||
|
|
c0fff6c8a8 | ||
|
|
e6b4428614 | ||
|
|
4e6e69833d | ||
|
|
1d9faff4c6 | ||
|
|
7025cbe760 | ||
|
|
e922b7c2ca | ||
|
|
96518d2d0f | ||
|
|
1241b20ba1 | ||
|
|
f03f5c1628 | ||
|
|
cb550a3662 | ||
|
|
d1f90d61c5 | ||
|
|
16e65fe189 | ||
|
|
62a0faa729 | ||
|
|
fbb3ab2292 | ||
|
|
b3b75e5ef8 | ||
|
|
8b36210db5 | ||
|
|
a74f3b3e46 | ||
|
|
e214a52de5 | ||
|
|
0624a9395c | ||
|
|
b2e7f7ffa6 | ||
|
|
b312b39a10 | ||
|
|
80e2d112b2 | ||
|
|
519b169df0 | ||
|
|
5c2cfbc334 | ||
|
|
7d91e4959a | ||
|
|
0c5aa2a7eb | ||
|
|
0d7a264981 | ||
|
|
52ff2d2e74 | ||
|
|
8a7ceaa845 | ||
|
|
fd9ce2d1cf | ||
|
|
2c2b37bec3 | ||
|
|
c777f2d388 | ||
|
|
eca10056a8 | ||
|
|
c7bab11ebe | ||
|
|
6995fc28b6 | ||
|
|
102f14d0e9 | ||
|
|
aac168402b | ||
|
|
152d49513f | ||
|
|
d5564c808d | ||
|
|
82410e07b2 | ||
|
|
94d90b30b5 | ||
|
|
06997f0da2 | ||
|
|
55aafa416d | ||
|
|
6226a46988 | ||
|
|
8d216f0c43 | ||
|
|
7f5bb25542 | ||
|
|
5fcdf6adc2 | ||
|
|
6a565a849b | ||
|
|
66fc67e34c | ||
|
|
7cf140940e | ||
|
|
60e90bab23 | ||
|
|
4f58258186 | ||
|
|
03e2904ebf | ||
|
|
bea90b256e | ||
|
|
8eb37ba956 | ||
|
|
8d20c1fb59 | ||
|
|
9a1abf0c49 | ||
|
|
5aae7a4000 | ||
|
|
d9509a1750 | ||
|
|
978c448fb8 | ||
|
|
997c0fca10 | ||
|
|
3ae6e68492 | ||
|
|
851c93a1f7 | ||
|
|
a5f7355e16 | ||
|
|
18ffdbaa65 | ||
|
|
c089222bc6 | ||
|
|
37f9535d27 | ||
|
|
4650368bc2 | ||
|
|
88b14ed455 | ||
|
|
54a2a47bc0 | ||
|
|
ffcc970140 | ||
|
|
7a811e39e0 | ||
|
|
11f158cbb3 | ||
|
|
5d5550c48b | ||
|
|
fd570d906a | ||
|
|
deab0662f9 | ||
|
|
7238f50a6b | ||
|
|
499fcd1f3f | ||
|
|
dc0ddc82d6 | ||
|
|
436fc34cb9 | ||
|
|
f072cd96e3 | ||
|
|
3441a001c7 | ||
|
|
bc747844ea | ||
|
|
a887f58bcc | ||
|
|
f42afef6e0 | ||
|
|
18eaf22cb9 | ||
|
|
d94f427e12 | ||
|
|
b94eb42db6 | ||
|
|
d2297f5516 | ||
|
|
ef6f58b828 | ||
|
|
eb0bf16cce | ||
|
|
ca51415540 | ||
|
|
8ae32e1d47 | ||
|
|
0a6165c4d9 | ||
|
|
cf8521a629 | ||
|
|
b11c7f3dc0 | ||
|
|
01151aad5c | ||
|
|
6b283068a9 | ||
|
|
ccd7d4d89d | ||
|
|
208ec3906f | ||
|
|
84d4fccb4d | ||
|
|
8d8ea959ee | ||
|
|
1c73db499f | ||
|
|
16a4b4947f | ||
|
|
4b2abb2064 | ||
|
|
c581b6a5a7 | ||
|
|
4c66582f87 | ||
|
|
11388a5355 | ||
|
|
24ca98b1a3 | ||
|
|
90a293727d | ||
|
|
e869f6c173 | ||
|
|
5b187d1f20 | ||
|
|
7b5d1c075d | ||
|
|
07173d2238 | ||
|
|
6b747f7d65 | ||
|
|
aef19d72f9 | ||
|
|
e1a661bffc | ||
|
|
560f9b15d7 | ||
|
|
452fc59d4f | ||
|
|
ed4bbe97d1 | ||
|
|
f05c437221 | ||
|
|
682cc2d82d | ||
|
|
29197736c7 | ||
|
|
483488a2fa | ||
|
|
b36c4f2428 | ||
|
|
e1dbd68713 | ||
|
|
0ecb865797 | ||
|
|
1ced06483e | ||
|
|
861cee33d5 | ||
|
|
6b882438b0 | ||
|
|
c570646c2d | ||
|
|
75f72578ad | ||
|
|
4dc566e13f | ||
|
|
bcfdbe3616 | ||
|
|
314b7f134d | ||
|
|
87eb4577ea | ||
|
|
7563bf43e9 | ||
|
|
ce8cfed7ff | ||
|
|
8742de9a88 | ||
|
|
9c0af2ea5b | ||
|
|
4c81c0d904 | ||
|
|
4dcdb0c79c | ||
|
|
5a646384f6 | ||
|
|
8917f1a91a | ||
|
|
d459f7289e | ||
|
|
d2c4104d30 | ||
|
|
89fabd9a89 | ||
|
|
3f7ce832ab | ||
|
|
3fdc904b18 | ||
|
|
cf471af677 | ||
|
|
2d392581e2 | ||
|
|
79a428ab8d | ||
|
|
7ed1b9b0b1 | ||
|
|
58fd8a5d87 | ||
|
|
9f8c15ed6c | ||
|
|
b94eda18ab | ||
|
|
849eb28b01 | ||
|
|
b0073d461c | ||
|
|
25d160e850 | ||
|
|
e688c865bc | ||
|
|
21e97cc65c | ||
|
|
06c1033952 | ||
|
|
8c54f68040 | ||
|
|
4c1f5c490f | ||
|
|
117735ffb9 | ||
|
|
f98e6bdac7 | ||
|
|
19d76306d3 | ||
|
|
a63a609ce1 | ||
|
|
95fce2024d | ||
|
|
f3b65015f4 | ||
|
|
5431298b0d | ||
|
|
8f651bca03 | ||
|
|
6c45e5ec19 | ||
|
|
95d394642c | ||
|
|
6a185a3d3a | ||
|
|
6ae353706d | ||
|
|
77bc72be14 | ||
|
|
0585c880de | ||
|
|
da5189e7fb | ||
|
|
5f456d8b22 | ||
|
|
a351cdd486 | ||
|
|
6e71663fd6 | ||
|
|
0b2e43cdee | ||
|
|
9cbd280f79 | ||
|
|
947be9db0f | ||
|
|
dd55f929d4 | ||
|
|
8b5399d568 | ||
|
|
1b8b0c6229 | ||
|
|
ee3081fb4c | ||
|
|
119770a038 | ||
|
|
9d61487403 | ||
|
|
56dec47561 | ||
|
|
3e793ab5b7 | ||
|
|
f6b50a67f9 | ||
|
|
cd47798d13 | ||
|
|
3b54df2cde | ||
|
|
8bf1defdc1 | ||
|
|
8845b266de | ||
|
|
4757da73f0 | ||
|
|
468fd425fc | ||
|
|
5604d658b2 | ||
|
|
37222d5622 | ||
|
|
ec38b54023 | ||
|
|
260e90401d | ||
|
|
8c66f0a5da | ||
|
|
78efc2d0de | ||
|
|
656c1e6ba6 | ||
|
|
65e932016b | ||
|
|
fc602b1d42 | ||
|
|
0e882900d7 | ||
|
|
28103ee25b | ||
|
|
0a0d2ddb1a | ||
|
|
3bf4cb721e | ||
|
|
ba1ab64b56 | ||
|
|
786d1e4cfc | ||
|
|
eb82e022ba | ||
|
|
753bfd1dc5 | ||
|
|
bc8d65e7d3 | ||
|
|
3180c5d554 | ||
|
|
6b11655db8 | ||
|
|
d1ae098c08 | ||
|
|
e1a8b5db1d | ||
|
|
302cfea295 | ||
|
|
be122ca1a5 | ||
|
|
b05f6f0018 | ||
|
|
e811021806 | ||
|
|
656f4f440d | ||
|
|
7fb62de4d7 | ||
|
|
0946fecd82 | ||
|
|
26a5325dc3 | ||
|
|
9afdcddfc9 | ||
|
|
4881e0aa51 | ||
|
|
743f7c76de | ||
|
|
f8ef01f557 | ||
|
|
402fa5c2cd | ||
|
|
5ac1e847a5 | ||
|
|
0737a21e38 | ||
|
|
4d162f88bd | ||
|
|
2806987f2f | ||
|
|
f380aa2e5e | ||
|
|
a2ce1972ec | ||
|
|
aa8cf7e6bb | ||
|
|
ec61a6974f | ||
|
|
21e249bd2c | ||
|
|
8e550f7093 | ||
|
|
53e53880bd | ||
|
|
671b5788ed | ||
|
|
76d10cd85c | ||
|
|
42c155d667 | ||
|
|
d17222ec91 | ||
|
|
a1ea55d006 | ||
|
|
f32b7bb978 | ||
|
|
38aa7bae3f | ||
|
|
0021b9532b | ||
|
|
788fac7c43 | ||
|
|
71934152e4 | ||
|
|
e20d6fc04a | ||
|
|
a1e8fc4f97 | ||
|
|
9dc8a10e2a | ||
|
|
43a2da46f9 | ||
|
|
f95ca13073 | ||
|
|
b92b3af602 | ||
|
|
83b76cde34 | ||
|
|
5ff0d488d2 | ||
|
|
f89adf6e53 | ||
|
|
efd34d8cb0 | ||
|
|
3defb60fd7 | ||
|
|
869c9d2fdd | ||
|
|
912e465193 | ||
|
|
e7c1419390 | ||
|
|
b19cd037b7 | ||
|
|
42f7bc2160 | ||
|
|
542a0d79fd | ||
|
|
4b9b09f7bf | ||
|
|
57429f3194 | ||
|
|
9bdf890fd8 | ||
|
|
9240f30f28 | ||
|
|
6062d3b25c | ||
|
|
3878afa2e0 | ||
|
|
fa8998c6b6 | ||
|
|
99dcd501aa | ||
|
|
ed23c6ef75 | ||
|
|
90b59876d0 | ||
|
|
da7d019df3 | ||
|
|
4fc0c90cff | ||
|
|
4ecb6425d2 | ||
|
|
6dfab80df7 | ||
|
|
1ebf1e77e5 | ||
|
|
0c810cc016 | ||
|
|
7e32b45aa8 | ||
|
|
4c1a84716a | ||
|
|
fd4111cdbe | ||
|
|
2fac182a90 | ||
|
|
6d2aa601cd | ||
|
|
f87c3c4996 | ||
|
|
1811465abb | ||
|
|
7631db2183 | ||
|
|
da5bc18d64 | ||
|
|
0c2aeae00d | ||
|
|
f2af2156fa | ||
|
|
5bf8cf50ae | ||
|
|
dc22b0f869 | ||
|
|
5382c1b795 | ||
|
|
dbe851726e | ||
|
|
3720e49618 | ||
|
|
a4f187efd2 | ||
|
|
b6ee02f313 | ||
|
|
380a51e4a4 | ||
|
|
459b1034a7 | ||
|
|
c2f567770c | ||
|
|
03369b8a6c | ||
|
|
c94c908d5d | ||
|
|
585d74ecc9 | ||
|
|
d8422e63f6 | ||
|
|
ca12a99970 | ||
|
|
1fdcafb1ae | ||
|
|
3b2ddb1a18 | ||
|
|
2eede37248 | ||
|
|
6489f7009d | ||
|
|
bdfe2aa6e4 | ||
|
|
007de4691b | ||
|
|
141e495447 | ||
|
|
5e68714ae5 | ||
|
|
4ae6455e0e | ||
|
|
f393ea307d | ||
|
|
1e20b12241 | ||
|
|
81c41df15c | ||
|
|
8b736189e0 | ||
|
|
188d2367df | ||
|
|
5aeac500da | ||
|
|
5730ab28ab | ||
|
|
1c56b03a28 | ||
|
|
828fc7a19b | ||
|
|
fc1f8083ad | ||
|
|
af5e799a45 | ||
|
|
accf734a74 | ||
|
|
6bd86ad46b | ||
|
|
d7207f3399 | ||
|
|
e018b4322e | ||
|
|
415c7d32a2 | ||
|
|
164caa2755 | ||
|
|
ec2f0cb82a | ||
|
|
604918b6ad | ||
|
|
eb7e72a4a9 | ||
|
|
e073e91d62 | ||
|
|
da9bda0e27 | ||
|
|
0e996e4bb7 | ||
|
|
63fbbd6e0a | ||
|
|
1ac694f149 | ||
|
|
924fddf698 | ||
|
|
ef49fe417f | ||
|
|
d28828b7d7 | ||
|
|
8a42f76f03 | ||
|
|
745ce14d47 | ||
|
|
dc41ca23c6 | ||
|
|
9da42fba5b | ||
|
|
fac4633337 | ||
|
|
3ab0de831f | ||
|
|
599d146118 | ||
|
|
5cdbb2b113 | ||
|
|
611584a414 | ||
|
|
33478b2d23 | ||
|
|
46ca8e93c2 | ||
|
|
da58febc3e | ||
|
|
7ca2384e03 | ||
|
|
6b2bb52dcd | ||
|
|
000a42ef3d | ||
|
|
03e40718ff | ||
|
|
4386fb7f28 | ||
|
|
0db4d05671 | ||
|
|
d113e98915 | ||
|
|
e9acecf71f | ||
|
|
76b84decfe | ||
|
|
80148ae4e4 | ||
|
|
4af679c27f | ||
|
|
ba86d9fff0 | ||
|
|
3a07410569 | ||
|
|
b43828db9b | ||
|
|
8251588088 | ||
|
|
22ff4898a5 | ||
|
|
9c4c6d908a | ||
|
|
3f9d98974c | ||
|
|
98a23c6a53 | ||
|
|
3086326d12 | ||
|
|
ac4594e3b1 | ||
|
|
47dcca839e | ||
|
|
572078a708 | ||
|
|
0442f4bd06 | ||
|
|
2861a8f19c | ||
|
|
1d0028fd53 | ||
|
|
c3288543af | ||
|
|
3c96f9eb53 | ||
|
|
6bd8d3a3b7 | ||
|
|
63e017fbaa | ||
|
|
f993b7358b | ||
|
|
4239d5453c | ||
|
|
b0e6f17612 | ||
|
|
c97c10623b | ||
|
|
d566ccd0be | ||
|
|
8b4daefbde | ||
|
|
bbea29be55 | ||
|
|
f016867e1a | ||
|
|
35f2699eb3 | ||
|
|
3ad66da2bf | ||
|
|
004f9b4710 | ||
|
|
3e06b95f98 | ||
|
|
8591dffcae | ||
|
|
3d69c047f0 | ||
|
|
78a1183c26 | ||
|
|
58ea517b32 | ||
|
|
0722b6855b | ||
|
|
a6a745d99d | ||
|
|
7394e9400b | ||
|
|
15f0366e12 | ||
|
|
07e3d9d3b3 | ||
|
|
55eaf03afb | ||
|
|
7a6849b3ac | ||
|
|
fa5496eef4 | ||
|
|
893bd7e204 | ||
|
|
8a54ce57a5 | ||
|
|
3851b7c016 | ||
|
|
3dbcfa8af8 | ||
|
|
9936a30879 | ||
|
|
59e935b05d | ||
|
|
53f93f68db | ||
|
|
66f9bd1ab4 | ||
|
|
78d4abe808 | ||
|
|
cb97417af8 | ||
|
|
d1c94c75ea | ||
|
|
0c8c6c9814 | ||
|
|
3270a8896d | ||
|
|
20f19bf049 | ||
|
|
0cc33fd560 | ||
|
|
fa54fc2735 | ||
|
|
216e0457ff | ||
|
|
678f90acf7 | ||
|
|
dd0d5c08bb | ||
|
|
3837fed59e | ||
|
|
e4ce4edd5c | ||
|
|
a0fb54fe70 | ||
|
|
e946ceaa6f | ||
|
|
285af6512e | ||
|
|
5ae5108a69 | ||
|
|
02ae60f434 | ||
|
|
03dc4e1ff4 | ||
|
|
c39b42abba | ||
|
|
661972f585 | ||
|
|
078aff6ee3 | ||
|
|
4fed108b2c | ||
|
|
fc9beb58aa | ||
|
|
4623b4a83e | ||
|
|
2ba6ecefe5 | ||
|
|
91c2a4682d | ||
|
|
738be195ef | ||
|
|
5dcc4d74ec | ||
|
|
4213bec62a | ||
|
|
babe733bf4 | ||
|
|
ab5f60555e | ||
|
|
b61e33a49e | ||
|
|
a0d5a8338b | ||
|
|
eec321f013 | ||
|
|
e538f72b63 | ||
|
|
bde843b67f | ||
|
|
44c3d47b30 | ||
|
|
f1d3f396bb | ||
|
|
65ae444791 | ||
|
|
e9916c644d | ||
|
|
1940a9ea92 | ||
|
|
c9f8a2677a | ||
|
|
5b6b3f74b5 | ||
|
|
f9ccac4240 | ||
|
|
aa7aae7808 | ||
|
|
7c66301583 | ||
|
|
a5b0b333b0 | ||
|
|
7df872eb7f | ||
|
|
6a4f4c724c | ||
|
|
76828c45c7 | ||
|
|
27215f148b | ||
|
|
77d52463ad | ||
|
|
0f6c2afbf6 | ||
|
|
cbaa3ca6f4 | ||
|
|
63f54bdf06 | ||
|
|
b302863a4d | ||
|
|
ec46b1a92e | ||
|
|
ed65040539 | ||
|
|
cc1a420bc5 | ||
|
|
8555b20380 | ||
|
|
6462ba70f9 | ||
|
|
1ac43e0d7d | ||
|
|
6ac51968c6 | ||
|
|
cbcadf8e45 | ||
|
|
74b111501d | ||
|
|
67e4212f64 | ||
|
|
55559a1020 | ||
|
|
b103232e0e | ||
|
|
b587379f4a | ||
|
|
ba654b2a1d | ||
|
|
ae39475133 | ||
|
|
c641ea833f | ||
|
|
ebf10c2cd6 | ||
|
|
29ef8beb3f | ||
|
|
2b5f38264b | ||
|
|
5850716eb3 | ||
|
|
3db6c4a5b6 | ||
|
|
e79607372b | ||
|
|
b5472ab753 | ||
|
|
013188dcd9 | ||
|
|
3cf7bfbee2 | ||
|
|
5f647f2236 | ||
|
|
3bb740fe9f | ||
|
|
50db5c012e | ||
|
|
dcb14d0fc7 | ||
|
|
419cfe54e0 | ||
|
|
ce1f51a34f | ||
|
|
5fd7992f98 | ||
|
|
3f5a96a15b | ||
|
|
840bdf95e3 | ||
|
|
01deb07ae9 | ||
|
|
fda0f2a042 | ||
|
|
6af4ab6db1 | ||
|
|
6aab682728 | ||
|
|
6c37613bf0 | ||
|
|
188c7364f8 | ||
|
|
09ead55502 | ||
|
|
a364e4a2dc | ||
|
|
f7f9513fba | ||
|
|
dd2d2389c8 | ||
|
|
1bb639617c | ||
|
|
03b43a85c8 | ||
|
|
fb709e2e10 | ||
|
|
dad653492a | ||
|
|
0db133ffb2 | ||
|
|
6d1682911b | ||
|
|
d1de479c49 | ||
|
|
ad7e231f39 | ||
|
|
f36d239b85 | ||
|
|
540865d045 | ||
|
|
5ed0da7b08 | ||
|
|
068c8a341d | ||
|
|
e61be66d4f | ||
|
|
d263f0c91a | ||
|
|
fee0cebcec | ||
|
|
3745308642 | ||
|
|
8843fa3ed4 | ||
|
|
464d6e9ec4 | ||
|
|
02ced24751 | ||
|
|
8b9ad131d1 | ||
|
|
5ef944e8b8 | ||
|
|
ea0145fda5 | ||
|
|
53c3cb382c | ||
|
|
179c557e5b | ||
|
|
8da458e1a8 | ||
|
|
b009c85b64 | ||
|
|
3eb3dd7d4b | ||
|
|
c9a1159a2e | ||
|
|
17f75e64ba | ||
|
|
8664668524 | ||
|
|
3ba4cf699a | ||
|
|
8bc39ce44f | ||
|
|
2d03eae413 | ||
|
|
0157b9eb37 | ||
|
|
0d848b342f | ||
|
|
ad6030b0e8 | ||
|
|
bdb2a221a5 | ||
|
|
44f505e687 | ||
|
|
d931dacd47 | ||
|
|
1da425ae2f | ||
|
|
9ceea4ac81 | ||
|
|
a1010b8cf8 | ||
|
|
19a300a4ba | ||
|
|
1bc1803628 | ||
|
|
7fdead0100 | ||
|
|
3dcdc11c1b | ||
|
|
e8326529b5 | ||
|
|
2d5476f6c8 | ||
|
|
781133d0d3 | ||
|
|
c7b4cf636f | ||
|
|
d81c796dc0 | ||
|
|
1a3680bba6 | ||
|
|
600bca149a | ||
|
|
3a56d632e1 | ||
|
|
7f3f0327c2 | ||
|
|
cc0c71b277 | ||
|
|
e5ce286c63 | ||
|
|
86a0cf9424 | ||
|
|
eaea6ac837 | ||
|
|
4efc3ff822 | ||
|
|
c22a6563d9 | ||
|
|
f9683efb74 | ||
|
|
08945923e6 | ||
|
|
4745c62853 | ||
|
|
7c593899e7 | ||
|
|
9151e7066a | ||
|
|
730be65514 | ||
|
|
b358a22d32 | ||
|
|
8a0ff14d22 | ||
|
|
7604a2d80b | ||
|
|
78b1c8a430 | ||
|
|
4ef925d8be | ||
|
|
7ba4f0c571 | ||
|
|
63fc9dd6a5 | ||
|
|
b350f1572b | ||
|
|
e24a9ba602 | ||
|
|
a338228b57 | ||
|
|
d6d232ec37 | ||
|
|
b723405e9f | ||
|
|
cecb125b0b | ||
|
|
2177ff1806 | ||
|
|
674eb31cfe | ||
|
|
9783710adf | ||
|
|
8888555f71 | ||
|
|
13a6180507 | ||
|
|
9a86b9ad75 | ||
|
|
65260e3aaa | ||
|
|
51af1bd162 | ||
|
|
e093ac843f | ||
|
|
13eb7c796e | ||
|
|
1cdd3c55ab | ||
|
|
407dbbb7fb | ||
|
|
0bccf97d16 | ||
|
|
c6e16ee6bd | ||
|
|
2b25bb6d1c | ||
|
|
e791a71566 | ||
|
|
739b512cee | ||
|
|
effcab4297 | ||
|
|
2e1161e061 | ||
|
|
649a5987e7 | ||
|
|
71e0e2bc8e | ||
|
|
fd7633518f | ||
|
|
04252c28f2 | ||
|
|
94be1ab277 | ||
|
|
8561f2a6b0 | ||
|
|
2bd050657d | ||
|
|
c7d8f39ad8 | ||
|
|
ad4b5bdc16 | ||
|
|
ef5eff45aa | ||
|
|
d18c8614ba | ||
|
|
29192e8d5f | ||
|
|
c2e894c48c | ||
|
|
2cc6e5bfe6 | ||
|
|
2d15ea54cb | ||
|
|
6b26386a81 | ||
|
|
525e886d79 | ||
|
|
05f73df064 | ||
|
|
e592381a54 | ||
|
|
fecf0cc137 | ||
|
|
507d191d7d | ||
|
|
8420e4b044 | ||
|
|
2ca5868610 | ||
|
|
6d8559eccb | ||
|
|
53d020f7b0 | ||
|
|
ad9a2d231e | ||
|
|
7bbb3da010 | ||
|
|
76a85b7637 | ||
|
|
80f72a5093 | ||
|
|
df552c241e | ||
|
|
9e020dd15d | ||
|
|
c7c0c30ecf | ||
|
|
60deead669 | ||
|
|
6d843eca60 | ||
|
|
885b5aab41 | ||
|
|
12c22d0311 | ||
|
|
d28f5e87c0 | ||
|
|
471fabfff5 | ||
|
|
2e1a6d9d43 | ||
|
|
d2d22e849e | ||
|
|
6c41bfa44d | ||
|
|
d54bcc85e7 | ||
|
|
ef22eee4d9 | ||
|
|
b609f24bbc | ||
|
|
83b03df98b | ||
|
|
6d94ddb114 | ||
|
|
7fd720bf39 | ||
|
|
e10558e444 | ||
|
|
7c48d5ee1f | ||
|
|
10ffd870e2 | ||
|
|
3a4ab156b0 | ||
|
|
651d863069 | ||
|
|
a3c595a4a9 | ||
|
|
7660714a9e | ||
|
|
71002dfb65 | ||
|
|
013cfdcdaf | ||
|
|
5ad6add91e | ||
|
|
2f5b49f4ae | ||
|
|
353479fe72 | ||
|
|
6f5c935837 | ||
|
|
1bf91d4281 | ||
|
|
8d2dd55c94 | ||
|
|
6a86e8ea97 | ||
|
|
a817d95d6c | ||
|
|
7cdb5ccba8 | ||
|
|
22b8d462c2 | ||
|
|
066052ddd2 | ||
|
|
d673010420 | ||
|
|
fffd1b986d | ||
|
|
dc852b6398 | ||
|
|
64471be009 | ||
|
|
d43ffe09b3 | ||
|
|
e0c1107a25 | ||
|
|
3475aefd04 | ||
|
|
4e4a18c71a | ||
|
|
9a2f2c1fb2 | ||
|
|
b2ee2cc7b8 | ||
|
|
ee0b4f96a8 | ||
|
|
665f9ee5b5 | ||
|
|
4eb8903bed | ||
|
|
d11b2f05bb | ||
|
|
11f7e6e1b4 | ||
|
|
72acbc567b | ||
|
|
1170ac6105 | ||
|
|
bdc724d548 | ||
|
|
74cd03de0b | ||
|
|
5e9bb67d10 | ||
|
|
e969172543 | ||
|
|
f570260dfe | ||
|
|
7ecf65551e | ||
|
|
fb6ec8aaa7 | ||
|
|
0ba6a7adf0 | ||
|
|
0019abe5e7 | ||
|
|
30d2883436 | ||
|
|
cc5881dca2 | ||
|
|
d17f5dfd9e | ||
|
|
4c037c644f | ||
|
|
a08f0da30d | ||
|
|
654cfd7a47 | ||
|
|
88e79cd3a8 | ||
|
|
4543c7a0b3 | ||
|
|
f5bc9735af | ||
|
|
107a27aa25 | ||
|
|
5c29ce0695 | ||
|
|
41e1b7bd4e | ||
|
|
462a570d3c | ||
|
|
7f1af4215a | ||
|
|
7a141a923c | ||
|
|
0db1d1c8ca | ||
|
|
201b0ba53c | ||
|
|
3e54d6651c | ||
|
|
6d770ab68f | ||
|
|
6ca149de1d | ||
|
|
2e76ce740e | ||
|
|
a664b9dd0c | ||
|
|
d49701f470 | ||
|
|
67fae52b32 | ||
|
|
bb9f6ff082 | ||
|
|
ad7fc977df | ||
|
|
0479a89982 | ||
|
|
d7b9791514 | ||
|
|
832d379ace | ||
|
|
b8f3078966 | ||
|
|
d496aaae55 | ||
|
|
87e60cfd78 | ||
|
|
2077fa3837 | ||
|
|
96c2f86613 | ||
|
|
eaa03e15ed | ||
|
|
95bedf0bfc | ||
|
|
3a1b17f1f9 | ||
|
|
9fe9bf617f | ||
|
|
3c34da8bd3 | ||
|
|
9fa7adaa61 | ||
|
|
54a2f5347a | ||
|
|
a716d3ad49 | ||
|
|
8f70604466 | ||
|
|
2044e191a2 | ||
|
|
8fe9ec0521 | ||
|
|
034e510ba5 | ||
|
|
bdec1ac64d | ||
|
|
36a0d760e9 | ||
|
|
a901e85c3c | ||
|
|
6e9dc2339d | ||
|
|
3864e712ef | ||
|
|
8376f1e4a4 | ||
|
|
1b0fd752d3 | ||
|
|
bef473a48b | ||
|
|
0c60078d27 | ||
|
|
2f65462ce0 | ||
|
|
ace6156c65 | ||
|
|
ada8feba34 | ||
|
|
75d685a7f4 | ||
|
|
6b7f20323b | ||
|
|
c2ab5bc09d | ||
|
|
95d5b8bdbc | ||
|
|
da7b3182e8 | ||
|
|
08790f2f0a | ||
|
|
896270e617 | ||
|
|
fb40ee986f | ||
|
|
20b82e4bc9 | ||
|
|
513347911e | ||
|
|
1a3960e95d | ||
|
|
7d9a47b7c3 | ||
|
|
c80d085e33 | ||
|
|
98518e5c8c | ||
|
|
2b7a488d64 | ||
|
|
25aa6669be | ||
|
|
ef9e1c4e4f | ||
|
|
cf483c28e3 | ||
|
|
fecc39d97d | ||
|
|
339370a703 | ||
|
|
359e5157a8 | ||
|
|
207bd8d77c | ||
|
|
ba5454808e | ||
|
|
9196ba91bb | ||
|
|
5ff1b02e49 | ||
|
|
4f92d620eb | ||
|
|
e7f5779659 | ||
|
|
512cfc4858 | ||
|
|
437ba70b9e | ||
|
|
fadca563bc | ||
|
|
7a601b196e | ||
|
|
bf6bd246fd | ||
|
|
168ff4c050 | ||
|
|
d6fdbafa3c | ||
|
|
3e1570a716 | ||
|
|
160c0b4ac0 | ||
|
|
cf0bc3914f | ||
|
|
96154627d3 | ||
|
|
6f07b62a3f | ||
|
|
cae17b91b8 | ||
|
|
69b68f3a44 | ||
|
|
20a3e7e4b8 | ||
|
|
119a8fff1e | ||
|
|
8094b1bd92 | ||
|
|
98fc4d78aa | ||
|
|
d773c2e90d | ||
|
|
7929e7ab9c | ||
|
|
e8e95f113c | ||
|
|
429c791377 | ||
|
|
e536eea5b6 | ||
|
|
0a5b5eadeb | ||
|
|
12351d3a8a | ||
|
|
aa8eb955e9 | ||
|
|
8e52c18200 | ||
|
|
7421b2e553 | ||
|
|
8aa4dce6f4 | ||
|
|
feeceefe99 | ||
|
|
60483e3216 | ||
|
|
49837e0c20 | ||
|
|
c7668ad882 | ||
|
|
4f37563be1 | ||
|
|
e468723abc | ||
|
|
9c3ab95048 | ||
|
|
99bfde32a8 | ||
|
|
bf5651e127 | ||
|
|
f854a12043 | ||
|
|
dd09f02f53 | ||
|
|
268f43d668 | ||
|
|
d95b7504ab | ||
|
|
4d2b6ee99e | ||
|
|
6ad6984fe7 | ||
|
|
97d48a204a | ||
|
|
c6e8915627 | ||
|
|
496b3e5a78 | ||
|
|
01be9e68ee | ||
|
|
cc56ddb354 | ||
|
|
3ce527b0b9 | ||
|
|
94d4d92cc0 | ||
|
|
72b268b253 | ||
|
|
2c7885bbc1 | ||
|
|
36120a9122 | ||
|
|
56c3b8c3fe | ||
|
|
6305ec3f31 | ||
|
|
b319731a2d | ||
|
|
885740dad6 | ||
|
|
b178268cbc | ||
|
|
3ae556893f | ||
|
|
43b297636d | ||
|
|
8cd17698fe | ||
|
|
3886c406ab | ||
|
|
b56671c20d | ||
|
|
f3cbad065f | ||
|
|
4b3b1a80f6 | ||
|
|
7abcc39c8c | ||
|
|
a5b915d571 | ||
|
|
0fcdca653a | ||
|
|
9ec801d495 | ||
|
|
4ccbdcb93c | ||
|
|
53f909f2a1 | ||
|
|
f8603705a8 | ||
|
|
3bc1b97a68 | ||
|
|
27ed17e62e | ||
|
|
f3d5090d51 | ||
|
|
d030f9be99 | ||
|
|
774d18ed8f | ||
|
|
d39f5eedf1 | ||
|
|
1a1e21f344 | ||
|
|
96c7bc30d8 | ||
|
|
0328b1cb3c | ||
|
|
ad0cc7f39d | ||
|
|
42a491ab8b | ||
|
|
ef4b25591b | ||
|
|
fbc99cf7e6 | ||
|
|
5d0e9484ce | ||
|
|
1bc6a6dfe5 | ||
|
|
30be3265fb | ||
|
|
ecaad7979f | ||
|
|
d638edbeae | ||
|
|
91779b6de9 | ||
|
|
3abb0e80d5 | ||
|
|
f4c1cc576b | ||
|
|
986235dce7 | ||
|
|
1f0c88a934 | ||
|
|
94f7dd2238 | ||
|
|
79fd12eb75 | ||
|
|
05a98be1e5 | ||
|
|
24eb1d3fe2 | ||
|
|
75d1bcdc69 | ||
|
|
7549eff9c1 | ||
|
|
6e2b4f7514 | ||
|
|
846cff5721 | ||
|
|
efd25ec4d2 | ||
|
|
5c94b50386 | ||
|
|
c0fbc9ef8c | ||
|
|
1f429fb488 | ||
|
|
ec28ea299f | ||
|
|
08558aa118 | ||
|
|
7e319b797f | ||
|
|
3957a11f25 | ||
|
|
743922d45a | ||
|
|
5f70776cf3 | ||
|
|
289f91997c | ||
|
|
163ea9ecdd | ||
|
|
9be941acc8 | ||
|
|
e95314f072 | ||
|
|
6fef6b578a | ||
|
|
dd59814563 | ||
|
|
b704b20695 | ||
|
|
23e55e92ca | ||
|
|
71885b8a79 | ||
|
|
0cfdbfb91c | ||
|
|
59a6963a89 | ||
|
|
6e9dfdff30 | ||
|
|
470419d732 | ||
|
|
5b05653881 | ||
|
|
899dc07883 | ||
|
|
83dfd408e9 | ||
|
|
417171cfe1 | ||
|
|
e8e82a1ca3 | ||
|
|
6843aa7cc8 | ||
|
|
952acc983d | ||
|
|
650f267be7 | ||
|
|
3ace4c57f7 | ||
|
|
ab1b603c78 | ||
|
|
8430f694e5 | ||
|
|
71f0cafc78 | ||
|
|
4614287a55 | ||
|
|
f477f811df | ||
|
|
95bb5a1ae4 | ||
|
|
70699037ae | ||
|
|
7edddec920 | ||
|
|
8f3779c94c | ||
|
|
917bc48348 | ||
|
|
581dc36c47 | ||
|
|
a4286ba950 | ||
|
|
5fa85f268f | ||
|
|
ada6f6882a | ||
|
|
78a0030d46 | ||
|
|
e2d6aecd81 | ||
|
|
a2e99e8ddb | ||
|
|
b499a074cf | ||
|
|
188e579df7 | ||
|
|
d82e4801ff | ||
|
|
d258d146b8 | ||
|
|
96e6b3f53e | ||
|
|
ae6b0f0d40 | ||
|
|
2c2c4740a8 | ||
|
|
14740e8a89 | ||
|
|
b357257f4d | ||
|
|
4428e62b99 | ||
|
|
575ad0d8a2 | ||
|
|
5ad9deb199 | ||
|
|
e99f6edb56 | ||
|
|
3149d1232b | ||
|
|
3c6218f20e | ||
|
|
68f04a50aa | ||
|
|
ec01672f6c | ||
|
|
be6b1bb3ee | ||
|
|
6f4557a103 | ||
|
|
dc96f62f9e | ||
|
|
2f86bd8bda | ||
|
|
fbe43b61d4 | ||
|
|
546d4163a9 | ||
|
|
55132f2955 | ||
|
|
ebdd2d4a23 | ||
|
|
4c63827517 | ||
|
|
401067f637 | ||
|
|
8e6609c192 | ||
|
|
1f1ffcbfa6 | ||
|
|
065dd713c1 | ||
|
|
71132d48ff | ||
|
|
d77e0c62c1 | ||
|
|
e853c36039 | ||
|
|
2be3220824 | ||
|
|
6ae39e50ae | ||
|
|
c783acc973 | ||
|
|
e5210b5137 | ||
|
|
41f0950c04 | ||
|
|
9f439cd7fb | ||
|
|
c911c5c045 | ||
|
|
27a7873e08 | ||
|
|
5fe233384e | ||
|
|
d42ad45423 | ||
|
|
84235478ef | ||
|
|
509b35a19f | ||
|
|
65296e86a3 | ||
|
|
c9b7bb73b9 | ||
|
|
795f42cbaa | ||
|
|
d540ec0cb8 | ||
|
|
202cba1a14 | ||
|
|
20d5b81085 | ||
|
|
d8b806592d | ||
|
|
84f9b83fc2 | ||
|
|
7cb5106656 | ||
|
|
6f21df7624 | ||
|
|
4c7dc565e7 | ||
|
|
3c60fba430 | ||
|
|
224eef9ffa | ||
|
|
42beadcf34 | ||
|
|
80ed2d6d30 | ||
|
|
c2bf6fe7f5 | ||
|
|
f18ae4f99f | ||
|
|
084a9ab976 | ||
|
|
356b942114 | ||
|
|
2c5d720146 | ||
|
|
64f83eee07 | ||
|
|
542cf9c52b | ||
|
|
0bbccc1bc1 | ||
|
|
6f014f8638 | ||
|
|
66ca5aca89 | ||
|
|
33afa30c30 | ||
|
|
1634d787ec | ||
|
|
df7b529e23 | ||
|
|
56d90bedd0 | ||
|
|
8369d253f8 | ||
|
|
516d3e226c | ||
|
|
f4208cb27d | ||
|
|
47b785a8fd | ||
|
|
6a2bf3fd2f | ||
|
|
ff678642e6 | ||
|
|
e3eb1b90c5 | ||
|
|
49125f077c | ||
|
|
324031cb68 | ||
|
|
f2ab426d38 | ||
|
|
587ab35d65 | ||
|
|
16a6dda3dd | ||
|
|
034137f533 | ||
|
|
6f75e18bfa | ||
|
|
5217f19faa | ||
|
|
296d170ba9 | ||
|
|
a97fd74399 | ||
|
|
15191b068d | ||
|
|
ee9cc24e52 | ||
|
|
0584fbf42b | ||
|
|
f5f9ccee7f | ||
|
|
0d183e2e89 | ||
|
|
b9eacfefc8 | ||
|
|
0239127db4 | ||
|
|
281d1ea91c | ||
|
|
df92ecaa55 | ||
|
|
60d40c8ad8 | ||
|
|
f428c561c9 | ||
|
|
8fbb7a1d93 | ||
|
|
e98223b2b3 | ||
|
|
410fe2843d | ||
|
|
dc8d69e0f4 | ||
|
|
a056765e38 | ||
|
|
97cd1e3886 | ||
|
|
4e7da98bfa | ||
|
|
0a56f5282d | ||
|
|
04b9ca2fd4 | ||
|
|
ddbe3df6de | ||
|
|
ab5c88a7f3 | ||
|
|
4046a0efe9 | ||
|
|
5aefc7cdff | ||
|
|
70eb779ce5 | ||
|
|
39f5d28348 | ||
|
|
e70407f16b | ||
|
|
c25475296d | ||
|
|
1363af0317 | ||
|
|
e97b7454e9 | ||
|
|
2418356eff | ||
|
|
735caa03b1 | ||
|
|
f577aece08 | ||
|
|
b7f1bfdb92 | ||
|
|
b5301e280b | ||
|
|
741816db52 | ||
|
|
546a6e2a68 | ||
|
|
1be5e8c63e | ||
|
|
917a25317a | ||
|
|
949167e6ad | ||
|
|
a359905a06 | ||
|
|
4ce606306d | ||
|
|
707fcd29ea | ||
|
|
970cbe35b8 | ||
|
|
fa9e8aa5c0 | ||
|
|
a5e6d37049 | ||
|
|
dacac135fb | ||
|
|
0ddf0d5d0d | ||
|
|
90a5251fa7 | ||
|
|
a97c69e06f | ||
|
|
a323eb43ed | ||
|
|
79243b77fd | ||
|
|
5ab2720ddc | ||
|
|
c72a49b77f | ||
|
|
a0d92b80df | ||
|
|
1a32a6252b | ||
|
|
6df7cbaf6e | ||
|
|
0a90cd3a0a | ||
|
|
c529939481 | ||
|
|
db70630eaa | ||
|
|
24862d9759 | ||
|
|
cb5f2685cd | ||
|
|
baa298873a | ||
|
|
a8f57d37bf | ||
|
|
d97ee52f4e | ||
|
|
1cfdb6decd | ||
|
|
f93272f0bd | ||
|
|
e783e953d9 | ||
|
|
39cac919c7 | ||
|
|
fec82173d9 | ||
|
|
35efed73d4 | ||
|
|
21b8e16afc | ||
|
|
6efee51101 | ||
|
|
1490425ecb | ||
|
|
afac6a918d | ||
|
|
bf0e488c06 | ||
|
|
37c2bee3ae | ||
|
|
4debcabb88 | ||
|
|
5a0c637ad0 | ||
|
|
d91215680a | ||
|
|
0cbcbd4614 | ||
|
|
19135f08c3 | ||
|
|
855cc52f0f | ||
|
|
4e5da23474 | ||
|
|
3cca4ec0ac | ||
|
|
e393f7feb4 | ||
|
|
b76ac7bab0 | ||
|
|
a3c842ba18 | ||
|
|
1640370c9d | ||
|
|
b6427fa05a | ||
|
|
2a04d854cc | ||
|
|
6d190d7d7c | ||
|
|
b8a2bd595a | ||
|
|
8b7d5546f7 | ||
|
|
b63423ce37 | ||
|
|
0b02b68538 | ||
|
|
bbd1646ae5 | ||
|
|
299a9c7bc9 | ||
|
|
37f8d5b5e1 | ||
|
|
2a6a59c047 | ||
|
|
c4da2dd557 | ||
|
|
583392d179 | ||
|
|
1488796779 | ||
|
|
7458a2f9ff | ||
|
|
348dab4b9f | ||
|
|
5c824e0771 | ||
|
|
b9c88a758c | ||
|
|
a51d637e58 | ||
|
|
d002dfa70c | ||
|
|
d118017d27 | ||
|
|
d10d328eb1 | ||
|
|
e472d7b8b1 | ||
|
|
a54d6f3a8a | ||
|
|
67ccb24b41 | ||
|
|
42ff3f58d9 | ||
|
|
ad778571a2 | ||
|
|
bb12b86445 | ||
|
|
ab61b06c34 | ||
|
|
de6b2f3307 | ||
|
|
5fd56c75d5 | ||
|
|
6aa70a3e93 | ||
|
|
93186947c2 | ||
|
|
77444284e3 | ||
|
|
6950b028df | ||
|
|
565767ef42 | ||
|
|
a1f26d64d5 | ||
|
|
be30e1c658 | ||
|
|
3aec4dd2ea | ||
|
|
ed34caa565 | ||
|
|
81b8c57bae | ||
|
|
0780b7239a | ||
|
|
1d626f7378 | ||
|
|
ff3438b810 | ||
|
|
1762c2cefd | ||
|
|
7aaf99c9b1 | ||
|
|
07cd9aa994 | ||
|
|
6ae4aa50e2 | ||
|
|
22fbcc244b | ||
|
|
1a3177409c | ||
|
|
de4b538d82 | ||
|
|
70b1ec97db | ||
|
|
a97e328484 | ||
|
|
e446b86b90 | ||
|
|
901e8da911 | ||
|
|
e9036d675e | ||
|
|
351e348ac0 | ||
|
|
feea9bfd30 | ||
|
|
f1282b857d | ||
|
|
70e0ce1d73 | ||
|
|
a5673e7fb6 | ||
|
|
d06529fd14 | ||
|
|
a02f19f5a3 | ||
|
|
a9a62fff15 | ||
|
|
7625c92307 | ||
|
|
7dd318ca76 | ||
|
|
e5bc2845cd | ||
|
|
4ddd8d9d2b | ||
|
|
37ffdb9020 | ||
|
|
dce00d01d9 | ||
|
|
768ec76ff0 | ||
|
|
8c841903a5 | ||
|
|
d4888098e5 | ||
|
|
a349daeaeb | ||
|
|
7a57a0b594 | ||
|
|
66eabd8bdc | ||
|
|
be82b55408 | ||
|
|
526ca1761a | ||
|
|
8655d966ad | ||
|
|
3fb4973aab | ||
|
|
1d4149168d | ||
|
|
26ab33754f | ||
|
|
43ee45d9b6 | ||
|
|
02db72515f | ||
|
|
af9b5f0e98 | ||
|
|
a145bd92f7 | ||
|
|
20204cd9fc | ||
|
|
3445e55744 | ||
|
|
c5a654e692 | ||
|
|
3ac69ed4e0 | ||
|
|
6739a1471b | ||
|
|
230d91ecd8 | ||
|
|
4603f3b2e7 | ||
|
|
9d6b8b4715 | ||
|
|
036b9c4094 | ||
|
|
ce928d8b64 | ||
|
|
897c2c5ab6 | ||
|
|
f9ad5dda56 | ||
|
|
ff6a10698e | ||
|
|
6072a63f99 | ||
|
|
1bd935b2b4 | ||
|
|
7702583314 | ||
|
|
edadca9085 | ||
|
|
5ffc4c0158 | ||
|
|
08290ac49e | ||
|
|
42944660bd | ||
|
|
ae5e1c5a85 | ||
|
|
f4f5ccb3f5 | ||
|
|
ab3f44cb6e | ||
|
|
d7757033ab | ||
|
|
8bb9241e6e | ||
|
|
7b44baa417 | ||
|
|
f3d654a965 | ||
|
|
2e6aae0256 | ||
|
|
2c5e8c4308 | ||
|
|
506b75c5e8 | ||
|
|
af4b64070f | ||
|
|
29d8e58d69 | ||
|
|
bde19a76cc | ||
|
|
49ebf4b303 | ||
|
|
0017310dd1 | ||
|
|
35355b157c | ||
|
|
81d9c682da | ||
|
|
e4975fc476 | ||
|
|
e1064b13c0 |
4
.gitignore
vendored
4
.gitignore
vendored
@@ -1,6 +1,10 @@
|
|||||||
|
*.gem
|
||||||
/Gemfile.lock
|
/Gemfile.lock
|
||||||
.bundle/
|
.bundle/
|
||||||
|
.idea
|
||||||
benchmark/
|
benchmark/
|
||||||
lib/linguist/samples.json
|
lib/linguist/samples.json
|
||||||
/grammars
|
/grammars
|
||||||
/node_modules
|
/node_modules
|
||||||
|
test/fixtures/ace_modes.json
|
||||||
|
/vendor/gems/
|
||||||
|
|||||||
838
.gitmodules
vendored
Normal file
838
.gitmodules
vendored
Normal file
@@ -0,0 +1,838 @@
|
|||||||
|
[submodule "vendor/grammars/go-tmbundle"]
|
||||||
|
path = vendor/grammars/go-tmbundle
|
||||||
|
url = https://github.com/AlanQuatermain/go-tmbundle
|
||||||
|
[submodule "vendor/grammars/PHP-Twig.tmbundle"]
|
||||||
|
path = vendor/grammars/PHP-Twig.tmbundle
|
||||||
|
url = https://github.com/Anomareh/PHP-Twig.tmbundle
|
||||||
|
[submodule "vendor/grammars/sublime-cirru"]
|
||||||
|
path = vendor/grammars/sublime-cirru
|
||||||
|
url = https://github.com/Cirru/sublime-cirru
|
||||||
|
[submodule "vendor/grammars/SublimeBrainfuck"]
|
||||||
|
path = vendor/grammars/SublimeBrainfuck
|
||||||
|
url = https://github.com/Drako/SublimeBrainfuck
|
||||||
|
[submodule "vendor/grammars/awk-sublime"]
|
||||||
|
path = vendor/grammars/awk-sublime
|
||||||
|
url = https://github.com/github-linguist/awk-sublime
|
||||||
|
[submodule "vendor/grammars/Sublime-SQF-Language"]
|
||||||
|
path = vendor/grammars/Sublime-SQF-Language
|
||||||
|
url = https://github.com/JonBons/Sublime-SQF-Language
|
||||||
|
[submodule "vendor/grammars/SCSS.tmbundle"]
|
||||||
|
path = vendor/grammars/SCSS.tmbundle
|
||||||
|
url = https://github.com/MarioRicalde/SCSS.tmbundle
|
||||||
|
[submodule "vendor/grammars/Sublime-REBOL"]
|
||||||
|
path = vendor/grammars/Sublime-REBOL
|
||||||
|
url = https://github.com/Oldes/Sublime-REBOL
|
||||||
|
[submodule "vendor/grammars/language-viml"]
|
||||||
|
path = vendor/grammars/language-viml
|
||||||
|
url = https://github.com/Alhadis/language-viml
|
||||||
|
[submodule "vendor/grammars/ColdFusion"]
|
||||||
|
path = vendor/grammars/ColdFusion
|
||||||
|
url = https://github.com/SublimeText/ColdFusion
|
||||||
|
[submodule "vendor/grammars/NSIS"]
|
||||||
|
path = vendor/grammars/NSIS
|
||||||
|
url = https://github.com/github-linguist/NSIS
|
||||||
|
[submodule "vendor/grammars/NimLime"]
|
||||||
|
path = vendor/grammars/NimLime
|
||||||
|
url = https://github.com/Varriount/NimLime
|
||||||
|
[submodule "vendor/grammars/gradle.tmbundle"]
|
||||||
|
path = vendor/grammars/gradle.tmbundle
|
||||||
|
url = https://github.com/alkemist/gradle.tmbundle
|
||||||
|
[submodule "vendor/grammars/Sublime-Loom"]
|
||||||
|
path = vendor/grammars/Sublime-Loom
|
||||||
|
url = https://github.com/ambethia/Sublime-Loom
|
||||||
|
[submodule "vendor/grammars/VBDotNetSyntax"]
|
||||||
|
path = vendor/grammars/VBDotNetSyntax
|
||||||
|
url = https://github.com/angryant0007/VBDotNetSyntax
|
||||||
|
[submodule "vendor/grammars/cool-tmbundle"]
|
||||||
|
path = vendor/grammars/cool-tmbundle
|
||||||
|
url = https://github.com/anunayk/cool-tmbundle
|
||||||
|
[submodule "vendor/grammars/Docker.tmbundle"]
|
||||||
|
path = vendor/grammars/Docker.tmbundle
|
||||||
|
url = https://github.com/asbjornenge/Docker.tmbundle
|
||||||
|
[submodule "vendor/grammars/jasmin-sublime"]
|
||||||
|
path = vendor/grammars/jasmin-sublime
|
||||||
|
url = https://github.com/atmarksharp/jasmin-sublime
|
||||||
|
[submodule "vendor/grammars/language-clojure"]
|
||||||
|
path = vendor/grammars/language-clojure
|
||||||
|
url = https://github.com/atom/language-clojure
|
||||||
|
[submodule "vendor/grammars/language-coffee-script"]
|
||||||
|
path = vendor/grammars/language-coffee-script
|
||||||
|
url = https://github.com/atom/language-coffee-script
|
||||||
|
[submodule "vendor/grammars/language-csharp"]
|
||||||
|
path = vendor/grammars/language-csharp
|
||||||
|
url = https://github.com/atom/language-csharp
|
||||||
|
[submodule "vendor/grammars/language-gfm"]
|
||||||
|
path = vendor/grammars/language-gfm
|
||||||
|
url = https://github.com/atom/language-gfm
|
||||||
|
[submodule "vendor/grammars/language-javascript"]
|
||||||
|
path = vendor/grammars/language-javascript
|
||||||
|
url = https://github.com/atom/language-javascript
|
||||||
|
[submodule "vendor/grammars/language-shellscript"]
|
||||||
|
path = vendor/grammars/language-shellscript
|
||||||
|
url = https://github.com/atom/language-shellscript
|
||||||
|
[submodule "vendor/grammars/language-supercollider"]
|
||||||
|
path = vendor/grammars/language-supercollider
|
||||||
|
url = https://github.com/supercollider/language-supercollider
|
||||||
|
[submodule "vendor/grammars/language-yaml"]
|
||||||
|
path = vendor/grammars/language-yaml
|
||||||
|
url = https://github.com/atom/language-yaml
|
||||||
|
[submodule "vendor/grammars/Sublime-Lasso"]
|
||||||
|
path = vendor/grammars/Sublime-Lasso
|
||||||
|
url = https://github.com/bfad/Sublime-Lasso
|
||||||
|
[submodule "vendor/grammars/chapel-tmbundle"]
|
||||||
|
path = vendor/grammars/chapel-tmbundle
|
||||||
|
url = https://github.com/chapel-lang/chapel-tmbundle
|
||||||
|
[submodule "vendor/grammars/sublime-nginx"]
|
||||||
|
path = vendor/grammars/sublime-nginx
|
||||||
|
url = https://github.com/brandonwamboldt/sublime-nginx
|
||||||
|
[submodule "vendor/grammars/bro-sublime"]
|
||||||
|
path = vendor/grammars/bro-sublime
|
||||||
|
url = https://github.com/bro/bro-sublime
|
||||||
|
[submodule "vendor/grammars/sublime-MuPAD"]
|
||||||
|
path = vendor/grammars/sublime-MuPAD
|
||||||
|
url = https://github.com/ccreutzig/sublime-MuPAD
|
||||||
|
[submodule "vendor/grammars/haxe-sublime-bundle"]
|
||||||
|
path = vendor/grammars/haxe-sublime-bundle
|
||||||
|
url = https://github.com/clemos/haxe-sublime-bundle
|
||||||
|
[submodule "vendor/grammars/cucumber-tmbundle"]
|
||||||
|
path = vendor/grammars/cucumber-tmbundle
|
||||||
|
url = https://github.com/cucumber/cucumber-tmbundle
|
||||||
|
[submodule "vendor/grammars/powershell"]
|
||||||
|
path = vendor/grammars/powershell
|
||||||
|
url = https://github.com/SublimeText/PowerShell
|
||||||
|
[submodule "vendor/grammars/jade-tmbundle"]
|
||||||
|
path = vendor/grammars/jade-tmbundle
|
||||||
|
url = https://github.com/davidrios/jade-tmbundle
|
||||||
|
[submodule "vendor/grammars/elixir-tmbundle"]
|
||||||
|
path = vendor/grammars/elixir-tmbundle
|
||||||
|
url = https://github.com/elixir-lang/elixir-tmbundle
|
||||||
|
[submodule "vendor/grammars/sublime-glsl"]
|
||||||
|
path = vendor/grammars/sublime-glsl
|
||||||
|
url = https://github.com/euler0/sublime-glsl
|
||||||
|
[submodule "vendor/grammars/fancy-tmbundle"]
|
||||||
|
path = vendor/grammars/fancy-tmbundle
|
||||||
|
url = https://github.com/fancy-lang/fancy-tmbundle
|
||||||
|
[submodule "vendor/grammars/dart-sublime-bundle"]
|
||||||
|
path = vendor/grammars/dart-sublime-bundle
|
||||||
|
url = https://github.com/guillermooo/dart-sublime-bundle
|
||||||
|
[submodule "vendor/grammars/sublimetext-cuda-cpp"]
|
||||||
|
path = vendor/grammars/sublimetext-cuda-cpp
|
||||||
|
url = https://github.com/harrism/sublimetext-cuda-cpp
|
||||||
|
[submodule "vendor/grammars/pike-textmate"]
|
||||||
|
path = vendor/grammars/pike-textmate
|
||||||
|
url = https://github.com/hww3/pike-textmate
|
||||||
|
[submodule "vendor/grammars/ceylon-sublimetext"]
|
||||||
|
path = vendor/grammars/ceylon-sublimetext
|
||||||
|
url = https://github.com/jeancharles-roger/ceylon-sublimetext
|
||||||
|
[submodule "vendor/grammars/Sublime-Text-2-OpenEdge-ABL"]
|
||||||
|
path = vendor/grammars/Sublime-Text-2-OpenEdge-ABL
|
||||||
|
url = https://github.com/jfairbank/Sublime-Text-2-OpenEdge-ABL
|
||||||
|
[submodule "vendor/grammars/sublime-befunge"]
|
||||||
|
path = vendor/grammars/sublime-befunge
|
||||||
|
url = https://github.com/johanasplund/sublime-befunge
|
||||||
|
[submodule "vendor/grammars/RDoc.tmbundle"]
|
||||||
|
path = vendor/grammars/RDoc.tmbundle
|
||||||
|
url = https://github.com/joshaven/RDoc.tmbundle
|
||||||
|
[submodule "vendor/grammars/Textmate-Gosu-Bundle"]
|
||||||
|
path = vendor/grammars/Textmate-Gosu-Bundle
|
||||||
|
url = https://github.com/jpcamara/Textmate-Gosu-Bundle
|
||||||
|
[submodule "vendor/grammars/fish-tmbundle"]
|
||||||
|
path = vendor/grammars/fish-tmbundle
|
||||||
|
url = https://github.com/l15n/fish-tmbundle
|
||||||
|
[submodule "vendor/grammars/moonscript-tmbundle"]
|
||||||
|
path = vendor/grammars/moonscript-tmbundle
|
||||||
|
url = https://github.com/leafo/moonscript-tmbundle
|
||||||
|
[submodule "vendor/grammars/Isabelle.tmbundle"]
|
||||||
|
path = vendor/grammars/Isabelle.tmbundle
|
||||||
|
url = https://github.com/lsf37/Isabelle.tmbundle
|
||||||
|
[submodule "vendor/grammars/Alloy.tmbundle"]
|
||||||
|
path = vendor/grammars/Alloy.tmbundle
|
||||||
|
url = https://github.com/macekond/Alloy.tmbundle
|
||||||
|
[submodule "vendor/grammars/opa.tmbundle"]
|
||||||
|
path = vendor/grammars/opa.tmbundle
|
||||||
|
url = https://github.com/mads379/opa.tmbundle
|
||||||
|
[submodule "vendor/grammars/scala.tmbundle"]
|
||||||
|
path = vendor/grammars/scala.tmbundle
|
||||||
|
url = https://github.com/mads379/scala.tmbundle
|
||||||
|
[submodule "vendor/grammars/mako-tmbundle"]
|
||||||
|
path = vendor/grammars/mako-tmbundle
|
||||||
|
url = https://github.com/marconi/mako-tmbundle
|
||||||
|
[submodule "vendor/grammars/gnuplot-tmbundle"]
|
||||||
|
path = vendor/grammars/gnuplot-tmbundle
|
||||||
|
url = https://github.com/mattfoster/gnuplot-tmbundle
|
||||||
|
[submodule "vendor/grammars/idl.tmbundle"]
|
||||||
|
path = vendor/grammars/idl.tmbundle
|
||||||
|
url = https://github.com/mgalloy/idl.tmbundle
|
||||||
|
[submodule "vendor/grammars/protobuf-tmbundle"]
|
||||||
|
path = vendor/grammars/protobuf-tmbundle
|
||||||
|
url = https://github.com/michaeledgar/protobuf-tmbundle
|
||||||
|
[submodule "vendor/grammars/Sublime-Coq"]
|
||||||
|
path = vendor/grammars/Sublime-Coq
|
||||||
|
url = https://github.com/mkolosick/Sublime-Coq
|
||||||
|
[submodule "vendor/grammars/Agda.tmbundle"]
|
||||||
|
path = vendor/grammars/Agda.tmbundle
|
||||||
|
url = https://github.com/mokus0/Agda.tmbundle
|
||||||
|
[submodule "vendor/grammars/Julia.tmbundle"]
|
||||||
|
path = vendor/grammars/Julia.tmbundle
|
||||||
|
url = https://github.com/JuliaEditorSupport/Julia.tmbundle
|
||||||
|
[submodule "vendor/grammars/ooc.tmbundle"]
|
||||||
|
path = vendor/grammars/ooc.tmbundle
|
||||||
|
url = https://github.com/nilium/ooc.tmbundle
|
||||||
|
[submodule "vendor/grammars/LiveScript.tmbundle"]
|
||||||
|
path = vendor/grammars/LiveScript.tmbundle
|
||||||
|
url = https://github.com/paulmillr/LiveScript.tmbundle
|
||||||
|
[submodule "vendor/grammars/sublime-tea"]
|
||||||
|
path = vendor/grammars/sublime-tea
|
||||||
|
url = https://github.com/pferruggiaro/sublime-tea
|
||||||
|
[submodule "vendor/grammars/abap.tmbundle"]
|
||||||
|
path = vendor/grammars/abap.tmbundle
|
||||||
|
url = https://github.com/pvl/abap.tmbundle
|
||||||
|
[submodule "vendor/grammars/mercury-tmlanguage"]
|
||||||
|
path = vendor/grammars/mercury-tmlanguage
|
||||||
|
url = https://github.com/sebgod/mercury-tmlanguage
|
||||||
|
[submodule "vendor/grammars/mathematica-tmbundle"]
|
||||||
|
path = vendor/grammars/mathematica-tmbundle
|
||||||
|
url = https://github.com/shadanan/mathematica-tmbundle
|
||||||
|
[submodule "vendor/grammars/sublime-robot-plugin"]
|
||||||
|
path = vendor/grammars/sublime-robot-plugin
|
||||||
|
url = https://github.com/shellderp/sublime-robot-plugin
|
||||||
|
[submodule "vendor/grammars/Sublime-QML"]
|
||||||
|
path = vendor/grammars/Sublime-QML
|
||||||
|
url = https://github.com/skozlovf/Sublime-QML
|
||||||
|
[submodule "vendor/grammars/Slash.tmbundle"]
|
||||||
|
path = vendor/grammars/Slash.tmbundle
|
||||||
|
url = https://github.com/slash-lang/Slash.tmbundle
|
||||||
|
[submodule "vendor/grammars/factor"]
|
||||||
|
path = vendor/grammars/factor
|
||||||
|
url = https://github.com/slavapestov/factor
|
||||||
|
[submodule "vendor/grammars/ruby-slim.tmbundle"]
|
||||||
|
path = vendor/grammars/ruby-slim.tmbundle
|
||||||
|
url = https://github.com/slim-template/ruby-slim.tmbundle
|
||||||
|
[submodule "vendor/grammars/SublimeXtend"]
|
||||||
|
path = vendor/grammars/SublimeXtend
|
||||||
|
url = https://github.com/staltz/SublimeXtend
|
||||||
|
[submodule "vendor/grammars/Vala-TMBundle"]
|
||||||
|
path = vendor/grammars/Vala-TMBundle
|
||||||
|
url = https://github.com/technosophos/Vala-TMBundle
|
||||||
|
[submodule "vendor/grammars/ant.tmbundle"]
|
||||||
|
path = vendor/grammars/ant.tmbundle
|
||||||
|
url = https://github.com/textmate/ant.tmbundle
|
||||||
|
[submodule "vendor/grammars/antlr.tmbundle"]
|
||||||
|
path = vendor/grammars/antlr.tmbundle
|
||||||
|
url = https://github.com/textmate/antlr.tmbundle
|
||||||
|
[submodule "vendor/grammars/apache.tmbundle"]
|
||||||
|
path = vendor/grammars/apache.tmbundle
|
||||||
|
url = https://github.com/textmate/apache.tmbundle
|
||||||
|
[submodule "vendor/grammars/applescript.tmbundle"]
|
||||||
|
path = vendor/grammars/applescript.tmbundle
|
||||||
|
url = https://github.com/textmate/applescript.tmbundle
|
||||||
|
[submodule "vendor/grammars/asp.tmbundle"]
|
||||||
|
path = vendor/grammars/asp.tmbundle
|
||||||
|
url = https://github.com/textmate/asp.tmbundle
|
||||||
|
[submodule "vendor/grammars/bison.tmbundle"]
|
||||||
|
path = vendor/grammars/bison.tmbundle
|
||||||
|
url = https://github.com/textmate/bison.tmbundle
|
||||||
|
[submodule "vendor/grammars/capnproto.tmbundle"]
|
||||||
|
path = vendor/grammars/capnproto.tmbundle
|
||||||
|
url = https://github.com/textmate/capnproto.tmbundle
|
||||||
|
[submodule "vendor/grammars/cmake.tmbundle"]
|
||||||
|
path = vendor/grammars/cmake.tmbundle
|
||||||
|
url = https://github.com/textmate/cmake.tmbundle
|
||||||
|
[submodule "vendor/grammars/cpp-qt.tmbundle"]
|
||||||
|
path = vendor/grammars/cpp-qt.tmbundle
|
||||||
|
url = https://github.com/textmate/cpp-qt.tmbundle
|
||||||
|
[submodule "vendor/grammars/d.tmbundle"]
|
||||||
|
path = vendor/grammars/d.tmbundle
|
||||||
|
url = https://github.com/textmate/d.tmbundle
|
||||||
|
[submodule "vendor/grammars/diff.tmbundle"]
|
||||||
|
path = vendor/grammars/diff.tmbundle
|
||||||
|
url = https://github.com/textmate/diff.tmbundle
|
||||||
|
[submodule "vendor/grammars/dylan.tmbundle"]
|
||||||
|
path = vendor/grammars/dylan.tmbundle
|
||||||
|
url = https://github.com/textmate/dylan.tmbundle
|
||||||
|
[submodule "vendor/grammars/eiffel.tmbundle"]
|
||||||
|
path = vendor/grammars/eiffel.tmbundle
|
||||||
|
url = https://github.com/textmate/eiffel.tmbundle
|
||||||
|
[submodule "vendor/grammars/erlang.tmbundle"]
|
||||||
|
path = vendor/grammars/erlang.tmbundle
|
||||||
|
url = https://github.com/textmate/erlang.tmbundle
|
||||||
|
[submodule "vendor/grammars/fortran.tmbundle"]
|
||||||
|
path = vendor/grammars/fortran.tmbundle
|
||||||
|
url = https://github.com/textmate/fortran.tmbundle
|
||||||
|
[submodule "vendor/grammars/gettext.tmbundle"]
|
||||||
|
path = vendor/grammars/gettext.tmbundle
|
||||||
|
url = https://github.com/textmate/gettext.tmbundle
|
||||||
|
[submodule "vendor/grammars/graphviz.tmbundle"]
|
||||||
|
path = vendor/grammars/graphviz.tmbundle
|
||||||
|
url = https://github.com/textmate/graphviz.tmbundle
|
||||||
|
[submodule "vendor/grammars/groovy.tmbundle"]
|
||||||
|
path = vendor/grammars/groovy.tmbundle
|
||||||
|
url = https://github.com/textmate/groovy.tmbundle
|
||||||
|
[submodule "vendor/grammars/html.tmbundle"]
|
||||||
|
path = vendor/grammars/html.tmbundle
|
||||||
|
url = https://github.com/textmate/html.tmbundle
|
||||||
|
[submodule "vendor/grammars/ini.tmbundle"]
|
||||||
|
path = vendor/grammars/ini.tmbundle
|
||||||
|
url = https://github.com/textmate/ini.tmbundle
|
||||||
|
[submodule "vendor/grammars/desktop.tmbundle"]
|
||||||
|
path = vendor/grammars/desktop.tmbundle
|
||||||
|
url = https://github.com/Mailaender/desktop.tmbundle.git
|
||||||
|
[submodule "vendor/grammars/io.tmbundle"]
|
||||||
|
path = vendor/grammars/io.tmbundle
|
||||||
|
url = https://github.com/textmate/io.tmbundle
|
||||||
|
[submodule "vendor/grammars/java.tmbundle"]
|
||||||
|
path = vendor/grammars/java.tmbundle
|
||||||
|
url = https://github.com/textmate/java.tmbundle
|
||||||
|
[submodule "vendor/grammars/javascript-objective-j.tmbundle"]
|
||||||
|
path = vendor/grammars/javascript-objective-j.tmbundle
|
||||||
|
url = https://github.com/textmate/javascript-objective-j.tmbundle
|
||||||
|
[submodule "vendor/grammars/json.tmbundle"]
|
||||||
|
path = vendor/grammars/json.tmbundle
|
||||||
|
url = https://github.com/textmate/json.tmbundle
|
||||||
|
[submodule "vendor/grammars/latex.tmbundle"]
|
||||||
|
path = vendor/grammars/latex.tmbundle
|
||||||
|
url = https://github.com/textmate/latex.tmbundle
|
||||||
|
[submodule "vendor/grammars/lilypond.tmbundle"]
|
||||||
|
path = vendor/grammars/lilypond.tmbundle
|
||||||
|
url = https://github.com/textmate/lilypond.tmbundle
|
||||||
|
[submodule "vendor/grammars/lisp.tmbundle"]
|
||||||
|
path = vendor/grammars/lisp.tmbundle
|
||||||
|
url = https://github.com/textmate/lisp.tmbundle
|
||||||
|
[submodule "vendor/grammars/logtalk.tmbundle"]
|
||||||
|
path = vendor/grammars/logtalk.tmbundle
|
||||||
|
url = https://github.com/textmate/logtalk.tmbundle
|
||||||
|
[submodule "vendor/grammars/lua.tmbundle"]
|
||||||
|
path = vendor/grammars/lua.tmbundle
|
||||||
|
url = https://github.com/textmate/lua.tmbundle
|
||||||
|
[submodule "vendor/grammars/make.tmbundle"]
|
||||||
|
path = vendor/grammars/make.tmbundle
|
||||||
|
url = https://github.com/textmate/make.tmbundle
|
||||||
|
[submodule "vendor/grammars/matlab.tmbundle"]
|
||||||
|
path = vendor/grammars/matlab.tmbundle
|
||||||
|
url = https://github.com/textmate/matlab.tmbundle
|
||||||
|
[submodule "vendor/grammars/maven.tmbundle"]
|
||||||
|
path = vendor/grammars/maven.tmbundle
|
||||||
|
url = https://github.com/textmate/maven.tmbundle
|
||||||
|
[submodule "vendor/grammars/nemerle.tmbundle"]
|
||||||
|
path = vendor/grammars/nemerle.tmbundle
|
||||||
|
url = https://github.com/textmate/nemerle.tmbundle
|
||||||
|
[submodule "vendor/grammars/objective-c.tmbundle"]
|
||||||
|
path = vendor/grammars/objective-c.tmbundle
|
||||||
|
url = https://github.com/textmate/objective-c.tmbundle
|
||||||
|
[submodule "vendor/grammars/ocaml.tmbundle"]
|
||||||
|
path = vendor/grammars/ocaml.tmbundle
|
||||||
|
url = https://github.com/textmate/ocaml.tmbundle
|
||||||
|
[submodule "vendor/grammars/pascal.tmbundle"]
|
||||||
|
path = vendor/grammars/pascal.tmbundle
|
||||||
|
url = https://github.com/textmate/pascal.tmbundle
|
||||||
|
[submodule "vendor/grammars/php-smarty.tmbundle"]
|
||||||
|
path = vendor/grammars/php-smarty.tmbundle
|
||||||
|
url = https://github.com/textmate/php-smarty.tmbundle
|
||||||
|
[submodule "vendor/grammars/php.tmbundle"]
|
||||||
|
path = vendor/grammars/php.tmbundle
|
||||||
|
url = https://github.com/brandonblack/php.tmbundle
|
||||||
|
[submodule "vendor/grammars/postscript.tmbundle"]
|
||||||
|
path = vendor/grammars/postscript.tmbundle
|
||||||
|
url = https://github.com/textmate/postscript.tmbundle
|
||||||
|
[submodule "vendor/grammars/processing.tmbundle"]
|
||||||
|
path = vendor/grammars/processing.tmbundle
|
||||||
|
url = https://github.com/textmate/processing.tmbundle
|
||||||
|
[submodule "vendor/grammars/python-django.tmbundle"]
|
||||||
|
path = vendor/grammars/python-django.tmbundle
|
||||||
|
url = https://github.com/textmate/python-django.tmbundle
|
||||||
|
[submodule "vendor/grammars/r.tmbundle"]
|
||||||
|
path = vendor/grammars/r.tmbundle
|
||||||
|
url = https://github.com/textmate/r.tmbundle
|
||||||
|
[submodule "vendor/grammars/scheme.tmbundle"]
|
||||||
|
path = vendor/grammars/scheme.tmbundle
|
||||||
|
url = https://github.com/textmate/scheme.tmbundle
|
||||||
|
[submodule "vendor/grammars/scilab.tmbundle"]
|
||||||
|
path = vendor/grammars/scilab.tmbundle
|
||||||
|
url = https://github.com/textmate/scilab.tmbundle
|
||||||
|
[submodule "vendor/grammars/sql.tmbundle"]
|
||||||
|
path = vendor/grammars/sql.tmbundle
|
||||||
|
url = https://github.com/textmate/sql.tmbundle
|
||||||
|
[submodule "vendor/grammars/standard-ml.tmbundle"]
|
||||||
|
path = vendor/grammars/standard-ml.tmbundle
|
||||||
|
url = https://github.com/textmate/standard-ml.tmbundle
|
||||||
|
[submodule "vendor/grammars/swift.tmbundle"]
|
||||||
|
path = vendor/grammars/swift.tmbundle
|
||||||
|
url = https://github.com/textmate/swift.tmbundle
|
||||||
|
[submodule "vendor/grammars/tcl.tmbundle"]
|
||||||
|
path = vendor/grammars/tcl.tmbundle
|
||||||
|
url = https://github.com/textmate/tcl.tmbundle
|
||||||
|
[submodule "vendor/grammars/thrift.tmbundle"]
|
||||||
|
path = vendor/grammars/thrift.tmbundle
|
||||||
|
url = https://github.com/textmate/thrift.tmbundle
|
||||||
|
[submodule "vendor/grammars/toml.tmbundle"]
|
||||||
|
path = vendor/grammars/toml.tmbundle
|
||||||
|
url = https://github.com/textmate/toml.tmbundle
|
||||||
|
[submodule "vendor/grammars/verilog.tmbundle"]
|
||||||
|
path = vendor/grammars/verilog.tmbundle
|
||||||
|
url = https://github.com/textmate/verilog.tmbundle
|
||||||
|
[submodule "vendor/grammars/xml.tmbundle"]
|
||||||
|
path = vendor/grammars/xml.tmbundle
|
||||||
|
url = https://github.com/textmate/xml.tmbundle
|
||||||
|
[submodule "vendor/grammars/smalltalk-tmbundle"]
|
||||||
|
path = vendor/grammars/smalltalk-tmbundle
|
||||||
|
url = https://github.com/tomas-stefano/smalltalk-tmbundle
|
||||||
|
[submodule "vendor/grammars/ioke-outdated"]
|
||||||
|
path = vendor/grammars/ioke-outdated
|
||||||
|
url = https://github.com/vic/ioke-outdated
|
||||||
|
[submodule "vendor/grammars/kotlin-sublime-package"]
|
||||||
|
path = vendor/grammars/kotlin-sublime-package
|
||||||
|
url = https://github.com/vkostyukov/kotlin-sublime-package
|
||||||
|
[submodule "vendor/grammars/c.tmbundle"]
|
||||||
|
path = vendor/grammars/c.tmbundle
|
||||||
|
url = https://github.com/textmate/c.tmbundle
|
||||||
|
[submodule "vendor/grammars/zephir-sublime"]
|
||||||
|
path = vendor/grammars/zephir-sublime
|
||||||
|
url = https://github.com/vmg/zephir-sublime
|
||||||
|
[submodule "vendor/grammars/llvm.tmbundle"]
|
||||||
|
path = vendor/grammars/llvm.tmbundle
|
||||||
|
url = https://github.com/whitequark/llvm.tmbundle
|
||||||
|
[submodule "vendor/grammars/oz-tmbundle"]
|
||||||
|
path = vendor/grammars/oz-tmbundle
|
||||||
|
url = https://github.com/eregon/oz-tmbundle
|
||||||
|
[submodule "vendor/grammars/language-batchfile"]
|
||||||
|
path = vendor/grammars/language-batchfile
|
||||||
|
url = https://github.com/mmims/language-batchfile
|
||||||
|
[submodule "vendor/grammars/sublime-mask"]
|
||||||
|
path = vendor/grammars/sublime-mask
|
||||||
|
url = https://github.com/tenbits/sublime-mask
|
||||||
|
[submodule "vendor/grammars/sublime_cobol"]
|
||||||
|
path = vendor/grammars/sublime_cobol
|
||||||
|
url = https://bitbucket.org/bitlang/sublime_cobol
|
||||||
|
[submodule "vendor/grammars/ruby.tmbundle"]
|
||||||
|
path = vendor/grammars/ruby.tmbundle
|
||||||
|
url = https://github.com/aroben/ruby.tmbundle
|
||||||
|
branch = pl
|
||||||
|
[submodule "vendor/grammars/IDL-Syntax"]
|
||||||
|
path = vendor/grammars/IDL-Syntax
|
||||||
|
url = https://github.com/andik/IDL-Syntax
|
||||||
|
[submodule "vendor/grammars/sas.tmbundle"]
|
||||||
|
path = vendor/grammars/sas.tmbundle
|
||||||
|
url = https://github.com/rpardee/sas.tmbundle
|
||||||
|
[submodule "vendor/grammars/atom-salt"]
|
||||||
|
path = vendor/grammars/atom-salt
|
||||||
|
url = https://github.com/saltstack/atom-salt
|
||||||
|
[submodule "vendor/grammars/Scalate.tmbundle"]
|
||||||
|
path = vendor/grammars/Scalate.tmbundle
|
||||||
|
url = https://github.com/scalate/Scalate.tmbundle
|
||||||
|
[submodule "vendor/grammars/sublime-bsv"]
|
||||||
|
path = vendor/grammars/sublime-bsv
|
||||||
|
url = https://github.com/thotypous/sublime-bsv
|
||||||
|
[submodule "vendor/grammars/Sublime-HTTP"]
|
||||||
|
path = vendor/grammars/Sublime-HTTP
|
||||||
|
url = https://github.com/httpspec/sublime-highlighting
|
||||||
|
[submodule "vendor/grammars/sass-textmate-bundle"]
|
||||||
|
path = vendor/grammars/sass-textmate-bundle
|
||||||
|
url = https://github.com/nathos/sass-textmate-bundle
|
||||||
|
[submodule "vendor/grammars/carto-atom"]
|
||||||
|
path = vendor/grammars/carto-atom
|
||||||
|
url = https://github.com/yohanboniface/carto-atom
|
||||||
|
[submodule "vendor/grammars/Sublime-Nit"]
|
||||||
|
path = vendor/grammars/Sublime-Nit
|
||||||
|
url = https://github.com/R4PaSs/Sublime-Nit
|
||||||
|
[submodule "vendor/grammars/Racket"]
|
||||||
|
path = vendor/grammars/Racket
|
||||||
|
url = https://github.com/soegaard/racket-highlight-for-github
|
||||||
|
[submodule "vendor/grammars/turtle.tmbundle"]
|
||||||
|
path = vendor/grammars/turtle.tmbundle
|
||||||
|
url = https://github.com/peta/turtle.tmbundle
|
||||||
|
[submodule "vendor/grammars/liquid.tmbundle"]
|
||||||
|
path = vendor/grammars/liquid.tmbundle
|
||||||
|
url = https://github.com/bastilian/validcode-textmate-bundles
|
||||||
|
[submodule "vendor/grammars/Modelica"]
|
||||||
|
path = vendor/grammars/Modelica
|
||||||
|
url = https://github.com/BorisChumichev/modelicaSublimeTextPackage
|
||||||
|
[submodule "vendor/grammars/sublime-golo"]
|
||||||
|
path = vendor/grammars/sublime-golo
|
||||||
|
url = https://github.com/TypeUnsafe/sublime-golo
|
||||||
|
[submodule "vendor/grammars/JSyntax"]
|
||||||
|
path = vendor/grammars/JSyntax
|
||||||
|
url = https://github.com/bcj/JSyntax
|
||||||
|
[submodule "vendor/grammars/TXL"]
|
||||||
|
path = vendor/grammars/TXL
|
||||||
|
url = https://github.com/MikeHoffert/Sublime-Text-TXL-syntax
|
||||||
|
[submodule "vendor/grammars/G-Code"]
|
||||||
|
path = vendor/grammars/G-Code
|
||||||
|
url = https://github.com/robotmaster/sublime-text-syntax-highlighting
|
||||||
|
[submodule "vendor/grammars/sublime-text-ox"]
|
||||||
|
path = vendor/grammars/sublime-text-ox
|
||||||
|
url = https://github.com/andreashetland/sublime-text-ox
|
||||||
|
[submodule "vendor/grammars/AutoHotkey"]
|
||||||
|
path = vendor/grammars/AutoHotkey
|
||||||
|
url = https://github.com/ahkscript/SublimeAutoHotkey
|
||||||
|
[submodule "vendor/grammars/ec.tmbundle"]
|
||||||
|
path = vendor/grammars/ec.tmbundle
|
||||||
|
url = https://github.com/ecere/ec.tmbundle
|
||||||
|
[submodule "vendor/grammars/gap-tmbundle"]
|
||||||
|
path = vendor/grammars/gap-tmbundle
|
||||||
|
url = https://github.com/dhowden/gap-tmbundle
|
||||||
|
[submodule "vendor/grammars/SublimePapyrus"]
|
||||||
|
path = vendor/grammars/SublimePapyrus
|
||||||
|
url = https://github.com/Kapiainen/SublimePapyrus
|
||||||
|
[submodule "vendor/grammars/sublime-spintools"]
|
||||||
|
path = vendor/grammars/sublime-spintools
|
||||||
|
url = https://github.com/bitbased/sublime-spintools
|
||||||
|
[submodule "vendor/grammars/PogoScript.tmbundle"]
|
||||||
|
path = vendor/grammars/PogoScript.tmbundle
|
||||||
|
url = https://github.com/featurist/PogoScript.tmbundle
|
||||||
|
[submodule "vendor/grammars/sublime-opal"]
|
||||||
|
path = vendor/grammars/sublime-opal
|
||||||
|
url = https://github.com/artifactz/sublime-opal
|
||||||
|
[submodule "vendor/grammars/mediawiki.tmbundle"]
|
||||||
|
path = vendor/grammars/mediawiki.tmbundle
|
||||||
|
url = https://github.com/textmate/mediawiki.tmbundle
|
||||||
|
[submodule "vendor/grammars/SublimeClarion"]
|
||||||
|
path = vendor/grammars/SublimeClarion
|
||||||
|
url = https://github.com/fushnisoft/SublimeClarion
|
||||||
|
[submodule "vendor/grammars/BrightScript.tmbundle"]
|
||||||
|
path = vendor/grammars/BrightScript.tmbundle
|
||||||
|
url = https://github.com/cmink/BrightScript.tmbundle
|
||||||
|
[submodule "vendor/grammars/Stylus"]
|
||||||
|
path = vendor/grammars/Stylus
|
||||||
|
url = https://github.com/billymoon/Stylus
|
||||||
|
[submodule "vendor/grammars/asciidoc.tmbundle"]
|
||||||
|
path = vendor/grammars/asciidoc.tmbundle
|
||||||
|
url = https://github.com/zuckschwerdt/asciidoc.tmbundle
|
||||||
|
[submodule "vendor/grammars/Lean.tmbundle"]
|
||||||
|
path = vendor/grammars/Lean.tmbundle
|
||||||
|
url = https://github.com/leanprover/Lean.tmbundle
|
||||||
|
[submodule "vendor/grammars/ampl"]
|
||||||
|
path = vendor/grammars/ampl
|
||||||
|
url = https://github.com/ampl/sublime-ampl
|
||||||
|
[submodule "vendor/grammars/sublime-varnish"]
|
||||||
|
path = vendor/grammars/sublime-varnish
|
||||||
|
url = https://github.com/brandonwamboldt/sublime-varnish
|
||||||
|
[submodule "vendor/grammars/xc.tmbundle"]
|
||||||
|
path = vendor/grammars/xc.tmbundle
|
||||||
|
url = https://github.com/graymalkin/xc.tmbundle
|
||||||
|
[submodule "vendor/grammars/perl.tmbundle"]
|
||||||
|
path = vendor/grammars/perl.tmbundle
|
||||||
|
url = https://github.com/textmate/perl.tmbundle
|
||||||
|
[submodule "vendor/grammars/sublime-netlinx"]
|
||||||
|
path = vendor/grammars/sublime-netlinx
|
||||||
|
url = https://github.com/amclain/sublime-netlinx
|
||||||
|
[submodule "vendor/grammars/Sublime-Red"]
|
||||||
|
path = vendor/grammars/Sublime-Red
|
||||||
|
url = https://github.com/Oldes/Sublime-Red
|
||||||
|
[submodule "vendor/grammars/jflex.tmbundle"]
|
||||||
|
path = vendor/grammars/jflex.tmbundle
|
||||||
|
url = https://github.com/jflex-de/jflex.tmbundle.git
|
||||||
|
[submodule "vendor/grammars/Sublime-Modula-2"]
|
||||||
|
path = vendor/grammars/Sublime-Modula-2
|
||||||
|
url = https://github.com/harogaston/Sublime-Modula-2
|
||||||
|
[submodule "vendor/grammars/ada.tmbundle"]
|
||||||
|
path = vendor/grammars/ada.tmbundle
|
||||||
|
url = https://github.com/textmate/ada.tmbundle
|
||||||
|
[submodule "vendor/grammars/api-blueprint-sublime-plugin"]
|
||||||
|
path = vendor/grammars/api-blueprint-sublime-plugin
|
||||||
|
url = https://github.com/apiaryio/api-blueprint-sublime-plugin
|
||||||
|
[submodule "vendor/grammars/Handlebars"]
|
||||||
|
path = vendor/grammars/Handlebars
|
||||||
|
url = https://github.com/daaain/Handlebars
|
||||||
|
[submodule "vendor/grammars/smali-sublime"]
|
||||||
|
path = vendor/grammars/smali-sublime
|
||||||
|
url = https://github.com/ShaneWilton/sublime-smali
|
||||||
|
[submodule "vendor/grammars/language-jsoniq"]
|
||||||
|
path = vendor/grammars/language-jsoniq
|
||||||
|
url = https://github.com/wcandillon/language-jsoniq
|
||||||
|
[submodule "vendor/grammars/atom-fsharp"]
|
||||||
|
path = vendor/grammars/atom-fsharp
|
||||||
|
url = https://github.com/fsprojects/atom-fsharp
|
||||||
|
[submodule "vendor/grammars/SMT.tmbundle"]
|
||||||
|
path = vendor/grammars/SMT.tmbundle
|
||||||
|
url = https://github.com/SRI-CSL/SMT.tmbundle.git
|
||||||
|
[submodule "vendor/grammars/language-crystal"]
|
||||||
|
path = vendor/grammars/language-crystal
|
||||||
|
url = https://github.com/atom-crystal/language-crystal
|
||||||
|
[submodule "vendor/grammars/language-xbase"]
|
||||||
|
path = vendor/grammars/language-xbase
|
||||||
|
url = https://github.com/hernad/atom-language-harbour
|
||||||
|
[submodule "vendor/grammars/language-ncl"]
|
||||||
|
path = vendor/grammars/language-ncl
|
||||||
|
url = https://github.com/rpavlick/language-ncl.git
|
||||||
|
[submodule "vendor/grammars/pawn-sublime-language"]
|
||||||
|
path = vendor/grammars/pawn-sublime-language
|
||||||
|
url = https://github.com/Southclaw/pawn-sublime-language.git
|
||||||
|
[submodule "vendor/grammars/atom-language-purescript"]
|
||||||
|
path = vendor/grammars/atom-language-purescript
|
||||||
|
url = https://github.com/purescript-contrib/atom-language-purescript
|
||||||
|
[submodule "vendor/grammars/vue-syntax-highlight"]
|
||||||
|
path = vendor/grammars/vue-syntax-highlight
|
||||||
|
url = https://github.com/vuejs/vue-syntax-highlight
|
||||||
|
[submodule "vendor/grammars/st2-zonefile"]
|
||||||
|
path = vendor/grammars/st2-zonefile
|
||||||
|
url = https://github.com/sixty4k/st2-zonefile
|
||||||
|
[submodule "vendor/grammars/sublimeprolog"]
|
||||||
|
path = vendor/grammars/sublimeprolog
|
||||||
|
url = https://github.com/alnkpa/sublimeprolog
|
||||||
|
[submodule "vendor/grammars/sublime-aspectj"]
|
||||||
|
path = vendor/grammars/sublime-aspectj
|
||||||
|
url = https://github.com/pchaigno/sublime-aspectj
|
||||||
|
[submodule "vendor/grammars/sublime-typescript"]
|
||||||
|
path = vendor/grammars/sublime-typescript
|
||||||
|
url = https://github.com/Microsoft/TypeScript-Sublime-Plugin
|
||||||
|
[submodule "vendor/grammars/sublime-pony"]
|
||||||
|
path = vendor/grammars/sublime-pony
|
||||||
|
url = https://github.com/CausalityLtd/sublime-pony
|
||||||
|
[submodule "vendor/grammars/X10"]
|
||||||
|
path = vendor/grammars/X10
|
||||||
|
url = https://github.com/x10-lang/x10-highlighting
|
||||||
|
[submodule "vendor/grammars/UrWeb-Language-Definition"]
|
||||||
|
path = vendor/grammars/UrWeb-Language-Definition
|
||||||
|
url = https://github.com/gwalborn/UrWeb-Language-Definition.git
|
||||||
|
[submodule "vendor/grammars/Stata.tmbundle"]
|
||||||
|
path = vendor/grammars/Stata.tmbundle
|
||||||
|
url = https://github.com/pschumm/Stata.tmbundle
|
||||||
|
[submodule "vendor/grammars/FreeMarker.tmbundle"]
|
||||||
|
path = vendor/grammars/FreeMarker.tmbundle
|
||||||
|
url = https://github.com/freemarker/FreeMarker.tmbundle
|
||||||
|
[submodule "vendor/grammars/MagicPython"]
|
||||||
|
path = vendor/grammars/MagicPython
|
||||||
|
url = https://github.com/MagicStack/MagicPython
|
||||||
|
[submodule "vendor/grammars/language-click"]
|
||||||
|
path = vendor/grammars/language-click
|
||||||
|
url = https://github.com/stenverbois/language-click.git
|
||||||
|
[submodule "vendor/grammars/language-maxscript"]
|
||||||
|
path = vendor/grammars/language-maxscript
|
||||||
|
url = https://github.com/Alhadis/language-maxscript
|
||||||
|
[submodule "vendor/grammars/language-renpy"]
|
||||||
|
path = vendor/grammars/language-renpy
|
||||||
|
url = https://github.com/williamd1k0/language-renpy.git
|
||||||
|
[submodule "vendor/grammars/language-inform7"]
|
||||||
|
path = vendor/grammars/language-inform7
|
||||||
|
url = https://github.com/erkyrath/language-inform7
|
||||||
|
[submodule "vendor/grammars/atom-language-stan"]
|
||||||
|
path = vendor/grammars/atom-language-stan
|
||||||
|
url = https://github.com/jrnold/atom-language-stan
|
||||||
|
[submodule "vendor/grammars/language-yang"]
|
||||||
|
path = vendor/grammars/language-yang
|
||||||
|
url = https://github.com/DzonyKalafut/language-yang.git
|
||||||
|
[submodule "vendor/grammars/language-less"]
|
||||||
|
path = vendor/grammars/language-less
|
||||||
|
url = https://github.com/atom/language-less.git
|
||||||
|
[submodule "vendor/grammars/language-povray"]
|
||||||
|
path = vendor/grammars/language-povray
|
||||||
|
url = https://github.com/c-lipka/language-povray
|
||||||
|
[submodule "vendor/grammars/sublime-terra"]
|
||||||
|
path = vendor/grammars/sublime-terra
|
||||||
|
url = https://github.com/pyk/sublime-terra
|
||||||
|
[submodule "vendor/grammars/SublimePuppet"]
|
||||||
|
path = vendor/grammars/SublimePuppet
|
||||||
|
url = https://github.com/russCloak/SublimePuppet
|
||||||
|
[submodule "vendor/grammars/sublimeassembly"]
|
||||||
|
path = vendor/grammars/sublimeassembly
|
||||||
|
url = https://github.com/Nessphoro/sublimeassembly
|
||||||
|
[submodule "vendor/grammars/monkey"]
|
||||||
|
path = vendor/grammars/monkey
|
||||||
|
url = https://github.com/gingerbeardman/monkey.tmbundle
|
||||||
|
[submodule "vendor/grammars/assembly"]
|
||||||
|
path = vendor/grammars/assembly
|
||||||
|
url = https://github.com/nanoant/assembly.tmbundle
|
||||||
|
[submodule "vendor/grammars/boo"]
|
||||||
|
path = vendor/grammars/boo
|
||||||
|
url = https://github.com/Shammah/boo-sublime
|
||||||
|
[submodule "vendor/grammars/logos"]
|
||||||
|
path = vendor/grammars/logos
|
||||||
|
url = https://github.com/Cykey/Sublime-Logos
|
||||||
|
[submodule "vendor/grammars/pig-latin"]
|
||||||
|
path = vendor/grammars/pig-latin
|
||||||
|
url = https://github.com/goblindegook/sublime-text-pig-latin
|
||||||
|
[submodule "vendor/grammars/sourcepawn"]
|
||||||
|
path = vendor/grammars/sourcepawn
|
||||||
|
url = https://github.com/github-linguist/sublime-sourcepawn
|
||||||
|
[submodule "vendor/grammars/gdscript"]
|
||||||
|
path = vendor/grammars/gdscript
|
||||||
|
url = https://github.com/beefsack/GDScript-sublime
|
||||||
|
[submodule "vendor/grammars/nesC"]
|
||||||
|
path = vendor/grammars/nesC
|
||||||
|
url = https://github.com/cdwilson/nesC.tmbundle
|
||||||
|
[submodule "vendor/grammars/ats"]
|
||||||
|
path = vendor/grammars/ats
|
||||||
|
url = https://github.com/steinwaywhw/ats-mode-sublimetext
|
||||||
|
[submodule "vendor/grammars/grace"]
|
||||||
|
path = vendor/grammars/grace
|
||||||
|
url = https://github.com/zmthy/grace-tmbundle
|
||||||
|
[submodule "vendor/grammars/ejs-tmbundle"]
|
||||||
|
path = vendor/grammars/ejs-tmbundle
|
||||||
|
url = https://github.com/gregory-m/ejs-tmbundle
|
||||||
|
[submodule "vendor/grammars/nix"]
|
||||||
|
path = vendor/grammars/nix
|
||||||
|
url = https://github.com/wmertens/sublime-nix
|
||||||
|
[submodule "vendor/grammars/idris"]
|
||||||
|
path = vendor/grammars/idris
|
||||||
|
url = https://github.com/idris-hackers/idris-sublime.git
|
||||||
|
[submodule "vendor/grammars/atomic-dreams"]
|
||||||
|
path = vendor/grammars/atomic-dreams
|
||||||
|
url = https://github.com/PJB3005/atomic-dreams
|
||||||
|
[submodule "vendor/grammars/language-apl"]
|
||||||
|
path = vendor/grammars/language-apl
|
||||||
|
url = https://github.com/Alhadis/language-apl.git
|
||||||
|
[submodule "vendor/grammars/language-graphql"]
|
||||||
|
path = vendor/grammars/language-graphql
|
||||||
|
url = https://github.com/rmosolgo/language-graphql
|
||||||
|
[submodule "vendor/grammars/language-toc-wow"]
|
||||||
|
path = vendor/grammars/language-toc-wow
|
||||||
|
url = https://github.com/nebularg/language-toc-wow
|
||||||
|
[submodule "vendor/grammars/sublime-autoit"]
|
||||||
|
path = vendor/grammars/sublime-autoit
|
||||||
|
url = https://github.com/AutoIt/SublimeAutoItScript
|
||||||
|
[submodule "vendor/grammars/TLA"]
|
||||||
|
path = vendor/grammars/TLA
|
||||||
|
url = https://github.com/agentultra/TLAGrammar
|
||||||
|
[submodule "vendor/grammars/sublime-clips"]
|
||||||
|
path = vendor/grammars/sublime-clips
|
||||||
|
url = https://github.com/psicomante/CLIPS-sublime
|
||||||
|
[submodule "vendor/grammars/creole"]
|
||||||
|
path = vendor/grammars/creole
|
||||||
|
url = https://github.com/Siddley/Creole
|
||||||
|
[submodule "vendor/grammars/language-csound"]
|
||||||
|
path = vendor/grammars/language-csound
|
||||||
|
url = https://github.com/nwhetsell/language-csound
|
||||||
|
[submodule "vendor/grammars/language-wavefront"]
|
||||||
|
path = vendor/grammars/language-wavefront
|
||||||
|
url = https://github.com/Alhadis/language-wavefront
|
||||||
|
[submodule "vendor/grammars/nu.tmbundle"]
|
||||||
|
path = vendor/grammars/nu.tmbundle
|
||||||
|
url = https://github.com/jsallis/nu.tmbundle
|
||||||
|
[submodule "vendor/grammars/Elm"]
|
||||||
|
path = vendor/grammars/Elm
|
||||||
|
url = https://github.com/elm-community/Elm.tmLanguage
|
||||||
|
[submodule "vendor/grammars/language-restructuredtext"]
|
||||||
|
path = vendor/grammars/language-restructuredtext
|
||||||
|
url = https://github.com/Lukasa/language-restructuredtext
|
||||||
|
[submodule "vendor/grammars/atom-language-clean"]
|
||||||
|
path = vendor/grammars/atom-language-clean
|
||||||
|
url = https://github.com/timjs/atom-language-clean.git
|
||||||
|
[submodule "vendor/grammars/language-turing"]
|
||||||
|
path = vendor/grammars/language-turing
|
||||||
|
url = https://github.com/Alhadis/language-turing
|
||||||
|
[submodule "vendor/grammars/atom-language-srt"]
|
||||||
|
path = vendor/grammars/atom-language-srt
|
||||||
|
url = https://github.com/314eter/atom-language-srt
|
||||||
|
[submodule "vendor/grammars/language-agc"]
|
||||||
|
path = vendor/grammars/language-agc
|
||||||
|
url = https://github.com/Alhadis/language-agc
|
||||||
|
[submodule "vendor/grammars/language-blade"]
|
||||||
|
path = vendor/grammars/language-blade
|
||||||
|
url = https://github.com/jawee/language-blade
|
||||||
|
[submodule "vendor/grammars/SublimeGDB"]
|
||||||
|
path = vendor/grammars/SublimeGDB
|
||||||
|
url = https://github.com/quarnster/SublimeGDB
|
||||||
|
[submodule "vendor/grammars/language-roff"]
|
||||||
|
path = vendor/grammars/language-roff
|
||||||
|
url = https://github.com/Alhadis/language-roff
|
||||||
|
[submodule "vendor/grammars/language-haskell"]
|
||||||
|
path = vendor/grammars/language-haskell
|
||||||
|
url = https://github.com/atom-haskell/language-haskell
|
||||||
|
[submodule "vendor/grammars/language-asn1"]
|
||||||
|
path = vendor/grammars/language-asn1
|
||||||
|
url = https://github.com/ajLangley12/language-asn1
|
||||||
|
[submodule "vendor/grammars/atom-language-1c-bsl"]
|
||||||
|
path = vendor/grammars/atom-language-1c-bsl
|
||||||
|
url = https://github.com/xDrivenDevelopment/atom-language-1c-bsl.git
|
||||||
|
[submodule "vendor/grammars/sublime-rexx"]
|
||||||
|
path = vendor/grammars/sublime-rexx
|
||||||
|
url = https://github.com/mblocker/rexx-sublime
|
||||||
|
[submodule "vendor/grammars/blitzmax"]
|
||||||
|
path = vendor/grammars/blitzmax
|
||||||
|
url = https://github.com/textmate/blitzmax.tmbundle
|
||||||
|
[submodule "vendor/grammars/cython"]
|
||||||
|
path = vendor/grammars/cython
|
||||||
|
url = https://github.com/textmate/cython.tmbundle
|
||||||
|
[submodule "vendor/grammars/forth"]
|
||||||
|
path = vendor/grammars/forth
|
||||||
|
url = https://github.com/textmate/forth.tmbundle
|
||||||
|
[submodule "vendor/grammars/parrot"]
|
||||||
|
path = vendor/grammars/parrot
|
||||||
|
url = https://github.com/textmate/parrot.tmbundle
|
||||||
|
[submodule "vendor/grammars/secondlife-lsl"]
|
||||||
|
path = vendor/grammars/secondlife-lsl
|
||||||
|
url = https://github.com/textmate/secondlife-lsl.tmbundle
|
||||||
|
[submodule "vendor/grammars/vhdl"]
|
||||||
|
path = vendor/grammars/vhdl
|
||||||
|
url = https://github.com/textmate/vhdl.tmbundle
|
||||||
|
[submodule "vendor/grammars/language-rpm-spec"]
|
||||||
|
path = vendor/grammars/language-rpm-spec
|
||||||
|
url = https://github.com/waveclaw/language-rpm-spec
|
||||||
|
[submodule "vendor/grammars/language-emacs-lisp"]
|
||||||
|
path = vendor/grammars/language-emacs-lisp
|
||||||
|
url = https://github.com/Alhadis/language-emacs-lisp
|
||||||
|
[submodule "vendor/grammars/language-babel"]
|
||||||
|
path = vendor/grammars/language-babel
|
||||||
|
url = https://github.com/github-linguist/language-babel
|
||||||
|
[submodule "vendor/CodeMirror"]
|
||||||
|
path = vendor/CodeMirror
|
||||||
|
url = https://github.com/codemirror/CodeMirror
|
||||||
|
[submodule "vendor/grammars/MQL5-sublime"]
|
||||||
|
path = vendor/grammars/MQL5-sublime
|
||||||
|
url = https://github.com/mqsoft/MQL5-sublime
|
||||||
|
[submodule "vendor/grammars/actionscript3-tmbundle"]
|
||||||
|
path = vendor/grammars/actionscript3-tmbundle
|
||||||
|
url = https://github.com/simongregory/actionscript3-tmbundle
|
||||||
|
[submodule "vendor/grammars/ABNF.tmbundle"]
|
||||||
|
path = vendor/grammars/ABNF.tmbundle
|
||||||
|
url = https://github.com/sanssecours/ABNF.tmbundle
|
||||||
|
[submodule "vendor/grammars/EBNF.tmbundle"]
|
||||||
|
path = vendor/grammars/EBNF.tmbundle
|
||||||
|
url = https://github.com/sanssecours/EBNF.tmbundle
|
||||||
|
[submodule "vendor/grammars/language-haml"]
|
||||||
|
path = vendor/grammars/language-haml
|
||||||
|
url = https://github.com/ezekg/language-haml
|
||||||
|
[submodule "vendor/grammars/language-ninja"]
|
||||||
|
path = vendor/grammars/language-ninja
|
||||||
|
url = https://github.com/khyo/language-ninja
|
||||||
|
[submodule "vendor/grammars/language-fontforge"]
|
||||||
|
path = vendor/grammars/language-fontforge
|
||||||
|
url = https://github.com/Alhadis/language-fontforge
|
||||||
|
[submodule "vendor/grammars/language-gn"]
|
||||||
|
path = vendor/grammars/language-gn
|
||||||
|
url = https://github.com/devoncarew/language-gn
|
||||||
|
[submodule "vendor/grammars/rascal-syntax-highlighting"]
|
||||||
|
path = vendor/grammars/rascal-syntax-highlighting
|
||||||
|
url = https://github.com/usethesource/rascal-syntax-highlighting
|
||||||
|
[submodule "vendor/grammars/atom-language-perl6"]
|
||||||
|
path = vendor/grammars/atom-language-perl6
|
||||||
|
url = https://github.com/perl6/atom-language-perl6
|
||||||
|
[submodule "vendor/grammars/reason"]
|
||||||
|
path = vendor/grammars/reason
|
||||||
|
url = https://github.com/facebook/reason
|
||||||
|
[submodule "vendor/grammars/language-xcompose"]
|
||||||
|
path = vendor/grammars/language-xcompose
|
||||||
|
url = https://github.com/samcv/language-xcompose
|
||||||
|
[submodule "vendor/grammars/SublimeEthereum"]
|
||||||
|
path = vendor/grammars/SublimeEthereum
|
||||||
|
url = https://github.com/davidhq/SublimeEthereum.git
|
||||||
|
[submodule "vendor/grammars/atom-language-rust"]
|
||||||
|
path = vendor/grammars/atom-language-rust
|
||||||
|
url = https://github.com/zargony/atom-language-rust
|
||||||
|
[submodule "vendor/grammars/language-css"]
|
||||||
|
path = vendor/grammars/language-css
|
||||||
|
url = https://github.com/atom/language-css
|
||||||
|
[submodule "vendor/grammars/language-regexp"]
|
||||||
|
path = vendor/grammars/language-regexp
|
||||||
|
url = https://github.com/Alhadis/language-regexp
|
||||||
|
[submodule "vendor/grammars/Terraform.tmLanguage"]
|
||||||
|
path = vendor/grammars/Terraform.tmLanguage
|
||||||
|
url = https://github.com/alexlouden/Terraform.tmLanguage
|
||||||
|
[submodule "vendor/grammars/shaders-tmLanguage"]
|
||||||
|
path = vendor/grammars/shaders-tmLanguage
|
||||||
|
url = https://github.com/tgjones/shaders-tmLanguage
|
||||||
|
[submodule "vendor/grammars/language-meson"]
|
||||||
|
path = vendor/grammars/language-meson
|
||||||
|
url = https://github.com/TingPing/language-meson
|
||||||
|
[submodule "vendor/grammars/atom-language-p4"]
|
||||||
|
path = vendor/grammars/atom-language-p4
|
||||||
|
url = https://github.com/TakeshiTseng/atom-language-p4
|
||||||
|
[submodule "vendor/grammars/language-jison"]
|
||||||
|
path = vendor/grammars/language-jison
|
||||||
|
url = https://github.com/cdibbs/language-jison
|
||||||
|
[submodule "vendor/grammars/openscad.tmbundle"]
|
||||||
|
path = vendor/grammars/openscad.tmbundle
|
||||||
|
url = https://github.com/tbuser/openscad.tmbundle
|
||||||
|
[submodule "vendor/grammars/marko-tmbundle"]
|
||||||
|
path = vendor/grammars/marko-tmbundle
|
||||||
|
url = https://github.com/marko-js/marko-tmbundle
|
||||||
36
.travis.yml
36
.travis.yml
@@ -1,13 +1,33 @@
|
|||||||
before_install:
|
language: ruby
|
||||||
- git fetch origin master:master
|
sudo: false
|
||||||
- git fetch origin v2.0.0:v2.0.0
|
|
||||||
- git fetch origin test/attributes:test/attributes
|
addons:
|
||||||
- git fetch origin test/master:test/master
|
apt:
|
||||||
- sudo apt-get install libicu-dev -y
|
packages:
|
||||||
|
- libicu-dev
|
||||||
|
- libicu48
|
||||||
|
|
||||||
|
before_install: script/travis/before_install
|
||||||
|
|
||||||
|
script:
|
||||||
|
- bundle exec rake
|
||||||
|
- script/licensed verify
|
||||||
|
|
||||||
rvm:
|
rvm:
|
||||||
- 1.9.3
|
|
||||||
- 2.0.0
|
|
||||||
- 2.1
|
- 2.1
|
||||||
- 2.2
|
- 2.2
|
||||||
|
- 2.3.3
|
||||||
|
- 2.4.0
|
||||||
|
|
||||||
|
matrix:
|
||||||
|
allow_failures:
|
||||||
|
- rvm: 2.4.0
|
||||||
|
|
||||||
notifications:
|
notifications:
|
||||||
disabled: true
|
disabled: true
|
||||||
|
|
||||||
|
git:
|
||||||
|
submodules: false
|
||||||
|
depth: 3
|
||||||
|
|
||||||
|
cache: bundler
|
||||||
|
|||||||
118
CONTRIBUTING.md
118
CONTRIBUTING.md
@@ -1,31 +1,119 @@
|
|||||||
## Contributing
|
# Contributing
|
||||||
|
|
||||||
The majority of contributions won't need to touch any Ruby code at all. The [master language list][languages] is just a YAML configuration file.
|
Hi there! We're thrilled that you'd like to contribute to this project. Your help is essential for keeping it great. This project adheres to the [Contributor Covenant Code of Conduct](http://contributor-covenant.org/). By participating, you are expected to uphold this code.
|
||||||
|
|
||||||
Almost all bug fixes or new language additions should come with some additional code samples. Just drop them under [`samples/`][samples] in the correct subdirectory and our test suite will automatically test them. In most cases you shouldn't need to add any new assertions.
|
The majority of contributions won't need to touch any Ruby code at all.
|
||||||
|
|
||||||
### My code is detected as the wrong language
|
## Adding an extension to a language
|
||||||
|
|
||||||
This can usually be solved either by adding a new filename or file name extension to the language's entry in [`languages.yml`][languages] or adding more [samples][samples] for your language to the repository to make Linguist's classifier smarter.
|
We try only to add new extensions once they have some usage on GitHub. In most cases we prefer that extensions be in use in hundreds of repositories before supporting them in Linguist.
|
||||||
|
|
||||||
### Syntax highlighting looks wrong
|
To add support for a new extension:
|
||||||
|
|
||||||
Assuming your code is being detected as the right language (see above), in most cases this is due to a bug in the language grammar rather than a bug in Linguist. [`grammars.yml`][grammars] lists all the grammars we use for syntax highlighting on github.com. Find the one corresponding to your code's programming language and submit a bug report upstream.
|
0. Add your extension to the language entry in [`languages.yml`][languages], keeping the extensions in alphabetical order.
|
||||||
|
0. Add at least one sample for your extension to the [samples directory][samples] in the correct subdirectory.
|
||||||
|
0. Open a pull request, linking to a [GitHub search result](https://github.com/search?utf8=%E2%9C%93&q=extension%3Aboot+NOT+nothack&type=Code&ref=searchresults) showing in-the-wild usage.
|
||||||
|
|
||||||
You can also try to fix the bug yourself and submit a Pull Request. [This piece from TextMate's documentation](http://manual.macromates.com/en/language_grammars) offers a good introduction on how to work with TextMate-compatible grammars. You can test grammars using [Lightshow](https://lightshow.githubapp.com).
|
In addition, if this extension is already listed in [`languages.yml`][languages] then sometimes a few more steps will need to be taken:
|
||||||
|
|
||||||
Once the bug has been fixed upstream, please let us know and we'll pick it up for GitHub.
|
0. Make sure that example `.yourextension` files are present in the [samples directory][samples] for each language that uses `.yourextension`.
|
||||||
|
0. Test the performance of the Bayesian classifier with a relatively large number (1000s) of sample `.yourextension` files. (ping **@bkeepers** to help with this) to ensure we're not misclassifying files.
|
||||||
|
0. If the Bayesian classifier does a bad job with the sample `.yourextension` files then a [heuristic](https://github.com/github/linguist/blob/master/lib/linguist/heuristics.rb) may need to be written to help.
|
||||||
|
|
||||||
### I want to add support for the `X` programming language
|
|
||||||
|
|
||||||
Great! You'll need to:
|
## Adding a language
|
||||||
|
|
||||||
0. Add an entry for your language to [`languages.yml`][languages].
|
We try only to add languages once they have some usage on GitHub. In most cases we prefer that each new file extension be in use in hundreds of repositories before supporting them in Linguist.
|
||||||
0. Add a grammar for your language to [`grammars.yml`][grammars] by running `script/download-grammars --add URL`. Please only add grammars that have a license that permits redistribution.
|
|
||||||
0. Add samples for your language to the [samples directory][samples].
|
|
||||||
|
|
||||||
We try only to add languages once they have some usage on GitHub, so please note in-the-wild usage examples in your pull request. In most cases we prefer that languages already be in use in hundreds of repositories before supporting them in Linguist.
|
To add support for a new language:
|
||||||
|
|
||||||
|
0. Add an entry for your language to [`languages.yml`][languages]. Omit the `language_id` field for now.
|
||||||
|
0. Add a grammar for your language: `script/add-grammar https://github.com/JaneSmith/MyGrammar`. Please only add grammars that have [one of these licenses][licenses].
|
||||||
|
0. Add samples for your language to the [samples directory][samples] in the correct subdirectory.
|
||||||
|
0. Add a `language_id` for your language using `script/set-language-ids`. **You should only ever need to run `script/set-language-ids --update`. Anything other than this risks breaking GitHub search :cry:**
|
||||||
|
0. Open a pull request, linking to a [GitHub search result](https://github.com/search?utf8=%E2%9C%93&q=extension%3Aboot+NOT+nothack&type=Code&ref=searchresults) showing in-the-wild usage.
|
||||||
|
|
||||||
|
In addition, if your new language defines an extension that's already listed in [`languages.yml`][languages] (such as `.foo`) then sometimes a few more steps will need to be taken:
|
||||||
|
|
||||||
|
0. Make sure that example `.foo` files are present in the [samples directory][samples] for each language that uses `.foo`.
|
||||||
|
0. Test the performance of the Bayesian classifier with a relatively large number (1000s) of sample `.foo` files. (ping **@bkeepers** to help with this) to ensure we're not misclassifying files.
|
||||||
|
0. If the Bayesian classifier does a bad job with the sample `.foo` files then a [heuristic](https://github.com/github/linguist/blob/master/lib/linguist/heuristics.rb) may need to be written to help.
|
||||||
|
|
||||||
|
Remember, the goal here is to try and avoid false positives!
|
||||||
|
|
||||||
|
|
||||||
|
## Fixing a misclassified language
|
||||||
|
|
||||||
|
Most languages are detected by their file extension defined in [languages.yml][languages]. For disambiguating between files with common extensions, linguist applies some [heuristics](/lib/linguist/heuristics.rb) and a [statistical classifier](lib/linguist/classifier.rb). This process can help differentiate between, for example, `.h` files which could be either C, C++, or Obj-C.
|
||||||
|
|
||||||
|
Misclassifications can often be solved by either adding a new filename or extension for the language or adding more [samples][samples] to make the classifier smarter.
|
||||||
|
|
||||||
|
|
||||||
|
## Fixing syntax highlighting
|
||||||
|
|
||||||
|
Syntax highlighting in GitHub is performed using TextMate-compatible grammars. These are the same grammars that TextMate, Sublime Text and Atom use. Every language in [languages.yml][languages] is mapped to its corresponding TM `scope`. This scope will be used when picking up a grammar for highlighting.
|
||||||
|
|
||||||
|
Assuming your code is being detected as the right language, in most cases this is due to a bug in the language grammar rather than a bug in Linguist. [`grammars.yml`][grammars] lists all the grammars we use for syntax highlighting on github.com. Find the one corresponding to your code's programming language and submit a bug report upstream. If you can, try to reproduce the highlighting problem in the text editor that the grammar is designed for (TextMate, Sublime Text, or Atom) and include that information in your bug report.
|
||||||
|
|
||||||
|
You can also try to fix the bug yourself and submit a Pull Request. [TextMate's documentation](https://manual.macromates.com/en/language_grammars) offers a good introduction on how to work with TextMate-compatible grammars. You can test grammars using [Lightshow](https://github-lightshow.herokuapp.com).
|
||||||
|
|
||||||
|
Once the bug has been fixed upstream, we'll pick it up for GitHub in the next release of Linguist.
|
||||||
|
|
||||||
|
## Testing
|
||||||
|
|
||||||
|
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/
|
||||||
|
script/bootstrap
|
||||||
|
|
||||||
|
To run the tests:
|
||||||
|
|
||||||
|
bundle exec rake test
|
||||||
|
|
||||||
|
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](https://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: [](https://travis-ci.org/github/linguist)
|
||||||
|
|
||||||
|
## Maintainers
|
||||||
|
|
||||||
|
Linguist is maintained with :heart: by:
|
||||||
|
|
||||||
|
- **@Alhadis**
|
||||||
|
- **@brandonblack** (GitHub staff)
|
||||||
|
- **@larsbrinkhoff**
|
||||||
|
- **@lildude** (GitHub staff)
|
||||||
|
- **@lizzhale** (GitHub staff)
|
||||||
|
- **@mikemcquaid** (GitHub staff)
|
||||||
|
- **@pchaigno**
|
||||||
|
|
||||||
|
As Linguist is a production dependency for GitHub we have a couple of workflow restrictions:
|
||||||
|
|
||||||
|
- Anyone with commit rights can merge Pull Requests provided that there is a :+1: from a GitHub member of staff
|
||||||
|
- Releases are performed by GitHub staff so we can ensure GitHub.com always stays up to date with the latest release of Linguist and there are no regressions in production.
|
||||||
|
|
||||||
|
### Releasing
|
||||||
|
|
||||||
|
If you are the current maintainer of this gem:
|
||||||
|
|
||||||
|
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: `script/bootstrap`
|
||||||
|
0. If grammar submodules have not been updated recently, update them: `git submodule update --remote && git commit -a`
|
||||||
|
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`, [like this](https://github.com/github/linguist/commit/8d2ea90a5ba3b2fe6e1508b7155aa4632eea2985).
|
||||||
|
0. Make a PR to github/linguist, [like this](https://github.com/github/linguist/pull/1238).
|
||||||
|
0. Build a local gem: `bundle exec rake build_gem`
|
||||||
|
0. Test the gem:
|
||||||
|
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`
|
||||||
|
|
||||||
[grammars]: /grammars.yml
|
[grammars]: /grammars.yml
|
||||||
[languages]: /lib/linguist/languages.yml
|
[languages]: /lib/linguist/languages.yml
|
||||||
|
[licenses]: https://github.com/github/linguist/blob/257425141d4e2a5232786bf0b13c901ada075f93/vendor/licenses/config.yml#L2-L11
|
||||||
[samples]: /samples
|
[samples]: /samples
|
||||||
|
[new-issue]: https://github.com/github/linguist/issues/new
|
||||||
|
|||||||
2
Gemfile
2
Gemfile
@@ -1,5 +1,3 @@
|
|||||||
source 'https://rubygems.org'
|
source 'https://rubygems.org'
|
||||||
gemspec :name => "github-linguist"
|
gemspec :name => "github-linguist"
|
||||||
gemspec :name => "github-linguist-grammars"
|
|
||||||
gem 'test-unit', require: false if RUBY_VERSION >= '2.2'
|
|
||||||
gem 'byebug' if RUBY_VERSION >= '2.0'
|
gem 'byebug' if RUBY_VERSION >= '2.0'
|
||||||
|
|||||||
2
LICENSE
2
LICENSE
@@ -1,4 +1,4 @@
|
|||||||
Copyright (c) 2011-2014 GitHub, Inc.
|
Copyright (c) 2017 GitHub, Inc.
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person
|
Permission is hereby granted, free of charge, to any person
|
||||||
obtaining a copy of this software and associated documentation
|
obtaining a copy of this software and associated documentation
|
||||||
|
|||||||
246
README.md
246
README.md
@@ -1,45 +1,101 @@
|
|||||||
# Linguist
|
# Linguist
|
||||||
|
|
||||||
We use this library at GitHub to detect blob languages, ignore binary files, suppress generated files in diffs, and generate language breakdown graphs.
|
[issues]: https://github.com/github/linguist/issues
|
||||||
|
[new-issue]: https://github.com/github/linguist/issues/new
|
||||||
|
|
||||||
Tips for filing issues and creating pull requests can be found in [`CONTRIBUTING.md`](/CONTRIBUTING.md).
|
This library is used on GitHub.com to detect blob languages, ignore binary or vendored files, suppress generated files in diffs, and generate language breakdown graphs.
|
||||||
|
|
||||||
## Features
|
See [Troubleshooting](#troubleshooting) and [`CONTRIBUTING.md`](/CONTRIBUTING.md) before filing an issue or creating a pull request.
|
||||||
|
|
||||||
### Language detection
|
## Troubleshooting
|
||||||
|
|
||||||
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).
|
### My repository is detected as the wrong 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.
|
|
||||||
|
|
||||||
```ruby
|
The Language stats bar displays languages percentages for the files in the repository. The percentages are calculated based on the bytes of code for each language as reported by the [List Languages](https://developer.github.com/v3/repos/#list-languages) API. If the bar is reporting a language that you don't expect:
|
||||||
|
|
||||||
Linguist::FileBlob.new("lib/linguist.rb").language.name #=> "Ruby"
|
0. Click on the name of the language in the stats bar to see a list of the files that are identified as that language.
|
||||||
|
0. If you see files that you didn't write, consider moving the files into one of the [paths for vendored code](/lib/linguist/vendor.yml), or use the [manual overrides](#overrides) feature to ignore them.
|
||||||
|
0. If the files are being misclassified, search for [open issues][issues] to see if anyone else has already reported the issue. Any information you can add, especially links to public repositories, is helpful.
|
||||||
|
0. If there are no reported issues of this misclassification, [open an issue][new-issue] and include a link to the repository or a sample of the code that is being misclassified.
|
||||||
|
|
||||||
Linguist::FileBlob.new("bin/linguist").language.name #=> "Ruby"
|
### There's a problem with the syntax highlighting of a file
|
||||||
|
|
||||||
|
Linguist detects the language of a file but the actual syntax-highlighting is powered by a set of language grammars which are included in this project as a set of submodules [and may be found here](https://github.com/github/linguist/blob/master/vendor/README.md).
|
||||||
|
|
||||||
|
If you experience an issue with the syntax-highlighting on GitHub, **please report the issue to the upstream grammar repository, not here.** Grammars are updated every time we build the Linguist gem and so upstream bug fixes are automatically incorporated as they are fixed.
|
||||||
|
|
||||||
|
## Overrides
|
||||||
|
|
||||||
|
Linguist supports a number of different custom overrides strategies for language definitions and vendored paths.
|
||||||
|
|
||||||
|
### Using gitattributes
|
||||||
|
|
||||||
|
Add a `.gitattributes` file to your project and use standard git-style path matchers for the files you want to override to set `linguist-documentation`, `linguist-language`, and `linguist-vendored`. `.gitattributes` will be used to determine language statistics and will be used to syntax highlight files. You can also manually set syntax highlighting using [Vim or Emacs modelines](#using-emacs-or-vim-modelines).
|
||||||
|
|
||||||
|
```
|
||||||
|
$ cat .gitattributes
|
||||||
|
*.rb linguist-language=Java
|
||||||
```
|
```
|
||||||
|
|
||||||
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).
|
Checking code you didn't write, such as JavaScript libraries, 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. By default, Linguist treats all of the paths defined in [lib/linguist/vendor.yml](https://github.com/github/linguist/blob/master/lib/linguist/vendor.yml) as vendored and therefore doesn't include them in the language statistics for a repository.
|
||||||
|
|
||||||
### Syntax Highlighting
|
Use the `linguist-vendored` attribute to vendor or un-vendor paths.
|
||||||
|
|
||||||
Syntax highlighting in GitHub is performed using TextMate-compatible grammars. These are the same grammars that TextMate, Sublime Text and Atom use.
|
```
|
||||||
|
$ cat .gitattributes
|
||||||
|
special-vendored-path/* linguist-vendored
|
||||||
|
jquery.js linguist-vendored=false
|
||||||
|
```
|
||||||
|
|
||||||
Every language in `languages.yml` is mapped to its corresponding TM `scope`. This scope will be used when picking up a grammar for highlighting. **When adding a new language to Linguist, please add its corresponding scope too (assuming there's an existing TextMate bundle, Sublime Text package, or Atom package) so syntax highlighting works for it**.
|
Just like vendored files, Linguist excludes documentation files from your project's language stats. [lib/linguist/documentation.yml](lib/linguist/documentation.yml) lists common documentation paths and excludes them from the language statistics for your repository.
|
||||||
|
|
||||||
### Stats
|
Use the `linguist-documentation` attribute to mark or unmark paths as documentation.
|
||||||
|
|
||||||
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.
|
```
|
||||||
|
$ cat .gitattributes
|
||||||
|
project-docs/* linguist-documentation
|
||||||
|
docs/formatter.rb linguist-documentation=false
|
||||||
|
```
|
||||||
|
|
||||||
The repository stats API, accessed through `#languages`, can be used on a directory:
|
#### Generated file detection
|
||||||
|
|
||||||
***API UPDATE***
|
Not all plain text files are true source files. Generated files like minified js and compiled CoffeeScript can be detected and excluded from language stats. As an added bonus, unlike vendored and documentation files, these files are suppressed in diffs.
|
||||||
|
|
||||||
Since [Version 3.0.0](https://github.com/github/linguist/releases/tag/v3.0.0) Linguist expects a git repository (in the form of a [Rugged::Repository](https://github.com/libgit2/rugged#repositories)) to be passed when initializing `Linguist::Repository`.
|
```ruby
|
||||||
|
Linguist::FileBlob.new("underscore.min.js").generated? # => true
|
||||||
|
```
|
||||||
|
|
||||||
|
See [Linguist::Generated#generated?](https://github.com/github/linguist/blob/master/lib/linguist/generated.rb).
|
||||||
|
|
||||||
|
### Using Emacs or Vim modelines
|
||||||
|
|
||||||
|
If you do not want to use `.gitattributes` to override the syntax highlighting used on GitHub.com, you can use Vim or Emacs style modelines to set the language for a single file. Modelines can be placed anywhere within a file and are respected when determining how to syntax-highlight a file on GitHub.com
|
||||||
|
|
||||||
|
##### Vim
|
||||||
|
```
|
||||||
|
# Some examples of various styles:
|
||||||
|
vim: syntax=java
|
||||||
|
vim: set syntax=ruby:
|
||||||
|
vim: set filetype=prolog:
|
||||||
|
vim: set ft=cpp:
|
||||||
|
```
|
||||||
|
|
||||||
|
##### Emacs
|
||||||
|
```
|
||||||
|
-*- mode: php;-*-
|
||||||
|
```
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
Install the gem:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ gem install github-linguist
|
||||||
|
```
|
||||||
|
|
||||||
|
Then use it in your application:
|
||||||
|
|
||||||
```ruby
|
```ruby
|
||||||
require 'rugged'
|
require 'rugged'
|
||||||
@@ -51,146 +107,32 @@ project.language #=> "Ruby"
|
|||||||
project.languages #=> { "Ruby" => 119387 }
|
project.languages #=> { "Ruby" => 119387 }
|
||||||
```
|
```
|
||||||
|
|
||||||
These stats are also printed out by the `linguist` binary. You can use the
|
These stats are also printed out by the `linguist` executable. You can use the
|
||||||
`--breakdown` flag, and the binary will also output the breakdown of files by language.
|
`--breakdown` flag, and the binary will also output the breakdown of files by language.
|
||||||
|
|
||||||
You can try running `linguist` on the root directory in this repository itself:
|
You can try running `linguist` on the root directory in this repository itself:
|
||||||
|
|
||||||
$ bundle exec linguist --breakdown
|
```
|
||||||
|
$ bundle exec linguist --breakdown
|
||||||
|
|
||||||
100.00% Ruby
|
100.00% Ruby
|
||||||
|
|
||||||
Ruby:
|
Ruby:
|
||||||
Gemfile
|
Gemfile
|
||||||
Rakefile
|
Rakefile
|
||||||
bin/linguist
|
bin/linguist
|
||||||
github-linguist.gemspec
|
github-linguist.gemspec
|
||||||
lib/linguist.rb
|
lib/linguist.rb
|
||||||
lib/linguist/blob_helper.rb
|
…
|
||||||
lib/linguist/classifier.rb
|
|
||||||
lib/linguist/file_blob.rb
|
|
||||||
lib/linguist/generated.rb
|
|
||||||
lib/linguist/heuristics.rb
|
|
||||||
lib/linguist/language.rb
|
|
||||||
lib/linguist/lazy_blob.rb
|
|
||||||
lib/linguist/md5.rb
|
|
||||||
lib/linguist/repository.rb
|
|
||||||
lib/linguist/samples.rb
|
|
||||||
lib/linguist/tokenizer.rb
|
|
||||||
lib/linguist/version.rb
|
|
||||||
test/test_blob.rb
|
|
||||||
test/test_classifier.rb
|
|
||||||
test/test_heuristics.rb
|
|
||||||
test/test_language.rb
|
|
||||||
test/test_md5.rb
|
|
||||||
test/test_pedantic.rb
|
|
||||||
test/test_repository.rb
|
|
||||||
test/test_samples.rb
|
|
||||||
test/test_tokenizer.rb
|
|
||||||
|
|
||||||
#### Ignore vendored files
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
```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).
|
## Contributing
|
||||||
|
|
||||||
#### Generated file detection
|
Please check out our [contributing guidelines](CONTRIBUTING.md).
|
||||||
|
|
||||||
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.
|
## License
|
||||||
|
|
||||||
```ruby
|
The language grammars included in this gem are covered by their repositories'
|
||||||
Linguist::FileBlob.new("underscore.min.js").generated? # => true
|
respective licenses. `grammars.yml` specifies the repository for each grammar.
|
||||||
```
|
|
||||||
|
|
||||||
See [Linguist::Generated#generated?](https://github.com/github/linguist/blob/master/lib/linguist/generated.rb).
|
All other files are covered by the MIT license, see `LICENSE`.
|
||||||
|
|
||||||
## Overrides
|
|
||||||
|
|
||||||
Linguist supports custom overrides for language definitions and vendored paths. Add a `.gitattributes` file to your project using the keys `linguist-language` and `linguist-vendored` with the standard git-style path matchers for the files you want to override.
|
|
||||||
|
|
||||||
Please note that the overrides currently only affect the language statistics for a repository and not the syntax-highlighting of files.
|
|
||||||
|
|
||||||
```
|
|
||||||
$ cat .gitattributes
|
|
||||||
*.rb linguist-language=Java
|
|
||||||
|
|
||||||
$ linguist --breakdown
|
|
||||||
100.00% Java
|
|
||||||
|
|
||||||
Java:
|
|
||||||
ruby_file.rb
|
|
||||||
```
|
|
||||||
|
|
||||||
By default, Linguist treats all of the paths defined in [lib/linguist/vendor.yml](https://github.com/github/linguist/blob/master/lib/linguist/vendor.yml) as vendored and therefore doesn't include them in the language statistics for a repository. Use the `linguist-vendored` attribute to vendor or un-vendor paths.
|
|
||||||
|
|
||||||
```
|
|
||||||
$ cat .gitattributes
|
|
||||||
special-vendored-path/* linguist-vendored
|
|
||||||
jquery.js linguist-vendored=false
|
|
||||||
```
|
|
||||||
|
|
||||||
## Installation
|
|
||||||
|
|
||||||
Github.com is usually running the latest version of the `github-linguist` gem that is released on [RubyGems.org](http://rubygems.org/gems/github-linguist).
|
|
||||||
|
|
||||||
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/
|
|
||||||
bundle install
|
|
||||||
|
|
||||||
To run the tests:
|
|
||||||
|
|
||||||
bundle exec rake test
|
|
||||||
|
|
||||||
### 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: `bundle exec rake build_gem`
|
|
||||||
0. Testing:
|
|
||||||
0. Bump the Gemfile and Gemfile.lock versions for an app which relies on this gem
|
|
||||||
0. Install the new gem locally
|
|
||||||
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`
|
|
||||||
|
|||||||
29
Rakefile
29
Rakefile
@@ -3,13 +3,14 @@ require 'rake/clean'
|
|||||||
require 'rake/testtask'
|
require 'rake/testtask'
|
||||||
require 'yaml'
|
require 'yaml'
|
||||||
require 'yajl'
|
require 'yajl'
|
||||||
|
require 'open-uri'
|
||||||
|
|
||||||
task :default => :test
|
task :default => :test
|
||||||
|
|
||||||
Rake::TestTask.new
|
Rake::TestTask.new
|
||||||
|
|
||||||
# Extend test task to check for samples
|
# Extend test task to check for samples and fetch latest Ace modes
|
||||||
task :test => :check_samples
|
task :test => [:check_samples, :fetch_ace_modes]
|
||||||
|
|
||||||
desc "Check that we have samples.json generated"
|
desc "Check that we have samples.json generated"
|
||||||
task :check_samples do
|
task :check_samples do
|
||||||
@@ -18,6 +19,20 @@ task :check_samples do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
desc "Fetch the latest Ace modes from its GitHub repository"
|
||||||
|
task :fetch_ace_modes do
|
||||||
|
ACE_FIXTURE_PATH = File.join('test', 'fixtures', 'ace_modes.json')
|
||||||
|
|
||||||
|
File.delete(ACE_FIXTURE_PATH) if File.exist?(ACE_FIXTURE_PATH)
|
||||||
|
|
||||||
|
begin
|
||||||
|
ace_github_modes = open("https://api.github.com/repos/ajaxorg/ace/contents/lib/ace/mode").read
|
||||||
|
File.write(ACE_FIXTURE_PATH, ace_github_modes)
|
||||||
|
rescue OpenURI::HTTPError, SocketError
|
||||||
|
# no internet? no problem.
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
task :samples do
|
task :samples do
|
||||||
require 'linguist/samples'
|
require 'linguist/samples'
|
||||||
json = Yajl.dump(Linguist::Samples.data, :pretty => true)
|
json = Yajl.dump(Linguist::Samples.data, :pretty => true)
|
||||||
@@ -25,18 +40,14 @@ task :samples do
|
|||||||
end
|
end
|
||||||
|
|
||||||
task :build_gem => :samples do
|
task :build_gem => :samples do
|
||||||
|
rm_rf "grammars"
|
||||||
|
sh "script/convert-grammars"
|
||||||
languages = YAML.load_file("lib/linguist/languages.yml")
|
languages = YAML.load_file("lib/linguist/languages.yml")
|
||||||
File.write("lib/linguist/languages.json", Yajl.dump(languages))
|
File.write("lib/linguist/languages.json", Yajl.dump(languages))
|
||||||
`gem build github-linguist.gemspec`
|
`gem build github-linguist.gemspec`
|
||||||
File.delete("lib/linguist/languages.json")
|
File.delete("lib/linguist/languages.json")
|
||||||
end
|
end
|
||||||
|
|
||||||
task :build_grammars_gem do
|
|
||||||
rm_rf "grammars"
|
|
||||||
sh "script/download-grammars"
|
|
||||||
sh "gem", "build", "github-linguist-grammars.gemspec"
|
|
||||||
end
|
|
||||||
|
|
||||||
namespace :benchmark do
|
namespace :benchmark do
|
||||||
benchmark_path = "benchmark/results"
|
benchmark_path = "benchmark/results"
|
||||||
|
|
||||||
@@ -47,7 +58,7 @@ namespace :benchmark do
|
|||||||
|
|
||||||
corpus = File.expand_path(ENV["CORPUS"] || "samples")
|
corpus = File.expand_path(ENV["CORPUS"] || "samples")
|
||||||
|
|
||||||
require 'linguist/language'
|
require 'linguist'
|
||||||
|
|
||||||
results = Hash.new
|
results = Hash.new
|
||||||
Dir.glob("#{corpus}/**/*").each do |file|
|
Dir.glob("#{corpus}/**/*").each do |file|
|
||||||
|
|||||||
146
bin/git-linguist
Executable file
146
bin/git-linguist
Executable file
@@ -0,0 +1,146 @@
|
|||||||
|
#!/usr/bin/env ruby
|
||||||
|
|
||||||
|
$LOAD_PATH[0, 0] = File.join(File.dirname(__FILE__), '..', 'lib')
|
||||||
|
|
||||||
|
require 'linguist'
|
||||||
|
require 'rugged'
|
||||||
|
require 'optparse'
|
||||||
|
require 'json'
|
||||||
|
require 'tmpdir'
|
||||||
|
require 'zlib'
|
||||||
|
|
||||||
|
class GitLinguist
|
||||||
|
def initialize(path, commit_oid, incremental = true)
|
||||||
|
@repo_path = path
|
||||||
|
@commit_oid = commit_oid
|
||||||
|
@incremental = incremental
|
||||||
|
end
|
||||||
|
|
||||||
|
def linguist
|
||||||
|
if @commit_oid.nil?
|
||||||
|
raise "git-linguist must be called with a specific commit OID to perform language computation"
|
||||||
|
end
|
||||||
|
repo = Linguist::Repository.new(rugged, @commit_oid)
|
||||||
|
|
||||||
|
if @incremental && stats = load_language_stats
|
||||||
|
old_commit_oid, old_stats = stats
|
||||||
|
|
||||||
|
# A cache with NULL oid means that we want to freeze
|
||||||
|
# these language stats in place and stop computing
|
||||||
|
# them (for performance reasons)
|
||||||
|
return old_stats if old_commit_oid == NULL_OID
|
||||||
|
repo.load_existing_stats(old_commit_oid, old_stats)
|
||||||
|
end
|
||||||
|
|
||||||
|
result = yield repo
|
||||||
|
|
||||||
|
save_language_stats(@commit_oid, repo.cache)
|
||||||
|
result
|
||||||
|
end
|
||||||
|
|
||||||
|
def load_language_stats
|
||||||
|
version, oid, stats = load_cache
|
||||||
|
if version == LANGUAGE_STATS_CACHE_VERSION && oid && stats
|
||||||
|
[oid, stats]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def save_language_stats(oid, stats)
|
||||||
|
cache = [LANGUAGE_STATS_CACHE_VERSION, oid, stats]
|
||||||
|
write_cache(cache)
|
||||||
|
end
|
||||||
|
|
||||||
|
def clear_language_stats
|
||||||
|
File.unlink(cache_file)
|
||||||
|
rescue Errno::ENOENT
|
||||||
|
end
|
||||||
|
|
||||||
|
def disable_language_stats
|
||||||
|
save_language_stats(NULL_OID, {})
|
||||||
|
end
|
||||||
|
|
||||||
|
protected
|
||||||
|
NULL_OID = ("0" * 40).freeze
|
||||||
|
|
||||||
|
LANGUAGE_STATS_CACHE = 'language-stats.cache'
|
||||||
|
LANGUAGE_STATS_CACHE_VERSION = "v3:#{Linguist::VERSION}"
|
||||||
|
|
||||||
|
def rugged
|
||||||
|
@rugged ||= Rugged::Repository.bare(@repo_path)
|
||||||
|
end
|
||||||
|
|
||||||
|
def cache_file
|
||||||
|
File.join(@repo_path, LANGUAGE_STATS_CACHE)
|
||||||
|
end
|
||||||
|
|
||||||
|
def write_cache(object)
|
||||||
|
return unless File.directory? @repo_path
|
||||||
|
|
||||||
|
begin
|
||||||
|
tmp_path = Dir::Tmpname.make_tmpname(cache_file, nil)
|
||||||
|
File.open(tmp_path, "wb") do |f|
|
||||||
|
marshal = Marshal.dump(object)
|
||||||
|
f.write(Zlib::Deflate.deflate(marshal))
|
||||||
|
end
|
||||||
|
|
||||||
|
File.rename(tmp_path, cache_file)
|
||||||
|
rescue => e
|
||||||
|
(File.unlink(tmp_path) rescue nil)
|
||||||
|
raise e
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def load_cache
|
||||||
|
marshal = File.open(cache_file, "rb") { |f| Zlib::Inflate.inflate(f.read) }
|
||||||
|
Marshal.load(marshal)
|
||||||
|
rescue SystemCallError, ::Zlib::DataError, ::Zlib::BufError, TypeError
|
||||||
|
nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
def git_linguist(args)
|
||||||
|
incremental = true
|
||||||
|
commit = nil
|
||||||
|
|
||||||
|
parser = OptionParser.new do |opts|
|
||||||
|
opts.banner = <<-HELP
|
||||||
|
Linguist v#{Linguist::VERSION}
|
||||||
|
Detect language type and determine language breakdown for a given Git repository.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
git-linguist [OPTIONS] stats|breakdown|dump-cache|clear|disable"
|
||||||
|
HELP
|
||||||
|
|
||||||
|
opts.on("-f", "--force", "Force a full rescan") { incremental = false }
|
||||||
|
opts.on("-c", "--commit=COMMIT", "Commit to index") { |v| commit = v}
|
||||||
|
end
|
||||||
|
|
||||||
|
parser.parse!(args)
|
||||||
|
|
||||||
|
git_dir = `git rev-parse --git-dir`.strip
|
||||||
|
raise "git-linguist must be run in a Git repository (#{Dir.pwd})" unless $?.success?
|
||||||
|
wrapper = GitLinguist.new(git_dir, commit, incremental)
|
||||||
|
|
||||||
|
case args.pop
|
||||||
|
when "stats"
|
||||||
|
wrapper.linguist do |linguist|
|
||||||
|
puts JSON.dump(linguist.languages)
|
||||||
|
end
|
||||||
|
when "breakdown"
|
||||||
|
wrapper.linguist do |linguist|
|
||||||
|
puts JSON.dump(linguist.breakdown_by_file)
|
||||||
|
end
|
||||||
|
when "dump-cache"
|
||||||
|
puts JSON.dump(wrapper.load_language_stats)
|
||||||
|
when "clear"
|
||||||
|
wrapper.clear_language_stats
|
||||||
|
when "disable"
|
||||||
|
wrapper.disable_language_stats
|
||||||
|
else
|
||||||
|
$stderr.print(parser.help)
|
||||||
|
exit 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
git_linguist(ARGV)
|
||||||
37
bin/linguist
37
bin/linguist
@@ -1,31 +1,37 @@
|
|||||||
#!/usr/bin/env ruby
|
#!/usr/bin/env ruby
|
||||||
|
|
||||||
# linguist — detect language type for a file, or, given a directory, determine language breakdown
|
$LOAD_PATH[0, 0] = File.join(File.dirname(__FILE__), '..', 'lib')
|
||||||
# usage: linguist <path> [<--breakdown>]
|
|
||||||
|
|
||||||
require 'linguist/file_blob'
|
require 'linguist'
|
||||||
require 'linguist/language'
|
|
||||||
require 'linguist/repository'
|
|
||||||
require 'rugged'
|
require 'rugged'
|
||||||
|
require 'json'
|
||||||
|
require 'optparse'
|
||||||
|
|
||||||
path = ARGV[0] || Dir.pwd
|
path = ARGV[0] || Dir.pwd
|
||||||
|
|
||||||
# special case if not given a directory but still given the --breakdown option
|
# special case if not given a directory
|
||||||
|
# but still given the --breakdown or --json options/
|
||||||
if path == "--breakdown"
|
if path == "--breakdown"
|
||||||
path = Dir.pwd
|
path = Dir.pwd
|
||||||
breakdown = true
|
breakdown = true
|
||||||
|
elsif path == "--json"
|
||||||
|
path = Dir.pwd
|
||||||
|
json_breakdown = true
|
||||||
end
|
end
|
||||||
|
|
||||||
ARGV.shift
|
ARGV.shift
|
||||||
breakdown = true if ARGV[0] == "--breakdown"
|
breakdown = true if ARGV[0] == "--breakdown"
|
||||||
|
json_breakdown = true if ARGV[0] == "--json"
|
||||||
|
|
||||||
if File.directory?(path)
|
if File.directory?(path)
|
||||||
rugged = Rugged::Repository.new(path)
|
rugged = Rugged::Repository.new(path)
|
||||||
repo = Linguist::Repository.new(rugged, rugged.head.target_id)
|
repo = Linguist::Repository.new(rugged, rugged.head.target_id)
|
||||||
repo.languages.sort_by { |_, size| size }.reverse.each do |language, size|
|
if !json_breakdown
|
||||||
percentage = ((size / repo.size.to_f) * 100)
|
repo.languages.sort_by { |_, size| size }.reverse.each do |language, size|
|
||||||
percentage = sprintf '%.2f' % percentage
|
percentage = ((size / repo.size.to_f) * 100)
|
||||||
puts "%-7s %s" % ["#{percentage}%", language]
|
percentage = sprintf '%.2f' % percentage
|
||||||
|
puts "%-7s %s" % ["#{percentage}%", language]
|
||||||
|
end
|
||||||
end
|
end
|
||||||
if breakdown
|
if breakdown
|
||||||
puts
|
puts
|
||||||
@@ -37,6 +43,8 @@ if File.directory?(path)
|
|||||||
end
|
end
|
||||||
puts
|
puts
|
||||||
end
|
end
|
||||||
|
elsif json_breakdown
|
||||||
|
puts JSON.dump(repo.breakdown_by_file)
|
||||||
end
|
end
|
||||||
elsif File.file?(path)
|
elsif File.file?(path)
|
||||||
blob = Linguist::FileBlob.new(path, Dir.pwd)
|
blob = Linguist::FileBlob.new(path, Dir.pwd)
|
||||||
@@ -65,5 +73,12 @@ elsif File.file?(path)
|
|||||||
puts " appears to be a vendored file"
|
puts " appears to be a vendored file"
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
abort "usage: linguist <path>"
|
abort <<-HELP
|
||||||
|
Linguist v#{Linguist::VERSION}
|
||||||
|
Detect language type for a file, or, given a directory, determine language breakdown.
|
||||||
|
|
||||||
|
Usage: linguist <path>
|
||||||
|
linguist <path> [--breakdown] [--json]
|
||||||
|
linguist [--breakdown] [--json]
|
||||||
|
HELP
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,14 +0,0 @@
|
|||||||
require File.expand_path('../lib/linguist/version', __FILE__)
|
|
||||||
|
|
||||||
Gem::Specification.new do |s|
|
|
||||||
s.name = 'github-linguist-grammars'
|
|
||||||
s.version = Linguist::VERSION
|
|
||||||
s.summary = "Language grammars for use with github-linguist"
|
|
||||||
|
|
||||||
s.authors = "GitHub"
|
|
||||||
s.homepage = "https://github.com/github/linguist"
|
|
||||||
|
|
||||||
s.files = ['lib/linguist/grammars.rb'] + Dir['grammars/*']
|
|
||||||
|
|
||||||
s.add_development_dependency 'plist', '~>3.1'
|
|
||||||
end
|
|
||||||
@@ -10,16 +10,21 @@ Gem::Specification.new do |s|
|
|||||||
s.homepage = "https://github.com/github/linguist"
|
s.homepage = "https://github.com/github/linguist"
|
||||||
s.license = "MIT"
|
s.license = "MIT"
|
||||||
|
|
||||||
s.files = Dir['lib/**/*'] - ['lib/linguist/grammars.rb']
|
s.files = Dir['lib/**/*'] + Dir['grammars/*'] + ['LICENSE']
|
||||||
s.executables << 'linguist'
|
s.executables = ['linguist', 'git-linguist']
|
||||||
|
|
||||||
s.add_dependency 'charlock_holmes', '~> 0.7.3'
|
s.add_dependency 'charlock_holmes', '~> 0.7.3'
|
||||||
s.add_dependency 'escape_utils', '~> 1.0.1'
|
s.add_dependency 'escape_utils', '~> 1.1.0'
|
||||||
s.add_dependency 'mime-types', '>= 1.19'
|
s.add_dependency 'mime-types', '>= 1.19'
|
||||||
s.add_dependency 'rugged', '~> 0.22.0b4'
|
s.add_dependency 'rugged', '>= 0.25.1'
|
||||||
|
|
||||||
|
s.add_development_dependency 'minitest', '>= 5.0'
|
||||||
s.add_development_dependency 'mocha'
|
s.add_development_dependency 'mocha'
|
||||||
|
s.add_development_dependency 'plist', '~>3.1'
|
||||||
s.add_development_dependency 'pry'
|
s.add_development_dependency 'pry'
|
||||||
s.add_development_dependency 'rake'
|
s.add_development_dependency 'rake'
|
||||||
s.add_development_dependency 'yajl-ruby'
|
s.add_development_dependency 'yajl-ruby'
|
||||||
|
s.add_development_dependency 'color-proximity', '~> 0.2.1'
|
||||||
|
s.add_development_dependency 'licensed'
|
||||||
|
s.add_development_dependency 'licensee', '~> 8.8.0'
|
||||||
end
|
end
|
||||||
|
|||||||
964
grammars.yml
Normal file → Executable file
964
grammars.yml
Normal file → Executable file
File diff suppressed because it is too large
Load Diff
@@ -1,8 +1,100 @@
|
|||||||
require 'linguist/blob_helper'
|
require 'linguist/blob_helper'
|
||||||
require 'linguist/generated'
|
require 'linguist/generated'
|
||||||
|
require 'linguist/grammars'
|
||||||
require 'linguist/heuristics'
|
require 'linguist/heuristics'
|
||||||
require 'linguist/language'
|
require 'linguist/language'
|
||||||
require 'linguist/repository'
|
require 'linguist/repository'
|
||||||
require 'linguist/samples'
|
require 'linguist/samples'
|
||||||
require 'linguist/shebang'
|
require 'linguist/shebang'
|
||||||
require 'linguist/version'
|
require 'linguist/version'
|
||||||
|
|
||||||
|
class << Linguist
|
||||||
|
# Public: Detects the Language of the blob.
|
||||||
|
#
|
||||||
|
# blob - an object that includes the Linguist `BlobHelper` interface;
|
||||||
|
# see Linguist::LazyBlob and Linguist::FileBlob for examples
|
||||||
|
#
|
||||||
|
# Returns Language or nil.
|
||||||
|
def detect(blob, allow_empty: false)
|
||||||
|
# Bail early if the blob is binary or empty.
|
||||||
|
return nil if blob.likely_binary? || blob.binary? || (!allow_empty && blob.empty?)
|
||||||
|
|
||||||
|
Linguist.instrument("linguist.detection", :blob => blob) do
|
||||||
|
# Call each strategy until one candidate is returned.
|
||||||
|
languages = []
|
||||||
|
returning_strategy = nil
|
||||||
|
|
||||||
|
STRATEGIES.each do |strategy|
|
||||||
|
returning_strategy = strategy
|
||||||
|
candidates = Linguist.instrument("linguist.strategy", :blob => blob, :strategy => strategy, :candidates => languages) do
|
||||||
|
strategy.call(blob, languages)
|
||||||
|
end
|
||||||
|
if candidates.size == 1
|
||||||
|
languages = candidates
|
||||||
|
break
|
||||||
|
elsif candidates.size > 1
|
||||||
|
# More than one candidate was found, pass them to the next strategy.
|
||||||
|
languages = candidates
|
||||||
|
else
|
||||||
|
# No candidates, try the next strategy
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
Linguist.instrument("linguist.detected", :blob => blob, :strategy => returning_strategy, :language => languages.first)
|
||||||
|
|
||||||
|
languages.first
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Internal: The strategies used to detect the language of a file.
|
||||||
|
#
|
||||||
|
# A strategy is an object that has a `.call` method that takes two arguments:
|
||||||
|
#
|
||||||
|
# blob - An object that quacks like a blob.
|
||||||
|
# languages - An Array of candidate Language objects that were returned by the
|
||||||
|
# previous strategy.
|
||||||
|
#
|
||||||
|
# A strategy should return an Array of Language candidates.
|
||||||
|
#
|
||||||
|
# Strategies are called in turn until a single Language is returned.
|
||||||
|
STRATEGIES = [
|
||||||
|
Linguist::Strategy::Modeline,
|
||||||
|
Linguist::Strategy::Filename,
|
||||||
|
Linguist::Shebang,
|
||||||
|
Linguist::Strategy::Extension,
|
||||||
|
Linguist::Heuristics,
|
||||||
|
Linguist::Classifier
|
||||||
|
]
|
||||||
|
|
||||||
|
# Public: Set an instrumenter.
|
||||||
|
#
|
||||||
|
# class CustomInstrumenter
|
||||||
|
# def instrument(name, payload = {})
|
||||||
|
# warn "Instrumenting #{name}: #{payload[:blob]}"
|
||||||
|
# end
|
||||||
|
# end
|
||||||
|
#
|
||||||
|
# Linguist.instrumenter = CustomInstrumenter
|
||||||
|
#
|
||||||
|
# The instrumenter must conform to the `ActiveSupport::Notifications`
|
||||||
|
# interface, which defines `#instrument` and accepts:
|
||||||
|
#
|
||||||
|
# name - the String name of the event (e.g. "linguist.detected")
|
||||||
|
# payload - a Hash of the exception context.
|
||||||
|
attr_accessor :instrumenter
|
||||||
|
|
||||||
|
# Internal: Perform instrumentation on a block
|
||||||
|
#
|
||||||
|
# Linguist.instrument("linguist.dosomething", :blob => blob) do
|
||||||
|
# # logic to instrument here.
|
||||||
|
# end
|
||||||
|
#
|
||||||
|
def instrument(*args, &bk)
|
||||||
|
if instrumenter
|
||||||
|
instrumenter.instrument(*args, &bk)
|
||||||
|
elsif block_given?
|
||||||
|
yield
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|||||||
73
lib/linguist/blob.rb
Normal file
73
lib/linguist/blob.rb
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
require 'linguist/blob_helper'
|
||||||
|
|
||||||
|
module Linguist
|
||||||
|
# A Blob is a wrapper around the content of a file to make it quack
|
||||||
|
# like a Grit::Blob. It provides the basic interface: `name`,
|
||||||
|
# `data`, `path` and `size`.
|
||||||
|
class Blob
|
||||||
|
include BlobHelper
|
||||||
|
|
||||||
|
# Public: Initialize a new Blob.
|
||||||
|
#
|
||||||
|
# path - A path String (does not necessarily exists on the file system).
|
||||||
|
# content - Content of the file.
|
||||||
|
#
|
||||||
|
# Returns a Blob.
|
||||||
|
def initialize(path, content)
|
||||||
|
@path = path
|
||||||
|
@content = content
|
||||||
|
end
|
||||||
|
|
||||||
|
# Public: Filename
|
||||||
|
#
|
||||||
|
# Examples
|
||||||
|
#
|
||||||
|
# Blob.new("/path/to/linguist/lib/linguist.rb", "").path
|
||||||
|
# # => "/path/to/linguist/lib/linguist.rb"
|
||||||
|
#
|
||||||
|
# Returns a String
|
||||||
|
attr_reader :path
|
||||||
|
|
||||||
|
# Public: File name
|
||||||
|
#
|
||||||
|
# Returns a String
|
||||||
|
def name
|
||||||
|
File.basename(@path)
|
||||||
|
end
|
||||||
|
|
||||||
|
# Public: File contents.
|
||||||
|
#
|
||||||
|
# Returns a String.
|
||||||
|
def data
|
||||||
|
@content
|
||||||
|
end
|
||||||
|
|
||||||
|
# Public: Get byte size
|
||||||
|
#
|
||||||
|
# Returns an Integer.
|
||||||
|
def size
|
||||||
|
@content.bytesize
|
||||||
|
end
|
||||||
|
|
||||||
|
# Public: Get file extension.
|
||||||
|
#
|
||||||
|
# Returns a String.
|
||||||
|
def extension
|
||||||
|
extensions.last || ""
|
||||||
|
end
|
||||||
|
|
||||||
|
# Public: Return an array of the file extensions
|
||||||
|
#
|
||||||
|
# >> Linguist::Blob.new("app/views/things/index.html.erb").extensions
|
||||||
|
# => [".html.erb", ".erb"]
|
||||||
|
#
|
||||||
|
# Returns an Array
|
||||||
|
def extensions
|
||||||
|
_, *segments = name.downcase.split(".", -1)
|
||||||
|
|
||||||
|
segments.map.with_index do |segment, index|
|
||||||
|
"." + segments[index..-1].join(".")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -6,7 +6,7 @@ require 'yaml'
|
|||||||
|
|
||||||
module Linguist
|
module Linguist
|
||||||
# DEPRECATED Avoid mixing into Blob classes. Prefer functional interfaces
|
# DEPRECATED Avoid mixing into Blob classes. Prefer functional interfaces
|
||||||
# like `Language.detect` over `Blob#language`. Functions are much easier to
|
# like `Linguist.detect` over `Blob#language`. Functions are much easier to
|
||||||
# cache and compose.
|
# cache and compose.
|
||||||
#
|
#
|
||||||
# Avoid adding additional bloat to this module.
|
# Avoid adding additional bloat to this module.
|
||||||
@@ -99,7 +99,7 @@ module Linguist
|
|||||||
elsif name.nil?
|
elsif name.nil?
|
||||||
"attachment"
|
"attachment"
|
||||||
else
|
else
|
||||||
"attachment; filename=#{EscapeUtils.escape_url(File.basename(name))}"
|
"attachment; filename=#{EscapeUtils.escape_url(name)}"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -233,7 +233,22 @@ module Linguist
|
|||||||
#
|
#
|
||||||
# Return true or false
|
# Return true or false
|
||||||
def vendored?
|
def vendored?
|
||||||
name =~ VendoredRegexp ? true : false
|
path =~ VendoredRegexp ? true : false
|
||||||
|
end
|
||||||
|
|
||||||
|
documentation_paths = YAML.load_file(File.expand_path("../documentation.yml", __FILE__))
|
||||||
|
DocumentationRegexp = Regexp.new(documentation_paths.join('|'))
|
||||||
|
|
||||||
|
# Public: Is the blob in a documentation directory?
|
||||||
|
#
|
||||||
|
# Documentation files are ignored by language statistics.
|
||||||
|
#
|
||||||
|
# See "documentation.yml" for a list of documentation conventions that match
|
||||||
|
# this pattern.
|
||||||
|
#
|
||||||
|
# Return true or false
|
||||||
|
def documentation?
|
||||||
|
path =~ DocumentationRegexp ? true : false
|
||||||
end
|
end
|
||||||
|
|
||||||
# Public: Get each line of data
|
# Public: Get each line of data
|
||||||
@@ -301,7 +316,7 @@ module Linguist
|
|||||||
#
|
#
|
||||||
# Return true or false
|
# Return true or false
|
||||||
def generated?
|
def generated?
|
||||||
@_generated ||= Generated.generated?(name, lambda { data })
|
@_generated ||= Generated.generated?(path, lambda { data })
|
||||||
end
|
end
|
||||||
|
|
||||||
# Public: Detects the Language of the blob.
|
# Public: Detects the Language of the blob.
|
||||||
@@ -310,12 +325,22 @@ module Linguist
|
|||||||
#
|
#
|
||||||
# Returns a Language or nil if none is detected
|
# Returns a Language or nil if none is detected
|
||||||
def language
|
def language
|
||||||
@language ||= Language.detect(self)
|
@language ||= Linguist.detect(self)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Internal: Get the TextMate compatible scope for the blob
|
# Internal: Get the TextMate compatible scope for the blob
|
||||||
def tm_scope
|
def tm_scope
|
||||||
language && language.tm_scope
|
language && language.tm_scope
|
||||||
end
|
end
|
||||||
|
|
||||||
|
DETECTABLE_TYPES = [:programming, :markup].freeze
|
||||||
|
|
||||||
|
# Internal: Should this blob be included in repository language statistics?
|
||||||
|
def include_in_language_stats?
|
||||||
|
!vendored? &&
|
||||||
|
!documentation? &&
|
||||||
|
!generated? &&
|
||||||
|
language && DETECTABLE_TYPES.include?(language.type)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -95,7 +95,7 @@ module Linguist
|
|||||||
# Returns sorted Array of result pairs. Each pair contains the
|
# Returns sorted Array of result pairs. Each pair contains the
|
||||||
# String language name and a Float score.
|
# String language name and a Float score.
|
||||||
def classify(tokens, languages)
|
def classify(tokens, languages)
|
||||||
return [] if tokens.nil?
|
return [] if tokens.nil? || languages.empty?
|
||||||
tokens = Tokenizer.tokenize(tokens) if tokens.is_a?(String)
|
tokens = Tokenizer.tokenize(tokens) if tokens.is_a?(String)
|
||||||
scores = {}
|
scores = {}
|
||||||
|
|
||||||
|
|||||||
31
lib/linguist/documentation.yml
Normal file
31
lib/linguist/documentation.yml
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
# Documentation files and directories are excluded from language
|
||||||
|
# statistics.
|
||||||
|
#
|
||||||
|
# Lines in this file are Regexps that are matched against the file
|
||||||
|
# pathname.
|
||||||
|
#
|
||||||
|
# Please add additional test coverage to
|
||||||
|
# `test/test_blob.rb#test_documentation` if you make any changes.
|
||||||
|
|
||||||
|
## Documentation directories ##
|
||||||
|
|
||||||
|
- ^[Dd]ocs?/
|
||||||
|
- (^|/)[Dd]ocumentation/
|
||||||
|
- (^|/)[Jj]avadoc/
|
||||||
|
- ^[Mm]an/
|
||||||
|
- ^[Ee]xamples/
|
||||||
|
- ^[Dd]emos?/
|
||||||
|
|
||||||
|
## Documentation files ##
|
||||||
|
|
||||||
|
- (^|/)CHANGE(S|LOG)?(\.|$)
|
||||||
|
- (^|/)CONTRIBUTING(\.|$)
|
||||||
|
- (^|/)COPYING(\.|$)
|
||||||
|
- (^|/)INSTALL(\.|$)
|
||||||
|
- (^|/)LICEN[CS]E(\.|$)
|
||||||
|
- (^|/)[Ll]icen[cs]e(\.|$)
|
||||||
|
- (^|/)README(\.|$)
|
||||||
|
- (^|/)[Rr]eadme(\.|$)
|
||||||
|
|
||||||
|
# Samples folders
|
||||||
|
- ^[Ss]amples?/
|
||||||
@@ -1,10 +1,11 @@
|
|||||||
require 'linguist/blob_helper'
|
require 'linguist/blob_helper'
|
||||||
|
require 'linguist/blob'
|
||||||
|
|
||||||
module Linguist
|
module Linguist
|
||||||
# A FileBlob is a wrapper around a File object to make it quack
|
# A FileBlob is a wrapper around a File object to make it quack
|
||||||
# like a Grit::Blob. It provides the basic interface: `name`,
|
# like a Grit::Blob. It provides the basic interface: `name`,
|
||||||
# `data`, and `size`.
|
# `data`, `path` and `size`.
|
||||||
class FileBlob
|
class FileBlob < Blob
|
||||||
include BlobHelper
|
include BlobHelper
|
||||||
|
|
||||||
# Public: Initialize a new FileBlob from a path
|
# Public: Initialize a new FileBlob from a path
|
||||||
@@ -14,64 +15,29 @@ module Linguist
|
|||||||
#
|
#
|
||||||
# Returns a FileBlob.
|
# Returns a FileBlob.
|
||||||
def initialize(path, base_path = nil)
|
def initialize(path, base_path = nil)
|
||||||
@path = path
|
@fullpath = path
|
||||||
@name = base_path ? path.sub("#{base_path}/", '') : path
|
@path = base_path ? path.sub("#{base_path}/", '') : path
|
||||||
end
|
end
|
||||||
|
|
||||||
# Public: Filename
|
|
||||||
#
|
|
||||||
# Examples
|
|
||||||
#
|
|
||||||
# FileBlob.new("/path/to/linguist/lib/linguist.rb").name
|
|
||||||
# # => "/path/to/linguist/lib/linguist.rb"
|
|
||||||
#
|
|
||||||
# FileBlob.new("/path/to/linguist/lib/linguist.rb",
|
|
||||||
# "/path/to/linguist").name
|
|
||||||
# # => "lib/linguist.rb"
|
|
||||||
#
|
|
||||||
# Returns a String
|
|
||||||
attr_reader :name
|
|
||||||
|
|
||||||
# Public: Read file permissions
|
# Public: Read file permissions
|
||||||
#
|
#
|
||||||
# Returns a String like '100644'
|
# Returns a String like '100644'
|
||||||
def mode
|
def mode
|
||||||
File.stat(@path).mode.to_s(8)
|
File.stat(@fullpath).mode.to_s(8)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Public: Read file contents.
|
# Public: Read file contents.
|
||||||
#
|
#
|
||||||
# Returns a String.
|
# Returns a String.
|
||||||
def data
|
def data
|
||||||
File.read(@path)
|
File.read(@fullpath)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Public: Get byte size
|
# Public: Get byte size
|
||||||
#
|
#
|
||||||
# Returns an Integer.
|
# Returns an Integer.
|
||||||
def size
|
def size
|
||||||
File.size(@path)
|
File.size(@fullpath)
|
||||||
end
|
|
||||||
|
|
||||||
# Public: Get file extension.
|
|
||||||
#
|
|
||||||
# Returns a String.
|
|
||||||
def extension
|
|
||||||
extensions.last || ""
|
|
||||||
end
|
|
||||||
|
|
||||||
# Public: Return an array of the file extensions
|
|
||||||
#
|
|
||||||
# >> Linguist::FileBlob.new("app/views/things/index.html.erb").extensions
|
|
||||||
# => [".html.erb", ".erb"]
|
|
||||||
#
|
|
||||||
# Returns an Array
|
|
||||||
def extensions
|
|
||||||
basename, *segments = File.basename(name).split(".")
|
|
||||||
|
|
||||||
segments.map.with_index do |segment, index|
|
|
||||||
"." + segments[index..-1].join(".")
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ module Linguist
|
|||||||
# Public: Is the blob a generated file?
|
# Public: Is the blob a generated file?
|
||||||
#
|
#
|
||||||
# name - String filename
|
# name - String filename
|
||||||
# data - String blob data. A block also maybe passed in for lazy
|
# data - String blob data. A block also may be passed in for lazy
|
||||||
# loading. This behavior is deprecated and you should always
|
# loading. This behavior is deprecated and you should always
|
||||||
# pass in a String.
|
# pass in a String.
|
||||||
#
|
#
|
||||||
@@ -51,20 +51,37 @@ module Linguist
|
|||||||
#
|
#
|
||||||
# Return true or false
|
# Return true or false
|
||||||
def generated?
|
def generated?
|
||||||
minified_files? ||
|
|
||||||
compiled_coffeescript? ||
|
|
||||||
xcode_file? ||
|
xcode_file? ||
|
||||||
generated_parser? ||
|
|
||||||
generated_net_docfile? ||
|
|
||||||
generated_net_designer_file? ||
|
generated_net_designer_file? ||
|
||||||
generated_postscript? ||
|
generated_net_specflow_feature_file? ||
|
||||||
generated_protocol_buffer? ||
|
|
||||||
generated_jni_header? ||
|
|
||||||
composer_lock? ||
|
composer_lock? ||
|
||||||
node_modules? ||
|
node_modules? ||
|
||||||
|
go_vendor? ||
|
||||||
|
npm_shrinkwrap? ||
|
||||||
godeps? ||
|
godeps? ||
|
||||||
|
generated_by_zephir? ||
|
||||||
|
minified_files? ||
|
||||||
|
has_source_map? ||
|
||||||
|
source_map? ||
|
||||||
|
compiled_coffeescript? ||
|
||||||
|
generated_parser? ||
|
||||||
|
generated_net_docfile? ||
|
||||||
|
generated_postscript? ||
|
||||||
|
compiled_cython_file? ||
|
||||||
|
generated_go? ||
|
||||||
|
generated_protocol_buffer? ||
|
||||||
|
generated_javascript_protocol_buffer? ||
|
||||||
|
generated_apache_thrift? ||
|
||||||
|
generated_jni_header? ||
|
||||||
vcr_cassette? ||
|
vcr_cassette? ||
|
||||||
generated_by_zephir?
|
generated_module? ||
|
||||||
|
generated_unity3d_meta? ||
|
||||||
|
generated_racc? ||
|
||||||
|
generated_jflex? ||
|
||||||
|
generated_grammarkit? ||
|
||||||
|
generated_roxygen2? ||
|
||||||
|
generated_jison? ||
|
||||||
|
generated_yarn_lock?
|
||||||
end
|
end
|
||||||
|
|
||||||
# Internal: Is the blob an Xcode file?
|
# Internal: Is the blob an Xcode file?
|
||||||
@@ -94,6 +111,35 @@ module Linguist
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Internal: Does the blob contain a source map reference?
|
||||||
|
#
|
||||||
|
# We assume that if one of the last 2 lines starts with a source map
|
||||||
|
# reference, then the current file was generated from other files.
|
||||||
|
#
|
||||||
|
# We use the last 2 lines because the last line might be empty.
|
||||||
|
#
|
||||||
|
# We only handle JavaScript, no CSS support yet.
|
||||||
|
#
|
||||||
|
# Returns true or false.
|
||||||
|
def has_source_map?
|
||||||
|
return false unless extname.downcase == '.js'
|
||||||
|
lines.last(2).any? { |line| line.start_with?('//# sourceMappingURL') }
|
||||||
|
end
|
||||||
|
|
||||||
|
# Internal: Is the blob a generated source map?
|
||||||
|
#
|
||||||
|
# Source Maps usually have .css.map or .js.map extensions. In case they
|
||||||
|
# are not following the name convention, detect them based on the content.
|
||||||
|
#
|
||||||
|
# Returns true or false.
|
||||||
|
def source_map?
|
||||||
|
return false unless extname.downcase == '.map'
|
||||||
|
|
||||||
|
name =~ /(\.css|\.js)\.map$/i || # Name convention
|
||||||
|
lines[0] =~ /^{"version":\d+,/ || # Revision 2 and later begin with the version number
|
||||||
|
lines[0] =~ /^\/\*\* Begin line maps\. \*\*\/{/ # Revision 1 begins with a magic comment
|
||||||
|
end
|
||||||
|
|
||||||
# Internal: Is the blob of JS generated by CoffeeScript?
|
# Internal: Is the blob of JS generated by CoffeeScript?
|
||||||
#
|
#
|
||||||
# CoffeeScript is meant to output JS that would be difficult to
|
# CoffeeScript is meant to output JS that would be difficult to
|
||||||
@@ -162,6 +208,17 @@ module Linguist
|
|||||||
name.downcase =~ /\.designer\.cs$/
|
name.downcase =~ /\.designer\.cs$/
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Internal: Is this a codegen file for Specflow feature file?
|
||||||
|
#
|
||||||
|
# Visual Studio's SpecFlow extension generates *.feature.cs files
|
||||||
|
# from *.feature files, they are not meant to be consumed by humans.
|
||||||
|
# Let's hide them.
|
||||||
|
#
|
||||||
|
# Returns true or false
|
||||||
|
def generated_net_specflow_feature_file?
|
||||||
|
name.downcase =~ /\.feature\.cs$/
|
||||||
|
end
|
||||||
|
|
||||||
# Internal: Is the blob of JS a parser generated by PEG.js?
|
# Internal: Is the blob of JS a parser generated by PEG.js?
|
||||||
#
|
#
|
||||||
# PEG.js-generated parsers are not meant to be consumed by humans.
|
# PEG.js-generated parsers are not meant to be consumed by humans.
|
||||||
@@ -202,17 +259,47 @@ module Linguist
|
|||||||
creator.include?("ImageMagick")
|
creator.include?("ImageMagick")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def generated_go?
|
||||||
|
return false unless extname == '.go'
|
||||||
|
return false unless lines.count > 1
|
||||||
|
|
||||||
|
return lines[0].include?("Code generated by")
|
||||||
|
end
|
||||||
|
|
||||||
|
PROTOBUF_EXTENSIONS = ['.py', '.java', '.h', '.cc', '.cpp']
|
||||||
|
|
||||||
# Internal: Is the blob a C++, Java or Python source file generated by the
|
# Internal: Is the blob a C++, Java or Python source file generated by the
|
||||||
# Protocol Buffer compiler?
|
# Protocol Buffer compiler?
|
||||||
#
|
#
|
||||||
# Returns true of false.
|
# Returns true of false.
|
||||||
def generated_protocol_buffer?
|
def generated_protocol_buffer?
|
||||||
return false unless ['.py', '.java', '.h', '.cc', '.cpp'].include?(extname)
|
return false unless PROTOBUF_EXTENSIONS.include?(extname)
|
||||||
return false unless lines.count > 1
|
return false unless lines.count > 1
|
||||||
|
|
||||||
return lines[0].include?("Generated by the protocol buffer compiler. DO NOT EDIT!")
|
return lines[0].include?("Generated by the protocol buffer compiler. DO NOT EDIT!")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Internal: Is the blob a Javascript source file generated by the
|
||||||
|
# Protocol Buffer compiler?
|
||||||
|
#
|
||||||
|
# Returns true of false.
|
||||||
|
def generated_javascript_protocol_buffer?
|
||||||
|
return false unless extname == ".js"
|
||||||
|
return false unless lines.count > 6
|
||||||
|
|
||||||
|
return lines[5].include?("GENERATED CODE -- DO NOT EDIT!")
|
||||||
|
end
|
||||||
|
|
||||||
|
APACHE_THRIFT_EXTENSIONS = ['.rb', '.py', '.go', '.js', '.m', '.java', '.h', '.cc', '.cpp', '.php']
|
||||||
|
|
||||||
|
# Internal: Is the blob generated by Apache Thrift compiler?
|
||||||
|
#
|
||||||
|
# Returns true or false
|
||||||
|
def generated_apache_thrift?
|
||||||
|
return false unless APACHE_THRIFT_EXTENSIONS.include?(extname)
|
||||||
|
return lines.first(6).any? { |l| l.include?("Autogenerated by Thrift Compiler") }
|
||||||
|
end
|
||||||
|
|
||||||
# Internal: Is the blob a C/C++ header generated by the Java JNI tool javah?
|
# Internal: Is the blob a C/C++ header generated by the Java JNI tool javah?
|
||||||
#
|
#
|
||||||
# Returns true of false.
|
# Returns true of false.
|
||||||
@@ -231,6 +318,21 @@ module Linguist
|
|||||||
!!name.match(/node_modules\//)
|
!!name.match(/node_modules\//)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Internal: Is the blob part of the Go vendor/ tree,
|
||||||
|
# not meant for humans in pull requests.
|
||||||
|
#
|
||||||
|
# Returns true or false.
|
||||||
|
def go_vendor?
|
||||||
|
!!name.match(/vendor\/((?!-)[-0-9A-Za-z]+(?<!-)\.)+(com|edu|gov|in|me|net|org|fm|io)/)
|
||||||
|
end
|
||||||
|
|
||||||
|
# Internal: Is the blob a generated npm shrinkwrap file?
|
||||||
|
#
|
||||||
|
# Returns true or false.
|
||||||
|
def npm_shrinkwrap?
|
||||||
|
!!name.match(/npm-shrinkwrap\.json/)
|
||||||
|
end
|
||||||
|
|
||||||
# Internal: Is the blob part of Godeps/,
|
# Internal: Is the blob part of Godeps/,
|
||||||
# which are not meant for humans in pull requests.
|
# which are not meant for humans in pull requests.
|
||||||
#
|
#
|
||||||
@@ -246,7 +348,7 @@ module Linguist
|
|||||||
!!name.match(/composer\.lock/)
|
!!name.match(/composer\.lock/)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Internal: Is the blob a generated by Zephir
|
# Internal: Is the blob generated by Zephir?
|
||||||
#
|
#
|
||||||
# Returns true or false.
|
# Returns true or false.
|
||||||
def generated_by_zephir?
|
def generated_by_zephir?
|
||||||
@@ -262,5 +364,130 @@ module Linguist
|
|||||||
# VCR Cassettes have "recorded_with: VCR" in the second last line.
|
# VCR Cassettes have "recorded_with: VCR" in the second last line.
|
||||||
return lines[-2].include?("recorded_with: VCR")
|
return lines[-2].include?("recorded_with: VCR")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Internal: Is this a compiled C/C++ file from Cython?
|
||||||
|
#
|
||||||
|
# Cython-compiled C/C++ files typically contain:
|
||||||
|
# /* Generated by Cython x.x.x on ... */
|
||||||
|
# on the first line.
|
||||||
|
#
|
||||||
|
# Return true or false
|
||||||
|
def compiled_cython_file?
|
||||||
|
return false unless ['.c', '.cpp'].include? extname
|
||||||
|
return false unless lines.count > 1
|
||||||
|
return lines[0].include?("Generated by Cython")
|
||||||
|
end
|
||||||
|
|
||||||
|
# Internal: Is it a KiCAD or GFortran module file?
|
||||||
|
#
|
||||||
|
# KiCAD module files contain:
|
||||||
|
# PCBNEW-LibModule-V1 yyyy-mm-dd h:mm:ss XM
|
||||||
|
# on the first line.
|
||||||
|
#
|
||||||
|
# GFortran module files contain:
|
||||||
|
# GFORTRAN module version 'x' created from
|
||||||
|
# on the first line.
|
||||||
|
#
|
||||||
|
# Return true of false
|
||||||
|
def generated_module?
|
||||||
|
return false unless extname == '.mod'
|
||||||
|
return false unless lines.count > 1
|
||||||
|
return lines[0].include?("PCBNEW-LibModule-V") ||
|
||||||
|
lines[0].include?("GFORTRAN module version '")
|
||||||
|
end
|
||||||
|
|
||||||
|
# Internal: Is this a metadata file from Unity3D?
|
||||||
|
#
|
||||||
|
# Unity3D Meta files start with:
|
||||||
|
# fileFormatVersion: X
|
||||||
|
# guid: XXXXXXXXXXXXXXX
|
||||||
|
#
|
||||||
|
# Return true or false
|
||||||
|
def generated_unity3d_meta?
|
||||||
|
return false unless extname == '.meta'
|
||||||
|
return false unless lines.count > 1
|
||||||
|
return lines[0].include?("fileFormatVersion: ")
|
||||||
|
end
|
||||||
|
|
||||||
|
# Internal: Is this a Racc-generated file?
|
||||||
|
#
|
||||||
|
# A Racc-generated file contains:
|
||||||
|
# # This file is automatically generated by Racc x.y.z
|
||||||
|
# on the third line.
|
||||||
|
#
|
||||||
|
# Return true or false
|
||||||
|
def generated_racc?
|
||||||
|
return false unless extname == '.rb'
|
||||||
|
return false unless lines.count > 2
|
||||||
|
return lines[2].start_with?("# This file is automatically generated by Racc")
|
||||||
|
end
|
||||||
|
|
||||||
|
# Internal: Is this a JFlex-generated file?
|
||||||
|
#
|
||||||
|
# A JFlex-generated file contains:
|
||||||
|
# /* The following code was generated by JFlex x.y.z on d/at/e ti:me */
|
||||||
|
# on the first line.
|
||||||
|
#
|
||||||
|
# Return true or false
|
||||||
|
def generated_jflex?
|
||||||
|
return false unless extname == '.java'
|
||||||
|
return false unless lines.count > 1
|
||||||
|
return lines[0].start_with?("/* The following code was generated by JFlex ")
|
||||||
|
end
|
||||||
|
|
||||||
|
# Internal: Is this a GrammarKit-generated file?
|
||||||
|
#
|
||||||
|
# A GrammarKit-generated file typically contain:
|
||||||
|
# // This is a generated file. Not intended for manual editing.
|
||||||
|
# on the first line. This is not always the case, as it's possible to
|
||||||
|
# customize the class header.
|
||||||
|
#
|
||||||
|
# Return true or false
|
||||||
|
def generated_grammarkit?
|
||||||
|
return false unless extname == '.java'
|
||||||
|
return false unless lines.count > 1
|
||||||
|
return lines[0].start_with?("// This is a generated file. Not intended for manual editing.")
|
||||||
|
end
|
||||||
|
|
||||||
|
# Internal: Is this a roxygen2-generated file?
|
||||||
|
#
|
||||||
|
# A roxygen2-generated file typically contain:
|
||||||
|
# % Generated by roxygen2: do not edit by hand
|
||||||
|
# on the first line.
|
||||||
|
#
|
||||||
|
# Return true or false
|
||||||
|
def generated_roxygen2?
|
||||||
|
return false unless extname == '.Rd'
|
||||||
|
return false unless lines.count > 1
|
||||||
|
|
||||||
|
return lines[0].include?("% Generated by roxygen2: do not edit by hand")
|
||||||
|
end
|
||||||
|
|
||||||
|
# Internal: Is this a Jison-generated file?
|
||||||
|
#
|
||||||
|
# Jison-generated parsers typically contain:
|
||||||
|
# /* parser generated by jison
|
||||||
|
# on the first line.
|
||||||
|
#
|
||||||
|
# Jison-generated lexers typically contain:
|
||||||
|
# /* generated by jison-lex
|
||||||
|
# on the first line.
|
||||||
|
#
|
||||||
|
# Return true or false
|
||||||
|
def generated_jison?
|
||||||
|
return false unless extname == '.js'
|
||||||
|
return false unless lines.count > 1
|
||||||
|
return lines[0].start_with?("/* parser generated by jison ") ||
|
||||||
|
lines[0].start_with?("/* generated by jison-lex ")
|
||||||
|
end
|
||||||
|
|
||||||
|
# Internal: Is the blob a generated yarn lockfile?
|
||||||
|
#
|
||||||
|
# Returns true or false.
|
||||||
|
def generated_yarn_lock?
|
||||||
|
return false unless name.match(/yarn\.lock/)
|
||||||
|
return false unless lines.count > 0
|
||||||
|
return lines[0].include?("# THIS IS AN AUTOGENERATED FILE")
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,6 +1,3 @@
|
|||||||
# Note: This file is included in the github-linguist-grammars gem, not the
|
|
||||||
# github-linguist gem.
|
|
||||||
|
|
||||||
module Linguist
|
module Linguist
|
||||||
module Grammars
|
module Grammars
|
||||||
# Get the path to the directory containing the language grammar JSON files.
|
# Get the path to the directory containing the language grammar JSON files.
|
||||||
|
|||||||
@@ -13,11 +13,14 @@ module Linguist
|
|||||||
# ])
|
# ])
|
||||||
#
|
#
|
||||||
# Returns an Array of languages, or empty if none matched or were inconclusive.
|
# Returns an Array of languages, or empty if none matched or were inconclusive.
|
||||||
def self.call(blob, languages)
|
def self.call(blob, candidates)
|
||||||
data = blob.data
|
data = blob.data
|
||||||
|
|
||||||
@heuristics.each do |heuristic|
|
@heuristics.each do |heuristic|
|
||||||
return Array(heuristic.call(data)) if heuristic.matches?(languages)
|
if heuristic.matches?(blob.name)
|
||||||
|
languages = Array(heuristic.call(data))
|
||||||
|
return languages if languages.any? || languages.all? { |l| candidates.include?(l) }
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
[] # No heuristics matched
|
[] # No heuristics matched
|
||||||
@@ -30,30 +33,31 @@ module Linguist
|
|||||||
#
|
#
|
||||||
# Examples
|
# Examples
|
||||||
#
|
#
|
||||||
# disambiguate "Perl", "Prolog" do |data|
|
# disambiguate ".pm" do |data|
|
||||||
# if data.include?("use strict")
|
# if data.include?("use strict")
|
||||||
# Language["Perl"]
|
# Language["Perl"]
|
||||||
# elsif data.include?(":-")
|
# elsif /^[^#]+:-/.match(data)
|
||||||
# Language["Prolog"]
|
# Language["Prolog"]
|
||||||
# end
|
# end
|
||||||
# end
|
# end
|
||||||
#
|
#
|
||||||
def self.disambiguate(*languages, &heuristic)
|
def self.disambiguate(*extensions, &heuristic)
|
||||||
@heuristics << new(languages, &heuristic)
|
@heuristics << new(extensions, &heuristic)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Internal: Array of defined heuristics
|
# Internal: Array of defined heuristics
|
||||||
@heuristics = []
|
@heuristics = []
|
||||||
|
|
||||||
# Internal
|
# Internal
|
||||||
def initialize(languages, &heuristic)
|
def initialize(extensions, &heuristic)
|
||||||
@languages = languages
|
@extensions = extensions
|
||||||
@heuristic = heuristic
|
@heuristic = heuristic
|
||||||
end
|
end
|
||||||
|
|
||||||
# Internal: Check if this heuristic matches the candidate languages.
|
# Internal: Check if this heuristic matches the candidate languages.
|
||||||
def matches?(candidates)
|
def matches?(filename)
|
||||||
candidates.all? { |l| @languages.include?(l.name) }
|
filename = filename.downcase
|
||||||
|
@extensions.any? { |ext| filename.end_with?(ext) }
|
||||||
end
|
end
|
||||||
|
|
||||||
# Internal: Perform the heuristic
|
# Internal: Perform the heuristic
|
||||||
@@ -61,43 +65,43 @@ module Linguist
|
|||||||
@heuristic.call(data)
|
@heuristic.call(data)
|
||||||
end
|
end
|
||||||
|
|
||||||
disambiguate "Objective-C", "C++", "C" do |data|
|
# Common heuristics
|
||||||
if (/@(interface|class|protocol|property|end|synchronised|selector|implementation)\b/.match(data))
|
ObjectiveCRegex = /^\s*(@(interface|class|protocol|property|end|synchronised|selector|implementation)\b|#import\s+.+\.h[">])/
|
||||||
Language["Objective-C"]
|
|
||||||
elsif (/^\s*#\s*include <(cstdint|string|vector|map|list|array|bitset|queue|stack|forward_list|unordered_map|unordered_set|(i|o|io)stream)>/.match(data) ||
|
disambiguate ".asc" do |data|
|
||||||
/^\s*template\s*</.match(data) || /^[^@]class\s+\w+/.match(data) || /^[^@](private|public|protected):$/.match(data) || /std::.+$/.match(data))
|
if /^(----[- ]BEGIN|ssh-(rsa|dss)) /.match(data)
|
||||||
Language["C++"]
|
Language["Public Key"]
|
||||||
|
elsif /^[=-]+(\s|\n)|{{[A-Za-z]/.match(data)
|
||||||
|
Language["AsciiDoc"]
|
||||||
|
elsif /^(\/\/.+|((import|export)\s+)?(function|int|float|char)\s+((room|repeatedly|on|game)_)?([A-Za-z]+[A-Za-z_0-9]+)\s*[;\(])/.match(data)
|
||||||
|
Language["AGS Script"]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
disambiguate "Perl", "Perl6", "Prolog" do |data|
|
disambiguate ".bb" do |data|
|
||||||
if data.include?("use v6")
|
if /^\s*; /.match(data) || data.include?("End Function")
|
||||||
Language["Perl6"]
|
Language["BlitzBasic"]
|
||||||
elsif data.include?("use strict")
|
elsif /^\s*(# |include|require)\b/.match(data)
|
||||||
Language["Perl"]
|
Language["BitBake"]
|
||||||
elsif data.include?(":-")
|
|
||||||
Language["Prolog"]
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
disambiguate "ECL", "Prolog" do |data|
|
disambiguate ".builds" do |data|
|
||||||
if data.include?(":-")
|
if /^(\s*)(<Project|<Import|<Property|<?xml|xmlns)/i.match(data)
|
||||||
Language["Prolog"]
|
Language["XML"]
|
||||||
elsif data.include?(":=")
|
|
||||||
Language["ECL"]
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
disambiguate "IDL", "Prolog" do |data|
|
|
||||||
if data.include?(":-")
|
|
||||||
Language["Prolog"]
|
|
||||||
else
|
else
|
||||||
Language["IDL"]
|
Language["Text"]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
disambiguate "Common Lisp", "OpenCL", "Cool" do |data|
|
disambiguate ".ch" do |data|
|
||||||
if data.include?("(defun ")
|
if /^\s*#\s*(if|ifdef|ifndef|define|command|xcommand|translate|xtranslate|include|pragma|undef)\b/i.match(data)
|
||||||
|
Language["xBase"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
disambiguate ".cl" do |data|
|
||||||
|
if /^\s*\((defun|in-package|defpackage) /i.match(data)
|
||||||
Language["Common Lisp"]
|
Language["Common Lisp"]
|
||||||
elsif /^class/x.match(data)
|
elsif /^class/x.match(data)
|
||||||
Language["Cool"]
|
Language["Cool"]
|
||||||
@@ -106,49 +110,122 @@ module Linguist
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
disambiguate "Hack", "PHP" do |data|
|
disambiguate ".cls" do |data|
|
||||||
if data.include?("<?hh")
|
if /\\\w+{/.match(data)
|
||||||
Language["Hack"]
|
Language["TeX"]
|
||||||
elsif /<?[^h]/.match(data)
|
|
||||||
Language["PHP"]
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
disambiguate "Scala", "SuperCollider" do |data|
|
disambiguate ".cs" do |data|
|
||||||
if /\^(this|super)\./.match(data) || /^\s*(\+|\*)\s*\w+\s*{/.match(data) || /^\s*~\w+\s*=\./.match(data)
|
if /![\w\s]+methodsFor: /.match(data)
|
||||||
Language["SuperCollider"]
|
Language["Smalltalk"]
|
||||||
elsif /^\s*import (scala|java)\./.match(data) || /^\s*val\s+\w+\s*=/.match(data) || /^\s*class\b/.match(data)
|
elsif /^\s*namespace\s*[\w\.]+\s*{/.match(data) || /^\s*\/\//.match(data)
|
||||||
Language["Scala"]
|
Language["C#"]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
disambiguate "AsciiDoc", "AGS Script" do |data|
|
disambiguate ".d" do |data|
|
||||||
Language["AsciiDoc"] if /^=+(\s|\n)/.match(data)
|
if /^module /.match(data)
|
||||||
|
Language["D"]
|
||||||
|
elsif /^((dtrace:::)?BEGIN|provider |#pragma (D (option|attributes)|ident)\s)/.match(data)
|
||||||
|
Language["DTrace"]
|
||||||
|
elsif /(\/.*:( .* \\)$| : \\$|^ : |: \\$)/.match(data)
|
||||||
|
Language["Makefile"]
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
disambiguate "FORTRAN", "Forth" do |data|
|
disambiguate ".ecl" do |data|
|
||||||
|
if /^[^#]+:-/.match(data)
|
||||||
|
Language["ECLiPSe"]
|
||||||
|
elsif data.include?(":=")
|
||||||
|
Language["ECL"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
disambiguate ".es" do |data|
|
||||||
|
if /^\s*(?:%%|main\s*\(.*?\)\s*->)/.match(data)
|
||||||
|
Language["Erlang"]
|
||||||
|
elsif /(?:\/\/|("|')use strict\1|export\s+default\s|\/\*.*?\*\/)/m.match(data)
|
||||||
|
Language["JavaScript"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
fortran_rx = /^([c*][^abd-z]| (subroutine|program|end|data)\s|\s*!)/i
|
||||||
|
|
||||||
|
disambiguate ".f" do |data|
|
||||||
if /^: /.match(data)
|
if /^: /.match(data)
|
||||||
Language["Forth"]
|
Language["Forth"]
|
||||||
elsif /^([c*][^a-z]| subroutine\s)/i.match(data)
|
elsif data.include?("flowop")
|
||||||
|
Language["Filebench WML"]
|
||||||
|
elsif fortran_rx.match(data)
|
||||||
Language["FORTRAN"]
|
Language["FORTRAN"]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
disambiguate "F#", "Forth", "GLSL" do |data|
|
disambiguate ".for" do |data|
|
||||||
if /^(: |new-device)/.match(data)
|
if /^: /.match(data)
|
||||||
Language["Forth"]
|
Language["Forth"]
|
||||||
elsif /^(#light|import|let|module|namespace|open|type)/.match(data)
|
elsif fortran_rx.match(data)
|
||||||
Language["F#"]
|
Language["FORTRAN"]
|
||||||
elsif /^(#include|#pragma|precision|uniform|varying|void)/.match(data)
|
|
||||||
Language["GLSL"]
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
disambiguate "Gosu", "JavaScript" do |data|
|
disambiguate ".fr" do |data|
|
||||||
|
if /^(: |also |new-device|previous )/.match(data)
|
||||||
|
Language["Forth"]
|
||||||
|
elsif /^\s*(import|module|package|data|type) /.match(data)
|
||||||
|
Language["Frege"]
|
||||||
|
else
|
||||||
|
Language["Text"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
disambiguate ".fs" do |data|
|
||||||
|
if /^(: |new-device)/.match(data)
|
||||||
|
Language["Forth"]
|
||||||
|
elsif /^\s*(#light|import|let|module|namespace|open|type)/.match(data)
|
||||||
|
Language["F#"]
|
||||||
|
elsif /^\s*(#version|precision|uniform|varying|vec[234])/.match(data)
|
||||||
|
Language["GLSL"]
|
||||||
|
elsif /#include|#pragma\s+(rs|version)|__attribute__/.match(data)
|
||||||
|
Language["Filterscript"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
disambiguate ".gs" do |data|
|
||||||
Language["Gosu"] if /^uses java\./.match(data)
|
Language["Gosu"] if /^uses java\./.match(data)
|
||||||
end
|
end
|
||||||
|
|
||||||
disambiguate "LoomScript", "LiveScript" do |data|
|
disambiguate ".h" do |data|
|
||||||
|
if ObjectiveCRegex.match(data)
|
||||||
|
Language["Objective-C"]
|
||||||
|
elsif (/^\s*#\s*include <(cstdint|string|vector|map|list|array|bitset|queue|stack|forward_list|unordered_map|unordered_set|(i|o|io)stream)>/.match(data) ||
|
||||||
|
/^\s*template\s*</.match(data) || /^[ \t]*try/.match(data) || /^[ \t]*catch\s*\(/.match(data) || /^[ \t]*(class|(using[ \t]+)?namespace)\s+\w+/.match(data) || /^[ \t]*(private|public|protected):$/.match(data) || /std::\w+/.match(data))
|
||||||
|
Language["C++"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
disambiguate ".inc" do |data|
|
||||||
|
if /^<\?(?:php)?/.match(data)
|
||||||
|
Language["PHP"]
|
||||||
|
elsif /^\s*#(declare|local|macro|while)\s/.match(data)
|
||||||
|
Language["POV-Ray SDL"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
disambiguate ".l" do |data|
|
||||||
|
if /\(def(un|macro)\s/.match(data)
|
||||||
|
Language["Common Lisp"]
|
||||||
|
elsif /^(%[%{}]xs|<.*>)/.match(data)
|
||||||
|
Language["Lex"]
|
||||||
|
elsif /^\.[a-z][a-z](\s|$)/i.match(data)
|
||||||
|
Language["Groff"]
|
||||||
|
elsif /^\((de|class|rel|code|data|must)\s/.match(data)
|
||||||
|
Language["PicoLisp"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
disambiguate ".ls" do |data|
|
||||||
if /^\s*package\s*[\w\.\/\*\s]*\s*{/.match(data)
|
if /^\s*package\s*[\w\.\/\*\s]*\s*{/.match(data)
|
||||||
Language["LoomScript"]
|
Language["LoomScript"]
|
||||||
else
|
else
|
||||||
@@ -156,5 +233,247 @@ module Linguist
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
disambiguate ".lsp", ".lisp" do |data|
|
||||||
|
if /^\s*\((defun|in-package|defpackage) /i.match(data)
|
||||||
|
Language["Common Lisp"]
|
||||||
|
elsif /^\s*\(define /.match(data)
|
||||||
|
Language["NewLisp"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
disambiguate ".m" do |data|
|
||||||
|
if ObjectiveCRegex.match(data)
|
||||||
|
Language["Objective-C"]
|
||||||
|
elsif data.include?(":- module")
|
||||||
|
Language["Mercury"]
|
||||||
|
elsif /^: /.match(data)
|
||||||
|
Language["MUF"]
|
||||||
|
elsif /^\s*;/.match(data)
|
||||||
|
Language["M"]
|
||||||
|
elsif /\*\)$/.match(data)
|
||||||
|
Language["Mathematica"]
|
||||||
|
elsif /^\s*%/.match(data)
|
||||||
|
Language["Matlab"]
|
||||||
|
elsif /^\w+\s*:\s*module\s*{/.match(data)
|
||||||
|
Language["Limbo"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
disambiguate ".md" do |data|
|
||||||
|
if /(^[-a-z0-9=#!\*\[|>])|<\//i.match(data) || data.empty?
|
||||||
|
Language["Markdown"]
|
||||||
|
elsif /^(;;|\(define_)/.match(data)
|
||||||
|
Language["GCC machine description"]
|
||||||
|
else
|
||||||
|
Language["Markdown"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
disambiguate ".ml" do |data|
|
||||||
|
if /(^\s*module)|let rec |match\s+(\S+\s)+with/.match(data)
|
||||||
|
Language["OCaml"]
|
||||||
|
elsif /=> |case\s+(\S+\s)+of/.match(data)
|
||||||
|
Language["Standard ML"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
disambiguate ".mod" do |data|
|
||||||
|
if data.include?('<!ENTITY ')
|
||||||
|
Language["XML"]
|
||||||
|
elsif /^\s*MODULE [\w\.]+;/i.match(data) || /^\s*END [\w\.]+;/i.match(data)
|
||||||
|
Language["Modula-2"]
|
||||||
|
else
|
||||||
|
[Language["Linux Kernel Module"], Language["AMPL"]]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
disambiguate ".ms" do |data|
|
||||||
|
if /^[.'][a-z][a-z](\s|$)/i.match(data)
|
||||||
|
Language["Groff"]
|
||||||
|
elsif /(?<!\S)\.(include|globa?l)\s/.match(data) || /(?<!\/\*)(\A|\n)\s*\.[A-Za-z]/.match(data.gsub(/"([^\\"]|\\.)*"|'([^\\']|\\.)*'|\\\s*(?:--.*)?\n/, ""))
|
||||||
|
Language["GAS"]
|
||||||
|
else
|
||||||
|
Language["MAXScript"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
disambiguate ".n" do |data|
|
||||||
|
if /^[.']/.match(data)
|
||||||
|
Language["Groff"]
|
||||||
|
elsif /^(module|namespace|using)\s/.match(data)
|
||||||
|
Language["Nemerle"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
disambiguate ".ncl" do |data|
|
||||||
|
if data.include?("THE_TITLE")
|
||||||
|
Language["Text"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
disambiguate ".nl" do |data|
|
||||||
|
if /^(b|g)[0-9]+ /.match(data)
|
||||||
|
Language["NL"]
|
||||||
|
else
|
||||||
|
Language["NewLisp"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
disambiguate ".php" do |data|
|
||||||
|
if data.include?("<?hh")
|
||||||
|
Language["Hack"]
|
||||||
|
elsif /<?[^h]/.match(data)
|
||||||
|
Language["PHP"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
disambiguate ".pl" do |data|
|
||||||
|
if /^[^#]*:-/.match(data)
|
||||||
|
Language["Prolog"]
|
||||||
|
elsif /use strict|use\s+v?5\./.match(data)
|
||||||
|
Language["Perl"]
|
||||||
|
elsif /^(use v6|(my )?class|module)/.match(data)
|
||||||
|
Language["Perl6"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
disambiguate ".pm", ".t" do |data|
|
||||||
|
if /use strict|use\s+v?5\./.match(data)
|
||||||
|
Language["Perl"]
|
||||||
|
elsif /^(use v6|(my )?class|module)/.match(data)
|
||||||
|
Language["Perl6"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
disambiguate ".pod" do |data|
|
||||||
|
if /^=\w+$/.match(data)
|
||||||
|
Language["Pod"]
|
||||||
|
else
|
||||||
|
Language["Perl"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
disambiguate ".pro" do |data|
|
||||||
|
if /^[^#]+:-/.match(data)
|
||||||
|
Language["Prolog"]
|
||||||
|
elsif data.include?("last_client=")
|
||||||
|
Language["INI"]
|
||||||
|
elsif data.include?("HEADERS") && data.include?("SOURCES")
|
||||||
|
Language["QMake"]
|
||||||
|
elsif /^\s*function[ \w,]+$/.match(data)
|
||||||
|
Language["IDL"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
disambiguate ".props" do |data|
|
||||||
|
if /^(\s*)(<Project|<Import|<Property|<?xml|xmlns)/i.match(data)
|
||||||
|
Language["XML"]
|
||||||
|
elsif /\w+\s*=\s*/i.match(data)
|
||||||
|
Language["INI"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
disambiguate ".r" do |data|
|
||||||
|
if /\bRebol\b/i.match(data)
|
||||||
|
Language["Rebol"]
|
||||||
|
elsif /<-|^\s*#/.match(data)
|
||||||
|
Language["R"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
disambiguate ".rno" do |data|
|
||||||
|
if /^\.!|^\.end lit(?:eral)?\b/i.match(data)
|
||||||
|
Language["RUNOFF"]
|
||||||
|
elsif /^\.\\" /.match(data)
|
||||||
|
Language["Groff"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
disambiguate ".rpy" do |data|
|
||||||
|
if /(^(import|from|class|def)\s)/m.match(data)
|
||||||
|
Language["Python"]
|
||||||
|
else
|
||||||
|
Language["Ren'Py"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
disambiguate ".rs" do |data|
|
||||||
|
if /^(use |fn |mod |pub |macro_rules|impl|#!?\[)/.match(data)
|
||||||
|
Language["Rust"]
|
||||||
|
elsif /#include|#pragma\s+(rs|version)|__attribute__/.match(data)
|
||||||
|
Language["RenderScript"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
disambiguate ".sc" do |data|
|
||||||
|
if /\^(this|super)\./.match(data) || /^\s*(\+|\*)\s*\w+\s*{/.match(data) || /^\s*~\w+\s*=\./.match(data)
|
||||||
|
Language["SuperCollider"]
|
||||||
|
elsif /^\s*import (scala|java)\./.match(data) || /^\s*val\s+\w+\s*=/.match(data) || /^\s*class\b/.match(data)
|
||||||
|
Language["Scala"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
disambiguate ".sql" do |data|
|
||||||
|
if /^\\i\b|AS \$\$|LANGUAGE '?plpgsql'?/i.match(data) || /SECURITY (DEFINER|INVOKER)/i.match(data) || /BEGIN( WORK| TRANSACTION)?;/i.match(data)
|
||||||
|
#Postgres
|
||||||
|
Language["PLpgSQL"]
|
||||||
|
elsif /(alter module)|(language sql)|(begin( NOT)+ atomic)/i.match(data) || /signal SQLSTATE '[0-9]+'/i.match(data)
|
||||||
|
#IBM db2
|
||||||
|
Language["SQLPL"]
|
||||||
|
elsif /\$\$PLSQL_|XMLTYPE|sysdate|systimestamp|\.nextval|connect by|AUTHID (DEFINER|CURRENT_USER)/i.match(data) || /constructor\W+function/i.match(data)
|
||||||
|
#Oracle
|
||||||
|
Language["PLSQL"]
|
||||||
|
elsif ! /begin|boolean|package|exception/i.match(data)
|
||||||
|
#Generic SQL
|
||||||
|
Language["SQL"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
disambiguate ".srt" do |data|
|
||||||
|
if /^(\d{2}:\d{2}:\d{2},\d{3})\s*(-->)\s*(\d{2}:\d{2}:\d{2},\d{3})$/.match(data)
|
||||||
|
Language["SubRip Text"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
disambiguate ".t" do |data|
|
||||||
|
if /^\s*%|^\s*var\s+\w+\s*:\s*\w+/.match(data)
|
||||||
|
Language["Turing"]
|
||||||
|
elsif /^\s*use\s+v6\s*;/.match(data)
|
||||||
|
Language["Perl6"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
disambiguate ".toc" do |data|
|
||||||
|
if /^## |@no-lib-strip@/.match(data)
|
||||||
|
Language["World of Warcraft Addon Data"]
|
||||||
|
elsif /^\\(contentsline|defcounter|beamer|boolfalse)/.match(data)
|
||||||
|
Language["TeX"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
disambiguate ".ts" do |data|
|
||||||
|
if data.include?("<TS")
|
||||||
|
Language["XML"]
|
||||||
|
else
|
||||||
|
Language["TypeScript"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
disambiguate ".tst" do |data|
|
||||||
|
if (data.include?("gap> "))
|
||||||
|
Language["GAP"]
|
||||||
|
# Heads up - we don't usually write heuristics like this (with no regex match)
|
||||||
|
else
|
||||||
|
Language["Scilab"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
disambiguate ".tsx" do |data|
|
||||||
|
if /^\s*(import.+(from\s+|require\()['"]react|\/\/\/\s*<reference\s)/.match(data)
|
||||||
|
Language["TypeScript"]
|
||||||
|
elsif /^\s*<\?xml\s+version/i.match(data)
|
||||||
|
Language["XML"]
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -11,6 +11,8 @@ require 'linguist/samples'
|
|||||||
require 'linguist/file_blob'
|
require 'linguist/file_blob'
|
||||||
require 'linguist/blob_helper'
|
require 'linguist/blob_helper'
|
||||||
require 'linguist/strategy/filename'
|
require 'linguist/strategy/filename'
|
||||||
|
require 'linguist/strategy/extension'
|
||||||
|
require 'linguist/strategy/modeline'
|
||||||
require 'linguist/shebang'
|
require 'linguist/shebang'
|
||||||
|
|
||||||
module Linguist
|
module Linguist
|
||||||
@@ -19,10 +21,11 @@ module Linguist
|
|||||||
#
|
#
|
||||||
# Languages are defined in `lib/linguist/languages.yml`.
|
# Languages are defined in `lib/linguist/languages.yml`.
|
||||||
class Language
|
class Language
|
||||||
@languages = []
|
@languages = []
|
||||||
@index = {}
|
@index = {}
|
||||||
@name_index = {}
|
@name_index = {}
|
||||||
@alias_index = {}
|
@alias_index = {}
|
||||||
|
@language_id_index = {}
|
||||||
|
|
||||||
@extension_index = Hash.new { |h,k| h[k] = [] }
|
@extension_index = Hash.new { |h,k| h[k] = [] }
|
||||||
@interpreter_index = Hash.new { |h,k| h[k] = [] }
|
@interpreter_index = Hash.new { |h,k| h[k] = [] }
|
||||||
@@ -31,13 +34,6 @@ module Linguist
|
|||||||
# Valid Languages types
|
# Valid Languages types
|
||||||
TYPES = [:data, :markup, :programming, :prose]
|
TYPES = [:data, :markup, :programming, :prose]
|
||||||
|
|
||||||
# Names of non-programming languages that we will still detect
|
|
||||||
#
|
|
||||||
# Returns an array
|
|
||||||
def self.detectable_markup
|
|
||||||
["CSS", "Less", "Sass", "SCSS", "Stylus", "TeX"]
|
|
||||||
end
|
|
||||||
|
|
||||||
# Detect languages by a specific type
|
# Detect languages by a specific type
|
||||||
#
|
#
|
||||||
# type - A symbol that exists within TYPES
|
# type - A symbol that exists within TYPES
|
||||||
@@ -79,7 +75,7 @@ module Linguist
|
|||||||
raise ArgumentError, "Extension is missing a '.': #{extension.inspect}"
|
raise ArgumentError, "Extension is missing a '.': #{extension.inspect}"
|
||||||
end
|
end
|
||||||
|
|
||||||
@extension_index[extension] << language
|
@extension_index[extension.downcase] << language
|
||||||
end
|
end
|
||||||
|
|
||||||
language.interpreters.each do |interpreter|
|
language.interpreters.each do |interpreter|
|
||||||
@@ -90,41 +86,11 @@ module Linguist
|
|||||||
@filename_index[filename] << language
|
@filename_index[filename] << language
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@language_id_index[language.language_id] = language
|
||||||
|
|
||||||
language
|
language
|
||||||
end
|
end
|
||||||
|
|
||||||
STRATEGIES = [
|
|
||||||
Linguist::Strategy::Filename,
|
|
||||||
Linguist::Shebang,
|
|
||||||
Linguist::Heuristics,
|
|
||||||
Linguist::Classifier
|
|
||||||
]
|
|
||||||
|
|
||||||
# Public: Detects the Language of the blob.
|
|
||||||
#
|
|
||||||
# blob - an object that includes the Linguist `BlobHelper` interface;
|
|
||||||
# see Linguist::LazyBlob and Linguist::FileBlob for examples
|
|
||||||
#
|
|
||||||
# Returns Language or nil.
|
|
||||||
def self.detect(blob)
|
|
||||||
# Bail early if the blob is binary or empty.
|
|
||||||
return nil if blob.likely_binary? || blob.binary? || blob.empty?
|
|
||||||
|
|
||||||
# Call each strategy until one candidate is returned.
|
|
||||||
STRATEGIES.reduce([]) do |languages, strategy|
|
|
||||||
candidates = strategy.call(blob, languages)
|
|
||||||
if candidates.size == 1
|
|
||||||
return candidates.first
|
|
||||||
elsif candidates.size > 1
|
|
||||||
# More than one candidate was found, pass them to the next strategy.
|
|
||||||
candidates
|
|
||||||
else
|
|
||||||
# No candiates were found, pass on languages from the previous strategy.
|
|
||||||
languages
|
|
||||||
end
|
|
||||||
end.first
|
|
||||||
end
|
|
||||||
|
|
||||||
# Public: Get all Languages
|
# Public: Get all Languages
|
||||||
#
|
#
|
||||||
# Returns an Array of Languages
|
# Returns an Array of Languages
|
||||||
@@ -143,7 +109,8 @@ module Linguist
|
|||||||
#
|
#
|
||||||
# Returns the Language or nil if none was found.
|
# Returns the Language or nil if none was found.
|
||||||
def self.find_by_name(name)
|
def self.find_by_name(name)
|
||||||
name && @name_index[name.downcase]
|
return nil if name.to_s.empty?
|
||||||
|
name && (@name_index[name.downcase] || @name_index[name.split(',').first.downcase])
|
||||||
end
|
end
|
||||||
|
|
||||||
# Public: Look up Language by one of its aliases.
|
# Public: Look up Language by one of its aliases.
|
||||||
@@ -155,53 +122,54 @@ module Linguist
|
|||||||
# Language.find_by_alias('cpp')
|
# Language.find_by_alias('cpp')
|
||||||
# # => #<Language name="C++">
|
# # => #<Language name="C++">
|
||||||
#
|
#
|
||||||
# Returns the Lexer or nil if none was found.
|
# Returns the Language or nil if none was found.
|
||||||
def self.find_by_alias(name)
|
def self.find_by_alias(name)
|
||||||
name && @alias_index[name.downcase]
|
return nil if name.to_s.empty?
|
||||||
|
name && (@alias_index[name.downcase] || @alias_index[name.split(',').first.downcase])
|
||||||
end
|
end
|
||||||
|
|
||||||
# Public: Look up Languages by filename.
|
# Public: Look up Languages by filename.
|
||||||
#
|
#
|
||||||
|
# The behaviour of this method recently changed.
|
||||||
|
# See the second example below.
|
||||||
|
#
|
||||||
# filename - The path String.
|
# filename - The path String.
|
||||||
#
|
#
|
||||||
# Examples
|
# Examples
|
||||||
#
|
#
|
||||||
|
# Language.find_by_filename('Cakefile')
|
||||||
|
# # => [#<Language name="CoffeeScript">]
|
||||||
# Language.find_by_filename('foo.rb')
|
# Language.find_by_filename('foo.rb')
|
||||||
# # => [#<Language name="Ruby">]
|
# # => []
|
||||||
#
|
#
|
||||||
# Returns all matching Languages or [] if none were found.
|
# Returns all matching Languages or [] if none were found.
|
||||||
def self.find_by_filename(filename)
|
def self.find_by_filename(filename)
|
||||||
basename = File.basename(filename)
|
basename = File.basename(filename)
|
||||||
|
@filename_index[basename]
|
||||||
# find the first extension with language definitions
|
|
||||||
extname = FileBlob.new(filename).extensions.detect do |e|
|
|
||||||
!@extension_index[e].empty?
|
|
||||||
end
|
|
||||||
|
|
||||||
(@filename_index[basename] + @extension_index[extname]).compact.uniq
|
|
||||||
end
|
end
|
||||||
|
|
||||||
# Public: Look up Languages by file extension.
|
# Public: Look up Languages by file extension.
|
||||||
#
|
#
|
||||||
# extname - The extension String.
|
# The behaviour of this method recently changed.
|
||||||
|
# See the second example below.
|
||||||
|
#
|
||||||
|
# filename - The path String.
|
||||||
#
|
#
|
||||||
# Examples
|
# Examples
|
||||||
#
|
#
|
||||||
# Language.find_by_extension('.rb')
|
# Language.find_by_extension('dummy.rb')
|
||||||
# # => [#<Language name="Ruby">]
|
# # => [#<Language name="Ruby">]
|
||||||
#
|
|
||||||
# Language.find_by_extension('rb')
|
# Language.find_by_extension('rb')
|
||||||
# # => [#<Language name="Ruby">]
|
# # => []
|
||||||
#
|
#
|
||||||
# Returns all matching Languages or [] if none were found.
|
# Returns all matching Languages or [] if none were found.
|
||||||
def self.find_by_extension(extname)
|
def self.find_by_extension(filename)
|
||||||
extname = ".#{extname}" unless extname.start_with?(".")
|
# find the first extension with language definitions
|
||||||
@extension_index[extname]
|
extname = FileBlob.new(filename.downcase).extensions.detect do |e|
|
||||||
end
|
!@extension_index[e].empty?
|
||||||
|
end
|
||||||
|
|
||||||
# DEPRECATED
|
@extension_index[extname]
|
||||||
def self.find_by_shebang(data)
|
|
||||||
@interpreter_index[Shebang.interpreter(data)]
|
|
||||||
end
|
end
|
||||||
|
|
||||||
# Public: Look up Languages by interpreter.
|
# Public: Look up Languages by interpreter.
|
||||||
@@ -218,8 +186,21 @@ module Linguist
|
|||||||
@interpreter_index[interpreter]
|
@interpreter_index[interpreter]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Public: Look up Languages by its language_id.
|
||||||
|
#
|
||||||
|
# language_id - Integer of language_id
|
||||||
|
#
|
||||||
|
# Examples
|
||||||
|
#
|
||||||
|
# Language.find_by_id(100)
|
||||||
|
# # => [#<Language name="Elixir">]
|
||||||
|
#
|
||||||
|
# Returns the matching Language
|
||||||
|
def self.find_by_id(language_id)
|
||||||
|
@language_id_index[language_id.to_i]
|
||||||
|
end
|
||||||
|
|
||||||
# Public: Look up Language by its name or lexer.
|
# Public: Look up Language by its name.
|
||||||
#
|
#
|
||||||
# name - The String name of the Language
|
# name - The String name of the Language
|
||||||
#
|
#
|
||||||
@@ -233,7 +214,15 @@ module Linguist
|
|||||||
#
|
#
|
||||||
# Returns the Language or nil if none was found.
|
# Returns the Language or nil if none was found.
|
||||||
def self.[](name)
|
def self.[](name)
|
||||||
name && @index[name.downcase]
|
return nil if name.to_s.empty?
|
||||||
|
|
||||||
|
lang = @index[name.downcase]
|
||||||
|
return lang if lang
|
||||||
|
|
||||||
|
name = name.split(',').first
|
||||||
|
return nil if name.to_s.empty?
|
||||||
|
|
||||||
|
@index[name.downcase]
|
||||||
end
|
end
|
||||||
|
|
||||||
# Public: A List of popular languages
|
# Public: A List of popular languages
|
||||||
@@ -243,7 +232,7 @@ module Linguist
|
|||||||
#
|
#
|
||||||
# This list is configured in "popular.yml".
|
# This list is configured in "popular.yml".
|
||||||
#
|
#
|
||||||
# Returns an Array of Lexers.
|
# Returns an Array of Languages.
|
||||||
def self.popular
|
def self.popular
|
||||||
@popular ||= all.select(&:popular?).sort_by { |lang| lang.name.downcase }
|
@popular ||= all.select(&:popular?).sort_by { |lang| lang.name.downcase }
|
||||||
end
|
end
|
||||||
@@ -255,7 +244,7 @@ module Linguist
|
|||||||
#
|
#
|
||||||
# This list is created from all the languages not listed in "popular.yml".
|
# This list is created from all the languages not listed in "popular.yml".
|
||||||
#
|
#
|
||||||
# Returns an Array of Lexers.
|
# Returns an Array of Languages.
|
||||||
def self.unpopular
|
def self.unpopular
|
||||||
@unpopular ||= all.select(&:unpopular?).sort_by { |lang| lang.name.downcase }
|
@unpopular ||= all.select(&:unpopular?).sort_by { |lang| lang.name.downcase }
|
||||||
end
|
end
|
||||||
@@ -267,13 +256,6 @@ module Linguist
|
|||||||
@colors ||= all.select(&:color).sort_by { |lang| lang.name.downcase }
|
@colors ||= all.select(&:color).sort_by { |lang| lang.name.downcase }
|
||||||
end
|
end
|
||||||
|
|
||||||
# Public: A List of languages compatible with Ace.
|
|
||||||
#
|
|
||||||
# Returns an Array of Languages.
|
|
||||||
def self.ace_modes
|
|
||||||
@ace_modes ||= all.select(&:ace_mode).sort_by { |lang| lang.name.downcase }
|
|
||||||
end
|
|
||||||
|
|
||||||
# Internal: Initialize a new Language
|
# Internal: Initialize a new Language
|
||||||
#
|
#
|
||||||
# attributes - A hash of attributes
|
# attributes - A hash of attributes
|
||||||
@@ -290,7 +272,7 @@ module Linguist
|
|||||||
@color = attributes[:color]
|
@color = attributes[:color]
|
||||||
|
|
||||||
# Set aliases
|
# Set aliases
|
||||||
@aliases = [default_alias_name] + (attributes[:aliases] || [])
|
@aliases = [default_alias] + (attributes[:aliases] || [])
|
||||||
|
|
||||||
# Load the TextMate scope name or try to guess one
|
# Load the TextMate scope name or try to guess one
|
||||||
@tm_scope = attributes[:tm_scope] || begin
|
@tm_scope = attributes[:tm_scope] || begin
|
||||||
@@ -304,10 +286,12 @@ module Linguist
|
|||||||
end
|
end
|
||||||
|
|
||||||
@ace_mode = attributes[:ace_mode]
|
@ace_mode = attributes[:ace_mode]
|
||||||
|
@codemirror_mode = attributes[:codemirror_mode]
|
||||||
|
@codemirror_mime_type = attributes[:codemirror_mime_type]
|
||||||
@wrap = attributes[:wrap] || false
|
@wrap = attributes[:wrap] || false
|
||||||
|
|
||||||
# Set legacy search term
|
# Set the language_id
|
||||||
@search_term = attributes[:search_term] || default_alias_name
|
@language_id = attributes[:language_id]
|
||||||
|
|
||||||
# Set extensions or default to [].
|
# Set extensions or default to [].
|
||||||
@extensions = attributes[:extensions] || []
|
@extensions = attributes[:extensions] || []
|
||||||
@@ -360,21 +344,16 @@ module Linguist
|
|||||||
# Returns an Array of String names
|
# Returns an Array of String names
|
||||||
attr_reader :aliases
|
attr_reader :aliases
|
||||||
|
|
||||||
# Deprecated: Get code search term
|
# Public: Get language_id (used in GitHub search)
|
||||||
#
|
#
|
||||||
# Examples
|
# Examples
|
||||||
#
|
#
|
||||||
# # => "ruby"
|
# # => "1"
|
||||||
# # => "python"
|
# # => "2"
|
||||||
# # => "perl"
|
# # => "3"
|
||||||
#
|
#
|
||||||
# Returns the name String
|
# Returns the integer language_id
|
||||||
attr_reader :search_term
|
attr_reader :language_id
|
||||||
|
|
||||||
# Public: Get Lexer
|
|
||||||
#
|
|
||||||
# Returns the Lexer
|
|
||||||
attr_reader :lexer
|
|
||||||
|
|
||||||
# Public: Get the name of a TextMate-compatible scope
|
# Public: Get the name of a TextMate-compatible scope
|
||||||
#
|
#
|
||||||
@@ -392,6 +371,31 @@ module Linguist
|
|||||||
# Returns a String name or nil
|
# Returns a String name or nil
|
||||||
attr_reader :ace_mode
|
attr_reader :ace_mode
|
||||||
|
|
||||||
|
# Public: Get CodeMirror mode
|
||||||
|
#
|
||||||
|
# Maps to a directory in the `mode/` source code.
|
||||||
|
# https://github.com/codemirror/CodeMirror/tree/master/mode
|
||||||
|
#
|
||||||
|
# Examples
|
||||||
|
#
|
||||||
|
# # => "nil"
|
||||||
|
# # => "javascript"
|
||||||
|
# # => "clike"
|
||||||
|
#
|
||||||
|
# Returns a String name or nil
|
||||||
|
attr_reader :codemirror_mode
|
||||||
|
|
||||||
|
# Public: Get CodeMirror MIME type mode
|
||||||
|
#
|
||||||
|
# Examples
|
||||||
|
#
|
||||||
|
# # => "nil"
|
||||||
|
# # => "text/x-javascript"
|
||||||
|
# # => "text/x-csrc"
|
||||||
|
#
|
||||||
|
# Returns a String name or nil
|
||||||
|
attr_reader :codemirror_mime_type
|
||||||
|
|
||||||
# Public: Should language lines be wrapped
|
# Public: Should language lines be wrapped
|
||||||
#
|
#
|
||||||
# Returns true or false
|
# Returns true or false
|
||||||
@@ -424,22 +428,6 @@ module Linguist
|
|||||||
# Returns the extensions Array
|
# Returns the extensions Array
|
||||||
attr_reader :filenames
|
attr_reader :filenames
|
||||||
|
|
||||||
# Deprecated: Get primary extension
|
|
||||||
#
|
|
||||||
# Defaults to the first extension but can be overridden
|
|
||||||
# in the languages.yml.
|
|
||||||
#
|
|
||||||
# The primary extension can not be nil. Tests should verify this.
|
|
||||||
#
|
|
||||||
# This method is only used by app/helpers/gists_helper.rb for creating
|
|
||||||
# the language dropdown. It really should be using `name` instead.
|
|
||||||
# Would like to drop primary extension.
|
|
||||||
#
|
|
||||||
# Returns the extension String.
|
|
||||||
def primary_extension
|
|
||||||
extensions.first
|
|
||||||
end
|
|
||||||
|
|
||||||
# Public: Get URL escaped name.
|
# Public: Get URL escaped name.
|
||||||
#
|
#
|
||||||
# Examples
|
# Examples
|
||||||
@@ -453,12 +441,13 @@ module Linguist
|
|||||||
EscapeUtils.escape_url(name).gsub('+', '%20')
|
EscapeUtils.escape_url(name).gsub('+', '%20')
|
||||||
end
|
end
|
||||||
|
|
||||||
# Internal: Get default alias name
|
# Public: Get default alias name
|
||||||
#
|
#
|
||||||
# Returns the alias name String
|
# Returns the alias name String
|
||||||
def default_alias_name
|
def default_alias
|
||||||
name.downcase.gsub(/\s/, '-')
|
name.downcase.gsub(/\s/, '-')
|
||||||
end
|
end
|
||||||
|
alias_method :default_alias_name, :default_alias
|
||||||
|
|
||||||
# Public: Get Language group
|
# Public: Get Language group
|
||||||
#
|
#
|
||||||
@@ -491,16 +480,6 @@ module Linguist
|
|||||||
@searchable
|
@searchable
|
||||||
end
|
end
|
||||||
|
|
||||||
# Public: Highlight syntax of text
|
|
||||||
#
|
|
||||||
# text - String of code to be highlighted
|
|
||||||
# options - A Hash of options (defaults to {})
|
|
||||||
#
|
|
||||||
# Returns html String
|
|
||||||
def colorize(text, options = {})
|
|
||||||
lexer.highlight(text, options)
|
|
||||||
end
|
|
||||||
|
|
||||||
# Public: Return name as String representation
|
# Public: Return name as String representation
|
||||||
def to_s
|
def to_s
|
||||||
name
|
name
|
||||||
@@ -544,8 +523,8 @@ module Linguist
|
|||||||
|
|
||||||
if extnames = extensions[name]
|
if extnames = extensions[name]
|
||||||
extnames.each do |extname|
|
extnames.each do |extname|
|
||||||
if !options['extensions'].include?(extname)
|
if !options['extensions'].index { |x| x.downcase.end_with? extname.downcase }
|
||||||
warn "#{name} has a sample with extension (#{extname}) that isn't explicitly defined in languages.yml" unless extname == '.script!'
|
warn "#{name} has a sample with extension (#{extname.downcase}) that isn't explicitly defined in languages.yml"
|
||||||
options['extensions'] << extname
|
options['extensions'] << extname
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -576,13 +555,14 @@ module Linguist
|
|||||||
:color => options['color'],
|
:color => options['color'],
|
||||||
:type => options['type'],
|
:type => options['type'],
|
||||||
:aliases => options['aliases'],
|
:aliases => options['aliases'],
|
||||||
:lexer => options['lexer'],
|
|
||||||
:tm_scope => options['tm_scope'],
|
:tm_scope => options['tm_scope'],
|
||||||
:ace_mode => options['ace_mode'],
|
:ace_mode => options['ace_mode'],
|
||||||
|
:codemirror_mode => options['codemirror_mode'],
|
||||||
|
:codemirror_mime_type => options['codemirror_mime_type'],
|
||||||
:wrap => options['wrap'],
|
:wrap => options['wrap'],
|
||||||
:group_name => options['group'],
|
:group_name => options['group'],
|
||||||
:searchable => options.fetch('searchable', true),
|
:searchable => options.fetch('searchable', true),
|
||||||
:search_term => options['search_term'],
|
:language_id => options['language_id'],
|
||||||
:extensions => Array(options['extensions']),
|
:extensions => Array(options['extensions']),
|
||||||
:interpreters => options['interpreters'].sort,
|
:interpreters => options['interpreters'].sort,
|
||||||
:filenames => options['filenames'],
|
:filenames => options['filenames'],
|
||||||
|
|||||||
4734
lib/linguist/languages.yml
Normal file → Executable file
4734
lib/linguist/languages.yml
Normal file → Executable file
File diff suppressed because it is too large
Load Diff
@@ -4,7 +4,11 @@ require 'rugged'
|
|||||||
|
|
||||||
module Linguist
|
module Linguist
|
||||||
class LazyBlob
|
class LazyBlob
|
||||||
GIT_ATTR = ['linguist-language', 'linguist-vendored']
|
GIT_ATTR = ['linguist-documentation',
|
||||||
|
'linguist-language',
|
||||||
|
'linguist-vendored',
|
||||||
|
'linguist-generated']
|
||||||
|
|
||||||
GIT_ATTR_OPTS = { :priority => [:index], :skip_system => true }
|
GIT_ATTR_OPTS = { :priority => [:index], :skip_system => true }
|
||||||
GIT_ATTR_FLAGS = Rugged::Repository::Attributes.parse_opts(GIT_ATTR_OPTS)
|
GIT_ATTR_FLAGS = Rugged::Repository::Attributes.parse_opts(GIT_ATTR_OPTS)
|
||||||
|
|
||||||
@@ -14,14 +18,17 @@ module Linguist
|
|||||||
|
|
||||||
attr_reader :repository
|
attr_reader :repository
|
||||||
attr_reader :oid
|
attr_reader :oid
|
||||||
attr_reader :name
|
attr_reader :path
|
||||||
attr_reader :mode
|
attr_reader :mode
|
||||||
|
|
||||||
def initialize(repo, oid, name, mode = nil)
|
alias :name :path
|
||||||
|
|
||||||
|
def initialize(repo, oid, path, mode = nil)
|
||||||
@repository = repo
|
@repository = repo
|
||||||
@oid = oid
|
@oid = oid
|
||||||
@name = name
|
@path = path
|
||||||
@mode = mode
|
@mode = mode
|
||||||
|
@data = nil
|
||||||
end
|
end
|
||||||
|
|
||||||
def git_attributes
|
def git_attributes
|
||||||
@@ -29,11 +36,27 @@ module Linguist
|
|||||||
name, GIT_ATTR, GIT_ATTR_FLAGS)
|
name, GIT_ATTR, GIT_ATTR_FLAGS)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def documentation?
|
||||||
|
if attr = git_attributes['linguist-documentation']
|
||||||
|
boolean_attribute(attr)
|
||||||
|
else
|
||||||
|
super
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def generated?
|
||||||
|
if attr = git_attributes['linguist-generated']
|
||||||
|
boolean_attribute(attr)
|
||||||
|
else
|
||||||
|
super
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def vendored?
|
def vendored?
|
||||||
if attr = git_attributes['linguist-vendored']
|
if attr = git_attributes['linguist-vendored']
|
||||||
return boolean_attribute(attr)
|
return boolean_attribute(attr)
|
||||||
else
|
else
|
||||||
return super
|
super
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -41,7 +64,7 @@ module Linguist
|
|||||||
return @language if defined?(@language)
|
return @language if defined?(@language)
|
||||||
|
|
||||||
@language = if lang = git_attributes['linguist-language']
|
@language = if lang = git_attributes['linguist-language']
|
||||||
Language.find_by_name(lang)
|
Language.find_by_alias(lang)
|
||||||
else
|
else
|
||||||
super
|
super
|
||||||
end
|
end
|
||||||
@@ -57,11 +80,15 @@ module Linguist
|
|||||||
@size
|
@size
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def cleanup!
|
||||||
|
@data.clear if @data
|
||||||
|
end
|
||||||
|
|
||||||
protected
|
protected
|
||||||
|
|
||||||
# Returns true if the attribute is present and not the string "false".
|
# Returns true if the attribute is present and not the string "false".
|
||||||
def boolean_attribute(attr)
|
def boolean_attribute(attribute)
|
||||||
attr != "false"
|
attribute != "false"
|
||||||
end
|
end
|
||||||
|
|
||||||
def load_blob!
|
def load_blob!
|
||||||
|
|||||||
@@ -3,27 +3,27 @@
|
|||||||
# This file should only be edited by GitHub staff
|
# This file should only be edited by GitHub staff
|
||||||
|
|
||||||
- ActionScript
|
- ActionScript
|
||||||
- Bash
|
|
||||||
- C
|
- C
|
||||||
- C#
|
- C#
|
||||||
- C++
|
- C++
|
||||||
- CSS
|
- CSS
|
||||||
- Clojure
|
- Clojure
|
||||||
- CoffeeScript
|
- CoffeeScript
|
||||||
- Common Lisp
|
- Go
|
||||||
- Diff
|
|
||||||
- Emacs Lisp
|
|
||||||
- Erlang
|
|
||||||
- HTML
|
- HTML
|
||||||
- Haskell
|
- Haskell
|
||||||
- Java
|
- Java
|
||||||
- JavaScript
|
- JavaScript
|
||||||
- Lua
|
- Lua
|
||||||
|
- Matlab
|
||||||
- Objective-C
|
- Objective-C
|
||||||
- PHP
|
- PHP
|
||||||
- Perl
|
- Perl
|
||||||
- Python
|
- Python
|
||||||
|
- R
|
||||||
- Ruby
|
- Ruby
|
||||||
- SQL
|
|
||||||
- Scala
|
- Scala
|
||||||
- Scheme
|
- Shell
|
||||||
|
- Swift
|
||||||
|
- TeX
|
||||||
|
- Vim script
|
||||||
|
|||||||
@@ -30,6 +30,9 @@ module Linguist
|
|||||||
@repository = repo
|
@repository = repo
|
||||||
@commit_oid = commit_oid
|
@commit_oid = commit_oid
|
||||||
|
|
||||||
|
@old_commit_oid = nil
|
||||||
|
@old_stats = nil
|
||||||
|
|
||||||
raise TypeError, 'commit_oid must be a commit SHA1' unless commit_oid.is_a?(String)
|
raise TypeError, 'commit_oid must be a commit SHA1' unless commit_oid.is_a?(String)
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -126,12 +129,13 @@ module Linguist
|
|||||||
end
|
end
|
||||||
|
|
||||||
protected
|
protected
|
||||||
|
MAX_TREE_SIZE = 100_000
|
||||||
|
|
||||||
def compute_stats(old_commit_oid, cache = nil)
|
def compute_stats(old_commit_oid, cache = nil)
|
||||||
|
return {} if current_tree.count_recursive(MAX_TREE_SIZE) >= MAX_TREE_SIZE
|
||||||
|
|
||||||
old_tree = old_commit_oid && Rugged::Commit.lookup(repository, old_commit_oid).tree
|
old_tree = old_commit_oid && Rugged::Commit.lookup(repository, old_commit_oid).tree
|
||||||
|
|
||||||
read_index
|
read_index
|
||||||
|
|
||||||
diff = Rugged::Tree.diff(repository, old_tree, current_tree)
|
diff = Rugged::Tree.diff(repository, old_tree, current_tree)
|
||||||
|
|
||||||
# Clear file map and fetch full diff if any .gitattributes files are changed
|
# Clear file map and fetch full diff if any .gitattributes files are changed
|
||||||
@@ -150,19 +154,18 @@ module Linguist
|
|||||||
next if delta.binary
|
next if delta.binary
|
||||||
|
|
||||||
if [:added, :modified].include? delta.status
|
if [:added, :modified].include? delta.status
|
||||||
# Skip submodules
|
# Skip submodules and symlinks
|
||||||
mode = delta.new_file[:mode]
|
mode = delta.new_file[:mode]
|
||||||
next if (mode & 040000) != 0
|
mode_format = (mode & 0170000)
|
||||||
|
next if mode_format == 0120000 || mode_format == 040000 || mode_format == 0160000
|
||||||
|
|
||||||
blob = Linguist::LazyBlob.new(repository, delta.new_file[:oid], new, mode.to_s(8))
|
blob = Linguist::LazyBlob.new(repository, delta.new_file[:oid], new, mode.to_s(8))
|
||||||
|
|
||||||
# Skip vendored or generated blobs
|
if blob.include_in_language_stats?
|
||||||
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]
|
file_map[new] = [blob.language.group.name, blob.size]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
blob.cleanup!
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ module Linguist
|
|||||||
def self.cache
|
def self.cache
|
||||||
@cache ||= begin
|
@cache ||= begin
|
||||||
serializer = defined?(Yajl) ? Yajl : YAML
|
serializer = defined?(Yajl) ? Yajl : YAML
|
||||||
serializer.load(File.read(PATH))
|
serializer.load(File.read(PATH, encoding: 'utf-8'))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -34,10 +34,6 @@ module Linguist
|
|||||||
Dir.entries(ROOT).sort!.each do |category|
|
Dir.entries(ROOT).sort!.each do |category|
|
||||||
next if category == '.' || 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)
|
dirname = File.join(ROOT, category)
|
||||||
Dir.entries(dirname).each do |filename|
|
Dir.entries(dirname).each do |filename|
|
||||||
next if filename == '.' || filename == '..'
|
next if filename == '.' || filename == '..'
|
||||||
@@ -54,16 +50,13 @@ module Linguist
|
|||||||
end
|
end
|
||||||
else
|
else
|
||||||
path = File.join(dirname, filename)
|
path = File.join(dirname, filename)
|
||||||
|
extname = File.extname(filename)
|
||||||
if File.extname(filename) == ""
|
|
||||||
raise "#{path} is missing an extension, maybe it belongs in filenames/ subdir"
|
|
||||||
end
|
|
||||||
|
|
||||||
yield({
|
yield({
|
||||||
:path => path,
|
:path => path,
|
||||||
:language => category,
|
:language => category,
|
||||||
:interpreter => Shebang.interpreter(File.read(path)),
|
:interpreter => Shebang.interpreter(File.read(path)),
|
||||||
:extname => File.extname(filename)
|
:extname => extname.empty? ? nil : extname
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -18,23 +18,38 @@ module Linguist
|
|||||||
#
|
#
|
||||||
# Returns a String or nil
|
# Returns a String or nil
|
||||||
def self.interpreter(data)
|
def self.interpreter(data)
|
||||||
lines = data.lines
|
shebang = data.lines.first
|
||||||
return unless match = /^#! ?(.*)$/.match(lines.first)
|
|
||||||
|
|
||||||
tokens = match[1].split(' ')
|
# First line must start with #!
|
||||||
script = tokens.first.split('/').last
|
return unless shebang && shebang.start_with?("#!")
|
||||||
|
|
||||||
script = tokens[1] if script == 'env'
|
s = StringScanner.new(shebang)
|
||||||
|
|
||||||
# If script has an invalid shebang, we might get here
|
# There was nothing after the #!
|
||||||
|
return unless path = s.scan(/^#!\s*\S+/)
|
||||||
|
|
||||||
|
# Keep going
|
||||||
|
script = path.split('/').last
|
||||||
|
|
||||||
|
# if /usr/bin/env type shebang then walk the string
|
||||||
|
if script == 'env'
|
||||||
|
s.scan(/\s+/)
|
||||||
|
s.scan(/.*=[^\s]+\s+/) # skip over variable arguments e.g. foo=bar
|
||||||
|
script = s.scan(/\S+/)
|
||||||
|
end
|
||||||
|
|
||||||
|
# Interpreter was /usr/bin/env with no arguments
|
||||||
return unless script
|
return unless script
|
||||||
|
|
||||||
# "python2.6" -> "python2"
|
# "python2.6" -> "python2"
|
||||||
script.sub! $1, '' if script =~ /(\.\d+)$/
|
script.sub!(/(\.\d+)$/, '')
|
||||||
|
|
||||||
|
# #! perl -> perl
|
||||||
|
script.sub!(/^#!\s*/, '')
|
||||||
|
|
||||||
# Check for multiline shebang hacks that call `exec`
|
# Check for multiline shebang hacks that call `exec`
|
||||||
if script == 'sh' &&
|
if script == 'sh' &&
|
||||||
lines.first(5).any? { |l| l.match(/exec (\w+).+\$0.+\$@/) }
|
data.lines.first(5).any? { |l| l.match(/exec (\w+).+\$0.+\$@/) }
|
||||||
script = $1
|
script = $1
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
10
lib/linguist/strategy/extension.rb
Normal file
10
lib/linguist/strategy/extension.rb
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
module Linguist
|
||||||
|
module Strategy
|
||||||
|
# Detects language based on extension
|
||||||
|
class Extension
|
||||||
|
def self.call(blob, _)
|
||||||
|
Language.find_by_extension(blob.name.to_s)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -1,18 +1,9 @@
|
|||||||
module Linguist
|
module Linguist
|
||||||
module Strategy
|
module Strategy
|
||||||
# Detects language based on filename and/or extension
|
# Detects language based on filename
|
||||||
class Filename
|
class Filename
|
||||||
def self.call(blob, _)
|
def self.call(blob, _)
|
||||||
name = blob.name.to_s
|
name = blob.name.to_s
|
||||||
|
|
||||||
# A bit of an elegant hack. If the file is executable but extensionless,
|
|
||||||
# append a "magic" extension so it can be classified with other
|
|
||||||
# languages that have shebang scripts.
|
|
||||||
extensions = FileBlob.new(name).extensions
|
|
||||||
if extensions.empty? && blob.mode && (blob.mode.to_i(8) & 05) == 05
|
|
||||||
name += ".script!"
|
|
||||||
end
|
|
||||||
|
|
||||||
Language.find_by_filename(name)
|
Language.find_by_filename(name)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
126
lib/linguist/strategy/modeline.rb
Normal file
126
lib/linguist/strategy/modeline.rb
Normal file
@@ -0,0 +1,126 @@
|
|||||||
|
module Linguist
|
||||||
|
module Strategy
|
||||||
|
class Modeline
|
||||||
|
EMACS_MODELINE = /
|
||||||
|
-\*-
|
||||||
|
(?:
|
||||||
|
# Short form: `-*- ruby -*-`
|
||||||
|
\s* (?= [^:;\s]+ \s* -\*-)
|
||||||
|
|
|
||||||
|
# Longer form: `-*- foo:bar; mode: ruby; -*-`
|
||||||
|
(?:
|
||||||
|
.*? # Preceding variables: `-*- foo:bar bar:baz;`
|
||||||
|
[;\s] # Which are delimited by spaces or semicolons
|
||||||
|
|
|
||||||
|
(?<=-\*-) # Not preceded by anything: `-*-mode:ruby-*-`
|
||||||
|
)
|
||||||
|
mode # Major mode indicator
|
||||||
|
\s*:\s* # Allow whitespace around colon: `mode : ruby`
|
||||||
|
)
|
||||||
|
([^:;\s]+) # Name of mode
|
||||||
|
|
||||||
|
# Ensure the mode is terminated correctly
|
||||||
|
(?=
|
||||||
|
# Followed by semicolon or whitespace
|
||||||
|
[\s;]
|
||||||
|
|
|
||||||
|
# Touching the ending sequence: `ruby-*-`
|
||||||
|
(?<![-*]) # Don't allow stuff like `ruby--*-` to match; it'll invalidate the mode
|
||||||
|
-\*- # Emacs has no problems reading `ruby --*-`, however.
|
||||||
|
)
|
||||||
|
.*? # Anything between a cleanly-terminated mode and the ending -*-
|
||||||
|
-\*-
|
||||||
|
/xi
|
||||||
|
|
||||||
|
VIM_MODELINE = /
|
||||||
|
|
||||||
|
# Start modeline. Could be `vim:`, `vi:` or `ex:`
|
||||||
|
(?:
|
||||||
|
(?:\s|^)
|
||||||
|
vi
|
||||||
|
(?:m[<=>]?\d+|m)? # Version-specific modeline
|
||||||
|
|
|
||||||
|
[\t\x20] # `ex:` requires whitespace, because "ex:" might be short for "example:"
|
||||||
|
ex
|
||||||
|
)
|
||||||
|
|
||||||
|
# If the option-list begins with `set ` or `se `, it indicates an alternative
|
||||||
|
# modeline syntax partly-compatible with older versions of Vi. Here, the colon
|
||||||
|
# serves as a terminator for an option sequence, delimited by whitespace.
|
||||||
|
(?=
|
||||||
|
# So we have to ensure the modeline ends with a colon
|
||||||
|
: (?=\s* set? \s [^\n:]+ :) |
|
||||||
|
|
||||||
|
# Otherwise, it isn't valid syntax and should be ignored
|
||||||
|
: (?!\s* set? \s)
|
||||||
|
)
|
||||||
|
|
||||||
|
# Possible (unrelated) `option=value` pairs to skip past
|
||||||
|
(?:
|
||||||
|
# Option separator. Vim uses whitespace or colons to separate options (except if
|
||||||
|
# the alternate "vim: set " form is used, where only whitespace is used)
|
||||||
|
(?:
|
||||||
|
\s
|
||||||
|
|
|
||||||
|
\s* : \s* # Note that whitespace around colons is accepted too:
|
||||||
|
) # vim: noai : ft=ruby:noexpandtab
|
||||||
|
|
||||||
|
# Option's name. All recognised Vim options have an alphanumeric form.
|
||||||
|
\w*
|
||||||
|
|
||||||
|
# Possible value. Not every option takes an argument.
|
||||||
|
(?:
|
||||||
|
# Whitespace between name and value is allowed: `vim: ft =ruby`
|
||||||
|
\s*=
|
||||||
|
|
||||||
|
# Option's value. Might be blank; `vim: ft= ` says "use no filetype".
|
||||||
|
(?:
|
||||||
|
[^\\\s] # Beware of escaped characters: titlestring=\ ft=ruby
|
||||||
|
| # will be read by Vim as { titlestring: " ft=ruby" }.
|
||||||
|
\\.
|
||||||
|
)*
|
||||||
|
)?
|
||||||
|
)*
|
||||||
|
|
||||||
|
# The actual filetype declaration
|
||||||
|
[\s:] (?:filetype|ft|syntax) \s*=
|
||||||
|
|
||||||
|
# Language's name
|
||||||
|
(\w+)
|
||||||
|
|
||||||
|
# Ensure it's followed by a legal separator
|
||||||
|
(?=\s|:|$)
|
||||||
|
/xi
|
||||||
|
|
||||||
|
MODELINES = [EMACS_MODELINE, VIM_MODELINE]
|
||||||
|
|
||||||
|
# Scope of the search for modelines
|
||||||
|
# Number of lines to check at the beginning and at the end of the file
|
||||||
|
SEARCH_SCOPE = 5
|
||||||
|
|
||||||
|
# Public: Detects language based on Vim and Emacs modelines
|
||||||
|
#
|
||||||
|
# blob - An object that quacks like a blob.
|
||||||
|
#
|
||||||
|
# Examples
|
||||||
|
#
|
||||||
|
# Modeline.call(FileBlob.new("path/to/file"))
|
||||||
|
#
|
||||||
|
# Returns an Array with one Language if the blob has a Vim or Emacs modeline
|
||||||
|
# that matches a Language name or alias. Returns an empty array if no match.
|
||||||
|
def self.call(blob, _ = nil)
|
||||||
|
header = blob.lines.first(SEARCH_SCOPE).join("\n")
|
||||||
|
footer = blob.lines.last(SEARCH_SCOPE).join("\n")
|
||||||
|
Array(Language.find_by_alias(modeline(header + footer)))
|
||||||
|
end
|
||||||
|
|
||||||
|
# Public: Get the modeline from the first n-lines of the file
|
||||||
|
#
|
||||||
|
# Returns a String or nil
|
||||||
|
def self.modeline(data)
|
||||||
|
match = MODELINES.map { |regex| data.match(regex) }.reject(&:nil?).first
|
||||||
|
match[1] if match
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -22,8 +22,10 @@ module Linguist
|
|||||||
# Start state on token, ignore anything till the next newline
|
# Start state on token, ignore anything till the next newline
|
||||||
SINGLE_LINE_COMMENTS = [
|
SINGLE_LINE_COMMENTS = [
|
||||||
'//', # C
|
'//', # C
|
||||||
|
'--', # Ada, Haskell, AppleScript
|
||||||
'#', # Ruby
|
'#', # Ruby
|
||||||
'%', # Tex
|
'%', # Tex
|
||||||
|
'"', # Vim
|
||||||
]
|
]
|
||||||
|
|
||||||
# Start state on opening token, ignore anything until the closing
|
# Start state on opening token, ignore anything until the closing
|
||||||
@@ -33,7 +35,8 @@ module Linguist
|
|||||||
['<!--', '-->'], # XML
|
['<!--', '-->'], # XML
|
||||||
['{-', '-}'], # Haskell
|
['{-', '-}'], # Haskell
|
||||||
['(*', '*)'], # Coq
|
['(*', '*)'], # Coq
|
||||||
['"""', '"""'] # Python
|
['"""', '"""'], # Python
|
||||||
|
["'''", "'''"] # Python
|
||||||
]
|
]
|
||||||
|
|
||||||
START_SINGLE_LINE_COMMENT = Regexp.compile(SINGLE_LINE_COMMENTS.map { |c|
|
START_SINGLE_LINE_COMMENT = Regexp.compile(SINGLE_LINE_COMMENTS.map { |c|
|
||||||
@@ -83,17 +86,17 @@ module Linguist
|
|||||||
if s.peek(1) == "\""
|
if s.peek(1) == "\""
|
||||||
s.getch
|
s.getch
|
||||||
else
|
else
|
||||||
s.skip_until(/[^\\]"/)
|
s.skip_until(/(?<!\\)"/)
|
||||||
end
|
end
|
||||||
elsif s.scan(/'/)
|
elsif s.scan(/'/)
|
||||||
if s.peek(1) == "'"
|
if s.peek(1) == "'"
|
||||||
s.getch
|
s.getch
|
||||||
else
|
else
|
||||||
s.skip_until(/[^\\]'/)
|
s.skip_until(/(?<!\\)'/)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Skip number literals
|
# Skip number literals
|
||||||
elsif s.scan(/(0x)?\d(\d|\.)*/)
|
elsif s.scan(/(0x\h(\h|\.)*|\d(\d|\.)*)([uU][lL]{0,2}|([eE][-+]\d*)?[fFlL]*)/)
|
||||||
|
|
||||||
# SGML style brackets
|
# SGML style brackets
|
||||||
elsif token = s.scan(/<[^\s<>][^<>]*>/)
|
elsif token = s.scan(/<[^\s<>][^<>]*>/)
|
||||||
@@ -129,6 +132,9 @@ module Linguist
|
|||||||
# extract_shebang("#!/usr/bin/env node")
|
# extract_shebang("#!/usr/bin/env node")
|
||||||
# # => "node"
|
# # => "node"
|
||||||
#
|
#
|
||||||
|
# extract_shebang("#!/usr/bin/env A=B foo=bar awk -f")
|
||||||
|
# # => "awk"
|
||||||
|
#
|
||||||
# Returns String token or nil it couldn't be parsed.
|
# Returns String token or nil it couldn't be parsed.
|
||||||
def extract_shebang(data)
|
def extract_shebang(data)
|
||||||
s = StringScanner.new(data)
|
s = StringScanner.new(data)
|
||||||
@@ -137,6 +143,7 @@ module Linguist
|
|||||||
script = path.split('/').last
|
script = path.split('/').last
|
||||||
if script == 'env'
|
if script == 'env'
|
||||||
s.scan(/\s+/)
|
s.scan(/\s+/)
|
||||||
|
s.scan(/.*=[^\s]+\s+/)
|
||||||
script = s.scan(/\S+/)
|
script = s.scan(/\S+/)
|
||||||
end
|
end
|
||||||
script = script[/[^\d]+/, 0] if script
|
script = script[/[^\d]+/, 0] if script
|
||||||
|
|||||||
@@ -15,15 +15,28 @@
|
|||||||
# Dependencies
|
# Dependencies
|
||||||
- ^[Dd]ependencies/
|
- ^[Dd]ependencies/
|
||||||
|
|
||||||
|
# Distributions
|
||||||
|
- (^|/)dist/
|
||||||
|
|
||||||
# C deps
|
# C deps
|
||||||
# https://github.com/joyent/node
|
# https://github.com/joyent/node
|
||||||
- ^deps/
|
- ^deps/
|
||||||
- ^tools/
|
- ^tools/
|
||||||
- (^|/)configure$
|
- (^|/)configure$
|
||||||
- (^|/)configure.ac$
|
|
||||||
- (^|/)config.guess$
|
- (^|/)config.guess$
|
||||||
- (^|/)config.sub$
|
- (^|/)config.sub$
|
||||||
|
|
||||||
|
# stuff autogenerated by autoconf - still C deps
|
||||||
|
- (^|/)aclocal.m4
|
||||||
|
- (^|/)libtool.m4
|
||||||
|
- (^|/)ltoptions.m4
|
||||||
|
- (^|/)ltsugar.m4
|
||||||
|
- (^|/)ltversion.m4
|
||||||
|
- (^|/)lt~obsolete.m4
|
||||||
|
|
||||||
|
# Linters
|
||||||
|
- cpplint.py
|
||||||
|
|
||||||
# Node dependencies
|
# Node dependencies
|
||||||
- node_modules/
|
- node_modules/
|
||||||
|
|
||||||
@@ -32,37 +45,45 @@
|
|||||||
|
|
||||||
# Erlang bundles
|
# Erlang bundles
|
||||||
- ^rebar$
|
- ^rebar$
|
||||||
|
- erlang.mk
|
||||||
|
|
||||||
# Go dependencies
|
# Go dependencies
|
||||||
- Godeps/_workspace/
|
- Godeps/_workspace/
|
||||||
|
|
||||||
|
# GNU indent profiles
|
||||||
|
- .indent.pro
|
||||||
|
|
||||||
# Minified JavaScript and CSS
|
# Minified JavaScript and CSS
|
||||||
- (\.|-)min\.(js|css)$
|
- (\.|-)min\.(js|css)$
|
||||||
|
|
||||||
|
# Stylesheets imported from packages
|
||||||
|
- ([^\s]*)import\.(css|less|scss|styl)$
|
||||||
|
|
||||||
# Bootstrap css and js
|
# Bootstrap css and js
|
||||||
- (^|/)bootstrap([^.]*)\.(js|css)$
|
- (^|/)bootstrap([^.]*)\.(js|css|less|scss|styl)$
|
||||||
|
- (^|/)custom\.bootstrap([^\s]*)(js|css|less|scss|styl)$
|
||||||
|
|
||||||
# Font Awesome
|
# Font Awesome
|
||||||
- font-awesome.css
|
- (^|/)font-awesome\.(css|less|scss|styl)$
|
||||||
|
|
||||||
# Foundation css
|
# Foundation css
|
||||||
- foundation.css
|
- (^|/)foundation\.(css|less|scss|styl)$
|
||||||
|
|
||||||
# Normalize.css
|
# Normalize.css
|
||||||
- normalize.css
|
- (^|/)normalize\.(css|less|scss|styl)$
|
||||||
|
|
||||||
# Bourbon SCSS
|
# Bourbon css
|
||||||
- (^|/)[Bb]ourbon/.*\.css$
|
- (^|/)[Bb]ourbon/.*\.(css|less|scss|styl)$
|
||||||
- (^|/)[Bb]ourbon/.*\.scss$
|
|
||||||
|
|
||||||
# Animate.css
|
# Animate.css
|
||||||
- animate.css
|
- (^|/)animate\.(css|less|scss|styl)$
|
||||||
|
|
||||||
# Vendored dependencies
|
# Vendored dependencies
|
||||||
- third[-_]?party/
|
- third[-_]?party/
|
||||||
- 3rd[-_]?party/
|
- 3rd[-_]?party/
|
||||||
- vendors?/
|
- vendors?/
|
||||||
- extern(al)?/
|
- extern(al)?/
|
||||||
|
- (^|/)[Vv]+endor/
|
||||||
|
|
||||||
# Debian packaging
|
# Debian packaging
|
||||||
- ^debian/
|
- ^debian/
|
||||||
@@ -70,6 +91,9 @@
|
|||||||
# Haxelib projects often contain a neko bytecode file named run.n
|
# Haxelib projects often contain a neko bytecode file named run.n
|
||||||
- run.n$
|
- run.n$
|
||||||
|
|
||||||
|
# Bootstrap Datepicker
|
||||||
|
- bootstrap-datepicker/
|
||||||
|
|
||||||
## Commonly Bundled JavaScript frameworks ##
|
## Commonly Bundled JavaScript frameworks ##
|
||||||
|
|
||||||
# jQuery
|
# jQuery
|
||||||
@@ -80,6 +104,34 @@
|
|||||||
- (^|/)jquery\-ui(\-\d\.\d+(\.\d+)?)?(\.\w+)?\.(js|css)$
|
- (^|/)jquery\-ui(\-\d\.\d+(\.\d+)?)?(\.\w+)?\.(js|css)$
|
||||||
- (^|/)jquery\.(ui|effects)\.([^.]*)\.(js|css)$
|
- (^|/)jquery\.(ui|effects)\.([^.]*)\.(js|css)$
|
||||||
|
|
||||||
|
# jQuery Gantt
|
||||||
|
- jquery.fn.gantt.js
|
||||||
|
|
||||||
|
# jQuery fancyBox
|
||||||
|
- jquery.fancybox.(js|css)
|
||||||
|
|
||||||
|
# Fuel UX
|
||||||
|
- fuelux.js
|
||||||
|
|
||||||
|
# jQuery File Upload
|
||||||
|
- (^|/)jquery\.fileupload(-\w+)?\.js$
|
||||||
|
|
||||||
|
# Slick
|
||||||
|
- (^|/)slick\.\w+.js$
|
||||||
|
|
||||||
|
# Leaflet plugins
|
||||||
|
- (^|/)Leaflet\.Coordinates-\d+\.\d+\.\d+\.src\.js$
|
||||||
|
- leaflet.draw-src.js
|
||||||
|
- leaflet.draw.css
|
||||||
|
- Control.FullScreen.css
|
||||||
|
- Control.FullScreen.js
|
||||||
|
- leaflet.spin.js
|
||||||
|
- wicket-leaflet.js
|
||||||
|
|
||||||
|
# Sublime Text workspace files
|
||||||
|
- .sublime-project
|
||||||
|
- .sublime-workspace
|
||||||
|
|
||||||
# Prototype
|
# Prototype
|
||||||
- (^|/)prototype(.*)\.js$
|
- (^|/)prototype(.*)\.js$
|
||||||
- (^|/)effects\.js$
|
- (^|/)effects\.js$
|
||||||
@@ -107,14 +159,20 @@
|
|||||||
- (^|/)tiny_mce([^.]*)\.js$
|
- (^|/)tiny_mce([^.]*)\.js$
|
||||||
- (^|/)tiny_mce/(langs|plugins|themes|utils)
|
- (^|/)tiny_mce/(langs|plugins|themes|utils)
|
||||||
|
|
||||||
|
# Ace Editor
|
||||||
|
- (^|/)ace-builds/
|
||||||
|
|
||||||
|
# Fontello CSS files
|
||||||
|
- (^|/)fontello(.*?)\.css$
|
||||||
|
|
||||||
# MathJax
|
# MathJax
|
||||||
- (^|/)MathJax/
|
- (^|/)MathJax/
|
||||||
|
|
||||||
# Chart.js
|
# Chart.js
|
||||||
- (^|/)Chart\.js$
|
- (^|/)Chart\.js$
|
||||||
|
|
||||||
# Codemirror
|
# CodeMirror
|
||||||
- (^|/)[Cc]ode[Mm]irror/(lib|mode|theme|addon|keymap)
|
- (^|/)[Cc]ode[Mm]irror/(\d+\.\d+/)?(lib|mode|theme|addon|keymap|demo)
|
||||||
|
|
||||||
# SyntaxHighlighter - http://alexgorbatchev.com/
|
# SyntaxHighlighter - http://alexgorbatchev.com/
|
||||||
- (^|/)shBrush([^.]*)\.js$
|
- (^|/)shBrush([^.]*)\.js$
|
||||||
@@ -139,8 +197,12 @@
|
|||||||
|
|
||||||
## Python ##
|
## Python ##
|
||||||
|
|
||||||
|
# Sphinx
|
||||||
|
- (^|/)docs?/_?(build|themes?|templates?|static)/
|
||||||
|
|
||||||
# django
|
# django
|
||||||
- (^|/)admin_media/
|
- (^|/)admin_media/
|
||||||
|
- (^|/)env/
|
||||||
|
|
||||||
# Fabric
|
# Fabric
|
||||||
- ^fabfile\.py$
|
- ^fabfile\.py$
|
||||||
@@ -153,12 +215,40 @@
|
|||||||
|
|
||||||
## Obj-C ##
|
## Obj-C ##
|
||||||
|
|
||||||
|
# Xcode
|
||||||
|
|
||||||
|
- \.xctemplate/
|
||||||
|
- \.imageset/
|
||||||
|
|
||||||
|
# Carthage
|
||||||
|
- ^Carthage/
|
||||||
|
|
||||||
# Cocoapods
|
# Cocoapods
|
||||||
- ^Pods/
|
- ^Pods/
|
||||||
|
|
||||||
# Sparkle
|
# Sparkle
|
||||||
- (^|/)Sparkle/
|
- (^|/)Sparkle/
|
||||||
|
|
||||||
|
# Crashlytics
|
||||||
|
- Crashlytics.framework/
|
||||||
|
|
||||||
|
# Fabric
|
||||||
|
- Fabric.framework/
|
||||||
|
|
||||||
|
# BuddyBuild
|
||||||
|
- BuddyBuildSDK.framework/
|
||||||
|
|
||||||
|
# Realm
|
||||||
|
- Realm.framework
|
||||||
|
|
||||||
|
# RealmSwift
|
||||||
|
- RealmSwift.framework
|
||||||
|
|
||||||
|
# git config files
|
||||||
|
- gitattributes$
|
||||||
|
- gitignore$
|
||||||
|
- gitmodules$
|
||||||
|
|
||||||
## Groovy ##
|
## Groovy ##
|
||||||
|
|
||||||
# Gradle
|
# Gradle
|
||||||
@@ -203,21 +293,9 @@
|
|||||||
# Html5shiv
|
# Html5shiv
|
||||||
- (^|/)html5shiv\.js$
|
- (^|/)html5shiv\.js$
|
||||||
|
|
||||||
# Samples folders
|
|
||||||
- ^[Ss]amples/
|
|
||||||
|
|
||||||
# LICENSE, README, git config files
|
|
||||||
- ^COPYING$
|
|
||||||
- LICENSE$
|
|
||||||
- License$
|
|
||||||
- gitattributes$
|
|
||||||
- gitignore$
|
|
||||||
- gitmodules$
|
|
||||||
- ^README$
|
|
||||||
- ^readme$
|
|
||||||
|
|
||||||
# Test fixtures
|
# Test fixtures
|
||||||
- ^[Tt]est/fixtures/
|
- ^[Tt]ests?/fixtures/
|
||||||
|
- ^[Ss]pecs?/fixtures/
|
||||||
|
|
||||||
# PhoneGap/Cordova
|
# PhoneGap/Cordova
|
||||||
- (^|/)cordova([^.]*)\.js$
|
- (^|/)cordova([^.]*)\.js$
|
||||||
@@ -229,7 +307,7 @@
|
|||||||
# Vagrant
|
# Vagrant
|
||||||
- ^Vagrantfile$
|
- ^Vagrantfile$
|
||||||
|
|
||||||
# .DS_Store's
|
# .DS_Stores
|
||||||
- .[Dd][Ss]_[Ss]tore$
|
- .[Dd][Ss]_[Ss]tore$
|
||||||
|
|
||||||
# R packages
|
# R packages
|
||||||
@@ -247,3 +325,12 @@
|
|||||||
# ProGuard
|
# ProGuard
|
||||||
- proguard.pro
|
- proguard.pro
|
||||||
- proguard-rules.pro
|
- proguard-rules.pro
|
||||||
|
|
||||||
|
# PuPHPet
|
||||||
|
- ^puphpet/
|
||||||
|
|
||||||
|
# Android Google APIs
|
||||||
|
- (^|/)\.google_apis/
|
||||||
|
|
||||||
|
# Jenkins Pipeline
|
||||||
|
- ^Jenkinsfile$
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
module Linguist
|
module Linguist
|
||||||
VERSION = "4.2.0"
|
VERSION = "5.0.8"
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
{
|
{
|
||||||
"repository": "https://github.com/github/linguist",
|
"repository": "https://github.com/github/linguist",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"season": "~>3.0"
|
"season": "~>5.4"
|
||||||
}
|
},
|
||||||
|
"license": "MIT"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,265 @@
|
|||||||
|
&НаСервереБезКонтекста
|
||||||
|
Функция ПолучитьКонтактноеЛицоПоЭлектроннойПочте(ЭлектроннаяПочта)
|
||||||
|
Запрос = Новый Запрос;
|
||||||
|
Запрос.Текст = "ВЫБРАТЬ КонтактноеЛицо ИЗ Справочник.Контрагенты ГДЕ ЭлектроннаяПочта = &ЭлектроннаяПочта";
|
||||||
|
Запрос.Параметры.Вставить("ЭлектроннаяПочта", СокрЛП(ЭлектроннаяПочта));
|
||||||
|
Выборка = Запрос.Выполнить().Выбрать();
|
||||||
|
КонтактноеЛицо = "";
|
||||||
|
Если Выборка.Следующий() Тогда
|
||||||
|
КонтактноеЛицо = Выборка.КонтактноеЛицо;
|
||||||
|
КонецЕсли;
|
||||||
|
Возврат КонтактноеЛицо;
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
&НаСервереБезКонтекста
|
||||||
|
Функция ПолучитьКонтактноеЛицоПоПолучателю(Получатель)
|
||||||
|
Запрос = Новый Запрос;
|
||||||
|
Запрос.Текст = "ВЫБРАТЬ КонтактноеЛицо ИЗ Справочник.Контрагенты ГДЕ Ссылка = &Получатель";
|
||||||
|
Запрос.Параметры.Вставить("Получатель", Получатель);
|
||||||
|
Выборка = Запрос.Выполнить().Выбрать();
|
||||||
|
КонтактноеЛицо = "";
|
||||||
|
Если Выборка.Следующий() Тогда
|
||||||
|
КонтактноеЛицо = Выборка.КонтактноеЛицо;
|
||||||
|
КонецЕсли;
|
||||||
|
Возврат КонтактноеЛицо;
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
&НаСервереБезКонтекста
|
||||||
|
Процедура ДобавитьПолучателей(Получатель, Получатели)
|
||||||
|
Запрос = Новый Запрос;
|
||||||
|
Запрос.Текст = "ВЫБРАТЬ ЭлектроннаяПочта ИЗ Справочник.Контрагенты ГДЕ Ссылка ";
|
||||||
|
Если ТипЗнч(Получатели) = Тип("Массив") Тогда
|
||||||
|
Запрос.Текст = Запрос.Текст + "В (&Получатели)";
|
||||||
|
Иначе
|
||||||
|
Запрос.Текст = Запрос.Текст + "= &Получатели";
|
||||||
|
КонецЕсли;
|
||||||
|
Запрос.Параметры.Вставить("Получатели", Получатели);
|
||||||
|
Выборка = Запрос.Выполнить().Выбрать();
|
||||||
|
Пока Выборка.Следующий() Цикл
|
||||||
|
Если Получатель <> "" Тогда
|
||||||
|
Получатель = Получатель + "; ";
|
||||||
|
КонецЕсли;
|
||||||
|
Получатель = Получатель + Выборка.ЭлектроннаяПочта;
|
||||||
|
КонецЦикла;
|
||||||
|
КонецПроцедуры
|
||||||
|
|
||||||
|
&НаСервере
|
||||||
|
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
|
||||||
|
Если Параметры.Ключ.Пустая() Тогда
|
||||||
|
Заголовок = "Исходящее письмо (Создание)";
|
||||||
|
Объект.Дата = ТекущаяДата();
|
||||||
|
ПоШаблону = Параметры.Свойство("ПоШаблону");
|
||||||
|
ВходящееПисьмо = Параметры.ВходящееПисьмо;
|
||||||
|
Если ПоШаблону = Истина Тогда
|
||||||
|
Элементы.ЗаполнитьПоШаблону.Видимость = Истина;
|
||||||
|
РаботаСПочтой.ЗаполнитьПисьмоПоШаблону(Объект, Содержимое);
|
||||||
|
ИначеЕсли Не ВходящееПисьмо.Пустая() Тогда
|
||||||
|
РаботаСПочтой.ЗаполнитьОтветНаПисьмо(ВходящееПисьмо, Объект, Содержимое);
|
||||||
|
КонецЕсли;
|
||||||
|
Адресаты = Параметры.Адресаты;
|
||||||
|
Если Адресаты <> Неопределено Тогда
|
||||||
|
Запрос = Новый Запрос;
|
||||||
|
Запрос.Текст = "ВЫБРАТЬ
|
||||||
|
| Контрагенты.ЭлектроннаяПочта
|
||||||
|
|ИЗ
|
||||||
|
| Справочник.Контрагенты КАК Контрагенты
|
||||||
|
|ГДЕ
|
||||||
|
| Контрагенты.Ссылка В(&Адресаты)
|
||||||
|
| И Контрагенты.ЭлектроннаяПочта <> """"";
|
||||||
|
Запрос.УстановитьПараметр("Адресаты", Адресаты);
|
||||||
|
Получатель = "";
|
||||||
|
Выборка = Запрос.Выполнить().Выбрать();
|
||||||
|
Пока Выборка.Следующий() Цикл
|
||||||
|
Если Получатель <> "" Тогда
|
||||||
|
Получатель = Получатель + "; ";
|
||||||
|
КонецЕсли;
|
||||||
|
Получатель = Получатель + Выборка.ЭлектроннаяПочта;
|
||||||
|
КонецЦикла;
|
||||||
|
Объект.Получатель = Получатель;
|
||||||
|
КонецЕсли;
|
||||||
|
КонецЕсли;
|
||||||
|
КонецПроцедуры
|
||||||
|
|
||||||
|
&НаСервере
|
||||||
|
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
|
||||||
|
Содержимое = ТекущийОбъект.Содержимое.Получить();
|
||||||
|
Заголовок = ТекущийОбъект.Наименование + " (Исходящее письмо)";
|
||||||
|
Если РаботаСПочтой.ПисьмоОтправлено(ТекущийОбъект.Ссылка) Тогда
|
||||||
|
Заголовок = Заголовок + " - Отправлено";
|
||||||
|
КонецЕсли;
|
||||||
|
КонецПроцедуры
|
||||||
|
|
||||||
|
&НаСервере
|
||||||
|
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
|
||||||
|
ТекущийОбъект.Содержимое = Новый ХранилищеЗначения(Содержимое, Новый СжатиеДанных());
|
||||||
|
ТекущийОбъект.Текст = Содержимое.ПолучитьТекст();
|
||||||
|
КонецПроцедуры
|
||||||
|
|
||||||
|
&НаСервере
|
||||||
|
Функция ОтправитьПисьмо(Ошибка)
|
||||||
|
Если Не Записать() Тогда
|
||||||
|
Ошибка = "ОшибкаЗаписи";
|
||||||
|
Возврат Ложь;
|
||||||
|
КонецЕсли;
|
||||||
|
Если Не РаботаСПочтой.ОтправитьПисьмо(Объект.Ссылка) Тогда
|
||||||
|
Ошибка = "ОшибкаОтправки";
|
||||||
|
Возврат Ложь;
|
||||||
|
КонецЕсли;
|
||||||
|
Заголовок = Заголовок + " - Отправлено";
|
||||||
|
Возврат Истина;
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
&НаКлиенте
|
||||||
|
Функция ОтправитьПисьмоКлиент()
|
||||||
|
Ошибка = "";
|
||||||
|
Если Не ОтправитьПисьмо(Ошибка) Тогда
|
||||||
|
Если Ошибка = "ОшибкаОтправки" Тогда
|
||||||
|
Кнопки = Новый СписокЗначений;
|
||||||
|
Кнопки.Добавить(1, "Настроить почту");
|
||||||
|
Кнопки.Добавить(2, "Закрыть");
|
||||||
|
|
||||||
|
Оп = Новый ОписаниеОповещения(
|
||||||
|
"ОтправитьПисьмоКлиентВопросЗавершение",
|
||||||
|
ЭтотОбъект);
|
||||||
|
ПоказатьВопрос(Оп,
|
||||||
|
"Не указаны настройки интернет почты!",
|
||||||
|
Кнопки, , 1);
|
||||||
|
КонецЕсли;
|
||||||
|
Возврат Ложь;
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
НавигационнаяСсылка = ПолучитьНавигационнуюСсылку(Объект.Ссылка);
|
||||||
|
ПоказатьОповещениеПользователя("Письмо отправлено", НавигационнаяСсылка, Объект.Наименование);
|
||||||
|
ОповеститьОбИзменении(Объект.Ссылка);
|
||||||
|
Возврат Истина;
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
&НаКлиенте
|
||||||
|
Процедура ОтправитьПисьмоКлиентВопросЗавершение(Результат, Параметры) Экспорт
|
||||||
|
Если Результат = 1 Тогда
|
||||||
|
ОткрытьФорму("ОбщаяФорма.НастройкаПочты");
|
||||||
|
КонецЕсли;
|
||||||
|
КонецПроцедуры
|
||||||
|
|
||||||
|
&НаКлиенте
|
||||||
|
Процедура Отправить(Команда)
|
||||||
|
ОтправитьПисьмоКлиент();
|
||||||
|
КонецПроцедуры
|
||||||
|
|
||||||
|
&НаКлиенте
|
||||||
|
Процедура ОтправитьИЗакрыть(Команда)
|
||||||
|
Если Не ОтправитьПисьмоКлиент() Тогда
|
||||||
|
Возврат;
|
||||||
|
КонецЕсли;
|
||||||
|
Закрыть();
|
||||||
|
КонецПроцедуры
|
||||||
|
|
||||||
|
&НаКлиенте
|
||||||
|
Процедура ВставитьСтрокуВТекущуюПозицию(Поле, Документ, Строка)
|
||||||
|
Перем Начало, Конец;
|
||||||
|
Поле.ПолучитьГраницыВыделения(Начало, Конец);
|
||||||
|
Позиция = Документ.ПолучитьПозициюПоЗакладке(Начало);
|
||||||
|
Документ.Удалить(Начало, Конец);
|
||||||
|
Начало = Документ.ПолучитьЗакладкуПоПозиции(Позиция);
|
||||||
|
Документ.Вставить(Начало, Строка);
|
||||||
|
Позиция = Позиция + СтрДлина(Строка);
|
||||||
|
Закладка = Документ.ПолучитьЗакладкуПоПозиции(Позиция);
|
||||||
|
Поле.УстановитьГраницыВыделения(Закладка, Закладка);
|
||||||
|
КонецПроцедуры
|
||||||
|
|
||||||
|
&НаКлиенте
|
||||||
|
Процедура ВставитьКонтактноеЛицо(Команда)
|
||||||
|
Если Объект.Контрагент.Пустая() Тогда
|
||||||
|
Сообщить("Выберите контрагента");
|
||||||
|
Иначе
|
||||||
|
КонтактноеЛицо = ПолучитьКонтактноеЛицоПоПолучателю(Объект.Контрагент);
|
||||||
|
ВставитьСтрокуВТекущуюПозицию(Элементы.Содержимое, Содержимое, КонтактноеЛицо + " ");
|
||||||
|
КонецЕсли;
|
||||||
|
КонецПроцедуры
|
||||||
|
|
||||||
|
&НаСервере
|
||||||
|
Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)
|
||||||
|
Заголовок = ТекущийОбъект.Наименование + " (Исходящее письмо)";
|
||||||
|
КонецПроцедуры
|
||||||
|
|
||||||
|
&НаКлиенте
|
||||||
|
Процедура КонтрагентПриИзменении(Элемент)
|
||||||
|
ДобавитьПолучателей(Объект.Получатель, Объект.Контрагент);
|
||||||
|
КонецПроцедуры
|
||||||
|
|
||||||
|
&НаКлиенте
|
||||||
|
Процедура ВыделитьВажное(Команда)
|
||||||
|
Перем Начало, Конец;
|
||||||
|
ВсеВажное = Истина;
|
||||||
|
Элементы.Содержимое.ПолучитьГраницыВыделения(Начало, Конец);
|
||||||
|
Если Начало = Конец Тогда
|
||||||
|
Возврат;
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
НаборТекстовыхЭлементов = Новый Массив();
|
||||||
|
Для Каждого ТекстовыйЭлемент Из Содержимое.СформироватьЭлементы(Начало, Конец) Цикл
|
||||||
|
Если Тип(ТекстовыйЭлемент) = Тип("ТекстФорматированногоДокумента") Тогда
|
||||||
|
НаборТекстовыхЭлементов.Добавить(ТекстовыйЭлемент);
|
||||||
|
КонецЕсли;
|
||||||
|
КонецЦикла;
|
||||||
|
|
||||||
|
Для Каждого ТекстовыйЭлемент Из НаборТекстовыхЭлементов Цикл
|
||||||
|
Если ТекстовыйЭлемент.Шрифт.Жирный <> Истина И
|
||||||
|
ТекстовыйЭлемент.ЦветТекста <> Новый Цвет(255, 0, 0) Тогда
|
||||||
|
ВсеВажное = Ложь;
|
||||||
|
Прервать;
|
||||||
|
КонецЕсли;
|
||||||
|
КонецЦикла;
|
||||||
|
|
||||||
|
Для Каждого ТекстовыйЭлемент Из НаборТекстовыхЭлементов Цикл
|
||||||
|
ТекстовыйЭлемент.Шрифт = Новый Шрифт(ТекстовыйЭлемент.Шрифт, , , Не ВсеВажное);
|
||||||
|
ТекстовыйЭлемент.ЦветТекста = Новый Цвет(?(ВсеВажное, 0, 255), 0, 0);
|
||||||
|
КонецЦикла;
|
||||||
|
КонецПроцедуры
|
||||||
|
|
||||||
|
&НаКлиенте
|
||||||
|
Процедура ЗаполнитьПоШаблону(Команда)
|
||||||
|
Если Объект.Контрагент.Пустая() Тогда
|
||||||
|
Сообщить("Выберите контрагента");
|
||||||
|
Иначе
|
||||||
|
НайтиИЗаменить("[Контрагент]", Объект.Контрагент);
|
||||||
|
НайтиИЗаменить("[КонтактноеЛицо]", ПолучитьКонтактноеЛицоПоПолучателю(Объект.Контрагент));
|
||||||
|
КонецЕсли;
|
||||||
|
НайтиИЗаменить("[ДатаПисьма]", Объект.Дата);
|
||||||
|
КонецПроцедуры
|
||||||
|
|
||||||
|
&НаКлиенте
|
||||||
|
Процедура НайтиИЗаменить(СтрокаДляПоиска, СтрокаДляЗамены)
|
||||||
|
Перем ВставленныйТекст, ШрифтОформления, ЦветТекстаОформления, ЦветФонаОформления, НавигационнаяСсылкаОформления;
|
||||||
|
РезультатПоиска = Содержимое.НайтиТекст(СтрокаДляПоиска);
|
||||||
|
Пока ((РезультатПоиска <> Неопределено) И (РезультатПоиска.ЗакладкаНачала <> Неопределено) И (РезультатПоиска.ЗакладкаКонца <> Неопределено)) Цикл
|
||||||
|
ПозицияНачалаСледующегоЦиклаПоиска = Содержимое.ПолучитьПозициюПоЗакладке(РезультатПоиска.ЗакладкаНачала) + СтрДлина(СтрокаДляЗамены);
|
||||||
|
МассивЭлементовДляОформления = Содержимое.ПолучитьЭлементы(РезультатПоиска.ЗакладкаНачала, РезультатПоиска.ЗакладкаКонца);
|
||||||
|
Для Каждого ЭлементДляОформления Из МассивЭлементовДляОформления Цикл
|
||||||
|
Если Тип(ЭлементДляОформления) = Тип("ТекстФорматированногоДокумента") Тогда
|
||||||
|
ШрифтОформления = ЭлементДляОформления.Шрифт;
|
||||||
|
ЦветТекстаОформления = ЭлементДляОформления.ЦветТекста;
|
||||||
|
ЦветФонаОформления = ЭлементДляОформления.ЦветФона;
|
||||||
|
НавигационнаяСсылкаОформления = ЭлементДляОформления.НавигационнаяССылка;
|
||||||
|
Прервать;
|
||||||
|
КонецЕсли;
|
||||||
|
КонецЦикла;
|
||||||
|
Содержимое.Удалить(РезультатПоиска.ЗакладкаНачала, РезультатПоиска.ЗакладкаКонца);
|
||||||
|
ВставленныйТекст = Содержимое.Вставить(РезультатПоиска.ЗакладкаНачала, СтрокаДляЗамены);
|
||||||
|
Если ВставленныйТекст <> Неопределено И ШрифтОформления <> Неопределено Тогда
|
||||||
|
ВставленныйТекст.Шрифт = ШрифтОформления;
|
||||||
|
КонецЕсли;
|
||||||
|
Если ВставленныйТекст <> Неопределено И ЦветТекстаОформления <> Неопределено Тогда
|
||||||
|
ВставленныйТекст.ЦветТекста = ЦветТекстаОформления;
|
||||||
|
КонецЕсли;
|
||||||
|
Если ВставленныйТекст <> Неопределено И ЦветФонаОформления <> Неопределено Тогда
|
||||||
|
ВставленныйТекст.ЦветФона = ЦветФонаОформления;
|
||||||
|
КонецЕсли;
|
||||||
|
Если ВставленныйТекст <> Неопределено И НавигационнаяСсылкаОформления <> Неопределено Тогда
|
||||||
|
ВставленныйТекст.НавигационнаяССылка = НавигационнаяСсылкаОформления;
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
РезультатПоиска = Содержимое.НайтиТекст(СтрокаДляПоиска, Содержимое.ПолучитьЗакладкуПоПозиции(ПозицияНачалаСледующегоЦиклаПоиска));
|
||||||
|
КонецЦикла;
|
||||||
|
КонецПроцедуры
|
||||||
|
|
||||||
@@ -0,0 +1,85 @@
|
|||||||
|
&НаСервере
|
||||||
|
Функция ПечатнаяФорма(ПараметрКоманды)
|
||||||
|
ТабличныйДокумент = Новый ТабличныйДокумент;
|
||||||
|
ТабличныйДокумент.ОтображатьСетку = Истина;
|
||||||
|
ТабличныйДокумент.ОтображатьЗаголовки = Истина;
|
||||||
|
|
||||||
|
Сформирован = Ложь;
|
||||||
|
ТабМакет = Справочники.Товары.ПолучитьМакет("МакетПрайсЛиста");
|
||||||
|
|
||||||
|
Шапка = ТабМакет.ПолучитьОбласть("Шапка");
|
||||||
|
ТабличныйДокумент.Вывести(Шапка);
|
||||||
|
|
||||||
|
ОбластьНоменклатура = ТабМакет.ПолучитьОбласть("ОбластьНоменклатура");
|
||||||
|
|
||||||
|
Запрос = Новый Запрос;
|
||||||
|
Запрос.Текст = "ВЫБРАТЬ
|
||||||
|
| Товары.Код КАК Код,
|
||||||
|
| Товары.Наименование КАК Наименование,
|
||||||
|
| Товары.Артикул КАК Артикул,
|
||||||
|
| Товары.ФайлКартинки КАК Картинка,
|
||||||
|
| Товары.Описание КАК Описание,
|
||||||
|
| Товары.Вид КАК Вид,
|
||||||
|
| ЦеныТоваров.Цена КАК Цена
|
||||||
|
|ИЗ
|
||||||
|
| РегистрСведений.ЦеныТоваров КАК ЦеныТоваров
|
||||||
|
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Товары КАК Товары
|
||||||
|
| ПО ЦеныТоваров.Товар = Товары.Ссылка
|
||||||
|
|ГДЕ
|
||||||
|
| Товары.ЭтоГруппа = ЛОЖЬ
|
||||||
|
| И ЦеныТоваров.ВидЦен = &ВидЦен
|
||||||
|
|
|
||||||
|
|УПОРЯДОЧИТЬ ПО
|
||||||
|
| Вид,
|
||||||
|
| Товары.Родитель.Код,
|
||||||
|
| Код";
|
||||||
|
|
||||||
|
Запрос.УстановитьПараметр("ВидЦен", Справочники.ВидыЦен.НайтиПоНаименованию("Розничная"));
|
||||||
|
|
||||||
|
Выборка = Запрос.Выполнить().Выбрать();
|
||||||
|
Пока Выборка.Следующий() Цикл
|
||||||
|
ОбластьНоменклатура.Параметры.Заполнить(Выборка);
|
||||||
|
|
||||||
|
Описание = "";
|
||||||
|
|
||||||
|
Чтение = Новый ЧтениеHTML();
|
||||||
|
Чтение.УстановитьСтроку(Выборка.Описание);
|
||||||
|
|
||||||
|
ДокDOM = Новый ПостроительDOM();
|
||||||
|
HTML = ДокDOM.Прочитать(Чтение);
|
||||||
|
|
||||||
|
Если Не HTML.ЭлементДокумента = Неопределено Тогда
|
||||||
|
Для Каждого Узел из HTML.ЭлементДокумента.ДочерниеУзлы Цикл
|
||||||
|
Если Узел.ИмяУзла = "body" Тогда
|
||||||
|
Для Каждого ЭлементОписания из Узел.ДочерниеУзлы Цикл
|
||||||
|
Описание = Описание + ЭлементОписания.ТекстовоеСодержимое;
|
||||||
|
КонецЦикла;
|
||||||
|
КонецЕсли;
|
||||||
|
КонецЦикла;
|
||||||
|
КонецЕсли;
|
||||||
|
ОбластьНоменклатура.Параметры.Описание = Описание;
|
||||||
|
|
||||||
|
Если (Выборка.Картинка <> Null) Тогда
|
||||||
|
ОбластьНоменклатура.Параметры.ПараметрКартинки = Новый Картинка(Выборка.Картинка.ДанныеФайла.Получить());
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
ТабличныйДокумент.Вывести(ОбластьНоменклатура, Выборка.Уровень());
|
||||||
|
Сформирован = Истина;
|
||||||
|
КонецЦикла;
|
||||||
|
|
||||||
|
Если Сформирован Тогда
|
||||||
|
Возврат ТабличныйДокумент;
|
||||||
|
Иначе
|
||||||
|
Возврат Неопределено;
|
||||||
|
КонецЕсли;
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
&НаКлиенте
|
||||||
|
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
|
||||||
|
ТабличныйДокумент = ПечатнаяФорма(ПараметрКоманды);
|
||||||
|
|
||||||
|
Если ТабличныйДокумент <> Неопределено Тогда
|
||||||
|
ТабличныйДокумент.Показать();
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
КонецПроцедуры
|
||||||
@@ -0,0 +1,109 @@
|
|||||||
|
// Процедура на основании анализа типа данных заменяет их на данные, удаляющие
|
||||||
|
// информацию из узла в котором их не должно быть
|
||||||
|
//
|
||||||
|
// Параметры:
|
||||||
|
// Данные – Объект, набор записей,... который нужно преобразовать
|
||||||
|
//
|
||||||
|
Процедура УдалениеДанных(Данные)
|
||||||
|
|
||||||
|
// Получаем объект описания метаданного, соответствующий данным
|
||||||
|
ОбъектМетаданных = ?(ТипЗнч(Данные) = Тип("УдалениеОбъекта"), Данные.Ссылка.Метаданные(), Данные.Метаданные());
|
||||||
|
// Проверяем тип, интересуют только те типы, которые реализованы на мобильной платформе
|
||||||
|
Если Метаданные.Справочники.Содержит(ОбъектМетаданных)
|
||||||
|
ИЛИ Метаданные.Документы.Содержит(ОбъектМетаданных) Тогда
|
||||||
|
|
||||||
|
// Перенос удаления объекта для объектных
|
||||||
|
Данные = Новый УдалениеОбъекта(Данные.Ссылка);
|
||||||
|
|
||||||
|
ИначеЕсли Метаданные.РегистрыСведений.Содержит(ОбъектМетаданных)
|
||||||
|
ИЛИ Метаданные.РегистрыНакопления.Содержит(ОбъектМетаданных)
|
||||||
|
ИЛИ Метаданные.Последовательности.Содержит(ОбъектМетаданных) Тогда
|
||||||
|
|
||||||
|
// Очищаем данные
|
||||||
|
Данные.Очистить();
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
КонецПроцедуры
|
||||||
|
|
||||||
|
// Функция формирует пакет обмена, который будет отправлен узлу "УзелОбмена"
|
||||||
|
//
|
||||||
|
// Параметры:
|
||||||
|
// УзелОбмена – узел плана обмена "мобильные", с которым осуществляется обмен
|
||||||
|
//
|
||||||
|
// Возвращаемое значение:
|
||||||
|
// сформированный пакет, помещенный в хранилище значения
|
||||||
|
Функция СформироватьПакетОбмена(УзелОбмена) Экспорт
|
||||||
|
|
||||||
|
ЗаписьXML = Новый ЗаписьXML;
|
||||||
|
|
||||||
|
ЗаписьXML.УстановитьСтроку("UTF-8");
|
||||||
|
ЗаписьXML.ЗаписатьОбъявлениеXML();
|
||||||
|
|
||||||
|
ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения();
|
||||||
|
ЗаписьСообщения.НачатьЗапись(ЗаписьXML, УзелОбмена);
|
||||||
|
|
||||||
|
ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("xsi", "http://www.w3.org/2001/XMLSchema-instance");
|
||||||
|
ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("v8", "http://v8.1c.ru/data");
|
||||||
|
|
||||||
|
ТипДанныхУдаления = Тип("УдалениеОбъекта");
|
||||||
|
|
||||||
|
ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(УзелОбмена, ЗаписьСообщения.НомерСообщения);
|
||||||
|
Пока ВыборкаИзменений.Следующий() Цикл
|
||||||
|
|
||||||
|
Данные = ВыборкаИзменений.Получить();
|
||||||
|
|
||||||
|
// Если перенос данных не нужен, то, возможно, необходимо записать удаление данных
|
||||||
|
Если Не ОбменМобильныеПереопределяемый.НуженПереносДанных(Данные, УзелОбмена) Тогда
|
||||||
|
|
||||||
|
// Получаем значение с возможным удалением данных
|
||||||
|
УдалениеДанных(Данные);
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
// Записываем данные в сообщение
|
||||||
|
ОбменМобильныеПереопределяемый.ЗаписатьДанные(ЗаписьXML, Данные);
|
||||||
|
|
||||||
|
КонецЦикла;
|
||||||
|
|
||||||
|
ЗаписьСообщения.ЗакончитьЗапись();
|
||||||
|
|
||||||
|
Возврат Новый ХранилищеЗначения(ЗаписьXML.Закрыть(), Новый СжатиеДанных(9));
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
// Процедура вносит в информационную базу данные, которые присланы из узла "УзелОбмена"
|
||||||
|
//
|
||||||
|
// Параметры:
|
||||||
|
// УзелОбмена – узел плана обмена "мобильные", с которым осуществляется обмен
|
||||||
|
// ДанныеОбмена - пакет обмена полученный из узла УзелОбмена, помещен в ХранилищеЗначения
|
||||||
|
//
|
||||||
|
Процедура ПринятьПакетОбмена(УзелОбмена, ДанныеОбмена) Экспорт
|
||||||
|
|
||||||
|
ЧтениеXML = Новый ЧтениеXML;
|
||||||
|
ЧтениеXML.УстановитьСтроку(ДанныеОбмена.Получить());
|
||||||
|
ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения();
|
||||||
|
ЧтениеСообщения.НачатьЧтение(ЧтениеXML);
|
||||||
|
ПланыОбмена.УдалитьРегистрациюИзменений(ЧтениеСообщения.Отправитель,ЧтениеСообщения.НомерПринятого);
|
||||||
|
|
||||||
|
НачатьТранзакцию();
|
||||||
|
Пока ВозможностьЧтенияXML(ЧтениеXML) Цикл
|
||||||
|
|
||||||
|
Данные = ОбменМобильныеПереопределяемый.ПрочитатьДанные(ЧтениеXML);
|
||||||
|
|
||||||
|
Если Не Данные = Неопределено Тогда
|
||||||
|
|
||||||
|
Данные.ОбменДанными.Отправитель = ЧтениеСообщения.Отправитель;
|
||||||
|
Данные.ОбменДанными.Загрузка = Истина;
|
||||||
|
|
||||||
|
Данные.Записать();
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
КонецЦикла;
|
||||||
|
ЗафиксироватьТранзакцию();
|
||||||
|
|
||||||
|
ЧтениеСообщения.ЗакончитьЧтение();
|
||||||
|
ЧтениеXML.Закрыть();
|
||||||
|
|
||||||
|
КонецПроцедуры
|
||||||
302
samples/1C Enterprise/Document.РасходТовара.ObjectModule.bsl
Normal file
302
samples/1C Enterprise/Document.РасходТовара.ObjectModule.bsl
Normal file
@@ -0,0 +1,302 @@
|
|||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// ПРОЦЕДУРЫ И ФУНКЦИИ
|
||||||
|
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Формирование печатной формы документа
|
||||||
|
|
||||||
|
//
|
||||||
|
|
||||||
|
// Параметры:
|
||||||
|
|
||||||
|
// Нет.
|
||||||
|
|
||||||
|
//
|
||||||
|
|
||||||
|
// Возвращаемое значение:
|
||||||
|
|
||||||
|
// ТабличныйДокумент - Сформированный табличный документ.
|
||||||
|
|
||||||
|
Процедура ПечатнаяФорма(ТабличныйДокумент) Экспорт
|
||||||
|
|
||||||
|
|
||||||
|
Макет = Документы.РасходТовара.ПолучитьМакет("МакетПечати");
|
||||||
|
|
||||||
|
|
||||||
|
// Заголовок
|
||||||
|
|
||||||
|
Область = Макет.ПолучитьОбласть("Заголовок");
|
||||||
|
|
||||||
|
ТабличныйДокумент.Вывести(Область);
|
||||||
|
|
||||||
|
|
||||||
|
// Шапка
|
||||||
|
|
||||||
|
Шапка = Макет.ПолучитьОбласть("Шапка");
|
||||||
|
|
||||||
|
Шапка.Параметры.Заполнить(ЭтотОбъект);
|
||||||
|
|
||||||
|
ТабличныйДокумент.Вывести(Шапка);
|
||||||
|
|
||||||
|
|
||||||
|
// Товары
|
||||||
|
|
||||||
|
Область = Макет.ПолучитьОбласть("ТоварыШапка");
|
||||||
|
|
||||||
|
ТабличныйДокумент.Вывести(Область);
|
||||||
|
|
||||||
|
ОбластьТовары = Макет.ПолучитьОбласть("Товары");
|
||||||
|
|
||||||
|
|
||||||
|
Для каждого ТекСтрокаТовары Из Товары Цикл
|
||||||
|
|
||||||
|
|
||||||
|
ОбластьТовары.Параметры.Заполнить(ТекСтрокаТовары);
|
||||||
|
|
||||||
|
ТабличныйДокумент.Вывести(ОбластьТовары);
|
||||||
|
|
||||||
|
|
||||||
|
КонецЦикла;
|
||||||
|
|
||||||
|
|
||||||
|
КонецПроцедуры
|
||||||
|
|
||||||
|
|
||||||
|
// Формирование печатной формы документа
|
||||||
|
//
|
||||||
|
// Параметры:
|
||||||
|
// Нет.
|
||||||
|
//
|
||||||
|
// Возвращаемое значение:
|
||||||
|
// ТабличныйДокумент - Сформированный табличный документ.
|
||||||
|
Процедура Пересчитать() Экспорт
|
||||||
|
|
||||||
|
Для каждого ТекСтрокаТовары Из Товары Цикл
|
||||||
|
|
||||||
|
ТекСтрокаТовары.Сумма = ТекСтрокаТовары.Количество * ТекСтрокаТовары.Цена;
|
||||||
|
|
||||||
|
КонецЦикла;
|
||||||
|
|
||||||
|
КонецПроцедуры
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// ОБРАБОТЧИКИ СОБЫТИЙ ОБЪЕКТА
|
||||||
|
|
||||||
|
|
||||||
|
Процедура ОбработкаПроведения(Отказ, Режим)
|
||||||
|
|
||||||
|
// Формирование движений регистров накопления ТоварныеЗапасы и Продажи.
|
||||||
|
Движения.ТоварныеЗапасы.Записывать = Истина;
|
||||||
|
Движения.Продажи.Записывать = Истина;
|
||||||
|
Если Режим = РежимПроведенияДокумента.Оперативный Тогда
|
||||||
|
Движения.ТоварныеЗапасы.БлокироватьДляИзменения = Истина;
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
// Создадим запрос, чтобы получать информацию об услугах
|
||||||
|
Запрос = Новый Запрос("ВЫБРАТЬ
|
||||||
|
| ТоварыВДокументе.НомерСтроки КАК НомерСтроки
|
||||||
|
|ИЗ
|
||||||
|
| Документ.РасходТовара.Товары КАК ТоварыВДокументе
|
||||||
|
|ГДЕ
|
||||||
|
| ТоварыВДокументе.Ссылка = &Ссылка
|
||||||
|
| И ТоварыВДокументе.Товар.Вид = ЗНАЧЕНИЕ(Перечисление.ВидыТоваров.Услуга)");
|
||||||
|
|
||||||
|
Запрос.УстановитьПараметр("Ссылка", Ссылка);
|
||||||
|
РезультатУслуги = Запрос.Выполнить().Выгрузить();
|
||||||
|
РезультатУслуги.Индексы.Добавить("НомерСтроки");
|
||||||
|
|
||||||
|
Для каждого ТекСтрокаТовары Из Товары Цикл
|
||||||
|
|
||||||
|
Строка = РезультатУслуги.Найти(ТекСтрокаТовары.НомерСтроки, "НомерСтроки");
|
||||||
|
Если Строка = Неопределено Тогда
|
||||||
|
|
||||||
|
// Не услуга
|
||||||
|
Движение = Движения.ТоварныеЗапасы.Добавить();
|
||||||
|
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
|
||||||
|
Движение.Период = Дата;
|
||||||
|
Движение.Товар = ТекСтрокаТовары.Товар;
|
||||||
|
Движение.Склад = Склад;
|
||||||
|
Движение.Количество = ТекСтрокаТовары.Количество;
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
Движение = Движения.Продажи.Добавить();
|
||||||
|
Движение.Период = Дата;
|
||||||
|
Движение.Товар = ТекСтрокаТовары.Товар;
|
||||||
|
Движение.Покупатель = Покупатель;
|
||||||
|
Движение.Количество = ТекСтрокаТовары.Количество;
|
||||||
|
Движение.Сумма = ТекСтрокаТовары.Сумма;
|
||||||
|
|
||||||
|
КонецЦикла;
|
||||||
|
|
||||||
|
// Формирование движения регистра накопления Взаиморасчеты.
|
||||||
|
Движения.Взаиморасчеты.Записывать = Истина;
|
||||||
|
Движение = Движения.Взаиморасчеты.Добавить();
|
||||||
|
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
|
||||||
|
Движение.Период = Дата;
|
||||||
|
Движение.Контрагент = Покупатель;
|
||||||
|
Движение.Валюта = Валюта;
|
||||||
|
|
||||||
|
Если Валюта.Пустая() Тогда
|
||||||
|
Движение.Сумма = Товары.Итог("Сумма");
|
||||||
|
Иначе
|
||||||
|
|
||||||
|
Курс = РегистрыСведений.КурсыВалют.ПолучитьПоследнее(Дата, Новый Структура("Валюта", Валюта)).Курс;
|
||||||
|
|
||||||
|
Если Курс = 0 Тогда
|
||||||
|
Движение.Сумма = Товары.Итог("Сумма");
|
||||||
|
Иначе
|
||||||
|
Движение.Сумма = Товары.Итог("Сумма") / Курс;
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
//Запишем движения
|
||||||
|
Движения.Записать();
|
||||||
|
|
||||||
|
//Контроль остатков при оперативном проведении
|
||||||
|
Если Режим = РежимПроведенияДокумента.Оперативный Тогда
|
||||||
|
// Создадим запрос, чтобы контролировать остатки по товарам
|
||||||
|
Запрос = Новый Запрос("ВЫБРАТЬ
|
||||||
|
| ТоварыВДокументе.Товар КАК Товар,
|
||||||
|
| СУММА(ТоварыВДокументе.Количество) КАК Количество,
|
||||||
|
| МАКСИМУМ(ТоварыВДокументе.НомерСтроки) КАК НомерСтроки
|
||||||
|
|
|
||||||
|
|ПОМЕСТИТЬ ТребуетсяТовара
|
||||||
|
|
|
||||||
|
|ИЗ
|
||||||
|
| Документ.РасходТовара.Товары КАК ТоварыВДокументе
|
||||||
|
|
|
||||||
|
|ГДЕ
|
||||||
|
| ТоварыВДокументе.Ссылка = &Ссылка
|
||||||
|
| И ТоварыВДокументе.Товар.Вид = ЗНАЧЕНИЕ(Перечисление.ВидыТоваров.Товар)
|
||||||
|
|
|
||||||
|
|СГРУППИРОВАТЬ ПО
|
||||||
|
| ТоварыВДокументе.Товар
|
||||||
|
|
|
||||||
|
|ИНДЕКСИРОВАТЬ ПО
|
||||||
|
| Товар
|
||||||
|
|;
|
||||||
|
|
|
||||||
|
|////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|ВЫБРАТЬ
|
||||||
|
| ПРЕДСТАВЛЕНИЕ(ТребуетсяТовара.Товар) КАК ТоварПредставление,
|
||||||
|
| ВЫБОР
|
||||||
|
| КОГДА - ЕСТЬNULL(ТоварныеЗапасыОстатки.КоличествоОстаток, 0) > ТоварыВДокументе.Количество
|
||||||
|
| ТОГДА ТоварыВДокументе.Количество
|
||||||
|
| ИНАЧЕ - ЕСТЬNULL(ТоварныеЗапасыОстатки.КоличествоОстаток, 0)
|
||||||
|
| КОНЕЦ КАК Нехватка,
|
||||||
|
| ТоварыВДокументе.Количество - ВЫБОР
|
||||||
|
| КОГДА - ЕСТЬNULL(ТоварныеЗапасыОстатки.КоличествоОстаток, 0) > ТоварыВДокументе.Количество
|
||||||
|
| ТОГДА ТоварыВДокументе.Количество
|
||||||
|
| ИНАЧЕ - ЕСТЬNULL(ТоварныеЗапасыОстатки.КоличествоОстаток, 0)
|
||||||
|
| КОНЕЦ КАК МаксимальноеКоличество,
|
||||||
|
| ТребуетсяТовара.НомерСтроки КАК НомерСтроки
|
||||||
|
|
|
||||||
|
|ИЗ
|
||||||
|
| ТребуетсяТовара КАК ТребуетсяТовара
|
||||||
|
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварныеЗапасы.Остатки(
|
||||||
|
| ,
|
||||||
|
| Товар В
|
||||||
|
| (ВЫБРАТЬ
|
||||||
|
| ТребуетсяТовара.Товар
|
||||||
|
| ИЗ
|
||||||
|
| ТребуетсяТовара)
|
||||||
|
| И Склад = &Склад) КАК ТоварныеЗапасыОстатки
|
||||||
|
| ПО ТребуетсяТовара.Товар = ТоварныеЗапасыОстатки.Товар
|
||||||
|
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.РасходТовара.Товары КАК ТоварыВДокументе
|
||||||
|
| ПО ТребуетсяТовара.Товар = ТоварыВДокументе.Товар
|
||||||
|
| И ТребуетсяТовара.НомерСтроки = ТоварыВДокументе.НомерСтроки
|
||||||
|
|
|
||||||
|
|ГДЕ
|
||||||
|
| ТоварыВДокументе.Ссылка = &Ссылка И
|
||||||
|
| 0 > ЕСТЬNULL(ТоварныеЗапасыОстатки.КоличествоОстаток, 0)
|
||||||
|
|
|
||||||
|
|УПОРЯДОЧИТЬ ПО
|
||||||
|
| НомерСтроки");
|
||||||
|
|
||||||
|
Запрос.УстановитьПараметр("Склад", Склад);
|
||||||
|
Запрос.УстановитьПараметр("Ссылка", Ссылка);
|
||||||
|
РезультатСНехваткой = Запрос.Выполнить();
|
||||||
|
|
||||||
|
ВыборкаРезультатаСНехваткой = РезультатСНехваткой.Выбрать();
|
||||||
|
|
||||||
|
// Выдадим ошибки для строк, в которых не хватает остатка
|
||||||
|
Пока ВыборкаРезультатаСНехваткой.Следующий() Цикл
|
||||||
|
|
||||||
|
Сообщение = Новый СообщениеПользователю();
|
||||||
|
Сообщение.Текст = НСтр("ru = 'Не хватает '", "ru")
|
||||||
|
+ ВыборкаРезультатаСНехваткой.Нехватка
|
||||||
|
+ НСтр("ru = ' единиц товара'", "ru") + """"
|
||||||
|
+ ВыборкаРезультатаСНехваткой.ТоварПредставление
|
||||||
|
+ """"
|
||||||
|
+ НСтр("ru = ' на складе'", "ru")
|
||||||
|
+ """"
|
||||||
|
+ Склад
|
||||||
|
+ """."
|
||||||
|
+ НСтр("ru = 'Максимальное количество: '", "ru")
|
||||||
|
+ ВыборкаРезультатаСНехваткой.МаксимальноеКоличество
|
||||||
|
+ ".";
|
||||||
|
Сообщение.Поле = НСтр("ru = 'Товары'", "ru")
|
||||||
|
+ "["
|
||||||
|
+ (ВыборкаРезультатаСНехваткой.НомерСтроки - 1)
|
||||||
|
+ "]."
|
||||||
|
+ НСтр("ru = 'Количество'", "ru");
|
||||||
|
Сообщение.УстановитьДанные(ЭтотОбъект);
|
||||||
|
Сообщение.Сообщить();
|
||||||
|
Отказ = Истина;
|
||||||
|
|
||||||
|
КонецЦикла;
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
КонецПроцедуры
|
||||||
|
|
||||||
|
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
|
||||||
|
// Проверим заполненность поля "Покупатель"
|
||||||
|
|
||||||
|
Если Покупатель.Пустая() Тогда
|
||||||
|
|
||||||
|
|
||||||
|
// Если поле Покупатель не заполнено, сообщим об этом пользователю
|
||||||
|
|
||||||
|
Сообщение = Новый СообщениеПользователю();
|
||||||
|
|
||||||
|
Сообщение.Текст = НСтр("ru = 'Не указан Покупатель, для которого выписывается накладная!'", "ru");
|
||||||
|
|
||||||
|
Сообщение.Поле = НСтр("ru = 'Покупатель'", "ru");
|
||||||
|
Сообщение.УстановитьДанные(ЭтотОбъект);
|
||||||
|
|
||||||
|
|
||||||
|
Сообщение.Сообщить();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Сообщим платформе, что мы сами обработали проверку заполнения поля "Покупатель"
|
||||||
|
|
||||||
|
ПроверяемыеРеквизиты.Удалить(ПроверяемыеРеквизиты.Найти("Покупатель"));
|
||||||
|
|
||||||
|
// Так как информация в документе не консистентна, то продолжать работу дальше смысла нет
|
||||||
|
|
||||||
|
Отказ = Истина;
|
||||||
|
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
|
||||||
|
//Если склад не заполнен, то проверим есть ли в документе что-то кроме услуг
|
||||||
|
Если Склад.Пустая() И Товары.Количество() > 0 Тогда
|
||||||
|
|
||||||
|
// Создадим запрос, чтобы получать информацию об товарах
|
||||||
|
Запрос = Новый Запрос("ВЫБРАТЬ
|
||||||
|
| Количество(*) КАК Количество
|
||||||
|
|ИЗ
|
||||||
|
| Справочник.Товары КАК Товары
|
||||||
|
|ГДЕ
|
||||||
|
| Товары.Ссылка В (&ТоварыВДокументе)
|
||||||
|
| И Товары.Вид = ЗНАЧЕНИЕ(Перечисление.ВидыТоваров.Товар)");
|
||||||
|
|
||||||
20
samples/1C Enterprise/ci_before_script.os
Normal file
20
samples/1C Enterprise/ci_before_script.os
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
Каталог = ОбъединитьПути(ТекущийКаталог(), "libs\oscript-library\src");
|
||||||
|
Загрузчик_Оригинал_ИмяФайла = ОбъединитьПути(Каталог, "package-loader.os");
|
||||||
|
|
||||||
|
Файлы = НайтиФайлы(Каталог, , Ложь);
|
||||||
|
Для Каждого ВыбФайл Из Файлы Цикл
|
||||||
|
|
||||||
|
Если ВыбФайл.ЭтоФайл() Тогда
|
||||||
|
Продолжить;
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
Загрузчик_ИмяФайла = ОбъединитьПути(ВыбФайл.ПолноеИмя, "package-loader.os");
|
||||||
|
Загрузчик_Файл = Новый Файл(Загрузчик_ИмяФайла);
|
||||||
|
|
||||||
|
Если Загрузчик_Файл.Существует() Тогда
|
||||||
|
Продолжить;
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
КопироватьФайл(Загрузчик_Оригинал_ИмяФайла, Загрузчик_ИмяФайла);
|
||||||
|
|
||||||
|
КонецЦикла;
|
||||||
42
samples/1C Enterprise/test_canCompile.os
Normal file
42
samples/1C Enterprise/test_canCompile.os
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
#Использовать "../libs/oscript-library/src/v8runner"
|
||||||
|
#Использовать "../libs/oscript-library/src/tempfiles"
|
||||||
|
|
||||||
|
Перем Лог;
|
||||||
|
Перем КодВозврата;
|
||||||
|
|
||||||
|
Процедура Инициализация()
|
||||||
|
|
||||||
|
Лог = Логирование.ПолучитьЛог("oscript.app.gitlab-test_CanCompile");
|
||||||
|
КодВозврата = 0;
|
||||||
|
|
||||||
|
КонецПроцедуры
|
||||||
|
|
||||||
|
Процедура ВыполнитьТест()
|
||||||
|
|
||||||
|
Конфигуратор = Новый УправлениеКонфигуратором();
|
||||||
|
|
||||||
|
ПараметрыЗапуска = Конфигуратор.ПолучитьПараметрыЗапуска();
|
||||||
|
КомандаЗапуска = "/LoadConfigFromFiles ""%1""";
|
||||||
|
КомандаЗапуска = СтрШаблон(КомандаЗапуска, ТекущийКаталог() + "\source\cf");
|
||||||
|
|
||||||
|
Лог.Информация("Команда обновления конфигурации: " + КомандаЗапуска);
|
||||||
|
|
||||||
|
ПараметрыЗапуска.Добавить(КомандаЗапуска);
|
||||||
|
|
||||||
|
Попытка
|
||||||
|
Конфигуратор.ВыполнитьКоманду(ПараметрыЗапуска);
|
||||||
|
Исключение
|
||||||
|
|
||||||
|
Лог.Ошибка(Конфигуратор.ВыводКоманды());
|
||||||
|
КодВозврата = 1;
|
||||||
|
|
||||||
|
КонецПопытки;
|
||||||
|
|
||||||
|
УдалитьФайлы(Конфигуратор.ПутьКВременнойБазе());
|
||||||
|
|
||||||
|
КонецПроцедуры
|
||||||
|
|
||||||
|
Инициализация();
|
||||||
|
ВыполнитьТест();
|
||||||
|
|
||||||
|
ЗавершитьРаботу(КодВозврата);
|
||||||
190
samples/ABNF/toml.abnf
Normal file
190
samples/ABNF/toml.abnf
Normal file
@@ -0,0 +1,190 @@
|
|||||||
|
; Source: https://github.com/toml-lang/toml
|
||||||
|
; License: MIT
|
||||||
|
|
||||||
|
;; This is an attempt to define TOML in ABNF according to the grammar defined
|
||||||
|
;; in RFC 4234 (http://www.ietf.org/rfc/rfc4234.txt).
|
||||||
|
|
||||||
|
;; TOML
|
||||||
|
|
||||||
|
toml = expression *( newline expression )
|
||||||
|
expression = (
|
||||||
|
ws /
|
||||||
|
ws comment /
|
||||||
|
ws keyval ws [ comment ] /
|
||||||
|
ws table ws [ comment ]
|
||||||
|
)
|
||||||
|
|
||||||
|
;; Newline
|
||||||
|
|
||||||
|
newline = (
|
||||||
|
%x0A / ; LF
|
||||||
|
%x0D.0A ; CRLF
|
||||||
|
)
|
||||||
|
|
||||||
|
newlines = 1*newline
|
||||||
|
|
||||||
|
;; Whitespace
|
||||||
|
|
||||||
|
ws = *(
|
||||||
|
%x20 / ; Space
|
||||||
|
%x09 ; Horizontal tab
|
||||||
|
)
|
||||||
|
|
||||||
|
;; Comment
|
||||||
|
|
||||||
|
comment-start-symbol = %x23 ; #
|
||||||
|
non-eol = %x09 / %x20-10FFFF
|
||||||
|
comment = comment-start-symbol *non-eol
|
||||||
|
|
||||||
|
;; Key-Value pairs
|
||||||
|
|
||||||
|
keyval-sep = ws %x3D ws ; =
|
||||||
|
keyval = key keyval-sep val
|
||||||
|
|
||||||
|
key = unquoted-key / quoted-key
|
||||||
|
unquoted-key = 1*( ALPHA / DIGIT / %x2D / %x5F ) ; A-Z / a-z / 0-9 / - / _
|
||||||
|
quoted-key = quotation-mark 1*basic-char quotation-mark ; See Basic Strings
|
||||||
|
|
||||||
|
val = integer / float / string / boolean / date-time / array / inline-table
|
||||||
|
|
||||||
|
;; Table
|
||||||
|
|
||||||
|
table = std-table / array-table
|
||||||
|
|
||||||
|
;; Standard Table
|
||||||
|
|
||||||
|
std-table-open = %x5B ws ; [ Left square bracket
|
||||||
|
std-table-close = ws %x5D ; ] Right square bracket
|
||||||
|
table-key-sep = ws %x2E ws ; . Period
|
||||||
|
|
||||||
|
std-table = std-table-open key *( table-key-sep key) std-table-close
|
||||||
|
|
||||||
|
;; Array Table
|
||||||
|
|
||||||
|
array-table-open = %x5B.5B ws ; [[ Double left square bracket
|
||||||
|
array-table-close = ws %x5D.5D ; ]] Double right square bracket
|
||||||
|
|
||||||
|
array-table = array-table-open key *( table-key-sep key) array-table-close
|
||||||
|
|
||||||
|
;; Integer
|
||||||
|
|
||||||
|
integer = [ minus / plus ] int
|
||||||
|
minus = %x2D ; -
|
||||||
|
plus = %x2B ; +
|
||||||
|
digit1-9 = %x31-39 ; 1-9
|
||||||
|
underscore = %x5F ; _
|
||||||
|
int = DIGIT / digit1-9 1*( DIGIT / underscore DIGIT )
|
||||||
|
|
||||||
|
;; Float
|
||||||
|
|
||||||
|
float = integer ( frac / frac exp / exp )
|
||||||
|
zero-prefixable-int = DIGIT *( DIGIT / underscore DIGIT )
|
||||||
|
frac = decimal-point zero-prefixable-int
|
||||||
|
decimal-point = %x2E ; .
|
||||||
|
exp = e integer
|
||||||
|
e = %x65 / %x45 ; e E
|
||||||
|
|
||||||
|
;; String
|
||||||
|
|
||||||
|
string = basic-string / ml-basic-string / literal-string / ml-literal-string
|
||||||
|
|
||||||
|
;; Basic String
|
||||||
|
|
||||||
|
basic-string = quotation-mark *basic-char quotation-mark
|
||||||
|
|
||||||
|
quotation-mark = %x22 ; "
|
||||||
|
|
||||||
|
basic-char = basic-unescaped / escaped
|
||||||
|
escaped = escape ( %x22 / ; " quotation mark U+0022
|
||||||
|
%x5C / ; \ reverse solidus U+005C
|
||||||
|
%x2F / ; / solidus U+002F
|
||||||
|
%x62 / ; b backspace U+0008
|
||||||
|
%x66 / ; f form feed U+000C
|
||||||
|
%x6E / ; n line feed U+000A
|
||||||
|
%x72 / ; r carriage return U+000D
|
||||||
|
%x74 / ; t tab U+0009
|
||||||
|
%x75 4HEXDIG / ; uXXXX U+XXXX
|
||||||
|
%x55 8HEXDIG ) ; UXXXXXXXX U+XXXXXXXX
|
||||||
|
|
||||||
|
basic-unescaped = %x20-21 / %x23-5B / %x5D-10FFFF
|
||||||
|
|
||||||
|
escape = %x5C ; \
|
||||||
|
|
||||||
|
;; Multiline Basic String
|
||||||
|
|
||||||
|
ml-basic-string-delim = quotation-mark quotation-mark quotation-mark
|
||||||
|
ml-basic-string = ml-basic-string-delim ml-basic-body ml-basic-string-delim
|
||||||
|
ml-basic-body = *( ml-basic-char / newline / ( escape newline ))
|
||||||
|
|
||||||
|
ml-basic-char = ml-basic-unescaped / escaped
|
||||||
|
ml-basic-unescaped = %x20-5B / %x5D-10FFFF
|
||||||
|
|
||||||
|
;; Literal String
|
||||||
|
|
||||||
|
literal-string = apostraphe *literal-char apostraphe
|
||||||
|
|
||||||
|
apostraphe = %x27 ; ' Apostrophe
|
||||||
|
|
||||||
|
literal-char = %x09 / %x20-26 / %x28-10FFFF
|
||||||
|
|
||||||
|
;; Multiline Literal String
|
||||||
|
|
||||||
|
ml-literal-string-delim = apostraphe apostraphe apostraphe
|
||||||
|
ml-literal-string = ml-literal-string-delim ml-literal-body ml-literal-string-delim
|
||||||
|
|
||||||
|
ml-literal-body = *( ml-literal-char / newline )
|
||||||
|
ml-literal-char = %x09 / %x20-10FFFF
|
||||||
|
|
||||||
|
;; Boolean
|
||||||
|
|
||||||
|
boolean = true / false
|
||||||
|
true = %x74.72.75.65 ; true
|
||||||
|
false = %x66.61.6C.73.65 ; false
|
||||||
|
|
||||||
|
;; Datetime (as defined in RFC 3339)
|
||||||
|
|
||||||
|
date-fullyear = 4DIGIT
|
||||||
|
date-month = 2DIGIT ; 01-12
|
||||||
|
date-mday = 2DIGIT ; 01-28, 01-29, 01-30, 01-31 based on month/year
|
||||||
|
time-hour = 2DIGIT ; 00-23
|
||||||
|
time-minute = 2DIGIT ; 00-59
|
||||||
|
time-second = 2DIGIT ; 00-58, 00-59, 00-60 based on leap second rules
|
||||||
|
time-secfrac = "." 1*DIGIT
|
||||||
|
time-numoffset = ( "+" / "-" ) time-hour ":" time-minute
|
||||||
|
time-offset = "Z" / time-numoffset
|
||||||
|
|
||||||
|
partial-time = time-hour ":" time-minute ":" time-second [time-secfrac]
|
||||||
|
full-date = date-fullyear "-" date-month "-" date-mday
|
||||||
|
full-time = partial-time time-offset
|
||||||
|
|
||||||
|
date-time = full-date "T" full-time
|
||||||
|
|
||||||
|
;; Array
|
||||||
|
|
||||||
|
array-open = %x5B ws ; [
|
||||||
|
array-close = ws %x5D ; ]
|
||||||
|
|
||||||
|
array = array-open array-values array-close
|
||||||
|
|
||||||
|
array-values = [ val [ array-sep ] [ ( comment newlines) / newlines ] /
|
||||||
|
val array-sep [ ( comment newlines) / newlines ] array-values ]
|
||||||
|
|
||||||
|
array-sep = ws %x2C ws ; , Comma
|
||||||
|
|
||||||
|
;; Inline Table
|
||||||
|
|
||||||
|
inline-table-open = %x7B ws ; {
|
||||||
|
inline-table-close = ws %x7D ; }
|
||||||
|
inline-table-sep = ws %x2C ws ; , Comma
|
||||||
|
|
||||||
|
inline-table = inline-table-open inline-table-keyvals inline-table-close
|
||||||
|
|
||||||
|
inline-table-keyvals = [ inline-table-keyvals-non-empty ]
|
||||||
|
inline-table-keyvals-non-empty = key keyval-sep val /
|
||||||
|
key keyval-sep val inline-table-sep inline-table-keyvals-non-empty
|
||||||
|
|
||||||
|
;; Built-in ABNF terms, reproduced here for clarity
|
||||||
|
|
||||||
|
; ALPHA = %x41-5A / %x61-7A ; A-Z / a-z
|
||||||
|
; DIGIT = %x30-39 ; 0-9
|
||||||
|
; HEXDIG = DIGIT / "A" / "B" / "C" / "D" / "E" / "F"
|
||||||
58
samples/AMPL/CT2.mod
Normal file
58
samples/AMPL/CT2.mod
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
param num_beams; # number of beams
|
||||||
|
|
||||||
|
param num_rows >= 1, integer; # number of rows
|
||||||
|
param num_cols >= 1, integer; # number of columns
|
||||||
|
|
||||||
|
set BEAMS := 1 .. num_beams; # set of beams
|
||||||
|
|
||||||
|
set ROWS := 1 .. num_rows; # set of rows
|
||||||
|
set COLUMNS := 1 .. num_cols; # set of columns
|
||||||
|
|
||||||
|
# values for entries of each beam
|
||||||
|
param beam_values {BEAMS, ROWS, COLUMNS} >= 0;
|
||||||
|
|
||||||
|
# values of tumor
|
||||||
|
param tumor_values {ROWS, COLUMNS} >= 0;
|
||||||
|
|
||||||
|
# values of critical area
|
||||||
|
param critical_values {ROWS, COLUMNS} >= 0;
|
||||||
|
|
||||||
|
# critical maximum dosage requirement
|
||||||
|
param critical_max;
|
||||||
|
|
||||||
|
# tumor minimum dosage requirement
|
||||||
|
param tumor_min;
|
||||||
|
|
||||||
|
# dosage scalar of each beam
|
||||||
|
var X {i in BEAMS} >= 0;
|
||||||
|
|
||||||
|
|
||||||
|
# define the tumor area which includes the locations where tumor exists
|
||||||
|
set tumor_area := {k in ROWS, h in COLUMNS: tumor_values[k,h] > 0};
|
||||||
|
|
||||||
|
# define critical area
|
||||||
|
set critical_area := {k in ROWS, h in COLUMNS: critical_values[k,h] > 0};
|
||||||
|
|
||||||
|
var S {(k,h) in tumor_area} >= 0;
|
||||||
|
var T {(k,h) in critical_area} >= 0;
|
||||||
|
|
||||||
|
# maximize total dosage in tumor area
|
||||||
|
maximize total_tumor_dosage: sum {i in BEAMS} sum {(k,h) in tumor_area} X[i] * beam_values[i,k,h];
|
||||||
|
|
||||||
|
# minimize total dosage in critical area
|
||||||
|
minimize total_critical_dosage: sum {i in BEAMS} sum {(k,h) in critical_area} X[i] * beam_values[i,k,h];
|
||||||
|
|
||||||
|
# minimize total tumor slack
|
||||||
|
minimize total_tumor_slack: sum {(k,h) in tumor_area} S[k,h];
|
||||||
|
|
||||||
|
# minimize total critical area slack
|
||||||
|
minimize total_critical_slack: sum {(k,h) in critical_area} T[k,h];
|
||||||
|
|
||||||
|
# total dosage at each tumor location [k,h] should be >= min tumor dosage with slack variable
|
||||||
|
subject to tumor_limit {(k,h) in tumor_area} : sum {i in BEAMS} X[i] * beam_values[i,k,h] == tumor_min - S[k,h];
|
||||||
|
|
||||||
|
# total dosage at each critical location [k,h] should be = max critical dosage with slack variable
|
||||||
|
subject to critical_limit {(k,h) in critical_area} : sum {i in BEAMS} X[i] * beam_values[i,k,h] == critical_max + T[k,h];
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
25
samples/AMPL/toy.ampl
Normal file
25
samples/AMPL/toy.ampl
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
# A toy knapsack problem from the LocalSolver docs written in AMPL.
|
||||||
|
|
||||||
|
set I;
|
||||||
|
param Value{I};
|
||||||
|
param Weight{I};
|
||||||
|
param KnapsackBound;
|
||||||
|
var Take{I} binary;
|
||||||
|
|
||||||
|
maximize TotalValue: sum{i in I} Take[i] * Value[i];
|
||||||
|
s.t. WeightLimit: sum{i in I} Take[i] * Weight[i] <= KnapsackBound;
|
||||||
|
|
||||||
|
data;
|
||||||
|
|
||||||
|
param:
|
||||||
|
I: Weight Value :=
|
||||||
|
0 10 1
|
||||||
|
1 60 10
|
||||||
|
2 30 15
|
||||||
|
3 40 40
|
||||||
|
4 30 60
|
||||||
|
5 20 90
|
||||||
|
6 20 100
|
||||||
|
7 2 15;
|
||||||
|
|
||||||
|
param KnapsackBound := 102;
|
||||||
55
samples/API Blueprint/actions.apib
Normal file
55
samples/API Blueprint/actions.apib
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
FORMAT: 1A
|
||||||
|
|
||||||
|
# Advanced Action API
|
||||||
|
A resource action is – in fact – a state transition. This API example demonstrates an action - state transition - to another resource.
|
||||||
|
|
||||||
|
## API Blueprint
|
||||||
|
+ [Previous: Resource Model](11.%20Resource%20Model.md)
|
||||||
|
+ [This: Raw API Blueprint](https://raw.github.com/apiaryio/api-blueprint/master/examples/11.%20Advanced%20Action.md)
|
||||||
|
|
||||||
|
# Tasks [/tasks/tasks{?status,priority}]
|
||||||
|
|
||||||
|
+ Parameters
|
||||||
|
+ status (string)
|
||||||
|
+ priority (number)
|
||||||
|
|
||||||
|
## List All Tasks [GET]
|
||||||
|
|
||||||
|
+ Response 200 (application/json)
|
||||||
|
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"id": 123,
|
||||||
|
"name": "Exercise in gym",
|
||||||
|
"done": false,
|
||||||
|
"type": "task"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 124,
|
||||||
|
"name": "Shop for groceries",
|
||||||
|
"done": true,
|
||||||
|
"type": "task"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
## Retrieve Task [GET /task/{id}]
|
||||||
|
This is a state transition to another resource
|
||||||
|
|
||||||
|
+ Parameters
|
||||||
|
+ id (string)
|
||||||
|
|
||||||
|
+ Response 200 (application/json)
|
||||||
|
|
||||||
|
{
|
||||||
|
"id": 123,
|
||||||
|
"name": "Go to gym",
|
||||||
|
"done": false,
|
||||||
|
"type": "task"
|
||||||
|
}
|
||||||
|
|
||||||
|
## Delete Task [DELETE /task/{id}]
|
||||||
|
|
||||||
|
+ Parameters
|
||||||
|
+ id (string)
|
||||||
|
|
||||||
|
+ Response 204
|
||||||
39
samples/API Blueprint/attributes.apib
Normal file
39
samples/API Blueprint/attributes.apib
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
FORMAT: 1A
|
||||||
|
|
||||||
|
# Attributes API
|
||||||
|
This API example demonstrates how to describe body attributes of a request or response message.
|
||||||
|
|
||||||
|
In this case, the description is complementary (and duplicate!) to the provided JSON example in the body section. The [Advanced Attributes](09.%20Advanced%20Attributes.md) API example will demonstrate how to avoid duplicates and how to reuse attributes descriptions.
|
||||||
|
|
||||||
|
## API Blueprint
|
||||||
|
+ [Previous: Parameters](07.%20Parameters.md)
|
||||||
|
+ [This: Raw API Blueprint](https://raw.github.com/apiaryio/api-blueprint/master/examples/08.%20Attributes.md)
|
||||||
|
+ [Next: Advanced Attributes](09.%20Advanced%20Attributes.md)
|
||||||
|
|
||||||
|
# Group Coupons
|
||||||
|
|
||||||
|
## Coupon [/coupons/{id}]
|
||||||
|
A coupon contains information about a percent-off or amount-off discount you might want to apply to a customer.
|
||||||
|
|
||||||
|
### Retrieve a Coupon [GET]
|
||||||
|
Retrieves the coupon with the given ID.
|
||||||
|
|
||||||
|
+ Response 200 (application/json)
|
||||||
|
|
||||||
|
+ Attributes (object)
|
||||||
|
+ id: 250FF (string)
|
||||||
|
+ created: 1415203908 (number) - Time stamp
|
||||||
|
+ percent_off: 25 (number)
|
||||||
|
|
||||||
|
A positive integer between 1 and 100 that represents the discount the coupon will apply.
|
||||||
|
|
||||||
|
+ redeem_by (number) - Date after which the coupon can no longer be redeemed
|
||||||
|
|
||||||
|
+ Body
|
||||||
|
|
||||||
|
{
|
||||||
|
"id": "250FF",
|
||||||
|
"created": 1415203908,
|
||||||
|
"percent_off": 25,
|
||||||
|
"redeem_by:" null
|
||||||
|
}
|
||||||
18
samples/API Blueprint/simple.apib
Normal file
18
samples/API Blueprint/simple.apib
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
FORMAT: 1A
|
||||||
|
|
||||||
|
# The Simplest API
|
||||||
|
This is one of the simplest APIs written in the **API Blueprint**.
|
||||||
|
One plain resource combined with a method and that's it! We will explain what is going on in the next installment - [Resource and Actions](02.%20Resource%20and%20Actions.md).
|
||||||
|
|
||||||
|
**Note:** As we progress through the examples, do not also forget to view the [Raw](https://raw.github.com/apiaryio/api-blueprint/master/examples/01.%20Simplest%20API.md) code to see what is really going on in the API Blueprint, as opposed to just seeing the output of the Github Markdown parser.
|
||||||
|
|
||||||
|
Also please keep in mind that every single example in this course is a **real API Blueprint** and as such you can **parse** it with the [API Blueprint parser](https://github.com/apiaryio/drafter) or one of its [bindings](https://github.com/apiaryio/drafter#bindings).
|
||||||
|
|
||||||
|
## API Blueprint
|
||||||
|
+ [This: Raw API Blueprint](https://raw.github.com/apiaryio/api-blueprint/master/examples/01.%20Simplest%20API.md)
|
||||||
|
+ [Next: Resource and Actions](02.%20Resource%20and%20Actions.md)
|
||||||
|
|
||||||
|
# GET /message
|
||||||
|
+ Response 200 (text/plain)
|
||||||
|
|
||||||
|
Hello World!
|
||||||
7
samples/APL/hashbang
Executable file
7
samples/APL/hashbang
Executable file
@@ -0,0 +1,7 @@
|
|||||||
|
#!/usr/local/bin/apl --script
|
||||||
|
NEWLINE ← ⎕UCS 10
|
||||||
|
HEADERS ← 'Content-Type: text/plain', NEWLINE
|
||||||
|
HEADERS
|
||||||
|
⍝ ⎕←HEADERS
|
||||||
|
⍝ ⍕⎕TS
|
||||||
|
)OFF
|
||||||
33
samples/ASN.1/example.asn
Normal file
33
samples/ASN.1/example.asn
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
MyShopPurchaseOrders DEFINITIONS AUTOMATIC TAGS ::= BEGIN
|
||||||
|
|
||||||
|
PurchaseOrder ::= SEQUENCE {
|
||||||
|
dateOfOrder DATE,
|
||||||
|
customer CustomerInfo,
|
||||||
|
items ListOfItems
|
||||||
|
}
|
||||||
|
|
||||||
|
CustomerInfo ::= SEQUENCE {
|
||||||
|
companyName VisibleString (SIZE (3..50)),
|
||||||
|
billingAddress Address,
|
||||||
|
contactPhone NumericString (SIZE (7..12))
|
||||||
|
}
|
||||||
|
|
||||||
|
Address::= SEQUENCE {
|
||||||
|
street VisibleString (SIZE (5 .. 50)) OPTIONAL,
|
||||||
|
city VisibleString (SIZE (2..30)),
|
||||||
|
state VisibleString (SIZE(2) ^ FROM ("A".."Z")),
|
||||||
|
zipCode NumericString (SIZE(5 | 9))
|
||||||
|
}
|
||||||
|
|
||||||
|
ListOfItems ::= SEQUENCE (SIZE (1..100)) OF Item
|
||||||
|
|
||||||
|
Item ::= SEQUENCE {
|
||||||
|
itemCode INTEGER (1..99999),
|
||||||
|
color VisibleString ("Black" | "Blue" | "Brown"),
|
||||||
|
power INTEGER (110 | 220),
|
||||||
|
deliveryTime INTEGER (8..12 | 14..19),
|
||||||
|
quantity INTEGER (1..1000),
|
||||||
|
unitPrice REAL (1.00 .. 9999.00),
|
||||||
|
isTaxable BOOLEAN
|
||||||
|
}
|
||||||
|
END
|
||||||
318
samples/ATS/basis_ssntype.sats
Normal file
318
samples/ATS/basis_ssntype.sats
Normal file
@@ -0,0 +1,318 @@
|
|||||||
|
(*
|
||||||
|
* The MIT License (MIT)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014 Hongwei Xi
|
||||||
|
*
|
||||||
|
* 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.)
|
||||||
|
*)
|
||||||
|
|
||||||
|
// Source: https://github.com/githwxi/ATS-Postiats-contrib/blob/201d635062d0ea64ff5ba5457a4ea0bb4d5ae202/contrib/libats-/hwxi/teaching/mysession-g/SATS/basis_ssntype.sats
|
||||||
|
|
||||||
|
(*
|
||||||
|
** Basis for g-session types
|
||||||
|
*)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
staload
|
||||||
|
"./basis_intset.sats"
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
fun{}
|
||||||
|
channel_cap(): intGte(1)
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
abstype
|
||||||
|
session_msg
|
||||||
|
(i:int, j:int, a:vt@ype)
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
abstype ssession_nil
|
||||||
|
abstype ssession_cons(a:type, ssn:type)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
stadef msg = session_msg
|
||||||
|
//
|
||||||
|
stadef nil = ssession_nil
|
||||||
|
//
|
||||||
|
stadef :: = ssession_cons
|
||||||
|
stadef cons = ssession_cons
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
abstype
|
||||||
|
session_append
|
||||||
|
(ssn1: type, ssn2: type)
|
||||||
|
//
|
||||||
|
stadef append = session_append
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
abstype
|
||||||
|
session_choose
|
||||||
|
(
|
||||||
|
i:int, ssn1:type, ssn2:type
|
||||||
|
) (* session_choose *)
|
||||||
|
//
|
||||||
|
stadef choose = session_choose
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
abstype
|
||||||
|
session_repeat
|
||||||
|
(
|
||||||
|
i:int, ssn:type(*body*)
|
||||||
|
) (* session_repeat *)
|
||||||
|
//
|
||||||
|
stadef repeat = session_repeat
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
typedef
|
||||||
|
session_sing
|
||||||
|
(
|
||||||
|
i: int
|
||||||
|
, j: int
|
||||||
|
, a:vt@ype
|
||||||
|
) = cons(msg(i, j, a), nil)
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
absvtype
|
||||||
|
channel1_vtype
|
||||||
|
(G:iset, n:int, ssn:type) = ptr
|
||||||
|
//
|
||||||
|
vtypedef
|
||||||
|
channel1
|
||||||
|
(G:iset, n:int, ssn:type) = channel1_vtype(G, n, ssn)
|
||||||
|
//
|
||||||
|
vtypedef
|
||||||
|
cchannel1
|
||||||
|
(G:iset, n:int, ssn:type) = channel1_vtype(ncomp(n, G), n, ssn)
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
fun{}
|
||||||
|
channel1_get_nrole
|
||||||
|
{n:int}{ssn:type}{G:iset}
|
||||||
|
(chan: !channel1(G, n, ssn)): int(n)
|
||||||
|
//
|
||||||
|
fun{}
|
||||||
|
channel1_get_group
|
||||||
|
{n:int}{ssn:type}{G:iset}
|
||||||
|
(chan: !channel1(G, n, ssn)): intset(n,G)
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
fun
|
||||||
|
{a:vt0p}
|
||||||
|
channel1_close
|
||||||
|
{n:int}{ssn:type}{G:iset}(chan: channel1(G, n, nil)): void
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
fun{}
|
||||||
|
channel1_skipin
|
||||||
|
{a:vt0p}
|
||||||
|
{n:int}{ssn:type}{G:iset}
|
||||||
|
{i,j:nat | ismbr(G, i); ismbr(G, j)}
|
||||||
|
(
|
||||||
|
!channel1(G, n, msg(i, j, a)::ssn) >> channel1(G, n, ssn)
|
||||||
|
) : void // end-of-function
|
||||||
|
praxi
|
||||||
|
lemma_channel1_skipin
|
||||||
|
{a:vt0p}
|
||||||
|
{n:int}{ssn:type}{G:iset}
|
||||||
|
{i,j:nat | ismbr(G, i); ismbr(G, j)}
|
||||||
|
(
|
||||||
|
!channel1(G, n, msg(i, j, a)::ssn) >> channel1(G, n, ssn)
|
||||||
|
) : void // lemma_channel1_skipin
|
||||||
|
//
|
||||||
|
fun{}
|
||||||
|
channel1_skipex
|
||||||
|
{a:vt0p}
|
||||||
|
{n:int}{ssn:type}{G:iset}
|
||||||
|
{i,j:nat | ~ismbr(G, i); ~ismbr(G, j)}
|
||||||
|
(
|
||||||
|
!channel1(G, n, msg(i, j, a)::ssn) >> channel1(G, n, ssn)
|
||||||
|
) : void // end-of-function
|
||||||
|
praxi
|
||||||
|
lemma_channel1_skipex
|
||||||
|
{a:vt0p}
|
||||||
|
{n:int}{ssn:type}{G:iset}
|
||||||
|
{i,j:nat | ~ismbr(G, i); ~ismbr(G, j)}
|
||||||
|
(
|
||||||
|
!channel1(G, n, msg(i, j, a)::ssn) >> channel1(G, n, ssn)
|
||||||
|
) : void // lemma_channel1_skipex
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
fun
|
||||||
|
{a:vt0p}
|
||||||
|
channel1_send
|
||||||
|
{n:int}{ssn:type}{G:iset}
|
||||||
|
{i,j:nat | i < n; j < n; ismbr(G, i); ~ismbr(G, j)}
|
||||||
|
(
|
||||||
|
!channel1(G, n, msg(i, j, a)::ssn) >> channel1(G, n, ssn), int(i), int(j), a
|
||||||
|
) : void // end of [channel1_send]
|
||||||
|
//
|
||||||
|
fun
|
||||||
|
{a:vt0p}
|
||||||
|
channel1_recv
|
||||||
|
{n:int}{ssn:type}{G:iset}
|
||||||
|
{i,j:nat | i < n; j < n; ~ismbr(G, i); ismbr(G, j)}
|
||||||
|
(
|
||||||
|
!channel1(G, n, msg(i, j, a)::ssn) >> channel1(G, n, ssn), int(i), int(j), &a? >> a
|
||||||
|
) : void // end of [channel1_recv]
|
||||||
|
//
|
||||||
|
fun
|
||||||
|
{a:vt0p}
|
||||||
|
channel1_recv_val
|
||||||
|
{n:int}{ssn:type}{G:iset}
|
||||||
|
{i,j:nat | i < n; j < n; ~ismbr(G, i); ismbr(G, j)}
|
||||||
|
(!channel1(G, n, msg(i, j, a)::ssn) >> channel1(G, n, ssn), int(i), int(j)): (a)
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
fun{}
|
||||||
|
channel1_append
|
||||||
|
{n:int}
|
||||||
|
{ssn1,ssn2:type}
|
||||||
|
{G:iset}
|
||||||
|
(
|
||||||
|
chan: !channel1(G, n, append(ssn1, ssn2)) >> channel1(G, n, ssn2)
|
||||||
|
, fserv: (!channel1(G, n, ssn1) >> channel1(G, n, nil)) -<lincloptr1> void
|
||||||
|
) : void // end of [channel1_append]
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
datatype
|
||||||
|
choosetag
|
||||||
|
(
|
||||||
|
a:type, b:type, c:type
|
||||||
|
) =
|
||||||
|
| choosetag_l(a, b, a) of ()
|
||||||
|
| choosetag_r(a, b, b) of ()
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
fun{}
|
||||||
|
channel1_choose_l
|
||||||
|
{n:int}
|
||||||
|
{ssn1,ssn2:type}
|
||||||
|
{G:iset}
|
||||||
|
{i:nat | i < n; ismbr(G, i)}
|
||||||
|
(
|
||||||
|
!channel1(G, n, choose(i,ssn1,ssn2)) >> channel1(G, n, ssn1), i: int(i)
|
||||||
|
) : void // end of [channel1_choose_l]
|
||||||
|
//
|
||||||
|
fun{}
|
||||||
|
channel1_choose_r
|
||||||
|
{n:int}
|
||||||
|
{ssn1,ssn2:type}
|
||||||
|
{G:iset}
|
||||||
|
{i:nat | i < n; ismbr(G, i)}
|
||||||
|
(
|
||||||
|
!channel1(G, n, choose(i,ssn1,ssn2)) >> channel1(G, n, ssn2), i: int(i)
|
||||||
|
) : void // end of [channel1_choose_r]
|
||||||
|
//
|
||||||
|
fun{}
|
||||||
|
channel1_choose_tag
|
||||||
|
{n:int}
|
||||||
|
{ssn1,ssn2:type}
|
||||||
|
{G:iset}
|
||||||
|
{i:nat | i < n; ~isnil(G); ~ismbr(G, i)}
|
||||||
|
(
|
||||||
|
!channel1(G, n, choose(i,ssn1,ssn2)) >> channel1(G, n, ssn_chosen), i: int(i)
|
||||||
|
) : #[ssn_chosen:type] choosetag(ssn1, ssn2, ssn_chosen)
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
fun{}
|
||||||
|
channel1_repeat_0
|
||||||
|
{n:int}
|
||||||
|
{ssn:type}
|
||||||
|
{G:iset}
|
||||||
|
{i:nat | i < n; ismbr(G, i)}
|
||||||
|
(
|
||||||
|
!channel1(G, n, repeat(i,ssn)) >> channel1(G, n, nil), i: int(i)
|
||||||
|
) : void // end of [channel1_repeat_nil]
|
||||||
|
//
|
||||||
|
fun{}
|
||||||
|
channel1_repeat_1
|
||||||
|
{n:int}
|
||||||
|
{ssn:type}
|
||||||
|
{G:iset}
|
||||||
|
{i:nat | i < n; ismbr(G, i)}
|
||||||
|
(
|
||||||
|
!channel1(G, n, repeat(i,ssn)) >> channel1(G, n, append(ssn,repeat(i,ssn))), i: int(i)
|
||||||
|
) : void // end of [channel1_repeat_more]
|
||||||
|
//
|
||||||
|
fun{}
|
||||||
|
channel1_repeat_tag
|
||||||
|
{n:int}
|
||||||
|
{ssn:type}
|
||||||
|
{G:iset}
|
||||||
|
{i:nat | i < n; ~isnil(G); ~ismbr(G, i)}
|
||||||
|
(
|
||||||
|
!channel1(G, n, repeat(i,ssn)) >> channel1(G, n, ssn_chosen), i: int(i)
|
||||||
|
) : #[ssn_chosen:type] choosetag(nil, append(ssn,repeat(i,ssn)), ssn_chosen)
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
(*
|
||||||
|
//
|
||||||
|
// HX-2015-03-06:
|
||||||
|
// This one does not work with sschoose!!!
|
||||||
|
//
|
||||||
|
fun{}
|
||||||
|
channel1_link
|
||||||
|
{n:int}{ssn:type}
|
||||||
|
{G1,G2:iset | isnil(G1*G2)}
|
||||||
|
(channel1(G1, n, ssn), channel1(G2, n, ssn)): channel1(G1+G2, n, ssn)
|
||||||
|
*)
|
||||||
|
//
|
||||||
|
fun{}
|
||||||
|
channel1_link
|
||||||
|
{n:int}{ssn:type}
|
||||||
|
{G1,G2:iset | isful(G1+G2,n)}
|
||||||
|
(channel1(G1, n, ssn), channel1(G2, n, ssn)): channel1(G1*G2, n, ssn)
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
fun{}
|
||||||
|
channel1_link_elim
|
||||||
|
{n:int}{ssn:type}{G:iset}(channel1(G, n, ssn), cchannel1(G, n, ssn)): void
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
fun{}
|
||||||
|
cchannel1_create_exn
|
||||||
|
{n:nat}{ssn:type}{G:iset}
|
||||||
|
(
|
||||||
|
nrole: int(n), G: intset(n), fserv: channel1(G, n, ssn) -<lincloptr1> void
|
||||||
|
) : cchannel1(G, n, ssn) // end of [cchannel1_create_exn]
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
(* end of [basis_ssntype.sats] *)
|
||||||
179
samples/ATS/csv_parse.hats
Normal file
179
samples/ATS/csv_parse.hats
Normal file
@@ -0,0 +1,179 @@
|
|||||||
|
(*
|
||||||
|
* The MIT License (MIT)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014 Hongwei Xi
|
||||||
|
*
|
||||||
|
* 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.)
|
||||||
|
*)
|
||||||
|
|
||||||
|
// Source: https://github.com/githwxi/ATS-Postiats-contrib/blob/0f26aa0df8542d2ae21df9be1e13208f66f571d6/contrib/libats-/hwxi/teaching/mygrading/HATS/csv_parse.hats
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
// Author: Hongwei Xi
|
||||||
|
// Authoremail: gmhwxiATgmailDOTcom
|
||||||
|
// Start time: the first of July, 2016
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
#ifdef
|
||||||
|
MYGRADING_HATS
|
||||||
|
#then
|
||||||
|
#else
|
||||||
|
//
|
||||||
|
extern
|
||||||
|
fun
|
||||||
|
csv_parse_line
|
||||||
|
(
|
||||||
|
line: string
|
||||||
|
) : List0_vt(Strptr1)
|
||||||
|
//
|
||||||
|
#endif // #ifdef
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
local
|
||||||
|
//
|
||||||
|
staload
|
||||||
|
UN = "prelude/SATS/unsafe.sats"
|
||||||
|
//
|
||||||
|
extern
|
||||||
|
fun{}
|
||||||
|
getpos(): int
|
||||||
|
//
|
||||||
|
extern
|
||||||
|
fun{}
|
||||||
|
is_end(): bool
|
||||||
|
//
|
||||||
|
extern
|
||||||
|
fun{}
|
||||||
|
char_at(): int
|
||||||
|
//
|
||||||
|
extern
|
||||||
|
fun{}
|
||||||
|
Strptr1_at(i0: int): Strptr1
|
||||||
|
//
|
||||||
|
extern
|
||||||
|
fun{}
|
||||||
|
rmove(): void
|
||||||
|
extern
|
||||||
|
fun{}
|
||||||
|
rmove_while(test: char -<cloref1> bool): void
|
||||||
|
//
|
||||||
|
in (* in-of-local *)
|
||||||
|
//
|
||||||
|
implement
|
||||||
|
{}(*tmp*)
|
||||||
|
rmove_while
|
||||||
|
(test) = let
|
||||||
|
//
|
||||||
|
val c0 = char_at()
|
||||||
|
//
|
||||||
|
in
|
||||||
|
//
|
||||||
|
if c0 >= 0 then
|
||||||
|
if test(int2char0(c0)) then (rmove(); rmove_while(test)) else ()
|
||||||
|
// end of [if]
|
||||||
|
//
|
||||||
|
end // end of [rmove_while]
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement
|
||||||
|
csv_parse_line
|
||||||
|
(line) = let
|
||||||
|
//
|
||||||
|
val line = g1ofg0(line)
|
||||||
|
//
|
||||||
|
var i: int = 0
|
||||||
|
val p_i = addr@i
|
||||||
|
//
|
||||||
|
val n0 = sz2i(length(line))
|
||||||
|
//
|
||||||
|
macdef get_i() = $UN.ptr0_get<int>(p_i)
|
||||||
|
macdef inc_i() = $UN.ptr0_addby<int>(p_i, 1)
|
||||||
|
macdef set_i(i0) = $UN.ptr0_set<int>(p_i, ,(i0))
|
||||||
|
//
|
||||||
|
implement
|
||||||
|
getpos<>() = get_i()
|
||||||
|
//
|
||||||
|
implement
|
||||||
|
is_end<>() = get_i() >= n0
|
||||||
|
//
|
||||||
|
implement
|
||||||
|
char_at<>() = let
|
||||||
|
val i = get_i()
|
||||||
|
val i = ckastloc_gintGte(i, 0)
|
||||||
|
//
|
||||||
|
in
|
||||||
|
if i < n0 then char2u2int0(line[i]) else ~1
|
||||||
|
end // end of [char_at]
|
||||||
|
//
|
||||||
|
implement
|
||||||
|
Strptr1_at<>(i0) = let
|
||||||
|
//
|
||||||
|
val i1 = get_i()
|
||||||
|
val i0 = ckastloc_gintGte(i0, 0)
|
||||||
|
val i1 = ckastloc_gintBtwe(i1, i0, n0)
|
||||||
|
//
|
||||||
|
in
|
||||||
|
$UN.castvwtp0(
|
||||||
|
string_make_substring(line, i2sz(i0), i2sz(i1-i0))
|
||||||
|
) (* $UN.castvwtp0 *)
|
||||||
|
end // end of [Strptr1_at]
|
||||||
|
//
|
||||||
|
implement
|
||||||
|
rmove<>() =
|
||||||
|
if get_i() < n0 then inc_i()
|
||||||
|
//
|
||||||
|
vtypedef res_vt = List0_vt(Strptr1)
|
||||||
|
//
|
||||||
|
fun
|
||||||
|
loop
|
||||||
|
(
|
||||||
|
i: int, res: res_vt
|
||||||
|
) : res_vt =
|
||||||
|
if
|
||||||
|
is_end()
|
||||||
|
then res
|
||||||
|
else let
|
||||||
|
val () =
|
||||||
|
(
|
||||||
|
if i > 0 then rmove()
|
||||||
|
)
|
||||||
|
val i0 = getpos()
|
||||||
|
var f0 =
|
||||||
|
(
|
||||||
|
lam@(c: char) =<clo> c != ','
|
||||||
|
)
|
||||||
|
val () = rmove_while($UN.cast(addr@f0))
|
||||||
|
val s0 = Strptr1_at(i0)
|
||||||
|
in
|
||||||
|
loop(i+1, list_vt_cons(s0, res))
|
||||||
|
end // end of [else]
|
||||||
|
//
|
||||||
|
in
|
||||||
|
list_vt_reverse(loop(0(*i*), list_vt_nil((*void*))))
|
||||||
|
end // end of [csv_parse_line]
|
||||||
|
|
||||||
|
end // end of [local]
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
(* end of [csv_parse.hats] *)
|
||||||
694
samples/ATS/intinf_vt.dats
Normal file
694
samples/ATS/intinf_vt.dats
Normal file
@@ -0,0 +1,694 @@
|
|||||||
|
(***********************************************************************)
|
||||||
|
(* *)
|
||||||
|
(* ATS/contrib/atshwxi *)
|
||||||
|
(* *)
|
||||||
|
(***********************************************************************)
|
||||||
|
|
||||||
|
(*
|
||||||
|
** Copyright (C) 2013 Hongwei Xi, ATS Trustful Software, Inc.
|
||||||
|
**
|
||||||
|
** 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 stated 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.
|
||||||
|
*)
|
||||||
|
|
||||||
|
// Source: https://github.com/githwxi/ATS-Postiats-contrib/blob/04a984d9c08c1831f7dda8a05ce356db01f81850/contrib/libats-/hwxi/intinf/DATS/intinf_vt.dats
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
// Author: Hongwei Xi
|
||||||
|
// Authoremail: hwxi AT gmail DOT com
|
||||||
|
// Start Time: April, 2013
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
#include
|
||||||
|
"share/atspre_define.hats"
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
staload
|
||||||
|
UN = "prelude/SATS/unsafe.sats"
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
staload
|
||||||
|
GMP = "{$LIBGMP}/SATS/gmp.sats"
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
vtypedef mpz = $GMP.mpz_vt0ype
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
staload "./../SATS/intinf.sats"
|
||||||
|
staload "./../SATS/intinf_vt.sats"
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
macdef i2u (x) = g1int2uint_int_uint (,(x))
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
local
|
||||||
|
|
||||||
|
assume
|
||||||
|
intinf_vtype
|
||||||
|
(i: int) = // HX: [i] is a fake
|
||||||
|
[l:addr] (mpz @ l, mfree_gc_v (l) | ptr l)
|
||||||
|
// end of [intinf_vtype]
|
||||||
|
|
||||||
|
in (* in of [local] *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
intinf_make_int
|
||||||
|
(i) = (x) where
|
||||||
|
{
|
||||||
|
//
|
||||||
|
val x = ptr_alloc<mpz> ()
|
||||||
|
val () = $GMP.mpz_init_set_int (!(x.2), i)
|
||||||
|
//
|
||||||
|
} (* end of [intinf_make_int] *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
intinf_make_uint
|
||||||
|
(i) = (x) where
|
||||||
|
{
|
||||||
|
//
|
||||||
|
val x = ptr_alloc<mpz> ()
|
||||||
|
val () = $GMP.mpz_init_set_uint (!(x.2), i)
|
||||||
|
//
|
||||||
|
} (* end of [intinf_make_uint] *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
intinf_make_lint
|
||||||
|
(i) = (x) where
|
||||||
|
{
|
||||||
|
//
|
||||||
|
val x = ptr_alloc<mpz> ()
|
||||||
|
val () = $GMP.mpz_init_set_lint (!(x.2), i)
|
||||||
|
//
|
||||||
|
} (* end of [intinf_make_lint] *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
intinf_make_ulint
|
||||||
|
(i) = (x) where
|
||||||
|
{
|
||||||
|
//
|
||||||
|
val x = ptr_alloc<mpz> ()
|
||||||
|
val () = $GMP.mpz_init_set_ulint (!(x.2), i)
|
||||||
|
//
|
||||||
|
} (* end of [intinf_make_ulint] *)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
intinf_free (x) = let
|
||||||
|
val (pfat, pfgc | p) = x
|
||||||
|
val () = $GMP.mpz_clear (!p) in ptr_free (pfgc, pfat | p)
|
||||||
|
end (* end of [intinf_free] *)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
intinf_get_int (x) = $GMP.mpz_get_int (!(x.2))
|
||||||
|
implement{}
|
||||||
|
intinf_get_lint (x) = $GMP.mpz_get_lint (!(x.2))
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
intinf_get_strptr
|
||||||
|
(x, base) = $GMP.mpz_get_str_null (base, !(x.2))
|
||||||
|
// end of [intinf_get_strptr]
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
fprint_intinf_base
|
||||||
|
(out, x, base) = let
|
||||||
|
val nsz = $GMP.mpz_out_str (out, base, !(x.2))
|
||||||
|
in
|
||||||
|
//
|
||||||
|
if (nsz = 0) then
|
||||||
|
exit_errmsg (1, "libgmp/gmp: fprint_intinf_base")
|
||||||
|
// end of [if]
|
||||||
|
//
|
||||||
|
end (* fprint_intinf_base *)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{
|
||||||
|
} neg_intinf0
|
||||||
|
(x) = (x) where
|
||||||
|
{
|
||||||
|
//
|
||||||
|
val () = $GMP.mpz_neg (!(x.2))
|
||||||
|
//
|
||||||
|
} (* end of [neg_intinf0] *)
|
||||||
|
|
||||||
|
implement{
|
||||||
|
} neg_intinf1
|
||||||
|
(x) = (y) where
|
||||||
|
{
|
||||||
|
//
|
||||||
|
val y = ptr_alloc<mpz> ()
|
||||||
|
val () = $GMP.mpz_init (!(y.2))
|
||||||
|
val () = $GMP.mpz_neg (!(y.2), !(x.2))
|
||||||
|
//
|
||||||
|
} (* end of [neg_intinf1] *)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{
|
||||||
|
} abs_intinf0
|
||||||
|
(x) = (x) where
|
||||||
|
{
|
||||||
|
//
|
||||||
|
val () = $GMP.mpz_abs (!(x.2))
|
||||||
|
//
|
||||||
|
} (* end of [abs_intinf0] *)
|
||||||
|
|
||||||
|
implement{
|
||||||
|
} abs_intinf1
|
||||||
|
(x) = (y) where
|
||||||
|
{
|
||||||
|
//
|
||||||
|
val y = ptr_alloc<mpz> ()
|
||||||
|
val () = $GMP.mpz_init (!(y.2))
|
||||||
|
val () = $GMP.mpz_abs (!(y.2), !(x.2))
|
||||||
|
//
|
||||||
|
} (* end of [abs_intinf1] *)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
succ_intinf0 (x) = add_intinf0_int (x, 1)
|
||||||
|
implement{}
|
||||||
|
succ_intinf1 (x) = add_intinf1_int (x, 1)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
pred_intinf0 (x) = sub_intinf0_int (x, 1)
|
||||||
|
implement{}
|
||||||
|
pred_intinf1 (x) = sub_intinf1_int (x, 1)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
add_intinf0_int
|
||||||
|
(x, y) = (x) where
|
||||||
|
{
|
||||||
|
//
|
||||||
|
val () = $GMP.mpz_add2_int (!(x.2), y)
|
||||||
|
//
|
||||||
|
} (* end of [add_intinf0_int] *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
add_intinf1_int
|
||||||
|
(x, y) = (z) where
|
||||||
|
{
|
||||||
|
//
|
||||||
|
val z = ptr_alloc<mpz> ()
|
||||||
|
val () = $GMP.mpz_init (!(z.2))
|
||||||
|
val () = $GMP.mpz_add3_int (!(z.2), !(x.2), y)
|
||||||
|
//
|
||||||
|
} (* end of [add_intinf1_int] *)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
add_int_intinf0 (x, y) = add_intinf0_int (y, x)
|
||||||
|
implement{}
|
||||||
|
add_int_intinf1 (x, y) = add_intinf1_int (y, x)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
add_intinf0_intinf1
|
||||||
|
(x, y) = (x) where
|
||||||
|
{
|
||||||
|
//
|
||||||
|
val () = $GMP.mpz_add2_mpz (!(x.2), !(y.2))
|
||||||
|
//
|
||||||
|
} (* end of [add_intinf0_intinf1] *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
add_intinf1_intinf0
|
||||||
|
(x, y) = (y) where
|
||||||
|
{
|
||||||
|
//
|
||||||
|
val () = $GMP.mpz_add2_mpz (!(y.2), !(x.2))
|
||||||
|
//
|
||||||
|
} (* end of [add_intinf1_intinf0] *)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
add_intinf1_intinf1
|
||||||
|
(x, y) = (z) where
|
||||||
|
{
|
||||||
|
//
|
||||||
|
val z = ptr_alloc<mpz> ()
|
||||||
|
val () = $GMP.mpz_init (!(z.2))
|
||||||
|
val () = $GMP.mpz_add3_mpz (!(z.2), !(x.2), !(y.2))
|
||||||
|
//
|
||||||
|
} (* end of [add_intinf1_intinf1] *)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
sub_intinf0_int
|
||||||
|
(x, y) = (x) where
|
||||||
|
{
|
||||||
|
//
|
||||||
|
val () = $GMP.mpz_sub2_int (!(x.2), y)
|
||||||
|
//
|
||||||
|
} (* end of [sub_intinf0_int] *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
sub_intinf1_int
|
||||||
|
(x, y) = (z) where
|
||||||
|
{
|
||||||
|
//
|
||||||
|
val z = ptr_alloc<mpz> ()
|
||||||
|
val () = $GMP.mpz_init (!(z.2))
|
||||||
|
val () = $GMP.mpz_sub3_int (!(z.2), !(x.2), y)
|
||||||
|
//
|
||||||
|
} (* end of [sub_intinf1_int] *)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
sub_int_intinf0 (x, y) = let
|
||||||
|
val z = sub_intinf0_int (y, x) in neg_intinf0 (z)
|
||||||
|
end (* end of [sub_int_intinf0] *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
sub_int_intinf1 (x, y) = let
|
||||||
|
val z = sub_intinf1_int (y, x) in neg_intinf0 (z)
|
||||||
|
end (* end of [sub_int_intinf1] *)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
sub_intinf0_intinf1
|
||||||
|
(x, y) = (x) where
|
||||||
|
{
|
||||||
|
//
|
||||||
|
val () = $GMP.mpz_sub2_mpz (!(x.2), !(y.2))
|
||||||
|
//
|
||||||
|
} (* end of [sub_intinf0_intinf1] *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
sub_intinf1_intinf0
|
||||||
|
(x, y) = neg_intinf0 (sub_intinf0_intinf1 (y, x))
|
||||||
|
// end of [sub_intinf1_intinf0]
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
sub_intinf1_intinf1
|
||||||
|
(x, y) = (z) where
|
||||||
|
{
|
||||||
|
//
|
||||||
|
val z = ptr_alloc<mpz> ()
|
||||||
|
val () = $GMP.mpz_init (!(z.2))
|
||||||
|
val () = $GMP.mpz_sub3_mpz (!(z.2), !(x.2), !(y.2))
|
||||||
|
//
|
||||||
|
} (* end of [sub_intinf1_intinf1] *)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
mul_intinf0_int
|
||||||
|
(x, y) = (x) where
|
||||||
|
{
|
||||||
|
//
|
||||||
|
val () = $GMP.mpz_mul2_int (!(x.2), y)
|
||||||
|
//
|
||||||
|
} (* end of [mul_intinf0_int] *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
mul_intinf1_int
|
||||||
|
(x, y) = (z) where
|
||||||
|
{
|
||||||
|
//
|
||||||
|
val z = ptr_alloc<mpz> ()
|
||||||
|
val () = $GMP.mpz_init (!(z.2))
|
||||||
|
val () = $GMP.mpz_mul3_int (!(z.2), !(x.2), y)
|
||||||
|
//
|
||||||
|
} (* end of [mul_intinf1_int] *)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
mul_int_intinf0 (x, y) = mul_intinf0_int (y, x)
|
||||||
|
implement{}
|
||||||
|
mul_int_intinf1 (x, y) = mul_intinf1_int (y, x)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
mul_intinf0_intinf1
|
||||||
|
(x, y) = (x) where
|
||||||
|
{
|
||||||
|
//
|
||||||
|
val () = $GMP.mpz_mul2_mpz (!(x.2), !(y.2))
|
||||||
|
//
|
||||||
|
} (* end of [mul_intinf0_intinf1] *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
mul_intinf1_intinf0
|
||||||
|
(x, y) = (y) where
|
||||||
|
{
|
||||||
|
//
|
||||||
|
val () = $GMP.mpz_mul2_mpz (!(y.2), !(x.2))
|
||||||
|
//
|
||||||
|
} (* end of [mul_intinf0_intinf1] *)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
mul_intinf1_intinf1
|
||||||
|
(x, y) = (z) where
|
||||||
|
{
|
||||||
|
//
|
||||||
|
val z = ptr_alloc<mpz> ()
|
||||||
|
val () = $GMP.mpz_init (!(z.2))
|
||||||
|
val () = $GMP.mpz_mul3_mpz (!(z.2), !(x.2), !(y.2))
|
||||||
|
//
|
||||||
|
} (* end of [mul_intinf1_intinf1] *)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
div_intinf0_int
|
||||||
|
{i,j} (x, y) = let
|
||||||
|
in
|
||||||
|
//
|
||||||
|
if y >= 0 then let
|
||||||
|
val () = $GMP.mpz_tdiv2_q_uint (!(x.2), i2u(y)) in x
|
||||||
|
end else let
|
||||||
|
val () = $GMP.mpz_tdiv2_q_uint (!(x.2), i2u(~y)) in neg_intinf0 (x)
|
||||||
|
end // end of [if]
|
||||||
|
//
|
||||||
|
end (* end of [div_intinf0_int] *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
div_intinf1_int
|
||||||
|
{i,j} (x, y) = let
|
||||||
|
//
|
||||||
|
val z = ptr_alloc<mpz> ()
|
||||||
|
val () = $GMP.mpz_init (!(z.2))
|
||||||
|
//
|
||||||
|
in
|
||||||
|
//
|
||||||
|
if y >= 0 then let
|
||||||
|
val () = $GMP.mpz_tdiv3_q_uint (!(z.2), !(x.2), i2u(y)) in z
|
||||||
|
end else let
|
||||||
|
val () = $GMP.mpz_tdiv3_q_uint (!(z.2), !(x.2), i2u(~y)) in neg_intinf0 (z)
|
||||||
|
end // end of [if]
|
||||||
|
//
|
||||||
|
end (* end of [div_intinf1_int] *)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
div_intinf0_intinf1
|
||||||
|
(x, y) = (x) where
|
||||||
|
{
|
||||||
|
//
|
||||||
|
val () = $GMP.mpz_tdiv2_q_mpz (!(x.2), !(y.2))
|
||||||
|
//
|
||||||
|
} (* end of [div_intinf0_intinf1] *)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
div_intinf1_intinf1
|
||||||
|
(x, y) = (z) where
|
||||||
|
{
|
||||||
|
//
|
||||||
|
val z = ptr_alloc<mpz> ()
|
||||||
|
val () = $GMP.mpz_init (!(z.2))
|
||||||
|
val () = $GMP.mpz_tdiv3_q_mpz (!(z.2), !(x.2), !(y.2))
|
||||||
|
//
|
||||||
|
} (* end of [div_intinf1_intinf1] *)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
ndiv_intinf0_int (x, y) = div_intinf0_int (x, y)
|
||||||
|
implement{}
|
||||||
|
ndiv_intinf1_int (x, y) = div_intinf1_int (x, y)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
nmod_intinf0_int
|
||||||
|
{i,j} (x, y) = let
|
||||||
|
//
|
||||||
|
val r =
|
||||||
|
$GMP.mpz_fdiv_uint (!(x.2), i2u(y))
|
||||||
|
val () = intinf_free (x)
|
||||||
|
//
|
||||||
|
in
|
||||||
|
$UN.cast{intBtw(0,j)}(r)
|
||||||
|
end (* end of [nmod_intinf0_int] *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
nmod_intinf1_int
|
||||||
|
{i,j} (x, y) = let
|
||||||
|
//
|
||||||
|
val r = $GMP.mpz_fdiv_uint (!(x.2), i2u(y))
|
||||||
|
//
|
||||||
|
in
|
||||||
|
$UN.cast{intBtw(0,j)}(r)
|
||||||
|
end (* end of [nmod_intinf1_int] *)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
// comparison-functions
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
lt_intinf_int
|
||||||
|
{i,j} (x, y) = let
|
||||||
|
//
|
||||||
|
val sgn = $GMP.mpz_cmp_int (!(x.2), y)
|
||||||
|
val ans = (if sgn < 0 then true else false): bool
|
||||||
|
//
|
||||||
|
in
|
||||||
|
$UN.cast{bool(i < j)}(sgn)
|
||||||
|
end // end of [lt_intinf_int]
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
lt_intinf_intinf
|
||||||
|
{i,j} (x, y) = let
|
||||||
|
//
|
||||||
|
val sgn = $GMP.mpz_cmp_mpz (!(x.2), !(y.2))
|
||||||
|
val ans = (if sgn < 0 then true else false): bool
|
||||||
|
//
|
||||||
|
in
|
||||||
|
$UN.cast{bool(i < j)}(sgn)
|
||||||
|
end // end of [lt_intinf_intinf]
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
lte_intinf_int
|
||||||
|
{i,j} (x, y) = let
|
||||||
|
//
|
||||||
|
val sgn = $GMP.mpz_cmp_int (!(x.2), y)
|
||||||
|
val ans = (if sgn <= 0 then true else false): bool
|
||||||
|
//
|
||||||
|
in
|
||||||
|
$UN.cast{bool(i <= j)}(sgn)
|
||||||
|
end // end of [lte_intinf_int]
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
lte_intinf_intinf
|
||||||
|
{i,j} (x, y) = let
|
||||||
|
//
|
||||||
|
val sgn = $GMP.mpz_cmp_mpz (!(x.2), !(y.2))
|
||||||
|
val ans = (if sgn <= 0 then true else false): bool
|
||||||
|
//
|
||||||
|
in
|
||||||
|
$UN.cast{bool(i <= j)}(sgn)
|
||||||
|
end // end of [lte_intinf_intinf]
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
gt_intinf_int
|
||||||
|
{i,j} (x, y) = let
|
||||||
|
//
|
||||||
|
val sgn = $GMP.mpz_cmp_int (!(x.2), y)
|
||||||
|
val ans = (if sgn > 0 then true else false): bool
|
||||||
|
//
|
||||||
|
in
|
||||||
|
$UN.cast{bool(i > j)}(sgn)
|
||||||
|
end // end of [gt_intinf_int]
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
gt_intinf_intinf
|
||||||
|
{i,j} (x, y) = let
|
||||||
|
//
|
||||||
|
val sgn = $GMP.mpz_cmp_mpz (!(x.2), !(y.2))
|
||||||
|
val ans = (if sgn > 0 then true else false): bool
|
||||||
|
//
|
||||||
|
in
|
||||||
|
$UN.cast{bool(i > j)}(sgn)
|
||||||
|
end // end of [gt_intinf_intinf]
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
gte_intinf_int
|
||||||
|
{i,j} (x, y) = let
|
||||||
|
//
|
||||||
|
val sgn = $GMP.mpz_cmp_int (!(x.2), y)
|
||||||
|
val ans = (if sgn >= 0 then true else false): bool
|
||||||
|
//
|
||||||
|
in
|
||||||
|
$UN.cast{bool(i >= j)}(sgn)
|
||||||
|
end // end of [gte_intinf_int]
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
gte_intinf_intinf
|
||||||
|
{i,j} (x, y) = let
|
||||||
|
//
|
||||||
|
val sgn = $GMP.mpz_cmp_mpz (!(x.2), !(y.2))
|
||||||
|
val ans = (if sgn >= 0 then true else false): bool
|
||||||
|
//
|
||||||
|
in
|
||||||
|
$UN.cast{bool(i >= j)}(sgn)
|
||||||
|
end // end of [gte_intinf_intinf]
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
eq_intinf_int
|
||||||
|
{i,j} (x, y) = let
|
||||||
|
//
|
||||||
|
val sgn = $GMP.mpz_cmp_int (!(x.2), y)
|
||||||
|
val ans = (if sgn = 0 then true else false): bool
|
||||||
|
//
|
||||||
|
in
|
||||||
|
$UN.cast{bool(i == j)}(sgn)
|
||||||
|
end // end of [eq_intinf_int]
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
eq_intinf_intinf
|
||||||
|
{i,j} (x, y) = let
|
||||||
|
//
|
||||||
|
val sgn = $GMP.mpz_cmp_mpz (!(x.2), !(y.2))
|
||||||
|
val ans = (if sgn = 0 then true else false): bool
|
||||||
|
//
|
||||||
|
in
|
||||||
|
$UN.cast{bool(i == j)}(sgn)
|
||||||
|
end // end of [eq_intinf_intinf]
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
neq_intinf_int
|
||||||
|
{i,j} (x, y) = let
|
||||||
|
//
|
||||||
|
val sgn = $GMP.mpz_cmp_int (!(x.2), y)
|
||||||
|
val ans = (if sgn != 0 then true else false): bool
|
||||||
|
//
|
||||||
|
in
|
||||||
|
$UN.cast{bool(i != j)}(sgn)
|
||||||
|
end // end of [neq_intinf_int]
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
neq_intinf_intinf
|
||||||
|
{i,j} (x, y) = let
|
||||||
|
//
|
||||||
|
val sgn = $GMP.mpz_cmp_mpz (!(x.2), !(y.2))
|
||||||
|
val ans = (if sgn != 0 then true else false): bool
|
||||||
|
//
|
||||||
|
in
|
||||||
|
$UN.cast{bool(i != j)}(sgn)
|
||||||
|
end // end of [neq_intinf_intinf]
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
compare_intinf_int
|
||||||
|
{i,j} (x, y) = let
|
||||||
|
//
|
||||||
|
val sgn = $GMP.mpz_cmp_int (!(x.2), y)
|
||||||
|
val sgn = (if sgn < 0 then ~1 else (if sgn > 0 then 1 else 0)): int
|
||||||
|
//
|
||||||
|
in
|
||||||
|
$UN.cast{int(sgn(i-j))}(sgn)
|
||||||
|
end // end of [compare_intinf_int]
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
compare_int_intinf
|
||||||
|
{i,j} (x, y) = let
|
||||||
|
//
|
||||||
|
val sgn = $GMP.mpz_cmp_int (!(y.2), x)
|
||||||
|
val sgn = (if sgn > 0 then ~1 else (if sgn < 0 then 1 else 0)): int
|
||||||
|
//
|
||||||
|
in
|
||||||
|
$UN.cast{int(sgn(i-j))}(sgn)
|
||||||
|
end // end of [compare_int_intinf]
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
compare_intinf_intinf
|
||||||
|
{i,j} (x, y) = let
|
||||||
|
//
|
||||||
|
val sgn = $GMP.mpz_cmp_mpz (!(x.2), !(y.2))
|
||||||
|
val sgn = (if sgn < 0 then ~1 else (if sgn > 0 then 1 else 0)): int
|
||||||
|
//
|
||||||
|
in
|
||||||
|
$UN.cast{int(sgn(i-j))}(sgn)
|
||||||
|
end // end of [compare_intinf_intinf]
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
pow_intinf_int
|
||||||
|
(base, exp) = r where
|
||||||
|
{
|
||||||
|
//
|
||||||
|
val r = ptr_alloc<mpz> ()
|
||||||
|
val () = $GMP.mpz_init (!(r.2))
|
||||||
|
val () = $GMP.mpz_pow_uint (!(r.2), !(base.2), i2u(exp))
|
||||||
|
//
|
||||||
|
} (* end of [pow_intinf_int] *)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
end // end of [local]
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
print_intinf (x) = fprint_intinf (stdout_ref, x)
|
||||||
|
implement{}
|
||||||
|
prerr_intinf (x) = fprint_intinf (stderr_ref, x)
|
||||||
|
implement{}
|
||||||
|
fprint_intinf (out, x) = fprint_intinf_base (out, x, 10(*base*))
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
(* end of [intinf_vt.dats] *)
|
||||||
@@ -1,187 +0,0 @@
|
|||||||
(***********************************************************************)
|
|
||||||
(* *)
|
|
||||||
(* 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] *)
|
|
||||||
@@ -1,504 +0,0 @@
|
|||||||
(***********************************************************************)
|
|
||||||
(* *)
|
|
||||||
(* 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] *)
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
(***********************************************************************)
|
|
||||||
(* *)
|
|
||||||
(* 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] *)
|
|
||||||
@@ -1,215 +0,0 @@
|
|||||||
%{
|
|
||||||
#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")
|
|
||||||
%}
|
|
||||||
70
samples/Alpine Abuild/filenames/APKBUILD
Normal file
70
samples/Alpine Abuild/filenames/APKBUILD
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
# Contributor: Natanael Copa <ncopa@alpinelinux.org>
|
||||||
|
# Maintainer: Natanael Copa <ncopa@alpinelinux.org>
|
||||||
|
pkgname=abuild
|
||||||
|
pkgver=2.27.0
|
||||||
|
_ver=${pkgver%_git*}
|
||||||
|
pkgrel=0
|
||||||
|
pkgdesc="Script to build Alpine Packages"
|
||||||
|
url="http://git.alpinelinux.org/cgit/abuild/"
|
||||||
|
arch="all"
|
||||||
|
license="GPL2"
|
||||||
|
depends="fakeroot sudo pax-utils openssl apk-tools>=2.0.7-r1 libc-utils
|
||||||
|
attr tar pkgconf patch"
|
||||||
|
if [ "$CBUILD" = "$CHOST" ]; then
|
||||||
|
depends="$depends curl"
|
||||||
|
fi
|
||||||
|
makedepends_build="pkgconfig"
|
||||||
|
makedepends_host="openssl-dev"
|
||||||
|
makedepends="$makedepends_host $makedepends_build"
|
||||||
|
install="$pkgname.pre-install $pkgname.pre-upgrade"
|
||||||
|
subpackages="apkbuild-cpan:cpan apkbuild-gem-resolver:gems"
|
||||||
|
options="suid"
|
||||||
|
pkggroups="abuild"
|
||||||
|
source="http://dev.alpinelinux.org/archive/abuild/abuild-$_ver.tar.xz
|
||||||
|
"
|
||||||
|
|
||||||
|
_builddir="$srcdir/$pkgname-$_ver"
|
||||||
|
prepare() {
|
||||||
|
cd "$_builddir"
|
||||||
|
for i in $source; do
|
||||||
|
case $i in
|
||||||
|
*.patch)
|
||||||
|
msg "Applying $i"
|
||||||
|
patch -p1 -i "$srcdir"/$i || return 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
sed -i -e "/^CHOST=/s/=.*/=$CHOST/" abuild.conf
|
||||||
|
}
|
||||||
|
|
||||||
|
build() {
|
||||||
|
cd "$_builddir"
|
||||||
|
make || return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
package() {
|
||||||
|
cd "$_builddir"
|
||||||
|
make install DESTDIR="$pkgdir" || return 1
|
||||||
|
install -m 644 abuild.conf "$pkgdir"/etc/abuild.conf || return 1
|
||||||
|
install -d -m 775 -g abuild "$pkgdir"/var/cache/distfiles || return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
cpan() {
|
||||||
|
pkgdesc="Script to generate perl APKBUILD from CPAN"
|
||||||
|
depends="perl perl-libwww perl-json"
|
||||||
|
arch="noarch"
|
||||||
|
mkdir -p "$subpkgdir"/usr/bin
|
||||||
|
mv "$pkgdir"/usr/bin/apkbuild-cpan "$subpkgdir"/usr/bin/
|
||||||
|
}
|
||||||
|
|
||||||
|
gems() {
|
||||||
|
pkgdesc="APKBUILD dependency resolver for RubyGems"
|
||||||
|
depends="ruby ruby-augeas"
|
||||||
|
arch="noarch"
|
||||||
|
mkdir -p "$subpkgdir"/usr/bin
|
||||||
|
mv "$pkgdir"/usr/bin/apkbuild-gem-resolver "$subpkgdir"/usr/bin/
|
||||||
|
}
|
||||||
|
|
||||||
|
md5sums="c67e4c971c54b4d550e16db3ba331f96 abuild-2.27.0.tar.xz"
|
||||||
|
sha256sums="c8db017e3dd168edb20ceeb91971535cf66b8c95f29d3288f88ac755bffc60e5 abuild-2.27.0.tar.xz"
|
||||||
|
sha512sums="98e1da4e47f3ab68700b3bc992c83e103f770f3196e433788ee74145f57cd33e5239c87f0a7a15f7266840d5bad893fc8c0d4c826d663df53deaee2678c56984 abuild-2.27.0.tar.xz"
|
||||||
17
samples/ApacheConf/apache.vhost
Normal file
17
samples/ApacheConf/apache.vhost
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
#######################
|
||||||
|
# HOSTNAME
|
||||||
|
######################
|
||||||
|
|
||||||
|
<VirtualHost 127.0.0.1:PORT>
|
||||||
|
ServerAdmin patrick@heysparkbox.com
|
||||||
|
DocumentRoot "/var/www/HOSTNAME"
|
||||||
|
ServerName HOSTNAME
|
||||||
|
|
||||||
|
<Directory "/var/www/HOSTNAME">
|
||||||
|
Options Indexes MultiViews FollowSymLinks
|
||||||
|
AllowOverride All
|
||||||
|
Order allow,deny
|
||||||
|
Allow from all
|
||||||
|
DirectoryIndex index.php
|
||||||
|
</Directory>
|
||||||
|
</VirtualHost>
|
||||||
File diff suppressed because it is too large
Load Diff
55
samples/Arduino/octave_changer.ino
Normal file
55
samples/Arduino/octave_changer.ino
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
const int buttons[4] = {2,3,4,5};
|
||||||
|
const int octaves[2] = {6,7};
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
// initialize the digital pin as an output.
|
||||||
|
// Pin 13 has an LED connected on most Arduino boards:
|
||||||
|
|
||||||
|
pinMode(13,OUTPUT);
|
||||||
|
|
||||||
|
for(int i =0;i<sizeof(buttons)/sizeof(int);i++){
|
||||||
|
pinMode(buttons[i],INPUT );
|
||||||
|
}
|
||||||
|
|
||||||
|
for(int i =0;i<sizeof(octaves)/sizeof(int);i++){
|
||||||
|
pinMode(octaves[i],INPUT );
|
||||||
|
}
|
||||||
|
|
||||||
|
Serial.begin(9600);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
delay(1); // wait
|
||||||
|
int output = -1;
|
||||||
|
|
||||||
|
// Serial.print(digitalRead(buttons[0]));
|
||||||
|
|
||||||
|
for(int i =0;i<sizeof(buttons)/sizeof(int);i++){
|
||||||
|
if(digitalRead(buttons[i])==LOW
|
||||||
|
){
|
||||||
|
if(output<=0){
|
||||||
|
output=1;
|
||||||
|
}
|
||||||
|
output+=i+1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for(int i =0;i<sizeof(octaves)/sizeof(int);i++){
|
||||||
|
if(output<=0){
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(digitalRead(octaves[i])==LOW
|
||||||
|
){
|
||||||
|
output*=7*(i==1 ? -1 : 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(output>=0){
|
||||||
|
Serial.print(output);
|
||||||
|
Serial.println(";");
|
||||||
|
digitalWrite(13,HIGH);
|
||||||
|
}else{
|
||||||
|
digitalWrite(13,LOW);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,6 +1,9 @@
|
|||||||
AsciiDoc Home Page
|
AsciiDoc Home Page
|
||||||
==================
|
==================
|
||||||
|
|
||||||
|
Title
|
||||||
|
-----
|
||||||
|
|
||||||
Example Articles
|
Example Articles
|
||||||
~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~
|
||||||
- Item 1
|
- Item 1
|
||||||
|
|||||||
2841
samples/Assembly/forth.nasm
Normal file
2841
samples/Assembly/forth.nasm
Normal file
File diff suppressed because it is too large
Load Diff
245
samples/Assembly/fp_sqr32_160_comba.inc
Normal file
245
samples/Assembly/fp_sqr32_160_comba.inc
Normal file
@@ -0,0 +1,245 @@
|
|||||||
|
|
||||||
|
push r2
|
||||||
|
dint
|
||||||
|
nop
|
||||||
|
bis #MPYDLYWRTEN,&MPY32CTL0
|
||||||
|
bic #MPYDLY32,&MPY32CTL0
|
||||||
|
mov #SUMEXT,r13
|
||||||
|
clr r12
|
||||||
|
|
||||||
|
mov @r15+,r4
|
||||||
|
mov @r15+,r5
|
||||||
|
|
||||||
|
mov @r15+,r6
|
||||||
|
mov @r15+,r7
|
||||||
|
|
||||||
|
mov @r15+,r8
|
||||||
|
mov @r15+,r9
|
||||||
|
|
||||||
|
mov @r15+,r10
|
||||||
|
mov @r15+,r11
|
||||||
|
|
||||||
|
sub #2*8,r15
|
||||||
|
|
||||||
|
/* SELF_STEP_FIRST */
|
||||||
|
mov r4,&MPY32L
|
||||||
|
mov r5,&MPY32H
|
||||||
|
mov r4,&OP2L
|
||||||
|
mov r5,&OP2H
|
||||||
|
|
||||||
|
/* COLUMN_END */
|
||||||
|
mov &RES0,2*0(r14)
|
||||||
|
mov &RES1,2*(0+1)(r14)
|
||||||
|
mov &RES2,&RES0
|
||||||
|
mov &RES3,&RES1
|
||||||
|
mov r12,&RES2
|
||||||
|
clr &RES3
|
||||||
|
|
||||||
|
/* STEP_1 */
|
||||||
|
mov r4,&MAC32L
|
||||||
|
mov r5,&MAC32H
|
||||||
|
mov r6,&OP2L
|
||||||
|
mov r7,&OP2H
|
||||||
|
add &SUMEXT,r12
|
||||||
|
mov r6,&OP2L
|
||||||
|
mov r7,&OP2H
|
||||||
|
|
||||||
|
/* COLUMN_END */
|
||||||
|
mov &RES0,2*2(r14)
|
||||||
|
add @r13,r12
|
||||||
|
mov &RES1,2*(2+1)(r14)
|
||||||
|
mov &RES2,&RES0
|
||||||
|
mov &RES3,&RES1
|
||||||
|
mov r12,&RES2
|
||||||
|
clr &RES3
|
||||||
|
clr r12
|
||||||
|
|
||||||
|
/* STEP_1 */
|
||||||
|
mov r4,&MAC32L
|
||||||
|
mov r5,&MAC32H
|
||||||
|
mov r8,&OP2L
|
||||||
|
mov r9,&OP2H
|
||||||
|
add &SUMEXT,r12
|
||||||
|
mov r8,&OP2L
|
||||||
|
mov r9,&OP2H
|
||||||
|
|
||||||
|
/* SELF_STEP */
|
||||||
|
mov r6,&MAC32L
|
||||||
|
mov r7,&MAC32H
|
||||||
|
add @r13,r12
|
||||||
|
mov r6,&OP2L
|
||||||
|
mov r7,&OP2H
|
||||||
|
|
||||||
|
/* COLUMN_END */
|
||||||
|
mov &RES0,2*4(r14)
|
||||||
|
add @r13,r12
|
||||||
|
mov &RES1,2*(4+1)(r14)
|
||||||
|
mov &RES2,&RES0
|
||||||
|
mov &RES3,&RES1
|
||||||
|
mov r12,&RES2
|
||||||
|
clr &RES3
|
||||||
|
clr r12
|
||||||
|
|
||||||
|
/* STEP_1 */
|
||||||
|
mov r4,&MAC32L
|
||||||
|
mov r5,&MAC32H
|
||||||
|
mov r10,&OP2L
|
||||||
|
mov r11,&OP2H
|
||||||
|
add &SUMEXT,r12
|
||||||
|
mov r10,&OP2L
|
||||||
|
mov r11,&OP2H
|
||||||
|
|
||||||
|
/* STEP_2MORE */
|
||||||
|
mov r6,&MAC32L
|
||||||
|
mov r7,&MAC32H
|
||||||
|
add @r13,r12
|
||||||
|
mov r8,&OP2L
|
||||||
|
mov r9,&OP2H
|
||||||
|
add &SUMEXT,r12
|
||||||
|
mov r8,&OP2L
|
||||||
|
mov r9,&OP2H
|
||||||
|
|
||||||
|
/* COLUMN_END */
|
||||||
|
mov &RES0,2*6(r14)
|
||||||
|
add @r13,r12
|
||||||
|
mov &RES1,2*(6+1)(r14)
|
||||||
|
mov &RES2,&RES0
|
||||||
|
mov &RES3,&RES1
|
||||||
|
mov r12,&RES2
|
||||||
|
clr &RES3
|
||||||
|
clr r12
|
||||||
|
|
||||||
|
/* STEP_1 */
|
||||||
|
mov r4,&MAC32L
|
||||||
|
mov r5,&MAC32H
|
||||||
|
mov 2*8(r15),&OP2L
|
||||||
|
mov 2*9(r15),&OP2H
|
||||||
|
add &SUMEXT,r12
|
||||||
|
mov 2*8(r15),&OP2L
|
||||||
|
mov 2*9(r15),&OP2H
|
||||||
|
|
||||||
|
/* STEP_2MORE */
|
||||||
|
mov r6,&MAC32L
|
||||||
|
mov r7,&MAC32H
|
||||||
|
add @r13,r12
|
||||||
|
mov r10,&OP2L
|
||||||
|
mov r11,&OP2H
|
||||||
|
add &SUMEXT,r12
|
||||||
|
mov r10,&OP2L
|
||||||
|
mov r11,&OP2H
|
||||||
|
|
||||||
|
/* SELF_STEP */
|
||||||
|
mov r8,&MAC32L
|
||||||
|
mov r9,&MAC32H
|
||||||
|
add @r13,r12
|
||||||
|
mov r8,&OP2L
|
||||||
|
mov r9,&OP2H
|
||||||
|
|
||||||
|
/* COLUMN_END */
|
||||||
|
mov &RES0,2*8(r14)
|
||||||
|
add @r13,r12
|
||||||
|
mov &RES1,2*(8+1)(r14)
|
||||||
|
mov &RES2,&RES0
|
||||||
|
mov &RES3,&RES1
|
||||||
|
mov r12,&RES2
|
||||||
|
clr &RES3
|
||||||
|
clr r12
|
||||||
|
|
||||||
|
mov 2*8(r15),r4
|
||||||
|
mov 2*(8+1)(r15),r5
|
||||||
|
|
||||||
|
/* STEP_1 */
|
||||||
|
mov r6,&MAC32L
|
||||||
|
mov r7,&MAC32H
|
||||||
|
mov r4,&OP2L
|
||||||
|
mov r5,&OP2H
|
||||||
|
add &SUMEXT,r12
|
||||||
|
mov r4,&OP2L
|
||||||
|
mov r5,&OP2H
|
||||||
|
|
||||||
|
/* STEP_2MORE */
|
||||||
|
mov r8,&MAC32L
|
||||||
|
mov r9,&MAC32H
|
||||||
|
add @r13,r12
|
||||||
|
mov r10,&OP2L
|
||||||
|
mov r11,&OP2H
|
||||||
|
add &SUMEXT,r12
|
||||||
|
mov r10,&OP2L
|
||||||
|
mov r11,&OP2H
|
||||||
|
|
||||||
|
/* COLUMN_END */
|
||||||
|
mov &RES0,2*10(r14)
|
||||||
|
add @r13,r12
|
||||||
|
mov &RES1,2*(10+1)(r14)
|
||||||
|
mov &RES2,&RES0
|
||||||
|
mov &RES3,&RES1
|
||||||
|
mov r12,&RES2
|
||||||
|
clr &RES3
|
||||||
|
clr r12
|
||||||
|
|
||||||
|
/* STEP_1 */
|
||||||
|
mov r8,&MAC32L
|
||||||
|
mov r9,&MAC32H
|
||||||
|
mov r4,&OP2L
|
||||||
|
mov r5,&OP2H
|
||||||
|
add &SUMEXT,r12
|
||||||
|
mov r4,&OP2L
|
||||||
|
mov r5,&OP2H
|
||||||
|
|
||||||
|
/* SELF_STEP */
|
||||||
|
mov r10,&MAC32L
|
||||||
|
mov r11,&MAC32H
|
||||||
|
add @r13,r12
|
||||||
|
mov r10,&OP2L
|
||||||
|
mov r11,&OP2H
|
||||||
|
|
||||||
|
/* COLUMN_END */
|
||||||
|
mov &RES0,2*12(r14)
|
||||||
|
add @r13,r12
|
||||||
|
mov &RES1,2*(12+1)(r14)
|
||||||
|
mov &RES2,&RES0
|
||||||
|
mov &RES3,&RES1
|
||||||
|
mov r12,&RES2
|
||||||
|
clr &RES3
|
||||||
|
clr r12
|
||||||
|
|
||||||
|
/* STEP_1 */
|
||||||
|
mov r10,&MAC32L
|
||||||
|
mov r11,&MAC32H
|
||||||
|
mov r4,&OP2L
|
||||||
|
mov r5,&OP2H
|
||||||
|
add &SUMEXT,r12
|
||||||
|
mov r4,&OP2L
|
||||||
|
mov r5,&OP2H
|
||||||
|
|
||||||
|
/* COLUMN_END */
|
||||||
|
mov &RES0,2*14(r14)
|
||||||
|
add @r13,r12
|
||||||
|
mov &RES1,2*(14+1)(r14)
|
||||||
|
mov &RES2,&RES0
|
||||||
|
mov &RES3,&RES1
|
||||||
|
mov r12,&RES2
|
||||||
|
clr &RES3
|
||||||
|
clr r12
|
||||||
|
|
||||||
|
/* SELF_STEP_1 */
|
||||||
|
mov r4,&MAC32L
|
||||||
|
mov r5,&MAC32H
|
||||||
|
mov r4,&OP2L
|
||||||
|
mov r5,&OP2H
|
||||||
|
|
||||||
|
/* COLUMN_END */
|
||||||
|
mov &RES0,2*16(r14)
|
||||||
|
add @r13,r12
|
||||||
|
mov &RES1,2*(16+1)(r14)
|
||||||
|
mov &RES2,&RES0
|
||||||
|
mov &RES3,&RES1
|
||||||
|
mov r12,&RES2
|
||||||
|
clr &RES3
|
||||||
|
clr r12
|
||||||
|
|
||||||
|
/* END */
|
||||||
|
mov &RES0,2*18(r14)
|
||||||
|
mov &RES1,2*(18+1)(r14)
|
||||||
|
pop r2
|
||||||
|
eint
|
||||||
170
samples/Assembly/lib.inc
Normal file
170
samples/Assembly/lib.inc
Normal file
@@ -0,0 +1,170 @@
|
|||||||
|
|
||||||
|
; ------------------------------------------------------------------------
|
||||||
|
; 显示 AL 中的数字
|
||||||
|
; ------------------------------------------------------------------------
|
||||||
|
DispAL:
|
||||||
|
push ecx
|
||||||
|
push edx
|
||||||
|
push edi
|
||||||
|
|
||||||
|
mov edi, [dwDispPos]
|
||||||
|
|
||||||
|
mov ah, 0Fh ; 0000b: 黑底 1111b: 白字
|
||||||
|
mov dl, al
|
||||||
|
shr al, 4
|
||||||
|
mov ecx, 2
|
||||||
|
.begin:
|
||||||
|
and al, 01111b
|
||||||
|
cmp al, 9
|
||||||
|
ja .1
|
||||||
|
add al, '0'
|
||||||
|
jmp .2
|
||||||
|
.1:
|
||||||
|
sub al, 0Ah
|
||||||
|
add al, 'A'
|
||||||
|
.2:
|
||||||
|
mov [gs:edi], ax
|
||||||
|
add edi, 2
|
||||||
|
|
||||||
|
mov al, dl
|
||||||
|
loop .begin
|
||||||
|
;add edi, 2
|
||||||
|
|
||||||
|
mov [dwDispPos], edi
|
||||||
|
|
||||||
|
pop edi
|
||||||
|
pop edx
|
||||||
|
pop ecx
|
||||||
|
|
||||||
|
ret
|
||||||
|
; DispAL 结束-------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
; ------------------------------------------------------------------------
|
||||||
|
; 显示一个整形数
|
||||||
|
; ------------------------------------------------------------------------
|
||||||
|
DispInt:
|
||||||
|
mov eax, [esp + 4]
|
||||||
|
shr eax, 24
|
||||||
|
call DispAL
|
||||||
|
|
||||||
|
mov eax, [esp + 4]
|
||||||
|
shr eax, 16
|
||||||
|
call DispAL
|
||||||
|
|
||||||
|
mov eax, [esp + 4]
|
||||||
|
shr eax, 8
|
||||||
|
call DispAL
|
||||||
|
|
||||||
|
mov eax, [esp + 4]
|
||||||
|
call DispAL
|
||||||
|
|
||||||
|
mov ah, 07h ; 0000b: 黑底 0111b: 灰字
|
||||||
|
mov al, 'h'
|
||||||
|
push edi
|
||||||
|
mov edi, [dwDispPos]
|
||||||
|
mov [gs:edi], ax
|
||||||
|
add edi, 4
|
||||||
|
mov [dwDispPos], edi
|
||||||
|
pop edi
|
||||||
|
|
||||||
|
ret
|
||||||
|
; DispInt 结束------------------------------------------------------------
|
||||||
|
|
||||||
|
; ------------------------------------------------------------------------
|
||||||
|
; 显示一个字符串
|
||||||
|
; ------------------------------------------------------------------------
|
||||||
|
DispStr:
|
||||||
|
push ebp
|
||||||
|
mov ebp, esp
|
||||||
|
push ebx
|
||||||
|
push esi
|
||||||
|
push edi
|
||||||
|
|
||||||
|
mov esi, [ebp + 8] ; pszInfo
|
||||||
|
mov edi, [dwDispPos]
|
||||||
|
mov ah, 0Fh
|
||||||
|
.1:
|
||||||
|
lodsb
|
||||||
|
test al, al
|
||||||
|
jz .2
|
||||||
|
cmp al, 0Ah ; 是回车吗?
|
||||||
|
jnz .3
|
||||||
|
push eax
|
||||||
|
mov eax, edi
|
||||||
|
mov bl, 160
|
||||||
|
div bl
|
||||||
|
and eax, 0FFh
|
||||||
|
inc eax
|
||||||
|
mov bl, 160
|
||||||
|
mul bl
|
||||||
|
mov edi, eax
|
||||||
|
pop eax
|
||||||
|
jmp .1
|
||||||
|
.3:
|
||||||
|
mov [gs:edi], ax
|
||||||
|
add edi, 2
|
||||||
|
jmp .1
|
||||||
|
|
||||||
|
.2:
|
||||||
|
mov [dwDispPos], edi
|
||||||
|
|
||||||
|
pop edi
|
||||||
|
pop esi
|
||||||
|
pop ebx
|
||||||
|
pop ebp
|
||||||
|
ret
|
||||||
|
; DispStr 结束------------------------------------------------------------
|
||||||
|
|
||||||
|
; ------------------------------------------------------------------------
|
||||||
|
; 换行
|
||||||
|
; ------------------------------------------------------------------------
|
||||||
|
DispReturn:
|
||||||
|
push szReturn
|
||||||
|
call DispStr ;printf("\n");
|
||||||
|
add esp, 4
|
||||||
|
|
||||||
|
ret
|
||||||
|
; DispReturn 结束---------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
; ------------------------------------------------------------------------
|
||||||
|
; 内存拷贝,仿 memcpy
|
||||||
|
; ------------------------------------------------------------------------
|
||||||
|
; void* MemCpy(void* es:pDest, void* ds:pSrc, int iSize);
|
||||||
|
; ------------------------------------------------------------------------
|
||||||
|
MemCpy:
|
||||||
|
push ebp
|
||||||
|
mov ebp, esp
|
||||||
|
|
||||||
|
push esi
|
||||||
|
push edi
|
||||||
|
push ecx
|
||||||
|
|
||||||
|
mov edi, [ebp + 8] ; Destination
|
||||||
|
mov esi, [ebp + 12] ; Source
|
||||||
|
mov ecx, [ebp + 16] ; Counter
|
||||||
|
.1:
|
||||||
|
cmp ecx, 0 ; 判断计数器
|
||||||
|
jz .2 ; 计数器为零时跳出
|
||||||
|
|
||||||
|
mov al, [ds:esi] ; ┓
|
||||||
|
inc esi ; ┃
|
||||||
|
; ┣ 逐字节移动
|
||||||
|
mov byte [es:edi], al ; ┃
|
||||||
|
inc edi ; ┛
|
||||||
|
|
||||||
|
dec ecx ; 计数器减一
|
||||||
|
jmp .1 ; 循环
|
||||||
|
.2:
|
||||||
|
mov eax, [ebp + 8] ; 返回值
|
||||||
|
|
||||||
|
pop ecx
|
||||||
|
pop edi
|
||||||
|
pop esi
|
||||||
|
mov esp, ebp
|
||||||
|
pop ebp
|
||||||
|
|
||||||
|
ret ; 函数结束,返回
|
||||||
|
; MemCpy 结束-------------------------------------------------------------
|
||||||
|
|
||||||
321
samples/Assembly/macros.inc
Normal file
321
samples/Assembly/macros.inc
Normal file
@@ -0,0 +1,321 @@
|
|||||||
|
BLARGG_MACROS_INCLUDED = 1
|
||||||
|
|
||||||
|
; Allows extra error checking with modified version
|
||||||
|
; of ca65. Otherwise acts like a constant of 0.
|
||||||
|
ADDR = 0
|
||||||
|
|
||||||
|
; Switches to Segment and places Line there.
|
||||||
|
; Line can be an .align directive, .res, .byte, etc.
|
||||||
|
; Examples:
|
||||||
|
; seg_data BSS, .align 256
|
||||||
|
; seg_data RODATA, {message: .byte "Test",0}
|
||||||
|
.macro seg_data Segment, Line
|
||||||
|
.pushseg
|
||||||
|
.segment .string(Segment)
|
||||||
|
Line
|
||||||
|
.popseg
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
; Reserves Size bytes in Segment for Name.
|
||||||
|
; If Size is omitted, reserves one byte.
|
||||||
|
.macro seg_res Segment, Name, Size
|
||||||
|
.ifblank Size
|
||||||
|
seg_data Segment, Name: .res 1
|
||||||
|
.else
|
||||||
|
seg_data Segment, Name: .res Size
|
||||||
|
.endif
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
; Shortcuts for zeropage, bss, and stack
|
||||||
|
.define zp_res seg_res ZEROPAGE,
|
||||||
|
.define nv_res seg_res NVRAM,
|
||||||
|
.define bss_res seg_res BSS,
|
||||||
|
.define sp_res seg_res STACK,
|
||||||
|
.define zp_byte zp_res
|
||||||
|
|
||||||
|
; Copies byte from Src to Addr. If Src begins with #,
|
||||||
|
; it sets Addr to the immediate value.
|
||||||
|
; Out: A = byte copied
|
||||||
|
; Preserved: X, Y
|
||||||
|
.macro mov Addr, Src
|
||||||
|
lda Src
|
||||||
|
sta Addr
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
; Copies word from Src to Addr. If Src begins with #,
|
||||||
|
; it sets Addr the immediate value.
|
||||||
|
; Out: A = high byte of word
|
||||||
|
; Preserved: X, Y
|
||||||
|
.macro movw Addr, Src
|
||||||
|
.if .match( .left( 1, {Src} ), # )
|
||||||
|
lda #<(.right( .tcount( {Src} )-1, {Src} ))
|
||||||
|
sta Addr
|
||||||
|
lda #>(.right( .tcount( {Src} )-1, {Src} ))
|
||||||
|
sta 1+(Addr)
|
||||||
|
.else
|
||||||
|
lda Src
|
||||||
|
sta Addr
|
||||||
|
lda 1+(Src)
|
||||||
|
sta 1+(Addr)
|
||||||
|
.endif
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
; Increments 16-bit value at Addr.
|
||||||
|
; Out: EQ/NE based on resulting 16-bit value
|
||||||
|
; Preserved: A, X, Y
|
||||||
|
.macro incw Addr
|
||||||
|
.local @Skip
|
||||||
|
inc Addr
|
||||||
|
bne @Skip
|
||||||
|
inc 1+(Addr)
|
||||||
|
@Skip:
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
; Adds Src to word at Addr.
|
||||||
|
; Out: A = high byte of result, carry set appropriately
|
||||||
|
; Preserved: X, Y
|
||||||
|
.macro addw Addr, Src
|
||||||
|
.if .match( .left( 1, {Src} ), # )
|
||||||
|
addw_ Addr,(.right( .tcount( {Src} )-1, {Src} ))
|
||||||
|
.else
|
||||||
|
lda Addr
|
||||||
|
clc
|
||||||
|
adc Src
|
||||||
|
sta Addr
|
||||||
|
|
||||||
|
lda 1+(Addr)
|
||||||
|
adc 1+(Src)
|
||||||
|
sta 1+(Addr)
|
||||||
|
.endif
|
||||||
|
.endmacro
|
||||||
|
.macro addw_ Addr, Imm
|
||||||
|
lda Addr
|
||||||
|
clc
|
||||||
|
adc #<Imm
|
||||||
|
sta Addr
|
||||||
|
|
||||||
|
;.if (Imm >> 8) <> 0
|
||||||
|
lda 1+(Addr)
|
||||||
|
adc #>Imm
|
||||||
|
sta 1+(Addr)
|
||||||
|
;.else
|
||||||
|
; .local @Skip
|
||||||
|
; bcc @Skip
|
||||||
|
; inc 1+(Addr)
|
||||||
|
;@Skip:
|
||||||
|
;.endif
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
; Splits list of words into tables of low and high bytes
|
||||||
|
; Example: split_words foo, {$1234, $5678}
|
||||||
|
; expands to:
|
||||||
|
; foo_l: $34, $78
|
||||||
|
; foo_h: $12, $56
|
||||||
|
; foo_count = 2
|
||||||
|
.macro split_words Label, Words
|
||||||
|
.ident (.concat (.string(Label), "_l")): .lobytes Words
|
||||||
|
.ident (.concat (.string(Label), "_h")): .hibytes Words
|
||||||
|
.ident (.concat (.string(Label), "_count")) = * - .ident (.concat (.string(Label), "_h"))
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
.macro SELECT Bool, True, False, Extra
|
||||||
|
.ifndef Bool
|
||||||
|
False Extra
|
||||||
|
.elseif Bool <> 0
|
||||||
|
True Extra
|
||||||
|
.else
|
||||||
|
False Extra
|
||||||
|
.endif
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
.macro DEFAULT Name, Value
|
||||||
|
.ifndef Name
|
||||||
|
Name = Value
|
||||||
|
.endif
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
.ifp02
|
||||||
|
; 6502 doesn't define these alternate names
|
||||||
|
.define blt bcc
|
||||||
|
.define bge bcs
|
||||||
|
.endif
|
||||||
|
.define jlt jcc
|
||||||
|
.define jge jcs
|
||||||
|
|
||||||
|
; Jxx Target = Bxx Target, except it can go farther than
|
||||||
|
; 128 bytes. Implemented via branch around a JMP.
|
||||||
|
|
||||||
|
; Don't use ca65's longbranch, because they fail for @labels
|
||||||
|
;.macpack longbranch
|
||||||
|
|
||||||
|
.macro jeq Target
|
||||||
|
bne *+5
|
||||||
|
jmp Target
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
.macro jne Target
|
||||||
|
beq *+5
|
||||||
|
jmp Target
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
.macro jmi Target
|
||||||
|
bpl *+5
|
||||||
|
jmp Target
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
.macro jpl Target
|
||||||
|
bmi *+5
|
||||||
|
jmp Target
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
.macro jcs Target
|
||||||
|
bcc *+5
|
||||||
|
jmp Target
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
.macro jcc Target
|
||||||
|
bcs *+5
|
||||||
|
jmp Target
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
.macro jvs Target
|
||||||
|
bvc *+5
|
||||||
|
jmp Target
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
.macro jvc Target
|
||||||
|
bvs *+5
|
||||||
|
jmp Target
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
|
||||||
|
; Passes constant data to routine in addr
|
||||||
|
; Preserved: A, X, Y
|
||||||
|
.macro jsr_with_addr routine,data
|
||||||
|
.local Addr
|
||||||
|
pha
|
||||||
|
lda #<Addr
|
||||||
|
sta addr
|
||||||
|
lda #>Addr
|
||||||
|
sta addr+1
|
||||||
|
pla
|
||||||
|
jsr routine
|
||||||
|
seg_data RODATA,{Addr: data}
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
; Calls routine multiple times, with A having the
|
||||||
|
; value 'start' the first time, 'start+step' the
|
||||||
|
; second time, up to 'end' for the last time.
|
||||||
|
.macro for_loop routine,start,end,step
|
||||||
|
.local @for_loop
|
||||||
|
lda #start
|
||||||
|
@for_loop:
|
||||||
|
pha
|
||||||
|
jsr routine
|
||||||
|
pla
|
||||||
|
clc
|
||||||
|
adc #step
|
||||||
|
cmp #<((end)+(step))
|
||||||
|
bne @for_loop
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
; Calls routine n times. The value of A in the routine
|
||||||
|
; counts from 0 to n-1.
|
||||||
|
.macro loop_n_times routine,n
|
||||||
|
for_loop routine,0,n-1,+1
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
; Same as for_loop, except uses 16-bit value in YX.
|
||||||
|
; -256 <= step <= 255
|
||||||
|
.macro for_loop16 routine,start,end,step
|
||||||
|
.if (step) < -256 || (step) > 255
|
||||||
|
.error "Step must be within -256 to 255"
|
||||||
|
.endif
|
||||||
|
.local @for_loop_skip
|
||||||
|
.local @for_loop
|
||||||
|
ldy #>(start)
|
||||||
|
lda #<(start)
|
||||||
|
@for_loop:
|
||||||
|
tax
|
||||||
|
pha
|
||||||
|
tya
|
||||||
|
pha
|
||||||
|
jsr routine
|
||||||
|
pla
|
||||||
|
tay
|
||||||
|
pla
|
||||||
|
clc
|
||||||
|
adc #step
|
||||||
|
.if (step) > 0
|
||||||
|
bcc @for_loop_skip
|
||||||
|
iny
|
||||||
|
.else
|
||||||
|
bcs @for_loop_skip
|
||||||
|
dey
|
||||||
|
.endif
|
||||||
|
@for_loop_skip:
|
||||||
|
cmp #<((end)+(step))
|
||||||
|
bne @for_loop
|
||||||
|
cpy #>((end)+(step))
|
||||||
|
bne @for_loop
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
; Stores byte at addr
|
||||||
|
; Preserved: X, Y
|
||||||
|
.macro setb addr, byte
|
||||||
|
lda #byte
|
||||||
|
sta addr
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
; Stores word at addr
|
||||||
|
; Preserved: X, Y
|
||||||
|
.macro setw addr, word
|
||||||
|
lda #<(word)
|
||||||
|
sta addr
|
||||||
|
lda #>(word)
|
||||||
|
sta addr+1
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
; Loads XY with 16-bit immediate or value at address
|
||||||
|
.macro ldxy Arg
|
||||||
|
.if .match( .left( 1, {Arg} ), # )
|
||||||
|
ldy #<(.right( .tcount( {Arg} )-1, {Arg} ))
|
||||||
|
ldx #>(.right( .tcount( {Arg} )-1, {Arg} ))
|
||||||
|
.else
|
||||||
|
ldy (Arg)
|
||||||
|
ldx (Arg)+1
|
||||||
|
.endif
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
; Increments XY as 16-bit register, in CONSTANT time.
|
||||||
|
; Z flag set based on entire result.
|
||||||
|
; Preserved: A
|
||||||
|
; Time: 7 clocks
|
||||||
|
.macro inxy
|
||||||
|
iny ; 2
|
||||||
|
beq *+4 ; 3
|
||||||
|
; -1
|
||||||
|
bne *+3 ; 3
|
||||||
|
; -1
|
||||||
|
inx ; 2
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
; Negates A and adds it to operand
|
||||||
|
.macro subaf Operand
|
||||||
|
eor #$FF
|
||||||
|
sec
|
||||||
|
adc Operand
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
; Initializes CPU registers to reasonable values
|
||||||
|
; Preserved: A, Y
|
||||||
|
.macro init_cpu_regs
|
||||||
|
sei
|
||||||
|
cld ; unnecessary on NES, but might help on clone
|
||||||
|
ldx #$FF
|
||||||
|
txs
|
||||||
|
.ifndef BUILD_NSF
|
||||||
|
inx
|
||||||
|
stx PPUCTRL
|
||||||
|
.endif
|
||||||
|
.endmacro
|
||||||
25
samples/BitBake/gstreamer-libav.bb
Normal file
25
samples/BitBake/gstreamer-libav.bb
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
include gstreamer1.0-libav.inc
|
||||||
|
|
||||||
|
LIC_FILES_CHKSUM = "file://COPYING;md5=b234ee4d69f5fce4486a80fdaf4a4263 \
|
||||||
|
file://COPYING.LIB;md5=6762ed442b3822387a51c92d928ead0d \
|
||||||
|
file://ext/libav/gstav.h;beginline=1;endline=18;md5=a752c35267d8276fd9ca3db6994fca9c \
|
||||||
|
file://gst-libs/ext/libav/LICENSE;md5=23a54f59b82572c203a559346e89ed57 \
|
||||||
|
file://gst-libs/ext/libav/COPYING.GPLv2;md5=b234ee4d69f5fce4486a80fdaf4a4263 \
|
||||||
|
file://gst-libs/ext/libav/COPYING.GPLv3;md5=d32239bcb673463ab874e80d47fae504 \
|
||||||
|
file://gst-libs/ext/libav/COPYING.LGPLv2.1;md5=bd7a443320af8c812e4c18d1b79df004 \
|
||||||
|
file://gst-libs/ext/libav/COPYING.LGPLv3;md5=e6a600fd5e1d9cbde2d983680233ad02"
|
||||||
|
|
||||||
|
SRC_URI = " \
|
||||||
|
http://gstreamer.freedesktop.org/src/gst-libav/gst-libav-${PV}.tar.xz \
|
||||||
|
file://0001-Disable-yasm-for-libav-when-disable-yasm.patch \
|
||||||
|
"
|
||||||
|
SRC_URI[md5sum] = "86540dee14d31daf976eb2713f2294f3"
|
||||||
|
SRC_URI[sha256sum] = "585eb7971006100ad771a852e07bd2f3e23bcc6eb0b1253a40b5a0e40e4e7418"
|
||||||
|
|
||||||
|
LIBAV_EXTRA_CONFIGURE_COMMON_ARG = "--target-os=linux \
|
||||||
|
--cc='${CC}' --as='${CC}' --ld='${CC}' --nm='${NM}' --ar='${AR}' \
|
||||||
|
--ranlib='${RANLIB}' \
|
||||||
|
${GSTREAMER_1_0_DEBUG}"
|
||||||
|
|
||||||
|
S = "${WORKDIR}/gst-libav-${PV}"
|
||||||
|
|
||||||
13
samples/BitBake/qtbase-native.bb
Normal file
13
samples/BitBake/qtbase-native.bb
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
require qt5-git.inc
|
||||||
|
require ${PN}.inc
|
||||||
|
|
||||||
|
do_install_append() {
|
||||||
|
# for modules which are still using syncqt and call qtPrepareTool(QMAKE_SYNCQT, syncqt)
|
||||||
|
# e.g. qt3d, qtwayland
|
||||||
|
ln -sf syncqt.pl ${D}${OE_QMAKE_PATH_QT_BINS}/syncqt
|
||||||
|
}
|
||||||
|
|
||||||
|
QT_MODULE_BRANCH = "release"
|
||||||
|
# v5.2.1 + 168 commits
|
||||||
|
SRCREV = "08cbbde61778276ccdda73d89fd64d02c623779f"
|
||||||
|
|
||||||
21
samples/Blade/hello.blade
Normal file
21
samples/Blade/hello.blade
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>@yield('title', 'We love GitHub')</title>
|
||||||
|
@stack('scripts')
|
||||||
|
@stack('styles')
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
@include('partials.nav')
|
||||||
|
|
||||||
|
@yield('content')
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
@foreach($foo as $bar)
|
||||||
|
<li>{{ $bar }}</li>
|
||||||
|
@endforeach
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
{!! $raw_content !!}
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
21
samples/Blade/hello.blade.php
Normal file
21
samples/Blade/hello.blade.php
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>@yield('title', 'We love GitHub')</title>
|
||||||
|
@stack('scripts')
|
||||||
|
@stack('styles')
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
@include('partials.nav')
|
||||||
|
|
||||||
|
@yield('content')
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
@foreach($foo as $bar)
|
||||||
|
<li>{{ $bar }}</li>
|
||||||
|
@endforeach
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
{!! $raw_content !!}
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
195
samples/Brainfuck/factor.b
Normal file
195
samples/Brainfuck/factor.b
Normal file
@@ -0,0 +1,195 @@
|
|||||||
|
* factor an arbitrarily large positive integer
|
||||||
|
*
|
||||||
|
* Copyright (C) 1999 by Brian Raiter
|
||||||
|
* under the GNU General Public License
|
||||||
|
|
||||||
|
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>-
|
||||||
|
|
||||||
|
*
|
||||||
|
* read in the number
|
||||||
|
*
|
||||||
|
|
||||||
|
<<<<<<<<<+
|
||||||
|
[-[>>>>>>>>>>][-]<<<<<<<<<<[[->>>>>>>>>>+<<<<<<<<<<]<<<<<<<<<<]
|
||||||
|
>>>>>>>>>>,----------]
|
||||||
|
>>>>>>>>>>[------------------------------------->>>>>>>>>->]
|
||||||
|
<[+>[>>>>>>>>>+>]<-<<<<<<<<<<]-
|
||||||
|
|
||||||
|
*
|
||||||
|
* display the number and initialize the loop variable to two
|
||||||
|
*
|
||||||
|
|
||||||
|
[>++++++++++++++++++++++++++++++++++++++++++++++++.
|
||||||
|
------------------------------------------------<<<<<<<<<<<]
|
||||||
|
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.
|
||||||
|
--------------------------.[-]
|
||||||
|
>>>>>>>>>>>>++<<<<+
|
||||||
|
|
||||||
|
*
|
||||||
|
* the main loop
|
||||||
|
*
|
||||||
|
|
||||||
|
[ [-]>>
|
||||||
|
|
||||||
|
*
|
||||||
|
* make copies of the number and the loop variable
|
||||||
|
*
|
||||||
|
|
||||||
|
[>>>>[-]>[-]>[-]>[-]
|
||||||
|
>[-]>[-]
|
||||||
|
<<<<<<<[->>>+>+<<<<]>>>>>>>>]
|
||||||
|
<<<<<<<<<<[>>>>>>[-<<<<+>>>>]<<<<<<<<<<<<<<<<]>>>>>>>>>>
|
||||||
|
[>[->>>+>>+<<<<<]>>>>>>>>>]
|
||||||
|
<<<<<<<<<<[>>>>>>[-<<<<<+>>>>>]<<<<<<<<<<<<<<<<]>>>>>>>>>>
|
||||||
|
|
||||||
|
*
|
||||||
|
* divide the number by the loop variable
|
||||||
|
*
|
||||||
|
|
||||||
|
[>>>[-]>>>[-]>[-]>>>] initialize
|
||||||
|
<<<<<<<<<<[<<<<<<<<<<]
|
||||||
|
>>>>>>>>>[-]>>>>>>>+<<<<<<<<[+]+
|
||||||
|
[ ->> double divisor until above dividend
|
||||||
|
[>>>>>>[->++<]>>>>]<<<<<<<<<<
|
||||||
|
[>>>>>>>>[-]>[-]
|
||||||
|
<<<<[->>>++<<<]<<<<<<<<<<<<<<<]>>>>>>>>>>
|
||||||
|
[>>>>>>>>[->+<[->+<[->+<[->+<[->+<[->+<[->+<[->+<[->+<
|
||||||
|
[->--------->>>>>>>>>+<<<<<<<<<<[->+<]]]]]]]]]]]>>]
|
||||||
|
<<<<<<<<<<[>>>>>>>>>[-<+<<<+>>>>]<<<<<<<<<<<<<<<<<<<]>>>>>>>>>>
|
||||||
|
[>>>>>>>[-<+>[-<+>[-<+>[-<+>[-<+>[-<+>[-<+>[-<+>[-<+>
|
||||||
|
[-<--------->>>>>>>>>>>+<<<<<<<<<<[-<+>]]]]]]]]]]]>>>]
|
||||||
|
<<<<<<<<<<
|
||||||
|
[>>>>[->>>+>>+<<<<<]<<<<<<<<<<<<<<]
|
||||||
|
>>>>>>>>>>[>>>>>>>[-<<<+>>>]>>>]<<<<<<<<<<
|
||||||
|
[>>>>>>>>[->-<]>
|
||||||
|
[<<<<<<<<<[<[-]>>>>>>>>>>[-<<<<<<<<<<+>>>>>>>>>>]<<<<<<<<<<<<<<<<<<<]
|
||||||
|
>>>>>>>>>>>>>>>>>>>]
|
||||||
|
<<<<<<<<<<<<<<<<<<<]
|
||||||
|
>>>>>>>>>[+[+[+[+[+[+[+[+[+[+[[-]<+>]]]]]]]]]]]<
|
||||||
|
]
|
||||||
|
>>>>>>>>
|
||||||
|
[ subtract divisor from dividend
|
||||||
|
<<<<<<
|
||||||
|
[>>>>>>>>[-]>[-]<<<<<[->>>+>+<<<<]>>>>>>]<<<<<<<<<<
|
||||||
|
[>>>>>>>>[-<<<<+>>>>]<<<[->>>+>+<<<<]<<<<<<<<<<<<<<<]>>>>>>>>>>
|
||||||
|
[>>>>>>>>>[-<<<<+>>>>]>]<<<<<<<<<<
|
||||||
|
[>>>>>>>>[-<->]<<<<<<<<<<<<<<<<<<]>>>>>>>>>>
|
||||||
|
[>>>>>>>[->+<[->+<[->+<[->+<[->+<[->+<[->+<[->+<[->+<[->+<
|
||||||
|
[++++++++++[+>-<]>>>>>>>>>>-<<<<<<<<<<]]]]]]]]]]]>>>]
|
||||||
|
>>>>>>>+
|
||||||
|
[ if difference is nonnegative then
|
||||||
|
[-]<<<<<<<<<<<<<<<<< replace dividend and increment quotient
|
||||||
|
[>>>>[-]>>>>[-<<<<+>>>>]<<[->>+<<]<<<<<<<<<<<<<<<<]>>>>>>>>>>
|
||||||
|
[>>>>>>>>[->+<<<+>>]>>]<<<<<<<<<<
|
||||||
|
[>>>[->>>>>>+<<<<<<]<<<<<<<<<<<<<]>>>>>>>>>>
|
||||||
|
[>>>>>>>>>[-<<<<<<+>>>>>>[-<<<<<<+>>>>>>
|
||||||
|
[-<<<<<<+>>>>>>[-<<<<<<+>>>>>>
|
||||||
|
[-<<<<<<+>>>>>>[-<<<<<<+>>>>>>
|
||||||
|
[-<<<<<<+>>>>>>[-<<<<<<+>>>>>>
|
||||||
|
[-<<<<<<+>>>>>>[-<<<<<<--------->>>>>>>>>>>>>>>>+<<<<<<<<<<
|
||||||
|
[-<<<<<<+>>>>>>]]]]]]]]]]]>]
|
||||||
|
>>>>>>>
|
||||||
|
] halve divisor and loop until zero
|
||||||
|
<<<<<<<<<<<<<<<<<[<<<<<<<<<<]>>>>>>>>>>
|
||||||
|
[>>>>>>>>[-]<<[->+<]<[->>>+<<<]>>>>>]<<<<<<<<<<
|
||||||
|
[+>>>>>>>[-<<<<<<<+>>>>>>>[-<<<<<<<->>>>>>+>
|
||||||
|
[-<<<<<<<+>>>>>>>[-<<<<<<<->>>>>>+>
|
||||||
|
[-<<<<<<<+>>>>>>>[-<<<<<<<->>>>>>+>
|
||||||
|
[-<<<<<<<+>>>>>>>[-<<<<<<<->>>>>>+>
|
||||||
|
[-<<<<<<<+>>>>>>>]]]]]]]]]<<<<<<<
|
||||||
|
[->>>>>>>+<<<<<<<]-<<<<<<<<<<]
|
||||||
|
>>>>>>>
|
||||||
|
[-<<<<<<<<<<<+>>>>>>>>>>>]
|
||||||
|
>>>[>>>>>>>[-<<<<<<<<<<<+++++>>>>>>>>>>>]>>>]<<<<<<<<<<
|
||||||
|
[+>>>>>>>>[-<<<<<<<<+>>>>>>>>[-<<<<<<<<->>>>>+>>>
|
||||||
|
[-<<<<<<<<+>>>>>>>>[-<<<<<<<<->>>>>+>>>
|
||||||
|
[-<<<<<<<<+>>>>>>>>[-<<<<<<<<->>>>>+>>>
|
||||||
|
[-<<<<<<<<+>>>>>>>>[-<<<<<<<<->>>>>+>>>
|
||||||
|
[-<<<<<<<<+>>>>>>>>]]]]]]]]]<<<<<<<<
|
||||||
|
[->>>>>>>>+<<<<<<<<]-<<<<<<<<<<]
|
||||||
|
>>>>>>>>[-<<<<<<<<<<<<<+>>>>>>>>>>>>>]>>
|
||||||
|
[>>>>>>>>[-<<<<<<<<<<<<<+++++>>>>>>>>>>>>>]>>]<<<<<<<<<<
|
||||||
|
[<<<<<<<<<<]>>>>>>>>>>
|
||||||
|
>>>>>>
|
||||||
|
]
|
||||||
|
<<<<<<
|
||||||
|
|
||||||
|
*
|
||||||
|
* make copies of the loop variable and the quotient
|
||||||
|
*
|
||||||
|
|
||||||
|
[>>>[->>>>+>+<<<<<]>>>>>>>]
|
||||||
|
<<<<<<<<<<
|
||||||
|
[>>>>>>>[-<<<<+>>>>]<<<<<[->>>>>+>>+<<<<<<<]<<<<<<<<<<<<]
|
||||||
|
>>>>>>>>>>[>>>>>>>[-<<<<<+>>>>>]>>>]<<<<<<<<<<
|
||||||
|
|
||||||
|
*
|
||||||
|
* break out of the loop if the quotient is larger than the loop variable
|
||||||
|
*
|
||||||
|
|
||||||
|
[>>>>>>>>>[-<->]<
|
||||||
|
[<<<<<<<<
|
||||||
|
[<<[-]>>>>>>>>>>[-<<<<<<<<<<+>>>>>>>>>>]<<<<<<<<<<<<<<<<<<]
|
||||||
|
>>>>>>>>>>>>>>>>>>]<<<<<<<<<<<<<<<<<<]
|
||||||
|
>>>>>>>>[>-<[+[+[+[+[+[+[+[+[+[[-]>+<]]]]]]]]]]]>+
|
||||||
|
|
||||||
|
[ [-]
|
||||||
|
|
||||||
|
*
|
||||||
|
* partially increment the loop variable
|
||||||
|
*
|
||||||
|
|
||||||
|
<[-]+>>>>+>>>>>>>>[>>>>>>>>>>]<<<<<<<<<<
|
||||||
|
|
||||||
|
*
|
||||||
|
* examine the remainder for nonzero digits
|
||||||
|
*
|
||||||
|
|
||||||
|
[<<<<<<[<<<<[<<<<<<<<<<]>>>>+<<<<<<<<<<]<<<<]
|
||||||
|
>>>>>>>>>>>>>>>>>>>>[>>>>>>>>>>]<<<<<<<<<<[<<<<<<<<<<]
|
||||||
|
>>>>-
|
||||||
|
|
||||||
|
[ [+]
|
||||||
|
|
||||||
|
*
|
||||||
|
* decrement the loop variable and replace the number with the quotient
|
||||||
|
*
|
||||||
|
|
||||||
|
>>>>>>>>-<<[>[-]>>[-<<+>>]>>>>>>>]<<<<<<<<<<
|
||||||
|
|
||||||
|
*
|
||||||
|
* display the loop variable
|
||||||
|
*
|
||||||
|
|
||||||
|
[+>>[>>>>>>>>+>>]<<-<<<<<<<<<<]-
|
||||||
|
[>>++++++++++++++++++++++++++++++++++++++++++++++++.
|
||||||
|
------------------------------------------------<<<<<<<<<<<<]
|
||||||
|
++++++++++++++++++++++++++++++++.[-]>>>>
|
||||||
|
|
||||||
|
]
|
||||||
|
|
||||||
|
*
|
||||||
|
* normalize the loop variable
|
||||||
|
*
|
||||||
|
|
||||||
|
>>>>>>
|
||||||
|
[>>[->>>>>+<<<<<[->>>>>+<<<<<
|
||||||
|
[->>>>>+<<<<<[->>>>>+<<<<<
|
||||||
|
[->>>>>+<<<<<[->>>>>+<<<<<
|
||||||
|
[->>>>>+<<<<<[->>>>>+<<<<<
|
||||||
|
[->>>>>+<<<<<[->>>>>--------->>>>>+<<<<<<<<<<
|
||||||
|
[->>>>>+<<<<<]]]]]]]]]]]>>>>>>>>]
|
||||||
|
<<<<<<<<<<[>>>>>>>[-<<<<<+>>>>>]<<<<<<<<<<<<<<<<<]
|
||||||
|
>>>>>>>>>
|
||||||
|
|
||||||
|
]<
|
||||||
|
|
||||||
|
]>>
|
||||||
|
|
||||||
|
*
|
||||||
|
* display the number and end
|
||||||
|
*
|
||||||
|
|
||||||
|
[>>>>>>>>>>]<<<<<<<<<<[+>[>>>>>>>>>+>]<-<<<<<<<<<<]-
|
||||||
|
[>++++++++++++++++++++++++++++++++++++++++++++++++.<<<<<<<<<<<]
|
||||||
|
++++++++++.
|
||||||
13
samples/Brainfuck/fib100.bf
Normal file
13
samples/Brainfuck/fib100.bf
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
# Calculate and output all fibonacci numbers under 100
|
||||||
|
|
||||||
|
+++++++++++
|
||||||
|
>+>>>>++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
>++++++++++++++++++++++++++++++++<<<<<<[>[>>>>>>+>
|
||||||
|
+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]<[>++++++++++[-
|
||||||
|
<-[>>+>+<<<-]>>>[<<<+>>>-]+<[>[-]<[-]]>[<<[>>>+<<<
|
||||||
|
-]>>[-]]<<]>>>[>>+>+<<<-]>>>[<<<+>>>-]+<[>[-]<[-]]
|
||||||
|
>[<<+>>[-]]<<<<<<<]>>>>>[+++++++++++++++++++++++++
|
||||||
|
+++++++++++++++++++++++.[-]]++++++++++<[->-<]>++++
|
||||||
|
++++++++++++++++++++++++++++++++++++++++++++.[-]<<
|
||||||
|
<<<<<<<<<<[>>>+>+<<<<-]>>>>[<<<<+>>>>-]<-[>>.>.<<<
|
||||||
|
[-]]<<[>>+>+<<<-]>>>[<<<+>>>-]<<[<+>-]>[<+>-]<<<-]
|
||||||
4
samples/Brainfuck/hello.bf
Normal file
4
samples/Brainfuck/hello.bf
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
// More complex version of hello world
|
||||||
|
|
||||||
|
>++++++++[<+++++++++>-]<.>>+>+>++>[-]+<[>[->+<<++++>]<<]>.+++++++..+++.>
|
||||||
|
>+++++++.<<<[[-]<[-]>]<+++++++++++++++.>>.+++.------.--------.>>+.>++++.
|
||||||
3
samples/Brainfuck/helloworld.bf
Normal file
3
samples/Brainfuck/helloworld.bf
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
// Hello World
|
||||||
|
|
||||||
|
++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.
|
||||||
30
samples/Brainfuck/rot13.bf
Normal file
30
samples/Brainfuck/rot13.bf
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
# ROT13 cipher
|
||||||
|
|
||||||
|
-,+[ Read first character and start outer character reading loop
|
||||||
|
-[ Skip forward if character is 0
|
||||||
|
>>++++[>++++++++<-] Set up divisor (32) for division loop
|
||||||
|
(MEMORY LAYOUT: dividend copy remainder divisor quotient zero zero)
|
||||||
|
<+<-[ Set up dividend (x minus 1) and enter division loop
|
||||||
|
>+>+>-[>>>] Increase copy and remainder / reduce divisor / Normal case: skip forward
|
||||||
|
<[[>+<-]>>+>] Special case: move remainder back to divisor and increase quotient
|
||||||
|
<<<<<- Decrement dividend
|
||||||
|
] End division loop
|
||||||
|
]>>>[-]+ End skip loop; zero former divisor and reuse space for a flag
|
||||||
|
>--[-[<->+++[-]]]<[ Zero that flag unless quotient was 2 or 3; zero quotient; check flag
|
||||||
|
++++++++++++<[ If flag then set up divisor (13) for second division loop
|
||||||
|
(MEMORY LAYOUT: zero copy dividend divisor remainder quotient zero zero)
|
||||||
|
>-[>+>>] Reduce divisor; Normal case: increase remainder
|
||||||
|
>[+[<+>-]>+>>] Special case: increase remainder / move it back to divisor / increase quotient
|
||||||
|
<<<<<- Decrease dividend
|
||||||
|
] End division loop
|
||||||
|
>>[<+>-] Add remainder back to divisor to get a useful 13
|
||||||
|
>[ Skip forward if quotient was 0
|
||||||
|
-[ Decrement quotient and skip forward if quotient was 1
|
||||||
|
-<<[-]>> Zero quotient and divisor if quotient was 2
|
||||||
|
]<<[<<->>-]>> Zero divisor and subtract 13 from copy if quotient was 1
|
||||||
|
]<<[<<+>>-] Zero divisor and add 13 to copy if quotient was 0
|
||||||
|
] End outer skip loop (jump to here if ((character minus 1)/32) was not 2 or 3)
|
||||||
|
<[-] Clear remainder from first division if second division was skipped
|
||||||
|
<.[-] Output ROT13ed character from copy and clear it
|
||||||
|
<-,+ Read next character
|
||||||
|
] End character reading loop
|
||||||
26
samples/C#/AssemblyInfo.cs
Normal file
26
samples/C#/AssemblyInfo.cs
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
using System.Reflection;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
|
||||||
|
// Information about this assembly is defined by the following attributes.
|
||||||
|
// Change them to the values specific to your project.
|
||||||
|
|
||||||
|
[assembly: AssemblyTitle("Simple")]
|
||||||
|
[assembly: AssemblyDescription("")]
|
||||||
|
[assembly: AssemblyConfiguration("")]
|
||||||
|
[assembly: AssemblyCompany("")]
|
||||||
|
[assembly: AssemblyProduct("")]
|
||||||
|
[assembly: AssemblyCopyright("")]
|
||||||
|
[assembly: AssemblyTrademark("")]
|
||||||
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
|
// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}".
|
||||||
|
// The form "{Major}.{Minor}.*" will automatically update the build and revision,
|
||||||
|
// and "{Major}.{Minor}.{Build}.*" will update just the revision.
|
||||||
|
|
||||||
|
[assembly: AssemblyVersion("1.0.*")]
|
||||||
|
|
||||||
|
// The following attributes are used to specify the signing key for the assembly,
|
||||||
|
// if desired. See the Mono documentation for more information about signing.
|
||||||
|
|
||||||
|
//[assembly: AssemblyDelaySign(false)]
|
||||||
|
//[assembly: AssemblyKeyFile("")]
|
||||||
20
samples/C#/BsonPropertyValue.cs
Normal file
20
samples/C#/BsonPropertyValue.cs
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace MongoDB.Serialization.Descriptors
|
||||||
|
{
|
||||||
|
internal class BsonPropertyValue
|
||||||
|
{
|
||||||
|
public bool IsDictionary { get; private set; }
|
||||||
|
|
||||||
|
public Type Type { get; private set; }
|
||||||
|
|
||||||
|
public object Value { get; private set; }
|
||||||
|
|
||||||
|
public BsonPropertyValue(Type type, object value, bool isDictionary)
|
||||||
|
{
|
||||||
|
Type = type;
|
||||||
|
Value = value;
|
||||||
|
IsDictionary = isDictionary;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
153
samples/C#/MongoExpressionVisitor.cs
Normal file
153
samples/C#/MongoExpressionVisitor.cs
Normal file
@@ -0,0 +1,153 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Collections.ObjectModel;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Linq.Expressions;
|
||||||
|
|
||||||
|
namespace MongoDB.Linq.Expressions
|
||||||
|
{
|
||||||
|
internal class MongoExpressionVisitor : ExpressionVisitor
|
||||||
|
{
|
||||||
|
protected override Expression Visit(Expression exp)
|
||||||
|
{
|
||||||
|
if (exp == null)
|
||||||
|
return null;
|
||||||
|
switch ((MongoExpressionType)exp.NodeType)
|
||||||
|
{
|
||||||
|
case MongoExpressionType.Collection:
|
||||||
|
return VisitCollection((CollectionExpression)exp);
|
||||||
|
case MongoExpressionType.Field:
|
||||||
|
return VisitField((FieldExpression)exp);
|
||||||
|
case MongoExpressionType.Projection:
|
||||||
|
return VisitProjection((ProjectionExpression)exp);
|
||||||
|
case MongoExpressionType.Select:
|
||||||
|
return VisitSelect((SelectExpression)exp);
|
||||||
|
case MongoExpressionType.Aggregate:
|
||||||
|
return VisitAggregate((AggregateExpression)exp);
|
||||||
|
case MongoExpressionType.AggregateSubquery:
|
||||||
|
return VisitAggregateSubquery((AggregateSubqueryExpression)exp);
|
||||||
|
case MongoExpressionType.Scalar:
|
||||||
|
return VisitScalar((ScalarExpression)exp);
|
||||||
|
default:
|
||||||
|
return base.Visit(exp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected virtual Expression VisitAggregate(AggregateExpression aggregate)
|
||||||
|
{
|
||||||
|
var exp = Visit(aggregate.Argument);
|
||||||
|
if (exp != aggregate.Argument)
|
||||||
|
return new AggregateExpression(aggregate.Type, aggregate.AggregateType, exp, aggregate.Distinct);
|
||||||
|
|
||||||
|
return aggregate;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected virtual Expression VisitAggregateSubquery(AggregateSubqueryExpression aggregateSubquery)
|
||||||
|
{
|
||||||
|
Expression e = Visit(aggregateSubquery.AggregateAsSubquery);
|
||||||
|
ScalarExpression subquery = (ScalarExpression)e;
|
||||||
|
if (subquery != aggregateSubquery.AggregateAsSubquery)
|
||||||
|
return new AggregateSubqueryExpression(aggregateSubquery.GroupByAlias, aggregateSubquery.AggregateInGroupSelect, subquery);
|
||||||
|
return aggregateSubquery;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected virtual Expression VisitCollection(CollectionExpression collection)
|
||||||
|
{
|
||||||
|
return collection;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected virtual Expression VisitField(FieldExpression field)
|
||||||
|
{
|
||||||
|
var e = Visit(field.Expression);
|
||||||
|
if (field.Expression != e)
|
||||||
|
field = new FieldExpression(e, field.Alias, field.Name);
|
||||||
|
|
||||||
|
return field;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected virtual Expression VisitProjection(ProjectionExpression projection)
|
||||||
|
{
|
||||||
|
var source = (SelectExpression)Visit(projection.Source);
|
||||||
|
var projector = Visit(projection.Projector);
|
||||||
|
if (source != projection.Source || projector != projection.Projector)
|
||||||
|
return new ProjectionExpression(source, projector, projection.Aggregator);
|
||||||
|
return projection;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected ReadOnlyCollection<OrderExpression> VisitOrderBy(ReadOnlyCollection<OrderExpression> orderBys)
|
||||||
|
{
|
||||||
|
if (orderBys != null)
|
||||||
|
{
|
||||||
|
List<OrderExpression> alternate = null;
|
||||||
|
for (int i = 0, n = orderBys.Count; i < n; i++)
|
||||||
|
{
|
||||||
|
OrderExpression expr = orderBys[i];
|
||||||
|
Expression e = this.Visit(expr.Expression);
|
||||||
|
if (alternate == null && e != expr.Expression)
|
||||||
|
alternate = orderBys.Take(i).ToList();
|
||||||
|
if (alternate != null)
|
||||||
|
alternate.Add(new OrderExpression(expr.OrderType, e));
|
||||||
|
}
|
||||||
|
if (alternate != null)
|
||||||
|
return alternate.AsReadOnly();
|
||||||
|
}
|
||||||
|
return orderBys;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected virtual Expression VisitScalar(ScalarExpression scalar)
|
||||||
|
{
|
||||||
|
SelectExpression select = (SelectExpression)Visit(scalar.Select);
|
||||||
|
if (select != scalar.Select)
|
||||||
|
return new ScalarExpression(scalar.Type, select);
|
||||||
|
return scalar;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected virtual Expression VisitSelect(SelectExpression select)
|
||||||
|
{
|
||||||
|
var from = VisitSource(select.From);
|
||||||
|
var where = Visit(select.Where);
|
||||||
|
var groupBy = Visit(select.GroupBy);
|
||||||
|
var orderBy = VisitOrderBy(select.OrderBy);
|
||||||
|
var skip = Visit(select.Skip);
|
||||||
|
var take = Visit(select.Take);
|
||||||
|
var fields = VisitFieldDeclarationList(select.Fields);
|
||||||
|
if (from != select.From || where != select.Where || orderBy != select.OrderBy || groupBy != select.GroupBy || skip != select.Skip || take != select.Take || fields != select.Fields)
|
||||||
|
return new SelectExpression(select.Alias, fields, from, where, orderBy, groupBy, select.IsDistinct, skip, take);
|
||||||
|
return select;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected virtual Expression VisitSource(Expression source)
|
||||||
|
{
|
||||||
|
return Visit(source);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected virtual Expression VisitSubquery(SubqueryExpression subquery)
|
||||||
|
{
|
||||||
|
switch ((MongoExpressionType)subquery.NodeType)
|
||||||
|
{
|
||||||
|
case MongoExpressionType.Scalar:
|
||||||
|
return VisitScalar((ScalarExpression)subquery);
|
||||||
|
}
|
||||||
|
return subquery;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected virtual ReadOnlyCollection<FieldDeclaration> VisitFieldDeclarationList(ReadOnlyCollection<FieldDeclaration> fields)
|
||||||
|
{
|
||||||
|
if (fields == null)
|
||||||
|
return fields;
|
||||||
|
|
||||||
|
List<FieldDeclaration> alternate = null;
|
||||||
|
for (int i = 0, n = fields.Count; i < n; i++)
|
||||||
|
{
|
||||||
|
var f = fields[i];
|
||||||
|
var e = Visit(f.Expression);
|
||||||
|
if (f.Expression != e && alternate == null)
|
||||||
|
alternate = fields.Take(i).ToList();
|
||||||
|
if (alternate != null)
|
||||||
|
alternate.Add(new FieldDeclaration(f.Name, e));
|
||||||
|
}
|
||||||
|
if (alternate != null)
|
||||||
|
return alternate.AsReadOnly();
|
||||||
|
return fields;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
86
samples/C#/build.cake
Normal file
86
samples/C#/build.cake
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// ARGUMENTS
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
var target = Argument<string>("target", "Default");
|
||||||
|
var configuration = Argument<string>("configuration", "Release");
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// GLOBAL VARIABLES
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
var solutions = GetFiles("./**/*.sln");
|
||||||
|
var solutionPaths = solutions.Select(solution => solution.GetDirectory());
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// SETUP / TEARDOWN
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
Setup(() =>
|
||||||
|
{
|
||||||
|
// Executed BEFORE the first task.
|
||||||
|
Information("Running tasks...");
|
||||||
|
});
|
||||||
|
|
||||||
|
Teardown(() =>
|
||||||
|
{
|
||||||
|
// Executed AFTER the last task.
|
||||||
|
Information("Finished running tasks.");
|
||||||
|
});
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// TASK DEFINITIONS
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
Task("Clean")
|
||||||
|
.Does(() =>
|
||||||
|
{
|
||||||
|
// Clean solution directories.
|
||||||
|
foreach(var path in solutionPaths)
|
||||||
|
{
|
||||||
|
Information("Cleaning {0}", path);
|
||||||
|
CleanDirectories(path + "/**/bin/" + configuration);
|
||||||
|
CleanDirectories(path + "/**/obj/" + configuration);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Task("Restore")
|
||||||
|
.Does(() =>
|
||||||
|
{
|
||||||
|
// Restore all NuGet packages.
|
||||||
|
foreach(var solution in solutions)
|
||||||
|
{
|
||||||
|
Information("Restoring {0}...", solution);
|
||||||
|
NuGetRestore(solution);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Task("Build")
|
||||||
|
.IsDependentOn("Clean")
|
||||||
|
.IsDependentOn("Restore")
|
||||||
|
.Does(() =>
|
||||||
|
{
|
||||||
|
// Build all solutions.
|
||||||
|
foreach(var solution in solutions)
|
||||||
|
{
|
||||||
|
Information("Building {0}", solution);
|
||||||
|
MSBuild(solution, settings =>
|
||||||
|
settings.SetPlatformTarget(PlatformTarget.MSIL)
|
||||||
|
.WithProperty("TreatWarningsAsErrors","true")
|
||||||
|
.WithTarget("Build")
|
||||||
|
.SetConfiguration(configuration));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// TARGETS
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
Task("Default")
|
||||||
|
.IsDependentOn("Build");
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// EXECUTION
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
RunTarget(target);
|
||||||
57
samples/C++/ClasspathVMSystemProperties.inc
Normal file
57
samples/C++/ClasspathVMSystemProperties.inc
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
//===- ClasspathVMSystem/Properties.cpp -----------------------------------===//
|
||||||
|
//===--------------------- GNU classpath gnu/classpath/VMSystemProperties -===//
|
||||||
|
//
|
||||||
|
// The VMKit project
|
||||||
|
//
|
||||||
|
// This file is distributed under the University of Illinois Open Source
|
||||||
|
// License. See LICENSE.TXT for details.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
#include <sys/utsname.h>
|
||||||
|
|
||||||
|
#include "types.h"
|
||||||
|
|
||||||
|
#include "Classpath.h"
|
||||||
|
#include "JavaArray.h"
|
||||||
|
#include "JavaClass.h"
|
||||||
|
#include "JavaObject.h"
|
||||||
|
#include "JavaThread.h"
|
||||||
|
#include "JavaUpcalls.h"
|
||||||
|
#include "Jnjvm.h"
|
||||||
|
|
||||||
|
#include "SetProperties.inc"
|
||||||
|
|
||||||
|
using namespace j3;
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
|
||||||
|
|
||||||
|
JNIEXPORT void JNICALL Java_gnu_classpath_VMSystemProperties_preInit(
|
||||||
|
#ifdef NATIVE_JNI
|
||||||
|
JNIEnv *env,
|
||||||
|
jclass clazz,
|
||||||
|
#endif
|
||||||
|
JavaObject* prop) {
|
||||||
|
|
||||||
|
llvm_gcroot(prop, 0);
|
||||||
|
|
||||||
|
BEGIN_NATIVE_EXCEPTION(0)
|
||||||
|
|
||||||
|
setProperties(prop);
|
||||||
|
|
||||||
|
END_NATIVE_EXCEPTION
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" void Java_gnu_classpath_VMSystemProperties_postInit__Ljava_util_Properties_2(JavaObject* prop) {
|
||||||
|
|
||||||
|
llvm_gcroot(prop, 0);
|
||||||
|
|
||||||
|
BEGIN_NATIVE_EXCEPTION(0)
|
||||||
|
|
||||||
|
setCommandLineProperties(prop);
|
||||||
|
|
||||||
|
END_NATIVE_EXCEPTION
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
98
samples/C++/Entity.h
Normal file
98
samples/C++/Entity.h
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
/**
|
||||||
|
* @file Entity.h
|
||||||
|
* @page EntityPage Entity
|
||||||
|
* @brief represent an entity in the game
|
||||||
|
* @author vinz243
|
||||||
|
* @version 0.1.0
|
||||||
|
* This file represents an Entity in the game system
|
||||||
|
* This parent type is a static entity which is shown and loaded into the Physics engine but never updated
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef ENTITY_H
|
||||||
|
#define ENTITY_H
|
||||||
|
|
||||||
|
#include "base.h"
|
||||||
|
/// @namespace Whitedrop
|
||||||
|
namespace Whitedrop {
|
||||||
|
/** @class Entity
|
||||||
|
* This parent type is a static entity which is shown and loaded into the Physics engine but never updated
|
||||||
|
*/
|
||||||
|
class Entity {
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* @brief Create static entity
|
||||||
|
* @details creates a static entity instance according to the mesh and the id, the position
|
||||||
|
* This needs to be attached to a World after!
|
||||||
|
* The material name is not the file name but the material name!
|
||||||
|
* @ref WorldPage
|
||||||
|
* @param mesh the name of the mesh for the object, file must be in media/meshes
|
||||||
|
* @param id an unique identifier for the object, shortest as possible
|
||||||
|
* @param dimensions an Ogre::Vector3 which contains the dimensions in meter
|
||||||
|
* @param position the Vector3 which contains it position
|
||||||
|
* @param material the material name
|
||||||
|
*/
|
||||||
|
Entity(std::string mesh, std::string id, Ogre::Vector3 dimensions, Ogre::Vector3 position, std::string material);
|
||||||
|
/**
|
||||||
|
* @brief The copy constructor
|
||||||
|
* @details A copy constr
|
||||||
|
*
|
||||||
|
* @param ref the Entity to be copied from
|
||||||
|
*/
|
||||||
|
Entity(const Entity &ref);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief The assignement operator
|
||||||
|
* @details
|
||||||
|
*
|
||||||
|
* @param ent the entity to be copied
|
||||||
|
*/
|
||||||
|
Entity& operator=(const Entity ent);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief destrctor
|
||||||
|
* @details
|
||||||
|
*/
|
||||||
|
virtual ~Entity(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief a constance type of the entity
|
||||||
|
* @details depends of the class.
|
||||||
|
* May contain STATIC, DYNAMIC or ETHERAL
|
||||||
|
*/
|
||||||
|
const std::string type = "STATIC";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Attach the entity to specified sceneManager
|
||||||
|
* @details This creates the OgreEntity using sceneMgr,
|
||||||
|
* set material, create a Node with name as `<id>_n`,
|
||||||
|
* scale it to match dimensions and translate the node to pos
|
||||||
|
* @param sceneMgr the scene manager to use
|
||||||
|
*/
|
||||||
|
virtual void setup(Ogre::SceneManager* sceneMgr);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief the update method
|
||||||
|
* @details this method should be called on each world update.
|
||||||
|
* Even though the method is necessary declared, the main impl of
|
||||||
|
* a static entity should be empty since it is not updated by physics
|
||||||
|
* However, a Dynamic entity should implement this function in order to:
|
||||||
|
* 1) Get from the physics engine the actor position in the physic world
|
||||||
|
* 2) Update the OgreEntity position and rotation from the previous actor
|
||||||
|
* @return whether it was successful or not, if falsey engine should stop
|
||||||
|
*/
|
||||||
|
virtual bool update(void);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
std::string mMesh = "cube.mesh";
|
||||||
|
std::string mId;
|
||||||
|
std::string mMaterial;
|
||||||
|
Ogre::Vector3 mDimensions;
|
||||||
|
Ogre::Vector3 mPosition;
|
||||||
|
Ogre::Entity* mEntity;
|
||||||
|
Ogre::SceneNode* mNode;
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
1178
samples/C++/PackageInfoParser.cpp
Normal file
1178
samples/C++/PackageInfoParser.cpp
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
46
samples/C++/bug1163046.--skeleton.re
Normal file
46
samples/C++/bug1163046.--skeleton.re
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
#define YYCTYPE unsigned char
|
||||||
|
#define YYCURSOR cursor
|
||||||
|
#define YYLIMIT cursor
|
||||||
|
#define YYMARKER marker
|
||||||
|
#define YYFILL(n)
|
||||||
|
|
||||||
|
bool scan(const char *text)
|
||||||
|
{
|
||||||
|
YYCTYPE *start = (YYCTYPE *)text;
|
||||||
|
YYCTYPE *cursor = (YYCTYPE *)text;
|
||||||
|
YYCTYPE *marker = (YYCTYPE *)text;
|
||||||
|
next:
|
||||||
|
YYCTYPE *token = cursor;
|
||||||
|
/*!re2c
|
||||||
|
'(This file must be converted with BinHex 4.0)'
|
||||||
|
{
|
||||||
|
if (token == start || *(token - 1) == '\n')
|
||||||
|
return true; else goto next;
|
||||||
|
}
|
||||||
|
[\001-\377]
|
||||||
|
{ goto next; }
|
||||||
|
[\000]
|
||||||
|
{ return false; }
|
||||||
|
*/
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define do_scan(str, expect) \
|
||||||
|
res = scan(str) == expect ? 0 : 1; \
|
||||||
|
std::cerr << str << "\t-\t" << (res ? "fail" : "ok") << std::endl; \
|
||||||
|
result += res
|
||||||
|
|
||||||
|
/*!max:re2c */
|
||||||
|
|
||||||
|
int main(int,void**)
|
||||||
|
{
|
||||||
|
int res, result = 0;
|
||||||
|
do_scan("(This file must be converted with BinHex 4.0)", 1);
|
||||||
|
do_scan("x(This file must be converted with BinHex 4.0)", 0);
|
||||||
|
do_scan("(This file must be converted with BinHex 4.0)x", 1);
|
||||||
|
do_scan("x(This file must be converted with BinHex 4.0)x", 0);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
239
samples/C++/cnokw.re
Normal file
239
samples/C++/cnokw.re
Normal file
@@ -0,0 +1,239 @@
|
|||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#define ADDEQ 257
|
||||||
|
#define ANDAND 258
|
||||||
|
#define ANDEQ 259
|
||||||
|
#define ARRAY 260
|
||||||
|
#define ASM 261
|
||||||
|
#define AUTO 262
|
||||||
|
#define BREAK 263
|
||||||
|
#define CASE 264
|
||||||
|
#define CHAR 265
|
||||||
|
#define CONST 266
|
||||||
|
#define CONTINUE 267
|
||||||
|
#define DECR 268
|
||||||
|
#define DEFAULT 269
|
||||||
|
#define DEREF 270
|
||||||
|
#define DIVEQ 271
|
||||||
|
#define DO 272
|
||||||
|
#define DOUBLE 273
|
||||||
|
#define ELLIPSIS 274
|
||||||
|
#define ELSE 275
|
||||||
|
#define ENUM 276
|
||||||
|
#define EQL 277
|
||||||
|
#define EXTERN 278
|
||||||
|
#define FCON 279
|
||||||
|
#define FLOAT 280
|
||||||
|
#define FOR 281
|
||||||
|
#define FUNCTION 282
|
||||||
|
#define GEQ 283
|
||||||
|
#define GOTO 284
|
||||||
|
#define ICON 285
|
||||||
|
#define ID 286
|
||||||
|
#define IF 287
|
||||||
|
#define INCR 288
|
||||||
|
#define INT 289
|
||||||
|
#define LEQ 290
|
||||||
|
#define LONG 291
|
||||||
|
#define LSHIFT 292
|
||||||
|
#define LSHIFTEQ 293
|
||||||
|
#define MODEQ 294
|
||||||
|
#define MULEQ 295
|
||||||
|
#define NEQ 296
|
||||||
|
#define OREQ 297
|
||||||
|
#define OROR 298
|
||||||
|
#define POINTER 299
|
||||||
|
#define REGISTER 300
|
||||||
|
#define RETURN 301
|
||||||
|
#define RSHIFT 302
|
||||||
|
#define RSHIFTEQ 303
|
||||||
|
#define SCON 304
|
||||||
|
#define SHORT 305
|
||||||
|
#define SIGNED 306
|
||||||
|
#define SIZEOF 307
|
||||||
|
#define STATIC 308
|
||||||
|
#define STRUCT 309
|
||||||
|
#define SUBEQ 310
|
||||||
|
#define SWITCH 311
|
||||||
|
#define TYPEDEF 312
|
||||||
|
#define UNION 313
|
||||||
|
#define UNSIGNED 314
|
||||||
|
#define VOID 315
|
||||||
|
#define VOLATILE 316
|
||||||
|
#define WHILE 317
|
||||||
|
#define XOREQ 318
|
||||||
|
#define EOI 319
|
||||||
|
|
||||||
|
typedef unsigned int uint;
|
||||||
|
typedef unsigned char uchar;
|
||||||
|
|
||||||
|
#define BSIZE 8192
|
||||||
|
|
||||||
|
#define YYCTYPE uchar
|
||||||
|
#define YYCURSOR cursor
|
||||||
|
#define YYLIMIT s->lim
|
||||||
|
#define YYMARKER s->ptr
|
||||||
|
#define YYFILL(n) {cursor = fill(s, cursor);}
|
||||||
|
|
||||||
|
#define RET(i) {s->cur = cursor; return i;}
|
||||||
|
|
||||||
|
typedef struct Scanner {
|
||||||
|
int fd;
|
||||||
|
uchar *bot, *tok, *ptr, *cur, *pos, *lim, *top, *eof;
|
||||||
|
uint line;
|
||||||
|
} Scanner;
|
||||||
|
|
||||||
|
uchar *fill(Scanner *s, uchar *cursor){
|
||||||
|
if(!s->eof){
|
||||||
|
uint cnt = s->tok - s->bot;
|
||||||
|
if(cnt){
|
||||||
|
memcpy(s->bot, s->tok, s->lim - s->tok);
|
||||||
|
s->tok = s->bot;
|
||||||
|
s->ptr -= cnt;
|
||||||
|
cursor -= cnt;
|
||||||
|
s->pos -= cnt;
|
||||||
|
s->lim -= cnt;
|
||||||
|
}
|
||||||
|
if((s->top - s->lim) < BSIZE){
|
||||||
|
uchar *buf = (uchar*) malloc(((s->lim - s->bot) + BSIZE)*sizeof(uchar));
|
||||||
|
memcpy(buf, s->tok, s->lim - s->tok);
|
||||||
|
s->tok = buf;
|
||||||
|
s->ptr = &buf[s->ptr - s->bot];
|
||||||
|
cursor = &buf[cursor - s->bot];
|
||||||
|
s->pos = &buf[s->pos - s->bot];
|
||||||
|
s->lim = &buf[s->lim - s->bot];
|
||||||
|
s->top = &s->lim[BSIZE];
|
||||||
|
free(s->bot);
|
||||||
|
s->bot = buf;
|
||||||
|
}
|
||||||
|
if((cnt = read(s->fd, (char*) s->lim, BSIZE)) != BSIZE){
|
||||||
|
s->eof = &s->lim[cnt]; *(s->eof)++ = '\n';
|
||||||
|
}
|
||||||
|
s->lim += cnt;
|
||||||
|
}
|
||||||
|
return cursor;
|
||||||
|
}
|
||||||
|
|
||||||
|
int scan(Scanner *s){
|
||||||
|
uchar *cursor = s->cur;
|
||||||
|
std:
|
||||||
|
s->tok = cursor;
|
||||||
|
/*!re2c
|
||||||
|
any = [\000-\377];
|
||||||
|
O = [0-7];
|
||||||
|
D = [0-9];
|
||||||
|
L = [a-zA-Z_];
|
||||||
|
H = [a-fA-F0-9];
|
||||||
|
E = [Ee] [+-]? D+;
|
||||||
|
FS = [fFlL];
|
||||||
|
IS = [uUlL]*;
|
||||||
|
ESC = [\\] ([abfnrtv?'"\\] | "x" H+ | O+);
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*!re2c
|
||||||
|
"/*" { goto comment; }
|
||||||
|
|
||||||
|
L (L|D)* { RET(ID); }
|
||||||
|
|
||||||
|
("0" [xX] H+ IS?) | ("0" D+ IS?) | (D+ IS?) |
|
||||||
|
(['] (ESC|any\[\n\\'])* ['])
|
||||||
|
{ RET(ICON); }
|
||||||
|
|
||||||
|
(D+ E FS?) | (D* "." D+ E? FS?) | (D+ "." D* E? FS?)
|
||||||
|
{ RET(FCON); }
|
||||||
|
|
||||||
|
(["] (ESC|any\[\n\\"])* ["])
|
||||||
|
{ RET(SCON); }
|
||||||
|
|
||||||
|
"..." { RET(ELLIPSIS); }
|
||||||
|
">>=" { RET(RSHIFTEQ); }
|
||||||
|
"<<=" { RET(LSHIFTEQ); }
|
||||||
|
"+=" { RET(ADDEQ); }
|
||||||
|
"-=" { RET(SUBEQ); }
|
||||||
|
"*=" { RET(MULEQ); }
|
||||||
|
"/=" { RET(DIVEQ); }
|
||||||
|
"%=" { RET(MODEQ); }
|
||||||
|
"&=" { RET(ANDEQ); }
|
||||||
|
"^=" { RET(XOREQ); }
|
||||||
|
"|=" { RET(OREQ); }
|
||||||
|
">>" { RET(RSHIFT); }
|
||||||
|
"<<" { RET(LSHIFT); }
|
||||||
|
"++" { RET(INCR); }
|
||||||
|
"--" { RET(DECR); }
|
||||||
|
"->" { RET(DEREF); }
|
||||||
|
"&&" { RET(ANDAND); }
|
||||||
|
"||" { RET(OROR); }
|
||||||
|
"<=" { RET(LEQ); }
|
||||||
|
">=" { RET(GEQ); }
|
||||||
|
"==" { RET(EQL); }
|
||||||
|
"!=" { RET(NEQ); }
|
||||||
|
";" { RET(';'); }
|
||||||
|
"{" { RET('{'); }
|
||||||
|
"}" { RET('}'); }
|
||||||
|
"," { RET(','); }
|
||||||
|
":" { RET(':'); }
|
||||||
|
"=" { RET('='); }
|
||||||
|
"(" { RET('('); }
|
||||||
|
")" { RET(')'); }
|
||||||
|
"[" { RET('['); }
|
||||||
|
"]" { RET(']'); }
|
||||||
|
"." { RET('.'); }
|
||||||
|
"&" { RET('&'); }
|
||||||
|
"!" { RET('!'); }
|
||||||
|
"~" { RET('~'); }
|
||||||
|
"-" { RET('-'); }
|
||||||
|
"+" { RET('+'); }
|
||||||
|
"*" { RET('*'); }
|
||||||
|
"/" { RET('/'); }
|
||||||
|
"%" { RET('%'); }
|
||||||
|
"<" { RET('<'); }
|
||||||
|
">" { RET('>'); }
|
||||||
|
"^" { RET('^'); }
|
||||||
|
"|" { RET('|'); }
|
||||||
|
"?" { RET('?'); }
|
||||||
|
|
||||||
|
|
||||||
|
[ \t\v\f]+ { goto std; }
|
||||||
|
|
||||||
|
"\n"
|
||||||
|
{
|
||||||
|
if(cursor == s->eof) RET(EOI);
|
||||||
|
s->pos = cursor; s->line++;
|
||||||
|
goto std;
|
||||||
|
}
|
||||||
|
|
||||||
|
any
|
||||||
|
{
|
||||||
|
printf("unexpected character: %c\n", *s->tok);
|
||||||
|
goto std;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
comment:
|
||||||
|
/*!re2c
|
||||||
|
"*/" { goto std; }
|
||||||
|
"\n"
|
||||||
|
{
|
||||||
|
if(cursor == s->eof) RET(EOI);
|
||||||
|
s->tok = s->pos = cursor; s->line++;
|
||||||
|
goto comment;
|
||||||
|
}
|
||||||
|
any { goto comment; }
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
main(){
|
||||||
|
Scanner in;
|
||||||
|
int t;
|
||||||
|
memset((char*) &in, 0, sizeof(in));
|
||||||
|
in.fd = 0;
|
||||||
|
while((t = scan(&in)) != EOI){
|
||||||
|
/*
|
||||||
|
printf("%d\t%.*s\n", t, in.cur - in.tok, in.tok);
|
||||||
|
printf("%d\n", t);
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
close(in.fd);
|
||||||
|
}
|
||||||
123
samples/C++/crypter.cpp
Normal file
123
samples/C++/crypter.cpp
Normal file
@@ -0,0 +1,123 @@
|
|||||||
|
// Copyright (c) 2009-2012 The Bitcoin Developers
|
||||||
|
// Distributed under the MIT/X11 software license, see the accompanying
|
||||||
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
|
||||||
|
// Source - https://github.com/Bradfrogger/Marvelous/blob/master/src/crypter.cpp
|
||||||
|
|
||||||
|
#include <openssl/aes.h>
|
||||||
|
#include <openssl/evp.h>
|
||||||
|
#include <vector>
|
||||||
|
#include <string>
|
||||||
|
#ifdef WIN32
|
||||||
|
#include <windows.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "crypter.h"
|
||||||
|
|
||||||
|
bool CCrypter::SetKeyFromPassphrase(const SecureString& strKeyData, const std::vector<unsigned char>& chSalt, const unsigned int nRounds, const unsigned int nDerivationMethod)
|
||||||
|
{
|
||||||
|
if (nRounds < 1 || chSalt.size() != WALLET_CRYPTO_SALT_SIZE)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
int i = 0;
|
||||||
|
if (nDerivationMethod == 0)
|
||||||
|
i = EVP_BytesToKey(EVP_aes_256_cbc(), EVP_sha512(), &chSalt[0],
|
||||||
|
(unsigned char *)&strKeyData[0], strKeyData.size(), nRounds, chKey, chIV);
|
||||||
|
|
||||||
|
if (i != (int)WALLET_CRYPTO_KEY_SIZE)
|
||||||
|
{
|
||||||
|
OPENSSL_cleanse(chKey, sizeof(chKey));
|
||||||
|
OPENSSL_cleanse(chIV, sizeof(chIV));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
fKeySet = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CCrypter::SetKey(const CKeyingMaterial& chNewKey, const std::vector<unsigned char>& chNewIV)
|
||||||
|
{
|
||||||
|
if (chNewKey.size() != WALLET_CRYPTO_KEY_SIZE || chNewIV.size() != WALLET_CRYPTO_KEY_SIZE)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
memcpy(&chKey[0], &chNewKey[0], sizeof chKey);
|
||||||
|
memcpy(&chIV[0], &chNewIV[0], sizeof chIV);
|
||||||
|
|
||||||
|
fKeySet = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CCrypter::Encrypt(const CKeyingMaterial& vchPlaintext, std::vector<unsigned char> &vchCiphertext)
|
||||||
|
{
|
||||||
|
if (!fKeySet)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// max ciphertext len for a n bytes of plaintext is
|
||||||
|
// n + AES_BLOCK_SIZE - 1 bytes
|
||||||
|
int nLen = vchPlaintext.size();
|
||||||
|
int nCLen = nLen + AES_BLOCK_SIZE, nFLen = 0;
|
||||||
|
vchCiphertext = std::vector<unsigned char> (nCLen);
|
||||||
|
|
||||||
|
EVP_CIPHER_CTX ctx;
|
||||||
|
|
||||||
|
bool fOk = true;
|
||||||
|
|
||||||
|
EVP_CIPHER_CTX_init(&ctx);
|
||||||
|
if (fOk) fOk = EVP_EncryptInit_ex(&ctx, EVP_aes_256_cbc(), NULL, chKey, chIV);
|
||||||
|
if (fOk) fOk = EVP_EncryptUpdate(&ctx, &vchCiphertext[0], &nCLen, &vchPlaintext[0], nLen);
|
||||||
|
if (fOk) fOk = EVP_EncryptFinal_ex(&ctx, (&vchCiphertext[0])+nCLen, &nFLen);
|
||||||
|
EVP_CIPHER_CTX_cleanup(&ctx);
|
||||||
|
|
||||||
|
if (!fOk) return false;
|
||||||
|
|
||||||
|
vchCiphertext.resize(nCLen + nFLen);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CCrypter::Decrypt(const std::vector<unsigned char>& vchCiphertext, CKeyingMaterial& vchPlaintext)
|
||||||
|
{
|
||||||
|
if (!fKeySet)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// plaintext will always be equal to or lesser than length of ciphertext
|
||||||
|
int nLen = vchCiphertext.size();
|
||||||
|
int nPLen = nLen, nFLen = 0;
|
||||||
|
|
||||||
|
vchPlaintext = CKeyingMaterial(nPLen);
|
||||||
|
|
||||||
|
EVP_CIPHER_CTX ctx;
|
||||||
|
|
||||||
|
bool fOk = true;
|
||||||
|
|
||||||
|
EVP_CIPHER_CTX_init(&ctx);
|
||||||
|
if (fOk) fOk = EVP_DecryptInit_ex(&ctx, EVP_aes_256_cbc(), NULL, chKey, chIV);
|
||||||
|
if (fOk) fOk = EVP_DecryptUpdate(&ctx, &vchPlaintext[0], &nPLen, &vchCiphertext[0], nLen);
|
||||||
|
if (fOk) fOk = EVP_DecryptFinal_ex(&ctx, (&vchPlaintext[0])+nPLen, &nFLen);
|
||||||
|
EVP_CIPHER_CTX_cleanup(&ctx);
|
||||||
|
|
||||||
|
if (!fOk) return false;
|
||||||
|
|
||||||
|
vchPlaintext.resize(nPLen + nFLen);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool EncryptSecret(const CKeyingMaterial& vMasterKey, const CKeyingMaterial &vchPlaintext, const uint256& nIV, std::vector<unsigned char> &vchCiphertext)
|
||||||
|
{
|
||||||
|
CCrypter cKeyCrypter;
|
||||||
|
std::vector<unsigned char> chIV(WALLET_CRYPTO_KEY_SIZE);
|
||||||
|
memcpy(&chIV[0], &nIV, WALLET_CRYPTO_KEY_SIZE);
|
||||||
|
if(!cKeyCrypter.SetKey(vMasterKey, chIV))
|
||||||
|
return false;
|
||||||
|
return cKeyCrypter.Encrypt(*((const CKeyingMaterial*)&vchPlaintext), vchCiphertext);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool DecryptSecret(const CKeyingMaterial& vMasterKey, const std::vector<unsigned char>& vchCiphertext, const uint256& nIV, CKeyingMaterial& vchPlaintext)
|
||||||
|
{
|
||||||
|
CCrypter cKeyCrypter;
|
||||||
|
std::vector<unsigned char> chIV(WALLET_CRYPTO_KEY_SIZE);
|
||||||
|
memcpy(&chIV[0], &nIV, WALLET_CRYPTO_KEY_SIZE);
|
||||||
|
if(!cKeyCrypter.SetKey(vMasterKey, chIV))
|
||||||
|
return false;
|
||||||
|
return cKeyCrypter.Decrypt(vchCiphertext, *((CKeyingMaterial*)&vchPlaintext));
|
||||||
|
}
|
||||||
63
samples/C++/cvsignore.re
Normal file
63
samples/C++/cvsignore.re
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
|
||||||
|
#define YYFILL(n) if (cursor >= limit) break;
|
||||||
|
#define YYCTYPE char
|
||||||
|
#define YYCURSOR cursor
|
||||||
|
#define YYLIMIT limit
|
||||||
|
#define YYMARKER marker
|
||||||
|
|
||||||
|
/*!re2c
|
||||||
|
any = (.|"\n");
|
||||||
|
value = (":" (.\"$")+)?;
|
||||||
|
cvsdat = "Date";
|
||||||
|
cvsid = "Id";
|
||||||
|
cvslog = "Log";
|
||||||
|
cvsrev = "Revision";
|
||||||
|
cvssrc = "Source";
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define APPEND(text) \
|
||||||
|
append(output, outsize, text, sizeof(text) - sizeof(YYCTYPE))
|
||||||
|
|
||||||
|
inline void append(YYCTYPE *output, size_t & outsize, const YYCTYPE * text, size_t len)
|
||||||
|
{
|
||||||
|
memcpy(output + outsize, text, len);
|
||||||
|
outsize += (len / sizeof(YYCTYPE));
|
||||||
|
}
|
||||||
|
|
||||||
|
void scan(YYCTYPE *pText, size_t *pSize, int *pbChanged)
|
||||||
|
{
|
||||||
|
// rule
|
||||||
|
// scan lines
|
||||||
|
// find $ in lines
|
||||||
|
// compact $<keyword>: .. $ to $<keyword>$
|
||||||
|
|
||||||
|
YYCTYPE *output;
|
||||||
|
const YYCTYPE *cursor, *limit, *marker;
|
||||||
|
|
||||||
|
cursor = marker = output = *pText;
|
||||||
|
|
||||||
|
size_t insize = *pSize;
|
||||||
|
size_t outsize = 0;
|
||||||
|
|
||||||
|
limit = cursor + insize;
|
||||||
|
|
||||||
|
while(1) {
|
||||||
|
loop:
|
||||||
|
/*!re2c
|
||||||
|
|
||||||
|
"$" cvsdat value "$" { APPEND(L"$" L"Date$"); goto loop; }
|
||||||
|
"$" cvsid value "$" { APPEND(L"$" L"Id$"); goto loop; }
|
||||||
|
"$" cvslog value "$" { APPEND(L"$" L"Log$"); goto loop; }
|
||||||
|
"$" cvsrev value "$" { APPEND(L"$" L"Revision$"); goto loop; }
|
||||||
|
"$" cvssrc value "$" { APPEND(L"$" L"Source$"); goto loop; }
|
||||||
|
any { output[outsize++] = cursor[-1]; if (cursor >= limit) break; goto loop; }
|
||||||
|
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
output[outsize] = '\0';
|
||||||
|
|
||||||
|
// set the new size
|
||||||
|
*pSize = outsize;
|
||||||
|
|
||||||
|
*pbChanged = (insize == outsize) ? 0 : 1;
|
||||||
|
}
|
||||||
109
samples/C++/graphics.cpp
Normal file
109
samples/C++/graphics.cpp
Normal file
@@ -0,0 +1,109 @@
|
|||||||
|
// License - https://github.com/TurtleP/Flask/blob/master/LICENSE
|
||||||
|
|
||||||
|
#include <shared.h>
|
||||||
|
|
||||||
|
int currentR = 0xFF;
|
||||||
|
int currentG = 0xFF;
|
||||||
|
int currentB = 0xFF;
|
||||||
|
int currentA = 0xFF;
|
||||||
|
|
||||||
|
int currentScreen = GFX_BOTTOM;
|
||||||
|
|
||||||
|
float transX = 0;
|
||||||
|
float transY = 0;
|
||||||
|
bool isPushed = false;
|
||||||
|
|
||||||
|
u32 getCurrentColor()
|
||||||
|
{
|
||||||
|
return RGBA8(currentR, currentG, currentB, currentA);
|
||||||
|
}
|
||||||
|
|
||||||
|
void setColor(int r, int g, int b)
|
||||||
|
{
|
||||||
|
currentR = r;
|
||||||
|
currentG = g;
|
||||||
|
currentB = b;
|
||||||
|
currentA = currentA;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setColor(int r, int g, int b, int a)
|
||||||
|
{
|
||||||
|
currentR = r;
|
||||||
|
currentG = g;
|
||||||
|
currentB = b;
|
||||||
|
currentA = a;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setScreen(int screen)
|
||||||
|
{
|
||||||
|
currentScreen = screen;
|
||||||
|
}
|
||||||
|
|
||||||
|
int getCurrentScreen()
|
||||||
|
{
|
||||||
|
return currentScreen;
|
||||||
|
}
|
||||||
|
|
||||||
|
void screenShot() //for showing stuff being done
|
||||||
|
{
|
||||||
|
FILE * topScreen = fopen("sdmc:/framebuffer_top.rgb", "w+");
|
||||||
|
|
||||||
|
fwrite(gfxGetFramebuffer(GFX_TOP, GFX_LEFT, NULL, NULL), 288000, 1, topScreen);
|
||||||
|
|
||||||
|
fclose(topScreen);
|
||||||
|
|
||||||
|
FILE * bottomScreen = fopen("sdmc:/framebuffer_bottom.rgb", "w+");;
|
||||||
|
|
||||||
|
fwrite(gfxGetFramebuffer(GFX_BOTTOM, GFX_LEFT, NULL, NULL), 230400, 1, bottomScreen);
|
||||||
|
|
||||||
|
fclose(bottomScreen);
|
||||||
|
}
|
||||||
|
|
||||||
|
void translateCoords(float * x, float * y) {
|
||||||
|
if (isPushed)
|
||||||
|
{
|
||||||
|
*x += transX;
|
||||||
|
*y += transY;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void translate(float dx, float dy)
|
||||||
|
{
|
||||||
|
if (sf2d_get_current_screen() == getCurrentScreen())
|
||||||
|
{
|
||||||
|
transX = transX + dx;
|
||||||
|
transY = transY + dy;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void push()
|
||||||
|
{
|
||||||
|
if (sf2d_get_current_screen() == getCurrentScreen())
|
||||||
|
{
|
||||||
|
isPushed = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void pop()
|
||||||
|
{
|
||||||
|
if (sf2d_get_current_screen() == getCurrentScreen())
|
||||||
|
{
|
||||||
|
transX = 0;
|
||||||
|
transY = 0;
|
||||||
|
isPushed = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void setScissor(u32 x, u32 y, u32 width, u32 height)
|
||||||
|
{
|
||||||
|
if (sf2d_get_current_screen() == getCurrentScreen())
|
||||||
|
{
|
||||||
|
GPU_SCISSORMODE mode = GPU_SCISSOR_NORMAL;
|
||||||
|
|
||||||
|
if (!x && !y && !width && !height) {
|
||||||
|
mode = GPU_SCISSOR_DISABLE;
|
||||||
|
}
|
||||||
|
|
||||||
|
sf2d_set_scissor_test(mode, x, y, width, height);
|
||||||
|
}
|
||||||
|
}
|
||||||
2764
samples/C++/initClasses.inc
Normal file
2764
samples/C++/initClasses.inc
Normal file
File diff suppressed because it is too large
Load Diff
34
samples/C++/instances.inc
Normal file
34
samples/C++/instances.inc
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
#include "QPBO.h"
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#pragma warning(disable: 4661)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Instantiations
|
||||||
|
|
||||||
|
template class QPBO<int>;
|
||||||
|
template class QPBO<float>;
|
||||||
|
template class QPBO<double>;
|
||||||
|
|
||||||
|
template <>
|
||||||
|
inline void QPBO<int>::get_type_information(char*& type_name, char*& type_format)
|
||||||
|
{
|
||||||
|
type_name = "int";
|
||||||
|
type_format = "d";
|
||||||
|
}
|
||||||
|
|
||||||
|
template <>
|
||||||
|
inline void QPBO<float>::get_type_information(char*& type_name, char*& type_format)
|
||||||
|
{
|
||||||
|
type_name = "float";
|
||||||
|
type_format = "f";
|
||||||
|
}
|
||||||
|
|
||||||
|
template <>
|
||||||
|
inline void QPBO<double>::get_type_information(char*& type_name, char*& type_format)
|
||||||
|
{
|
||||||
|
type_name = "double";
|
||||||
|
type_format = "Lf";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
920
samples/C++/json_reader.cpp
Normal file
920
samples/C++/json_reader.cpp
Normal file
@@ -0,0 +1,920 @@
|
|||||||
|
// Copyright 2007-2010 Baptiste Lepilleur
|
||||||
|
// Distributed under MIT license, or public domain if desired and
|
||||||
|
// recognized in your jurisdiction.
|
||||||
|
// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
||||||
|
|
||||||
|
/*
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Source - https://github.com/Ij888/ApacheCordovaRecipes/blob/6e8a2c1d9de7302f74bc3dbac54a021f0499bbb3/jqmsandbox/plugins/cordova-plugin-globalization/src/blackberry10/native/public/json_reader.cpp
|
||||||
|
|
||||||
|
#include <json/reader.h>
|
||||||
|
#include <json/value.h>
|
||||||
|
#include <utility>
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cassert>
|
||||||
|
#include <cstring>
|
||||||
|
#include <iostream>
|
||||||
|
#include <stdexcept>
|
||||||
|
|
||||||
|
#if _MSC_VER >= 1400 // VC++ 8.0
|
||||||
|
#pragma warning( disable : 4996 ) // disable warning about strdup being deprecated.
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace Json {
|
||||||
|
|
||||||
|
// QNX is strict about declaring C symbols in the std namespace.
|
||||||
|
#ifdef __QNXNTO__
|
||||||
|
using std::memcpy;
|
||||||
|
using std::sprintf;
|
||||||
|
using std::sscanf;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Implementation of class Features
|
||||||
|
// ////////////////////////////////
|
||||||
|
|
||||||
|
Features::Features()
|
||||||
|
: allowComments_( true )
|
||||||
|
, strictRoot_( false )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Features
|
||||||
|
Features::all()
|
||||||
|
{
|
||||||
|
return Features();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Features
|
||||||
|
Features::strictMode()
|
||||||
|
{
|
||||||
|
Features features;
|
||||||
|
features.allowComments_ = false;
|
||||||
|
features.strictRoot_ = true;
|
||||||
|
return features;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Implementation of class Reader
|
||||||
|
// ////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
static inline bool
|
||||||
|
in( Reader::Char c, Reader::Char c1, Reader::Char c2, Reader::Char c3, Reader::Char c4 )
|
||||||
|
{
|
||||||
|
return c == c1 || c == c2 || c == c3 || c == c4;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline bool
|
||||||
|
in( Reader::Char c, Reader::Char c1, Reader::Char c2, Reader::Char c3, Reader::Char c4, Reader::Char c5 )
|
||||||
|
{
|
||||||
|
return c == c1 || c == c2 || c == c3 || c == c4 || c == c5;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static bool
|
||||||
|
containsNewLine( Reader::Location begin,
|
||||||
|
Reader::Location end )
|
||||||
|
{
|
||||||
|
for ( ;begin < end; ++begin )
|
||||||
|
if ( *begin == '\n' || *begin == '\r' )
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::string codePointToUTF8(unsigned int cp)
|
||||||
|
{
|
||||||
|
std::string result;
|
||||||
|
|
||||||
|
// based on description from http://en.wikipedia.org/wiki/UTF-8
|
||||||
|
|
||||||
|
if (cp <= 0x7f)
|
||||||
|
{
|
||||||
|
result.resize(1);
|
||||||
|
result[0] = static_cast<char>(cp);
|
||||||
|
}
|
||||||
|
else if (cp <= 0x7FF)
|
||||||
|
{
|
||||||
|
result.resize(2);
|
||||||
|
result[1] = static_cast<char>(0x80 | (0x3f & cp));
|
||||||
|
result[0] = static_cast<char>(0xC0 | (0x1f & (cp >> 6)));
|
||||||
|
}
|
||||||
|
else if (cp <= 0xFFFF)
|
||||||
|
{
|
||||||
|
result.resize(3);
|
||||||
|
result[2] = static_cast<char>(0x80 | (0x3f & cp));
|
||||||
|
result[1] = 0x80 | static_cast<char>((0x3f & (cp >> 6)));
|
||||||
|
result[0] = 0xE0 | static_cast<char>((0xf & (cp >> 12)));
|
||||||
|
}
|
||||||
|
else if (cp <= 0x10FFFF)
|
||||||
|
{
|
||||||
|
result.resize(4);
|
||||||
|
result[3] = static_cast<char>(0x80 | (0x3f & cp));
|
||||||
|
result[2] = static_cast<char>(0x80 | (0x3f & (cp >> 6)));
|
||||||
|
result[1] = static_cast<char>(0x80 | (0x3f & (cp >> 12)));
|
||||||
|
result[0] = static_cast<char>(0xF0 | (0x7 & (cp >> 18)));
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Class Reader
|
||||||
|
// //////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
Reader::Reader()
|
||||||
|
: features_( Features::all() )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Reader::Reader( const Features &features )
|
||||||
|
: features_( features )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
Reader::parse( const std::string &document,
|
||||||
|
Value &root,
|
||||||
|
bool collectComments )
|
||||||
|
{
|
||||||
|
document_ = document;
|
||||||
|
const char *begin = document_.c_str();
|
||||||
|
const char *end = begin + document_.length();
|
||||||
|
return parse( begin, end, root, collectComments );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
Reader::parse( std::istream& sin,
|
||||||
|
Value &root,
|
||||||
|
bool collectComments )
|
||||||
|
{
|
||||||
|
//std::istream_iterator<char> begin(sin);
|
||||||
|
//std::istream_iterator<char> end;
|
||||||
|
// Those would allow streamed input from a file, if parse() were a
|
||||||
|
// template function.
|
||||||
|
|
||||||
|
// Since std::string is reference-counted, this at least does not
|
||||||
|
// create an extra copy.
|
||||||
|
std::string doc;
|
||||||
|
std::getline(sin, doc, (char)EOF);
|
||||||
|
return parse( doc, root, collectComments );
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
Reader::parse( const char *beginDoc, const char *endDoc,
|
||||||
|
Value &root,
|
||||||
|
bool collectComments )
|
||||||
|
{
|
||||||
|
if ( !features_.allowComments_ )
|
||||||
|
{
|
||||||
|
collectComments = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
begin_ = beginDoc;
|
||||||
|
end_ = endDoc;
|
||||||
|
collectComments_ = collectComments;
|
||||||
|
current_ = begin_;
|
||||||
|
lastValueEnd_ = 0;
|
||||||
|
lastValue_ = 0;
|
||||||
|
commentsBefore_ = "";
|
||||||
|
errors_.clear();
|
||||||
|
while ( !nodes_.empty() )
|
||||||
|
nodes_.pop();
|
||||||
|
nodes_.push( &root );
|
||||||
|
|
||||||
|
bool successful = readValue();
|
||||||
|
Token token;
|
||||||
|
skipCommentTokens( token );
|
||||||
|
if ( collectComments_ && !commentsBefore_.empty() )
|
||||||
|
root.setComment( commentsBefore_, commentAfter );
|
||||||
|
if ( features_.strictRoot_ )
|
||||||
|
{
|
||||||
|
if ( !root.isArray() && !root.isObject() )
|
||||||
|
{
|
||||||
|
// Set error location to start of doc, ideally should be first token found in doc
|
||||||
|
token.type_ = tokenError;
|
||||||
|
token.start_ = beginDoc;
|
||||||
|
token.end_ = endDoc;
|
||||||
|
addError( "A valid JSON document must be either an array or an object value.",
|
||||||
|
token );
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return successful;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
Reader::readValue()
|
||||||
|
{
|
||||||
|
Token token;
|
||||||
|
skipCommentTokens( token );
|
||||||
|
bool successful = true;
|
||||||
|
|
||||||
|
if ( collectComments_ && !commentsBefore_.empty() )
|
||||||
|
{
|
||||||
|
currentValue().setComment( commentsBefore_, commentBefore );
|
||||||
|
commentsBefore_ = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
switch ( token.type_ )
|
||||||
|
{
|
||||||
|
case tokenObjectBegin:
|
||||||
|
successful = readObject( token );
|
||||||
|
break;
|
||||||
|
case tokenArrayBegin:
|
||||||
|
successful = readArray( token );
|
||||||
|
break;
|
||||||
|
case tokenNumber:
|
||||||
|
successful = decodeNumber( token );
|
||||||
|
break;
|
||||||
|
case tokenString:
|
||||||
|
successful = decodeString( token );
|
||||||
|
break;
|
||||||
|
case tokenTrue:
|
||||||
|
currentValue() = true;
|
||||||
|
break;
|
||||||
|
case tokenFalse:
|
||||||
|
currentValue() = false;
|
||||||
|
break;
|
||||||
|
case tokenNull:
|
||||||
|
currentValue() = Value();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return addError( "Syntax error: value, object or array expected.", token );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( collectComments_ )
|
||||||
|
{
|
||||||
|
lastValueEnd_ = current_;
|
||||||
|
lastValue_ = ¤tValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
return successful;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
Reader::skipCommentTokens( Token &token )
|
||||||
|
{
|
||||||
|
if ( features_.allowComments_ )
|
||||||
|
{
|
||||||
|
do
|
||||||
|
{
|
||||||
|
readToken( token );
|
||||||
|
}
|
||||||
|
while ( token.type_ == tokenComment );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
readToken( token );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
Reader::expectToken( TokenType type, Token &token, const char *message )
|
||||||
|
{
|
||||||
|
readToken( token );
|
||||||
|
if ( token.type_ != type )
|
||||||
|
return addError( message, token );
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
Reader::readToken( Token &token )
|
||||||
|
{
|
||||||
|
skipSpaces();
|
||||||
|
token.start_ = current_;
|
||||||
|
Char c = getNextChar();
|
||||||
|
bool ok = true;
|
||||||
|
switch ( c )
|
||||||
|
{
|
||||||
|
case '{':
|
||||||
|
token.type_ = tokenObjectBegin;
|
||||||
|
break;
|
||||||
|
case '}':
|
||||||
|
token.type_ = tokenObjectEnd;
|
||||||
|
break;
|
||||||
|
case '[':
|
||||||
|
token.type_ = tokenArrayBegin;
|
||||||
|
break;
|
||||||
|
case ']':
|
||||||
|
token.type_ = tokenArrayEnd;
|
||||||
|
break;
|
||||||
|
case '"':
|
||||||
|
token.type_ = tokenString;
|
||||||
|
ok = readString();
|
||||||
|
break;
|
||||||
|
case '/':
|
||||||
|
token.type_ = tokenComment;
|
||||||
|
ok = readComment();
|
||||||
|
break;
|
||||||
|
case '0':
|
||||||
|
case '1':
|
||||||
|
case '2':
|
||||||
|
case '3':
|
||||||
|
case '4':
|
||||||
|
case '5':
|
||||||
|
case '6':
|
||||||
|
case '7':
|
||||||
|
case '8':
|
||||||
|
case '9':
|
||||||
|
case '-':
|
||||||
|
token.type_ = tokenNumber;
|
||||||
|
readNumber();
|
||||||
|
break;
|
||||||
|
case 't':
|
||||||
|
token.type_ = tokenTrue;
|
||||||
|
ok = match( "rue", 3 );
|
||||||
|
break;
|
||||||
|
case 'f':
|
||||||
|
token.type_ = tokenFalse;
|
||||||
|
ok = match( "alse", 4 );
|
||||||
|
break;
|
||||||
|
case 'n':
|
||||||
|
token.type_ = tokenNull;
|
||||||
|
ok = match( "ull", 3 );
|
||||||
|
break;
|
||||||
|
case ',':
|
||||||
|
token.type_ = tokenArraySeparator;
|
||||||
|
break;
|
||||||
|
case ':':
|
||||||
|
token.type_ = tokenMemberSeparator;
|
||||||
|
break;
|
||||||
|
case 0:
|
||||||
|
token.type_ = tokenEndOfStream;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ok = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if ( !ok )
|
||||||
|
token.type_ = tokenError;
|
||||||
|
token.end_ = current_;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
Reader::skipSpaces()
|
||||||
|
{
|
||||||
|
while ( current_ != end_ )
|
||||||
|
{
|
||||||
|
Char c = *current_;
|
||||||
|
if ( c == ' ' || c == '\t' || c == '\r' || c == '\n' )
|
||||||
|
++current_;
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
Reader::match( Location pattern,
|
||||||
|
int patternLength )
|
||||||
|
{
|
||||||
|
if ( end_ - current_ < patternLength )
|
||||||
|
return false;
|
||||||
|
int index = patternLength;
|
||||||
|
while ( index-- )
|
||||||
|
if ( current_[index] != pattern[index] )
|
||||||
|
return false;
|
||||||
|
current_ += patternLength;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
Reader::readComment()
|
||||||
|
{
|
||||||
|
Location commentBegin = current_ - 1;
|
||||||
|
Char c = getNextChar();
|
||||||
|
bool successful = false;
|
||||||
|
if ( c == '*' )
|
||||||
|
successful = readCStyleComment();
|
||||||
|
else if ( c == '/' )
|
||||||
|
successful = readCppStyleComment();
|
||||||
|
if ( !successful )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if ( collectComments_ )
|
||||||
|
{
|
||||||
|
CommentPlacement placement = commentBefore;
|
||||||
|
if ( lastValueEnd_ && !containsNewLine( lastValueEnd_, commentBegin ) )
|
||||||
|
{
|
||||||
|
if ( c != '*' || !containsNewLine( commentBegin, current_ ) )
|
||||||
|
placement = commentAfterOnSameLine;
|
||||||
|
}
|
||||||
|
|
||||||
|
addComment( commentBegin, current_, placement );
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
Reader::addComment( Location begin,
|
||||||
|
Location end,
|
||||||
|
CommentPlacement placement )
|
||||||
|
{
|
||||||
|
assert( collectComments_ );
|
||||||
|
if ( placement == commentAfterOnSameLine )
|
||||||
|
{
|
||||||
|
assert( lastValue_ != 0 );
|
||||||
|
lastValue_->setComment( std::string( begin, end ), placement );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( !commentsBefore_.empty() )
|
||||||
|
commentsBefore_ += "\n";
|
||||||
|
commentsBefore_ += std::string( begin, end );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
Reader::readCStyleComment()
|
||||||
|
{
|
||||||
|
while ( current_ != end_ )
|
||||||
|
{
|
||||||
|
Char c = getNextChar();
|
||||||
|
if ( c == '*' && *current_ == '/' )
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return getNextChar() == '/';
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
Reader::readCppStyleComment()
|
||||||
|
{
|
||||||
|
while ( current_ != end_ )
|
||||||
|
{
|
||||||
|
Char c = getNextChar();
|
||||||
|
if ( c == '\r' || c == '\n' )
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
Reader::readNumber()
|
||||||
|
{
|
||||||
|
while ( current_ != end_ )
|
||||||
|
{
|
||||||
|
if ( !(*current_ >= '0' && *current_ <= '9') &&
|
||||||
|
!in( *current_, '.', 'e', 'E', '+', '-' ) )
|
||||||
|
break;
|
||||||
|
++current_;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
Reader::readString()
|
||||||
|
{
|
||||||
|
Char c = 0;
|
||||||
|
while ( current_ != end_ )
|
||||||
|
{
|
||||||
|
c = getNextChar();
|
||||||
|
if ( c == '\\' )
|
||||||
|
getNextChar();
|
||||||
|
else if ( c == '"' )
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return c == '"';
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
Reader::readObject( Token &tokenStart )
|
||||||
|
{
|
||||||
|
Token tokenName;
|
||||||
|
std::string name;
|
||||||
|
currentValue() = Value( objectValue );
|
||||||
|
while ( readToken( tokenName ) )
|
||||||
|
{
|
||||||
|
bool initialTokenOk = true;
|
||||||
|
while ( tokenName.type_ == tokenComment && initialTokenOk )
|
||||||
|
initialTokenOk = readToken( tokenName );
|
||||||
|
if ( !initialTokenOk )
|
||||||
|
break;
|
||||||
|
if ( tokenName.type_ == tokenObjectEnd && name.empty() ) // empty object
|
||||||
|
return true;
|
||||||
|
if ( tokenName.type_ != tokenString )
|
||||||
|
break;
|
||||||
|
|
||||||
|
name = "";
|
||||||
|
if ( !decodeString( tokenName, name ) )
|
||||||
|
return recoverFromError( tokenObjectEnd );
|
||||||
|
|
||||||
|
Token colon;
|
||||||
|
if ( !readToken( colon ) || colon.type_ != tokenMemberSeparator )
|
||||||
|
{
|
||||||
|
return addErrorAndRecover( "Missing ':' after object member name",
|
||||||
|
colon,
|
||||||
|
tokenObjectEnd );
|
||||||
|
}
|
||||||
|
Value &value = currentValue()[ name ];
|
||||||
|
nodes_.push( &value );
|
||||||
|
bool ok = readValue();
|
||||||
|
nodes_.pop();
|
||||||
|
if ( !ok ) // error already set
|
||||||
|
return recoverFromError( tokenObjectEnd );
|
||||||
|
|
||||||
|
Token comma;
|
||||||
|
if ( !readToken( comma )
|
||||||
|
|| ( comma.type_ != tokenObjectEnd &&
|
||||||
|
comma.type_ != tokenArraySeparator &&
|
||||||
|
comma.type_ != tokenComment ) )
|
||||||
|
{
|
||||||
|
return addErrorAndRecover( "Missing ',' or '}' in object declaration",
|
||||||
|
comma,
|
||||||
|
tokenObjectEnd );
|
||||||
|
}
|
||||||
|
bool finalizeTokenOk = true;
|
||||||
|
while ( comma.type_ == tokenComment &&
|
||||||
|
finalizeTokenOk )
|
||||||
|
finalizeTokenOk = readToken( comma );
|
||||||
|
if ( comma.type_ == tokenObjectEnd )
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return addErrorAndRecover( "Missing '}' or object member name",
|
||||||
|
tokenName,
|
||||||
|
tokenObjectEnd );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
Reader::readArray( Token &tokenStart )
|
||||||
|
{
|
||||||
|
currentValue() = Value( arrayValue );
|
||||||
|
skipSpaces();
|
||||||
|
if ( *current_ == ']' ) // empty array
|
||||||
|
{
|
||||||
|
Token endArray;
|
||||||
|
readToken( endArray );
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
int index = 0;
|
||||||
|
while ( true )
|
||||||
|
{
|
||||||
|
Value &value = currentValue()[ index++ ];
|
||||||
|
nodes_.push( &value );
|
||||||
|
bool ok = readValue();
|
||||||
|
nodes_.pop();
|
||||||
|
if ( !ok ) // error already set
|
||||||
|
return recoverFromError( tokenArrayEnd );
|
||||||
|
|
||||||
|
Token token;
|
||||||
|
// Accept Comment after last item in the array.
|
||||||
|
ok = readToken( token );
|
||||||
|
while ( token.type_ == tokenComment && ok )
|
||||||
|
{
|
||||||
|
ok = readToken( token );
|
||||||
|
}
|
||||||
|
bool badTokenType = ( token.type_ == tokenArraySeparator &&
|
||||||
|
token.type_ == tokenArrayEnd );
|
||||||
|
if ( !ok || badTokenType )
|
||||||
|
{
|
||||||
|
return addErrorAndRecover( "Missing ',' or ']' in array declaration",
|
||||||
|
token,
|
||||||
|
tokenArrayEnd );
|
||||||
|
}
|
||||||
|
if ( token.type_ == tokenArrayEnd )
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
Reader::decodeNumber( Token &token )
|
||||||
|
{
|
||||||
|
bool isDouble = false;
|
||||||
|
for ( Location inspect = token.start_; inspect != token.end_; ++inspect )
|
||||||
|
{
|
||||||
|
isDouble = isDouble
|
||||||
|
|| in( *inspect, '.', 'e', 'E', '+' )
|
||||||
|
|| ( *inspect == '-' && inspect != token.start_ );
|
||||||
|
}
|
||||||
|
if ( isDouble )
|
||||||
|
return decodeDouble( token );
|
||||||
|
Location current = token.start_;
|
||||||
|
bool isNegative = *current == '-';
|
||||||
|
if ( isNegative )
|
||||||
|
++current;
|
||||||
|
Value::UInt threshold = (isNegative ? Value::UInt(-Value::minInt)
|
||||||
|
: Value::maxUInt) / 10;
|
||||||
|
Value::UInt value = 0;
|
||||||
|
while ( current < token.end_ )
|
||||||
|
{
|
||||||
|
Char c = *current++;
|
||||||
|
if ( c < '0' || c > '9' )
|
||||||
|
return addError( "'" + std::string( token.start_, token.end_ ) + "' is not a number.", token );
|
||||||
|
if ( value >= threshold )
|
||||||
|
return decodeDouble( token );
|
||||||
|
value = value * 10 + Value::UInt(c - '0');
|
||||||
|
}
|
||||||
|
if ( isNegative )
|
||||||
|
currentValue() = -Value::Int( value );
|
||||||
|
else if ( value <= Value::UInt(Value::maxInt) )
|
||||||
|
currentValue() = Value::Int( value );
|
||||||
|
else
|
||||||
|
currentValue() = value;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
Reader::decodeDouble( Token &token )
|
||||||
|
{
|
||||||
|
double value = 0;
|
||||||
|
const int bufferSize = 32;
|
||||||
|
int count;
|
||||||
|
int length = int(token.end_ - token.start_);
|
||||||
|
if ( length <= bufferSize )
|
||||||
|
{
|
||||||
|
Char buffer[bufferSize];
|
||||||
|
memcpy( buffer, token.start_, length );
|
||||||
|
buffer[length] = 0;
|
||||||
|
count = sscanf( buffer, "%lf", &value );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
std::string buffer( token.start_, token.end_ );
|
||||||
|
count = sscanf( buffer.c_str(), "%lf", &value );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( count != 1 )
|
||||||
|
return addError( "'" + std::string( token.start_, token.end_ ) + "' is not a number.", token );
|
||||||
|
currentValue() = value;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
Reader::decodeString( Token &token )
|
||||||
|
{
|
||||||
|
std::string decoded;
|
||||||
|
if ( !decodeString( token, decoded ) )
|
||||||
|
return false;
|
||||||
|
currentValue() = decoded;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
Reader::decodeString( Token &token, std::string &decoded )
|
||||||
|
{
|
||||||
|
decoded.reserve( token.end_ - token.start_ - 2 );
|
||||||
|
Location current = token.start_ + 1; // skip '"'
|
||||||
|
Location end = token.end_ - 1; // do not include '"'
|
||||||
|
while ( current != end )
|
||||||
|
{
|
||||||
|
Char c = *current++;
|
||||||
|
if ( c == '"' )
|
||||||
|
break;
|
||||||
|
else if ( c == '\\' )
|
||||||
|
{
|
||||||
|
if ( current == end )
|
||||||
|
return addError( "Empty escape sequence in string", token, current );
|
||||||
|
Char escape = *current++;
|
||||||
|
switch ( escape )
|
||||||
|
{
|
||||||
|
case '"': decoded += '"'; break;
|
||||||
|
case '/': decoded += '/'; break;
|
||||||
|
case '\\': decoded += '\\'; break;
|
||||||
|
case 'b': decoded += '\b'; break;
|
||||||
|
case 'f': decoded += '\f'; break;
|
||||||
|
case 'n': decoded += '\n'; break;
|
||||||
|
case 'r': decoded += '\r'; break;
|
||||||
|
case 't': decoded += '\t'; break;
|
||||||
|
case 'u':
|
||||||
|
{
|
||||||
|
unsigned int unicode;
|
||||||
|
if ( !decodeUnicodeCodePoint( token, current, end, unicode ) )
|
||||||
|
return false;
|
||||||
|
decoded += codePointToUTF8(unicode);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return addError( "Bad escape sequence in string", token, current );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
decoded += c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
Reader::decodeUnicodeCodePoint( Token &token,
|
||||||
|
Location ¤t,
|
||||||
|
Location end,
|
||||||
|
unsigned int &unicode )
|
||||||
|
{
|
||||||
|
|
||||||
|
if ( !decodeUnicodeEscapeSequence( token, current, end, unicode ) )
|
||||||
|
return false;
|
||||||
|
if (unicode >= 0xD800 && unicode <= 0xDBFF)
|
||||||
|
{
|
||||||
|
// surrogate pairs
|
||||||
|
if (end - current < 6)
|
||||||
|
return addError( "additional six characters expected to parse unicode surrogate pair.", token, current );
|
||||||
|
unsigned int surrogatePair;
|
||||||
|
if (*(current++) == '\\' && *(current++)== 'u')
|
||||||
|
{
|
||||||
|
if (decodeUnicodeEscapeSequence( token, current, end, surrogatePair ))
|
||||||
|
{
|
||||||
|
unicode = 0x10000 + ((unicode & 0x3FF) << 10) + (surrogatePair & 0x3FF);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return addError( "expecting another \\u token to begin the second half of a unicode surrogate pair", token, current );
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
Reader::decodeUnicodeEscapeSequence( Token &token,
|
||||||
|
Location ¤t,
|
||||||
|
Location end,
|
||||||
|
unsigned int &unicode )
|
||||||
|
{
|
||||||
|
if ( end - current < 4 )
|
||||||
|
return addError( "Bad unicode escape sequence in string: four digits expected.", token, current );
|
||||||
|
unicode = 0;
|
||||||
|
for ( int index =0; index < 4; ++index )
|
||||||
|
{
|
||||||
|
Char c = *current++;
|
||||||
|
unicode *= 16;
|
||||||
|
if ( c >= '0' && c <= '9' )
|
||||||
|
unicode += c - '0';
|
||||||
|
else if ( c >= 'a' && c <= 'f' )
|
||||||
|
unicode += c - 'a' + 10;
|
||||||
|
else if ( c >= 'A' && c <= 'F' )
|
||||||
|
unicode += c - 'A' + 10;
|
||||||
|
else
|
||||||
|
return addError( "Bad unicode escape sequence in string: hexadecimal digit expected.", token, current );
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
Reader::addError( const std::string &message,
|
||||||
|
Token &token,
|
||||||
|
Location extra )
|
||||||
|
{
|
||||||
|
ErrorInfo info;
|
||||||
|
info.token_ = token;
|
||||||
|
info.message_ = message;
|
||||||
|
info.extra_ = extra;
|
||||||
|
errors_.push_back( info );
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
Reader::recoverFromError( TokenType skipUntilToken )
|
||||||
|
{
|
||||||
|
int errorCount = int(errors_.size());
|
||||||
|
Token skip;
|
||||||
|
while ( true )
|
||||||
|
{
|
||||||
|
if ( !readToken(skip) )
|
||||||
|
errors_.resize( errorCount ); // discard errors caused by recovery
|
||||||
|
if ( skip.type_ == skipUntilToken || skip.type_ == tokenEndOfStream )
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
errors_.resize( errorCount );
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
Reader::addErrorAndRecover( const std::string &message,
|
||||||
|
Token &token,
|
||||||
|
TokenType skipUntilToken )
|
||||||
|
{
|
||||||
|
addError( message, token );
|
||||||
|
return recoverFromError( skipUntilToken );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Value &
|
||||||
|
Reader::currentValue()
|
||||||
|
{
|
||||||
|
return *(nodes_.top());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Reader::Char
|
||||||
|
Reader::getNextChar()
|
||||||
|
{
|
||||||
|
if ( current_ == end_ )
|
||||||
|
return 0;
|
||||||
|
return *current_++;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
Reader::getLocationLineAndColumn( Location location,
|
||||||
|
int &line,
|
||||||
|
int &column ) const
|
||||||
|
{
|
||||||
|
Location current = begin_;
|
||||||
|
Location lastLineStart = current;
|
||||||
|
line = 0;
|
||||||
|
while ( current < location && current != end_ )
|
||||||
|
{
|
||||||
|
Char c = *current++;
|
||||||
|
if ( c == '\r' )
|
||||||
|
{
|
||||||
|
if ( *current == '\n' )
|
||||||
|
++current;
|
||||||
|
lastLineStart = current;
|
||||||
|
++line;
|
||||||
|
}
|
||||||
|
else if ( c == '\n' )
|
||||||
|
{
|
||||||
|
lastLineStart = current;
|
||||||
|
++line;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// column & line start at 1
|
||||||
|
column = int(location - lastLineStart) + 1;
|
||||||
|
++line;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
std::string
|
||||||
|
Reader::getLocationLineAndColumn( Location location ) const
|
||||||
|
{
|
||||||
|
int line, column;
|
||||||
|
getLocationLineAndColumn( location, line, column );
|
||||||
|
char buffer[18+16+16+1];
|
||||||
|
sprintf( buffer, "Line %d, Column %d", line, column );
|
||||||
|
return buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
std::string
|
||||||
|
Reader::getFormatedErrorMessages() const
|
||||||
|
{
|
||||||
|
std::string formattedMessage;
|
||||||
|
for ( Errors::const_iterator itError = errors_.begin();
|
||||||
|
itError != errors_.end();
|
||||||
|
++itError )
|
||||||
|
{
|
||||||
|
const ErrorInfo &error = *itError;
|
||||||
|
formattedMessage += "* " + getLocationLineAndColumn( error.token_.start_ ) + "\n";
|
||||||
|
formattedMessage += " " + error.message_ + "\n";
|
||||||
|
if ( error.extra_ )
|
||||||
|
formattedMessage += "See " + getLocationLineAndColumn( error.extra_ ) + " for detail.\n";
|
||||||
|
}
|
||||||
|
return formattedMessage;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
std::istream& operator>>( std::istream &sin, Value &root )
|
||||||
|
{
|
||||||
|
Json::Reader reader;
|
||||||
|
bool ok = reader.parse(sin, root, true);
|
||||||
|
//JSON_ASSERT( ok );
|
||||||
|
if (!ok) throw std::runtime_error(reader.getFormatedErrorMessages());
|
||||||
|
return sin;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace Json
|
||||||
857
samples/C++/json_writer.cpp
Normal file
857
samples/C++/json_writer.cpp
Normal file
@@ -0,0 +1,857 @@
|
|||||||
|
// Copyright 2007-2010 Baptiste Lepilleur
|
||||||
|
// Distributed under MIT license, or public domain if desired and
|
||||||
|
// recognized in your jurisdiction.
|
||||||
|
// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
||||||
|
|
||||||
|
/*
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Source - https://github.com/Ij888/ApacheCordovaRecipes/blob/6e8a2c1d9de7302f74bc3dbac54a021f0499bbb3/jqmsandbox/plugins/cordova-plugin-globalization/src/blackberry10/native/public/json_writer.cpp
|
||||||
|
|
||||||
|
#include <json/writer.h>
|
||||||
|
#include <utility>
|
||||||
|
#include <assert.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <iostream>
|
||||||
|
#include <sstream>
|
||||||
|
#include <iomanip>
|
||||||
|
|
||||||
|
#if _MSC_VER >= 1400 // VC++ 8.0
|
||||||
|
#pragma warning( disable : 4996 ) // disable warning about strdup being deprecated.
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace Json {
|
||||||
|
|
||||||
|
static bool isControlCharacter(char ch)
|
||||||
|
{
|
||||||
|
return ch > 0 && ch <= 0x1F;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool containsControlCharacter( const char* str )
|
||||||
|
{
|
||||||
|
while ( *str )
|
||||||
|
{
|
||||||
|
if ( isControlCharacter( *(str++) ) )
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
static void uintToString( unsigned int value,
|
||||||
|
char *¤t )
|
||||||
|
{
|
||||||
|
*--current = 0;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
*--current = (value % 10) + '0';
|
||||||
|
value /= 10;
|
||||||
|
}
|
||||||
|
while ( value != 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string valueToString( Int value )
|
||||||
|
{
|
||||||
|
char buffer[32];
|
||||||
|
char *current = buffer + sizeof(buffer);
|
||||||
|
bool isNegative = value < 0;
|
||||||
|
if ( isNegative )
|
||||||
|
value = -value;
|
||||||
|
uintToString( UInt(value), current );
|
||||||
|
if ( isNegative )
|
||||||
|
*--current = '-';
|
||||||
|
assert( current >= buffer );
|
||||||
|
return current;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
std::string valueToString( UInt value )
|
||||||
|
{
|
||||||
|
char buffer[32];
|
||||||
|
char *current = buffer + sizeof(buffer);
|
||||||
|
uintToString( value, current );
|
||||||
|
assert( current >= buffer );
|
||||||
|
return current;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string valueToString( double value )
|
||||||
|
{
|
||||||
|
char buffer[32];
|
||||||
|
#if defined(_MSC_VER) && defined(__STDC_SECURE_LIB__) // Use secure version with visual studio 2005 to avoid warning.
|
||||||
|
sprintf_s(buffer, sizeof(buffer), "%#.16g", value);
|
||||||
|
#else
|
||||||
|
sprintf(buffer, "%#.16g", value);
|
||||||
|
#endif
|
||||||
|
char* ch = buffer + strlen(buffer) - 1;
|
||||||
|
if (*ch != '0') return buffer; // nothing to truncate, so save time
|
||||||
|
while(ch > buffer && *ch == '0'){
|
||||||
|
--ch;
|
||||||
|
}
|
||||||
|
char* last_nonzero = ch;
|
||||||
|
while(ch >= buffer){
|
||||||
|
switch(*ch){
|
||||||
|
case '0':
|
||||||
|
case '1':
|
||||||
|
case '2':
|
||||||
|
case '3':
|
||||||
|
case '4':
|
||||||
|
case '5':
|
||||||
|
case '6':
|
||||||
|
case '7':
|
||||||
|
case '8':
|
||||||
|
case '9':
|
||||||
|
--ch;
|
||||||
|
continue;
|
||||||
|
case '.':
|
||||||
|
// Truncate zeroes to save bytes in output, but keep one.
|
||||||
|
*(last_nonzero+2) = '\0';
|
||||||
|
return buffer;
|
||||||
|
default:
|
||||||
|
return buffer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
std::string valueToString( bool value )
|
||||||
|
{
|
||||||
|
return value ? "true" : "false";
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string valueToQuotedString( const char *value )
|
||||||
|
{
|
||||||
|
// Not sure how to handle unicode...
|
||||||
|
if (strpbrk(value, "\"\\\b\f\n\r\t") == NULL && !containsControlCharacter( value ))
|
||||||
|
return std::string("\"") + value + "\"";
|
||||||
|
// We have to walk value and escape any special characters.
|
||||||
|
// Appending to std::string is not efficient, but this should be rare.
|
||||||
|
// (Note: forward slashes are *not* rare, but I am not escaping them.)
|
||||||
|
unsigned maxsize = strlen(value)*2 + 3; // allescaped+quotes+NULL
|
||||||
|
std::string result;
|
||||||
|
result.reserve(maxsize); // to avoid lots of mallocs
|
||||||
|
result += "\"";
|
||||||
|
for (const char* c=value; *c != 0; ++c)
|
||||||
|
{
|
||||||
|
switch(*c)
|
||||||
|
{
|
||||||
|
case '\"':
|
||||||
|
result += "\\\"";
|
||||||
|
break;
|
||||||
|
case '\\':
|
||||||
|
result += "\\\\";
|
||||||
|
break;
|
||||||
|
case '\b':
|
||||||
|
result += "\\b";
|
||||||
|
break;
|
||||||
|
case '\f':
|
||||||
|
result += "\\f";
|
||||||
|
break;
|
||||||
|
case '\n':
|
||||||
|
result += "\\n";
|
||||||
|
break;
|
||||||
|
case '\r':
|
||||||
|
result += "\\r";
|
||||||
|
break;
|
||||||
|
case '\t':
|
||||||
|
result += "\\t";
|
||||||
|
break;
|
||||||
|
//case '/':
|
||||||
|
// Even though \/ is considered a legal escape in JSON, a bare
|
||||||
|
// slash is also legal, so I see no reason to escape it.
|
||||||
|
// (I hope I am not misunderstanding something.
|
||||||
|
// blep notes: actually escaping \/ may be useful in javascript to avoid </
|
||||||
|
// sequence.
|
||||||
|
// Should add a flag to allow this compatibility mode and prevent this
|
||||||
|
// sequence from occurring.
|
||||||
|
default:
|
||||||
|
if ( isControlCharacter( *c ) )
|
||||||
|
{
|
||||||
|
std::ostringstream oss;
|
||||||
|
oss << "\\u" << std::hex << std::uppercase << std::setfill('0') << std::setw(4) << static_cast<int>(*c);
|
||||||
|
result += oss.str();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result += *c;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result += "\"";
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Class Writer
|
||||||
|
// //////////////////////////////////////////////////////////////////
|
||||||
|
Writer::~Writer()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Class FastWriter
|
||||||
|
// //////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
FastWriter::FastWriter()
|
||||||
|
: yamlCompatiblityEnabled_( false )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
FastWriter::enableYAMLCompatibility()
|
||||||
|
{
|
||||||
|
yamlCompatiblityEnabled_ = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
std::string
|
||||||
|
FastWriter::write( const Value &root )
|
||||||
|
{
|
||||||
|
document_ = "";
|
||||||
|
writeValue( root );
|
||||||
|
document_ += "\n";
|
||||||
|
return document_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
FastWriter::writeValue( const Value &value )
|
||||||
|
{
|
||||||
|
switch ( value.type() )
|
||||||
|
{
|
||||||
|
case nullValue:
|
||||||
|
document_ += "null";
|
||||||
|
break;
|
||||||
|
case intValue:
|
||||||
|
document_ += valueToString( value.asInt() );
|
||||||
|
break;
|
||||||
|
case uintValue:
|
||||||
|
document_ += valueToString( value.asUInt() );
|
||||||
|
break;
|
||||||
|
case realValue:
|
||||||
|
document_ += valueToString( value.asDouble() );
|
||||||
|
break;
|
||||||
|
case stringValue:
|
||||||
|
document_ += valueToQuotedString( value.asCString() );
|
||||||
|
break;
|
||||||
|
case booleanValue:
|
||||||
|
document_ += valueToString( value.asBool() );
|
||||||
|
break;
|
||||||
|
case arrayValue:
|
||||||
|
{
|
||||||
|
document_ += "[";
|
||||||
|
int size = value.size();
|
||||||
|
for ( int index =0; index < size; ++index )
|
||||||
|
{
|
||||||
|
if ( index > 0 )
|
||||||
|
document_ += ",";
|
||||||
|
writeValue( value[index] );
|
||||||
|
}
|
||||||
|
document_ += "]";
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case objectValue:
|
||||||
|
{
|
||||||
|
Value::Members members( value.getMemberNames() );
|
||||||
|
document_ += "{";
|
||||||
|
for ( Value::Members::iterator it = members.begin();
|
||||||
|
it != members.end();
|
||||||
|
++it )
|
||||||
|
{
|
||||||
|
const std::string &name = *it;
|
||||||
|
if ( it != members.begin() )
|
||||||
|
document_ += ",";
|
||||||
|
document_ += valueToQuotedString( name.c_str() );
|
||||||
|
document_ += yamlCompatiblityEnabled_ ? ": "
|
||||||
|
: ":";
|
||||||
|
writeValue( value[name] );
|
||||||
|
}
|
||||||
|
document_ += "}";
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Class StyledWriter
|
||||||
|
// //////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
StyledWriter::StyledWriter()
|
||||||
|
: rightMargin_( 74 )
|
||||||
|
, indentSize_( 3 )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
std::string
|
||||||
|
StyledWriter::write( const Value &root )
|
||||||
|
{
|
||||||
|
document_ = "";
|
||||||
|
addChildValues_ = false;
|
||||||
|
indentString_ = "";
|
||||||
|
writeCommentBeforeValue( root );
|
||||||
|
writeValue( root );
|
||||||
|
writeCommentAfterValueOnSameLine( root );
|
||||||
|
document_ += "\n";
|
||||||
|
return document_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
StyledWriter::writeValue( const Value &value )
|
||||||
|
{
|
||||||
|
switch ( value.type() )
|
||||||
|
{
|
||||||
|
case nullValue:
|
||||||
|
pushValue( "null" );
|
||||||
|
break;
|
||||||
|
case intValue:
|
||||||
|
pushValue( valueToString( value.asInt() ) );
|
||||||
|
break;
|
||||||
|
case uintValue:
|
||||||
|
pushValue( valueToString( value.asUInt() ) );
|
||||||
|
break;
|
||||||
|
case realValue:
|
||||||
|
pushValue( valueToString( value.asDouble() ) );
|
||||||
|
break;
|
||||||
|
case stringValue:
|
||||||
|
pushValue( valueToQuotedString( value.asCString() ) );
|
||||||
|
break;
|
||||||
|
case booleanValue:
|
||||||
|
pushValue( valueToString( value.asBool() ) );
|
||||||
|
break;
|
||||||
|
case arrayValue:
|
||||||
|
writeArrayValue( value);
|
||||||
|
break;
|
||||||
|
case objectValue:
|
||||||
|
{
|
||||||
|
Value::Members members( value.getMemberNames() );
|
||||||
|
if ( members.empty() )
|
||||||
|
pushValue( "{}" );
|
||||||
|
else
|
||||||
|
{
|
||||||
|
writeWithIndent( "{" );
|
||||||
|
indent();
|
||||||
|
Value::Members::iterator it = members.begin();
|
||||||
|
while ( true )
|
||||||
|
{
|
||||||
|
const std::string &name = *it;
|
||||||
|
const Value &childValue = value[name];
|
||||||
|
writeCommentBeforeValue( childValue );
|
||||||
|
writeWithIndent( valueToQuotedString( name.c_str() ) );
|
||||||
|
document_ += " : ";
|
||||||
|
writeValue( childValue );
|
||||||
|
if ( ++it == members.end() )
|
||||||
|
{
|
||||||
|
writeCommentAfterValueOnSameLine( childValue );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
document_ += ",";
|
||||||
|
writeCommentAfterValueOnSameLine( childValue );
|
||||||
|
}
|
||||||
|
unindent();
|
||||||
|
writeWithIndent( "}" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
StyledWriter::writeArrayValue( const Value &value )
|
||||||
|
{
|
||||||
|
unsigned size = value.size();
|
||||||
|
if ( size == 0 )
|
||||||
|
pushValue( "[]" );
|
||||||
|
else
|
||||||
|
{
|
||||||
|
bool isArrayMultiLine = isMultineArray( value );
|
||||||
|
if ( isArrayMultiLine )
|
||||||
|
{
|
||||||
|
writeWithIndent( "[" );
|
||||||
|
indent();
|
||||||
|
bool hasChildValue = !childValues_.empty();
|
||||||
|
unsigned index =0;
|
||||||
|
while ( true )
|
||||||
|
{
|
||||||
|
const Value &childValue = value[index];
|
||||||
|
writeCommentBeforeValue( childValue );
|
||||||
|
if ( hasChildValue )
|
||||||
|
writeWithIndent( childValues_[index] );
|
||||||
|
else
|
||||||
|
{
|
||||||
|
writeIndent();
|
||||||
|
writeValue( childValue );
|
||||||
|
}
|
||||||
|
if ( ++index == size )
|
||||||
|
{
|
||||||
|
writeCommentAfterValueOnSameLine( childValue );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
document_ += ",";
|
||||||
|
writeCommentAfterValueOnSameLine( childValue );
|
||||||
|
}
|
||||||
|
unindent();
|
||||||
|
writeWithIndent( "]" );
|
||||||
|
}
|
||||||
|
else // output on a single line
|
||||||
|
{
|
||||||
|
assert( childValues_.size() == size );
|
||||||
|
document_ += "[ ";
|
||||||
|
for ( unsigned index =0; index < size; ++index )
|
||||||
|
{
|
||||||
|
if ( index > 0 )
|
||||||
|
document_ += ", ";
|
||||||
|
document_ += childValues_[index];
|
||||||
|
}
|
||||||
|
document_ += " ]";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
StyledWriter::isMultineArray( const Value &value )
|
||||||
|
{
|
||||||
|
int size = value.size();
|
||||||
|
bool isMultiLine = size*3 >= rightMargin_ ;
|
||||||
|
childValues_.clear();
|
||||||
|
for ( int index =0; index < size && !isMultiLine; ++index )
|
||||||
|
{
|
||||||
|
const Value &childValue = value[index];
|
||||||
|
isMultiLine = isMultiLine ||
|
||||||
|
( (childValue.isArray() || childValue.isObject()) &&
|
||||||
|
childValue.size() > 0 );
|
||||||
|
}
|
||||||
|
if ( !isMultiLine ) // check if line length > max line length
|
||||||
|
{
|
||||||
|
childValues_.reserve( size );
|
||||||
|
addChildValues_ = true;
|
||||||
|
int lineLength = 4 + (size-1)*2; // '[ ' + ', '*n + ' ]'
|
||||||
|
for ( int index =0; index < size && !isMultiLine; ++index )
|
||||||
|
{
|
||||||
|
writeValue( value[index] );
|
||||||
|
lineLength += int( childValues_[index].length() );
|
||||||
|
isMultiLine = isMultiLine && hasCommentForValue( value[index] );
|
||||||
|
}
|
||||||
|
addChildValues_ = false;
|
||||||
|
isMultiLine = isMultiLine || lineLength >= rightMargin_;
|
||||||
|
}
|
||||||
|
return isMultiLine;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
StyledWriter::pushValue( const std::string &value )
|
||||||
|
{
|
||||||
|
if ( addChildValues_ )
|
||||||
|
childValues_.push_back( value );
|
||||||
|
else
|
||||||
|
document_ += value;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
StyledWriter::writeIndent()
|
||||||
|
{
|
||||||
|
if ( !document_.empty() )
|
||||||
|
{
|
||||||
|
char last = document_[document_.length()-1];
|
||||||
|
if ( last == ' ' ) // already indented
|
||||||
|
return;
|
||||||
|
if ( last != '\n' ) // Comments may add new-line
|
||||||
|
document_ += '\n';
|
||||||
|
}
|
||||||
|
document_ += indentString_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
StyledWriter::writeWithIndent( const std::string &value )
|
||||||
|
{
|
||||||
|
writeIndent();
|
||||||
|
document_ += value;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
StyledWriter::indent()
|
||||||
|
{
|
||||||
|
indentString_ += std::string( indentSize_, ' ' );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
StyledWriter::unindent()
|
||||||
|
{
|
||||||
|
assert( int(indentString_.size()) >= indentSize_ );
|
||||||
|
indentString_.resize( indentString_.size() - indentSize_ );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
StyledWriter::writeCommentBeforeValue( const Value &root )
|
||||||
|
{
|
||||||
|
if ( !root.hasComment( commentBefore ) )
|
||||||
|
return;
|
||||||
|
document_ += normalizeEOL( root.getComment( commentBefore ) );
|
||||||
|
document_ += "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
StyledWriter::writeCommentAfterValueOnSameLine( const Value &root )
|
||||||
|
{
|
||||||
|
if ( root.hasComment( commentAfterOnSameLine ) )
|
||||||
|
document_ += " " + normalizeEOL( root.getComment( commentAfterOnSameLine ) );
|
||||||
|
|
||||||
|
if ( root.hasComment( commentAfter ) )
|
||||||
|
{
|
||||||
|
document_ += "\n";
|
||||||
|
document_ += normalizeEOL( root.getComment( commentAfter ) );
|
||||||
|
document_ += "\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
StyledWriter::hasCommentForValue( const Value &value )
|
||||||
|
{
|
||||||
|
return value.hasComment( commentBefore )
|
||||||
|
|| value.hasComment( commentAfterOnSameLine )
|
||||||
|
|| value.hasComment( commentAfter );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
std::string
|
||||||
|
StyledWriter::normalizeEOL( const std::string &text )
|
||||||
|
{
|
||||||
|
std::string normalized;
|
||||||
|
normalized.reserve( text.length() );
|
||||||
|
const char *begin = text.c_str();
|
||||||
|
const char *end = begin + text.length();
|
||||||
|
const char *current = begin;
|
||||||
|
while ( current != end )
|
||||||
|
{
|
||||||
|
char c = *current++;
|
||||||
|
if ( c == '\r' ) // mac or dos EOL
|
||||||
|
{
|
||||||
|
if ( *current == '\n' ) // convert dos EOL
|
||||||
|
++current;
|
||||||
|
normalized += '\n';
|
||||||
|
}
|
||||||
|
else // handle unix EOL & other char
|
||||||
|
normalized += c;
|
||||||
|
}
|
||||||
|
return normalized;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Class StyledStreamWriter
|
||||||
|
// //////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
StyledStreamWriter::StyledStreamWriter( std::string indentation )
|
||||||
|
: document_(NULL)
|
||||||
|
, rightMargin_( 74 )
|
||||||
|
, indentation_( indentation )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
StyledStreamWriter::write( std::ostream &out, const Value &root )
|
||||||
|
{
|
||||||
|
document_ = &out;
|
||||||
|
addChildValues_ = false;
|
||||||
|
indentString_ = "";
|
||||||
|
writeCommentBeforeValue( root );
|
||||||
|
writeValue( root );
|
||||||
|
writeCommentAfterValueOnSameLine( root );
|
||||||
|
*document_ << "\n";
|
||||||
|
document_ = NULL; // Forget the stream, for safety.
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
StyledStreamWriter::writeValue( const Value &value )
|
||||||
|
{
|
||||||
|
switch ( value.type() )
|
||||||
|
{
|
||||||
|
case nullValue:
|
||||||
|
pushValue( "null" );
|
||||||
|
break;
|
||||||
|
case intValue:
|
||||||
|
pushValue( valueToString( value.asInt() ) );
|
||||||
|
break;
|
||||||
|
case uintValue:
|
||||||
|
pushValue( valueToString( value.asUInt() ) );
|
||||||
|
break;
|
||||||
|
case realValue:
|
||||||
|
pushValue( valueToString( value.asDouble() ) );
|
||||||
|
break;
|
||||||
|
case stringValue:
|
||||||
|
pushValue( valueToQuotedString( value.asCString() ) );
|
||||||
|
break;
|
||||||
|
case booleanValue:
|
||||||
|
pushValue( valueToString( value.asBool() ) );
|
||||||
|
break;
|
||||||
|
case arrayValue:
|
||||||
|
writeArrayValue( value);
|
||||||
|
break;
|
||||||
|
case objectValue:
|
||||||
|
{
|
||||||
|
Value::Members members( value.getMemberNames() );
|
||||||
|
if ( members.empty() )
|
||||||
|
pushValue( "{}" );
|
||||||
|
else
|
||||||
|
{
|
||||||
|
writeWithIndent( "{" );
|
||||||
|
indent();
|
||||||
|
Value::Members::iterator it = members.begin();
|
||||||
|
while ( true )
|
||||||
|
{
|
||||||
|
const std::string &name = *it;
|
||||||
|
const Value &childValue = value[name];
|
||||||
|
writeCommentBeforeValue( childValue );
|
||||||
|
writeWithIndent( valueToQuotedString( name.c_str() ) );
|
||||||
|
*document_ << " : ";
|
||||||
|
writeValue( childValue );
|
||||||
|
if ( ++it == members.end() )
|
||||||
|
{
|
||||||
|
writeCommentAfterValueOnSameLine( childValue );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
*document_ << ",";
|
||||||
|
writeCommentAfterValueOnSameLine( childValue );
|
||||||
|
}
|
||||||
|
unindent();
|
||||||
|
writeWithIndent( "}" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
StyledStreamWriter::writeArrayValue( const Value &value )
|
||||||
|
{
|
||||||
|
unsigned size = value.size();
|
||||||
|
if ( size == 0 )
|
||||||
|
pushValue( "[]" );
|
||||||
|
else
|
||||||
|
{
|
||||||
|
bool isArrayMultiLine = isMultineArray( value );
|
||||||
|
if ( isArrayMultiLine )
|
||||||
|
{
|
||||||
|
writeWithIndent( "[" );
|
||||||
|
indent();
|
||||||
|
bool hasChildValue = !childValues_.empty();
|
||||||
|
unsigned index =0;
|
||||||
|
while ( true )
|
||||||
|
{
|
||||||
|
const Value &childValue = value[index];
|
||||||
|
writeCommentBeforeValue( childValue );
|
||||||
|
if ( hasChildValue )
|
||||||
|
writeWithIndent( childValues_[index] );
|
||||||
|
else
|
||||||
|
{
|
||||||
|
writeIndent();
|
||||||
|
writeValue( childValue );
|
||||||
|
}
|
||||||
|
if ( ++index == size )
|
||||||
|
{
|
||||||
|
writeCommentAfterValueOnSameLine( childValue );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
*document_ << ",";
|
||||||
|
writeCommentAfterValueOnSameLine( childValue );
|
||||||
|
}
|
||||||
|
unindent();
|
||||||
|
writeWithIndent( "]" );
|
||||||
|
}
|
||||||
|
else // output on a single line
|
||||||
|
{
|
||||||
|
assert( childValues_.size() == size );
|
||||||
|
*document_ << "[ ";
|
||||||
|
for ( unsigned index =0; index < size; ++index )
|
||||||
|
{
|
||||||
|
if ( index > 0 )
|
||||||
|
*document_ << ", ";
|
||||||
|
*document_ << childValues_[index];
|
||||||
|
}
|
||||||
|
*document_ << " ]";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
StyledStreamWriter::isMultineArray( const Value &value )
|
||||||
|
{
|
||||||
|
int size = value.size();
|
||||||
|
bool isMultiLine = size*3 >= rightMargin_ ;
|
||||||
|
childValues_.clear();
|
||||||
|
for ( int index =0; index < size && !isMultiLine; ++index )
|
||||||
|
{
|
||||||
|
const Value &childValue = value[index];
|
||||||
|
isMultiLine = isMultiLine ||
|
||||||
|
( (childValue.isArray() || childValue.isObject()) &&
|
||||||
|
childValue.size() > 0 );
|
||||||
|
}
|
||||||
|
if ( !isMultiLine ) // check if line length > max line length
|
||||||
|
{
|
||||||
|
childValues_.reserve( size );
|
||||||
|
addChildValues_ = true;
|
||||||
|
int lineLength = 4 + (size-1)*2; // '[ ' + ', '*n + ' ]'
|
||||||
|
for ( int index =0; index < size && !isMultiLine; ++index )
|
||||||
|
{
|
||||||
|
writeValue( value[index] );
|
||||||
|
lineLength += int( childValues_[index].length() );
|
||||||
|
isMultiLine = isMultiLine && hasCommentForValue( value[index] );
|
||||||
|
}
|
||||||
|
addChildValues_ = false;
|
||||||
|
isMultiLine = isMultiLine || lineLength >= rightMargin_;
|
||||||
|
}
|
||||||
|
return isMultiLine;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
StyledStreamWriter::pushValue( const std::string &value )
|
||||||
|
{
|
||||||
|
if ( addChildValues_ )
|
||||||
|
childValues_.push_back( value );
|
||||||
|
else
|
||||||
|
*document_ << value;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
StyledStreamWriter::writeIndent()
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
Some comments in this method would have been nice. ;-)
|
||||||
|
|
||||||
|
if ( !document_.empty() )
|
||||||
|
{
|
||||||
|
char last = document_[document_.length()-1];
|
||||||
|
if ( last == ' ' ) // already indented
|
||||||
|
return;
|
||||||
|
if ( last != '\n' ) // Comments may add new-line
|
||||||
|
*document_ << '\n';
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
*document_ << '\n' << indentString_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
StyledStreamWriter::writeWithIndent( const std::string &value )
|
||||||
|
{
|
||||||
|
writeIndent();
|
||||||
|
*document_ << value;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
StyledStreamWriter::indent()
|
||||||
|
{
|
||||||
|
indentString_ += indentation_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
StyledStreamWriter::unindent()
|
||||||
|
{
|
||||||
|
assert( indentString_.size() >= indentation_.size() );
|
||||||
|
indentString_.resize( indentString_.size() - indentation_.size() );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
StyledStreamWriter::writeCommentBeforeValue( const Value &root )
|
||||||
|
{
|
||||||
|
if ( !root.hasComment( commentBefore ) )
|
||||||
|
return;
|
||||||
|
*document_ << normalizeEOL( root.getComment( commentBefore ) );
|
||||||
|
*document_ << "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
StyledStreamWriter::writeCommentAfterValueOnSameLine( const Value &root )
|
||||||
|
{
|
||||||
|
if ( root.hasComment( commentAfterOnSameLine ) )
|
||||||
|
*document_ << " " + normalizeEOL( root.getComment( commentAfterOnSameLine ) );
|
||||||
|
|
||||||
|
if ( root.hasComment( commentAfter ) )
|
||||||
|
{
|
||||||
|
*document_ << "\n";
|
||||||
|
*document_ << normalizeEOL( root.getComment( commentAfter ) );
|
||||||
|
*document_ << "\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
StyledStreamWriter::hasCommentForValue( const Value &value )
|
||||||
|
{
|
||||||
|
return value.hasComment( commentBefore )
|
||||||
|
|| value.hasComment( commentAfterOnSameLine )
|
||||||
|
|| value.hasComment( commentAfter );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
std::string
|
||||||
|
StyledStreamWriter::normalizeEOL( const std::string &text )
|
||||||
|
{
|
||||||
|
std::string normalized;
|
||||||
|
normalized.reserve( text.length() );
|
||||||
|
const char *begin = text.c_str();
|
||||||
|
const char *end = begin + text.length();
|
||||||
|
const char *current = begin;
|
||||||
|
while ( current != end )
|
||||||
|
{
|
||||||
|
char c = *current++;
|
||||||
|
if ( c == '\r' ) // mac or dos EOL
|
||||||
|
{
|
||||||
|
if ( *current == '\n' ) // convert dos EOL
|
||||||
|
++current;
|
||||||
|
normalized += '\n';
|
||||||
|
}
|
||||||
|
else // handle unix EOL & other char
|
||||||
|
normalized += c;
|
||||||
|
}
|
||||||
|
return normalized;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
std::ostream& operator<<( std::ostream &sout, const Value &root )
|
||||||
|
{
|
||||||
|
Json::StyledStreamWriter writer;
|
||||||
|
writer.write(sout, root);
|
||||||
|
return sout;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace Json
|
||||||
170
samples/C++/program.cp
Normal file
170
samples/C++/program.cp
Normal file
@@ -0,0 +1,170 @@
|
|||||||
|
/**
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2016 Sahil Dua ( sahildua2305 | http://sahildua.com )
|
||||||
|
|
||||||
|
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.*/
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <algorithm>
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cstring>
|
||||||
|
#include <cmath>
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
#include <map>
|
||||||
|
#include <set>
|
||||||
|
#include <queue>
|
||||||
|
#include <stack>
|
||||||
|
using namespace std;
|
||||||
|
typedef long long ll;
|
||||||
|
#define DEBUG
|
||||||
|
#define mod 1000000007
|
||||||
|
#define pb push_back
|
||||||
|
|
||||||
|
int r2, c2, n, m;
|
||||||
|
|
||||||
|
bool dfs(vector<string> graph, int r, int c){
|
||||||
|
//cout<<r<<" "<<c<<endl;
|
||||||
|
if(graph[r][c] == 'X'){
|
||||||
|
if(r==r2 && c==c2)
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
graph[r][c] = 'X';
|
||||||
|
}
|
||||||
|
if(r>0){
|
||||||
|
if(dfs(graph, r-1, c))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if(c>0){
|
||||||
|
if(dfs(graph, r, c-1))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if(r<(n-1)){
|
||||||
|
if(dfs(graph, r+1, c))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if(c<(m-1)){
|
||||||
|
if(dfs(graph, r, c+1))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct point{
|
||||||
|
int r,c;
|
||||||
|
point(int rr, int cc){
|
||||||
|
r = rr;
|
||||||
|
c = cc;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
stack<point> st;
|
||||||
|
|
||||||
|
// if(r>0){
|
||||||
|
// if(dfs(graph, r-1, c))
|
||||||
|
// return true;
|
||||||
|
// }
|
||||||
|
// if(c>0){
|
||||||
|
// if(dfs(graph, r, c-1))
|
||||||
|
// return true;
|
||||||
|
// }
|
||||||
|
// if(r<(n-1)){
|
||||||
|
// if(dfs(graph, r+1, c))
|
||||||
|
// return true;
|
||||||
|
// }
|
||||||
|
// if(c<(m-1)){
|
||||||
|
// if(dfs(graph, r, c+1))
|
||||||
|
// return true;
|
||||||
|
// }
|
||||||
|
|
||||||
|
bool search(vector<string> graph, int rr, int cc){
|
||||||
|
point t;
|
||||||
|
t.r=rr;
|
||||||
|
t.c=cc;
|
||||||
|
st.push(t);
|
||||||
|
|
||||||
|
while(!st.empty()){
|
||||||
|
point u = st.top();
|
||||||
|
st.pop();
|
||||||
|
int r = u.r, c = u.c;
|
||||||
|
cout<<r<<" "<<c<<endl;
|
||||||
|
if(graph[r][c]=='X'){
|
||||||
|
if(r==r2 && c==c2)
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
graph[r][c] = 'X';
|
||||||
|
}
|
||||||
|
if(r>0){
|
||||||
|
t.r=r-1;
|
||||||
|
t.c=c;
|
||||||
|
st.push(t);
|
||||||
|
}
|
||||||
|
if(c>0){
|
||||||
|
t.r=r;
|
||||||
|
t.c=c-1;
|
||||||
|
st.push(t);
|
||||||
|
}
|
||||||
|
if(r<(n-1)){
|
||||||
|
t.r=r+1;
|
||||||
|
t.c=c;
|
||||||
|
st.push(t);
|
||||||
|
}
|
||||||
|
if(c<(m-1)){
|
||||||
|
t.r=r;
|
||||||
|
t.c=c+1;
|
||||||
|
st.push(t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(){
|
||||||
|
ios::sync_with_stdio(false);
|
||||||
|
#ifdef DEBUG
|
||||||
|
freopen("input.txt", "r", stdin);
|
||||||
|
#endif // DEBUG
|
||||||
|
|
||||||
|
cin>>n>>m;
|
||||||
|
string temp;
|
||||||
|
vector<string> graph;
|
||||||
|
for(int i=0;i<n;i++){
|
||||||
|
cin>>temp;
|
||||||
|
graph.pb(temp);
|
||||||
|
}
|
||||||
|
int r1,c1;
|
||||||
|
cin>>r1>>c1;
|
||||||
|
cin>>r2>>c2;
|
||||||
|
r2--;
|
||||||
|
c2--;
|
||||||
|
r1--;
|
||||||
|
c1--;
|
||||||
|
graph[r1][c1] = '.';
|
||||||
|
if(search(graph, r1, c1))
|
||||||
|
cout<<"YES\n";
|
||||||
|
else
|
||||||
|
cout<<"NO\n";
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@@ -1,415 +0,0 @@
|
|||||||
// This defines the interface to the QsciCommand class.
|
|
||||||
//
|
|
||||||
// Copyright (c) 2011 Riverbank Computing Limited <info@riverbankcomputing.com>
|
|
||||||
//
|
|
||||||
// This file is part of QScintilla.
|
|
||||||
//
|
|
||||||
// This file may be used under the terms of the GNU General Public
|
|
||||||
// License versions 2.0 or 3.0 as published by the Free Software
|
|
||||||
// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3
|
|
||||||
// included in the packaging of this file. Alternatively you may (at
|
|
||||||
// your option) use any later version of the GNU General Public
|
|
||||||
// License if such license has been publicly approved by Riverbank
|
|
||||||
// Computing Limited (or its successors, if any) and the KDE Free Qt
|
|
||||||
// Foundation. In addition, as a special exception, Riverbank gives you
|
|
||||||
// certain additional rights. These rights are described in the Riverbank
|
|
||||||
// GPL Exception version 1.1, which can be found in the file
|
|
||||||
// GPL_EXCEPTION.txt in this package.
|
|
||||||
//
|
|
||||||
// If you are unsure which license is appropriate for your use, please
|
|
||||||
// contact the sales department at sales@riverbankcomputing.com.
|
|
||||||
//
|
|
||||||
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
|
||||||
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef QSCICOMMAND_H
|
|
||||||
#define QSCICOMMAND_H
|
|
||||||
|
|
||||||
#ifdef __APPLE__
|
|
||||||
extern "C++" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <qstring.h>
|
|
||||||
|
|
||||||
#include <Qsci/qsciglobal.h>
|
|
||||||
#include <Qsci/qsciscintillabase.h>
|
|
||||||
|
|
||||||
|
|
||||||
class QsciScintilla;
|
|
||||||
|
|
||||||
|
|
||||||
//! \brief The QsciCommand class represents an internal editor command that may
|
|
||||||
//! have one or two keys bound to it.
|
|
||||||
//!
|
|
||||||
//! Methods are provided to change the keys bound to the command and to remove
|
|
||||||
//! a key binding. Each command has a user friendly description of the command
|
|
||||||
//! for use in key mapping dialogs.
|
|
||||||
class QSCINTILLA_EXPORT QsciCommand
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
//! This enum defines the different commands that can be assigned to a key.
|
|
||||||
enum Command {
|
|
||||||
//! Move down one line.
|
|
||||||
LineDown = QsciScintillaBase::SCI_LINEDOWN,
|
|
||||||
|
|
||||||
//! Extend the selection down one line.
|
|
||||||
LineDownExtend = QsciScintillaBase::SCI_LINEDOWNEXTEND,
|
|
||||||
|
|
||||||
//! Extend the rectangular selection down one line.
|
|
||||||
LineDownRectExtend = QsciScintillaBase::SCI_LINEDOWNRECTEXTEND,
|
|
||||||
|
|
||||||
//! Scroll the view down one line.
|
|
||||||
LineScrollDown = QsciScintillaBase::SCI_LINESCROLLDOWN,
|
|
||||||
|
|
||||||
//! Move up one line.
|
|
||||||
LineUp = QsciScintillaBase::SCI_LINEUP,
|
|
||||||
|
|
||||||
//! Extend the selection up one line.
|
|
||||||
LineUpExtend = QsciScintillaBase::SCI_LINEUPEXTEND,
|
|
||||||
|
|
||||||
//! Extend the rectangular selection up one line.
|
|
||||||
LineUpRectExtend = QsciScintillaBase::SCI_LINEUPRECTEXTEND,
|
|
||||||
|
|
||||||
//! Scroll the view up one line.
|
|
||||||
LineScrollUp = QsciScintillaBase::SCI_LINESCROLLUP,
|
|
||||||
|
|
||||||
//! Scroll to the start of the document.
|
|
||||||
ScrollToStart = QsciScintillaBase::SCI_SCROLLTOSTART,
|
|
||||||
|
|
||||||
//! Scroll to the end of the document.
|
|
||||||
ScrollToEnd = QsciScintillaBase::SCI_SCROLLTOEND,
|
|
||||||
|
|
||||||
//! Scroll vertically to centre the current line.
|
|
||||||
VerticalCentreCaret = QsciScintillaBase::SCI_VERTICALCENTRECARET,
|
|
||||||
|
|
||||||
//! Move down one paragraph.
|
|
||||||
ParaDown = QsciScintillaBase::SCI_PARADOWN,
|
|
||||||
|
|
||||||
//! Extend the selection down one paragraph.
|
|
||||||
ParaDownExtend = QsciScintillaBase::SCI_PARADOWNEXTEND,
|
|
||||||
|
|
||||||
//! Move up one paragraph.
|
|
||||||
ParaUp = QsciScintillaBase::SCI_PARAUP,
|
|
||||||
|
|
||||||
//! Extend the selection up one paragraph.
|
|
||||||
ParaUpExtend = QsciScintillaBase::SCI_PARAUPEXTEND,
|
|
||||||
|
|
||||||
//! Move left one character.
|
|
||||||
CharLeft = QsciScintillaBase::SCI_CHARLEFT,
|
|
||||||
|
|
||||||
//! Extend the selection left one character.
|
|
||||||
CharLeftExtend = QsciScintillaBase::SCI_CHARLEFTEXTEND,
|
|
||||||
|
|
||||||
//! Extend the rectangular selection left one character.
|
|
||||||
CharLeftRectExtend = QsciScintillaBase::SCI_CHARLEFTRECTEXTEND,
|
|
||||||
|
|
||||||
//! Move right one character.
|
|
||||||
CharRight = QsciScintillaBase::SCI_CHARRIGHT,
|
|
||||||
|
|
||||||
//! Extend the selection right one character.
|
|
||||||
CharRightExtend = QsciScintillaBase::SCI_CHARRIGHTEXTEND,
|
|
||||||
|
|
||||||
//! Extend the rectangular selection right one character.
|
|
||||||
CharRightRectExtend = QsciScintillaBase::SCI_CHARRIGHTRECTEXTEND,
|
|
||||||
|
|
||||||
//! Move left one word.
|
|
||||||
WordLeft = QsciScintillaBase::SCI_WORDLEFT,
|
|
||||||
|
|
||||||
//! Extend the selection left one word.
|
|
||||||
WordLeftExtend = QsciScintillaBase::SCI_WORDLEFTEXTEND,
|
|
||||||
|
|
||||||
//! Move right one word.
|
|
||||||
WordRight = QsciScintillaBase::SCI_WORDRIGHT,
|
|
||||||
|
|
||||||
//! Extend the selection right one word.
|
|
||||||
WordRightExtend = QsciScintillaBase::SCI_WORDRIGHTEXTEND,
|
|
||||||
|
|
||||||
//! Move to the end of the previous word.
|
|
||||||
WordLeftEnd = QsciScintillaBase::SCI_WORDLEFTEND,
|
|
||||||
|
|
||||||
//! Extend the selection to the end of the previous word.
|
|
||||||
WordLeftEndExtend = QsciScintillaBase::SCI_WORDLEFTENDEXTEND,
|
|
||||||
|
|
||||||
//! Move to the end of the next word.
|
|
||||||
WordRightEnd = QsciScintillaBase::SCI_WORDRIGHTEND,
|
|
||||||
|
|
||||||
//! Extend the selection to the end of the next word.
|
|
||||||
WordRightEndExtend = QsciScintillaBase::SCI_WORDRIGHTENDEXTEND,
|
|
||||||
|
|
||||||
//! Move left one word part.
|
|
||||||
WordPartLeft = QsciScintillaBase::SCI_WORDPARTLEFT,
|
|
||||||
|
|
||||||
//! Extend the selection left one word part.
|
|
||||||
WordPartLeftExtend = QsciScintillaBase::SCI_WORDPARTLEFTEXTEND,
|
|
||||||
|
|
||||||
//! Move right one word part.
|
|
||||||
WordPartRight = QsciScintillaBase::SCI_WORDPARTRIGHT,
|
|
||||||
|
|
||||||
//! Extend the selection right one word part.
|
|
||||||
WordPartRightExtend = QsciScintillaBase::SCI_WORDPARTRIGHTEXTEND,
|
|
||||||
|
|
||||||
//! Move to the start of the document line.
|
|
||||||
Home = QsciScintillaBase::SCI_HOME,
|
|
||||||
|
|
||||||
//! Extend the selection to the start of the document line.
|
|
||||||
HomeExtend = QsciScintillaBase::SCI_HOMEEXTEND,
|
|
||||||
|
|
||||||
//! Extend the rectangular selection to the start of the document line.
|
|
||||||
HomeRectExtend = QsciScintillaBase::SCI_HOMERECTEXTEND,
|
|
||||||
|
|
||||||
//! Move to the start of the displayed line.
|
|
||||||
HomeDisplay = QsciScintillaBase::SCI_HOMEDISPLAY,
|
|
||||||
|
|
||||||
//! Extend the selection to the start of the displayed line.
|
|
||||||
HomeDisplayExtend = QsciScintillaBase::SCI_HOMEDISPLAYEXTEND,
|
|
||||||
|
|
||||||
//! Move to the start of the displayed or document line.
|
|
||||||
HomeWrap = QsciScintillaBase::SCI_HOMEWRAP,
|
|
||||||
|
|
||||||
//! Extend the selection to the start of the displayed or document
|
|
||||||
//! line.
|
|
||||||
HomeWrapExtend = QsciScintillaBase::SCI_HOMEWRAPEXTEND,
|
|
||||||
|
|
||||||
//! Move to the first visible character in the document line.
|
|
||||||
VCHome = QsciScintillaBase::SCI_VCHOME,
|
|
||||||
|
|
||||||
//! Extend the selection to the first visible character in the document
|
|
||||||
//! line.
|
|
||||||
VCHomeExtend = QsciScintillaBase::SCI_VCHOMEEXTEND,
|
|
||||||
|
|
||||||
//! Extend the rectangular selection to the first visible character in
|
|
||||||
//! the document line.
|
|
||||||
VCHomeRectExtend = QsciScintillaBase::SCI_VCHOMERECTEXTEND,
|
|
||||||
|
|
||||||
//! Move to the first visible character of the displayed or document
|
|
||||||
//! line.
|
|
||||||
VCHomeWrap = QsciScintillaBase::SCI_VCHOMEWRAP,
|
|
||||||
|
|
||||||
//! Extend the selection to the first visible character of the
|
|
||||||
//! displayed or document line.
|
|
||||||
VCHomeWrapExtend = QsciScintillaBase::SCI_VCHOMEWRAPEXTEND,
|
|
||||||
|
|
||||||
//! Move to the end of the document line.
|
|
||||||
LineEnd = QsciScintillaBase::SCI_LINEEND,
|
|
||||||
|
|
||||||
//! Extend the selection to the end of the document line.
|
|
||||||
LineEndExtend = QsciScintillaBase::SCI_LINEENDEXTEND,
|
|
||||||
|
|
||||||
//! Extend the rectangular selection to the end of the document line.
|
|
||||||
LineEndRectExtend = QsciScintillaBase::SCI_LINEENDRECTEXTEND,
|
|
||||||
|
|
||||||
//! Move to the end of the displayed line.
|
|
||||||
LineEndDisplay = QsciScintillaBase::SCI_LINEENDDISPLAY,
|
|
||||||
|
|
||||||
//! Extend the selection to the end of the displayed line.
|
|
||||||
LineEndDisplayExtend = QsciScintillaBase::SCI_LINEENDDISPLAYEXTEND,
|
|
||||||
|
|
||||||
//! Move to the end of the displayed or document line.
|
|
||||||
LineEndWrap = QsciScintillaBase::SCI_LINEENDWRAP,
|
|
||||||
|
|
||||||
//! Extend the selection to the end of the displayed or document line.
|
|
||||||
LineEndWrapExtend = QsciScintillaBase::SCI_LINEENDWRAPEXTEND,
|
|
||||||
|
|
||||||
//! Move to the start of the document.
|
|
||||||
DocumentStart = QsciScintillaBase::SCI_DOCUMENTSTART,
|
|
||||||
|
|
||||||
//! Extend the selection to the start of the document.
|
|
||||||
DocumentStartExtend = QsciScintillaBase::SCI_DOCUMENTSTARTEXTEND,
|
|
||||||
|
|
||||||
//! Move to the end of the document.
|
|
||||||
DocumentEnd = QsciScintillaBase::SCI_DOCUMENTEND,
|
|
||||||
|
|
||||||
//! Extend the selection to the end of the document.
|
|
||||||
DocumentEndExtend = QsciScintillaBase::SCI_DOCUMENTENDEXTEND,
|
|
||||||
|
|
||||||
//! Move up one page.
|
|
||||||
PageUp = QsciScintillaBase::SCI_PAGEUP,
|
|
||||||
|
|
||||||
//! Extend the selection up one page.
|
|
||||||
PageUpExtend = QsciScintillaBase::SCI_PAGEUPEXTEND,
|
|
||||||
|
|
||||||
//! Extend the rectangular selection up one page.
|
|
||||||
PageUpRectExtend = QsciScintillaBase::SCI_PAGEUPRECTEXTEND,
|
|
||||||
|
|
||||||
//! Move down one page.
|
|
||||||
PageDown = QsciScintillaBase::SCI_PAGEDOWN,
|
|
||||||
|
|
||||||
//! Extend the selection down one page.
|
|
||||||
PageDownExtend = QsciScintillaBase::SCI_PAGEDOWNEXTEND,
|
|
||||||
|
|
||||||
//! Extend the rectangular selection down one page.
|
|
||||||
PageDownRectExtend = QsciScintillaBase::SCI_PAGEDOWNRECTEXTEND,
|
|
||||||
|
|
||||||
//! Stuttered move up one page.
|
|
||||||
StutteredPageUp = QsciScintillaBase::SCI_STUTTEREDPAGEUP,
|
|
||||||
|
|
||||||
//! Stuttered extend the selection up one page.
|
|
||||||
StutteredPageUpExtend = QsciScintillaBase::SCI_STUTTEREDPAGEUPEXTEND,
|
|
||||||
|
|
||||||
//! Stuttered move down one page.
|
|
||||||
StutteredPageDown = QsciScintillaBase::SCI_STUTTEREDPAGEDOWN,
|
|
||||||
|
|
||||||
//! Stuttered extend the selection down one page.
|
|
||||||
StutteredPageDownExtend = QsciScintillaBase::SCI_STUTTEREDPAGEDOWNEXTEND,
|
|
||||||
|
|
||||||
//! Delete the current character.
|
|
||||||
Delete = QsciScintillaBase::SCI_CLEAR,
|
|
||||||
|
|
||||||
//! Delete the previous character.
|
|
||||||
DeleteBack = QsciScintillaBase::SCI_DELETEBACK,
|
|
||||||
|
|
||||||
//! Delete the previous character if not at start of line.
|
|
||||||
DeleteBackNotLine = QsciScintillaBase::SCI_DELETEBACKNOTLINE,
|
|
||||||
|
|
||||||
//! Delete the word to the left.
|
|
||||||
DeleteWordLeft = QsciScintillaBase::SCI_DELWORDLEFT,
|
|
||||||
|
|
||||||
//! Delete the word to the right.
|
|
||||||
DeleteWordRight = QsciScintillaBase::SCI_DELWORDRIGHT,
|
|
||||||
|
|
||||||
//! Delete right to the end of the next word.
|
|
||||||
DeleteWordRightEnd = QsciScintillaBase::SCI_DELWORDRIGHTEND,
|
|
||||||
|
|
||||||
//! Delete the line to the left.
|
|
||||||
DeleteLineLeft = QsciScintillaBase::SCI_DELLINELEFT,
|
|
||||||
|
|
||||||
//! Delete the line to the right.
|
|
||||||
DeleteLineRight = QsciScintillaBase::SCI_DELLINERIGHT,
|
|
||||||
|
|
||||||
//! Delete the current line.
|
|
||||||
LineDelete = QsciScintillaBase::SCI_LINEDELETE,
|
|
||||||
|
|
||||||
//! Cut the current line to the clipboard.
|
|
||||||
LineCut = QsciScintillaBase::SCI_LINECUT,
|
|
||||||
|
|
||||||
//! Copy the current line to the clipboard.
|
|
||||||
LineCopy = QsciScintillaBase::SCI_LINECOPY,
|
|
||||||
|
|
||||||
//! Transpose the current and previous lines.
|
|
||||||
LineTranspose = QsciScintillaBase::SCI_LINETRANSPOSE,
|
|
||||||
|
|
||||||
//! Duplicate the current line.
|
|
||||||
LineDuplicate = QsciScintillaBase::SCI_LINEDUPLICATE,
|
|
||||||
|
|
||||||
//! Select the whole document.
|
|
||||||
SelectAll = QsciScintillaBase::SCI_SELECTALL,
|
|
||||||
|
|
||||||
//! Move the selected lines up one line.
|
|
||||||
MoveSelectedLinesUp = QsciScintillaBase::SCI_MOVESELECTEDLINESUP,
|
|
||||||
|
|
||||||
//! Move the selected lines down one line.
|
|
||||||
MoveSelectedLinesDown = QsciScintillaBase::SCI_MOVESELECTEDLINESDOWN,
|
|
||||||
|
|
||||||
//! Duplicate the selection.
|
|
||||||
SelectionDuplicate = QsciScintillaBase::SCI_SELECTIONDUPLICATE,
|
|
||||||
|
|
||||||
//! Convert the selection to lower case.
|
|
||||||
SelectionLowerCase = QsciScintillaBase::SCI_LOWERCASE,
|
|
||||||
|
|
||||||
//! Convert the selection to upper case.
|
|
||||||
SelectionUpperCase = QsciScintillaBase::SCI_UPPERCASE,
|
|
||||||
|
|
||||||
//! Cut the selection to the clipboard.
|
|
||||||
SelectionCut = QsciScintillaBase::SCI_CUT,
|
|
||||||
|
|
||||||
//! Copy the selection to the clipboard.
|
|
||||||
SelectionCopy = QsciScintillaBase::SCI_COPY,
|
|
||||||
|
|
||||||
//! Paste from the clipboard.
|
|
||||||
Paste = QsciScintillaBase::SCI_PASTE,
|
|
||||||
|
|
||||||
//! Toggle insert/overtype.
|
|
||||||
EditToggleOvertype = QsciScintillaBase::SCI_EDITTOGGLEOVERTYPE,
|
|
||||||
|
|
||||||
//! Insert a platform dependent newline.
|
|
||||||
Newline = QsciScintillaBase::SCI_NEWLINE,
|
|
||||||
|
|
||||||
//! Insert a formfeed.
|
|
||||||
Formfeed = QsciScintillaBase::SCI_FORMFEED,
|
|
||||||
|
|
||||||
//! Indent one level.
|
|
||||||
Tab = QsciScintillaBase::SCI_TAB,
|
|
||||||
|
|
||||||
//! De-indent one level.
|
|
||||||
Backtab = QsciScintillaBase::SCI_BACKTAB,
|
|
||||||
|
|
||||||
//! Cancel any current operation.
|
|
||||||
Cancel = QsciScintillaBase::SCI_CANCEL,
|
|
||||||
|
|
||||||
//! Undo the last command.
|
|
||||||
Undo = QsciScintillaBase::SCI_UNDO,
|
|
||||||
|
|
||||||
//! Redo the last command.
|
|
||||||
Redo = QsciScintillaBase::SCI_REDO,
|
|
||||||
|
|
||||||
//! Zoom in.
|
|
||||||
ZoomIn = QsciScintillaBase::SCI_ZOOMIN,
|
|
||||||
|
|
||||||
//! Zoom out.
|
|
||||||
ZoomOut = QsciScintillaBase::SCI_ZOOMOUT,
|
|
||||||
};
|
|
||||||
|
|
||||||
//! Return the command that will be executed by this instance.
|
|
||||||
Command command() const {return scicmd;}
|
|
||||||
|
|
||||||
//! Execute the command.
|
|
||||||
void execute();
|
|
||||||
|
|
||||||
//! Binds the key \a key to the command. If \a key is 0 then the key
|
|
||||||
//! binding is removed. If \a key is invalid then the key binding is
|
|
||||||
//! unchanged. Valid keys are any visible or control character or any
|
|
||||||
//! of \c Key_Down, \c Key_Up, \c Key_Left, \c Key_Right, \c Key_Home,
|
|
||||||
//! \c Key_End, \c Key_PageUp, \c Key_PageDown, \c Key_Delete,
|
|
||||||
//! \c Key_Insert, \c Key_Escape, \c Key_Backspace, \c Key_Tab and
|
|
||||||
//! \c Key_Return. Keys may be modified with any combination of \c SHIFT,
|
|
||||||
//! \c CTRL, \c ALT and \c META.
|
|
||||||
//!
|
|
||||||
//! \sa key(), setAlternateKey(), validKey()
|
|
||||||
void setKey(int key);
|
|
||||||
|
|
||||||
//! Binds the alternate key \a altkey to the command. If \a key is 0
|
|
||||||
//! then the alternate key binding is removed.
|
|
||||||
//!
|
|
||||||
//! \sa alternateKey(), setKey(), validKey()
|
|
||||||
void setAlternateKey(int altkey);
|
|
||||||
|
|
||||||
//! The key that is currently bound to the command is returned.
|
|
||||||
//!
|
|
||||||
//! \sa setKey(), alternateKey()
|
|
||||||
int key() const {return qkey;}
|
|
||||||
|
|
||||||
//! The alternate key that is currently bound to the command is
|
|
||||||
//! returned.
|
|
||||||
//!
|
|
||||||
//! \sa setAlternateKey(), key()
|
|
||||||
int alternateKey() const {return qaltkey;}
|
|
||||||
|
|
||||||
//! If the key \a key is valid then true is returned.
|
|
||||||
static bool validKey(int key);
|
|
||||||
|
|
||||||
//! The user friendly description of the command is returned.
|
|
||||||
QString description() const;
|
|
||||||
|
|
||||||
private:
|
|
||||||
friend class QsciCommandSet;
|
|
||||||
|
|
||||||
QsciCommand(QsciScintilla *qs, Command cmd, int key, int altkey,
|
|
||||||
const char *desc);
|
|
||||||
|
|
||||||
void bindKey(int key,int &qk,int &scik);
|
|
||||||
|
|
||||||
QsciScintilla *qsCmd;
|
|
||||||
Command scicmd;
|
|
||||||
int qkey, scikey, qaltkey, scialtkey;
|
|
||||||
const char *descCmd;
|
|
||||||
|
|
||||||
QsciCommand(const QsciCommand &);
|
|
||||||
QsciCommand &operator=(const QsciCommand &);
|
|
||||||
};
|
|
||||||
|
|
||||||
#ifdef __APPLE__
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,116 +0,0 @@
|
|||||||
// This module defines interface to the QsciPrinter class.
|
|
||||||
//
|
|
||||||
// Copyright (c) 2011 Riverbank Computing Limited <info@riverbankcomputing.com>
|
|
||||||
//
|
|
||||||
// This file is part of QScintilla.
|
|
||||||
//
|
|
||||||
// This file may be used under the terms of the GNU General Public
|
|
||||||
// License versions 2.0 or 3.0 as published by the Free Software
|
|
||||||
// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3
|
|
||||||
// included in the packaging of this file. Alternatively you may (at
|
|
||||||
// your option) use any later version of the GNU General Public
|
|
||||||
// License if such license has been publicly approved by Riverbank
|
|
||||||
// Computing Limited (or its successors, if any) and the KDE Free Qt
|
|
||||||
// Foundation. In addition, as a special exception, Riverbank gives you
|
|
||||||
// certain additional rights. These rights are described in the Riverbank
|
|
||||||
// GPL Exception version 1.1, which can be found in the file
|
|
||||||
// GPL_EXCEPTION.txt in this package.
|
|
||||||
//
|
|
||||||
// If you are unsure which license is appropriate for your use, please
|
|
||||||
// contact the sales department at sales@riverbankcomputing.com.
|
|
||||||
//
|
|
||||||
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
|
||||||
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef QSCIPRINTER_H
|
|
||||||
#define QSCIPRINTER_H
|
|
||||||
|
|
||||||
#ifdef __APPLE__
|
|
||||||
extern "C++" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <qprinter.h>
|
|
||||||
|
|
||||||
#include <Qsci/qsciglobal.h>
|
|
||||||
#include <Qsci/qsciscintilla.h>
|
|
||||||
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
class QRect;
|
|
||||||
class QPainter;
|
|
||||||
QT_END_NAMESPACE
|
|
||||||
|
|
||||||
class QsciScintillaBase;
|
|
||||||
|
|
||||||
|
|
||||||
//! \brief The QsciPrinter class is a sub-class of the Qt QPrinter class that
|
|
||||||
//! is able to print the text of a Scintilla document.
|
|
||||||
//!
|
|
||||||
//! The class can be further sub-classed to alter to layout of the text, adding
|
|
||||||
//! headers and footers for example.
|
|
||||||
class QSCINTILLA_EXPORT QsciPrinter : public QPrinter
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
//! Constructs a printer paint device with mode \a mode.
|
|
||||||
QsciPrinter(PrinterMode mode = ScreenResolution);
|
|
||||||
|
|
||||||
//! Destroys the QsciPrinter instance.
|
|
||||||
virtual ~QsciPrinter();
|
|
||||||
|
|
||||||
//! Format a page, by adding headers and footers for example, before the
|
|
||||||
//! document text is drawn on it. \a painter is the painter to be used to
|
|
||||||
//! add customised text and graphics. \a drawing is true if the page is
|
|
||||||
//! actually being drawn rather than being sized. \a painter drawing
|
|
||||||
//! methods must only be called when \a drawing is true. \a area is the
|
|
||||||
//! area of the page that will be used to draw the text. This should be
|
|
||||||
//! modified if it is necessary to reserve space for any customised text or
|
|
||||||
//! graphics. By default the area is relative to the printable area of the
|
|
||||||
//! page. Use QPrinter::setFullPage() because calling printRange() if you
|
|
||||||
//! want to try and print over the whole page. \a pagenr is the number of
|
|
||||||
//! the page. The first page is numbered 1.
|
|
||||||
virtual void formatPage(QPainter &painter, bool drawing, QRect &area,
|
|
||||||
int pagenr);
|
|
||||||
|
|
||||||
//! Return the number of points to add to each font when printing.
|
|
||||||
//!
|
|
||||||
//! \sa setMagnification()
|
|
||||||
int magnification() const {return mag;}
|
|
||||||
|
|
||||||
//! Sets the number of points to add to each font when printing to \a
|
|
||||||
//! magnification.
|
|
||||||
//!
|
|
||||||
//! \sa magnification()
|
|
||||||
virtual void setMagnification(int magnification);
|
|
||||||
|
|
||||||
//! Print a range of lines from the Scintilla instance \a qsb. \a from is
|
|
||||||
//! the first line to print and a negative value signifies the first line
|
|
||||||
//! of text. \a to is the last line to print and a negative value
|
|
||||||
//! signifies the last line of text. true is returned if there was no
|
|
||||||
//! error.
|
|
||||||
virtual int printRange(QsciScintillaBase *qsb, int from = -1, int to = -1);
|
|
||||||
|
|
||||||
//! Return the line wrap mode used when printing. The default is
|
|
||||||
//! QsciScintilla::WrapWord.
|
|
||||||
//!
|
|
||||||
//! \sa setWrapMode()
|
|
||||||
QsciScintilla::WrapMode wrapMode() const {return wrap;}
|
|
||||||
|
|
||||||
//! Sets the line wrap mode used when printing to \a wmode.
|
|
||||||
//!
|
|
||||||
//! \sa wrapMode()
|
|
||||||
virtual void setWrapMode(QsciScintilla::WrapMode wmode);
|
|
||||||
|
|
||||||
private:
|
|
||||||
int mag;
|
|
||||||
QsciScintilla::WrapMode wrap;
|
|
||||||
|
|
||||||
QsciPrinter(const QsciPrinter &);
|
|
||||||
QsciPrinter &operator=(const QsciPrinter &);
|
|
||||||
};
|
|
||||||
|
|
||||||
#ifdef __APPLE__
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
13
samples/C++/simple.re
Normal file
13
samples/C++/simple.re
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
#define NULL ((char*) 0)
|
||||||
|
char *scan(char *p){
|
||||||
|
char *q;
|
||||||
|
#define YYCTYPE char
|
||||||
|
#define YYCURSOR p
|
||||||
|
#define YYLIMIT p
|
||||||
|
#define YYMARKER q
|
||||||
|
#define YYFILL(n)
|
||||||
|
/*!re2c
|
||||||
|
[0-9]+ {return YYCURSOR;}
|
||||||
|
[\000-\377] {return NULL;}
|
||||||
|
*/
|
||||||
|
}
|
||||||
557
samples/C++/srs_app_ingest.cpp
Normal file
557
samples/C++/srs_app_ingest.cpp
Normal file
@@ -0,0 +1,557 @@
|
|||||||
|
/*
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2013-2015 SRS(ossrs)
|
||||||
|
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Source - https://github.com/REN-I/srs/blob/3aae7854702a37955bce706fcd8122b02ac07f53/trunk/src/app/srs_app_ingest.cpp
|
||||||
|
|
||||||
|
#include <srs_app_ingest.hpp>
|
||||||
|
|
||||||
|
#ifdef SRS_AUTO_INGEST
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
#include <srs_kernel_error.hpp>
|
||||||
|
#include <srs_app_config.hpp>
|
||||||
|
#include <srs_kernel_log.hpp>
|
||||||
|
#include <srs_app_ffmpeg.hpp>
|
||||||
|
#include <srs_app_pithy_print.hpp>
|
||||||
|
#include <srs_kernel_utility.hpp>
|
||||||
|
#include <srs_app_utility.hpp>
|
||||||
|
|
||||||
|
// when error, ingester sleep for a while and retry.
|
||||||
|
// ingest never sleep a long time, for we must start the stream ASAP.
|
||||||
|
#define SRS_AUTO_INGESTER_SLEEP_US (int64_t)(3*1000*1000LL)
|
||||||
|
|
||||||
|
SrsIngesterFFMPEG::SrsIngesterFFMPEG()
|
||||||
|
{
|
||||||
|
ffmpeg = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
SrsIngesterFFMPEG::~SrsIngesterFFMPEG()
|
||||||
|
{
|
||||||
|
srs_freep(ffmpeg);
|
||||||
|
}
|
||||||
|
|
||||||
|
int SrsIngesterFFMPEG::initialize(SrsFFMPEG* ff, string v, string i)
|
||||||
|
{
|
||||||
|
int ret = ERROR_SUCCESS;
|
||||||
|
|
||||||
|
ffmpeg = ff;
|
||||||
|
vhost = v;
|
||||||
|
id = i;
|
||||||
|
starttime = srs_get_system_time_ms();
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
string SrsIngesterFFMPEG::uri()
|
||||||
|
{
|
||||||
|
return vhost + "/" + id;
|
||||||
|
}
|
||||||
|
|
||||||
|
int SrsIngesterFFMPEG::alive()
|
||||||
|
{
|
||||||
|
return (int)(srs_get_system_time_ms() - starttime);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SrsIngesterFFMPEG::equals(string v)
|
||||||
|
{
|
||||||
|
return vhost == v;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SrsIngesterFFMPEG::equals(string v, string i)
|
||||||
|
{
|
||||||
|
return vhost == v && id == i;
|
||||||
|
}
|
||||||
|
|
||||||
|
int SrsIngesterFFMPEG::start()
|
||||||
|
{
|
||||||
|
return ffmpeg->start();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SrsIngesterFFMPEG::stop()
|
||||||
|
{
|
||||||
|
ffmpeg->stop();
|
||||||
|
}
|
||||||
|
|
||||||
|
int SrsIngesterFFMPEG::cycle()
|
||||||
|
{
|
||||||
|
return ffmpeg->cycle();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SrsIngesterFFMPEG::fast_stop()
|
||||||
|
{
|
||||||
|
ffmpeg->fast_stop();
|
||||||
|
}
|
||||||
|
|
||||||
|
SrsIngester::SrsIngester()
|
||||||
|
{
|
||||||
|
_srs_config->subscribe(this);
|
||||||
|
|
||||||
|
pthread = new SrsReusableThread("ingest", this, SRS_AUTO_INGESTER_SLEEP_US);
|
||||||
|
pprint = SrsPithyPrint::create_ingester();
|
||||||
|
}
|
||||||
|
|
||||||
|
SrsIngester::~SrsIngester()
|
||||||
|
{
|
||||||
|
_srs_config->unsubscribe(this);
|
||||||
|
|
||||||
|
srs_freep(pthread);
|
||||||
|
clear_engines();
|
||||||
|
}
|
||||||
|
|
||||||
|
int SrsIngester::start()
|
||||||
|
{
|
||||||
|
int ret = ERROR_SUCCESS;
|
||||||
|
|
||||||
|
if ((ret = parse()) != ERROR_SUCCESS) {
|
||||||
|
clear_engines();
|
||||||
|
ret = ERROR_SUCCESS;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
// even no ingesters, we must also start it,
|
||||||
|
// for the reload may add more ingesters.
|
||||||
|
|
||||||
|
// start thread to run all encoding engines.
|
||||||
|
if ((ret = pthread->start()) != ERROR_SUCCESS) {
|
||||||
|
srs_error("st_thread_create failed. ret=%d", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
srs_trace("ingest thread cid=%d, current_cid=%d", pthread->cid(), _srs_context->get_id());
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int SrsIngester::parse_ingesters(SrsConfDirective* vhost)
|
||||||
|
{
|
||||||
|
int ret = ERROR_SUCCESS;
|
||||||
|
|
||||||
|
std::vector<SrsConfDirective*> ingesters = _srs_config->get_ingesters(vhost->arg0());
|
||||||
|
|
||||||
|
// create engine
|
||||||
|
for (int i = 0; i < (int)ingesters.size(); i++) {
|
||||||
|
SrsConfDirective* ingest = ingesters[i];
|
||||||
|
if ((ret = parse_engines(vhost, ingest)) != ERROR_SUCCESS) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int SrsIngester::parse_engines(SrsConfDirective* vhost, SrsConfDirective* ingest)
|
||||||
|
{
|
||||||
|
int ret = ERROR_SUCCESS;
|
||||||
|
|
||||||
|
if (!_srs_config->get_ingest_enabled(ingest)) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string ffmpeg_bin = _srs_config->get_ingest_ffmpeg(ingest);
|
||||||
|
if (ffmpeg_bin.empty()) {
|
||||||
|
ret = ERROR_ENCODER_PARSE;
|
||||||
|
srs_trace("empty ffmpeg ret=%d", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
// get all engines.
|
||||||
|
std::vector<SrsConfDirective*> engines = _srs_config->get_transcode_engines(ingest);
|
||||||
|
|
||||||
|
// create ingesters without engines.
|
||||||
|
if (engines.empty()) {
|
||||||
|
SrsFFMPEG* ffmpeg = new SrsFFMPEG(ffmpeg_bin);
|
||||||
|
if ((ret = initialize_ffmpeg(ffmpeg, vhost, ingest, NULL)) != ERROR_SUCCESS) {
|
||||||
|
srs_freep(ffmpeg);
|
||||||
|
if (ret != ERROR_ENCODER_LOOP) {
|
||||||
|
srs_error("invalid ingest engine. ret=%d", ret);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
SrsIngesterFFMPEG* ingester = new SrsIngesterFFMPEG();
|
||||||
|
if ((ret = ingester->initialize(ffmpeg, vhost->arg0(), ingest->arg0())) != ERROR_SUCCESS) {
|
||||||
|
srs_freep(ingester);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
ingesters.push_back(ingester);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
// create ingesters with engine
|
||||||
|
for (int i = 0; i < (int)engines.size(); i++) {
|
||||||
|
SrsConfDirective* engine = engines[i];
|
||||||
|
SrsFFMPEG* ffmpeg = new SrsFFMPEG(ffmpeg_bin);
|
||||||
|
if ((ret = initialize_ffmpeg(ffmpeg, vhost, ingest, engine)) != ERROR_SUCCESS) {
|
||||||
|
srs_freep(ffmpeg);
|
||||||
|
if (ret != ERROR_ENCODER_LOOP) {
|
||||||
|
srs_error("invalid ingest engine: %s %s, ret=%d",
|
||||||
|
ingest->arg0().c_str(), engine->arg0().c_str(), ret);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
SrsIngesterFFMPEG* ingester = new SrsIngesterFFMPEG();
|
||||||
|
if ((ret = ingester->initialize(ffmpeg, vhost->arg0(), ingest->arg0())) != ERROR_SUCCESS) {
|
||||||
|
srs_freep(ingester);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
ingesters.push_back(ingester);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SrsIngester::dispose()
|
||||||
|
{
|
||||||
|
// first, use fast stop to notice all FFMPEG to quit gracefully.
|
||||||
|
std::vector<SrsIngesterFFMPEG*>::iterator it;
|
||||||
|
for (it = ingesters.begin(); it != ingesters.end(); ++it) {
|
||||||
|
SrsIngesterFFMPEG* ingester = *it;
|
||||||
|
ingester->fast_stop();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ingesters.empty()) {
|
||||||
|
srs_trace("fast stop all ingesters ok.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// then, use stop to wait FFMPEG quit one by one and send SIGKILL if needed.
|
||||||
|
stop();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SrsIngester::stop()
|
||||||
|
{
|
||||||
|
pthread->stop();
|
||||||
|
clear_engines();
|
||||||
|
}
|
||||||
|
|
||||||
|
int SrsIngester::cycle()
|
||||||
|
{
|
||||||
|
int ret = ERROR_SUCCESS;
|
||||||
|
|
||||||
|
std::vector<SrsIngesterFFMPEG*>::iterator it;
|
||||||
|
for (it = ingesters.begin(); it != ingesters.end(); ++it) {
|
||||||
|
SrsIngesterFFMPEG* ingester = *it;
|
||||||
|
|
||||||
|
// start all ffmpegs.
|
||||||
|
if ((ret = ingester->start()) != ERROR_SUCCESS) {
|
||||||
|
srs_error("ingest ffmpeg start failed. ret=%d", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
// check ffmpeg status.
|
||||||
|
if ((ret = ingester->cycle()) != ERROR_SUCCESS) {
|
||||||
|
srs_error("ingest ffmpeg cycle failed. ret=%d", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// pithy print
|
||||||
|
show_ingest_log_message();
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SrsIngester::on_thread_stop()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void SrsIngester::clear_engines()
|
||||||
|
{
|
||||||
|
std::vector<SrsIngesterFFMPEG*>::iterator it;
|
||||||
|
|
||||||
|
for (it = ingesters.begin(); it != ingesters.end(); ++it) {
|
||||||
|
SrsIngesterFFMPEG* ingester = *it;
|
||||||
|
srs_freep(ingester);
|
||||||
|
}
|
||||||
|
|
||||||
|
ingesters.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
int SrsIngester::parse()
|
||||||
|
{
|
||||||
|
int ret = ERROR_SUCCESS;
|
||||||
|
|
||||||
|
// parse ingesters
|
||||||
|
std::vector<SrsConfDirective*> vhosts;
|
||||||
|
_srs_config->get_vhosts(vhosts);
|
||||||
|
|
||||||
|
for (int i = 0; i < (int)vhosts.size(); i++) {
|
||||||
|
SrsConfDirective* vhost = vhosts[i];
|
||||||
|
if ((ret = parse_ingesters(vhost)) != ERROR_SUCCESS) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int SrsIngester::initialize_ffmpeg(SrsFFMPEG* ffmpeg, SrsConfDirective* vhost, SrsConfDirective* ingest, SrsConfDirective* engine)
|
||||||
|
{
|
||||||
|
int ret = ERROR_SUCCESS;
|
||||||
|
|
||||||
|
std::string port;
|
||||||
|
if (true) {
|
||||||
|
std::vector<std::string> ip_ports = _srs_config->get_listens();
|
||||||
|
srs_assert(ip_ports.size() > 0);
|
||||||
|
|
||||||
|
std::string ep = ip_ports[0];
|
||||||
|
std::string ip;
|
||||||
|
srs_parse_endpoint(ep, ip, port);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string output = _srs_config->get_engine_output(engine);
|
||||||
|
// output stream, to other/self server
|
||||||
|
// ie. rtmp://localhost:1935/live/livestream_sd
|
||||||
|
output = srs_string_replace(output, "[vhost]", vhost->arg0());
|
||||||
|
output = srs_string_replace(output, "[port]", port);
|
||||||
|
if (output.empty()) {
|
||||||
|
ret = ERROR_ENCODER_NO_OUTPUT;
|
||||||
|
srs_trace("empty output url, ingest=%s. ret=%d", ingest->arg0().c_str(), ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
// find the app and stream in rtmp url
|
||||||
|
std::string url = output;
|
||||||
|
std::string app, stream;
|
||||||
|
size_t pos = std::string::npos;
|
||||||
|
if ((pos = url.rfind("/")) != std::string::npos) {
|
||||||
|
stream = url.substr(pos + 1);
|
||||||
|
url = url.substr(0, pos);
|
||||||
|
}
|
||||||
|
if ((pos = url.rfind("/")) != std::string::npos) {
|
||||||
|
app = url.substr(pos + 1);
|
||||||
|
url = url.substr(0, pos);
|
||||||
|
}
|
||||||
|
if ((pos = app.rfind("?")) != std::string::npos) {
|
||||||
|
app = app.substr(0, pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string log_file = SRS_CONSTS_NULL_FILE; // disabled
|
||||||
|
// write ffmpeg info to log file.
|
||||||
|
if (_srs_config->get_ffmpeg_log_enabled()) {
|
||||||
|
log_file = _srs_config->get_ffmpeg_log_dir();
|
||||||
|
log_file += "/";
|
||||||
|
log_file += "ffmpeg-ingest";
|
||||||
|
log_file += "-";
|
||||||
|
log_file += vhost->arg0();
|
||||||
|
log_file += "-";
|
||||||
|
log_file += app;
|
||||||
|
log_file += "-";
|
||||||
|
log_file += stream;
|
||||||
|
log_file += ".log";
|
||||||
|
}
|
||||||
|
|
||||||
|
// input
|
||||||
|
std::string input_type = _srs_config->get_ingest_input_type(ingest);
|
||||||
|
if (input_type.empty()) {
|
||||||
|
ret = ERROR_ENCODER_NO_INPUT;
|
||||||
|
srs_trace("empty intput type, ingest=%s. ret=%d", ingest->arg0().c_str(), ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (srs_config_ingest_is_file(input_type)) {
|
||||||
|
std::string input_url = _srs_config->get_ingest_input_url(ingest);
|
||||||
|
if (input_url.empty()) {
|
||||||
|
ret = ERROR_ENCODER_NO_INPUT;
|
||||||
|
srs_trace("empty intput url, ingest=%s. ret=%d", ingest->arg0().c_str(), ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
// for file, set re.
|
||||||
|
ffmpeg->set_iparams("-re");
|
||||||
|
|
||||||
|
if ((ret = ffmpeg->initialize(input_url, output, log_file)) != ERROR_SUCCESS) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
} else if (srs_config_ingest_is_stream(input_type)) {
|
||||||
|
std::string input_url = _srs_config->get_ingest_input_url(ingest);
|
||||||
|
if (input_url.empty()) {
|
||||||
|
ret = ERROR_ENCODER_NO_INPUT;
|
||||||
|
srs_trace("empty intput url, ingest=%s. ret=%d", ingest->arg0().c_str(), ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
// for stream, no re.
|
||||||
|
ffmpeg->set_iparams("");
|
||||||
|
|
||||||
|
if ((ret = ffmpeg->initialize(input_url, output, log_file)) != ERROR_SUCCESS) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ret = ERROR_ENCODER_INPUT_TYPE;
|
||||||
|
srs_error("invalid ingest=%s type=%s, ret=%d",
|
||||||
|
ingest->arg0().c_str(), input_type.c_str(), ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
// set output format to flv for RTMP
|
||||||
|
ffmpeg->set_oformat("flv");
|
||||||
|
|
||||||
|
std::string vcodec = _srs_config->get_engine_vcodec(engine);
|
||||||
|
std::string acodec = _srs_config->get_engine_acodec(engine);
|
||||||
|
// whatever the engine config, use copy as default.
|
||||||
|
bool engine_disabled = !engine || !_srs_config->get_engine_enabled(engine);
|
||||||
|
if (engine_disabled || vcodec.empty() || acodec.empty()) {
|
||||||
|
if ((ret = ffmpeg->initialize_copy()) != ERROR_SUCCESS) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if ((ret = ffmpeg->initialize_transcode(engine)) != ERROR_SUCCESS) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
srs_trace("parse success, ingest=%s, vhost=%s",
|
||||||
|
ingest->arg0().c_str(), vhost->arg0().c_str());
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SrsIngester::show_ingest_log_message()
|
||||||
|
{
|
||||||
|
pprint->elapse();
|
||||||
|
|
||||||
|
if ((int)ingesters.size() <= 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// random choose one ingester to report.
|
||||||
|
int index = rand() % (int)ingesters.size();
|
||||||
|
SrsIngesterFFMPEG* ingester = ingesters.at(index);
|
||||||
|
|
||||||
|
// reportable
|
||||||
|
if (pprint->can_print()) {
|
||||||
|
srs_trace("-> "SRS_CONSTS_LOG_INGESTER" time=%"PRId64", ingesters=%d, #%d(alive=%ds, %s)",
|
||||||
|
pprint->age(), (int)ingesters.size(), index, ingester->alive() / 1000, ingester->uri().c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int SrsIngester::on_reload_vhost_added(string vhost)
|
||||||
|
{
|
||||||
|
int ret = ERROR_SUCCESS;
|
||||||
|
|
||||||
|
SrsConfDirective* _vhost = _srs_config->get_vhost(vhost);
|
||||||
|
if ((ret = parse_ingesters(_vhost)) != ERROR_SUCCESS) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
srs_trace("reload add vhost ingesters, vhost=%s", vhost.c_str());
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int SrsIngester::on_reload_vhost_removed(string vhost)
|
||||||
|
{
|
||||||
|
int ret = ERROR_SUCCESS;
|
||||||
|
|
||||||
|
std::vector<SrsIngesterFFMPEG*>::iterator it;
|
||||||
|
|
||||||
|
for (it = ingesters.begin(); it != ingesters.end();) {
|
||||||
|
SrsIngesterFFMPEG* ingester = *it;
|
||||||
|
|
||||||
|
if (!ingester->equals(vhost)) {
|
||||||
|
++it;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// stop the ffmpeg and free it.
|
||||||
|
ingester->stop();
|
||||||
|
|
||||||
|
srs_trace("reload stop ingester, vhost=%s, id=%s", vhost.c_str(), ingester->uri().c_str());
|
||||||
|
|
||||||
|
srs_freep(ingester);
|
||||||
|
|
||||||
|
// remove the item from ingesters.
|
||||||
|
it = ingesters.erase(it);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int SrsIngester::on_reload_ingest_removed(string vhost, string ingest_id)
|
||||||
|
{
|
||||||
|
int ret = ERROR_SUCCESS;
|
||||||
|
|
||||||
|
std::vector<SrsIngesterFFMPEG*>::iterator it;
|
||||||
|
|
||||||
|
for (it = ingesters.begin(); it != ingesters.end();) {
|
||||||
|
SrsIngesterFFMPEG* ingester = *it;
|
||||||
|
|
||||||
|
if (!ingester->equals(vhost, ingest_id)) {
|
||||||
|
++it;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// stop the ffmpeg and free it.
|
||||||
|
ingester->stop();
|
||||||
|
|
||||||
|
srs_trace("reload stop ingester, vhost=%s, id=%s", vhost.c_str(), ingester->uri().c_str());
|
||||||
|
|
||||||
|
srs_freep(ingester);
|
||||||
|
|
||||||
|
// remove the item from ingesters.
|
||||||
|
it = ingesters.erase(it);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int SrsIngester::on_reload_ingest_added(string vhost, string ingest_id)
|
||||||
|
{
|
||||||
|
int ret = ERROR_SUCCESS;
|
||||||
|
|
||||||
|
SrsConfDirective* _vhost = _srs_config->get_vhost(vhost);
|
||||||
|
SrsConfDirective* _ingester = _srs_config->get_ingest_by_id(vhost, ingest_id);
|
||||||
|
|
||||||
|
if ((ret = parse_engines(_vhost, _ingester)) != ERROR_SUCCESS) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
srs_trace("reload add ingester, "
|
||||||
|
"vhost=%s, id=%s", vhost.c_str(), ingest_id.c_str());
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int SrsIngester::on_reload_ingest_updated(string vhost, string ingest_id)
|
||||||
|
{
|
||||||
|
int ret = ERROR_SUCCESS;
|
||||||
|
|
||||||
|
if ((ret = on_reload_ingest_removed(vhost, ingest_id)) != ERROR_SUCCESS) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((ret = on_reload_ingest_added(vhost, ingest_id)) != ERROR_SUCCESS) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
srs_trace("reload updated ingester, "
|
||||||
|
"vhost=%s, id=%s", vhost.c_str(), ingest_id.c_str());
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
60
samples/C/Arduino.cats
Normal file
60
samples/C/Arduino.cats
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
/** The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2014 Hongwei Xi
|
||||||
|
|
||||||
|
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.*/
|
||||||
|
|
||||||
|
// Source: https://github.com/githwxi/ATS-Postiats-contrib/blob/master/contrib/arduino/CATS/Arduino.cats
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
** The prelude for Ardunio
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* ****** ****** */
|
||||||
|
|
||||||
|
#ifndef ARDUINO_CATS_ARDUINO
|
||||||
|
#define ARDUINO_CATS_ARDUINO
|
||||||
|
|
||||||
|
/* ****** ****** */
|
||||||
|
|
||||||
|
#include <Arduino.h>
|
||||||
|
|
||||||
|
/* ****** ****** */
|
||||||
|
|
||||||
|
#define delay_int(ms) delay(ms)
|
||||||
|
#define delay_ulint(ms) delay(ms)
|
||||||
|
|
||||||
|
/* ****** ****** */
|
||||||
|
//
|
||||||
|
#define random_int_1(x) random(x)
|
||||||
|
#define random_int_2(x, y) random(x, y)
|
||||||
|
#define random_lint_1(x) random(x)
|
||||||
|
#define random_lint_2(x, y) random(x, y)
|
||||||
|
//
|
||||||
|
#define randomSeed_int(x) randomSeed(x)
|
||||||
|
#define randomSeed_uint(x) randomSeed(x)
|
||||||
|
//
|
||||||
|
/* ****** ****** */
|
||||||
|
|
||||||
|
#endif // #ifndef(ARDUINO_CATS_ARDUINO)
|
||||||
|
|
||||||
|
/* ****** ****** */
|
||||||
|
|
||||||
|
/* end of [Arduino.cats] */
|
||||||
45
samples/C/array.c
Normal file
45
samples/C/array.c
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
#include <array.h>
|
||||||
|
|
||||||
|
unsigned __bump_up(unsigned n) {
|
||||||
|
unsigned base = 1;
|
||||||
|
--n;
|
||||||
|
while (base < sizeof n * 8) {
|
||||||
|
n |= n >> base;
|
||||||
|
base *= 2;
|
||||||
|
}
|
||||||
|
++n;
|
||||||
|
n += (n == 0);
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *__array_alloc(size_t size, unsigned length) {
|
||||||
|
unsigned allocated = __bump_up(length);
|
||||||
|
struct __array_header *head = malloc(sizeof *head + allocated * size);
|
||||||
|
assert(head);
|
||||||
|
head->length = length;
|
||||||
|
head->allocated = allocated;
|
||||||
|
return (void *) (head + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void __array_resize(void **array, size_t size, int difference) {
|
||||||
|
if (difference == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
struct __array_header *head = __header(*array);
|
||||||
|
head->length += difference;
|
||||||
|
if (head->length >= head->allocated) {
|
||||||
|
head->allocated = __bump_up(head->length);
|
||||||
|
head = realloc(head, sizeof *head + head->allocated * size);
|
||||||
|
assert(head);
|
||||||
|
*array = head + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int __array_search(void *array, void *elem, size_t size) {
|
||||||
|
for (unsigned i = 0; i < alength(array) * size; i += size) {
|
||||||
|
if (memcmp((char *)array + i, elem, size) == 0) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
58
samples/C/array.h
Normal file
58
samples/C/array.h
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
#ifndef ARRAY_H
|
||||||
|
#define ARRAY_H value
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#define array(type, name, initial_length) \
|
||||||
|
type *name = __array_alloc(sizeof(type), initial_length)
|
||||||
|
|
||||||
|
#define aforeach(it, array) \
|
||||||
|
for (unsigned it = 0; \
|
||||||
|
it < alength(array); \
|
||||||
|
++it)
|
||||||
|
|
||||||
|
#define __header(array) \
|
||||||
|
((struct __array_header *) array - 1)
|
||||||
|
|
||||||
|
#define alength(array) \
|
||||||
|
(__header(array)->length)
|
||||||
|
|
||||||
|
#define afree(array) \
|
||||||
|
free(__header(array))
|
||||||
|
|
||||||
|
#define apush(array, elem) \
|
||||||
|
__array_resize((void **) &array, sizeof *array, 1); \
|
||||||
|
array[alength(array)-1] = elem
|
||||||
|
|
||||||
|
#define apop(array) \
|
||||||
|
aremove(array, (alength(array) - 1))
|
||||||
|
|
||||||
|
#define aremove(array, index) \
|
||||||
|
assert(alength(array) > index); \
|
||||||
|
memmove(array + index, array + index + 1, sizeof *array * (alength(array) - index - 1)); \
|
||||||
|
__array_resize((void **) &array, sizeof *array, -1)
|
||||||
|
|
||||||
|
#define ainsert(array, index, elem) \
|
||||||
|
__array_resize((void **) &array, sizeof *array, index >= alength(array) ? index - alength(array) + 1 : 1); \
|
||||||
|
memmove(array + index + 1, array + index, sizeof *array * (alength(array) - index - 1)); \
|
||||||
|
array[index] = elem
|
||||||
|
|
||||||
|
#define acontains(array, elem) \
|
||||||
|
__array_search(array, &elem, sizeof elem)
|
||||||
|
|
||||||
|
#define __arrayallocated(array) \
|
||||||
|
(__header(array)->allocated)
|
||||||
|
|
||||||
|
struct __array_header {
|
||||||
|
unsigned length;
|
||||||
|
unsigned allocated;
|
||||||
|
};
|
||||||
|
|
||||||
|
unsigned __bump_up(unsigned n);
|
||||||
|
void *__array_alloc(size_t size, unsigned length);
|
||||||
|
void __array_resize(void **array, size_t size, int difference);
|
||||||
|
int __array_search(void *array, void *elem, size_t size);
|
||||||
|
|
||||||
|
#endif /* ifndef ARRAY_H */
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user