mirror of
https://github.com/KevinMidboe/linguist.git
synced 2025-10-29 17:50:22 +00:00
Compare commits
1855 Commits
v4.4.0
...
revert-384
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0698b0f36e | ||
|
|
0f4955e5d5 | ||
|
|
d968b0e9ee | ||
|
|
1f5ed3b3fe | ||
|
|
297be948d1 | ||
|
|
b4492e7205 | ||
|
|
c05bc99004 | ||
|
|
99eaf5faf9 | ||
|
|
21babbceb1 | ||
|
|
15885701cd | ||
|
|
9b942086f7 | ||
|
|
93cd47822f | ||
|
|
ea3e79a631 | ||
|
|
0af9a35ff1 | ||
|
|
44048c9ba8 | ||
|
|
e51b5ec9b7 | ||
|
|
a47008ea00 | ||
|
|
a0b38e8207 | ||
|
|
10dfe9f296 | ||
|
|
0b9c05f989 | ||
|
|
95dca67e2b | ||
|
|
e98728595b | ||
|
|
4cd558c374 | ||
|
|
adf6206ef5 | ||
|
|
c2d558b71d | ||
|
|
78c58f956e | ||
|
|
fc1404985a | ||
|
|
5d48ccd757 | ||
|
|
3530a18e46 | ||
|
|
ae8f4f9228 | ||
|
|
7c34d38786 | ||
|
|
38bc5fd336 | ||
|
|
6b06e47c67 | ||
|
|
061712ff78 | ||
|
|
7707585d5e | ||
|
|
fa7d433886 | ||
|
|
998e24cf36 | ||
|
|
63ff51e2ed | ||
|
|
b541b53b78 | ||
|
|
a878620a8e | ||
|
|
5633fd3668 | ||
|
|
9d0af0da40 | ||
|
|
edabdc75a5 | ||
|
|
6db7736860 | ||
|
|
dd3d8586c5 | ||
|
|
f1daf6192c | ||
|
|
2c41df376f | ||
|
|
3391dcce6a | ||
|
|
f75c5707a6 | ||
|
|
25de4e0ae2 | ||
|
|
7451424f12 | ||
|
|
b94e018c3a | ||
|
|
4dcf223c8e | ||
|
|
329f80d245 | ||
|
|
085604948e | ||
|
|
e60384b018 | ||
|
|
470a82d9f5 | ||
|
|
37979b26b0 | ||
|
|
1a6df12902 | ||
|
|
24e196df4e | ||
|
|
8d178bfaed | ||
|
|
e9ec699931 | ||
|
|
9a6c3f2c4d | ||
|
|
648720301d | ||
|
|
c552e25bd7 | ||
|
|
d5c8db3fb9 | ||
|
|
632bcdc1ad | ||
|
|
6b221172c0 | ||
|
|
6f0d801375 | ||
|
|
128abe3533 | ||
|
|
9312353d20 | ||
|
|
b6460f8ed6 | ||
|
|
60f864a138 | ||
|
|
ca6121e3ea | ||
|
|
7c17b1f10c | ||
|
|
d490fc303f | ||
|
|
20fdac95f6 | ||
|
|
234ee8b6d2 | ||
|
|
58ab593a64 | ||
|
|
ec1f6a4cd6 | ||
|
|
3eea8212f4 | ||
|
|
a1e09ae3e6 | ||
|
|
c1f76c26e5 | ||
|
|
0983f62e02 | ||
|
|
190e54c020 | ||
|
|
ded651159d | ||
|
|
acbab53198 | ||
|
|
fba4babdcd | ||
|
|
eb6a213921 | ||
|
|
5e2c79e950 | ||
|
|
e93f41f097 | ||
|
|
994bc1f135 | ||
|
|
44f03e64c1 | ||
|
|
4166f2e89d | ||
|
|
1a8f19c6f2 | ||
|
|
c0e242358a | ||
|
|
eb38c8dcf8 | ||
|
|
f146b4afbd | ||
|
|
db15d0f5d2 | ||
|
|
e6d57c771d | ||
|
|
eef0335c5f | ||
|
|
461c27c066 | ||
|
|
59d67d6743 | ||
|
|
7aeeb82d3d | ||
|
|
c98ca20076 | ||
|
|
4e0b5f02aa | ||
|
|
8da7cb805e | ||
|
|
e5e81a8560 | ||
|
|
dd53fa1585 | ||
|
|
354a8f079a | ||
|
|
f38d6bd124 | ||
|
|
e80b92e407 | ||
|
|
fa6ae1116f | ||
|
|
b7e27a9f58 | ||
|
|
69ba4c5586 | ||
|
|
c39d7fd6e8 | ||
|
|
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 | ||
|
|
651d863069 | ||
|
|
a3c595a4a9 | ||
|
|
7660714a9e | ||
|
|
71002dfb65 | ||
|
|
013cfdcdaf | ||
|
|
7cdb5ccba8 | ||
|
|
dc852b6398 | ||
|
|
5e9bb67d10 | ||
|
|
e969172543 | ||
|
|
f570260dfe | ||
|
|
7ecf65551e | ||
|
|
fb6ec8aaa7 | ||
|
|
41e1b7bd4e | ||
|
|
3e54d6651c | ||
|
|
96c2f86613 | ||
|
|
eaa03e15ed | ||
|
|
9fa7adaa61 | ||
|
|
54a2f5347a | ||
|
|
a716d3ad49 | ||
|
|
aa8eb955e9 | ||
|
|
8e52c18200 | ||
|
|
e468723abc | ||
|
|
99bfde32a8 | ||
|
|
c6e8915627 | ||
|
|
496b3e5a78 | ||
|
|
01be9e68ee | ||
|
|
56c3b8c3fe | ||
|
|
23e55e92ca | ||
|
|
0cfdbfb91c | ||
|
|
f18ae4f99f | ||
|
|
5217f19faa | ||
|
|
296d170ba9 | ||
|
|
a97fd74399 | ||
|
|
43ee45d9b6 | ||
|
|
02db72515f | ||
|
|
af9b5f0e98 | ||
|
|
a145bd92f7 | ||
|
|
20204cd9fc | ||
|
|
3445e55744 | ||
|
|
036b9c4094 | ||
|
|
ce928d8b64 | ||
|
|
edadca9085 | ||
|
|
08290ac49e | ||
|
|
42944660bd | ||
|
|
ae5e1c5a85 | ||
|
|
f4f5ccb3f5 | ||
|
|
ab3f44cb6e | ||
|
|
d7757033ab | ||
|
|
8bb9241e6e | ||
|
|
2c5e8c4308 | ||
|
|
506b75c5e8 | ||
|
|
af4b64070f | ||
|
|
29d8e58d69 |
2
.gitignore
vendored
2
.gitignore
vendored
@@ -1,5 +1,7 @@
|
||||
*.gem
|
||||
/Gemfile.lock
|
||||
.bundle/
|
||||
.idea
|
||||
benchmark/
|
||||
lib/linguist/samples.json
|
||||
/grammars
|
||||
|
||||
574
.gitmodules
vendored
574
.gitmodules
vendored
@@ -7,15 +7,12 @@
|
||||
[submodule "vendor/grammars/sublime-cirru"]
|
||||
path = vendor/grammars/sublime-cirru
|
||||
url = https://github.com/Cirru/sublime-cirru
|
||||
[submodule "vendor/grammars/Sublime-Logos"]
|
||||
path = vendor/grammars/Sublime-Logos
|
||||
url = https://github.com/Cykey/Sublime-Logos
|
||||
[submodule "vendor/grammars/SublimeBrainfuck"]
|
||||
path = vendor/grammars/SublimeBrainfuck
|
||||
url = https://github.com/Drako/SublimeBrainfuck
|
||||
[submodule "vendor/grammars/awk-sublime"]
|
||||
path = vendor/grammars/awk-sublime
|
||||
url = https://github.com/JohnNilsson/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
|
||||
@@ -25,24 +22,15 @@
|
||||
[submodule "vendor/grammars/Sublime-REBOL"]
|
||||
path = vendor/grammars/Sublime-REBOL
|
||||
url = https://github.com/Oldes/Sublime-REBOL
|
||||
[submodule "vendor/grammars/Sublime-Inform"]
|
||||
path = vendor/grammars/Sublime-Inform
|
||||
url = https://github.com/PogiNate/Sublime-Inform
|
||||
[submodule "vendor/grammars/autoitv3-tmbundle"]
|
||||
path = vendor/grammars/autoitv3-tmbundle
|
||||
url = https://github.com/Red-Nova-Technologies/autoitv3-tmbundle
|
||||
[submodule "vendor/grammars/Sublime-VimL"]
|
||||
path = vendor/grammars/Sublime-VimL
|
||||
url = https://github.com/SalGnt/Sublime-VimL
|
||||
[submodule "vendor/grammars/boo-sublime"]
|
||||
path = vendor/grammars/boo-sublime
|
||||
url = https://github.com/Shammah/boo-sublime
|
||||
[submodule "vendor/grammars/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/SublimeText/NSIS
|
||||
url = https://github.com/github-linguist/NSIS
|
||||
[submodule "vendor/grammars/NimLime"]
|
||||
path = vendor/grammars/NimLime
|
||||
url = https://github.com/Varriount/NimLime
|
||||
@@ -79,48 +67,36 @@
|
||||
[submodule "vendor/grammars/language-javascript"]
|
||||
path = vendor/grammars/language-javascript
|
||||
url = https://github.com/atom/language-javascript
|
||||
[submodule "vendor/grammars/language-python"]
|
||||
path = vendor/grammars/language-python
|
||||
url = https://github.com/atom/language-python
|
||||
[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-sourcepawn"]
|
||||
path = vendor/grammars/sublime-sourcepawn
|
||||
url = https://github.com/austinwagner/sublime-sourcepawn
|
||||
[submodule "vendor/grammars/Sublime-Lasso"]
|
||||
path = vendor/grammars/Sublime-Lasso
|
||||
url = https://github.com/bfad/Sublime-Lasso
|
||||
[submodule "vendor/grammars/chapel-tmbundle"]
|
||||
path = vendor/grammars/chapel-tmbundle
|
||||
url = https://github.com/bholt/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_man_page_support"]
|
||||
path = vendor/grammars/sublime_man_page_support
|
||||
url = https://github.com/carsonoid/sublime_man_page_support
|
||||
[submodule "vendor/grammars/sublime-MuPAD"]
|
||||
path = vendor/grammars/sublime-MuPAD
|
||||
url = https://github.com/ccreutzig/sublime-MuPAD
|
||||
[submodule "vendor/grammars/nesC.tmbundle"]
|
||||
path = vendor/grammars/nesC.tmbundle
|
||||
url = https://github.com/cdwilson/nesC.tmbundle
|
||||
[submodule "vendor/grammars/haxe-sublime-bundle"]
|
||||
path = vendor/grammars/haxe-sublime-bundle
|
||||
url = https://github.com/clemos/haxe-sublime-bundle
|
||||
[submodule "vendor/grammars/cucumber-tmbundle"]
|
||||
path = vendor/grammars/cucumber-tmbundle
|
||||
url = https://github.com/cucumber/cucumber-tmbundle
|
||||
[submodule "vendor/grammars/Handlebars"]
|
||||
path = vendor/grammars/Handlebars
|
||||
url = https://github.com/daaain/Handlebars
|
||||
[submodule "vendor/grammars/powershell"]
|
||||
path = vendor/grammars/powershell
|
||||
url = https://github.com/SublimeText/PowerShell
|
||||
@@ -136,15 +112,6 @@
|
||||
[submodule "vendor/grammars/fancy-tmbundle"]
|
||||
path = vendor/grammars/fancy-tmbundle
|
||||
url = https://github.com/fancy-lang/fancy-tmbundle
|
||||
[submodule "vendor/grammars/fsharpbinding"]
|
||||
path = vendor/grammars/fsharpbinding
|
||||
url = https://github.com/fsharp/fsharpbinding
|
||||
[submodule "vendor/grammars/monkey.tmbundle"]
|
||||
path = vendor/grammars/monkey.tmbundle
|
||||
url = https://github.com/gingerbeardman/monkey.tmbundle
|
||||
[submodule "vendor/grammars/dart-sublime-bundle"]
|
||||
path = vendor/grammars/dart-sublime-bundle
|
||||
url = https://github.com/guillermooo/dart-sublime-bundle
|
||||
[submodule "vendor/grammars/sublimetext-cuda-cpp"]
|
||||
path = vendor/grammars/sublimetext-cuda-cpp
|
||||
url = https://github.com/harrism/sublimetext-cuda-cpp
|
||||
@@ -157,9 +124,6 @@
|
||||
[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-rust"]
|
||||
path = vendor/grammars/sublime-rust
|
||||
url = https://github.com/jhasse/sublime-rust
|
||||
[submodule "vendor/grammars/sublime-befunge"]
|
||||
path = vendor/grammars/sublime-befunge
|
||||
url = https://github.com/johanasplund/sublime-befunge
|
||||
@@ -169,27 +133,15 @@
|
||||
[submodule "vendor/grammars/Textmate-Gosu-Bundle"]
|
||||
path = vendor/grammars/Textmate-Gosu-Bundle
|
||||
url = https://github.com/jpcamara/Textmate-Gosu-Bundle
|
||||
[submodule "vendor/grammars/jquery-tmbundle"]
|
||||
path = vendor/grammars/jquery-tmbundle
|
||||
url = https://github.com/kswedberg/jquery-tmbundle
|
||||
[submodule "vendor/grammars/fish-tmbundle"]
|
||||
path = vendor/grammars/fish-tmbundle
|
||||
url = https://github.com/l15n/fish-tmbundle
|
||||
[submodule "vendor/grammars/sublime-idris"]
|
||||
path = vendor/grammars/sublime-idris
|
||||
url = https://github.com/laughedelic/sublime-idris
|
||||
[submodule "vendor/grammars/sublime-better-typescript"]
|
||||
path = vendor/grammars/sublime-better-typescript
|
||||
url = https://github.com/lavrton/sublime-better-typescript
|
||||
[submodule "vendor/grammars/moonscript-tmbundle"]
|
||||
path = vendor/grammars/moonscript-tmbundle
|
||||
url = https://github.com/leafo/moonscript-tmbundle
|
||||
[submodule "vendor/grammars/Isabelle.tmbundle"]
|
||||
path = vendor/grammars/Isabelle.tmbundle
|
||||
url = https://github.com/lsf37/Isabelle.tmbundle
|
||||
[submodule "vendor/grammars/x86-assembly-textmate-bundle"]
|
||||
path = vendor/grammars/x86-assembly-textmate-bundle
|
||||
url = https://github.com/lunixbochs/x86-assembly-textmate-bundle
|
||||
[submodule "vendor/grammars/Alloy.tmbundle"]
|
||||
path = vendor/grammars/Alloy.tmbundle
|
||||
url = https://github.com/macekond/Alloy.tmbundle
|
||||
@@ -217,12 +169,6 @@
|
||||
[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/nanoant/Julia.tmbundle
|
||||
[submodule "vendor/grammars/assembly.tmbundle"]
|
||||
path = vendor/grammars/assembly.tmbundle
|
||||
url = https://github.com/nanoant/assembly.tmbundle
|
||||
[submodule "vendor/grammars/ooc.tmbundle"]
|
||||
path = vendor/grammars/ooc.tmbundle
|
||||
url = https://github.com/nilium/ooc.tmbundle
|
||||
@@ -232,9 +178,6 @@
|
||||
[submodule "vendor/grammars/sublime-tea"]
|
||||
path = vendor/grammars/sublime-tea
|
||||
url = https://github.com/pferruggiaro/sublime-tea
|
||||
[submodule "vendor/grammars/puppet-textmate-bundle"]
|
||||
path = vendor/grammars/puppet-textmate-bundle
|
||||
url = https://github.com/puppet-textmate-bundle/puppet-textmate-bundle
|
||||
[submodule "vendor/grammars/abap.tmbundle"]
|
||||
path = vendor/grammars/abap.tmbundle
|
||||
url = https://github.com/pvl/abap.tmbundle
|
||||
@@ -247,9 +190,6 @@
|
||||
[submodule "vendor/grammars/sublime-robot-plugin"]
|
||||
path = vendor/grammars/sublime-robot-plugin
|
||||
url = https://github.com/shellderp/sublime-robot-plugin
|
||||
[submodule "vendor/grammars/actionscript3-tmbundle"]
|
||||
path = vendor/grammars/actionscript3-tmbundle
|
||||
url = https://github.com/honzabrecka/actionscript3-tmbundle
|
||||
[submodule "vendor/grammars/Sublime-QML"]
|
||||
path = vendor/grammars/Sublime-QML
|
||||
url = https://github.com/skozlovf/Sublime-QML
|
||||
@@ -265,9 +205,6 @@
|
||||
[submodule "vendor/grammars/SublimeXtend"]
|
||||
path = vendor/grammars/SublimeXtend
|
||||
url = https://github.com/staltz/SublimeXtend
|
||||
[submodule "vendor/grammars/Stata.tmbundle"]
|
||||
path = vendor/grammars/Stata.tmbundle
|
||||
url = https://github.com/statatmbundle/Stata.tmbundle
|
||||
[submodule "vendor/grammars/Vala-TMBundle"]
|
||||
path = vendor/grammars/Vala-TMBundle
|
||||
url = https://github.com/technosophos/Vala-TMBundle
|
||||
@@ -298,9 +235,6 @@
|
||||
[submodule "vendor/grammars/cpp-qt.tmbundle"]
|
||||
path = vendor/grammars/cpp-qt.tmbundle
|
||||
url = https://github.com/textmate/cpp-qt.tmbundle
|
||||
[submodule "vendor/grammars/css.tmbundle"]
|
||||
path = vendor/grammars/css.tmbundle
|
||||
url = https://github.com/textmate/css.tmbundle
|
||||
[submodule "vendor/grammars/d.tmbundle"]
|
||||
path = vendor/grammars/d.tmbundle
|
||||
url = https://github.com/textmate/d.tmbundle
|
||||
@@ -328,9 +262,6 @@
|
||||
[submodule "vendor/grammars/groovy.tmbundle"]
|
||||
path = vendor/grammars/groovy.tmbundle
|
||||
url = https://github.com/textmate/groovy.tmbundle
|
||||
[submodule "vendor/grammars/haskell.tmbundle"]
|
||||
path = vendor/grammars/haskell.tmbundle
|
||||
url = https://github.com/textmate/haskell.tmbundle
|
||||
[submodule "vendor/grammars/html.tmbundle"]
|
||||
path = vendor/grammars/html.tmbundle
|
||||
url = https://github.com/textmate/html.tmbundle
|
||||
@@ -346,9 +277,6 @@
|
||||
[submodule "vendor/grammars/java.tmbundle"]
|
||||
path = vendor/grammars/java.tmbundle
|
||||
url = https://github.com/textmate/java.tmbundle
|
||||
[submodule "vendor/grammars/javadoc.tmbundle"]
|
||||
path = vendor/grammars/javadoc.tmbundle
|
||||
url = https://github.com/textmate/javadoc.tmbundle
|
||||
[submodule "vendor/grammars/javascript-objective-j.tmbundle"]
|
||||
path = vendor/grammars/javascript-objective-j.tmbundle
|
||||
url = https://github.com/textmate/javascript-objective-j.tmbundle
|
||||
@@ -358,9 +286,6 @@
|
||||
[submodule "vendor/grammars/latex.tmbundle"]
|
||||
path = vendor/grammars/latex.tmbundle
|
||||
url = https://github.com/textmate/latex.tmbundle
|
||||
[submodule "vendor/grammars/less.tmbundle"]
|
||||
path = vendor/grammars/less.tmbundle
|
||||
url = https://github.com/textmate/less.tmbundle
|
||||
[submodule "vendor/grammars/lilypond.tmbundle"]
|
||||
path = vendor/grammars/lilypond.tmbundle
|
||||
url = https://github.com/textmate/lilypond.tmbundle
|
||||
@@ -385,9 +310,6 @@
|
||||
[submodule "vendor/grammars/nemerle.tmbundle"]
|
||||
path = vendor/grammars/nemerle.tmbundle
|
||||
url = https://github.com/textmate/nemerle.tmbundle
|
||||
[submodule "vendor/grammars/ninja.tmbundle"]
|
||||
path = vendor/grammars/ninja.tmbundle
|
||||
url = https://github.com/textmate/ninja.tmbundle
|
||||
[submodule "vendor/grammars/objective-c.tmbundle"]
|
||||
path = vendor/grammars/objective-c.tmbundle
|
||||
url = https://github.com/textmate/objective-c.tmbundle
|
||||
@@ -397,9 +319,6 @@
|
||||
[submodule "vendor/grammars/pascal.tmbundle"]
|
||||
path = vendor/grammars/pascal.tmbundle
|
||||
url = https://github.com/textmate/pascal.tmbundle
|
||||
[submodule "vendor/grammars/perl.tmbundle"]
|
||||
path = vendor/grammars/perl.tmbundle
|
||||
url = https://github.com/textmate/perl.tmbundle
|
||||
[submodule "vendor/grammars/php-smarty.tmbundle"]
|
||||
path = vendor/grammars/php-smarty.tmbundle
|
||||
url = https://github.com/textmate/php-smarty.tmbundle
|
||||
@@ -412,24 +331,12 @@
|
||||
[submodule "vendor/grammars/processing.tmbundle"]
|
||||
path = vendor/grammars/processing.tmbundle
|
||||
url = https://github.com/textmate/processing.tmbundle
|
||||
[submodule "vendor/grammars/prolog.tmbundle"]
|
||||
path = vendor/grammars/prolog.tmbundle
|
||||
url = https://github.com/textmate/prolog.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/restructuredtext.tmbundle"]
|
||||
path = vendor/grammars/restructuredtext.tmbundle
|
||||
url = https://github.com/textmate/restructuredtext.tmbundle
|
||||
[submodule "vendor/grammars/ruby-haml.tmbundle"]
|
||||
path = vendor/grammars/ruby-haml.tmbundle
|
||||
url = https://github.com/textmate/ruby-haml.tmbundle
|
||||
[submodule "vendor/grammars/ruby-on-rails-tmbundle"]
|
||||
path = vendor/grammars/ruby-on-rails-tmbundle
|
||||
url = https://github.com/textmate/ruby-on-rails-tmbundle
|
||||
[submodule "vendor/grammars/scheme.tmbundle"]
|
||||
path = vendor/grammars/scheme.tmbundle
|
||||
url = https://github.com/textmate/scheme.tmbundle
|
||||
@@ -448,15 +355,6 @@
|
||||
[submodule "vendor/grammars/tcl.tmbundle"]
|
||||
path = vendor/grammars/tcl.tmbundle
|
||||
url = https://github.com/textmate/tcl.tmbundle
|
||||
[submodule "vendor/grammars/text.tmbundle"]
|
||||
path = vendor/grammars/text.tmbundle
|
||||
url = https://github.com/textmate/text.tmbundle
|
||||
[submodule "vendor/grammars/textile.tmbundle"]
|
||||
path = vendor/grammars/textile.tmbundle
|
||||
url = https://github.com/textmate/textile.tmbundle
|
||||
[submodule "vendor/grammars/textmate.tmbundle"]
|
||||
path = vendor/grammars/textmate.tmbundle
|
||||
url = https://github.com/textmate/textmate.tmbundle
|
||||
[submodule "vendor/grammars/thrift.tmbundle"]
|
||||
path = vendor/grammars/thrift.tmbundle
|
||||
url = https://github.com/textmate/thrift.tmbundle
|
||||
@@ -483,33 +381,22 @@
|
||||
url = https://github.com/textmate/c.tmbundle
|
||||
[submodule "vendor/grammars/zephir-sublime"]
|
||||
path = vendor/grammars/zephir-sublime
|
||||
url = https://github.com/vmg/zephir-sublime
|
||||
url = https://github.com/phalcon/zephir-sublime
|
||||
[submodule "vendor/grammars/llvm.tmbundle"]
|
||||
path = vendor/grammars/llvm.tmbundle
|
||||
url = https://github.com/whitequark/llvm.tmbundle
|
||||
[submodule "vendor/grammars/sublime-nix"]
|
||||
path = vendor/grammars/sublime-nix
|
||||
url = https://github.com/wmertens/sublime-nix
|
||||
[submodule "vendor/grammars/ada.tmbundle"]
|
||||
path = vendor/grammars/ada.tmbundle
|
||||
url = https://github.com/aroben/ada.tmbundle
|
||||
branch = better-with-highlighting
|
||||
[submodule "vendor/grammars/oz-tmbundle"]
|
||||
path = vendor/grammars/oz-tmbundle
|
||||
url = https://github.com/eregon/oz-tmbundle
|
||||
[submodule "vendor/grammars/ebundles"]
|
||||
path = vendor/grammars/ebundles
|
||||
url = https://github.com/ericzou/ebundles
|
||||
[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
|
||||
@@ -522,9 +409,6 @@
|
||||
[submodule "vendor/grammars/Scalate.tmbundle"]
|
||||
path = vendor/grammars/Scalate.tmbundle
|
||||
url = https://github.com/scalate/Scalate.tmbundle
|
||||
[submodule "vendor/grammars/Elm.tmLanguage"]
|
||||
path = vendor/grammars/Elm.tmLanguage
|
||||
url = https://github.com/deadfoxygrandpa/Elm.tmLanguage
|
||||
[submodule "vendor/grammars/sublime-bsv"]
|
||||
path = vendor/grammars/sublime-bsv
|
||||
url = https://github.com/thotypous/sublime-bsv
|
||||
@@ -540,9 +424,6 @@
|
||||
[submodule "vendor/grammars/Sublime-Nit"]
|
||||
path = vendor/grammars/Sublime-Nit
|
||||
url = https://github.com/R4PaSs/Sublime-Nit
|
||||
[submodule "vendor/grammars/language-hy"]
|
||||
path = vendor/grammars/language-hy
|
||||
url = https://github.com/rwtolbert/language-hy
|
||||
[submodule "vendor/grammars/Racket"]
|
||||
path = vendor/grammars/Racket
|
||||
url = https://github.com/soegaard/racket-highlight-for-github
|
||||
@@ -552,24 +433,9 @@
|
||||
[submodule "vendor/grammars/liquid.tmbundle"]
|
||||
path = vendor/grammars/liquid.tmbundle
|
||||
url = https://github.com/bastilian/validcode-textmate-bundles
|
||||
[submodule "vendor/grammars/ats.sublime"]
|
||||
path = vendor/grammars/ats.sublime
|
||||
url = https://github.com/steinwaywhw/ats-mode-sublimetext
|
||||
[submodule "vendor/grammars/Modelica"]
|
||||
path = vendor/grammars/Modelica
|
||||
url = https://github.com/BorisChumichev/modelicaSublimeTextPackage
|
||||
[submodule "vendor/grammars/sublime-apl"]
|
||||
path = vendor/grammars/sublime-apl
|
||||
url = https://github.com/StoneCypher/sublime-apl
|
||||
[submodule "vendor/grammars/CLIPS-sublime"]
|
||||
path = vendor/grammars/CLIPS-sublime
|
||||
url = https://github.com/psicomante/CLIPS-sublime
|
||||
[submodule "vendor/grammars/Creole"]
|
||||
path = vendor/grammars/Creole
|
||||
url = https://github.com/Siddley/Creole
|
||||
[submodule "vendor/grammars/GDScript-sublime"]
|
||||
path = vendor/grammars/GDScript-sublime
|
||||
url = https://github.com/beefsack/GDScript-sublime
|
||||
[submodule "vendor/grammars/sublime-golo"]
|
||||
path = vendor/grammars/sublime-golo
|
||||
url = https://github.com/TypeUnsafe/sublime-golo
|
||||
@@ -582,9 +448,6 @@
|
||||
[submodule "vendor/grammars/G-Code"]
|
||||
path = vendor/grammars/G-Code
|
||||
url = https://github.com/robotmaster/sublime-text-syntax-highlighting
|
||||
[submodule "vendor/grammars/grace-tmbundle"]
|
||||
path = vendor/grammars/grace-tmbundle
|
||||
url = https://github.com/zmthy/grace-tmbundle
|
||||
[submodule "vendor/grammars/sublime-text-ox"]
|
||||
path = vendor/grammars/sublime-text-ox
|
||||
url = https://github.com/andreashetland/sublime-text-ox
|
||||
@@ -594,9 +457,6 @@
|
||||
[submodule "vendor/grammars/ec.tmbundle"]
|
||||
path = vendor/grammars/ec.tmbundle
|
||||
url = https://github.com/ecere/ec.tmbundle
|
||||
[submodule "vendor/grammars/InnoSetup"]
|
||||
path = vendor/grammars/InnoSetup
|
||||
url = https://github.com/idleberg/InnoSetup-Sublime-Text
|
||||
[submodule "vendor/grammars/gap-tmbundle"]
|
||||
path = vendor/grammars/gap-tmbundle
|
||||
url = https://github.com/dhowden/gap-tmbundle
|
||||
@@ -615,3 +475,411 @@
|
||||
[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-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/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
|
||||
[submodule "vendor/grammars/language-jolie"]
|
||||
path = vendor/grammars/language-jolie
|
||||
url = https://github.com/fmontesi/language-jolie
|
||||
[submodule "vendor/grammars/language-typelanguage"]
|
||||
path = vendor/grammars/language-typelanguage
|
||||
url = https://github.com/goodmind/language-typelanguage
|
||||
[submodule "vendor/grammars/sublime-shen"]
|
||||
path = vendor/grammars/sublime-shen
|
||||
url = https://github.com/rkoeninger/sublime-shen
|
||||
[submodule "vendor/grammars/Sublime-Pep8"]
|
||||
path = vendor/grammars/Sublime-Pep8
|
||||
url = https://github.com/R4PaSs/Sublime-Pep8
|
||||
[submodule "vendor/grammars/dartlang"]
|
||||
path = vendor/grammars/dartlang
|
||||
url = https://github.com/dart-atom/dartlang
|
||||
[submodule "vendor/grammars/language-closure-templates"]
|
||||
path = vendor/grammars/language-closure-templates
|
||||
url = https://github.com/mthadley/language-closure-templates
|
||||
[submodule "vendor/grammars/language-webassembly"]
|
||||
path = vendor/grammars/language-webassembly
|
||||
url = https://github.com/Alhadis/language-webassembly
|
||||
[submodule "vendor/grammars/language-ring"]
|
||||
path = vendor/grammars/language-ring
|
||||
url = https://github.com/MahmoudFayed/atom-language-ring
|
||||
[submodule "vendor/grammars/sublime-fantom"]
|
||||
path = vendor/grammars/sublime-fantom
|
||||
url = https://github.com/rkoeninger/sublime-fantom
|
||||
[submodule "vendor/grammars/language-pan"]
|
||||
path = vendor/grammars/language-pan
|
||||
url = https://github.com/quattor/language-pan
|
||||
[submodule "vendor/grammars/language-pcb"]
|
||||
path = vendor/grammars/language-pcb
|
||||
url = https://github.com/Alhadis/language-pcb
|
||||
[submodule "vendor/grammars/language-reason"]
|
||||
path = vendor/grammars/language-reason
|
||||
url = https://github.com/reasonml-editor/language-reason
|
||||
[submodule "vendor/grammars/sublime-nearley"]
|
||||
path = vendor/grammars/sublime-nearley
|
||||
url = https://github.com/Hardmath123/sublime-nearley
|
||||
[submodule "vendor/grammars/data-weave-tmLanguage"]
|
||||
path = vendor/grammars/data-weave-tmLanguage
|
||||
url = https://github.com/mulesoft-labs/data-weave-tmLanguage
|
||||
[submodule "vendor/grammars/squirrel-language"]
|
||||
path = vendor/grammars/squirrel-language
|
||||
url = https://github.com/mathewmariani/squirrel-language
|
||||
[submodule "vendor/grammars/language-ballerina"]
|
||||
path = vendor/grammars/language-ballerina
|
||||
url = https://github.com/ballerinalang/plugin-vscode
|
||||
[submodule "vendor/grammars/language-ruby"]
|
||||
path = vendor/grammars/language-ruby
|
||||
url = https://github.com/atom/language-ruby
|
||||
[submodule "vendor/grammars/sublime-angelscript"]
|
||||
path = vendor/grammars/sublime-angelscript
|
||||
url = https://github.com/wronex/sublime-angelscript
|
||||
[submodule "vendor/grammars/TypeScript-TmLanguage"]
|
||||
path = vendor/grammars/TypeScript-TmLanguage
|
||||
url = https://github.com/Microsoft/TypeScript-TmLanguage
|
||||
[submodule "vendor/grammars/wdl-sublime-syntax-highlighter"]
|
||||
path = vendor/grammars/wdl-sublime-syntax-highlighter
|
||||
url = https://github.com/broadinstitute/wdl-sublime-syntax-highlighter
|
||||
[submodule "vendor/grammars/atom-language-julia"]
|
||||
path = vendor/grammars/atom-language-julia
|
||||
url = https://github.com/JuliaEditorSupport/atom-language-julia
|
||||
|
||||
24
.travis.yml
24
.travis.yml
@@ -1,12 +1,32 @@
|
||||
language: ruby
|
||||
sudo: false
|
||||
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- libicu-dev
|
||||
- libicu48
|
||||
|
||||
before_install: script/travis/before_install
|
||||
|
||||
script:
|
||||
- bundle exec rake
|
||||
- script/licensed verify
|
||||
|
||||
rvm:
|
||||
- 1.9.3
|
||||
- 2.0.0
|
||||
- 2.1
|
||||
- 2.2
|
||||
- 2.3.3
|
||||
- 2.4.0
|
||||
|
||||
notifications:
|
||||
disabled: true
|
||||
|
||||
git:
|
||||
submodules: false
|
||||
depth: 3
|
||||
|
||||
cache: bundler
|
||||
dist: precise
|
||||
|
||||
bundler_args: --without debug
|
||||
|
||||
112
CONTRIBUTING.md
112
CONTRIBUTING.md
@@ -1,43 +1,63 @@
|
||||
# Contributing
|
||||
|
||||
Hi there! We're thrilled that you'd like to contribute to this project. Your help is essential for keeping it great. The majority of contributions won't need to touch any Ruby code at all.
|
||||
Hi there! We're thrilled that you'd like to contribute to this project. Your help is essential for keeping it great. This project adheres to the [Contributor Covenant Code of Conduct](http://contributor-covenant.org/). By participating, you are expected to uphold this code.
|
||||
|
||||
The majority of contributions won't need to touch any Ruby code at all.
|
||||
|
||||
## Adding an extension to a language
|
||||
|
||||
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.
|
||||
|
||||
To add support for a new extension:
|
||||
|
||||
1. Add your extension to the language entry in [`languages.yml`][languages], keeping the extensions in alphabetical order.
|
||||
1. Add at least one sample for your extension to the [samples directory][samples] in the correct subdirectory.
|
||||
1. 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 this extension is already listed in [`languages.yml`][languages] then sometimes a few more steps will need to be taken:
|
||||
|
||||
1. Make sure that example `.yourextension` files are present in the [samples directory][samples] for each language that uses `.yourextension`.
|
||||
1. Test the performance of the Bayesian classifier with a relatively large number (1000s) of sample `.yourextension` files. (ping **@lildude** to help with this) to ensure we're not misclassifying files.
|
||||
1. 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.
|
||||
|
||||
|
||||
## Adding a language
|
||||
|
||||
We try only to add languages once they have some usage on GitHub. In most cases we prefer that languages be in use in hundreds of repositories before supporting them in Linguist.
|
||||
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.
|
||||
|
||||
To add support for a new language:
|
||||
|
||||
0. Add an entry for your language to [`languages.yml`][languages].
|
||||
0. Add a grammar for your language. Please only add grammars that have a license that permits redistribution.
|
||||
0. Add your grammar as a submodule: `git submodule add https://github.com/JaneSmith/MyGrammar vendor/grammars/MyGrammar`.
|
||||
0. Add your grammar to [`grammars.yml`][grammars] by running `script/convert-grammars --add vendor/grammars/MyGrammar`.
|
||||
0. Add samples for your language to the [samples directory][samples] in the correct subdirectory.
|
||||
0. Open a pull request, linking to a [GitHub search result](https://github.com/search?utf8=%E2%9C%93&q=extension%3Aboot+NOT+nothack&type=Code&ref=searchresults) showing in-the-wild usage.
|
||||
1. Add an entry for your language to [`languages.yml`][languages]. Omit the `language_id` field for now.
|
||||
1. 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].
|
||||
1. Add samples for your language to the [samples directory][samples] in the correct subdirectory.
|
||||
1. 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:**
|
||||
1. 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 @arfon or @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.
|
||||
1. Make sure that example `.foo` files are present in the [samples directory][samples] for each language that uses `.foo`.
|
||||
1. Test the performance of the Bayesian classifier with a relatively large number (1000s) of sample `.foo` files. (ping **@lildude** to help with this) to ensure we're not misclassifying files.
|
||||
1. 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](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://github-lightshow.herokuapp.com).
|
||||
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, please let us know and we'll pick it up for GitHub.
|
||||
Once the bug has been fixed upstream, we'll pick it up for GitHub in the next release of Linguist.
|
||||
|
||||
## Testing
|
||||
|
||||
@@ -47,35 +67,65 @@ For development you are going to want to checkout out the source. To get it, clo
|
||||
cd linguist/
|
||||
script/bootstrap
|
||||
|
||||
To run Linguist from the cloned repository, you will need to generate the code samples first:
|
||||
|
||||
bundle exec rake samples
|
||||
|
||||
Run this command each time a [sample][samples] has been modified.
|
||||
|
||||
To run Linguist from the cloned repository:
|
||||
|
||||
bundle exec bin/linguist --breakdown
|
||||
|
||||
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](http://travis-ci.org/#!/github/linguist) run the tests for you. Just open a pull request and the bot will start cranking away.
|
||||
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: [](http://travis-ci.org/github/linguist)
|
||||
Here's our current build status: [](https://travis-ci.org/github/linguist)
|
||||
|
||||
## Releasing
|
||||
## Maintainers
|
||||
|
||||
Linguist is maintained with :heart: by:
|
||||
|
||||
- **@Alhadis**
|
||||
- **@BenEddy** (GitHub staff)
|
||||
- **@Caged** (GitHub staff)
|
||||
- **@grantr** (GitHub staff)
|
||||
- **@larsbrinkhoff**
|
||||
- **@lildude** (GitHub staff)
|
||||
- **@pchaigno**
|
||||
- **@rafer** (GitHub staff)
|
||||
- **@shreyasjoshis** (GitHub staff)
|
||||
|
||||
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`
|
||||
1. Create a branch for the release: `git checkout -b cut-release-vxx.xx.xx`
|
||||
1. Make sure your local dependencies are up to date: `script/bootstrap`
|
||||
1. If grammar submodules have not been updated recently, update them: `git submodule update --remote && git commit -a`
|
||||
1. Ensure that samples are updated: `bundle exec rake samples`
|
||||
1. Ensure that tests are green: `bundle exec rake test`
|
||||
1. Bump gem version in `lib/linguist/version.rb`, [like this](https://github.com/github/linguist/commit/8d2ea90a5ba3b2fe6e1508b7155aa4632eea2985).
|
||||
1. Make a PR to github/linguist, [like this](https://github.com/github/linguist/pull/1238).
|
||||
1. Build a local gem: `bundle exec rake build_gem`
|
||||
1. Test the gem:
|
||||
1. Bump the Gemfile and Gemfile.lock versions for an app which relies on this gem
|
||||
1. Install the new gem locally
|
||||
1. Test behavior locally, branch deploy, whatever needs to happen
|
||||
1. Merge github/linguist PR
|
||||
1. Tag and push: `git tag vx.xx.xx; git push --tags`
|
||||
1. Push to rubygems.org -- `gem push github-linguist-3.0.0.gem`
|
||||
|
||||
[grammars]: /grammars.yml
|
||||
[languages]: /lib/linguist/languages.yml
|
||||
[licenses]: https://github.com/github/linguist/blob/257425141d4e2a5232786bf0b13c901ada075f93/vendor/licenses/config.yml#L2-L11
|
||||
[samples]: /samples
|
||||
[new-issue]: https://github.com/github/linguist/issues/new
|
||||
|
||||
6
Gemfile
6
Gemfile
@@ -1,4 +1,6 @@
|
||||
source 'https://rubygems.org'
|
||||
gemspec :name => "github-linguist"
|
||||
gemspec :name => "github-linguist-grammars"
|
||||
gem 'byebug' if RUBY_VERSION >= '2.0'
|
||||
|
||||
group :debug do
|
||||
gem 'byebug' if RUBY_VERSION >= '2.2'
|
||||
end
|
||||
|
||||
2
LICENSE
2
LICENSE
@@ -1,4 +1,4 @@
|
||||
Copyright (c) 2011-2015 GitHub, Inc.
|
||||
Copyright (c) 2017 GitHub, Inc.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person
|
||||
obtaining a copy of this software and associated documentation
|
||||
|
||||
55
README.md
55
README.md
@@ -13,12 +13,18 @@ See [Troubleshooting](#troubleshooting) and [`CONTRIBUTING.md`](/CONTRIBUTING.md
|
||||
|
||||

|
||||
|
||||
The Language stats bar is built by aggregating the languages of each file in that repository. If it is reporting a language that you don't expect:
|
||||
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:
|
||||
|
||||
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](https://github.com/github/linguist/blob/master/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 an 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.
|
||||
1. Click on the name of the language in the stats bar to see a list of the files that are identified as that language.
|
||||
1. 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.
|
||||
1. 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.
|
||||
1. 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.
|
||||
|
||||
### 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
|
||||
|
||||
@@ -26,14 +32,16 @@ Linguist supports a number of different custom overrides strategies for language
|
||||
|
||||
### 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`.
|
||||
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`, `linguist-vendored`, and `linguist-generated`. `.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
|
||||
```
|
||||
|
||||
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. Vendored files are also hidden by default in diffs on github.com.
|
||||
#### Vendored code
|
||||
|
||||
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.
|
||||
|
||||
Use the `linguist-vendored` attribute to vendor or un-vendor paths.
|
||||
|
||||
@@ -43,7 +51,9 @@ special-vendored-path/* linguist-vendored
|
||||
jquery.js linguist-vendored=false
|
||||
```
|
||||
|
||||
Similar to vendored files, Linguist excludes documentation files from your project's language stats. (Unlike vendored files, documentation files are displayed in diffs on github.com.) [lib/linguist/documentation.yml](lib/linguist/documentation.yml) lists common documentation paths and excludes them from the language statistics for your repository.
|
||||
#### Documentation
|
||||
|
||||
Just like vendored files, Linguist excludes documentation files from your project's language stats. [lib/linguist/documentation.yml](lib/linguist/documentation.yml) lists common documentation paths and excludes them from the language statistics for your repository.
|
||||
|
||||
Use the `linguist-documentation` attribute to mark or unmark paths as documentation.
|
||||
|
||||
@@ -53,16 +63,30 @@ project-docs/* linguist-documentation
|
||||
docs/formatter.rb linguist-documentation=false
|
||||
```
|
||||
|
||||
### Using Emacs and Vim modelines
|
||||
#### Generated code
|
||||
|
||||
Alternatively, you can use Vim and 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
|
||||
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.
|
||||
|
||||
```
|
||||
Vim
|
||||
$ cat .gitattributes
|
||||
Api.elm linguist-generated=true
|
||||
```
|
||||
|
||||
### 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
|
||||
##### Emacs
|
||||
```
|
||||
-*- mode: php;-*-
|
||||
```
|
||||
|
||||
@@ -109,4 +133,9 @@ lib/linguist.rb
|
||||
|
||||
Please check out our [contributing guidelines](CONTRIBUTING.md).
|
||||
|
||||
##
|
||||
## License
|
||||
|
||||
The language grammars included in this gem are covered by their repositories'
|
||||
respective licenses. `grammars.yml` specifies the repository for each grammar.
|
||||
|
||||
All other files are covered by the MIT license, see `LICENSE`.
|
||||
|
||||
11
Rakefile
11
Rakefile
@@ -4,6 +4,7 @@ require 'rake/testtask'
|
||||
require 'yaml'
|
||||
require 'yajl'
|
||||
require 'open-uri'
|
||||
require 'json'
|
||||
|
||||
task :default => :test
|
||||
|
||||
@@ -40,18 +41,14 @@ task :samples do
|
||||
end
|
||||
|
||||
task :build_gem => :samples do
|
||||
rm_rf "grammars"
|
||||
sh "script/convert-grammars"
|
||||
languages = YAML.load_file("lib/linguist/languages.yml")
|
||||
File.write("lib/linguist/languages.json", Yajl.dump(languages))
|
||||
`gem build github-linguist.gemspec`
|
||||
File.delete("lib/linguist/languages.json")
|
||||
end
|
||||
|
||||
task :build_grammars_gem do
|
||||
rm_rf "grammars"
|
||||
sh "script/convert-grammars"
|
||||
sh "gem", "build", "github-linguist-grammars.gemspec"
|
||||
end
|
||||
|
||||
namespace :benchmark do
|
||||
benchmark_path = "benchmark/results"
|
||||
|
||||
@@ -62,7 +59,7 @@ namespace :benchmark do
|
||||
|
||||
corpus = File.expand_path(ENV["CORPUS"] || "samples")
|
||||
|
||||
require 'linguist/language'
|
||||
require 'linguist'
|
||||
|
||||
results = Hash.new
|
||||
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
|
||||
|
||||
# linguist — detect language type for a file, or, given a directory, determine language breakdown
|
||||
# usage: linguist <path> [<--breakdown>]
|
||||
$LOAD_PATH[0, 0] = File.join(File.dirname(__FILE__), '..', 'lib')
|
||||
|
||||
require 'linguist/file_blob'
|
||||
require 'linguist/language'
|
||||
require 'linguist/repository'
|
||||
require 'linguist'
|
||||
require 'rugged'
|
||||
require 'json'
|
||||
require 'optparse'
|
||||
|
||||
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"
|
||||
path = Dir.pwd
|
||||
breakdown = true
|
||||
elsif path == "--json"
|
||||
path = Dir.pwd
|
||||
json_breakdown = true
|
||||
end
|
||||
|
||||
ARGV.shift
|
||||
breakdown = true if ARGV[0] == "--breakdown"
|
||||
json_breakdown = true if ARGV[0] == "--json"
|
||||
|
||||
if File.directory?(path)
|
||||
rugged = Rugged::Repository.new(path)
|
||||
repo = Linguist::Repository.new(rugged, rugged.head.target_id)
|
||||
repo.languages.sort_by { |_, size| size }.reverse.each do |language, size|
|
||||
percentage = ((size / repo.size.to_f) * 100)
|
||||
percentage = sprintf '%.2f' % percentage
|
||||
puts "%-7s %s" % ["#{percentage}%", language]
|
||||
if !json_breakdown
|
||||
repo.languages.sort_by { |_, size| size }.reverse.each do |language, size|
|
||||
percentage = ((size / repo.size.to_f) * 100)
|
||||
percentage = sprintf '%.2f' % percentage
|
||||
puts "%-7s %s" % ["#{percentage}%", language]
|
||||
end
|
||||
end
|
||||
if breakdown
|
||||
puts
|
||||
@@ -37,6 +43,8 @@ if File.directory?(path)
|
||||
end
|
||||
puts
|
||||
end
|
||||
elsif json_breakdown
|
||||
puts JSON.dump(repo.breakdown_by_file)
|
||||
end
|
||||
elsif File.file?(path)
|
||||
blob = Linguist::FileBlob.new(path, Dir.pwd)
|
||||
@@ -65,5 +73,12 @@ elsif File.file?(path)
|
||||
puts " appears to be a vendored file"
|
||||
end
|
||||
else
|
||||
abort "usage: linguist <path>"
|
||||
abort <<-HELP
|
||||
Linguist v#{Linguist::VERSION}
|
||||
Detect language type for a file, or, given a repository, determine language breakdown.
|
||||
|
||||
Usage: linguist <path>
|
||||
linguist <path> [--breakdown] [--json]
|
||||
linguist [--breakdown] [--json]
|
||||
HELP
|
||||
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,17 +10,21 @@ Gem::Specification.new do |s|
|
||||
s.homepage = "https://github.com/github/linguist"
|
||||
s.license = "MIT"
|
||||
|
||||
s.files = Dir['lib/**/*'] - ['lib/linguist/grammars.rb']
|
||||
s.executables << 'linguist'
|
||||
s.files = Dir['lib/**/*'] + Dir['grammars/*'] + ['LICENSE']
|
||||
s.executables = ['linguist', 'git-linguist']
|
||||
|
||||
s.add_dependency 'charlock_holmes', '~> 0.7.3'
|
||||
s.add_dependency 'escape_utils', '~> 1.0.1'
|
||||
s.add_dependency 'charlock_holmes', '~> 0.7.5'
|
||||
s.add_dependency 'escape_utils', '~> 1.1.0'
|
||||
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 'plist', '~>3.1'
|
||||
s.add_development_dependency 'pry'
|
||||
s.add_development_dependency 'rake'
|
||||
s.add_development_dependency 'yajl-ruby'
|
||||
s.add_development_dependency 'color-proximity', '~> 0.2.1'
|
||||
s.add_development_dependency 'licensed'
|
||||
s.add_development_dependency 'licensee', '~> 8.8.0'
|
||||
end
|
||||
|
||||
477
grammars.yml
Normal file → Executable file
477
grammars.yml
Normal file → Executable file
@@ -1,68 +1,62 @@
|
||||
---
|
||||
http://svn.edgewall.org/repos/genshi/contrib/textmate/Genshi.tmbundle/Syntaxes/Markup%20Template%20%28XML%29.tmLanguage:
|
||||
- text.xml.genshi
|
||||
http://svn.textmate.org/trunk/Review/Bundles/BlitzMax.tmbundle:
|
||||
- source.blitzmax
|
||||
http://svn.textmate.org/trunk/Review/Bundles/Cython.tmbundle:
|
||||
- source.cython
|
||||
http://svn.textmate.org/trunk/Review/Bundles/Forth.tmbundle:
|
||||
- source.forth
|
||||
http://svn.textmate.org/trunk/Review/Bundles/Parrot.tmbundle:
|
||||
- source.parrot.pir
|
||||
http://svn.textmate.org/trunk/Review/Bundles/SecondLife%20LSL.tmbundle:
|
||||
- source.lsl
|
||||
http://svn.textmate.org/trunk/Review/Bundles/VHDL.tmbundle:
|
||||
- source.vhdl
|
||||
http://svn.textmate.org/trunk/Review/Bundles/XQuery.tmbundle:
|
||||
- source.xquery
|
||||
https://bitbucket.org/Clams/sublimesystemverilog/get/default.tar.gz:
|
||||
- source.systemverilog
|
||||
- source.ucfconstraints
|
||||
https://fan.googlecode.com/hg-history/Build%201.0.55/adm/tools/textmate/Fan.tmbundle/Syntaxes/Fan.tmLanguage:
|
||||
- source.fan
|
||||
https://svn.edgewall.org/repos/genshi/contrib/textmate/Genshi.tmbundle/Syntaxes/Markup%20Template%20%28XML%29.tmLanguage:
|
||||
- text.xml.genshi
|
||||
vendor/grammars/ABNF.tmbundle:
|
||||
- source.abnf
|
||||
vendor/grammars/Agda.tmbundle:
|
||||
- source.agda
|
||||
vendor/grammars/Alloy.tmbundle:
|
||||
- source.alloy
|
||||
vendor/grammars/AutoHotkey/:
|
||||
vendor/grammars/AutoHotkey:
|
||||
- source.ahk
|
||||
vendor/grammars/CLIPS-sublime:
|
||||
- source.clips
|
||||
vendor/grammars/BrightScript.tmbundle:
|
||||
- source.brightauthorproject
|
||||
- source.brightscript
|
||||
vendor/grammars/ColdFusion:
|
||||
- source.cfscript
|
||||
- source.cfscript.cfc
|
||||
- text.cfml.basic
|
||||
- text.html.cfm
|
||||
vendor/grammars/Creole:
|
||||
- text.html.creole
|
||||
vendor/grammars/Docker.tmbundle:
|
||||
- source.dockerfile
|
||||
vendor/grammars/Elm.tmLanguage:
|
||||
vendor/grammars/EBNF.tmbundle:
|
||||
- source.ebnf
|
||||
vendor/grammars/Elm/Syntaxes:
|
||||
- source.elm
|
||||
vendor/grammars/G-Code/:
|
||||
- text.html.mediawiki.elm-build-output
|
||||
- text.html.mediawiki.elm-documentation
|
||||
vendor/grammars/FreeMarker.tmbundle:
|
||||
- text.html.ftl
|
||||
vendor/grammars/G-Code:
|
||||
- source.LS
|
||||
- source.MCPOST
|
||||
- source.MOD
|
||||
- source.apt
|
||||
- source.gcode
|
||||
vendor/grammars/GDScript-sublime/:
|
||||
- source.gdscript
|
||||
vendor/grammars/Handlebars:
|
||||
- text.html.handlebars
|
||||
vendor/grammars/IDL-Syntax:
|
||||
- source.webidl
|
||||
vendor/grammars/InnoSetup/:
|
||||
- source.inno
|
||||
vendor/grammars/Isabelle.tmbundle:
|
||||
- source.isabelle.root
|
||||
- source.isabelle.theory
|
||||
vendor/grammars/JSyntax/:
|
||||
vendor/grammars/JSyntax:
|
||||
- source.j
|
||||
vendor/grammars/Julia.tmbundle:
|
||||
- source.julia
|
||||
vendor/grammars/Lean.tmbundle:
|
||||
- source.lean
|
||||
vendor/grammars/LiveScript.tmbundle:
|
||||
- source.livescript
|
||||
vendor/grammars/Modelica/:
|
||||
vendor/grammars/MQL5-sublime:
|
||||
- source.mql5
|
||||
vendor/grammars/MagicPython:
|
||||
- source.python
|
||||
- source.regexp.python
|
||||
- text.python.console
|
||||
- text.python.traceback
|
||||
vendor/grammars/Modelica:
|
||||
- source.modelica
|
||||
vendor/grammars/NSIS:
|
||||
- source.nsis
|
||||
@@ -72,7 +66,7 @@ vendor/grammars/NimLime:
|
||||
- source.nimcfg
|
||||
vendor/grammars/PHP-Twig.tmbundle:
|
||||
- text.html.twig
|
||||
vendor/grammars/PogoScript.tmbundle/:
|
||||
vendor/grammars/PogoScript.tmbundle:
|
||||
- source.pogoscript
|
||||
vendor/grammars/RDoc.tmbundle:
|
||||
- text.rdoc
|
||||
@@ -80,6 +74,8 @@ vendor/grammars/Racket:
|
||||
- source.racket
|
||||
vendor/grammars/SCSS.tmbundle:
|
||||
- source.scss
|
||||
vendor/grammars/SMT.tmbundle:
|
||||
- source.smt
|
||||
vendor/grammars/Scalate.tmbundle:
|
||||
- source.scaml
|
||||
- text.html.ssp
|
||||
@@ -88,54 +84,81 @@ vendor/grammars/Slash.tmbundle:
|
||||
vendor/grammars/Stata.tmbundle:
|
||||
- source.mata
|
||||
- source.stata
|
||||
vendor/grammars/Stylus:
|
||||
- source.stylus
|
||||
vendor/grammars/Sublime-Coq:
|
||||
- source.coq
|
||||
vendor/grammars/Sublime-HTTP:
|
||||
- source.httpspec
|
||||
vendor/grammars/Sublime-Inform:
|
||||
- source.Inform7
|
||||
vendor/grammars/Sublime-Lasso:
|
||||
- file.lasso
|
||||
vendor/grammars/Sublime-Logos:
|
||||
- source.logos
|
||||
vendor/grammars/Sublime-Loom:
|
||||
- source.loomscript
|
||||
vendor/grammars/Sublime-Modula-2:
|
||||
- source.modula2
|
||||
vendor/grammars/Sublime-Nit:
|
||||
- source.nit
|
||||
vendor/grammars/Sublime-Pep8/:
|
||||
- source.pep8
|
||||
vendor/grammars/Sublime-QML:
|
||||
- source.qml
|
||||
vendor/grammars/Sublime-REBOL:
|
||||
- source.rebol
|
||||
vendor/grammars/Sublime-Red:
|
||||
- source.red
|
||||
vendor/grammars/Sublime-SQF-Language:
|
||||
- source.sqf
|
||||
vendor/grammars/Sublime-Text-2-OpenEdge-ABL:
|
||||
- source.abl
|
||||
vendor/grammars/Sublime-VimL:
|
||||
- source.viml
|
||||
- text.html.abl
|
||||
vendor/grammars/SublimeBrainfuck:
|
||||
- source.bf
|
||||
vendor/grammars/SublimePapyrus/:
|
||||
- source.compiled-papyrus
|
||||
- source.papyrus
|
||||
- source.papyrus-assembly
|
||||
vendor/grammars/SublimeClarion:
|
||||
- source.clarion
|
||||
vendor/grammars/SublimeEthereum:
|
||||
- source.solidity
|
||||
vendor/grammars/SublimeGDB/:
|
||||
- source.disasm
|
||||
- source.gdb
|
||||
- source.gdb.session
|
||||
- source.gdbregs
|
||||
vendor/grammars/SublimePapyrus:
|
||||
- source.papyrus.skyrim
|
||||
vendor/grammars/SublimePuppet:
|
||||
- source.puppet
|
||||
vendor/grammars/SublimeXtend:
|
||||
- source.xtend
|
||||
vendor/grammars/TXL/:
|
||||
vendor/grammars/TLA:
|
||||
- source.tla
|
||||
vendor/grammars/TXL:
|
||||
- source.txl
|
||||
vendor/grammars/Terraform.tmLanguage:
|
||||
- source.terraform
|
||||
vendor/grammars/Textmate-Gosu-Bundle:
|
||||
- source.gosu.2
|
||||
vendor/grammars/TypeScript-TmLanguage:
|
||||
- source.ts
|
||||
- source.tsx
|
||||
- text.error-list
|
||||
- text.find-refs
|
||||
vendor/grammars/UrWeb-Language-Definition:
|
||||
- source.ur
|
||||
vendor/grammars/VBDotNetSyntax:
|
||||
- source.vbnet
|
||||
vendor/grammars/Vala-TMBundle:
|
||||
- source.vala
|
||||
vendor/grammars/X10:
|
||||
- source.x10
|
||||
vendor/grammars/abap.tmbundle:
|
||||
- source.abap
|
||||
vendor/grammars/actionscript3-tmbundle:
|
||||
vendor/grammars/actionscript3-tmbundle/:
|
||||
- source.actionscript.3
|
||||
- text.html.asdoc
|
||||
- text.xml.flex-config
|
||||
vendor/grammars/ada.tmbundle:
|
||||
- source.ada
|
||||
vendor/grammars/ampl:
|
||||
- source.ampl
|
||||
vendor/grammars/ant.tmbundle:
|
||||
- text.xml.ant
|
||||
vendor/grammars/antlr.tmbundle:
|
||||
@@ -143,26 +166,63 @@ vendor/grammars/antlr.tmbundle:
|
||||
vendor/grammars/apache.tmbundle:
|
||||
- source.apache-config
|
||||
- source.apache-config.mod_perl
|
||||
vendor/grammars/api-blueprint-sublime-plugin:
|
||||
- text.html.markdown.source.gfm.apib
|
||||
- text.html.markdown.source.gfm.mson
|
||||
vendor/grammars/applescript.tmbundle:
|
||||
- source.applescript
|
||||
vendor/grammars/asciidoc.tmbundle:
|
||||
- text.html.asciidoc
|
||||
vendor/grammars/asp.tmbundle:
|
||||
- source.asp
|
||||
- text.html.asp
|
||||
vendor/grammars/assembly.tmbundle:
|
||||
vendor/grammars/assembly:
|
||||
- objdump.x86asm
|
||||
- source.x86asm
|
||||
vendor/grammars/atom-fsharp:
|
||||
- source.fsharp
|
||||
- source.fsharp.fsi
|
||||
- source.fsharp.fsl
|
||||
- source.fsharp.fsx
|
||||
vendor/grammars/atom-language-1c-bsl:
|
||||
- source.bsl
|
||||
- source.sdbl
|
||||
vendor/grammars/atom-language-clean:
|
||||
- source.clean
|
||||
- text.restructuredtext.clean
|
||||
vendor/grammars/atom-language-julia:
|
||||
- source.julia
|
||||
- source.julia.console
|
||||
vendor/grammars/atom-language-p4:
|
||||
- source.p4
|
||||
vendor/grammars/atom-language-perl6:
|
||||
- source.meta-info
|
||||
- source.perl6fe
|
||||
- source.quoting.perl6fe
|
||||
- source.regexp.perl6fe
|
||||
vendor/grammars/atom-language-purescript:
|
||||
- source.purescript
|
||||
vendor/grammars/atom-language-rust:
|
||||
- source.rust
|
||||
vendor/grammars/atom-language-srt:
|
||||
- text.srt
|
||||
vendor/grammars/atom-language-stan:
|
||||
- source.stan
|
||||
vendor/grammars/atom-salt:
|
||||
- source.python.salt
|
||||
- source.yaml.salt
|
||||
vendor/grammars/ats.sublime:
|
||||
vendor/grammars/atomic-dreams:
|
||||
- source.dm
|
||||
- source.dmf
|
||||
vendor/grammars/ats:
|
||||
- source.ats
|
||||
vendor/grammars/autoitv3-tmbundle:
|
||||
- source.autoit.3
|
||||
vendor/grammars/awk-sublime:
|
||||
- source.awk
|
||||
vendor/grammars/bison.tmbundle:
|
||||
- source.bison
|
||||
vendor/grammars/boo-sublime:
|
||||
vendor/grammars/blitzmax:
|
||||
- source.blitzmax
|
||||
vendor/grammars/boo:
|
||||
- source.boo
|
||||
vendor/grammars/bro-sublime:
|
||||
- source.bro
|
||||
@@ -175,7 +235,6 @@ vendor/grammars/capnproto.tmbundle:
|
||||
vendor/grammars/carto-atom:
|
||||
- source.css.mss
|
||||
vendor/grammars/ceylon-sublimetext:
|
||||
- module.ceylon
|
||||
- source.ceylon
|
||||
vendor/grammars/chapel-tmbundle:
|
||||
- source.chapel
|
||||
@@ -187,17 +246,20 @@ vendor/grammars/cool-tmbundle:
|
||||
vendor/grammars/cpp-qt.tmbundle:
|
||||
- source.c++.qt
|
||||
- source.qmake
|
||||
vendor/grammars/css.tmbundle:
|
||||
- source.css
|
||||
vendor/grammars/creole:
|
||||
- text.html.creole
|
||||
vendor/grammars/cucumber-tmbundle:
|
||||
- source.ruby.rspec.cucumber.steps
|
||||
- text.gherkin.feature
|
||||
vendor/grammars/cython:
|
||||
- source.cython
|
||||
vendor/grammars/d.tmbundle:
|
||||
- source.d
|
||||
vendor/grammars/dart-sublime-bundle:
|
||||
vendor/grammars/dartlang:
|
||||
- source.dart
|
||||
- source.pubspec
|
||||
- text.dart-doccomments
|
||||
- source.yaml-ext
|
||||
vendor/grammars/data-weave-tmLanguage:
|
||||
- source.data-weave
|
||||
vendor/grammars/desktop.tmbundle:
|
||||
- source.desktop
|
||||
vendor/grammars/diff.tmbundle:
|
||||
@@ -206,12 +268,12 @@ vendor/grammars/dylan.tmbundle:
|
||||
- source.dylan
|
||||
- source.lid
|
||||
- source.makegen
|
||||
vendor/grammars/ebundles/Bundles/MSDOS batch file.tmbundle:
|
||||
- source.dosbatch
|
||||
vendor/grammars/ec.tmbundle/:
|
||||
vendor/grammars/ec.tmbundle:
|
||||
- source.c.ec
|
||||
vendor/grammars/eiffel.tmbundle:
|
||||
- source.eiffel
|
||||
vendor/grammars/ejs-tmbundle:
|
||||
- text.html.js
|
||||
vendor/grammars/elixir-tmbundle:
|
||||
- source.elixir
|
||||
- text.elixir
|
||||
@@ -226,20 +288,22 @@ vendor/grammars/fancy-tmbundle:
|
||||
- source.fancy
|
||||
vendor/grammars/fish-tmbundle:
|
||||
- source.fish
|
||||
vendor/grammars/forth:
|
||||
- source.forth
|
||||
vendor/grammars/fortran.tmbundle:
|
||||
- source.fortran
|
||||
- source.fortran.modern
|
||||
vendor/grammars/fsharpbinding:
|
||||
- source.fsharp
|
||||
vendor/grammars/gap-tmbundle/:
|
||||
vendor/grammars/gap-tmbundle:
|
||||
- source.gap
|
||||
vendor/grammars/gdscript:
|
||||
- source.gdscript
|
||||
vendor/grammars/gettext.tmbundle:
|
||||
- source.po
|
||||
vendor/grammars/gnuplot-tmbundle:
|
||||
- source.gnuplot
|
||||
vendor/grammars/go-tmbundle:
|
||||
- source.go
|
||||
vendor/grammars/grace-tmbundle/:
|
||||
vendor/grammars/grace:
|
||||
- source.grace
|
||||
vendor/grammars/gradle.tmbundle:
|
||||
- source.groovy.gradle
|
||||
@@ -247,9 +311,6 @@ vendor/grammars/graphviz.tmbundle:
|
||||
- source.dot
|
||||
vendor/grammars/groovy.tmbundle:
|
||||
- source.groovy
|
||||
vendor/grammars/haskell.tmbundle:
|
||||
- source.haskell
|
||||
- text.tex.latex.haskell
|
||||
vendor/grammars/haxe-sublime-bundle:
|
||||
- source.erazor
|
||||
- source.haxe.2
|
||||
@@ -262,6 +323,8 @@ vendor/grammars/idl.tmbundle:
|
||||
- source.idl
|
||||
- source.idl-dlm
|
||||
- text.idl-idldoc
|
||||
vendor/grammars/idris:
|
||||
- source.idris
|
||||
vendor/grammars/ini.tmbundle:
|
||||
- source.ini
|
||||
vendor/grammars/io.tmbundle:
|
||||
@@ -269,8 +332,8 @@ vendor/grammars/io.tmbundle:
|
||||
vendor/grammars/ioke-outdated:
|
||||
- source.ioke
|
||||
vendor/grammars/jade-tmbundle:
|
||||
- source.jade
|
||||
- source.pyjade
|
||||
- text.jade
|
||||
vendor/grammars/jasmin-sublime:
|
||||
- source.jasmin
|
||||
vendor/grammars/java.tmbundle:
|
||||
@@ -278,42 +341,166 @@ vendor/grammars/java.tmbundle:
|
||||
- source.java-properties
|
||||
- text.html.jsp
|
||||
- text.junit-test-report
|
||||
vendor/grammars/javadoc.tmbundle:
|
||||
- text.html.javadoc
|
||||
vendor/grammars/javascript-objective-j.tmbundle:
|
||||
- source.js.objj
|
||||
vendor/grammars/jquery-tmbundle:
|
||||
- source.js.jquery
|
||||
vendor/grammars/jflex.tmbundle:
|
||||
- source.jflex
|
||||
vendor/grammars/json.tmbundle:
|
||||
- source.json
|
||||
vendor/grammars/kotlin-sublime-package:
|
||||
- source.Kotlin
|
||||
vendor/grammars/language-agc:
|
||||
- source.agc
|
||||
vendor/grammars/language-apl:
|
||||
- source.apl
|
||||
vendor/grammars/language-asn1:
|
||||
- source.asn
|
||||
vendor/grammars/language-babel:
|
||||
- source.js.jsx
|
||||
- source.regexp.babel
|
||||
vendor/grammars/language-ballerina:
|
||||
- source.ballerina
|
||||
vendor/grammars/language-batchfile:
|
||||
- source.batchfile
|
||||
vendor/grammars/language-blade:
|
||||
- text.html.php.blade
|
||||
vendor/grammars/language-click:
|
||||
- source.click
|
||||
vendor/grammars/language-clojure:
|
||||
- source.clojure
|
||||
vendor/grammars/language-closure-templates:
|
||||
- text.html.soy
|
||||
vendor/grammars/language-coffee-script:
|
||||
- source.coffee
|
||||
- source.litcoffee
|
||||
vendor/grammars/language-crystal:
|
||||
- source.crystal
|
||||
- text.html.ecr
|
||||
vendor/grammars/language-csharp:
|
||||
- source.cake
|
||||
- source.cs
|
||||
- source.csx
|
||||
- source.nant-build
|
||||
vendor/grammars/language-csound:
|
||||
- source.csound
|
||||
- source.csound-document
|
||||
- source.csound-score
|
||||
vendor/grammars/language-css:
|
||||
- source.css
|
||||
vendor/grammars/language-emacs-lisp:
|
||||
- source.emacs.lisp
|
||||
vendor/grammars/language-fontforge:
|
||||
- source.afm
|
||||
- source.fontforge
|
||||
- source.opentype
|
||||
- text.sfd
|
||||
vendor/grammars/language-gfm:
|
||||
- source.gfm
|
||||
vendor/grammars/language-hy:
|
||||
- source.hy
|
||||
vendor/grammars/language-gn:
|
||||
- source.gn
|
||||
vendor/grammars/language-graphql:
|
||||
- source.graphql
|
||||
vendor/grammars/language-haml:
|
||||
- text.haml
|
||||
- text.hamlc
|
||||
vendor/grammars/language-haskell:
|
||||
- annotation.liquidhaskell.haskell
|
||||
- hint.haskell
|
||||
- hint.message.haskell
|
||||
- hint.type.haskell
|
||||
- source.c2hs
|
||||
- source.cabal
|
||||
- source.haskell
|
||||
- source.hsc2hs
|
||||
- source.hsig
|
||||
- text.tex.latex.haskell
|
||||
vendor/grammars/language-inform7:
|
||||
- source.inform7
|
||||
vendor/grammars/language-javascript:
|
||||
- source.js
|
||||
- source.js.regexp
|
||||
vendor/grammars/language-python:
|
||||
- source.python
|
||||
- source.regexp.python
|
||||
- text.python.console
|
||||
- text.python.traceback
|
||||
- source.js.regexp.replacement
|
||||
- source.jsdoc
|
||||
vendor/grammars/language-jison:
|
||||
- source.jison
|
||||
- source.jisonlex
|
||||
- source.jisonlex-injection
|
||||
vendor/grammars/language-jolie:
|
||||
- source.jolie
|
||||
vendor/grammars/language-jsoniq:
|
||||
- source.jq
|
||||
- source.xq
|
||||
vendor/grammars/language-less:
|
||||
- source.css.less
|
||||
vendor/grammars/language-maxscript:
|
||||
- source.maxscript
|
||||
vendor/grammars/language-meson:
|
||||
- source.meson
|
||||
vendor/grammars/language-ncl:
|
||||
- source.ncl
|
||||
vendor/grammars/language-ninja:
|
||||
- source.ninja
|
||||
vendor/grammars/language-pan:
|
||||
- source.pan
|
||||
vendor/grammars/language-pcb:
|
||||
- source.gerber
|
||||
- source.pcb.board
|
||||
- source.pcb.schematic
|
||||
- source.pcb.sexp
|
||||
vendor/grammars/language-povray:
|
||||
- source.pov-ray sdl
|
||||
vendor/grammars/language-reason:
|
||||
- source.reason
|
||||
- source.reason.hover.type
|
||||
vendor/grammars/language-regexp:
|
||||
- source.regexp
|
||||
- source.regexp.extended
|
||||
vendor/grammars/language-renpy:
|
||||
- source.renpy
|
||||
vendor/grammars/language-restructuredtext:
|
||||
- text.restructuredtext
|
||||
vendor/grammars/language-ring:
|
||||
- source.ring
|
||||
vendor/grammars/language-roff:
|
||||
- source.ditroff
|
||||
- source.ditroff.desc
|
||||
- source.ideal
|
||||
- source.pic
|
||||
- text.roff
|
||||
- text.runoff
|
||||
vendor/grammars/language-rpm-spec:
|
||||
- source.changelogs.rpm-spec
|
||||
- source.rpm-spec
|
||||
vendor/grammars/language-ruby:
|
||||
- source.ruby
|
||||
- source.ruby.gemfile
|
||||
- text.html.erb
|
||||
vendor/grammars/language-shellscript:
|
||||
- source.shell
|
||||
- text.shell-session
|
||||
vendor/grammars/language-supercollider:
|
||||
- source.supercollider
|
||||
vendor/grammars/language-toc-wow:
|
||||
- source.toc
|
||||
vendor/grammars/language-turing:
|
||||
- source.turing
|
||||
vendor/grammars/language-typelanguage:
|
||||
- source.tl
|
||||
vendor/grammars/language-viml:
|
||||
- source.viml
|
||||
vendor/grammars/language-wavefront:
|
||||
- source.wavefront.mtl
|
||||
- source.wavefront.obj
|
||||
vendor/grammars/language-webassembly:
|
||||
- source.webassembly
|
||||
vendor/grammars/language-xbase:
|
||||
- source.harbour
|
||||
vendor/grammars/language-xcompose:
|
||||
- config.xcompose
|
||||
vendor/grammars/language-yaml:
|
||||
- source.yaml
|
||||
vendor/grammars/language-yang:
|
||||
- source.yang
|
||||
vendor/grammars/latex.tmbundle:
|
||||
- text.bibtex
|
||||
- text.log.latex
|
||||
@@ -321,8 +508,6 @@ vendor/grammars/latex.tmbundle:
|
||||
- text.tex.latex
|
||||
- text.tex.latex.beamer
|
||||
- text.tex.latex.memoir
|
||||
vendor/grammars/less.tmbundle:
|
||||
- source.css.less
|
||||
vendor/grammars/lilypond.tmbundle:
|
||||
- source.lilypond
|
||||
vendor/grammars/liquid.tmbundle:
|
||||
@@ -331,6 +516,8 @@ vendor/grammars/lisp.tmbundle:
|
||||
- source.lisp
|
||||
vendor/grammars/llvm.tmbundle:
|
||||
- source.llvm
|
||||
vendor/grammars/logos:
|
||||
- source.logos
|
||||
vendor/grammars/logtalk.tmbundle:
|
||||
- source.logtalk
|
||||
vendor/grammars/lua.tmbundle:
|
||||
@@ -339,6 +526,8 @@ vendor/grammars/make.tmbundle:
|
||||
- source.makefile
|
||||
vendor/grammars/mako-tmbundle:
|
||||
- text.html.mako
|
||||
vendor/grammars/marko-tmbundle:
|
||||
- text.marko
|
||||
vendor/grammars/mathematica-tmbundle:
|
||||
- source.mathematica
|
||||
vendor/grammars/matlab.tmbundle:
|
||||
@@ -346,20 +535,22 @@ vendor/grammars/matlab.tmbundle:
|
||||
- source.octave
|
||||
vendor/grammars/maven.tmbundle:
|
||||
- text.xml.pom
|
||||
vendor/grammars/mediawiki.tmbundle/:
|
||||
vendor/grammars/mediawiki.tmbundle:
|
||||
- text.html.mediawiki
|
||||
vendor/grammars/mercury-tmlanguage:
|
||||
- source.mercury
|
||||
vendor/grammars/monkey.tmbundle:
|
||||
vendor/grammars/monkey:
|
||||
- source.monkey
|
||||
vendor/grammars/moonscript-tmbundle:
|
||||
- source.moonscript
|
||||
vendor/grammars/nemerle.tmbundle:
|
||||
- source.nemerle
|
||||
vendor/grammars/nesC.tmbundle:
|
||||
vendor/grammars/nesC:
|
||||
- source.nesc
|
||||
vendor/grammars/ninja.tmbundle:
|
||||
- source.ninja
|
||||
vendor/grammars/nix:
|
||||
- source.nix
|
||||
vendor/grammars/nu.tmbundle:
|
||||
- source.nu
|
||||
vendor/grammars/objective-c.tmbundle:
|
||||
- source.objc
|
||||
- source.objc++
|
||||
@@ -374,16 +565,25 @@ vendor/grammars/ooc.tmbundle:
|
||||
- source.ooc
|
||||
vendor/grammars/opa.tmbundle:
|
||||
- source.opa
|
||||
vendor/grammars/openscad.tmbundle:
|
||||
- source.scad
|
||||
vendor/grammars/oz-tmbundle/Syntaxes/Oz.tmLanguage:
|
||||
- source.oz
|
||||
vendor/grammars/parrot:
|
||||
- source.parrot.pir
|
||||
vendor/grammars/pascal.tmbundle:
|
||||
- source.pascal
|
||||
vendor/grammars/pawn-sublime-language:
|
||||
- source.pawn
|
||||
vendor/grammars/perl.tmbundle:
|
||||
- source.perl
|
||||
- source.perl.6
|
||||
vendor/grammars/php-smarty.tmbundle:
|
||||
- source.smarty
|
||||
- text.html.smarty
|
||||
vendor/grammars/php.tmbundle:
|
||||
- text.html.php
|
||||
vendor/grammars/pig-latin:
|
||||
- source.pig_latin
|
||||
vendor/grammars/pike-textmate:
|
||||
- source.pike
|
||||
vendor/grammars/postscript.tmbundle:
|
||||
@@ -392,33 +592,18 @@ vendor/grammars/powershell:
|
||||
- source.powershell
|
||||
vendor/grammars/processing.tmbundle:
|
||||
- source.processing
|
||||
vendor/grammars/prolog.tmbundle:
|
||||
- source.prolog
|
||||
vendor/grammars/protobuf-tmbundle:
|
||||
- source.protobuf
|
||||
vendor/grammars/puppet-textmate-bundle:
|
||||
- source.puppet
|
||||
vendor/grammars/python-django.tmbundle:
|
||||
- source.python.django
|
||||
- text.html.django
|
||||
vendor/grammars/r.tmbundle:
|
||||
- source.r
|
||||
- text.tex.latex.rd
|
||||
vendor/grammars/restructuredtext.tmbundle:
|
||||
- text.restructuredtext
|
||||
vendor/grammars/ruby-haml.tmbundle:
|
||||
- text.haml
|
||||
vendor/grammars/ruby-on-rails-tmbundle:
|
||||
- source.js.erb.rails
|
||||
- source.ruby.rails
|
||||
- source.ruby.rails.rjs
|
||||
- source.sql.ruby
|
||||
- text.html.erb.rails
|
||||
vendor/grammars/rascal-syntax-highlighting:
|
||||
- source.rascal
|
||||
vendor/grammars/ruby-slim.tmbundle:
|
||||
- text.slim
|
||||
vendor/grammars/ruby.tmbundle:
|
||||
- source.ruby
|
||||
- text.html.erb
|
||||
vendor/grammars/sas.tmbundle:
|
||||
- source.SASLog
|
||||
- source.sas
|
||||
@@ -431,61 +616,90 @@ vendor/grammars/scheme.tmbundle:
|
||||
- source.scheme
|
||||
vendor/grammars/scilab.tmbundle:
|
||||
- source.scilab
|
||||
vendor/grammars/secondlife-lsl:
|
||||
- source.lsl
|
||||
vendor/grammars/shaders-tmLanguage:
|
||||
- source.hlsl
|
||||
- source.shaderlab
|
||||
vendor/grammars/smali-sublime:
|
||||
- source.smali
|
||||
vendor/grammars/smalltalk-tmbundle:
|
||||
- source.smalltalk
|
||||
vendor/grammars/sourcepawn:
|
||||
- source.sp
|
||||
vendor/grammars/sql.tmbundle:
|
||||
- source.sql
|
||||
vendor/grammars/squirrel-language:
|
||||
- source.nut
|
||||
vendor/grammars/st2-zonefile:
|
||||
- text.zone_file
|
||||
vendor/grammars/standard-ml.tmbundle:
|
||||
- source.cm
|
||||
- source.ml
|
||||
vendor/grammars/sublime-MuPAD:
|
||||
- source.mupad
|
||||
vendor/grammars/sublime-apl/:
|
||||
- source.apl
|
||||
vendor/grammars/sublime-angelscript:
|
||||
- source.angelscript
|
||||
vendor/grammars/sublime-aspectj:
|
||||
- source.aspectj
|
||||
vendor/grammars/sublime-autoit:
|
||||
- source.autoit
|
||||
vendor/grammars/sublime-befunge:
|
||||
- source.befunge
|
||||
vendor/grammars/sublime-better-typescript:
|
||||
- source.ts
|
||||
vendor/grammars/sublime-bsv:
|
||||
- source.bsv
|
||||
vendor/grammars/sublime-cirru:
|
||||
- source.cirru
|
||||
vendor/grammars/sublime-clips:
|
||||
- source.clips
|
||||
vendor/grammars/sublime-fantom:
|
||||
- source.fan
|
||||
vendor/grammars/sublime-glsl:
|
||||
- source.essl
|
||||
- source.glsl
|
||||
vendor/grammars/sublime-golo/:
|
||||
vendor/grammars/sublime-golo:
|
||||
- source.golo
|
||||
vendor/grammars/sublime-idris:
|
||||
- source.idris
|
||||
vendor/grammars/sublime-mask:
|
||||
- source.mask
|
||||
vendor/grammars/sublime-nearley:
|
||||
- source.ne
|
||||
vendor/grammars/sublime-netlinx:
|
||||
- source.netlinx
|
||||
- source.netlinx.erb
|
||||
vendor/grammars/sublime-nginx:
|
||||
- source.nginx
|
||||
vendor/grammars/sublime-nix:
|
||||
- source.nix
|
||||
vendor/grammars/sublime-opal/:
|
||||
vendor/grammars/sublime-opal:
|
||||
- source.opal
|
||||
- source.opalsysdefs
|
||||
vendor/grammars/sublime-pony:
|
||||
- source.pony
|
||||
vendor/grammars/sublime-rexx:
|
||||
- source.rexx
|
||||
vendor/grammars/sublime-robot-plugin:
|
||||
- text.robot
|
||||
vendor/grammars/sublime-rust:
|
||||
- source.rust
|
||||
vendor/grammars/sublime-sourcepawn:
|
||||
- source.sp
|
||||
vendor/grammars/sublime-spintools/:
|
||||
vendor/grammars/sublime-shen:
|
||||
- source.shen
|
||||
vendor/grammars/sublime-spintools:
|
||||
- source.regexp.spin
|
||||
- source.spin
|
||||
vendor/grammars/sublime-tea:
|
||||
- source.tea
|
||||
vendor/grammars/sublime-text-ox/:
|
||||
vendor/grammars/sublime-terra:
|
||||
- source.terra
|
||||
vendor/grammars/sublime-text-ox:
|
||||
- source.ox
|
||||
vendor/grammars/sublime-varnish:
|
||||
- source.varnish.vcl
|
||||
vendor/grammars/sublime_cobol:
|
||||
- source.acucobol
|
||||
- source.cobol
|
||||
- source.jcl
|
||||
- source.opencobol
|
||||
vendor/grammars/sublime_man_page_support:
|
||||
- source.man
|
||||
- text.groff
|
||||
vendor/grammars/sublimeassembly:
|
||||
- source.assembly
|
||||
vendor/grammars/sublimeprolog:
|
||||
- source.prolog
|
||||
- source.prolog.eclipse
|
||||
vendor/grammars/sublimetext-cuda-cpp:
|
||||
- source.cuda-c++
|
||||
vendor/grammars/swift.tmbundle:
|
||||
@@ -493,13 +707,6 @@ vendor/grammars/swift.tmbundle:
|
||||
vendor/grammars/tcl.tmbundle:
|
||||
- source.tcl
|
||||
- text.html.tcl
|
||||
vendor/grammars/text.tmbundle:
|
||||
- text.plain
|
||||
vendor/grammars/textile.tmbundle:
|
||||
- text.html.textile
|
||||
vendor/grammars/textmate.tmbundle:
|
||||
- source.regexp.oniguruma
|
||||
- source.tm-properties
|
||||
vendor/grammars/thrift.tmbundle:
|
||||
- source.thrift
|
||||
vendor/grammars/toml.tmbundle:
|
||||
@@ -509,8 +716,14 @@ vendor/grammars/turtle.tmbundle:
|
||||
- source.turtle
|
||||
vendor/grammars/verilog.tmbundle:
|
||||
- source.verilog
|
||||
vendor/grammars/x86-assembly-textmate-bundle:
|
||||
- source.asm.x86
|
||||
vendor/grammars/vhdl:
|
||||
- source.vhdl
|
||||
vendor/grammars/vue-syntax-highlight:
|
||||
- text.html.vue
|
||||
vendor/grammars/wdl-sublime-syntax-highlighter:
|
||||
- source.wdl
|
||||
vendor/grammars/xc.tmbundle:
|
||||
- source.xc
|
||||
vendor/grammars/xml.tmbundle:
|
||||
- text.xml
|
||||
- text.xml.xsl
|
||||
|
||||
@@ -1,8 +1,100 @@
|
||||
require 'linguist/blob_helper'
|
||||
require 'linguist/generated'
|
||||
require 'linguist/grammars'
|
||||
require 'linguist/heuristics'
|
||||
require 'linguist/language'
|
||||
require 'linguist/repository'
|
||||
require 'linguist/samples'
|
||||
require 'linguist/shebang'
|
||||
require 'linguist/version'
|
||||
|
||||
class << Linguist
|
||||
# Public: Detects the Language of the blob.
|
||||
#
|
||||
# blob - an object that includes the Linguist `BlobHelper` interface;
|
||||
# see Linguist::LazyBlob and Linguist::FileBlob for examples
|
||||
#
|
||||
# Returns Language or nil.
|
||||
def detect(blob, 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.new
|
||||
#
|
||||
# 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
|
||||
# DEPRECATED Avoid mixing into Blob classes. Prefer functional interfaces
|
||||
# like `Language.detect` over `Blob#language`. Functions are much easier to
|
||||
# like `Linguist.detect` over `Blob#language`. Functions are much easier to
|
||||
# cache and compose.
|
||||
#
|
||||
# Avoid adding additional bloat to this module.
|
||||
@@ -99,7 +99,7 @@ module Linguist
|
||||
elsif name.nil?
|
||||
"attachment"
|
||||
else
|
||||
"attachment; filename=#{EscapeUtils.escape_url(File.basename(name))}"
|
||||
"attachment; filename=#{EscapeUtils.escape_url(name)}"
|
||||
end
|
||||
end
|
||||
|
||||
@@ -233,7 +233,7 @@ module Linguist
|
||||
#
|
||||
# Return true or false
|
||||
def vendored?
|
||||
name =~ VendoredRegexp ? true : false
|
||||
path =~ VendoredRegexp ? true : false
|
||||
end
|
||||
|
||||
documentation_paths = YAML.load_file(File.expand_path("../documentation.yml", __FILE__))
|
||||
@@ -248,7 +248,7 @@ module Linguist
|
||||
#
|
||||
# Return true or false
|
||||
def documentation?
|
||||
name =~ DocumentationRegexp ? true : false
|
||||
path =~ DocumentationRegexp ? true : false
|
||||
end
|
||||
|
||||
# Public: Get each line of data
|
||||
@@ -316,7 +316,7 @@ module Linguist
|
||||
#
|
||||
# Return true or false
|
||||
def generated?
|
||||
@_generated ||= Generated.generated?(name, lambda { data })
|
||||
@_generated ||= Generated.generated?(path, lambda { data })
|
||||
end
|
||||
|
||||
# Public: Detects the Language of the blob.
|
||||
@@ -325,7 +325,7 @@ module Linguist
|
||||
#
|
||||
# Returns a Language or nil if none is detected
|
||||
def language
|
||||
@language ||= Language.detect(self)
|
||||
@language ||= Linguist.detect(self)
|
||||
end
|
||||
|
||||
# Internal: Get the TextMate compatible scope for the blob
|
||||
|
||||
@@ -95,7 +95,7 @@ module Linguist
|
||||
# Returns sorted Array of result pairs. Each pair contains the
|
||||
# String language name and a Float score.
|
||||
def classify(tokens, languages)
|
||||
return [] if tokens.nil?
|
||||
return [] if tokens.nil? || languages.empty?
|
||||
tokens = Tokenizer.tokenize(tokens) if tokens.is_a?(String)
|
||||
scores = {}
|
||||
|
||||
|
||||
@@ -7,13 +7,25 @@
|
||||
# Please add additional test coverage to
|
||||
# `test/test_blob.rb#test_documentation` if you make any changes.
|
||||
|
||||
## Documentation Conventions ##
|
||||
## Documentation directories ##
|
||||
|
||||
- ^docs?/
|
||||
- ^Documentation/
|
||||
- ^[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'
|
||||
|
||||
module Linguist
|
||||
# A FileBlob is a wrapper around a File object to make it quack
|
||||
# like a Grit::Blob. It provides the basic interface: `name`,
|
||||
# `data`, and `size`.
|
||||
class FileBlob
|
||||
# `data`, `path` and `size`.
|
||||
class FileBlob < Blob
|
||||
include BlobHelper
|
||||
|
||||
# Public: Initialize a new FileBlob from a path
|
||||
@@ -14,64 +15,29 @@ module Linguist
|
||||
#
|
||||
# Returns a FileBlob.
|
||||
def initialize(path, base_path = nil)
|
||||
@path = path
|
||||
@name = base_path ? path.sub("#{base_path}/", '') : path
|
||||
@fullpath = path
|
||||
@path = base_path ? path.sub("#{base_path}/", '') : path
|
||||
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
|
||||
#
|
||||
# Returns a String like '100644'
|
||||
def mode
|
||||
File.stat(@path).mode.to_s(8)
|
||||
File.stat(@fullpath).mode.to_s(8)
|
||||
end
|
||||
|
||||
# Public: Read file contents.
|
||||
#
|
||||
# Returns a String.
|
||||
def data
|
||||
File.read(@path)
|
||||
File.read(@fullpath)
|
||||
end
|
||||
|
||||
# Public: Get byte size
|
||||
#
|
||||
# Returns an Integer.
|
||||
def size
|
||||
File.size(@path)
|
||||
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
|
||||
File.size(@fullpath)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -3,7 +3,7 @@ module Linguist
|
||||
# Public: Is the blob a generated file?
|
||||
#
|
||||
# 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
|
||||
# pass in a String.
|
||||
#
|
||||
@@ -53,18 +53,36 @@ module Linguist
|
||||
def generated?
|
||||
xcode_file? ||
|
||||
generated_net_designer_file? ||
|
||||
generated_net_specflow_feature_file? ||
|
||||
composer_lock? ||
|
||||
node_modules? ||
|
||||
go_vendor? ||
|
||||
npm_shrinkwrap_or_package_lock? ||
|
||||
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_module? ||
|
||||
generated_unity3d_meta? ||
|
||||
generated_racc? ||
|
||||
generated_jflex? ||
|
||||
generated_grammarkit? ||
|
||||
generated_roxygen2? ||
|
||||
generated_jison? ||
|
||||
generated_yarn_lock? ||
|
||||
generated_grpc_cpp?
|
||||
end
|
||||
|
||||
# Internal: Is the blob an Xcode file?
|
||||
@@ -94,6 +112,35 @@ module Linguist
|
||||
end
|
||||
end
|
||||
|
||||
# Internal: Does the blob contain a source map reference?
|
||||
#
|
||||
# We assume that if one of the last 2 lines starts with a source map
|
||||
# reference, then the current file was generated from other files.
|
||||
#
|
||||
# We use the last 2 lines because the last line might be empty.
|
||||
#
|
||||
# We only handle JavaScript, no CSS support yet.
|
||||
#
|
||||
# Returns true or false.
|
||||
def has_source_map?
|
||||
return false unless extname.downcase == '.js'
|
||||
lines.last(2).any? { |line| line.start_with?('//# sourceMappingURL') }
|
||||
end
|
||||
|
||||
# Internal: Is the blob a generated source map?
|
||||
#
|
||||
# Source Maps usually have .css.map or .js.map extensions. In case they
|
||||
# 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?
|
||||
#
|
||||
# CoffeeScript is meant to output JS that would be difficult to
|
||||
@@ -162,6 +209,17 @@ module Linguist
|
||||
name.downcase =~ /\.designer\.cs$/
|
||||
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?
|
||||
#
|
||||
# PEG.js-generated parsers are not meant to be consumed by humans.
|
||||
@@ -186,7 +244,11 @@ module Linguist
|
||||
#
|
||||
# Returns true or false.
|
||||
def generated_postscript?
|
||||
return false unless ['.ps', '.eps'].include? extname
|
||||
return false unless ['.ps', '.eps', '.pfa'].include? extname
|
||||
|
||||
# Type 1 and Type 42 fonts converted to PostScript are stored as hex-encoded byte streams; these
|
||||
# streams are always preceded the `eexec` operator (if Type 1), or the `/sfnts` key (if Type 42).
|
||||
return true if data =~ /(\n|\r\n|\r)\s*(?:currentfile eexec\s+|\/sfnts\s+\[\1<)\h{8,}\1/
|
||||
|
||||
# We analyze the "%%Creator:" comment, which contains the author/generator
|
||||
# of the file. If there is one, it should be in one of the first few lines.
|
||||
@@ -196,23 +258,55 @@ module Linguist
|
||||
# Most generators write their version number, while human authors' or companies'
|
||||
# names don't contain numbers. So look if the line contains digits. Also
|
||||
# look for some special cases without version numbers.
|
||||
return creator =~ /[0-9]/ ||
|
||||
creator.include?("mpage") ||
|
||||
creator.include?("draw") ||
|
||||
creator.include?("ImageMagick")
|
||||
return true if creator =~ /[0-9]|draw|mpage|ImageMagick|inkscape|MATLAB/ ||
|
||||
creator =~ /PCBNEW|pnmtops|\(Unknown\)|Serif Affinity|Filterimage -tops/
|
||||
|
||||
# EAGLE doesn't include a version number when it generates PostScript.
|
||||
# However, it does prepend its name to the document's "%%Title" field.
|
||||
!!creator.include?("EAGLE") and lines[0..4].find {|line| line =~ /^%%Title: EAGLE Drawing /}
|
||||
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
|
||||
# Protocol Buffer compiler?
|
||||
#
|
||||
# Returns true of false.
|
||||
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 lines[0].include?("Generated by the protocol buffer compiler. DO NOT EDIT!")
|
||||
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?
|
||||
#
|
||||
# Returns true of false.
|
||||
@@ -231,6 +325,21 @@ module Linguist
|
||||
!!name.match(/node_modules\//)
|
||||
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 or package lock file?
|
||||
#
|
||||
# Returns true or false.
|
||||
def npm_shrinkwrap_or_package_lock?
|
||||
name.match(/npm-shrinkwrap\.json/) || name.match(/package-lock\.json/)
|
||||
end
|
||||
|
||||
# Internal: Is the blob part of Godeps/,
|
||||
# which are not meant for humans in pull requests.
|
||||
#
|
||||
@@ -246,7 +355,7 @@ module Linguist
|
||||
!!name.match(/composer\.lock/)
|
||||
end
|
||||
|
||||
# Internal: Is the blob a generated by Zephir
|
||||
# Internal: Is the blob generated by Zephir?
|
||||
#
|
||||
# Returns true or false.
|
||||
def generated_by_zephir?
|
||||
@@ -262,5 +371,143 @@ module Linguist
|
||||
# VCR Cassettes have "recorded_with: VCR" in the second last line.
|
||||
return lines[-2].include?("recorded_with: VCR")
|
||||
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
|
||||
|
||||
# Internal: Is this a protobuf/grpc-generated C++ file?
|
||||
#
|
||||
# A generated file contains:
|
||||
# // Generated by the gRPC C++ plugin.
|
||||
# on the first line.
|
||||
#
|
||||
# Return true or false
|
||||
def generated_grpc_cpp?
|
||||
return false unless %w{.cpp .hpp .h .cc}.include? extname
|
||||
return false unless lines.count > 1
|
||||
return lines[0].start_with?("// Generated by the gRPC")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,6 +1,3 @@
|
||||
# Note: This file is included in the github-linguist-grammars gem, not the
|
||||
# github-linguist gem.
|
||||
|
||||
module Linguist
|
||||
module Grammars
|
||||
# Get the path to the directory containing the language grammar JSON files.
|
||||
|
||||
@@ -13,11 +13,13 @@ module Linguist
|
||||
# ])
|
||||
#
|
||||
# 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
|
||||
|
||||
@heuristics.each do |heuristic|
|
||||
return Array(heuristic.call(data)) if heuristic.matches?(languages)
|
||||
if heuristic.matches?(blob.name, candidates)
|
||||
return Array(heuristic.call(data))
|
||||
end
|
||||
end
|
||||
|
||||
[] # No heuristics matched
|
||||
@@ -25,35 +27,42 @@ module Linguist
|
||||
|
||||
# Internal: Define a new heuristic.
|
||||
#
|
||||
# languages - String names of languages to disambiguate.
|
||||
# exts_and_langs - String names of file extensions and languages to
|
||||
# disambiguate.
|
||||
# heuristic - Block which takes data as an argument and returns a Language or nil.
|
||||
#
|
||||
# Examples
|
||||
#
|
||||
# disambiguate "Perl", "Prolog" do |data|
|
||||
# disambiguate ".pm" do |data|
|
||||
# if data.include?("use strict")
|
||||
# Language["Perl"]
|
||||
# elsif data.include?(":-")
|
||||
# elsif /^[^#]+:-/.match(data)
|
||||
# Language["Prolog"]
|
||||
# end
|
||||
# end
|
||||
#
|
||||
def self.disambiguate(*languages, &heuristic)
|
||||
@heuristics << new(languages, &heuristic)
|
||||
def self.disambiguate(*exts_and_langs, &heuristic)
|
||||
@heuristics << new(exts_and_langs, &heuristic)
|
||||
end
|
||||
|
||||
# Internal: Array of defined heuristics
|
||||
@heuristics = []
|
||||
|
||||
# Internal
|
||||
def initialize(languages, &heuristic)
|
||||
@languages = languages
|
||||
def initialize(exts_and_langs, &heuristic)
|
||||
@exts_and_langs, @candidates = exts_and_langs.partition {|e| e =~ /\A\./}
|
||||
@heuristic = heuristic
|
||||
end
|
||||
|
||||
# Internal: Check if this heuristic matches the candidate languages.
|
||||
def matches?(candidates)
|
||||
candidates.any? && candidates.all? { |l| @languages.include?(l.name) }
|
||||
# Internal: Check if this heuristic matches the candidate filenames or
|
||||
# languages.
|
||||
def matches?(filename, candidates)
|
||||
filename = filename.downcase
|
||||
candidates = candidates.compact.map(&:name)
|
||||
@exts_and_langs.any? { |ext| filename.end_with?(ext) } ||
|
||||
(candidates.any? &&
|
||||
(@candidates - candidates == [] &&
|
||||
candidates - @candidates == []))
|
||||
end
|
||||
|
||||
# Internal: Perform the heuristic
|
||||
@@ -62,9 +71,27 @@ module Linguist
|
||||
end
|
||||
|
||||
# Common heuristics
|
||||
ObjectiveCRegex = /^[ \t]*@(interface|class|protocol|property|end|synchronised|selector|implementation)\b/
|
||||
ObjectiveCRegex = /^\s*(@(interface|class|protocol|property|end|synchronised|selector|implementation)\b|#import\s+.+\.h[">])/
|
||||
|
||||
disambiguate "BitBake", "BlitzBasic" do |data|
|
||||
disambiguate ".as" do |data|
|
||||
if /^\s*(package\s+[a-z0-9_\.]+|import\s+[a-zA-Z0-9_\.]+;|class\s+[A-Za-z0-9_]+\s+extends\s+[A-Za-z0-9_]+)/.match(data)
|
||||
Language["ActionScript"]
|
||||
else
|
||||
Language["AngelScript"]
|
||||
end
|
||||
end
|
||||
|
||||
disambiguate ".asc" do |data|
|
||||
if /^(----[- ]BEGIN|ssh-(rsa|dss)) /.match(data)
|
||||
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
|
||||
|
||||
disambiguate ".bb" do |data|
|
||||
if /^\s*; /.match(data) || data.include?("End Function")
|
||||
Language["BlitzBasic"]
|
||||
elsif /^\s*(# |include|require)\b/.match(data)
|
||||
@@ -72,60 +99,22 @@ module Linguist
|
||||
end
|
||||
end
|
||||
|
||||
disambiguate "C#", "Smalltalk" do |data|
|
||||
if /![\w\s]+methodsFor: /.match(data)
|
||||
Language["Smalltalk"]
|
||||
elsif /^\s*namespace\s*[\w\.]+\s*{/.match(data) || /^\s*\/\//.match(data)
|
||||
Language["C#"]
|
||||
end
|
||||
end
|
||||
|
||||
disambiguate "Objective-C", "C++", "C" 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 "Perl", "Perl6", "Prolog" do |data|
|
||||
if data.include?("use v6")
|
||||
Language["Perl6"]
|
||||
elsif data.match(/use strict|use\s+v?5\./)
|
||||
Language["Perl"]
|
||||
elsif data.include?(":-")
|
||||
Language["Prolog"]
|
||||
end
|
||||
end
|
||||
|
||||
disambiguate "ECL", "Prolog" do |data|
|
||||
if data.include?(":-")
|
||||
Language["Prolog"]
|
||||
elsif data.include?(":=")
|
||||
Language["ECL"]
|
||||
end
|
||||
end
|
||||
|
||||
disambiguate "IDL", "Prolog" do |data|
|
||||
if data.include?(":-")
|
||||
Language["Prolog"]
|
||||
disambiguate ".builds" do |data|
|
||||
if /^(\s*)(<Project|<Import|<Property|<?xml|xmlns)/i.match(data)
|
||||
Language["XML"]
|
||||
else
|
||||
Language["IDL"]
|
||||
Language["Text"]
|
||||
end
|
||||
end
|
||||
|
||||
disambiguate "GAP", "Scilab" 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"]
|
||||
disambiguate ".ch" do |data|
|
||||
if /^\s*#\s*(if|ifdef|ifndef|define|command|xcommand|translate|xtranslate|include|pragma|undef)\b/i.match(data)
|
||||
Language["xBase"]
|
||||
end
|
||||
end
|
||||
|
||||
disambiguate "Common Lisp", "OpenCL", "Cool" do |data|
|
||||
if data.include?("(defun ")
|
||||
disambiguate ".cl" do |data|
|
||||
if /^\s*\((defun|in-package|defpackage) /i.match(data)
|
||||
Language["Common Lisp"]
|
||||
elsif /^class/x.match(data)
|
||||
Language["Cool"]
|
||||
@@ -134,87 +123,74 @@ module Linguist
|
||||
end
|
||||
end
|
||||
|
||||
disambiguate "Hack", "PHP" do |data|
|
||||
if data.include?("<?hh")
|
||||
Language["Hack"]
|
||||
elsif /<?[^h]/.match(data)
|
||||
Language["PHP"]
|
||||
disambiguate ".cls" do |data|
|
||||
if /\\\w+{/.match(data)
|
||||
Language["TeX"]
|
||||
end
|
||||
end
|
||||
|
||||
disambiguate "Scala", "SuperCollider" do |data|
|
||||
if /\^(this|super)\./.match(data) || /^\s*(\+|\*)\s*\w+\s*{/.match(data) || /^\s*~\w+\s*=\./.match(data)
|
||||
Language["SuperCollider"]
|
||||
elsif /^\s*import (scala|java)\./.match(data) || /^\s*val\s+\w+\s*=/.match(data) || /^\s*class\b/.match(data)
|
||||
Language["Scala"]
|
||||
disambiguate ".cs" do |data|
|
||||
if /![\w\s]+methodsFor: /.match(data)
|
||||
Language["Smalltalk"]
|
||||
elsif /^\s*namespace\s*[\w\.]+\s*{/.match(data) || /^\s*\/\//.match(data)
|
||||
Language["C#"]
|
||||
end
|
||||
end
|
||||
|
||||
disambiguate "AsciiDoc", "AGS Script" do |data|
|
||||
Language["AsciiDoc"] if /^=+(\s|\n)/.match(data)
|
||||
disambiguate ".d" do |data|
|
||||
# see http://dlang.org/spec/grammar
|
||||
# ModuleDeclaration | ImportDeclaration | FuncDeclaration | unittest
|
||||
if /^module\s+[\w.]*\s*;|import\s+[\w\s,.:]*;|\w+\s+\w+\s*\(.*\)(?:\(.*\))?\s*{[^}]*}|unittest\s*(?:\(.*\))?\s*{[^}]*}/.match(data)
|
||||
Language["D"]
|
||||
# see http://dtrace.org/guide/chp-prog.html, http://dtrace.org/guide/chp-profile.html, http://dtrace.org/guide/chp-opt.html
|
||||
elsif /^(\w+:\w*:\w*:\w*|BEGIN|END|provider\s+|(tick|profile)-\w+\s+{[^}]*}|#pragma\s+D\s+(option|attributes|depends_on)\s|#pragma\s+ident\s)/.match(data)
|
||||
Language["DTrace"]
|
||||
# path/target : dependency \
|
||||
# target : \
|
||||
# : dependency
|
||||
# path/file.ext1 : some/path/../file.ext2
|
||||
elsif /([\/\\].*:\s+.*\s\\$|: \\$|^ : |^[\w\s\/\\.]+\w+\.\w+\s*:\s+[\w\s\/\\.]+\w+\.\w+)/.match(data)
|
||||
Language["Makefile"]
|
||||
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)
|
||||
Language["Forth"]
|
||||
elsif /^([c*][^a-z]| (subroutine|program)\s|\s*!)/i.match(data)
|
||||
Language["FORTRAN"]
|
||||
elsif data.include?("flowop")
|
||||
Language["Filebench WML"]
|
||||
elsif fortran_rx.match(data)
|
||||
Language["Fortran"]
|
||||
end
|
||||
end
|
||||
|
||||
disambiguate "F#", "Forth", "GLSL" do |data|
|
||||
if /^(: |new-device)/.match(data)
|
||||
disambiguate ".for" do |data|
|
||||
if /^: /.match(data)
|
||||
Language["Forth"]
|
||||
elsif /^\s*(#light|import|let|module|namespace|open|type)/.match(data)
|
||||
Language["F#"]
|
||||
elsif /^\s*(#include|#pragma|precision|uniform|varying|void)/.match(data)
|
||||
Language["GLSL"]
|
||||
elsif fortran_rx.match(data)
|
||||
Language["Fortran"]
|
||||
end
|
||||
end
|
||||
|
||||
disambiguate "M", "Mathematica", "Matlab", "Mercury", "Objective-C" do |data|
|
||||
if ObjectiveCRegex.match(data)
|
||||
Language["Objective-C"]
|
||||
elsif data.include?(":- module")
|
||||
Language["Mercury"]
|
||||
elsif /^\s*;/.match(data)
|
||||
Language["M"]
|
||||
elsif /^\s*\(\*/.match(data)
|
||||
Language["Mathematica"]
|
||||
elsif /^\s*%/.match(data)
|
||||
Language["Matlab"]
|
||||
end
|
||||
end
|
||||
|
||||
disambiguate "Gosu", "JavaScript" do |data|
|
||||
Language["Gosu"] if /^uses java\./.match(data)
|
||||
end
|
||||
|
||||
disambiguate "LoomScript", "LiveScript" do |data|
|
||||
if /^\s*package\s*[\w\.\/\*\s]*\s*{/.match(data)
|
||||
Language["LoomScript"]
|
||||
else
|
||||
Language["LiveScript"]
|
||||
end
|
||||
end
|
||||
|
||||
disambiguate "Common Lisp", "NewLisp" do |data|
|
||||
if /^\s*\((defun|in-package|defpackage) /.match(data)
|
||||
Language["Common Lisp"]
|
||||
elsif /^\s*\(define /.match(data)
|
||||
Language["NewLisp"]
|
||||
end
|
||||
end
|
||||
|
||||
disambiguate "TypeScript", "XML" do |data|
|
||||
if data.include?("<TS ")
|
||||
Language["XML"]
|
||||
else
|
||||
Language["TypeScript"]
|
||||
end
|
||||
end
|
||||
|
||||
disambiguate "Frege", "Forth", "Text" do |data|
|
||||
disambiguate ".fr" do |data|
|
||||
if /^(: |also |new-device|previous )/.match(data)
|
||||
Language["Forth"]
|
||||
elsif /^\s*(import|module|package|data|type) /.match(data)
|
||||
@@ -223,5 +199,306 @@ module Linguist
|
||||
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)
|
||||
end
|
||||
|
||||
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["Roff"]
|
||||
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)
|
||||
Language["LoomScript"]
|
||||
else
|
||||
Language["LiveScript"]
|
||||
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["Roff"]
|
||||
elsif /(?<!\S)\.(include|globa?l)\s/.match(data) || /(?<!\/\*)(\A|\n)\s*\.[A-Za-z][_A-Za-z0-9]*:/.match(data.gsub(/"([^\\"]|\\.)*"|'([^\\']|\\.)*'|\\\s*(?:--.*)?\n/, ""))
|
||||
Language["Unix Assembly"]
|
||||
else
|
||||
Language["MAXScript"]
|
||||
end
|
||||
end
|
||||
|
||||
disambiguate ".n" do |data|
|
||||
if /^[.']/.match(data)
|
||||
Language["Roff"]
|
||||
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["Perl 6"]
|
||||
end
|
||||
end
|
||||
|
||||
disambiguate ".pm" do |data|
|
||||
if /\buse\s+(?:strict\b|v?5\.)/.match(data)
|
||||
Language["Perl"]
|
||||
elsif /^\s*(?:use\s+v6\s*;|(?:\bmy\s+)?class|module)\b/.match(data)
|
||||
Language["Perl 6"]
|
||||
elsif /^\s*\/\* XPM \*\//.match(data)
|
||||
Language["XPM"]
|
||||
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["Roff"]
|
||||
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*%[ \t]+|^\s*var\s+\w+\s*:=\s*\w+/.match(data)
|
||||
Language["Turing"]
|
||||
elsif /^\s*(?:use\s+v6\s*;|\bmodule\b|\b(?:my\s+)?class\b)/.match(data)
|
||||
Language["Perl 6"]
|
||||
elsif /\buse\s+(?:strict\b|v?5\.)/.match(data)
|
||||
Language["Perl"]
|
||||
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 /<TS\b/.match(data)
|
||||
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
|
||||
|
||||
disambiguate ".w" do |data|
|
||||
if (data.include?("&ANALYZE-SUSPEND _UIB-CODE-BLOCK _CUSTOM _DEFINITIONS"))
|
||||
Language["OpenEdge ABL"]
|
||||
elsif /^@(<|\w+\.)/.match(data)
|
||||
Language["CWeb"]
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
@@ -11,6 +11,7 @@ require 'linguist/samples'
|
||||
require 'linguist/file_blob'
|
||||
require 'linguist/blob_helper'
|
||||
require 'linguist/strategy/filename'
|
||||
require 'linguist/strategy/extension'
|
||||
require 'linguist/strategy/modeline'
|
||||
require 'linguist/shebang'
|
||||
|
||||
@@ -20,10 +21,11 @@ module Linguist
|
||||
#
|
||||
# Languages are defined in `lib/linguist/languages.yml`.
|
||||
class Language
|
||||
@languages = []
|
||||
@index = {}
|
||||
@name_index = {}
|
||||
@alias_index = {}
|
||||
@languages = []
|
||||
@index = {}
|
||||
@name_index = {}
|
||||
@alias_index = {}
|
||||
@language_id_index = {}
|
||||
|
||||
@extension_index = Hash.new { |h,k| h[k] = [] }
|
||||
@interpreter_index = Hash.new { |h,k| h[k] = [] }
|
||||
@@ -73,7 +75,7 @@ module Linguist
|
||||
raise ArgumentError, "Extension is missing a '.': #{extension.inspect}"
|
||||
end
|
||||
|
||||
@extension_index[extension] << language
|
||||
@extension_index[extension.downcase] << language
|
||||
end
|
||||
|
||||
language.interpreters.each do |interpreter|
|
||||
@@ -84,42 +86,11 @@ module Linguist
|
||||
@filename_index[filename] << language
|
||||
end
|
||||
|
||||
@language_id_index[language.language_id] = language
|
||||
|
||||
language
|
||||
end
|
||||
|
||||
STRATEGIES = [
|
||||
Linguist::Strategy::Modeline,
|
||||
Linguist::Shebang,
|
||||
Linguist::Strategy::Filename,
|
||||
Linguist::Heuristics,
|
||||
Linguist::Classifier
|
||||
]
|
||||
|
||||
# Public: Detects the Language of the blob.
|
||||
#
|
||||
# blob - an object that includes the Linguist `BlobHelper` interface;
|
||||
# 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
|
||||
#
|
||||
# Returns an Array of Languages
|
||||
@@ -138,7 +109,8 @@ module Linguist
|
||||
#
|
||||
# Returns the Language or nil if none was found.
|
||||
def self.find_by_name(name)
|
||||
name && @name_index[name.downcase]
|
||||
return nil if !name.is_a?(String) || name.to_s.empty?
|
||||
name && (@name_index[name.downcase] || @name_index[name.split(',').first.downcase])
|
||||
end
|
||||
|
||||
# Public: Look up Language by one of its aliases.
|
||||
@@ -152,51 +124,52 @@ module Linguist
|
||||
#
|
||||
# Returns the Language or nil if none was found.
|
||||
def self.find_by_alias(name)
|
||||
name && @alias_index[name.downcase]
|
||||
return nil if !name.is_a?(String) || name.to_s.empty?
|
||||
name && (@alias_index[name.downcase] || @alias_index[name.split(',').first.downcase])
|
||||
end
|
||||
|
||||
# Public: Look up Languages by filename.
|
||||
#
|
||||
# The behaviour of this method recently changed.
|
||||
# See the second example below.
|
||||
#
|
||||
# filename - The path String.
|
||||
#
|
||||
# Examples
|
||||
#
|
||||
# Language.find_by_filename('Cakefile')
|
||||
# # => [#<Language name="CoffeeScript">]
|
||||
# Language.find_by_filename('foo.rb')
|
||||
# # => [#<Language name="Ruby">]
|
||||
# # => []
|
||||
#
|
||||
# Returns all matching Languages or [] if none were found.
|
||||
def self.find_by_filename(filename)
|
||||
basename = File.basename(filename)
|
||||
|
||||
# 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
|
||||
@filename_index[basename]
|
||||
end
|
||||
|
||||
# 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
|
||||
#
|
||||
# Language.find_by_extension('.rb')
|
||||
# Language.find_by_extension('dummy.rb')
|
||||
# # => [#<Language name="Ruby">]
|
||||
#
|
||||
# Language.find_by_extension('rb')
|
||||
# # => [#<Language name="Ruby">]
|
||||
# # => []
|
||||
#
|
||||
# Returns all matching Languages or [] if none were found.
|
||||
def self.find_by_extension(extname)
|
||||
extname = ".#{extname}" unless extname.start_with?(".")
|
||||
@extension_index[extname]
|
||||
end
|
||||
def self.find_by_extension(filename)
|
||||
# find the first extension with language definitions
|
||||
extname = FileBlob.new(filename.downcase).extensions.detect do |e|
|
||||
!@extension_index[e].empty?
|
||||
end
|
||||
|
||||
# DEPRECATED
|
||||
def self.find_by_shebang(data)
|
||||
@interpreter_index[Shebang.interpreter(data)]
|
||||
@extension_index[extname]
|
||||
end
|
||||
|
||||
# Public: Look up Languages by interpreter.
|
||||
@@ -213,6 +186,19 @@ module Linguist
|
||||
@interpreter_index[interpreter]
|
||||
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.
|
||||
#
|
||||
@@ -228,7 +214,15 @@ module Linguist
|
||||
#
|
||||
# Returns the Language or nil if none was found.
|
||||
def self.[](name)
|
||||
name && @index[name.downcase]
|
||||
return nil if !name.is_a?(String) || 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
|
||||
|
||||
# Public: A List of popular languages
|
||||
@@ -262,17 +256,6 @@ module Linguist
|
||||
@colors ||= all.select(&:color).sort_by { |lang| lang.name.downcase }
|
||||
end
|
||||
|
||||
# Public: A List of languages compatible with Ace.
|
||||
#
|
||||
# TODO: Remove this method in a 5.x release. Every language now needs an ace_mode
|
||||
# key, so this function isn't doing anything unique anymore.
|
||||
#
|
||||
# Returns an Array of Languages.
|
||||
def self.ace_modes
|
||||
warn "This method will be deprecated in a future 5.x release. Every language now has an `ace_mode` set."
|
||||
@ace_modes ||= all.select(&:ace_mode).sort_by { |lang| lang.name.downcase }
|
||||
end
|
||||
|
||||
# Internal: Initialize a new Language
|
||||
#
|
||||
# attributes - A hash of attributes
|
||||
@@ -289,7 +272,7 @@ module Linguist
|
||||
@color = attributes[:color]
|
||||
|
||||
# Set aliases
|
||||
@aliases = [default_alias_name] + (attributes[:aliases] || [])
|
||||
@aliases = [default_alias] + (attributes[:aliases] || [])
|
||||
|
||||
# Load the TextMate scope name or try to guess one
|
||||
@tm_scope = attributes[:tm_scope] || begin
|
||||
@@ -303,10 +286,12 @@ module Linguist
|
||||
end
|
||||
|
||||
@ace_mode = attributes[:ace_mode]
|
||||
@codemirror_mode = attributes[:codemirror_mode]
|
||||
@codemirror_mime_type = attributes[:codemirror_mime_type]
|
||||
@wrap = attributes[:wrap] || false
|
||||
|
||||
# Set legacy search term
|
||||
@search_term = attributes[:search_term] || default_alias_name
|
||||
# Set the language_id
|
||||
@language_id = attributes[:language_id]
|
||||
|
||||
# Set extensions or default to [].
|
||||
@extensions = attributes[:extensions] || []
|
||||
@@ -359,16 +344,16 @@ module Linguist
|
||||
# Returns an Array of String names
|
||||
attr_reader :aliases
|
||||
|
||||
# Deprecated: Get code search term
|
||||
# Public: Get language_id (used in GitHub search)
|
||||
#
|
||||
# Examples
|
||||
#
|
||||
# # => "ruby"
|
||||
# # => "python"
|
||||
# # => "perl"
|
||||
# # => "1"
|
||||
# # => "2"
|
||||
# # => "3"
|
||||
#
|
||||
# Returns the name String
|
||||
attr_reader :search_term
|
||||
# Returns the integer language_id
|
||||
attr_reader :language_id
|
||||
|
||||
# Public: Get the name of a TextMate-compatible scope
|
||||
#
|
||||
@@ -386,6 +371,31 @@ module Linguist
|
||||
# Returns a String name or nil
|
||||
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
|
||||
#
|
||||
# Returns true or false
|
||||
@@ -418,22 +428,6 @@ module Linguist
|
||||
# Returns the extensions Array
|
||||
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.
|
||||
#
|
||||
# Examples
|
||||
@@ -447,12 +441,13 @@ module Linguist
|
||||
EscapeUtils.escape_url(name).gsub('+', '%20')
|
||||
end
|
||||
|
||||
# Internal: Get default alias name
|
||||
# Public: Get default alias name
|
||||
#
|
||||
# Returns the alias name String
|
||||
def default_alias_name
|
||||
def default_alias
|
||||
name.downcase.gsub(/\s/, '-')
|
||||
end
|
||||
alias_method :default_alias_name, :default_alias
|
||||
|
||||
# Public: Get Language group
|
||||
#
|
||||
@@ -528,8 +523,8 @@ module Linguist
|
||||
|
||||
if extnames = extensions[name]
|
||||
extnames.each do |extname|
|
||||
if !options['extensions'].index { |x| x.end_with? extname }
|
||||
warn "#{name} has a sample with extension (#{extname}) that isn't explicitly defined in languages.yml" unless extname == '.script!'
|
||||
if !options['extensions'].index { |x| x.downcase.end_with? extname.downcase }
|
||||
warn "#{name} has a sample with extension (#{extname.downcase}) that isn't explicitly defined in languages.yml"
|
||||
options['extensions'] << extname
|
||||
end
|
||||
end
|
||||
@@ -562,10 +557,12 @@ module Linguist
|
||||
:aliases => options['aliases'],
|
||||
:tm_scope => options['tm_scope'],
|
||||
:ace_mode => options['ace_mode'],
|
||||
:codemirror_mode => options['codemirror_mode'],
|
||||
:codemirror_mime_type => options['codemirror_mime_type'],
|
||||
:wrap => options['wrap'],
|
||||
:group_name => options['group'],
|
||||
:searchable => options.fetch('searchable', true),
|
||||
:search_term => options['search_term'],
|
||||
:language_id => options['language_id'],
|
||||
:extensions => Array(options['extensions']),
|
||||
:interpreters => options['interpreters'].sort,
|
||||
:filenames => options['filenames'],
|
||||
|
||||
4661
lib/linguist/languages.yml
Normal file → Executable file
4661
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
|
||||
class LazyBlob
|
||||
GIT_ATTR = ['linguist-documentation', 'linguist-language', 'linguist-vendored']
|
||||
GIT_ATTR = ['linguist-documentation',
|
||||
'linguist-language',
|
||||
'linguist-vendored',
|
||||
'linguist-generated']
|
||||
|
||||
GIT_ATTR_OPTS = { :priority => [:index], :skip_system => true }
|
||||
GIT_ATTR_FLAGS = Rugged::Repository::Attributes.parse_opts(GIT_ATTR_OPTS)
|
||||
|
||||
@@ -14,14 +18,17 @@ module Linguist
|
||||
|
||||
attr_reader :repository
|
||||
attr_reader :oid
|
||||
attr_reader :name
|
||||
attr_reader :path
|
||||
attr_reader :mode
|
||||
|
||||
def initialize(repo, oid, name, mode = nil)
|
||||
alias :name :path
|
||||
|
||||
def initialize(repo, oid, path, mode = nil)
|
||||
@repository = repo
|
||||
@oid = oid
|
||||
@name = name
|
||||
@path = path
|
||||
@mode = mode
|
||||
@data = nil
|
||||
end
|
||||
|
||||
def git_attributes
|
||||
@@ -29,14 +36,6 @@ module Linguist
|
||||
name, GIT_ATTR, GIT_ATTR_FLAGS)
|
||||
end
|
||||
|
||||
def vendored?
|
||||
if attr = git_attributes['linguist-vendored']
|
||||
return boolean_attribute(attr)
|
||||
else
|
||||
return super
|
||||
end
|
||||
end
|
||||
|
||||
def documentation?
|
||||
if attr = git_attributes['linguist-documentation']
|
||||
boolean_attribute(attr)
|
||||
@@ -45,11 +44,27 @@ module Linguist
|
||||
end
|
||||
end
|
||||
|
||||
def generated?
|
||||
if attr = git_attributes['linguist-generated']
|
||||
boolean_attribute(attr)
|
||||
else
|
||||
super
|
||||
end
|
||||
end
|
||||
|
||||
def vendored?
|
||||
if attr = git_attributes['linguist-vendored']
|
||||
return boolean_attribute(attr)
|
||||
else
|
||||
super
|
||||
end
|
||||
end
|
||||
|
||||
def language
|
||||
return @language if defined?(@language)
|
||||
|
||||
@language = if lang = git_attributes['linguist-language']
|
||||
Language.find_by_name(lang)
|
||||
Language.find_by_alias(lang)
|
||||
else
|
||||
super
|
||||
end
|
||||
@@ -65,11 +80,15 @@ module Linguist
|
||||
@size
|
||||
end
|
||||
|
||||
def cleanup!
|
||||
@data.clear if @data
|
||||
end
|
||||
|
||||
protected
|
||||
|
||||
# Returns true if the attribute is present and not the string "false".
|
||||
def boolean_attribute(attr)
|
||||
attr != "false"
|
||||
def boolean_attribute(attribute)
|
||||
attribute != "false"
|
||||
end
|
||||
|
||||
def load_blob!
|
||||
|
||||
@@ -9,21 +9,21 @@
|
||||
- CSS
|
||||
- Clojure
|
||||
- CoffeeScript
|
||||
- Common Lisp
|
||||
- Diff
|
||||
- Emacs Lisp
|
||||
- Erlang
|
||||
- Go
|
||||
- HTML
|
||||
- Haskell
|
||||
- Java
|
||||
- JavaScript
|
||||
- Lua
|
||||
- Matlab
|
||||
- Objective-C
|
||||
- PHP
|
||||
- Perl
|
||||
- Python
|
||||
- R
|
||||
- Ruby
|
||||
- SQL
|
||||
- Scala
|
||||
- Scheme
|
||||
- Shell
|
||||
- Swift
|
||||
- TeX
|
||||
- Vim script
|
||||
|
||||
@@ -30,6 +30,9 @@ module Linguist
|
||||
@repository = repo
|
||||
@commit_oid = commit_oid
|
||||
|
||||
@old_commit_oid = nil
|
||||
@old_stats = nil
|
||||
|
||||
raise TypeError, 'commit_oid must be a commit SHA1' unless commit_oid.is_a?(String)
|
||||
end
|
||||
|
||||
@@ -126,12 +129,13 @@ module Linguist
|
||||
end
|
||||
|
||||
protected
|
||||
MAX_TREE_SIZE = 100_000
|
||||
|
||||
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
|
||||
|
||||
read_index
|
||||
|
||||
diff = Rugged::Tree.diff(repository, old_tree, current_tree)
|
||||
|
||||
# Clear file map and fetch full diff if any .gitattributes files are changed
|
||||
@@ -150,14 +154,18 @@ module Linguist
|
||||
next if delta.binary
|
||||
|
||||
if [:added, :modified].include? delta.status
|
||||
# Skip submodules
|
||||
# Skip submodules and symlinks
|
||||
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))
|
||||
|
||||
next unless blob.include_in_language_stats?
|
||||
file_map[new] = [blob.language.group.name, blob.size]
|
||||
if blob.include_in_language_stats?
|
||||
file_map[new] = [blob.language.group.name, blob.size]
|
||||
end
|
||||
|
||||
blob.cleanup!
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ module Linguist
|
||||
def self.cache
|
||||
@cache ||= begin
|
||||
serializer = defined?(Yajl) ? Yajl : YAML
|
||||
serializer.load(File.read(PATH))
|
||||
serializer.load(File.read(PATH, encoding: 'utf-8'))
|
||||
end
|
||||
end
|
||||
|
||||
@@ -50,16 +50,13 @@ module Linguist
|
||||
end
|
||||
else
|
||||
path = File.join(dirname, filename)
|
||||
|
||||
if File.extname(filename) == ""
|
||||
raise "#{path} is missing an extension, maybe it belongs in filenames/ subdir"
|
||||
end
|
||||
extname = File.extname(filename)
|
||||
|
||||
yield({
|
||||
:path => path,
|
||||
:language => category,
|
||||
:interpreter => Shebang.interpreter(File.read(path)),
|
||||
:extname => File.extname(filename)
|
||||
:extname => extname.empty? ? nil : extname
|
||||
})
|
||||
end
|
||||
end
|
||||
|
||||
@@ -23,23 +23,29 @@ module Linguist
|
||||
# First line must start with #!
|
||||
return unless shebang && shebang.start_with?("#!")
|
||||
|
||||
# Get the parts of the shebang without the #!
|
||||
tokens = shebang.sub(/^#!\s*/, '').strip.split(' ')
|
||||
s = StringScanner.new(shebang)
|
||||
|
||||
# There was nothing after the #!
|
||||
return if tokens.empty?
|
||||
return unless path = s.scan(/^#!\s*\S+/)
|
||||
|
||||
# Get the name of the interpreter
|
||||
script = File.basename(tokens.first)
|
||||
# Keep going
|
||||
script = path.split('/').last
|
||||
|
||||
# Get next argument if interpreter was /usr/bin/env
|
||||
script = tokens[1] if script == 'env'
|
||||
# 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
|
||||
|
||||
# "python2.6" -> "python2"
|
||||
script.sub! /(\.\d+)$/, ''
|
||||
script.sub!(/(\.\d+)$/, '')
|
||||
|
||||
# #! perl -> perl
|
||||
script.sub!(/^#!\s*/, '')
|
||||
|
||||
# Check for multiline shebang hacks that call `exec`
|
||||
if script == 'sh' &&
|
||||
|
||||
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 Strategy
|
||||
# Detects language based on filename and/or extension
|
||||
# Detects language based on filename
|
||||
class Filename
|
||||
def self.call(blob, _)
|
||||
name = blob.name.to_s
|
||||
|
||||
# A bit of an elegant hack. If the file is executable but extensionless,
|
||||
# append a "magic" extension so it can be classified with other
|
||||
# languages that have shebang scripts.
|
||||
extensions = FileBlob.new(name).extensions
|
||||
if extensions.empty? && blob.mode && (blob.mode.to_i(8) & 05) == 05
|
||||
name += ".script!"
|
||||
end
|
||||
|
||||
Language.find_by_filename(name)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,8 +1,102 @@
|
||||
module Linguist
|
||||
module Strategy
|
||||
class Modeline
|
||||
EmacsModeline = /-\*-\s*mode:\s*(\w+);?\s*-\*-/i
|
||||
VimModeline = /\/\*\s*vim:\s*set\s*(?:ft|filetype)=(\w+):\s*\*\//i
|
||||
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
|
||||
#
|
||||
@@ -15,14 +109,16 @@ module Linguist
|
||||
# Returns an Array with one Language if the blob has a Vim or Emacs modeline
|
||||
# that matches a Language name or alias. Returns an empty array if no match.
|
||||
def self.call(blob, _ = nil)
|
||||
Array(Language.find_by_alias(modeline(blob.data)))
|
||||
header = blob.lines.first(SEARCH_SCOPE).join("\n")
|
||||
footer = blob.lines.last(SEARCH_SCOPE).join("\n")
|
||||
Array(Language.find_by_alias(modeline(header + footer)))
|
||||
end
|
||||
|
||||
# Public: Get the modeline from the first n-lines of the file
|
||||
#
|
||||
# Returns a String or nil
|
||||
def self.modeline(data)
|
||||
match = data.match(EmacsModeline) || data.match(VimModeline)
|
||||
match = MODELINES.map { |regex| data.match(regex) }.reject(&:nil?).first
|
||||
match[1] if match
|
||||
end
|
||||
end
|
||||
|
||||
@@ -22,8 +22,10 @@ module Linguist
|
||||
# Start state on token, ignore anything till the next newline
|
||||
SINGLE_LINE_COMMENTS = [
|
||||
'//', # C
|
||||
'--', # Ada, Haskell, AppleScript
|
||||
'#', # Ruby
|
||||
'%', # Tex
|
||||
'"', # Vim
|
||||
]
|
||||
|
||||
# Start state on opening token, ignore anything until the closing
|
||||
@@ -84,17 +86,17 @@ module Linguist
|
||||
if s.peek(1) == "\""
|
||||
s.getch
|
||||
else
|
||||
s.skip_until(/[^\\]"/)
|
||||
s.skip_until(/(?<!\\)"/)
|
||||
end
|
||||
elsif s.scan(/'/)
|
||||
if s.peek(1) == "'"
|
||||
s.getch
|
||||
else
|
||||
s.skip_until(/[^\\]'/)
|
||||
s.skip_until(/(?<!\\)'/)
|
||||
end
|
||||
|
||||
# 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
|
||||
elsif token = s.scan(/<[^\s<>][^<>]*>/)
|
||||
@@ -130,6 +132,9 @@ module Linguist
|
||||
# extract_shebang("#!/usr/bin/env node")
|
||||
# # => "node"
|
||||
#
|
||||
# extract_shebang("#!/usr/bin/env A=B foo=bar awk -f")
|
||||
# # => "awk"
|
||||
#
|
||||
# Returns String token or nil it couldn't be parsed.
|
||||
def extract_shebang(data)
|
||||
s = StringScanner.new(data)
|
||||
@@ -138,6 +143,7 @@ module Linguist
|
||||
script = path.split('/').last
|
||||
if script == 'env'
|
||||
s.scan(/\s+/)
|
||||
s.scan(/.*=[^\s]+\s+/)
|
||||
script = s.scan(/\S+/)
|
||||
end
|
||||
script = script[/[^\d]+/, 0] if script
|
||||
|
||||
@@ -15,15 +15,28 @@
|
||||
# Dependencies
|
||||
- ^[Dd]ependencies/
|
||||
|
||||
# Distributions
|
||||
- (^|/)dist/
|
||||
|
||||
# C deps
|
||||
# https://github.com/joyent/node
|
||||
- ^deps/
|
||||
- ^tools/
|
||||
- (^|/)configure$
|
||||
- (^|/)configure.ac$
|
||||
- (^|/)config.guess$
|
||||
- (^|/)config.sub$
|
||||
|
||||
# stuff autogenerated by autoconf - still C deps
|
||||
- (^|/)aclocal.m4
|
||||
- (^|/)libtool.m4
|
||||
- (^|/)ltoptions.m4
|
||||
- (^|/)ltsugar.m4
|
||||
- (^|/)ltversion.m4
|
||||
- (^|/)lt~obsolete.m4
|
||||
|
||||
# Linters
|
||||
- cpplint.py
|
||||
|
||||
# Node dependencies
|
||||
- node_modules/
|
||||
|
||||
@@ -37,6 +50,9 @@
|
||||
# Go dependencies
|
||||
- Godeps/_workspace/
|
||||
|
||||
# GNU indent profiles
|
||||
- .indent.pro
|
||||
|
||||
# Minified JavaScript and CSS
|
||||
- (\.|-)min\.(js|css)$
|
||||
|
||||
@@ -56,17 +72,24 @@
|
||||
# Normalize.css
|
||||
- (^|/)normalize\.(css|less|scss|styl)$
|
||||
|
||||
# Skeleton.css
|
||||
- (^|/)skeleton\.(css|less|scss|styl)$
|
||||
|
||||
# Bourbon css
|
||||
- (^|/)[Bb]ourbon/.*\.(css|less|scss|styl)$
|
||||
|
||||
# Animate.css
|
||||
- (^|/)animate\.(css|less|scss|styl)$
|
||||
|
||||
# Select2
|
||||
- (^|/)select2/.*\.(css|scss|js)$
|
||||
|
||||
# Vendored dependencies
|
||||
- third[-_]?party/
|
||||
- 3rd[-_]?party/
|
||||
- vendors?/
|
||||
- extern(al)?/
|
||||
- (^|/)[Vv]+endor/
|
||||
|
||||
# Debian packaging
|
||||
- ^debian/
|
||||
@@ -74,6 +97,9 @@
|
||||
# Haxelib projects often contain a neko bytecode file named run.n
|
||||
- run.n$
|
||||
|
||||
# Bootstrap Datepicker
|
||||
- bootstrap-datepicker/
|
||||
|
||||
## Commonly Bundled JavaScript frameworks ##
|
||||
|
||||
# jQuery
|
||||
@@ -84,6 +110,46 @@
|
||||
- (^|/)jquery\-ui(\-\d\.\d+(\.\d+)?)?(\.\w+)?\.(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$
|
||||
|
||||
# jQuery dataTables
|
||||
- jquery.dataTables.js
|
||||
|
||||
# bootboxjs
|
||||
- bootbox.js
|
||||
|
||||
# pdf-worker
|
||||
- pdf.worker.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
|
||||
|
||||
# VS Code workspace files
|
||||
- .vscode
|
||||
|
||||
# Prototype
|
||||
- (^|/)prototype(.*)\.js$
|
||||
- (^|/)effects\.js$
|
||||
@@ -111,14 +177,20 @@
|
||||
- (^|/)tiny_mce([^.]*)\.js$
|
||||
- (^|/)tiny_mce/(langs|plugins|themes|utils)
|
||||
|
||||
# Ace Editor
|
||||
- (^|/)ace-builds/
|
||||
|
||||
# Fontello CSS files
|
||||
- (^|/)fontello(.*?)\.css$
|
||||
|
||||
# MathJax
|
||||
- (^|/)MathJax/
|
||||
|
||||
# Chart.js
|
||||
- (^|/)Chart\.js$
|
||||
|
||||
# Codemirror
|
||||
- (^|/)[Cc]ode[Mm]irror/(lib|mode|theme|addon|keymap)
|
||||
# CodeMirror
|
||||
- (^|/)[Cc]ode[Mm]irror/(\d+\.\d+/)?(lib|mode|theme|addon|keymap|demo)
|
||||
|
||||
# SyntaxHighlighter - http://alexgorbatchev.com/
|
||||
- (^|/)shBrush([^.]*)\.js$
|
||||
@@ -134,6 +206,9 @@
|
||||
# React
|
||||
- (^|/)react(-[^.]*)?\.js$
|
||||
|
||||
# flow-typed
|
||||
- (^|/)flow-typed/.*\.js$
|
||||
|
||||
# Modernizr
|
||||
- (^|/)modernizr\-\d\.\d+(\.\d+)?\.js$
|
||||
- (^|/)modernizr\.custom\.\d+\.js$
|
||||
@@ -143,8 +218,12 @@
|
||||
|
||||
## Python ##
|
||||
|
||||
# Sphinx
|
||||
- (^|/)docs?/_?(build|themes?|templates?|static)/
|
||||
|
||||
# django
|
||||
- (^|/)admin_media/
|
||||
- (^|/)env/
|
||||
|
||||
# Fabric
|
||||
- ^fabfile\.py$
|
||||
@@ -157,12 +236,40 @@
|
||||
|
||||
## Obj-C ##
|
||||
|
||||
# Xcode
|
||||
|
||||
- \.xctemplate/
|
||||
- \.imageset/
|
||||
|
||||
# Carthage
|
||||
- ^Carthage/
|
||||
|
||||
# Cocoapods
|
||||
- ^Pods/
|
||||
|
||||
# Sparkle
|
||||
- (^|/)Sparkle/
|
||||
|
||||
# Crashlytics
|
||||
- Crashlytics.framework/
|
||||
|
||||
# Fabric
|
||||
- Fabric.framework/
|
||||
|
||||
# BuddyBuild
|
||||
- BuddyBuildSDK.framework/
|
||||
|
||||
# Realm
|
||||
- Realm.framework
|
||||
|
||||
# RealmSwift
|
||||
- RealmSwift.framework
|
||||
|
||||
# git config files
|
||||
- gitattributes$
|
||||
- gitignore$
|
||||
- gitmodules$
|
||||
|
||||
## Groovy ##
|
||||
|
||||
# Gradle
|
||||
@@ -207,21 +314,9 @@
|
||||
# Html5shiv
|
||||
- (^|/)html5shiv\.js$
|
||||
|
||||
# Samples folders
|
||||
- ^[Ss]amples/
|
||||
|
||||
# LICENSE, README, git config files
|
||||
- ^COPYING$
|
||||
- LICENSE$
|
||||
- License$
|
||||
- gitattributes$
|
||||
- gitignore$
|
||||
- gitmodules$
|
||||
- ^README$
|
||||
- ^readme$
|
||||
|
||||
# Test fixtures
|
||||
- ^[Tt]est/fixtures/
|
||||
- ^[Tt]ests?/fixtures/
|
||||
- ^[Ss]pecs?/fixtures/
|
||||
|
||||
# PhoneGap/Cordova
|
||||
- (^|/)cordova([^.]*)\.js$
|
||||
@@ -233,7 +328,7 @@
|
||||
# Vagrant
|
||||
- ^Vagrantfile$
|
||||
|
||||
# .DS_Store's
|
||||
# .DS_Stores
|
||||
- .[Dd][Ss]_[Ss]tore$
|
||||
|
||||
# R packages
|
||||
@@ -251,3 +346,12 @@
|
||||
# ProGuard
|
||||
- proguard.pro
|
||||
- proguard-rules.pro
|
||||
|
||||
# PuPHPet
|
||||
- ^puphpet/
|
||||
|
||||
# Android Google APIs
|
||||
- (^|/)\.google_apis/
|
||||
|
||||
# Jenkins Pipeline
|
||||
- ^Jenkinsfile$
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
module Linguist
|
||||
VERSION = "4.4.0"
|
||||
VERSION = "5.3.2"
|
||||
end
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
{
|
||||
"repository": "https://github.com/github/linguist",
|
||||
"dependencies": {
|
||||
"season": "~>5.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] *)
|
||||
35
samples/ActionScript/FooBar.as
Normal file
35
samples/ActionScript/FooBar.as
Normal file
@@ -0,0 +1,35 @@
|
||||
// A sample for Actionscript.
|
||||
|
||||
package foobar
|
||||
{
|
||||
import flash.display.MovieClip;
|
||||
|
||||
class Bar
|
||||
{
|
||||
public function getNumber():Number
|
||||
{
|
||||
return 10;
|
||||
}
|
||||
}
|
||||
|
||||
class Foo extends Bar
|
||||
{
|
||||
private var ourNumber:Number = 25;
|
||||
|
||||
override public function getNumber():Number
|
||||
{
|
||||
return ourNumber;
|
||||
}
|
||||
}
|
||||
|
||||
class Main extends MovieClip
|
||||
{
|
||||
public function Main()
|
||||
{
|
||||
var x:Bar = new Bar();
|
||||
var y:Foo = new Foo();
|
||||
trace(x.getNumber());
|
||||
trace(y.getNumber());
|
||||
}
|
||||
}
|
||||
}
|
||||
13
samples/ActionScript/HelloWorld.as
Normal file
13
samples/ActionScript/HelloWorld.as
Normal file
@@ -0,0 +1,13 @@
|
||||
package mypackage
|
||||
{
|
||||
public class Hello
|
||||
{
|
||||
/* Let's say hello!
|
||||
* This is just a test script for Linguist's Actionscript detection.
|
||||
*/
|
||||
public function sayHello():void
|
||||
{
|
||||
trace("Hello, world");
|
||||
}
|
||||
}
|
||||
}
|
||||
69
samples/Adobe Font Metrics/OpenSansCondensed-Bold.afm
Normal file
69
samples/Adobe Font Metrics/OpenSansCondensed-Bold.afm
Normal file
@@ -0,0 +1,69 @@
|
||||
StartFontMetrics 2.0
|
||||
Comment Generated by FontForge 20170719
|
||||
Comment Creation Date: Sun Jul 23 19:47:25 2017
|
||||
FontName OpenSansCondensed-Bold
|
||||
FullName Open Sans Condensed Bold
|
||||
FamilyName Open Sans Condensed
|
||||
Weight Bold
|
||||
Notice (Digitized data copyright (c) 2010-2011, Google Corporation.)
|
||||
ItalicAngle 0
|
||||
IsFixedPitch false
|
||||
UnderlinePosition -205
|
||||
UnderlineThickness 102
|
||||
Version 1.11
|
||||
EncodingScheme ISO10646-1
|
||||
FontBBox -667 -290 1046 1062
|
||||
CapHeight 714
|
||||
XHeight 544
|
||||
Ascender 760
|
||||
Descender -240
|
||||
StartCharMetrics 939
|
||||
C 32 ; WX 247 ; N space ; B 0 0 0 0 ;
|
||||
C 33 ; WX 270 ; N exclam ; B 54 -14 216 714 ;
|
||||
C 34 ; WX 445 ; N quotedbl ; B 59 456 388 714 ;
|
||||
C 35 ; WX 543 ; N numbersign ; B 20 0 525 714 ;
|
||||
C 36 ; WX 462 ; N dollar ; B 36 -59 427 760 ;
|
||||
C 37 ; WX 758 ; N percent ; B 30 -9 729 725 ;
|
||||
C 38 ; WX 581 ; N ampersand ; B 28 -10 572 725 ;
|
||||
C 39 ; WX 246 ; N quotesingle ; B 59 456 188 714 ;
|
||||
C -1 ; WX 462 ; N six.os ; B 36 -10 427 724 ;
|
||||
C -1 ; WX 420 ; N seven.os ; B 19 -170 402 544 ;
|
||||
C -1 ; WX 462 ; N eight.os ; B 35 -10 429 724 ;
|
||||
C -1 ; WX 461 ; N nine.os ; B 33 -182 424 564 ;
|
||||
C -1 ; WX 496 ; N g.alt ; B 36 -241 442 555 ;
|
||||
C -1 ; WX 496 ; N gcircumflex.alt ; B 36 -241 442 767 ;
|
||||
C -1 ; WX 496 ; N gbreve.alt ; B 36 -241 442 766 ;
|
||||
C -1 ; WX 496 ; N gdot.alt ; B 36 -241 442 756 ;
|
||||
C -1 ; WX 496 ; N gcommaaccent.alt ; B 36 -241 442 767 ;
|
||||
C -1 ; WX 0 ; N cyrotmarkcomb ; B -203 591 203 714 ;
|
||||
EndCharMetrics
|
||||
StartKernData
|
||||
StartKernPairs 15878
|
||||
KPX quotedbl uni1ECA 20
|
||||
KPX quotedbl uni1EC8 20
|
||||
KPX quotedbl Idotaccent 20
|
||||
KPX quotedbl Iogonek 20
|
||||
KPX quotedbl Imacron 20
|
||||
KPX quotedbl Idieresis 20
|
||||
KPX quotedbl Icircumflex 20
|
||||
KPX quotedbl Iacute 20
|
||||
KPX quotedbl Igrave 20
|
||||
KPX quotedbl I 20
|
||||
KPX quotedbl uni1EF9 20
|
||||
KPX quoteleft q -20
|
||||
KPX quoteleft o -20
|
||||
KPX quoteleft g -9
|
||||
KPX quoteleft e -20
|
||||
KPX quoteleft d -20
|
||||
KPX quoteleft c -20
|
||||
KPX quoteleft Z 20
|
||||
KPX Delta C -9
|
||||
KPX Delta A -20
|
||||
KPX Delta question 20
|
||||
KPX Delta period -41
|
||||
KPX Delta comma -41
|
||||
KPX Delta quotesingle 41
|
||||
KPX Delta quotedbl 41
|
||||
EndKernPairs
|
||||
EndKernData
|
||||
EndFontMetrics
|
||||
464
samples/Adobe Font Metrics/SpecialElite.afm
Normal file
464
samples/Adobe Font Metrics/SpecialElite.afm
Normal file
@@ -0,0 +1,464 @@
|
||||
StartFontMetrics 2.0
|
||||
Comment Generated by FontForge 20170719
|
||||
Comment Creation Date: Sun Jul 23 19:52:19 2017
|
||||
FontName SpecialElite-Regular
|
||||
FullName Special Elite
|
||||
FamilyName Special Elite
|
||||
Weight Book
|
||||
Notice (Copyright (c) 2010 by Brian J. Bonislawsky DBA Astigmatic (AOETI). All rights reserved. Available under the Apache 2.0 licence.http://www.apache.org/licenses/LICENSE-2.0.html)
|
||||
ItalicAngle 0
|
||||
IsFixedPitch false
|
||||
UnderlinePosition -133
|
||||
UnderlineThickness 20
|
||||
Version 1.000
|
||||
EncodingScheme ISO10646-1
|
||||
FontBBox -33 -322 1052 959
|
||||
CapHeight 714
|
||||
XHeight 487
|
||||
Ascender 688
|
||||
Descender -225
|
||||
StartCharMetrics 371
|
||||
C 32 ; WX 292 ; N space ; B 0 0 0 0 ;
|
||||
C 33 ; WX 276 ; N exclam ; B 73 0 207 702 ;
|
||||
C 34 ; WX 352 ; N quotedbl ; B 48 449 295 704 ;
|
||||
C 35 ; WX 554 ; N numbersign ; B 31 -2 524 713 ;
|
||||
C 36 ; WX 526 ; N dollar ; B 31 -201 498 919 ;
|
||||
C 37 ; WX 666 ; N percent ; B 32 -186 642 872 ;
|
||||
C 38 ; WX 676 ; N ampersand ; B 31 -5 645 705 ;
|
||||
C 39 ; WX 196 ; N quotesingle ; B 48 449 143 703 ;
|
||||
C 40 ; WX 279 ; N parenleft ; B 55 -71 243 757 ;
|
||||
C 41 ; WX 281 ; N parenright ; B 37 -59 229 770 ;
|
||||
C 42 ; WX 522 ; N asterisk ; B 32 276 493 707 ;
|
||||
C 43 ; WX 496 ; N plus ; B 29 131 465 560 ;
|
||||
C 44 ; WX 336 ; N comma ; B 39 -197 290 251 ;
|
||||
C 45 ; WX 636 ; N hyphen ; B 63 273 573 397 ;
|
||||
C 46 ; WX 349 ; N period ; B 52 -3 298 245 ;
|
||||
C 47 ; WX 557 ; N slash ; B 23 -41 536 760 ;
|
||||
C 48 ; WX 610 ; N zero ; B 55 0 560 720 ;
|
||||
C 49 ; WX 569 ; N one ; B 27 -12 572 712 ;
|
||||
C 50 ; WX 573 ; N two ; B 50 -25 541 680 ;
|
||||
C 51 ; WX 557 ; N three ; B 44 -25 514 694 ;
|
||||
C 52 ; WX 612 ; N four ; B 15 4 584 708 ;
|
||||
C 53 ; WX 537 ; N five ; B 47 0 505 690 ;
|
||||
C 54 ; WX 588 ; N six ; B 48 -10 548 707 ;
|
||||
C 55 ; WX 555 ; N seven ; B 15 -34 549 734 ;
|
||||
C 56 ; WX 598 ; N eight ; B 51 1 551 720 ;
|
||||
C 57 ; WX 584 ; N nine ; B 48 -2 539 715 ;
|
||||
C 58 ; WX 343 ; N colon ; B 51 -3 297 518 ;
|
||||
C 59 ; WX 328 ; N semicolon ; B 45 -197 297 518 ;
|
||||
C 60 ; WX 463 ; N less ; B 31 120 401 565 ;
|
||||
C 61 ; WX 636 ; N equal ; B 63 186 573 513 ;
|
||||
C 62 ; WX 463 ; N greater ; B 62 120 433 565 ;
|
||||
C 63 ; WX 470 ; N question ; B 34 2 442 729 ;
|
||||
C 64 ; WX 665 ; N at ; B 46 -4 618 680 ;
|
||||
C 65 ; WX 549 ; N A ; B -1 -16 550 703 ;
|
||||
C 66 ; WX 604 ; N B ; B 29 -6 557 704 ;
|
||||
C 67 ; WX 579 ; N C ; B 46 -13 531 700 ;
|
||||
C 68 ; WX 622 ; N D ; B 36 -17 579 713 ;
|
||||
C 69 ; WX 638 ; N E ; B 38 -16 587 691 ;
|
||||
C 70 ; WX 605 ; N F ; B 29 -9 595 709 ;
|
||||
C 71 ; WX 615 ; N G ; B 45 -3 586 710 ;
|
||||
C 72 ; WX 652 ; N H ; B 40 -20 622 690 ;
|
||||
C 73 ; WX 495 ; N I ; B 26 -24 469 710 ;
|
||||
C 74 ; WX 541 ; N J ; B 16 -3 539 703 ;
|
||||
C 75 ; WX 582 ; N K ; B 28 -5 584 711 ;
|
||||
C 76 ; WX 602 ; N L ; B 23 -14 583 718 ;
|
||||
C 77 ; WX 697 ; N M ; B 46 -10 655 704 ;
|
||||
C 78 ; WX 627 ; N N ; B 41 -15 595 700 ;
|
||||
C 79 ; WX 616 ; N O ; B 42 -30 574 702 ;
|
||||
C 80 ; WX 553 ; N P ; B 30 -12 527 689 ;
|
||||
C 81 ; WX 602 ; N Q ; B 42 -98 571 711 ;
|
||||
C 82 ; WX 636 ; N R ; B 14 -9 624 706 ;
|
||||
C 83 ; WX 588 ; N S ; B 51 -13 547 690 ;
|
||||
C 84 ; WX 594 ; N T ; B 25 1 564 707 ;
|
||||
C 85 ; WX 621 ; N U ; B 24 -6 611 710 ;
|
||||
C 86 ; WX 611 ; N V ; B -1 -15 614 726 ;
|
||||
C 87 ; WX 643 ; N W ; B 8 0 614 689 ;
|
||||
C 88 ; WX 582 ; N X ; B 3 -1 580 697 ;
|
||||
C 89 ; WX 561 ; N Y ; B -21 -2 562 719 ;
|
||||
C 90 ; WX 592 ; N Z ; B 49 -1 551 709 ;
|
||||
C 91 ; WX 312 ; N bracketleft ; B 85 -72 297 754 ;
|
||||
C 92 ; WX 557 ; N backslash ; B 21 -41 534 760 ;
|
||||
C 249 ; WX 639 ; N ugrave ; B 5 -28 624 679 ;
|
||||
C 250 ; WX 639 ; N uacute ; B 5 -28 624 682 ;
|
||||
C 251 ; WX 639 ; N ucircumflex ; B 5 -28 624 691 ;
|
||||
C 252 ; WX 639 ; N udieresis ; B 5 -28 624 649 ;
|
||||
C 253 ; WX 592 ; N yacute ; B 0 -232 596 666 ;
|
||||
C 254 ; WX 552 ; N thorn ; B -33 -221 512 699 ;
|
||||
C 255 ; WX 592 ; N ydieresis ; B 0 -232 596 643 ;
|
||||
C -1 ; WX 549 ; N Amacron ; B -1 -16 550 809 ;
|
||||
C -1 ; WX 565 ; N amacron ; B 38 -6 561 619 ;
|
||||
C -1 ; WX 549 ; N Abreve ; B -1 -16 550 890 ;
|
||||
C -1 ; WX 565 ; N abreve ; B 38 -6 561 686 ;
|
||||
C -1 ; WX 549 ; N Aogonek ; B -1 -138 589 703 ;
|
||||
C -1 ; WX 565 ; N aogonek ; B 38 -118 624 502 ;
|
||||
C -1 ; WX 579 ; N Cacute ; B 46 -13 531 900 ;
|
||||
C -1 ; WX 547 ; N cacute ; B 39 -22 506 693 ;
|
||||
C -1 ; WX 579 ; N Ccircumflex ; B 46 -13 531 890 ;
|
||||
C -1 ; WX 547 ; N ccircumflex ; B 39 -22 506 689 ;
|
||||
C -1 ; WX 579 ; N Cdotaccent ; B 46 -13 531 859 ;
|
||||
C -1 ; WX 547 ; N cdotaccent ; B 39 -22 506 657 ;
|
||||
C -1 ; WX 579 ; N Ccaron ; B 46 -13 531 918 ;
|
||||
C -1 ; WX 547 ; N ccaron ; B 39 -22 506 710 ;
|
||||
C -1 ; WX 622 ; N Dcaron ; B 36 -17 579 924 ;
|
||||
C -1 ; WX 750 ; N dcaron ; B 40 -26 716 704 ;
|
||||
C -1 ; WX 623 ; N Dcroat ; B 36 -17 580 713 ;
|
||||
C -1 ; WX 603 ; N dcroat ; B 40 -26 597 714 ;
|
||||
C -1 ; WX 638 ; N Emacron ; B 38 -16 587 798 ;
|
||||
C -1 ; WX 543 ; N emacron ; B 40 -23 501 616 ;
|
||||
C -1 ; WX 638 ; N Ebreve ; B 38 -16 587 876 ;
|
||||
C -1 ; WX 543 ; N ebreve ; B 40 -23 501 683 ;
|
||||
C -1 ; WX 638 ; N Edotaccent ; B 38 -16 587 848 ;
|
||||
C -1 ; WX 543 ; N edotaccent ; B 40 -23 501 659 ;
|
||||
C -1 ; WX 638 ; N Eogonek ; B 38 -113 610 691 ;
|
||||
C -1 ; WX 543 ; N eogonek ; B 40 -145 501 499 ;
|
||||
C -1 ; WX 638 ; N Ecaron ; B 38 -16 587 913 ;
|
||||
C -1 ; WX 543 ; N ecaron ; B 40 -23 501 714 ;
|
||||
C -1 ; WX 615 ; N Gcircumflex ; B 45 -3 586 906 ;
|
||||
C -1 ; WX 583 ; N gcircumflex ; B 42 -224 562 676 ;
|
||||
C -1 ; WX 615 ; N Gbreve ; B 45 -3 586 899 ;
|
||||
C -1 ; WX 583 ; N gbreve ; B 42 -224 562 667 ;
|
||||
C -1 ; WX 615 ; N Gdotaccent ; B 45 -3 586 871 ;
|
||||
C -1 ; WX 583 ; N gdotaccent ; B 42 -224 562 637 ;
|
||||
C -1 ; WX 615 ; N Gcommaaccent ; B 45 -253 586 710 ;
|
||||
C -1 ; WX 583 ; N gcommaaccent ; B 42 -224 562 734 ;
|
||||
C -1 ; WX 652 ; N Hcircumflex ; B 40 -20 622 897 ;
|
||||
C -1 ; WX 616 ; N hcircumflex ; B 5 -29 601 688 ;
|
||||
C -1 ; WX 652 ; N Hbar ; B 40 -20 622 690 ;
|
||||
C -1 ; WX 616 ; N hbar ; B 5 -29 601 683 ;
|
||||
C -1 ; WX 495 ; N Itilde ; B 26 -24 469 859 ;
|
||||
C -1 ; WX 568 ; N itilde ; B 36 -42 568 615 ;
|
||||
C -1 ; WX 495 ; N Imacron ; B 26 -24 469 819 ;
|
||||
C -1 ; WX 568 ; N imacron ; B 36 -42 568 585 ;
|
||||
C -1 ; WX 495 ; N Ibreve ; B 26 -24 469 901 ;
|
||||
C -1 ; WX 568 ; N ibreve ; B 36 -42 568 661 ;
|
||||
C -1 ; WX 495 ; N Iogonek ; B 26 -154 469 710 ;
|
||||
C -1 ; WX 568 ; N iogonek ; B 36 -149 568 674 ;
|
||||
C -1 ; WX 495 ; N Idotaccent ; B 26 -24 469 873 ;
|
||||
C -1 ; WX 568 ; N dotlessi ; B 36 -42 568 468 ;
|
||||
C -1 ; WX 1036 ; N IJ ; B 26 -24 1034 710 ;
|
||||
C -1 ; WX 983 ; N ij ; B 36 -236 913 683 ;
|
||||
C -1 ; WX 541 ; N Jcircumflex ; B 16 -3 539 913 ;
|
||||
C -1 ; WX 415 ; N jcircumflex ; B -12 -236 405 699 ;
|
||||
C -1 ; WX 582 ; N Kcommaaccent ; B 28 -253 584 711 ;
|
||||
C -1 ; WX 620 ; N kcommaaccent ; B 11 -253 600 683 ;
|
||||
C -1 ; WX 620 ; N kgreenlandic ; B 11 -28 600 482 ;
|
||||
C -1 ; WX 602 ; N Lacute ; B 23 -14 583 923 ;
|
||||
C -1 ; WX 540 ; N lacute ; B 4 -28 538 902 ;
|
||||
C -1 ; WX 602 ; N Lcommaaccent ; B 23 -267 583 718 ;
|
||||
C -1 ; WX 540 ; N lcommaaccent ; B 4 -267 538 682 ;
|
||||
C -1 ; WX 602 ; N Lcaron ; B 23 -14 583 794 ;
|
||||
C -1 ; WX 582 ; N lcaron ; B 4 -28 549 704 ;
|
||||
C -1 ; WX 781 ; N Ldot ; B 23 -14 748 718 ;
|
||||
C -1 ; WX 571 ; N ldotaccent ; B 4 -28 538 682 ;
|
||||
C -1 ; WX 603 ; N Lslash ; B 24 -14 584 718 ;
|
||||
C -1 ; WX 541 ; N lslash ; B 4 -28 538 682 ;
|
||||
C -1 ; WX 627 ; N Nacute ; B 41 -15 595 894 ;
|
||||
C -1 ; WX 632 ; N nacute ; B 32 -23 612 696 ;
|
||||
C -1 ; WX 627 ; N Ncommaaccent ; B 41 -268 595 700 ;
|
||||
C -1 ; WX 632 ; N ncommaaccent ; B 32 -268 612 491 ;
|
||||
C -1 ; WX 627 ; N Ncaron ; B 41 -15 595 900 ;
|
||||
C -1 ; WX 632 ; N ncaron ; B 32 -23 612 712 ;
|
||||
C -1 ; WX 815 ; N napostrophe ; B 34 -23 795 704 ;
|
||||
C -1 ; WX 627 ; N Eng ; B 41 -320 595 700 ;
|
||||
C -1 ; WX 605 ; N eng ; B 32 -322 534 491 ;
|
||||
C -1 ; WX 616 ; N Omacron ; B 42 -30 574 815 ;
|
||||
C -1 ; WX 583 ; N omacron ; B 40 -34 543 598 ;
|
||||
C -1 ; WX 616 ; N Obreve ; B 42 -30 574 891 ;
|
||||
C -1 ; WX 583 ; N obreve ; B 40 -34 543 675 ;
|
||||
C -1 ; WX 616 ; N Ohungarumlaut ; B 42 -30 574 907 ;
|
||||
C -1 ; WX 583 ; N ohungarumlaut ; B 40 -34 545 693 ;
|
||||
C -1 ; WX 1018 ; N OE ; B 42 -30 967 702 ;
|
||||
C -1 ; WX 958 ; N oe ; B 40 -34 916 499 ;
|
||||
C -1 ; WX 636 ; N Racute ; B 14 -9 624 910 ;
|
||||
C -1 ; WX 579 ; N racute ; B 28 -16 566 693 ;
|
||||
C -1 ; WX 636 ; N Rcommaaccent ; B 14 -268 624 706 ;
|
||||
C -1 ; WX 579 ; N rcommaaccent ; B 28 -272 566 495 ;
|
||||
C -1 ; WX 636 ; N Rcaron ; B 14 -9 624 927 ;
|
||||
C -1 ; WX 579 ; N rcaron ; B 28 -16 566 698 ;
|
||||
C -1 ; WX 588 ; N Sacute ; B 51 -13 547 900 ;
|
||||
C -1 ; WX 519 ; N sacute ; B 48 -31 481 713 ;
|
||||
C -1 ; WX 588 ; N Scircumflex ; B 51 -13 547 904 ;
|
||||
C -1 ; WX 519 ; N scircumflex ; B 48 -31 481 710 ;
|
||||
C -1 ; WX 588 ; N Scedilla ; B 51 -145 547 690 ;
|
||||
C -1 ; WX 519 ; N scedilla ; B 48 -145 481 496 ;
|
||||
C -1 ; WX 588 ; N Scaron ; B 51 -13 547 904 ;
|
||||
C -1 ; WX 519 ; N scaron ; B 48 -31 481 710 ;
|
||||
C -1 ; WX 594 ; N Tcommaaccent ; B 25 -263 564 707 ;
|
||||
C -1 ; WX 510 ; N tcommaaccent ; B 0 -282 488 694 ;
|
||||
C -1 ; WX 594 ; N Tcaron ; B 25 1 564 920 ;
|
||||
C -1 ; WX 713 ; N tcaron ; B 0 -34 680 704 ;
|
||||
C -1 ; WX 594 ; N Tbar ; B 25 1 564 707 ;
|
||||
C -1 ; WX 510 ; N tbar ; B 0 -34 488 694 ;
|
||||
C -1 ; WX 621 ; N Utilde ; B 24 -6 611 850 ;
|
||||
C -1 ; WX 638 ; N utilde ; B 5 -28 624 636 ;
|
||||
C -1 ; WX 621 ; N Umacron ; B 24 -6 611 811 ;
|
||||
C -1 ; WX 638 ; N umacron ; B 5 -28 624 587 ;
|
||||
C -1 ; WX 621 ; N Ubreve ; B 24 -6 611 888 ;
|
||||
C -1 ; WX 638 ; N ubreve ; B 5 -28 624 665 ;
|
||||
C -1 ; WX 621 ; N Uring ; B 24 -6 611 959 ;
|
||||
C -1 ; WX 638 ; N uring ; B 5 -28 624 738 ;
|
||||
C -1 ; WX 621 ; N Uhungarumlaut ; B 24 -6 611 918 ;
|
||||
C -1 ; WX 638 ; N uhungarumlaut ; B 5 -28 624 691 ;
|
||||
C -1 ; WX 621 ; N Uogonek ; B 24 -136 611 710 ;
|
||||
C -1 ; WX 638 ; N uogonek ; B 5 -147 671 487 ;
|
||||
C -1 ; WX 643 ; N Wcircumflex ; B 8 0 614 901 ;
|
||||
C -1 ; WX 678 ; N wcircumflex ; B 5 -10 674 685 ;
|
||||
C -1 ; WX 561 ; N Ycircumflex ; B -21 -2 562 934 ;
|
||||
C -1 ; WX 592 ; N ycircumflex ; B 0 -232 596 691 ;
|
||||
C -1 ; WX 561 ; N Ydieresis ; B -21 -2 562 885 ;
|
||||
C -1 ; WX 592 ; N Zacute ; B 49 -1 551 905 ;
|
||||
C -1 ; WX 528 ; N zacute ; B 45 -22 487 684 ;
|
||||
C -1 ; WX 592 ; N Zdotaccent ; B 49 -1 551 866 ;
|
||||
C -1 ; WX 528 ; N zdotaccent ; B 45 -22 487 632 ;
|
||||
C -1 ; WX 592 ; N Zcaron ; B 49 -1 551 917 ;
|
||||
C -1 ; WX 528 ; N zcaron ; B 45 -22 487 688 ;
|
||||
C -1 ; WX 915 ; N AEacute ; B -11 -16 864 904 ;
|
||||
C -1 ; WX 888 ; N aeacute ; B 38 -23 846 670 ;
|
||||
C -1 ; WX 617 ; N Oslashacute ; B 43 -41 574 912 ;
|
||||
C -1 ; WX 583 ; N oslashacute ; B 40 -73 543 697 ;
|
||||
C -1 ; WX 415 ; N dotlessj ; B -12 -236 344 478 ;
|
||||
C -1 ; WX 281 ; N circumflex ; B 0 558 282 746 ;
|
||||
C -1 ; WX 281 ; N caron ; B 0 558 282 746 ;
|
||||
C -1 ; WX 281 ; N breve ; B 0 585 282 746 ;
|
||||
C -1 ; WX 132 ; N dotaccent ; B 0 600 133 729 ;
|
||||
C -1 ; WX 214 ; N ring ; B 0 547 215 780 ;
|
||||
C -1 ; WX 211 ; N ogonek ; B 0 -145 212 13 ;
|
||||
C -1 ; WX 283 ; N tilde ; B 0 583 284 701 ;
|
||||
C -1 ; WX 352 ; N hungarumlaut ; B 0 591 353 763 ;
|
||||
C -1 ; WX 185 ; N uni0312 ; B 28 474 152 694 ;
|
||||
C -1 ; WX 185 ; N uni0315 ; B 38 470 162 690 ;
|
||||
C -1 ; WX 192 ; N uni0326 ; B 32 -253 156 -33 ;
|
||||
C -1 ; WX 666 ; N mu ; B 24 -219 643 487 ;
|
||||
C -1 ; WX 643 ; N Wgrave ; B 8 0 614 895 ;
|
||||
C -1 ; WX 678 ; N wgrave ; B 5 -10 674 688 ;
|
||||
C -1 ; WX 643 ; N Wacute ; B 8 0 614 898 ;
|
||||
C -1 ; WX 678 ; N wacute ; B 5 -10 674 682 ;
|
||||
C -1 ; WX 643 ; N Wdieresis ; B 8 0 614 868 ;
|
||||
C -1 ; WX 678 ; N wdieresis ; B 5 -10 674 649 ;
|
||||
C -1 ; WX 561 ; N Ygrave ; B -21 -2 562 900 ;
|
||||
C -1 ; WX 592 ; N ygrave ; B 0 -232 596 666 ;
|
||||
C -1 ; WX 611 ; N endash ; B 50 270 551 391 ;
|
||||
C -1 ; WX 1113 ; N emdash ; B 51 270 1052 391 ;
|
||||
C -1 ; WX 265 ; N quoteleft ; B 41 390 217 704 ;
|
||||
C -1 ; WX 264 ; N quoteright ; B 54 390 230 704 ;
|
||||
C -1 ; WX 274 ; N quotesinglbase ; B 46 -138 223 176 ;
|
||||
C -1 ; WX 470 ; N quotedblleft ; B 41 390 422 704 ;
|
||||
C -1 ; WX 469 ; N quotedblright ; B 54 390 436 704 ;
|
||||
C -1 ; WX 479 ; N quotedblbase ; B 46 -138 428 176 ;
|
||||
C -1 ; WX 389 ; N dagger ; B 30 -16 359 724 ;
|
||||
C -1 ; WX 396 ; N daggerdbl ; B 35 -16 364 728 ;
|
||||
C -1 ; WX 316 ; N bullet ; B 50 246 266 479 ;
|
||||
C -1 ; WX 1063 ; N ellipsis ; B 52 -3 1016 245 ;
|
||||
C -1 ; WX 897 ; N perthousand ; B 33 -230 873 828 ;
|
||||
C -1 ; WX 296 ; N guilsinglleft ; B 44 149 232 434 ;
|
||||
C -1 ; WX 295 ; N guilsinglright ; B 63 149 251 434 ;
|
||||
C -1 ; WX 486 ; N fraction ; B -11 -53 501 748 ;
|
||||
C -1 ; WX 732 ; N Euro ; B 31 71 683 590 ;
|
||||
C -1 ; WX 757 ; N trademark ; B 60 303 703 693 ;
|
||||
C -1 ; WX 585 ; N partialdiff ; B 36 -47 553 772 ;
|
||||
C -1 ; WX 564 ; N product ; B 26 -17 534 707 ;
|
||||
C -1 ; WX 577 ; N minus ; B 63 282 514 395 ;
|
||||
C -1 ; WX 565 ; N approxequal ; B 59 137 513 522 ;
|
||||
C -1 ; WX 593 ; N notequal ; B 44 71 554 644 ;
|
||||
C -1 ; WX 1041 ; N fi ; B 20 -42 1041 702 ;
|
||||
C -1 ; WX 1013 ; N fl ; B 20 -29 1011 702 ;
|
||||
C -1 ; WX 292 ; N .notdef ; B 0 0 0 0 ;
|
||||
C -1 ; WX 0 ; N .null ; B 0 0 0 0 ;
|
||||
C -1 ; WX 292 ; N nonmarkingreturn ; B 0 0 0 0 ;
|
||||
EndCharMetrics
|
||||
StartKernData
|
||||
StartKernPairs 6408
|
||||
KPX quotedbl period -104
|
||||
KPX quotedbl comma -103
|
||||
KPX quotedbl Jcircumflex -34
|
||||
KPX quotedbl Aogonek -31
|
||||
KPX quotedbl Abreve -31
|
||||
KPX quotedbl Amacron -31
|
||||
KPX quotedbl AEacute -31
|
||||
KPX quotedbl Aacute -31
|
||||
KPX quotedbl Acircumflex -31
|
||||
KPX quotedbl Atilde -31
|
||||
KPX quotedbl Agrave -31
|
||||
KPX quotedbl Aring -31
|
||||
KPX quotedbl Adieresis -31
|
||||
KPX quotedbl AE -31
|
||||
KPX quotedbl J -34
|
||||
KPX quotedbl A -31
|
||||
KPX quotedbl quotedblbase -117
|
||||
KPX quotedbl quotesinglbase -117
|
||||
KPX quotedbl ellipsis -104
|
||||
KPX quotedbl slash -73
|
||||
KPX quotedbl ampersand -22
|
||||
KPX quotedbl four -27
|
||||
KPX ampersand Ycircumflex -40
|
||||
KPX ampersand Ygrave -40
|
||||
KPX ampersand Ydieresis -40
|
||||
KPX ampersand Yacute -40
|
||||
KPX ampersand Y -40
|
||||
KPX ampersand V -36
|
||||
KPX quotesingle period -97
|
||||
KPX quotesingle comma -97
|
||||
KPX quotesingle Jcircumflex -34
|
||||
KPX quotesingle Aogonek -31
|
||||
KPX quotesingle Abreve -31
|
||||
KPX quotesingle Amacron -31
|
||||
KPX hyphen T -28
|
||||
KPX hyphen one -68
|
||||
KPX hyphen B -25
|
||||
KPX hyphen seven -56
|
||||
KPX slash rcommaaccent -27
|
||||
KPX slash ncommaaccent -29
|
||||
KPX slash gcommaaccent -61
|
||||
KPX slash Jcircumflex -29
|
||||
KPX slash iogonek -26
|
||||
KPX slash ibreve -26
|
||||
KPX slash imacron -26
|
||||
KPX slash itilde -26
|
||||
KPX slash oslashacute -54
|
||||
KPX slash nacute -29
|
||||
KPX slash eng -29
|
||||
KPX slash ncaron -29
|
||||
KPX slash racute -27
|
||||
KPX slash scedilla -43
|
||||
KPX slash scircumflex -43
|
||||
KPX slash sacute -43
|
||||
KPX slash rcaron -27
|
||||
KPX slash ohungarumlaut -54
|
||||
KPX slash obreve -54
|
||||
KPX slash omacron -54
|
||||
KPX slash wgrave -23
|
||||
KPX slash wcircumflex -23
|
||||
KPX slash wdieresis -23
|
||||
KPX slash wacute -23
|
||||
KPX slash zdotaccent -41
|
||||
KPX J ebreve -32
|
||||
KPX J emacron -32
|
||||
KPX J edieresis -32
|
||||
KPX J ecircumflex -32
|
||||
KPX J egrave -32
|
||||
KPX J eacute -32
|
||||
KPX J e -32
|
||||
KPX J Aogonek -34
|
||||
KPX J Abreve -34
|
||||
KPX J Amacron -34
|
||||
KPX J AEacute -34
|
||||
KPX J Aacute -34
|
||||
KPX J Acircumflex -34
|
||||
KPX J Atilde -34
|
||||
KPX J Agrave -34
|
||||
KPX J Aring -34
|
||||
KPX J Adieresis -34
|
||||
KPX J AE -34
|
||||
KPX J A -34
|
||||
KPX J comma -29
|
||||
KPX J period -30
|
||||
KPX J v -29
|
||||
KPX J hyphen -30
|
||||
KPX J quotedblbase -34
|
||||
KPX J quotesinglbase -34
|
||||
KPX J guilsinglright -25
|
||||
KPX J guilsinglleft -25
|
||||
KPX J emdash -30
|
||||
KPX J endash -30
|
||||
KPX J guillemotright -25
|
||||
KPX J guillemotleft -25
|
||||
KPX J germandbls -36
|
||||
KPX J ellipsis -30
|
||||
KPX J slash -34
|
||||
KPX J p -28
|
||||
KPX J m -35
|
||||
KPX J b 54
|
||||
KPX K ycircumflex -60
|
||||
KPX K ygrave -60
|
||||
KPX K ydieresis -60
|
||||
KPX K yacute -60
|
||||
KPX K y -60
|
||||
KPX K wgrave -36
|
||||
KPX K wcircumflex -36
|
||||
KPX K wdieresis -36
|
||||
KPX K wacute -36
|
||||
KPX K w -36
|
||||
KPX K uogonek -25
|
||||
KPX K uhungarumlaut -25
|
||||
KPX K uring -25
|
||||
KPX K ubreve -25
|
||||
KPX K umacron -25
|
||||
KPX K utilde -25
|
||||
KPX K udieresis -25
|
||||
KPX K ucircumflex -25
|
||||
KPX K ugrave -25
|
||||
KPX K uacute -25
|
||||
KPX K u -25
|
||||
KPX K q -23
|
||||
KPX K oslashacute -28
|
||||
KPX K ohungarumlaut -28
|
||||
KPX K obreve -28
|
||||
KPX K omacron -28
|
||||
KPX K otilde -28
|
||||
KPX K odieresis -28
|
||||
KPX K ocircumflex -28
|
||||
KPX K ograve -28
|
||||
KPX K oacute -28
|
||||
KPX K eth -28
|
||||
KPX K oe -28
|
||||
KPX K oslash -28
|
||||
KPX K o -28
|
||||
KPX K dcaron -24
|
||||
KPX K d -24
|
||||
KPX K ccaron -27
|
||||
KPX K cdotaccent -27
|
||||
KPX K ccircumflex -27
|
||||
KPX K cacute -27
|
||||
KPX K ccedilla -27
|
||||
KPX K c -27
|
||||
KPX K ecaron -27
|
||||
KPX K eogonek -27
|
||||
KPX K edotaccent -27
|
||||
KPX K ebreve -27
|
||||
KPX K emacron -27
|
||||
KPX K edieresis -27
|
||||
KPX K ecircumflex -27
|
||||
KPX K egrave -27
|
||||
KPX K eacute -27
|
||||
KPX K e -27
|
||||
KPX K v -49
|
||||
KPX K hyphen -38
|
||||
KPX K guilsinglleft -24
|
||||
KPX K emdash -38
|
||||
KPX K endash -38
|
||||
KPX K guillemotleft -24
|
||||
KPX K b 49
|
||||
KPX L ycircumflex -36
|
||||
KPX L ygrave -36
|
||||
KPX L ydieresis -36
|
||||
KPX L yacute -36
|
||||
KPX L y -36
|
||||
KPX L wgrave -23
|
||||
KPX L wcircumflex -23
|
||||
KPX L wdieresis -23
|
||||
KPX L wacute -23
|
||||
KPX L w -23
|
||||
KPX L V -43
|
||||
KPX L Tcommaaccent -36
|
||||
KPX L Tbar -36
|
||||
KPX L Tcaron -36
|
||||
KPX L T -36
|
||||
KPX L quoteright -49
|
||||
KPX L v -32
|
||||
KPX L quoteleft -54
|
||||
KPX L quotedblright -49
|
||||
KPX L quotedblleft -54
|
||||
KPX L trademark -29
|
||||
KPX L backslash -50
|
||||
KPX L asterisk -30
|
||||
KPX trademark Aring -24
|
||||
KPX trademark Adieresis -24
|
||||
KPX trademark Yacute 29
|
||||
KPX trademark AE -24
|
||||
KPX trademark Y 29
|
||||
KPX trademark A -24
|
||||
KPX trademark b 31
|
||||
EndKernPairs
|
||||
EndKernData
|
||||
EndFontMetrics
|
||||
23
samples/Adobe Font Metrics/lambda.afm
Normal file
23
samples/Adobe Font Metrics/lambda.afm
Normal file
@@ -0,0 +1,23 @@
|
||||
StartFontMetrics 2.0
|
||||
Comment Generated by FontForge 20170719
|
||||
Comment Creation Date: Sun Jul 23 23:14:02 2017
|
||||
FontName Greek_Lambda_Character-Regular
|
||||
FullName Greek_Lambda_Character Regular
|
||||
FamilyName Greek_Lambda_Character
|
||||
Weight Regular
|
||||
Notice (NONE. NADA. PUBLIC DOMAIN, BOI)
|
||||
ItalicAngle 0
|
||||
IsFixedPitch false
|
||||
UnderlinePosition -175
|
||||
UnderlineThickness 90
|
||||
Version 020.017
|
||||
EncodingScheme ISO10646-1
|
||||
FontBBox 33 -177 566 760
|
||||
StartCharMetrics 5
|
||||
C 13 ; WX 602 ; N uni000D ; B 0 0 0 0 ;
|
||||
C 32 ; WX 602 ; N space ; B 0 0 0 0 ;
|
||||
C -1 ; WX 602 ; N lambda ; B 33 0 566 760 ;
|
||||
C -1 ; WX 602 ; N .notdef ; B 50 -177 551 706 ;
|
||||
C -1 ; WX 0 ; N NULL ; B 0 0 0 0 ;
|
||||
EndCharMetrics
|
||||
EndFontMetrics
|
||||
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"
|
||||
77
samples/AngelScript/botmanager.as
Normal file
77
samples/AngelScript/botmanager.as
Normal file
@@ -0,0 +1,77 @@
|
||||
/*
|
||||
* This is a sample script.
|
||||
*/
|
||||
|
||||
#include "BotManagerInterface.acs"
|
||||
|
||||
BotManager::BotManager g_BotManager( @CreateDumbBot );
|
||||
|
||||
CConCommand@ m_pAddBot;
|
||||
|
||||
void PluginInit()
|
||||
{
|
||||
g_BotManager.PluginInit();
|
||||
|
||||
@m_pAddBot = @CConCommand( "addbot", "Adds a new bot with the given name", @AddBotCallback );
|
||||
}
|
||||
|
||||
void AddBotCallback( const CCommand@ args )
|
||||
{
|
||||
if( args.ArgC() < 2 )
|
||||
{
|
||||
g_Game.AlertMessage( at_console, "Usage: addbot <name>" );
|
||||
return;
|
||||
}
|
||||
|
||||
BotManager::BaseBot@ pBot = g_BotManager.CreateBot( args[ 1 ] );
|
||||
|
||||
if( pBot !is null )
|
||||
{
|
||||
g_Game.AlertMessage( at_console, "Created bot " + args[ 1 ] + "\n" );
|
||||
}
|
||||
else
|
||||
{
|
||||
g_Game.AlertMessage( at_console, "Could not create bot\n" );
|
||||
}
|
||||
}
|
||||
|
||||
final class DumbBot : BotManager::BaseBot
|
||||
{
|
||||
DumbBot( CBasePlayer@ pPlayer )
|
||||
{
|
||||
super( pPlayer );
|
||||
}
|
||||
|
||||
void Think()
|
||||
{
|
||||
BotManager::BaseBot::Think();
|
||||
|
||||
// If the bot is dead and can be respawned, send a button press
|
||||
if( Player.pev.deadflag >= DEAD_RESPAWNABLE )
|
||||
{
|
||||
Player.pev.button |= IN_ATTACK;
|
||||
}
|
||||
else
|
||||
Player.pev.button &= ~IN_ATTACK;
|
||||
|
||||
KeyValueBuffer@ pInfoBuffer = g_EngineFuncs.GetInfoKeyBuffer( Player.edict() );
|
||||
|
||||
pInfoBuffer.SetValue( "topcolor", Math.RandomLong( 0, 255 ) );
|
||||
pInfoBuffer.SetValue( "bottomcolor", Math.RandomLong( 0, 255 ) );
|
||||
|
||||
if( Math.RandomLong( 0, 100 ) > 10 )
|
||||
Player.pev.button |= IN_ATTACK;
|
||||
else
|
||||
Player.pev.button &= ~IN_ATTACK;
|
||||
|
||||
for( uint uiIndex = 0; uiIndex < 3; ++uiIndex )
|
||||
{
|
||||
m_vecVelocity[ uiIndex ] = Math.RandomLong( -50, 50 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
BotManager::BaseBot@ CreateDumbBot( CBasePlayer@ pPlayer )
|
||||
{
|
||||
return @DumbBot( pPlayer );
|
||||
}
|
||||
396
samples/AngelScript/payload.as
Normal file
396
samples/AngelScript/payload.as
Normal file
@@ -0,0 +1,396 @@
|
||||
// Sample script.
|
||||
// Source: https://github.com/codecat/ssbd-payload
|
||||
|
||||
array<WorldScript::PayloadBeginTrigger@> g_payloadBeginTriggers;
|
||||
array<WorldScript::PayloadTeamForcefield@> g_teamForceFields;
|
||||
|
||||
[GameMode]
|
||||
class Payload : TeamVersusGameMode
|
||||
{
|
||||
[Editable]
|
||||
UnitFeed PayloadUnit;
|
||||
|
||||
[Editable]
|
||||
UnitFeed FirstNode;
|
||||
|
||||
[Editable default=10]
|
||||
int PrepareTime;
|
||||
|
||||
[Editable default=300]
|
||||
int TimeLimit;
|
||||
|
||||
[Editable default=90]
|
||||
int TimeAddCheckpoint;
|
||||
|
||||
[Editable default=2]
|
||||
float TimeOvertime;
|
||||
|
||||
[Editable default=1000]
|
||||
int TimePayloadHeal;
|
||||
|
||||
[Editable default=1]
|
||||
int PayloadHeal;
|
||||
|
||||
PayloadBehavior@ m_payload;
|
||||
|
||||
int m_tmStarting;
|
||||
int m_tmStarted;
|
||||
int m_tmLimitCustom;
|
||||
int m_tmOvertime;
|
||||
int m_tmInOvertime;
|
||||
|
||||
PayloadHUD@ m_payloadHUD;
|
||||
PayloadClassSwitchWindow@ m_switchClass;
|
||||
|
||||
array<SValue@>@ m_switchedSidesData;
|
||||
|
||||
Payload(Scene@ scene)
|
||||
{
|
||||
super(scene);
|
||||
|
||||
m_tmRespawnCountdown = 5000;
|
||||
|
||||
@m_payloadHUD = PayloadHUD(m_guiBuilder);
|
||||
@m_switchTeam = PayloadTeamSwitchWindow(m_guiBuilder);
|
||||
@m_switchClass = PayloadClassSwitchWindow(m_guiBuilder);
|
||||
}
|
||||
|
||||
void UpdateFrame(int ms, GameInput& gameInput, MenuInput& menuInput) override
|
||||
{
|
||||
TeamVersusGameMode::UpdateFrame(ms, gameInput, menuInput);
|
||||
|
||||
m_payloadHUD.Update(ms);
|
||||
|
||||
if (Network::IsServer())
|
||||
{
|
||||
uint64 tmNow = CurrPlaytimeLevel();
|
||||
|
||||
if (m_tmStarting == 0)
|
||||
{
|
||||
if (GetPlayersInTeam(0) > 0 && GetPlayersInTeam(1) > 0)
|
||||
{
|
||||
m_tmStarting = tmNow;
|
||||
(Network::Message("GameStarting") << m_tmStarting).SendToAll();
|
||||
}
|
||||
}
|
||||
|
||||
if (m_tmStarting > 0 && m_tmStarted == 0 && tmNow - m_tmStarting > PrepareTime * 1000)
|
||||
{
|
||||
m_tmStarted = tmNow;
|
||||
(Network::Message("GameStarted") << m_tmStarted).SendToAll();
|
||||
|
||||
for (uint i = 0; i < g_payloadBeginTriggers.length(); i++)
|
||||
{
|
||||
WorldScript@ ws = WorldScript::GetWorldScript(g_scene, g_payloadBeginTriggers[i]);
|
||||
ws.Execute();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!m_ended && m_tmStarted > 0)
|
||||
CheckTimeReached(ms);
|
||||
}
|
||||
|
||||
string NameForTeam(int index) override
|
||||
{
|
||||
if (index == 0)
|
||||
return "Defenders";
|
||||
else if (index == 1)
|
||||
return "Attackers";
|
||||
|
||||
return "Unknown";
|
||||
}
|
||||
|
||||
void CheckTimeReached(int dt)
|
||||
{
|
||||
// Check if time limit is not reached yet
|
||||
if (m_tmLimitCustom - (CurrPlaytimeLevel() - m_tmStarted) > 0)
|
||||
{
|
||||
// Don't need to continue checking
|
||||
m_tmOvertime = 0;
|
||||
m_tmInOvertime = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
// Count how long we're in overtime for later time limit fixing when we reach a checkpoint
|
||||
if (m_tmOvertime > 0)
|
||||
m_tmInOvertime += dt;
|
||||
|
||||
// Check if there are any attackers still inside
|
||||
if (m_payload.AttackersInside() > 0)
|
||||
{
|
||||
// We have overtime
|
||||
m_tmOvertime = int(TimeOvertime * 1000);
|
||||
return;
|
||||
}
|
||||
|
||||
// If we have overtime
|
||||
if (m_tmOvertime > 0)
|
||||
{
|
||||
// Decrease timer
|
||||
m_tmOvertime -= dt;
|
||||
if (m_tmOvertime <= 0)
|
||||
{
|
||||
// Overtime countdown reached, time limit reached
|
||||
TimeReached();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// No overtime, so time limit is reached
|
||||
TimeReached();
|
||||
}
|
||||
}
|
||||
|
||||
void TimeReached()
|
||||
{
|
||||
if (!Network::IsServer())
|
||||
return;
|
||||
|
||||
(Network::Message("TimeReached")).SendToAll();
|
||||
SetWinner(false);
|
||||
}
|
||||
|
||||
bool ShouldFreezeControls() override
|
||||
{
|
||||
return m_switchClass.m_visible
|
||||
|| TeamVersusGameMode::ShouldFreezeControls();
|
||||
}
|
||||
|
||||
bool ShouldDisplayCursor() override
|
||||
{
|
||||
return m_switchClass.m_visible
|
||||
|| TeamVersusGameMode::ShouldDisplayCursor();
|
||||
}
|
||||
|
||||
bool CanSwitchTeams() override
|
||||
{
|
||||
return m_tmStarted == 0;
|
||||
}
|
||||
|
||||
PlayerRecord@ CreatePlayerRecord() override
|
||||
{
|
||||
return PayloadPlayerRecord();
|
||||
}
|
||||
|
||||
int GetPlayerClassCount(PlayerClass playerClass, TeamVersusScore@ team)
|
||||
{
|
||||
if (team is null)
|
||||
return 0;
|
||||
|
||||
int ret = 0;
|
||||
for (uint i = 0; i < team.m_players.length(); i++)
|
||||
{
|
||||
if (team.m_players[i].peer == 255)
|
||||
continue;
|
||||
auto record = cast<PayloadPlayerRecord>(team.m_players[i]);
|
||||
if (record.playerClass == playerClass)
|
||||
ret++;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
void PlayerClassesUpdated()
|
||||
{
|
||||
m_switchClass.PlayerClassesUpdated();
|
||||
}
|
||||
|
||||
void SetWinner(bool attackers)
|
||||
{
|
||||
if (attackers)
|
||||
print("Attackers win!");
|
||||
else
|
||||
print("Defenders win!");
|
||||
|
||||
m_payloadHUD.Winner(attackers);
|
||||
EndMatch();
|
||||
}
|
||||
|
||||
void DisplayPlayerName(int idt, SpriteBatch& sb, PlayerRecord@ record, PlayerHusk@ plr, vec2 pos) override
|
||||
{
|
||||
TeamVersusGameMode::DisplayPlayerName(idt, sb, record, plr, pos);
|
||||
|
||||
m_payloadHUD.DisplayPlayerName(idt, sb, cast<PayloadPlayerRecord>(record), plr, pos);
|
||||
}
|
||||
|
||||
void RenderFrame(int idt, SpriteBatch& sb) override
|
||||
{
|
||||
Player@ player = GetLocalPlayer();
|
||||
if (player !is null)
|
||||
{
|
||||
PlayerHealgun@ healgun = cast<PlayerHealgun>(player.m_currWeapon);
|
||||
if (healgun !is null)
|
||||
healgun.RenderMarkers(idt, sb);
|
||||
}
|
||||
|
||||
TeamVersusGameMode::RenderFrame(idt, sb);
|
||||
}
|
||||
|
||||
void RenderWidgets(PlayerRecord@ player, int idt, SpriteBatch& sb) override
|
||||
{
|
||||
m_payloadHUD.Draw(sb, idt);
|
||||
|
||||
TeamVersusGameMode::RenderWidgets(player, idt, sb);
|
||||
|
||||
m_switchClass.Draw(sb, idt);
|
||||
}
|
||||
|
||||
void GoNextMap() override
|
||||
{
|
||||
if (m_switchedSidesData !is null)
|
||||
{
|
||||
TeamVersusGameMode::GoNextMap();
|
||||
return;
|
||||
}
|
||||
|
||||
ChangeLevel(GetCurrentLevelFilename());
|
||||
}
|
||||
|
||||
void SpawnPlayers() override
|
||||
{
|
||||
if (m_switchedSidesData is null)
|
||||
{
|
||||
TeamVersusGameMode::SpawnPlayers();
|
||||
return;
|
||||
}
|
||||
|
||||
if (Network::IsServer())
|
||||
{
|
||||
for (uint i = 0; i < m_switchedSidesData.length(); i += 2)
|
||||
{
|
||||
uint peer = uint(m_switchedSidesData[i].GetInteger());
|
||||
uint team = uint(m_switchedSidesData[i + 1].GetInteger());
|
||||
|
||||
TeamVersusScore@ joinScore = FindTeamScore(team);
|
||||
if (joinScore is m_teamScores[0])
|
||||
@joinScore = m_teamScores[1];
|
||||
else
|
||||
@joinScore = m_teamScores[0];
|
||||
|
||||
for (uint j = 0; j < g_players.length(); j++)
|
||||
{
|
||||
if (g_players[j].peer != peer)
|
||||
continue;
|
||||
SpawnPlayer(j, vec2(), 0, joinScore.m_team);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Save(SValueBuilder& builder) override
|
||||
{
|
||||
if (m_switchedSidesData is null)
|
||||
{
|
||||
builder.PushArray("teams");
|
||||
for (uint i = 0; i < g_players.length(); i++)
|
||||
{
|
||||
if (g_players[i].peer == 255)
|
||||
continue;
|
||||
builder.PushInteger(g_players[i].peer);
|
||||
builder.PushInteger(g_players[i].team);
|
||||
}
|
||||
builder.PopArray();
|
||||
}
|
||||
|
||||
TeamVersusGameMode::Save(builder);
|
||||
}
|
||||
|
||||
void Start(uint8 peer, SValue@ save, StartMode sMode) override
|
||||
{
|
||||
if (save !is null)
|
||||
@m_switchedSidesData = GetParamArray(UnitPtr(), save, "teams", false);
|
||||
|
||||
TeamVersusGameMode::Start(peer, save, sMode);
|
||||
|
||||
m_tmLimit = 0; // infinite time limit as far as VersusGameMode is concerned
|
||||
m_tmLimitCustom = TimeLimit * 1000; // 5 minutes by default
|
||||
|
||||
@m_payload = cast<PayloadBehavior>(PayloadUnit.FetchFirst().GetScriptBehavior());
|
||||
|
||||
if (m_payload is null)
|
||||
PrintError("PayloadUnit is not a PayloadBehavior!");
|
||||
|
||||
UnitPtr unitFirstNode = FirstNode.FetchFirst();
|
||||
if (unitFirstNode.IsValid())
|
||||
{
|
||||
auto node = cast<WorldScript::PayloadNode>(unitFirstNode.GetScriptBehavior());
|
||||
if (node !is null)
|
||||
@m_payload.m_targetNode = node;
|
||||
else
|
||||
PrintError("First target node is not a PayloadNode script!");
|
||||
}
|
||||
else
|
||||
PrintError("First target node was not set!");
|
||||
|
||||
WorldScript::PayloadNode@ prevNode;
|
||||
|
||||
float totalDistance = 0.0f;
|
||||
|
||||
UnitPtr unitNode = unitFirstNode;
|
||||
while (unitNode.IsValid())
|
||||
{
|
||||
auto node = cast<WorldScript::PayloadNode>(unitNode.GetScriptBehavior());
|
||||
if (node is null)
|
||||
break;
|
||||
|
||||
unitNode = node.NextNode.FetchFirst();
|
||||
|
||||
@node.m_prevNode = prevNode;
|
||||
@node.m_nextNode = cast<WorldScript::PayloadNode>(unitNode.GetScriptBehavior());
|
||||
|
||||
if (prevNode !is null)
|
||||
totalDistance += dist(prevNode.Position, node.Position);
|
||||
|
||||
@prevNode = node;
|
||||
}
|
||||
|
||||
float currDistance = 0.0f;
|
||||
|
||||
auto distNode = cast<WorldScript::PayloadNode>(unitFirstNode.GetScriptBehavior());
|
||||
while (distNode !is null)
|
||||
{
|
||||
if (distNode.m_prevNode is null)
|
||||
distNode.m_locationFactor = 0.0f;
|
||||
else
|
||||
{
|
||||
currDistance += dist(distNode.m_prevNode.Position, distNode.Position);
|
||||
distNode.m_locationFactor = currDistance / totalDistance;
|
||||
}
|
||||
|
||||
@distNode = distNode.m_nextNode;
|
||||
}
|
||||
|
||||
m_payloadHUD.AddCheckpoints();
|
||||
}
|
||||
|
||||
void SpawnPlayer(int i, vec2 pos = vec2(), int unitId = 0, uint team = 0) override
|
||||
{
|
||||
TeamVersusGameMode::SpawnPlayer(i, pos, unitId, team);
|
||||
|
||||
PayloadPlayerRecord@ record = cast<PayloadPlayerRecord>(g_players[i]);
|
||||
record.HandlePlayerClass();
|
||||
|
||||
if (g_players[i].local)
|
||||
{
|
||||
//TODO: This doesn't work well
|
||||
bool localAttackers = (team == HashString("player_1"));
|
||||
for (uint j = 0; j < g_teamForceFields.length(); j++)
|
||||
{
|
||||
bool hasCollision = (localAttackers != g_teamForceFields[j].Attackers);
|
||||
|
||||
auto units = g_teamForceFields[j].Units.FetchAll();
|
||||
for (uint k = 0; k < units.length(); k++)
|
||||
{
|
||||
PhysicsBody@ body = units[k].GetPhysicsBody();
|
||||
if (body is null)
|
||||
{
|
||||
PrintError("PhysicsBody for unit " + units[k].GetDebugName() + "is null");
|
||||
continue;
|
||||
}
|
||||
body.SetActive(hasCollision);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
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
|
||||
==================
|
||||
|
||||
Title
|
||||
-----
|
||||
|
||||
Example Articles
|
||||
~~~~~~~~~~~~~~~~
|
||||
- Item 1
|
||||
|
||||
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
|
||||
16
samples/Ballerina/hello-world-service.bal
Normal file
16
samples/Ballerina/hello-world-service.bal
Normal file
@@ -0,0 +1,16 @@
|
||||
import ballerina.lang.messages;
|
||||
import ballerina.net.http;
|
||||
import ballerina.doc;
|
||||
|
||||
@doc:Description {value:"By default Ballerina assumes that the service is to be exposed via HTTP/1.1 using the system default port and that all requests coming to the HTTP server will be delivered to this service."}
|
||||
service<http> helloWorld {
|
||||
@doc:Description {value:"All resources are invoked with an argument of type message, the built-in reference type representing a network invocation."}
|
||||
resource sayHello (message m) {
|
||||
// Creates an empty message.
|
||||
message response = {};
|
||||
// A util method that can be used to set string payload.
|
||||
messages:setStringPayload(response, "Hello, World!");
|
||||
// Reply keyword sends the response back to the client.
|
||||
reply response;
|
||||
}
|
||||
}
|
||||
6
samples/Ballerina/hello-world.bal
Normal file
6
samples/Ballerina/hello-world.bal
Normal file
@@ -0,0 +1,6 @@
|
||||
import ballerina.lang.system;
|
||||
|
||||
function main (string[] args) {
|
||||
system:println("Hello, World!");
|
||||
}
|
||||
|
||||
31
samples/Ballerina/json.bal
Normal file
31
samples/Ballerina/json.bal
Normal file
@@ -0,0 +1,31 @@
|
||||
import ballerina.lang.system;
|
||||
|
||||
function main (string[] args) {
|
||||
// JSON string value.
|
||||
json j1 = "Apple";
|
||||
system:println(j1);
|
||||
|
||||
// JSON number value.
|
||||
json j2 = 5.36;
|
||||
system:println(j2);
|
||||
|
||||
// JSON true value.
|
||||
json j3 = true;
|
||||
system:println(j3);
|
||||
|
||||
// JSON false value.
|
||||
json j4 = false;
|
||||
system:println(j4);
|
||||
|
||||
// JSON null value.
|
||||
json j5 = null;
|
||||
|
||||
//JSON Objects.
|
||||
json j6 = {name:"apple", color:"red", price:j2};
|
||||
system:println(j6);
|
||||
|
||||
//JSON Arrays. They are arrays of any JSON value.
|
||||
json j7 = [1, false, null, "foo",
|
||||
{first:"John", last:"Pala"}];
|
||||
system:println(j7);
|
||||
}
|
||||
28
samples/Ballerina/var.bal
Normal file
28
samples/Ballerina/var.bal
Normal file
@@ -0,0 +1,28 @@
|
||||
import ballerina.lang.system;
|
||||
|
||||
function divideBy10 (int d) (int, int) {
|
||||
return d / 10, d % 10;
|
||||
}
|
||||
|
||||
function main (string[] args) {
|
||||
//Here the variable type is inferred type from the initial value. This is same as "int k = 5";
|
||||
var k = 5;
|
||||
system:println(10 + k);
|
||||
|
||||
//Here the type of the 'strVar' is 'string'.
|
||||
var strVar = "Hello!";
|
||||
system:println(strVar);
|
||||
|
||||
//Multiple assignment with 'var' allows you to define the variable then and there.
|
||||
//Variable type is inferred from the right-hand side.
|
||||
var q, r = divideBy10(6);
|
||||
system:println("06/10: " + "quotient=" + q + " " +
|
||||
"remainder=" + r);
|
||||
|
||||
//To ignore a particular return value in a multiple assignment statement, use '_'.
|
||||
var q1, _ = divideBy10(57);
|
||||
system:println("57/10: " + "quotient=" + q1);
|
||||
|
||||
var _, r1 = divideBy10(9);
|
||||
system:println("09/10: " + "remainder=" + r1);
|
||||
}
|
||||
26
samples/Ballerina/xml.bal
Normal file
26
samples/Ballerina/xml.bal
Normal file
@@ -0,0 +1,26 @@
|
||||
import ballerina.lang.system;
|
||||
|
||||
function main (string[] args) {
|
||||
|
||||
// XML element. Can only have one root element.
|
||||
xml x1 = xml `<book>The Lost World</book>`;
|
||||
system:println(x1);
|
||||
|
||||
// XML text
|
||||
xml x2 = xml `Hello, world!`;
|
||||
system:println(x2);
|
||||
|
||||
// XML comment
|
||||
xml x3 = xml `<!--I am a comment-->`;
|
||||
system:println(x3);
|
||||
|
||||
// XML processing instruction
|
||||
xml x4 = xml `<?target data?>`;
|
||||
system:println(x4);
|
||||
|
||||
// Multiple XML items can be combined to form a sequence of XML. The resulting sequence is again an XML on its own.
|
||||
xml x5 = x1 + x2 + x3 + x4;
|
||||
system:println("\nResulting XML sequence:");
|
||||
system:println(x5);
|
||||
|
||||
}
|
||||
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
|
||||
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
|
||||
}
|
||||
|
||||
}
|
||||
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);
|
||||
}
|
||||
}
|
||||
2
samples/C++/grpc.pb.cc
Normal file
2
samples/C++/grpc.pb.cc
Normal file
@@ -0,0 +1,2 @@
|
||||
// Generated by the gRPC protobuf plugin.
|
||||
// If you make any local change, they will be lost.
|
||||
125
samples/C++/hello.grpc.pb.h
Normal file
125
samples/C++/hello.grpc.pb.h
Normal file
@@ -0,0 +1,125 @@
|
||||
// Generated by the gRPC C++ plugin.
|
||||
// If you make any local change, they will be lost.
|
||||
// source: hello.proto
|
||||
#ifndef GRPC_hello_2eproto__INCLUDED
|
||||
#define GRPC_hello_2eproto__INCLUDED
|
||||
|
||||
#include "hello.pb.h"
|
||||
|
||||
#include <grpc++/impl/codegen/async_stream.h>
|
||||
#include <grpc++/impl/codegen/async_unary_call.h>
|
||||
#include <grpc++/impl/codegen/method_handler_impl.h>
|
||||
#include <grpc++/impl/codegen/proto_utils.h>
|
||||
#include <grpc++/impl/codegen/rpc_method.h>
|
||||
#include <grpc++/impl/codegen/service_type.h>
|
||||
#include <grpc++/impl/codegen/status.h>
|
||||
#include <grpc++/impl/codegen/stub_options.h>
|
||||
#include <grpc++/impl/codegen/sync_stream.h>
|
||||
|
||||
namespace grpc {
|
||||
class CompletionQueue;
|
||||
class Channel;
|
||||
class RpcService;
|
||||
class ServerCompletionQueue;
|
||||
class ServerContext;
|
||||
} // namespace grpc
|
||||
|
||||
class HelloService final {
|
||||
public:
|
||||
class StubInterface {
|
||||
public:
|
||||
virtual ~StubInterface() {}
|
||||
virtual ::grpc::Status SayHello(::grpc::ClientContext* context, const ::HelloRequest& request, ::HelloResponse* response) = 0;
|
||||
std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::HelloResponse>> AsyncSayHello(::grpc::ClientContext* context, const ::HelloRequest& request, ::grpc::CompletionQueue* cq) {
|
||||
return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::HelloResponse>>(AsyncSayHelloRaw(context, request, cq));
|
||||
}
|
||||
private:
|
||||
virtual ::grpc::ClientAsyncResponseReaderInterface< ::HelloResponse>* AsyncSayHelloRaw(::grpc::ClientContext* context, const ::HelloRequest& request, ::grpc::CompletionQueue* cq) = 0;
|
||||
};
|
||||
class Stub final : public StubInterface {
|
||||
public:
|
||||
Stub(const std::shared_ptr< ::grpc::ChannelInterface>& channel);
|
||||
::grpc::Status SayHello(::grpc::ClientContext* context, const ::HelloRequest& request, ::HelloResponse* response) override;
|
||||
std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::HelloResponse>> AsyncSayHello(::grpc::ClientContext* context, const ::HelloRequest& request, ::grpc::CompletionQueue* cq) {
|
||||
return std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::HelloResponse>>(AsyncSayHelloRaw(context, request, cq));
|
||||
}
|
||||
|
||||
private:
|
||||
std::shared_ptr< ::grpc::ChannelInterface> channel_;
|
||||
::grpc::ClientAsyncResponseReader< ::HelloResponse>* AsyncSayHelloRaw(::grpc::ClientContext* context, const ::HelloRequest& request, ::grpc::CompletionQueue* cq) override;
|
||||
const ::grpc::RpcMethod rpcmethod_SayHello_;
|
||||
};
|
||||
static std::unique_ptr<Stub> NewStub(const std::shared_ptr< ::grpc::ChannelInterface>& channel, const ::grpc::StubOptions& options = ::grpc::StubOptions());
|
||||
|
||||
class Service : public ::grpc::Service {
|
||||
public:
|
||||
Service();
|
||||
virtual ~Service();
|
||||
virtual ::grpc::Status SayHello(::grpc::ServerContext* context, const ::HelloRequest* request, ::HelloResponse* response);
|
||||
};
|
||||
template <class BaseClass>
|
||||
class WithAsyncMethod_SayHello : public BaseClass {
|
||||
private:
|
||||
void BaseClassMustBeDerivedFromService(const Service *service) {}
|
||||
public:
|
||||
WithAsyncMethod_SayHello() {
|
||||
::grpc::Service::MarkMethodAsync(0);
|
||||
}
|
||||
~WithAsyncMethod_SayHello() override {
|
||||
BaseClassMustBeDerivedFromService(this);
|
||||
}
|
||||
// disable synchronous version of this method
|
||||
::grpc::Status SayHello(::grpc::ServerContext* context, const ::HelloRequest* request, ::HelloResponse* response) final override {
|
||||
abort();
|
||||
return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
|
||||
}
|
||||
void RequestSayHello(::grpc::ServerContext* context, ::HelloRequest* request, ::grpc::ServerAsyncResponseWriter< ::HelloResponse>* response, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {
|
||||
::grpc::Service::RequestAsyncUnary(0, context, request, response, new_call_cq, notification_cq, tag);
|
||||
}
|
||||
};
|
||||
typedef WithAsyncMethod_SayHello<Service > AsyncService;
|
||||
template <class BaseClass>
|
||||
class WithGenericMethod_SayHello : public BaseClass {
|
||||
private:
|
||||
void BaseClassMustBeDerivedFromService(const Service *service) {}
|
||||
public:
|
||||
WithGenericMethod_SayHello() {
|
||||
::grpc::Service::MarkMethodGeneric(0);
|
||||
}
|
||||
~WithGenericMethod_SayHello() override {
|
||||
BaseClassMustBeDerivedFromService(this);
|
||||
}
|
||||
// disable synchronous version of this method
|
||||
::grpc::Status SayHello(::grpc::ServerContext* context, const ::HelloRequest* request, ::HelloResponse* response) final override {
|
||||
abort();
|
||||
return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
|
||||
}
|
||||
};
|
||||
template <class BaseClass>
|
||||
class WithStreamedUnaryMethod_SayHello : public BaseClass {
|
||||
private:
|
||||
void BaseClassMustBeDerivedFromService(const Service *service) {}
|
||||
public:
|
||||
WithStreamedUnaryMethod_SayHello() {
|
||||
::grpc::Service::MarkMethodStreamed(0,
|
||||
new ::grpc::StreamedUnaryHandler< ::HelloRequest, ::HelloResponse>(std::bind(&WithStreamedUnaryMethod_SayHello<BaseClass>::StreamedSayHello, this, std::placeholders::_1, std::placeholders::_2)));
|
||||
}
|
||||
~WithStreamedUnaryMethod_SayHello() override {
|
||||
BaseClassMustBeDerivedFromService(this);
|
||||
}
|
||||
// disable regular version of this method
|
||||
::grpc::Status SayHello(::grpc::ServerContext* context, const ::HelloRequest* request, ::HelloResponse* response) final override {
|
||||
abort();
|
||||
return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
|
||||
}
|
||||
// replace default version of method with streamed unary
|
||||
virtual ::grpc::Status StreamedSayHello(::grpc::ServerContext* context, ::grpc::ServerUnaryStreamer< ::HelloRequest,::HelloResponse>* server_unary_streamer) = 0;
|
||||
};
|
||||
typedef WithStreamedUnaryMethod_SayHello<Service > StreamedUnaryService;
|
||||
typedef Service SplitStreamedService;
|
||||
typedef WithStreamedUnaryMethod_SayHello<Service > StreamedService;
|
||||
};
|
||||
|
||||
|
||||
#endif // GRPC_hello_2eproto__INCLUDED
|
||||
|
||||
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
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user